投稿

2011の投稿を表示しています

Redmine のリポジトリ全文検索プラグイン

メリークリスマス!でしたね。今年のクリスマスは ruby を書いて過ごしました。えぇ。ついに ruby デビューです。 作ってたのは Redmine のリポジトリ全文検索プラグインです。会社のプロジェクト管理サイトを Trac から乗り換えるにあたり、これ!ってのが見つけられなかった情弱です。 Trac では、full-text サーチエンジンに Hyper Estraier を使う  TracRepoSearch  という素晴らしいプラグインを使ってました。ということで、便乗して redmine_reposearch というプラグインを作って見ました。バックエンドも同じく Hyper Estraier です。  個人的に欲しかった機能は、 インストールステップが簡単 プロジェクト、サブプロジェクト、全プロジェクト間で検索できる Redmine のアクセス権管理に対応する MIME タイプを限定して検索する (今後実装予定) です。ある程度は満足がいく出来に作ることが出来ました。インストール方法等は wiki にまとめました。わかりにくかったらお気軽に Issue か Twitter でお申し付けください。 # インストールステップは 2 ステップ これは結構苦労しました。いろんな OSS 検索エンジンの仕様を調べ、一番インストールが簡単で、動作が軽快で、気の利いた ruby バインディングがあるやつを選びました。 ライブラリのインストールとプラグインのインストールのみで動作します。 Estraier の DB は RAILS_VAR/reposearch 以下にプロジェクト毎に作成されます。Ubuntu の場合は、 /var/lib/redmine/reposearch になります。クラスタ組みたい場合は、 RAILS_VAR はアップロードファイル保存ディレクトリでもあるので、ネットワークファイルシステムをマウントするなどすればいいと思います。 あと SCM との連携は fetch_changesets と同じ仕組を流用しています。まだ ruby script/runner "Repository.fetch_changesets" -e production のようなコマンドでは動きません。 /

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 回だけしか実行されないスクリプトでない場合は、同じテストを繰り返し実

[memo] Ubuntu 11.10 (kernel 3 系) にアップグレード時の注意書き

kernel 3 系ではディレクトリツリーが整理されています。しかし、現在のところ Ubuntu 11.10 にアップグレードしても、新ディレクトリツリーに完全に対応してくれません。ちなみに新規インストールの場合は問題ありません。 以下の手順で新ディレクトリツリーに対応します。 新ディレクトリへ移行 sudo mv /var/run/* /run/ sudo mv /var/lock/* /run/lock/ sudo rm -r /var/run sudo rm -r /var/lock sudo ln -s /run /var/run sudo ln -s /run/lock /var/lock sudo rm /run/dbus/* 参考 apparmor の権限を更新 例) /etc/apparmor.d/usr.sbin.mysqld の場合 --- /var/run/mysqld/mysqld.pid w, --- /var/run/mysqld/mysqld.sock w, +++ /{,var/}run/mysqld/mysqld.pid w, +++ /{,var/}run/mysqld/mysqld.sock w, その他設定ファイルの見直し sock ファイルとか pid ファイルの設定は見直したほうがいいです VMWare 上にインストールしている場合は、ライブラリが競合するので blacklist に以下を追加する。 # sudo vi /etc/modprobe.d/blacklist.conf blacklist i2c_piix4 参考 pam が更新されているので、依存してるアプリケーションの更新が大変ですね。。。

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 の後もプロセスがしばらくファイルをつかんじゃって消せない場合もある

dotcloud いいね!環境編

引き続き dotcloud。環境の私的覚書など。途中 (必要になったら書くかも)。 CPU Intel(R) Xeon(R) CPU - X5550 @ 2.67GHz * 4 ( /proc/cpuinfo ) メモリ 35031888 kB ( /proc/meminfo ) ディスク Filesystem 1K-blocks Used Available Use% Mounted on rootfs 1056888712 66780428 936421464 7% / none 1056888712 66780428 936421464 7% / /dev/sdh1 1056888712 66780428 936421464 7% /home/dotcloud varrun 4096 32 4064 1% /var/run varlock 1024 0 1024 0% /var/lock shm 65536 0 65536 0% /dev/shm OS debian 6.0 - squeeze/sid (sid ?!) Linux version 2.6.38.2-grsec-dotcloud-ec2 (root@ebichu) (gcc version 4.3.2 (Debian 4.3.2-1.1) ) Java Java(TM) SE Runtime Environment (build 1.6.0_24-b07) Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode) Jetty jetty-6.1.22 Python Python 2.6.5 ライブラリ (/usr/lib/python2.6/dist-packages) ANSI debconf duplicity fdpexpect

dotcloud いいね!jenkins 編

2012/05/11 更新: こっち の方が簡単 プライベートなコードは github, bitbucket などなどのオンライン VCS にホスティングしてますが、 CI もホスティングできないかなーと。そこで dotcloud ですよ!しばらく招待待ちでしたけど、今は普通に signup できるようになってます (beta から cli が結構変わってる...) 。 cli のセットアップとかは 本家ドキュメント に載ってるし、いろんな ブログ に載ってます。ただファイル転送が rsync ベースなので win ユーザは cygwin いれたりちょっとめんどい。speier さんが win 用 cli のインストーラを github に公開されてる (多謝) ので使うといいと思います。 でも動かないので、パッチを当ててコンパイルしたのを dropbox 上においてます。speier さんのやつをインストール後、dotcloud.exe を入れ替えてください。 マージしていただきました。ありがとうございます。 dotcloud の java サーブレットコンテナは jetty です。jenkins を jetty にデプロイする場合は JENKINS_HOME を設定しないと動きませぬ ( 参考 )。あたりまえですが、dotcloud の /etc/jetty/jetty.xml の書き換えなんてできません。 ここ をみて、なんとかホームディレクトリを変更しようと web.xml とか書き換えてみたんですけど、 dotcloud 上 (jetty 上?) じゃ動きませんでした。。。なので、jenkins が dotcloud で動作するよう fork しました。 /home/dotcloud ってディレクトリがあったら /home/dotcloud/jetty/.jenkins ってのを JENKINS_HOME にするようにしただけです。いちおう ここ で動かしています (ログインが必要ですw)。war は同じく dropbox 上においてますので、使いたい方はぜひ。 インストール方法 プロジェクトディレクトリの作成 mkdir <dotjenkins> プロジェクトディレクトリに jenkins.wa

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

SVN リポジトリ間で特定ディレクトリの移動

いつも忘れるのでメモ svnadmin と svndumpfilter を利用する。 svndumpfilter で dump から特定ディレクトリを抽出 svnadmin dump /path/to/svn/repo | svndumpfilter include /path/to/project/trunk > project.dump svnadmin で移行先のリポジトリにロード cat project.dump | sudo svnadmin load /path/to/svn/old 移動元リポジトリの階層は維持される。

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