タグ

ブックマーク / www.ianlewis.org (22)

  • Googleのほとんどのサービスを支えるBigtableの誰でも使える版 Cloud Bigtable - Ian Lewis

    これは Google Cloud Platform Advent Calendar 2015の19日目の記事です。 そろそろ僕がGoogleに入って1年になります。ほんとにあっという間に2015年が終わった感じです。「Developer Advocate」という肩書のエバンジェリストのような、エバンジェリストじゃないような仕事をしています。 僕の仕事の一つが、今年の5月にbetaとして公開した「Cloud Bigtable」のリリース支援です。Cloud Bigtable というのは、Googleの有名な大規模分散データベースの「Bigtable」をGoogleの開発者以外でも使えるようにしたサービス。このBigtableはGoogleのサービス、検索、Maps、Gmailなど、ほとんどのサービスを支えています。 Bigtableは分散データベースでスケーラービリティが高い…というところま

    Ehren
    Ehren 2015/12/21
  • Fabric デプロイツールのPythonicな書き方 - Ian Lewis

    Fabric は指定したコマンドを各ホストで実行する実行モデルです。この場合は特にホストの指定がなかったので、全部ローカルで、一回実行することになります。 これは結構つまんないので、当の例を見ましょう。これは最近、仕事で作ったコマンドです。 nginx サーバーでメンテ画面を出すようなコマンドです。 各ロードバランサーで実行します。 from fabric.api import run, cd, abort, require, sudo, env from fabric.decorators import runs_once, roles from fabric.contrib.console import confirm ... @roles('loadbalancers') def start_maintenance(): """ メンテナンス画面に切り替える """ _produc

    Ehren
    Ehren 2013/09/02
  • BPで働くのがどうか (How BeProud Works)

    最近、githubの人、Zach Holman さんはgithubの社内の環境について、いくつかのブログ記事を書いていて、話題になっていました。 僕もいろいろ気になっている ので、 僕が働いているBeProud をgithubと比べながら、僕の考え方を説明したい。Zach さんの記事は3つに分かれているので、僕も3つに分ける。 _ 今回は Hours are Bullshit という記事 Zach さんの記事は英語で書かれているが、読むのは自分で頑張ってください。僕は、 日でできるだけ日語でコミュニケーションをしているけど、英語話す人が 書く情報はできるだけ英語で読んだほうがいいと思っている。翻訳は精々一時的な解決方法ですので、 翻訳しても、終わりがないのです。「人に魚を与えれば、その人は一日生き延びられる。 魚の捕り方を教えれば一生生きていける」とのことです。 Hours Are B

    Ehren
    Ehren 2011/11/15
  • Flask で LDAP でパスワード変更アプリを作る

    この間、会社で少し大きくなって、利用するツールが少し増えつつありますので、 ユーザー管理を統一するために、LDAPサーバーを使うようになりました。 思ったより面倒だったんですが、LDAPを使うと色なサービスで同じ ユーザー名とパスワードが使えるので便利です。今のところ、 Redmine サーバー、 Wiki、社内ライブラリのリポジトリーサーバー などに使っています。 ただし、LDAPは同じユーザー名とパスワードが使えますが、ユーザーが 自分でパスワードを変更させるには何か用意しないといけません。 というわけで、Flask のLDAPパスワード変更アプリを作ってみた。 Flask は Python で当然ながら、WSGI に普通に対応していますので、 かなり便利です。 さって、どうやるのか。 Python プロジェクトなので、当然ながら、 virtualenv を使います。仮想環境に Fla

  • PYPI を使わないでデプロイする方法

    pip、buildout などを使うとデプロイする時に Python ライブラリの依存関係はややこしいことがあります。 普段はデプロイスクリプトで、 pip に requirements.txt を指定して、もしくは、 buildoutを実行して、 依存ライブラリを落としてインストールしますが、 PYPI がダウンしている場合、環境によって、PYPIにアクセス 出来ない場合もありますので、デプロイが止まってしまって困ります。 PYPIはダウンしている時に pip は PYPI のミラーを使うことができますが、ミラーに必要がパッケージバージョンが入っていない、 ミラーの最後のIDのDNS が ちゃんと動いていないときに、 pip は当然ちゃんと動かない場合も。 bitbucket や、 github からのリポジトリに依存している場合、 接続できなかったら、ミラーがないので、当然インストール

    Ehren
    Ehren 2011/04/21
  • Python の JSONライブラリのパフォーマンステスト

    概要 最近、あるお客さんから、 快速なので、 cjson を使おうという要望をいただきましたが、 以前、僕は cjson は色なエッジケースの処理が微妙と分かっていて、実際に他のライブラリより早いのかなと思いました。 cjsonのPyPiページ いろなコメントが書かれています。しかも、 最新パージョンは 2007 リリースでかなり古い。バグがあるのに、直っていないし、あんまりメンテしてないライブラリに見える。 simplejson も jsonlib もCで拡張があり、 かなり最適化されていると思ったので、テストしてみようと思いました。 というわけで、パフォーマンステストを作って、bitbucket にアップしました https://bitbucket.org/IanLewis/jsonlib-test 準備 buildout を使って、環境を作ります テストを実行 ./bin/run_t

    Ehren
    Ehren 2011/03/23
    「simplejsonの最新版を使うのがおすすめです。」python2.6+でもsimplejsonを入れた方がよさそう
  • PyCon Mini JP 「お前、誰よ」まとめ

    昨日、 PyCon Mini JP にSphinx 1.1 の i18n 機能について発表しました。 Python コミュニティの偉い石さんが 日Pythonコミュニティの歴史について、いいキーノートを発表してくれたけれども、いろなPython 開発者がみんな集まる PyCon みたいなイベントが珍しいので、最初は固くて、重たい気持ちを感じました。 清水川さんや、鈴木さんがアイスブレークしようとしましたが、固い雰囲気が続いてしまった。 私はスタッフさんから無理やりアイスブレークをするのが非常に難しいと認識した。もし、スタッフさんがよく頑張ってくれたのに、みんなさんがあまり楽しめずに終わってしまったら、非常に残念なことになるなと思った。発表が受けられるために、以前にいろいろ考えて資料を作ったが、もうちょっと軽い気持ちをさせるため、発表する前に、ギリギリな時間に #bucho の写真の

    Ehren
    Ehren 2011/01/31
    Ianさん楽しい発表ありがとうございました
  • Google Appengine SDK 1.4.0 がリリースされました!

    Google Appengine 1.4.0 がリリースされました!! このリリースはかなりでかい!! チャンネルAPI, “Always On” (リザーブインスタンス)、タスクキューの正式リリース、スタートアップリクエスト、バックグラウンド処理の改善などなど、 チャンネルAPI まずは、一番重要なチャンネルAPI。チャンネルAPIでクライアントブラウザーにプッシュすることができるようになります。内部的には、Google Talk の XMPP インフラを使っているらしくて、それでスケールアウトしてくれます。チャンネルAPI は2つの部分がに分けています。 サーバー再度のチャンネルAPI と チャンネルAPIJavascript ライブラリ。 チャンネルAPIはサーバー側から、クライアントの通信に使います。クライアントからサーバーへの通信は今までどおりのPOSTがGET HTTPリ

    Ehren
    Ehren 2010/12/03
    ChannelAPIとTaskQueueの時間制限が10minになったのがうれしい。データクォーターの件はかなり気になる。
  • Google Appengine 公認API エキスパートになりました!

    昨日のAPIエキスパート月例会で、私は Google Appengine 公認API エキスパート (Python) になりました。私は2年ちょっと前、ずっと仕事Python や、Django を使っていて、Appengine も最初のリリース直後の Google Developer Day Japan 2008 から Appengine を触っています。 会社のウェブサイト 、社内アプリ、 個人で作ったサイト など、いくつか、 Appengine で動かしているアプリケーションを作っています。 僕は Python のエキスパートを務めますが、 Java に共有しているところ、Appengine のインフラ、APIなどの質問についても解答できます。ぜひ、 Twitter でフォローしたり、 Appengine Japan のメーリングリスト で質問したり、してください! 僕は日、日

  • Homepage - Ian Lewis

  • Appengine Matcher API

    Matcher APIはあるオブジェクトが登録したクエリーにマッチするかをスケーラブルにチェックしてくれるサービスです。 クエリーが既に登録しているから、あるオブジェクトが一つ一つの登録したクエリーにマッチするかが他のクエリーに依存しないので、 Map-Reduce で簡単に平行で処理を分担してスケールできる。 何に使うか これが少し分かり辛いところかもしれないので、少し説明します。クエリーを未然に登録するので、 Prospective Search (プロスペクティブ検索、展望検索、予測検索?) と言います。 みんな使っている、普段の検索は、Retrospective Search (遡及検索) です。クエリーが決まってないので、データをインデクスを作って、後でユーザーがデータを クエリーする形になっています。 プロスペクティブ検索は、未然にクエリーを決めて、そのクエリーにマッチするデー

    Ehren
    Ehren 2010/11/12
  • Pythonでメソッドをクラスまたはインスタンスに動的に追加する

    Pythonでは、あるクラスもしくは、クラスインスタンスに動的にメソッドを付けたいことがあります。Pythonコードでは、一般的に考えるとこういう風に書くって思いがちだけど、 class MyObj(object): def __init__(self, val): self.val = val def new_method(self, value): return self.val + value obj = MyObj(3) obj.method = new_method

    Ehren
    Ehren 2010/09/27
  • Django アプリサーバ、gunicorn と fastcgi の比較

    概要 最近、会社では、fastcgi より、 gunicorn を使うのがどう? といわれました。gunicorn を触ったことない僕は fastcgi のロードテストも実際やったことなくて、メソッドについて、(prefork がいいか、 threadedがいいか) の読んでいたものを元にした推測しかできない状態で、知識足りないと思った。 gunicorn は何かというと、python で作られた WSGI に対応するウェブサーバーです。同期、非同期ウェブアプリ両方対応できますし、作りがよくてかなりスピーディーそうですし、Django アプリを簡単に組み込めますし、python で運用が楽というのがポイントですね。もちろん、エンドユーザーが直接 gunicorn に接続するのではなく、 nginx のローダーバランサーでプロクシーのが一般的だと思っています。 テストアプリケーション という

    Ehren
    Ehren 2010/08/29
  • Google App Engine 1.3.6

    今日、 Appengine 1.3.6 がリリースされました。今回の大きいなリリースは以下の4つです。元のブログポストは こちら 1. データの名前空間API これは結構おもしろくて、データを名前空間を使うと、ユーザーのデータを完全に分けることができる。たとえば、xxx.jp と yyy.jp は自分が作ったアプリケーションを使っているとすると、 xxx.jp のデータと、 yyy.jp のデータを名前空間で分けて、そのユーザーは自分のバージョンを見ると、自分のデータしかみれない。というような仕組みが作れるようになりました。 日語のドキュメントがまだないみたいだけど、 PythonJava のドキュメントを見てみてください。 2. 高速画像サービング Picasa のインフラーを使っていて、リサイズ、切れ抜きなどの自動変換した画像を高速でサーブできるようになった。Python

  • Django 1.2 マルチ DB と master/slave レプリ

    Django 1.2 はマルチDB対応ができまして、master/slave レプリにも対応しているのですが、詳しく見るといろな問題が出てきます。 Django 1.2 のマルチDB対応は どのDBから、読み込むか、どのDBに書き込むかがDBルータで決める。しかし、そのルータで決める時点でリクエストオブジェクトにアクセスできないので、レプリラグのどを自動的に対応するのが難しい。 レプリケーションを使っている場合、マスターDB に書き込んだ時に、データがスレーブDBまで流れるラグがあるので、DBに書き込んだデータがすぐDBから取れない場合がある (eventual consistency)。 obj = MyModel.objects.create(content="Hello World") obj.content = "Hello World!" obj.update() # 失敗する可

  • Django 1.2 の変更のまとめ

    先週、 Django 1.2 が出ました。新しくて、良い機能がいっぱい入っているけども、1.1 からの変更をご紹介しようかと思っています。 マルチDB 1.2 では、一番大きい変更は明らかに マルチDB対応 ですね。 settings.py の DATABASE オプションは DATABASES になりました。それで python 辞書で複数のDBを設定する。 以下のように MySQLsqlite、PostgreSQL、それぞれ違ってても構いません。 DATABASES = { 'default': { 'NAME': 'app_data', 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'USER': 'postgres_user', 'PASSWORD': 's3krit' }, 'users': { 'NAME': 'use

  • ipython と virtualenv を同時に使う方法

    概要 python の皆さんはみんな使っている ipython は virtualenv を使う時に virtualenv に入っているモジュールをインポートできないことが起こります。 ipython は特に virtualenv に対応していないわけです。 ipython をグローバルじゃなくて、virtualenv 毎にインストールすると解決できるのですけど、 ipython を落とすのが重いし、PIP_DOWNLOAD_CACHE ( pipを使うべきだぞ ) を使わない限り、絶対にイライラする。 ipython と virtualenv を使う方法第一 ということで、第一方法は PIP_DOWNLOAD_CACHE を設定して、virtualenv を作る時に、virtualenvwrapper ( virtualenvwrapperも使うべきだぞ ) のフックを使って ipyth

    Ehren
    Ehren 2010/05/08
    便利!やってみる
  • 働くのをやめた人たち

    今日、MiCHiLU がこのリンクをTwitter に投稿した >> 働くことをやめた人たち 。いわゆるニートの話だけど、お金が困ったら、振込してもらったり、お腹空いたら、ご飯を奢ってもらったり、するという。 それを見たら、そういう生活はどうだろうと思いました。生きていけるお金があるだけで満足する人はどうしても、「怠け者」だと僕は思う。もし、会社のため、お金のために働くのが、哲学的に自分に合わないと思うなら、運が向かない人たちのため、貧乏の人たちのため、体が不自由の人たちのため、社会の改善のため、平等のため、働く理由がたくさんたくさんあると思います。 仕事は会社で「毎日嫌なことをやり続ける」ということではないと思う。人生は生きている時間だと思っています。それで、仕事人生の中に行う実績だと思っています。生きていけるだけで満足するのがあまりにももったいないと思うので、目的を探して、非営利の仕

    Ehren
    Ehren 2010/01/17
    「仕事は実績」すごくいい言葉。目から鱗がおちそうだ。
  • pytyrantはpython-tokyotyrantよりずっと速い

    夏のPython温泉 で Bob様 が作ってくれたピュアーパイソンクライアント pytyrant は 酒徳さん の python-tokyotyrant より速いという話を 聞いたと moriyoshiさん に言った。それで、moriyoshiさんはprofileのテストを作ってくれたけど、結果として、pytyrantとpython-tokyotyrantはあまり変わらないのが出た。</p> # http://www.smipple.net/snippet/moriyoshi/Benchmark%20code%20for%20pytyrant%20and%20python-tokyotyrant from cProfile import run import tokyotyrant from pytyrant import Tyrant class PyTyrantTest(object)

  • Appengine maintenanceが行われる時にメンテナンスページを出す方法

    Google Appengineのメンテナンス時間がある時、datastoreが読み込み専用になるのが多いと思いますが、データを書こうとする時に、CapabilitiesErrorと言う例外が起こる。それを自分のコードうまく処理しないと、500エラーがでて、ユーザには良くない表現になる。 ドキュメントがないけども、実は、Appengine SDKでmaintenanceが行ってるかどうかをチェックできる capabalities と言うAPIがあります。 メンテナンスがスケジュールされて、ある時間以内にメンテナンスを行うかをチェックします。僕は django を使ってるけど、capabilities API に特に依存がないですね。 from google.appengine.api.capabilities import CapabilitySet datastore_write = C