2011年12月12日月曜日

CoffeeScript を2日間触ってみた雑感

この週末は Node.JS, Express で書いたプログラム (JavaScript) を CoffeeScript に書き換えてみました。コード量が  1/3 になることもあるということで、当初の狙いはコードの簡略化でした。

CoffeeScript は JavaScript に素直にマッピングされるので、JavaScript を知っていれば素直に学習できます。説明ページを数時間眺めれば書けるようになります。

コード量
学習後に、JavaScript のコードを CoffeeScript に書き換えたのですが、思ったよりは短くなりません。短くなったのは主に次の2点。

  • 閉じ bracket (}) だけの行。Python と同じ indent による block なので、if, for, function などにおける閉じ bracket は省略できます。
  • 後置 if, for 。if (x) {\n y;\n } が y if x となるので(閉じ bracket 行に加えて) 1 行節約できます。ただし y 部が長い場合は x が視線の右端に寄って読みづらくなるので使わないほうが読みやすいと思います。
どちらも 1行ずつ短くなりますが、たいした量ではありません。

Loop
これまでは map(), each(), filter() などが使いたくて underscore.js を利用したり、いろんなブラウザで forEach() を使うために augment.js を利用したりしていました。
CoffeeScript の loop, comprehension の構文は強力で、なおかつ素直に for 文を使った JavaScript に変換されます。ほぼ全てのの実行環境で動作するんじゃないでしょうか。
実行環境のことを気にしなくて良いのは大きな利点です。

意外に良かった点
生成された JavaScript は (function() { コード } ).call(this); となっているため、グルーバルな名前空間を間違って汚す心配をしなくて良い。Node.JS や Titanium などの CommonJS に従う処理系では各ファイルが独自の名前空間を持つが、Browser で動作する JavaScript ではついつい global を汚してしまいがちなので、とても助かります(私が未熟なだけという話)。
global に露出したいときはこの記事にあるように root = exports ? this とすれば CommonJS と browser の両方に対応できます。(browser の場合は root が window になる)

node-dev は CoffeeScript に対応しています。コードを書き換える毎の再起動を省力化してくれます。素晴らしい。

Browser 用のコードは express-coffee で動的に CoffeeScript から JavaScript に変換できます。0.0.4 には、 Content-Type が application/octet-stream になる問題と、マルチバイト文字を CoffeeScript 内にふくむ際に Content-Length がおかしくなる問題があったので、patch を送りました。すぐに merge され 0.0.5 になりました。著者曰く"That's how open source should be. :)"だそうで。

今一歩な点
エラーが起きた際や nlogger によるソースコードの行数表示は、生成された JavaScript の行数表示になります。coffee -c で JavaScript に変換してどの行か確認する必要があります。Github の issue にて活発に議論されているので、そのうち解決されると期待するとしましょう。

その他
Coco という CoffeeScript の派生言語があります。文法を詳しく見ていませんが、コンパイル速度では Coco に分があるらしいです。
CoffeeScript と Coco が両方流行するとは思えないので、今のところメジャーな CoffeeScript に乗っても問題ないかなと思っています。

2011年12月6日火曜日

Ti.App を global 変数格納場所として使おうとしたら


どうもおかしい。
以下のコードで

eq1 は false で、eq2 は true になる。Ti.App に関しては property の setter or getter で何かしらトリックが存在するっぽいな。。。

2011年12月5日月曜日

Titanium で複数行のテキストの vertical align

今 Titanium を利用して iPhone アプリケーションを作成しています。

ここの下の方にあるサンプルのようなことをするべく、複数行のテキストを table view のセル内に表示したいと思い Ti.UI.Label を試しました。height に設定した高さが満たされるだけ文字列が長い場合は私の目的通り動作するのですが、そうでない場合は vertical center align されてしまいます。(top align したい)

UILabel も vertical align をサポートしていなかった記憶があるので、同じ理由だと思います。

さて困ったな。

Appcelerator の Q&A によると、一つの解決策は text property をセットした直後に custom event を発生させ、受信側で size.height が目的の height より小さかった場合には height property を 'auto' に設定するというもの。
もうひとつの解決策は Ti.UI.TextArea を使うもの。

過去 UILabel で同じ問題にあたった時も前者の方法で解決したような覚えがあるので、とりあえず前者の方法をためしてみます。

2011年8月28日日曜日

Cloud Foundry

Cloud Foundry は open source の PaaS。http://www.cloudfoundry.org/ でコミュニティが運営され、 http://www.cloudfoundry.com/ でサービスが運営されている。
Open source なので自分のマシン上にサービスを構築することも可能。
VMware の仮想マシンが提供されており、開発者はローカルに環境を構築することができる。
Spring, Rails, Node.js, Groovy, Grails, Scala などがサポートされている。

http://www.cloudfoundry.com/ は beta trial 中は無償で利用出来るようなので Node.js を試すついでに試してみよう。

2011年6月28日火曜日

新価格体系 FAQ 日本語版

Google の松尾さんから mailing list 宛に新価格体系 FAQ を日本語に翻訳したものがポストされています。
値上げだと騒がれている今回の変更ですが、まだ読んでいない方は一度チェックしたほうが良いでしょう。

2011年6月25日土曜日

Google App Engine の新価格 (2)

Google App Engine の新価格 (1) では月々の費用 $9 に関する部分を見ていきました。
mailing list で FAQ が更新されたようです。

新価格でもっとも影響が大きいのは、これまで CPU 時間で課金されていた部分がInstance 起動時間での課金に変更されたことでしょう。更新されたFAQでもこれについての追加説明がされています。

  • インスタンスの価格は $0.08/hour
  • 新たなインスタンスを起動するか否かはスケジューラが決定します
  • スケジューラには4つのパラメータを与えることができます
    • Min Idle Instances: アイドル状態のインスタンスを最低いくつ確保するか。これまでの Always On を実現したい場合にはこの値を 1 以上にする必要があります。このパラメータは有償プランでのみ利用可能です。
    • Max Idle Instances: アイドル状態のインスタンスを最高いくつ確保するか。アクセス数が短時間に集中する場合に影響します。
    • Min Pending Latency: リクエストの予想待ち時間がこの値を下回る場合は新規インスタンスは起動されません。
    • Max Pending Latency: リクエストの予想待ち時間がこの値を上回る場合は即座に新規インスタンスが起動されます。
  • 新規にインスタンスを開始した場合には 15 min 分が startup 手数料として取られます。5 min だけインスタンスを起動した場合には 0.08 * (15 + 5) / 60 = 2.6 cents になります。
短時間(数分の間)に多くのアクセスが集中するようなケースでは startup 手数料が多く取られることになります。費用を安くするために、これまでは純粋に CPU 時間だけを短くすることを考えれば良かったのですが、これからはインスタンス数と startup 回数を減らす方法を考える必要が出てきました。

インスタンス数を減らすには
  • 応答時間を縮める
  • 並列処理を行う
ことで実現できます。並列処理に関しては現状 Java SDK でのみサポートされており、Python SDK では Python 2.7 をサポートする際にサポートすると宣言されています。
startup 回数に関しては、アクセス規模が小さいサイトでは問題に成り得ますが、比較的大規模のアクセスがあるサイトでは問題にならないかもしれません。

2011年6月21日火曜日

App Engine 1.5.1

アメリカ時間で6月20日に App Engine の 1.5.1 がリリースされました (公式blog)
まだ試せていませんが、大きな変更点はこのようになっています。


  • Geolocation header: ユーザのアクセス元の国をベストエフォートで判断して X-AppEngine-Country header が付与されるようになりました。国や言語のデフォルト値を設定するときに便利そうです。
  • Channel API (Presence support, Java & Python): Channel API でユーザの切断・接続を検知できるようになりました。
  • Image API (WebP support, Java & Python): WebP image format のサポートが追加されました。
  • ProtoRPC (Python のみ): Web ベースのサービスを定義するための ProtoRPC のサポートが追加されました。
  • High Replication in the SDK (Java & Python): SDK が high replication の consistency (eventually consistency) をエミュレート出来るようになりました。書き込んだものがすぐには見えない、そんな consistency が手元で試せるようになります。
公式ブログに書いてあるのはここまで。