上記のコードを展開したものが以下のコード。簡単なエラー処理を追加してある。APIのBASIC認証が終了してしまうので、OAuth対応のTwitterクライアントを作ってみることにした。シンプルだと思われるコマンドラインで動作するクライアントをPythonで作成してみた。Twitterクライアントを作成する前に、TwitterのサイトでOAuthクライアントの登録を行わなくてはならない。ここで、「アプリケーーション名」、「アプリケーションの説明」、「アプリケーションのウェブサイトURL」を記入する必要がある。Write"を選択した。CONSUMER_SECRET)。次にコーディングだが、できるだけ短くシンプルに作りたかったので、Python外部モジュールのtwitter、oauth、oauthtwitterを利用させてもらうことにした。oauthtwitter.pyのOAuthApiクラスのgetAccessTokenメソッドの下に以下のgetAccessTokenWithPinメソッドを追加した。oauth.OAuthToken.from_string(token)今回作成したTwitterクライアントの使い方だが、tw.pyで最新のタイムラインを表示する。取得件数はここでは20件にしているが、ソースコード中の引数で変更することができる。Twitterへの投稿は以下のようにすれば良い。"つぶやき"最初の起動時に、アクセストークンを取得するための認証URLが表示される。それをブラウザで開いて表示された認証番号(PIN)を入力する必要がある。取得したアクセストークンは指定されたファイル(KEY_FILE)に保存され、次回以降はそのファイルからアクセストークンを取得する。ソースコードを以下に示す。APIを利用して短縮URLチェッカーを作ってみたTweet最近、Twitterやはてなブックマークなどを使うことが多くなり、字数制限付きのコメントを書くことが増えた。コメント中にURLを入れたいこともままあるのだが、長いURLだと字数をオーバーしてしまう。そのため短縮URLを使っているが、コメント内に直接短縮URLを入れるのがやっかいだった。(GAE)を使ってシンプルで高速な短縮URL変換ツールを作成してみた。短縮URLは悪意のあるサイトの判別が難しいという欠点がある。見た目で判断できないので開くのを躊躇してしまう。そこで、今回作成したツールでは、短縮URLに変換するだけではなく、それを元のURLに戻す機能も追加した。APIを利用してフィッシングサイトなどの悪意あるサイトの判別も試みている。使い方はシンプルで、テキストボックスに変換したいURLを入力すればbit.lyの短縮URLがテキストボックス表示され、bit.lyの短縮URLを入力すればもとのURLが表示される。テキストボックスをクリックすれば表示されているURLが選択されるのでクリップボードへのコピーも簡単だ。テキストボックスの下には展開されたURLがリンク付きで表示されるが、もしフィッシングサイトだと疑われる場合は、以下のように警告してくれる。今回のコード作成だが、bit.lyによる短縮URLの変換は簡単だった。いうのも以前にPythonスクリプトで作ったことがあるからだ。それをそのままGAEに載せればいい。APIによる悪意あるサイトの検出は思ったよりも面倒だった。APIの使い方がよく分からない。使う前は任意のURLをAPIで確認するのかと思っていたのだが、そうではなく、MD5でハッシュ化したリストをダウンロードして、調べたいURLをハッシュ化してそれと照らし合わせなくてはならない。今回問題になったのはそのダウンロード容量で、フィッシングサイト用データが700KB程、マルウェア用データが10MBを超えていた。GAEでは一回のダウンロード容量の上限が1MBと決まっており、フィッシングサイト用データは何とかダウンロードできても、マルウェア用データは途中で切れてしまった。仕方がないので今回はフィッシングサイト用のみを使うことにした。APIの新しいバージョンが開発中であり、それを使えば何とかなるかもしれない。自分がちょっと試したときには何故か新しいAPIが使えなかったので、今回は見送ることにした。気が向いたら試してみるかも。APIによりダウンロードされるリストはMD5でハッシュ化されているが、ハッシュ化される前のURLは標準化された参照URLだ。そこで、調べるURLについても標準化して参照URLを作成しなくてはならない。時間を掛けたくなかったので、今回は標準化については実装しなかった。Puthraya氏が作成したコードを利用させてもらった。URLの標準化についてはGoogleのサイトにも参考例が載っているので、時間ができたら作ってみたい。ダウンロードされたリストはデータストアに格納している。ハッシュ化されたURLを個別にデータストアに入れるとデータ数が非常に多くなってしまうので、ハッシュ化リストの先頭の2桁(16進数)をインデックスにし、256分割のデータとして格納した。リスト更新中にデータストア上のURLの参照が行われても問題が発生しないように、データモデルを2つ用意して更新は交互に行うことにした。加えて、データストアへのアクセスを減らすためMemcacheを利用している。フィッシングサイト用リストはcronを使って30分毎に更新している。リスト更新の際に処理が30秒を超えることがあり、そのため更新に失敗してしまうことがある。これはGAEの制限なのだが、前述のデータ取得の容量制限と合わせて、このあたりが改善されるとより素晴らしくなるのだけどなぁ。無料で使わせてもらっているのに贅沢かもしれないけど。リスト更新の半分以上が30秒を超えてエラーになったので、TaskQueueによる処理に変更した。最後に今回作成したソースコード(実装したクラスのみ)を示しておく。style="font-size:xx-small;"><p>短縮URLの変換およびフィッシングサイトの判別を行います。/>フィッシングサイトの疑いがあります。href="http://www.antiphishing.org">AntiPhishing.org</a>を参照してください。u"<div><p>変換できませんでした。(GAE)では現在10個までのアプリケーションを登録することができる。Waveのボットを作成することができる。多種多様な利用方法が存在するWaveボットをGAEアプリケーションとして登録していてはすぐに上限に達してしまうだろう。そこで、一つのGAEアプリケーションで複数のWaveボットを作成するためのいくつかの方法を利用することになる。サブドメインを利用する方法が一般的だろうか。前からサブドメインを利用して複数のWaveボットを作成しようと思っていたのだが、ちょっと面倒に思えて手を付けていなかった。したら、technohippy氏によるappengine_multi_robot_runnerというライブラリが公開され、それがとても便利そうだったので簡単なWaveボットを作成してみた。v2が3月30日にアップデートされて実装の一部が変更されたことにより、appengine_multi_robot_runner.pyがそのままでは動作しなかったので該当箇所を修正した。それについては最後に記述しておく。現在、appengine_multi_robot_runnerは最新版に更新されているので、後述の修正は必要無くなっている。作成したのはインチキ日本語ボット(fake-japanese.robotic-wave@appspot.com)とインチキ英語ボット(fake-english.robotic-wave@appspot.com)の二つのWaveボットだ。インチキ日本語ボットでは、書き込んだ日本語を一度Googleにより英語に翻訳し、それを再度日本語に翻訳し直して表示する。インチキ英語ボットは、日本語を英語に翻訳したものを表示する。インチキと書いたが、特にでたらめにするために細工しているわけではない。現在の翻訳技術ではインチキっぽく見えてしまうというだけである。Japan!を利用させてもらった。どのように動作するか、以下の例文を実際に入力して動作を見てみよう。「ここ数日は暖かな日が続いていますが、その後いかがお過ごしでしょうか。「待ちに待った桜の花もそろそろ咲き始めております。近いうちにお花見にお誘いしようと思っておりますが、ご都合はいかがでしょうか。」インチキ日本語ボット(fake-japanese.robotic-wave@appspot.com)では以下の通り。インチキ英語ボット(fake-english.robotic-wave@appspot.com)では以下の通り。後述のソースコードを見てもらっても分かるように、この程度の内容であれば非常に短いコードで済んでしまう。Waveボットは一般的なネットボットよりもインタラクティブに利用でき、効果も大きいので、このように簡単に作成できることは非常に重要だと思う。Wave上で簡単にWaveボットを作成することができる。以下にWaveボットのソースコードを示す。v2が3月30日にアップデートされ実装が一部変更された。そのため、appengine_multi_robot_runner.pyが動作しなくなったのでそれを修正するために加えた変更を以下に示しておく。self.response.out.write(self._method(host=self.request.host))上記のコードを以下のように変更する。self.response.out.write(self._method(host=self.request.host))変更箇所その2。'application/json')),上記のコードを以下のように変更する。(ASE)について、「Android上でPython、Lua、JavaScriptなどを実行するスクリプティング環境が凄い」で紹介した。APIの使い方をリファレンスとしてまとめてみた。2.6の標準モジュールは最初から利用できる。twitterモジュールなど、いくつかの標準外のモジュールがデフォルトでインストールされている。詳細については利用する環境で確認して欲しい。Browser"で簡単なリファレンスを読むことができる。android-scripting、サンプルプログラムとしてtest.pyが参考になる。APIの簡易リファレンスを示すが、APIのすべてを記しているわけではない。足りない部分については随時追加していく予定だ。停止.位置情報取得などのイベントを受け取るタイプのAPIでは、開始直後にイベントを取得できない場合がある。そこで以下のように数回リトライできるようにする。停止.センサー情報はディクショナリとして保存されている。"neutral"指定したボタンが1つ(例えばdroid.dialogSetPositiveButtonText("Yes"))なら1つのボタンのみを表示する。droid.dialogGetResponse()["result"]response["item"]にはリストの順に0からの数値が入る。r22からreadLocation()のデータ構造が変更されたようなので、それに合わせて上述のコードを修正した。Waveが重要な技術になると感じたのは本当だ。(GAE)などでプログラミングできる単なるおもちゃだった。Waveの潜在能力の高さを知ることになった。大量のメールに埋もれる情報と予定の立たないミーティング最近、仕事上のメールのやりとりが頻繁ですぐに流されてしまうことが多く、大事な知らせを失念してしまったり、大量のメールから目的の情報を探し出さなくてはならなくなったりと、メールの扱いに手を焼いていた。顔を合わせるミーティングにおいても、この時期は皆忙しいようで、集まりたいときにすぐに集まれない状況が続き、何かと仕事が滞りがちになっていた。Waveに目を付けたのだ。Waveを仕事で利用しなかったのは、もともとGAEと連動させてWaveボットなどを開発するのが目的であり、コラボレーションツールとしてはあまり興味を持っていなかったからだ。それに、知人や同僚にもアカウントを持っている人がいなかった。Waveのアカウントを職場で配ってみることにした。そこでまずは、IT関連の最新技術に明るい同僚に利用してもらい、しばらく一緒に使ってみたのだが、特に問題となるような点もなく、使い勝手もそれほど悪くはなかったので、他のメンバーにもアカウントを配ることにした。Waveアカウントを配ったメンバーに早速使ってみてもらったところ、おおむね好評を得られて...というほど甘くはなく、やはり第一印象は「難しい」、「使いづらい」、「メールでいいんじゃないの」という意見だった。Waveの名前すら聞いたことがないというのだからそれも仕方が無いのだろう。Waveの紹介でも全く同じように述べられている。最大の欠点は、新しいユーザーが試しに使ってみた場合にあまりに理解しづらくて困惑してしまうことにあるといえます。比べれば理解しやすいとされています。触れたときにほとんどの人が困惑を経験するといえるからです。「なんだこれは」や「これは変なツールだね」といったものになることでしょう。Waveコンプリートガイドより引用)そして、難しいと思わせる理由として以下の4つが挙げられている。Waveを使ってもらうことにした。新しいパラダイムは常に受け入れられがたいものだ。利用して初めて分かることまず最初にしたことは、メンバーと共同で進めている自分の仕事の連絡をWaveで管理することだった。今までは自分の担当分の結果が出たら、その報告と結果データの場所(通常はコンピュータ上のディレクトリ)などをメールで知らせていたのだが、そのやりとりが頻繁になると以前の報告やデータを把握しづらくなってくるし、ある仕事の成果を引き継いで別の仕事を行う場合、その対応付けも大変だった。別のメンバーが新たに参加する場合、これまでの進捗を説明するのも一苦労だ。Waveを利用することによって、それぞれのメンバーの進捗状況は一目でわかるし、仕事のデータも簡単に取り出せる。画像やPDFなどのファイルもドラッグ&ドロップで簡単に共有できる。ToDoリストとして使うことで、既にメンバーの誰かが完了していた仕事を別のメンバーが繰り返したり、既にあるユーティリティスクリプトを作成してしまうことがなくなった。車輪の再発明の防止だ。加えて、他のメンバーの状況と照らし合わせて、ここまでは急ぎで行わなければならないとか、これはまだ急がなくても良いだろうとかの判断が、簡単にできるようになった。次に、ある商品の名称を決める打ち合わせを例に挙げてみよう。Waveを使わない通常のミーティングの場合、メンバー全員を同じ時間に拘束する必要があり、さらに、その時間内で名称候補を考えつかなくてはならない。それでは考えつくすべての候補が出る前に時間切れとなってしまうかもしれない。時間を決めずに各自に考えてもらってそれを持ち寄るのではどうだろうか。これだと、各個人がバラバラに考えているので、別メンバーのアイデアから触発されることはない。実際に自分の場合、ミーティングやメールでアイデアを募ってみたが、ほとんど反応はなかった。ミーティングでは時間が短すぎたし、メールでは良いアイデアを思いつかないまま別の仕事に追いやられてしまうわけだ。Waveを使った場合はどうだろうか。いくつのかの候補の議論がなされ、それに触発されて他のメンバーからも新たな候補が挙がるようになった。それによりさらにアイデアが浮かんでくる。ブレインストーミングだ。Waveであれば、全員が同じ情報を共有し漏れが無く、時間にも拘束されない。進行のまとめもWave上で編集していけばよいし、何かを決めるときには投票などのガジェットも使える。実際に上記で挙がった候補から最終的な名称を決めるために投票ガジェットは大いに役立った。どれだけWaveが有用に使えるか、使用する前にすべてを見積もっていた訳ではない。車輪の再発明の防止やアイデアの触発などは、実際に導入して初めて実感できたことだった。頭では分かったつもりでも使ってみるまでは本当に分かったことにはならない。Studioの山本氏によると、会社のコミュニケーションは電話、チャット、メール、Twitterで成り立っているそうだ。Buzzを使ってもいいだろう。Waveに置き換えられていくのではないかと感じている。すべてのメールとチャットが置き換わるとは思っていないが、多くの部分でWaveが使われるのではないだろうか。ここで重要になってくるのが、WaveとTwitterとの共存だ。Twitterは今までにないゆるいつながりのコミュニケーションツールとしての立場を確立してる。実際に自分も使っているが、コミュニケーションツールの他に情報収集の手段としてとても有用だ。Twitterの情報はノイズが多く発散しやすい。最新の情報を肌で感じることができても、それを保存して加工する目的には向いていない。Waveを使えばそれを補うことができる。重要だと思われるTwitterの発言があったらそのポインタだけ示しておけば、その情報を共有できる。それが古くなったりただのノイズだと判断したのならそれを捨てればいいだけだ。編集可能なWaveでは、チャットやメールのスパムのように邪魔になったりしない。リアルタイムの今の情報を共有できるのだ。因みに、Wave上でTwitterを動作させるボットもあるし、特定のキーワードでつぶやきを表示させるガジェットもある。WaveはEvernoteとも非常に相性が良い。Wave自体が複数人で共有できるEvernoteのようなものだからだ。個人のWebスクラップノートとして利用されているものだからEvernoteを複数人で共有して利用するのは難しいが、Waveを利用することでその弱点を克服できる。自分の場合、仕事ごとにEvernoteのノートを作って管理している。ある仕事が共同作業であった場合、Waveを作ってそのURLをEvernoteに貼り付けておく。個人的な細々したメモや形になっていないアイデアなどはEvernoteに書いておき、皆で共有する情報はWaveに書く。Waveには他のメンバーも書き込んだり、編集したりするので情報は常に遷移していくのだが、その遷移する情報のすべてを一つのURLだけで保存できる。EvernoteからWaveの情報にアクセスするのはクリック一つだ。因みに、Wave上でEvernoteを動作させるガジェットも存在する。WaveとTwitterとEvernoteを活用することで、とても大きな効果を期待できるだろう。Waveの導入について、セキュリティを心配する声を聞く。外部にデータを持つのは不安だという。この点についても問題ない。言うのも、Waveサーバプロトコルが公開されているからだ。自社サーバでメールサーバを立ち上げるように、Waveサーバを立ち上げることができる。現在はプレビュー版ということもありGoogle以外での実装は見かけないが、将来的には普通に立ち上げることができるだろう。自社でサーバを持つことと、セキュリティが確保できることとは同義ではない。セキュリティを保つためにはそれ相応の技術が必要だ。その点で自社でサーバを管理するよりも、Googleなどのような高い技術を持つ企業に任せた方が安全であるとする見方もある。Waveもそれと同程度にはセキュリティが確保されていると考えられる。Waveを使用するにあたり、次に問題になるのは、各ユーザが感じる使い勝手だろう。便利だからといって、使い勝手が悪ければ使われない。SkypeやGmailであればチャットやメールが届いたときにその旨が画面にポップアップして知らせてくれるユーティリティがある。Chrome用にブラウザ上で知らせてくれるAdd-onがあるが、それだと常時ブラウザを立ち上げている必要がある。新しいWaveが来たときにメールで知らせてくれるオプションもあるが、メールの代わりにWaveを使うという目的からして本末転倒だ。Notifierの使用をお勧めしたい。これを使えば新しいWaveが届いたときにポップアップして通知してくれる。XやiPhoneならWaveboardというWaveクライアントが利用でき、通知機能もあるようだ。どちらにしろ現在はまだプレビュー段階であり、リリースまでにはもうしばらくかかるだろう。それまでにはもっと便利でより良い環境が揃ってくることになると思う。Waveはまだ正式にリリースされたわけではない。発展途上のプレビュー版だ。機能も不完全であり、開発環境も安定していない。今すぐにWaveアカウントを手に入れられなくても気にすることはないと思う。Waveが利用されることなく廃れてしまうことが私たちにとってどれだけ「損する」ことなのかを理解してもらうことが、これを記した理由だ。今すぐ使い始めなければ「損する」というわけではない。それでも今すぐに使いたい方もいると思う。残念ながら自分の持っている招待枠は使ってしまったので、「Waveプレビュー版の招待を得る」などを参考にアカウントを手に入れて欲しい。Waveの最新情報や便利な使い方を知りたい場合には、以下のサイトが参考になる。Waveの使い方が簡潔にまとめられているビデオ(約5分半)。」ブログクラブより献本して頂いた。Twitterの利点がわかりやすくまとめられており、今回のテーマとも一部共通するので紹介させてもらった。Twitterの利点や利用方法を知りたい方は読んでおいて損はないと思う。個人的には最後の社員アンケートが面白かった。Engineメッセージボード*当ブログに関する意見や要望などにお使いください。Googleアカウントでログインすることで書き込みができます。Twitterへの送信を同時に行うこともできます。ストリートビューで散歩*Googleマップのストリートビューを利用して散歩をするWebアプリです。ストリートビューとマップを分割してマーカーを視界タイプに変更することで使いやすくしてあります。APIを利用したグラフ・チャート作成ウェブアプリです。クリック一つで簡単にグラフを作成できます。ブログ記事への貼り付けなどにどうぞ。OpenIDテスト*OpenIDによるログインのテストを行います。mixiであればクリック一つで、他のOpenIDアカウントであればそのURLを入力することでテストできます。一言コメント表示機能付きです。HTML文字変換*テキストで使われているHTML特殊文字をウェブで表示できるようにするための文字変換ウェブアプリです。プログラムのソースコードなどをブログ記事に貼り付けるときなどに便利です。短縮URLチェッカー*フィッシングサイト判別機能付き短縮URLチェッカーです。テキストボックスに変換したいURLを入力すればbit.lyの短縮URLが表示され、bit.lyの短縮URLを入力すればもとのURLが表示されます。展開されたURLがリンク付きで表示されますが、もしフィッシングサイトの疑いがある場合は警告が表示されます。Trendsの急上昇ワードをランキング順に表示します。Googleでのキーワード・画像検索やWikipediaによる用語の説明もあります。※GoogleがAPIの提供を終了したため、現在停止中です。自己紹介noxゲームを楽しむだけの余裕と感性は失いたくないnoxです。