<?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>taichino.com</title>
	<atom:link href="http://taichino.com/feed" rel="self" type="application/rss+xml" />
	<link>http://taichino.com</link>
	<description>永遠のネバーランド</description>
	<lastBuildDate>Sun, 29 Aug 2010 08:06:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>.emacsを整理した</title>
		<link>http://taichino.com/engineer-life/1894</link>
		<comments>http://taichino.com/engineer-life/1894#comments</comments>
		<pubDate>Sun, 29 Aug 2010 08:06:52 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[emacs]]></category>
		<category><![CDATA[技術]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1894</guid>
		<description><![CDATA[本当は去年の年末に行うはずだった.emacsの整理ですが、中々着手できず放置してました。しかし先日「Emacsテクニックバイブル」が発売され、この絶好のタイミングを逃せば、またいつになるか分からなかったので、重い腰を上げて以下を目標に整理してみました。

 .emacsを分割して整理する
 リポジトリ管理下に置いて適宜改善できるようにする
 最近のEmacs事情に少しキャッチアップする


まず.emacsを分割して、使ってない箇所を消してみました。分割自体は、かなりいい加減です。init-loaderを使うのが常套手段のようですが手元で動かないので、それぞれのファイルを手動でロードしています。課題はbase.elにまだ設定が集中していることです。かといって分割しすぎても管理が大変なので難しいところですね。

;; ロードパス
&#40;add-to-list 'load-path &#34;~/.emacs.d&#34;&#41;
&#40;add-to-list 'load-path &#34;~/.emacs.d/lisp&#34;&#41;
&#40;add-to-list 'load-path &#34;~/.emacs.d/lisp/apel&#34;&#41;
&#40;add-to-list 'load-path &#34;~/.emacs.d/lisp/emu&#34;&#41;
&#40;add-to-list 'load-path &#34;~/.emacs.d/lisp/howm&#34;&#41;
&#160;
;; 実行パス
&#40;add-to-list 'exec-path &#34;/usr/local/bin&#34;&#41;
&#40;add-to-list 'exec-path &#34;/opt/local/bin&#34;&#41;
&#160;
;; auto-install
&#40;require 'auto-install&#41;
&#40;add-to-list 'load-path auto-install-directory&#41;
&#40;auto-install-update-emacswiki-package-name t&#41;
&#40;auto-install-compatibility-setup&#41;
&#160;
;; 基本設定
&#40;load &#34;init/base.el&#34;&#41;
&#160;
;; 表示、window関連の設定
&#40;load &#34;init/display.el&#34;&#41;
&#160;
;; global-set-key
&#40;load &#34;init/keybind.el&#34;&#41;
&#160;
;; howm/org
&#40;load &#34;init/memo.el&#34;&#41;
&#160;
;; 各種プログラミング用メジャーモード
&#40;load &#34;init/programming.el&#34;&#41;
&#160;
;; 自分で追加した関数など
&#40;load &#34;init/self.el&#34;&#41;

設定ファイル一式をgithubにあげて管理する事にしました。プライベートリポジトリだと、ついつい汚くなるので駄目でした。本当は.emacs.d以下すべてを置いておきたいですけど、リポジトリが公開状態なので良いのかどうなのか。ちょっと様子見です。
今回の整理での気分的に大きな収穫は以下です。Carbonが素晴らしいと触れ回っていたのですが、しれっとCocoa Emacsに乗り換えてしまいました。

magit: gitをemacsから使えるようになった
Cocoa Emacs: magitを導入するためにCarbonから乗り換えた
org-modeをhowmのメジャーモードで使うようにした
moccur-edit: occurの検索結果を直接編集して元のバッファに反映させる
sequential-command: C-a, C-eがパワーアップ

まだ改善の余地だらけですが、とにかくも整理して管理下に置いたので、ようやく.emacsも自分も育てていける感じになって、大変気分がいいです。
]]></description>
			<content:encoded><![CDATA[<p>本当は去年の年末に行うはずだった.emacsの整理ですが、中々着手できず放置してました。しかし先日「<a href="http://www.amazon.co.jp/gp/product/4774143278?ie=UTF8&#038;tag=creatorsland-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=4774143278">Emacsテクニックバイブル</a><img src="http://www.assoc-amazon.jp/e/ir?t=creatorsland-22&#038;l=as2&#038;o=9&#038;a=4774143278" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」が発売され、この絶好のタイミングを逃せば、またいつになるか分からなかったので、重い腰を上げて以下を目標に整理してみました。</p>
<ul>
<li> .emacsを分割して整理する</li>
<li> リポジトリ管理下に置いて適宜改善できるようにする</li>
<li> 最近のEmacs事情に少しキャッチアップする</li>
</ul>
<p><span id="more-1894"></span></p>
<p>まず.emacsを分割して、使ってない箇所を消してみました。分割自体は、かなりいい加減です。init-loaderを使うのが常套手段のようですが手元で動かないので、それぞれのファイルを手動でロードしています。課題はbase.elにまだ設定が集中していることです。かといって分割しすぎても管理が大変なので難しいところですね。</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; ロードパス</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'load-path <span style="color: #ff0000;">&quot;~/.emacs.d&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'load-path <span style="color: #ff0000;">&quot;~/.emacs.d/lisp&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'load-path <span style="color: #ff0000;">&quot;~/.emacs.d/lisp/apel&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'load-path <span style="color: #ff0000;">&quot;~/.emacs.d/lisp/emu&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'load-path <span style="color: #ff0000;">&quot;~/.emacs.d/lisp/howm&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; 実行パス</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'exec-path <span style="color: #ff0000;">&quot;/usr/local/bin&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'exec-path <span style="color: #ff0000;">&quot;/opt/local/bin&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; auto-install</span>
<span style="color: #66cc66;">&#40;</span>require 'auto-install<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'load-path auto-install-directory<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>auto-install-update-emacswiki-package-<span style="color: #b1b100;">name</span> t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>auto-install-compatibility-setup<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; 基本設定</span>
<span style="color: #66cc66;">&#40;</span>load <span style="color: #ff0000;">&quot;init/base.el&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; 表示、window関連の設定</span>
<span style="color: #66cc66;">&#40;</span>load <span style="color: #ff0000;">&quot;init/display.el&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; global-set-key</span>
<span style="color: #66cc66;">&#40;</span>load <span style="color: #ff0000;">&quot;init/keybind.el&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; howm/org</span>
<span style="color: #66cc66;">&#40;</span>load <span style="color: #ff0000;">&quot;init/memo.el&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; 各種プログラミング用メジャーモード</span>
<span style="color: #66cc66;">&#40;</span>load <span style="color: #ff0000;">&quot;init/programming.el&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; 自分で追加した関数など</span>
<span style="color: #66cc66;">&#40;</span>load <span style="color: #ff0000;">&quot;init/self.el&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>設定ファイル一式を<a href="http://github.com/taichino/emacs_config">github</a>にあげて管理する事にしました。プライベートリポジトリだと、ついつい汚くなるので駄目でした。本当は.emacs.d以下すべてを置いておきたいですけど、リポジトリが公開状態なので良いのかどうなのか。ちょっと様子見です。</p>
<p>今回の整理での気分的に大きな収穫は以下です。Carbonが素晴らしいと触れ回っていたのですが、しれっとCocoa Emacsに乗り換えてしまいました。</p>
<ul>
<li><strong>magit</strong>: gitをemacsから使えるようになった</li>
<li><strong>Cocoa Emacs</strong>: magitを導入するためにCarbonから乗り換えた</li>
<li><strong>org-mode</strong>をhowmのメジャーモードで使うようにした</li>
<li><strong>moccur-edit</strong>: occurの検索結果を直接編集して元のバッファに反映させる</li>
<li><strong>sequential-command</strong>: C-a, C-eがパワーアップ</li>
</ul>
<p>まだ改善の余地だらけですが、とにかくも整理して管理下に置いたので、ようやく.emacsも自分も育てていける感じになって、大変気分がいいです。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/engineer-life/1894/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>時間のインターバルをcron的に扱うPythonモジュール書いた</title>
		<link>http://taichino.com/programming/1885</link>
		<comments>http://taichino.com/programming/1885#comments</comments>
		<pubDate>Tue, 10 Aug 2010 16:58:56 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[croniter]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1885</guid>
		<description><![CDATA[ちょっと前の話なんですが、croniterというモジュールを書きました。これは何かというと時間に紐付いた繰り返し処理を扱うモジュールです。例えば「毎週火曜日と木曜日の9時」とか「日曜日の5時から10時まで1時間ごと」にとか、そういう繰り返しを扱いたいときに使う事を想定しています。

基本的な使い方は以下になります。お気づきの通りcronと同じ形式で繰り返しを指定します。baseで特定の日時以降での繰り返しです。後はnextを呼び出すたびに次のdatetimeオブジェクトを取得できます。

#!/usr/bin/python
&#160;
from datetime import datetime
from croniter import croniter
&#160;
# 2010年8月7日始まりで、平日の9時
base = datetime&#40;2010, 8, 7, 0, 0&#41;
iter = croniter&#40;'0 9 * * mon,tue,wed,thu,fri', base&#41;
print iter.get_next&#40;datetime&#41; #2010-08-09 09:00:00
print iter.get_next&#40;datetime&#41; #2010-08-10 09:00:00
print iter.get_next&#40;datetime&#41; #2010-08-11 09:00:00
&#160;
# 1990年からの1月1日
base = datetime&#40;1990, 1, 1, 0, 0&#41;
iter = croniter&#40;'2 4 1 1 *', base&#41;
print iter.get_next&#40;datetime&#41; #1990-01-01 04:02:00
print iter.get_next&#40;datetime&#41; #1991-01-01 04:02:00
print iter.get_next&#40;datetime&#41; #1992-01-01 04:02:00

意外と時間の間隔を調整するのは大変なので、もしかしたら役に立つかもしれません。僕はクローラのクロール間隔を、条件によって動的に調整するのに使っています。pypiに登録していますので、以下でインストールできます。よろしければどうぞ。

$ easy_install croniter

]]></description>
			<content:encoded><![CDATA[<p>ちょっと前の話なんですが、<a href="http://github.com/taichino/croniter">croniter</a>というモジュールを書きました。これは何かというと時間に紐付いた繰り返し処理を扱うモジュールです。例えば「毎週火曜日と木曜日の9時」とか「日曜日の5時から10時まで1時間ごと」にとか、そういう繰り返しを扱いたいときに使う事を想定しています。</p>
<p><span id="more-1885"></span></p>
<p>基本的な使い方は以下になります。お気づきの通りcronと同じ形式で繰り返しを指定します。baseで特定の日時以降での繰り返しです。後はnextを呼び出すたびに次のdatetimeオブジェクトを取得できます。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">datetime</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">datetime</span>
<span style="color: #ff7700;font-weight:bold;">from</span> croniter <span style="color: #ff7700;font-weight:bold;">import</span> croniter
&nbsp;
<span style="color: #808080; font-style: italic;"># 2010年8月7日始まりで、平日の9時</span>
base = <span style="color: #dc143c;">datetime</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2010</span>, <span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
<span style="color: #008000;">iter</span> = croniter<span style="color: black;">&#40;</span><span style="color: #483d8b;">'0 9 * * mon,tue,wed,thu,fri'</span>, base<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">iter</span>.<span style="color: black;">get_next</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">datetime</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#2010-08-09 09:00:00</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">iter</span>.<span style="color: black;">get_next</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">datetime</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#2010-08-10 09:00:00</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">iter</span>.<span style="color: black;">get_next</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">datetime</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#2010-08-11 09:00:00</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 1990年からの1月1日</span>
base = <span style="color: #dc143c;">datetime</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1990</span>, <span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
<span style="color: #008000;">iter</span> = croniter<span style="color: black;">&#40;</span><span style="color: #483d8b;">'2 4 1 1 *'</span>, base<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">iter</span>.<span style="color: black;">get_next</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">datetime</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#1990-01-01 04:02:00</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">iter</span>.<span style="color: black;">get_next</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">datetime</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#1991-01-01 04:02:00</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">iter</span>.<span style="color: black;">get_next</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">datetime</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#1992-01-01 04:02:00</span></pre></div></div>

<p>意外と時間の間隔を調整するのは大変なので、もしかしたら役に立つかもしれません。僕はクローラのクロール間隔を、条件によって動的に調整するのに使っています。pypiに登録していますので、以下でインストールできます。よろしければどうぞ。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ easy_install croniter</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/1885/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pythonでタイムゾーンを扱うメモ</title>
		<link>http://taichino.com/programming/1876</link>
		<comments>http://taichino.com/programming/1876#comments</comments>
		<pubDate>Mon, 09 Aug 2010 21:38:38 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[pytz]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1876</guid>
		<description><![CDATA[日本だと普段扱わないので、忘れがちなタイムゾーンの処理をメモ書きです。ここでは例として、日本時間とアメリカ東海岸標準時の変換してみます。

まず標準ライブラリだけで処理すると以下のような書き方をするようです。各時間帯ごとにdatetime.tzinfoを継承したクラスを作成し、その中でUTCからの時間のずれ等を設定します。

#!/usr/bin/python
# -*- coding: utf-8 -*-
&#160;
import datetime
&#160;
# 日本時間
class JST&#40;datetime.tzinfo&#41;:
  # UTCからの時間のずれ  
  def utcoffset&#40;self, dt&#41;:
    return datetime.timedelta&#40;hours=9&#41;
  # サマータイム  
  def dst&#40;self, dt&#41;: 
    return datetime.timedelta&#40;0&#41;
 # タイムゾーンの名前  
  def tzname&#40;self, dt&#41;:
    return 'JST'
&#160;
# 東海岸
class EST&#40;datetime.tzinfo&#41;:
  def utcoffset&#40;self, [...]]]></description>
			<content:encoded><![CDATA[<p>日本だと普段扱わないので、忘れがちなタイムゾーンの処理をメモ書きです。ここでは例として、日本時間とアメリカ東海岸標準時の変換してみます。</p>
<p><span id="more-1876"></span></p>
<p>まず標準ライブラリだけで処理すると以下のような書き方をするようです。各時間帯ごとにdatetime.tzinfoを継承したクラスを作成し、その中でUTCからの時間のずれ等を設定します。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">datetime</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 日本時間</span>
<span style="color: #ff7700;font-weight:bold;">class</span> JST<span style="color: black;">&#40;</span><span style="color: #dc143c;">datetime</span>.<span style="color: black;">tzinfo</span><span style="color: black;">&#41;</span>:
  <span style="color: #808080; font-style: italic;"># UTCからの時間のずれ  </span>
  <span style="color: #ff7700;font-weight:bold;">def</span> utcoffset<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, dt<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">datetime</span>.<span style="color: black;">timedelta</span><span style="color: black;">&#40;</span>hours=<span style="color: #ff4500;">9</span><span style="color: black;">&#41;</span>
  <span style="color: #808080; font-style: italic;"># サマータイム  </span>
  <span style="color: #ff7700;font-weight:bold;">def</span> dst<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, dt<span style="color: black;">&#41;</span>: 
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">datetime</span>.<span style="color: black;">timedelta</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
 <span style="color: #808080; font-style: italic;"># タイムゾーンの名前  </span>
  <span style="color: #ff7700;font-weight:bold;">def</span> tzname<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, dt<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'JST'</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 東海岸</span>
<span style="color: #ff7700;font-weight:bold;">class</span> EST<span style="color: black;">&#40;</span><span style="color: #dc143c;">datetime</span>.<span style="color: black;">tzinfo</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">def</span> utcoffset<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, dt<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">datetime</span>.<span style="color: black;">timedelta</span><span style="color: black;">&#40;</span>hours=-<span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">def</span> dst<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, dt<span style="color: black;">&#41;</span>: 
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">datetime</span>.<span style="color: black;">timedelta</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">def</span> tzname<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, dt<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'EST'</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 東海岸時間を</span>
eastern_time = <span style="color: #dc143c;">datetime</span>.<span style="color: #dc143c;">datetime</span>.<span style="color: black;">now</span><span style="color: black;">&#40;</span>EST<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> eastern_time <span style="color: #808080; font-style: italic;"># 2010-08-09 14:42:17.378746-05:00</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 日本時間に変換</span>
japan_time = eastern_time.<span style="color: black;">astimezone</span><span style="color: black;">&#40;</span>JST<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> japan_time  <span style="color: #808080; font-style: italic;"># 2010-08-10 04:42:17.378746+09:00</span></pre></div></div>

<p>まぁ言うほど難しくもないのですが面倒です。サブクラスを毎回作るのも面倒ですし、各時間帯のUTCからのずれなどを意識しないといけないのも辛いです。そこでもっと簡単にならないのと思って調べてみると<a href="http://pypi.python.org/pypi/pytz">pytz</a>というモジュールを使うのがよさそうです。pytzで先ほどの処理を書き直すと以下になります。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> pytz
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">datetime</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">datetime</span>
&nbsp;
eastern_time = <span style="color: #dc143c;">datetime</span>.<span style="color: black;">now</span><span style="color: black;">&#40;</span>pytz.<span style="color: black;">timezone</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'EST'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> eastern_time
japan_time = eastern_time.<span style="color: black;">astimezone</span><span style="color: black;">&#40;</span>pytz.<span style="color: black;">timezone</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Asia/Tokyo'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> japan_time</pre></div></div>

<p>かなりシンプルになりました。pytzは内部に主要都市のタイムゾーンをデータベース的に持っていて、名前から引くことができます。以下に使い方をまとめておきます。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> pytz
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">datetime</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">datetime</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 使えるタイムゾーンの名前を確認</span>
<span style="color: #ff7700;font-weight:bold;">print</span> pytz.<span style="color: black;">common_timezones</span>
<span style="color: #ff7700;font-weight:bold;">print</span> pytz.<span style="color: black;">country_timezones</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 確認したタイムゾーン名からオブジェクトを作成</span>
utc = pytz.<span style="color: black;">timezone</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'UTC'</span><span style="color: black;">&#41;</span>
jst = pytz.<span style="color: black;">timezone</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Asia/Tokyo'</span><span style="color: black;">&#41;</span>
bst = pytz.<span style="color: black;">timezone</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Europe/London'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 現在の、各タイムゾーンのローカル時刻を得る</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #dc143c;">datetime</span>.<span style="color: black;">now</span><span style="color: black;">&#40;</span>utc<span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;"># 2010-08-09 21:24:08.865154+00:00</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #dc143c;">datetime</span>.<span style="color: black;">now</span><span style="color: black;">&#40;</span>jst<span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;"># 2010-08-10 06:24:08.865194+09:00</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #dc143c;">datetime</span>.<span style="color: black;">now</span><span style="color: black;">&#40;</span>bst<span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;"># 2010-08-09 22:24:08.865229+01:00</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># タイムゾーンの変換</span>
jst_dt = <span style="color: #dc143c;">datetime</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2010</span>, <span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">10</span>, <span style="color: #ff4500;">6</span>, <span style="color: #ff4500;">25</span>, tzinfo=jst<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> jst_dt
<span style="color: #ff7700;font-weight:bold;">print</span> jst_dt.<span style="color: black;">astimezone</span><span style="color: black;">&#40;</span>utc<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> jst_dt.<span style="color: black;">astimezone</span><span style="color: black;">&#40;</span>bst<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># サマータイムも考慮される</span>
<span style="color: #ff7700;font-weight:bold;">print</span> bst.<span style="color: black;">localize</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">datetime</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2010</span>, <span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;"># 2010-01-01 00:00:00+00:00</span>
<span style="color: #ff7700;font-weight:bold;">print</span> bst.<span style="color: black;">localize</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">datetime</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2010</span>, <span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;"># 2010-08-01 00:00:00+01:00</span></pre></div></div>

<p>これでタイムゾーンが簡単に扱えますね。早くグローバル対応なサービス作っていきたいです。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/1876/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pythonでいろんなバイナリファイルを覗いてみる</title>
		<link>http://taichino.com/programming/1860</link>
		<comments>http://taichino.com/programming/1860#comments</comments>
		<pubDate>Sat, 31 Jul 2010 15:52:20 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[hachoir]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1860</guid>
		<description><![CDATA[プログラマをしていると、ちょくちょくバイナリデータから情報を読みたくなりますね。そんな時は、ブツブツ言いながらバイナリエディタと睨めっこすることになるわけですが、これが結構大変なので、何とか楽にならないかなぁと思って探していると、hachoirというナイスなpythonモジュールが見つかりました。このモジュールを使うとバイナリデータをパースして様々なデータを取得できます。かなり多くのデータフォーマットに対応している(現時点で70種類)のが素晴らしいです。

hachoirはいくつかのモジュールに分かれているのですが、大抵は以下をインストールすれば良いと思います。

$ easy_install hachoir_parser
$ easy_install hachoir_metadata

このモジュールにはhachoir-metadataというコマンドラインツールが含まれていて、コードを書かなくても基本的な情報を取得できます。早速zipファイルを覗いてみましょう。いい感じにファイルの中身が見れていますね。

$ hachoir-metadata cpsb2cb1.zip
Common:
- MIME type: application/zip
- Endianness: Little endian
File &#34;cpsb2cb/&#34;:
- File name: cpsb2cb/
- File size: 0 bytes
- Creation date: 2009-04-05 17:39:42
- Compression: no compression
File &#34;cpsb2cb/cpsb2cb.m&#34;:
- File name: cpsb2cb/cpsb2cb.m
- File size: 998 bytes
- Compressed file size: 514 bytes
- Compression rate: 1.9x
- Creation date: 2009-04-02 17:46:30
- Compression: Deflate
File &#34;cpsb2cb/makefile&#34;:
- File name: cpsb2cb/makefile
- File [...]]]></description>
			<content:encoded><![CDATA[<p>プログラマをしていると、ちょくちょくバイナリデータから情報を読みたくなりますね。そんな時は、ブツブツ言いながらバイナリエディタと睨めっこすることになるわけですが、これが結構大変なので、何とか楽にならないかなぁと思って探していると、<a href="http://bitbucket.org/haypo/hachoir/wiki/Home">hachoir</a>というナイスなpythonモジュールが見つかりました。このモジュールを使うとバイナリデータをパースして様々なデータを取得できます。<a href="http://bitbucket.org/haypo/hachoir/wiki/hachoir-parser">かなり多くのデータフォーマットに対応している</a>(現時点で70種類)のが素晴らしいです。</p>
<p><span id="more-1860"></span></p>
<p>hachoirはいくつかのモジュールに分かれているのですが、大抵は以下をインストールすれば良いと思います。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ easy_install hachoir_parser
$ easy_install hachoir_metadata</pre></div></div>

<p>このモジュールにはhachoir-metadataというコマンドラインツールが含まれていて、コードを書かなくても基本的な情報を取得できます。早速zipファイルを覗いてみましょう。いい感じにファイルの中身が見れていますね。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ hachoir-metadata cpsb2cb1.zip
Common:
- MIME <span style="color: #7a0874; font-weight: bold;">type</span>: application<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">zip</span>
- Endianness: Little endian
File <span style="color: #ff0000;">&quot;cpsb2cb/&quot;</span>:
- File name: cpsb2cb<span style="color: #000000; font-weight: bold;">/</span>
- File <span style="color: #c20cb9; font-weight: bold;">size</span>: <span style="color: #000000;">0</span> bytes
- Creation <span style="color: #c20cb9; font-weight: bold;">date</span>: <span style="color: #000000;">2009</span>-04-05 <span style="color: #000000;">17</span>:<span style="color: #000000;">39</span>:<span style="color: #000000;">42</span>
- Compression: no compression
File <span style="color: #ff0000;">&quot;cpsb2cb/cpsb2cb.m&quot;</span>:
- File name: cpsb2cb<span style="color: #000000; font-weight: bold;">/</span>cpsb2cb.m
- File <span style="color: #c20cb9; font-weight: bold;">size</span>: <span style="color: #000000;">998</span> bytes
- Compressed <span style="color: #c20cb9; font-weight: bold;">file</span> <span style="color: #c20cb9; font-weight: bold;">size</span>: <span style="color: #000000;">514</span> bytes
- Compression rate: 1.9x
- Creation <span style="color: #c20cb9; font-weight: bold;">date</span>: <span style="color: #000000;">2009</span>-04-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">46</span>:<span style="color: #000000;">30</span>
- Compression: Deflate
File <span style="color: #ff0000;">&quot;cpsb2cb/makefile&quot;</span>:
- File name: cpsb2cb<span style="color: #000000; font-weight: bold;">/</span>makefile
- File <span style="color: #c20cb9; font-weight: bold;">size</span>: <span style="color: #000000;">242</span> bytes
- Compressed <span style="color: #c20cb9; font-weight: bold;">file</span> <span style="color: #c20cb9; font-weight: bold;">size</span>: <span style="color: #000000;">153</span> bytes
- Compression rate: 1.6x
- Creation <span style="color: #c20cb9; font-weight: bold;">date</span>: <span style="color: #000000;">2009</span>-04-02 04:<span style="color: #000000;">11</span>:<span style="color: #000000;">52</span>
- Compression: Deflate</pre></div></div>

<p>続いてPNGやWAVファイルを覗いてみます。画像の場合はサイズや色数、音の場合はサンプリングレートや再生時間など基本的な情報はだいたい押さえてくれています。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ hachoir-metadata Default.png
Metadata:
- Image width: <span style="color: #000000;">320</span> pixels
- Image height: <span style="color: #000000;">480</span> pixels
- Number of colors: <span style="color: #000000;">256</span>
- Bits<span style="color: #000000; font-weight: bold;">/</span>pixel: <span style="color: #000000;">8</span>
- Pixel format: Color index
- Compression rate: 5.3x
- Compression: deflate
- Producer: Adobe ImageReady
- MIME <span style="color: #7a0874; font-weight: bold;">type</span>: image<span style="color: #000000; font-weight: bold;">/</span>png
- Endianness: Big endian
&nbsp;
$ hachoir-metadata bgm.wav
Common:
- Duration: <span style="color: #000000;">2</span> min <span style="color: #000000;">41</span> sec <span style="color: #000000;">495</span> ms
- Channel: mono
- Sample rate: <span style="color: #000000;">22.1</span> kHz
- Bits<span style="color: #000000; font-weight: bold;">/</span>sample: <span style="color: #000000;">16</span> bits
- Compression rate: 1.0x
- Compression: Microsoft Pulse Code Modulation <span style="color: #7a0874; font-weight: bold;">&#40;</span>PCM<span style="color: #7a0874; font-weight: bold;">&#41;</span>
- Bit rate: <span style="color: #000000;">352.8</span> Kbit<span style="color: #000000; font-weight: bold;">/</span>sec
- MIME <span style="color: #7a0874; font-weight: bold;">type</span>: audio<span style="color: #000000; font-weight: bold;">/</span>x-wav
- Endianness: Little endian</pre></div></div>

<p>もうこれだけで良いやんと思うわけですが、コマンドラインツールで解析できるフォーマットはhachoirモジュールが対応しているものの一部になっていて、コードを書かないと解析できないフォーマットもあります。iPhoneアプリに含まれているplistなんかがその例で、コマンドラインツールを使うと以下のような親切なエラーを吐きます。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ hachoir-metadata Info.plist
<span style="color: #7a0874; font-weight: bold;">&#91;</span>err<span style="color: #000000; font-weight: bold;">!</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> Hachoir can<span style="color: #ff0000;">'t extract metadata, but is able to parse: Info.plist</span></pre></div></div>

<p>そこで実際にplistを解析するコードを書いてみます。処理は簡単でcreateParser関数にファイル名を渡せばパーサーオブジェクトが作られます。後はそのパーサーを色々いじって情報を取得します。最初はキョドリましたがipythonでタブ補完を使って、簡単に掘り進められました。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> json
<span style="color: #ff7700;font-weight:bold;">from</span> hachoir_parser <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
&nbsp;
<span style="color: #dc143c;">parser</span> = createParser<span style="color: black;">&#40;</span>u<span style="color: #483d8b;">'Info.plist'</span><span style="color: black;">&#41;</span>
generator = <span style="color: #dc143c;">parser</span>.<span style="color: black;">createFields</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
generator.<span style="color: black;">next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
generator.<span style="color: black;">next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
generator.<span style="color: black;">next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
dict_item = generator.<span style="color: black;">next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
dict_item.<span style="color: black;">createDisplay</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
res = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> k, v <span style="color: #ff7700;font-weight:bold;">in</span> dict_item.<span style="color: black;">value</span>:
  res<span style="color: black;">&#91;</span>k.<span style="color: black;">display</span>.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&quot;'</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> = <span style="color: #dc143c;">bytes</span><span style="color: black;">&#40;</span>v<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> res<span style="color: black;">&#91;</span><span style="color: #483d8b;">'CFBundleSupportedPlatforms'</span><span style="color: black;">&#93;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> res<span style="color: black;">&#91;</span><span style="color: #483d8b;">'DTPlatformVersion'</span><span style="color: black;">&#93;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> res<span style="color: black;">&#91;</span><span style="color: #483d8b;">'UIDeviceFamily'</span><span style="color: black;">&#93;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> res<span style="color: black;">&#91;</span><span style="color: #483d8b;">'LSRequiresIPhoneOS'</span><span style="color: black;">&#93;</span></pre></div></div>

<p>上記のコードを走らせた結果が以下になります。思ったとおりの挙動になっていますね。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">$ ./hachoir_test.<span style="color: black;">py</span>
<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;iPhoneOS&quot;</span><span style="color: black;">&#93;</span>
<span style="color: #483d8b;">&quot;4.0 GM&quot;</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
<span style="color: #008000;">True</span></pre></div></div>

<p>またパーサーオブジェクトを作る際にファイル名ではなく、ファイルオブジェクトを渡したい時もあります。その場合は以下のようにIOStreamクラスとguessParser関数を使えばOKです。少し探すのに苦労しました。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> hachoir_core.<span style="color: black;">stream</span> <span style="color: #ff7700;font-weight:bold;">import</span> InputIOStream
<span style="color: #ff7700;font-weight:bold;">from</span> hachoir_parser <span style="color: #ff7700;font-weight:bold;">import</span> guessParser
&nbsp;
bplist = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>u<span style="color: #483d8b;">'Info.plist'</span><span style="color: black;">&#41;</span>
iostream = InputIOStream<span style="color: black;">&#40;</span>bplist<span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span> = guessParser<span style="color: black;">&#40;</span>iostream<span style="color: black;">&#41;</span></pre></div></div>

<p>これでバイナリデータをバンバン覗けるようになりました。最初にも書きましたが<a href="http://bitbucket.org/haypo/hachoir/wiki/hachoir-parser">多くのフォーマットに対応している</a>ので覚えておくと役に立つ場面も多そうです。</p>
<p>さて、そうこうしてるうちに自然と覗くだけじゃなくて弄りたい、と思うわけですが残念ながらバイナリ編集機能はまだ実験中の様で、かなり限定的なフォーマットにしか対応してません。書き込みたい場合はhachoir-parserモジュール内にある、対象のパーサクラスに書き込み用メソッドを実装する必要があります。</p>
<p>僕は書き込みもしたいので、試しにPNGファイルあたりの書き込みメソッドを実装してみようと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/1860/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hello elisp World</title>
		<link>http://taichino.com/programming/1849</link>
		<comments>http://taichino.com/programming/1849#comments</comments>
		<pubDate>Fri, 23 Jul 2010 04:06:58 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[elisp]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1849</guid>
		<description><![CDATA[以前にtrampのデバッグでちょろっとだけ触ったきりのelispですが、emacsユーザである以上いつまでも避けては通れなさそうです。とりあえず触りだけ覚えておくことにしました。ただ今のところelispの習得度がpythonやperl並みになることは考えにくいので、elispから外部コマンドを叩いて出力を受け取るというところまでをメモしておきます。

実行は*scratch*バッファでC-jかM-x ielmで起動するelisp用の対話シェルで行いますが、ielemはタブで関数名などの候補を補完してくれますのでオススメです。早速Hello Worldを書いてみます。

&#40;message &#34;hello elisp world&#34;&#41;

簡単ですね。次にこれをユーザ定義関数にしてみましょう。defunでhello関数を定義しています。定義後は(hello)として呼び出せます。

&#40;defun hello &#40;&#41;  ; 定義
  &#40;message &#34;hello elisp world&#34;&#41;&#41;
&#40;hello&#41;  ; 呼び出し

defunで関数を定義すればM-xからemacsコマンドとしても実行できると思っていたのですが、実際はできなくてちょっとハマりました。調べてみるとinteractiveを利用してemacsコマンドとして登録する必要がありまして、以下が正解になります。これで無事にM-x helloが使えるようになります。無事にelispの1歩目を踏み出せましたね。

&#40;defun hello &#40;&#41;
  &#40;interactive&#41;  ; コマンド登録
  &#40;message &#34;hello elisp world&#34;&#41;&#41;

次は外部コマンドの実行ですが、call-processという関数を使います。

&#40;call-process
 command
 infile
 destination
 display
 ...&#41;

少しややこしいですが、例えばgrep error /var/log/system.logを実行して、現在のバッファのカーソル位置に出力を受け取るには以下のようにします。

&#40;call-process &#34;grep&#34; nil t nil &#34;error&#34; &#34;/var/log/system.log&#34;&#41;

以上でelispから外部コマンドを叩くelispコマンドを作成できるようになりました。これでpythonなりperlなりで書いておいたやりたい処理をelispから叩けますね。
例として「emacsで開いているファイルをXcodeで開く」というelispとpythonスクリプトの合わせ技が以下になります。
elisp部

&#40;defun open-in-xcode &#40;&#41;
  &#40;interactive&#41;
  &#40;setq filename &#40;buffer-file-name &#40;current-buffer&#41;&#41;&#41;
  [...]]]></description>
			<content:encoded><![CDATA[<p>以前に<a href="http://taichino.com/engineer-life/emacs/245">trampのデバッグでちょろっとだけ触った</a>きりのelispですが、emacsユーザである以上いつまでも避けては通れなさそうです。とりあえず触りだけ覚えておくことにしました。ただ今のところelispの習得度がpythonやperl並みになることは考えにくいので、elispから外部コマンドを叩いて出力を受け取るというところまでをメモしておきます。</p>
<p><span id="more-1849"></span></p>
<p>実行は*scratch*バッファでC-jかM-x ielmで起動するelisp用の対話シェルで行いますが、ielemはタブで関数名などの候補を補完してくれますのでオススメです。早速Hello Worldを書いてみます。</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;hello elisp world&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>簡単ですね。次にこれをユーザ定義関数にしてみましょう。defunでhello関数を定義しています。定義後は(hello)として呼び出せます。</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> hello <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #808080; font-style: italic;">; 定義</span>
  <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;hello elisp world&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>hello<span style="color: #66cc66;">&#41;</span>  <span style="color: #808080; font-style: italic;">; 呼び出し</span></pre></div></div>

<p>defunで関数を定義すればM-xからemacsコマンドとしても実行できると思っていたのですが、実際はできなくてちょっとハマりました。調べてみるとinteractiveを利用してemacsコマンドとして登録する必要がありまして、以下が正解になります。これで無事にM-x helloが使えるようになります。無事にelispの1歩目を踏み出せましたね。</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> hello <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span>  <span style="color: #808080; font-style: italic;">; コマンド登録</span>
  <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;hello elisp world&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>次は外部コマンドの実行ですが、call-processという関数を使います。</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>call-process
 command
 infile
 destination
 display
 <span style="color: #66cc66;">...</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>少しややこしいですが、例えばgrep error /var/log/system.logを実行して、現在のバッファのカーソル位置に出力を受け取るには以下のようにします。</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>call-process <span style="color: #ff0000;">&quot;grep&quot;</span> <span style="color: #b1b100;">nil</span> t <span style="color: #b1b100;">nil</span> <span style="color: #ff0000;">&quot;error&quot;</span> <span style="color: #ff0000;">&quot;/var/log/system.log&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>以上でelispから外部コマンドを叩くelispコマンドを作成できるようになりました。これでpythonなりperlなりで書いておいたやりたい処理をelispから叩けますね。</p>
<p>例として「emacsで開いているファイルをXcodeで開く」というelispとpythonスクリプトの合わせ技が以下になります。</p>
<p><strong>elisp部</strong></p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> open-in-xcode <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> filename <span style="color: #66cc66;">&#40;</span>buffer-file-<span style="color: #b1b100;">name</span> <span style="color: #66cc66;">&#40;</span>current-buffer<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> offset <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;%d&quot;</span> <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>call-process <span style="color: #ff0000;">&quot;open_in_xcode.py&quot;</span> <span style="color: #b1b100;">nil</span> t <span style="color: #b1b100;">nil</span> filename offset<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #808080; font-style: italic;">;; open_in_xcode.pyを叩く</span></pre></div></div>

<p><strong>pythonスクリプト部</strong>(open_in_xcode.py)</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">from</span> appscript <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">3</span>:
  filepath  = <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/'</span>, <span style="color: #483d8b;">':'</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>:<span style="color: black;">&#93;</span>
  filerange = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">else</span>:
  <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Usage: open_in_xcode filepath file_selected_range&quot;</span>
  <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
&nbsp;
xcode = app<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Xcode&quot;</span><span style="color: black;">&#41;</span>
xcode.<span style="color: black;">activate</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
target = xcode.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span>filepath<span style="color: black;">&#41;</span>
target.<span style="color: black;">selected_character_range</span>.<span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>filerange,filerange<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>これでM-x open-in-xcodeでEmacsのカレントバッファで開いているファイルをXcodeで開けます。割と便利なんじゃないかと思いますけどどうでしょうか。これからelisp + αなちょい技を少しずつ貯めていこうと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/1849/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
