投稿

ラベル(google)が付いた投稿を表示しています

Google Wave @ pySpa

pySpa こと、python 温泉 2 日目です。昨日から今日にかけて、 @atusi さんと、 Google Wave のロボットを作ってみました。 pyzon (旧 pyAWWS) を使って、 asin: [ASINコード] をタイトルに変換するというボットです。アカウントをお持ちの方は、 amzbot@appspot.com を追加すると試すことができます。 今のところ 、html を blip に表示することはできないので、リンクもテキストになっています。 参考にさせていただいたサイト、およびコード 誰も知らない夜のwaveのrobot ( @atusi ) 最速!Google Wave API解説 ( @technohipy ) Google Wave API Samples 以下が実際のコードです。 # coding:utf-8 from waveapi import events from waveapi import model from waveapi import robot from pyzon import AWSECommerceService ROBOT_NAME = 'amzbot' PROFILE_URL = 'http://%s.appspot.com/' % ROBOT_NAME IMAGE_URL = PROFILE_URL + 'icon.gif' awsecapi = AWSECommerceService( ACCESS_KEY_ID, SECRET_ACCESS_KEY, associate_tag = ASSOCIATE_TAG, locale = LOCALE ) DEBUG = True def get_title_from_asin(contents): pass """ contents の中身を変換するための関数 """ def OnBlipSubmitted(properties, context): # blip の取得 blip = context.GetBlipById(properties['bli...

Google Developper Day 2009 in Japan

イメージ
Google Developper Day 2009 Japan #gdd09 @パシフィコ横浜です。html5, opensocial, android, appengine enterprise, etc...。 HTML5 により拓かれる次世代 Web あんまり良い表現が思いつかないけど、最近の buzzword は html5 な予感。昨日の wwdc で apple も html5 について触れていたけど、open なブラウザは、10年越しで メジャーバージョンアップ (?) する。google, apple, mozilla, opera 等のいわゆるモダンブラウザは順に対応するかと。ie は... "ie8 から web 標準に準拠していく" という言葉を信じるw html5 でできるようになること。ブラウザは html5 でアプリケーションプラットフォームになる。学生時代に、C言語で座標で絵を描いていたようなことでも、現行のブラウザでは難しい。html5 では、canvas タグや video タグ等の新しいメディアタグが提供される。3d 等も browser + html + dom のみで動作する。これは、 デモ を見た方が速い。flash, java, silverlight...とかが必要だったグラフィックスがブラウザだけでいけるというのはすごい。他にも、オフラインで動作するための、aplcash/db や、スレッド処理機能、ジオ機能も提供される。これでアプリケーションプラットフォーム完成。時代は js ですね。。。 OpenSocial in Japan / OpenSocial Advance mixi や goo 等、日本国内でも開発が盛んな opensocial。もともと sns は人と人を結びつけるものだったけど、そこに技術者が参加した。技術者が参加することで、コンテンツが増え、コンテンツが増えることでユーザが増え、ユーザーが増えることで技術者もウハウハというエコシステム。javascript, xml 等で開発。Advanced セクションではローレベルなテクニックを紹介。リクエスト数、転送量に発生するコストを削減する。私のサイトでも使っているyahoo user interfa...

Google Developper Day 2009 の セッション情報

GDD の セッション説明会に行ってきました。情報を公開です。 クラウドコンピューティングがもたらす 5 つのメリット Google Apps(Mail, Office, Calendar, Video, Site, IM...) アプリ: コスト: \6,000/year ランニング: グーグルが一元管理する ビジネススタイル: Chrome, Android と連携。オフライン作業も可能 生産性: Office 製品による共同作業 統合: 他のSaaS製品とかと統合可能 (Salesforceなど Google エンタープライズ エコシステム Google Search Appliance Google Enterprise Partner (GEP) が多種多様な情報のインデックス化をしてくれる リアルコム: ノーツデータを検索可能とする 印刷した紙媒体もインデックス (会社名聞き取れませんでした) Google Apps クラウド内に保存しているデータも検索可能 Google Apps LDAP や AD と連携した SSO SAML2.0 に同期可能なアプリケーションであれば同期可能 HTML 5 ハイパーテキストというよりはアプリケーションプラットフォームになる HTML本体の中の構造化ドキュメント、メディア系のタグ、フォームの新機能を詳しく紹介予定 ユーザーメリット、開発者メリットを紹介予定 2010 年にファイナライズ予定 Gears と HTML 5 対応ブラウザ のすみわけを聞いてみた -> 古いブラウザへの HTML 5 の一部機能の提供? HTML 5 に対応したアプリのみの提供は不可。下位互換をプロバイダーが保障する必要がある HTML 5 になると、Flash とか アプレットはいらなくなるのではという話が興味深かったです。Google IO の結果が楽しみです!

Google Developper Day 2009 について

イメージ
Google Developper Day 2009 のサポーターブログ vol.1 です。12日に事前MTGがあるとのことで参加してきました。以下、事前情報で公開されている内容です。 Google Developper Day 2009 について 開催日: 2009 年 6 月 9 日 場所: パシフィコ横浜 概要: Google の最新テクノロジーの紹介、デベロッパーとの交流 参加方法: 満席のため、締め切り終了 (紹介枠のみ) ※ Google Group 等で最新情報を取得することができます 以下、事前 MTG で紹介されたセッションの概要です(おそらく公開して良いと思われるw)。 App Engine, Geo (Maps API), Open Social, Chrome, HTML5, Social Web等などのGoogle テクノロジー。ライトニングトーク、オープンソース、エンタープライズエコシステム、新ユーザエクスピアリアンス、新卒 Engineer のお話他。ほぼ Fix ですが、変更の可能性あり 今年は、Open Social のセッションの枠が拡大されています スピーカーは Open Social プロバイダーの有名な会社の社長さん ("m" ではじまる) 等、非常に豪華です。楽しみです! ライトニングトークには、 @tmatsuo さんも参加されます 以下、その他の有用な?情報です。 当日は早く来るといいこと(Google ノベルティ的な)がある。 Office Hour にスピーカーとお話ができる。 ※ Office Hour: 米国大学で使われている用語で、教授が絶対に捕まる時間らしい。Developper Day では教授ではなく、有名なスピーカーの皆様が捕まります。 サードパーティーがディスプレイしたりしてます。 以下、Hack-a-thon 情報です。 今年から、Hack-a-thon に時間を割くため、Developper Day とは別に Hack-a-thon の時間を設けることに Hack-a-thon は 6/10-11 に秋葉原でやる予定 6/10: Geo API, Android (cross presentat...

App EngineでTweet @ GAE Hackathon

昨日、 Google App Engine Hackathon Disc.3 に参加してきました。わたくしはTutorial Aで外部データとの連携をがむばることに。 テーマは、 Python Twitter というライブラリーを使って、GAEからTwitter API(JSON)をコールしてみようというもの。必要なライブラリーは、 Python Twitter と simplejson の2つです。 Python Twitter はデフォルトのままでは動きません。動作するように書き換えたやつを、 ハカソンリポ にコミットしております。だいぶひどい修正です。主な変更点は以下のとおり。 1487行目 のDiff def _GetUsername(self): - return os.getenv('USER') or \ - os.getenv('LOGNAME') or \ - os.getenv('USERNAME') or \ - os.getlogin() or \ - 'nobody' + return 'nobody' 1394行目 のDiff def _FetchUrl(self, url, post_data=None, parameters=None, no_cache=None): - # Build the extra parameters dict - extra_params = {} - if self._default_params: - extra_params.update(self._default_params) - if parameters: - extra_params.update(parameters) - - # Add key/value parameters to the query string of the url - url = self._BuildUrl(url, extra_params=extra_params) - - # Get a url opener that can handle basic auth - ...

GAE SDK 1.1.8 リリース

Google App EngineのSDK 1.1.8が リリース されました。 id:Voluntas , Ian がブログで解説してますね。 PolyModel がサポートされました。 UserProperty に auto_current_user / auto_current_user_addが追加 Image API に width/heightが追加 あとはバグフィックスとか PolyModelのドキュメントより、以下のような使い方ができます。 from google.appengine.ext import db from google.appengine.ext.db import polymodel class Contact(polymodel.PolyModel): phone_number = db.PhoneNumberProperty() address = db.PostalAddressProperty() class Person(Contact): first_name = db.StringProperty() last_name = db.StringProperty() mobile_number = db.PhoneNumberProperty() class Company(Contact): name = db.StringProperty() fax_number = db.PhoneNumberProperty() p = Person(phone_number='1-206-555-9234', address='123 First Ave., Seattle, WA, 98101', first_name='Alfred', last_name='Smith', mobile_number='1-206-555-0117') p.put() c = Company(phone_number='1-503-555-9123', address='P....

GAWare 公開

AppSpotで公開している GAWare のソースコードをGPLライセンスで公開し始めました。コメントを入れたやつから公開していきます。コードが長いし、読みにくいですがご容赦ください(汗)。まだスラグ用の正規表現フィールド等はデバッグしてません…。コードレポは迷ったんですが、 Google Code を使っています。そのうち、bitbucketあたりに移行するかもしれません。バグとか、コーディングのアドバイス等色々突っ込んでいただけると喜びます。

GAE Hackathon vol.2 & Python忘年会

だいぶ遅くなったけどまとめてBlogする。第2回Google App EngineのHackathonに行ってきました。今回は少人数のチームに分かれて、各チームにテーマが与えられました。私が参加していたチームのテーマはモデル。最近はBigTableにもなれてきましたが、やっぱりRDBMSじゃないし、クエリーが発行できるのも = 、 < 、 > のみ。また、日本語の検索自由度はないに等しい(どうやらGAE HackathonでSearch APIをもうすぐリリースするという情報が!)。そこで、日本の郵便番号住所の情報を検索可能なモデルを作成することにした。分かち書きして、そのリストを保有するという選択肢もあるのだが、今回は前方一致、後方一致検索ができるようなモデルを作成することにした。"東京"、"東京都"、"新宿区"、"西新宿"とかで検索可能にしたい。色々と悩んだ結果、 str を list で分割し、位置も実図連結してStringListPropertyに突っ込むことにした(相当荒業)。ソースは ここ においた。Modelのputをフックし、リファレンスが張ってある別Modelに文字列のリストを保存している。時間は短かったですが、わいわい楽しいコーディングができましたよ! それと、グルーの tmatsuo さんより、前方一致のテクニックを教わった。 db.GqlQuery('SELECT * FROM Test WHERE w >= :1 and w < :2', word, word + u'\uFFFD') というコード。その文字以上かつ、ユニコードの最大文字である '\uFFFD' 以下の文字で比較するというもの。これはありがたく使わせていただきます。special thanks tmatsuo! あと、いつもお世話になっている id:Voluntas さんが幹事の Python忘年会 に参加しました!この会、いつもメンバが濃い。ちょっとびびってた mopemope さんがすごい優しい人で、あまりのギャップにやられました(笑)。っていうかmopemopeさんが忘年会の前に勉強会を開くという話だったので、楽しみに...

BigTableはPUSH型で

BigTableで悩む で書いたけど、Twitterで id:Voluntas さんからアドバイスを頂きました。 PULL型じゃなくてPUSH型で書く timelineに db.ListProperty(db.Key) でメッセージを受信するユーザを保持 ということでPULL型で作っていたのをフルスクラッチしたいと思います。 id:Voluntas さんありがとうございます。最初からちゃんとBigTableのこと調べてから設計すべきwww

BigTableで悩む

GAEでTwitterライクなアプリを作ってるんだけど、BigTableのリレーションで悩んでる。モデルは以下のようにした。ちなみに Zipped Django 1.0 on GAE with Helper をベースにしている。 # models.py class User(BaseModel):   user = db.UserProperty(required=True)   follow = db.ListProperty(db.Key) # User model   send = db.ListProperty(db.Key) # Item model 送信したItem   receive = db.ListProperty(db.Key) #Item model 受信したItem class class Item(BaseModel):   text = db.StringProperty(required=True) # 送信したtxt   published = db.DateTimeProperty(required=True, auto_now_add=True) # 送信したtxt 上記モデルから、"自分がFollowしたUserの全てのItem+自分が受信したItem"、"自分が受信したItem"、"自分が送信したItem"を(Twitterみたいにw)取得したい。そこで以下のように抽出する。 # views.py def received (request): # 自分が受信したItem   user = User.all().filter('user =',users.get_current_user())   items = Item.get(profile.receive) def sent (request): # 自分が送信したItem   user = User.all().filter('user =',users.get_current_user())   items = Item.get(pro...

Zipped Django on GAE with Helper

Zipimortを使ってApp EngineでDjango 1.0を利用する でGAEにZipアーカイブされたDjango 1.0を使う手順を翻訳したけど、ついでに既存のDjangoアプリをそのまんま乗っけちゃうために Google App Engine Helper for Django を使いたい。ということで、テンプレートを作りました。 Github に置いときます。適当にforkして使っちゃって下さい。ここはHelper、Djangoがバージョンアップするつど更新していきたいと思います。今回使ったバージョンは以下のとおりです。 Django 1.0 Google App Engine Helper for Django r66 この テストサイト で動かしています。Django 1.0を使いたい方は djangoproject.jp の皆様がドキュメントを翻訳して下さってますので、 ここ をご参考にしてください。

Zipimortを使ってApp EngineでDjango1.0を利用する

" Using Django 1.0 on App Engine with Zipimport "の日本語訳。訳がおかしいところはコメントください。 はじめに App EngineのアプリケーションでPython Webアプリケーションフレームワークを使うことは、アプリケーションフレームワークで使っているコードを取り込むぐらい簡単です。しかし、アプリケーションがアップロードできるファイルには制限があり、いくつかのフレームワークで制限を超えてしまう場合や、アプリケーションコードを書く余裕がない場合があります。この場合、App Engine リリース 1.1.3からサポートされているPythonの"zipimport" で解決することができます。 この記事では、Google App Engineに"zipimport"を使ってDjango 1.0を使用するための解説をします。 Zipimortの導入 アプリケーションにモジュールをインポートする際、Pythonはいくつかのディレクトリーの中からそのモジュールのコードを探します。PythonコードからPythonチェックするディレクトリーのリストを変えるには sys.path を使用します。App Engineがインクルドするパスは、App Engine APIとアプリケーションのルートディレクトリーです。 sys.path のアイテムでZipフォーマットのアーカイブを指定することで、Pythonはそのアーカイブをディレクトリーとして扱います。アーカイブは1つ以上のモジュールを含む.pyソースコードを含みます。この機能はzipimportという標準ライブラリーのモジュールでサポートされており、このモジュールはデフォルトのインポートプロセスの1つであるため、このモジュールを使うために直接このモジュールをインポートする必要はありません。zipimportに関する詳しい情報に関しては、 zipimportドキュメント を参照してください。 App Engineでモジュールアーカイブを使う方法: バンドルしたいモジュールのZipフォーマットのアーカイブを作る アプリケーションディレクトリーにアーカイブを入れる 必要な場合はハンドルしたスクリプトを sys.path に追加...

Google App EngineがJavaをサポート

この ブログで紹介されていますが、Google Developper Day 2008でGoogleがGAEにJavaをサポートさせたようですね。GAE4JとかJ4GAEとかGoogle Groups内でも賑わっています。同時に、Androidがオープンソースになったそうです。色々と目まぐるしいですが、俺はしばらくPython on GAEに夢中だと思います。

ドメイン以外はクラウドに

このサイトもそうだけど、別にホステイングなんかしなくても無料で独自ドメインのブログサイトが持てるようになりましたね。年間1万ぐらい使ってホスティングしていたのですが、採算とろうと思ってもそうはいかないw所詮個人の徒然ブログなもので。。。 このドメインでのサーバとかサービスの構成をちょっとまとめてみようかな。 ・ドメイン:value-domainさん ・ブログ(www):Blogger with custom domain ・メール(mail):Google Apps for your domain ・サブバージョン:我が家 サブバージョンは俺の一人開発用のサーバwっていうか、参考にするためにいろんなリポジトリが登録されていて、1日一回updateしてるだけ。あとは、Tracなんかで見てる。なんでわざわざ登録しているかというと、なくなるプロジェクトも多くてw ホスティングのMTからGoogleに乗り換えたんだけど、ちょっと苦労したので、メモとして残しておく。どうやら、Bloggerのcustom domainとGoogle Appsは同じDNSサーバを使っているらしい。Bloggerに登録しようとすると、「そのドメインは使われてるよ!」と怒られちゃいました。うーむ。 Google Groups英語サイトをみると、バグということで報告されていますね。だいぶ怒ってらっしゃる方もいらっしゃいます( ここで )wわたくしは以下のような方法で解決しましたよ。サポートしてくれたGoogle Teamの皆さんサンキュー!!! Google Appsを退会 GoogleがDNSをリセット(5日ぐらいかかりますw) Bloggerでcustom domainを設定 Google Appsへ再登録 という順番で解決しました。