goo blog サービス終了のお知らせ 

路傍のプログラマ

只のプログラマが綴る愚痴と備忘録

UNICODEの1文字を表現するのに必要なバイト数の最大値は?

2010-03-22 04:11:27 | プログラミング
答え: 無限大。

NOZAKIさんの「めもがき」2010/2/3分(以下のリンク)を読んで知りました。感謝。

http://www.hi-matic.org/diary/index.cgi?20100203

しかし、

日本語の文字に限って、
濁点とかを度外視して、
UTF-32で処理しても、

固定長にならないのかー。

これだったら、UNICODEは可変長の外部コードだと割り切って内部はJIS(区点コード)を使った方が簡単だったりして。
というか、UNICODE対応を謳ってても日本語が全く通らないソフトとかは似たようなこと(内部ASCIIとか)やってるんだろうなー。

uniじゃなくて、multiコードだよなあ。

(2010/03/25 一部追加)

pypy 1.2リリース

2010-03-13 13:24:41 | プログラミング
pypy 1.2が正式にリリースされましたね。

http://pypy.org/download.html

バイナリで(も)リリースされてるから、インストールも解凍するだけで楽チン。
(1つ前のポストで悪戦苦闘してるのがアホらしいくらいに)

いくつか手元の小さなコードでベンチマークすると、速い速い。

CPython 2.5ベースなのでmultiprocessingが入ってないのがちょっとだけ残念。

(2010/03/14 追記)

Computer language benchmarks gameに、早速pypy入ってますね。

http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=all

CPythonのちょうど2倍くらいの速度、という結果になってます。

pypy-trunkコンパイルできました

2010-03-10 00:36:03 | プログラミング
pypy-trunkがWindowsでコンパイルできたので、手順をメモ。

以下の手順は、(3)以外はpypyのgetting startedのページの内容そのままです。
http://codespeak.net/pypy/dist/pypy/doc/getting-started.html
http://codespeak.net/pypy/dist/pypy/doc/getting-started-python.html

PythonとVS2008とsvnをインストールしてあるところから。

(1) VS2008のコマンドプロンプトを起動します。以降の手順はすべてコマンドプロンプトから。

(2) 作業用のディレクトリを作って(ここではC:¥svnとします)、ダウンロード。

mkdir C:¥svn
pushd C:¥svn
svn co http://codespeak.net/svn/pypy/trunk pypy-trunk

(3) コードページがデフォルトの932(日本語)だとpypyがエラーでとまるので、英語にしておきます。

chcp 437

(4) translate.pyでpypy-c-jitを作ります(jitオプションをつけてソースコードを生成し、vcにコンパイル・リンクしてもらう)

pushd c:¥svn¥pypy-trunk¥pypy¥translator¥goal
c:¥python26¥python.exe translate.py --opt=jit targetpypystandalone.py

後はひたすら待ちます。pypy-c.exeができたら終わり。

できあがったpypy-c.exeは好きなディレクトリに(パスの通ったディレクトリにとかに)コピーして実行できます。

(追記 2010/03/12)

勘違いしていたのですが、pypy-c.exeはポータブルではないようです。
(同じPCの中ならどこに動かしても大丈夫だったのですが、別のPCにコピーしても動きませんでした。)

別のPCに動かす必要があるときは、もとのC:¥svnのディレクトリの中身もそっくり同じパスになるようにコピーすれば大丈夫なようです。

Python、空のイテレーター その2

2010-02-22 18:31:24 | プログラミング
解答編。

思いついたもので、ちゃんと動くものから順に。

def s1():
 for i in (): yield i

def s2():
 raise StopIteration
 yield # dummy

def s3(): return iter([])

s1は動作としては正しいけど、何となく野暮ったい。

s3はちょっと違う気がします。

なぜなら、s3自体はイテレータではなく、s3がイテレータを返す、という実装だから。この違いは、ちょっとしたきっかけで表面化します。

例えば、yieldを付け足したくなったとき

def s3kai(x):
 if x ....:
  yield 1
  yield 2
 else:
  return iter([])

がエラーになったり。

というわけで、個人的にはs2がいいと思うのですが、まあ気分の問題かも。

Python、空のイテレーター その1

2010-02-19 13:18:36 | プログラミング
空のイテレータを作ろうとしてハマりました。

1つだけアイテムを返すイテレータを作るのは簡単です。
def f(): yield 1
と定義しておけば、
for i in f(): print i
という感じで使えます。

0個のアイテムを返すイテレータが必要になって、はたと困りました。

失敗作を、作ったものから順番に並べると、次のように。

def f(): pass # イテレータではなく普通の関数になってしまう
def f(): yield # Noneを返すイテレータになる
def f(): raise StopIteration # イテレータを返さずに、単に例外を投げる

正解(というか期待通りに動くもの)は次のエントリで。

・・・分かってる人には当たり前だのクラッカー(ご冥福をお祈りします)かもしれませんけれど。

メモ: gedit for windows

2010-02-03 22:12:54 | プログラミング
geditのWindows版を見つけたのでメモ。

http://live.gnome.org/Gedit/Windows

そのままではフォントが変なので、[編集]-[設定]の[フォントと色]タブで、MS Gothicに変更。

ファイルの文字コードのデフォルトはUTF8ですが、[ファイル]-[保存]の[エンコーディング]で、[現在のロケール]にすれば、CP932(シフトJIS)でも保存できるようです。

geditにすれば、UbuntuとWindowsでテキストエディタを統一できそう。

2to3.py

2010-01-28 18:38:47 | プログラミング
そろそろpy3k対応も考えないといけないようなので、2to3.pyを試しに使ってみました。

まだまだ手作業がいるなあ、と思ったところをメモ。

・「for i in map(...)」というのを、「for in list(map(...))」に直してくれるのですが、ちょっと安全側に倒しすぎでは?と感じます。

・py3kでは、__eq__は__eq__から自動的に作ってくれる(__eq__が定義してあれば「... != ...」のを「not( ... == ...)」と解釈してくれる)のですが、__ne__が定義されていても警告してくれません。

・「print x, y」を「print(x, y)」にしてくれるのですが、前者でスペースが入ることを期待していると、後者は出ないので注意。

・途中までpy3kに直したソースファイルにもう一度2to3.pyを実行すると、余分な処理を付け加えてくれる。「print(a)」を「print((a))」にしてくれたり。

・型を追いかけてくれないので、open(..., "rb")で読み込んだ内容にたいして正規表現のマッチングをしているところでエラーになる。
(python 2.Xでは、読み込んだ内容はstrになるので、reでマッチングできるが、3ではbytesになるのでエラー)

・上記も含めて、str/unicodeとbytes/strのまわりは自分でやらないといけません。「unicode("abc", "shift_jis")」は「str("abc", "shift_jis")」と直訳されてしまいますが、もちろんエラーになります。

ということで、2と3の違いを理解していないと使えないなー、という感じ。

まあここまで自動化してくれたのはうれしいですけれど。


メモ: シンタックスハイライター pygment インストール

2010-01-26 19:39:06 | プログラミング
PygmentはPythonで書かれたシンタックスハイライターのライブラリです。
http://pygments.org/

ソースファイルからハイライトされたhtmlを出力します。多数のプログラミング言語に対応し、オプションもいろいろあって便利そう。

試しにインストール(Windowsで)したのですが、ちょっとだけ引っかかったのでメモ。

インストールはドキュメントにある手順通り、コマンドプロンプトで
easy_install Pygments

ただ、ドキュメントにあるpygmentizeというコマンドプロンプトからpygmentを利用するためのスクリプトが、c:¥python26¥Scripts¥pygmentizeという拡張子なしのファイルになっているので、Windowsでは使いにくい。

pygmentize.pyという拡張子付きのコピーを作りました。

メモ: Boost 1.41をBoost.Python付きでインストール

2010-01-25 13:59:16 | プログラミング
久しぶりにBoostをインストールしてみます。

今回はBoost.Pythonの実験用なので、icuとか入れずになるべく簡単に。

いろいろやってみたのですが、結果、以下で大丈夫でした。

(1) boost_1_41_0.zipをダウンロードして展開。

(2) VS2008コマンドプロンプトで、展開したディレクトリにcdして、

(3) bootstrap.batを実行。

(4) 生成されるproject-config.jamを適当なテキストエディタで修正。

もとは
using msvc ;
の1行だけ。

これを、以下のように直しました。
using msvc : 9.0 ;
using python : 2.6 ;
libraries = --with-python ;

2行目と3行目がBoost.Pythonのための設定です。

1行目はVCのバージョンが複数インストールされているので(VC2005, VC2008, VC2010と)、明示的にVC2008を指定するものです。

(5) 続けて、bjam.exeを実行。

boost_1_41_0¥stage¥libに、libboost_python-vc90-*.libができていれば成功です。