tag:blogger.com,1999:blog-65376838901940049152024-02-20T13:32:57.724+09:00404 shin1のつぶやき ないわー Not Foundssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.comBlogger452125tag:blogger.com,1999:blog-6537683890194004915.post-60539080531647006122017-10-02T10:39:00.001+09:002017-10-02T10:39:29.455+09:00出力先を移動してます技術的なものは<a href="https://qiita.com/shin1ogawa">Qiita</a>、その他ちょっとしたものは<a href="https://shin1ogawa.tumblr.com">Tumblr</a>、暗号通貨関連は<a href="https://valu.is/shin1ogawa">VALU</a>といった使い分けで書いています。ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-19442181985019862412012-09-06T01:23:00.000+09:002012-09-06T01:26:01.314+09:00Google Pickerが便利すぎた<p>Google Pickerっていう、Google Docs(Google Drive)を前提としたPickerがめちゃ便利な事に気づいていませんでした。ずっと GWT 専用のコンポーネントなんだと勘違いしていたという。Pickerですが、基本的にはリソースのURLが返されます。Docsネイティブなリソースの場合にはそのアイコンやらも取得できます。</p>
<p>こんなカンジでDocs内の文書を選択させたり。</p>
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe15Dg6-OBC1oZ2k11DR1E00va4hgfSMySOCggtLaGkkbrNgqqzgmZdMUlUEbd7aNKpEvMpJm6nRsttkpP6UAKwyh11o5-E7_pXP01mW-LKJUsX_chkG9DSm4wyUTLa_J15j47sjfKhD5-/s600/Screen+Shot+2012-09-06+at+1.13.47+AM.png" /></div>
<p>地図からPlaceを選択させたり。</p>
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOHOmp_FDEqezXpyP6t_I6EdxDulDKUFvPxrb20CIripzhgbMEGmdBefrHvwT1amIyhmSXf8I_LlBEPK7p5c2jr328cKj78JqHxBrDzBtucpdVu7wIyPwWKSuuFOr7xKvx1cfbNfM5IxnV/s600/Screen+Shot+2012-09-06+at+1.14.25+AM.png" /></div>
<p>Docsへアップロードさせて、アップロードされたファイルを選択したり。</p>
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibl1aaKFmts45XNe1YY2pLbYGNQvsddrfCTXQZhFAyyXsCJefH5AgN1Own6nwSUMQrZ1o6juFTaqd645vuCtrz_Ktgh54ljd9mh1tK9bykmUZT40k8RofqTXCxeKK_Ch8IzWPm0oM90y2S/s600/Screen+Shot+2012-09-06+at+1.14.52+AM.png" /></div>
<h4>使い方</h4>
<ol>
<li><code>google.picker.PickerBuilder()</code>をインスタンス化して、Builderを用意する</li>
<li><code>addView() addViewGroup()</code>で、左側に表示するカテゴリやグループ化したカテゴリを追加する</li>
<li>リソースが選択されてポップアップが閉じた時のコールバック関数を登録する</li>
<li><code>build()</code>して、<code>setVisible(true)</code>する</li>
</ol>
<div style="font-size: smaller;">
<script src="https://gist.github.com/3639106.js"> </script>
</div>
<p>リファレンスのURL 書き忘れてたので追記: <a href="https://developers.google.com/picker/">https://developers.google.com/picker/</a></p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-41353632742226797832012-09-03T15:46:00.002+09:002012-09-03T15:46:23.577+09:00App Engine Full-text Search API の使いどころ<p>今年になって Google App Engineに Full-text Search(以下FTS)という機能が追加されています。全文検索機能の事で、日本語にも対応しています。リリース前に私も appengine ja night 20 で紹介をしました。その時にも「日本語検索はおまけ、それ以外の機能が強力」という話をしたのですが、それについて少し具体例を交えて説明をしようと思います。</p>
<h4>ログインユーザごとのアクセス権限を参照する処理</h4>
<p>RDBでは簡単でも、データストアで苦戦することまちがいなしの要件として、次のような要件がよく出てきます。</p>
<ol>
<li>企業向けアプリケーション等で、リソースへのアクセス制御をしたい</li>
<li>リソースに対するアクセス許可リスト(ACL)として、ユーザIDだったり、ユーザを束ねたグループIDだったりを定義する</li>
<li>ログインユーザに対して、リソースの一覧を提供する。もちろん、アクセスできるもののみが一覧表示される。</li>
</ol>
<p>企業向けアプリケーションではまず必要になる、よくある処理だと思います。ここでは企業向けアプリケーションと書いていますが、例えばTwitterなどの、ユーザ間の関係が発生するアプリケーションでも同じような要件が出てきます。なお、ここでいうグループはディレクトリ的なものではなく、一ユーザが複数のグループに所属できるような関係を想定しています。</p>
<h4>データストアで実装する</h4>
<p>これをデータストアで実装しようとするとなかなか厄介ですが、大きく分けると「保存時に頑張る」「クエリ時に頑張る」の二種類の方針が考えられます。</p><p>後者の方針は早々に破綻する可能性があるため(一覧表示くらいならなんとかなるが、なんらかのフィルタがくっつくと処理に相当無理が出るし、固定の件数でページングするのも難しい)、多くの場合は前者の「保存時に頑張る」方法で次のように実現することになると思います。</p>
<ul>
<li>リソースが保存された時に、それにアクセスできると定義されたグループから、ユーザを展開する</li>
<li>展開したユーザ(リソースにアクセスできるユーザ)分だけ、「ユーザごとにアクセスできるリソース」を作成し、保存する。このエンティティはユーザのIDとリソースのIDを保持します。カインド Readable としましょう。</li>
<li>ログインユーザがリソース一覧を表示する場合、Readableに対してクエリを発行します。</li>
</ul>
<p>独自にインデックス用のエンティティを作るということです。この実装方法ですとアクセスの制限が広いリソース(全社員向け、とか!)が保存された場合、ものすごく大量の Readable エンティティが作成・保存されますし、それ以外に面倒な非同期処理も必要になります。例えば、グループ内のユーザが変更された場合や、ユーザが新たに発生した場合です。しかし、「クエリ時に頑張る」実装よりは、ユーザに対して良いパフォーマンスを提供できるので、保存時に頑張る、を選択することが多いのではないかと思われます。</p>
<h4>FTSを利用する</h4>
<p>FTSを使うとかなり簡単になります。</p>
<ol>
<li>リソースが保存された時に、リソースの主キーと、アクセスを許可するグループやユーザのIDを多値フィールドとしてFTSのDocumentに追加して、インデクスさせる。DocumentのIDとしては、リソースの主キーをエンコードした文字列を使用しとくと便利です(FTSにもkeysOnlyなオプションがあるのです)。アクセスを許可するグループやユーザのIDは ACL というフィールド名とします。</li>
<li>例えばログインユーザが g1 ,g2, g3 というグループに所属している u1 というユーザであれば、FTSで「ACL=u1 or ACL=g1 OR ...」とORでつなぐだけ。ソートやフィルタが必要であれば、それらのフィールドをDocumentに追加しておくと良いです。で、取得したリソースのキーを使って、データストアから必要なリソースをバッチGETすればリソース本体も取得できます。それが面倒なら、Documentの方に必要なフィールドを含めても良いでしょう(そうこうするうちにデータストアが不要になった、となる可能性もるかも)</li>
</ol>
<p>工夫も何もありません、特にめづらしい実装にも思えませんが、FTSを日本語検索ではない目的で使用するのが強力だ、と言っていたのはこういう処理で使うことを想定していたためです。データストアだけでは実装コストもランニングコストも高くなってしまう処理が、工夫もなく簡単に実現できてしまうのです。グループのメンテナンスが発生した場合の整合性を維持する非同期処理は同じように残ってしまいますが、そこはデータストアに対するメンテナンスよりも軽くなるはずです。</p>
<p>これに日本語検索を加えてもいいです。今のところ、FTSを多用する場合の注意点は次のようなものがあるとおもいます。</p>
<ul>
<li>FTSはまだExperimentalなため、APIのRateと保存容量にLimitが存在する上、利用料金も決まっていません。これらふたつのLimitはGooglerに連絡すれば回避できますが、料金はちょっと心配です。
しかし、独自にインデックス用のエンティティを作って実装している場合はWrite Operationsもかなり大きいので、それら程度であれば、実装のコストが削減できる分FTSの方が良いですね。</li>
<li>FTSはまだExperimentalなため、不具合が無いとはいいきれません。</li>
<li>クエリに使える文字列は 2000文字が限界です. ひとりのユーザが数百のグループに所属…となると、それにひっかかってしまうかもしれません。それが心配な場合は、ユーザやグループのメールアドレスなど長い文字は使わず、別の短い値に変換して使うと良いでしょう。</li>
</ul>
<h4>まとめ</h4>
<p>SDK1.7.0 から Datastore に対してもORによるフィルタが指定できるようになりましたが、その機能ですとカーソルを返せない(実際には複数クエリを並列実行してるだけなので、当たり前ですね)という問題があります。</p>
<p>Cloud SQLを組み合わせればFTSなしでも同じことができますが、テスト環境の手間が多少なりとも増えてしまうのがイヤな人にはデメリットです。が、このあたりは好みによりますね、素直にCloud SQLで慣れたRDBの設計・実装を行うのも実装コストを減らす選択肢のひとつです。Cloud SQLはスケールアウトしないという特徴にも注意が必要かも。一社のみで使うアプリケーションであれば良いですが、複数社に提供する業務アプリケーションであれば、ボトルネックになる可能性があります。</p>
<p></p>
<h4>おまけ</h4>
<p>肝心の日本語検索ですが、 Google検索 >>> Gmail検索 = FTS > Google Docs検索 といったかんじの性能じゃないかなーと感じました。</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-4614578201585711932012-06-21T00:48:00.001+09:002012-06-21T00:51:13.240+09:00coffee, lessなプロジェクトをgruntで便利に<p>最近ようやくcoffeescriptにもLESSにも慣れてきました。で、そろそろgruntを活用しようかなと先月くらいから使ってみてますが便利です。</p>
<ol>
<li>*.less →(コンパイル)→ style.css →(圧縮)→ <code>style.min.css</code></li>
<li>*.coffee →(コンパイル)→ *.js →(連結)→ app.js →(圧縮)→ <code>app.min.js</code></li>
<li>*-test.coffee →(コンパイル)→ *-test.js →(連結)→ <code>tests.js</code></li>
<li><code>app.min.js</code>, <code>tests.js</code>を読み込んでqunitでテスト</li>
<li>index.htmlでは<code>app.min.js</code>と<code>style.min.css</code>を読み込む</li>
</ol>
<p>こんなかんじの事を簡単にできます。テストもcoffeescriptで書けて良いです。</p>
<p>現在リリースされている grunt v0.3.9 では coffee, less, sqwishに対応したタスクが無いので、カスタムタスクを grunt.js 内で登録して使用してます(pluginとして環境に登録はしていない)。</p>
<dl><dt>$ grunt watch &</dt><dd>lessやcoffeeファイルの編集を監視して、自動的にコンパイルして連結して圧縮してくれます。</dd>
<dt>$ grunt clean</dt><dd>出力ファイルやフォルダを全て削除します。</dd>
<dt>$ grunt</dt><dd>lessやcoffeeファイルをコンパイルして連結して圧縮して、圧縮したjsを使ってqunitでテストしてくれます。</dd>
</dl>
<h3>フォルダ構成</h3>
<p>私の場合はほぼ全てのプロジェクトがGoogle App Engine/Javaプロジェクトで、mavenを使っているのでフォルダ構成は次のような状況です。</p>
<ul>
<li>src/main/coffee<ul><li>プロダクト用の coffee ファイル</li></ul></li>
<li>src/main/less<ul><li>less ファイル</li></ul></li>
<li>src/test/coffee<ul><li>テスト用の coffee ファイル</li></ul></li>
<li>src/test/qunit<ul><li>qunit.css, qunit.js, sinon.js, qunit.html(war/js/app.min.js, target/tests.js)</li></ul></li>
</ul>
<p>出力先となるフォルダ・ファイル。</p>
<ul>
<li>target/js<ul><li>プロダクト用の coffee ファイルをコンパイルしたJavaScriptファイル</li></ul></li>
<li>target/js.test<ul><li>テスト用の coffee ファイルをコンパイルしたJavaScriptファイル</li></ul></li>
<li>target/tests.js<ul><li>テスト用のcoffee ファイルをコンパイルしたJavaScriptファイルを連結したJavaScriptファイル</li></ul></li>
<li>war/css/style.css<ul><li>lessをコンパイルしたcssファイル</li></ul></li>
<li>war/css/style.min.css<ul><li>lessをコンパイルしたcssファイルを圧縮したファイル</li></ul></li>
<li>war/js/app.js<ul><li>プロダクト用のcoffeeファイルをコンパイルしたJavaScriptファイルを連結したJavaScriptファイル</li></ul></li>
<li>war/js/app.min.js<ul><li>プロダクト用のcoffeeファイルをコンパイルしたJavaScriptファイルを連結したJavaScriptファイルを圧縮したJavaScriptファイル</li></ul></li>
</ul>
<h3>grunt.js</h3>
<p>次がgruntの定義ですが、これを利用するには、nodejs, npm, phantomjs が必要で、npmでは grunt, less, coffee-script, sqwish をインストールしておく必要があります。</p>
<script src="https://gist.github.com/2960562.js"></script>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-10177537206310439372012-03-12T14:02:00.000+09:002012-03-12T14:02:44.241+09:00Google API Expertが解説する Google App Engine for Java実践ガイド が発売されます<p>書きました。3/16(金)に発売されます。Javaの経験が無いと厳しいです。。Javaの経験があり、Google App Engine/Javaに興味がある人、実際に現場で使っている・使う予定がある人の役に立つと思いますので、興味があればポチってみてください。</p><p><iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=shin1o-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4844331736" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></p>
<p>目次は次のようになっています。
<ol><li>第1章 イントロダクション</li><li>第2章 JUnitによるテスト</li><li>第3章 各機能の使い方</li><li>第4章 アプリケーションの設計の注意点</li><li>第5章 課金額の節約</li><li>第6章 提供されるツールの使い方</li></ol></p>
<p>1章ではHello worldレベルのサンプルを実施し、2章では1章で使ったサンプルを作り直しながらGoogle App Engine/Javaの環境での自動テストの能力と、IDEの能力を引き出す方法を説明し、Google App Engine/Java環境での開発のリズムを掴めるよう説明します。一番ボリュームがある第3章では、まずは様々なサービス(機能)を実行する仕組みを説明して、その後サンプルアプリケーションを拡張しながら次のサービスについて説明します。
<ol><li>Datastore Service</li><li>Users Service</li><li>Memcache Service</li><li>Task Quere Service</li><li>Scheduled Tasks</li><li>Mail Service</li><li>Channel Service</li><li>Blobstore Service/File Service</li><li>Images Service</li><li>Prospective Search</li><li>XMPP Service</li><li>URLFetch Service</li><li>Backends</li><li>Pull Queues & Pull Tasks</li><li>Log Service</li><li>Capabilities Service</li><li>OAuth Service</li><li>Multitenancy</li><li>Conversion API</li></ol>
4章、5章は主にアプリケーションのチューニングの説明をします。</p>
<p>Google App Engine/Java環境を使った場合の自動テスト対象の広さ&速さ、開発効率の高さ。それらの支えがあることで、アプリケーションのサーバ側がどれだけラクになるか、という事が伝えたい内容です。</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-70920762143692600872012-01-15T23:40:00.001+09:002012-01-15T23:40:25.604+09:00CoCafeでのGoogle App Engine側の工夫<p>年末に <a href="http://twitter.com/aqubi">@aqubi</a> と <a href="http://itunes.apple.com/jp/app/cocafe/id483713206">CoCAFE</a> というアプリケーションをリリースしました。喫茶店のWiFi状況やらなんやらを共有するiPhone用のアプリケーションです(Android版も作ってます)。<br /><a href="http://itunes.apple.com/jp/app/cocafe/id483713206" imageanchor="1"><img border="0" src="http://cocafe.sorausagi.org/_/rsrc/1323497086004/home/app_store_badge.png" /></a></p>
<p>このアプリケーションでは
Google Places APIとGoogle App Engineを使っていて、Google App Engine側では以下のような工夫をしてます。</p>
<h4>Datastore(HRD)</h4>
<ul><li>地図のZoomに合わせた範囲検索をEqualityフィルタで実現するため、店の位置情報はGeoHashの先頭4文字,先頭5文字,先頭6文字,先頭7文字...とリストプロパティに保持→前方一致検索を使わずに済むので、別の条件で同時にInequeality Filterを使うこともできる。</li>
<li>利用ユーザ等の統計をとるためのアクセスログ的なデータは、必要な情報を全てKeyに詰め込んでいる→ Datastore Write Operationsの節約</li></ul>
<h4>Task Queue</h4>
<ul><li>APIごとのアクセスカウンタは、リクエストを受け取ったときにはPull modeのTask QueueにTaskを追加。定期的にそれをPullして集計し、Datastoreに反映→ Datastore Write Operationsの節約、更新の衝突の心配もせずに済む</li></ul>
<h4>OAuth Provider</h4>
<ul><li>App EngineのOAuth Providerを使用したのでOAuth Provider的なコードはほぼ書かずに済んだ</li></ul>
<p>開発にかかった時間の殆どがクライアント側の実装と、操作性の調整です。Google App Engineだとサーバ側の実装はDBのコネクションがどーたらとか全然関係ないし、自動テストも簡単に実装できるし、全ての自動テストを実行しても大概数秒で実行できるし、ミドルウェアの設定も保守も必要ないし、運用も手間がかからないし、アプリケーションに集中したい人にはラクで良いです。</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-22379962569853961662012-01-13T00:21:00.000+09:002012-01-13T00:22:50.234+09:00Slim3+Cross Group TransactionをUnit Testで使う #gaeja<p>昨年末から何度か「Slim3でCross Group Transaction(所謂XG)をUnit Testで使う時どうするの」的な話を見かけつつ、反応できていなかったので書いておきます。</p>
<p>まず「UnitTest環境でHRDを有効にする」「(Slim3で)XGを使う」のふたつに分けて考える必要があります。</p>
<h4>UnitTest環境でHRDを有効にする</h4>
<p>Slim3は1.0.15くらいからGoogle App Engine SDKが提供するUnitTestの仕組みを併用できるようになっています。mavenを使っている方は、最新のslim3-archetype-pluginを使ってプロジェクトを生成した場合に<code>appengine-testing</code>等のモジュールが依存に追加されている事に気づいた人もおられるんじゃないでしょうか。</p>
<p>Slim3の<code>AppEngineTestCase</code>を継承したテストクラスの場合は、SDKが提供するUnit Testの仕組みを併用して、setUp()/tearDown()を次のようにするとHRDが有効になります。</p>
<pre name="code" class="java">LocalServiceTestHelper helper;
@Override
public void setUp() throws Exception {
LocalDatastoreServiceTestConfig dsConfig =
new LocalDatastoreServiceTestConfig()
.setDefaultHighRepJobPolicyUnappliedJobPercentage(0.01f);
helper = new LocalServiceTestHelper(dsConfig);
helper.setUp();
super.setUp();
}
@Override
public void tearDown() throws Exception {
super.tearDown();
helper.tearDown();
}</pre>
<h4>Slim3でXGを有効にする</h4>
<p>Transactionオブジェクトの構築方法によります。</p>
<p>Slim3の<code>Datastore.beginTransaction()</code>を使ってTransactionオブジェクトを作っている場合は、システムプロパティに<code><strong>slim3.useXGTX=true</strong></code>が指定されている必要があります。Server環境(Productionサーバ、開発サーバ)で起動している場合はシステムプロパティは<code>appengine-web.xml</code>でそれを指定すれば良いですが、Unit Testの際には<code>appengine-web.xml</code>が読み込まれませんので、setUp()の際に<code><strong>System.setProperty("slim3.useXGTX", "true");</strong></code>とする必要があります。</p>
<p>Slim3の<code>Datastore.beginTransaction()</code>を使わず、Low Level APIを使って<code>DatastoreServiceFactory.getDatastoreService().beginTransaction(TransactionOptions.Builder.withXG(true));</code>としてTransactionオブジェクトを作っている場合はSlim3のシステムプロパティを気にする必要はありません。Slim3が使用するTransactionオブジェクトはLow Level APIで使用するTransactionオブジェクトと同じクラスですので、Low Level APIとの併用も可能です。</p>
<p>私としては、<code>slim3.useXGTX=true</code>を指定せずSlim3のXGは使えなくしておき、XGを使うときはLow Level APIを使ってTransactionオブジェクトを作成する方が好みです。XGを使用している事がコードから明確に見て取れるという点が嬉しいです。</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-10882549672334041522011-09-21T02:43:00.001+09:002011-09-21T02:44:04.481+09:00Google+ Hangout APIが公開されています<ul>
<li><a href="http://developers.google.com/+/hangouts/">Google+ Hangouts API - Google+ Platform — Google Developers</a><ul>
<li><a href="http://developers.google.com/+/hangouts/writing">Writing Hangout Apps - Google+ Platform — Google Developers</a></li>
<li><a href="http://developers.google.com/+/hangouts/running">Running Hangout Apps - Google+ Platform — Google Developers</a></li>
<li><a href="http://developers.google.com/+/hangouts/reference">Hangouts API Reference - Google+ Platform — Google Developers</a></li>
</ul></li></ul>
<p>Gadgetとして作成するようで、Hangouts画面にアプリケーションが埋め込まれる、といった形で実行されます。</p>
<h4>手っ取り早い試し方</h4>
<ol>
<li><a href="https://code.google.com/apis/console/">Google API Console</a>で<strong>Google+ Hangouts API</strong>を<strong>ON</strong>にする<div class="separator" style="clear: both;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghH_jddrbUF7ie-n5UDs-CRld4-158gPPuZfk8cjt-IHyXP5EtP_ZdmyYbGMs8s9hX0siqWV7aurtM85jXQa7Q89ybi2jaw_qu-SlWrnq3Y3oKHnoS1vyFxG_i2UbanrllL8govuOJeq2M/s1600/Screen+Shot+2011-09-21+at+1.33.02+AM.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="154" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghH_jddrbUF7ie-n5UDs-CRld4-158gPPuZfk8cjt-IHyXP5EtP_ZdmyYbGMs8s9hX0siqWV7aurtM85jXQa7Q89ybi2jaw_qu-SlWrnq3Y3oKHnoS1vyFxG_i2UbanrllL8govuOJeq2M/s400/Screen+Shot+2011-09-21+at+1.33.02+AM.png" /></a></div></li>
<li>API Consoleの左側のメニューにある<strong>Hangouts</strong>をクリックすると、<strong>Gadget URL</strong>を入力するテキストボックスが配置されたページが開きます。</li>
<li>本来なら<a href="http://developers.google.com/+/hangouts/writing">Writing Hangout Apps - Google+ Platform — Google Developers</a>を確認してガジェットのコード(XML)を書いて外から見える場所(Google CodeとかApp Engineとか)に配置する必要があるのですが、サンプルがあるので手っ取り早くそれを使いましょう。</li>
<li><strong>https://google-plus-hangout-samples.googlecode.com/hg/samples/yes-no-maybe/ggs/yesnomaybe.xml</strong>を入力し、<strong>save</strong>をクリックします。<div class="separator" style="clear: both; ">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrVwZBuXQGragHu8GcT8pFFH6ojJJpGJlimhuAKeabbuH__VYT7cKfm0udzwwR7rZdkagfMVhWGgeWlNcQnFhVbNtZCSQvyAWTHFEWOnMdF6AEtm-5bNLfGxiq1R-RJDk0cpEZRh782_ZF/s1600/Screen+Shot+2011-09-21+at+2.07.33+AM.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="197" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrVwZBuXQGragHu8GcT8pFFH6ojJJpGJlimhuAKeabbuH__VYT7cKfm0udzwwR7rZdkagfMVhWGgeWlNcQnFhVbNtZCSQvyAWTHFEWOnMdF6AEtm-5bNLfGxiq1R-RJDk0cpEZRh782_ZF/s400/Screen+Shot+2011-09-21+at+2.07.33+AM.png" /></a></div></li>
<li>Gadget URLが正しく読み込まれると、<strong>Enter a hangout!</strong>というリンクが表示されるのでクリックすると、ガジェットが実行されますので入室しましょう。入室すると左下の「Chat」の横に「App」があるので、クリックします。すると、Waveでよく使っていた Yes/No/Maybe のVoteアプリが起動しました!<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbLRBX3UFBXll-gsspqEJMSEwagWi6OBJl9o3VGFO0SZaynoSc4UiyzGpnzv6Ibp132WBGOIs3NHma7cIQ7U_jXF41iHOOAgAen2Dxi2wmKqNkqI8mE0jcnkSGt-5did3V_QJXO0-W69lU/s1600/Screen+Shot+2011-09-21+at+2.10.24+AM.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="370" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbLRBX3UFBXll-gsspqEJMSEwagWi6OBJl9o3VGFO0SZaynoSc4UiyzGpnzv6Ibp132WBGOIs3NHma7cIQ7U_jXF41iHOOAgAen2Dxi2wmKqNkqI8mE0jcnkSGt-5did3V_QJXO0-W69lU/s400/Screen+Shot+2011-09-21+at+2.10.24+AM.png" /></a></div><br/><div class="separator" style="clear: both; ">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgchHLvU0W655Kbx3SQPjXM745MBCW-Npg-V75T599S7OHEtIlxUiFFrpGBWLg815xZOXItr45nGeYNZrip8TGX-DXXW2GF90aCz-KcAutYP4nA3H1H6lpX1WJe_r4LiErc315uZ7ZBLwIr/s1600/Screen+Shot+2011-09-21+at+2.27.22+AM.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="400" width="397" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgchHLvU0W655Kbx3SQPjXM745MBCW-Npg-V75T599S7OHEtIlxUiFFrpGBWLg815xZOXItr45nGeYNZrip8TGX-DXXW2GF90aCz-KcAutYP4nA3H1H6lpX1WJe_r4LiErc315uZ7ZBLwIr/s400/Screen+Shot+2011-09-21+at+2.27.22+AM.png" /></a></div></li>
<li><div style="clear:both;"></div>右上にある「Manage Apps」と書かれたツールバーの「Get My App」ボタンをクリックすると、API Consoleに登録されているプロジェクトからアプリをLoadすることができます。同時に複数のアプリをLoadしたらどーなる?と試して見ましたが、一個しか読み込めないようです。</li>
</ol>
<p>今のところは参加者のアカウント一覧を取得したり、現在のアクティブスピーカー(発言中のアカウント)を取得したり、デバイスの状況(マイクあるの?とか)を取得したり、チャットの領域を表示・非表示するなどの制御ができるようです。Gadgetのコンテナを実装してGadgetでアプリを作るプラットフォームを提供してくるというのは予測済みでしたが、まさかHangouts画面をコンテナにしてくるとは思ってませんでした。あんまり使う気はないけれど、良い意味で裏切られて面白いです。</p>
<p>P.S. Google様、リアルタイムストリームを取得するAPIを心待ちにしているのですが、できればPubsubhubbub経由以外で、デスクトップクライアントから使えるようにお願いします。どーしてもPubsubhubbub経由になるなら、まだ見ぬFeed API V2(<a href="http://www.youtube.com/watch?v=oMXe-xK0BWA">Google I/O 2010で発表されてました</a>ね!まだ待ってます!)と共にリリースしてくださいませんかお願いします。</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-36548585979686666452011-09-16T04:28:00.000+09:002011-09-16T04:33:27.535+09:00とうとう公式のGoogle+ APIが公開された…気がしたがそうでもない<strong><a href="http://googleplusplatform.blogspot.com/2011/09/getting-started-on-google-api.html">Getting Started on the Google+ API - Google+ Platform Blog</a></strong>
<p>この記事のタイトルを見て喜んだ人もたくさんいるんじゃないでしょか?承認はOAuth2だし!<br />しかし残念。まだ<a href="https://code.google.com/apis/explorer/#_s=discovery&_v=v1&_m=apis.list">Discovery API</a>にも対応しておらず、そのためか<a href="https://code.google.com/apis/explorer">API Explorer</a>上でも使えません。Buzz APIでいうscope:publicしか対応しておらず、consumption/comments/likedが使えません。がっかり。Buzz APIでのscopeはcollectionというパラメタに変わるようです。さらに、likedはplusedとなるのかもしれませんね。まぁ細かいことはどうでもいいです。</p>
<ul>
<li>プロフィール情報の取得</li>
<li>アクティビティ(投稿)のリストの取得</li>
<li>アクティビティ(投稿)の取得</li>
</ul>
<p>たったこれだけしかできません。アクティビティのリストも「公開」のもののみ。どれも、これまでだってスクレイプすりゃとっくに取得できてたもんです、がっかり。</p>
<ol>
<li><a href="https://code.google.com/apis/console">API Console</a>でGoogle+ APIをONにする。</li>
<li>API Consoleの左のタブから「API Access」を選択して、「Simple API Access」欄の「API Key」をコピペする。</li>
<li>プロフィール情報の取得であれば <code>https://www.googleapis.com/plus/v1/people/115271879735982073394?key={YOUR_API_KEY}</code></li>
<li>アクティビティ(投稿)のリストの取得であれば <code>https://www.googleapis.com/plus/v1/people/115271879735982073394/activities/public?key={YOUR_API_KEY}</code></li>
<li>アクティビティ(投稿)の取得であれば <code>https://www.googleapis.com/plus/v1/activities/z12aejnbcwekizmi304cgnzbcwq0e5cxnag?key={YOUR_API_KEY}</code></li>
</ol>
<p>上記が使用例です。<code>115271879735982073394</code>ってのは私shin1ogawaのIDです。{YOUR_API_KEY}には、手順中でコピーするもので置き換えてください。</p>
<p>…これくらいしかやることがありません、がっかり…でもG+API担当者の方、重要な第一歩をありがとうございます。お疲れ様でした。</p>
<p>APIに関する公式ページの <a href="http://developers.google.com/+/api">http://developers.google.com/+/api</a> の変更を監視開始しましたので、これからガンガン機能追加されて忙しくなんだと思います。</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGJHicBkH9TmZQUxTySNz5YuMKEJ2nUKD1fBWfcVihc_w28hG0tJAEdYzuTGXsIqrpnjFfLGHm3HYdSQJt9oVlH_NVWxlRX0216ijFv7vbAKrh9fQPU6M4zFjnGPQrqsbwg7u1TiopsqlF/s1600/Screen+Shot+2011-09-16+at+3.30.45+AM.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="391" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGJHicBkH9TmZQUxTySNz5YuMKEJ2nUKD1fBWfcVihc_w28hG0tJAEdYzuTGXsIqrpnjFfLGHm3HYdSQJt9oVlH_NVWxlRX0216ijFv7vbAKrh9fQPU6M4zFjnGPQrqsbwg7u1TiopsqlF/s400/Screen+Shot+2011-09-16+at+3.30.45+AM.png" /></a></div>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-39588567160852146442011-09-10T23:56:00.003+09:002011-09-11T00:31:45.111+09:00Google App Engineの新料金体系に向けた準備 #gaeja<h4>新料金体系について公開されている情報</h4>
<ul>
<li>2011-05-12: <a href="http://googledevjp.blogspot.com/2011/05/google-app-engine-preview.html">Google App Engine - ついに Preview 卒業です - Google Japan Developer Relations Blog</a></li>
<li>2011-07-06: <a href="http://googledevjp.blogspot.com/2011/07/app-engine-faq.html">App Engine の料金体系変更に関する FAQ - Google Japan Developer Relations Blog</a></li>
<li>2011-09-02: <a href="http://blog.shehas.net/2011/09/02/app-engine">App Engine アプリケーションのリソースを管理する方法 - Kay's daddy</a></li>
<li>2011-09-07: <a href="http://blog.shehas.net/2011/09/07/taskqueue-instance">App Engine のリソース管理 - TaskQueue の設定 - Kay's daddy</a></li>
<li>2011-09-09: <a href="http://googleappengine.blogspot.com/2011/09/few-adjustments-to-app-engines-upcoming.html">Google App Engine Blog: A few adjustments to App Engine’s upcoming pricing changes</a></li>
</ul>
<p>これらの情報の中で、特別重要だなーと思うのは以下の点です。</p>
<ul>
<li>CPU時間ではなくインスタンス起動時間で課金されることになる。無料枠は24時間…ではなく28時間(上記最後の記事で出ている話で、まだ28時間無料となった状況での課金結果は確認できてません)。</li>
<li>Datastore操作APIが高くなる</li>
<li>いくつかのAPIは無料になる</li>
<li>管理コンソールの「Billing History」で、新料金に換算した時の価格を確認できる</li>
<li>管理コンソールの「Max Idle Instances」「Min Pending Latency」のふたつの設定を触ることで、無駄なインスタンスをできるだけ立ち上げず、スケールアウトしづらくするようスケジューラの動作を制御できる</li>
<li>リクエストを並行処理する設定にすると、複数リクエストを同時にひとつのインスタンスで扱える(GAE/Javaでは現状でも既に可能、GAE/Pythonは将来のPython2.7から可能)</li>
</ul>
<h4>簡単なチューニング結果の紹介</h4>
<p>以下は私のアプリケーションで、Lingrの特定のroomへの発言に対してbotとして動きつつ、5分に一回Redmineに対してSVNの更新チェックをキックする、といったbot系のアプリケーションの課金額です。チューニングと言っても、プログラムは一切さわらず、管理コンソールから「Max Instances=1、Min Pending Latency=15s」という設定を行うだけで、その設定を行う前後の比較です。</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjozbpbMBO5nD7FoAA3-C_i4UrE4022p2PNdtw1xxhO25sIOUJcbAZEHlRtkO99mIor0yi4an7wzkIyVSH3k1b3ybRmM_OiPrC5Na76REpJFhDhpS2aX2DfqWvLXbryQLcGCQ0XEReG7obz/s1600/Screen+Shot+2011-09-11+at+12.26.52+AM.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjozbpbMBO5nD7FoAA3-C_i4UrE4022p2PNdtw1xxhO25sIOUJcbAZEHlRtkO99mIor0yi4an7wzkIyVSH3k1b3ybRmM_OiPrC5Na76REpJFhDhpS2aX2DfqWvLXbryQLcGCQ0XEReG7obz/s800/Screen+Shot+2011-09-11+at+12.26.52+AM.png" /></a></div>
<h5>設定前後のインスタンス数グラフ</h5>
<p>二日前に何か設定が変わった?という事が明らかにわかるグラフですが、インスタンス数の平均がガクッと減っています。</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAW-Py67w_8cN_HLPoBOPjSJORUeLArwIO31EmtJlLt71q5t8sdFi7UChMJcRvCktbApv7zfY_ONJ5_Rr7rjmeP2fx7EU9NT0wdQHHo234xEXSI0po3dWQN4HiPB7W8uUJCoiAxPy_v8G0/s1600/Screen+Shot+2011-09-10+at+5.35.02+PM.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="143" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAW-Py67w_8cN_HLPoBOPjSJORUeLArwIO31EmtJlLt71q5t8sdFi7UChMJcRvCktbApv7zfY_ONJ5_Rr7rjmeP2fx7EU9NT0wdQHHo234xEXSI0po3dWQN4HiPB7W8uUJCoiAxPy_v8G0/s400/Screen+Shot+2011-09-10+at+5.35.02+PM.png" /></a></div>
<h5>設定前の課金額</h5>
<p>左が現行の料金体系で、余裕で無料に収まっています。右が新料金体系で、インスタンス時間が103時間を超えていて、$3.3/日となり、月7000-8000円程度になるようです。こういうアプリをたくさん運営している場合は、ちょっと個人にはツライ金額です。</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw32K-k6uG_CGGOHpTP59zeSlgMXnUqAtLGAaV0GDnlAzDfFXR9apkcJFRBvopxL1nzGBwIWV9xCd6kufnnot36ff1fDu5Ndl92zVDQxebPElHOGyD5h5r7KfzU4MdMv9H8E0QIH1kHVkf/s1600/lingrbot_before.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw32K-k6uG_CGGOHpTP59zeSlgMXnUqAtLGAaV0GDnlAzDfFXR9apkcJFRBvopxL1nzGBwIWV9xCd6kufnnot36ff1fDu5Ndl92zVDQxebPElHOGyD5h5r7KfzU4MdMv9H8E0QIH1kHVkf/s800/lingrbot_before.png" /></a></div>
<h5>設定後の課金額</h5>
<p>先のスクリーンショットと同じく、左が現行の料金体系で、余裕で無料に収まっています。右が新料金体系ですがインスタンス時間が27時間程度に収まっていて、$0.3/日となり、月700-800円程度にまでおさえれそうです。さらに、これはインスタンス時間の無料枠を24時間とした時の金額なので、実際には28時間無料で計算すると月400円程度になります(優良枠で利用する場合は実際には最低$9なので、それより下にしても変わらない)。さらに、このアプリはMemcacheを全く使っていなかったり設計も適当な手抜きアプリなので、少しチューニングすればデータストア操作も無料枠に収まり、結局無料枠で稼働できると思われます。</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrTIwh6M611KO2_lfbWRVYVNJpPc-kJ7lLiNL2DFrqusFUjhWXYhsFubRauYDw1009OmhPwICpkgZxGlZfkoowAUZ6QlqyeirrFguP-m544bjr5iDmaSk14NiiYPd0vHm5zgAnAyYU5C7B/s1600/lingrbot_after.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrTIwh6M611KO2_lfbWRVYVNJpPc-kJ7lLiNL2DFrqusFUjhWXYhsFubRauYDw1009OmhPwICpkgZxGlZfkoowAUZ6QlqyeirrFguP-m544bjr5iDmaSk14NiiYPd0vHm5zgAnAyYU5C7B/s800/lingrbot_after.png" /></a></div>
<h4>それでもまだ無料枠に収まらない</h4>
<p>シンプルなアプリなんだけど、無料枠が28時間でもギリギリ超えてしまうよ…といった、「無料に抑える」が目的の時に、一部の処理を「Backends」の9時間の無料枠に振ってしまおう、というのが「<a href="http://blog.shehas.net/2011/09/07/taskqueue-instance">App Engine のリソース管理 - TaskQueue の設定 - Kay's daddy</a>」の記事に書かれているチューニング方法です。課金額を抑える目的でないとしても、Task QueueをBackendsで処理させるという手法は重要ですので、Backendsという機能を知らなかった方は見ておくと良いです。</p>
<p>大規模なアプリなので無料枠を目指すわけではないがもっと安くry、といった場合は……主にDatastore操作が高くなると思いますが、そのあたりのチューニングを進めるしかありません。Queryの実行に対して、QueryによるKeyのみのフェッチは価格が1/7、という点に注目すると面白いかもしれませんね。</p><p>とはいえ、いきなり設計を変えるわけにも行かないし、これまでは正式版じゃなかったから仕方ない…と簡単に諦められるもんではありません。ボリュームディスカウントの導入とか、もう少しくらい値下げが無いものか?とか色々期待しましょう。提案等がある方は<a href="http://twitter.com/#!/tmatsuo/status/111337158249414656">中の人に直接メール</a>をしてみると良いと思います。</p>
<h4>新料金体系の導入についての感想</h4>
<p>これまでは、Google App Engineというと、「価格」「(自動スケールアウトも含めて)運用の手間が無い」のふたつの特徴が大きく言われていました。これが、「価格」については魅力ががつーんと低くなりますね。でも共有地の悲劇みたいな事がずっと起こってパフォーマンスが出にくい時期もありました(あっと言う間にSpin downしちゃう→毎分Cronで叩き続けてちょっとでも確保しよう→余計にSpinDownしやすくなるとか)し、負荷をかけるばかりのアプリケーションをある程度追い出すという結果になるなら、丁度良いバランスの設定かも?と思います。特に現在のGoogle App Engineのデフォルトの設定では「パフォーマンス優先」となっていて、適切に設定を行わない限りはシンプルなTwitterbotアプリでも簡単に「毎月一万円」くらいに達してしまうので、設定や開発で工夫をしようとしない人は利用をやめることになるのでしょう。</p>
<p>私はというと、OSやらミドルウェアのインストール・設定・パッチ適用などのメンテナンス…といった「運用の手間」に関しては完全に排除したい(そもそも知識も興味も無い)人なので、値上げがあってもGoogle App Engine以外の選択肢は今のとこあまり考えていません。上述しませんでしたが、Google App Engineが提供するテスタビリティが高い開発環境、優秀なApp Engine専用フレームワークの存在、といった状況もアプリケーションの設計実装に集中したい私には重要です。そんなワケで新料金体系については「値上げか仕方ないなー、でもお金取るんだからこれまでよりももっとしっかり運用、情報公開して欲しいですね」という感想です。確実に利用者は減るでしょうから、その点だけは「寂しいな」と思いますけどね。</p><p>また、ポータビリティが極端に低いGoogle App Engineで今回のような事件が起こることで、今後のPaaSの選定基準でのポータビリティの重要度が増したりするのかな?といった点も興味深いです。</p>
<h4>追記</h4>
<p>一定の時間間隔でURLFetchして単純な処理を…といった程度であれば、Google App Engineではなくて<a href="http://code.google.com/googleapps/appsscript/guide.html">Google Apps Script</a>でも可能ですよ。</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-41507251515367295672011-07-18T23:13:00.001+09:002011-07-18T23:14:09.922+09:00Twitter API ポケットリファレンスが発売開始されてますー<a href="http://twitter4j.org/">Twitter4J</a>で有名な<a href="http://twitter.com/yusukey">@yusukey</a>さんによる<a href="http://www.amazon.co.jp/gp/product/477414732X/ref=as_li_ss_tl?ie=UTF8&tag=shin1o-22&linkCode=as2&camp=247&creative=7399&creativeASIN=477414732X">Twitter API ポケットリファレンス (POCKET REFERENCE)</a><img alt="" border="0" height="1" src="http://www.assoc-amazon.jp/e/ir?t=&l=as2&o=9&a=477414732X" style="border: none !important; margin: 0px !important;" width="1" />が発売されています。<br />
<div><iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=FFFFFF&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=shin1o-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=477414732X" style="height: 240px; width: 120px;"></iframe></div>Amazonで予約した分は16日に発送されてる割にまだ届いていないのですが、著者の @yusukeyさんに献本していただき早めに手に入れることができて助かりました。ありがとうございます〜!<br />
<h4>感想</h4>まず目次が長い。11ページもあります。が、この目次がよいガイドになってくれており使いやすいです。<br />
比較的新しめの内容も取り込まれており、さすがといったカンジです。<br />
付録の「アプリケーション開発のコツ」がうまいノウハウ集みたいになっていて、既にTwitter APIを駆使している人にも役に立ちそうに思います。自分はgzipとかすっかり見落としていました。<br />
<h4>Twitter初心者のかたは…</h4>素直に前から順に読み進めていくとよさそうに思います。<br />
<h4>Twitter API初心者の方は…</h4>まずは目次にひととおり目を通して、どんな種類のAPIが提供されていて、それぞれどんな情報にアクセスするのか?をまず確認し、その後認証関連(2章)を理解し、必要なAPIをかいつまんで触っていくのが良いと思いました。で、付録の「アプリケーション開発のコツ」を読んで、お約束というかノウハウを頭に入れるようにすると良さげです。<br />
<h4>Twitter API慣れしている人は…</h4>やはり目次に目を通し、知らない機能・見落としていた機能が無いか確認すると良いと思います。また付録の「アプリケーション開発のコツ」を読んで、間違った・効率が悪い使い方をしていないのかを確認できそうです。また265ページの「再接続アルゴリズムのフローチャート」は、正しくストリーム処理を行うためにとても参考になると思います。ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-57707605173235056912011-06-30T10:34:00.004+09:002011-06-30T12:18:29.559+09:00Google Plus を使った感想をまとめてみた<p>昨日一日感想をメモしながら使っていたのでそれらのまとめ。</p><p>まず最初に大雑把な感想を書くと、<strong>Buzzをわかりやすく使いやすくして、Google Alert, Latitude(Places API ?)のチェックイン、+1, Picasa, Profiles, Google Talk+ビデオチャット等の各種Google Serviceを(かなりわかりやすく)統合したダッシュボード</strong>といった印象を受けました。</p>
<h4>メモ</h4>
<ul>
<li>投稿に関しては基本的にBuzzと同じ</li>
<li>ただしBuzzにある外部サイトからのFeed取り込み機能はまだない</li>
<li>APIもない</li>
<li>公開範囲を制限するサークルに関してもBuzzと同じだけど、Buzzの頃のわかりにくさが消え去った</li>
<li>サークルはあくまでも自分から見た共有範囲であって、他人と公開範囲を共有できるFacebookのグループとはちょっと違う</li>
<li>Sparksは今のところGoogle Alertに見える。</li>
<li>最初からマルチアカウント対応している</li>
<li><strike>キーバインドが無いっぽいので、操作性はイマイチ。</strike>jkで上下移動します。投稿時のバインドだけは早めに用意してい欲しいです。</li>
<li>ビデオチャットの「YouTubeを皆で見る」機能は面白い!ただし、そこでのチャットの内容はどこに保存されたかわかんない。GmailのChatのトコにも無かった。なんでもかんでも保存しそうなGoogle様なのにこれはちょっと謎。</li>
<li>Google FeedbackというFeedback機能が埋め込まれている。ただしPreviewした後に編集し直したいと思ってCancelすると、書きかけのFeedbackが葬り去られるので注意。まず最初にその件をFeedbackしておきましたw</li>
</ul>
<h4>期待</h4>
<ul>
<li>まずはAPI。しかも早く。APIの提供が遅いと専用クライアントも出てこず、Buzzの時みたいに普及を妨げる要因になると思う。</li>
<li>リアルタイム通知を受け取るためのAPI。BuzzのころはPubsubhubbubのSubscriberとして登録する必要があり、サーバサイドのWebアプリでしか使えなかった。これをデスクトップクライアントでも通知を受けられるようにしてほしい。もしくはPubsubhubbub+Feed API V2. しかしFeed API V2はどこにいっちゃったの。この機会にリリースして欲しいです。</li>
<li>Plusを使うためにProfilesサービスが必須。しかしGoogle AppsではProfilesサービスが使えないからどうしようもなく詰んでしまう。せっかく颯爽とマルチアカウント対応しつつ登場したのにApps全滅とか無いわー。</li>
<li>Google Appsで使えるようになったら、DocsやらCalendarやら、ドメイン内のアクティビティを自動的にPostされて欲しい。そうすることで社内のアクティビティが少しでも多く可視化されて良いのでは。ただし、大きい企業だとドメイン内の共有サークルみたいなのが必要になるんでしょうね。Google Groupsをサークルとして使用する…みたいなカンジで管理者が設定できるとなんとか使えるかも。</li>
<li>buzzの頃の名残なのか、Gmailのユニバーサルナビゲーションから投稿できて、通知数も表示される。しかし、これは逆というかplus内にGmailのタブを用意したほうがいいような。それか、全てのサービスのユニバーサルナビゲーションに投稿と通知の領域を用意するか。</li>
<li>buzzの頃にもたくさん議論されたトピックだった気もするけど、Friendfeed形式に「最近コメントが追加されたら即効で上に上がってくる」という動作を期待しちゃいます</li>
<li>Sparksというか、特定のトピックについて…に関しては <a href="http://www.google.com/whatdoyoulove/">whatdoyoulove</a> みたいな見方もできるといいなー</li>
</ul>
<h4>追記: Tips</h4>
<ul>
<li>ストリームを見る際にjkキーバインドがある</li>
<li>右上の赤い四角い通知アイコンをクリックするとお知らせが表示される。そこはカーソルキーの左右でお知らせを行き来できる。</li>
<li><strong>@</strong>とか<strong>+</strong>で特定の人に対する返信になる。通知の種類に影響する。</li>
<li>通知メールが鬱陶しい場合は、右上の設定で制御してもよいし、Gmailの設定で「from:@plus.google.com」でフィルタすると良い。</li>
</ul>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-51856997947972798272011-06-24T00:01:00.002+09:002011-06-24T00:38:13.479+09:00第一回 GTUG Girls meetup が開催されました #gtuggirls<p>先日<a href="http://googledevjp.blogspot.com/2011/06/gtug-girls-meetup.html">GTUG Girls 設立のニュース</a>が<a href="http://googledevjp.blogspot.com/">Developer Relations Japan Blog</a>からアナウンスされました。今日はその第一回meetupということで<a href="http://code.google.com/googleapps/appsscript/">Google Apps Script(略してGAS)</a>のハンズオンが実施され、私はチューターとして参加しました。</p>
<p>実施する前は、Google Apps Scriptという題材がマイナーすぎだし、GTUG系のイベントは応募者のスキルレベルがまったく想定できないという点でもサポートの人員不足が心配でした。</p><p>しかし実際にはJavaScriptの経験者の方には大して難しくなかったようで、いい具合に「近くに座っている参加者同士でサポートしあう」という、最高の形ができあがって進んでいたようです。ホッとしました。<br />個人的には女子オンリーのハンズオンは二回目の参加になるのですが、今回も以前の女子ハッカソンの時と同様「みんな真剣で、わからないことがあっても協力しあって着実にこなしていく」というスタイルは男子のそれよりも強い、という風に感じました。</p>
<p>イベントは「GTUG Girls設立についてのアナウンス」「サンドウイッチ等の軽食でアイスブレイク(GTUG Girlsロゴ入りのTシャツが配られましたよ〜)」「GASについて紹介・デモ」「ハンズオン」、そして最後にGTUGGirlsのこれからの展望について説明、その他いくつかアナウンス、といった構成でした。何気にa2cさん〜fumiさんの話を聞く余裕があんまりなかったので、自分で<a href="http://togetter.com/li/153341">とぅぎゃって後から追いかけ</a>てたりしました。</p>
<h4>資料類</h4>
<ul>
<li><a href="http://dl.dropbox.com/u/71789/gas_study_vol3/gas_gtug_girl_a2c.html">a2cさんのセッション資料</a></li>
<li><a href="https://spreadsheets.google.com/spreadsheet/ccc?key=0At5K5_buI_bsdFJOcGZadXpQZE5SWWwwUkJjNUxEd1E&hl=en_US#gid=0">a2cさんのハンズオン資料 →これはファイル名通り、コピーして使用してください。</a></li>
<li><a href="https://docs.google.com/present/edit?id=0AWexfmJ2W9X-ZGZnN3JrcDZfMjQ4aHN2cHR6Z2c&hl=en_US">ハンズオンが簡単すぎてつまらない人向けの課題</a></li>
<li><a href="https://spreadsheets0.google.com/spreadsheet/ccc?hl=en_US&key=t9asiFqRsR-FHlWJyNvC1zA&hl=en_US#gid=0">上記の課題の答えが書かれたシート</a> →コピーしてScript Editorを開くと、課題のStepごとにスクリプトファイルを見られます</li>
</ul>
<h4>情報交換の場</h4>
<p>GASのデモや、ハンズオンの後でアナウンスされたものです。</p>
<ul><li><a href="http://lingr.com/room/GAS_ja">Google Apps Script Japan – Lingr</a>: 講師のa2cさん、shin1ogawa, 他にもGASに詳しい人達が集まっているLingr roomです。</li><li>本日公開された <a href="https://groups.google.com/forum/#!forum/google-apps-api-japan">Google Apps API Japan Group</a>: Google Apps Scriptや、Google Apps APIについて情報交換をするMLです(女子限定ではありませんよー)</li></ul>
<h4>感謝</h4><p>会場と準備作業をしてくださった<a href="http://mixi.co.jp/">株式会社ミクシィ</a>様&スタッフの皆様、GTUG Girlsスタッフの皆様、<a href="http://twitter.com/fumi">@fumi</a>さん、<a href="http://twitter.com/tmatsuo">@tmatsuo</a>さん、講師の<a href="http://twitter.com/atusi">@atusi</a>さん、参加者の皆さん、ありがとうございました〜</p><p>あと「今後GTUG Girlsで何やりたい?」にGoogle App Engineと答えてくれた方々にも感謝! :)</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-18011446258039238472011-05-28T22:46:00.002+09:002011-05-28T22:49:42.662+09:00#appengine ja night 16( #ajn16 )が開催されました<p>5/27(金)にappengine ja night #16が開催されました。今回はajn史上最高の女性比率を記録するほど、たくさんの女性に来ていただけまして大変よい雰囲気の中で実施されました。過去の最高記録比400%くらい達成した気がするので、この勢いでいけば次々回あたりには参加者が全員女性という可能性も見えてきました。<br />今回参加された女性陣の方々で、ちょっとでもappengineやサーバサイドの世界、またはコミュニティそのものに興味が!、とかなんでもいいんで興味を持っていただけた方&楽しんでいただけた方は、是非次回以降も継続しての参加をお願いいたしします。</p><p>いつものように<a href="http://twitter.com/drillbits">@drillbitsさん</a>が<a href="http://togetter.com/li/141149">togetterにまとめ</a>てくれています、ありがとうございます。</p><p>@kazunori_279さんがいつものようにUstream配信して下さり、<a href="http://www.ustream.tv/user/kazunori_279/videos">録画もあります</a>。</p>
<h4>@yanzmさん: GWT+UIBuinderのお話</h4><p>ajn史上二人目の女性発表者です。今回は集まり具合が半端ない(いつもは開始時間では半分ちょっとくらいなのに今回は開始時間で相当埋まった)状況だったのですが、あんざいさんのおかげなのでしょうね。<br />個人的には GWT は大昔に一度調査したきりでそれ以降使っていませんが、最近の情報を(自分で調査すること無く)知ることができるならこれは美味しい機会だという雰囲気で勉強させてもらいました。またレイアウトに関しても、実はSwing等のリッチクライアントでも「コードから構築したほうが速い(IDEのサポートが必要)・はまらない・テスタビリティが高い」という方針で、通常はレイアウタやテンプレートは使わなかったりします。がしかし、それだとレイアウタやテンプレートの機能について勉強しなくなっちゃうので、やはり自分で調査すること無く知ることができたのは良い勉強になりました。気にしているものの触らない…が気にしている、みたいな状況のプロダクトについての説明を経験者から聞けるのはホント助かりますね。</p>
<h4><a href="http://twitter.com/tmatsuo">@tmatsuo</a>さん、<a href="http://twitter.com/IanMLewis">@IanMLewis</a>さん、@shin1ogawa: Google I/O 報告</h4><p>@tmatsuoさんには無理言って、前日開催されたGTUG東京のI/O報告会と同じ <a href="http://goo.gl/411bH">Building Enterprise Applications on App Engine</a> を話してもらいました。個人的にすごい気に入っていて、時間を使って話してもらいたかったからです(GTUG東京の報告会では3分縛りがあったw)。課金体系の変更には賛否両論(主に「否」かもw)たくさんありますが、Google様の事だからうまいバランスで調整してくるだろうなーと思ってあまり心配していません。他に印象に残ったのは、例のRoyal Weddingのサイト、32,000req/sと大規模だったのに「特にそれに向けて何か準備とか調整したわけではない」という事です。我々と同じ条件でそのスケーラビリティを発揮したのですね、素晴らしい。なんでI/OのregistrationでEC2ではなくAppEngineを使わなかったんry</p><p>私の資料は <a href="http://goo.gl/DGZMJ">http://goo.gl/DGZMJ</a> に置いてあります。</p><p>@IanMLewis さんの <a href="http://goo.gl/RXscj">Go on App Engine</a> は、Go利用者が少ない中での発表となりましたが、個人的にはGo on AppEngineの雰囲気を伝えるためにも必須だったと思います。RPCについて他の言語とそんなに大きく違うわけではなく、敷居が高いものではないよと伝わったんじゃないかと思います。IDEのサポートがまだ弱い(IntelliJ, Eclipseしか見てませんが)上に、Pythonのように簡潔には書けない…ように見えるのが残念ですが。I/Oのどのセッションだったか忘れましたが、将来の話として「BackendsにJava, Pythonのマルチスレッドサポート云々」というような話がちょろっあったんですね。自分としてはそれを「ついでにGo Runtimeも乗ってくるんだろなーそれならBackendsでは、GoRoutineで簡潔に書ける&高速に実行出来るGoで書くことになるだろな(Googleはそう考えてるだろな)」と考えていたので、Go on AppEngineは重要な事だと思ってます。ひがさんがヤケに「Goいらんだろ」とおっしゃてましたが、それはFrontEnd(経由のAppServer上)の話だと思います。たしかにそっちでGoは必要なさそうですね。</p>
<h4>BeerTalk: Backends他</h4><p>このあたりは1.5.0プレスリリースで知られていたことだし、前回のajnでも話題に上がった話なのでサラッと流させてもらいました。ただ、<a href="http://twitter.com/#!/drillbits/status/74103582974160898">@drillbitsさんは女子と話していて聞いてくれていなかった</a>そうです、ヒドイ。</p>
<h4>BeerTalk: @bluerabbit77jp さん: Frontend cache control</h4><p><a href="http://www.slideshare.net/bluerabbit777jp/appengine-ja-night-16-bt-frontend-cache-control">資料</a>も上がっていますが、これはI/Oのセッション Scaling App Engine Applications で Guido が話していたプラクティスとして紹介されていました。@bluerabbit777jpさんは17,000円程度のcpu使用量が0円になったそうです。ただしこの機能はBilling Onじゃないと使えないから注意!という説明もありました。<br />ついでに書いておくと、話が終わった後に、とあるGooglerの方がわざわざ前に来て「あ、ちょっとこれには注意が必要なんです。billing onじゃないとry」とか言い出したりしていたので、この人もやはり女子と話していてBeerTalkをちっとも聞いていなかったようです、ヒドイっすな。</p>
<h4>BeeeTalk: @knj77 さん: Zusaarの紹介</h4><p><a href="http://www.zusaar.com/">参加費の決済もできるイベント開催支援サービス「Zusaar」</a></p><p>すいません、女子と話していて聞いていませんでした。</p>
<h4>BeerTalk: @kissrobberさん: クラウド時代の新しいソートアルゴリズムTask Queue Sort</h4><p><a href="http://d.hatena.ne.jp/kissrobber/20110527/1306508583">資料</a>も上がっています。例のsleep sortをクラウド時代に…という話でコレは相当おもしろかった。こういうのは毎回一つ欲しいですね。</p>
<h4>感謝</h4><p>今回も会場を提供してくださった<a href="http://www.nifty.com/">ニフティ株式会社様</a>、会場での準備・案内・片付けなどをしてくださった<a href="http://twitter.com/#!/nifty_engineer">スタッフの皆様</a>、大変ありがとうございました。告知に失敗したところをフォローしてくれた @tagomorisさん、大変ん助かりました。またいつもUst, ピザ&ビールの面倒を見てくださる@kazunori_279さんありがとうございます&次回もよろしくお願いいたします。<br />そして盛り上げてくださった参加者の皆様方、スピーカーの皆様方、大変ありがとうございました〜</p>
<h4>その他</h4><p>I/O終了からこの2週間、会社の仕事、ajnの他でもI/O報告系のイベント、I/Oで見ていないセッションを消化、等々で忙しかったです。特に見ていないセッションの消化に関しては、英語力がかわいそうなかんじの自分は動画の消化も実時間の3倍くらいかかってしまい、相当時間を消費してしまいました。そのあたりについて関連リンクを貼っておきます。</p><ul><li><a href="http://togetter.com/li/137754">Togetter - 「Google Apps Script勉強会#3 #gasja」</a></li><li><a href="http://togetter.com/li/138471">Togetter - 「Google I/O 2011 報告会 in 東京」</a></li><li><a href="http://togetter.com/li/140587">Togetter - 「東京 GTUG 主催 Google I/O 報告会」</a></li><li><a href="https://sites.google.com/site/shin1ogawa/io2011">io2011 セッション(一部)へのリンク集 - aqubi+shin1</a></li></ul>
<h4>次回</h4><p>7/2(土)に開催されるかもしれません…?なぜ土曜日なのか、は想像しておいてください。詳細が決まれば、<a href="http://www.zusaar.com/">参加費の決済もできるイベント開催支援サービス「Zusaar」</a>で告知される予定です。</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-40816608960445867972011-05-16T15:56:00.004+09:002011-05-28T21:22:10.122+09:00Google I/Oの #appengine 関連セッション動画一覧 #gaeja<p>5/10, 5/11に開催されたGoogle I/Oに初参加してきました。Google App Engineについては1.5.0のプレスリリースが事前にあったり、それを含んだappengine ja night 15が開催されたりしていたためインパクトは小さかったですが、golang他いくつかビックリの話も出ていました。個人的にはGoogle Appsの方がアツかったなー、という印象です。現地では、I/Oに生で参加できたという点よりも、超絶優秀なGoogle API Expert達と一緒に参加・行動できた、というオプションが一番すごい事だったかもw API Expertのみなさんお世話になりました。部屋をシェアしてた <a href="http://twitter.com/IanMLewis">@IanMLewis</a> と <a href="http://twitter.com/atusi">@atusi</a> さんは特にありがとうございました。</p><p>帰ってきてからは情報を整理したり、手を動かして試したいものは試したり、色々と作業がてんこもりで大変です。で、見ていないセッションはもちろん、参加したセッションも動画で復習したり…といった時に便利なように、App Engineの全セッションとそれ以外の一部のセッションの動画を一覧にしました。I/Oの公式サイトの各セッションの詳細ページだと、動画へのリンクが無いものもあったりして不便なため、動画へ直接リンクをはっています。</p>
<h4>Google App Engineセッション一覧</h4>
<ul>
<li><a href="http://www.youtube.com/watch?v=OsO_UrT8ELI">Storing Your Application's Data in the Google Cloud</a></li>
<li><a href="http://www.youtube.com/watch?v=rP-kjrx9CRE">Scaling App Engine Applications</a></li>
<li><a href="http://www.youtube.com/watch?v=-kepYfCBg6w">App Engine Backends</a></li>
<li><a href="http://www.youtube.com/watch?v=AM0ZPO7-lcE">Putting Task Queues to Work</a></li>
<li><a href="http://www.youtube.com/watch?v=4Dwf3rtucXY">Building Enterprise Applications on App Engine</a></li>
<li><a href="http://www.youtube.com/watch?v=7B7FyU9wW8Y">Full Text Search</a></li>
<li><a href="http://www.youtube.com/watch?v=xO015C3R6dw">More 9s Please: Under The Covers of the High Replication Datastore</a></li>
<li><a href="http://www.youtube.com/watch?v=wWhd9ZwvCyw">Coding For The Cloud: How We Write Enterprise Apps for Google on App Engine</a></li>
<li><a href="http://www.youtube.com/watch?v=EIxelKcyCC0">Google App Engine MapReduce</a></li>
<li><a href="http://www.youtube.com/watch?v=_nN-G4018b0">Fireside Chat</a></li>
<li><a href="http://www.youtube.com/watch?v=FJDP_0Mrb-w">Smart App Design</a></li>
<li><a href="http://www.youtube.com/watch?v=rgQm1KEIIuc">Life in App Engine Production</a></li>
<li><a href="http://www.youtube.com/watch?v=Rsfy_TYA2ZY">Large-scale Data Analysis Using the App Engine Pipeline API</a></li>
<li><a href="http://www.youtube.com/watch?v=1oCeLaCjfO0">Querying Freebase: Get More From MQL</a></li>
</ul>
<h4>その他 shin1ogawaが気になったセッション</h4>
<p>参加できてないし、まだ観ていないものもありますが。Google Apps Scriptはアツイ事になりましたね、商売あがったりですね!Appsはここのあげたもの以外にもありますが、Appsでメシを食っている人は最低限ここに上げたものはチェックしておいた方が良いです。</p><p>Androidは社内の若い衆に任せてますし、GWTは触らないので含んでません。サーバ側ばっかりです。</p>
<ul>
<li>Google Apps: <a href="http://www.youtube.com/watch?v=DOih39gu0xw">Developing Apps, Add Ins and More with Apps Script</a></li>
<li>Google Apps: <a href="http://www.youtube.com/watch?v=Sp8fotnTwj8">Using The Google Docs APIs To Store All Your Information In The Cloud</a></li>
<li>Google Apps: <a href="http://www.youtube.com/watch?v=96URE_-aj-8">Enterprise Workflow with Apps Script</a></li>
<li>Google APIs: <a href="http://www.youtube.com/watch?v=xlGdXDthL2w">Google Tasks API</a></li>
<li>Developer Tools: <a href="http://www.youtube.com/watch?v=-i0hat7pdpk">Writing Web Apps in Go</a></li>
<li>Developer Tools: <a href="http://www.youtube.com/watch?v=V0vOVWA9yJs">Bring the Cloud to Your IDE with the Google Plugin for Eclipse</a></li>
</ul>
<h4>2011-05-19 追記</h4>
<p>Google API Expertの @IanMLewis さんが1.5.0リリースについてのエントリを作成されました。</p>
<ul><li><a href="http://www.ianlewis.org/jp/appengine-150">Appengine 1.5.0 がリリースされました - Ian Lewis</a></li></ul>
<h4>2011-05-28 追記</h4>
<p>一部のセッションでSlideやNotesが公開され始めたので、それらも含めた一覧にしました。I/O報告会などでさらに興味を持ったセッションが増えてたりしますが:)</p><ul><li><a href="https://sites.google.com/site/shin1ogawa/io2011">https://sites.google.com/site/shin1ogawa/io2011</a></li></ul>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-42186254138500073782011-05-07T15:58:00.001+09:002011-05-07T15:58:57.541+09:00#appengine ja night #15( #ajn15 )が開催されました<p>5/6(金)にappengine ja night #15が開催されました。人数は数えてませんが今回も女性参加者率が悲しい結果になり、むさい空気の中開催されました。</p><p>今回も<a href="http://twitter.com/drillbits">@drillbits</a>さんが<a href="http://togetter.com/li/132455">togetterにまとめて</a>くれています、ありがとうございます。</p>
<h4>AppEngine テスト駆動開発</h4><div><ul><li><a href="http://twitter.com/IanMLewis">@IanMLewis</a>さん</li><li><a href="http://www.ustream.tv/recorded/14515460">Ust録画</a></li></ul></div><p>AppEngine/Pythonでの自動テスト事情の説明でした。まだ全然触っていないけど個人的には1.4.3からPython SDKに導入されたTestbedについておおよそ仕組みがわかってよかったです。Testbedはsetup等で細かく制御できそうなのはメリットでもありデメリットであるかもしれませんね。<br />
でも、結局はアプリ用のF/Wと一緒になっている方が良いので、<a href="http://twitter.com/tagomoris">@tagomoris</a>さんが作ったF/Wをベースにしたテスト支援機能を持つ<a href="http://code.google.com/p/kay-framework/">Kay-framework</a>がヨサゲなんだろな、と。</p>
<h4>Gig in a Nutshell</h4><div><ul><li><a href="http://twitter.com/eiichirouchiumi">@eiichirouchiumi</a>さん</li><li><a href="http://www.ustream.tv/recorded/14516041">Ust録画</a></li><li><a href="http://prezi.com/x_sgifacsm0j/gig-in-a-nutshell/">発表資料(Prezi)</a></li></ul></div><p>個人的にずっと興味を持って見ていたAcid Houseの流れでGigも興味を持って見ていて(特にScaffoldの部分)、登壇をお願いしました。PetStoreへのチャレンジに関するエントリもリアルタイムに追っかけていましたよ!会場の反応で面白かったのは、Gigのプロダクトへの反応よりも「いちいち命名がかっこよすぎる(アノテーション名までかっこよい)」「ひとりで作ってるのかすげぇ!」の方が盛り上がっていた気がします。</p>
<h4>appengineでクーポンサイトを作った話</h4><div><ul><li><a href="http://twitter.com/najeira">@najeira</a>さん</li><li><a href="http://www.ustream.tv/recorded/14517367">Ust録画</a></li></ul></div><p><a href="http://labola.jp/">スポーツSNSのLaBOLA(ラボーラ)</a>に実装されたクーポン系の機能の紹介。ですが「資料がnajeiraさんらしく無い!」という話で盛り上がりました。<br />個人的に「あーなるほど」と思ったのは、チケットの予約に関しては「厳密にはチケット数を超えて予約できてしまう可能性もある」という話で、それはPaypalの方では一旦決済を保留しておき、最終的に決済を確定するしないを決めればいい、的な話でした。なるほど。</p><p>ちなみにこのエントリを書いている途中で<a href="http://labola.jp/coupon">クーポンサイト</a>を見に行ったら「<a href="http://www.ath-biz.jp/kaatsu/index.html">加圧トレーニング</a>」のクーポンがあったので<a href="http://twitter.com/aqubi">嫁</a>に紹介しておきました。</p>
<h4>Google App Engine 1.4.3 で追加や変更された機能を紹介</h4><div><ul><li><a href="http://twitter.com/tmatsuo">某Googler</a>、<a href="http://twitter.com/shin1ogawa">@shin1ogawa</a></li><li><a href="http://www.ustream.tv/recorded/14518060">Ust録画</a></li></ul></div>
<div id="waveframe" style="width: 500px; height: 400px"></div>
<script type="text/javascript"
src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("wave", "1");
google.setOnLoadCallback(initialize);
function initialize() {
var waveframe = document.getElementById("waveframe");
var embedOptions = {
target: waveframe,
header: false,
toolbar: false,
footer: false
};
var wavePanel = new google.wave.WavePanel(embedOptions);
wavePanel.loadWave("googlewave.com!w+jrvtRhsEA");
}
</script><p>1.4.3で追加された機能を15分程で説明する予定でしたが、開催前々日くらいに1.5.0のプレスリリースがあったため、急遽そちらの内容も含めることにしました。appengine ja night開催日付近にsdkのリリースをぶつけてきて慌てさせるGoogle様の手法は相変わらずですね。というか、1.5.0の方が面白そうな機能が多そうなのでそっちがメインになってしまっています。</p><p>オフレコでのトークも含まれるため、Ustでは音声が切れている箇所もあると思われます。そこは想像で補完してください。また、うっかりしてWaveを公開状態にしていなかったようです、すいませんでした。</p>
<h4>他</h4><p><a href="http://twitter.com/soundTricker318">@soundTricker318</a>さんがslim3-gwt用のmaven-archetype-pluginを作っている事を教えてもらいました(気づいてませんでしたすいません)。maven+appengine+GWTあたりの調査・試行錯誤はGWT弱者な私ではあれこれめげてしまう事が多かったので大変ありがたいことです。</p><p>今回も、TL上では面識があるものの一度も挨拶出来ていない方とご挨拶できました。ありがとうございました。</p><p>najeiraさんの資料は<a href="http://www.comipo.com/">コミポ</a>というサービスを使ったらしい。</p><p>kazunori_279さんの<a href="http://lockerz.com/s/99208891">MBPの背中のシール</a>は<a href="http://www.gelaskins.com/">GelaSkins</a>というサービスで作れるらしい。</p>
<h4>感謝</h4><p>今回も会場を提供してくださった<a href="http://www.nifty.com/">ニフティ株式会社様</a>、会場での案内などをしてくださった<a href="http://twitter.com/#!/nifty_engineer">スタッフの皆様</a>、大変ありがとうございました。またいつもUst, ピザ&ビールの面倒を見てくださる<a href="http://twitter.com/kazunori_279">@kazunori_279</a>さんありがとうございます&次回もよろしくお願いいたします。盛り上げてくださった参加者の皆様、スピーカーの皆様も大変ありがとうございました!</p>
<h4>次回予告</h4><p>次回はappengine ja night #16ですが、5/27(金)19:00から、今回と同様<a href="http://www.nifty.com/">ニフティ株式会社様</a>の会場をお借りして開催いたします。既に決まっているコンテンツは以下のとおりです。</p><ul><li><a href="http://twitter.com/yanzm">あんざいゆき</a>さん: <a href="http://yanzm-test.appspot.com/">Favapp</a>紹介/GWTのUiBinderとか</li><li><a href="http://twitter.com/tmatsuo">某Googler</a>, <a href="http://twitter.com/IanMLewis">@IanMLewis</a>さん, <a href="http://twitter.com/shin1ogawa">@shin1ogawa</a>: Google I/O報告</li><li><a href="http://twitter.com/bluerabbit777jp">@bluerabbit777jp</a>さん: FrontEndのキャッシュ機能を利用する方法、使ってみた結果について説明します。</li></ul><p>appengine ja night二人目の女性スピーカーの登壇となります。Android女子部の方々も是非参加してみませんか?AppEngineを簡単に使うためのjsonengineというプロダクトを作っているメンバも参加しますので、その場で質問や要望をぶっつけたりする事もできますよ。<br />そんなカンジで是非ともたくさんの女性の方にも参加していただきたいです。いつもすぐ定員に達してしまうappengine ja nightですが、女性参加者の場合は専用の枠をいくらか用意するつもりですのでatndの定員の心配をしなくても大丈夫です、是非どうぞ!</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-30814337318541170502011-04-03T04:32:00.002+09:002011-04-03T16:12:05.694+09:00#appengine 1.4.3の #slim3 単体テスト環境でQueueへのAddで例外が発生する場合<h4>追記</h4><p>このエントリを書いた数時間後に、<a href="http://code.google.com/p/slim3/source/detail?r=1593">この問題に対する対策が実施された</a><code>slim3-1.0.10</code>がリリースされています。このエントリは無視してそれを使いましょう!</p>
<p>Slim3の単体テスト環境で、先週リリースされた Google App Engine SDK 1.4.3を適用するとQueueへTaskをaddする処理で次のような例外が発生します。
<blockquote><pre>java.lang.IllegalArgumentException: Task name does not match expression [a-zA-Z\d-]{1,500}; given taskname: 'null'
at com.google.appengine.api.taskqueue.TaskHandle.validateTaskName(TaskHandle.java:103)
at com.google.appengine.api.taskqueue.TaskHandle.<init>(TaskHandle.java:30)
at com.google.appengine.api.taskqueue.QueueImpl.add(QueueImpl.java:489)
</pre></blockquote></p><p>あれこれ見てみた結果、この原因は、<strong>1.4.3 からSDK内でtaskqueue#BulkAddのresponseをチェックするようになった</strong>、という事かなと思います。</p>
<h4>対処方法</h4><p>Slim3内部でなんとかするしか無いですが、急いでいる方は次のようにすると応急処置になります。</p>
<div><ol><li>Slim3を使ったプロジェクトに、<code>org.slim3.tester.AppEngineTester</code>を作成する</li><li>Slim3の<code>org.slim3.tester.AppEngineTester</code>をそのクラスにまるごとコピーする</li><li>次の箇所を探す。<pre>} else if (service.equals(TASKQUEUE_SERVICE) && method.equals(BULK_ADD_METHOD)) {
TaskQueueBulkAddRequest taskPb = new TaskQueueBulkAddRequest();
taskPb.mergeFrom(requestBuf);
TaskQueueBulkAddResponse responsePb = new TaskQueueBulkAddResponse();
for (int i = 0; i < taskPb.addRequestSize(); i++) {
tasks.add(taskPb.getAddRequest(i));
responsePb.addTaskResult();
}
return responsePb.toByteArray();
</pre></li><li>その箇所を次のように変更する。<pre>} else if (service.equals(TASKQUEUE_SERVICE) && method.equals(BULK_ADD_METHOD)) {
TaskQueueBulkAddRequest taskPb = new TaskQueueBulkAddRequest();
taskPb.mergeFrom(requestBuf);
TaskQueueBulkAddResponse responsePb = new TaskQueueBulkAddResponse();
for (int i = 0; i < taskPb.addRequestSize(); i++) {
tasks.add(taskPb.getAddRequest(i));
<strong>TaskResult taskResult = new TaskResult();
taskResult.setChosenTaskName("task" + String.valueOf(System.nanoTime()));
responsePb.addTaskResult(taskResult);
// responsePb.addTaskResult();</strong>
}
return responsePb.toByteArray();</pre></li></ol></div>
<h4>ついでに</h4>
<p>どうせSlim3のクラスにパッチをあてるなら…という事で、テスト時の初期ファイルをSlim3の単体テストで使用してテストの処理時間を短縮したい、等考えている人は次の対処をしておくと便利かもしれません。</p>
<p><code>AppEngineTester#tearDown()</code>内の<code>ApiProxy.setDelegate(originalDelegate);</code>となっている箇所の後ろに次の処理を追加する。</p>
<div><pre>if (!AppEngineUtil.isProduction()) {
ClassLoader loader = loadLibraries();
Class<?> apiProxyLocalImplClass = loader.loadClass(API_PROXY_LOCAL_IMPL_CLASS_NAME);
Method stopMethod = apiProxyLocalImplClass.getMethod("stop");
stopMethod.setAccessible(true);
stopMethod.invoke(apiProxyLocalImpl);
ApiProxy.setEnvironmentForCurrentThread(originalEnvironment);
new File("build/test-classes/WEB-INF/appengine-generated/local_db.bin").delete();
}
</pre></div><p>単体テスト用の初期データファイルをSlim3の単体テスト実行フォルダ(build/test-classes/WEB-INF/)にコピーしてテストする際は、データストアを正しく終了する処理をしておかないとデータファイルが正しく読めなくなってくる(タイミングによっては問題なく読める時もあるw)ための対処です。念には念を入れてlocal_db.binの削除も行っています。この対策を行って、AppEngineTester#setUp()の前に初期データファイルを<code>"build/test-classes/WEB-INF/appengine-generated/local_db.bin</code>へコピーしておけばテストのための初期データ作成が高速になります。</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-15201772860706482032011-03-22T23:05:00.000+09:002011-03-22T23:05:19.606+09:00クラウド設計のデザインパターン@ITPro #appengine<p>本日3/22日より、<a href="http://itpro.nikkeibp.co.jp/index.html">ITpro</a>にて<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20110315/358359/">クラウド設計のデザインパターン - クラウド設計のデザインパターン</a>という特集が始まりました。そのシリーズの中のGoogle App Engine編という事で、金曜日までの4回分を執筆させていただきました。</p>
<p>あまりガッツリ開発をする人ではない読者を対象にということで、開発者の方にとってはもの足りない内容かもしれませんが、これからGoogle App Engine向けにシステムを構築しようと考えておられる方にはどんな点で苦労があるのか?などなどと参考にしていただけると思います。いきなり「よっしゃGoogle App Engine向けの案件を開始するぜ」みたいなノリでとっかかると大概痛い目に遭うプラットフォームだと思うので、これから始めようと考えている方には是非4回全部読んでいいただきたいです。</p><p>Google App Engineプラットフォームはかなり速い速度で進化し続けているため、もっと開発者向けのものも、今回の連載とは別にそろそろまとめておく必要があるなぁと、執筆を進めながら思ったりしました。</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-83569118756503633952011-03-12T06:05:00.002+09:002011-03-15T17:53:58.032+09:00MacOS Xのアップデート後 #appengine javaで開発サーバが動作しない件<p>2011-03-11にあったMacOS Xのアップデート実施すると、ローカルで開発サーバが起動できなくなる問題が出るようです。現象としては、開発サーバ(eclipseから起動しても、結局はSDK内の<code>dev_appserver</code>が起動されます)を起動した後、数秒で開発サーバが終了してしまう、という現象です。私が試したときはたまーに少しだけ動作してから落ちる、という場合もありました。下記でも報告されていますし、対策も説明されています。</p><ul><li><a href="http://code.google.com/p/googleappengine/issues/detail?id=4712">Issue 4712 - googleappengine - Java for Mac OS X Update Breaks dev_appserver - Project Hosting on Google Code</a></li></ul><h4>対策を簡潔に説明しておきます</h4><ol><li><a href="http://openjdk-osx-build.googlecode.com/files/OpenJDK-1.7-x86_64-20110221.dmg">http://openjdk-osx-build.googlecode.com/files/OpenJDK-1.7-x86_64-20110221.dmg</a> からOpenJDK1.7のイメージを入手する</li><li>dmgを開いて、Dukeアイコンの<code>Installation.pkg</code>を実行してOpenJDK1.7をインストールする</li></ol><p>これでopenjdk-1.7がインストールされます。此処から先は開発サーバの起動毎に手順があります。</p>
<h4>SDK内の<code>dev_appserver.sh</code>を直接起動している人</h4><p><code>dev_appserver.sh</code>をエディタで開いて<code>JAR_FILE=...</code>などの次の行あたりに<code>JAVA_HOME=/Library/Java/JavaVirtualMachines/openjdk-1.7-x86_64/Contents/Home</code>を追加する</p>
<h4>eclipseから起動している人</h4><ol><li>eclipseの設定画面を開く</li><li>左のツリーから<code>Java > Installed JREs</code>を選択する</li><li>右側のペインで<code>Add</code>をクリックする</li><li><code>Add JRE</code>ダイアログで<code>MacOS X VM</code>を選択して<code>Next</code>をクリックする<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUH5_77y2wobDdExN8Z1UkdqVqV7Y_lT5AlGBSakqu9MTiOoGr2z3kunpUZKy3XUYLwDsy_u91VHH4pe9wYGevET4CLlL1egXqoC4Q41qBKpqv_uKFndm8kdK0RnQmXC4E4Opp6OhNA3RQ/s1600/Screen+shot+2011-03-12+at+4.38.45.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="254" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUH5_77y2wobDdExN8Z1UkdqVqV7Y_lT5AlGBSakqu9MTiOoGr2z3kunpUZKy3XUYLwDsy_u91VHH4pe9wYGevET4CLlL1egXqoC4Q41qBKpqv_uKFndm8kdK0RnQmXC4E4Opp6OhNA3RQ/s400/Screen+shot+2011-03-12+at+4.38.45.png" /></a></div></li><li><code>JRE definition</code>の画面に移るので、<code>JRE Home</code>の<code>Directory</code>ボタンをクリックして<code>/Library/Java/JavaVirtualMachines/openjdk-1.7-x86_64/Contents/Home</code>を選択する</li><li><code>JRE name</code>に<code>openjdk-1.7-x86_64</code>を入力する<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_CNtbr2u3eQwenFZ5gVXFxPDDzFWw2oavvPkS5b2wES_8aDmPvX8oxlsstaI1xp9W76S1CKLhoFmtks2Zo5Yb4j9gBuX5znQOyiZwMINYa02oWDPFboeVt9Bh0-4A5TaVo2zIyyQ75hTv/s1600/Screen+shot+2011-03-12+at+4.40.30.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="363" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_CNtbr2u3eQwenFZ5gVXFxPDDzFWw2oavvPkS5b2wES_8aDmPvX8oxlsstaI1xp9W76S1CKLhoFmtks2Zo5Yb4j9gBuX5znQOyiZwMINYa02oWDPFboeVt9Bh0-4A5TaVo2zIyyQ75hTv/s400/Screen+shot+2011-03-12+at+4.40.30.png" /></a></div></li></ol>
<p>ここまでの手順で、eclipseがOpenJDK1.7を認識出来るようになります。次に、appengineプロジェクトに対して次の設定を行う必要があります。</p>
<ol><li>プロジェクトのプロパティを開き、左のツリーから<code>Java Build Path</code>を選択する</li><li>右側のペインで<code>Libraries</code>タブを開き、リストの下の方にある<code>JRE System Library[JVM 1.6.0 (MacOS X Default)]</code>を選択し、<code>Remove</code>をクリックして削除する。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6UGa57E1PfTCNMSdzZeGuXFKC-GB7ZX5_Wwd_QVXNVKngdaEmWNiNIVXzhLtHTrYNdvgUc9KpcpvT3ij2DxA0TfWHrunDSyp3eVlp5syvi7h7rMP_1yfO07MKCrCNrnHLzWX64QlkNDil/s1600/Screen+shot+2011-03-12+at+4.53.13.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="286" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6UGa57E1PfTCNMSdzZeGuXFKC-GB7ZX5_Wwd_QVXNVKngdaEmWNiNIVXzhLtHTrYNdvgUc9KpcpvT3ij2DxA0TfWHrunDSyp3eVlp5syvi7h7rMP_1yfO07MKCrCNrnHLzWX64QlkNDil/s400/Screen+shot+2011-03-12+at+4.53.13.png" /></a></div></li><li><code>Add Library</code>ボタンをクリックする</li><li><code>Add Library</code>ダイアログで<code>JRE System Library</code>を選択して<code>Next</code>をクリックする</li><li>どのJREを使うか選択する画面になるので<code>Alternate JRE</code>を選択し、先の手順でEclipseに認識させた<code>openjdk-1.7-x86_64</code>を選択する<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgQpdTt02eZez3mGoZ6ZCjZI4HWM6KGONajll_t2TCmb36aeclmg9maaDuA_fVvDC4ugGQS0x3jpMVY0yKT4xaqGjeezCeLFT5Z5ZrpQD5sMlIcthUNOx4pcPuGxc2MI_-z77VRXgQBu2f/s1600/Screen+shot+2011-03-12+at+4.53.48.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="262" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgQpdTt02eZez3mGoZ6ZCjZI4HWM6KGONajll_t2TCmb36aeclmg9maaDuA_fVvDC4ugGQS0x3jpMVY0yKT4xaqGjeezCeLFT5Z5ZrpQD5sMlIcthUNOx4pcPuGxc2MI_-z77VRXgQBu2f/s400/Screen+shot+2011-03-12+at+4.53.48.png" /></a></div></li><li>プロジェクトのLibraryにopenjdkが追加される。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjttKc-WhQ-oPCBrTKXEiVHT3IH6RVimjwsZTgQPMg7OBTMPrpgayVqdanh430ROQqDWp_KG_YUPGgvjC4Xhsc4JsaS4JXfwHaazm_9TH_wi26TfzkFBdNYn7SO8wNCB9eLpsrb5vGpqZym/s1600/Screen+shot+2011-03-12+at+4.54.04.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="286" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjttKc-WhQ-oPCBrTKXEiVHT3IH6RVimjwsZTgQPMg7OBTMPrpgayVqdanh430ROQqDWp_KG_YUPGgvjC4Xhsc4JsaS4JXfwHaazm_9TH_wi26TfzkFBdNYn7SO8wNCB9eLpsrb5vGpqZym/s400/Screen+shot+2011-03-12+at+4.54.04.png" /></a></div></li></ol><p>これらの手順で開発サーバが起動できるようになります。</p>
<h4>追記</h4>
<p>上記手順で開発サーバを起動したときに<code>javax.net.ssl.SSLException</code>が発生するのが気になる場合は、次の手順で解消できます。</p>
<ol>
<li>cd /Library/Java/JavaVirtualMachines/openjdk-1.7-x86_64/Contents/Home/jre/lib/security</li><li>cp /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts .</li>
</ol>
<h4>2011-03-15追記</h4>
<p>AppleのJDKを入れ直すという、もっと簡単そうな手順も紹介されています。</p>
<ul><li><a href="http://d.hatena.ne.jp/rabbit2go/20110315/1300166274">MacOS XのJavaアップデートとAppEngine SDKの問題に対処した - Basic</a></li></ul>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-24488820857597592792011-02-26T04:16:00.000+09:002011-02-26T04:16:49.245+09:00空うさぎが Lingr にも対応してより便利になった #sora_usagi<p>これまでに何度も紹介してきた、<a href="http://twitter.com/aqubi">@aqubi</a>が作っている Twitter/FriendFeed/Google Buzz/RSSをストリーム受信・強力通知するクライアントの<a href="http://www.sorausagi.org/">空うさぎ</a>の新しいバージョンがリリースされました。今年は「「これなしでは生きていけない」ウェブ・サービスやガジェット」を書いていませんが、<a href="http://www.sorausagi.org/">空うさぎ</a>は私にとっては相変わらず最も重要なツールで、キーワードやサービスごとに通知の種類を設定できて、大量に流れてくる情報を効率よく処理するために強力なクライアントです。</p>
<p>今回のリリースで<a href="http://lingr.com">lingr.com</a>に参加しているroomの更新通知、投稿ができるようになります。</p><p>設定画面でユーザ名とパスワードを入力します。アプリにサービスのパスワードを入れとか今時のアプリにはあり得ないのですが、lingr.comがOAuth対応すれば空うさぎもきっとすぐに対応してくれます。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipDz62ZORmORYV7L8kBJjJywl9drHLg3Zu5Wq_eT6vlf6HPuewxft1ashJIIGxPDPHgzmN2wzzX-2Ng-NON6gUAS4aQ1bX90_OAYriGVDI5mx6SBYTan0w4h4Xf93ROYaspyim6XkudPFo/s1600/sorausagi_lingr_20110224-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="293" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipDz62ZORmORYV7L8kBJjJywl9drHLg3Zu5Wq_eT6vlf6HPuewxft1ashJIIGxPDPHgzmN2wzzX-2Ng-NON6gUAS4aQ1bX90_OAYriGVDI5mx6SBYTan0w4h4Xf93ROYaspyim6XkudPFo/s400/sorausagi_lingr_20110224-01.png" /></a></div></p><p>通知用のフィルタはLingrの全room用にひとつ作ってもよいし、roomごとに設定したい場合は図のように<strong>Match String</strong>項目に<strong>^\[room名\]</strong>と設定します。私は見落としたくないroom用にクリックしないと閉じない通知フィルタを、それ以外は自動的に閉じる通知(サービスにLingrを設定しただけのフィルタ)を設定して、room用の通知フィルタの下にLingr全体の通知フィルタ、という順に設定しています(フィルタに登録された上から順に適用されます)。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZ8E-g9VytKncrlXHn0-XeiQIthK-3L7PUXMZdSWDnnD0eZ4NYqnTc-cBaRrFS5m7Fp9v5sHG4T3Cmh_bL4_QRCnrj29fZg8HvEvNcJV_5XpEGK3ENlBYDbncLlcStfOhnDvLY-3u1UIV/s1600/sorausagi_lingr_20110224-02.png.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="199" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZ8E-g9VytKncrlXHn0-XeiQIthK-3L7PUXMZdSWDnnD0eZ4NYqnTc-cBaRrFS5m7Fp9v5sHG4T3Cmh_bL4_QRCnrj29fZg8HvEvNcJV_5XpEGK3ENlBYDbncLlcStfOhnDvLY-3u1UIV/s400/sorausagi_lingr_20110224-02.png.png" /></a></div></p><p>また、Lingrには連続して投稿する事も多いので、投稿後に入力ウインドウが自動的に閉じてしまわないように設定してます。ただし、この動作は別のroomへの誤爆を招きやすいかもしれないので注意が必要かも。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwcpSLS2AeD_WrG9hnLkTlxbWB5aRnVMZbBHJM8v5DopcbaDpP12J667ia_FbySoNvGzqg5T9IQMpax1ol-TGP-qEcXd3M1CxzbtHZ7W0W_X5_HhpkzwDHjZ7LJYO5kn6DlgQ1JsiWvwCA/s1600/sorausagi_lingr_20110224-03.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="260" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwcpSLS2AeD_WrG9hnLkTlxbWB5aRnVMZbBHJM8v5DopcbaDpP12J667ia_FbySoNvGzqg5T9IQMpax1ol-TGP-qEcXd3M1CxzbtHZ7W0W_X5_HhpkzwDHjZ7LJYO5kn6DlgQ1JsiWvwCA/s400/sorausagi_lingr_20110224-03.png" /></a></div></p>
<p>空うさぎは色々と設定も多くて複雑に見えるのでマニアックなカンジがしますが、そんなにユーザ数も多くないしこれからもマニアック路線で突き進むと思われます。キーバインドがカスタマイズ出来るのでhjklバインドにしたり、readitlater対応なんかも便利です。GmailもAtomフィードで取れて便利。</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-18473281786301381172011-02-24T23:55:00.016+09:002011-02-25T00:18:51.841+09:00Google API Expert(Google App Engine)に選任していただきました<p>Googlerとなってからはぐれメタル並の出現率となった<a href="http://twitter.com/kazunori_279">@kazunori_279</a>さんの推薦により、Google API Expoertとして活動させていただくことになりました。</p>
<ul><li>Google App Engineに関する情報発信</li><li>初心者向けの普及活動</li><li>appengine ja night等の濃いコミュニティへの協力</li></ul>
<p>…などなどの活動はこれまでどおり行いつつ、これまでよりもGooglerとの接続ができるかなと思います。</p><p>また、個人的には Google Apps関連APIやその他のGoogle APIも色々と触っているので、<a href="http://sites.google.com/site/devreljp/Home/api-expert">他のAPIのExpertの方々</a>とも連動してAppEngine以外のAPIを使うデベロッパーの方々ともコラボできるようなハンズオン・ハッカソン・勉強会もやっていきたいと考えています。今後とも宜しくお願いいたします!</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com1tag:blogger.com,1999:blog-6537683890194004915.post-47101790302428703052011-02-21T01:47:00.002+09:002011-02-21T01:48:41.855+09:00Google Apps Script勉強会に参加しました #gasja<p><a href="http://twitter.com/atusi">@atusi</a> さん主催のGoogle Apps Script勉強会#2 に参加しました。</p><p>第一回の時とは違い、半分くらいの人が「Google Apps Scriptを触ったことがある!」という状態でビックリです。日本でそんなにGASを触っている人がいるなんて…。</p>
<h4>発表資料など</h4>
<p><a href="http://twitter.com/webos_goodies">@webos_goodies</a>さんがAWSのROUTE53とSpreadsheetの連携アプリの紹介を、@atusiさんがGASの概要の説明をされました。</p>
<ul><li>@webos_goodiesさん - <a href="http://bit.ly/gas20110220">GASでアプリ作ってみた</a></li><li>@atusiさん - <a href="http://bit.ly/hLlfCe">Google Apps Script #2</a></li></ul>
<h4>ハカソン</h4>
<p>今回はハッカソン主体だったので、自分も何か作ろうと作業しました。お題は「会社の勤怠シートの入力を補助するツール」です。私は勤怠シートを月末にまとめて記入するずぼらなタイプで、毎月入力が面倒です。そこで、下記の機能を持ったスクリプトを作ることにしました。</p>
<ul><li>入力する勤怠の対象月を入力する</li><li>日本の祝日を取得する</li><li>自分の予定一覧を取得する</li><li>土日祝以外は基本となる時刻を固定で入力済みにし、自分の予定を補足情報として対象日に表示する</li></ul>
<p>結局作業時間の範囲内では表示に必要なデータの取得までしかできていなかったのですが、ログに出力した内容を表示しつつ「取得まで出来たんだぜ」とか成果発表をしました。</p><p>帰宅後に少し作業して表示部分もできたので貼っておきます。アクティブシートにがっつり上書きするので、興味があるなどで試される方は新規のシートで試してください。</p>
<div style="font-size:smaller;"><script src="https://gist.github.com/835807.js?file=gasja2.js"></script></div>
<p>新規シートを作ってスクリプトエディタを起動し、コピペでペタっと貼ってシートを再読込すると「gasja2」というメニューが追加されます。その下の「勤怠入力補助」をクリックします。</p><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinMfWjzbiqb3HBwUE6-xe7QkbL-4m4NaVKYnHlp5KzW9wpiGUrnJRGxeosn-Ua5O19N1K9Tm2SWk3Ku56rdZL9JS2Rt2vfrzoGeq7ZRk8Md7RRmHiqD93CNakn4DrAw5U2UyYGBi4d7mdV/s1600/Screen+shot+2011-02-21+at+1.41.22.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="65" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinMfWjzbiqb3HBwUE6-xe7QkbL-4m4NaVKYnHlp5KzW9wpiGUrnJRGxeosn-Ua5O19N1K9Tm2SWk3Ku56rdZL9JS2Rt2vfrzoGeq7ZRk8Md7RRmHiqD93CNakn4DrAw5U2UyYGBi4d7mdV/s400/Screen+shot+2011-02-21+at+1.41.22.png" /></a></div><p>いくつか入力項目をもったダイアログが表示されるので、2011/02のような形式で年月を入力してOKをクリックします(最初はカレンダーへのアクセスを許可を求めるダイアログが表示されるので、許可する必要があります)。</p><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEnByxrHxRv7qpzYBTMaZ5CqZbN9ssa2pAG_680Tz342i51pYIvVX3KiYUoFAjFKCL_FpisUSlA6aP3840jdjjg6itKAjxDKYvEJtB7mmZ-5oDCCM6WDGlT6GLZ6Ty1agIKrVJF8iVrE3h/s1600/Screen+shot+2011-02-21+at+1.41.34.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="272" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEnByxrHxRv7qpzYBTMaZ5CqZbN9ssa2pAG_680Tz342i51pYIvVX3KiYUoFAjFKCL_FpisUSlA6aP3840jdjjg6itKAjxDKYvEJtB7mmZ-5oDCCM6WDGlT6GLZ6Ty1agIKrVJF8iVrE3h/s400/Screen+shot+2011-02-21+at+1.41.34.png" /></a></div>
<p>対象月の勤怠表の雛形が表示されます。土日祝以外はデフォルトの勤務時刻が入力され、土日祝は日付列の背景色が変わります。祝日情報は日付列のコメントに設定されます。また、シート所有者のカレンダー情報は2列目に表示されます。</p><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC8O4x2DXdA9Vi4qNsDHIoLXx0hAGWXmnmIpNuuJKAaUMoJzgyENpKcpOM8SwSR7axbPjc8W9qkX98NKN5SlInNf1RksPl4OO9oclA6CWKSKFNxXmLUfvGk-kpu1HeTHTDlNUipijcr-Wd/s1600/Screen+shot+2011-02-21+at+1.42.48.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="144" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC8O4x2DXdA9Vi4qNsDHIoLXx0hAGWXmnmIpNuuJKAaUMoJzgyENpKcpOM8SwSR7axbPjc8W9qkX98NKN5SlInNf1RksPl4OO9oclA6CWKSKFNxXmLUfvGk-kpu1HeTHTDlNUipijcr-Wd/s400/Screen+shot+2011-02-21+at+1.42.48.png" /></a></div>
<h4>気になった</h4>
<p>今回も新たに勉強になったことがたくさんありましたが、その中でも特に気になった物。</p><ul><li><code>Rage#setBackgroundColor()</code></li><li><code>Range#setNumberFormat()</code></li><li><code>Sheet#setColumnWidth()</code></li></ul><p>上記のような、スタイルの設定を行う機能が存在しているということに驚いた。確かgoogle-data-apiのSpreadsheet APIにはセルのスタイルを操作するAPIが無かった記憶があったんですよね。GASは必ず<strong>GAS-GData-(Spreadsheet等)</strong>という経路でAPIを実行すると思っていたので、実はそれ以外に<strong>GAS-(Spreadsheet等)</strong>のような経路があるのか?等と思いました。それか、GDataにスタイル操作系のAPIが追加されたか、追加される前兆か?…と気になりました。</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-63026232197071966862010-12-26T19:22:00.001+09:002010-12-26T19:49:08.466+09:00#slim3 1.0.6 のSimpleControllerを使った場合のテスト方法 #appengine<p>先日、slim3-1.0.6が<a href="http://groups.google.com/group/slim3-user/browse_thread/thread/f8d829f73ca22982">リリースされました</a>。たくさん機能追加がありますが、最近の自分的に嬉しい機能のひとつにController内でInputStreamが使える<a href="http://code.google.com/p/slim3/issues/detail?id=62">issue62</a>への対応があります。
<blockquote>Support for Controller#createRequestHandler():<br />
http://code.google.com/p/slim3/issues/detail?id=62</blockquote>
この機能を使用する際のテストケースの書き方の例を書いておこうと思います。あと、ついでにMetaクラスにJson->Model、Model->Jsonを行うユーティリティメソッドが追加されているのでそれも使っています。<a href="http://twitter.com/takawitter">@takawitter</a>さんの仕事です、ありがとうございます、便利です。</p>
<h4>まずはController</h4>
<p>Httpメソッドとリクエストパラメータによって追加・修正・削除と1件返却、リスト返却を実装しているだけのシンプルなものです。ポイントは<strong>ControllerではなくSimpleControllerクラスを継承している</strong>点と、<strong>asString()は使わずrequest.getParameter()でパラメータを取得する</strong>という点と、<strong>ModelMetaクラスのJson用ユーティリティメソッドが便利</strong>という点です。</p>
<div style="font-size:smaller;"><script src="https://gist.github.com/755326.js?file=JsonController.java"></script></div>
<h4>ControllerをテストするControllerTest</h4>
<p><code>ServletInputStream</code>を実装した<code>JsonInputStream</code>というクラスを用意し、<code>MockHttpServletRequest#setInputStream()</code>に設定することでControllerへのpayloadを設定しています。</p><div style="font-size:smaller;"><script src="https://gist.github.com/755326.js?file=JsonControllerTest.java"></script></div>
<p>issue62とJson用ユーティリティメソッドのおかげでjsonをやりとりするControllerが一気に作り易くなって、かなーり助かります。ただ、<code>jsonArrayToModels()</code>や<code>modelsToJsonArray()</code>が無いのがちょっと勿体無いかな?</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0tag:blogger.com,1999:blog-6537683890194004915.post-5192893690427267962010-12-26T05:19:00.002+09:002010-12-26T05:24:31.656+09:00closure-libraryをWebStormで使う<p>最近closure-libraryの勉強をしているんだけど、WebStormでキレイに補完をしたりする設定方法のメモ。<br />closure-libraryというよりはWebStormの話だけど、WebStormって全プロジェクトで参照できる共通ライブラリって登録できないのかな?方法を知っている人がいれば教えてください。</p>
<div><p>以下のようなフォルダ構成を想定。</p>
<ul>
<li>プロジェクトのルートフォルダ
<ul>
<li>closure-library(ここがclosure-libraryのroot)
<ul>
<li>closure
<ul>
<li>goog</li><li>bin</li><li>css</li>
</ul>
</li>
</ul>
</li>
<li>src(ここに自分のjsとかcssを配置)</li>
</ul>
</li>
</ul></div>
<div><ol><li>WebStormで上記のプロジェクトのルートフォルダを<code>Open Directory</code></li><li>Preferncesをひらいて<code>Project Settings</code>セクションの<code>Directories</code>を選択</li><li>一番右側の領域で<code>project/closure-library/closure</code>を選択して<code>Resource Root</code>をクリック(真ん中の領域の<code>Resource roots</code>に<code>closure-library/closure</code>が追加される)</li><li>同様にして<code>src</code>フォルダも<code>Resource Root</code>として追加する</li></ol><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWthajqxDovm3d_IL9nZDAuHoxHCfUEMYDoKvdTdyejag7hmNSZYciVv0FCmPT_GM2q0UrCL7BI1P27VYHN-jBktmXGOE16pNroh_Ymok4RdYp9ySJU25wswM4CbwEHV7h5ml8aTNDMKQt/s1600/closure-webstorm-preference.png" imageanchor="1" style=""><img border="0" height="105" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWthajqxDovm3d_IL9nZDAuHoxHCfUEMYDoKvdTdyejag7hmNSZYciVv0FCmPT_GM2q0UrCL7BI1P27VYHN-jBktmXGOE16pNroh_Ymok4RdYp9ySJU25wswM4CbwEHV7h5ml8aTNDMKQt/s400/closure-webstorm-preference.png" /></a></div></div>
<div>Closure LibraryはJsDocsもかなり書かれているから、メソッドの補完をした時のパラメータなんかもキレイに参照できる<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuQd6aQYxF9ZP1CCYLygm09WRBGeyTlMy-E5DR2Ty5iT-K3wW8eG0WIr5bAk0b0R4xq_8ZzO2DfGf2oauizT42okXN2PyICS7GS93XhDKNFQjmRVzTS3GpYC_TNm-tdks7PvvrBWOkR0ym/s1600/closure-webstorm-codeassist1.png" imageanchor="1" style=""><img border="0" height="226" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuQd6aQYxF9ZP1CCYLygm09WRBGeyTlMy-E5DR2Ty5iT-K3wW8eG0WIr5bAk0b0R4xq_8ZzO2DfGf2oauizT42okXN2PyICS7GS93XhDKNFQjmRVzTS3GpYC_TNm-tdks7PvvrBWOkR0ym/s400/closure-webstorm-codeassist1.png" /></a></div>
</div>
<div>WebStormの機能として知らなかった機能だけど、シングルクオート内でも補完が効いてびっくりした。キャメルケースマッチがあると安心ですね。キャメルケースマッチが無いクソIDEだとイライラしますもんね!<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinm-U2Ln66LxLIvaslJpNr-Pl5uVCvOxxSe6Keqi09dlYJ-JPPqh7isiRZYRDdDCrCBh5ZSjrWmZ2AqdtgSjtJ9MgGhfjZj2v-1Mszqjjxad4ct7k7t33HQH6hVjUdcWfzHsQZiUEWoDYZ/s1600/closure-webstorm-codeassist2.png" imageanchor="1" style=""><img border="0" height="184" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinm-U2Ln66LxLIvaslJpNr-Pl5uVCvOxxSe6Keqi09dlYJ-JPPqh7isiRZYRDdDCrCBh5ZSjrWmZ2AqdtgSjtJ9MgGhfjZj2v-1Mszqjjxad4ct7k7t33HQH6hVjUdcWfzHsQZiUEWoDYZ/s400/closure-webstorm-codeassist2.png" /></a></div></div>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com2tag:blogger.com,1999:blog-6537683890194004915.post-81354020303409409742010-12-02T04:16:00.000+09:002010-12-02T04:16:11.969+09:00Titaniumのコード補完をWebStromで<p>最近Titaniumを使い始めたんだけど、コード補完するための*.jsがどこにあるのかよくわからなかった。いろいろ調べていると、</p>
<ul>
<li><a href="http://developer.appcelerator.com/apidoc/mobile/1.4/api.json">http://developer.appcelerator.com/apidoc/mobile/1.4/api.json</a>で公式のTitanium.*の定義情報が配布されている</li>
<li>上記のapi.jsonを読んでJavaScriptの定義ファイルを出力してくれるモジュール(JavaScript)が<a href="https://github.com/netpro2k/TiAutocomplete">https://github.com/netpro2k/TiAutocomplete</a>で配布されている</li>
</ul>
<p>という事がわかった。自分の場合は以下のようにしました。</p>
<ul>
<li><code>$ git clone git://github.com/appcelerator/titanium_mobile.git</code></li>
<li><code>$ wget http://developer.appcelerator.com/apidoc/mobile/1.4/api.json</code></li>
<li><code>$ node TiAutocomplete/tiDocs.js > Titanium.js</code></li>
<li>作成された<code>Titanium.js</code>を、Titaniumプロジェクトの直下(Resoucesと同じレベル、Resources配下ではない)へコピー。</li>
</ul><p>WebStormではTitanium用のプロジェクトをルートフォルダにしている状態です。これでTitanium.*が補完されて大変便利になりました。</p>ssshttp://www.blogger.com/profile/04523470655370373839noreply@blogger.com0