Ian Lewis
Ian Lewis is a web developer living in Tokyo Japan. His current interests are in Django, python, alternative databases and rapid web application development. About Me...
  • Appengine maintenanceが行われる時にメンテナンスページを出す方法

    Google Appengineのメンテナンス時間がある時、datastoreが読み込み専用になるのが多いと思いますが、データを書こうとする時に、CapabilitiesErrorと言う例外が起こる。それを自分のコードうまく処理しないと、500エラーがでて、ユーザには良くない表現になる。

    ドキュメントがないけども、実は、Appengine SDKでmaintenanceが行ってるかどうかをチェックできる capabalities と言うAPIがあります。 メンテナンスがスケジュールされて、ある時間以内にメンテナンスを行うかをチェックします。僕は django を使ってるけど、capabilities API に特に依存がないですね。

    from google.appengine.api.capabilities import CapabilitySet
    
    datastore_write = CapabilitySet('datastore_v3', capabilities=['write'])
    if not datastore_write.will_remain_enabled_for(60):
      # エラー処理
    

    毎回毎回チェックするのが大変なので、僕が作ったコードシェアリングサイト、 Smipple 、では、以下のユーティリティ関数とdecoratorを使っています。

     from django.core.cache import cache
    
     from google.appengine.api.capabilities import CapabilitySet
    
     def is_appengine_maintenance():
         datastore_readonly = cache.get("appengine_datastore_readonly")
         if datastore_readonly is None:
             datastore_write = CapabilitySet('datastore_v3', capabilities=['write'])
             datastore_readonly = not datastore_write.will_remain_enabled_for(60)
             cache.set(
                 "appengine_datastore_readonly",
                 datastore_readonly,
                 60,
             )
         return datastore_readonly
    
    def maintenance_check(view):
       """
       Checks the request method is in one of the given methods
       """
       def wrapped(request, *args, **kwargs):
           if is_appengine_maintenance():
             return HttpResponseRedirect(reverse('maintenance_page'))
           return view(request, *args, **kwargs)
       return wrapped
    

    それで、POSTのviewで、maintenance_checkデコレーターを付けて、maintenanceが起こる時に、maintenanceページにリダイレクトする処理をしています。

    @login_required
    @maintenance_check
    def myview(request):
      if request.method == "POST":
        #書き込み
    
    Send feedback このエントリーを含むはてなブックマーク はてなブックマーク - Appengine maintenanceが行われる時にメンテナンスページを出す方法
  • 明日からPython温泉

    明日からPython温泉に参加しに行ってきます。課題は下記のとおり

    どこまでできるかわかんないけど、たぶんあまり眠らないでしょう。

    Send feedback このエントリーを含むはてなブックマーク はてなブックマーク - 明日からPython温泉
  • Google Developer Day Japan 2009

    Google Developer Day Japan 2009

    Google Developer Day Japan 2009 に行ってきました。今年のキーノートも Google I/Oのキーノートのほぼ同じ内容になりましたけども、日本に専用的な話もありました。Mixiの Open Social がいよいよリリースされますので、Mixiの社長、笠原 健治さんと、日本一のOpen Socialの人材 yoichiro から Mixiアプリのデモを見せていただきました。Open Social のモバイルとPC両方対応するリリースは世界初と言いました。

    今年のGoogle Developer Dayではまた、Androidがさらに気合入れているみたいです。Google I/Oと同じく、HTCのHT-03Aを配りました。今月、Docomoで HT-03A がリリースされていますし、日本でもAndroidが栄えるように促進でしょうね。Google I/O で配ったやつとちょっと違って、枠の色が赤になって、裏のふたがマットタイプ。

    今年のセッションも、Google I/Oのセッションと大体同じでappengineのオフィスアワーのところにいました。それで、Googleの John Skidgel と Lindsey Simon といろいろappengineについて話をしました。彼らはappengineのアドミンコンソールを務めています。なので、appengineをどうやって改善すればいいかに興味を持っているらしい。長く話が出来てなかなか良かったです。

    その後に、今週に インストールした simeji と言う日本語入力メソッドの作者に出会いました。simejiを提示して、最新版をダウンロード出来るようにQRコードを用意していただきました。ローカル辞書を持ち、ネットに繋がってない時でも、漢字変換ができるようになった。

    Google Developer Dayが終わって、pythonのみなさんとみなとみらいのHard Rock Cafeで夕食食べて、帰りました。これで、 去年のGoogle Developer Day により、東京のPythonコミュニティに入った一周年になりました。みなさん、一年お疲れ様でした。そして、ありがとうございました。

    Send feedback このエントリーを含むはてなブックマーク はてなブックマーク - Google Developer Day Japan 2009
  • Django 勉強会 Disc. 8 参加して来た

    。。というか、ハンズオンC Django on GAEのセッションを担当させていただきました。まさかこんなに人気があると思わなかったけど、皆さんはびっくりするほど勢いを持ってきて、感動しました。

    Pollsというアプリを動かすまで出来た人がほとんどで、すごくうれしい思い出ができました。

    Django Benkyoukai Disc. 8 Hands-on C (GAE)

    みなさんお疲れ様でした!

    Send feedback このエントリーを含むはてなブックマーク はてなブックマーク - Django 勉強会 Disc. 8 参加して来た
  • GAE Hackathon Disc. 3 全文検索

    GAE Hackathon Disc. 3 に参加してきました! 私とid:a2c (Twitter) がGoogle Appengineの日本語が対応する全文検索エンジンを作ってみました。

    GAE では、データストアが Entity と言う概念で作られてるけど、Entityを検索する時に、データを完全一致しないと、データを取れないので、全文検索が難しくて、以下の状況になってる。

    • 一応、SearchableModelというクラスを継承すれば、英文検索が出来るけど、日本語テキスト検索が全くできない。(英語でも結構ひどい)
    • SearchModelで、英語検索しても、スペース文字で単語単位で切るので、単語を完全一致しないといけない。(つまり、informationがテキストに入ってるけど、infoで検索しても出てこない)
    • SearchableModelでは、3文字以下の単語はインデクスしてくれないので、ほとんどの日本語はアウト
    • 上の点の関係で、3文字以下の検索キーワードもアウト
    • 検索キーワードが無視された場合、何でも、引っかかるので、検索結果が分かりにくい

    a2cさんが以前に、いろいろ調べたり、試してみたりしてくれたので、いろいろ助かった。いい情報を取れたので、すごくいい話が当日にできました。

    SearchableModelのAPIは基本的にいいと思ったので、SearchableModelと同じように、日本語対応できるSearchableModelを使いたいなと思いました。こう書けば、わりと簡単に検索できる。

    from google.appengine.ext.search import SearchableModel
    from google.appengine.ext.db import *

    class Document(SearchableModel):
      title = StringProperty(u"Title")
      text = TextProperty(u"Body Text")
    ...
    Document.all().search(keyword)
    ...

    まず、SearchableModelがいろいろ、自分を参照したので、継承するのが難しかったから、別のモジュールにコピーして、forkすることにした。それで、この辺に単語の分け方を a2cが作ってくれた ngram実装に切り替えた。(ngramとは?) それで、SearchableModelのモジュールを変えるだけで、googleの実装と同じように使える。

    検索キーワードをngramで分けて、インデクスを検索すると、ちゃんと部分的にデータが引っ張ってくる。 http://saichugen.appspot.com/ でテストアプリを見れる。コードはbitbucketで公開されてる。

    これから、a2cさんともっと検索結果を取れるようにするのと、インデクスの容量をへらしたりするのと、分け方を自分で実装できるapiを導入したいと思うので、ぜひ期待してください :)

    Send feedback このエントリーを含むはてなブックマーク はてなブックマーク - GAE Hackathon Disc. 3 全文検索
  • Jaikuを動かしてみた

    昨日、GoogleTwitterライクなサービス、Jaikuオープンソースになって、Google Appengineに移動することに

    早速、コードを落として、動かしてみた。

    doc/README に入ってる手順(重要なのはlocal_settings.example.pyをlocal_settings.pyにコピー)にしたがってやってたんだけど、最初に動かそうとして、No module named djangoってエラーが出た。何だこれ!って思ったけど、ファイル数が多すぎて、deployする時にzipimport使ってる。さらに、Appengine SDK 1.1.9がapp.yamlにskip-filesに入ってるファイルにアクセスすることを拒否することになったので、ちゃんとzipにしないと動かない。Makefileにzip_allのコマンドはあるので、make zip_allで起動できるはずなのに、なぜか、同じくNo module named djangoがでた。

    でも、どうせにzipimportで、エラーがでたら、tracebackもでないし、俺は結局、app.yamlいじりました。

    skip_files: |
     ^(.*/)?(
     (app\.yaml)|
     (app\.yml)|
     (index\.yaml)|
     (index\.yml)|
     (#.*#)|
     (.*~)|
     (.*\.py[co])|
     (.*/RCS/.*)|
     # (\..*)|
     # (manage.py)|
     # (google_appengine.*)|
     # (simplejson/.*)|
     # (gdata/.*)|
     # (atom/.*)|
     # (tlslite/.*)|
     # (oauth/.*)|
     # (beautifulsoup/.*)|
     # (django/.*)|
     # (docutils/.*)|
     # (epydoc/.*)|
     # (appengine_django/management/commands/.*)|
     # (README)|
     # (CHANGELOG)|
     # (Makefile)|
     # (bin/.*)|
     # (images/ads/.*)|
     # (images/ext/.*)|
     # (wsgiref/.*)|
     # (elementtree/.*)|
     # (doc/.*)|
     # (profiling/.*)
     )$

    これでようやく動くはずなのに、またエラーが出たけど、今回はpstatsのエラーで、python-profileのパッケージを入れて、解決した。

    Send feedback このエントリーを含むはてなブックマーク はてなブックマーク - Jaikuを動かしてみた
  • OpenSocial Hackathon @ デブサミ

    昨日、デブサミ版のOpenSocialハッカソンに参加してきた。結構コーディングができて効率な一日でした。

    写真を撮るのを忘れちゃったけど、最初にキーノートプレゼンをして(なぜか英語だった)、それからコーディングに入って、最後に作った物を発表する形になった。コーディングする人はテーマ毎にグループに分けて、コーディングを行った。ゲームを作るグループが二つ、メディアっぽいアプリを作るグループが一つ、もう二つのグループ(テーマ忘れちゃった^^;)、チュートリアルをするグループと、僕が入ったAppengineグループがあった。

    今、id:tmatsuoとAppengineでコードシェーリングサービス、Smippleを作ってる。SmippleはOpensocialや、FacebookのSocialデータを使って、勉強しながら、うまくコードや、技術を共有できるサービスです。今の段階ではSocialの部分はあまりできてないせいか、僕たちの発表の仕方が悪いせいか、あまり受けられなかったみたいけど、これから頑張ってマーケティングをしていきたいと思ってる。

    id:tmatsuoも俺よりなぜかアメリカ人に人気があって、日本版OpenSocialギャラリーアプリをAppengineで載せる話があったみたい。僕もそれにハマるかもしれないので、ぜひ期待してください。

    Send feedback このエントリーを含むはてなブックマーク はてなブックマーク - OpenSocial Hackathon @ デブサミ
  • Google Appengine Hackathon 第2回

    今日、Google Appengine Hackathonに参加してきました。今回は岡野さんと共にDjangoの上でモバイルフレームワークを作成する引き続きを行いました。今日は絵文字と文字コードの対応を続けました。岡野さんがほぼ絵文字と文字コードの対応を以前にやってくれたので、今日は僕はappengineでDjangoとモバイルフレームワークをappengine上で動かして appengineのShoutoutに似たアプリを作って、絵文字対応をできました。一応、au, docomo, softbank, PC に対応しています。実際に仕事で使ってるので、コードを公開できませんが、一応 URLがあるので、ぜひ携帯電話でやってみて頂ければと思います。

    http://frmmkr.appspot.com/

    Google Appengine Hackathonに参加した皆さん、お疲れ様でした

    Send feedback このエントリーを含むはてなブックマーク はてなブックマーク - Google Appengine Hackathon 第2回