2013-10-15

IntelliJでAIRのアプリを作ってみる。

相変わらず開発系のお仕事ではないながら、運用しているアプリのお守りをするためにIntelliJを使う日々です。
機能は使いこなせてない分、あまりこだわりが無いので、なんとなくアップデート情報につられて、最近IDEA 13にアップデートしました。

Adobe Flex/AIRの開発も可能ということで、前々から気になっていたところ、ちょうどサムライズムさんのTweetでも、Flex/Airについての記事の紹介を知りました。

いつもながら『やってみた』レベルではありますが、動かすところまでは試してみましたので、レポさせていただきます。

2013-10-04

WordPressの運用にJenkins / IntelliJ / wordmove を使ってみる。

相変わらず自分でアプリを作れず、OSSのツールを使って色々お仕事させていただいている日々です….。(もちろん、それはそれで楽しいです!)

現在はPloneに代わってWordPressの環境構築/調整の作業が増えています。
(※サービスや外に出すお仕事ではないです)

とは言え、WordPressの経験はそんなに長い訳でもなく、phpがちゃんと書けるわけでも無いのですが、サーバ管理面/運用面でいくつか工夫してみていることが溜まってきたので、記事を書いてみます。

今回も、Cacooを使った図も載せてみます。まだまだ良くわかっていない点、知らない点がたくさんありますので、WordPressに詳しい方をはじめ、皆さんからのアドバイスやご指摘をいただけると幸いです。

2013-09-20

Redmine上の不要なユーザをどう扱うか

長い間運用していると、メンバーも入れ替わります。新しい環境に移り、アカウント自体が実質無効になっていることもあります。
このあたり、みなさんどういうルール・運用をしているのか、気になるところではありますね。
アカウントの無効化措置については、いくつかパターンがあると思います。
  • パスワードをランダムリセットし、実質ログインできない形でアカウントは有効なままにしておく。
  • ロールを剥奪、プロジェクトのメンバーからアサインをはずす。(アカウント有効・権限のみ取り外す)
  • アカウントを無効化する。
  • アカウントを削除する。

削除 or ロック?


一番強硬そうな、「削除」措置。
チケットの場合、削除すると、データが物理削除される形になります。アカウントも削除すると、やはり物理削除になります。
ですが、実際に試してみたら、影響はそれだけじゃありませんでした。
結論から言いますと、『削除』はしないほうが安全です。現実的な対応方法は、こんな感じ?
  • アカウントをロックする。
  • ロックした上で、そのアカウントのメール通知設定を『通知しない』に設定する。
  • 担当者になる可能性がまず無い場合は、プロジェクトから除籍する。
ロックされただけだと、メンバとしてプロジェクトに参加している場合、担当者プルダウンに表示されてしまいます…。
実質無効なアカウントなのに、うっかり担当者にしていしてしまい、そのチケットが放置されるのは困りますよね。
こちらは、ただいま自作プラグインで、ロックされたメンバは表示しないように調整しています。

また、アクティブなチケットのウォッチャーに入っていて、メール送信設定が有効な場合だと、ロックされていてもメールが送信されてしまいます
ロックの際にメール通知も無効化されるといいのですが、現状そういう仕組みになっていないようです。

ただ、ロック&プロジェクトから除籍の場合、過去にその人が「作成者」「担当者」であったチケットを探そうとしても、チケットの一覧のフィルタ利用時、メンバーのプルダウンに出てきてくれません。ユーザID直接指定でなんとか取り出しはできますが、UI的にも改善してほしいな、と思っているところです。
 

削除がNG な理由


さて、削除がNGな理由。

チケット上は、そのユーザが関わったチケット(作成、注記の追記、Wikiへの記述など全て)が、『匿名ユーザ』として表記されます。ここまでは、想定の範囲かと思いますが、さらに下記の現象が発生します。

チケット本体のレコードのAuthor_id (作成者のId) が、 全て『匿名ユーザのid』 に置き換わります。複数名まとめてユーザを削除すると、それらが全て匿名ユーザ名義のデータになってしまいます。

また、チケット以外にも、そのユーザが作成したニュースやWiki、添付アイル、フォーラムのメッセージが、『匿名ユーザid』に書き換えられてしまいます。
(User.rb –> def remove_references_before_destroyで処理)

プログラムの調整をし、アカウント削除時にテーブルの書き換えを行わないようにした場合、チケットの表示は可能ですが、この場合、作者名がブランクになります。
ですが、こんどは削除済みのユーザIdをチケットの作者として保持し、作者名がブランクになっていた場合は、チケットの更新ができません 。

ほかにもいろいろ影響がありそうですが、ユーザをうっかり「削除」した場合、単純に「ユーザ」テーブルをリストアするだけでは元に戻せない状況になりますので、削除しないのが無難ですね。

一方、プラグインに関しては、また別の話。

Redmineの本体と同じようにユーザを削除するタイミングで関連テーブルのデータを修正する仕組みになっているかどうかは個別ケースです。
少なくとも、わたしの作ったプラグインは、ユーザが削除された時のケアはしていないので、テストの中にユーザが削除された場合どうなるか、というのを組み込む必要があるかもしれませんね….。

こちらの記事を読まれて、『ちょっと違うよ!』『うちはこうしてるよ!』などのご指摘、ご意見などいただけると幸いです。

[更新履歴]

  • 誤字、改行などお見苦しい部分があったので修正しました。
  • プラグインの場合についての記載を追加しました。

2013-08-30

Jenkinsのプラグインを作ってみる。(Redmine Build Notifier Plugin)


今回は、夏休みの自由研究?で、Jenkinsプラグインの作成をしてみたお話です。
すでに似たようなプラグイン、高機能なプラグインがありますが、ご興味を持っていただけたら、ソース/バイナリを評価いただけると幸いです。

ちょっと長いので、見出しのみ先に書かせていただきます。
  • プラグイン作成の背景
  • IntelliJさん、出番です!
  • GitHubに上げてみました!
  • DEV@cloudを使ってみました!
  • 今回のまとめ

プラグイン作成の背景


ただいまお仕事にて、DBのちょっとしたデータ変換作業をしています。

ただし、一気に作業するのではなくて、対象を決めて『今日はこの範囲の作業するよー』という感じで処理しています。また、作業に関しては、Redmineにチケットを作成し、『この範囲を処理、作業者はxxx、終了はxx時、変換結果はxxx』という情報を記録しています。

この変換処理ですが、ある程度定型化できるため、Jenkinsのジョブとして作成しています。たとえば、こんな感じです。

  • 切り戻しのためのデータのバックアップ
  • テスト(テストサーバ&ロールバックを使った、ある意味Dry Run) 用の処理
  • 実行記録の書き出し
  • 作業範囲を切り替えできるように、ジョブのパラメータ化
  • ビルドパラメータ-> シェル -> ストアドプロシージャの変数という形で処理
  • バックアップ用データファイル、変換前後の差分レポートを成果物として保存
この方法はなかなか上手く行っており、チケットとビルドの間には非常に関連性が高いのですが、『リポジトリにソースをコミットしたら処理が走る』タイプではありません。
このため、Jenkins Redmine Plugin や、Redmine Hudson Plugin を利用してのチケットとジョブの自動関連付けができず、数回ジョブのURLと結果をRedmineのチケットに手で貼付けて、記録を残していました

でも、人がWebから入力するので、間違いもあったりしますし、証跡とするにもちょっと説得力が弱いです。

No Ticket, No Commit. / No Ticket, No Work. ならぬ、No Ticket, No Build. な利用シーンが多いので、できれば自動で連携して欲しいところ...。

なんとか自動で結果をRedmine側にリンクさせたい、できればジョブの実行者や実行時間、成果物へのリンクはチケットに勝手に貼付けたい...という思いは前々からあったので、最初はシェルからRedmineのREST APIを叩いてPOSTしようかと考えました。

ですが、この方法だと、別なジョブには応用しにくくなります。ジョブのcopyをすれば良いのですが、Windows Slave上で動かす場合は利用できません.....(><)

ということで、Jenkinsのプラグインとして作れないか...?と考えた次第です。

IntelliJさん、出番です!


とは言え、私にとってはあこがれのJenkinsのプラグイン...。
ずっと前から、いつか作ってみたいなと思っていましたが、そんなスキルはありません。

そうこうしているうちに、Jenkinsの活用やプラグイン作成されたみなさんの情報が増えてきて、『もしかしたら作れる?』という淡い期待を抱くようになりました。

こちらを参考にやってみると、プラグインのひな形作成は、思った以上に簡単....。
わたしのやったことなんて、settings.xml と pom.xmlの作成くらいじゃなかろうか、という感じです....。

その上で、幸運にもIntelliJを使える機会がやってきたので、何はともあれMaven Projectとしてインポートし、サンプルのHello Worldを修正していくことから始めました。

やっとIntelliJらしい使い方が!

コマンドライン & Viでの作業と違って、Jenkins本体のソースも全部参照できる& デバッグできるので、Javaもフレームワークもよくわかっていないわたしでも、変数を頼りになんとか『この辺り変えればいいのかも』という見当を付けることができました。

あとは、近そうな動作をするプラグインのソースを眺めて、(恥ずかしながら)コピペと修正を実施。

一番問題のRedmineにPOSTをする処理は、自分でHTTPの処理を実装しないといけないかな〜と悩んでいたところ、Redmine Java APIなるものを発見し、これに乗っかることにしました(^^;

#ちなみに、すでにあるJenkins Redmine Pluginも、だいぶ機能がアップしているのですが、上記のRedmine Java APIを利用していました。


GitHubに上げてみました!

まさに皆さんのおかげで、それなりに使えそうな形になってきたので、GitHubにソースをアップ。わたしにとっては初Javaなリポジトリです。

とは言え、やっぱりこうした類いはどんな使い方をするのかイメージしてもらうのが重要。Wikiにもキャプチャをアップ&怪しい英語で説明文を付けていきました。
(本当に、名前からして『ズバリ』な機能を持っているなら、説明は少なくて済むのでしょうけれど...)

Post Build Taskに追加されました!

ビルド側からRedmineチケットへのリンクが出来ました!
Redmineへも簡単な結果をPOSTできました!


ここで考えたのが、『果たして自分のローカルの環境、IntelliJ以外でビルドできるのか?』ということでした。Redmineのプラグインについては、r-labsの方のご好意で、Jenkinsを使ってのテストをさせていただいているのですが、今回はJavaなので、全く別の環境のほうが良い気がしました。

かつ、奥様のお財布にも優しいビルド環境が欲しい...。

そこで、DEV@cloud (CloudBeesのJenkins)を利用してみることにしました。

DEV@cloudを使ってみました!

実は、1年くらい前にアカウントを作成し、Jenkinsのサービスは利用登録をしていたのですが、適当なビルドが思いつかず、活用できていませんでした....。

久しぶりにログインすると、サービスが増えているし、UIもドキュメントもだいぶ変わっていました。わたし専用のJenkinsは、1年の眠りから覚めるのにちょっとの時間を要しましたが、問題なく起動。

Maven Projectとしてジョブを作成し、GitHubのリポジトリの指定と、mvn clean install を指定するといった、ほんの少しの作業で、いよいよビルド実行...。

ビルドできましたー! on DEV@cloud

WARNINGが出たものの、めでたく *.hpi 形式のバイナリが作成されました!

なお、CloudBeesのサービスでは、GitリポジトリやMaven リポジトリも提供されているので、ビルドの成果物をそちらにアップできるようになっていました。

Maven Repositoryの設定画面。アクセス制限が設定できます。

ブラウザ & DAVからアクセス可能になっています。
さて、Jenkins CI利用のフリープランは、300分/月となっています。気がつかなかったものの、設定のミスとか、DEV@cloud専用のプラグインを試しているうち、50分くらい使っちゃっていました。

300分なんてもしかしてすぐかも....と不安になったのですが、実はCloudBeesの環境を利用した、BuildHiveというサービスがリリースされており、オープンソースならこっちも使えることが分かりました!

今回のまとめ


プライベートではありますが、プラグインリストに自分の作ったものが上がってくると、感無量です。

IntelliJを使った点で良かったことの一つが、日本語のメッセージプロパティファイルの編集がしやすかったことです。このおかげで、ついでに表示も日本語/(怪しい)英語の両方サポートしてしまう気力が出ました。(以前にこの手のファイルをいじってた頃は、native2asiiでの変換をかけないといけなかったのです)

また、UIについては、Jenkinsとして統一感を持ったヘルプの作成がしやすいのにビックリでした。(Jenkinsのヘルプの出し方は気に入っていて、Redmineのプラグイン作成時にもちょっと参考にさせていただいてます)

このあたり、もう少し上手くお伝えできれば良いのですが、ひとまずこの辺で。

2013-08-26

yggdrasilを使ってみました。

6月末のshinagawa Redmine勉強会の際、いろいろお世話になっている楠川さん(@tkusukawa さん)が作られた、yggdrasil というツールについて、直接お話を伺う機会を持つことが出来ました。

それまでは、縁のなさそうなツールかな...という印象だったのですが(すみません....)、勉強会でのスライドを拝見しているうちに、「あ、これはいいかも!」と思うようになりました。
#まだまだChefやらPuppetやらには手が出せていないので、そういうたぐいの感じかと、最初は戸惑っていたのです.....。

さっそく、その場で直接質問をさせていただき、変更を各サーバに反映するというアプローチではなくて、『変更が勝手にされていないか、コミット漏れがないか』をチェックすることに主眼を置いていることが分かりました。

目的が違うことが分かり、『No Ticket, No Work!』というキャッチにも、なるほどと共感するところがありました。

また、運用者にとっては、まだなじみ易いSubversionをリポジトリに使っているということもあり、yggdrasil という言葉は抜きにして、『変更はSubversionを使ってるよ』という説明なら、周囲も理解しやすいはず...。

ということで、丁度いじっていたサーバに入れてみることにしました。

インストール後、単体での利用は、なんとなくイメージ通りだったので、このまま使ってみようと判断。ですが、サーバ/クライアント構成の場合は、しばらくどう設定すればいいのか分かりませんでした...(これもすみません....)

その後数回、楠川さんにtweet経由で質問させていただき、お忙しいところにもお返事をいただけたおかげで、「ああ、こんな感じなんだな」というのも見えてきました。

こんな感じ


理解が間違っていないか、ちょっと心配なので、仕組みを書き出してみます。

併せて、現状試していることを図にしてアップしてみます。



仕組みは下記のような感じになります(勝手な理解かもしれませんが...)


1.  yggdrasil スタンドアロン、もしくはclientは、Subvetsionサーバとのやりとりで、設定ファイルをコミットしたりします。svn add/commitではなく、ygg add/commit という形で、yggdrasilがsvnコマンドをラップする形で更新を重ねていきます。

2. ~/.yggdrasil ディレクトリには、Subversionサーバの情報、Subversionと通信する際のユーザの情報や、yggdrasil をclient / server構成で使う時のserverの設定情報が格納されます。
また、mirror というディレクトリが作られ、ここがシステムの / 配下をミラーしたような、Subversionのワーキングディレクトリとなります。

3. ygg check コマンドで、リポジトリに登録されている情報と、実際に扱っているファイルとの差分をチェックします。差分があればエラーと判断します。

4. client / server 構成の場合は、client側がチェック結果をserverに報告しに行きます。server側も、~/.yggdrasil/result  というフォルダにclientからの報告を格納します。そうして、yggserve result というコマンドを使うと、clientたちの結果に問題が無いかどうかを一度に確認することができます。

楠川さんのおすすめは、clientからのserverへの報告はcronで行い、server上では yggserve result  コマンドをJenkinsを使って処理する、というものでした。

私の環境の場合は、ygg serverに当たるサーバはJenkins masterには利用できなかったので、Jenkins slaveとして設定し、いつも使っているJenkins maseter上で他のジョブと一緒にチェックを行うようにしてみました。

実は、わたしも設定ファイルは所々Subversionに登録してはいたのですが、/etc/... とか、/usr/local/... とか、ディレクトリにばらつきがあり、どうもうまく管理できていませんでした。

yggdrasilのおかげで、そういったパスのばらつきを考慮しなくても、yggdrasilのコマンドが宜しくやってSubversionに登録/変更をチェックしてくれるので、『これは良い感じ!』と思いました:)

若干?ハードルになるのは、rubyが必要だというあたり。

インストール直後でほとんどツールが入っていないOSだとすぐには使えませんが、今回はruby入りのサーバをコピーして複数台をチェックという状況でしたので、すんなり使えています。

なお、しがないバックオフィスのスタッフの身なので、恥ずかしながらコマンドラインで使うruby gemは意識して入れるのが初めてでした。

その上で、ソースも拝見して、『こんなふうに書くんだ〜』と、とっても勉強させていただいております。

ということで、ひきつづき1ユーザとしてお世話になってみようと思います!


2013-08-15

GitHub EnterpriseのリポジトリをSVNプロトコルでRedmineから直に参照....。

長いタイトルですみません…。
どなたかすでに試していらっしゃるかと思うのですが、実際やってみて「へぇ~」という思いでしたので、久しぶりにPOSTしてみます。

はじめに:Redmineで分散SCMが面倒くさい

RedmineとGitリポジトリの連携の場合は、Redmineが参照できるローカルなファイルシステム上に、Bare(もしくはmirror)リポジトリをCloneしておいて、そこを示すようにしないといけません。(Subversionの場合は、httpでアクセス可能であれば、ローカルにリポジトリを持つ必要はありません)

せっかくhttp的には参照可能なところにGitのリポジトリがあっても、なんだか面倒...。

いろいろ試し、Gitに変更が入ったら、ミラーのリポジトリにpushするようServiceHookを使うことで、若干のタイムラグはあるもののRedmine側のリポジトリブラウザに反映させることはできました。

その上で...。

たまたま誰かがRetweetして下さった、下記のTweetを発見。

GitHubならSVNプロトコルが使えるよ

github-tweet

『おおっ?』と思ったところ、直にSVNプロトコルでお話できるらしいではありませんか!

早速コマンドラインで試すと、問題なく svn coできます。Git上のmasterはtrunkに相当する感じです。逆に、ローカルのsvnのリポジトリを、GitHubの空っぽのリポジトリにpushすると、trunk -> master に割り振りとなりました。

そうこうしているうちに、『もしかして、RedmineからSubversionリポジトリとして参照できちゃう?』と考えました(^^;

RedmineからSubversionとしてアクセスさせてみた

で、やってみました。

github-svn

....問題ございません、できました....。

上記はgitでコツコツいじっているリポジトリですが、Subversionとしてアクセスすると、trunk, branches, tags というブランチに変換されて連携しています。タグ、ブランチも、それぞれ tags, branches以下で表示されます。

また、リビジョン番号に至っては、律儀にハッシュでなく番号に変化されて表示されますので、『何回コミットしてんの?』というのは意外に分かりやすい!

一方、まっとうな感じでGitリポジトリとして参照させた場合は、下記のような感じです。

github-svn-2

コマンドラインからも確認しよう!

RedmineはSubversionリポジトリのデータを、 svn list --xml というコマンドで取得しています。(subverson_adapter.rb を参照)

コマンドラインで対象のリポジトリを叩くと、XMLでデータが返ってくればバッチリです。

 

$ svn list --xml https://githubのどこかのリポジトリのURL/
 
<?xml version="1.0"?><lists>
<list   path="https://githubのどこかのリポジトリのURL">
<entry   kind="dir">
.............................
</entry>
</list>
</lists>



もしかすると証明書の関係で、下記のようなダイアログが出てくるかもしれませんが、

Error validating server certificate for 'https://github.com:443'

acceptすれば、ちゃんとXMLでデータが取れるようになりました。Redmine からうまく見えてくれないなーという場合も、このエラーで引っかかっている可能性があります。

ぶっちゃけ、ソースの確認だけな らSubversionとして連携させてしまうのもありかも...と思いました。

補足:Bitbucketは?


ちなみに、Bitbucketはどうなんだろう思い、下記のURLも見つけたのですが、コメントの最後のほうにある通り、試しても現在は失敗しちゃうみたいです。


2013-07-06

失敗の記録は財産 ~ Discard Old Pluginを使ってみました。

わたしは、定型ジョブを cronやWindows タスクスケジューラでうまく扱えない時や、ジョブの所要時間の検証のために、Jenkinsを使って記録を残すようにしています。

今回は、トラブルの事例をふまえて、ジョブのチェックに役立つプラグインや感じたことをご紹介します。長めのエントリなので、お急ぎの方は、文末をご覧くださいませ。

2013-07-04

勉強会のお手伝いをしました。

久しぶりのBlogへの投稿です。

先日、shinagawa.redmine 勉強会のお手伝いをさせていただきました。

勉強会のノウハウに助けてもらいました

会場での対応担当で、これといったことはしていないのですが、勉強会対応としても、勉強会参加としても久しぶりになります。

職場では、社内外のいろんな勉強会が開催されているのですが、わたしはあまり手順を知らなくて、お引き受けしたものの、『どうしたものか...』という状態でした。
過去に一回、Redmineがらみで対応をしたのですが、他のイベントの便乗だったので、空調や入退館をはじめ、やりかたが良くわかりません…(><)

まずは、社内有志による、勉強会対応のノウハウをまとめたWikiを参照し、やることの大まかな流れをチェック。
加えて、専用のMLで質問させていただき、どうすればいいかなど、色々教えていただきました。

おかげさまで、当日は、現地コーディネーター?1名でも、なんとかなりました。

が、実は空調の設定がよくわからず、出社されていた総務の方に助けていただきました。本当に感謝、感謝です。
(蒸し風呂状態での勉強会で、皆さんに大迷惑をおかけするところでした...)

また、ワイヤレスマイクについても、最初どれがそうか判らず、 あとで職場の方にこっそり教えていただいたりしました。

開催中の雰囲気

今回は『ワーク中心』というふれこみで、思ったより人数が控えめだったようです。(30名ほど+スタッフ)

講師はデブサミでチケットシステム対戦などで講演をされ、Redmine本も書いていらっしゃる小川さん&阪井さん。

開発者や運用担当者だけでなく、マネージャーや業務改善を考える立場向けの講演&ディスカッションがあり、とても刺激になりました。業務系のタスク管理やCRMとしての使い方についても、いろんな案や事例が出されています。

わたしはワークには参加せず、「自分のところでも、そういうのあるある~」と思いながら、会場後方でお話を伺っておりましたが、なかなか皆さん良い雰囲気だったと思います。

 

社外の勉強会をお招きすること

残念ながら、『勉強会やイベントに出たら、懇親会出なきゃ意味ないよね〜』というご意見は判らなくもないのですが、わたしは家庭の事情でそのようにはできません…。そもそも参加自体も難しいところです。

かろうじで参加したとして、普段の勉強会は、講演中心なので、懇親会にはまず出られない私は、直接スタッフ/主催者の方とお話をする時間があまり取れません….。デブサミや過去の勉強会を通しても、今回いらしたかたがたとはご挨拶はしているのですが、それも1〜2分程度でした。

まいどまいど、羨ましいと思いながらも、今回勉強会をホストすることができたおかげで、たくさんのお話を伺うことができました。

また、今回はワークの時間を50分くらいずつ設けていたため、参加者がグループでディスカッションしている間、会場後方で会場スタッフとして座っていた私のところに、小川さんをはじめ、スタッフの方がお話をしに来て下さいました。

なんだかんだで、勉強会のメリット>> 開催のコスト という感じです。

自分が知りたいことがあったら、まず自分の事例を話す/自分のところで勉強会を開催する、というやり方で、今後も細々とOSSなど外の世界と関われたらいいな〜と考えています。

* * *

さて、会としては盛り上がったらしく、お世話になっているRedmineに関して、少しばかりお役に立てたようで何よりです。

もちろん、自分ひとりでやっているわけではなく、職場でこうした活動を受け入れてくれる・支援してくれる環境があることが一番大きいです。先人のノウハウにも助けていただきましたし、家族の理解があって対応することができましたので、それについては、ひたすら感謝するばかりです。

2013-03-19

ライセンス切れました!

IntelliJのユーザ会から評価用にいただいたライセンスが切れました!
うん、使ってみて、ほんとうに良かったです...。
ひとまずDB接続、操作はRubyMineで代用中です(^_^;

2013-03-10

2013年デブサミメモ / JetBrains ハディーさん&@yusukeさん編

慌ただしい毎日ながらも、今年もデブサミには参加させていただきました。ただし、色々とバタバタしていたため、なかなか参加のBlogが書けず...。

開催からもう間もなく一ヶ月が経ってしまい、『なにを今更...』な感がありますが、毎年楽しみなイベントです。相変わらず私の活動時間は16時くらいまでなので、最後のセッションまではお話が伺えませんでした。 それでも、今年もたくさんの素敵なお話や刺激を受け、時に涙もあり、モチベーションをアップすることができました。

 今年のテーマは、Action! です!

文章によるまとめは今回省略。雰囲気を会場で記載のメモ、あとから書き起こしたスケッチを、複数に分けてポツポツとアップしていこうと思います。
ちなみに、お話を伺ったのは下記のセッションです。

2/14(木)

[14-C-1]  Androidセキュアコーディング
[14-D-2] One ASP.NET ~ 今、ASP.NET に何が起こっているのか? ~
[14-A-3] Ruby2.0
[14-B-4] チーム×ツール Team Foundation Server & Service
       "共感しActionできる開発基盤" アルティメイタム
[14-B-5] チケット駆動開発の本質

2/15(金)

[15-A-1] 「爆速」を支えるテクノロジー
[15-A-2] Webが生み出し始めた世界
[15-B-3] ICTでクルマと社会をつなぎ、安全・快適で低炭素なモビリティー社会の
     実現に向けたHondaの挑戦
[15-D-4] Opsから挑むDevOps
[15-B-5] SQLアンチパターン - 開発者を待ち受ける25の落とし穴
[15-E-6] JetBrainsのソリューションでスピードアップするWeb開発

* * *

今回は、中でも意外なスタイルで楽しませていただいた、15-E-6 JetBrainsの簡単なレポとなります。

15-E-6 JetBrains ハディーさん&サムライズム 山本さん


@yusukeさんのお話は、以前のデブサミでもお話を伺っています。そちらもとても感銘を受けたのですが、今回はJetBrainsの代理店、サムライズムの中の人として演壇に立たれていました。
私自身、昨年末からJetBrainsの製品に触れて、だいぶハマっていることもあり、『これはぜひ!』とばかり、レポーター特権(※1)を利用して最前列に座ってお話を伺う事にしました。

イケメンの誉れ高い@yusukeさん。登壇すると、タイムラインに『イケメン』の文字が踊ります。
 お話自体は、JetBrainsの製品の紹介と、どんなことができるかのデモという、一見オーソドックスな製品紹介...かと思ったのですが、そうではありませんでした。(いえ、内容上は確かに製品紹介だったんですが)

『ワタシは日本がダイスキ!』と、日本語でお話し、場を和ませて下さったハディーさん。
ですが、続いて "Tha's all what I know." の一言が。そこからは、もう英語一直線です。
#この時点で、このセッションの公式レポは厳しいと判断した自分です...orz

セッション概要には、『@yusukeさんが同時通訳』と書かれてあったので、 交互にお話をされるのかなと思ったら....。
 なんと画面の下部にテキストエリアを表示し、@yusukeさんがライブで字幕翻訳、というスタイルでした!(イラスト参照のこと。@yusukeさんにはご承諾済み)

ハディーさんのミッションは製品紹介、デモ。そのためにマイペースでどんどん英語の説明を進めていきます。取り上げたのは、ほぼ全てのIDEシリーズに組み込まれている、WebStormです。

"I hate mouse :) "とにこやかに呟き、流れるようなキータッチで、デモを進めるハディーさん。基本はHTML, CSS, JSの修正ですが、コードの補完機能が凄い凄い!
(わたしもRubyMineで実感していますが、あまり使いこなせていません...) 
サクサクとidに対応するCSSを修正し、ライブプレビューで確認し、JSを修正すればテストドライバを実行していきます。

その隣で、@yusukeさんが、怒濤のタイピングで字幕を起こしていきます。

会場内での『おおー!』の反応には、『\(^0^)/ オー!』の顔文字が画面にタイプされました。製品そのものも凄いのですが、想像を超えた同時通訳のスタイル、英語力、ハディーさんとの掛け合いに、講演というよりはライブパフォーマンスのような感覚を覚えました。

ざざっと、WebStormの機能をまとめると、下記のような感じです。
たぶん使ってみないと分からないでしょうけれど、ワタシ自身にはとても合う製品でした。
  • WebStormはIntelliJ, RubyMineを始めとしたIDEに基本的に装備
  • Web開発に必要なものは、何でもそろっているよ!
  • コードの補完、idタグの認識と対応するスタイル定義がすぐできる
  • color 指定のCSSがあると、カラーピッカーが起動してくれる
  • ブラウザを起動したり再読み込みしなくても、すぐに変更をプレビューで確認できる
  • インスペクションも強力!
 今回、JetBrains社はブース出展もされており、そこではTシャツとステッカーをいただきました。シャツにはショートカットキーがずらりと記載されているのですが、よーく見ると上下サカサマ。 自分で着るとショートカットキーが見えやすくなるよ、という配慮なんだそうです!
(しかもSサイズいただきました、ありがとうございます!)

昨年の終末セールと相まって、自分の周りでも少しずつJetBrains製品のユーザが増えているので、夏になったら何気なくシャツを着てお仕事してみようと思っています :)

遅ればせながら、楽しいセッションありがとうございました!

※1:公式レポーターになると、最前列のレポーター席に座ることができます。(レポート好きの方、Blogを良く書かれる方はオススメです!)
 ただし、それに見合うレポートが出来ているかは、私の場合はナゾです...。

2013-02-04

IntelliJ / SSHトンネル利用のデータベース接続をためしてみました。

昨年の後半にIntelliJを知ったものの、『そこまでは使わないよね...』と思い、特定の目的については、RubyMineの利用を続けていた日々。(これはこれで大満足です!)

ですが、いろんな言語のWebアプリケーションの動作チェックやちょっとした修正をしたり、DBを直接参照する事もあります。コードについては SublimeText2を使っているのですが、データベースについては色々あるので、その都度Macにクライ アントをインストールして、クライアントツールを切り替えて使っていたりしました。(MySQL WorkBenchとか、SQL Developerとかです)

で、こういったDBも直接はアクセスできないので、ポートフォワードして手元のMacから操作するようにしていたのですが、これも毎回DB毎にポートフォワードのプロセスを起動するのが面倒。ターミナルも増えてしまうのもなんだか嫌...。いい方法があったら教えて下さい〜(><)
 * * *


ひとまず、DB接続用のポートフォワードのプロセスをJenkinsのジョブに登録して、DB接続の必要が出てきたら、該当するジョブを起動してポート転送というやり方でしのいでおりました。

そんな折、下記のTweetを発見...。

どうやらDBに接続する際に、ポートフォワード(SSHトンネリング)の設定が出来る模様。
これは良いかも!と思い、IntelliJ IDEA 12.0.3 EAPをインストールしてみました。#評価版ライセンスです(^^;
そもそもIntelliJ 初めて&EAP(Early Access Program) での利用でしたが、試用については特に正式リリース版と変わらない感じです。

空っぽのプロジェクトでデータベース接続接続を作ります


『始まりは、何はともあれプロジェクト』のようですが、コードをスクラッチから書ける人間では無いので、空っぽのWeb Moduleプロジェクトで開始。

何もコードを書かずとも、画面の右端に『Database』というタブが表示されていたので、右クリック -> New -> Data Sourceで接続追加となるようです。
あまり芸が無くて申し訳ないのですが、まずは、踏み台サーバ1段を通して接続するMySQL&Oracleで試してみました。

新規接続では、JDBCのドライバファイルを選択します。
こちらも、あらかたのDBがプルダウンで選択できるようになっていて、使いたいデータベースを選ぶと、それに合ったJDBCをダウンロードしてくれる機能がついています。これって今時のIDEは普通なんでしょうか...?

ともかく、自分で探してきてからパスを通したりする手間が省けるため、これは嬉しい!
Oracleの場合だと、OTN行かなくても、IntelliJ側の用意しているOracle Driverをダウンロードできました。MySQLもドライバの設定は同様で、特に問題なく大変楽でした。


localhostにポートフォワードの設定をします


さて、本題のSSH Tunnel機能です。『Configure SSH』のボタンを押して、ssh -L .... に相当するポートフォワードの設定をします。添付の画像は、リモートのMySQLの3306番を、localhost:23306 に転送した例です。

Test Connectonでのチェックもできますし、本当に簡単です!
うまく繋がると、DBのEdition, ドライバの情報も表示されます。(下記はOracleの例です)


データベースのクライアントとしては?


接続できる/テーブル(モデル)が参照できるのも良いのですが、基本はSQLのコマンドが使えないと私は困ります....。
SQLについては、『Console』を起動させると、SQLコマンドが実行できるようになります。
正直、1ツールから複数種類のDBが扱えるだけでも十分だったので、そんなに期待して無かったのですが、コードの補完(Suggestion)もしてくれるのにはビックリ!


SELECT結果もエクスポートできます。逆にインポートもOK。テーブルの編集もできます。


多段になるとうまく行かないので....


嬉しいSSHトンネル機能+複数DB対応ではありますが、多段になってしまうとうまく行きませんでした。私の設定の仕方がいけないのかもしれませんが...(^^;
パスワードではなく公開鍵が使えるのは良いのですが、.ssh/config も読み込んで、うまく多段でもつなぎに行けると嬉しいです。

それにしてもなかなか良い機能なので、なんとかして遠くのDBにもIntelliJから繋ぎたいと思った結果....。
冒頭に書いていた、Jenkinsのポートフォワードのジョブ(多段の場合)を、IntelliJから呼び出して実行することにしました。これでひとまず完結できそうです。


 IntelliJのデータベース接続について(その他)

リリース情報の載っていたJetBrainsのBlogに、下記の記事がありました。
コメント欄を見ると、『sshトンネル機能希望。遠くのDBに接続が必要な場合はNavicat を使ってしのいでいるよ』といった書き込みもありました。(Navicatというツールは知らなかったので、これはこれで参考になりました)
その他にも、リモートホストでの作業用のプラグインが色々あるみたいです。
というわけで、使ってみるとやっぱり良いなあと思うようになりました.....(^^;