2013年6月16日日曜日

[Python][matplotlib]区間横棒グラフ

0 から開始ではなく途中からの横棒グラフを描くには broken_barh() を使う
# -*- coding:utf-8 -*-
# broken_barh
import numpy
import matplotlib.pyplot

########################################################################
## Main function
########################################################################
ind = numpy.arange(8)
matplotlib.pyplot.axis([0, 10, 0, 10])
matplotlib.pyplot.grid(True)
# xranges: (xmin, xwidth)
# yrange: (ymin, ywidth)
# 左下:(1, 1), 右上:(2, 4)
matplotlib.pyplot.broken_barh([(1, 1)], (1, 3))
# 左下:(3, 3), 右上:(6, 4)
matplotlib.pyplot.broken_barh([(3, 3)], (3, 1), facecolor='red')
matplotlib.pyplot.savefig('test15.png')

[Python][matplotlib]横棒グラフ

横棒グラフを描く場合は barh() を使う
# -*- coding:utf-8 -*-
# barh
import numpy
import matplotlib.pyplot

########################################################################
## Main function
########################################################################
tokyo = [7.0, 6.5, 9.1, 12.4, 19.0, 23.6,
28.0, 29.6, 25.1, 18.9, 13.5, 9.9]
ind = numpy.arange(1, 13)

# 横棒グラフ
matplotlib.pyplot.barh(ind, tokyo)
matplotlib.pyplot.axis([0, 40, 1, 12])
matplotlib.pyplot.grid(True)
matplotlib.pyplot.savefig('test15-1.png')

[Python][matplotlib]Grid 付き棒グラフ

# -*- coding:utf-8 -*-
# Grid 付き
import numpy
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

temperature = (7.0, 29.6, 16.8, 28.9)
ind = numpy.arange(4)
print ind
width = 0.35
p1 = plt.bar(ind, temperature, width, color="b")

# フォントを指定して日本語表示
#prop = fm.FontProperties(fname='C:\\WINDOWS\\Fonts\\ipamp.ttf')
prop = fm.FontProperties(fname='/usr/share/fonts/ipa-pmincho/ipamp.ttf')
plt.xticks(ind + width / 2., (u'東京 1 月', u'東京 8 月', u'那覇 1 月', u'那覇 8 月'), fontproperties=prop)
plt.axis([-1, 4, 0, 35]) # axis([xmin, xmax, ymin, ymax])
plt.grid(True)
#plt.show()

# png 出力
plt.savefig('test06.png')

[Python][matplotlib]棒グラフ

棒グラフを描く場合は bar() を使用する
# -*- coding:utf-8 -*-
# 棒グラフ
import numpy
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

temperature = (7.0, 29.6, 16.8, 28.9)
ind = numpy.arange(4)
print ind
width = 0.35
p1 = plt.bar(ind, temperature, width, color="b")

# フォントを指定して日本語表示
#prop = fm.FontProperties(fname='C:\\WINDOWS\\Fonts\\ipamp.ttf')
prop = fm.FontProperties(fname='/usr/share/fonts/ipa-pmincho/ipamp.ttf')
plt.xticks(ind + width / 2., (u'東京 1 月', u'東京 8 月', u'那覇 1 月', u'那覇 8 月'), fontproperties=prop)
plt.axis([-1, 4, 0, 35]) # axis([xmin, xmax, ymin, ymax])
#plt.show()

# png 出力
plt.savefig('test05.png')

[Python][matplotlib]複数のファイルに出力する

figure() で figure object を複数作成し、それぞれ savefig() で画像ファイルに出力する
# -*- coding:utf-8 -*-
# 2 つのファイルに出力する
import numpy
import matplotlib.pyplot as plt

t1 = numpy.arange(0.0, 1.0, 0.02)
fig = plt.figure(1)

# 1 rows, 1 column, first plot
plt.subplot(1, 1, 1)
plt.title('sin()')
plt.plot(t1, numpy.sin(2 * numpy.pi * t1), 'k')

# png 出力
fig.savefig('test10-0.png')

# 新しい figure を作成、引数に 1 を渡すと上で作成した fig に追加でグラフを描く
fig = plt.figure(2)

# 1 rows, 1 column, first plot
plt.subplot(1, 1, 1)
plt.title('cos()')
plt.plot(t1, numpy.cos(2 * numpy.pi * t1), 'r')

# png 出力
fig.savefig('test10-1.png')

[Python][matplotlib]複数のグラフを 1 つのファイルにまとめる

figure() で figure object を作成し、そこに subplot で描画領域を区分けして plot していく
# -*- coding:utf-8 -*-
# 2 つのグラフを表示する
import numpy
import matplotlib.pyplot as plt

def f(t):
    return numpy.exp(-t) * numpy.cos(2 * numpy.pi * t)

t1 = numpy.arange(0.0, 5.0, 0.1)
t2 = numpy.arange(0.0, 5.0, 0.02)
fig = plt.figure(1)

# 2 rows, 1 column, first plot
plt.subplot(2, 1, 1)
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')

# 2 rows, 1 column, second plot
plt.subplot(2, 1, 2)
plt.plot(t2, numpy.cos(2 * numpy.pi * t2), 'r--')

# png 出力
fig.savefig('test08.png')


4 つ載せる場合
# -*- coding:utf-8 -*-
# 4 つのグラフを表示する
import numpy
import matplotlib.pyplot as plt

t1 = numpy.arange(0.0, 1.0, 0.02)
fig = plt.figure(1)

# 2 rows, 2 column, first plot
plt.subplot(2, 2, 1)
plt.title('sin()')
plt.plot(t1, numpy.sin(2 * numpy.pi * t1), 'k')

# 2 rows, 2 column, second plot
plt.subplot(2, 2, 2)
plt.title('cos()')
plt.plot(t1, numpy.cos(2 * numpy.pi * t1), 'r')

# 2 rows, 2 column, third plot
plt.subplot(2, 2, 3)
plt.title('tan()')
plt.plot(t1, numpy.tan(2 * numpy.pi * t1), 'b')

# 2 rows, 2 column, fourth plot
plt.subplot(2, 2, 4)
plt.title('log()')
plt.plot(t1, numpy.log(t1), 'g')

# png 出力
fig.savefig('test09.png')

[Python][matplotlib]出力するグラフのサイズを指定

  • figure() と subplot() を使用して出力サイズ (pixel) を指定する
  • figure で 4x3 inch に出力する指示をし、その figure object に subplot でグラフを描く
  • ファイル出力する時 (savefig) に、100dpi と指定すれば 400 x 300 pixel となる
# -*- coding:utf-8 -*-
# 400x300 pixel の画像として出力する
import numpy
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

temperature = (7.0, 29.6, 16.8, 28.9)
ind = numpy.arange(4)
print ind
width = 0.35
fig = plt.figure(figsize=(4, 3))
plt.subplot(111)
plt.bar(ind, temperature, width, color="b")

# フォントを指定して日本語表示
#prop = fm.FontProperties(fname='C:\\WINDOWS\\Fonts\\ipamp.ttf')
prop = fm.FontProperties(fname='/usr/share/fonts/ipa-pmincho/ipamp.ttf')
plt.xticks(ind + width / 2., (u'東京 1 月', u'東京 8 月', u'那覇 1 月', u'那覇 8 月'), fontproperties=prop)
plt.axis([-1, 4, 0, 35]) # axis([xmin, xmax, ymin, ymax])

# png 出力
fig.savefig('test07.png', dpi=100)

[Python][matplotlib]グラフを描く

plot() の第 3 引数で plot 描画の方法を指定する。
# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt

plt.plot([1,2,3,4],[1,4,9,18], 'ro') # r: red, o: circle marker
plt.plot([1,2,3,4],[3,5,15,2], 'b^') # b: blue, ^: triangle_up marker
plt.axis([0,5,0,20]) # axis([xmin, xmax, ymin, ymax])
plt.show()


numpy で生成した数列をグラフ化
# -*- coding:utf-8 -*-
# numpy で生成した数列をグラフ化
import numpy
import matplotlib.pyplot as plt

t = numpy.arange(0., 5., 0.2)
print t
plt.plot(t, t, 'r--')
plt.plot(t, t**2, 'bs') # 2 乗
plt.plot(t, t**3, 'g^') # 3 乗
plt.show()


Sine curve を描く
# -*- coding:utf-8 -*-
# Sine curve を描く
import numpy
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

t = numpy.arange(-numpy.pi, numpy.pi, 0.1)
print t

# フォントを指定して日本語表示
#prop = fm.FontProperties(fname='C:\\WINDOWS\\Fonts\\ipamp.ttf')
prop = fm.FontProperties(fname='/usr/share/fonts/ipa-pmincho/ipamp.ttf')
plt.title(u'Sine curve テスト', fontproperties=prop)
plt.plot(t, numpy.sin(t), 'k')
#plt.show()

# png 出力する場合はこちら
plt.savefig('test04.png')

[Python][matplotlib]インストール

Windows
  1. Numerical Python - Browse /NumPy/1.5.1 at SourceForge.net から numpy-1.5.1-win32-superpack-python2.7.exe をダウンロードしてインストールする
  2. matplotlib - Browse /matplotlib/matplotlib-1.0.1 at SourceForge.net から matplotlib-1.0.1.win32-py2.7.exe をダウンロードしてインストールする


Fedora
yum でインストール
# yum install numpy
# yum install python-matplotlib


動作確認
# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt

plt.plot([1,2,3,4],[1,4,9,18])
plt.ylabel('some numbers')
plot.show()
Fedora では問題なく動作したが、Windows の場合は以下のようなエラーが表示された。
> python test00.py
Traceback (most recent call last):
File "test00.py", line 2, in <module>
import matplotlib.pyplot as plt
File "C:\usr\Python27\lib\site-packages\matplotlib\pyplot.py", line 23, in <module>
from matplotlib.figure import Figure, figaspect
(略)
File "C:\usr\Python27\lib\site-packages\matplotlib\font_manager.py", line 214, in win32InstalledFonts
key, direc, any = _winreg.EnumValue( local, j)
MemoryError
これは matplotlib の backend (renderer) がデフォルトで tkagg backend を使うことになっているために発生している。agg backend に切り替えて動作させるとグラフ作成ができた。
# -*- coding:utf-8 -*-
import matplotlib
matplotlib.use('agg') # Backend を agg に変更する。matplatlib.pyplot を import する前にこれを実行すること
import matplotlib.pyplot as plt

plt.plot([1,2,3,4],[1,4,9,18])
plt.ylabel('some numbers')
plt.show()
plt.savefig('test01.png')

ここで Atcive Tcl を ActiveTcl Downloads - Tcl for Windows, Linux and Mac | ActiveState からダウンロード、インストールすると tkagg backend でも実行可能となる。

[Emacs]NTEmacs で作成した文章の印刷

NTEmacs の M-x print-buffer を使用して印刷する方法を記述する。
NTEmacs から直接印刷することは困難なのでテキストエディタ (今回はサクラエディタW を使用) を使用して印刷をする。
.emacs に以下を記述
;;; ===== 印刷 =====
(setq exec-path (cons "C:\\Program Files\\Utility\\sakuraW_r1428" exec-path))
(setq print-region-function
 (lambda (start end
        &optional lpr-prog
        delete-text buf display
        &rest rest)
        (let* ((procname (make-temp-name "w32-print-"))
        (tempfile
        (subst-char-in-string
        ?/ ?\\
        (expand-file-name procname temporary-file-directory)))
        (coding-system-for-write 'sjis-dos))
        (write-region start end tempfile)
        (set-process-sentinel
        (start-process procname nil "sakuraW.exe" tempfile)
        (lambda (process event)
        (let ((tempfile
        (expand-file-name (process-name process)
        temporary-file-directory)))
        (when (file-exists-p tempfile)
        (delete-file tempfile))))))))
  • setq exec-path と setenv "PATH" にある PATH はエディタのある PATH を指定すること
  • start-process にある sakuraW.exe は使用するエディタを指定すること
  • 作成中の文章で M-x print-buffer を実行すると buffer 全体がサクラエディタにコピーされるのでそこから印刷を行うことが可能となる
  • M-x print-region で region 指定の印刷もできる

[Emacs]Fedora の Emacs で Anthy が使えるようにする

インストール
# yum install anthy-el
.emacs に Anthy の設定を追記
;; Anthy
(set-language-environment "Japanese")
(setq default-input-method "japanese-anthy")
(global-set-key [zenkaku-hankaku] 'toggle-input-method) 
emacs で M-x toggle-input-method を実行すると Anthy が起動して日本語入力ができるようになる
また、最終行の global-set-key で「半角/全角 漢字」キーによっても Anthy に切り替えられるようにしてある

[Emacs]Fedora にてファイル名一覧の文字化けを直す

Fedora13 ではファイル名/ディレクトリ名が UTF-8 で表示されているので Emacs の Dired 表示が EUC 表示されると文字化けしてしまう。
ファイル名の文字コードを指定するには .emacs に以下を追加する
(setq file-name-coding-system 'utf-8-unix)

[Emacs]Fedora での site-lisp インストール先

Fedora 13 での site-lisp は /usr/share/emacs/site-lisp にある。

[Emacs]migemo

インストール
未完了
  1. migemo からダウンロード
  2. Ruby が必要なので Ruby をインストールする
  3. Ruby/Romkan を Ruby/Romkan からダウンロード
  4. Ruby/Bsearch を Ruby/Bsearch からダウンロードする
  5. Romkan と Bsearch を C:\usr\ruby\lib\ruby\site_ruby にコピー
  6. SKK-JISYO を SKK 辞書 からダウンロードする
  7. SKK-JISYO.L を migemo ディレクトリにコピー
  8. genchars.sh でエラーとなってしまう
    > ./configure --with-emacs=emacs
    > make
    > make install
  9. C/Migemo を KaoriYa からダウンロード
  10. ダウンロードしたファイルを解凍する
  11. c:\usr\emacs\bin に migemo.dll を移動
  12. c:\usr\emacs に dict ディレクトリを移動

[Emacs]emacs-w3m

インストール
w3m 本体 (Cygwin 環境が必要)
  1. w3m 本体 (Cygwin 環境が必要)
    w3m からダウンロード
  2. emacs-w3m
    emacs-w3m からダウンロード
  3. ダウンロードしたファイルを解凍し、emacs ディレクトリ下に置く
  4. インストール
    > cd emacs-w3m-x.x.x
    > emacs -batch -q -no-site-file -l w3mhack.el NONE -f w3mhack-nonunix-install
  5. c:\usr 以下に site-lisp が作成されるので emacs 以下に移動する

[Emacs]APEL

インストール
  1. APEL からダウンロード
  2. ダウンロードしたファイルを解凍し、makeit.bat を編集する
    set PREFIX=c:\usr\emacs
    set EMACS=%PREFIX%\bin\emacs.exe
    set LISPDIR=%PREFIX%\site-lisp
    set DEFAULT_MAKE_ARG=elc
  3. コンパイル
    > makeit.bat
  4. インストール
    > makeit.bat install

[Emacs]sqlite-dump

インストール
  1. sqlite-dump から sqlite-dump.el をダウンロードする
  2. .emacs に以下を記載
    ;;; ===== sqlite-dump =====
    (autoload 'sqlite-dump "sqlite-dump" nil t)
    (modify-coding-system-alist 'file "\\.sqlite\\'" 'raw-text-unix)
    (add-to-list 'auto-mode-alist '("\\.sqlite\\'" . sqlite-dump))


動作確認
  1. テストファイル作成
    > sqlite3.exe test.sqlite
    SQLite version 3.6.18
    Enter ".help" for instructions
    Enter SQL statements terminated with a ";"
    sqlite> CREATE TABLE test (id INTEGER NOT NULL PRIMARY KEY, name TEXT NOT NULL);
    sqlite> INSERT INTO test VALUES (NULL, 'Tokyo');
    sqlite> INSERT INTO test VALUES (NULL, 'Osaka');
    sqlite> INSERT INTO test VALUES (NULL, 'Nagoya');
    sqlite> SELECT * FROM test;
    1|Tokyo
    2|Osaka
    3|Nagoya
    sqlite> .exit
  2. Emacs で test.sqlite を開く
    BEGIN TRANSACTION;
    CREATE TABLE test (id INTEGER NOT NULL PRIMARY KEY, name TEXT NOT NULL);
    INSERT INTO "test" VALUES(1,'Tokyo');
    INSERT INTO "test" VALUES(2,'Osaka');
    INSERT INTO "test" VALUES(3,'Nagoya');
    COMMIT;
  3. 項目を追加
    INSERT INTO "test" VALUES(4,'Sapporo');
  4. コマンドラインで確認
    > sqlite3.exe test.sqlite
    SQLite version 3.6.18
    Enter ".help" for instructions
    Enter SQL statements terminated with a ";"
    sqlite> SELECT * FROM test;
    1|Tokyo
    2|Osaka
    3|Nagoya
    4|Sapporo

[Emacs]twittering-mode

インストール
  1. twittering-mode から twittering-mode.el をダウンロードする
  2. trunk/twittering-mode.el のページに行き、一番下にある Download in other formats: Original Format からダウンロードできる。
  3. ダウンロードした twittering-mode.el を site-lisp の下に移動する
  4. .emacs に以下を追記
    ;;; ===== twittering-mode =====
    (require 'twittering-mode)
    (setq twittering-username "ユーザ名")
    (setq twittering-password "パスワード")
  5. twittering-mode 開始
    M-x twittering-mode


操作方法
Table: twittering-mode キーバインド
キーバインドコマンド機能
C-c C-ftwittering-friends-timelineフレンドタイムラインを表示
C-c C-stwittering-update-status-interactiveつぶやきをポストする
itwittering-icon-modeアイコンモード、テキストモードの toggle

[Emacs]simple-hatena-mode

必要なもの


インストール
  1. site-lisp以下にsimple-hatena-modeというディレクトリを作る
  2. はてなダイアリーライターをhw.plで保存し、simple-hatena-modeディレクトリに置く
  3. simple-hatena-mode.elをsimple-hatena-modeディレクトリに置く


設定
.emacsに以下を追加
;;; ===== simple-hatena-mode =====
(setq exec-path (cons "c:/usr/perl/bin" exec-path))
(require 'simple-hatena-mode)
(setq simple-hatena-default-id "ユーザ名")
(setq simple-hatena-bin "c:/usr/emacs/site-lisp/simple-hatena-mode/hw.pl")


メモ
パスワード入力プロンプトが出てくるとのことだったが、どうしてもログインに失敗していた。~/.hatena/ユーザ名 /diary/config.txtにパスワードを記入すると投稿が可能となった。

[Emacs]ZenCoding を使う

インストール
en-coding - Project Hosting on Google Code の Emacs 対応をインストール
  1. EmacsWiki: Zen Coding から zencoding-mode.el をダウンロードする。
  2. emacs\site-lisp に zencoding-mode.el を置く。
  3. .emacs に以下を追加
    ;;; ===== zen-coding ===
    (require 'zencoding-mode)
    (add-hook 'nxml-mode-hook 'zencoding-mode)
nXML mode に入ると自動で zencoding-mode が起動するようにする。

動作確認
div#name.one
と入力して Ctrl + Enter を押すと下記のように変換される。
<div id="name" class="one">
</div>


使用例
  1. a
    ここで Ctrl + Enter を押すと
    <a></a>
    
  2. html>(head>title)+body
    
    ここで Ctrl + Enter を押すと
    <html>
     <head>
     <title>
     </title>
     </head>
     <body>
     </body>
    </html>
    
  3. table>(thead>tr>td+td)+(tbody>(tr>td+td)*3)
    
    ここで Ctrl + Enter を押すと
    <table>
     <thead>
     <tr>
     <td>
     </td>
     <td>
     </td>
     </tr>
     </thead>
     <tbody>
     <tr>
     <td>
     </td>
     <td>
     </td>
     </tr>
     <tr>
     <td>
     </td>
     <td>
     </td>
     </tr>
     <tr>
     <td>
     </td>
     <td>
     </td>
     </tr>
     </tbody>
    </table>
    

[Emacs]Astyle を使う

  1. Artistic Style - Index の Download から AStyle_1.24_windows.zip (2010/10/14 現在) をダウンロードする。
  2. PATH の通った場所に解凍したファイル内にある AStyle.exe を移動する。
  3. .emacs に以下を追記
    ;;; ===== astyle =====
    (defun astyle-this-buffer(pmin pmax opt)
            (interactive "r
    sInsert options (ex. --mode=c --indent=tab --indent-cases --brackets=linux): ")
            (message "pmin:%d pmax:%d str:%s" pmin pmax opt)
            (setq cmd (concat "astyle.exe " opt))
            (message "cmd:%s" cmd)
            (shell-command-on-region pmin pmax
            cmd
            (current-buffer) t
            (get-buffer-create "*Astyle Errors*") t
            )
    )
  4. バッファを選択して M-x astyle-this-buffer を実行すると astyle.exe に渡す option を聞かれるので入力する。

[Emacs]org-mode

インストール
  1. Org からダウンロード
  2. ダウンロードしたファイルを解凍し、c:/usr/emacs 以下に置く
  3. org-6.13a ディレクトリ内で make を実行する
  4. .emacs に以下を追加
    ; === org mode ===
    (setq load-path (cons "c:/usr/emacs/org-6.13a/lisp" load-path))
    (load "org.elc")
    (add-to-list 'auto-mode-alist '("\\.org$" . org-mode))

[Emacs]nXML モード

Emacs 23.2 から標準搭載となった nXML モード

初期設定
.emacs に以下を追加する
;;; ===== nXML =====
(add-hook 'nxml-mode-hook
        (lambda ()
        (setq nxml-slash-auto-complete-flag t)
        (setq nxml-child-indent 2)
        (setq indent-tabs-mode nil)
        (setq tab-width 2)
        (define-key nxml-mode-map "\r" 'newline-and-indent)
        )
)

Table: nXML mode 設定の内容
nxml-slash-auto-complete-flag"</" を入力すると自動で終了 Tag を補完してくれる
nxml-child-indentインデント 2 スペース
indent-tabs-modet:インデントはタブで行う, nil:インデントはスペースで行う
tab-widthタブ幅 2
define-key nxml-mode-map "\r" 'newline-and-indentEnter キーを押すと改行 + インデントが行われるようにする


Schema を設定
emacs/etc/schema に schema ファイルがある
Table: Schema ファイル操作
C-c C-s C-w現在使用中の schema ファイルを表示する。schema が選択されていない場合は "Using vacuous schema" と表示される。
C-c C-s C-f手動で schema ファイルを指定する。指定すると current directroy に schemas.xml ファイルが作成され、次回からはここで選択した schema ファイルが使用される。


操作方法
Table: nXML mode 操作方法
C-RET"<" 入力後に Tag 補完

2013年6月9日日曜日

[Emacs]Emacs 23.1

Windows 上でのコンパイル
Emacs 23.1 が 2009/7/29 にリリースされたので Windows でのコンパイルをしてみた。
  1. Emacs のソースファイルを Index of /gnu/emacs からダウンロードする
  2. MinGW (Automated MinGW Installer) を MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net からダウンロードする
  3. MinGW のインストーラを実行しパッケージをフルインストールする
  4. MSYS Base System を MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net からダウンロードする
  5. MSYS のインストーラを実行する
  6. GnuWin32 Packages から必要となるライブラリをダウンロード・インストールする。それぞれ Setup パッケージをインストールすればライブラリ、ヘッダファイルがインストールできる。
    必要となるライブラリは以下のもの。
    • Xpm
    • LibPng
    • Zlib
    • LibUnGif
    • LibJpeg
    • LibTiff
    Xpm のインストール確認で simx.h が必要となる。これは Xpm のソースファイルに含まれているので、ソースファイルをダウンロードし、インストールした MinGW\src\xpm\3.5.1\libXpm-3.5.1-src\lib にある simx.h を MinGW\include にコピーする必要がある。
  7. Cygwin など他の実行ファイルが呼び出されないように MinGW, MSYS のみの PATH にしておく
    > set PATH=C:\usr\MinGW\bin;c:\usr\msys\bin
  8. ダウンロードした Emacs のソースファイルを展開する
  9. 展開した Emacs ディレクトリ下にある nt ディレクトリに移動し、configure.bat を実行する
    > cd nt
    > configure.bat
    Checking for 'cp'...
    Checking for 'rm'...
    Checking whether 'gcc' is available...
    Checking whether gcc requires '-mno-cygwin'...
     (中略)
    config.settings
    gmake.defs
    ..\leim\makefile.w32-in
     1 個のファイルをコピーしました。
     1 個のファイルをコピーしました。
    
    Emacs successfully configured.
    Run `make' to build, then run `make install' to install.
  10. mingw32-make.exe を実行する
    > mingw32-make.exe
    [Please ignore a syntax error on the next line - it is intentional]
    /bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
    /bin/sh: -c: line 1: syntax error: unexpected end of file
    Using C:/usr/msys/bin/sh.exe as shell.
     (中略)
    mingw32-make.exe[1]: Entering directory `C:/home/emacs-23.1/leim'
    mingw32-make.exe[1]: Nothing to be done for `all'.
    mingw32-make.exe[1]: Leaving directory `C:/home/emacs-23.1/leim'
  11. mingw32-make.exe install を実行すると bin ディレクトリが生成され、そこに runemacs.exe が作成される
  12. runemacs.exe を実行してバージョンを確認する

備考
22.2.1 で使用していた .emacs にある以下のものが使用できなくなっていたが、まずは起動できた
(require 'fixed-width-fontset)
(require 'ntemacs-font)
fixed-width-fonset を 23.1.1 では使用しないように .emacs の fixed-width-fonset をロードする箇所を以下のように変更
; fixed-width-fontset
; Emacs 23.1.1 の場合は使用できない
(defun load-fixed-width-fontset ()
        (message "This emacs version can support fixed-width-fontset")
        (require 'fixed-width-fontset)
        (require 'ntemacs-font))

(message "emacs-version %s" emacs-version)
(message "emacs-version %d" (string-to-number emacs-version))
(if (< 22 (string-to-number emacs-version))
        (message "This emacs version CANNOT support fixed-width-fontset")
        (load-fixed-width-fontset))
sile-lisp ディレクトリに fixed-width-fontset のディレクトリがあるとロードしにいってしまうので、ディレクトリも削除しておく

Emacs 23.1 の IME patch を当てる
  1. NTEmacs JP Project プロジェクト日本語トップページ - SourceForge.JP から Emacs-23.1-IME.patch.gz をダウンロードする
  2. emacs-23.1 を解凍したディレクトリのルート (INSTALL, COPYING, README などがあるディレクトリ) に Emacs-23.1-IME.patch を置く
  3. patch を当てる
    > patch -p3 < Emacs-23.1-IME.patch
    patching file lib-src/makefile.w32-in
    patching file lisp/loadup.el
    patching file nt/configure.bat
    patching file src/keyboard.c
    patching file src/w32.c
    patching file src/w32fns.c
    patching file src/w32term.c
    patching file src/w32term.h
    patching file src/window.c
    patching file lisp/international/w32-ime.el
    patch コマンドのオプションにある -p は patch ファイルで指定されているディレクトリ階層のレベルを指定する。
    この patch ファイルには以下のように記載されており、Emacs-23.1 のディレクトリから見ると 3 階層目からの lib-src からが指定したいファイルとなる。そこで -p3 で 3 階層目から使用することを明示する。
    --- ~/src/emacs-23.1/lib-src/makefile.w32-in 2009-07-30 00:09:40.000000000 +0900
    +++ /tmp/emacs-23.1/lib-src/makefile.w32-in 2009-08-03 16:54:16.990792800 +0900
    
    patch コマンド中に nt/configure.bat で下記のエラーが出てくる。これは configure.bat の改行コードが CR+LF であるが、patch の方は LF となっているために一致箇所がないと判定されてしまう。その場合は元の configure.bat をエディタで開いて改行コードを LF にして保存すればエラーが解消される。
    patching file nt/configure.bat
    Hunk #1 FAILED at 1.
    1 out of 1 hunk FAILED -- saving rejects to file nt/configure.bat.rej
    
  4. nt ディレクトリで configure.bat を実行する
    > configure.bat --with-gcc --enable-w32-ime --no-cygwin --cflags -D_UNICODE --cflags -DRECONVERSION --prefix=c:/install
    RECONVERSION フラグを付けてコンパイルすると入力済み文字列に対して "変換" ボタンを押した時に再変換が可能となる
    "_UNICODE" フラグを付けてコンパイルすると Unicode 版を使用可能となる。
    "--prefix" でインストール先ディレクトリを指定する
  5. mingw32-make.exe を実行する
    mingw32-make.exe bootstrap をしたところで elc ファイルが一旦削除され、その後再度作成される。
    > mingw32-make.exe bootstrap
    > mingw32-make.exe info
    > mingw32-make.exe
    > mingw32-make.exe install
  6. .emacs の編集
    .emacs ロード時に以下のように表示される。これは php-mode のロードで問題が発生してるようだ。
    .emacs の該当箇所を requrire から autoload に変更すれば Warning はでなくなる
    ;;; ====== php =====
    ;(require 'php-mode)
    (autoload 'php-mode "php-mode" "Major mode for editing php code." t)

[Emacs]Emacs 各バージョン

Emacs 23.4
  • Windows7 で Microsoft IME を使うとインラインで日本語入力ができない
  • Google 日本語入力を使ってもインラインで日本語入力ができない


Emacs 2.33
  • Windows7 で Microsoft IME を使うとインラインで日本語入力ができない
  • Google 日本語入力を使えばインラインで日本語入力ができるようになった


Emacs 23.2.1
  • 日本語入力時のフォーカスが IME patch 不要で入力位置に出るようになった
  • CEDET のサポート
    参照: A Gentle introduction to Cedet
    まずは M-x semantic-mode で開始する
    • M-x semantic-ia-complete-symbol
      Completion バッファが表示される
    • M-x semantic-ia-complete-tip
      マウスカーソルがある場所に吹き出しで表示される
    • M-x samantic-complete-analyze-inline
      Completion バッファが表示される
      C-c , SPC でも実行可能
    • 入力していくと候補が絞られ、TAB で補完することができる
    • M-x semantic-analyze-proto-impl-toggle
      ヘッダファイルの関数定義で実行すると関数の実装箇所に飛ぶことができる。
      関数の実装内でこのコマンドを実行するとヘッダファイルの定義に飛ぶ。
    • M-x semantic-decoration-include-visit
      include 定義ので上このコマンドを実行するとヘッダファイルに飛ぶ。
    • M-x semantic-idle-completions-mode
      または -> を入力したところでしばらく操作をしていないと補完候補が出てくる
      TAB で次の候補へ切り替えることができる
    • M-x semantic-speedbar-analysis
      Speedbar が表示され、そこに補完候補が出てくる

      クラス変数入力前の状態
      クラス変数を入力すると属する method が表示される
    • M-x semantic-symref-symbol
      GTAG を実行した後で関数上でこのコマンドを実行すると関数が使用されている箇所を表示できる。
    • M-x semantic-ia-fast-jump
      関数が使用されている場所でこのコマンドを実行すると関数の実装箇所に飛ぶ。
    • M-x semantic-complete-jump-local
      関数またはローカル変数をしているすると、その定義の箇所に飛ぶ。

[Emacs]DocBook XML モード

  1. DocBook XML Mode for GNU Emacs | Download DocBook XML Mode for GNU Emacs software for free at SourceForge.net から docbook-xml-mode.x.x.tar.gz をダウンロードする
  2. ダウンロードしたファイルを解凍し、emacs/site-lisp 以下に置く
  3. .emacs に以下を追記
    ;;; ===== DocBook XML =====
    (load "docbook-xml-mode.el")
  4. docbook ファイルを開いて M-x docbook-xml-mode を実行すると DocBook XML モードが動き出す

[Python]TeX の数式を png に出力するスクリプト

[TeX] 数式文字列を png ファイルにして出力する の手順を python スクリプトで実行できるようにする。
# -*- coding:utf-8 -*-
import os
import optparse

########################################################################
## Check options
########################################################################
def checkOption(opt):
 if opt == None:
  parser.print_help()
  exit()

skeleton = """
\\documentclass[11pt,a4paper]{report}
\\pagestyle{empty}
\\begin{document}
\\%s{$%s$}
\\end{document}
"""

parser = optparse.OptionParser()
parser.add_option("-t", "--tex", dest="tex", help="tex format", metavar="[TEX]")
parser.add_option("-s", "--size", dest="size", help="Font size (0-9)", default="4", metavar="[SIZE]")
parser.add_option("-o", "--output", dest="out", help="output file name prefix", metavar="[OUT]")
(options, args) = parser.parse_args()
checkOption(options.tex)
checkOption(options.size)
checkOption(options.out)

print "tex   : %s" % (options.tex)
print "size  : %s" % (options.size)
print "output: %s" % (options.out)

# フォントサイズを決める
if options.size == "0":
 fontsize = "tiny"
elif options.size == "1":
 fontsize = "scriptsize"
elif options.size == "2":
 fontsize = "footnotesize"
elif options.size == "3":
 fontsize = "small"
elif options.size == "4":
 fontsize = "normalsize"
elif options.size == "5":
 fontsize = "large"
elif options.size == "6":
 fontsize = "Large"
elif options.size == "7":
 fontsize = "LARGE"
elif options.size == "8":
 fontsize = "huge"
elif options.size == "9":
 fontsize = "Huge"
else:
 fontsize = "normalsize"

texdata = skeleton % (fontsize, options.tex)
print texdata

outputBase = options.out
texFilename = outputBase + ".tex"
dviFilename = outputBase + ".dvi"
pngFilename = outputBase + ".png"

fd = open(texFilename, "w")
fd.write(texdata)
fd.close()

os.system("platex %s" % (texFilename))
os.system("dvipng %s -o %s -T tight" % (dviFilename, pngFilename))

print "Remove temporary files"
print " %s, %s, %s, %s" % (texFilename, dviFilename, outputBase + ".log", outputBase + "aux")
os.remove(texFilename)
os.remove(dviFilename)
os.remove(outputBase + ".log")
os.remove(outputBase + ".aux")

実行結果
python tex2png.py -t "y=ax^{2}" -o y_ax2
python tex2png.py -t "y=ax^{2}" -s 1 -o y_ax2_1
python tex2png.py -t "y=ax^{2}" -s 9 -o y_ax2_9

[Python]os モジュール

スクリプトを動作させている OS を区別する
os モジュールの name を使う
# -*- coding:utf-8 -*-
import os

if os.name == "nt":
    print "OS name is %s (Windows XP)" % (os.name)
elif os.name == "posix":
    print "OS name is %s (Linux)" % (os.name)
else:
    print "OS name is %s" % (os.name)

Windows XP で動作させた場合
> python test.py
OS name is nt (Windows XP)

Fedora13 で動作させた場合
$ python test.py
OS name is posix (Linux)

matplotlib で日本語フォントを使う場合、Windows と Linux ではフォントの指定先が異なるので次のように分ける。
# フォントを指定して日本語表示
if os.name == "nt":
    # Windows の場合
    prop = fm.FontProperties(fname='C:\\WINDOWS\\Fonts\\ipamp.ttf')
else:
    # Linux の場合
    prop = fm.FontProperties(fname='/usr/share/fonts/ipa-pmincho/ipamp.ttf')

plt.xticks(ind + width / 2., (u'東京 1 月', u'東京 8 月', u'那覇 1 月', u'那覇 8 月'), fontproperties=prop)

[Python]Logger

ログファイルを作成する時は logging モジュールを使う
# -*- coding: utf-8 -*-
import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)-8s %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    filename='./test.log',
                    filemode='w')
logging.debug("A debug message")
logging.info("An info message")
logging.warning("A warning message")
logging.error("An error message")
logging.critical("A critical message")
logging.exception("An exception message")

出力結果 (test.log)
2011-02-11 14:41:44 DEBUG A debug message
2011-02-11 14:41:44 INFO An info message
2011-02-11 14:41:44 WARNING A warning message
2011-02-11 14:41:44 ERROR An error message
2011-02-11 14:41:44 CRITICAL A critical message
2011-02-11 14:41:44 ERROR An exception message
None

ログレベルを設定, ログファイルに追記する場合
# -*- coding: utf-8 -*-
import logging

logging.basicConfig(level=logging.WARNING,
                    format='%(asctime)s %(levelname)-8s %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    filename='./test.log',
                    filemode='a')
logging.debug("A debug message")
logging.info("An info message")
logging.warning("A warning message")
logging.error("An error message")
logging.critical("A critical message")
logging.exception("An exception message")

出力結果 (test.log)
2011-02-11 14:42:45 WARNING A warning message
2011-02-11 14:42:45 ERROR An error message
2011-02-11 14:42:45 CRITICAL A critical message
2011-02-11 14:42:45 ERROR An exception message
None

[Python]Flickr API

インストール
  1. Scripts/easy_install.exe を使って flickrapi module をインストールする
    > cd Python25/Scripts
    > easy_install.exe flickrapi
    Reading http://pypi.python.org/simple/flickrapi/
    Reading http://flickrapi.sf.net/
    Reading http://stuvel.eu/projects/flickrapi
    Best match: flickrapi 1.4.2
    Downloading http://pypi.python.org/packages/2.5/f/flickrapi/flickrapi-1.4.2-py2.5.egg#md5=d2312c2ee10b838afe7d607b51b969d6
    Processing flickrapi-1.4.2-py2.5.egg
    Moving flickrapi-1.4.2-py2.5.egg to python25\lib\site-packages
    Adding flickrapi 1.4.2 to easy-install.pth file
    Installed python25\lib\site-packages\flickrapi-1.4.2-py2.5.egg
    Processing dependencies for flickrapi
    Finished processing dependencies for flickrapi
  2. Sign in to Yahoo! から API Key と Secret code を入手する
  3. 自分のページから Tag を指定して検索する
    自分のユーザー ID は Flickr の photostream を開いた時に URL に表示される。
    http://www.flickr.com/photos/************/
    の *** の部分


Search
# -*- coding: utf-8 -*-
# Flickr API テストスクリプト (Search)
import flickrapi

api_key = '入手した API key'
flickr = flickrapi.FlickrAPI(api_key)
my_user_id = '自分のユーザー ID'
search_tags = '検索する Tag'

for photo in flickr.walk(user_id=my_user_id, tags=search_tags):
    print "title: ", photo.get('title')
    print "id: ", photo.get('id')
    print "secret: ", photo.get('secret')
    print "URL: http://www.flickr.com/photos/%s/%s/" % (my_user_id, photo.get('id'))
取得できる結果のパラメータ (photo.get() に渡している引数) は Flickr Services: Flickr API: flickr.photos.search の Example Response 参照

Upload
スクリプトを実行すると Upload を許可しても良いかの確認画面が表示される
# -*- coding: utf-8 -*-
# Flickr API テストスクリプト (Upload)
import flickrapi

api_key = '入手した API Key'
api_secret = '入手した API secret code'
flickr = flickrapi.FlickrAPI(api_key, api_secret)

# Web ブラウザに Flickr 画面が表示され、このスクリプトから upload をしても良いか許可を求められる
(token, frob) = flickr.get_token_part_one(perms='write')
if not token: raw_input("Press ENTER after you authorized this program")
flickr.get_token_part_two((token, frob))
u_filename = 'test.jpg'
u_title = 'test'
flickr.upload(filename=u_filename, title=u_title)

[Python]ディレクトリ

ディレクトリ作成
ディレクトリ作成には os モジュールの mkdir() を使う
# -*- coding: utf-8 -*-
# ディレクトリ作成
import os
import os.path

target = "test"
if os.path.exists("./" + target) == True:
    print "%s has already existed." % (target)
else:
    os.mkdir(target)

実行結果
$ ls
mkdir.py rmdir.py
$ python mkdir.py
$ python mkdir.py
test has already existed.
$ ls
mkdir.py rmdir.py test


ディレクトリ削除
ディレクトリ削除には os モジュールの rmdir() を使う
# -*- coding: utf-8 -*-
# ディレクトリ削除
import os

target = "test"
if os.path.exists("./" + target) == True:
    os.rmdir("test")
else:
    print "%s does not exist." % (target)

実行結果
$ ls
mkdir.py rmdir.py test
$ python rmdir.py
$ python rmdir.py
test does not exist.
$ ls
mkdir.py rmdir.py

ディレクトリ内のファイル走査
  • os.path.walk
    Current directory の中身を走査して jpg ファイルを選び出す
    # -*- coding: utf-8 -*-
    import os
    import re
    
    def callback(arg, dirname, filenames):
        print "dirname: ", dirname
        for file in filenames:
            print file
            if re.search("jpg$", file):
            print "---> This file is JPEG"
    
    arglist = []
    os.path.walk('./', callback, arglist)
    

    実行結果
    > python dir.py
    dirname: ./
    aaa.txt
    bbb.txt
    ccc.jpg
    ---> This file is JPEG
    dir.py
  • os.walk
    Python 2.3 以降では os.path.walk ではなく os.walk を使う
    # -*- coding: utf-8 -*-
    import os
    
    top = '.'
    print "--- os.walk(top) ---"
    for root, dirs, files in os.walk(top):
        for name in files:
            print "File: %s" % (name)
        for name in dirs:
            print "Dir: %s" % (name)
    
    # リストの並び順が変わる
    print "--- os.walk(top, topdown=False) ---"
    for root, dirs, files in os.walk(top, topdown=False):
        for name in files:
            print "File: %s" % (name)
        for name in dirs:
            print "Dir: %s" % (name)
    

    実行結果
    > python dir2.py
    --- Recursive os.walk(top) ---
    File: aaa.txt
    File: bbb.txt
    File: ccc.jpg
    File: dir.py
    File: dir2.py
    Dir: test
    File: aaa.txt
    --- Non-recursive os.walk(top, topdown=False) ---
    File: aaa.txt
    File: aaa.txt
    File: bbb.txt
    File: ccc.jpg
    File: dir.py
    File: dir2.py
    Dir: test
    
  • os.listdir
    # -*- coding: utf-8 -*-
    import os
    
    top = '.'
    
    # 指定した path に含まれる要素のリストを作成する
    ls = os.listdir(top)
    print ls
    for name in ls:
        print name
    
    出力結果
    > python list.py
    ['aaa.txt', 'bbb.txt', 'ccc.jpg', 'dir.py', 'dir2.py', 'list.py', 'test']
    aaa.txt
    bbb.txt
    ccc.jpg
    dir.py
    dir2.py
    list.py
    test

[Python]CSV

CSV ファイル読み込み
CSV ファイルを読み込むには csv モジュールを使用する。
Example: CSV 読み込みスクリプト (test00.py)
# -*- coding:utf-8 -*-
import csv

f = open("tokyo2010.csv", "rb")
reader = csv.reader(f)
for row in reader:
    print row

    try:
        temp = float(row[3])
        if temp >= 15:
            # 数値に変換して 15 ℃以上であれば表示
            print " ---> Over 15 degrees C (%.1f)" % temp
    except ValueError:
        # float 変換できなければこちらに入る
        print "Not float"

# 先頭に戻る
print "------------------------------------"
f.seek(0)
for row in reader:
    print row

f.close()

Example: csv ファイル (tokyo2010.csv)
Month,Ave. Atmosphere Pressure(hPa),Precipitation(mm),Ave. Daily Temperature(degree C),Ave. Humidity(%),Ave. Wind Speed(m/s),Sunshine Duration(h)
1,1010.2,9,7,41,2.7,221.9
2,1012.6,115,6.5,60,2.8,118.3
3,1012.7,143.5,9.1,61,3.2,139.8
4,1013.6,214,12.4,62,3.1,139.9
5,1007.3,114,19,60,3.2,198.8
6,1007.1,108,23.6,67,2.9,162.5
7,1005.9,70,28,70,3.3,182.7
8,1009.7,27,29.6,67,3.4,222.6
9,1008.3,428,25.1,68,2.9,165.3
10,1012.7,211,18.9,68,2.5,81.4
11,1012.3,94.5,13.5,56,2.4,158.9
12,1005.1,145.5,9.9,50,2.7,194.9

実行結果
$ python test00.py
['Month', 'Ave. Atmosphere Pressure(hPa)', 'Precipitation(mm)', 'Ave. Daily Temperature(degree C)', 'Ave. Humidity(%)', 'Ave. Wind Speed(m/s)', 'Sunshine Duration(h)']
Not float
['1', '1010.2', '9', '7', '41', '2.7', '221.9']
['2', '1012.6', '115', '6.5', '60', '2.8', '118.3']
['3', '1012.7', '143.5', '9.1', '61', '3.2', '139.8']
['4', '1013.6', '214', '12.4', '62', '3.1', '139.9']
['5', '1007.3', '114', '19', '60', '3.2', '198.8']
---> Over 15 degrees C (19.0)
['6', '1007.1', '108', '23.6', '67', '2.9', '162.5']
---> Over 15 degrees C (23.6)
['7', '1005.9', '70', '28', '70', '3.3', '182.7']
---> Over 15 degrees C (28.0)
['8', '1009.7', '27', '29.6', '67', '3.4', '222.6']
---> Over 15 degrees C (29.6)
['9', '1008.3', '428', '25.1', '68', '2.9', '165.3']
---> Over 15 degrees C (25.1)
['10', '1012.7', '211', '18.9', '68', '2.5', '81.4']
---> Over 15 degrees C (18.9)
['11', '1012.3', '94.5', '13.5', '56', '2.4', '158.9']
['12', '1005.1', '145.5', '9.9', '50', '2.7', '194.9']
------------------------------------
['Month', 'Ave. Atmosphere Pressure(hPa)', 'Precipitation(mm)', 'Ave. Daily Temperature(degree C)', 'Ave. Humidity(%)', 'Ave. Wind Speed(m/s)', 'Sunshine Duration(h)']
['1', '1010.2', '9', '7', '41', '2.7', '221.9']
['2', '1012.6', '115', '6.5', '60', '2.8', '118.3']
['3', '1012.7', '143.5', '9.1', '61', '3.2', '139.8']
['4', '1013.6', '214', '12.4', '62', '3.1', '139.9']
['5', '1007.3', '114', '19', '60', '3.2', '198.8']
['6', '1007.1', '108', '23.6', '67', '2.9', '162.5']
['7', '1005.9', '70', '28', '70', '3.3', '182.7']
['8', '1009.7', '27', '29.6', '67', '3.4', '222.6']
['9', '1008.3', '428', '25.1', '68', '2.9', '165.3']
['10', '1012.7', '211', '18.9', '68', '2.5', '81.4']
['11', '1012.3', '94.5', '13.5', '56', '2.4', '158.9']
['12', '1005.1', '145.5', '9.9', '50', '2.7', '194.9']


CSV ファイルへの出力
Example: CSV への出力スクリプト (test01.py)
# -*- coding:utf-8 -*-
import csv

f = open("out.csv", "wb")
writer = csv.writer(f)

row = ["Tokyo", 1, 7.0]
writer.writerow(row)
row = ["Tokyo", 8, 29.6]
writer.writerow(row)
row = ["Naha", 1, 16.8]
writer.writerow(row)
row = ["Naha", 8, 28.9]
writer.writerow(row)

f.close()

出力結果
Tokyo,1,7.0
Tokyo,8,29.6
Naha,1,16.8
Naha,8,28.9
改行コードを LF (\n) にする場合は cvs.writer() に lineterminator 引数で指定する。
writer = csv.writer(f, lineterminator="\n")