2009/11/13

[ Visual Studio ] Linux 用アプリ作成 add-in

Novell has launched a new add-in for Visual Studio that will allow Windows developers to test and deploy their .NET applications on Linux.
( Novel が開発した VS アドインを使うことで、Windows の開発者も .NET アプリの Linux 用パッケージの作成とテストを行えるようになる。)

( Test, package .NET apps for Linux with Visual Studio add-in, ars technica, Ryan Paul, 2009-11-11)

Novel から VisualStudio のアドイン MonoVS がリリースされました。

このアドオンを使うことで、VisualStudio 2008 で Linux 用パッケージの作成が行えるようになります。

Windows / Linux 両方で使えるクロスプラットフォームアプリを作成するのがかなり楽になりそうですね。

動作環境は Windows XP, Vista, 7 ( x86 でも x64 でも OK ) + VS 2008 SP1 ( Pro or Std )。
残念ながら Express Edition では動作しないようです。
また、VS2010 にも未対応の様子。

Reference
Test, package .NET apps for Linux with Visual Studio add-in
Mono Tools for Visual Studio

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

2009/11/03

[ Linux / 備忘録 ] make install したソフトを Paco で削除する

Unix 系の OS では「自分でビルドして使ってね」というソフトが少なからずあります。
自分でビルドするといっても、大抵は configure -> make -> make install するだけなのですが、この方法には大きな欠点があります。

そう、簡単にはアンインストールできないのです。

make uninstall があるソフトもあることはある (*1) のですが、これを実行するためにはソースコードを取っておかなければ (*2) なりません。make uninstall ができない場合は、Makefile を解読して (*3) どこにファイルが放り込まれたかを調べながら手動で削除しなければなりません。

何かいい方法はないものかと探していると、paco なるものを見つけました。
paco は pacKAGE oRGANIZER の略らしいです。

paco のインストール

paco のソースをダウンロードします。最新版は 2.0.7 です。
ダウンロードしたファイルを展開し、作成されたディレクトリに移動します。あとは↓のコマンドを打つだけ。

$ ./configure
$ make
$ sudo make install
$ sudo make logme

最後の "sudo make logme" は paco 自身のインストールログを記録し、アンインストールできるようにするものです。paco を削除する予定がないなら実行しなくても問題ありません。

2009-11-11 追記
make で "No package 'gtkmm-2.4'" というエラーが出てしまう場合は、下記コマンドで libgtkmm をインストールしてください。

$ sudo aptitude install libgtkmm-2.4-dev

paco の使い方

ソフトをインストールするときは、make install の代わりに以下のコマンドを実行します。package name の部分はインストールするソフト名に置き換えてください。

$ sudo paco -lp package_name "make install"

アンインストールは以下のコマンドを使用します。package_name の部分はアンインストールするソフト名に置き換えてください。

$ sudo paco -r package_name

上記コマンドを実行した場合は、共有ライブラリの削除の際にはどうするかをユーザに問い合わせるようになります。他で使っているかもしれない場合は残しておきましょう。なお、共有ライブラリであっても問答無用で削除する場合は以下のコマンドを実行します。

$ sudo paco -r --remove-shared package_name

(*1) ほとんどの場合 make uninstall と叩いても「そんなものないよ」となりますが。

(*2) 全部取っておかなければならないというのは稀。でもログは取っておく必要がある。しかし、ログさえも出力しない素敵なソフトもある。

(*3) --target とか --prefix でインストール先を指定できるものでも、指定していないディレクトリにファイルを突っ込んでくださる大変親切なソフトも存在する。

Reference
paco - pacKAGE oRGANIZER

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

2009/10/26

[ VS2010 ] VS2010 beta 2 System Requirement

以前のエントリで「 VS2010 beta2 の必要スペックが・・・」と書きましたが、個別ダウンロードページに書いてありました。

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

2009/10/24

[ .NET ] VS2010 Pro は標準で F# が入っている

VisualStudio 2010 Pro をインストールしてみました。
下はインストール途中の、コンポーネント選択画面の一部です。

F# が標準で入っています。
IronPython は入っていませんねw

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

2009/10/23

[ .NET ] IronPython and IronRuby for .NET4.0 beta2

.NET4.0 beta2 用の IronPython と IronRuby がリリースされました。
.NET4.0 環境でビルドされたもので、このリリースで dynamic 型など .NET4.0 で新しく追加されたオブジェクトも扱うことができるようになったようです。
機能は IronPython2.6RC、IronRuby0.9 とほぼ同等だそうです。

ただし現在はまだα版、β版という位置付け。
不具合があったとしてもそこはご愛嬌(´・ω・`)b

IronPython for .NET4.0 beta2 ダウンロードページはこちら
IronRuby for .NET4.0 beta2 ダウンロードページはこちら

なお、実行には .NET Framework 4.0 beta2 が必要になります。
.NET4.0 beta2 のダウンロードはこちら

Reference
IronRuby and IronPython for .NET 4.0 Beta 2
( 2009-10-22, JIMMY. THINKING, Jimmy Schementi )

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

[ .NET/VS2010 ] VS2010 beta2 is available

Visual Studio2010 Professional beta2 がダウンロードできるようになっていました。
いまのところ英語版のみのようです。

こちらのページにある "download the beta now" をクリックするとインストーラがダウンロードできます。

しかし、環境条件などの確認ができないので一抹の不安はありますね。
現在は VS2005 Pro を使っているのですが、VS2010 をインストールしても大丈夫なのでしょうか?

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

2009/05/19

[ C# ] generics

いままで C++ とほとんど変わらない ( lambda 式とか入ったりしたけど ) コードしか書いていませんでしたが
C#4.0 を機に generics とかも勉強始めました。

C#2.0 を見たときは、あまりよく思わなかった generics ですが、今見てみると便利なものに感じます。
概要を教えてくれた havana に感謝。

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

2009/04/22

[ python ] こりゃひどい・・・

設定ファイルに記述されている数字が 0~99 であるか判定するコードで↓みたいなのを見て唖然。


if (len( fragment ) < 0) and (9 < len( fragment )):
	raise Exception
else
	if (fragment[0] < '0') or ('9' < fragment[0]):
		raise Exception
	elif ((len( fragment ) == 2) and ((fragment[1] < '0') or ('9' < fragment[1]))):
		raise Exception

これ書いたやつは何考えているんだろうか?
正規表現か、int() つかって数値変換すれば一瞬で終わるんじゃないの?
"000012" みたいなのを指定されたときなんか考えると、正規表現はめんどくさいので int() 使ってみる。


setting = int( fragment )
if (setting < 0) or (99 < setting):
	raise Exception

Simple is better than complex.

2009-04-22 追記
一応正規表現版。抜けがあるかも・・・


if re.match( r"^0*\d{1, 2}$", fragment ) == None:
	raise Exception

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

2009/03/30

Google Chrome for Max OS X

via ars technica: Chrome for OS X: State of the Browser
Google Chrome の repository に Mac OS X 用の Cocoa シェルが追加されたそうな。

リンク先のページでは、ソースコードの取得からビルド方法の解説もあります。 Mac OS X を持っている人は試してみては?

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

2009/03/26

[ IronPython ] 日本語処理ライブラリ: VisualStudio International Pack

傀儡子の館.Python で、Microsoft が公開している日本語処理用ライブラリの存在を知る。

試そうと思ったものの、傀儡子の館さんのリンク先は「ページが見つかりません」。
MS のディベロッパー製品開発統括部 Blog のリンク先も「ページが見つかりません」。
現在のダウンロード先を探すのが面倒でした。

現在は Service Release1 がリリースされているようで、以下からダウンロードできます。
Microsoft Visual Studio International Pack 1.0 SR1

早く試してみたいところですが、試せる環境が・・・

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

2008/12/02

[ F# ] F# CTP と F# for Azure

いまさらですが、F# CTP が公開されていますね。

それと F# Developer Center もできています。とりあえず面白そうなものを発見。

F# もほんの触りしかわかっていないのでいつ理解できるようになるかわからないけどね!

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

2008/10/21

[ 備忘録 / dev ] Copy on Write

Copy on Write Page Protection for Windows NT, Windows 2000, or Windows XP

プロセスを fork() したとき、すぐにはメモリ領域のコピーは行われないよということらしい。何かメモリ上のデータを書き換える必要が出るときまでは親プロセスと子プロセスで実メモリ空間は共有されている ( 仮想メモリ上は別に見える )。書き換える必要がでたときに実メモリ空間のコピーが行われ、それぞれのプロセスで独立したメモリ空間を持つことになると。

こうすることでメモリの浪費を抑えたり、パフォーマンスの低下を押さえられるらしい。

Linux で fork() したときも Copy on Write が発生し、これが top コマンドと ps コマンドで観測される値の差の原因になっている。

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

2008/10/20

[ VisualStudio ] VS2008 は重いらしい

メッセンジャーで VS についてちょっと語った時のこと。

havana の発言:
VisualStudio2008の起動時間をなんとかしてほしいぬ…
fomalhaut@ telephone considered harmful の発言:
VS2005 で起動時間はマシになったと思っていたんだが
fomalhaut@ telephone considered harmful の発言:
VS2008 でまた遅くなったの?
havana の発言:
3倍くらい
havana の発言:
2005はよかったね。。。
fomalhaut@ telephone considered harmful の発言:
家ではまだ VS2005 なんだけど
havana の発言:
うちのx31だとEclipseの倍くらいかかるお。。
fomalhaut@ telephone considered harmful の発言:
アップグレードしなくてよかったかもしれない・・・
havana の発言:
Wizardの動きもなんかやたら時間かかるし
fomalhaut@ telephone considered harmful の発言:
「Eclipse の倍」の時点で使う気が・・・

Eclipse の倍ってオイオイ・・・

VS2008 には XAML とか WCF ( コードネーム Indigo ) のネイティブサポートがいいなと思っていたんだけど、 どんなに高機能でも超重力の中で作業しなきゃならないようなアプリは日常的に使いたくないなぁ

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

[ dev / SDK ] Touchless SDK

Microsoft が Touchless SDK を公開した。

Touchless はカメラの前でジェスチャーするだけでコンピュータを操作する技術で、MS Office Lab で研究されていた。この技術を利用した Demo アプリのいくつかは Codeplex のプロジェクトサイトからダウンロードできる ( デモアプリは Downloads & Files の Touchless.zip )。デモアプリについては窓の杜に記事があるのでそちらを参照。

Touchless の SDK も一緒に公開されている。PC 全部をジェスチャで操作ってのは考えられないけど、マウスカーソルを使った操作とかはこれで置き換えられるかもしれない。後はゲームでもジェスチャを取り入れたものが出てきたりしそうな気がする ( Wii のインターフェイスをさらに発展させたような )。

なお、Touchless SDK はソースコードも公開されています。

実は大学卒業時に「あんまりつかわないな~。面白くないし」と webcam を捨ててきてしまったわたし(´・ω・`)
AR とか面白くなってきたしまた買おうかな。

Reference
Microsoft Office Labs: Project Touchless
Codeplex: Touchless SDK
窓の杜: MS、マウスもキーボードも触らずにUSBカメラで操作する「Touchless Demo」公開

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

2008/05/26

[ 備忘録 / Python ] IPv6 any address

socket.INADDR_ANY は IPv4 用なので IPv6 では使えない。

Linux ならば、IPv6 の場合は setsockopt でソケットオプションを自分で指定することで可能。

import socket
listen_any_address = socket.socket( socket.AF_INET6, socket.SOCK_DGRAM )

listen_any_address.setsockopt( socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0 )
listen_any_address.bind( ("::", 12345) )

netstat で確認すると any address で待ち受けているのが確認できる。

$ netstat -anp | grep udp
udp6    0   0 :::12345      :::*        17343/python

Windows では setsockopt に IPV6_V6ONLY を指定できないのでこの方法は使えません。
Windows 版 Python で IPv6 any address を使用する方法をご存知の方。ご教授お願いします。

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

2008/05/21

[ F# ] F# 1.9.4.17 released

F# 1.9.4.17 がリリースされていました。

release announcement によるとバグ修正のほか VS と連携させた時の使い勝手を向上させたり、ライブラリのパフォーマンスチューニングが行われている様子。

MSI 形式のインストーラ
ZIP 圧縮形式

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

2008/04/11

[ .NET / C# ] cryptographic library

個人的に .NET で暗号化方式を実装してみたくなったのでメモ。

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

2008/04/09

[ C#3.0 ] ラムダ式の戻り値の型指定はできない? - そんなわけないでしょ

CodeZine に .NET3.5 の導入記事があったので読んでみたのだが、そりゃ違うだろってところがあったのでそれについて。

ラムダ式とは、ある処理を行い、単一の結果を返却する名前を持たないメソッドを定義する機能です。このメソッドはデリゲート型として利用することができ、定義したラムダ式を変数に代入しておくことも可能です。ラムダ式を利用した場合、戻り値の型を明示的に指定することはできませんが、処理内容から戻り値の型は自動的に型推論されます。

( とことん理解する .NET Framework3.5, WINGS プロジェクト りばてぃ / FUJIKO / ナオキ 著, 2008/03/07 )

違うところは以下の2点

  • 名前を持たないメソッドを定義する機能
  • 戻り値の型を明示的に指定することはできません

まず、C# においては「名前を持たないメソッドを定義する機能」という記述は正確ではない。正確には「名前を持たないメソッドも定義できる機能」ということになる。実際、リンク先の例ではメソッドに func という名前が付いている。

次に「戻り値の型を明示的に指定することはできない」というのも大ウソ。型推論に任せることもできるが、プログラマが戻り値を指定することもちゃんとできる。

名前を持たず、かつ戻り値の型も明示した場合の例は↓のようになる。


using System;

class SampleClass{
    static int Main(){
        System.Console.Write(
            ((Func< int, int, bool >)((i, j) => i == j))( 1, 3 )
        );
        return 0;
    }
}

この例では Func< int, int, bool > の部分で引数と戻り値の型を指定している。続く((i, j) => i == j) と合わせることで引数 i, j は int 型であり、戻り値は bool 型であることがわかる。そして、定義した関数にすぐさま2つの引数を渡している。定義している関数は完全な無名なので、後でなにか識別子名を利用してこの関数を呼び出すということはできない。

まだ理解が怪しいのだが、実際には ((i, j) => i == j) を Func< int, int, bool > という型にキャストすることになるようだ。

さて、ラムダ式に渡されている引数を "hoge" と "piyo" にして再度コンパイルしてみてほしい。コンパイルエラーになるはずだ。わたしの環境では以下のエラーが表示された。

C:\dev>csc lambda_test.cs
Microsoft (R) Visual C# 2008 Compiler version 3.5.21022.8
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.

lambda_test.cs(6,13): error CS1594: Delegate 'System.Func<int,int,bool>' has
        some invalid arguments
lambda_test.cs(6,59): error CS1503: Argument '1': cannot convert from 'string'
        to 'int'
lambda_test.cs(6,67): error CS1503: Argument '2': cannot convert from 'string'
        to 'int'

見てのとおり型が一致しないというエラーだ。エラーメッセージを要約すると「第一引数と第二引数は int 型が指定されているが string 型が渡されてきた。これは無効な引数だぞ」というわけだ。

では次に Func< int, int, bool > を Func< int, int, int > に置き換えてコンパイルしてみてほしい。やはりコンパイルエラーになると思う。たとえばこんなエラーが表示される。

C:\dev>csc lambda_test.cs
Microsoft (R) Visual C# 2008 Compiler version 3.5.21022.8
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.

lambda_test.cs(6,48): error CS0029: Cannot implicitly convert type 'bool' to
        'int'
lambda_test.cs(6,48): error CS1662: Cannot convert lambda expression to delegate
        type 'System.Func<int,int,int>' because some of the return types in the
        block are not implicitly convertible to the delegate return type

こちらもやはり「型が一致しない」というエラーだ。それもちゃんと「戻り値の型が一致しない」という内容になっている。

というように完全にユーザ定義の識別子名を付けないメソッド定義も可能だし、戻り値とか引数の型を指定することも可能なのだ。

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

2008/01/12

[ book ] C# 3.0 Cookbook 3rd ED

C# 3.0 CookBook 3rd ED が Safari に入ってたので早速入れ替えた。

やっぱり Safari は便利。

リファレンスはいつでもどこでも必要なときに手に取れることが理想だけど、優れたリファレンスであっても 1000 ページ近くある本を持ち歩くのは辛いし ( というか体力的に無理です )、リファレンスは検索性も優れていなきゃって思う。

わたしの場合は生活のほとんどをネットに繋がった環境で過ごしているわけで、Safari は「いつでもどこでも」と「検索性」の両方を満たしてくれる。Oreilly さんに感謝です。

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

2008/01/07

[ bookmark ]

Learning WPF through F#, and vice versa
WPF について、F# を前提に学ぶことを目的としたエントリらしい。
詳細はまだ読んでない。
Objective Caml 入門
プログラミング in Ocamlの元になったというサイト。
こちらのほうがより学術的な内容になっている気がする。

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

2008/01/04

[ book ] C# 3.0 の本

Programming C# 3.0, 5th EDC# 3.0 CookBook が出版されてた。

うわ~、まだ Programming C# 第四版読み終わってないよ (>_<;)

Programming C# のほうは目次を見る限りでは Parallel Extensions を使ったプログラミングの解説はされていないっぽい。C# CookBook でも、目次を見る限りでは、PLINQ とか TPL を使ったプログラミングには触れられていないようだ。

個人的に興味があるのは追加された型推論、Reflection, Lambda Expression, LINQ, Anonymous Type あたり。
買うかどうかは中身を見て決めよう。

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

2008/01/03

[ .NET ] .NET Framework 3.5 SDK

.NET Framework 3.5 SDK が 1/2 にアップデートされていました。

ダウンロードページ

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

[ 備忘録 / F# ] List Comrehension

brackets で式を囲むと list, brace で式を囲むと seq になる。

> (* brackets の場合は list *)
- [ for integer in 1 .. 10 -> integer * integer ];;
val it : int list = [1; 4; 9; 16; 25; 36; 49; 64; 81; 100]
> (* brace の場合はseq *)
- { for integer in 1 .. 10 -> integer * integer };;
val it : seq = seq [1; 4; 9; 16; ...]

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

2007/12/26

[ニッキ] 変数名

via ときどきの雑記帖 リターンズ

とあるスクリプトの、変数名に、 get_ほげほげというのを発見。

おまい、それはメソッド(関数)に使うべき名前だろおおおおッ!! 変数が get してどうすんだよッ

激しく同意。

変数名get だけじゃなくてupdate とか、メソッド名sys が使われていたり、 c_str っていう関数が定義されているコード読まされてるけどね。

それ以外の変数名も hoge, hoge_, hoge__, hoge___ みたいにアンダーバーを増やすことで区別してるとか。

sys というメソッド名からその正しい動作を連想するのはかなり厳しいと思うんだが。「システムの動作」っていわれて連想するのはひとつじゃないからね。

加えて、予約語と同じとか予約語になりそうな識別子名は使わない、標準関数で使用されている識別子名は使わないってのは、バグ・混乱を避けるための手段の一つだと思うんだけどそれを率先して無視しまくってるのが素敵だ。

今日も疑問に思ったんだが、何で C++ 何ぞやっているんだろうか?
ほかにやりたいことがあるというのに・・・

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

[ F# / Python ] フィボナッチ数列

via ときどきの雑記帖 リターンズ

MSN相談箱 以下のプログラミング(C++)がわかりません。
以下のプログラミング(C++)がわかりません。
質問者:kens-1813 以下の問題のプログラミング(C++)がわかりません。誰かわかる人いますか?

フィボナッチ数列f1=1,f2=1,f3=2,f4=3…は漸化式
f1=1,f2=1 n≧3でfn=f(n-1)+f(n-2)
で定義されます。
(a)fnを計算する関数f(n)を、再帰的定義を用いて作ってください。

(b)画面から入力された整数nに対して、フィボナッチ数列fnを出力するプログラムを書いてください。かならず、(a)で作った関数を呼び出すようにしてください。

ひでぇ

上の雑記帖では質問が酷いといっているのか回答が酷いといっているのかわからないけど、わたしは質問が酷すぎると思った。 自分で考えたという形跡がまったく見られない。再帰がわからないならそのことを質問するべきだし、 コードを書いてみたんだけどエラーがでてしまって動かないとか、いつまでたっても処理が終わらないなら 自分が書いたコードを添えてどこを直したらいいのかを質問すればいい。

問題をそのまま丸投げでは、そりゃ叩かれる。

まったくの専門外で、一般教養の講義でいきなりこの問題を出されて「再帰」が何なのかさっぱりわからない、 C++ も全くといっていいほどわからないというなら、正直にそのことを書けば解説もついたんだろうけど。 ( 専門外の、専門的な知識が要求される課題の辛さは良くわかっているのでわたしなら回答します )

ついでなので F# と Python で書いてみた。まずは F#


let rec fibonacci = fun integer ->
  match integer with
  | integer when integer <=  0 -> failwith "Invalid Argument"
  | integer when integer <= 2 -> 1
  | integer when integer >  2 -> fibonacci (integer - 1) + fibonacci (integer - 2)
  | _ -> failwith "Invalid Argument";;

で、Python ( 2007/12/28 修正。integer < 0 となっていたのを integer <= 0 に直しました orz )


fibonacci = lambda integer: (None if ((type( integer ) != int) or (integer <= 0)) else 
	(1 if integer <= 2 else (fibonacci( integer - 1 ) + fibonacci( integer - 2 )))
)

追記
C++ でも書いてみた (´・ω・`)


#include <stdio.h>
#include <iostream>

using namespace std;

unsigned long int fibonacci( unsigned long int ordinal_number )
{
	/*
	   関数名 fibonacci
	   引数   ordinal_number 
	   
	   概要:
	   フィボナッチ数列における序数 ordinal_number の時の値を返す。
	   引数が不正だった場合は 0 を返す。
	 */
	
	if( ordinal_number == 0 )
	{
		return 0;
	}
	
	if( ordinal_number <= 2 )
	{
		return 1;
	}else{
		return (fibonacci( ordinal_number - 2 ) + fibonacci( ordinal_number -1 ));
	}
}

int main( void )
{
	for( unsigned long int ordinal_number = 1; ordinal_number <= 10; ++ordinal_number )
	{
		cout << fibonacci( ordinal_number ) << endl;
	}
	
	return 0;
}

どれも漸化式をそのまま実装したのでスピード遅いです(´・ω・`)

2007.12.29 追記
高速版。漸化式をそのまま実装した場合は、引数が 3 以上のとき fibonacci() が (引数 + 1) 回呼び出されるから。 また、再帰の制限をしていないので引数が大きすぎるとスタックを使い果たしてしまう可能性もあります。この問題は、 一般式をちょっと改良したものを実装することで解決できます。

Python の場合

import math
fibonacci = lambda integer: (None if ((type( integer ) != int) or (integer <= 0)) else
    math.floor((((1 + math.sqrt( 5 )) / 2) ** integer / math.sqrt( 5 ) + 0.5))
)

F# の場合

open System;;
let fibonacci = fun ordinal -> 
    match ordinal with
    | ordinal when ordinal <= 0.0 -> failwith "Invalid Argument."
    | ordinal when ordinal <= 2.0 -> 1.0
    | ordinal when ordinal >  2.0 -> Math.Floor( Math.Pow( ((1.0 + Math.Sqrt( 5.0 )) / 2.0 ), ordinal ) / Math.Sqrt( 5.0 ) + 0.5 )
    | _ -> failwith "Invalid Argument.";;

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

2007/12/17

[ python ] CRC32 を文字列で取得する

Python で CRC32 を計算する方法はいくつかあって、binascii モジュールか zlib モジュールを使う方法が一般的だと思うんだけど、これらのモジュールにある crc32() で得られるのは整数型のオブジェクトだ。

文字列で CRC32 を得る必要性が出たのでさらっと書いてみた。

convert_crc32_string = lambda message: "".join( [string.rjust( hex( ord( byte ) )[2:], 2, '0' ) for byte in struct.pack( "!i", binascii.crc32( message ) )] )

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

2007/12/13

[ IronPython / VS2008 ] IronPython Studio 登場

IronPython Studio は無料で使える Python のフル IDE ( 統合開発環境 ) です。VS SDK に IronPython のサンプルとして同梱されているものをベースにしています。

IronPython Studio は VS2008 のシェルランタイム ( これはロイヤリティフリーです ) をベースにしており、どのバージョンであっても動作します ( 訳注: ここでの「バージョン」は Standard とか Professional といったものをさしているのだと思います )。

Visual Studio 2008 に IronPython 用の機能を追加する拡張パック IronPython Studio が公開されています。

ダウンロードページは こちら

IronPythonStudioSetup というリンクをクリックすると使用承諾許可証が表示されるのでそれを読んでから "I agree." ボタンをクリックしてください。zip ファイルのダウンロードが始まります。

zip ファイルのダウンロードが終わったら、ファイルを解凍しましょう。 IronPythonStudio.msi というファイルが出てくると思います。これを実行すればインストールすることができます。

なお、IronPython Studio をインストールする前に Visual Studio2008 Shell Isolated Mode をインストールしておく必要があります。IronPython Studio のソースコードを利用するためには Visual Studio2008 SDK 1.0 が必要になります。VS2008 SDK はインストール・実行には必要がないようですが、Standard 以上ならば入れておくことをおすすめします。

実は、まだ VS2008 を持っていないわたし・・・
MDSN サブスクリプションレベル上げようかな・・・

Reference
IronPython Studio
Visual Studio 2008 Shell Isolated Mode
Visual Studio 2008 SDK 1.0
Visual Studio2008 評価版ダウンロードページ

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

2007/12/06

[.NET] WF ( Windows Workflow Foundation )

Windows Workflow Foundation は、プログラムが実行される流れ ( 処理の流れ: workflow ) を定義しやすくするためのフレームワークらしい。つまり、ルールを記述してそのルールに合ったメソッドの実行を整理した形で行うようにするためのフレームワーク。

今までまったく違う先入観があったので見向きもしなかったんだけど、↑で間違っていないならすごく有用なフレームワークだと思う。

havana と話したところによると、リクエストを跨いだトランザクション処理とかをマシに書けるようになるかもしれないんだとか。

WWF は WCF と相性がいいのかもしれない。

で、なんで C/C++ なんて読まされてるんだろう。

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

2007/12/03

[ C ] 確認したのか?

char* value;

なんて書式のほうがわかりやすかったはずだ。

今は文法的にこれは許されていないから、ポインタ変数の定義をする場合は、普通は仕方なく、

char * value;

と「*」を離して書くくらいしかできない。

実は最近のコンパイラはこのどちらの表現でもちゃんと解釈して「通る」のだが、古いコンパイラではこの文法を通さないものもあったため、教科書ではどうしても、

char *value;

と書いてあるものが多いのだ。

( 三田典玄の「体育館の裏話」 関数の話(5), 2007/10/19 )

えっと、何を何を言っているんだろうか?

char* value; がコンパイルできない???

ちゃんと確かめてからほざいてほしいものだ。gcc 2.95.3, gcc 3.4.4, gcc 4.1.2 で確認したが、全く問題なくコンパイルできるぞ。MSVC コンパイラ Version 14.00.50727.762 でも確認したが問題なくコンパイルできる。

#include 

int main( void )
{
	char* value = "hoge";
	
	printf( "%s\n", value );
	
	return 0;
}

上記サンプルコードをコンパイルしてみよう。まずは gcc 2.95.3

bash-2.05$ gcc --version
2.95.3
bash-2.05$ gcc test.c
bash-2.05$ ./a.out
hoge

gcc 2.95.3 はかなり古いコンパイラだが、エラーはもちろん警告すら表示されない。
gcc 4.1.2 でも確認を行ったが、こちらでもエラー・警告は一切表示されなかった。

では次に Microsoft の C/C++ コンパイラでコンパイルしてみよう。
わたしの環境では以下のようになった。

F:\>cl test.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

test.c
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.

/out:test.exe
test.obj

F:\>test.exe
hoge

みてのとおりこちらでもエラーにも警告にもならない。gcc 2.95.3 以前は全く知らないのだが、少なくとも「今のコンパイラ」ではエラーにも警告にもならないというのは上記の結果の通りだ。もしかしたらエラーになるすごくマイナーなコンパイラがあるのかもしれないが、わたしは char* value; という表記がエラーになると聞いたことは一度もない。

そのほか、char を 「8ビット符号付き変数」と解説している ( 正しくは、C の各型がどの程度の精度を持つのかは実装依存 ) など、全く正しい理解がされていないように思える。

「続く」とあるのだが、続きを書いて無理解をさらすより、C を一通り復習しなおしたほうがいいと思いますよ。

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

2007/11/27

[備忘録 / C++] C++ の map は Python の辞書オブジェクトに近い

A map is a container that stores pairs of keys and values. Looking up keys, inserting keys, and deleting keys can all be performed in logarithmic or better time. Maps support bidirectional iterators (no random access). In other languages and libraries, maps are also called dictionaries and associative arrays.

( C++ in a Nutshell, Oreilly & Associates Inc )

とあるように、C++ の map は「他の言語では辞書とか連想配列と呼ばれている」ものらしい。
こう説明されているとすっきり理解できるね。比喩は偉大だ。

で、multimap はというと

The multimap class template represents a map container that can store duplicate keys.

( C++ in a Nutshell, Oreilly & Associates Inc )

ということで、key の重複が許される map らしい。key の重複が許される点が Python の辞書と異なる。map も multimap も key に直接変更を加えることはできず、変更するときはいったん削除 ( erase ) してから変更したものを挿入 ( insert ) する必要がある。

A map's iterators are bidirectional. They return value_type references; use the first member to access the key or second to access the associated object.

( C++ in a Nutshell, Oreilly & Associates Inc )

map オブジェクトのそれぞれの要素の key にアクセスするには、それぞれの要素へのイテレータを取得してそのイテレータの first メンバ変数を使う。values にアクセスするには second メンバ変数を使うらしい。イテレータは find メソッドとかの戻り値として取得できる。

ところで何ゆえにわたしは C++ なんぞやっているんだろう。
他にやりたいことがたくさんあるのに。

最後に一言言わせてもらうとだ、「グローバル書き換えまくりプログラミングは最悪だ」。

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

2007/11/24

[備忘録 / .NET] Programming with PLINQ

Parallel LINQ: Running Queries On Multi-Core Processors

使い道は DB にクエリ投げるだけじゃなくて、他にもあるかもしれないなと思って。

そのうち実験してみよう。

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

2007/11/20

[.NET / VS2008] .NET3.5 正式版 、VisualStudio2008 正式版公開

.NET Framework 3.5 正式版と VisualStudio2008 ( コードネーム Orcas ) 正式版が公開されました。

.NET Framework 3.5 Runtime ( つまり実行環境 ) の方は こちら からダウンロードできます。

.NET Framework 3.5 SDK と Orcas は MSDN サブスクリプションからのダウンロード提供のみにとどまっているようで、まだ一般ユーザはダウンロードできないようです。

Reference
.NET Framework 3.5 ダウンロードページ
MSDN Subscriptions Download
MSDN .NET Framework Developer Center

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

2007/11/13

[ニッキ] おいおい・・・

ここ数日、悪い意味でとってもすごいコードを読んでいる ( バグ修正のため ) わけですが

まさか実務で i1 とか i2 っていう変数名をつけられているコードを読むことになるとは思いませんでしたよ。

変数名からはなにやっているんだかさっぱり想像がつきません。

現代でこんなコードを書く人は人生考え直したほうがいいと思う。

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

2007/11/04

[備忘録 / .NET] アプリにタブを実装する・いじくる

C/C++ だとこんなのがあるらしい
Automatic Tab Bar for MDI programs ( CodeGuru )

.NET だともっと楽になる。WindowsForms の TabControl をつかう。
TabControl コントロール (Windows フォーム) ( MSDN ライブラリ )

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

2007/10/22

[python] Python の三項演算子は使いづらい

Python の三項演算子は使いづらいなと思った。
Ruby とかの三項演算子に比べてだけど・・・

Ruby とかの三項演算子は (条件) ? (True のとき) : (False のとき) って書き方で、これは英文の if ... then ... else ... にそのまま対応しているから覚えやすい ( Ruby は if ~ が式として値を返すから if ... else を三項演算子として使うこともできるらしい )。

それに対して Python だと (True のとき) if (条件) else (False のとき) って書かなきゃならない。ソースを読んでいる途中で実は三項演算だった ( Tue のときの処理が長かった場合とかね ) ってこともあってびっくりすることがある。そうでない場合でも、なんとなくだけど「違和感」を感じてしまうのだ。

あと、yield が式になったのだから、raise も式にしてほしいと思う。

何を使いやすいと感じるかは人それぞれだけどさ。

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

2007/10/13

[F#] Asynchronous Method ( 非同期メソッド )

8/31 に ver1.9.2.9 がリリースされた F# だけど、新しく加わった Ansynchronous Method ( 日本語にすると非同期メソッド?) がとても便利そうだ。

こちらの Don Syme 氏の Blog にイントロダクションが書かれている。

また、Asynchronous Programming の解説は 11 月に出版される Expert F# にも書かれているらしい。非同期プログラミングが必要になりそうなのでこの本も予約した。

サンプルコードをざっと見ただけだけれど、非同期プログラミングがとても簡単に書けるように思える。某言語のようにサードパーティライブラリで非同期プログラミングという方法は、プラットフォーム間の互換性でえらい苦労するので言語自体で Asynchronous Workflow をサポートしたことはとても重要だと思う。

F# は触れたことがないタイプの言語なので、勉強していて楽しいし使っても楽しい。
早くこちらをメインで使えるようになりたい。

Asynchronous Method は C#3.0 にも実装されるという話があるそうな。

Reference
MS Research: F#
F# ダウンロードページ
F# マニュアル
Introducing F# Asynchronous Workflows

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

2007/09/23

[ python ] Threading で作成されるスレッドはネイティブスレッド

とある人から「Python では Thread / threading モジュールをを使ったとしても、ネイティブマルチスレッドアプリは作れない」と聞いていたのですが、少なくとも、Win32 環境においてはネイティブスレッドになるようです。

havana の発言:
  あれ
havana の発言:
  Pythonはネイティブスレッド使ってるって
havana の発言:
  書いてあるけど。
havana の発言:
  おお?
fomalhaut の発言:
  いや
fomalhaut の発言:
  そんなことないはずだけど・・・
fomalhaut の発言:
  threading つかってみ?
havana の発言:
  http://0xcc.net/blog/archives/000099.html
havana の発言:
  なまずのひととか
havana の発言:
  んー。
havana の発言:
  どうなんでしょう
havana の発言:
  ソース読めば解るな
havana の発言:
  ごそごそ
fomalhaut の発言:
  (´・ω・`)
havana の発言:
  Pythonの実装見てきたー
havana の発言:
  やっぱりthreadingのなかでthreadってモジュールを使ってて
havana の発言:
  threadの実装がプラットホーム毎に
fomalhaut の発言:
  うん
havana の発言:
  ネイティブスレッドでスレッドを実現する仕組み。
fomalhaut の発言:
  thread が低レイヤーのスレッド実装
fomalhaut の発言:
  
fomalhaut の発言:
  
fomalhaut の発言:
  thread 使っても
fomalhaut の発言:
  ネイティブスレッドにはならんらしいぞ
havana の発言:

PyThread_start_new_thread(void (*func)(void *), void *arg)
{
	Py_uintptr_t rv;
	callobj obj;

	dprintf(("%ld: PyThread_start_new_thread called\n",
		 PyThread_get_thread_ident()));
	if (!initialized)
		PyThread_init_thread();

	obj.id = -1;	/* guilty until proved innocent */
	obj.func = func;
	obj.arg = arg;
	obj.done = CreateSemaphore(NULL, 0, 1, NULL);
	if (obj.done == NULL)
		return -1;


havana の発言:

	rv = _beginthread(bootstrap, _pythread_stacksize, &obj);

havana の発言:
  ってなってるけど。
havana の発言:
  pthread実装とかもあるし。
havana の発言:
  んー
havana の発言:
  _beginthreadはWin32のスレッド開始めいれいだぬ
havana の発言:
  http://msdn2.microsoft.com/ja-jp/library/kdzttdcb(VS.80).aspx
havana の発言:
  はて。
fomalhaut の発言:
  (´・ω・`)
havana の発言:
  あとはネイティブスレッドでない場合
havana の発言:
  インタプリタ側でスケジューリングしないと成らないけど
havana の発言:
  それぽいところがみあたらん。
fomalhaut の発言:
  なるほど
havana の発言:
  うむ
havana の発言:
  ためしにPythonでタイマ100個つくってみたが
havana の発言:
  ネイティブスレッドが101個できたよ
havana の発言:
  1個インタプリタのスレッドだぬ
havana の発言:
  Win32の話なので
havana の発言:
  他だとどうなるかは知らん。

CPython インタープリタのソースコードを見る限りでは Thread / threading モジュールを使ってスレッドオブジェクトを作成してそれを run() させた場合はネイティブスレッドになるようですね。

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

2007/09/20

[ 備忘録 / RFC ] RFC 2795 MS-CHAP V2

MS-CHAP V2 の RFC とそのクライアントレスポンス部分の実装を見つけたのでメモ。

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

[ book ] Essential Silverlight でてた

Essential Silverlight

Essential Silverlight がリリースされていました。まだ PDF 版のみで紙の書籍は出ていないみたい。

Silverlight も SDK 入れただけで触ってないな。遊びたいんだけど。

Silverlight は C# とか IronPython とか、.NET Framework に対応した言語を既に知っているなら、そのまま使えるのがいいよね。Flash みたいに新しく言語を覚える必要がない。

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

2007/08/07

Safari が軽くなってた

Safari といってもブラウザのほうじゃありません。
O'Reilly の電子ライブラリのほうです。

2ヶ月ほど使っていなかった Safari を久しぶりに使ってみたら、さくさく開けるようになってました。

数ヶ月前までは結構重くて、「本を読む」という使い方にはあんまり使いたくなかった。ネットに接続できる場所なら重たい書籍を持ち歩かなくてもリファレンスを見れることは大きな利点だったけど(´・ω・`)

速度が改善されたことで、そこそこ読み物にも使えるようになったと思う。
また重たくならないといいな。

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

2007/07/17

[python] どう書く?-- 一方向リスト編その2

前に書いたコードでも期待する動作はするんだけど、やっぱり気になるので無駄をなくしてみました。

そのまえに、まずは前のエントリのコメントに答えておこうか。

簡単・複雑以前に、用途に対する道具の規模が大きすぎるような。リソース消費量という観点でまずくないでしょうか?

辞書やら集合やらって、かなり高機能なコンテナで、それを素のC言語でも簡単に実装できるようなリスト構造のためにふんだんに用いるってのは、バランス的にどうかという気がします。(内部的には、辞書・集合オブジェクトの「中で」リスト構造は山のように使われているはずで)

え~と、実際にわたしは要素数100万の集合オブジェクトを複数定義して、それらを使った演算をするコードを書いたことがあるんだけど別に問題なかったんだけどな。それどころか同じ処理をするために C++ で書かれた、作者たちが「Python で書いたそれよりも比べるまでも無く高機能で、メモリ効率がいい」といっているプログラムを動作させたら Out Of Memory が発生したっけ。

何が言いたいかというと、何事も使い方次第だってこと。

わたしのコードとコメント先にあるコードを何人かに見比べてもらうこともしたんだけど。わたしの師に当たる方も友人も「美しい」のはわたしのほうだという回答をいただけた。もっとも師匠からは「どちらかといわれればこっちだけど、君のコードにはまだ無駄がある」というようなことを突っ込まれたけど ( ´・ω・`)

あと、おまけの一言として「Python のコードの比較に C を持ち出して C ではどうこういうのはおかしい」ってのもあったな。ごもっとも。C ならどうこう言うのなら最初から C で書けばいいのだ。そもそも、Python を使う利点に「メモリを節約できる言語」ってのは無かったと思う。メモリ消費量を極限まで減らして、パフォーマンスもかつかつにチューニングしたいならアセンブラと C を使うというのがいい選択肢だと思うけどね。

あぁ、後バランスだっけ?見たところ、あなたのコードは引数として渡されたオブジェクトの中に一方向リストが1つある場合にしか正常に動作しない。その点でボツだと思うんだけどどうなんだろうね。わたしから見れば、課題の要求を満たしていないように思える。コードを追加することで対応できるだろうけれど、そのときには数学的な美しさからはさらに離れるでしょう。

さて、突っ込まれてから書き直したコードが↓
doctest とかは削ってあります( ´・ω・`)


# coding: utf-8

def get_endpoint( linked_list ):
	difference = set( linked_list.values() ) - set( linked_list.keys() )
	
	return (None if difference == set([]) else difference)

辞書の鍵を要素とする集合 linked_list.keys() と値を要素とする集合 linked_list.values() の対称差がφなら、差もφになる。また、部分的に循環がある場合は linked_list.values() - linked_list.keys() もφになる。つまり循環が部分的であれ全体であれ、循環構造がある場合には linked_list.values() - linked_list.keys() = φ となる。

一度集合差を求めて、その結果を判定するだけで求める答えは導けると考えられる。

なんでこのことに気づけなかったんだろう・・・_| ̄|○

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

2007/07/14

[python] どう書く?-- 一方向リスト編

今日の御題。

a は b を参照し、b は c を参照し、c は d を参照し・・・ という、いわゆる一方向リストがある。 このデータ構造体における終端のオブジェクトを返す関数を書け

わたしはこれを「a を指定すると b が返り、b を指定すると c が返り、c を指定すると d が返る・・・」 というデータ構造体と考え、これは Python では辞書で表現できると考えた。そこで書いた答えが↓

# coding: utf-8
def get_endpoint( linked_list ):
	"""
	循環リストの場合は None を返す。
	線形リストの場合は終端のオブジェクトを返す。
	"""
	if (set( linked_list.keys() ) ^ set( linked_list.values() )) == set([]):
		return None
	
	difference = set( linked_list.values() ) - set( linked_list.keys() )
	return (difference if difference else None)

最後の2行はもともとは return (set( linked_list.values() ) - set( linked_list.keys() )) だったんだけど、 それでは部分的に巡回するリストだった場合に空集合 φ が返ってしまうので上記のように修正を加えた。 それでも正しく動作しないという人がいるんだけど、わたしには正しく動作するように思える。

まず、一方向リストにはリングバッファ( 円形リスト ) と線形リストがある。このうち、リングバッファについては 集合 set( linked_list.keys() ) と集合 set( linked_list.values() ) の対象差は空集合φになるのは 考えるまでもなく明白である。

リングバッファを次のように表現しよう

circular_list = {a:b, b:c, c:d, d,a}

この場合、circular_list の鍵を要素としてもつ集合は set([a, b, c, d]) となり、 値を要素として持つ集合は set([b, c, d, a]) となる。両者の対象差は当然 φ になる。

そして部分的に循環がある場合は、値の集合から鍵の集合を引いた差 difference が φ になる。 difference が φ でないのは、終端が存在する一方向線形リストのときだけなのだ。

スタックを使った方が簡単だといわれたのだが、わたしにはそちらの方がよほど難しいように思える。 実際、集合を使ったアルゴリズムはすぐに思いついたけど ( 初版のコードはエラーあったけど( ´・ω・`) ), スタックを使ったコードはむしろ何でスタックが必要なのか理解に苦しんだ。 何より数学的に美しくないと感じるのだ。

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

2007/06/29

[python] weakref を使って・・・

Python で Singleton クラスを作ろうと思ったんだけど、weakref を使ったら上手く書けるかもと思いついた。
が、weakref を使うのは初めてなのでいろいろと調べないとコードがかけそうにない。

今日は眠いので寝よう・・・( ´・ω・`)

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

2007/06/28

[C++] Fukin' unconcise Code

今日はなかなか読み難い C++ のコードを読む羽目になった。

わたしならば、読み難いコードコンテストに応募しようとでもしない限りは絶対に書かないであろうコードだ。
あれが美しいだって?わたしにはブラックジョークにしか聞こえないね。

「読みやすいコード」「美しいコード」「拡張性があるコード」と散々わめいておきながら、一文字変数とか想像もつかないような省略形を使っていたり、dense なコードを書いていたり if 節に brace が使われていないのはなぜだ?

IPアドレスのような、誰でも知っている言葉を internet_protocol_address とするのは極端すぎるとして、

  • それが何なのか想像できない識別子は使わない( 一文字変数とか )
  • 省略形は誰でもわかるもの以外は使わない
  • 適度なスペースを入れる
  • 暗黙のルールは用いない ( 暗黙の宣言とか記号の省略はせずに全て明示する )
  • 予約語・オペランド・マニピュレータと見間違えるような識別子は使用しない
  • 予約語・オペランドの多重定義は、どう考えてもそれしか方法がない場合を除いて行わない
ってのが「読みやすくなる」ことを意識したコードじゃないの?
「読みやすいコード」「美しいコード」「拡張性があるコード」が大切だというならば
コード規約がどうこうの前にこれくらい守ってほしい。

ひとつ、上手だなと思ったのは do{} while(); の使い方。それは見習いたい。

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

2007/06/24

[ C ] C 言語で FizzBuzz -- やっぱり邪悪編? --

なんか C 言語で FizzBuzz 書いている人がいるのでやってみた。
プログラマに対しても書いているんだけど、その前に言わせていただくと、なんで FizzBuzz があんなに長ったらしくなるのか理解できないしね。

# include <stdio.h>

int main()
{
    for( int row=1; row <= 100; row++ )
    {
        ((row % 3 == 0) && (row % 5 != 0)) ? printf( "Fizz, " ) :
            ((row % 3 != 0) && (row % 5 == 0)) ? printf( "Buzz, " ) :
            ((row % 3 == 0) && (row % 5 == 0)) ? printf( "FizzBuzz, " ) : printf( "%d, ", row );
    }
    
    return 0;
}

Thinking Time 30 sec.
gcc 3.4.5 with C99

1~100までの整数列を考えるところまではいいんだけど、そのあとは「次は4つのケースで場合分けしよう」で終わると思うんだよ。FizzBuzz クイズに関してはこれだけで閉じているんだから。拡張性考えろって言われたら、上のコードは NG だけどね。

プログラマに向いているか向いていないかを決めている原因のひとつは、わたしも分析能力にあると思う。パズルのピースがどんな形をしていて、それらが全部でいくつあるのかを見極める能力。それからもう1つ、パズルのピースを組み立てる能力もあるんじゃないかと思う。見つけただけじゃプログラムはできない。見つけたピースをどんな順番で組み立てるのかを考える能力もまた必要なことだと思う。

わたしは後者が欠けている。それと、特定の問題に対する最適解は出せるが、一般化した解を求められない。理学よりの能力はあるものの、工学よりの能力は低いみたいだ。

2007.06.24 03:54
友人 「ふつーに書け」
わたし「普通って( ´・ω・`)?」
友人 「if と else とか使って!」
というリクエストがあったのでそっちの方も書いてみようかと(;´Д`)

# include <stdio.h>
# include <string.h>

int main()
{
    char* replaced = "FizzBuzz";
    char fragment[strlen( replaced )+1];
    
    for( int row=1; row <= 100; row++ )
    {
        if((row % 3 == 0) && (row % 5 != 0))
        {
            strncpy( fragment, replaced, strlen( replaced ) / 2 );
            fragment[4] = '\0';
            printf( "%s, ", fragment );
            
        }else if((row % 3 != 0) && (row % 5 == 0))
        {
            strncpy( fragment, replaced + 4, strlen( replaced ) );
            fragment[4] = '\0';
            printf( "%s, ", fragment );
            
        }else if((row % 3 == 0) && (row % 5 == 0))
        {
            printf( "%s, ", replaced );
        
        }else
        {
            printf( "%d, ", row );
        }
    }
    
    return 0;
}

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

2007/06/19

[python] Workshop Edge2007 お題1 -- Synchronizing Directory

二つのディレクトリ(フォルダ)を指定すると、そのディレクトリの下の全てのファイルについて「片方にしかないファイルはもう片方へコピーし、両方にあるけどもタイムスタンプ(更新時刻)の異なるファイルは新しい方で古い方を上書きする」という処理を行うプログラムを作りなさい。

個人的な目標

  • 集合演算を使う
  • 20行以内にする
import os, shutil, stat

get_timestamp = lambda filename: os.stat( filename )[stat.ST_MTIME]
get_filelist  = lambda dir_path: [os.path.join( node[0], filename ) for node in os.walk( dir_path ) for filename in node[2]]
get_dir_info  = lambda dir_path: dict( zip( get_filelist( dir_path ), [get_timestamp( filename ) for filename in get_filelist( dir_path )] ) )

def synchronize_directories( dir1, dir2 ):
    (dir1_info, dir2_info) = map( get_dir_info, (dir1, dir2) )
    (symmetric_difference, intersection) = map( lambda method: eval( "set.%s( set([filename[len( dir1 ):] for filename in dir1_info.keys()]), set([filename[len( dir2 ):] for filename in dir2_info.keys()]) )" % method ), ["symmetric_difference", "intersection"] )

    # copies lacked files
    # It is necessary to make intermediate path before copying or replacing file.
    # For example, imagine dir_path=X:\hoge and filename=X:\hoge\piyo\fuge\bar.txt. In this case, intermediate path is /piyo/hoge.
    # At first, using expression "os.path.split( orz )[0][len( dir_path ):]" to get the path and then make path by 
    # os.makedirs( os.path.abspath( target_directory ) + intermediate_path )
    if symmetric_difference:
        for filename in symmetric_difference:
            (source_directory, distination_directory) = ((dir1 if True in [(filename in element) for element in dir1_info] else dir2), 
                                                         (dir1 if not(True in [(filename in element) for element in dir1_info]) else dir2))
            intermediate_path = os.path.split( source_directory )[0][len( dir1 ):]
            os.makedirs( os.path.abspath( destination_directory ) + intermediate_path )
            shutil.copy( os.path.join( source_directory, filename ), os.path.join( destination_directory, intermediate_path ) )

    # replace old files by later files
    if intersection:
        for filename in intersection:
            # by comparing timestamps, discriminate which is later, which is destination directory
            (later_file, destination_directory) = (os.path.join( dir1, filename ), os.path.join( dir2, os.path.split( filename )[0])) if dir1_info[os.path.join(dir1, filename)] > dir2_info[os.path.join( dir2, filename )] else (os.path.join( dir2, filename ), os.path.join( dir1, os.path.split( filename )[0]))
            
            os.makedirs( os.path.abspath( destination_directory + os.path.split( later_file )[0][len( dir1 ):] ) )
            shutils.copy( later_file, destination_directory )

目標達成ならず 31 行 _| ̄|○il|!
先週見た時は集合演算を使った回答がなかったので集合演算を取り入れてみました。

もしかしたらバグがあるかも。見つけたらご連絡くださいませ m(_ _)m

2007.06.19 23:58 追記
うまくトラックバックが遅れないようなので、コメントで投稿しました。
あちらだとコードが途中で切れていますが・・・

2007.06.20 15:00
ソースファイル添付忘れていたので添付しました。
こちら

2007.06.20 21:51
アップ直前に加えた変更が原因で SyntaxError が発生してしまうのを修正。
ご通知ありがとうございました。どんなに忙しくても最低でもデバッガに通すべきでした。
反省しております。

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

2007/06/16

[python/備忘録] ホームディレクトリに Python をインストール

Linux でホームディレクトリにインストールしたときのメモ。

configure 走らせるときに --prefix=/home/fomalhaut/python2.5.1 を追加する。

その後のビルドは通常と変わらない。make が成功したら make test でちゃんと動くか確認。
致命的なエラーがなければ make install

その後で実行パスとライブラリパスを追加する。.bash_profile に以下を追記

export PATH=/home/fomalhaut/python2.5.1/bin:$PATH
export LD_LIBRARY_PATH=/home/fomalhaut/python2.5.1/lib:$LD_LIBRARY_PATH

サードパーティーモジュールはまだ使ってないけど、今のところは問題は起きてません。
何か問題があったら書いていこうかと。

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

[dev] 何か信じられないものを見た

テストスクリプトの実行に時間がかかりそう ( 予測6.5時間 ) なのでいったん家に帰ってから出社したときのこと。
ディスプレイを見るとすごいものが表示されていた。

Out Of Memory

・・・・・・(;´д`)

別の、12万チョイのノート PC でも実行できるスクリプトを実行させた時もこれが出たなぁ
低価格ノートでも実行できる程度のスクリプトで Out Of Memory になるマシンを開発用サーバって呼ぶの?
というか、マシンがしょぼすぎて Out of Memory ってのは初めてみた。

人のマシンにケチ付ける前に、しょぼい開発環境をどうにかしてほしいよ (;´д`)

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

2007/06/13

[備忘録] .NET Framework3.5 SDK β

ここしばらく Windows に触る時間が短くなっているんだけど、.NET Framework 3.5 β SDK が公開されたらしい。

Silverlight とか IronRuby とか、.NET 方面が面白くなっている。わたしもそっちを触りたいな。

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

2007/05/21

[book] Windows Server クックブック日本語版も抄訳

O'Reilly Japan から出版されている株式会社クイープ訳の Windows Serverクックブックも抄訳だった。Windows Server でいろいろできるようになったので買ってみようかと TOC (目次) に目を通してみたら、この手のクックブックにしてはなんか少ない。おかしいと思って本家 Windows Server Cookbookと比べてみた。

するとやっぱりいくつかの Chapter が省略されている。日本語版は省略されているにもかかわらず値段はほとんど変わらないか本家のほうが安いくらいだし、わたしが探している情報も省略されてしまっている。

情報の価値を考えれば、多少読むのに時間がかかるようになっても本家版を買ったほうがいいと思う。

そーいえば、ここ ( 株式会社クイープ ) は Ruby Cookbookの翻訳も行ったところだけど、こっちも抄訳だったのは前に書いたとおり。Ruby Cookbook のように省略された Chapter の代わりになる情報があるならそれでもいいけど、単に省略されているだけというのはどうかと思う。

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

2007/05/12

[ Python ] fizz-buzz テスト --- 邪悪編 ---

こんな話を紹介された。これすらも書けないなんて信じられない話だ。タイピングをする時間を除けば、10秒かからずに頭に浮かぶだろう。

Fizz-Buzz テストは「1~100 の整数の内 3 の倍数は "Fizz", 5 の倍数は "Buzz", 3 と 5 の公倍数は "FizzBuzz"、それ以外はその整数をそのまま表示するプログラムをつくる」というもの。さらっと書いたのが↓

>>> for integer in integer_list:
	if (integer % 15) == 0:
		print "FizzBuzz"
	elif (integer % 3) == 0:
		print "Fizz"
	elif (integer % 5) == 0:
		print "Buzz"
	else:
		print integer

でも、これじゃ面白くないよね。後でとっても邪悪なコードに仕上げようと思う。

2007.05.09.23:54 追記
10分くらい考えたのが↓のコード

# Write Evil Code?
[cmp((i%15),0)and(cmp((i%3),0)and(cmp((i%5),0)and i or"Buzz")or"Fizz")or"FizzBuzz"for i in range(1,101)]

# ちょっと見やすくすると↓
[cmp( (integer % 15), 0 ) and (cmp( (integer % 3), 0 ) and (cmp( (integer % 5), 0 ) and integer or "Buzz") or "Fizz") or "FizzBuzz" for integer in range(1,101)]

う~ん、100bytes を超えてしまった。残念。考え直してきます。

2007.05.10.1:18 追記
ご飯食べてシャワー浴びている間に「そーいえば cmp() 使う必要ないじゃん」と気付いて書き直し。

# 91bytes
[(i%15==0 or(i%3==0 or(i%5==0 and"Buzz")and"Fizz")and"FizzBuzz")or i for i in range(1,101)]

とはいえまだ冗長性が残っている。他にも方法を思いついたし、書き直しの余地はありそうだ。

2007.05.11.0:26 追記
新しいのを書こうと思ったら、havana がほとんど同じコードを書いていた ( わたしのコードは ["".join(("Fizz"*(i%3<1)+"Buzz"*(i%5<1))or str(i))for i in range(1,101)] というもの )。なら、とにかく邪悪なコードを書いてみようと思って作ってみる↓

# WARNING!: とっても邪悪
[(filter( lambda obj:(type( obj ) != int), fragment )[-1] if filter( lambda obj:(type( obj ) != int), fragment ) else ([[reduce( partial_function, div_rep ) for div_rep in ((3, "Fizz"), (5, "Buzz"), (15, "FizzBuzz"))] for partial_function in [__import__("functools").partial( (lambda integer, divisor, replace: ((integer % divisor == 0) and replace) or integer), integer ) for integer in range( 1, 101 )]].index( fragment ) + 1)) for fragment in [[reduce( partial_function, div_rep ) for div_rep in ((3, "Fizz"), (5, "Buzz"), (15, "FizzBuzz"))] for partial_function in [__import__("functools").partial( (lambda integer, divisor, replace: ((integer % divisor == 0) and replace) or integer), integer ) for integer in range( 1, 101 )]]]

長さ 733bytes の Fizz-Buzz コード( ´・ω・`)b
たぶん Python をつかったコードの中では、現在日本最悪だとおもう。
ほんとは1文字変数に直しても 1000 bytes 以上に挑戦したんだけどだめでした orz
動作は Python2.5 限定です。

2007.05.11.1:26 追記
havana に "".join() いらないジャンと突っ込まれて気づく。

[("Fizz"*(i%3<1)+"Buzz"*(i%5<1))or i for i in range(1,101)]
59 bytes (≧▽≦)b

あと、havana の一番最初に考えたコードは↓でした ( Ruby らしい )
(1..100).each{|i|puts ["Fizz#{s=['Buzz'][i%5]}"][i%3]||s||i}

Reference
どうしてプログラマに・・・プログラムが書けないのか? ( 2007/02/26, 原著: Jeff Atwood, 訳: 青木靖 )

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

2007/04/30

[linux/ubuntu] feisty に gcc-2.95 をインストールする方法

gcc-2.95 がいまだに必要になることがあります。FSF からソースコードを持ってきて自前でコンパイルすることもできますが、gcc4.x / glibc2.4 ではそのままコンパイルすることができません。gcc をコンパイルすることが木で気でないならば、できれば aptitude install でさくっりと導入を済ませたいものです。しかし feisty のデフォルトでは aptitude search で表示されるのは gcc-3.3 まで。一見するとパッケージインストールは不可能に見えます。

しかし、apt-get / aptitude が参照しているソースリストファイルを編集することで gcc-2.95 のパッケージインストールが可能になります。作業手順は次の通り。

1. ファイルを開く
ソースリストファイルは一般ユーザでは編集できないので sudo をつけて開きましょう。
$ sudo vi /etc/apt/sources.list
2. ↓の2行のコメントアウトを解除します。記述が見当たらない場合は追記します。
deb http://jp.archive.ubuntu.com/ubuntu/ feisty universe
deb-src http://jp.archive.ubuntu.com/ubuntu/ feisty universe
3. パッケージ情報を更新する
$ sudo aptitude update

これで gcc-2.95 の情報もパッケージリストに読み込まれたはずです。aptitude search gcc で確認すると下のスクリーンショットのようになると思います。

universe を有効にしたサーチ結果

パッケージリストが更新されているのが確認できたら、他のパッケージと同じようにインストールできます。

$ sudo aptitude install gcc-2.95

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

2007/04/24

VMware Player v2 β 公開

ベースとなる OS にインストールして、仮想空間で別の OS を実行できる VMPlayer の新バージョンのパブリックベータが公開されました。β 版ですので安定して動作することも保証されませんが、あたらしい機能を試してみたい方は導入してみるのもいいかもしれません。

v2 で追加・強化された機能は↓

仮想 SMP を実験的にサポート
SMP はマルチプロセッシング方式の一つですが、v2 では複数の CPU を仮想マシンに割り当ててパフォーマンスを向上させることもできるようにしたとのこと。
仮想マシンとホストマシンの間で簡単にデータを共有できるようにした
共有フォルダを利用したり、単純にファイルをドラッグ&ドロップするだけで仮想マシンとホストマシン間のデータを効率的にやり取りできるようにしたとのこと。v1 ではこれができなくて ftp とか経由させたり面倒だったんだよね。ただし、セキュリティが低下する可能性もあるので仮想マシンの用途によってはこの機能は使わない方がいいでしょう。
Windows Vista をサポートした
仮想マシン、物理マシンのどちらでも Vista を使えるようにしたとのこと。ただし、Aero は使えません。
USB2.0 をサポートした
外部記憶装置やマルチメディアデバイスなど高速なデータ転送が必要なデバイスも使えるようになったとのこと。これはうれしい。
アプライアンス・ビュー
この機能を利用すれば仮想マシンイメージの作成者が提供する情報を参照できるそうです。
新しいホームページ
既存の仮想マシンからか、ブラウザから VMware Virtual Appliance Marketplace ( 訳注: VMware が提供するポータルページで仮想マシンを公開しているベンダーへのリンク集のようなもの。直接そのページからダウンロードできる仮想マシンイメージもある。) を開けるんだけど、サイトリニューアルしてより直観的に使えるようになったとのこと。Virtual Appliance Marketplace ではインストール作業や設定作業が完了してすぐに使える状態になっている仮想マシンイメージをダウンロードできます。
より広範囲にわたる OS のサポート
「32bit / 64 bit 合わせて 60 を超える OS をサポートします。Vista, RedHat Enterprise Linux5, SUSE Linux Enterprise Server10, SUSE Linux Enterprise Desktop10, Ubuntu6.10 など多くの OS をサポートしています」とのこと。Ubuntu はちょいとばかし古いね。でも、feisty の仮想マシンイメージはユーザーグループからそのうちに公開されると思うよ。

使用する手順は次の通り。インフォメーションページの和訳ですが、β 版ではなくて RC と書いてあるのが気になります。なお、ユーザ登録ページとフォーラムへの投稿は英語です。

1. ドキュメントを読む
機能の概要や既知の問題が書いてあるのでまず Release Note を読む。セットアップと使用方法の細かい情報はユーザマニュアルに書いてあります。
2. VMware Player 2 RC をダウンロードする
シリアルキーを入手するためにユーザ情報を登録する必要があります。
3. VMware Player を起動する
VMware Player を使って、どの機能が有益か試してください
4. フィードバックを送る
フォーラムに感想や疑問を投稿できます。このフォーラムはサポートチームと開発チームも目を通しています。β 版プログラムのサポートに関しては VMware Beta Support を参照してください。

個人的にはマルチプロセッサのサポートがうれしいですね。今は 4core CPU もあるので、そのうち2つを仮想マシンの実行用に割り当てるとかできます。そうすることでさくさく動くようになるかもしれません。4Core CPU は持ってないんだけどね・・・orz

Reference
VMware Player Public Beta ( 2007/04/19, VMware Inc )
VMware Player β2 Release Note( VMware Inc )
Windows Vistaに対応した「VMware Player」v2.0のβ版が公開 ( 2007/04/23, Watch Impress Corp, 中村 友次郎 )

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

2007/04/23

[ ruby / book ] Ruby Cookbook 日本語版は抄訳らしい

4/25 発売予定の Ruby クックブックは、原版の一部だけを翻訳したものらしい。
ratio - rational - irrational さんによると原著では全部で 23 章なのに日本語版では 12 章になってしまっているとのこと。

日本語版ではコードブロックやリフレクション ( メタプログラミングのことを最近ではこういうらしい )、永続性、マルチスレッドに関する章が再構成されているそうなので、部分訳は残念だけど一応買おうと思う。もともと、わたしはコードブロックとリフレクションが目当てで予約したんだし。原版は Safari で読めるしね。

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

2007/04/20

[ python ] 続 IronPython1.1

IronPython 1.0 では、socket モジュールは builtin モジュール ( 標準ライブラリと呼ばれることもあります ) として用意されているものの、それから作成した socket オブジェクトには makefile() メソッドが実装されていませんでした。makefile() がないため、socket オブジェクトに依存するモジュール、たとえば urllib などが利用できないという欠点に繋がっていました。 IronPython1.0 で makefile() を呼び出そうとすると次のようにエラーになってしまいます。

C:\dev>ipy -X:Python25
IronPython 1.0 (1.0.61005.1977) on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import socket
>>> socket
<module 'socket' (built-in)>
>>> test_socket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
>>> test_socket.connect( ("quux.org", 70) )
>>> pseudo_file = test_socket.makefile( "rw", 0 )
Traceback (most recent call last):
  File , line 0, in <stdin>##93
AttributeError: 'socket' object has no attribute 'makefile'

IronPython1.1 のリリースノートを見ると "Socket implements makefile function ( socket に makefile メソッドを実装した )" とあります。 IronPython1.1 で同じ操作を行ってみました。

C:\dev\IronPython-1.1>ipy -X:Python25
IronPython 1.1 (1.1) on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import socket
>>> socket
<module 'socket' (built-in)>
>>> test_socket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
>>> test_socket.connect( ("quux.org", 70) )
>>> pseudo_socket = test_socket.makefile( "rw", 0 )
>>> pseudo_socket.write( "index.txt\r\n" )
>>> for data in pseudo_socket.readlines():
...     print data
...
3'/index.txt' does not exist (no handler found)         error.host      1

1.0 では「socket オブジェクトには makefile という名前の属性は存在しない」というエラーが出ていますが、1.1 ではそれがありません。1.1 のコードのエラーは「指定された名前のファイルが存在しない」というもので makefile とは関係がないものです。

socket に依存するモジュールはいくつかあり、それらは IronPython1.0 では利用できないことも多かったのですがどうなっているでしょうか? urllib で試してみます。まずは 1.0 で確かめます。コードは IronPython の世界 で 1.0 では動かないとされているものです。

X:\>ipy -X:Python25
IronPython 1.0.60816 on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import sys
>>> import urllib
>>> import urlparse
>>> url = "http://www.python.jp/pub/doc_jp/pdf-a4-2.4.zip"
>>>
>>> filename = urlparse.urlparse( url )[2].split( '/' )[-1]
>>>
>>> filename
'pdf-a4-2.4.zip'
>>> urllib.urlretrieve( url, filename )
Traceback (most recent call last):
  File , line 0, in <stdin>##134
  File C:\SDK\Python\Lib\urllib.py, line 89, in urlretrieve
  File C:\SDK\Python\Lib\urllib.py, line 222, in retrieve
  File C:\SDK\Python\Lib\urllib.py, line 194, in open
  File C:\SDK\Python\Lib\urllib.py, line 272, in open_http
  File , line 0, in __import__##4
  File C:\SDK\Python\Lib\httplib.py, line 70, in Initialize
  File , line 0, in __import__##4
  File C:\SDK\Python\Lib\mimetools.py, line 6, in Initialize
  File , line 0, in __import__##4
  File C:\SDK\Python\Lib\tempfile.py, line 33, in Initialize
  File , line 0, in __import__##4
  File C:\SDK\Python\Lib\random.py, line 41, in Initialize
  File , line 0, in __import__##4
  File C:\SDK\Python\Lib\warnings.py, line 264, in Initialize
NameError: name 'ImportWarning' not defined
>>>

おや、IronPython の世界 とは違うエラーになりました。4 台の PC でそれぞれで実行しましたが、全てこのエラーになります。それでも 1.0.1 では動作しないことは確認できました。このエントリの目的は IronPython1.1 で互換性が向上したかどうか、少なくともリリースノートにある互換性を確認することなので原因解明はせず次に進むことにします。同じ環境で IronPython だけを 1.1 に変更して同じコードを実行してみます。

X:\>ipy -X:Python25
IronPython 1.1 (1.1) on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import sys
>>> import urllib
>>> import urlparse
>>> url = "http://www.python.jp/pub/doc_jp/pdf-a4-2.4.zip"
>>>
>>> filename = urlparse.urlparse( url )[2].split( '/' )[-1]
>>>
>>> filename
'pdf-a4-2.4.zip'
>>> urllib.urlretrieve( url, filename )
('pdf-a4-2.4.zip', <httplib.HTTPMessage instance at 0x000000000000002B>)
>>>

エラー・警告が出ることなく動作しました。フォルダを確認するとちゃんと ZIP ファイルが作成されています。

あとめぼしいものは md5, sha, select モジュールの追加でしょうか。md5 などのハッシュモジュールはいままでも .NET Framework のものを使うことで代用できたのですが、CPython と同じように使えるようになったことは、コードポータビリティの面でもうれしいです。しかし、わたしが確認した限りでは IronPython1.1 の md5 モジュールは CPython のそれと完全な互換性があるわけではないようです。オブジェクトが持つ属性が異なるだけでなく、コードを走らせたところエラーが出てしまうものもありました。

.NET Framewrok で動作する言語の中では、IronPython は C# などに比べるととても扱いやすい言語です。実際、C# よりも格段に学習しやすく扱いやすい言語です。CPython と互換性を持ちつつ、.NET との親和性を併せ持つこの言語はこれからどんどん発展していくでしょう。わたしも少しずつですが使用する機会が増えてきています。気付きたことがあったらここで書いていきたいと思います。

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

2007/04/19

[ linux / lisp ] Lisp 風の強力なシェル Lush

technorati を回っていたら面白いものを見つけた。
Lisp の方言て記述するシェル Lush: Lisp Universal SHellだ。

LushというS式のシェルがあるようですね。デモを一部動かしたけどかなり強力だ。Lispの方言になってる。(defun ...)が(de ...)になってたりするので多少の使い勝手は違うけど、ライブラリをインストールしていればsdlやopengl, gslなどがすぐに動く。

( (Yasuto Takenaka) Blog )

プロジェクトページにあるスクリーンショットでは、Lisp と C ライクなコードを混ぜて処理をさせているものや、グラフィック処理を行っているものがある。Lush の特徴は↓らしい。

  • 明快にして単純、簡単に学習できる Lisp 風の文法
  • コンパイラは非常に効率のいいネイティブコードを出力する。中間コードを吐き出すことはしない
  • ほかの言語で書かれた関数やライブラリでも使える簡単なインターフェイスがある
  • 一つの関数の中で、自由に Lisp と C を混ぜたコードを書くことができる
  • ベクトル演算、行列演算、テンソル演算のための強力な演算子がそろっている
  • GSL, LAPACK, BLAS への完全なインターフェイスを含む1万以上の算術演算ライブラリ
  • 画像処理、信号処理のライブラリがある
  • GUI も簡単。OpenGL のインターフェイスだってある
  • SDL ライブラリのインターフェイスだってある。2D ゲーム作成に便利
  • 音楽、動画だってつかえる
  • JavaVM と Python C API のインターフェイスだってある
  • 神経網とか統計学の勉強にも使える?(誤訳かも )

    面白そう。これを開発マシンに突っ込めばメンバーに Lisp を身につけさせることができるかも?

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

2007/04/18

[ python ] IronPython1.1 正式版リリース

IronPython v1.1 is a minor update to IronPython including both new functionality as fixes for the most voted for bugs. The new functionality in v1.1 includes several new modules (array, SHA, MD5, and select), support for .NET XML Doc comments within the help system and doc tags, as well as support for loading cached pre-compiled modules. This release improves compatibility with CPython and gives the .NET developer a better interactive experience.

IronPython v1.1 はこれまでに報告されたバグのほとんどを修正して、いくつか新しい機能を追加したマイナーバージョンアップだ。いくつか新しいモジュール ( array, SHA, MD5, select モジュール ) を追加することで機能を追加したほか、.NET Framework のヘルプシステムにおける XML Doc コメントと doc タグもサポートした。そして pre-compiled モジュールも利用できるようにした。 v1.1 で CPython との互換性が向上した。.NET でもっと簡単に開発できるようになっているだろう。

( CodePlex/IronPython, 1.1 release note より抜粋 )

かなりの意訳ですが、大意は外していないと思います (´・ω・`)b

リリースノートを見ると "Support importing pre-compiled modules produced when running in –X:SaveAssemblies mode" と書かれているので pre-compiled モジュールというのは CPython の .pyc といったファイルではなくて .NET アセンブリをサポートするようになったということみたい。

IronPython は CPython2.4.3 との互換性を意識して作られたものですが、変更履歴を見ると CPython2.5 の機能もいくつかサポートされるようになっています。IronPython1.1 では try-except-finally がサポートされるようになり ( CPython2.4 では except と finally は同時に使えなかった )、finally ブロック内の yield が使えるようになったようです。

いま動かしていますが、確かに CPython との互換性が向上しています。たとえば IronPython1.0.1 では calendar モジュールが使えませんでした。IronPython の世界では使えると書いてありますが、わたしの環境下では使えません。モジュールのインポートはできるのですが、calendar.month() メソッドを呼び出すと次のようになります。

C:\dev>ipy -X:Python25
IronPython 1.0 (1.0.61005.1977) on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import calendar
>>> print calendar.month( 2007, 4 )
Traceback (most recent call last):
  File , line 0, in <stdin>##113
  File C:\SDK\Python25\Lib\calendar.py, line 324, in formatmonth
  File C:\SDK\Python25\Lib\calendar.py, line 204, in monthdays2calendar
  File , line 0, in Initialize##130
  File C:\SDK\Python25\Lib\calendar.py, line 172, in itermonthdays2
  File C:\SDK\Python25\Lib\calendar.py, line 159, in itermonthdates
TypeError: unsupported operand type(s) for -: 'date' and 'timedelta'

同じコードを IronPython1.1 で実行すると次のようになります。ソースを解析したわけではないので推測になりますが、たぶん datetime モジュール ( datetime.date と datetime.timedelta かな?) のバグが修正されたので使えるようになったのでしょう。

C:\dev\IronPython-1.1>ipy -X:Python25
IronPython 1.1 (1.1) on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import calendar
>>> print calendar.month( 2007, 4 )
      4月 2007
月  火  水  木  金  土  日
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

しかし、インタラクティブモードでリストとタプルの複数行定義ができないのは相変わらず (-_-;;
リストとかタプルを複数行で定義しようとすると SyntaxError が発生してしまいます↓

C:\dev\IronPython-1.1>ipy -X:Python25
IronPython 1.1 (1.1) on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> test_list = [
Traceback (most recent call last):
SyntaxError: unexpected token <eof> (<stdin>, line 1)
>>> test_tuple = (
Traceback (most recent call last):
SyntaxError: unexpected token <eof> (<stdin>, line 1)

IronPython では1行に入力できる文字数にも制限があるし、なにより見難くなってしまいます。リストとタプルの複数行定義もサポートするようになるとインタラクティブモードがもっと使いやすくなるでしょう。次のアップデートではサポートしてほしいですね。

2007/04/19
ものすごい誤記を修正 orz

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

2007/04/16

[ python ] IronPython1.1 RC1 が公開されてた

いつのまにか IronPython1.1 のリリース候補第一版 ( RC 1 ) が公開されていました。

マイナーバージョンアップではあるものの、バグ修正だけでなくいくつか新しい機能も追加したとのこと。IronPython 1.0 では CPython では 標準モジュールとして用意されていた MD5 などのモジュールが ( IronPython の標準ライブラリとしては ) 用意されていなかったのですがこれらが追加されたようです。

IronPython 1.0 (1.0.61005.1977) on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import sys
>>> sys.builtin_module_names
('marshal', 'itertools', '_weakref', '_sre', '_random', 'time', 'thread', 'struct',
 're', 'operator', 'nt', 'math', 'binascii', 'imp', 'gc', 'exceptions', 'errno', 
 'datetime', 'cStringIO', 'collections', '_codecs', '__builtin__', '_locale', 'cPickle', 
 'copy_reg', 'socket')

こちらが 1.0 の組み込み ( 標準 ) モジュール。そして下が 1.1RC1 の組み込み ( 標準 ) モジュール。

IronPython 1.1 (1.1) on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import sys
>>> sys.builtin_module_names
('gc', 'exceptions', 'sha', '_weakref', '_sre', '_random', 'time', 'thread', 'struct',
 're', 'operator', 'nt', 'math', 'marshal', 'itertools', 'imp', 'cPickle', 'errno', 
 'datetime', 'cStringIO', 'collections', '_codecs', 'binascii', 'socket', 'select',
 '_locale', 'copy_reg', '__builtin__', 'md5', 'array')

新しく追加されたモジュールは↓から array, md5, select, sha みたい ( ReleaseNote に書いてあることに後から気づいた orz )


>>> ipy10_builtin_module = set( ('marshal', 'itertools', '_weakref', '_sre', '_random
', 'time', 'thread', 'struct', 're', 'operator', 'nt', 'math', 'binascii', 'imp'
, 'gc', 'exceptions', 'errno',  'datetime', 'cStringIO', 'collections', '_codecs
', '__builtin__', '_locale', 'cPickle',  'copy_reg', 'socket') )
>>>
>>> ipy11_builtin_module = set( ('gc', 'exceptions', 'sha', '_weakref', '_sre',
'_random', 'time', 'thread', 'struct', 're', 'operator', 'nt', 'math', 'marshal'
, 'itertools', 'imp', 'cPickle', 'errno', 'datetime', 'cStringIO', 'collections'
, '_codecs', 'binascii', 'socket', 'select', '_locale', 'copy_reg', '__builtin__
', 'md5', 'array') )
>>> ipy11_builtin_module - ipy10_builtin_module
set(['sha', 'array', 'select', 'md5'])

他の追加機能としては、ヘルプシステムにおけるXML Doc コメント と __doc__ タグのサポートと、プレコンパイルバイナリのキャッシュがサポートされるようになったとのこと。

修正されたバグでは、os モジュールのエラーメッセージが CPython と異なっていたこと、globals().fromkeys() が動作しなかったこと、globals().values() が動作しなかったこと、yield に関連するバグなどなどが修正されたみたい。globals() のバグが修正されたのは嬉しい。詳細は1.1RC1 リリースノートを参照。

Reference
IronPython 公式ページ
1.1 RC1 リリースノート
1.1 RC1 ダウンロードページ

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

2007/04/14

[ linux/ ubuntu ] 開発者とエンドユーザの橋渡しも提供するFeisty Fawn

Canonicalの最高経営責任者(CEO)であるMark Shuttleworth氏はインタビューで、Ubuntu 7.04とも呼ばれるFeisty Fawnには、プログラマーがアプリケーションのクラッシュ原因を突きとめるうえで役に立つデバッグ情報を送信することができるソフトウェアが搭載されていると述べる。
( 2007/04/12, CNET, 原文: Stephen Shankland, 翻訳: CNET Japan 編集部 )

4/19 にリリースが予定されている Ubuntu7.04 (開発コード名 Festy Fawn ) では開発者とユーザ両方の助けになる機能が追加される。そのひとつがクラッシュレポート機能。ソフトウェアのクラッシュが起きたときの情報を集めてレポートして送信する機能だ。

ソフトウェアを公開していると、ユーザから不具合があることを教えてもらえることがある。開発者としても自分のソフトの完成度を高めることができるので、そういった報告はありがたいものだ。しかし、原因を追究するために必要な情報が足りなくてなかなか切り分けが進まないこともある。ほしい情報を得るためにはプログラミングを全くしたことがないユーザには難しすぎる操作が必要だったり、普段触ることもないようなことをしてもらわなきゃならなかったりするのだ。「クラッシュダンプを送ってください」なんて言葉はプログラミングしたことがないユーザにとっては宇宙人の言葉にしか聞こえないだろう。

クラッシュレポート機能はそんなときの、ユーザと開発者の橋渡しになってくれるかもしれない。

他のディストリビューションに比べて格段に高いユーザビリティを提供する Ubuntu。Festy Fawn ではこのユーザビリティに加えて、開発者とエンドユーザがもっと簡単にお互いにフィードバックを送りあえるように手助けをしてくれるのかもしれない。双方向のフィードバックが実現すればもっといいソフトウェアが生まれるはず。期待は高まるばかりだ。

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

2007/04/13

[ python ] 1行は無理?いやいや可能です

ある人から「これ↓って Python じゃできないよね。改行とインデント必須だし」といわれたので、Ruby のコードを Python で書いてみた。


p [4,2,3,6,1].sort_by{|x| if x % 2 == 0 then x else -x end}
↑奇数を降順に、次に偶数を昇順に並べるソート

# => [3, 1, 2, 4, 6]

Python だって1 行で書けるさ (・∀・)b
すさまじく邪悪になったけど・・・orz

globals().__setitem__( "odd_and_even", map( (lambda residue: [integer for integer in unsorted_list if not cmp( (integer % 2), residue )]), [1, 0] ) ) or [odd_and_even[ flag ].sort( reverse = not( flag ) ) for flag in (0, 1)] and reduce( (lambda odd_list, even_list: odd_list + even_list), odd_and_even )

得られる結果は↓のコードを実行したときと同じ。

import random
unsorted_list = [random.randrange( 1, 10 ) for iteration in range( 10 )]

odd_list  = [integer for integer in unsorted_list if (integer % 2) == 1]
even_list = [integer for integer in unsorted_list if (integer % 2) == 0]

odd_list.sort( reverse=True )
even_list.sort()

sorted_list = odd_list + even_list

print sorted_list

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

2007/03/10

[python] クラスメソッドを拾ってくる

havana から「クラスメソッドだけを引っ張り出す方法ナイ?」って話を振られて、今日はそれで遊んでた。
が、どーも「これだ!」と思えるものが出てこない。

class hoge( object ):
        @classmethod
        def cm_fuge():
                print "this is class method"
        def im_piyo():
                print "this is instance method"

classmethod_list = []
for test in [method for method in dir( hoge ) \
            if eval("callable( hoge.%s ) == True" % method )]:
        try:
                eval( "hoge.%s()" % test )
                classmethod_list.append( test )
        except:
                pass

こんなのを書いてみたけど、例外が発生するかどうかで判別しているのが気に食わない。
もっと別の、エレガントな方法はないだろうか?

2007.03.11 追記
odz さんからのトラックバックですっきりした判別方法をご教授いただきました。

属性値が callable で im_self を持っていて、且つ im_self がクラスと一致するならクラスメソッド。
attr = getattr(klass, name)
bool(callable(attr) and hasattr(attr, 'im_self') and attr.im_self == klass)

この部分で判別して、Ture になったらリストに加えると。
なるほど!すっきり

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

2007/03/07

[ windows/book ] Vista 解説書籍

Windows Vista Definitive Guide 仕事で Vista を使うことになったので、Vista Definitive Guide を読んでいます。O'Reilly の本は最近 ( 英文が読みにくく ) 質が落ちてきたなと思っていたのですが、違ったみたい。ただ単にほかの出版社と同じく玉石混合というだけみたいですね。この本は読みやすい英語で書かれています。

セキュリティの強化のために結構変更されたといわれているネットワーク周りに関する部分を読み進めていますが、かなりわかりやすくて重宝しています。

あと、標準環境における実際の作業手順もスクリーンショットを混ぜて詳しく書かれているので、UI をカスタムしてしまった場合に標準の UI とか作業を知りたい場合にも便利。

欠点は本がかなり分厚くて重いこと。900ページオーバーなので、これを持ち歩くのはつらい>x<;

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

2007/02/13

[ programming ] naming

さて、今日は名前付けに関してちょっと愚痴ってみようと思う。名前付けといってもペットや子供のそれじゃなくて、プログラミングにおける変数とかメソッドに対するそれだ。まずはしたの2組のメソッド名を見てほしい。

lcount()
wcount()
count_line()
count_word()

どちらがわかりやすいだろうか?わたしは右側だとおもう。
プライベートの友人も全員右側がわかりやすいと答えた。

いうまでもないことだけど、右側がわたしがつけたメソッド名だ。左側はとある人が「こちらの方がセンスがよく、優れている」と主張したメソッド名だ。これを聞いたときは、心底呆れたよ。

友人に話してみたらある友人はジョークだと思って爆笑し ( すまないがジョークではなく本当にあったことだ )、他のある友人は「旧世代だな」と評し ( まったくその通りだ )、また別の友人は「いつも読みにくいコードばっかし書いてそうね」と酷評した。

メソッド名は、少なくとも外部に公開することを前提としたパブリックメソッドは、そのメソッドがどんなはたらきをするのかおおよその見当がつくものじゃなきゃならない。lcount() でどんなはたらきをするのか想像できるかい?wcount() ってこりゃ何を数えてるんだい?わたしにはさっぱりわからない。一方で count_line() ならば、「たぶん行数とか、並列して走るラインかなにかを数えるんだろう」という推測は容易にできる。count_word() なら、もっと限定した推測 -- こりゃきっと単語の数を数えてるに違いない -- ができる。

もし名前と違う動作をしていたら、「これって要求仕様を満たしてないんじゃないか?」とか「リファクタリングしたほうがいいんじゃないかな?」ということに気付けるわけだ。名前というのはちゃんと考えて、適切につければ要求仕様を満たしているかとかバグの発見にも繋がるとても大切なものなんだよ。

lcount() だとか、機能の推測がさっぱりできない名前をつける命名法が優れているなんて、率直に言って馬鹿としか思えない。こんなものがセンスだというなら、センスなんてクソ喰らえだ。

Explicit is better than implicit.
Readability counts.

Don't Make Me Think! では、「こりゃいったいなんだ?」と頭を捻らせるようなものは作ってはいけないとされている。わかりやすさのほうが、間違ったセンスなんてものよりも遥かに大事さ。

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

2007/02/05

[ ironpython / python ] ironpython で MD5 ハッシュ値を算出する

CPython の標準ライブラリのひとつ MD5 モジュールは IronPython では、そのままではインポートすることができません。その理由はこのへんにあるように C 拡張を利用しているからですが、MD5 が利用できないといろいろ不便です。

こちらには md5 モジュールを C# で作った方がいらっしゃいますが、ただ単にフィンガープリントを出力するだけとか、'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9' という形式ではなくて見慣れた形式のほうがいい場合もあると思って、ものすごく単純な関数を作ってみました。

import clr
clr.AddReference( "System" )

import System
from System.Security.Cryptography import MD5

def calculate_md5( hoge ):
	# Because CPython's MD5 module cannot be used.
	# Thus, to get a fingerprint, you must use .NET Framework Class Library module 
	# "System.Security.Cryptography.MD5"
	insMD5 = MD5.Create()
	return ''.join( [("%x" % fragment) for fragment in \
		insMD5.ComputeHash( System.Text.Encoding.Default.GetBytes( hoge ) )] )

やっていることは単純で MD5 クラスのインスタンスを作って、そのメソッドを呼び出して MD5 を計算します ( insMD5.ComputeHash() )。この戻り値は BytesArray 型のオブジェクトです。これをリスト内包式で "ea703e7aa1efda064eaa57d9e8ab7e" のようなよく見る形式に変換しています。変換前がいいという場合はリスト内包式を解除して insMD5.ComputeHash() だけの式にしてください。

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

2007/01/30

[ virtualize/dev ] VMWare から仮想イメージ作成ツール VMConverter3 リリース

VMWare, VMPlayer で使用できる仮想環境イメージを作成するツールがバージョンアップした。 VM Converter は、物理マシンから仮想マシンイメージを作成したり、別メーカーのイメージから VMPlayer, VMWare 用の仮想マシンイメージに変換できるツール。

Remote Cloning という機能を使うと、遠隔操作で仮想化したいマシンのイメージをつくることもできるらしい。

ソフト開発で厄介なのが環境に依存した不具合の対応。 手元の開発・テスト環境では問題が発見されなくても、リリース後にユーザの環境で発覚する不具合もある。こういった問題の解消は、結構面倒で頭が痛い。

VMConverter は、この問題を解決する道具の一つになるかもしれない。

問題が発覚したユーザに頼んで、PC のイメージを作成してもらうのだ。開発者はイメージを検証してどこが違うのか、問題の原因はどこにあるのかを調べることができる。

もっとも、パーソナルユーザはプライバシーの問題があるので積極的には賛同しないだろう。BtoB の場合でも守秘義務契約が必要になるかもしれない。こういったことは面倒ではあるものの、問題が発生した環境のスナップショットが簡単に作成できてそれを基に検証できるメリットは十分に大きいのではないだろうか。

これでデバッグが少しでも楽になればいいな・・・(´・ω・`)

Reference
VM Converter Overview
VM Converter Download Page

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

2007/01/29

[ python ] Twisted 2.5 が公開されていました

いつの間にか Twisted 2.5 が公開されていました。
Python2.5 にも対応したようです。

Twisted 2.4 の Windows 版ではいくつかバグがあったのですが、修正されたのでしょうか?
時間ができたら試してみようと思います。

開発元の Twisted Matrix とファイル直リン↓
Twisted Matrix
Twisted 2.5 Win32 for Python2.5
Twisted 2.5 Win32 for Python2.4
Twisted 2.5 tar ball ( Unix プラットフォームとか自前でコンパイルしたい人向け )
Core Documentation ( チュートリアルとかがあります )
API ドキュメント

2007.01.30 追記
少し試してみようかと思って、チュートリアルのコードを実行してみようと思ったのですが↓
>>> from twisted.internet.protocol import Protocol
C:\SDK\Python25\lib\site-packages\zope\interface\adapter.py:746: Warning: 'with' will become a reserved keyword in Python 2.6
という警告が表示されることは相変わらず。これは Twisted ではなくて ZopeInterface に原因があるのですが、なんにしても with は今後 Python の予約語になる可能性が高いので、他のライブラリと併用するとトラブルが発生することは否定できません。他のライブラリが使えなくなったら困るという人は見送ったほうがいいかもしれませんね。

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

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/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

[ 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/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) | トラックバック (0)

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

[ .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/11

[.NET] .NET Framework3 正式版リリース

.NET Framework3 ( 旧名 WinFX ) の正式版が公開されています。

Runtime は日本語版もありますが、SDK と VS Ext は英語版のみの様子。

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

2006/11/10

[ Python/.NET] IronPython で py をコンパイル

IronPython で py をコンパイル

IronPython 登場当初から Python ソースファイルのコンパイルが可能 ということは言われていました。実際、コンパイルして .exe ファイルを 作成することができます。

"ironpython コンパイル" で検索するとここが上位に引っかかるらしくて 結構実に来てくださる方がいるのですが、IronPython を VS2005 に統合する 別エントリでがっくりしてしまう方もいらっしゃるようで・・・ すみませんでした(´・ω・`)

さて、本題の IronPython を利用したコンパイルですが、 コンパイル機能は ipy アセンブリ(*)が持っています。 コマンドプロンプトを起動して "ipy -h" と入力するといろいろと オプションを表示してくれます。インタープリタエンジンだけではないんですね。

アセンブリ ( assemblies ) * :
アセンブリと聞いて「え?」と思う方もいると思います。わたしも最初驚いたのですが このアセンブリは作業やアセンブリ言語で書かれたファイルのことではありません。 .NET プラットフォームでの「アセンブリ」とは論理的な実行単位のことです。 .NET プラットフォームでの「アセンブリ」とは複数のモジュール ( モジュールはファイルとほぼ同義 ) が集まったものになります。この概念はあとで重要になってきます。.NET アプリケーションはモジュールが足りないなどアセンブリが不完全だと動作しません。詳しくはインサイド .NET Framework [改訂版]第一回をご覧ください。

コンパイルを実際にやってみましょう。 突然ですがエディタで次のコードを入力して、ファイル名を helloipy.py として保存してください。

print "Hellow IronPython!"
・方法1: ipy.exe を直接使う
コマンドプロンプトを起動します。コマンドプロンプトを起動したら
ファイルを保存したディレクトリまで移動しましょう。

移動できたら次のコマンドを入力します。


ipy.exe -X:SaveAssenblies helloipy.py

helloipy.py を保存したディレクトリにhelloipy.exe と helloipy.pdb というファイルが作られていればコンパイルは成功です。IronPython の Readme には -X:SaveAssemblies は "caching of generated assemblies" ってあるけど、 ( 中身は後述の方法と微妙に異なるけど ) EXE ができて ildasm をかけて内部動作を調べることもできるから 学習用のコンパイルとしてはこれでもいいと思います。

・方法2: pyc.py を使う
pyc.py は IronPython1.01 の Example として公開されているとても有用なモジュールです。 コンパイルのオプションがとてもわかりやすくなっており、PE ファイルだけでなく DLL ファイル の作成も簡単に指定できます。

Usage: ipy.exe pyc.py [options] file [file ...]

Options:
    /res:rfile.resource[,(public|private)]    Include public or private resource file
    /main:main_file.py                        Main file of the project (module to be executed first)
    /out:output_file                          Output file name (default is main_file.)
    /target:dll                               Compile into dll
    /target:exe                               Compile into console executable
    /target:winexe                            Compile into windows executable
    /platform:x86                             Compile for x86 only
    /platform:x64                             Compile for x64 only
    /platform:Itanium                         Compile for Itanium
    /r: or /reference:                        Add referenced assembly
    /? /h                                     This message
pyc.py を使ったコンパイルも簡単です。コマンドラインから

ipy pyc.py /main:helloipy.py

と入力するだけです。helloipy.exe とhelloipy.pdb が作成されていればコンパイルは成功です。 pyc.py では入力されたファイルとその成果物をメッセージとして出力してくれます。
Input Files:
        helloipy.py
Resource Files:
Output:
        helloipy.exe
Target:
        ConsoleApplication

pyc.py は IronPython.Hosting.CompilerSink と IronPython.Hosting.Compiler の wrapper なので自分でこれらのクラスを利用したり、あるいは IronPython.Compiler.* を使って コンパイラを作ってコンパイルということもできますが引数やらオプションやら 面倒なことを考えるよりも素直に pyc.py を使うことをお勧めします。

コンパイルはできました。しかし、作成された helloipy.exe を実行しようとしても エラーが出てしまって実行できません ( 環境変数の設定によっては実行できる方もいるでしょうけど )。 わたしの環境では実行しようとすると次のようなエラーが表示されました(一部編集しました)。

>helloipy

ハンドルされていない例外: System.IO.FileNotFoundException:
ファイルまたはアセンブリ 'IronPython, Version=1.0.60816.1877, Culture=neutral,
PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。
指定されたファイルが見つかりません。
ファイル名 'IronPython, Version=1.0.60816.1877, Culture=neutral, PublicKeyToken=31bf3856ad364e35' です。

太字の部分に注目してください。「必要なファイルまたはアセンブリが足りない」ので 実行できなかったことがわかります。.NET アプリケーションはアセンブリ単位で動作すること、 アセンブリは複数のファイルで構成されること ( そしてアセンブリ間にも依存関係があること ) を 思い出してください。

今回の場合には IronMath.dll と IronPython.dll の 2 つが必要になっています。 この 2 つのファイルを helloipy.exe とおなじフォルダにコピーすると動作するようになります。

少し面倒になりますが、IronPython で作成したアプリケーションを実行・配布するには、 コンパイルするだけではなく、アセンブリを構成するモジュール ( ファイル ) と、作成した アセンブリが依存しているアセンブリを全部そろえる必要があります。

まとめ: python コードのコンパイル
  1. ipy (オプション) (ソースファイル名)
  2. ipy pyc.py (オプション) /main:(ソースファイル名)
  3. IronPython.Hosting.CompilerSink とか IronPython.Hosting.Compiler とか IronPython.Compiler.* を使って自前でコンパイラコード作成
2 番がお勧め。3 番はマニアックな人向け。
コンパイルしたら依存関係があるファイルを集めて出来上がり(´・ω・`)b

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

2006/11/05

[python] うそん・・・(;´Д`)

新山さんの日記より。
わたしも試してみた。

Python 2.4.3 (#69, Mar 29 2006, 17:35:34) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.remove == os.unlink
True

どうやら Windows でも同じ現象が起こるようだ(;´Д`)

あ、もしかしたら 2.5 なら直っているかもしれないね。

Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import os
>>> os.remove == os.unlink
True

・・・・・・・・・( ´・ω・`)

第2弾。Multi Thread プログラミングについて。

こちらの ML によると Python のマルチスレッドは Crude らしい。そういえば数日前に threading モジュールを使ってマルチスレッドコードを書いたら、メインスレッドを終わらせたのにデーモンフラグを持ったスレッドがゾンビになっていたことがあったな。

Python's threads are crude because although they are OS scheduled, only one thread can access the Python internals at a time.

という欠点もあるみたい。この場合、マルチプロセッサで問題が顕在化するようだ。メインストリームの PC がマルチコア CPU 搭載機に移行しつつある現状を鑑みると、Python でマルチスレッドは避けた方がよさそうだね。

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

[ javascript ] js で Real-Time 3D

サイボウズラボの秋山さんのブログで紹介されていました。秋元さんのエントリでは IE6 では動作しないようなことが書かれていますが、11月5日現在さらに進化して IE6 でも動くようになってます。

Real-Time 3D in Javascript をみて驚いた。JavaScript と CSS だけで複雑な立体をつくりそれを回転させている。光源が立体に与える視覚効果まで考えて描画されているのは驚愕。なにも知らされずに見たとしたら、Java アプレットか ActiveX で動かしていると思ってしまうんじゃないだろうか。

もしかしたら簡単なアクションゲームなら作れてしまうんじゃないだろうか。手間はかなりかかるけれど、とても面白そうだ。

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

[ 備忘録/VS 2005 ] Visual Studio 2005 環境設定覚書

環境設定の変更で戸惑ったので自分メモ。

・規定の設定のコレクションを変更する

Visual Studio 2005 では初回起動時に、デフォルトの開発をどの環境で行うかを設定する。 たとえば、C# を選択した場合は C# に合わせた設定が自動的にロードされるし、C/C++ を選択した場合は C/C++ に合わせた環境設定が自動的にロードされる。簡単に言うと主役を誰にするかを決めるようなもので、ここで主役を決めると次からは決めた主役に合わせた舞台が用意されるわけだ。

ところで、最初に設定したコレクションのまま使い続けられればいいんだけど、メインで使う言語を変更したとか、次のプロジェクトでは違う言語を使うことにしたとか、舞台が全く異なる場合には主役を変更する必要も出てくる。変更の手順は次の通り。

1. [ ツール (T)] メニューの [ 設定のインポートとエキスポート (I)] を選択する

2. ウィザードの [ 全ての環境をリセット (R) ] を選択して [ 次へ (N)]

コレクション再設定ステップ2

3. 現在のコレクションとその設定を保存するかどうかを決めてから [ 次へ (N) ]

コレクション再設定ステップ3

4. 設定したいコレクションを選択してから [ 完了 (F)] をクリック。
ここでは既定のコレクションに「C# 開発設定」を選択しています。

コレクション再設定ふぁいなる

・ウィンドウの配置をリセットする

Visual Studio の GUI はかなり柔軟性があって、いろいろと変更ができる。不要なものは非表示にできるし、初期状態ではメインウィンドウに統合されている ( docked な ) ウィンドウもメインウィンドウから切り離せるとか結構便利だ。

そのとき作っているものあるいは開発の段階に合わせて GUI をいろいろいじると思うんだけど、使いにくく感じて設定をリセットしたいと思うときもある。また、別のプロジェクトファイルを開いてそちらの作業をするとなるとそのままのウィンドウ配置では使いにくく感じてしまうこともある。

入門書やマニュアルを引っ掻き回して、それを参考にしながら手作業で元に戻していくのはかなり面倒。Visual Studio を一度完全にアンインストールしてから再度入れなおすというのも、インストール時間がかなり長いのでやりたくない。以前の Visal Studio .NET ではオプションメニューの [ 環境 ]-[ 全般 ] カテゴリの中に「ウィンドウ レイアウトのリセット (L)」というボタンがあったんだけど、VS2005 ではそれがなくなってる。

「全部手作業で戻せということか?」とげんなりしたけれど、どうやら早とちりだったらしい。
他の場所に移動していた。

VS2005 でウィンドウの配置をリセットするには、[ ウィンドウ (W)] メニューの中にある [ ウィンドウレイアウトのリセット (R)] をクリックするだけでいいようだ。

vs2005 ウィンドウレイアウトのリセット

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

2006/10/23

[javascript] js にも eval() がある

Javascript にも Python でいう exec に相当するものがあるみたい。

知っていたら公開中のツールのコードの冗長性をもっと低くできたかもしれないなぁ
公開中のツールはどれも酷い冗長性だからね(^-^;;

次に作る予定のツールでは、今回知ったことを活かして
DRY Principle と KISS の原則を尊重する方向で作ろうと思う。

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

2006/10/20

[Python] 酷いコード

久しぶりに眩暈がするコードを見た。仕事で使うのでなければ、即座に解読を放棄しただろう。それができないからこそ苛立っているわけだが。

問題のコードは Python の標準モジュール logging だ。動作がよくわからないし場合によってはカスタムする必要があるかもしれないので、中をあけてみることになったのだが、これはわたしが「邪悪なオブジェクト指向」と呼んでいる、所謂クラス・継承至上主義のコードだった。何が酷いってたった一つのメソッドを解読するために幾つものクラス、複数のファイルを行き来しなきゃならない。

つまり、goto 文がそこらじゅうに、頻繁に埋め込まれているようなものなのだ。

あなたが経験豊富な C 言語のプログラマなら、goto 文をこれでもかとちりばめたスパゲティを目にしたことがあると思う ( しかもそれを作った担当者はもう現場にいない )。そのときの状況を想像してほしい。Python ではインデントが強制されるので C 言語よりは幾分ましだが、まぁ似たようなものだ。

クラスとか継承を無駄に多用したところで「オブジェクト指向」にはなりえないのだ。

と書きつつ、動的生成コードを書いて顰蹙を買ったわたしがここにいる・・・( ´・ω・`)
(言い訳をさせてもらえば, 先入観を捨ててからコードを見てほしいのだが。)

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

2006/10/19

[python]楽に条件分岐を行う方法

今回は if 文を 使わずに条件に合わせた処理を呼び出す方法。

条件ごとに処理を変えたい場合、一番よく知られているのは if 文だろう。C 言語などならば switch-case を使ったり、ちょっとトリッキーにポインタと配列を組み合わせるかもしれない。

Python では、標準で使える条件分岐は、残念なことに if 文しかない。2~3 個の分岐なら、読むほうも書くほうもちょっと我慢すればいい。しかし、分岐が10個とかあるいはそれ以上になると書くのもイヤだし読むのもイヤだ。

これを解決する方法は、大きく分けて2通りある。条件ごとの処理が全く違う場合と、条件が違っても処理の大部分は同じ場合だ。前者で処理ごとの関数を定義しなければならないのは if 文を使う場合と同じだが、後者の場合は大幅に簡略化できる。

まず、条件ごとの処理が大きく違う場合を考えよう。この場合は、それぞれの条件における処理を関数などに定義しておかなくてはならない。が、このときにちょっと工夫をするだけでかなり楽になるのだ。条件は "hoge", "fuge", "piyo" の3つがあるとしよう。すると、関数の定義は次のようになる。

# -*- coding: UTF-8N -*-
def handle_hoge( arguments ):
    (処理の定義)

def handle_fuge( arguments ):
    (処理の定義)

def handle_piyo( arguments ):
    (処理の定義)

次に定義した関数を呼び出す部分のコードだ。

exec "handle_%s( arguments )" % condition

たった1行だ。とはいっても IOCCC のように邪悪なコードではない。とても単純で簡単なコードだ。恐らく、 exec 構文知っているなら誰でも理解できるレベルだと思う。( とはいってもモジュール丸ごと動的生成するようなコードはとてつもなく邪悪になる( ´・ω・`) )
if 文を使ったよくあるコードと比べてみよう。

# よくある if を使ったコード
def hoge_hoge( arguments ):
    (処理の定義)

def fuge_fuge( arguments ):
    (処理の定義)

def piyo_piyo( arguments ):
    (処理の定義)

# 条件に合った関数を呼び出す
if condition == hoge :
    hoge_hoge( arguments )
elif condition == fuge :
    fuge_fuge( arguments )
elif condition == piyo :
    piyo_piyo( arguments )

この場合は条件が3つしかないからあまり効果が実感できない人もいるかもしれない。実感できないなら、場合分けが20通りもあって、さらに増える(つまり、あとで追加するかもしれない)可能性がある場合を考えてみよう。 exec 構文を使ったコードのほうが柔軟性も高いことが理解していただけると思う。

ちなみに、condition が数値である場合にはリストか辞書配列を定義して、数値から名前を引きできるようにしておけばいい。Python ならリストを生成するコードも簡単に書ける。リストも動的に生成するようにしておけば、後で分岐条件が増えたとしてもその処理を行う関数を追加するだけで動作する。

ポイントは関数名のフォーマットに一貫性を持たせること。condition の値が数値やオブジェクトの場合はそれと関数名を結びつけるリストか辞書配列を定義することの2つ。

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

2006/10/13

わたしが一文字変数を嫌う理由

GUI が一般ユーザへのユーザインターフェイスなら、ソースコードはプログラマに「何をやっているのか」を教えるためのユーザインターフェイスといえる。

いいユーザインターフェイスがどういうものか、ということについては Don't Make Me Think! に書かれているけど、その表題が示すとおりだ。

「さて、これは何をやっているんだろうな」とか「この変数には何が入っているんだろうな」って思われるようじゃダメなんだ。ここで考えてみてほしいんだけど、一文字変数とか一文字関数を Glance View しただけでそれらが何をやっているのか、何を保持しているのかわかるだろうか?

ReturnNotNone = lambda a, b: a or b 程度なら、関数の名前とあわせて None ではないほうの値を返すんだなと想像できると思う。でも、10行100行それ以上にわたって使われていたら?関数名まで一文字名だったら?きっと厄介な問題になるだろう。

書いた本人はいいかもしれない ( きっとあとで苦労するだろう ) けど、共同作業しているプログラマは頭を悩ませてしまう。悩んでいる間に1日2日と時間が過ぎていく。わかりやすい名前がつけてあればこんな無駄な時間は過ごさなくてすむはずなのに。

「さてこれは何をやっているんだろう?」と頭を悩ませるケースと、Glance View だけで理解してすぐにその先に取り掛かれるケース。どっちが生産的だと思う?

既に解決したはずの問題に頭を悩ませるか、未解決で誰も挑戦していない問題に取り組むか。どっちがエキサイティング?

ちょっと考えれば一文字名は使わないほうがいい事に気付くはずだ。

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

2006/10/12

[Django/Python] 気に食わない

何が気に食わないって、まずは眩暈がするほど可読性が低い admin ページのテンプレ。そしてだるいテンプレの記述ルール。なんで endfor とか endblock なんだ*?Python なんだからインデントで片付ければいいじゃないか。または %} でスコープエンドにするとか。まぁ、4294967296歩譲ってこれはいいとしよう。

チュートリアルには開発中はコードを修正すると自動でリロードが行われると書いてあるが、実際には行われないことが多々ある。そのときは開発サーバを手動で停止してから runserver しなきゃならない。このとき、とてもとてもとても親切なことに何も指定しなくても文法チェックをしてくださるらしく、ファイルが増えるにしたがって起動するまでの時間が延びていく。率直に言って邪魔なだけだ。効率のいい開発を妨げているとしか思えない。

動作が遅いプログラムはそれだけで存在価値がないと思っているわたしにとって一番気に食わないのは、この自動チェックだ。とりあえず動かしてみて、エラーが返ってきたり、動作がおかしかったらデバッガとかチェッカ走らせればいいだけじゃないのかな。無駄なことするよりさっさと起動してほしい。

今のところは、わたしにとっては Django は最も使いたくない Python Extension だ。

(*): 突っ込まれそうなので補足。
{% ~: %} か {{ ~ }} を使って下のように書けばいいよねということ。
{% if hoge:
    <ul>
        {% for fuge in [ piyo for piyo in piyopiyo ]:
            <li>{{ waha }}</li>
        %}
    </ul>
%}
尻尾の % はなくてもいいかもしれない。そうすれば 1キーですむし。{% %} ~ {% %} みたいに何回もカタカタタイプしなきゃならないのはすごくイヤだ。

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

[Django/Python] 文字化けをなくす方法

僅差で nakagami さんに先を越されてしまったけど、半日悪戦苦闘したのを投げてしまうのもしょんぼりなので書いておく。

Django を Windows にインストールしてチュートリアルを進めると、いろいろ試してみましょうって書いてあるものだから日本語を使う人もいると思うんだ。わたしもその一人なんだけどね。でも、初期設定のままで日本語を使うと下のようにコンテンツが何も映らないか、文字化けするんだよね。

コンテンツが見えない

解決方法

Django は UTF-8 を使うことを前提に作られています。Python コードは Python ランタイムが解釈して実行するので文字コードが何であろうと関係ないのですが、htm ファイルは UTF-8 で保存しましょう。ただし、UTF-8 にもいくつか規格が存在します。ハズレだとやっぱりコンテンツが見えません。Peggy だと UTF-8 では NG で UTF-8N で保存する必要がありました。

それと、サイトの設定も必要です。サイトの設定は setting.py で行います。 setting.py に LANGUAGE_CODE という項目があります。デフォルトでは 'us-en' かなにか、日本以外が指定されています。これを 'ja' (← アルファベットは全部小文字。シングルクォーテーションで囲む ) に変更して保存しましょう。全ての設定が終われば↓のようにちゃんと見えるようになります。

ちゃんと見えます
まとめ
  • htm ファイルは UTF-8 で保存
  • setting.py の LANGUAGE_CODE = 'ja'
  • DB が MySQL とかの場合はそっちの設定もチェック

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

2006/10/01

[Python] Miller-Rabin Pseudoprime Test

The module file is here.


def modular_exponentiation( base, exponent, modulus ):
        """
        caluclating ( base ** exponent ) % modulus via the Right to Left Binary Algorithm.
        detail of "modular exponentiation", see follow URL.
        http://en.wikipedia.org/wiki/Modular_exponentiation
        """
        remainder = 1
        
        while( exponent > 0 ):
                if( (exponent & 1) > 0 ):
                        remainder = ( remainder * base ) % modulus
                
                exponent >>= 1
                base = ( base * base ) % modulus
                
        return remainder


def miller_rabin( almost_prime, base_list ):
        # base_list should contain some primes
        
        remainder= 1
        
        for base in base_list:
                exponent = almost_prime - 1
                while( exponent > 0 ):
                        # exponent were odd number and ( base ^ exponent ) ≡ 1 mod modulus,
                        # then continue the loop. Because almost_prime has a probability that it is a prime.
                        # The case when ( base ^ exponent ) ≡ -1 mod modulus means passing Miller-Rabin witness with the base then testing with next base.
                        # However ( base ^ exponent ) is not congruent, then immediately almost_prime is identified as pseudoprime: return False.
                        remainder = modular_exponentiation( base, exponent, almost_prime )
                        
                        if remainder == ( almost_prime -1 ):
                                break
                        if( remainder != 1 ) and ( remainder != (almost_prime -1 ) ):
                                return False
                        if( exponent % 2 ):
                                break
                        exponent  >>= 1

        prime = almost_prime
        return prime

Miller-Rabin witness
Define sequence r(n) = b ^ {(m-1)/2n} % m
When an integer m is a prime and also b ( b < m ) is a prime then:

a(1) ≡ 1 a(1) ≡ 1
a(2) ≡ 1
OR
a(n-1) ≡ 1
a(n) ≡ 1 a(n) ≡ -1

Miller-Rabin witness is application of this feature. Function modular_exponentiation() calculates value of a(n). Function miller_rabin() evaluates sequence a(n). If a(n) !≡ ( 1| -1 ) then m is not prime. Otherwise m has passed Miller-Rabin pseudoprime test with the base. However, with another bases, it might be failed. Therefore it is necessary to test with more than one primes.

Overview of Miller Rabin Pseudoprime test, see Wikipedia: Miller-Rabin primality test.

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

2006/09/27

[Python] Miller-Rabin テスト作成中

Miller-Rabin テストのコードを作っています。 Miller-Rabin テストは任意の正数が素数であるかどうかを確かめる方法で、フェルマーの小定理を拡張したものになります。 今のところは↓

# -*- coding:sjis -*-

# module IsPrime.py
# Including function eratosthenes(), miller(), IsPrime()
# To identify argument as prime, using eratosthenes() and miller().
# IsPrime() is interface function.

def eratosthenes( probable_prime ):
        small_prime_list = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999 ]
        
        for prime in small_prime_list :
                if( probable_prime / prime == 0 ):
                        return False
        
        almost_prime = probable_prime
        return almost_prime


def modular_exponentiation( base, exponent, modulus ):
        """
        caluclating ( base ** exponent ) % modulus via the Right to Left Binary Algorithm.
        detail of "modular exponentiation", see follow URL.
        http://en.wikipedia.org/wiki/Modular_exponentiation
        """
        remainder = 1
        
        while( exponent > 0 ):
                if( (exponent & 1) > 0 ):
                        remainder = ( remainder * base ) % modulus
                
                exponent >>= 1
                base = ( base * base ) % modulus
                
        return remainder


def miller_rabin( almost_prime ):
        base_list = []
        exponent = almost_prime - 1
        
        for base in base_list:
                remainder = modular_exponentiation( base, exponent, almost_prime )
                if( remainder != 1 ):
                # !≡1, then imidiately identify almost_prime as pseudoprime.
                        return False
                elif( remainder == 1 ):
                # ≡1, then the almost_prime may be prime.
                # do Miller test with another base
                        pass
        
        prime = almost_prime
        return prime


def IsPrime( probable_prime ):
        if( type(probable_prime) != type( 0 ) ):
                print "Argument must be prime"
                return False
        
        almost_prime = eratosthenes( probable_prime )
        if almost_prime == False:
                print "%d is not prime." % probable_prime
                return False
        
        prime = miller_rabin( almost_prime )
        if almost_prime == False:
                print "%d is not prime." % probable_prime
                return False
        
        return prime

コードのファイルはこちら

今悩んでいるのは赤くハイライトした部分。Miller テストに用いる base のリストなのですが、ここに入れる素数をどうしようかなぁと。 miller_rabin() に渡される正数は、eratosthenes() によって5000以下の約数は存在しないことがわかっている ( 約数があった場合はそれは素数ではないので即座に False を返しています ) のですが、では base に使う素数はどうしたらいいのだろうと。 たとえば32bit 以下の素数の場合、2, 7, 61 の 3 つを base として行った Miller テストに合格すれば、それは確実に素数であることが保証されています。

引数として渡される数は 128bit ~ 512bit を想定しています。この範囲の正数に対して Miller-Rabin テストを行った場合、 素数に間違いないだろうと判定するに十分な base として使える数をご存知の方、ご一報ください。

2006.10.01
エラーを見つけたのでほぼ作り直しました。現在エントリ作成中
2006.10.04
バグ修正

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

2006/09/20

[python] Python2.5 Final released

Python2.5 正式版が公開されました。三項演算子が加わるなど新しい機能も追加されていて面白そう。

以下、英語のページなんて見たくもないという人向けにファイル直リン

ITProで 2.5 の大まかな変更点が紹介されています。bool 式を簡単に書けるようになったこと、Import の略式表記ができるようになったことはとてもありがたい。Python2.4 では reload() のときがかなり面倒だったからね。

Python2.5 に対応した Programming book は O'Reilly からProgramming Python 3rd Edがでてる。落ち着いたら読んでみようと思う。ちなみに、リファレンスも Python2.5 に対応しているみたい。リファレンスの方は、Python2.4 に限ればPython Essential Reference のほうがわかりやすいかな。こちらの出版社からPython2.5 のリファレンスでないかしら( ´・ω・`)

Reference
Python org
Python2.5 が登場 450以上のバグを修正し信頼性を向上
( ITPro, 笹田 仁, 2006/09/20 )

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

2006/09/16

[参加者募集/ Python]君ならどう書く? -merge sort-

本家 LLRing 風にちょっとした問題で遊んでみようと思います。Python 以外の言語の参加もお待ちしています。お題は↓

任意の大きさの配列 X に対してマージソートを行い、要素を昇順に並べ替えるコード

わたしの場合はこんな感じになりました。

def prepare_divide( unsorted_list ):
    length = len( unsorted_list )
    intermediate = [ unsorted_list[: length/2 ], unsorted_list[ length/2 :]]
    intermediate.sort()
    
    return intermediate


def divide( unsorted_list ):
    intermediate = prepare_divide( unsorted_list )
    divided_list = []
    for part in intermediate :
        max_length = len( part )
        while max_length > 1:
            divided_list += prepare_divide( part )
            
            max_length    = max( [ len(x) for x in divided_list ] )
            part = divided_list.pop( [ len(x) for x in divided_list ].index( max_length ) )
        else:
            divided_list.append( part )
        
    return divided_list


def merge( merged_list, sorted_list ):
    # Two list objects are required.
    # Both are must be sorted.
    
    probable_merged = []
    x = 0; y = 0
    try:
        x = merged_list.pop(0)
        y = sorted_list.pop(0)
    except:
        pass
    
    # To break Loop, chatching exception IndexError occured by list.pop(0)
    # Because lacking elements of lists, do Not write "while( list1 or list2 )"
    while 1:
        try:
            if( x < y ):
                probable_merged .append( x )
                x = merged_list.pop(0)
            elif( y < x ):
                probable_merged .append( y )
                y = sorted_list.pop(0)
            elif( ( x == None ) or ( y == None ) ):
                notNone = lambda i, j: i or j
                probable_merged .append( notNone( x, y ) )
        except IndexError:
            # When IndexError is raised, one of lists became empty.
            # Then appending the other into probable_merged
            if x in probable_merged:
                if not( y in probable_merged ):
                    probable_merged.append(y)
            elif   not( x in probable_merged ):
                probable_merged.append(x)
            probable_merged = probable_merged + merged_list + sorted_list
            break
        except AttributeError:
            break
    
    return probable_merged


def merge_sort( unsorted_list ):
    if type( unsorted_list ) != type( [] ) :
        import sys
        print "Argument must be List."
        sys.exit()
    
    divided_list = divide( unsorted_list )
    merged_list  = divided_list.pop(0)
    sorted_list  = []
    
    while len(divided_list) > 0:
        sorted_list = divided_list.pop(0)
        merged_list = merge( merged_list, sorted_list )
    return merged_list

↑が見難い場合はこちら
再帰を使わずに書いて見ました。merge() がなんか汚いです( ´・ω・`)

prepare_divide() と divide() で配列を分割。

merge() で2つのリストを統合。やっていることは単純で、2つの配列の中から一番小さな値から順に取り出して新しい配列に並べているだけ。例外を補足した後にごちゃごちゃやっているのは、要素が重複しないようにするため。

最後の merge_sort() はインターフェイス関数。引数のチェックと他の関数 divide() と merge() への引数パスとソート済みリストの出力を担当してます。

Python には要素が重複しないオブジェクトとして set オブジェクトがあるけど、これは unordered collection なのでソートには不向き。残る方法は、とりあえず全部突っ込んでから重複した要素を取り除くか、最初から要素が重複しないようにすることだけど、後者の方が簡単だと思って上のように実装しました。

三項演算子と do-while があったらもっと綺麗になりそうだなと思いつつ書き書き。たった一文字のTYPOに気付けずにデバッグに4時間半かかりましたとさ。最強のバグは TYPO かもしれない _| ̄|○il|!

2006.09.18
バグ&コメントのTYPO修正。
型チェックのつもりのコードが同値検査になってたよ_| ̄|○il|!

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

2006/09/13

[python] Python Network Programming

Foundations of Python Network Programming

ネットワークプログラミングなんてやったこともないのにいきなり Twisted Essensial を読んで自爆。やはり基礎から順番に勉強する必要がありますね。ネットワークプログラミングの基礎を勉強するにはどれがいいのか、お勧めを聞いて Foundations of Python Network Programming でまず勉強することにしました。が、いきなりちょっと問題があるコード発見。コードは chapter1 の download.py

import urllib, sys

f = urllib.urlopen( sys.argv[1] )
while 1:
    buf = f.read( 2048 )
    if not len( buf ):
        break
    sys.stdout.write( buf )

Windows ではそのまま実行することはできませんし ( gunzip を自前でコンパイルする必要あり )、Cygwin でも 「 more なんてコマンドないよ!」とエラーが出てしまいます。 more なんてなくても実行できることはできるのですが、動作が果てしなく重くなる。そもそも、このコードではダウンロードしたファイルは画面に出力することが前提になっているのでファイルとして保存することができません。なんとなく気になります。ということで書き直してみました。

# simply download client
# this script require exactly two arguments.
# first argument is URL and second argument is file.

import urllib, sys

f = urllib.urlopen( sys.argv[1] )
d = file( sys.argv[2], 'wb')
while 1:
        buf = f.read( 2048 )
        if not len( buf ):
                break
        d.write( buf )
d.close()

コマンドライン引数は2つ必要になります。一つ目が URL で、次がファイル名。ファイル名はフルパスです。

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

2006/09/11

[python] IronPython 1.0 Released!!!

Python の .NET 実装 IronPython の1.0正式版が公開されました。

詳細は CodePlex のこちらをご覧ください。サンプルコードをダウンロードできるほか、CPython と IronPython の違いについての解説もあります。なお、いくつかのサンプルコードには .NET Framework3.0 CTP が必要になります。

・・・
まずは計算ツールのバグつぶして、Waltzing with Bears とハイゼンベルグの顕微鏡を読破してからにしよう。本が積み上がったタワーがかなりの高さになってるし・・・( ´・ω・`)

Refelence
CodePlex --IronPython--
IronPython1.0 ダウンロードページ
IronPythonのサンプルコード
IronPython と CPython の違い

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

2006/08/27

[ Python/LLRing] re: 君ならどう書く 2.0 -Round 1- 改

前回のエントリで書いたスクリプトには、LLRing ブログのコメントにあった美しいスクリプトにも、欠点がある。 それは N が大きくなるとメモリ消費量が膨大に増えてしまうこと。

原因は最初に 2 から N までの自然数を全て含む集合を作ってしまうことにある。

range(2, N )

この部分だね。このほかにも、結果を全て含むリストを作成してからそれを返しているのもメモリを大量に消費してしまう原因だ。これを解消したスクリプトを作ってみた。

def search_prime( max ):
    probable_prime = 2
    prime = None
    
    while probable_prime <= max :
        aNum = 2
        while aNum < probable_prime :
            if (probable_prime % aNum) == 0 :
                break
            elif( probable_prime % aNum ) != 0 :
                if aNum == ( probable_prime -1 ) :
                    prime = probable_prime
                    yield prime
        
            aNum += 1
        
        probable_prime += 1


if __name__ == "__main__" :
    import sys
    for i in search_prime( int(sys.argv[1]) ):
        print i,

このコードはエラトステネスの篩ではなくて、素数の定義そのものをもとに書きました。つまり、「素数とは、1とその数自身以外に正の約数を持たない(つまり1とその数以外のどんな自然数によっても割り切れない)、1 より大きな自然数のことである」(Wikipedia「素数」より引用)です。言い換えると、1より大きな自然数 i について、i を 2以上 i 未満の自然数で割ったときの余りが全て 0 でなければ自然数 i は素数なのです。

2以上 N 以下の 任意の自然数 i 全てについて、上記の定義が当てはまるものを探しています。そして、当てはまるものが見つかったらそれを即座に yield しています。

この方法でメモリ消費量は抑えられたのですが、今度は処理速度が・・・ orz

Relative
re: 君ならどう書く 2.0 -Round 1-
re: 君ならどう書く 2.0 -Round3-

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

2006/08/26

[ Python/LLRing] re: 君ならどう書く 2.0 -Round 1-

お題は「100までの整数の中から素数を列挙する」こと。
素数を見つける方法といえばエラトステネスの篩。

primes = []

# Obviously 0 and 1 are not prime.
# This problem is equal that searching primes in a range( 2, 100+1 ).
set_of_int = range( 2, 100 + 1 )
dflag = {}
for d in set_of_int :
    dflag[d] = None

while( len( set_of_int ) ):
    # At the sieve, the top element of the list is always prime.
    # All integers included set_of_range[1: ] are devided by prime.
    # when a remainder is 0, the integer is not prime.
    for pp in set_of_int[1: ]:
        if( pp % set_of_int[0] ) == 0 :
            dflag[ pp ] = False

    for key in dflag.keys():
        if dflag[ key ] == False :
            dflag.pop( key )

    # remove the element that is identified as prime
    dflag.pop( set_of_int[0] )

    # append a prime to prime progression
    primes.append( set_of_int.pop(0) )

    # update probable prime
    set_of_int = dflag.keys()
print primes

めちゃめちゃ醜いです。美しさのかけらもありません orz
コメントを読まないと、たぶん何をやっているかさっぱりわからなくなるでしょう。

実は元エントリのコメントに素晴らしいコードがあるんですよ。残念なことにランキング投票の対象にはならなかったようですが、わたしはこのコードに一票入れたかったです。とても美しいコードです。

[p for p in range(2,100) if 0 not in [p%d for d in range(2,p)]]

最初に 2以上 100未満の整数の集合をつくり、その中の数 p に対して 2以上 p 未満の数で割ったあまりの集合を求めています。余りの集合の中に 0 がひとつでもあれば、割り切れる数があったということを意味しますからその数は素数ではないということになります。最終的に得られるリストは 2以上 p 未満の数では割り切れない数、つまり素数だけを集めたものになります。

リスト内包表記が使われたコードは「うわ、読みたくないなこれ」というような可読性がとても低いものが多いように思えます。しかし、このコードは実に簡単に理解できます。この点でも驚きました。素晴らしいです。

Relative
re: 君ならどう書く 2.0 -Round 1- 改
re: 君ならどう書く 2.0 -Round 3-

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

[Python / LLRing ] re:君ならどう書く2.0 -Round 3-

Python で書いてみる。引数として与えられた数値のうち最大の数値を '*' 20個であらわし、他の数値は '*' をつかった相対的な長さで表現することにしよう。

import sys

# descending sort
# because all argument are recognized as string,
# it is necessary transform str to int. After that,
# using sort( reverse=True ).
num_list = []
for arg in sys.argv[1: ]:
        num_list.append( float(arg) )
num_list.sort( reverse = True )

# Maximum is represented by ('*' * 20).
# others are represented by relative length with '*'.
args_and_str = { num_list[0]: '*' * 20 }
for anum in num_list[1: ]:
        relative_length = int( round(( anum / num_list[0] ) * 20) )
        args_and_str[ anum ] = '*' * relative_length 

# display graph
key_list = args_and_str.keys()
key_list.sort(reverse = True)
for akey in key_list:
        print "%g : %s" % ( akey, args_and_str[akey] )

本当は太字の部分は
#for akey in args_and_str.keys().sort( reverse = True ):
って一行で片付けたかったんだけど、これでは Iteratable object が返らないみたいだし*1、無理にやろうとすると複雑になりそうな予感がしたので3行に分割することにしました。

読みやすいコードを意識したのですがどうでしょうか?
他の方のコードを見ていると場違いな気がしてきました orz

*1: list.sort() は in place の Stable 置換なので新たなリストオブジェクトは返ってきません。None が返ってきます。

Relative
re: 君ならどう書く 2.0 -Round 1-
re: 君ならどう書く 2.0 -Round 1- 改

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

2006/08/17

[ Javascript ] 辞書(連想)配列の Key を取り出す方法

前のエントリで、JavaScript では辞書配列の Key を取り出して利用する方法がわからなくて苦労したのだが、havana から Key を利用する方法を教えてもらうことができた。その方法で作ったのが バード成功率計算ツール。havana, ほんとうにありがとう!

辞書配列の Key を取り出すにはどうすればいいのか。コード中ではイテレーションを利用して Key を取り出しています。たとえば、次のような辞書配列があったとしましょう。

var instruct = new Array();
instruct = {
    'provocation':{
        'Normal_Quality':       0.0,
        'Exceptional_Quality': 10.0,
        'Slayer':              20.0,
        'anti':               -20.0,
        'anti & Normal':      -10.0,
        'Slayer & Normal':     10.0,
        'Slayer & anti':        0.0
    },
    'discordance':{
        'Normal_Quality' :       0.0,
        'Exceptional_Quality':  10.0,
        'Slayer':               20.0,
        'anti':                -20.0
    },
    'peacemaking':{
        'Normal_Quality':        0.0,
        'Exceptional_Quality':  10.0,
        'Slayer':               20.0,
        'anti':                -20.0
    }
}

この中から 'provocation', 'discordance', 'peacemaking' を取り出したいときは↓
(ボタンを押すと実行します。)

var keys = '';
for( keys in instruct )
{
    paragraph.style.background = 'aliceblue';
    paragraph.innerHTML += (keys + '<br>') ;
}

イテレーションを使うとこのように Key の文字列を利用できるのです。バード成功率計算ツールのコードでは、実際には "provocation", "discordance", "peacemaking" はフォームから取得しています。そして、その内側にネストされた辞書配列の key をフォームの動的更新に使い、値を成功率の計算に利用しているのです。

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

2006/08/04

[JavaScript]辞書(連想)配列のKeyが取り出せない?

次のような辞書配列があったとします。

d_hoge = {
    key1 : {
        nstd_key1 : val1,
        nstd_key2 : val2,
        nstd_key3 : val3 },
    key2 : {
        nstd_key4 : val4,
        nstd_key5 : val5,
        nstd_key6 : val6 },
    key3 : {
        nstd_key7 : val7,
        nstd_key8 : val8,
        nstd_key9 : val9 }
}
key1, key2, key3 ( もちろん str ) を使いたいとき、つまり value ではなくて Key のほうを取り出したいときはどうするでしょうか? Python なら次のように書きます。
d_hoge.keys()
とても簡単です。では、その内側にある辞書配列 d_hoge[ key1 ] が持つ3つの Key を取り出すにはどうすればいいでしょうか?これも簡単です。
d_hoge[ key1 ].keys()
実際に Idle 上で実行するとこんな感じになります。
>>> d_hoge.keys()
['key3', 'key2', 'key1']
>>> d_hoge["key1"].keys()
['nstd_key2', 'nstd_key3', 'nstd_key1']

JavaScript で辞書配列の Key を取り出すにはどうすればいいのでしょうか?
前置きが長くなりましたが、こちらが本題です。調べたのですが無理なようです。現在 JavaScript でちょっとしたツールを作っているのですが、それにはどうしてもこれが必要なのです。でも、できません。泣きそうです。どなたか教えてください (T-T)

2006.08.17
解決しました。 エントリはこちら

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

2006/08/02

[ webdev ] Aptana は Dreamweaver の代わりにはならない

404 Blog Not Found 経由で Webdev 用のフリーソフトIDE Aptana を知る。JavaScript をつかった開発にも使えるらしい。ちょうど JavaScript の IDE を探していたところなので早速 Aptena のHP に飛んでチェック。が、、、System Requirements に JRE v1.42 の文字が・・・

Java 大嫌いなわたしは JavaVM そのものがインストールされていないし、する気もない。 どうやら Aptana とはご縁がなかったようだ。

Dreamweaver も JavaScript 開発に使えるっぽいのでこっちはどうだろうと思ってチェックしたらなんと価格が5万!Visual Studio Pro が C#, C/C++, VB, J#, ASP.NET の開発に使えて10万程度であることを考えると、JavaScript だけに5万はあまりにも高すぎる気がします。

¥1万以内 ( $100 以内 ) の JavaScript 開発環境はないかしら・・・

2006.08.07 追記

使わずにどうこう評するのはよくないといわれたので使ってみた。まず最初に感じたのは、やっぱりその重さ。Eclipse ほどではないけれど、起動に時間がかかりすぎ。Visual Studio よりも時間がかかります。起動した後も、動作にもっさり感がある。げんなりしながらも1つくらいは書いてみることに。ところが致命的な問題が発生。800行を越えた辺りでしょうか、キーを打ち込むたびに「スタックオーバーフローが発生した。終了することを推奨する。詳細はログを見ろ」とメッセージが表示されるのだ。全く編集することができない。

率直に言って、話にならない。Dreamweaver の変わり?到底無理だろう。現在 Dreamweaver を使っていて価格以外に不満がないならそのまま Dreamweaver を使い続けることをお勧めします。

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

2006/07/18

[ python / VS2005 ] VS2005 に IronPython を統合する方法

このエントリは aaronmar 氏の Blog "Aaron Marten's WebLog" にある、VisualStudio2005 に IronPython を統合する方法を解説したエントリ "A bit more on IronPython" を日本語に翻訳したものです。原文にもありますが、動作保証は一切ありませんしクレームも一切受け付けません。トラブルが発生しても原著者 aaronmar 氏にクレームを送るようなことはしないでください。

IronPython を VisualStudio2005 に統合するにはどうしたらいいの?
最初にこちらから VisualStudio SDK の最新版をダウンロードしてください。ダウンロードするためには VSIP のメンバーに登録する必要がありますが、参加者レベル ( 訳注: 原文は affiliate level ) ならば無料です。また、VSIP ライセンスに同意する必要があります。

訳注:リンク先にはチェックボックスがあります。以前に VSIP のサイトを利用したことがあり、そのときに会員登録を行ったことがある場合は "Yes" を選択してください。初めて VSIP のサイトを利用する場合は "No" を選択してください。また、Microsoft Passport を持っていない場合は作成する必要があります。 すごくめんどうですが・・・ (-_- il|!

どのレベルの VisualStudio が必要なの? ExpressEdition でも大丈夫?
残念ながら ExpressEdition では無理です。VisualStudio ExpressEdition はアドインやパッケージによる機能拡張をサポートしていないのです。これは Express シリーズの制限の1つです。VisualStudio Standard かそれ以上が必要になります。

VisualStudio SDK をダウンロードしたよ。IronPython を VisualStudio で動かすには、次は何をするの?
Visual Studio SDK をデフォルトのままでインストールしたとしよう。VisualStudio2005 を起動して、↓のパスにあるソリューションを開いてください。

C:\Program Files\Visual Studio 2005 SDK\2006.04\VisualStudioIntegration\Samples\IronPythonIntegration
ソリューションを開いたら [F5] キーを押して Build&Debug を行います。こうすることで VisualStudio の "Experimental hive" モードを開始します。デバッガなしの Experimental Hive モードを開始したいときは "devenv/rootsuffix Exp" ( 訳注:英語版VS がないので確認できませんでした。) を実行するかスタートメニューにあるショートカットから起動してください。

ビルドして実行したけど、これからどうするの?
C# を使ったプロジェクトを作成するときと同じようにして IronPython を使った新しいプロジェクトを作成できます。コンソールアプリケーションを作ってしばらく遊んでみるといいでしょう。拡張子 .py が付いたファイルを開くと、コードが見やすくカラーリングされるのがわかると思います。( 訳注: 実際に py ファイルを開いたところ、↓のようになりました。) vs2005 integrated IronPython

もうひとつ、ちょっとクールなアイテムがあります。このサンプルはアウトプットウィンドウやソリューションエクスプローラに似た IronPython Console Window と呼ばれるツールウィンドウを含んでいるのです。IronPython Console Window は "View-Other windows" ( 訳注: ゴメンナサイ。どのメニューか確認できません。) から起動することができます。

このコンパイラはどうなってんの?IronPython バイナリをコンパイルできないよ。
過去数ヶ月にわたって IronPython チームは IronPython.dll にコンパイラとしてのインターフェイスを追加してきました。これはアナタがビルドメニューを選んだときに、IronPython のシステムがコードをコンパイルするために使うものです。コンパイラがどうやって動いているのかということについて完全に理解するために必要なものが、IronPython ランタイムである IronPython.dll にかなり深く食い込んでいるのです。そもそも Python は動的な言語です。IronPython バイナリが実行されると、それぞれの命令文は逐次評価と型のチェックが行われて実行されるのです。

これが意味するとことは、IronPython バイナリの中身の MSIL は C# や VB で作成された一般的な .NET ライブラリとは異なるということです。実際、他のプロジェクトからは使用することはできないはずです。

相互に参照している複数の py ファイルがあるんだ。これはどうやって動かすの?
簡単です。一連のファイルを同じフォルダの中に入れておいてインポートするだけです。たとえばメインのファイルとして program.py というファイルがあり、myModule.py というファイルをインポートする必要があるとします。2つのファイルを同じフォルダに保存しておけば、 program.py ファイルの中に次の1行を追加するだけです。

import myModule

訳注: ファイルが多くなった場合はサブフォルダを作成して、パッケージインポートを行うと楽になります。パッケージインポートについては Learning Python を参考にしてください。

おっと、バグを見つけたんだけど・・・
こちらに英語でフィードバックを送ってください。発見した問題、質問、提案どれでもいいです。わたしたちは ver2.0 に向けて準備をしています。今はバグの修正と提案を受け付けている最中なのです。

Reference
A bit more on IronPython( Aaron Marten, 2006/02/16 )
Extending Visual Studio 2005
( CodeGuru.com, Vijay Mehta, 2006/04/24 )
Learning Python ( Oreilly Japan, 原著:Mark Lutz 訳: 夏目大 )

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

2006/07/17

[ Python ] IronPython β9

Python の .NET 実装である IronPython の開発が CodePlex に移ったようです。
.NET ライブラリ を Python のコードから簡単に使えて、かつ CPython との完全な互換性を目指して開発が続けられているそうです。 ver1.0 の正式なリリースは今年の夏が予定されています。

IronPython beta 9 のダウンロードはこちら
β9 ではバグフィックスと CPython との互換性向上、パブリック API の最終的な決定に焦点が当てられています。ホスティング API にも変更が加えられており、サンプルコードがリリースノートに書かれています。

あと、こちらに IronPython を VisualStudio2005 に統合する方法が紹介されています。ただし、無保証でありクレームは一切受け付けないと明記されているので自己責任で行いましょう。

Reference
CodePlex: IronPython Project Page( Microsoft, 2006 )
IronPython Beta9 Release Notes( Microsoft, 2006/07/12 )
A bit more IronPython( MSDNblogs, aaronmar, 2006/02/16 )

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

2006/07/13

[ Python ] Installing TurboGears for Windows

最新LL 5大フレームワーク徹底攻略

最新LL 5大フレームワーク徹底攻略でも紹介されているらしい、Python の Rapid webdev 向けフレームワーク TurboGears のインストール方法です。TurboGears は Rails の Python 版といったところ。TurboGears が何を目的としたフレームワークであるかの詳細は About TurboGears を参考にしてください。

TurboGears には Python 本体が必要になります。TurboGears のインストールパッケージには Python 本体は含まれていないので、TurboGears をインストールする前に Python をインストールしてください。本稿では Python 2.4 がインストールされているものとして進めていきます。

インストール方法
  1. 1. まず、ここから ez_setup.py をダウンロードします。別ウィンドウにテキスト表示されてしまう場合は、リンクを右クリックしてから「対象にファイルを保存」を選んでファイルをダウンロードしてください。
  2. 2. コマンドプロンプトを起動します。起動したら ez_setup.py を保存したディレクトリに移動してください。
  3. 3. 次のようにコマンドを入力していきます。( スペースの関係上改行していますが、改行せずに1行に入力してください。)
    
    ez_setup.py -f
     http://www.turbogears.org/download/index.html
     TurboGears
    
コマンドに間違えがなければ、必要なファイルが自動的にダウンロードされて、インストールされていきます。最後にエラーがあったかどうかが表示されますが、その行が "error: None" となっていればインストールは成功です。

本家にはチュートリアルも用意されています。

Reference
TurboGears.org
TurboGears Installation on Windows( Kevin Dangoor, 2006 )
The 20 Minuts Wiki ( Kevin Dangoor, 2006 )
Creat Great web apps faster ( Kevin Dangoor, 2006 )

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

2006/07/03

[ review ] Python cookbook chapter2

Python Cookbook 2nd Ed.

Chapter1 の頭が痛くなる英文にげんなりして読むペースが大幅にダウンしてたけど、なんとか chapter1 読了。とはいっても使いそうにないところは、英文が酷かったこともあって飛ばしたけどね。 もう一度言わせてもらうと、Fred L. Drake, Jr. 氏 ( Chapter1 の編著者 ) の書いた本は読みたくないな (-_- il|!

いまは chapter2 を読み始めたところ。 chapter2 の編集者は Mark Lutz 氏。Learning Python の共同執筆者の一人だ。Learning Python は結構読みやすいほうだったかな。それもあって期待してた。今のところ ( とはいってもまだ Introduction とはじめの方のレシピをいくつか読んだだけだけど ) は内容もきちんとまとまっていて文章も読みやすいから期待通り。

ファイルの R/W は Learning Python でも、基本的なことは触れられていた。ちょっとしたスクリプトなら Learning Python でもいいんだけど、特定の情報が書かれた行だけを読み出してその情報にあわせた処理を行うというようなプログラムになると、美しいと思えるコードは書けません。独学で先に進むには、先人たちはどうやっているんだろうってことを教えてくれる本が必要だなって思う。Python Cookbook では、より安全なコードはどうやって書くのかとか特定の行を処理するにはどうしたらいいかとか CRC はどうやって求めるのか etc,,, 実際にどうやって書いているのかが解説されています。

Mark Lutz 氏の著書は、8月に Programming Python 第3版が出版されるらしい。Python 2.5 にも対応しているらしいから、中身を読んでみて得るものが多そうならこっちも購入して勉強しようと思う。近くには洋書を扱っている書店がないので O'reilly 本家か Amazon のサンプル待ちかな。

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

2006/06/23

[ Python ] Space と Tab の変換

Python Cookbook のレシピにあるコードは Space が1つあると 全て Tab に置き換えてしまう。おまけに「いくつ SP が並んでいたら Tab に置き換えるのか」といったことも設定できないなど不便なので 改良してみました。


import re
import string

def SPtoTab( targ_str, space_length = 4, tablen = 4 ):
    # sprit targ_str into alternating space and non-space sequences.
    str_list = re.split( r"( {"+str(space_length)+r",})" , targ_str.expandtabs( tablen ) )
    
    # keep track of the total length of the string so far
    len_so_far = 0
    
    for i, piece in enumerate( str_list ):
        this_length = len( piece )
        len_so_far += this_length
        
        if piece == '\n':
            str_list[ i ] = '\n'
        
        elif piece.isspace() :
            # turn each 4 spaces sequences into tab
            numblanks = len_so_far % tablen
            numtabs   = ( this_length - numblanks + tablen -1 ) / tablen
            str_list[ i ] = ( '\t' * numtabs + ' ' * numblanks )
    
    return ''.join( str_list )

ファイルはこちら ( tgz形式 )

普段コードを書くときはインデントに Tab を使っているんだけど、スペースでインデントされているコードもあって、そういうのを利用してコードを起こすときとか違和感がすごいんだよね(-_-;)

そんなときSpace を Tab に変換するときに便利かも?
ファイルの読み込みと書き出しも付けた方がいいかな・・・
う~~~ん( ´・ω・`)

2006.06.24 追記 コードのバグを修正。
SPtoTab.py にファイル I/O 機能を追加。

逆に、Tab を Space に置換するスクリプトも作成しました。
こっちの方が使用頻度は高いかも?
こちら( tgz 形式 )

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

2006/06/22

[ Python ] Python 2.5 beta1 released

Python2.5 beta1 が予定より遅れて、昨日公開されました。
リリース情報はこちら

Windows なら MSI ファイルをダウンロードして実行すれば セットアップウィザードが起動しますのでその指示に従えば セットアップは完了します。ただし、プロセッサごとに インストールパッケージが分かれていますのでご注意を。

インストールパッケージ
32bit Windows ( MD5:5155c607aa51df97d8d4200ebc68601d )
IA64 Windows ( MD5:89495a0e1a03f81c4f232bd927ad0f15 )
AMD64 Windows ( MD5:f1134ecf1fb1fbbb2a62f61f3f73481f )

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

2006/06/20

[ webdev ] よりよい Web サイトを作るための5ステップ

個人サイト、企業サイト、商用サイトを問わず「良い」 Website かどうかというのは大きな問題だ。とくに商用サイトではクリティカルな問題といえるだろう。「良い」サイトを作るためには時間がかかるし考えなくちゃならないことがたくさんある。その問題の答えに繋がるヒントが project83.com から提案された。 project83 によるとポイントは5つあるらしい。構文解釈が難しい英文が多くて頭が痛くなったけど訳してみた。誤訳があると思うので、英語に詳しい人からの突っ込みお待ちしています。

1. Create a call to Action ( アクションコールを作れ )

多くの人が機能とか要素のデザインに没頭しているけど、これらははそれほど重要じゃないんだ。