Flex勉強会第93回で発表しました

11日、Flex User Groupの第93回勉強会で、Blogopolisのクライアントサイド、特に3Dライブラリとして使用したPapervision3Dのパフォーマンスチューニング手法について発表してきました。

Blogopolisの3Dの動作はまだ軽いと言える状態ではありませんが、現時点でどのような工夫をしているかを、デモを動かしながら説明しました。

  • ポリゴン数の削減
    • カメラの焦点に近いところにあるポリゴンだけを描画し、視界の端の方は省略する
  • レンダリングエンジンの動的切り替え
    • カメラの移動中は高速なBasicRenderEngineを使い、静止したら高品質なQuadrantRenderEngineを使う
  • マウスヒット処理の独自実装
    • ヒットテストはPV3Dの機能を使わず、自前でやる
    • 3Dオブジェクトへのマウスオーバー時のハイライトエフェクトは、PV3D側ではなく、通常のGraphicsで描画する

発表資料は、以下にアップしてあります。

Flexの勉強会に参加したのは初めてですが、とても居心地の良い雰囲気で、楽しい時間を過ごすことができました。ありがとうございました。

クックパッドの分散処理LTでGridGainをデモしました

20日に、クックパッドで開催された「techlifeライトニングトーク」に参加してきました。

今回は「分散処理」というテーマでLTが行われました。僕は、JavaのグリッドコンピューティングフレームワークGridGainScalaから使うデモをしました。

(追記: 参加者全員の発表内容がYouTubeで公開されています

GridGainは、Hadoopと同様にMapReduceの概念に基づくフレームワークですが、あくまでも計算処理の分散にフォーカスしているようです。よって、GridGainにはHDFS相当のファイルシステムがありませんが、その分シンプルで、非常に簡単に使用できます。

以下のように、分散させたいメソッドに@Gridifyというアノテーションを付けておき、-javaagent VMオプションでAspectJのweaver等を指定して実行すると、メソッドをエンハンスしてグリッド対応にできてしまいます。プログラムを見れば分かる通り、とても簡潔に記述できます。

import org.gridgain.grid.gridify.{Gridify, GridifyArgument, GridifyTaskSplitAdapter}
import org.gridgain.grid.{GridFactory, GridJob, GridJobResult}
import java.util.{ArrayList, List}

object MyGrid {
  def main(args: Array[String]) {
    GridFactory.start
    say("the quick brown fox jumps over the lazy dog")
    GridFactory.stop(true)
  }

  @Gridify{val taskClass = classOf[MyTask]}
  def say(text: String) {
    println(text)
  }
}

class MyTask extends GridifyTaskSplitAdapter[Void] {
  def split(gridCount: Int, arg: GridifyArgument) = {
    val text = arg.getMethodParameters()(0).asInstanceOf[String]
    // 元のメソッド引数を単語境界で分割
    val words = text.split(" ")

    // 分割された各単語を出力するジョブを生成
    val jobs = new ArrayList[GridJob]
    for (s <- words) {
      jobs.add(new GridJob {
        def execute = {
          MyGrid.say(s)
          null
        }

        def cancel = {}
      })
    }
    jobs
  }

  def reduce(results: List[GridJobResult]) = null
}

GridGainのバージョンは現在2.1ですが、将来の3.0では、GridGain上に構築されたScalaベースの分散処理用DSLも提供されるそうで、要注目だと思います。

BlogopolisがYahoo! JAPANインターネットクリエイティブアワード2009で一般の部グランプリを受賞しました

Blogopolisが、Yahoo! JAPANインターネットクリエイティブアワード2009で、一般の部グランプリを受賞しました!

昨日、贈賞式に参加してきました。事前に入賞の連絡はいただいていましたが、グランプリとは思っていなかったのでびっくりしました。グランプリの人しか座れないという椅子に座らせていただき感激しましたが、緊張していたので、座り心地は憶えていません(笑)。

バナー広告の部門もあるコンテストだったので、懇親会では広告業界のいろいろな方とお話することができ、非常に勉強になりました。

Blogopolisは今後の展開が重要だと思うので、受賞を励みに、さらに開発を続けていきたいと思います。

IntelliJ IDEAのPros and Cons

最近IntelliJネタばっかりですが、自分が使った範囲で感じたIntelliJの良いところ、良くないところをまとめて書いてみます。

IntelliJの良いところ

オールインワン
必要なもの(SVN, Git, Maven, etc)が最初から揃っていて、それぞれ完成度も高い。オールインワンなので、IDE全体が良く調和している。
周辺言語のサポート
Scala, Groovy, HTML(*), JS(*), Flex(*)などのサポートが手厚い。Javaの開発に近いレベルで、リファクタリング、コード解析、整形等ができる。Scalaプラグインの完成度は、現時点ではEclipseNetBeansプラグインを圧倒しているし、Flexもコードエディタに限ればFlex Builderより高機能。(*はUltimate Editionのみ)
コード解析
コード解析機能が充実している。FindBugs/CheckStyleと同等以上のインスペクション、推論付き補完、データフローの解析、コード構造の検索/置換(*)、重複コードの検出(*)など。(*はUltimate Editionのみ)

IntelliJの良くないところ

インクリメンタルビルドがない
編集中のコードのエラーはリアルタイムに把握できるが、プロジェクト全体のエラーはビルドするまで分からない。実行時、ビルドが終わるまで待たされる。
インデックス構築が遅い
プロジェクトの作成/オープン時、インデックス構築で数分待たされる。一応バックグラウンド化できるが、その間は基本機能しか利用できない。
操作体系が独特
3種類の補完を場面に応じて使い分ける必要があるなど、操作体系が独特。ただし、慣れれば逆に快適になるはず(補完を使い分けた方が、候補リストのスコープが狭くなって選択しやすいなど)。

Blogopolisのサーバ障害についてのお詫び

11/8の4:00頃から15:00頃までの間、Blogopolis(http://blogopolis.jp/)に正常にアクセスできない(ルータの認証画面が表示される)状態が続いていました。サイト利用者の方、特にブログパーツを利用していただいている方には、大変ご迷惑をおかけしました。

原因は、11/8の4:00頃にルータを交換した際、サーバの設定に不備があったことです。このとき十分なチェックを行わなかったことから、不備を見落としてしまい、長時間にわたって問題が続く状況になってしまいました。

今後、このようなことがないよう、注意してサービスを運用していきたいと思います。申し訳ありませんでした。

Eclipseユーザ向けのIntelliJ IDEAエディタ設定(前回の続き)

前回に続いて、IntelliJ IDEA 9のエディタをEclipseっぽく使用するための方法を書いてみます。使い込んでみて分かったのですが、やはりIntelliJのエディタは、デフォルトの挙動がEclipseとかなり違っているので、細かく設定してEclipseに近付けていくのが(Eclipseに慣れたユーザにとっては)良いと思います。

キャレット位置のシンボルを自動的にハイライト

Eclipseでは、以下のようにキャレット位置を自動でハイライトできます。

前回、IntelliJのハイライト方式はEclipseと違うと書きましたが、良く調べたらIntelliJにもEclipseと同様の自動ハイライト機能がありました。設定のEditor - Highlight on Caret Movement - Highlight usages of element at caretで有効化できます。


CamelCaseを考慮したキャレット移動

Eclipseの場合、例えばキャレットが以下の位置にあるとして

このときCtrl + →(Option + →)を押すと、キャレットが"R"の前に移動します。つまり、"normalizeRow"というシンボルがCamelCaseで"normalize"と"Row"に分割処理されます。IntelliJでもCtrl + →やCtrl + ←の押下時に、このCamelCaseを考慮したキャレット移動を行うためには、設定のEditor - Smart Keys - Use "CamelHumps" wordsを有効化する必要があります。

(追記: この設定をすると、シンボル上でダブルクリックしたときの範囲選択時に、語境界にもCamelCase分割が使われるので、シンボル全体を選択できなくなります。ダブルクリック時の挙動を元に戻すには、Editor - Advanced mouse usages - Honor "CamelHumps" words setting when selecting on double clickを無効化します。)

インデント位置の自動調整

Eclipseの場合、例えばキャレットが以下の位置にあるとして

このときtabを押すと、キャレットが12文字分前進します(前の行の開始位置にインデントされる)が、IntelliJの場合、デフォルトでは4文字分(デフォルトのタブサイズ)しか前進しません。

IntelliJのタブアクションには"Tab"と"Emacs Tab"の2種類があり、デフォルトでは前者にtabキーがマッピングされているのですが、後者の"Emacs Tab"を使えば、キャレットがEclipseと同様に前進するようになります。

メソッド引数情報のポップアップ

Eclipseでは、以下のようにメソッドの括弧内でCtrl + Space(Command + Space)を押すと、引数情報がポップアップしますが、IntelliJで同じ位置でCtrl + Spaceを押しても何も起きません。

IntelliJにはView - Parameter Infoという専用のメニューがあり、これで同様の表示ができます。ショートカットが割り当てられていない場合は、設定しておいた方が良いと思います。


補完時のJavadocポップアップ

メソッド等を補完しているとき、Eclipseの場合はJavadocが合わせてポップアップします。

IntelliJでは、設定でEditor - Code Completion - Autopopup documentation in (ms)を有効化すると、ポップアップするようになります。


文字ケースに寛容な補完

IntelliJのクラス名補完は、Eclipseと違い、デフォルトで先頭の文字ケースを区別するので、"map"と入力して補完しても何も出てきません。

この文字ケースの区別を無くすには、設定でEditor - Code Completion - Case sensitive completionを"None"にします。

パッケージ表示の平坦化

IntelliJのデフォルトのプロジェクトウィンドウは、Eclipseのように完全なパッケージ名が並ぶ形式ではなく、ディレクトリツリー形式になっています(左)。これをEclipse風にする(右)には、ウィンドウ右上のツールボタンをクリックしてFlatten Packagesを選択します。

IntelliJ IDEAのエディタ周辺機能(Eclipseユーザ向け)

Scalaプラグインが優秀と聞いて、少し前からIntelliJ IDEA Community Editionを使い始めました。Scalaのサポートは期待通り充実していたんですが、IDE自体も快適で、Eclipseから本気で乗り換えたくなってきました。

初めは、Eclipseと比べてエディタの操作感がかなり違うように見えて、とっつきにくく感じたんですが、それは単にEclipseの機能との対応関係が分かっていなかっただけで、少し馴染めば逆にIntelliJのエディタの方が使いやすい気がします。

以下、Eclipseのエディタに慣れた人向けに、IntelliJ IDEAで設定した方が良さそうな項目や機能の対応関係などを書いてみます。

最初にすること

Eclipse風キーマップの使用

設定の"Keymap"で"Eclipse"を選択します。キーバインドの大部分がEclipseと共通になります。

フリーカーソルの無効化

フリーカーソル(キャレットを行末以降に移動できてしまう)が気持ち悪い場合は、設定の"Editor - Virtual Space - Allow placement of caret after end of line"をオフにすると無効化できます。

保存について

IntelliJ IDEAのエディタには、個別のファイルを明示的に保存するという概念がなく、適切なタイミングで自動保存してくれるようです。勝手に保存されると最初は戸惑いますが、慣れれば保存のことを一切考えなくて良くなるので、非常に快適です。ローカル履歴が残るので、取り消しも簡単です。

対応関係が分かりにくい機能

Eclipse風キーマップを使ってもショートカットが一緒にならない機能のうち、特に良く使いそうなものです。

Eclipseの機能 Eclipseのショートカット IntelliJの機能 IntelliJのショートカット
シンボルのハイライト Alt + Shift + O Search - Highlight Usages in File Alt + Shift + O
クイックアウトライン Ctrl + O View - File Structure Popup Ctrl + F3
Javadocのルックアップ F2 View - Quick Documentation Lookup Ctrl + Shift + Space
各種生成(コンストラクタ、getter / setterなど) - Code – Generate... Alt + Insert
ビューの最大化 Ctrl + M Window - Hide All Tool Windows Ctrl + Shift + F12

シンボルのハイライトは、Eclipseのようにキャレット上のシンボルを自動ハイライトする方式ではなく、シンボル単位でハイライトのオン/オフを切り替えるようです。

11/4追記: Eclipseのような自動ハイライトも可能でした(設定でEditor - Highlight on Caret Movement - Highlight usages of element at caret)。

コードテンプレート

コードテンプレートはCtrl + Alt + Shift + Jで出ます。定義済みのテンプレートの中では、以下が特に便利そうです。

略語 内容
sout System.out.println("");
soutm System.out.println(現在のメソッド名);
soutv System.out.println("直前の変数 = " + 直前の変数);
psvm public static void main(String[] args) { }

Eclipseにない便利な機能

IntelliJ IDEAにあってEclipseにない機能のうち、便利だと思ったものです(Eclipseにもあったらご指摘お願いします)。

View - Quick Definition Lookup (Ctrl + Shift + I)

キャレット位置のシンボル定義をポップアップ表示します。実装コードの全体がポップアップするのですごく便利。

View - Context Info (Alt + Q)

キャレットを包含するメソッド名やクラス名を表示します。宣言部がスクロールアウトしているときに、現在のメソッド名を一発で確認できます。

View - File Path (Ctrl + Alt + F12)

エクスプローラ等で、現在のファイルが存在するディレクトリを開きます。

Go To - Symbol... (Ctrl + Alt + Shift + N)

任意のソース中の任意のシンボルをインクリメンタルサーチして、シンボルに直接移動できます。EclipseのCtrl + Shift + Tがすごくなった感じ。

Go To - Test

現在のクラスのテスティングペアに移動します。Quick JUnitと同じことができます。

その他参考ページ

Migrate - Help | IntelliJ IDEA