投稿

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

Disqus のスケール - Django 編

イメージ
やり直し。2010 年の Django Con のスライド より。 Disqus は多くのサイトに組み込まれているサービスのため、メンテナンスによる停止が難しい。 >>> サーバの構成 エッジロードバランサーに HAProxy: heartbeat 構成。レポートが素敵。 HTTP ゲートウェイキャッシュに Varnish Django サーバとして Apache + mod_wsgi: 30 台ぐらい。メモリリークを防ぐために maximum-requests をセット。Ganglia で監視 キャッシュに memcached: 25 台ぐらい PostgreSQL ロードバランサーに HAProxy/ PgBouncer : コネクションプール用。 PostgreSQL: 10 台ぐらい。 Slony-I で非同期レプリケーションとフェイルオーバー。 ログは syslog-ng: pgFouine でスロークエリーをロギング。 全部でサーバ 100 台ぐらい。他にユーティリティサーバ 15 台、後は HAProxy と heartbeat 用に 20 台ぐらいの構成。Varnish と syslog-ng を除けば Django のデプロイ手順に掲載されているような教科書通り (良い意味です) の構成です。(なんで Apache なの?nginx + gunicorn 速いよって突っ込まれてますね >>> データベースのパーティショニング Django はアプリケーションレベルで簡単に 垂直 パーティショニングができます。アプリケーションごとに DB 分けたり、DB をアプリケーションレベルでルーティングできます ( ドキュメント )。 水平パーティショニング (a.k.a シャーディング) もアプリケーションで 書ける (なるほど・・・)。 >>> キャッシュの削除 Django は QuerySet の結果をキャッシュするけど、それがかなりメモリを消費する。なので SkinnyQuerySet を作った (たぶん Johnny Cache の方が有名?...

Disqus のスケール - Django で月間80億PVを処理する

私が把握してる限り Django で一番大きなサービス Disqus のスケール (執筆時点ではサービスダウンしてる)。元ネタは Scaling Django to 8 Billion Page Views です。 月間80億PV 、 45k req/s のほぼすべてのトラフィックを Django で処理しているとのこと。抄訳になるかな。 WAF は 高速開発とパフォーマンス 、 新しい人が入ってすぐに開発に参加できることとカスタマイズ 等のトレードオフがあります。この記事ではそのトレードオフである高速開発とパフォーマンスをどう両立させるか、Disqus のノウハウが紹介されています。 >>> なぜ WAF (Web Application Framework) は遅いのか 最初に思い浮かぶのは、アプリケーションに必要ではないボイラープレート ( django.contrib とか?) や不要なコードがあるため。そもそも Django の思想が Python 同様 " バッテリー同梱 (batteries included) " のため、Django は他の Python 製 WAF よりボイラープレートが多いです。Disqus 曰く "実は 言語や WAF は遅さにあまり関係ない " それより " ネットワーク内の他のサービスとの通信 " のオーバーヘッドが原因とのこと。これは一般的によく言われてることですし、大規模になればなるほどそう。Disqus の場合は PostgreSQL, redis, Cassandra , Memcached 等のサービスが使われているそうです。DB へのスロークエリーやネットワークのレイテンシーは Django のようなボイラープレートによるオーバーヘッドを軽く上回ります。この待ち時間を回避する一番メジャーな方法はキャッシュの使用です。Django では キャッシュフレームワーク を使用します。Django でキャッシュを使うのは簡単ですし、バックエンドに Memcached を使うと充分高速化できます。 はい。ここまでは一般的な話です。こっから。 >>> 45k req/seq を処理する キャッシュしたところで...

virtualenvwrapper でプロジェクト管理とか

ちょうど 1 年前にリリースされてた機能だけど、恥ずかしながら知らなかった。 @t2y 先生が 紹介 していらっしゃって、後で試してみようと思ってたのですが...。 virtualenvwrapper ってインストール時にグローバルな site-packages に放り込んで、後は。。。って感じ。あんま見直したことなかったのですが、プロジェクト管理以外にも結構色んな機能が追加されてるんですね。 mkvirtualenv , workon だけじゃない! ドキュメントを 和訳 してくださっている @t2y さんに多謝。基本的な機能やコマンド (と思いこんでいた mkvirtualenv , workon , etc...) については virtualenv, virtualenvwrapper, pip を使う方法 by @IanMLewis さん, Pythonを取り巻く開発環境 (PyCon JP 2012資料 #pyconjp) by @ymotongpoo さんの記事が参考になります。 >>> mkvirtualenv v3.3 から新しい オプション が増えてたんですね。これも知りませんでした。 -a <path/to/project> : プロジェクトに新しい env を関連付ける (後述) -i <library_to_install> : env 作成と同時に、インストールしたいライブラリを指定する mkvirtualenv -i django -i django-celery-with-redis <env_name> のように複数指定できる -r <path to requirements file> : env を作り requirements.txt 等指定したファイルに記載したライブラリを一括でインストールできる。個人的にこれは一番うれしいかも mkvirtualenv -r ./requirements.txt <env_name> ラクダーーー >>> mktmpenv これも v3.3 から。ユニークな名前で env 作成してくれる。 >>> cdvirtualenv , cdsi...

Django と Python 3 - #python_adv

Django-ja の方からきました。こんにちわ。さて、昨日の Ian 先生のブログ にも書いてある通り、ついに Django にも本格的に Python 3 の足音が近づいてきました。ただし現在 alpha 版が公開されている 1.5 では "実験的" なサポートで、1.6 以降で正式にサポートする予定となっています。あくまでも "実験的" であり、プロダクションでの利用は "非推奨" となっています。Django コミュニティでは、この 1.5 でサポートをテストしてもらい、そのフィードバックを呼びかけています。なのでプロダクションでの利用は 1.6 まで待ちでしょうね。また Python 3 サポートと同時に、Django 1.4 では Python 2.4 がサポートから外れ、1.5 では Python 2.5 がサポートから外れます。これで 1.7 以降から django.utils 配下が軽くなっていくんでしょうかね (現在は 3 サポートのためにさらに増えてる)。 バージョン 下位互換 Python サポート 2.5 2.6 2.7 3.2 3.3 Django 1.4 > 1.2 ○ ○ ○ - - Django 1.5 > 1.3 - >= 2.6.5 ○ >= 2.7.3 △ 実験的 △ 実験的 Django 1.6 > 1.4 - >= 2.6.5 ○ >= 2.7.3 ○ ○ Python 2.5 系を利用している場合は、1.6 のリリースまで (2013 後半ぐらい?) に Python 2.6.5 以上 (2.7.3 以上を強く推奨) への移行が必要です。1.5 は今月 (2012/12) 中にリリース予定とのことなので、今のうちに Python 3 へ移行方法を抑えときたいなと。以下 Django ドキュメントの翻訳作業がてら " Porting to Python 3 " を元にご紹介。さすが...

Dropbox のスケールとか

イメージ
Python なサービス みんな大好き Dropbox のスケールとかメモ。以下のページ辺りからピックアップ。Parted? みたいなので、続編がでたら追記するかも。 Scaling lessons learned at Dropbox, part 1 ( comment ) Dropbox - Startup Lessons Learned (slideshare) Dropbox -Yコンビネーターが生んだスタートアップの軌跡と未来 - スケール関係ないですが、 2006 年当時はオンラインストレージサービスがいっぱいあった ようで、VC から資金調達したときのやり取りがおもしろい VC "クラウドストレージサービスなんて腐るほどある" Drew "なにか使ってるのありますか?" VC "NO" Drew "..." 完璧で、スケーラブルで、クロスプラットフォームなクラウドストレージ!当時、プライベートベータのビデオが 12000 digg (<- 懐かしい) され、ベータリストの登録が 1 日で 5 千人から 7 万人に増えたことも。 現在 、 5000 万人のユーザ が、 2 億 5 千万デバイス から、 48 時間で 10 億ファイル 保存してるとのこと。 ファイルの POST/PUT で 5787 rps となると GET を合わせると。。。すごいですね! スケールの記事を書かれているのは、2011 年まで Dropbox でスケールを担当されていた Rajiv Eranki (← URL w) 氏です。Dropbox のバックエンドはほとんど 1 ~ 3 人で面倒を見ていたとのこと。順不同で以下抜粋。なお、Dropbox さんは有効であるのは間違いないですが、ストイックと思われる箇所もあるので、18 最未満の方は保護者の同意の下w >>> 利用しているテクノロジー 言語: ほとんど Python, ちょっとだけ C データベース: MySQL WSGI: Paster / WAF: Pylons / テンプレートエンジン: Cheetah ファイルブロックの保存と提供: S3/EC2 キャッシュと...

Python の新ユニットテストフレームワーク (or unittest2)

これは Python3 Advent Calendar の記事です。夢はテストエンジニアです!ということでユニットテストについて書きます。 Python3 縛りとのことですが、この新ユニットテストフレームワークは Python 3.2 以降と 2.7 以降が対象です。これ以前のバージョンでこの新ユニットテストフレームワークを利用したい場合は、それぞれ unittest2py3k (3 系)、 unittest2 (2 系) というバックポートが用意されています。新ユニットテストは mock や IronPython 等の開発者としても知られている Michael Foord 氏を中心に開発されました。 >>> Python とユニットテストの歴史 Python のユニットテストは、1999 年 xUnit ファミリーの PyUnit として開発され、2001 年に公開された Python 2.1 から unittest として標準ライブラリとなりました。それ以降、アップグレードといえば assert* メソッドの追加や削除といった感じ。PyCon 2010 での Michael Foord 氏の プレゼンテーション によると " Python には革新的なテストインフラが数多くありますが、unittest は標準ライブラリという理由により最も利用されているテストフレームワークです。しかし、他のテストフレームワークが革新的な進歩を遂げている中、unittest は遅れを取っています "。 しかしついに、ユニットテストは Python 3.2, 2.7 で革新されることになりました。それも Python らしく "後方互換" がかなり意識されています。これも Michael Forrd 氏の言葉を借りると " これは革命ではなく、 進化 です "。 >>> どこが "進化" したのか 新ユニットテストフレームワークには以下の機能の追加や更新が行われています。 便利な assert* メソッドの追加 名称の統一、重複の排除 コマンドラインからの制御をより便利に / 或いはディスカバリ テストのスキップ モジュールレ...

PyPy における Python のパフォーマンスチューニング

イメージ
これは PyPy Advent Calendar の記事です。PyPyのコアディベロッパーである " Maciej Fijalkowski " 氏のブログ " Analysing python's performance under PyPy " の抄訳+αです。 Python の一般的なパフォーマン解析のモデルは、" プロファイラ を実行して、ボトルネックを探し出し、それを最適化するか C で書き直す" ことです。しかし PyPy ではこのアプローチだけでは不十分です。なぜなら、 多くの大規模アプリケーションで、プロファイラはフラットです: PyPy のトランスレーションツールチェーン、Twisted、モダンな Web サーバ等が良い例です ボトルネックを発見したとしても、それが特定の関数内でのみ遅いのか、複数の関数が関係しているのか明確になるわけではありません。どうすれば遅くて、どうすれば速くなるかは CPython においても明確な答えはありません。JIT が適用されるとさらに複雑です。 JIT が特定のコードをどのようにコンパイルしたかを確認することが重要 になります。 パフォーマンスにおいては、特に GC 関連の問題は多くの関数に影響がありますが、プロファイルでは確認できません。 PyPy には、問題を解決するためのいくつかのツールが提供されています。プログラムのパフォーマン解析に関するいくつかの方法を示します。これはガイドラインであり、 銀の弾丸 ではありません。アプリケーションが複雑な場合は、多くの 鉛の弾丸 が必要でしょう。 >>>> テストを作成する これは品質に関するものではありません。多くの自動化されたテストを受けることで、その機能を失うことなく、よりパフォーマンスの高いコードにリファクタできるようにします。 >>>> ベンチマークを書く これが重要な出発点となります。ひとつのスクリプトで、できれば引数を指定して、変更の影響を測定できるようにする必要があります。 1 回だけしか実行されないスクリプトでない場合は、同じテストを繰り返し実...

PyPy! - PyPy Advend Calendar

イメージ
今年も Advent Calendar の季節が始まりました。この記事は Python を高速化するソリューション PyPy の Advent Calendar  の記事です。最初なので、簡単に PyPy の概要と PyPy-ja のご紹介をしたいと思います。 >>>> PyPy ってなんなの? @nati nati ueno PyPyは日本語で、おっぱいの意味なんだよ ってUSのpythonやってるエンジニアに教えたら「今日ほどいい日はない!って大喜びしてた」 Oct 06 via web Favorite Retweet Reply PyPy は Python 2.7.1 互換の高速な処理系です。現在、着々と py3k 対応の開発も進んでいます。Python 標準処理系である CPython と比較して以下のような特徴があります。 速度 : とにかく速いです。JIT パワーです。CPython と PyPy の速度は ここ に公開されています。現在は CPython の 5 倍ぐらい速いですね。特定の環境では Java より速いという 計測結果 もあります。ちなみに先日 Win32 環境で同じ計測をしましたが、Win32 環境では pypy 1.6 以降で Java よりも高速という 結果 がでましたよ。残念ながら 1.7 より 1.6 の方が高速という結果でしたが。。。 メモリ使用量 : 多い。ほんとにメモリ食います。JIT の作者 Antonio 氏に Python 生みの親の Guide (oh...) Guido 氏が "PyPy の JIT はなんで速いの?" と質問した時に、"オブジェクトが持っているデータをメモリ上の固定位置に配置してるのが効いているみたい" と答えたとのことです ( ats さんのブログより )。なるほど。 互換性 : 一部制限がありますが Python との互換性は高いです。1.7 になってさらに互換性が高まっています。動作する Python ライブラリは ここ にまとまっています。"このライブラリも動いたよ!" って方は是非この Wiki を編集してみてください。Django, Flask, Pyram...

PySide チュートリアル - helloworld から ユニットテストまで

ここ 2 ヶ月ほど PySide でお仕事してました。もともと PyQt で動いてたアプリケーションだったのですが、けっこう仕様変更が大きかったこともあり、どうせなので PySide で作り直してみることにしました。両フレームワークの差異は このページ にまとまっています ( id:doloopwhile さんが翻訳されています)。大きくは、 モジュール名が PyQt から PySide に PyQt の API は QString や QVariants 等 Qt が提供する型と、unicode 等 Python のデータ型の両方をサポートしていましたが、PySide では Python のデータ型のみをサポート 画像等のリソースファイルをバイナリに変換したりするツール類の名称がそれぞれ変更 pyuic4 -> pyside-uic pyrcc4 -> pyside-rcc4 pylupdate4 -> pyside-lupdate PySide への変更はそんなに問題ではありませんが、まだ開発中ということもあり、pyside-rcc4 にバグがあったり、 signal-slot が遅いということもあるようです。この辺りは今後に期待です。 ということで自分の復習 & メモと、PySide がちょっとでも普及すればいいなということで、PySide のチュートリアルを作ってみました。helloworld ということで、ボタンをおしたらテキストボックスに "Hello world" と表示するだけのなんの面白味もないウィジェットと、そのユニットテストを作ってみます。ソースは bitbucket に公開しました。 環境を整える インストールするもの Python Python for Windows extensions (Windows ユーザのみ) PySide 推奨 virtualenv - py2exe でフリージング (実行ファイル形式に変換) する際に余計なライブラリが含まれるのを防ぐため ウィジェットを表示してみる Python インタプリタから以下のように打つと、ダイアログを表示することができます。 import sys from...

Python で Windows のプリンタスプールを削除する

Windows XP で印刷をキャンセルしたり、印刷キューに残っている印刷ジョブを削除したりする方法 (KB946737) のメモ import os import win32serviceutil # スプールファイルの保存先 spooled_dir = os.path.join( os.environ.get('SYSTEMROOT', r'C:\WINDOWS'), 'system32', 'spool', 'printers', ) win32serviceutil.StopService('spooler') for f in os.listdir(spooled_dir): os.remove(os.path.join(spooled_dir, f)) win32serviceutil.StartService('spooler') StopService の後もプロセスがしばらくファイルをつかんじゃって消せない場合もある

Python 環境構築メモ (2.6 系)

環境構築 Python 2.6 系 ( 2.6.6 - 2011-05-31 現在) をインストール ※ Windows の場合 pywin32 をインストール Visual C++ 2008 Express Edition をインストールし、Path に" C:\Program Files\Microsoft Visual Studio 9.0\VC " を追加する distribute をインストール # Linux curl -O http://python-distribute.org/distribute_setup.py python distribute_setup.py 必要であれば ipython 等共通にしておきたいライブラリをインストール easy_install -U ipython PyReadline 参考: ipython と virtualenv を同時に使う方法 virtualenv , virtualenvwrapper をインストール easy_install -U virtualenvwrapper Windows の場合は、 virtualenvwrapper-win を \path\to\Python26\Scripts に保存する プロジェクト毎のvirtualenv を作成 mkvirtualenv <name> プロジェクトに必要なライブラリをインストールする pip install simplejson foo bar ... ※ Windows 環境では以下のライブラリはバイナリインストール ? mysql-python cx_Oracle ( 4.4.1-9i , 5.1-10g , 5.1-11g ) virtualenvwrapper の利用方法 新規作成 mkvirtualenv <name> 削除 rmvirtualenv <name> 利用 workon <name> 一覧 lsvirtualenv

10 分で学ぶ Python のチュートリアル

" Stavros' Stuff " というサイトに掲載されていた " Tutorial - Learn Python in 10 minutes " という記事の 妙訳 翻訳 です。これから Python をはじめたいという方向けです。ちょっと分かりやすいように ? 補足情報も付加しちゃってます。ついでに私が Python を書くときに意識していることも付加しちゃってます。付加情報が間違ってたらごめんなさい >< プロパティ Python は 強い型付け (strongly typed language)、 動的型付け (dynamically typed)、 暗黙的型付け (implicitly typed)、 大文字小文字を区別 (case sensitive)、 オブジェクト指向 (object-oriented) です。 強い型付け言語の特徴: 処理や演算が間違った型の引数を受けとることが出来ない (C 言語とかは弱い型付け)。安全ですね。 動的型付け言語の特徴: 型の検査を実行時に行うことが多い。簡単に言うと、型は変数ではなく値に付けられます。 暗黙型付け言語の特徴: 明示的に指定しなくてもコンパイラが自動的に型変換を判断してくれる ヘルプ Python のヘルプは常にインタプリタから利用する事ができます。もし、オブジェクトの動作について調べたい場合は、 help(<object>) を呼び出しましょう。また、 dir(<object>) でオブジェクトのメソッドや変数等のメンバ一覧を参照したり、 <object>.__doc__ でドキュメントを参照するのも便利ですよ。 >>> help(5) Help on int object: class int(object) ... >>> dir(5) ['__abs__', '__add__', ...] >>> print abs.__doc__ abs(number) -> number Return the absolute value of the argument...

WSGI on Qt (PyQt or PySide)

イメージ
こんにちは、Python 会の。。。思いつきませんでした。初 " Python Web フレームワーク アドベントカレンダー2010 " に参加させていただくことになりました。よろしくおねがいします。アドベントカレンダー参加者のブログは cielquis.net に綺麗にまとめられていますよ。 ごめんなさい。Web アプリケーションフレームワークの作成なんて 1 日じゃむりぽ><。メインで使ってるフレームワークは、 Django か webapp ぐらい。。。最近 dis られてるので、Django 記事書くのもあれだ・・・。 ということで本題です。Python は WSGI (Web Server Gateway Interface) という Web アプリケーションと Web サーバ間の共通インターフェースがあります。そのインターフェースを実装したオブジェクトは、Web アプリケーションとして動作させることができます。ということで、デスクトップアプリケーションを Web アプリケーションにする方法を書きたいと思います。今回は Qt の Python binding な PyQt / PySide で WSGI アプリケーションを作ってみたいと思います。実装は PySide ですが、 PyQt でも動くはずです。 STEP1: PySide で Hello World! ほんと Web アプリケーションじゃなくて申し訳ないですが、最初に PySide で "Hello World!" を表示します。 import sys from PySide import QtCore, QtNetwork, QtGui class QWSGILabel(QtGui.QLabel): def __init__(self, text, parent=None): super(QWSGILabel, self).__init__(text, parent=parent) class QHttpWidget(QtGui.QWidget): def __init__(self, parent=None): super(QHttpWidget, self).__init_...

Python で Skype にロギングする

イメージ
id:moriyoshi さんが " Linux上で動くSkype用のbotを作る方法 " というブログを書かれていたので便乗します。会社で Python から Skype へログを出力するためのハンドラーを試験的に使っていました。便利ですが、利用はお勧めしません。理由は最後に書きます。 コードはこんな感じになります。 # -*- coding: utf-8 -*- # skype_handler.py from logging import Handler try: import Skype4Py skype = Skype4Py.Skype() except: skype = None if skype and not skype.Client.IsRunning: # Skype が起動してなかったら起動する skype.Client.Start() class SkypeHandler(Handler): u"""Skype 用ハンドラ Args: group_name - Skype group name encoding - encoding (Default: 'utf-8') この例では、ブックマークしたグループに対してログを出力します。 `get_chat` を変えたら個人に送信できたりします。 """ @staticmethod def get_chat(group_name): u"""指定したグループ名のチャットをブックマークから取得""" if skype is None: return None for chat in skype.BookmarkedChats: if chat.FriendlyName == group_name: return chat return None ...

PySide for Windows

イメージ
PySide の Windows 版が公開 されました。PySide は Qt (Nokia 製のクロスプラットフォームな GUI ツールキット) の Python binding です。もともと Qt の Python binding は PyQt というのがありました。Qt のライセンスは 4.5 から GPL / LGPL / 商用ライセンス ( 日本での価格 ) になったのですが、PyQt の ライセンス は GPL / 商用ライセンスとなっています。商用ライセンスで使うためには、けっこう高いお金を払わないといけないです。GPL だと、PyQt を利用するすべてのアプリケーションは GPL にしないといけません。ML で "金を払うから LGPL にしろ!" と言ってる方もいらっしゃいましたね。でもいろいろと難しかったようで、Qt 作者の Nokia さんが LGPL 対応の Python binding をフルスクラッチしたのが PySide です。 さっそく開発している PyQt アプリケーションの branche を切って、PySide 化始めました。これを機に、もっと Qt と Python が流行ればいいと思います。 PySide for Windows な記事 philo 式さんのブログ Slashdot