タグ

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

  • gevent ベースのサービス指向サーバーを作る

    非同期サービスフレームワーク ginkgo (docs) というものが今年の PyCon US で発表された。サービスを作るには、デーモン化なり、PIDファイルの作成なり、シグナルの処理なり、プログラムでやらないといけないことが多い。 Twisted フレームワークだと、サービスまわりの機能がありますが、 gevent ベースのサービスを作るには結構大変なので、 ginkgo というものが作られた。 ginkgo は Service クラスを提供して、そのクラスを継承して、サービスのことを実装するだけ。 簡単なウェブサービス まずは、WSGIベースの Hello World from ginkgo import Service from ginkgo.async.gevent import WSGIServer class HelloWorldWebServer(Service): def

  • Redmine で reStructuredText を使う方法

    我々BeProudのRedmineのWikiやチケットの説明文やチケットのコメント文にはReStructuredTextを使っている。 RedmineのデフォルトのTextileはPythonが好きな弊社で使うのは以ての外。なので、ReSTを使うようにした。 そして、生のReSTしか使わなければ、出来ることが少ないので、blockdiagや、コードの構文ハイライト(Pygments) を使っている。 Redmine はテキストフォマッターを入れ換えるように作られている。プラグインを入れるとWiki やチケットの内容のフォーマットを変えることができます。BeProud では Redmine reStructuredText Formatter の RbST/docutils ブランチを使っている。 http://glacialis.postmodo.com/posts/zyd1ig インスト

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

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

  • Tag: google

    Googleの新入社員として、 Google Cloud Platform チームで働くことになりました。 Developer Advocateとして、僕は、以前、 GDE としてやっていたことをGooglerとしてできるようになりました。 前のブログポストで、仕事が決まっていないと書い...

  • 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

  • App Engine 1.5.0 がリリースされました

    App Engine 1.5.0 のリリースはかなり大きくて、 App Engine はもっと広い範囲でホスティングプラットフォームになりつつありますね。 1.5.0 は下記のリンクでダウンロードできる。 http://code.google.com/appengine/downloads.html バックエンド バックエンドと言う機能がリリースされました。バックエンドは より制御出来るインスタンス。バックエンドは複数のインスタンス を作ることができます。直接ユーザーからリクエストを処理する こともできますし、普通のインスタンスからのリクエストのみを 処理するように設定できます。 バックエンドは2つの週類があります。 動的バックエンドはリクエストによって、インスタンス数が 増えたり、減ったりするタイプです。ですが、今のところは、 20インスタンスまで増える制限があります。 静的インスタンス

    dotred
    dotred 2011/05/19
  • Google Appengine 1.4.3 リリースされました!

    Google Appengine 1.4.3 水曜日に Google Appengine 1.4.3 がリリースされました! 1.4.1 と 1.4.2 はブログ記事を書くほど 大きくはなかったのですか、 1.4.3 はまたいろいろ入っているので、ご紹介します。 Prospective Search API 以前、 Matcher API のブログ記事 を書きましたが、 Trusted Tester リリースで出ていた Matcher API は 「Prospective Search API」という名前で開発者全員にリリースされています。 まだ、Labs機能で、正式リリースではない様ですけど、 モジュール名が変わっています。 from google.appengine.api import prospective_search def add_tweet_alert(user, twee

  • Python Hackathon 2011.02

    Python Hackathon 2011.02 に参加しに行ってきました。今回は、ちょっと遅く着いたが、楽しかった。 やったことはほとんどプレゼンの準備でした。発表したのは、Twistedで作られたロングポーリングチャットサーバの作り方についてでした。 #:coding=utf-8: import sys import json from functools import partial from time import sleep from twisted.web import server, resource from twisted.internet import reactor, defer from twisted.application import internet, service println = sys.stdout.write def chat_msg(reque

  • Google Appengine フレームワーク Tipfy の紹介

    (この記事は Python Web フレームワーク アドベントカレンダー2010 のために書いた 12/24 の記事です。 他の記事を読むには http://atnd.org/events/10465 をご覧ください) 私は普段、 kay フレームワーク を使いますが、最近、 Tipfy (http://www.tipfy.org) というフレームワークを試してみました。 Tipfy は Kay と同じく、 Google Appengine専用フレームワークです。 Kay は Django に似ているものの、 Tipfy は Appengine SDK の Webapp フレームワーク に 似ているように作りました。 インストール Tipfy は buildout という環境管理ツールの利用を推進しています。 まずは、 Tipfy の配布プロジェクトテンプレート をダウンロードします。

  • BPStudy #37

    昨日、BPStudyで、 Djangoアプリの実践的設計手法について発表をしました。 スライドをSlideshare にアップした。

  • 特定なDjangoモデルを別DBに保存するメモ

    今日、会社で特定なDjangoモデルを別のDBに保存するようなニーズがあって、Django マルチDBを使えるかなという話がありました。 この間、 Django1.2のマルチDBはレプリケーション対応に微妙 っブログに書きましたけど、ModelでDBを使い分けるのができるはずと思って、DBルータを書いてみた。 Monjudoh というモデルを ‘monjudoh’ DBに保存するためのDBルータです。 from monjudoh.models import Monjudoh class MonjudohRouter(object): def db_for_read(self, model, **hints): if issubclass(model, Monjudoh): return 'monjudoh' return None def db_for_write(self, model,

  • 1