2012-12-21

RubyMine + Jenkins Control Plugin

この記事を書いている時点で、なにやらJetBrainsでは、大変な賑わいとなっていたようですが、それはさておき。
やっぱりJenkinsとの連携もしたくなります。
IntelliJのプラグインとしては、下記のものがありました。
IntelliJ専用だから追加できないかな?と思ったのですが、よく見ると Products: IntelliJ IDEA, ..... RubyMine と書いてあります。どうやら大丈夫な模様。
ということで、初の追加Pluginは、Jenkins Control Pluginとなりました。

追加してみます

まずは、上記のサイトからダウンロードし、RubyMineの設定 -> プラグインで追加となりました。特に再起動も必要なく、シンプルにインストールできました。
Jenkins Control Plugin
そんなに設定するところはありません。

 

設定&表示させてみます

localhostで起動しているJenkinsさんを設定してみました。
Jenkinsさんは左端に表示されました。また、画面右隅には、ビルドのステータスが表示されました。
JenkinsさんとHectorさん(らしい)
Jenkinsは1サイトだけ登録できるようです。ビルドの実行、表示(ブラウザで開く)といった基本的なことができます。
これくらいシンプルでも、IDEとブラウザを切り替えたりしないで良いので、十分かと思います。

ということで、今回はJenkinsのみ入れましたが、IntelliJ IDEA用のプラグインだと、たくさんあるんですね!
お遊び(息抜き)用のものもあって、見ていて面白いですね :)
そんなに使えないので偉そうなことは言えませんが、SQL& PL/SQL用のプラグインは入れてみようと思います。(BashSupport Pluginは、どうもRubyMineはNGなのかな....?)

2012-12-18

#jbugj RubyMineがとても良い件。

はじめに:Rubyのデバッグ環境に困ったこと

またまたRedmineの関係ですが、Redmineのプラグインを書くうちに公開したくなってきて、でも、コードも綺麗じゃない、しせめてデバッグやテストはちゃんと出来るようになりたいな...と思うようになり、今年のはじめ、Windowsの環境にRuby, NetBeansを入れて、なんちゃってながらもデバッグとテストができるようにしました。(注:偉そうなことは言えず、フルスクラッチでコードを書く能力はありません....)

その後、RedmineがRuby1.9, Rails3.2対応になってしまったので、また環境を作りなおさなくっちゃ...と思っていたところ、NetBeansがバージョン7からRubyの公式サポートを止めてしまったとのこと。

プラグインを使えばもちろん利用はできますが、デバッグをしようにも、テストしようにも、どうにも面倒...。AptanaというIDEも教えてもらったのですが、こちらはeclipseがベースらしく、個人的にはあまり相性が良くないので、やっぱり止めました。

そうこうしているうちに、Macに乗り換えることになりました。
改めてNetBeans7.1 + Ruby1.9の環境を作ったのですが、デバッグは出来るものの、とにかく重い!途中でハングしたような状態になってしまいます。

世の中のMac userがこんな環境でコード書いている訳が無い!と思ってRedmineの関係の方に聞いてみたところ、春からRubyMineを使ってます、とのコメントを頂きました。それがRubyMineを知るきっかけでした。

RubyMineを入れてみたよ



ということで、早速インストール。

基本的には、『プロジェクト』という単位でコードを扱いますので、eclipseやNetBeansとそんなに変わりません。わたしの場合は、いつも通りRedmineをプロジェクトとして設定してみたところ、問題なくRailsアプリケーションとして認識してもらえ、起動/デバッグのメニューもすんなり起動してくれました!

さて、その後、ターミナルからプロジェクトフォルダを眺めてみると、フォルダ直下に、.idea というフォルダがあるのを発見しました。
こちら、Jenkins繋がりで、IntelliJラブな今井さんのお話を聞いたときに耳にしたフレーズです。(修正:『イデア』と読むと思い込んでいたら、やっぱり『アイディア』らしいです、すみません... )
あれれーと思ってTweet してみると、今井さんと山本さんから、さっそくそのあたりを教えていただきました。


  • RubyMine入れてみたら、対象のフォルダに.idea っていうフォルダができてるんですが、どっかで聞いたなーと思ったら IntelliJ。IntelliJの親戚なのでしょうか??
  • IntelliJから機能削ってRubyプラグイン仕込んだのがRubymineです。d.hatena.ne.jp/masanobuimai/2
  • 親戚ですよー。IntelliJ IDEAからRuby用の機能だけ抜き出したのがRubyMineです
IntelliJが奥様のお小遣いではとっても買えない額だとは今井さんに聞いていたので、さぞかしRubyMineも高いんだろうな〜と思いつつ、ひとまず使ってみることにしました。

全然ハングしませんよ!

さて、実際の稼働ですが、IDE慣れている方なら、ほぼ意識せず、普通に使えます。(ただし、残念ながら表示/メッセージは英語です)
しばらく使っていて「あれれ?」と思ったのが、全然ハングしないこと!NetBeansのアレは何だったのか?と思いくらいに快適です。その旨つぶやいたら、また今井さんに怒られました(^^;


  • あやまれ、RubyMineにあやまれ!:-P RT @akiko_pusu: NetBeansにくらべると、RubyMine動作軽いですね…

 

謎のおじさんがいる!

そうこうしているうちに、画面の右隅に、帽子をかぶったおじさんを発見しました。


なんですか?これってJenkinsさんの親戚?と思って、またもつぶやいてみたところ、これまた今井さんからのお言葉が。


  • @akiko_pusu Hectorおじさんです。ナメたコードを書くとビシバシ文句言って来ます。:-)
なるほど、改めて見てみると、RubyMineのコードインスペクションがもの凄い事になっています....。コーディング規約から外れたもの、スペルミス、Deprecatedなものを使ってたりすると、黄色いマークがコードの右にいっぱい付きます。自分の書いたもので問題ないのは、Readmeくらいでした..... orz

このInspectionがうざい!という方は、レベルを調整したり、OFFにしたりできるようです。

 

スクリーンショットを載せます

以下は、RubyMineのスクリーンショットです。基本的にSCMと連携して、RubyMine内でコミットやpush/pull/ブランチ作成など出来ます。


コード中のTODO:も別画面で抽出/チェックできます。コミット前のタスクなど、コメントはいっぱい書く気がでます〜!



心配していたデバッグ、テストもちゃんと出来ます。良かった!



Coverageも取ってくれます。(ソースフォルダとかにcoverageが生成されず、RubyMineの中で閉じてくれるみたいです)




ただいま、rbenvを使ってRubyの環境を切り替えて使っていますが、こちらも問題なさそうです。

ライセンスは?

そんなこんなで、もうすぐ評価期間が終わってしまいます。IntelliJにくらべると、個人ユースなら69$ってとこなので、奥様のお小遣いでも大丈夫かとは思います:)

ちなみに、IntelliJをはじめ、JetBrainsのツールは、オープンソースプロジェクト用ライセンスというものがあって、オープンソースで活動しているプロジェクトには、無料でライセンスを提供してくれるそうです。素晴らしい!

そして、『これは良いなー』としみじみ思っていた矢先に、JetBrainsユーザーグループの勉強会の件を知りました。
残念ながら、平日夜も含め勉強会は出られないので、みなさんのTweetや資料を拝見しつつ、なるほど〜と勉強させていただいているところです。

Jenkins由来でIntelliJのことは知っていましたが、自分には全く縁の無いツールだと思っていたので、少しだけその世界を覗く事ができて、自分でも意外に思っています。
そして、名も無いユーザのTweetにもお返事を下さった今井 () さん、山本 () さん、どうもありがとうございました!

個人的に、とても良いツールだというのが実感できましたので、会社でもちょっとずつ宣伝していこうかと思っています。

記事の修正など

.ideaは、アイディアという指導をいただきましたので、訂正を行いました。
 

2012-12-13

チケットを復旧する

消えたチケット

先日、『Redmineのチケットを間違って削除してしまいました、どうしましょう』というお問い合わせをいただきました。残念ながら、Redminの場合はデータは物理削除されてしまうので、そのままでは復旧できません...。

生まれて間もないチケットなら、新規作成しなおして貰うという方法が一番早いのですが、今回は自分も参照していたチケットで、本文に加えて注記も40件くらい溜まっていました。削除してしまった直前までの状況を聞いたところ、最終更新が前日で、今回は更新時の自分の注記を修正しようとしてチケット毎削除してしまったとのこと。

幸い、日々のバックアップ&前日時点のレプリカのRedmineがあるので、そちらでチケットを確認していただき、前日までの記録を戻せば大丈夫との印象でした。(各テーブルのモデルは連番で採番されるので、チケット番号に基づくデータがごっそり抜けちゃった状態です)

 

削除前のデータを取り出す

開発環境サーバへは、毎朝4時に、バックアップデータをもとにDBへ再インポートを行っています。
さらに、それに加えて、次回バージョンアップ予定のRedmineを使って、標準的な状態でうまくマイグレーションを実施し、Redmineのサービスを起動できるかを確認しています。(テストコードを書いている訳ではありませんが、実質、バージョンアッップ時に問題が発生しないかどうか、バックアップデータが健全で正しくリストアできるかを、継続的に検証できるようにしています


ということで、開発環境でレプリカとして公開しているRedmineは、メインに使っていただいているバージョンよりも1つもしくは複数進んだもので稼働させています。

基本的には構造に大きな変更はありませんので、ブラウザから削除されていない時点のチケットがどんなふうに表示されているかを確認しつつ、MySQLから削除されてしまったIDにまつわるチケットのデータ一式を抽出しました。

 

抽出にはMySQL WorkBench


MacにはMySQLとクライアント一式はインストールしていません。コマンドラインで操作するためにインストールしようかとも思いましたが、誤操作も心配なので、GUIのMySQL Workbenchをインストールして、そこからデータの確認や操作を行うことにしました。

開発機のMySQLポートはアクセス制限を行っているので、ここは便利になったMacの環境を利用して、localhost:3306にポートフォワードして確認します。

MySQL WorkBenchだと、抽出したレコードをcsvの形でなく、Insert文のようなSQLに書き出す機能があるので、今回はこちらを使って復旧用SQLを用意しました。

 

復元にもMySQL WorkBench


復旧用のSQLが出来たので、こんどは本番のMySQLにつなぎ直します。これもポートフォワードで。Redmineの作業用DBに接続し、Insert文でデータを戻してあげて、Redmineのweb画面からチケットが復活していることが確認できればOKです。

 

ファイルはscpで戻します

チケットはほぼ戻りましたが、添付ファイルの場合は実際のファイルを、Redmineのファイル格納用フォルダに戻してあげないといけません。また、フォルダ上のファイル名と、チケットで表示されるファイル名は違いがあります。(タイムスタンプとハッシュ値、拡張子で生成されています)

こちらは、issue_attachements テーブルで定義された、実際のファイル名を指定して、リストアしてあげます。これも直接はscpできないサーバなので、ポートフォワード+ scp で対応しました。

Redmineの添付ファイルは、わたしの環境の場合、config.ymlで/data/redmine_binary/と指定してあるので、ここに転送します。まず、localhostの4321番を、転送先のscp port 22番に繋がるようにして、そのあと localhost:4321 を指定すると転送先に繋がってくれます。
Exp.
$ ssh -p 22 -t -L 4321:localhost:1234 中継ユーザ@中継ホスト ssh -t -L 1234:localhost:22 転送先ユーザ@転送先ホスト
$ scp -P 4321  消しちゃったファイル.xls 転送先ユーザ@localhost:/data/redmine_binary/ハッシュ値で格納する名前.xls
以上でデータ復旧は完了です。
ちなみに、ファイルのパーミッションは注意!
Redmineのプロセスを稼働させているユーザに権限が無いと、チケットを本当に削除したいときにPermission Errorになります。(現環境だとredmine:redmineです)

* * *
今回はsqlを使ってInsertで復旧していますが、mysqlのコマンドラインツールでcsvに書き出してインポートするのでも問題はないと思いますので、再発するようなら自動化しておこうかなと考えています。

ちなみに、大規模な環境なら、こんな記事は全然目新しくもないでしょうけれど...(^^;
いちおう事例として、恥ずかしいですが公開してみます。

できるだけすぐに直前の環境を再現できるようにしておいたことで、ワークフローのおかしいところを見直したり、プラグインの評価をする際にも利用できたりと、いろいろメリットはありますので、なんにしても用意しておいて良かった、と思った次第です。

2012-12-03

TortoiseHgインストール (Mac編)

初めておたちよりのみなさま、こんにちは。
Redmineつながりで、@cointoss1973さんが募集されていた、TortoiseHg アドベントカレンダーに参加させていただくことになりました。
実はMercurialはあまり使いこなせてなくて(GitもSVNも似ようなものではありますが)、正直エントリするのはおこがましい位なのですが、ちょうどMacに環境を切り替えたところだったので、インストール話なら...ということで、3日目のエントリとして書かせていただきます。

結果からいうと、基本操作はできますが、まだ日本語化とかアプリケーションフォルダからの起動ができず、完璧とは言えない状態です。

[20121210 追記]

本エントリでは、インストールは出来たものの、アプリケーションフォルダからの起動と、日本語化が上手く行きませんでした。
日本語化が上手くできなかった件については、TortoiseHgビルドの前に、gettextがインストールされているということが前提だそうです。
本エントリの中で、この部分と、gettextを先に入れていなかった場合の対応手順を追加しています。

* * *

1. 本家に行ってダウンロード....ではないらしい

  • まずは、TortoiseHg本家に行きます。
  • アクセスすると、日本語画面に直行。TortoiseHgダウンロード(for Mac OS X)のバナーがさりげなく表示されており、迷うことはまずなさそうですね。この辺のサイトの作り手の皆さんのご配慮は大変ありがたいです。


が、いきなりパッケージダウンロードではありません。
「あれれ?」と思ったら、どうやらMac専用のインストール解説ページに移りました。(ここから先は英語です)
TortoiseHgのページのDownloadのページを見ると、Windows向けバイナリがリストアップされていますが、Macはどうかというと、やっぱり下のほうにあり、なにやら専用の手順が必要な模様です。
"To use the settings tool on Mac OS X, you must have http://code.google.com/p/iniparse/ installed."

2. Bitbucketへ行きました



リンクをたどった先は、Bitbucketです。何やら注意書きには、finkのunstable treeに置いてあると書いてあります。また、どうやらpythonのバージョンにも依存するようです。
この時点で、わたしのMacには、すでにMercurialのソースを取ってくる必要があったので、hgとSourceTreeが入れてあります。Pythonは確認すると2.7が入っています。あまり考え無しにいろいろ入れているので、ちょっと不安.....
ただし、Note: Also if you already use Homebrew there are steps at the end. という一文がありましたので、こちらに従うことにしました。せっかくお誘いを受けてエントリしているのでBlogにはレポートしたいですし、ちょうどBitbucketのリポジトリにpush したいものがありましたので....。
ただし、このパターンでも、brew install .....  で済む訳ではないらしく、GUIにQtを使っている関係で、Qtのソースも入れてビルドしないといけない模様です。ということで、まずは、Homebrew版のインストールをすべく、説明のページの一番下に移動。
途中、ソースからビルドする場合のStepが書かれてあり、やっぱりインストールしなおしになったり使うのを止めた場合の対応が大変そうだったので、決心は変えませんでした。
でも、ソースからビルドする説明の最後に、 "Happy Hacking!" の文字が書かれてありましたので、達成感はありそうですね〜(^^;

3. Homebrewでインストール

ガイドでは、まずXcodeとHomebrew野インストールをしてね、という説明があります。実は、XcodeとHomebrewのインストールは既に終わっていましたので、その次のステップから記載します。
20121210追記分:
TortoiseHgのビルドの前に、gettextを入れておきましょう!(日本語化ファイルが生成できません!)Homebrewならすぐに入ります。
$ brew install gettext
$ brew link gettxt
単純に、順番に下記のコマンドを実行していきました。
$ brew install pyqt
$ brew install qscintilla2

$ brew update
$ easy_install pip $ pip install Pygments iniparse Mercurial
pyqtはソースからビルドしていくので、結構時間がかかりました。体感で10分くらいかかったような...(かなり心配でした)
それでも一応make installが出来たので、次々とガイドに従ってセットアップ作業を進めていきます。

途中で下記のように環境変数を設定してね、といったメッセージが出ましたが、何かハマりポイントなのかもと思って無視 :)
For non-homebrew Python, you need to amend your PYTHONPATH like so:
  export PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH
環境変数を設定しなくても、実はここまではうまくいきました。
さて、最後にbitbucketのリポジトリからTortoiseHgを一式チェックアウトとなります。
$ hg clone http://bitbucket.org/tortoisehg/thg/ ~/Documents/TortoiseHg
なぜ /tmp  とか /usr/local/src とかじゃないのかしら...と思いながらもチェックアウトが完了して、フォルダを見てみると、いろいろ入っています。
さて、最後のコマンドを実行してみると.....

$ ./thg log
Traceback (most recent call last):
  File "./thg", line 44, in
    build_qt(Distribution()).run()
  File "/Users/takano/Documents/TortoiseHg/setup.py", line 215, in run
    self._wrapuic()
  File "/Users/takano/Documents/TortoiseHg/setup.py", line 236, in _wrapuic
    from PyQt4.uic.Compiler import compiler, qtproxies, indenter
ImportError: No module named PyQt4.uic.Compiler
「あらあらどうしよう...」と思ったところで、「環境変数を設定してね」というNoteがあったことを思い出し、.bashrc に設定を追加して、source ~/.bashrc してから再度 ./thg log を実行しました。

4. 起動しましたよ!

./thg log で何が起こるかと思ったら、TortoiseHgが起動しました!


SourceTreeがブルーをベースにしているのに対し、TortoiseHgはグリーンです。見慣れたカメさんのアイコンもDocに表示されました!よくよく考えたら、thg = TortoiseHg のことなんですね。
thgのオプションの"log" は、TortoiseHgのリポジトリのログをデフォルトで表示しているんですね。「へえ〜」と思いながら画面を眺めました。

個人的には、これで十分な位なのですが、ドキュメントの最後にはTortoiseHgをアプリケーションから起動させるための方法が書かれてありました。一応挑戦してみたのですが、/Applications/ フォルダに出来たTortoiseHg.app を入れても、うまく起動してくれません...。
どうも、要求しているPythonのバージョンが違う、前提にしているTortoiseHgのバージョンが違うんじゃないかと思うのですが、ここはひとまず諦めました...。(いくつかIssueに報告が上がっているようです)

5. そういえば日本語化されてない&なにか変....

20121210: 追記
gettextを先に入れてインストールしていれば、多分大丈夫です。下記は、入れ忘れてしまった場合に起きる症状と、対応となります。
アプリケーションからの起動はあきらめ、とりあえずコマンドラインから thg  で起動できるように、パスとシンボリックリンクを調整。
これでいざpushを!と思ったのですが、メニューが日本語化されていないことに気がつきました。設定メニューで調整できるのかなと思ったのですが、選択可能だったのが、en  のみ。
環境変数を切り替えたりしてみましたが、これもうまく行きませんでした。
TortoiseHgをはじめとする、TortoiseXXシリーズは、Windows環境側でもちょこちょこ使っていたので、ここは諦めて、目標のBitbucketにpushするところまで進めます。

5'. gettextを入れていなかった場合の対応方法 (20121210追記)

やっぱり日本語でないと....と思った方。まずはbrew install  gettext を実行します。あとは、TortoiseHgをビルドし直すか、日本語用のmoファイルだけを用意するといった2つの対応があります。今回は後者の対応を付加します。
1. 日本語用のメッセージファイルから moファイルを作成します。(~Documents/TortoiseHg以下にインストールした場合)
$ cd ~/Documents/TortoiseHg/
$ cd i18n/tortoisehg/
$ python ../msgfmt.py ja.po -o tortoisehg.mo

2. 所定のディレクトリに作成したmoファイルを配置します。
$ mkdir -p ~/Documents/TortoiseHg/locale/ja/LC_MESSAGES/
$ cp tortoisehg.mo !$

3.  あとは、LANGUAGE=ja もしくは TortoiseHgの言語設定でjaを指定すればOK。

6. Pushしたいんだけどhttpsからsshに切り替えたい!

だいたいはコードが修正済みで、SourceTree を使ってブランチを切ってpushしていました。あとはほんの少しの修正をし、defaultブランチにマージ、マージ後に、今回入れたTortoiseHgを使ってBitbucketにpushするのがゴールです。

まずはブランチ間のマージが成功。
次にリモートへのpushですが、これが上手く行きません!
どうやらhttpsでpushしに行ってしまうらしく、設定を変えないといけません。
こちらは、TortoiseHgからでも良いですが、ローカルリポジトリのフォルダから $ vi .hg/hgrc でhgrcファイルを編集すればOK。

これでようやく基本の操作ができました....。


* * *
という感じで、無理矢理TortoiseHgアドベントカレンダーに参加させていただく形となりました。結局中途半端で申し訳無いのですが、もう一回インストールしてみてちゃんと日本語メニューが使えそうになったら、再度ご報告したいと思います。
機会を下さった@cointoss1973さま、ありがとうございました!

念のため、現在のバージョン情報をご報告して、まとめとさせていただきます。-> 追記しました!
ちなみに、~Dcoments/TortoiseHg に入ったものは、インストールしたというよりは、リポジトリのソースをそのまま持ってきている感じなので、hg up 2.x  とかするとTortoiseHgのバージョンが切り替えできます。(依存するPythonの関係でちゃんと動くわけではないですが)

$ thg version
TortoiseHg Dialogs (version 2.5.1+29-1f7dfd2a0e6d), Mercurial (version 2.4+20121101)

Copyright (C) 2008-2012 Steve Borho and others.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.