<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ダメ出し日記 &#187; Python</title>
	<atom:link href="http://www.sfo.jp/blog/archives/category/software/python/feed" rel="self" type="application/rss+xml" />
	<link>http://www.sfo.jp/blog</link>
	<description>自称・独立&#38;OSS系(?) SE、さとうふみやすの日記。OSS テクノロジ(株)に勤務。</description>
	<lastBuildDate>Fri, 23 Oct 2009 08:10:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>japanesenkf.py for Python 2.5</title>
		<link>http://www.sfo.jp/blog/archives/2008/09/python-japanesenkf-25.html</link>
		<comments>http://www.sfo.jp/blog/archives/2008/09/python-japanesenkf-25.html#comments</comments>
		<pubDate>Fri, 19 Sep 2008 14:34:45 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2008/09/python-japanesenkf-25.html</guid>
		<description><![CDATA[以前作成した japanesenkf.py
は Python 2.4 (まで?) にしか対応していなかったが、
先月の忙しい最中、
現実逃避の一環で Python 2.5 に対応したので公開しておく。


japanes [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/blog/archives/2007/01/python-japanesenkf-codec-and-mailman.html">以前作成した japanesenkf.py</a>
は Python 2.4 (まで?) にしか対応していなかったが、
先月の忙しい最中、
現実逃避の一環で Python 2.5 に対応したので公開しておく。</p>

<ul>
<li><a href="/blog/download/python/2.5/japanesenkf.py">japanesenkf.py</a></li>
</ul>

<p>前回と同じく、仕様書等は読んでおらず、Web を検索したり
Python 2.5 付属の *.py を読んだだけの知識でハックしたので、
コーディングが妥当かどうかは自信なし。悪しからず。</p>

<p>2009-05-15 更新:
「iso-2022-jp」などハイフンが含まれているエンコーディング名に効果がなかった問題を修正。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2008/09/python-japanesenkf-25.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl ⇔ Python ⇔ Ruby</title>
		<link>http://www.sfo.jp/blog/archives/2008/06/perl-python-ruby.html</link>
		<comments>http://www.sfo.jp/blog/archives/2008/06/perl-python-ruby.html#comments</comments>
		<pubDate>Tue, 17 Jun 2008 13:18:07 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2008/06/perl-python-ruby.html</guid>
		<description><![CDATA[Python, Ruby でコーディングする際に躓いた Perl ならわかるんだけど… な事柄のハウツー。2008-06-18 更新。Special thanks to ミラクル組。

リンク


文字列操作の比較表:  [...]]]></description>
			<content:encoded><![CDATA[<p>Python, Ruby でコーディングする際に躓いた <q>Perl ならわかるんだけど…</q> な事柄のハウツー。2008-06-18 更新。Special thanks to ミラクル組。</p>

<h3>リンク</h3>

<p><dl>
<dt>文字列操作の比較表: Ruby, Python, JavaScript, Perl, C++</dt>
<dd><a href="http://0xcc.net/blog/archives/000137.html">http://0xcc.net/blog/archives/000137.html</a></dd>
<dt>配列操作の比較表: Ruby, Python, JavaScript, Perl, C++</dt>
<dd><a href="http://0xcc.net/blog/archives/000043.html">http://0xcc.net/blog/archives/000043.html</a></dd>
</dl></p>

<h3>バージョン番号</h3>

<h4>コマンドライン</h4>

<p><dl>
<dt>Perl</dt>
<dd>
<pre class="terminal"><code>$ <kbd>perl -v</kbd>
This is perl, v5.10.0 built for x86<em>64-linux-gnu-thread-multi
<var>いっぱい</var>
$ <kbd>perl -V</kbd>
Summary of my perl5 (revision 5 version 10 subversion 0) configuration:
<var>もっといっぱい</var>
$ <kbd>perl -e 'print $],"\n"'</kbd>
5.010000
</code></pre>
</dd>
<dt>Python</dt>
<dd>
<pre class="terminal"><code>$ <kbd>python -v</kbd>
Python 2.5.2
$ <kbd>python -c 'import sys; print "%d.%d.%d" % sys.version</em>info[:3]'</kbd>
2.5.2
$ <kbd>python -c 'import sys; print "%d.%d" % sys.version<em>info[:2]'</kbd>
2.5
</code></pre>
</dd>
</dl>
<dt>Ruby</dt>
<dd>
<pre class="terminal"><code>$ <kbd>ruby -v</kbd>
ruby 1.8.7 (2008-05-31 patchlevel 0) [x86</em>64-linux]
</code></pre>
</dd></p>

<h3>標準モジュールパスの表示</h3>

<h4>コマンドライン</h4>

<p><dl>
<dt>Perl</dt>
<dd>
<pre class="terminal"><code>$ <kbd>perl -e 'print map {"$<em>\n"} @INC'</kbd>
/etc/perl
/usr/local/lib/perl/5.10.0
/usr/local/share/perl/5.10.0
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.10
/usr/share/perl/5.10
/usr/local/lib/site</em>perl
.
$ <kbd>perl \
-V:installsitearch \
-V:installsitelib \
-V:installvendorarch \
-V:installvendorlib \
-V:installarchlib \
-V:installprivlib</kbd>
installsitearch='/usr/local/lib/perl/5.10.0';
installsitelib='/usr/local/share/perl/5.10.0';
installvendorarch='/usr/lib/perl5';
installvendorlib='/usr/share/perl5';
installarchlib='/usr/lib/perl/5.10';
installprivlib='/usr/share/perl/5.10';
</code></pre>
</dd>
<dt>Python</dt>
<dd>FIXME: Python 2.5(?) には vendor-packages もあるみたい。
<pre class="terminal"><code>$ <kbd>python -c 'import sys; print sys.path'</kbd>
['', '/usr/lib/python25.zip', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', '/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages/Numeric', '/usr/lib/python2.5/site-packages/PIL', '/var/lib/python-support/python2.5', '/var/lib/python-support/python2.5/gtk-2.0']
$ <kbd>python -c 'from distutils.sysconfig import get<em>python</em>lib; print get<em>python</em>lib()'</kbd>
/usr/lib/python2.5/site-packages
</code></pre>
</dd>
</dl>
<dt>Ruby</dt>
<dd>
<pre class="terminal"><code>$ <kbd>ruby -e 'puts $LOAD_PATH'</kbd>
</code></pre>
</dd></p>

<h3>モジュール検索パスの追加</h3>

<h4>環境変数</h4>

<p><dl>
<dt>Perl</dt>
<dd>
<pre class="terminal"><code>$ <kbd>export PERL5LIB='/site/lib/perl'</kbd>
</code></pre>
</dd>
<dt>Python</dt>
<dd>
<pre class="terminal"><code>$ <kbd>export PYTHONPATH='/site/lib/python'</kbd>
</code></pre>
</dd>
</dl>
<dd>
<pre class="terminal"><code>$ <kbd>echo '/site/lib/python' &gt;/usr/lib/python2.5/site-packages/site.pth</kbd>
</code></pre>
</dd>
</dl>
<dt>Ruby</dt>
<dd>
<pre class="terminal"><code>$ <kbd>export RUBYLIB='/site/lib/ruby'</kbd>
</code></pre>
</dd></p>

<h4>スクリプト</h4>

<p><dl>
<dt>Perl</dt>
<dd>
<pre class="code"><code>use lib '/site/lib/perl';
</code></pre>
</dd>
<dt>Python</dt>
<dd>
<pre class="code"><code>import sys
sys.path.append("/site/lib/python")
</code></pre>
</dd>
<dd>
<pre class="code"><code>import site;
site.addsitedir('/site/lib/python')
</code></pre>
</dd>
</dl>
<dt>Ruby</dt>
<dd>
<pre class="code"><code>puts $LOAD_PATH.push("/site/lib/ruby")
</code></pre>
</dd></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2008/06/perl-python-ruby.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python: 標準の日本語用コーデックを NKF な実装で上書き</title>
		<link>http://www.sfo.jp/blog/archives/2007/01/python-japanesenkf-codec-and-mailman.html</link>
		<comments>http://www.sfo.jp/blog/archives/2007/01/python-japanesenkf-codec-and-mailman.html#comments</comments>
		<pubDate>Sat, 13 Jan 2007 17:43:51 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Mailman]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[仕事]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2007/01/python-japanesenkf-codec-and-mailman.html</guid>
		<description><![CDATA[
Mailman 環境において、
エンコーディング名 (文字セット名)
と実際のエンコーディング方式 (文字セット)
が異なるメールメッセージ
(いわゆる 機種依存文字 が含まれているメール)
を受信すると、
保存書庫で [...]]]></description>
			<content:encoded><![CDATA[<p>
Mailman 環境において、
エンコーディング名 (文字セット名)
と実際のエンコーディング方式 (文字セット)
が異なるメールメッセージ
(いわゆる <q>機種依存文字</q> が含まれているメール)
を受信すると、
保存書庫で文字化けしてしまう問題がある。
当然そんなメールを送る参加者 (と MUA) が悪いのだが、
残念ながらそうも言ってられないので対処してみた。
</p>

<p><p>
調べてみると
<a href="http://mm.tkikuchi.net/pipermail/mmjp-users/2005-April/001380.html">mmjp-users メーリングリストに代表的な対処方法と簡単な比較</a>
が挙げられており、
その中でも
<q><a href="http://mars.homelinux.net/~kazuhiko/Computer/mailman-gaiji.html">Mailman の保存書庫が機種依存文字で文字化けする</a></q>
や
<q><a href="http://mm.tkikuchi.net/pipermail/mmjp-users/2005-April/001364.html">[mmjp-users 1380] Re: 保存書庫の一部のメールが文字化け</a></q>
とそのリンク先で紹介されている
<q>石本さん式</q>
(要は Python 標準の仕様に厳密なコーデックをルーズな実装のコーデックで上書きして対処する方法)
が一番良さげ。
ところが、<a href="http://www.gembook.jp/tsum/page.pys?wiki=%7ENewsSummary%2F1071152639">
方法を解説している本命の Web ページ</a>と必要となる PyKF という Python モジュールは、
サーバーが死んでいて参照できない。
一応 Google のキャッシュや
The Internet Archive (<a href="http://www.archive.org/">http://www.archive.org/</a>)
で参照できるが、ふつうの人はそこまで辿りつけないかもしれない。
そこで Python の勉強ネタついでに、
入手困難な PyKF ではなく NKF (<a href="http://city.plala.jp/download/nkf/">NKF<em>python</a>)
で実装し、
より汎用的に使えるよう Python モジュールにしてみることにした。
</p>
<p>
まずは Python の NKF モジュールをインストールする。
ちなみに 2007年1月13日以前のものはオプションの解析処理にバグがあり、
nkf.nkf() に渡す NKF オプションに空白区切りで複数のオプションが含まれており、
かつその nkf.nkf() 文が複数回実行される場合、
2回目以降の実行では 2番目以降の NKF オプションが無視される問題がある。
つい先日問題を発見し、作者にパッチを送って修正してもらった。
</p>
<pre class="terminal"><code>$ <kbd>tar xzf <var>/path/to/source/</var>nkf207.tgz</kbd>
$ <kbd>cd nkf207</kbd>
$ <kbd>tar xzf <var>/path/to/source/</var>NKF</em>python.tgz</kbd>
$ <kbd>cd NKF.python</kbd>
$ <kbd>python setup.py build</kbd>
<var>...</var>
$ sudo <kbd>python setup.py install</kbd>
<var>...</var>
</code></pre>
<p>
今回作成した NKF による ISO-2022-JP (もどき), EUC-JP (同), Shift<em>JIS (同) のコーデックモジュール
<span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://www.sfo.jp/blog/download/python/24/japanesenkf.py">japanesenkf.py</a></span>
を適当なディレクトリにインストールする
(今回は Debian GNU/Linux 4.0 (etch) の Mailman だけで利用するので、
<code>/usr/lib/mailman/pythonlib</code> にした)。
</p>
<pre class="terminal"><code>$ <kbd>sudo cp <var>/path/to/source/</var>japanesenkf.py <var>/Python (Mailman) のモジュール検索ディレクトリ</var></kbd>
</code></pre>
<p>
Mailman の設定ファイル
<code>mm</em>cfg.py</code> を開き、
モジュールのロードと日本語標準コーデックの上書きを指示する。
</p>
<pre class="code"><code><var>...</var>
import japanesenkf
japanesenkf.overrideEncodings()
</code></pre>
<p>
モジュールと設定を反映するため、
Mailman の qrunner を再起動する。
</p>
<pre class="terminal"><code>$ <kbd>sudo /etc/init.d/mailman restart</kbd>
<var>...</var>
</code></pre>
<p>
簡単にテストした限りではちゃんと機能しているみたい。
Python 歴数週間なので、かなり怪しいかもね。
</p>
<p>
<ins>2008-07-23 追記: Python 2.5 対応版も作成したので、興味のある人はコメントください。</ins>
</p>
<p>
<ins><a href="/blog/archives/2008/09/python-japanesenkf-25.html">2008-09-19 追記:
Python 2.5 対応版を公開。</a></ins>
</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2007/01/python-japanesenkf-codec-and-mailman.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python: タイムアウト付きでコマンド実行</title>
		<link>http://www.sfo.jp/blog/archives/2006/12/python.html</link>
		<comments>http://www.sfo.jp/blog/archives/2006/12/python.html#comments</comments>
		<pubDate>Sat, 30 Dec 2006 16:45:12 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2006/12/python.html</guid>
		<description><![CDATA[
にわか Python 野郎です。
Python の勉強のネタに、
ミラクル・リナックスの某ブログで話題になったコマンドのタイムアウト処理
を timeoutcmd.py として実装してみた。
ちなみに、これが初のスタン [...]]]></description>
			<content:encoded><![CDATA[<p>
にわか Python 野郎です。
Python の勉強のネタに、
<a href="http://blog.miraclelinux.com/thethird/2006/12/post_4e7b.html">ミラクル・リナックスの某ブログで話題になったコマンドのタイムアウト処理</a>
を timeoutcmd.py として実装してみた。
ちなみに、これが初のスタンドアロンな Python スクリプト。
<ins>2007-01-01 更新: タイムアウト発生時にコマンドに送るシグナルを指定できるようにした。</ins>
</p>

<p><pre class="code"><code>#!/usr/bin/env python</p>

<h1>#</h1>

<h2>Run a command with a timeout checking</h2>

<h2>Copyright (c) 2006-2007 SATOH Fumiyasu @ OSS Technology Co.</h2>

<h2><a href="http://www.osstech.co.jp/">http://www.osstech.co.jp/</a></h2>

<h1>#</h1>

<h2>Date: 2007-01-01, since 2006-12-31</h2>

<h2>License: GNU General Public License version 2</h2>

<p>import getopt
import signal
import re
import sys
import os
import select
def err(format, *argv):
print >>sys.stderr, sys.argv[0] + ":", format % argv
signum_by_name = {}
signame_by_num = {}
for signame in dir(signal):
if signame.startswith("SIG"):
signum = getattr(signal, signame)
if type(signum) == type(1):
signum_by_name[str(signum)] = signum
signum_by_name[signame] = signum
signum_by_name[re.sub("^SIG", "", signame)] = signum
signame_by_num[signum] = signame</p>

<h2>Options</h2>

<h2>======================================================================</h2>

<p>code<em>on</em>timeout = 255
code<em>on</em>exec<em>error = 254
code</em>on<em>fork</em>error = 253
signum<em>on</em>timeout = signal.SIGTERM
usage = """Usage: %s [OPTIONS] TIMEOUT COMMAND [ARG ...]
Options:
-s, --signal SIGNAL
Send SIGNAL to COMMAND on timeout
-o, --timeout-code=EXITCODE
Exit code on timeout
-e, --exec-error-code=EXITCODE
Exit code on exec failure
-f, --fork-error-code=EXITCODE
Exit code on fork failure
"""</p>

<h2>Command-line options</h2>

<h2>----------------------------------------------------------------------</h2>

<p>try:
opts, args = getopt.getopt(sys.argv[1:], 'hs:o:e:f:',
['help', 'signal=', 'timeout-code=', 'exec-error-code=', 'fork-error-code='])
except getopt.error, msg:
err("%s", msg)
sys.exit(1)
for opt, arg in opts:
if opt in ('-h', '--help'):
print usage
sys.exit(0)
if opt in ('-s', '--signal'):
signame = arg.upper()
if not signum<em>by</em>name.has<em>key(signame):
err("invalid signal name: %s", signame)
sys.exit(1)
signum</em>on<em>timeout = signum</em>by<em>name[signame]
if opt in ('-o', '--timeout-code'):
code</em>on<em>timeout = int(arg)
if opt in ('-e', '--exec-error-code'):
code</em>on<em>exec</em>error = int(arg)
if opt in ('-f', '--fork-error-code'):
code<em>on</em>fork_error = int(arg)
timeout = float(args[0])
command = args[1:]</p>

<h2>Main</h2>

<h2>======================================================================</h2>

<p>r, w = os.pipe()
try:
pid = os.fork()
except OSError, e:
err("fork failed: %s", e.strerror)
sys.exit(code<em>on</em>fork_error)</p>

<h2>Child process</h2>

<h2>----------------------------------------------------------------------</h2>

<p>if pid == 0:
os.close(r)
try:
os.execvp(command[0], command)
except OSError, e:
err("exec failed: %s: %s", command[0], e.strerror)
sys.exit(code<em>on</em>exec_error)</p>

<h2>Parent process</h2>

<h2>----------------------------------------------------------------------</h2>

<p>os.close(w)
p = select.poll()
p.register(r, select.POLLIN)
ready = p.poll(timeout * 1000)
if len(ready) == 0:
err("command timed out: %s", command[0])
os.kill(pid, signum<em>on</em>timeout)
pid<em>exited, status = os.waitpid(pid, 0)
sys.exit(code</em>on<em>timeout)
pid</em>exited, status = os.waitpid(pid, 0)
sys.exit(status >> <img src='http://www.sfo.jp/blog/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </code></pre>
<p>
<a href="http://www.gnu.org/software/mailman/">Mailman</a>
のハンドラを書いていて、
<q>自然にオブジェクト指向 &amp; 例外処理を書けるのは気持ちいい!</q>
と感じて Python を覚えようかと思ってみたものの、
例えばリストの長さを求めるのに <q><code>len(list)</code></q> と書くのは嫌いかも。
同様に
<q><code>int(string)</code></q>
とか
<q><code>str(number)</code></q>
も嫌だなぁ。
<a href="http://0xcc.net/blog/archives/000043.html">
Ruby みたいに <q><code>list.length</code></q> のように書ける</a>
ほうが好みだな。
</p>
<p>
Python は Mailman のハンドラ書きとデバッグ程度の嗜みにしておいて、
ポスト Perl は Ruby にしてみようかしら?
</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2006/12/python.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

