<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7832258534867547642</id><updated>2024-10-25T03:43:07.629+09:00</updated><category term="gae"/><category term="1.7.5"/><category term="Node.js"/><category term="Titanium"/><category term="golang"/><category term="C"/><category term="CloudFoundry"/><category term="CoffeeScript"/><category term="kay"/><category term="test"/><title type='text'>kawatch</title><subtitle type='html'>JavaScript, Titanium, Go言語, Google App Engine</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kawatch.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://kawatch.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>kawatch</name><uri>http://www.blogger.com/profile/15570726227038633329</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7832258534867547642.post-4649773085508837655</id><published>2011-12-12T00:06:00.001+09:00</published><updated>2011-12-12T00:58:04.073+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CoffeeScript"/><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><title type='text'>CoffeeScript を2日間触ってみた雑感</title><content type='html'>この週末は Node.JS, Express で書いたプログラム (JavaScript) を CoffeeScript に書き換えてみました。&lt;a href=&quot;http://el.jibun.atmarkit.co.jp/rails/2011/04/javascript-coff-6f71.html&quot;&gt;コード量が &amp;nbsp;1/3 になることもある&lt;/a&gt;ということで、当初の狙いはコードの簡略化でした。&lt;br /&gt;
&lt;br /&gt;
CoffeeScript は JavaScript に素直にマッピングされるので、JavaScript を知っていれば素直に学習できます。&lt;a href=&quot;http://jashkenas.github.com/coffee-script/&quot;&gt;説明ページ&lt;/a&gt;を数時間眺めれば書けるようになります。&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;コード量&lt;/span&gt;&lt;br /&gt;
学習後に、JavaScript のコードを CoffeeScript に書き換えたのですが、思ったよりは短くなりません。短くなったのは主に次の2点。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;閉じ bracket (}) だけの行。Python と同じ indent による block なので、if, for, function などにおける閉じ bracket は省略できます。&lt;/li&gt;
&lt;li&gt;後置 if, for 。if (x) {\n y;\n } が y if x となるので(閉じ bracket 行に加えて) 1 行節約できます。ただし y 部が長い場合は x が視線の右端に寄って読みづらくなるので使わないほうが読みやすいと思います。&lt;/li&gt;
&lt;/ul&gt;
どちらも 1行ずつ短くなりますが、たいした量ではありません。&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Loop&lt;/span&gt;&lt;br /&gt;
これまでは map(), each(), filter() などが使いたくて underscore.js を利用したり、いろんなブラウザで forEach() を使うために augment.js を利用したりしていました。&lt;br /&gt;
CoffeeScript の loop, comprehension の構文は強力で、なおかつ素直に for 文を使った JavaScript に変換されます。ほぼ全てのの実行環境で動作するんじゃないでしょうか。&lt;br /&gt;
実行環境のことを気にしなくて良いのは大きな利点です。&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;意外に良かった点&lt;/span&gt;&lt;br /&gt;
生成された JavaScript は (function() { コード } ).call(this); となっているため、グルーバルな名前空間を間違って汚す心配をしなくて良い。Node.JS や Titanium などの CommonJS に従う処理系では各ファイルが独自の名前空間を持つが、Browser で動作する JavaScript ではついつい global を汚してしまいがちなので、とても助かります(私が未熟なだけという話)。&lt;br /&gt;
global に露出したいときは&lt;a href=&quot;http://stackoverflow.com/questions/4214731/coffeescript-global-variables&quot;&gt;この記事&lt;/a&gt;にあるように root = exports ? this とすれば CommonJS と browser の両方に対応できます。(browser の場合は root が window になる)&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://github.com/fgnass/node-dev&quot;&gt;node-dev&lt;/a&gt; は CoffeeScript に対応しています。コードを書き換える毎の再起動を省力化してくれます。素晴らしい。&lt;br /&gt;
&lt;br /&gt;
Browser 用のコードは &lt;a href=&quot;https://github.com/Qard/express-coffee&quot;&gt;express-coffee&lt;/a&gt; で動的に CoffeeScript から JavaScript に変換できます。0.0.4 には、 Content-Type が application/octet-stream になる問題と、マルチバイト文字を CoffeeScript 内にふくむ際に Content-Length がおかしくなる問題があったので、&lt;a href=&quot;https://github.com/Qard/express-coffee/pull/2&quot;&gt;patch を送り&lt;/a&gt;ました。すぐに merge され 0.0.5 になりました。著者曰く&quot;That&#39;s how open source should be. :)&quot;だそうで。&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;今一歩な点&lt;/span&gt;&lt;br /&gt;
エラーが起きた際や &lt;a href=&quot;https://github.com/igo/nlogger&quot;&gt;nlogger&lt;/a&gt;&amp;nbsp;によるソースコードの行数表示は、生成された JavaScript の行数表示になります。coffee -c で JavaScript に変換してどの行か確認する必要があります。&lt;a href=&quot;https://github.com/jashkenas/coffee-script/issues/558&quot;&gt;Github の issue&lt;/a&gt; にて活発に議論されているので、そのうち解決されると期待するとしましょう。&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;その他&lt;/span&gt;&lt;br /&gt;
&lt;a href=&quot;https://github.com/satyr/coco&quot;&gt;Coco&lt;/a&gt;&amp;nbsp;という CoffeeScript の派生言語があります。文法を詳しく見ていませんが、コンパイル速度では Coco に分があるらしいです。&lt;br /&gt;
CoffeeScript と Coco が両方流行するとは思えないので、今のところメジャーな CoffeeScript に乗っても問題ないかなと思っています。</content><link rel='replies' type='application/atom+xml' href='http://kawatch.blogspot.com/feeds/4649773085508837655/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kawatch.blogspot.com/2011/12/coffeescript-2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/4649773085508837655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/4649773085508837655'/><link rel='alternate' type='text/html' href='http://kawatch.blogspot.com/2011/12/coffeescript-2.html' title='CoffeeScript を2日間触ってみた雑感'/><author><name>kawatch</name><uri>http://www.blogger.com/profile/15570726227038633329</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7832258534867547642.post-8424399927295038218</id><published>2011-12-06T08:32:00.001+09:00</published><updated>2011-12-06T10:39:10.614+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1.7.5"/><category scheme="http://www.blogger.com/atom/ns#" term="Titanium"/><title type='text'>Ti.App を global 変数格納場所として使おうとしたら</title><content type='html'>&lt;br /&gt;
どうもおかしい。&lt;br /&gt;
以下のコードで&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/1435911.js?file=gistfile1.txt&quot;&gt;
&lt;/script&gt;
&lt;br /&gt;
eq1 は false で、eq2 は true になる。Ti.App に関しては property の setter or getter で何かしらトリックが存在するっぽいな。。。</content><link rel='replies' type='application/atom+xml' href='http://kawatch.blogspot.com/feeds/8424399927295038218/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kawatch.blogspot.com/2011/12/tiapp-global.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/8424399927295038218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/8424399927295038218'/><link rel='alternate' type='text/html' href='http://kawatch.blogspot.com/2011/12/tiapp-global.html' title='Ti.App を global 変数格納場所として使おうとしたら'/><author><name>kawatch</name><uri>http://www.blogger.com/profile/15570726227038633329</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7832258534867547642.post-4027375780623646367</id><published>2011-12-05T23:35:00.001+09:00</published><updated>2011-12-06T10:39:36.470+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1.7.5"/><category scheme="http://www.blogger.com/atom/ns#" term="Titanium"/><title type='text'>Titanium で複数行のテキストの vertical align</title><content type='html'>今 Titanium を利用して iPhone アプリケーションを作成しています。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://code.google.com/p/titanium-mobile-doc-ja/wiki/TableView&quot;&gt;ここ&lt;/a&gt;の下の方にあるサンプルのようなことをするべく、複数行のテキストを table view のセル内に表示したいと思い Ti.UI.Label を試しました。height に設定した高さが満たされるだけ文字列が長い場合は私の目的通り動作するのですが、そうでない場合は vertical center align されてしまいます。(top align したい)&lt;br /&gt;
&lt;br /&gt;
UILabel も vertical align をサポートしていなかった記憶があるので、同じ理由だと思います。&lt;br /&gt;
&lt;br /&gt;
さて困ったな。&lt;br /&gt;
&lt;br /&gt;
Appcelerator の &lt;a href=&quot;http://developer.appcelerator.com/question/87661/vertical-align-of-text-in-a-label-plus-auto-truncate-the-text-at-a-fixed-height&quot;&gt;Q&amp;amp;A&lt;/a&gt; によると、&lt;a href=&quot;http://developer.appcelerator.com/question/87661/vertical-align-of-text-in-a-label-plus-auto-truncate-the-text-at-a-fixed-height#answer-158251&quot;&gt;一つの解決策&lt;/a&gt;は text property をセットした直後に custom event を発生させ、受信側で size.height が目的の height より小さかった場合には height property を &#39;auto&#39; に設定するというもの。&lt;br /&gt;
&lt;a href=&quot;http://developer.appcelerator.com/question/87661/vertical-align-of-text-in-a-label-plus-auto-truncate-the-text-at-a-fixed-height#answer-221067&quot;&gt;もうひとつの解決策&lt;/a&gt;は Ti.UI.TextArea を使うもの。&lt;br /&gt;
&lt;br /&gt;
過去 UILabel で同じ問題にあたった時も前者の方法で解決したような覚えがあるので、とりあえず前者の方法をためしてみます。</content><link rel='replies' type='application/atom+xml' href='http://kawatch.blogspot.com/feeds/4027375780623646367/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kawatch.blogspot.com/2011/12/titanium-vertical-align.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/4027375780623646367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/4027375780623646367'/><link rel='alternate' type='text/html' href='http://kawatch.blogspot.com/2011/12/titanium-vertical-align.html' title='Titanium で複数行のテキストの vertical align'/><author><name>kawatch</name><uri>http://www.blogger.com/profile/15570726227038633329</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7832258534867547642.post-8528443493627702978</id><published>2011-08-28T19:09:00.001+09:00</published><updated>2011-08-28T19:10:13.150+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CloudFoundry"/><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><title type='text'>Cloud Foundry</title><content type='html'>Cloud Foundry は open source の PaaS。&lt;a href=&quot;http://www.cloudfoundry.org/&quot;&gt;http://www.cloudfoundry.org/&lt;/a&gt;&amp;nbsp;でコミュニティが運営され、&amp;nbsp;&lt;a href=&quot;http://www.cloudfoundry.com/&quot;&gt;http://www.cloudfoundry.com/&lt;/a&gt;&amp;nbsp;でサービスが運営されている。&lt;br /&gt;
Open source なので自分のマシン上にサービスを構築することも可能。&lt;br /&gt;
VMware の仮想マシンが提供されており、開発者はローカルに環境を構築することができる。&lt;br /&gt;
Spring, Rails, Node.js, Groovy, Grails, Scala などがサポートされている。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.cloudfoundry.com/&quot;&gt;http://www.cloudfoundry.com/&lt;/a&gt;&amp;nbsp;は beta trial 中は無償で利用出来るようなので Node.js を試すついでに試してみよう。</content><link rel='replies' type='application/atom+xml' href='http://kawatch.blogspot.com/feeds/8528443493627702978/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kawatch.blogspot.com/2011/08/cloud-foundry.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/8528443493627702978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/8528443493627702978'/><link rel='alternate' type='text/html' href='http://kawatch.blogspot.com/2011/08/cloud-foundry.html' title='Cloud Foundry'/><author><name>kawatch</name><uri>http://www.blogger.com/profile/15570726227038633329</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7832258534867547642.post-3146655046278524647</id><published>2011-06-28T00:18:00.000+09:00</published><updated>2011-06-28T00:18:18.529+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gae"/><title type='text'>新価格体系 FAQ 日本語版</title><content type='html'>Google の松尾さんから mailing list 宛に&lt;a href=&quot;https://groups.google.com/d/topic/google-app-engine-japan/rG5CmZiHth8/discussion&quot;&gt;新価格体系 FAQ を日本語に翻訳したもの&lt;/a&gt;がポストされています。&lt;br /&gt;
値上げだと騒がれている今回の変更ですが、まだ読んでいない方は一度チェックしたほうが良いでしょう。</content><link rel='replies' type='application/atom+xml' href='http://kawatch.blogspot.com/feeds/3146655046278524647/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kawatch.blogspot.com/2011/06/faq.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/3146655046278524647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/3146655046278524647'/><link rel='alternate' type='text/html' href='http://kawatch.blogspot.com/2011/06/faq.html' title='新価格体系 FAQ 日本語版'/><author><name>kawatch</name><uri>http://www.blogger.com/profile/15570726227038633329</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7832258534867547642.post-1129121592144253393</id><published>2011-06-25T00:11:00.002+09:00</published><updated>2011-06-25T16:45:34.450+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gae"/><title type='text'>Google App Engine の新価格 (2)</title><content type='html'>&lt;a href=&quot;http://kawatch.blogspot.com/2011/05/google-app-engine-1.html&quot;&gt;Google App Engine の新価格 (1)&lt;/a&gt; では月々の費用 $9 に関する部分を見ていきました。&lt;br /&gt;
mailing list で &lt;a href=&quot;https://groups.google.com/d/topic/google-appengine/Hluog1_a3n4/discussion&quot;&gt;FAQ が更新された&lt;/a&gt;ようです。&lt;br /&gt;
&lt;br /&gt;
新価格でもっとも影響が大きいのは、これまで CPU 時間で課金されていた部分がInstance 起動時間での課金に変更されたことでしょう。更新されたFAQでもこれについての追加説明がされています。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;インスタンスの価格は $0.08/hour&lt;/li&gt;
&lt;li&gt;新たなインスタンスを起動するか否かはスケジューラが決定します&lt;/li&gt;
&lt;li&gt;スケジューラには4つのパラメータを与えることができます&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;Min Idle Instances: アイドル状態のインスタンスを最低いくつ確保するか。これまでの Always On を実現したい場合にはこの値を 1 以上にする必要があります。このパラメータは有償プランでのみ利用可能です。&lt;/li&gt;
&lt;li&gt;Max Idle Instances: アイドル状態のインスタンスを最高いくつ確保するか。アクセス数が短時間に集中する場合に影響します。&lt;/li&gt;
&lt;li&gt;Min Pending Latency: リクエストの予想待ち時間がこの値を下回る場合は新規インスタンスは起動されません。&lt;/li&gt;
&lt;li&gt;Max Pending Latency: リクエストの予想待ち時間がこの値を上回る場合は即座に新規インスタンスが起動されます。&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;新規にインスタンスを開始した場合には 15 min 分が startup 手数料として取られます。5 min だけインスタンスを起動した場合には 0.08 * (15 + 5) / 60 = 2.6 cents になります。&lt;/li&gt;
&lt;/ul&gt;短時間(数分の間)に多くのアクセスが集中するようなケースでは startup 手数料が多く取られることになります。費用を安くするために、これまでは純粋に CPU 時間だけを短くすることを考えれば良かったのですが、これからはインスタンス数と startup 回数を減らす方法を考える必要が出てきました。&lt;br /&gt;
&lt;br /&gt;
インスタンス数を減らすには&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;応答時間を縮める&lt;/li&gt;
&lt;li&gt;並列処理を行う&lt;/li&gt;
&lt;/ul&gt;ことで実現できます。並列処理に関しては現状 Java SDK でのみサポートされており、Python SDK では Python 2.7 をサポートする際にサポートすると宣言されています。&lt;br /&gt;
startup 回数に関しては、アクセス規模が小さいサイトでは問題に成り得ますが、比較的大規模のアクセスがあるサイトでは問題にならないかもしれません。</content><link rel='replies' type='application/atom+xml' href='http://kawatch.blogspot.com/feeds/1129121592144253393/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kawatch.blogspot.com/2011/06/google-app-engine-2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/1129121592144253393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/1129121592144253393'/><link rel='alternate' type='text/html' href='http://kawatch.blogspot.com/2011/06/google-app-engine-2.html' title='Google App Engine の新価格 (2)'/><author><name>kawatch</name><uri>http://www.blogger.com/profile/15570726227038633329</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7832258534867547642.post-3737520595815406642</id><published>2011-06-21T22:13:00.001+09:00</published><updated>2011-06-21T22:16:19.643+09:00</updated><title type='text'>App Engine 1.5.1</title><content type='html'>アメリカ時間で6月20日に App Engine の 1.5.1 がリリースされました &lt;a href=&quot;http://googleappengine.blogspot.com/2011/06/app-engine-151-release.html&quot;&gt;(公式blog) &lt;/a&gt;。&lt;br /&gt;
まだ試せていませんが、大きな変更点はこのようになっています。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Geolocation header&lt;/b&gt;: ユーザのアクセス元の国をベストエフォートで判断して X-AppEngine-Country header が付与されるようになりました。国や言語のデフォルト値を設定するときに便利そうです。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Channel API (Presence&amp;nbsp;support, Java &amp;amp; Python)&lt;/b&gt;: Channel API でユーザの切断・接続を検知できるようになりました。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Image API (WebP support, Java &amp;amp; Python)&lt;/b&gt;: &lt;a href=&quot;http://code.google.com/intl/ja/speed/webp/&quot;&gt;WebP image format&lt;/a&gt; のサポートが追加されました。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ProtoRPC (Python のみ)&lt;/b&gt;: Web ベースのサービスを定義するための &lt;a href=&quot;http://code.google.com/p/google-protorpc/&quot;&gt;ProtoRPC&lt;/a&gt; のサポートが追加されました。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;High Replication in the SDK (Java &amp;amp; Python)&lt;/b&gt;: SDK が high replication の consistency (eventually consistency) をエミュレート出来るようになりました。書き込んだものがすぐには見えない、そんな consistency が手元で試せるようになります。&lt;/li&gt;
&lt;/ul&gt;公式ブログに書いてあるのはここまで。</content><link rel='replies' type='application/atom+xml' href='http://kawatch.blogspot.com/feeds/3737520595815406642/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kawatch.blogspot.com/2011/06/app-engine-151.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/3737520595815406642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/3737520595815406642'/><link rel='alternate' type='text/html' href='http://kawatch.blogspot.com/2011/06/app-engine-151.html' title='App Engine 1.5.1'/><author><name>kawatch</name><uri>http://www.blogger.com/profile/15570726227038633329</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7832258534867547642.post-6524295169686098796</id><published>2011-06-01T23:53:00.000+09:00</published><updated>2011-06-01T23:53:08.474+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gae"/><title type='text'>Google App Engine の SLA</title><content type='html'>&lt;a href=&quot;http://www.google.com/enterprise/appengine/appengine_pricing.html&quot;&gt;新価格体系&lt;/a&gt;で支払いを行った場合に受けられる &lt;a href=&quot;http://code.google.com/intl/ja/appengine/sla.html&quot;&gt;SLA の draft が公開&lt;/a&gt;されています。draft なので今後変更される可能性があります。&lt;br /&gt;
内容から気になったところをピックアップします。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;GAEのサービスが停止した時間の割合により、その月以降で利用出来るクレジットが付与されます。稼働率に応じて当月利用料に対して以下の割合が付与されます。&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;99.95% を下回った(停止時間約22分を超えた)場合 10%&lt;/li&gt;
&lt;li&gt;99.00% を下回った(停止時間約7.2時間を超えた)場合 25%&lt;/li&gt;
&lt;li&gt;95.00% を下回った(停止時間約36時間を超えた)場合 50%&lt;/li&gt;
&lt;li&gt;90.00% を下回った(停止時間約72時間を超えた)場合 100%&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;問題が起きたときは、顧客が Google に通知する必要があります。&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;Google Apps support portal で SLA violation issue を新規に起こす&lt;/li&gt;
&lt;li&gt;Google Apps support portal から application id とエラーログを送る。&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;予定されていたメンテナンスによる停止は SLA に含まれません。メンテナンスは月合計80分以内です。&lt;/li&gt;
&lt;li&gt;応答時間が極端に遅いアプリ、DeadlineExceededException を出しているアプリは SLA 対象外です。&lt;/li&gt;
&lt;/ul&gt;大体こんなところです。&lt;br /&gt;
&lt;br /&gt;
大抵の場合、GAE上で実行しているサービスが生み出す価値がGAEの利用料を上回っているでしょうし、GAEは使用料自体が安い部類なので、サービスクレジットに関しては大きなインパクトは無いように思います。&lt;br /&gt;
自分から申し込まなければならないというのは意外でした。てっきり勝手に稼働率を測定して判断してくれるものと思っていました。他の SLA を読んだことがないのですが普通なのでしょうか。&lt;br /&gt;
DeadlineExceededException を出しているアプリは対象外というのも気をつける必要がありますね。処理が遅くならないように気をつけたプログラムを書かなければ SLA の補償が受けられません。&lt;br /&gt;
&lt;br /&gt;
上にも書きましたがこの内容は draft なので、実際に導入される際には変わる可能性があります。</content><link rel='replies' type='application/atom+xml' href='http://kawatch.blogspot.com/feeds/6524295169686098796/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kawatch.blogspot.com/2011/06/google-app-engine-sla.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/6524295169686098796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/6524295169686098796'/><link rel='alternate' type='text/html' href='http://kawatch.blogspot.com/2011/06/google-app-engine-sla.html' title='Google App Engine の SLA'/><author><name>kawatch</name><uri>http://www.blogger.com/profile/15570726227038633329</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7832258534867547642.post-5857420465302893657</id><published>2011-05-31T23:18:00.001+09:00</published><updated>2011-05-31T23:19:10.964+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gae"/><category scheme="http://www.blogger.com/atom/ns#" term="kay"/><category scheme="http://www.blogger.com/atom/ns#" term="test"/><title type='text'>Kay framework で code coverage 測定</title><content type='html'>今日は &lt;a href=&quot;http://code.google.com/p/kay-framework/&quot;&gt;Kay framework&lt;/a&gt; を試しました。このフレームワークは Google API Expert である &lt;a href=&quot;http://www.ianlewis.org/&quot;&gt;Ian M Lewisさん&lt;/a&gt;が中心となって作っている Google App Engine 用の web framework です。&lt;br /&gt;
Kay framework は GAE のサービスを利用しているコードを単体テストするための&lt;a href=&quot;http://kay-docs-jp.shehas.net/0.3.0/test.html&quot;&gt;便利な仕組みを備えて&lt;/a&gt;います。この仕組みを用いて単体テストを書いた後、それをコマンドラインから実行するには&lt;br /&gt;
&lt;pre&gt;$ python manage.py test
&lt;/pre&gt;とします。&lt;br /&gt;
&lt;br /&gt;
ここで単体テストのコードカバレッジを知るには &lt;a href=&quot;http://pypi.python.org/pypi/coverage&quot;&gt;coverage package&lt;/a&gt; が利用できるようです。&lt;br /&gt;
&lt;pre&gt;$ sudo easy_install coverage
&lt;/pre&gt;で coverage package をインストールした後に、&lt;br /&gt;
&lt;pre&gt;# myapp/ 以下のコードを測定対象に。ただし */test/* は除く。
$ coverage run --include &#39;myapp/*&#39; --omit &#39;*/test/*&#39; manage.py test
$ coverage report -m
&lt;/pre&gt;とすることでカバレッジを表示できます。&lt;br /&gt;
カバレッジの測定をする場合はテストの実行が遅くなるため、普段は coverage コマンドなしで単体テストを実行し、カバレッジを知りたいときのみ coverage コマンドで実行するのが良いでしょう。</content><link rel='replies' type='application/atom+xml' href='http://kawatch.blogspot.com/feeds/5857420465302893657/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kawatch.blogspot.com/2011/05/kay-framework-code-coverage.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/5857420465302893657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/5857420465302893657'/><link rel='alternate' type='text/html' href='http://kawatch.blogspot.com/2011/05/kay-framework-code-coverage.html' title='Kay framework で code coverage 測定'/><author><name>kawatch</name><uri>http://www.blogger.com/profile/15570726227038633329</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7832258534867547642.post-5437019517300303752</id><published>2011-05-30T23:53:00.000+09:00</published><updated>2011-05-30T23:53:35.660+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gae"/><title type='text'>Google App Engine の新価格 (1)</title><content type='html'>&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;先日 Google App Engine の&lt;a href=&quot;http://www.google.com/enterprise/appengine/appengine_pricing.html&quot;&gt;今後の価格体系&lt;/a&gt;&amp;nbsp;が発表されました。2011年後半に App Engine が preview を抜けると共に新価格体系に変更される予定です。価格表はリンク先を見ていただくことにして、&lt;a href=&quot;https://groups.google.com/d/topic/google-appengine/ob-kMuDAAqc/discussion&quot;&gt;Greg が mailing list に投稿した FAQ&lt;/a&gt;&amp;nbsp;の内 Costs の部分を訳そうと思います。&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;blockquote&gt; &lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px &#39;Hiragino Kaku Gothic ProN&#39;; color: #232323}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Arial; color: #232323}
span.s1 {font: 13.0px &#39;Hiragino Kaku Gothic ProN&#39;}
span.s2 {font: 13.0px Arial}
span.s3 {font: 12.0px Arial; color: #000000}
&lt;/style&gt;   &lt;div class=&quot;p1&quot;&gt;&lt;b&gt;費用&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;Q&lt;span class=&quot;s1&quot;&gt;：&lt;/span&gt;$ 9/app/month &lt;span class=&quot;s1&quot;&gt;は手数料か？最小使用料か？&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;A&lt;/span&gt;：&lt;span class=&quot;s3&quot;&gt; &lt;/span&gt;&lt;b&gt;フィードバックに基づき、元々は手数料であったが最小使用料に変更します。&lt;/b&gt;&lt;span class=&quot;s3&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp;&lt;/span&gt;言い換えれば、スケールさせるために&lt;span class=&quot;s2&quot;&gt; $9/month &lt;/span&gt;を支払う必要があるが、各月最初の&lt;span class=&quot;s2&quot;&gt; $9 &lt;/span&gt;の使用料の為に追加の&lt;span class=&quot;s2&quot;&gt; $9 &lt;/span&gt;を支払う必要はありません。&lt;span class=&quot;s3&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp;$500/account/month &lt;/span&gt;は運用サポートのコストをカバーするために手数料となっています。&lt;span class=&quot;s2&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Q&lt;/span&gt;：ほとんどの客は有料アプリに移行する必要がありますか？&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;A&lt;/span&gt;：いいえ、私たちは、現在アクティブなアプリケーションの大半は依然として無料の割り当てに収まると予想しています。&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Q&lt;/span&gt;：既存のアプリケーションには新価格が非適用となり、現在の課金モデルが適用され続けますか？&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;A&lt;/span&gt;：いいえ、&lt;span class=&quot;s2&quot;&gt;App Engine &lt;/span&gt;がプレビューを終了すると、既存のアプリケーションは新しい課金モデルが適用されます。&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;Q&lt;/span&gt;：ほとんどの客は請求が増えるのでは？もしそうなら、なぜ&lt;span class=&quot;s2&quot;&gt;Google&lt;/span&gt;は&lt;span class=&quot;s2&quot;&gt;App Engine&lt;/span&gt;を値上げしたのか？&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;A&lt;/span&gt;：はい、ほとんどのお客様の請求は増えるでしょう。&lt;span class=&quot;s3&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp;App Engine &lt;/span&gt;がプレビューフェーズの間、典型的な使用パターンとともに、製品を稼動させるための費用を観測することができました。&lt;span class=&quot;s3&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp;GAE &lt;/span&gt;は今&lt;span class=&quot;s2&quot;&gt; Google &lt;/span&gt;の完全な製品になろうとしており、それゆえに今後数年間にわたり持続的な収益モデルを持つ必要があります。そのための価格変更です。&lt;/div&gt;&lt;/blockquote&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;p1&quot; style=&quot;color: #232323; font: normal normal normal 13px/normal &#39;Hiragino Kaku Gothic ProN&#39;; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif; font-size: small;&quot;&gt;価格は全体的に少し上がるようですね。代わりに SLA が整備されるのは喜ばしいことです。製品開発に利用するための敷居はむしろ下がったのではないでしょうか。&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kawatch.blogspot.com/feeds/5437019517300303752/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kawatch.blogspot.com/2011/05/google-app-engine-1.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/5437019517300303752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/5437019517300303752'/><link rel='alternate' type='text/html' href='http://kawatch.blogspot.com/2011/05/google-app-engine-1.html' title='Google App Engine の新価格 (1)'/><author><name>kawatch</name><uri>http://www.blogger.com/profile/15570726227038633329</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7832258534867547642.post-190425771596150130</id><published>2011-05-30T00:13:00.003+09:00</published><updated>2011-05-30T00:37:48.001+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="golang"/><title type='text'>C言語の未定義動作と golang</title><content type='html'>LLVM の blog &amp;nbsp;&lt;a href=&quot;http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html&quot;&gt;What Every C Programmer Should Know About Undefined Behavior&lt;/a&gt;&amp;nbsp;を読みました。C言語の未定義動作と、最適化過程において一見正しそうにみえるバグを生み出す例が載っています。&lt;br /&gt;
例としてあげられているのは、符号付き整数のオーバーフロー。負の最小値(INT_MAX + 1 =&amp;gt; INT_MIN)になると思いがちですが、C言語では未定義となっています。未定義ということなので、データが飛ぼうがコンピュータが爆発しようが文句は言えません。言い換えるとコンパイラが好きなように扱っても良い(標準準拠)ということになります。以下例を見ていきます。&lt;br /&gt;
&lt;br /&gt;
int i, n; for (i = 0; i &amp;lt;= n; ++i) は n = INT_MAX のときに無限ループしそうな気がしますが、INT_MAX + 1 は undefined なので、コンパイラは n の値に関わらずループは n+1 回実行されると解釈し、コードを最適化することが可能です。&lt;br /&gt;
このことがバグを誘発します。void f(int n) { /* check overflow */ if (n &amp;gt; n+1) abort; ... } というコードがあったとき、n &amp;lt; n+1 によりオーバーフローチェックがされているように見えますが、 INT_MAX+1 は未定義なのでコンパイラは n &amp;gt; n+1 は常に偽と解釈することが可能です。その結果、if文は取り除かれてしまい、プログラマの思い通りには動作しません。&lt;br /&gt;
&lt;br /&gt;
さて golang ではどうでしょうか？LLVM blog で挙げられていた以下の項目について &lt;a href=&quot;http://groups.google.com/group/golang-nuts/browse_thread/thread/1eccb5d50e5dad1c/fd9b986f00c80396?pli=1&quot;&gt;mailing list に質問し&lt;/a&gt;てみました。&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Use of an uninitialized variable&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Signed integer overflow&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Oversized Shift Amounts&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Dereferences of Wild Pointers and Out of Bounds Array Accesses&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Dereferencing a NULL Pointer&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Violating Type Rules&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;お返事を頂いた結果としては、すべての動作は定義されているということでした。&lt;br /&gt;
GoはCよりプログラマが思ったとおりに動く言語であると言えるでしょう。</content><link rel='replies' type='application/atom+xml' href='http://kawatch.blogspot.com/feeds/190425771596150130/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kawatch.blogspot.com/2011/05/c-golang.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/190425771596150130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/190425771596150130'/><link rel='alternate' type='text/html' href='http://kawatch.blogspot.com/2011/05/c-golang.html' title='C言語の未定義動作と golang'/><author><name>kawatch</name><uri>http://www.blogger.com/profile/15570726227038633329</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7832258534867547642.post-5840744354781664680</id><published>2011-05-29T19:23:00.006+09:00</published><updated>2011-05-30T00:38:00.956+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gae"/><category scheme="http://www.blogger.com/atom/ns#" term="golang"/><title type='text'>Goroutine on App Engine</title><content type='html'>先日、待望の App Engine 上での Go 言語サポートが発表されました。&lt;br /&gt;
Goroutine は single thread 上で実行されるということですが、Multi-threading が利用できない他のプラットフォームと比較すると、並列性サポートが非常に楽になったと言えるのではないでしょうか。&lt;br /&gt;
&lt;br /&gt;
早速 goroutine を試してみます。&lt;br /&gt;
&lt;br /&gt;
以下のコードでは 3 つの goroutine が 1ms ずつ sleep しながら 5 つ数えます。(w を引き回すのは良くないかも?)&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/997627.js&quot;&gt;
 
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
実行したときの出力結果は以下のようになりました。&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-wrap: break-word;&quot;&gt;Routine 0: 0
Routine 1: 0
Routine 2: 0
Routine 0: 1
Routine 1: 1
Routine 2: 1
Routine 0: 2
Routine 1: 2
Routine 2: 2
Routine 1: 3
Routine 2: 3
Routine 1: 4
Routine 2: 4
Routine 0: 3
Routine 0: 4
Done.&lt;/pre&gt;&lt;br /&gt;
各 routine が interleave されて実行されている様子がわかります。&lt;br /&gt;
App Engine では並列性の弱さが一つの弱点である/あったと思いますが、goroutine が動作することにより楽に並列性を確保することができます。&lt;br /&gt;
現在 go runtime は申し込みしないと appspot.com 上で使えません。私も今申し込んでいるところです。上記のサンプルはローカルで動作させていますが、appspot.com 上でも同様に動作すると思います。&lt;br /&gt;
&lt;br /&gt;
はやく experimental を抜けて実用出来るようになってほしいです。</content><link rel='replies' type='application/atom+xml' href='http://kawatch.blogspot.com/feeds/5840744354781664680/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kawatch.blogspot.com/2011/05/goroutine-on-app-engine.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/5840744354781664680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7832258534867547642/posts/default/5840744354781664680'/><link rel='alternate' type='text/html' href='http://kawatch.blogspot.com/2011/05/goroutine-on-app-engine.html' title='Goroutine on App Engine'/><author><name>kawatch</name><uri>http://www.blogger.com/profile/15570726227038633329</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>