2010年12月23日木曜日

Python 3.1.3 と 2.7.1 をインストールしてみた

先月末ぐらいに Python 3.1.3 と 2.7.1 がリリースされていたのですが、インストールするのをすっかり忘れていたので、「Python専用ユーザでPythonバイナリを隔離してみた」の手順+αでMac OS Xにインストールしてみました。

以前との変更点は、バージョンが上がったこと以外は、
  • Pythonのインストール先を ~python/local にすると、Python3.1.2とPython3.1.3のライブラリのインストール先が両方とも ~python/local/lib/python3.1 になって混ざるので、インストール先を ~python/local/(Pythonのバージョン番号) にしてみた。
  • Python3系用のvirtualenvとして、今まで使っていたvirtualenv3の代わりにvirtualenv5を使ってみた。virtualenv5はvirtualenv3のforkで、distributeの最新バージョンを使っているのとコマンド名がvirtualenv3ではなくvirtualenv5なのが違うだけ。
の2点です。

手順はイカの通りですが、Python専用ユーザを作るまでの手順については以前のエントリをご覧ください。

2010年12月21日火曜日

Facebookが本人認証に友達の顔写真を使う本当の理由

※本エントリは脳内事実認定を元にした、コタツ記事です。


VirtualBoxで仮想ディスクのサイズを減らしてみた(4)

(1)、(2)、(3)と続いたエントリも今回で最後です。

仮想ディスクの掃除が完了しましたので、ホストOSのコマンドラインからVirtualBox付属のVBoxManageコマンドを使って、仮想ディスクのファイルサイズを縮小します。

仮想ディスクはスナップショット毎に、.vdi形式の差分ファイルが生成されます。VBoxManageコマンドは差分ファイル単体を個別に指定してサイズを縮小できますが、指定できるのは常に単一ファイルです。したがって、仮想ディスクに関係するファイルを一括で指定して、まとめてサイズを縮小するようなことはできません。対象ファイルのファイル名は、仮想メディアマネージャを使って一つ一つ調べることになります。これが本来のやり方です。

しかし、Mac OS X版のVirtualBoxの仮想メディアマネージャは、複数の仮想マシンそれぞれにスナップショットがある場合に、仮想ディスクを正しくツリー表示できないようです。信頼できない情報を元に作業を続けたくはありません。

そこで今回は、コマンドラインからVBoxManageコマンドで仮想ディスクの全ファイルのリストを出力し、仮想マシン名とスナップショット名を元に対象ファイルを探す方法を紹介します。

VirtualBoxのスナップショット名は、複数の対象に同じ名前をつけられますので、今回は念のため、一意のIDであるUUIDを極力使うようにします。

なお、仮想マシンのある時点の状態を保存するスナップショットのUUIDと、そのスナップショットの時点での仮想ディスクの状態を表すUUIDは別物ですので注意してください。仮想マシンには仮想ディスクが複数接続されている事もありますので、スナップショットと同じUUIDはつけられません。

実際の手順はイカの通りです。

作業に慣れてくれば、直接Snapshotフォルダに移動して、ファイルの日付とサイズから対象ファイルを推測するような手抜きもできるのですが、読者の方々にとっては今回が初めての作業のはずですし、失敗した場合の被害も大きいので、多少面倒でも確実な方法を紹介します。

2010年12月13日月曜日

VirtualBoxで仮想ディスクのサイズを減らしてみた(3)

前回前々回からの続きですので、先にそちらをご覧ください。

・空き領域をゼロクリアする。

swap領域のゼロクリアが完了しましたので、次は既にインストール済みのzerofreeコマンドを使ってディスクの空き領域をゼロクリアします。

zerofreeはext2/ext3ファイルシステムに対応したツールと紹介される事が多いので、ext4ファイルシステムには未対応という誤解もあるようですが、実際には作者であるR M Yorston氏のページにも記載があるように、ext4にも対応しています。

ただし、ext4への対応は、zerofreeが依存しているe2fslibsパッケージがext4にも対応していることが前提になります。今回はUbuntu 10.10のzerofreeパッケージを使用していますので、その点については問題はありません。

次に、zerofreeの実行対象となるパーティションは、マウントが解除されているか、読み込み専用でマウントされている必要があります。逆に言えば、元々マウントされていなかったパーティションをzerofreeを実行するためにわざわざ読み込み専用でマウントする必要はありません。

読み込み専用で再マウントが必要なのは、コマンドの実行のためにマウントを解除できないパーティションに対してzerofreeを実行したい場合です。この場合、事前にいくつかのサービスを停止しておかないと再マウントが失敗することがあります。

実際の作業はイカの通りです。

2010年12月8日水曜日

VirtualBoxで仮想ディスクのサイズを減らしてみた(2)

前回からの続きです。

・swap領域をゼロクリアする

不要なファイルの削除が終わったので、ここからはシングルユーザーモードに移行して作業を続けます。次に実行するのはswap領域のゼロクリアです。

仮想マシンのメモリに余裕があってswap領域をほとんど使っていないような場合でも、ゲストOSでシステムのハイバネートを実行していれば、メモリイメージがswap領域に書き込まれます。

一度swap領域に書き込まれた内容は、明示的に消去しない限りそのまま残っていますので、それをゼロクリアすることで仮想ディスクのサイズを減らすことが可能です。

ただし、正確に言えばここでゼロクリアするのはswap領域ではなく、swapパーティション(またはswapファイル)全体です。

swapパーティション全体をゼロクリアすれば、スーパーブロックやswapヘッダもその対象になりますが、そこにはパーティションのUUIDやラベルが記録されています。

最近のLinuxは使用するswap領域をUUIDやラベルで判断するようになっていますので、ゼロクリアした後に元のUUIDやラベルを付け直しておかないと、swap領域として使用されなくなる場合があります。

それを避けるため、手順としては、wipefsコマンドで調べたUUIDとラベルをあらかじめメモしておいて、パーティション/ファイル全体をddコマンドを使ってゼロクリアした後にmkswapコマンドでUUIDやラベルを含めてswap領域として初期化することになります。

swapヘッダには他にもページサイズやswapバージョン等が記録されていますが、ページサイズはカーネル次第ですし、最近のカーネルはバージョン1のswap領域しか利用できなくなったので、メモする必要はありません。

なお、複数のOSでswapパーティションを共有している場合や、パーティションのサイズだけを後から変更してパーティションテーブルに誤った情報が記録されているような場合、swapパーティション全体をゼロクリアすることで問題が発生することがあります。

VirtualBoxの仮想ディスクでそのような運用をしていることはあまり無いだろうとは思いますが、心当たりがある方は一応ご注意ください。

2010年12月3日金曜日

VirtualBoxで仮想ディスクのサイズを減らしてみた(1)

VirtualBoxの仮想ディスクは、容量を減らすために「可変サイズのストレージ」を選択していても、そのファイルサイズがゲストOSが実際に使用している容量以上のサイズになることがあります。

これは、ゲストOS上で仮想ディスクに一度作成したファイルを削除した場合、ゲストOSはファイルを削除したことで空き容量が増えたと報告しますが、仮想ディスクにはそのファイルのデータが残ったままになっているからです。

結果として、ゲストOS上でファイルの作成と削除を繰り返すと、ゲストOSが実際に使用している容量とは無関係に、仮想ディスクが最大サイズまで消費され続けるようなことになりかねません。

この問題を解決するために、仮想ディスクに記録されている削除されたファイルのデータ部分をゼロクリアで初期化してから、VirtualBoxのVBoxManageツールを使って仮想ディスクのファイルサイズを減らす方法がTipsとして知られています。

上記の話はVirtualBoxのマニュアルにも記載されているので、作業の手順自体は以前から知っていたのですが、実行する必要には迫られなかったので実際に試してみたことはありませんでした。

しかし最近になって、どこぞのVPSのバックアップの際にバックアップファイルのサイズを減らす必要が発生するんじゃないかなーという予感が何となくしてきた(予感なので根拠は特にありません)ので、その練習代わりにこの作業を試してみることにしました。

尚、今回作業を実行した環境は、

  • ホストOS:Mac OS X 10.6.5
  • ゲストOS:Ubuntu 10.10 Desktkop Edition
  • 仮想化ソフトウェア:Oracle VM VirtualBox for Mac OS X Ver.3.2.12 r68302

という構成です。

ホストOSはWindowsであっても、作業手順はあまり変わらないと思いますが、ゲストOSはUbuntuのバージョンが変わっただけでも手順が変わってくることがありますので、実際に試してみようと考えていらっしゃる方はご注意ください。

仮想化ソフトウェアであるVirtualBoxの方は、バージョンが多少違っていても問題ありません……と言いたいところなのですが、VBoxManageツールのコマンドは結構コロコロ変わりますので、バージョンが異なる場合はマニュアルで確認しておくことをオススメします。

実際の作業はイカの通りです。

2010年11月29日月曜日

【追記あり】SONYのSNAP SDKをインストールしてみた(3)

2010/11/30 23:55追記
田中俊光さんのその後の調査によって、SNAPは始まったばかりのプロジェクトでもアクティブなプロジェクトでもなかったことが判明しています。下記の内容については特に修正はしていませんが、読者の方にはSNAPプロジェクトについての誤解を防ぐために田中さんのエントリ「お詫びと訂正:SONYのSNAPについて」を先に読んでおくことを強くオススメします。

まずは前回の訂正から

前回、私は「SNAPエミュレーター」と記載したのですが、実際には田中さんからの指摘があったように、SNAPシミュレーターの間違いでした。申し訳ありません。


2010年11月27日土曜日

【追記あり】SONYのSNAP SDKをインストールしてみた(2)

2010/11/30 23:55追記
田中俊光さんのその後の調査によって、SNAPは始まったばかりのプロジェクトでもアクティブなプロジェクトでもなかったことが判明しています。下記の内容については特に修正はしていませんが、読者の方にはSNAPプロジェクトについての誤解を防ぐために田中さんのエントリ「お詫びと訂正:SONYのSNAPについて」を先に読んでおくことを強くオススメします。

前回からの続きで、Mac OS XでSNAP SDKに含まれるSNAPエミュレーターを実際に実行してみます。

SNAPエミュレーターはSNAP SDKがインストールされたUbuntu 9.10からしか起動できないので、Mac OS X上で動かしたい場合は、Ubuntu 9.10が動作する仮想マシンを用意して、そこにSNAP SDKをインストールしてからSNAPエミュレーターを起動することになります。

仮想化ソフトウェアとしてはSONY側ではVMWare PlayerとVirtualBoxの動作を確認済みのようですが、今回は私が使い慣れているという理由でVirtualBoxを選択しました。

【追記あり】SONYのSNAP SDKをインストールしてみた(1)

2010/11/30 23:55追記
田中俊光さんのその後の調査によって、SNAPは始まったばかりのプロジェクトでもアクティブなプロジェクトでもなかったことが判明しています。下記の内容については特に修正はしていませんが、読者の方にはSNAPプロジェクトについての誤解を防ぐために田中さんのエントリ「お詫びと訂正:SONYのSNAPについて」を先に読んでおくことを強くオススメします。

田中俊光さんのblogの「SONYのSNAPはGNUstepベース」で紹介されていたSNAP SDKに興味があったので、試しにインストールしてみる事にしました。
今のところ作業の途中なので最終的に失敗するかもしれませんが、あしからず。

2010年11月21日日曜日

書籍『ミニスカ宇宙海賊5 白銀の救難船』

先週から引いてた風邪がようやく直った模様。

今回の風邪はまず喉の痛み、鼻水、痰の順で症状が現れたが、熱はほとんど無いので風邪薬を飲みつつあまり騒がないようにして何とか回復。

今日はリハビリを兼ねて散歩していたのだが、発売日が過ぎていた事を思い出して購入したのがこの本。

表紙カバーの折り癖がちゃんとついてないらしく、カバーが勝手に外れそうになるので重しを載せて保管中。(店頭でも外れかけてた)

奥付によれば印刷製本は株式会社光邦。

ミニスカ宇宙海賊5 白銀の救難船 (朝日ノベルズ)
笹本祐一
朝日新聞出版
売り上げランキング: 83

2010年11月10日水曜日

Mercurial 1.7

Mercurial 1.7がリリースされて一週間程経ったのでそろそろインストールしてみようかと思ったのだけど、1.7ではリポジトリのフォーマットに変更があったとのことなので、MercurialEclipseが対応するまではアップデートを見送る予定。

2010年11月9日火曜日

PyPM Index

PyPM Indexは、たまに米ActiveState社と表記される事で昔から有名なカナダのソフトウェア会社、ActiveState社が最近開設したサイトで、Python版のCPANとよく言われるPyPIのモジュール情報を1日1回程度の頻度で巡回して公開している模様。

PyPIには登録されてないモジュールも登録されているとの触れ込みだったが、実際にどのモジュールがそうなのかは、ちょっと分からなかった。

個人的にこのサイトの一番ありがたいところは、Python 3に対応したモジュールに限定した日付順の情報がRSSフィードでも公開されていることで、さっそく利用中。

※ 本家PyPIにもPython 3に対応したモジュールの一覧はあるが、リリース日付の記載はないし、日付順のページもなかった。

2010年11月5日金曜日

Pythonのメタクラスで __new__() メソッドが必要な例

Pythonのメタクラスで __init__() メソッドではなく、__new__() メソッドを必要とする例を考えていたら、@aodagさんの「Pythonでfinalなクラス」がまさにそれだった。
イカは例によってPython 3版

2010年11月4日木曜日

Facebookでウォールがワンクリックで表示されない話

Facebookにはユーザ毎に「ウォール」(Wall) と呼ばれる画面があって、通常は画面の左上に表示される自分の名前、



のリンクをクリックすれば一発で表示されるはずなのだが、私の環境でこのリンクをクリックすると、「ウォール」が表示される代わりに、何故か「基本データ」が表示されてしまう。他のFacebookユーザの方々にも手伝っていただきながら(ありがとうございました。m(__)m)検証してみたところ、


  • 私の環境では、Mac OS X版のSafari、Chrome、Firefoxで試して挙動が全て同じ
  • Webブラウザの拡張機能を全部無効にしてCookieやFlashのShared Objectも消してみたが現象に変化なし
  • 右上の「プロフィール」のリンクをクリックしても「ウォール」ではなく「基本データ」が表示される
  • 名前も「プロフィール」もリンク先のURLは http://www.facebook.com/msmhrt になっていて、このURLを直接表示しても毎回「基本データ」が表示される。
  • ウォールのURLは http://www.facebook.com/msmhrt?v=wall になっていて、このURLなら私の環境でも「ウォール」が表示される。
  • 他の人達にも訊いてみたが、左上の自分の名前をクリックしてウォールが表示されない人はいなかった。
  • 他のFacebookユーザの方にログインした状態で、上記の私の環境では「基本データ」が表示されるURLを見ていただいたところ、「ウォール」が表示されたとのこと。
  • 私から他のユーザの http://www.facebook.com/(username) なURLを見るとそのユーザのウォールが表示された。


という結果で、お手上げ状態。

Webブラウザには依存してないようなので、私がFacebookで設定を変にいじったか、Facebookで必要な情報を入力していないためにFacebookが「基本データ」を表示して何かを促しているのかもしれないけど、よく分からない。

仕方がないので、とりあえず「ウォール」のブックマークレットを作って対処した。

2010年11月3日水曜日

Python 3のデザインパターンでメタクラスしてみた(2)

前回の続きです。

・メタクラス
メタクラスとは一体何なのでしょうか?

その詳細については、@aodagさんの「Pythonのメタクラスについて」という文書を読んでください……これは、メタクラスをどうやって説明しようか散々悩んだ末、Python初心者の私が内容の怪しい説明をするよりは、上級者の方のちゃんとした説明を読んで頂いた方がいいに違いない!と信じたからであって、メタクラスを説明しようとしたらめちゃくちゃ面倒臭いし、さっぱり分からなかったので手抜きをしようとした訳ではありません!!ので、くれぐれも誤解のなきようお願い致します!!!(←言い訳)

ただ、この資料はPython 2系向けの資料なので、サンプルコードをそのままPython 3で実行するとエラーが発生します。
念のため、サンプルコードをPython 3向けに修正しつつ実際に実行してみた結果を下記に掲載しますので、恐れ入りますが、適宜読み替えてください。

2010年11月2日火曜日

書籍『WEB+DB PRESS Vol.35』

BOOK-OFFで105円だったのでTDD特集目当てで買ってみた。

WEB+DB PRESS Vol.35
WEB+DB PRESS Vol.35
posted with amazlet at 10.11.03

技術評論社
売り上げランキング: 421815


2010年11月1日月曜日

Python初心者によるPythonのメタクラスのはまりどころのまとめ

私「そっか、クラスオブジェクトを生成するのは type.__new__() で、その実体は、Pythonのソースの Objects/typeobject.c にある type_new()関数だったんだね!」

ぐぐる様「クラスオブジェクトを生成するのは __build_class__ 関数だよ」

私「え?」←イマココ

2010年10月31日日曜日

Python 3のデザインパターンでメタクラスしてみた(1)

必要もないのにPython 3とデザインパターンとメタクラスを使うのはPythonプログラマ的厨二病の定番らしいので、とりあえず全部混ぜてエントリを書いてみました。(挨拶)

Pythonでデザインパターンを試す場合はGoFSingleton パターンが定番らしいのですが、今回は私の好みでFlyweight パターンを選択しました。
Flyweight パターンの詳細については、恐れ入りますがWikipediaの該当項目を参照してください。


2010年10月29日金曜日

Pythonのメタクラス

Pythonのメタクラスの__init__()メソッドの第一引数はselfじゃなくてcls
Pythonのメタクラスの__init__()メソッドの第一引数はselfじゃなくてcls

大事なことなので二度言いました。(挨拶)

参考:Javascript's Prototype Inheritance in Python のコメント欄

Mac OS XでEclipse 3.6.1とPydev他をインストールしてみた(2)

前回からの続きです。


2010年10月27日水曜日

Mac OS XでEclipse 3.6.1とPydev他をインストールしてみた(1)

Eclipseが3.5から3.6に自動アップデートしてくれないのを知らなかったので、今まで3.5を使い続けていたのですが、今回Eclipse 3.6.1とPydev他をクリーンインストールしてみることにしました。

2010年10月26日火曜日

Python 3のunittestでprint関数をテスト

Python 3でprint関数の出力をテストしたい場合、doctestを使うのがPythonらしいやり方のようなのですが、doctestの方は使い方のサンプル程度にして、しつこいテストはunittestでテストした方がすっきりしそうなので、unittestでprint関数をテストする方法を探してみました。

するとどうやら、標準出力をio.StringIO()にしてしまうのが定番のようでしたので、さっそく試してみました。


2010年10月25日月曜日

読了『バグがないプログラムのつくり方』

先日購入したまま少し放置してたけど、内容は平易なのでさっくり読了。

バグがないプログラムのつくり方 JavaとEclipseで学ぶTDDテスト駆動開発 (Be agile!)
川端 光義 倉貫 義人 兒玉 督司
翔泳社
売り上げランキング: 71090

プログラムのバグに困ってる人にテスト駆動開発(以下、TDD)を紹介しつつエクストリーム・プログラミング(以下、XP)の世界に招待するような内容で、XPのTDD以外の要素については、「書籍○○○○をぜひお求めください」的な感じ。

私自身はPythonのTDDの参考にしたかったので、Java言語に興味は無いのだけど、かなり俯瞰的な内容なので、全体の1/3程を占める第3部「やってみよう」のコード本体とデザインパターンの具体的な話以外は普通に読めたし、2004年発行の割には、それ程古臭くは感じなかった。(ひょっとすると、Javaを知らないから掲載されてるコードを古く感じなかったのかもしれない)
コードを書き直したい時にそれまで書いて来たテストが背中を押してくれる感覚や、著者がTDDを素晴らしいと感じている様子がちゃんと伝わってくるのも良かった。

しかし、XPに重きを置きすぎて、TDD以外の周辺要素の説明にページを割き過ぎた感じが否めない。付録Aの「テスト駆動開発の疑問」が全8問だったのは、この本が求める現状からの変化の大きさを考えれば明らかに少なすぎ。

私みたいにTDDを何も知らない人が、シナリオのスムーズさに多少眉に唾をつけつつ読む分には、そんなに気にならないかもしれないけど、TDDを業務用途で導入するために、他人を説得する必要がある人は、何か別の本を探してみた方が良いかもしれない。

2010年10月23日土曜日

Pythonの比較演算子の特殊メソッド

以下、Python 3.1.2でのみ確認。

Pythonの比較演算子の特殊メソッドは、

  • __lt__(self, other) ... self < other
  • __le__(self, other) ... self <= other
  • __eq__(self, other) ... self == other
  • __ne__(self, other) ... self != other
  • __ge__(self, other) ... self >= other
  • __gt__(self, other) ... self > other

の6種類があるけど、__lt__メソッドを実装すれば __gt__メソッドが、__le__メソッドを実装すれば __ge__メソッドが勝手に用意される。


2010年10月22日金曜日

IronPythonとIronRuby、誰が何を見捨てたのか?

今月の初め頃、MSがCodePlexでMercurialを採用している話のついでに、


MSが今後もずっとIronRubyとIronPythonの両方を賄っていける程余裕があるかは疑問なので、いずれどっちかが選択されるだろうとは思ってるけど、どっちが選択されるのかはちょっと予想がつかない。Sat Oct 02 02:05:25 via web


以前は、どちらかを選択するならIronPythonを避けてIronRubyかなーと思ってたけど、CodePlexでMercurialが採用されたし、MSはどうもRubyコミュニティとの相性があまり良くないっぽいので、IronPythonが選ばれる線も捨てきれない。Sat Oct 02 02:08:25 via web


MSがIronRubyやIronPythonを始めた動機は、DjangoやRailsをIISで動かす事だったっぽいので、言語その物の人気よりはWebフレームワークの人気が判断を左右することになるのかも。Sat Oct 02 02:23:18 via web


なんてつぶやいてたんですが、今日になってDLRIronPythonの父であるJim Hugunin氏がMSを退社してGoogleに行く事が発表されたり、MSがIronPython/IronRubyをコミュニティに委ねる旨の発表があったりと話が急展開してます。

DLR(Dynamic Language Runtime)は、.NET Framework 4でbuilt-inコンポーネントに昇格しましたから、引き続きMSで開発される事になるのでしょうが、仕様やリリーススケジュールはMSのコントロール下にあるので、IronPython/IronRuby側から何らかのリクエストがあった場合にどこまで通るかは不明です。ひょっとすると、IronSchemeのようにbuilt-inのDLRとは別に昔のDLRを改変しながら使っていくようなやり方もあり得るのかもしれません。

正直、急展開過ぎて話にちゃんとついていけてないので、後で追記するかもしれない。(^^;)

2010年10月21日木曜日

書籍『Python 3 プログラミング徹底入門 』

購入したのは結構前だけど、Pythonのクラス絡みで少し悩んだのでこの本でおさらい中。

Python 3 プログラミング徹底入門
マーク・サマーフィールド Mark Summerfield
ピアソンエデュケーション
売り上げランキング: 404945

そういえば、この本を買った頃はPython 3には全く手を出して無かったはずなのに、何故Python 3専門のこの本を買ったのか我ながら不思議だったのだけど、恐らく、本屋で見かけたので立ち読みしたら、Pythonの書籍にしては言い訳がましさをそんなに感じないし、出版社がピアソンだから見かけた時に買っとかないとすぐなくなるとかそんな事を考えたのではないかと予想。

2010年10月20日水曜日

書籍『バグがないプログラムのつくり方』

昨日のエントリでTDDの入門書的な書籍が欲しくなったので一冊買ってみた。

バグがないプログラムのつくり方 JavaとEclipseで学ぶTDDテスト駆動開発 (Be agile!)
川端 光義 倉貫 義人 兒玉 督司
翔泳社
売り上げランキング: 312266


少し大きめの本屋を数軒はしごしてみたけど、タイトルにTDDと書いてある本は残念ながらこれ一冊。TDDって人気ないんだろうか?

対象環境はJavaとEclipseとJUnitで、私の環境はPythonとunittest2だけど、PythonのunittestはJUnitのPython版のようなものらしいので、雰囲気が分かればまあいいかーと考えて、あまり気にしない事にした。付属CD-ROMのEclipseのバージョンが2.1.3だったりしたけど、こっちも同様の理由でスルー。
そういえば、Pythonのモジュールって、JavaのJ○○のPython版だから使い方は大体分かるよね?みたいな、ユーザがJavaの知識がある事を前提にした説明のモジュールがやたらと多い印象がある。何でだろう?

内容の方は、Java言語に特有の機能を使ったリファクタリングの説明が多いとちょっと困るかもと思ったけど、立ち読みしてみた感じだと、例題が単純なせいかその辺は大丈夫っぽい。
ただし、SCMツール(Git, Mercurial, etc...)と連携してる様子は全く無さそうなので、その辺りには期待できそうにないのがちょっと残念。

2010年10月19日火曜日

PythonでTDDしてみた

Python以外の言語でTDDをした経験がある訳ではないので、あちこちのページを参考にしながらかなり適当にやってみた。
とりあえず試しに書いたコードは、
from weakref import WeakValueDictionary

class NicoChannel:
    _InstancePool = WeakValueDictionary()

    def __new__(cls, channelid):
        try:
            channelid = int(channelid)
        except ValueError:
            return None

        if channelid < 1:
            return None

        obj = NicoChannel._InstancePool.get(channelid, None)
        if not obj:
            obj = object.__new__(cls)
            NicoChannel._InstancePool[channelid] = obj

        return obj

    def __init__(self, channelid):
        self.channelid = int(channelid)

    def __str__(self):
        return str(self.channelid)
で、テストの方はこんな感じに。
#!/usr/bin/env python3.1
import unittest
from nicochannel import NicoChannel

class TestNicoChannel(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def testNewClass(self):
        self.assertNotEqual(NicoChannel(1), None)

        channel1 = NicoChannel(1)
        self.assertEqual(str(channel1), '1')

        channel2 = NicoChannel(2)
        self.assertEqual(str(channel2), '2')

        # Test for Flyweight pattern.
        channel1_clone = NicoChannel(1)
        self.assertEqual(channel1, channel1_clone)

        self.assertNotEqual(channel1, channel2)

        # If channelid isn't a number, NicoChannel(channelid) is None
        self.assertEqual(NicoChannel('A'), None)

        # If channelid is a negative number, NicoChannel(channelid) is None
        self.assertEqual(NicoChannel(-1), None)

        # If channelid is a zero, NicoChannel(channelid) is None
        self.assertEqual(NicoChannel(0), None)

        # If channelid is a number string, NicoChannel(channelid) isn't None
        channelzerotwo = NicoChannel("02")
        self.assertNotEqual(channelzerotwo, None)

        # Testing normalization of channelid.
        self.assertEqual(str(channelzerotwo), '2')

        # Test NicoChannel("02") == NicoChannel(2)
        self.assertEqual(channelzerotwo, channel2)



class TestRandom(unittest.TestCase):
    pass

if __name__ == '__main__':
    unittest.main()

現時点でよく分からなかったのは、
  • レッドからグリーンになったらcommitするのが一般的なパターンのようだけど、テストを追加してレッドになった時点ではcommitしない方がいい?(使ってるSCMはMercurial)
  • 前回のサイクルで追加したコードのせいで、これから追加しても即グリーンになるのが分かってるようなテストは追加しない方がいい?
  • Flyweightパターンにする時に一気に10行ぐらい追加するのってマズい?
etc...。
この辺りは初歩的な疑問のはずなので、ちゃんとした書籍を一冊買えば即解消しそうな予感。

2010年10月18日月曜日

Pylint 3k coming soon !

PylintのPython 3対応版が近い内にリリースされる予定らしい。
ソースはPylintの開発MLに流れた数日前のメール。

[Python-projects] Pylint 3k coming soon !

2010年10月17日日曜日

Python初心者によるMac OS XでのPythonのはまりどころのまとめ(2)

前回のエントリでは、自分でPythonをビルドするのであれば、./configureで--enable-frameworkを有効にするのはオススメしないことと、その理由は、
  1. Framework化されたPythonでなければいけないような状況が滅多にない
  2. Python.Frameworkが必要な状況がもしあるなら、OS標準のFrameworkを使用するか、必要とするアプリケーションにFrameworkを同梱しておくべき
  3. PythonをFramework化すると面倒に巻き込まれることがある
であることまで書きましたので、この3つの項目について順番に説明します。今後、かなり細切れのエントリが続くことになりそうですが、ご容赦ください。m(__)m

2010年10月15日金曜日

「フェイスブック同時オン会」開催中!

あまちゃんが主催で本日開催中の「フェイスブック同時オン会」で10/16の0時から「みんなで乾杯!二回目!」がもうすぐ始まります。

どうやらFacebookでは公開グループの管理者が250人(?)登録する毎に1時間程登録できなくなる規制が入るらしく、承認が遅れる場合があるとの事でした。

尚、Facebookでメールによる通知設定を有効にしたままだと、かなりの流量でメールが届きますので慣れてない人は注意した方が良さそうです。届くメールの本文中に「Eメールの設定を編集」というリンクがあるはずですので、そこから設定を変更するのがオススメです。
このリンクをクリックすると、


Facebookの画面でこのようなダイアログが表示されますので、「メールお知らせの宛先」のチェックを外せば「フェイスブック同時オン会」の通知メールが届かなくなります。

なお、その下の「グループのメールをオフにするには...」というのは他のグループも含めたグループ全体の設定が可能のようですので、好みに応じてどうぞ。

2010年10月14日木曜日

Facebookに登録してみた

Facebookがブームなのかどうかはよく分からないけど、Facebookで「友達」を増やすのがブームになってるようなので、ブームに乗ってみた。
ちょうど今(2010年10月14日 23時40分)、あまちゃんが「フェイスブック同時オン会」の公開グループを主催して参加者が増え続けてる真っ最中なので、そこで「友達」を増やすのがオススメらしい。


「Friendの数は相手が居ないと増やせないから、友達の輪が緩んでる間に増やしとけ」って、婆っちゃが言ってたよ!

2010年10月13日水曜日

Python初心者によるMac OS XでのPythonのはまりどころのまとめ

皆さんこんばんは。Python初心者の @msmhrt です。

Mac OS XでPythonを勉強し始めて何ヶ月か経ったので、一度復習を兼ねてまとめてみようと思います。私が今までPerlとかAWKとかsedを使っていて、Pythonはこうやるのかーとか、これは便利だなーと思ったところ、開発(?)していてはまったところなどピックアップしてみる予定です。

さて、Mac OS XでPythonを使おうとする時、Pythonを準備する方法の選択肢は大きく分けて4つあります。
  1. Mac OS Xに標準でインストールされているPythonをそのまま使う
  2. MacPorts等のパッケージシステムを使ってPythonをインストールする
  3. Python公式サイトで配布されているMac OS X Installer Disk ImageからPythonをインストールする
  4. Xcodeを使って自分でPythonをビルドする
これらの方法はそれぞれ一長一短があるのですが、1.から3.までのPythonはビルドの際、 ./configure コマンドに --enable-framework オプションを追加して、Python.Frameworkが使えるようにされているはずです。(面倒なので、このようなPythonの事をFramework化されたPythonと呼ぶ事にします。)

ですから、4.の手順、自分でPythonをビルドする際もFramework化するのが当然に違いないと思ってしまうのは、ある意味仕方がないことだろうと思います。

しかし、私は自分でPythonをビルドする際にはFramework化しないようにしていますし、このブログでもFramework化しない手順をオススメしています。その理由は、

2010年10月12日火曜日

pyflakes3k - Python 3対応の文法チェッカー

Python用の文法チェッカーにPyFlakesというツールがあるのですが、そのPython3対応版らしいpyflakes3kというツールを見つけたのでさっそく使用してみました。


2010年10月11日月曜日

Python 3.2 alpha 3をインストールしてみた

Pythonの公式サイトではまだ正式には告知されていませんでしたが、Python 3.2 alpha 3が公開されたようなので、試しにインストールしてみました。

自宅の環境では「Python専用ユーザでPythonバイナリを隔離してみた」の手順の結果、Python 3.1で動作するvirtualenv3が既にインストールされているので、今回は同様の手順でPython 3.2 alpha 3本体(以下、3.2a3)とdistribute-0.6.14だけ追加する事にしました。

2010年10月10日日曜日

msmhrt-httplib2

Google Codeのclone機能を使ってhttplib2クローンのmsmhrt-httplib2を公開してみました。

httplib2自体は元々Python 3にも対応はしているのですが、実際に利用中に発生した「Python初心者が3.xに手を出したらhttplib2でハマった理由」や「Python 3.1.2 + httplib2 でまた問題」の問題を修正したつもりです。

本家のIssue Trackerにも報告はしてありますが、開発者が今年の6月以降、活動している様子が無いので、本家に反映されるまで時間がかかりそうな気配です。

Google CodeもMercurialも今回初めて使ってみたので多少不安なのですが、何かありましたらこのブログのコメントやTwitterの@msmhrt 等でご連絡ください。m(__)m

2010年10月9日土曜日

さくらのVPSでカスタムOSインストールを試してみた(2)

昨日のエントリで書いた、さくらのVPSのVNCコンソールがMac OS XではGoogle Chromeでだけ起動しなかった件が気になったので、OSをBoot CampのWindows XP SP3に変えて確認してみたところ、

  • Google Chrome 6.0.472.63 …… VNCコンソールが起動
  • Internet Explorer 8.0.6001.18702 …… VNCコンソールが起動
  • Firefox 3.6.10 …… VNCコンソールが起動
  • Safari 5.0.2 (7533.1.8.5) …… VNCコンソールが起動

という結果になり、4種類のWebブラウザ全てでVNCコンソールが起動しました。
Mac OS X版のGoogle ChromeでJava絡みの設定をいじった記憶は特にないのですが、もしかすると我が家のiMacだけの現象なのかもしれません。

今日のエントリも昨日のエントリの続きで、さくらのVPSのカスタムOSインストールで気がついた事のメモです。
使えるようになったばかりの機能なので混み合ってるかとも思ったのですが、VNCコンソールの動作は予想していたよりも安定しているようです。

おかげで、何か問題が無いか探そうとすると重箱の隅をつつかざるを得ませんでした。
以前の「VirtualBoxでさくらのVPSのテスト環境を作ってみたシリーズ」よりもかなりショボいエントリになっていますが、どうかご了承ください。m(__)m

2010年10月8日金曜日

さくらのVPSでカスタムOSインストールを試してみた(1)

本日、さくらのVPSに新機能の「カスタムOSインストール」が提供開始されました。インストール可能なOSの種類はニュースリリースにも記載されているとおり、
  • CentOS 5.5 x86_64(64bit版)
  • CentOS 5.5 x86 i386(32bit版)
  • Ubuntu 10.04 amd64(64bit版)
  • Ubuntu 10.04 i386(32bit版)
  • FreeBSD 8.1 amd64(64bit版)
  • FreeBSD 8.1 i386(32bit版)
  • Debian 5.05 amd64(64bit版)
  • Debian 5.05 i386(32bit版)
  • Fedora 13 x86_64(64bit版)
  • Fedora 13 i386(32bit版)
の全5種類、10バージョンです。

さくらのVPSでインストール可能なOSの種類が増える予定である事は、さくらインターネットの田中邦裕社長が以前からTwitterのアカウントでつぶやいたりしていたのですが、多少作業が遅れたらしく、先週中には提供されるはずだった開始時期が今日までずれ込んでしまったようです。

インストール手順については、手順が細かく記載されたオンラインマニュアルがOS毎に提供されていますので特に迷う事は無かったのですが、せっかく試してみたので、オンラインマニュアルには記載されていなかった重箱の隅を中心にまとめてみます。
尚、インストールしたOSはUbuntu 10.04 i386(32bit版)です。

2010年10月7日木曜日

Mac OS X用のGUIなMercurialクライアントについてのメモ

Mac OS X用のGUIなMecurialクライアントは、単体アプリケーションとしては、MurkyMacHGMacMercurialの3種類があるようなので、ほんの少しだけ触ってみました。以下はそのメモです。


1. Murky

私の環境では、普通に操作しているだけで、Cancelボタンが何故か効かなくなったりする事があって、ちょっと実用には耐えない感じでした。何か間違えたのかと思ってMercurialのバージョンを変えてみるなど色々試したのですが、現象が変わらないのでパスしました。


2. MacHg

現時点ではGoogle CodeのMercurialリポジトリを扱えないという制限があるようです。MacHgの公式FAQによれば、原因は、Google Code側がMercurialのidentityコマンドの応答を正しく返さない事にあるらしく、MacHgでは対処のしようがないとの事でした。
この件は、Google Hosting ProjectにもIssueとして既に登録されていますが、今年の6月以降動きがないようなので、Vote機能で一票投じておきました。

3. MacMercurial

MacMercurialには元々clone機能は無く、cloneされたリポジトリに対して操作を行う事になるようです。
操作結果の表示が通常のMercurialコマンドの出力をそのままウィンドウに表示している感じで、イマイチGUI化の恩恵が感じられませんでした。

4. 総評

Mac OS XでMercurialの3種類のGUIクライアントをほんの少しだけ触ってみたのですが、ダメな所ばかり目についてしまって残念な結果になりました。
もっと使い込む事ができれば印象も変わったかもしれないのですが……

まだ試してないのは、Eclipse向けのプラグインであるMercurialEclipseとNetBeans用のMercurialプラグインですが、こちらも後日試してみたいと思います。

2010年10月6日水曜日

Python専用ユーザでPythonバイナリを隔離してみた

私は、Mac OS Xのまっさら (plain vanilla) な環境で何か検証したい時は、新規アカウントを作って作業するようにしています。
そのため、日常的に使っているツールは /usr/local 以下にインストールしたり、MacPorts等のパッケージシステムに頼ったりせずに $HOME/local 以下にインストールするような癖が自然についてしまいました。

この方法はそれなりに便利なのですが、最近になって複数のバージョンのPythonをvirtualenvで使い分ける際に、まだ慣れてないせいかvirtualenv環境ではなく元環境に手を加えてしまうミスを二度も起こしてしまいました。
結局、面倒なのでPython環境を一度全部消してインストールからやり直したのですが、もうちょっと何とかならないだろうか?と考えてみました。

その結果、Python環境をインストールするために専用のユーザを作成してみたのですが、これが割といい感じでしたので、大した内容ではありませんが手順を公開してみます。

尚、私はまだPythonに慣れてないので、「もっと、こうした方がいいよ」等のご意見がありましたらコメント、Twitter、ブクマ等で教えて頂けると助かります。m(__)m

2010年10月5日火曜日

Google Codeでhttplib2のcloneを作成してみた

Python 3でクローラーもどきを作るのにhttplib2モジュールを使っていたのですが、何度か例外に悩まされて困ったので、いわゆる勝手forkを作ってみる事にしました。
せっかく『入門Mercurial Linux/Windows対応』を買ったばかりなので、先日触ってみたBitbucket.orgを使ってみようかとも思ったのですが、httplib2プロジェクトはProject Hosting on Google Codeでホストされているので、Google Codeのclone機能を使ってみることにしました。

2010年10月4日月曜日

Python 3.1.2 + httplib2 でまた問題

Ubuntu 10.04 32bit版+Python 3.1.2の環境でhttplib2を使ってたらIssue 62に似た症状が発生して悩み中。前回の修正で安定したと思ったのだけど、まだ怪しいところが残ってたらしい。

(前略)
return h.request(url)
File "/home/msmhrt/mypython/lib/python3.1/site-packages/httplib2-0.6.0-py3.1.egg/httplib2/__init__.py", line 1088, in request
(response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
File "/home/msmhrt/mypython/lib/python3.1/site-packages/httplib2-0.6.0-py3.1.egg/httplib2/__init__.py", line 859, in _request
(response, content) = self._conn_request(conn, request_uri, method, body, headers)
File "/home/msmhrt/mypython/lib/python3.1/site-packages/httplib2-0.6.0-py3.1.egg/httplib2/__init__.py", line 828, in _conn_request
response = conn.getresponse()
File "/usr/lib/python3.1/http/client.py", line 1014, in getresponse
method=self._method)
File "/usr/lib/python3.1/http/client.py", line 278, in __init__
self.fp = sock.makefile("rb")
AttributeError: 'NoneType' object has no attribute 'makefile'

Bitbucket.org解決できそうなパッチを見つけたので、Python3向けに修正してから適用して様子見中。

2010年10月3日日曜日

なぜGoogleはThe Document Foundationを本格的に支援しないのか?

疑問形のタイトルがついた書籍が流行っているという話を聞いたのでさっそく便乗してみました。

さて、SunがOracleに買収された事でどうなるかが注目されていたOpenOffice.orgですが、コア開発者の一部がThe Document Foundationという組織を新たに設立し、Oracleとは袂を分かつ事がどうやら決定したようです。

The Document Foundation設立の発表の際には、いくつもの企業から祝辞が送られたようですが、その中にはGoogleの名前もありました。GoogleはGoogle Summer of Code等でOpenOfficeとも縁がありますし、OSSを推進するGoogleが今回の件で祝辞を述べることは当然だろうと私も思います。

しかし、この件への感想の中には
GoogleがThe Document Foundationのスポンサーになって本格的に支援してくれるに違いない
という期待(?)を込めた意見もあったようです。

私はこの意見にはちょっと同意できません。
GoogleがLibreOfficeの開発者を雇用する事はあるかもしれないが、The Document Foundation自体を本格的に支援するような事はないだろう
というのが私の意見です。

以下では、どうして私はそう思うのか?を説明してみたいと思います。

2010年10月1日金曜日

書籍『入門Mercurial Linux/Windows対応』&『Googleの全貌』

昨日買って来たのでAmazonアソシエイトリンクの張り付け練習がてらメモ。
まだちゃんと読んでないので感想は後日。←結局書かないフラグw

入門Mercurial Linux/Windows対応
藤原 克則
秀和システム
売り上げランキング: 22300

昨年、あちこちでリポジトリをsubversionからgitに変更したOSSなプロジェクトが増えてきたからという理由で、『入門Git』と『実用Git』は購入済みだったのだけど、Mercurialの本は一冊も買ってなかったので、先日、Bitbucket.orgの制限が解放された機会にMercurial本も買ってみた。

パラパラめくって読んでみた感じだと『入門Git』を先に読んでたおかげか結構楽に読めそうな感じがしたのだけど、SSHの説明で、「(サーバー上でssh-keygenを使って)作成した秘密鍵を、クライアント側の~/.ssh配下にコピーします。」と書いてあるのを見て、「そのやり方はちょっと勘弁してくれー」と思わず悲鳴を上げそうになったり。(^^;)

Googleの全貌
Googleの全貌
posted with amazlet at 10.10.01
日経コンピュータ
日経BP社
売り上げランキング: 100801

最近ぼんやりと「Googleはhttpsをどうするつもりなんだろう? アカウント別サブドメイン志向はこのまま続けるみたいだし、認証局になってGoogle Chromeにルート証明書を標準搭載するつもりはないみたいだし……」と考えていたので、何かヒントになりそうな事が書いてあったらいいなー程度の期待で買ってみた。まだ未読。

2010年9月30日木曜日

Bitbucket.org の "Use your Own Domain" 機能への不安

MercurialのリポジトリをホスティングしているBitbucket.orgがつい先日、Atlassianという会社に買収されました。(参考:アトラシアン社のプレスリリース

私は恥ずかしながら今までMercurialを一度も使った事が無かったので、アカウントを作っただけで放置していたのですが、買収後にBitbucket.orgの無償版の制限のいくつかが解放されたというつぶやきをTwitterのTL上で見かけたので、久々にログインしてみたところ「Account」画面に「Use your Own Domain」という機能があるのを見つけました。

2010年9月29日水曜日

VirtualBoxでさくらのVPSのテスト環境を作ってみた(4)

前回は、VirtualBoxで作成した仮想マシンにCentOS 5.5 x86_64 をインストールするところまで進めましたので、今日はその他の設定を追加して、さくらのVPSにより近づけてみます。最終的にはKickStartを使って自動化したかったのですが、テスト環境との内容比較のためにさくらのVPSを本格的に使えないのは本末転倒(笑)なので、今回はこの辺で切り上げたいと思います。ここまでの情報が何かの参考になれば幸いです。

2010年9月27日月曜日

VirtualBoxでさくらのVPSのテスト環境を作ってみた(2)

前のエントリで、VirtualBoxを使ってさくらのVPS相当の仮想マシンを作成しましたので、今回は作成した仮想マシンにCentOS 5.5 x86_64をインストールします。

2010年9月26日日曜日

VirtualBoxでさくらのVPSのテスト環境を作ってみた(1)

今回、msmhrt.jp のサーバ用に最近あちこちで話題の「さくらのVPS」を借りてみたのですが、メモリ512MBの制限でハマってる人を何人か見かけて、ちょっと不安になって来ました。
そこで、本番環境の前にテストする環境があれば良いのではないか?ということで、Mac OS X版のVirtualBoxを使って、さくらのVPSとなるべく近い環境を用意してみることにしました。以下はその大雑把な手順で、今回は仮想マシンを準備するところまでです。
まだ試行錯誤の段階なので、後から内容が変わるかも知れませんが、その際はご容赦ください。

2010年9月25日土曜日

Python初心者が3.xに手を出したらhttplib2でハマった理由

Dive Into Python 3 日本語版」でお勧めされていたhttplib2モジュールを試してみたら、

  1. Python 3で追加されたhttp.client.HTTPExceptionではなく、既に存在しないhttplib.HTTPException を捕捉しようとしている箇所でNameErrorが発生する。
  2. HTTPConnectionWithTimeoutクラスのconnect()メソッドでUnboundLocalErrorが発生する。

という2つの問題が発生した。