GANREF開発者の7つ道具(ハードウェア/周辺環境編)

前回のエントリからだいぶ時間が経ってしまいました。
ずっとブログを書かないでいると、いろいろ考えすぎて余計書けなくなってしまうものですね。


さて、ブログ休止期間中に開発をさせていただいたGANREF(ガンレフ)もリリースでき、
今ようやく一段落した感じです。
株式会社あくしゅさんと開発したGANREF。
メンバーのスキルの高さもさることながら、それぞれの開発スタイルがとても刺激になりました。


今回から2エントリは、GANREFプロジェクトの総括の意味で、開発メンバが利用していた環境やツール、その活用方法をご紹介したいと思います。今回はハードウェア/周辺環境編です。


1. PC
僕はMacbook Pro 15inch + Dell 24インチディスプレイで作業しています。メモリを3Gに増設し、最近128GBのSSDにしました(SSDによるパフォーマンス改善については別エントリで書く予定です)。

XAMPP for Macを入れてLAMP環境をさくっと構築。VMWareを起動してIE6のチェックをするときにはさすがに重いですが、そのほか開発作業については全く不自由してません。


2. キーボード&マウス
あくしゅのお二方に影響され、HHK Professional 2を使用しています。最初はオモチャみたいで馬鹿にしていましたが、今はこれがないとコードが書けませんw。カーソルキー操作に癖がありますが、時間が解決してくれます。

それまではMicrosoftのどでかいキーボードとロジクールのワイヤレスマウスを使用していました。たまにマウスが認識されないときがあり、そのたびイラっとして集中力が切れることがありました。その後有線マウスに交換しました。

keyboard.jpg

3. 椅子
開発が始まって1ヶ月経過した頃から、メンバー全員に首と背中が痛む症状に見舞われました。原因はおそらく椅子のせいだと思われたので、自宅で使用していたアーロンチェアをプロジェクトルームに搬入しました。あくしゅのお二人もアーロンチェアを購入されていました。

1日の大部分を座って過ごすプログラマは、体型にあった椅子を選ぶべきです。無理な姿勢で長時間過ごすと必ず体を痛めます。


4. ホワイトボード
設計について議論しているとき、言葉のやりとりだけでは伝わらないときがあります。幸いプロジェクトルームの片側一面はホワイトボードになっており、ディレクトリ構成やデータモデルのつながりなどを共有するときはポンチ絵を書いていました。

whiteboard.jpg

5. ラジオ
黙々とコードを書いてばかりだと気が滅入るので、半袖野郎さんの提案によりFMラジオを流していました。それにより13時の時報を合図に昼飯に出かける良いリズムが生まれました。


6. プロジェクトルーム
常駐先では開発関係者のみ利用できるプロジェクトルームをご用意頂きました。とても静かで集中できる環境でした。


7. うまい飯
常駐先にはおいしいランチのお店が結構ありました。以下にいくつか紹介します。




以上、無理矢理7個に収めた感がありますが紹介させていただきました。
仕事に集中できる環境は大事ですね。
みなさまのご参考になればと思います。


次回はGANREF開発者の7つ道具 ソフトウェア/サービス編をお届けします。
お楽しみに。

Google Developer Day 2008 に参加

gdd.png
6/10にパシフィコ横浜で開催されたGoogle Developer Day 2008に参加してきました。
詳細なレポートは以下のサイトに詳しく掲載されています。


本エントリは、僕が参加したセッションについてのメモ書きと妄想です。


■ 基調講演
Androidの実機デモを見ることができた。
iPhoneさながらのマルチタッチUI。
アイコンやボタンはGNOMEっぽい。Webページのスクロール、拡大機能もiPhoneとほぼ同機能。しかしiPhoneのそれより動きが滑らかではなかったように思う。Google Mapのストリートビューはすばらしかった。Androidの加速度センサに反応して360度見回すことができる。バーチャルリアリティ!

ブラウザ上でGoogle Earth が見れるデモ。残念ながらWindows IE, Firefoxのみ対応。トラックを動かす簡単なデモには笑った。エベレストの上も走れるw

次にgainerに加速度センサーをつけ、Flashアプリでフライトシミュレータ。残念ながらデモが動作せず。


以下、妄想:
Android + Google Earth API + Gearsで、カーナビの機能を充足できるのではないか。Androidでデータ通信して地図情報を取得、Gearsで目的地までのルートをキャッシュする。圏外の場所でも車搭載の加速度センサとGearsによってキャッシュしてある地図データがあればルート表示は可能。
建造物の3DモデルはGoogle Skeckupでどんどん追加されているわけだし、常に地図は更新され続ける。
地図CD-ROMの買い替えやHDDの取り替えも不要だ。でもたまにAdSenseが表示されたりして。


■ Google App Engine
ゲストブックのようなものをゼロから作り上げるデモを行っていた。
TextMateでPythonコードをすんごいスピードで書いていく。
コーディング->localhostで確認->コーディングのサイクルが早く、あっという間に完成した。

興味深かったのはDatastoreAPIを用いたデータ永続化の方法。
SQLに良く似たGQLにてデータを操作する。しかしながらテーブルのJOINは未サポートとのこと。

Pythonのソースコードは思っていたより見やすい。
インデントによってブレース記号({})が省略できるためだろうか、無駄がない感じ。

localhostで確認した後、専用アップローダを用いて
Googleにアップロードする。コマンドラインでもできる。

さらに自動的にバージョン管理までやってくれる!
Subversionのように構成管理(タグ、ブランチ)もやってくれるかは不明だが、便利な機能だ。

さらにさらに、アプリケーション管理画面ではCPUの負荷状況、
データ転送量、メール送信数などなど、至れり尽くせり。

これが500万PV/月まで無料で使えるとなれば、
スタートアップ企業や週末プログラマの皆さんは飛びつくだろう。

課題はPythonしかサポートしていないこと。
Rubyのサポートは会場からも強い要望が出ていた。
中にはC#をサポートしてくれよ!と懇願していた方も。
個人的にはPHPをサポートしてくれたら爆発的に利用者が増えると思うが。

招待制から一般開放されたようなので、今後いじくり回したい。


■ OpenSocial
APIのバージョンが0.8に上がった。主な変更はRESTful APIのサポート。
これによってJavascript以外からも叩け、サーバ間でのデータ送受信が可能になった。

OpenSocialの主要な構成要素である、
HTML + Javascript + REST + OAuth がすべて出そろったわけだ。

コンテナ(SNSなどのソーシャルデータを提供する側)からどの情報を取得できるか(プロフィール情報、友達情報、アクティビティ情報)については、コンテナ側に任されている。

正直言って自分の中ではまだOpenSocialがブレイクするかどうか分からない。
というのは、海外のようにSNS内にアプリケーションが作れるという文化がまだ根付いていないためだ。
この業界以外の人に説明しても理解に苦しむのではないか。

Facebookも日本語化され、MySpaceもOpenSocial対応したおかげで徐々に普及していくのかな。
OpenPNEがOpenSocial対応になるらしいので起爆剤になるかも。

個人的にはOAuthの知識がないので、調査していきたい。


■ Mashup から Mapplets へ
Google Mapに様々な情報を追加していくことができるデモ。
例えばある地域を表示させる。その地図上に不動産情報を表示、過去の犯罪が起きた地域を表示、交通機関マップを表示・・のように。

そのようにGoogle Map上に付加機能を追加していくのがMappletsと呼ぶらしい。
MappletsはGadgetのようにHTML + Javascriptで自分で作れる。

mapplet.png
こちらには多くのMappletsが登録されている。

ただ、すべての処理をJavascriptで行っているので、クライアントPCの負荷が気になった。


■ Google Gears から Gears へ
LocalServer, Database, Workerpoolの説明。
WorkerpoolはJavascriptのインタプリタを複数立ち上げることで、疑似スレッド処理が行えるとのこと。デモではHTML描画を行うWorkerと、複雑な素数演算を行うWorkerを同時に動かしても、描画はカクカクしないねというデモが行われた。

どちらかというと今まではオフラインでもウェブアプリが使えるよ的な謳い文句であったが、今後はクライアント側リソースを最大限に利用しようという方向のようだ。(MySpaceのメール検索のように)

マイはてブのインクリメンタル検索を行うデモを披露していた。
ブックマーク情報をすべてローカルのDatabaseに蓄えておくことで、ものすごいスピードでインクリメンタル検索を行っていた。すごい。

その他、デモをしていた若手エンジニアが発するGeekオーラが可愛かったw(すいません)


■ Google Web Toolkit と AJAX
略してGWT。グウィットと発音していた。
簡潔に言うとJavaで書いた処理をJavascriptソースに変換するコンパイラ。
JavascriptでできることはすべてJavaでかけるとのこと。
また、吐き出されるJavascriptはブラウザ毎に最適化されたコードになりパフォーマンスの向上も図れる。

EclipseでJavascriptの動作をJavaで書き、
ブレークポイントの設定、ステップ実行が行えるというデモが行われた。

ただ、EclipseがベースのAptanaでは、Javascriptのデバッグは普通にできる。Firebugでもできる。そういった意味であまりメリットは感じれなかった。

しかし、Servlet, JSPで開発するプロジェクトでは環境がEclipseで統一できるので、活躍できるのではないか。


以上、昼飯もとれないぐらい盛りだくさんの内容でした。
実はセッションと並行してHackathon(Googleエンジニアと密に接しながらコーディングできる)も行きたかったのですが、残念ながら抽選漏れ。次回は是非参加したいです。
Googleのパワーを存分に感じれた1日でした。

プロジェクト管理ツール Redmine

フリーで使えるBTS(バグトラッキングツール)を導入しようと思い情報収集していたところ、
Tracより良さげなRedmineにたどり着きました。
Tracと比較してのメリットは、こちらに詳しく掲載されています。
ということで、今回はRedmineインストールの顛末記です。

Tracと比較して個人的にメリットを感じたのは、

  • 複数プロジェクトを管理できる
  • デフォルトで日本語対応している
  • ガントチャートが使える
  • RailsアプリでPassenger(mod_rails)に対応(v0.7より)
の4つです。Tracはプロジェクト毎に公開ディレクトリを作成してApacheのhttpd.confを書き換えたりしなければならないのに対し、Redmineは一度設置すればあとは画面上でプロジェクトを作成できます。

また、プロジェクト毎に担当者を設定できるので、社外開発者に解放しても心配ありません。

最後のPassenger対応については、mongrelサーバで動かすよりも実際簡単でした。インストール方法も公式ページに詳細が掲載されています。


■メール通知をGmailのsmtpサーバを利用するようにカスタマイズ
Gmailのsmtpを利用するには、RailsにTLSプラグインを入れなければなりません。
# gem install tlsmail

そして、Redmineの config/environment.rbの最後に以下の2行を追加します。
require "tlsmail"
Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE)
これで送信することができました。


■Subversionリポジトリと連携
Redmineが動作しているサーバに、Subversionリポジトリがあるので連携させようと思ったのですが、ここでハマりました。どのように設定しても、「リポジトリに、エントリ/リビジョンが存在しません。」というエラーが表示されます。


同一サーバ上にリポジトリが存在するので、URLは「file:///リポジトリへのパス」と指定すればいいはずなのですが、一向にうまくいきません。。その他スキーム(http://, svn://)も試したのですがダメでした。

エラーログは下記の通り。
You have a nil object when you didn't expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.[]

エラーが出ている箇所のソースは以下の22行目です。
$REDMINE_HOME/lib/redmine/scm/adapters/subversion_adapter.rb


# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
require 'redmine/scm/adapters/abstract_adapter'
require 'rexml/document'
module Redmine
module Scm
module Adapters
class SubversionAdapter < AbstractAdapter
# SVN executable name
SVN_BIN = "svn"
# Get info about the svn repository
def info
cmd = "#{SVN_BIN} info --xml #{target('')}"
cmd < doc.elements["info/entry/repository/root"].text,
:lastrev => Revision.new({
:identifier => doc.elements["info/entry/commit"].attributes['revision'],
:time => Time.parse(doc.elements["info/entry/commit/date"].text).localtime,
:author => (doc.elements["info/entry/commit/author"] ? doc.elements["info/entry/commit/author"].text : "")
})
})
rescue => e
logger.error(e)
end

16行目の、#{SVN_BIN} info –xml #{target(”)} こいつを手動で叩くと(もちろんApache実行ユーザで)、きちんとXMLで結果が返ってきているのは確認しています。

Redmineを使ってドキュメント〜ソースまで一気通貫で管理できる!と
意気込んでいたのですが、諦めようかな。。
どなたかヒントをお持ちでしたらご教授いただけますか?



2008/05/15 追記
解決しました。svnの設定情報が/root配下のものを読み込んでおり、Redmineの実行ユーザがapache
なのでPermissionエラーとなっていたようです。

–config-dir オプションを利用して、apacheユーザーのホームディレクトリの設定情報を読み込むように変更します。
$REDMINE_HOME/lib/redmine/scm/adapters/subversion_adapter.rb

require 'redmine/scm/adapters/abstract_adapter'
require 'rexml/document'
module Redmine
module Scm
module Adapters
class SubversionAdapter < AbstractAdapter
# SVN executable name
#        SVN_BIN = "svn"
SVN_BIN = "svn --config-dir /home/apache " # こうする
# Get info about the svn repository
def info

11行目のように書き換える。
あー、すっきりした!

Page 2 of 812345...Last »