« 2006年11月 | トップページ | 2007年1月 »

2006/12/30

[ python / ubuntu ] ubuntu で追加しておくパッケージ

自分メモ

ubuntu で Python の拡張モジュールをインストールする前に追加しておく必要がある apt-get なパッケージ。

numpy / scipy
zlib1g-dev
atlas3-headers
atlas3-base
atlas3-base-dev
g77, g++
fftw2
fftw-dev
fftw3
fftw3-dev
fftw3-sse, fftw3-sse2 があるともっと早くなるとか(?)
pyOpenSSL
libssl-dev
ogg-python
liboggz1
liboggz1-dev
libogg0
libogg-dev
ついでに FLAC のライブラリも入れておく
liboggflac++-dev
liboggflac++2c2
liboggflac-dev
liboggflac3
py-ogg2
libogg2
2007.01.02 現在、libogg2 は apt-get では取得できない。svn リポジトリからソースをダウンロードして自分でビルドする必要がある。libogg2 のビルドは autogen.sh を実行してから make -> make install 。このままでは py-ogg2 をインポートしたときに、libogg2.so.6 が読み込めないと ImportError が発生してしまうので ldconfig を実行しておく。
そのほかライブラリビルドに必要なパッケージ
OpenLDAP
libdb4.4, libdb4.4-dev
libdb4.4++, libdb4.4++-dev
openssl 0.9.7 より新しいもの
他にもなんかあるかも ( README に書いてあります ) しれませんが、わたしはこれだけ入れたらビルドできました。
Reference
Linux Program Library How To: 3. 共有ライブラリ ( 原著:David A. Wheeler, 訳:川崎 貴彦 )
Why LD_LIBRARY_PATH is bad ( David Barr )

| | コメント (0) | トラックバック (0)

2006/12/27

[ 戯言 ] イノベーションを阻害する10の方法

サイボウズラボの秋元さんのブログでイノベーションを阻害する10の方法というのが紹介されている。 元ねたはTynerBlain の記事 Top ten tips for preventing innovation らしい。どうやったら革新的な発明をさせないでおけるかが焦点の10か条だ。

  1. 生活の安定を得ることを目標にしている人を雇う
  2. 無能な人を雇う。無能な人が雇えないときでも、一分野に特化した専門性の高い人を雇う
  3. 給与レベルは市場の75%以下におさえる。給与を上げるとイノベーターをひきつけてしまう
  4. イノベーションの達人!―発想する会社をつくる10の人材を読み、本で薦められているような人材を面接で落とす
  5. 社員をゴミのように扱う。怒鳴りつけ、深夜に、週末に、働かせる
  6. 保守的な成功、小さな成功をどんどん評価する
  7. マイクロマネージメントを行なう。自分がやりたいことを逐一指示して部下に行なわせる
  8. ユーザが望む機能だけをどんどん追加する
  9. 成果はわかりやすい数値で出させて評価する
  10. 部門を王国にする。情報を隠し権力を集める

実に効果的な10か条だね。こんなことを実践すればイノベーションの阻害はもちろん社員のやる気もゼロになるだろうけど。

特にマイクロマネージメントは有効だ。たとえば、やることなすこと全てに承認を必要とさせる。承認がなければ自発的な行動は禁止するとかね。実際、わたしはやる気をさっぱりなくしてしまったよ。

まぁ、率直に言って、こんなことする奴は馬鹿としか思えないね。

いいアイディアを得る最良の方法は、多くのアイディアを考え出すことだ。
ライナス・ポーリング

| | コメント (0) | トラックバック (0)

2006/12/26

[ python / ubuntu / linux ] ubuntu に Python2.5

Ubuntu japanVMPlayer 用のイメージが用意されていたので早速 DL して使ってみることにした。やっぱり再起動とかは面倒だし、仮想化技術って便利だね。

操作はいたって簡単で、イメージをダウンロードして VMPlayer に読み込ませるだけ。 ユーザ名とパスワードの設定をすればすぐにログオンして操作できるようになります。 とはいえ、セキュリティーホールやバグの問題があるので、ログオンしたらすぐに システム -> システム管理 -> アップデートマネージャ を起動して更新します。 アップデートが終わったら「サービスの管理」もチェックして不要なサービスは停止。

まずはアップデートとサービスの確認

さて、わたしは Python をよく使います。というか必須です。入ってるか確認すると一応入ってはいるのですが、2.4.3 と古いです。パッケージを探しても内容なので Python2.5 のソースを落としてきてそれをコンパイルすることにします。

、このイメージには autoconf, automake, libtool, subversion などが入っていないので、Python のビルドをする前に sudo apt-get install で入れておきましょう。

2006.12.28 追記
公開されているイメージには zlib1-dev と libreadline5-dev も入っていないようです_| ̄|○il|!
Python のビルドを開始する前に zlib1-dev と libreadline5-dev も apt-get install してください。havana 情報 THX!
2007.01.02 追記
RedHat 系だけでなく Debian 系でも /etc/ld.so.conf には /usr/local/lib の記述がありません。ld.so.conf に /usr/local/lib を追記したほうがいいみたい。また、自前ビルドでライブラリを入れた場合は ldconfig が必要になるようです。

必要なパッケージを入れたら、Python2.5 のソースを展開したディレクトリに移動して

autoconf
./configure
make
sudo make install

あとは必要な拡張モジュールを DL してきて追加しましょう。古い Python インタープリタは「 Synaptic パッケージマネージャ」から削除できます。 バージョン依存のツールもあったりするので、2.4 も残しておいた方がいいそうです。

Reference
Linux Program Library HOWTO: 3. 共有ライブラリ (原著:David A. Wheeler, 訳:川崎 貴彦 )
Why LD_LIBRARY_PATH is bad. ( David Barr )
共有ライブラリをシステムに認識させるには ( 2002/5/16, @IT, 北浦訓行 )

| | コメント (1) | トラックバック (0)

2006/12/23

[ 政治 ] 天下り撤廃に反対した議員を懲戒免職にしない限り票を入れないバトン

「天下り全廃」を提案した御手洗氏には拍手喝采だが、「官僚がやる気をなくす」という理由で「天下り全廃」に反対した閣僚は一体全体何を考えているんだか…。

( Life is Beautiful 「天下りあっ旋全廃に反対したらもう自民党には票を投じない」バトン)

本当に呆れる限り。天下りが公認されているような現状こそが、国力の低下に繋がっているとなぜ気付けないのか。

天下り撤廃に反対するような議員は即刻懲戒免職にするべきだ。天下りがなくなったら「やる気がなくなる」様な議員も同じく懲戒免職にするべき。

退職ではないよ。退職だと、退職金だとかなんだとかいろいろと理由をつけて少しでも甘い汁を頂こうとするのは明らかだからね。そんなことができないように懲戒免職にするべき。そして懲戒免職にした議員の名前を全て公表するべきだ。国民の税金を私物にしようとしたのだから、これくらいの制裁は当然だろう。

| | コメント (0) | トラックバック (0)

[ 呟き ] わかるなぁ

元々そうだったんですが、何か新しい物を作っていないと精神的に調子が悪くなる様です。

( 博麗幻想書譜 オーバーリザレクションより )

わかるなぁ。わたしもなんか作ったりとか、知らないナンカを調べたりとか、知的好奇心を刺激するようなことをしていないとものすごく調子が悪くなる。実際、なんどか入院したこともあるくらい。

それがお金になるかどうかじゃなくて、わたしの知的好奇心を刺激するかどうかなんだよね。わたしは「それがお金になるかどうか」とか「人の役に立つかどうか」なんて全然考えない。そもそも、他の人間が考えていることを理解するなんて普通の人間にはできないんだから、考えることそのものが無駄といえる(*)。そんなこと考えて作ったとしても誰も使わないかもしれないでしょ。自分が使うものを作れば、少なくとも一人は満足できるのにね。友達と「便利だよね」と話しているものを作れば、少なくとも自分と友達は満足するのにね。

下にある xls_to_csv.py ではかなり遊んでます。こんな書き方できないかなぁ、といろんな書き方を試しているときはかなり楽しかった。動かないコードもかなりできたけど、なんでだろうと調べることでそれまで知らなかったことがわかって、それもまた楽しかった。

わたしはわたしがいいと思うものを作りたい。楽しいと思うものを作りたい。
たぶん、この差は写真とか絵画で「コンクールで上位の賞を狙う」のか、それとも「自分が感動した瞬間を、自分が感じたままに表現したい」のかということなんだろう。

今じゃこんな snippet を書くくらいしか楽しみがない。虚しいね。

(*) Chris Anderson も指摘していること。大ヒットを狙って何かを創るという考えはもう時代遅れだ。

| | コメント (0) | トラックバック (0)

[ python ] Converting MS-EXCEL file into CSV file.

The module file can be downloaded here. ( Right click and select "save ..." )


# -*- coding: utf-8 -*-
# Python 2.4 or later required

import sys, csv
import pyExcelerator
# About csv module, see "http://www.python.org/doc/2.4/lib/module-csv.html"
# pyExcelerator can be redistributed with BSD Lisence and all rights reserved Roman V. Kiseliov
# The project page of pyExcelerator is "http://sourceforge.net/projects/pyexcelerator/"

def xls_to_csv( xls_file, csv_file ):
    """
    xls_to_csv( excel_file, csv_file ):
        convert MS-EXCEL file to CSV file.
        Note, arguments xls_file and csv_file are filename, not file object.
        Perhapse if the target EXCEL file includes the cell which value is dynamically generated by VBA, converting will be faild.
    """
    xls_sheets = pyExcelerator.parse_xls( xls_file )

    for sheet_id in len( xls_sheets ):
        cell_dict = xls_sheets[sheet_id][1]

        # set limitter row_max and column_max
        for which in (0, 1):
            exec "%s = max( [cell_dict.keys()[ key_index ][ which ] for key_index in xrange( len( cell_dict.keys() ) )] )" % ["row_max", "column_max"][which]

        # creating csv file.
        create_csv = csv.DictWriter( file( csv_file, "ab" ), fieldnames=range( column_max + 1 ) )
        for row in xrange( row_max + 1 ):
            create_csv.writerow( dict( enumerate( [cell_dict.copy().get( (row, column), '' ) for column in xrange( column_max + 1 )] ) ) )

    # fileclosing depends on garbage collection.


if __name__ == "__main__":
    if (sys.argv[1] in ("-h", "/h", "-?", "/?", "--help")) or ( len( sys.argv ) < 3 ):
        print "Usage: python xls_to_csv.py ExcelFile CSVFile"

    xls_to_csv( sys.argv[1], sys.argv[2] )

コメントにも書いてありますが、VBA はたぶん上手く変換できません。

バグなどのご報告は weisszwerg@gmail.com までお願いします。

| | コメント (0) | トラックバック (0)

2006/12/19

体調を崩していました

先週のはじめから中ごろまで寝込んでました。で、先週末からよくなりそうだなと思ったらまた寝込みそうになったりを繰り返しています。

症状と病院から処方された薬、それに対する症状の変化を考察するに恐らくはウィルス性の疾患だとおもうのですが、かなり長引きます。

先週の月曜日に調子が悪いにもかかわらず、早く帰って休めば大丈夫と外に出てしまったのが拙かったのでしょう。一度寝込んでしまうと回復には時間がかかります。何日も生産性の低い状態を引きずるよりも、まだ症状が軽いうちに1日体を休ませて置いたほうがいいのだと改めて実感しました。

いくつか途中で止まってしまっていることがあるのですが、体調が回復したら再開します。
もうしばらくお待ちくださいませ。

| | コメント (0) | トラックバック (0)

2006/12/15

[ javascript ] フォームの二重送信を防止する方法

Codezine で Javascript を使ってフォームの二重送信を防止する方法が2つ紹介されています。1つはボタンオブジェクトの disable プロパティを Javascript を使って切り替える方法。もうひとつは画面をフリーズさせてしまう方法。

画面をフリーズさせてしまう方法は、メッセージを表示させることでユーザに「今どういう状態なのか」を教えることもできる優れた方法だと思う。クリックしてもしばらく何も変化がないと「あれ?失敗したのかな?」あるいは「どうしたんだろう?」と思われてもう一度フォームを送信されてしまうことがあるからね。

Don't Make Me Think の観点から言えば、画面のメッセージを処理の状態に合わせて適切に変化させながらフォームはフリーズさせておくという方法がいいのではないだろうか。

| | コメント (0) | トラックバック (0)

2006/12/11

[ python ] Converting CSV file into MS-Excel file

The module file can be downloaded here. ( Right click and select "save ..." )


# -*- coding: utf-8 -*-

import sys, csv
import pyExcelerator
# About csv module, see "http://www.python.jp/doc/2.4/lib/module-csv.html"
# pyExcelerator can be redistributed with BSD Lisence and all rights reserved Roman V. Kiseliov
# The project page of pyExcelerator is "http://sourceforge.net/projects/pyexcelerator/"

def convert( csv_fobj, excel_file_name ):
    """
    convert( csv_fobj, excel_file_name )
        Converts a csv file into MS-Excel file.
        First argument: csv_fobj is a file object which reference to csv file.
        Second argument: excel_file_name is a file name.
    """
    record_from_csv = csv.reader( csv_fobj )
    
    excel_workbook  = pyExcelerator.Workbook()
    excel_sheets    = [sheet for sheet in map( excel_workbook.add_sheet, [u"sheet" + str( index ) for index in range( 3 )] )]
    
    (row, column) = (0, 0)
    for fields in record_from_csv:
        for cell_val in fields:
            excel_sheets[0].write( row, column, label=cell_val )
            column += 1
        column = 0
        row   += 1
    
    excel_workbook.save( excel_file_name )


if __name__ == "__main__":
    if( sys.argv[1] in ("-h", "/h", "-?", "/?", "--help") ) or ( len( sys.argv ) < 3 ):
        print "Usage: python csv_to_excel.py csvfile excelfile"
    
    csv_fobj = open( sys.argv[1], "rb" )
    convert( csv_fobj, sys.argv[2] )

CSV から MS-EXCEL ファイルに変換するモジュールが見つからなかったので作ってみました。
ダウンロードはこちらからどうぞ。
ダウンロードできない場合は右クリックメニューから「対象を保存」を実行してください。

コマンドラインからも実行できます。コマンドラインから実行するときは次のように入力してください。 入力コマンド中の csvfile は CSV ファイル名、excelfile は MS-EXCEL のファイル名です。なお、既存のファイルに追記することはできません。 既存のファイル名を指定すると上書きされてしまうのでご注意ください。

python csv_to_xls.py csvfile excelfile

Reference
[python][office]Python2.5でExcelを使わずにExcelファイルを読み書きする
( 2006/12/06, seraphy )
Py Excelerator Project Page ( Since 2005/03/16, Roman V. Kiseliov )

| | コメント (0) | トラックバック (1)

2006/12/10

[ python ] Eclipse に PyDev をインストールする

本エントリでは 2006/12/10 の時点で最新となる Eclipse SDK version 3.2.1 と PyDev plugin version 1.2.5 を対象にしています。これ以外のバージョンでは 操作が異なる場合があります。また、バージョンアップなどにより将来操作が変更となる 可能性があります。可能な限り修正していきますが、 操作手順のミスなどにお気づきになられましたら weisszwerg@gmail.com までご連絡ください。

バージョンが異なるからか、実践 Python の説明と少し手順が異なる部分があったので それを反映したエントリを作成することにしました。

PyDev は無料で使える素晴らしい IDE です。キーワード・文脈に基いたカラーリングはもちろん、クラスに定義されているメンバ変数やメソッドの一覧表示、ソースコード中のそれらが定義されている場所へ一瞬でジャンプできる機能、プロジェクトファイルの管理機能など便利な機能が簡単に使えます。楽にコードを書けるツールを探している方は試してみてはいかがでしょうか?

PyDev は Eclipse のプラグインですので、使用するためには Eclipse 本体が必要になります。Eclipse がインストールされていない場合はこちら ( Eclipse Wiki ) を参考にして Eclipse のインストールを行ってください。

Eclipse のインストールが終わったら、Eclipse を起動してメニューバーの "Help" にある "Software Update" のサブメニュー "Find and Install" を開いてください。

Help->Software から Find and Install を起動

下のようなダイアログボックスが開きます。"Search for new features to install ( 新しい機能を探してインストールする )" にチェックを入れて Next ボタンをクリックします。

Find and Install ダイアログボックス

Update sites to visit というステップに進むと思います。「新しいプラグインを探したいサイトを選んでね」というようなことが書いてありますが、初期状態ではPyDev のサイトは登録されていません。まずはサイトを登録する必要があります。New Remote Site と書かれたボタンをクリックしてください。

プラグインを探したいサイトを選ぶ

Edit Remote Site というダイアログボックスが表示されますので、下の画像を参考に Name と URL を入力して OK ボタンを押してください。

プラグインを DL するサイトを登録する

先ほどの Update sites to visit に戻ってきました。今度はリストに PyDev がありますね。チェックボックスにチェックを入れてから Finish ボタンをクリックします。( Next ボタンじゃないんですよ。紛らわしいことに( ´・ω・`) )

PyDev のチェックボックスにチェックを入れて Finish をクリック

ちいさなダイアログボックスが表示されてしばらくすると、 Search Result と書かれた下のようなウィンドウが表示されます。PyDev の左側にあるチェックボックスにチェックを入れて Next ボタンをクリックしてください。

もういちど PyDev の横のチェックボックスを ON にして Next ボタン

PyDev のプラグインを使用するためには EULA に同意しなければなりません。PyDev は Eclipse 本体と同じ Eclipse Public License です。Eclipse を使用しているならこれに同意しているでしょうから "I accept the terms in the license agreement" を選択して Next ボタンをクリックしましょう。

ライセンス確認画面

特に変更することはないでしょう。Finish ボタンを押して次に進みましょう。

インストール先を指定する

Update Manager がプラグインをダウンロードして Eclipse に組み込んでくれます。

Update Manager がんばる

しばらくすると下のような警告画面が出てきます。要約すると「電子署名されてないんだけど本当にインストールするの?」という内容です。署名されているプラグインの方が少数派でしょうよ。かまわず Install All をクリックして完了してください。

署名がないよ!

PyDev をインストールすると「設定を反映するには Eclipse を再起動してください」というダイアログボックスが表示されるので Eclipse を再起動してください。

設定ウィンドウを開く Eclipse に組み込むことはできましたが、PyDev はそのままでは使えません。Python のインタープリタがどこにあるのか、Python のモジュールがどこにあるのかといったことを教えなければなりません。続いて PyDev の設定をする必要があります。

←画像のようにツールバーの Window -> Preferences の順にクリックして設定ウィンドウを開いてください。


下の画像を参考に、1 ~ 3 の順にクリックして、ファイル指定ダイアログボックスを開いてください。

Eclipse 環境設定ウィンドウ

ファイル指定ダイアログでは python.exe があるフォルダを指定します。

Python インタープリタがあるフォルダを指定する。

Python インタープリタがあるフォルダを指定すると、自動的に PYTHONPATH などを読みに行き、設定したほうがいいパスを表示してくれます。大抵のインストールされているサードパーティーモジュールのパスは見つけてくれます。表示されているもののうち設定したくないものがあったらチェックを外しましょう。パスが抜けている場合でも次で追加できますので、気にせずに OK ボタンをクリックしてください。

自動的に拾ってくれたモジュールパス

先ほどの自動設定でモジュールパスが抜けていた場合はここで追加してください。System PYTHONPATH の右側にある New Folder ボタンを押して出てきたダイアログボックスでパスを指定すると追加できます。また、間違って追加してしまったパスを削除することもできます。削除は目的のフォルダを選択して ( 選択すると背景が反転します ) Remove ボタンを押してください。設定の確認が終わったら OK ボタンをクリックします。

インタープリタとPYTHONPATH の確認

以上で PyDev の必要最低限の設定は終了です。あとは使いながら自分の好みにカスタマイズしていきましょう。

なお、プロジェクトは File メニューから New -> Other と辿って Select ウィザードを開きます。 リストエリアの Pydev を展開すると Pydev Project, Pydev Module, Pydev Package があるので目的にあったものを選びましょう。

プロジェクト開始

| | コメント (0) | トラックバック (0)

2006/12/07

12/5 ~ 12/7 のトラブルについて

12/5 ~ 12/7 15:00 までメンテナンスが行われていたそうです。このメンテナンスの影響でコメントの投稿やトラックバックの受付ができない状態になっていました。現在は復旧しているようですので、お手数ですがもう一度試してみてくださいませ。

なお、メンテナンス中にトラブルがあり失敗に終わったようです。

Reference
ココログレスポンス問題お知らせブログ

| | コメント (0) | トラックバック (0)

[ .NET ] プログラミング Microsoft .NET Framework 第二版

CLR via C# 邦訳版

プログラミング Microsoft .NET Framework 第二版が発売されたそうです。原題は CLR via C#。.NET プラットフォームで開発をするなら必読といわれている本の改訂版だ。.NET Framework 1.x のときは .NET プラットフォームには魅力を感じなくてスルーしていたんだけど、.NET Framework2.0 になっていろんな言語が .NET プラットフォームに移植されている。

IronPython を使っていることもあり、.NET って便利なプラットフォームかもしれないと思うようになったので買うことに。どんな感じで中間コードが実行されていくのかという仮想マシンの動作にも興味がわいたのも理由のひとつ。

Amazon.com の書評によると次のようなことが書いてあるらしい。

  • ソースコードはどのようにして中間コードに落とされて、管理実行されるのか
  • データはどのように区別され、管理されるのか
  • フィールドやメソッドなどクラスを構成するメンバーについて
  • 例外の処理の仕方
  • ガベージコレクションの仕組み
  • リフレクションの仕組み
  • マルチスレッドアプリケーションはどうやって書いたらいいのか

How To 的な知識はどうでもいいんだけど、ソースコードがどのようにして中間コードにコンパイルされて、仮想マシンが中間コードをどのように実行しているのかはかなり興味がある。こういった知識は IronPython とか cPython と連動させたときに役に立つんじゃないかと予想している。

さっそく水曜日の夜に予約したんだけど、、、、
今朝ステータスページを見てみたら売り切れてました _| ̄|○il|!

Reference
.NET Languages
研究段階も含め .NET で動くさまざまな言語が紹介されている。Ruby や Haskell があるのはわかるのだが COBOL まであることには驚いた。

| | コメント (0) | トラックバック (0)

[ python2.5 ] 新しく加わった all() と any()

Python2.4 まではリストやタプルに含まれるすべての要素が True なのか、あるいは False なのかを調べるのは結構面倒でした。要素をひとつずつ取り出してfor でまわすとかね。

Python2.5 では、これらの処理を楽にするために all() と any() という関数が組み込み関数に追加されました。前者はすべての要素が True のときに True を返し、後者はどれかひとつでも True があれば True を返します。あ、False が返るのは前述の場合以外ね。

たとえばこんな感じ↓

Python 2.5 (r25:51908, Nov  6 2006, 14:35:55)
>>> all_true = [True, "hoge", 255, ["nested_list"]]
>>> all( all_true )
True
>>> any( all_true )
True
>>> true_false = ["hoge", '', 255, 0]
>>> all( true_false )
False
>>> any( true_false )
True
>>> all_false = [False, '', 0, [] {}]
>>> all( all_false )
False
>>> any( all_false )
False

使う場面としては、並列処理の結果をリストに保存してひとつでも False があったら、つまり all() の結果が False になったら処理をやり直すかリカバリ処理を行うということが考えられます。

まとめ
all() は全部が True だったら True を返す。ほかの場合は False を返す。
any() はどれかひとつでも True があれば True を返す。全部が False のときのみ False を返す。
どっちも中身は for で回しているだけだったりする(´・ω・`)

| | コメント (0) | トラックバック (0)

2006/12/04

[ python / books ] 実践Python errata

日本でも Python が広まってきたようでうれしいですね。

さて、実践 Python という Python 入門書が出版されたようなので 読み始めてみました。まだ序盤ですが、Python が純粋な OOP 言語 と紹介されていることと、エラーが多めな点を除けばいいんじゃないかと思います。

Learning Python と 実践 Python のどちらがいいのかというのは 読了まで待つとして、気づいたエラーとその訂正でも書いていこうかと思います。 わたしもまだ読んでいる途中ですので気付いたものから書いていきます。

友人から教えてもらって判明したのですが、このページが Google の Web 検索でかからないとか。 なんでも、先日の朝方までは "実践Python" で検索すると出てきたのに いまでは全く引っかからないとか ( ほかのページは引っかかるようですが ) 。 う~ん、ここは Blog なので Blog サーチじゃないと出てこないとか?そんなところじゃないかな?

2006/12/11 AM11:05
このページが Google 八部にされていることを確認しました。
Google に URL 再登録を頼んでみましたが・・・。再度削除された場合、これに関して別エントリを書こうと思います。Google に削除要求を送ったと考えられるのは、4 つくらいあるわけだけどね。わたしは卑劣で姑息な手段が大嫌いだ。さて、どう書いてくれようか。
2006/12/11 17:42
Google に申請した再登録手続きの結果が反映された様子。現在、復帰しています。
さて、どうなるでしょうかね。
P19 configure--help configure --help
( configure と --help の間に半角スペース)
P50 Python のサンプルコード
[x *10 for x in xs if not x % 2]
[even for even in range( 1, 11 ) if even % 2 == 0]
( 関数にする必要はないんじゃないかと )
P71 図6-2-1-1 文字の抽出
( 正のインデックス )
文字の抽出 ( 負数を使った indexing )
右端から数えて n 番目というときは負数を使った indexing
P78 サンプルコード
a.center( len( b ) + 4 )
a.center( len( a ) + 4 )
len( b ) の場合エラーになります。たぶん len( a )
P98 サンプルコード7-2-9-1
for x, s in zip( a, b ):
print x, s
↑インデントがない
for (x, s) in zip( a, b ):
     print x, s
P113 サンプルコード 8-1-3-1
>>> len((1, 2, 3))      # タルの長さ
# タルの長さ
tuple ( タプル ) ですよ。 (^_^ ;
P113 表 8-1-3-1 リストメソッド は集合演算を行うことで確認できます。
wrapper_descriptor も含めるならいくつか増えますね。
コードは次のとおり。
list_method = set( [method for method in dir( [] ) if eval( "callable( list.%s )" % method )] )
for seq_obj in ("''", "u''", "()"):
     exec "list_method -= set( dir( %s ) )" % seq_obj
print list( list_method )
P121 pop はリストの末尾要素を削除します。引数はとらずに、 リストの末尾要素を捨ててしまうのです list.pop() は引数とれますがな。pop() が切り出すのは末尾要素とは限りません。 help( list.pop ) でヘルプ参照してください。
list.pop() に引数を与えると次のようになります。
>>> ascend = range( 10 )       # 0~9までの整数のリスト
>>> [ascend.pop( 0 ), ascend.pop( 5 )]
[0, 6]
>>> ascend
[1, 2, 3, 4, 5, 7, 8, 9]             # 切り出した要素はなくなってる

正しくは ( help() の要約だけど )↓
「pop() は指定されたインデックスの要素を返す( return する ) と同時に、 その要素を元のリストから削除します。デフォルトではリストの最後の要素が対象です。 存在しないインデックスを指定された場合は IndexError 例外を発生させます。」
P137 サンプルコード 9-1-5-2
>>> print z      # None ふぁ返される
# None が返される
笑わせてもらいました (^-^;;
P157 10-1-6 >> オブジェクトのメソッド
オブジェクトの属性のうち、オブジェクトにピリオド「.」を続けることで アクセスすることができるものを「メソッド」といいます。
・・・・・・(;´Д`)
ピリオドを続けることでアクセスすることができるものが 必ずメソッドであるとはいえません。文字列や数値の時もあります。 メソッドとは何らかの機能を持った callable なものです。
P165 11-3-3 複数の値を返す
複数の戻り値を変数と利用するためには、戻り値と同じ数の変数を用意して、 関数の代入を行います。
Python では return に続けて複数のオブジェクトを指定した場合、 それらはひとつのタプルの中にまとめられて返されることになっています。 したがって、当然のことですが、ひとつの変数で受け取ることも可能です。
>>> def multiple_value_func():
...         return "hoge", "fuge", "piyo"
...
>>> cargo = multiple_value_func()
>>> cargo
('hoge', 'fuge', 'piyo')

return の後ろに指定したオブジェクトの数と同じ変数を用意しなければならないのは、 unpacked assignment を行ってタプルの要素をそれぞれの変数に代入するときだけです。

さらに、関数の代入とは次のようなものです。
>>> cargo = multiple_value_func        #() がないことに注目
>>> cargo
<function multiple_value_func at 0x1871456c>

関数を呼び出した場合には戻り値が変数に入りますが、 関数を代入した場合には関数への参照が変数に入ります。 関数の呼び出しと代入はまったく違うものです。
P172 構文
def 関数名( 引数リスト ):
"文字列"
     関数ブロック

def 関数名( 引数リスト ):
"""文字列"""
     関数ブロック
def 関数名( 引数リスト ):
     文字列リテラル
     関数ブロック

関数ブロック内は、コメントや doc ストリングであっても インデントが必要になります。
P183 図 12-1-2-1
def class1()
     "This is sample class."
     pass
class sample_class1( object ):
     "This is a sample class."
     pass

クラスの定義は def ではなく class キーワードで開始します。
また、class ステートメントの末尾にはコロンが必要です。
P185 構文 12-1-5-1 dir 関数
dir( ジュールオブジェクト )
dir( モジュールオブジェクト )
なお、dir() はモジュールオブジェクト以外にも使うことができます。
P188 構文 12-1-9-1
if __name__ == '__main__':
実行する関数・オブジェクト

サンプルコード 12-1-9-1 runAsProg.py
if __name__ == '__main__':
main()
if __name__ == "__main__":
     実行する関数・オブジェクト

if __name__ == "__main__":
     main()

構文・サンプルコードともにインデントが不正です。
サンプルコードが間違っているので図 12-1-9-1 もおかしいです。
サンプルコードを実行すると IndentationError が返ってきます。
P193 コラム itertools モジュール
lzip, imap, ifilter 関数
izip ですね。
itertools モジュールが持つ callable オブジェクトは次の式で確認できます。
[method for method in dir( itertools ) if eval( "callable( itertools.%s ) == True" % method )]
P197 12-4-2 パッケージをインポートする
インポートされたパッケージは、Python のオブジェクトとしてはモジュールとまったく module 型であることがわかります。
インポートされたパッケージは、Python のオブジェクトとしてはモジュールとまったく同じ module 型であることがわかります。
P203 13-1-4 クラスを定義する
クラスの定義するには class ステートメントにより行います。( 中略 ) そしてコロン「:」を続けた後、通常は改行インデンテーションを行ってから
クラスの定義するには class ステートメントを使います。( 中略 ) そしてコロン「:」を続けた後、通常は改行をしてインデンテーションを行ってから
P218 サンプルコード 13-4-5-1
>>> len( c )
10
>>> len( c )
5
P219 サンプルコード 13-4-6-1
>>> class Container( object ):
. . .      def __init__( self, start, end ):
. . .           self.start = start
. . .           self.end = end
. . .      def __len__( self ):
. . .           return self.end self.start + 1
>>> class Container( object ):
. . .      def __init__( self, start, end ):
. . .           self.start = self.start
. . .           self.end = end
. . .
. . .      def __len__( self ):
. . .           return self.end - self.start + 1

ミ ってなんでしょう?そんな演算子なかった気が・・・
あと Iterator メソッドの定義にある self.pos = start では NameError がでますね。ここはインスタンスが持っている start 、つまり self.start を代入するようにしなければなりません。
P304 ctypes パッケージの解説
Python のオブジェクトとして直接利用できる協力な機能です。
強力な機能です。

ついでに Tips 的なものをば( ´・ω・`)

P120 リストの要素追加
append() も map() と組み合わせると複数の要素を追加できます。
None が入ったリストが標準出力に帰ってきますが orz
>>> test_list = []
>>> map( test_list.append, list( "hoge" ) )
[None, None, None, None]
>>> test_list
['h', 'o', 'g', 'e']
P123 リスト演算の違い
x = x + [1] と x += [1] の違いは ID を調べることで確認できます。
x = x + [1] の場合
>>> a = []
>>> old_id = id( a )
>>> a = a + [1]
>>> new_id = id( a )
>>> old_id == new_id
False

x += [1] の場合
>>> a = []
>>> old_id = id( a )
>>> a += [1]
>>> new_id = id( a )
>>> old_id == new_id
True
P126 タプルの順序を反転する
list.sort() に reverse フラグがあるように組み込み関数 sorted() にも reverse フラグがあります。これを利用してもタプルの要素の並び順を反転できます。
>>> ascend_tuple = tuple( range( 10 ) )
>>> descend_tuple = tuple( sorted( ascend_tuple, reverse=True ) )
>>> descend_tuple
(9, 8, 7, 6, 5, 4, 3, 2, 1, 0)

| | コメント (0) | トラックバック (0)

[.NET/MSIL] Bartok project

Microsoft Research で CIL ( Common Intermediate Language: 共通中間言語 ) からネイティブコードを出力するコンパイラが研究されているみたい。このコンパイラの名前は Bartok 。

Singularity という中間コードで書かれた OS が実験的に作られているらしくて、Bartok は Singularity が動作するときに中間コードをネイティブコードに翻訳するものとしてスタートしたみたい。

いまでは中間コードだけじゃなくて C# のサポートも視野に入っているらしい。
( このへん不安。英語力が低いので誤解しているかもしれません。)

「このアプリ動かすには.NET Framework が必要だから.NET Framework 入れて」とか「これを使うためには JavaVM が必要だから JRE 入れて」っていっても、なんでそんなことしなきゃいけないのっていうユーザは結構多い ( ソフトを動かすために別のソフトが必要ということが理解できないらしい )。

ユーザを説得するのは結構疲れるし、ユーザだって手間は少ないほうがいいと感じるに違いない。 Bartok が -- p2exe のように -- 別途 .NET Framework とかを入れる必要がないバイナリを出力できるなら、わたしは積極的に使ってみたいと思う。

MS Research の Advanced Compiler Technology のページでは他に VC++ コンパイラの Phoenix, GPU やマルチコアプロセッサ環境における並列処理に主眼を置いた Accelerator が開発されているそうな。Bartok と Accelerator のリリースが楽しみ。

Reference
Advanced Compiler Technology ( Microsoft Research )

| | コメント (0) | トラックバック (0)

2006/12/01

[books] Write Great Code とかいろいろ

Write Great Code -Thinking Low-level, Writing High-level Write Great Code vol.1 understanding the machine に続いて、 Write Great Code vol.2 Thinking Low-level, Writing High-levelも翻訳されたようです。

プログラムを書いていると、レイヤーの低い部分の知識が助けになることが結構あります。 実装しているとき以外にも、新しいプログラミング言語の勉強をしているときもそう。 今ではほとんどのプログラマは自分で実装することがないかもしれない、そんな知識だけど 持っていると助かることが多いんです。

OS とかよりももっと低い部分の知識。というより OS がどーだこーだの知識よりよっぽど大事ですよ。 OS の知識なんてバージョンアップとかパッチに伴う仕様変更で使い物にならなくなるものも少なくないからね。 OS が変わったら役に立たなくなる道具と、OS に関係なく役に立ってくれる道具があったとしたら、 どっちが "trivial" でどっちが "important" なんだろう。

Write Great Code で書かれているのは、OS が変わっても役に立ってくれる貴重な知識だと思う。 新しく出版される vol.2 ではコンパイラが生成するネイティブコードに焦点が当てられている。 Java や .NET のようにビルドするときは中間コードを生成するような言語でも、実行するときには 仮想マシンがネイティブコードにコンパイルしながら処理を進めていく。結局はどこかで ネイティブコードにコンパイルされるわけで、高級言語で書いた statement の違いがネイティブコードに どんな変化を与えるのか、パフォーマンスや安定性に与える影響はどうなのかということを 知っておくことはどこかで役に立つと思う。

Amazon.co.jp ではまだ予約扱いになっていますが、発送予定日は 12/2 ということなので早速予約しました。 ( * これを書いているのは 12/1 ですが、注文は 11/30 にしています。)

Write Great Code vol.2 のほかにヒトの変異 --人体の遺伝的多様性についてThe Art of Innovationも購入しました。早く到着しないかな。

| | コメント (0) | トラックバック (0)

« 2006年11月 | トップページ | 2007年1月 »