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")

2013年5月19日日曜日

[FOP]FO 作成のパラメータ指定

次の xml ファイルに対して fo 作成用の xsl を操作して出力結果の違いを見てみる。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<article>
  <sect1>
    <title>Hello World</title>
    <para>Hello World</para>
  </sect1>
  <sect1>
    <title>日本語テスト</title>
    <para>日本語が正しく表示されますか?</para>
  </sect1>
  <sect1>
    <title>hoge</title>
    <para>hello</para>
    <sect2>
      <title>hoge2</title>
      <para>hogehoge</para>
    </sect2>
  </sect1>
</article>


標準
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'>
  <xsl:import href="../docbook-xsl-1.75.0/fo/docbook.xsl"/>
  <xsl:output method="fo" encoding="UTF-8" indent="yes"/>

  <xsl:param name="section.autolabel" select="1"/>
  <xsl:param name="default.encoding" select="'UTF-8'"/>

  <xsl:param name="paper.type" select="'A4'"/>

  <xsl:param name="title.font.family" select="'Meiryo'"/>
  <xsl:param name="body.font.family" select="'Meiryo'"/>
  <xsl:param name="sans.font.family" select="'Meiryo'"/>
  <xsl:param name="monospace.font.family" select="'Meiryo'"/>
</xsl:stylesheet>


文章全体の上下 margin を調整
次の指定を xsl に追加
<xsl:param name="page.margin.top">10mm</xsl:param>
<xsl:param name="page.margin.bottom">10mm</xsl:param>


本文上下の margin を調整
次の指定を xsl に追加
<xsl:param name="body.margin.top">0mm</xsl:param>
<xsl:param name="body.margin.bottom">0mm</xsl:param>


本文左右の margin を調整
次の指定を xsl に追加
<xsl:param name="page.margin.inner">0mm</xsl:param>
<xsl:param name="page.margin.outer">0mm</xsl:param>


段落の開始位置 左 margin を調整
次の指定を xsl に追加
<xsl:param name="body.start.indent">0pt</xsl:param>


Table of Contents, List of Figures なし
次の指定を xsl に追加
<xsl:param name="generate.toc">
 article nop
</xsl:param>


Header に draft を入れる, Background に draft 画像を貼る
次の指定を xsl に追加
<xsl:param name="draft.mode">yes</xsl:param>
<xsl:param name="draft.watermark.image">file:///c:\usr\share\sgml\docbook-xsl-1.75.0\images\draft.png</xsl:param>
draft.watermark.image を指定しないと HTTP 通信をして draft.png ファイルを取得しようとするので, ネットワークがつながっていない・Proxy が設定されていない等でエラーとなった場合に下記の表示が出る
[fop] 致命的: Error with opening URL 'http://docbook.sourceforge.net/release/images/draft.png': Connection timed out: connect


Header, Footer に罫線なし
次の指定を xsl に追加
<xsl:param name="header.rule" select="0"></xsl:param>
<xsl:param name="footer.rule" select="0"></xsl:param>


ページ定義
<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
 <fo:layout-master-set>
  <fo:simple-page-master master-name="simple"
                         page-height="297mm"
                         page-width="210mm"
                         margin-top="10mm"
                         margin-bottom="20mm"
                         margin-left="25mm"
                         margin-right="25mm">
   <fo:region-body margin-top="30mm"/>
   <fo:region-before extent="30mm"/>
   <fo:region-after extent="15mm"/>
  </fo:simple-page-master>
 </fo:layout-master-set>

 <fo:page-sequence master-reference="simple">
  <fo:flow flow-name="xsl-region-body">
   <fo:block font-size="18pt" padding-top="3pt" padding-bottom="10pt">
    TITLE
   </fo:block>
   <fo:block font-size="12pt" font-family="sans-serif">
    hogehoge
   </fo:block>
   <fo:block font-size="14pt" font-family="IPA Mincho">
    ほげほげ
   </fo:block>
  </fo:flow>
 </fo:page-sequence>
</fo:root>
  • ページの定義は以下の部分
    page-height="297mm"
    page-width="210mm"
    margin-top="10mm"
    margin-bottom="20mm"
    margin-left="25mm"
    margin-right="25mm"
    長さ 297mm x 幅 210mm は A4 サイズの用紙
  • 文章本体は以下の部分で定義
    <fo:region-body margin-top="30mm"/>
  • ヘッダ部分
    <fo:region-before extent="30mm"/>
  • フッター部分
    <fo:region-after extent="15mm"/>
  • 以下の箇所が文章本体。master-reference では先に定義していたページ情報を指定する。
    <fo:page-sequence master-reference="simple">
            :
    </fo:page-sequence>
  • 以下の箇所でbody 部分に記載する内容を定義する。body 部分であることは xsl-region-body で指定している。
    <fo:flow flow-name="xsl-region-body">
          :
    </fo:flow>


region
<?xml version="1.0" encoding="UTF-8"?>

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xml:lang="ja">
 <fo:layout-master-set>
  <fo:simple-page-master page-height="148mm"
                         page-width="105mm"
                         margin-top="10mm"
                         margin-left="20mm"
                         margin-right="20mm"
                         margin-bottom="10mm"
                         master-name="PageMaster">
   <fo:region-body   background-color="#cccccc"
                     margin-top="20mm"
                     margin-left="20mm"
                     margin-right="20mm"
                     margin-bottom="20mm"/>
   <fo:region-before background-color="#00ffff"  extent="15mm"/>
   <fo:region-after  background-color="#00ffff"  extent="15mm"/>
   <fo:region-start  background-color="#ffffcc" extent="15mm"/>
   <fo:region-end    background-color="#ffffcc" extent="15mm"/>
  </fo:simple-page-master>
 </fo:layout-master-set>

 <fo:page-sequence initial-page-number="1" master-reference="PageMaster">
  <fo:static-content flow-name="xsl-region-start">
   <fo:block>region-start</fo:block>
  </fo:static-content>
  <fo:static-content flow-name="xsl-region-end">
   <fo:block>region-end</fo:block>
  </fo:static-content>
  <fo:static-content flow-name="xsl-region-before">
   <fo:block>region-before</fo:block>
  </fo:static-content>
  <fo:static-content flow-name="xsl-region-after">
   <fo:block>region-after</fo:block>
  </fo:static-content>

  <fo:flow flow-name="xsl-region-body">
   <fo:block>region-body</fo:block>
  </fo:flow>
 </fo:page-sequence>
</fo:root>
文章位置調整のパラメータは下表・下図のようになっている

Table: region
simple-page-mastermargin-top(1)
margin-left(2)
margin-right(3)
margin-bottom(4)
region-bodymargin-top(5)
margin-left(6)
margin-right(7)
margin-bottom(8)
region-beforeextent(9)
region-startextent(10)
region-endextent(11)
region-afterextent(12)

[FOP]生成した fo ファイルから PDF を生成する

fo ファイル生成で sample_fo.xml というファイルが生成されたので、fop に渡して PDF を生成する。
C:\home\docbook\sample>..\fop-0.95\fop.bat -c ..\fop-0.95\conf\fop.xconf sample.fo sample.pdf
pdf を生成できるように build.xml に追記
Example: build.xml
<taskdef name="fop" classname="org.apache.fop.tools.anttasks.Fop">
  <classpath>
    <pathelement location="../fop-0.95/build/fop.jar"/>
    <fileset dir="../fop-0.95/lib">
      <include name="*.jar"/>
    </fileset>
  </classpath>
</taskdef>

<target name="pdf">
  <xslt basedir="${basedir}"
        destdir="${basedir}"
        style="sample_fo.xsl"
        extension=".fo"
        includes="sample.xml">
    <classpath>
      <pathelement location="${LIBDIR}/xalan.jar"/>
    </classpath>
    <xmlcatalog>
      <dtd publicId="${DOCBOOK_PUBLIC_ID}"
           location="${DOCBOOK_DTD}"/>
    </xmlcatalog>
  </xslt>
  <fop format="application/pdf"
       basedir="${basedir}"
       outdir="${basedir}"
       userconfig="../fop-0.95/conf/fop.xconf"
       messagelevel="debug">
    <fileset dir="${basedir}">
      <include name="*.fo"/>
    </fileset>
  </fop>
</target>
Ant を実行して fo ファイルを生成する
> ant pdf

[FOP]DocBook から PDF を生成する

DocBook から PDF に出力するには以下の手順を踏む
  1. DocBook の XML から fo ファイルを生成する
  2. Apache FOP を使って fo から PDF を生成する


DocBook → fo
Example: 原稿 (sample.xml)
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" >

<article>
  <title>DocBook sample</title>
  <articleinfo>
    <author>
      <firstname>Hoge</firstname>
      <surname>Fuga</surname>
    </author>

    <copyright>
      <year>2009</year>
    </copyright>
  </articleinfo>

  <sect1><title>Hello World</title><para>Hello World</para></sect1>
  <sect1>
    <title>日本語テスト</title>
    <para>日本語が正しく表示されますか?</para>
  </sect1>
  <sect1>
    <title>hoge</title>
    <para>hello</para>
    <sect2>
      <title>hoge2</title>
      <para>hogehoge</para>
    </sect2>
  </sect1>
</article>
Example: fo を生成するための xsl ファイル (sample_fo.xsl)
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version='1.0'>
  <xsl:import href="../docbook-xsl-1.75.0/fo/docbook.xsl"/>
  <xsl:output method="fo" encoding="UTF-8" indent="yes"/>

  <xsl:param name="section.autolabel" select="1"/>
  <xsl:param name="default.encoding" select="'UTF-8'"/>
  <xsl:param name="paper.type" select="'A4'"/>
  <xsl:param name="draft.mode" select="'no'"/>
  <xsl:param name="hyphenate">false</xsl:param>
  <xsl:param name="callout.graphics.extension" select="'.gif'"/>
  <xsl:param name="title.font.family" select="'Meiryo'"/>
  <xsl:param name="body.font.family" select="'Meiryo'"/>
  <xsl:param name="sans.font.family" select="'Meiryo'"/>
  <xsl:param name="monospace.font.family" select="'Meiryo'"/>
</xsl:stylesheet>
fo を生成するためのルールを build.xml に記述
Example: build.xml
<project name="docbooktest" basedir="." default="xslt">
  <property name="DOCBOOK_DTD" value="../docbook-xml-4.5/docbookx.dtd"/>
  <property name="DOCBOOK_PUBLIC_ID" value="-//OASIS//DTD DocBook XML V4.5//EN"/>
  <property name="LIBDIR" value="../xalan-j_2_7_1/build"/>

  <target name="fo">
    <xslt basedir="${basedir}"
          destdir="${basedir}"
          style="sample_fo.xsl"
          extension=".fo"
          includes="sample.xml">
      <classpath>
        <pathelement location="${LIBDIR}/xalan.jar"/>
      </classpath>
      <xmlcatalog>
        <dtd publicId="${DOCBOOK_PUBLIC_ID}"
             location="${DOCBOOK_DTD}"/>
      </xmlcatalog>
    </xslt>
  </target>
</project>
Ant を実行して fo ファイルを生成する
> ant fo

[FOP]region-body margin

XSL ファイルの fo:region-body margin の値を変更してみる
<fo:simple-page-master master-name="A4">
  <fo:region-body margin="0cm"/>
</fo:simple-page-master>
左が margin="2cm" の場合、右が margin="0cm" の場合

[FOP]日本語対応

fop.jar 内にある org.apache.fop.fonts.apps.TTFReader を実行すると下記のように org.apache.commons.logging.LogFactory クラスが見つからないとエラーが出る
> java -cp c:\usr\share\java\build\fop.jar org.apache.fop.fonts.apps.TTFReader
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
この場合は java\lib 内に commons-logging-1.0.4.jar があるのでクラスに指定して実行する。
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar org.apache.fop.fonts.apps.TTFReader
TTF Reader for Apache FOP 1.0

java org.apache.fop.fonts.apps.TTFReader [options] fontfile.ttf xmlfile.xml

where options can be:
-d  Debug mode
-q  Quiet mode
-enc ansi
    With this option you create a WinAnsi encoded font.
    The default is to create a CID keyed font.
    If you're not going to use characters outside the
    pdfencoding range (almost the same as iso-8889-1)
    you can add this option.
-ttcname <fontname>
    If you're reading data from a TrueType Collection
    (.ttc file) you must specify which font from the
    collection you will read metrics from. If you read
    from a .ttc file without this option, the fontnames
    will be listed for you.
 -fn <fontname>
    default is to use the fontname in the .ttf file, but
    you can override that name to make sure that the
    embedded font is used (if you're embedding fonts)
    instead of installed fonts when viewing documents
    with Acrobat Reader.
commons.logging も指定してメイリオフォントを読み込ませるようにすると、次は org.apache.commons.io.IOUtils クラスが見つからないとエラーが出る
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar org.apache.fop.fonts.apps.TTFReader c:\WINDOWS\Fonts\meiryo.ttc meiryo.xml
TTF Reader for Apache FOP 1.0

Parsing font...
Reading c:\WINDOWS\Fonts\meiryo.ttc...
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/IOUtils
この場合は java\lib 内に commons-io-1.3.1.jar があるのでクラスに指定して実行する。
commons.io も指定すると TTFReader が動作するようになる。ここでは ttcname オプションを指定していないのでエラーが発生しているが、meiryo.ttc ファイルに含まれるフォント名が "Meiryo", "Meiryo Italic" の 2 つであることが分かる。
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar;c:\usr\share\java\lib\commons-io-1.3.1.jar org.apache.fop.fonts.apps.TTFReader c:\WINDOWS\Fonts\meiryo.ttc meiryo.xml
TTF Reader for Apache FOP 1.0

Parsing font...
Reading c:\WINDOWS\Fonts\meiryo.ttc...
This is a TrueType collection file with 2 fonts
Containing the following fonts:
Meiryo
Meiryo Italic
Error while building XML font metrics file.
java.lang.IllegalArgumentException: For TrueType collection you must specify which font to select (-ttcname)
ttcname オプションで "Meiryo" を選択すると org.apache.xmlgraphics.fonts.Gryphs クラスが見つからないとエラーが出る
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar;c:\usr\share\java\lib\commons-io-1.3.1.jar org.apache.fop.fonts.apps.TTFReader -ttcname "Meiryo" c:\WINDOWS\Fonts\meiryo.ttc meiryo.xml
TTF Reader for Apache FOP 1.0

Parsing font...
Reading c:\WINDOWS\Fonts\meiryo.ttc...
This is a TrueType collection file with 2 fonts
Containing the following fonts:
Meiryo <-- selected
Meiryo Italic
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlgraphics/fonts/Glyphs
この場合は java\lib 内に xmlgraphics-commons-1.3.1.jar があるのでクラスに指定して実行する
これで meriyo.ttc から meiryo.xml が生成できた
> java -cp c:\usr\share\java\build\fop.jar;c:\usr\share\java\lib\commons-logging-1.0.4.jar;c:\usr\share\java\lib\commons-io-1.3.1.jar;c:\usr\share\java\lib\xmlgraphics-commons-1.3.1.jar org.apache.fop.fonts.apps.TTFReader -ttcname "Meiryo" c:\WINDOWS\Fonts\meiryo.ttc meiryo.xml
TTF Reader for Apache FOP 1.0

Parsing font...
Reading c:\WINDOWS\Fonts\meiryo.ttc...
This is a TrueType collection file with 2 fonts
Containing the following fonts:
Meiryo <-- selected
Meiryo Italic
Font Family: [メイリオ, Meiryo]
Creating xml font file...
Creating CID encoded metrics...
Writing xml font file meiryo.xml...
This font contains no embedding license restrictions.

XML font metrics file successfully created.
Apache FOP を展開したディレクトリ以下の conf ディレクトリにある fop.xconf ファイルを開いてメイリオフォントの情報を追加する。<render mime="application/pdf"> 要素内の <fonts> 以下に使用するフォントを登録する。
<font metrics-url="file:///c:/usr/share/java/conf/meiryo.xml" kerning="yes" embed-url="file:///C:/WINDOWS/Fonts/meiryo.ttc">
  <font-triplet name="Meiryo" style="normal" weight="normal"/>
  <font-triplet name="Meiryo" style="normal" weight="bold"/>
</font>
上で生成した meiryo.xml も conf ディレクトリに置く
PDF 化するデータ (hello.fo) を準備
Example: hello.fo
<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <fo:layout-master-set>
      <fo:simple-page-master master-name="simple">
         <fo:region-body margin-top="3cm"/>
         <fo:region-before extent="3cm"/>
         <fo:region-after extent="3cm"/>
      </fo:simple-page-master>
   </fo:layout-master-set>

   <fo:page-sequence master-reference="simple">
      <fo:flow flow-name="xsl-region-body">
         <fo:block font-family="Meiryo" font-weight="normal" font-style="normal" font-size="18pt" text-align="center">
            こんにちは
         </fo:block>
      </fo:flow>
   </fo:page-sequence>
</fo:root>
PDF に変換する
c オプションで使用する conf ファイルを指定し、上記の hello.fo を PDF に変換する
>..\fop-0.95\fop.bat -c ..\fop-0.95\conf\fop.xconf hello.fo hello.pdf
2009/05/19 11:24:57 org.apache.fop.apps.FopFactoryConfigurator configure
情報: Default page-height set to: 11in
2009/05/19 11:24:57 org.apache.fop.apps.FopFactoryConfigurator configure
情報: Default page-width set to: 8.26in
2009/05/19 11:24:58 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: This is a TrueType collection file with 2 fonts
2009/05/19 11:24:58 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Containing the following fonts:
2009/05/19 11:24:58 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Meiryo <-- selected
2009/05/19 11:24:58 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Meiryo Italic
生成した PDF ファイルで正しく日本語が表示されていれば成功

XSL でフォントを指定する場合
Example: pdf_jp.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output encoding="utf-8" indent="yes"/>
    <xsl:template match="/">
       <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" language="ja">
            <fo:layout-master-set>
                <fo:simple-page-master master-name="A4">
                    <fo:region-body margin="2cm"/>
                </fo:simple-page-master>
            </fo:layout-master-set>

            <xsl:apply-templates/>
        </fo:root>
    </xsl:template>

    <xsl:template match="/article">
        <fo:page-sequence master-reference="A4">
            <fo:flow flow-name="xsl-region-body">
                <xsl:apply-templates select="./info/title"/>
                <xsl:apply-templates select=".//para"/>
            </fo:flow>
         </fo:page-sequence>
    </xsl:template>

    <xsl:template match="//info/title">
        <fo:block font-family="Meiryo" font-weight="normal" font-style="normal" font-size="20pt"><xsl:apply-templates/></fo:block>
    </xsl:template>

    <xsl:template match="//para">
        <fo:block font-family="Meiryo" font-weight="normal" font-style="normal" font-size="10.5pt"><xsl:apply-templates/></fo:block>
    </xsl:template>
</xsl:stylesheet>
info - title, para 要素に対して font-family=Meiryo, font-weight=normal, font-style=normal を指定している
原稿となる XML ファイル (sample_pdf_jp.xml)
Example: sample_pdf_jp.xml
<?xml version="1.0" encoding="UTF-8"?>
<article version="5.0">
  <info>
    <title>Sample</title>
  </info>

  <para>Hello World</para>
  <para>こんにちは</para>
</article>
fop を使用して PDF 出力する
> c:\usr\share\java\fop.bat -c c:\usr\share\java\conf\fop.xconf -xml sample_pdf_jp.xml -xsl pdf_jp.xsl sample_jp.pdf
2011/04/13 13:53:14 org.apache.fop.apps.FopFactoryConfigurator configure
情報: Default page-height set to: 11in
2011/04/13 13:53:14 org.apache.fop.apps.FopFactoryConfigurator configure
情報: Default page-width set to: 8.26in
2011/04/13 13:53:15 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: This is a TrueType collection file with 2 fonts
2011/04/13 13:53:15 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Containing the following fonts:
2011/04/13 13:53:15 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Meiryo <-- selected
2011/04/13 13:53:15 org.apache.fop.fonts.truetype.TTFFile checkTTC
情報: Meiryo Italic
参考: Apache FOPでPDF
参考: Apache FOP: Fonts

[FOP]動作確認

pdf 化する XML ファイルを作成
Example: hello.xml
<?xml version="1.0" encoding="UTF-8"?>
<article version="5.0">
  <info>
    <title>Sample</title>
  </info>

  <para>Hello World</para>
</article>
XSL ファイルを作成
Example: pdf.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output encoding="utf-8" indent="yes"/>
    <xsl:template match="/">
       <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            <fo:layout-master-set>
                <fo:simple-page-master master-name="A4">
                    <fo:region-body margin="2cm"/>
                </fo:simple-page-master>
            </fo:layout-master-set>

            <xsl:apply-templates/>
        </fo:root>
    </xsl:template>

    <xsl:template match="/article">
        <fo:page-sequence master-reference="A4">
            <fo:flow flow-name="xsl-region-body">
                <xsl:apply-templates select="./info/title"/>
                <xsl:apply-templates select=".//para"/>
            </fo:flow>
         </fo:page-sequence>
    </xsl:template>

    <xsl:template match="//info/title">
        <fo:block font-size="20pt"><xsl:apply-templates/></fo:block>
    </xsl:template>

    <xsl:template match="//para">
        <fo:block font-size="10.5pt"><xsl:apply-templates/></fo:block>
    </xsl:template>
</xsl:stylesheet>
Table: FOP コマンドのオプション
引数意味
-fo infilexsl:fo input file
-xml infilexml input file, -xsl と一緒に使用すること
-xsl stylesheetxslt stylesheet
-awt出力結果をディスプレイに表示
-pdf outfilePDF ファイルを生成
-foout outfileXSL-FO ファイルを生成する
参考: DocBookで文系論文を書いてみる 1日目

PDF に変換する
>..\fop-0.95\fop.bat -xsl pdf.xsl -xml sample_pdf.xml -pdf sample.pdf


XML, XSL から FO ファイルを生成
>..\fop-0.95\fop.bat -xsl pdf.xsl -xml sample_pdf.xml -pdf -foout sample.fo
生成された FO ファイル
<?xml version="1.0" encoding="utf-8"?><fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="A4">
<fo:region-body margin="2cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A4">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="10.5pt">Hello World</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>

[FOP]インストール

Apache FOP を入れて XML → PDF が生成できる環境を整える
  1. Apache FOP: Downloading A Distribution からバイナリをダウンロードする
  2. ダウンロードしたファイルを解凍する


LinuxMint12 へのインストール
  1. Menu -> その他 -> ソフトウェアの管理
  2. 右上の検索窓に fop と入力
  3. fop を選択
  4. [インストール] ボタンを押す

[CakePHP][pChart]pChart を使用してグラフを描く

pChart を利用して棒グラフとレーダーチャートを描く。
Example: views の exam_all.ctp
<body>
<table>
  <tr>
    <th>Name</th>
    <th>Math</th>
    <th>English</th>
    <th>Physics</th>
  </tr>
  <?php
 foreach ($users as $user) {
  echo "<tr>\n";
  echo "<td>" . $user['User']['username'] . "</td>\n";
  echo "<td>" . $user['Exam']['math'] . "</td>\n";
  echo "<td>" . $user['Exam']['english'] . "</td>\n";
  echo "<td>" . $user['Exam']['physics'] . "</td>\n";
  echo "</tr>\n";
 }
  ?>
</table>
<img src="exam_all_graph" />
<img src="exam_all_radar" />
</body>
Example: exams_controller.php
function exam_all() {
 $users = $this->User->find('all');

 $this->set('users', $users);
 Cache::write('users', $users);
}

function exam_all_graph() {
 /* pChart を使用する */
 App::import('Vendor', 'pchart/pdata');
 App::import('Vendor', 'pchart/pchart');

 $font_path = "c:\Windows\Fonts\sazanami-gothic.ttf";

 /* Cache に保存された値を読み込む */
 $users = Cache::read('users');
 if ($users == false) {
  /* DB から値を取得 */
  $users = $this->User->find('all');
 }
 else {
  /* exam_all_radar() でも使用するので cache を削除しない */
 }

 $mathScore = array();
 $englishScore = array();
 $physicsScore = array();
 $name = array();

 foreach ($users as $user) {
  array_push($mathScore, $user['Exam']['math']);
  array_push($englishScore, $user['Exam']['english']);
  array_push($physicsScore, $user['Exam']['physics']);
  array_push($name, $user['User']['username']);
 }

 $data = new pData;
 $data->AddPoint($mathScore, "math");
 $data->AddPoint($englishScore, "english");
 $data->AddPoint($physicsScore, "physics");
 $data->AddPoint($name, "name");
 $data->AddSerie("math");
 $data->AddSerie("english");
 $data->AddSerie("physics");
 $data->SetAbsciseLabelSerie("name");
 $data->SetSerieName("数学", "math");
 $data->SetSerieName("英語", "english");
 $data->SetSerieName("物理", "physics");

 $chart = new pChart(700, 230);
 $chart->setFontProperties($font_path,8);
 $chart->setGraphArea(50, 30, 680, 200);

 /* グラフに背景色をつける */
 $chart->drawFilledRoundedRectangle(7,7,693,223,5,240,240,240);

 /* グラフ背景に縁をつける */
 $chart->drawRoundedRectangle(5,5,695,225,5,230,230,230);

 /* グラフ領域に背景色をつける */
 $chart->drawGraphArea(255,255,255,TRUE);

 $chart->drawScale($data->GetData(),$data->GetDataDescription(),SCALE_START0,150,150,150,TRUE,0,2,TRUE);

 /* グリッド線を表示する */
 $chart->drawGrid(4,TRUE,230,230,230,50);

 /* chart に data を配置しグラフを描く */
 /* 棒グラフの場合は drawBarGraph */
 $chart->drawBarGraph($data->GetData(), $data->GetDataDescription(), TRUE);

 /* 凡例を追加する */
 $chart->setFontProperties($font_path,8);
 $chart->drawLegend(596,150,$data->GetDataDescription(),255,255,255);

 /* グラフタイトルを追加する */
 $chart->setFontProperties($font_path,10);
 $chart->drawTitle(50,22,"テスト結果",50,50,50,585);

 /* 画像として出力する */
 $chart->Stroke();
}

function exam_all_radar() {
 /* pChart を使用する */
 App::import('Vendor', 'pchart/pdata');
 App::import('Vendor', 'pchart/pchart');

 $font_path = "c:\Windows\Fonts\sazanami-gothic.ttf";

 /* Cache に保存された値を読み込む */
 $users = Cache::read('users');
 if ($users == false) {
  /* DB から値を取得 */
  $users = $this->User->find('all');
 }
 else {
  Cache::delete('users');
 }

 $scores = array();
 $name = array();

 foreach ($users as $user) {
  $score = array();
  $username = $user['User']['username'];
  array_push($score, $user['Exam']['math']);
  array_push($score, $user['Exam']['english']);
  array_push($score, $user['Exam']['physics']);
  $scores[$username] = $score;
  array_push($name, $username);
 }

 $data = new pData;
 $i = 0;
 foreach ($name as $username) {
  $data->AddPoint($scores[$username], "serie" . $i);
  $data->AddSerie("serie" . $i);
  $data->SetSerieName($username, "serie" . $i);
  $i++;
 }
 $data->AddPoint(array("math", "english", "physics"), "subject");
 $data->SetAbsciseLabelSerie("subject");

 $chart = new pChart(400, 400);
 $chart->setFontProperties($font_path,8);
 $chart->setGraphArea(30, 30, 370, 370);

 /* グラフに背景色をつける */
 $chart->drawFilledRoundedRectangle(7,7,393,393,5,240,240,240);

 /* グラフ背景に縁をつける */
 $chart->drawRoundedRectangle(5,5,395,395,5,230,230,230);

 /* chart に data を配置しグラフを描く */
 /* レーダーチャート */
 $chart->drawRadarAxis($data->GetData(), $data->GetDataDescription(), TRUE, 20, 120, 120, 120, 230, 230);
 $chart->drawFilledRadar($data->GetData(), $data->GetDataDescription(), 50, 20);

 /* 凡例を追加する */
 $chart->setFontProperties($font_path,8);
 $chart->drawLegend(15, 15, $data->GetDataDescription(), 255, 255, 255);

 /* グラフタイトルを追加する */
 $chart->setFontProperties($font_path,10);
 $chart->drawTitle(0,22,"テスト結果",50,50,50,400);

 /* 画像として出力する */
 $chart->Stroke();
}

[CakePHP][pChart]CakePHP で pChart を使う

app/vendors に pchat ディレクトリを作成し、その下に pCache.class, pChart.class, pData.class を配置する。ここで拡張子の class を php に変更することで pChart のモジュールが読み込めるようになる。
function exam_graph() {
 /* pChart を使用する */
 App::import('Vendor', 'pchart/pdata');
 App::import('Vendor', 'pchart/pchart');

 $font_path = "c:\Windows\Fonts\sazanami-gothic.ttf";

 /* Cache に保存された値を読み込む */
 $users = Cache::read('users');
 $total = Cache::read('total');

 Cache::delete('users');
 Cache::delete('total');

 $y1data = array();
 $a = array();

 foreach ($users as $user) {
  array_push($y1data, $user['Exam']['math']);
  array_push($a, $user['User']['username']);
 }

 $data = new pData;
 $data->AddPoint($y1data, "math");
 $data->AddPoint($a, "date");
 $data->AddSerie("math");
 $data->SetAbsciseLabelSerie("date");
 $data->SetSerieName("数学", "math");

 $chart = new pChart(700, 230);
 $chart->setFontProperties($font_path,8);
 $chart->setGraphArea(50, 30, 680, 200);
 $chart->drawScale($data->GetData(),$data->GetDataDescription(),SCALE_NORMAL,150,150,150,TRUE,0,2,TRUE);

 /* chart に data を配置しグラフを描く */
 /* 棒グラフの場合は drawBarGraph */
 $chart->drawBarGraph($data->GetData(), $data->GetDataDescription(), TRUE);

 /* 画像として出力する */
 $chart->Stroke();
}

2013年5月5日日曜日

[pChart]レーダーチャート

レーダーチャートの軸を描く
$chart->drawRadarAxis($data->GetData(), $data->GetDataDescription(), TRUE, 20, 120, 120, 120, 230, 230);
void pChart::drawRadarAxis($Data,$DataDescription,$Mosaic=TRUE,$BorderOffset=10,$A_R=60,$A_G=60,$A_B=60,$S_R=200,$S_G=200,$S_B=200,$MaxValue=-1);
Table: drawRadarAxis
Parameter説明
$Dataプロットするデータ
$DataDescriptionプロットするデータの Data Description
$MosaicFALSE の場合は網領域が灰色に塗られない
$BorderOffsetグラフ境界からのオフセット値 (px 単位)
$A_R軸色 (R)
$A_G軸色 (G)
$A_B軸色 (B)
$S_R網色 (R)
$S_G網色 (G)
$S_B網色 (B)
$MaxValue最大値
  • $BorderOffset = 0 の場合
    $chart->drawRadarAxis($data->GetData(), $data->GetDataDescription(), TRUE, 0, 120, 120, 120, 230, 230);
  • $BorderOffset = 50 の場合
    $chart->drawRadarAxis($data->GetData(), $data->GetDataDescription(), TRUE, 50, 120, 120, 120, 230, 230);
  • $A_R = 255, $A_G = 0, $A_B = 0 の場合
    $chart->drawRadarAxis($data->GetData(), $data->GetDataDescription(), TRUE, 20, 255, 0, 0, 230, 230);
  • $S_R = 0, $S_G = 255, $S_B = 0 の場合
    $chart->drawRadarAxis($data->GetData(), $data->GetDataDescription(), TRUE, 20, 120, 120, 120, 0, 255, 0);


レーダーチャートを描く(線)
$chart->drawRadar($data->GetData(), $data->GetDataDescription, 20);
void pChart::drawRadar($Data,$DataDescription,$BorderOffset=10,$MaxValue=-1);
Table: drawRadar
Parameter説明
$Dataプロットするデータ
$DataDescriptionプロットするデータの Data Description
$BorderOffsetグラフ境界からのオフセット値 (px 単位)
$MaxValue最大値
$BorderOffset と $MaxValue は drawRadarAxis() で設定した値と同じにすること。

レーダーチャートを描く(塗りつぶし)
$chart->drawFilledRadar($data->GetData(), $data->GetDataDescription(), 50, 20);
void pChart::drawFilledRadar($Data,$DataDescription,$Alpha=50,$BorderOffset=10,$MaxValue=-1);
Table: drawFilledRadar
Parameter説明
$Dataプロットするデータ
$DataDescriptionプロットするデータの Data Description
$Alpha透過度 (下図参照)
$BorderOffsetグラフ境界からのオフセット値 (px 単位)
$MaxValue最大値
$BorderOffset と $MaxValue は drawRadarAxis() で設定した値と同じにすること。
  • $Alpha = 90 の場合
    $chart->drawFilledRadar($data->GetData(), $data->GetDataDescription(), 90, 20);

[pChart]装飾

凡例 (Legend) を追加する
グラフを描画する前に pChart::drawLegend() で凡例を追加する。
凡例に表示される文字列は以下のようにすると割り当てた名前が表示される。
$data = new pData;
$data->SetSerieName("数学", "math");
$font_path = "c:\Windows\Fonts\sazanami-gothic.ttf";

/* 凡例を追加する */
$chart->setFontProperties($font_path,8);
$chart->drawLegend(596,150,$data->GetDataDescription(),255,255,255);

$chart->Stroke();
void pChart::drawLegend($XPos, $YPos, $DataDescription, $R, $G, $B, $Rs=-1, $Gs=-1, $Bs=-1, $Rt=0, $Gt=0, $Bt=0, $Border=FALSE);
Table: drawLegend
Parameter説明
$XPos凡例の X 位置
$YPos凡例の Y 位置
$DataDescription表示する判例の DataDescription
$R背景色 (R)
$G背景色 (G)
$B背景色 (B)
$Rs=-1影色 (R)
$Gs=-1影色 (G)
$bs=-1影色 (B)
$Rt=0文字色 (R)
$Gt=0文字色 (G)
$Bt=0文字色 (B)
$Border=FALSE境界線


タイトルを追加する
グラフを描画する前に pChart::drawTitle() でグラフのタイトルを追加する。
$font_path = "c:\Windows\Fonts\sazanami-gothic.ttf";

/* グラフタイトルを追加する */
$chart->setFontProperties($font_path,10);
$chart->drawTitle(50,22,"数学のテスト結果",50,50,50,585);

$chart->Stroke();
void pChart::drawTitle($XPos, $YPos, $Value, $R, $G, $B, $XPos2=-1, $YPos2=-1, $Shadow=FALSE);
Table: drawTitle
Parameter説明
$XPosタイトルの X 左上位置
$YPosタイトルの Y 左上位置
$Value表示する文字列
$R文字色 (R)
$G文字色 (G)
$B文字色 (B)
$XPos2タイトルの X 右下位置、タイトルは $XPos との水平中心に配置される
$YPos2タイトルの Y 右下位置、タイトルは $YPos との垂直中心に配置される
$Shadow文字の影


グラフ領域の見た目を変更する
  • グラフに背景色をつける pChart::drawFilledRoundedRectangle() でグラフに背景色 (コーナーに丸みあり) をつける。
    /* グラフに背景色をつける */
    $chart->drawFilledRoundedRectangle(7,7,693,223,5,240,240,240);
    void pChart::drawFilledRoundedRectangle($X1, $Y1, $X2, $Y2, $Radius, $R, $G, $B);
    Table: drawFilledRoundedRectangle
    Parameter説明
    $X1左上 X 座標
    $Y1左上 Y 座標
    $X2右下 X 座標
    $Y2右下 Y 座標
    $Radiusコーナーの曲がり具合 (半径)
    $R塗りつぶし色 (R)
    $G塗りつぶし色 (G)
    $B塗りつぶし色 (B)
  • グラフ背景に縁をつける
    pChart::drawRoundedRectangle() でグラフ背景に縁 (コーナーに丸みあり) をつける。
    /* グラフ背景に縁をつける */
    $chart->drawRoundedRectangle(5,5,695,225,5,230,230,230);
    void pChart::drawRoundedRectangle($X1, $Y1, $X2, $Y2, $Radius, $R, $G, $B);
    Table: drawRoundedRectangle
    Parameter説明
    $X1左上 X 座標
    $Y1左上 Y 座標
    $X2右下 X 座標
    $Y2右下 Y 座標
    $Radiusコーナーの曲がり具合 (半径)
    $R線色 (R)
    $G線色 (G)
    $B線色 (B)
  • グラフ領域に背景色をつける
    @Chart::drawGraphArea() でグラフ領域に背景色をつける。
    /* グラフ領域に背景色をつける */
    $chart->drawGraphArea(255,255,255,TRUE);
    void pChart::drawGraphArea($R,$G,$B,$Stripe=FALSE);
    Table: drawGraphArea
    Parameter説明
    $R塗りつぶし色 (R)
    $G塗りつぶし色 (G)
    $B塗りつぶし色 (B)
    $Stripe45 度のストライプ線で背景色を塗る
  • グリッド線を表示する
    /* グリッド線を表示する */
    $chart->drawGrid(4,TRUE,230,230,230,50);
    void pChart::drawGrid($LineWidth,$Mosaic=TRUE,$R=220,$G=220,$B=220,$Alpha=255);
    Table: drawGrid
    Parameter説明
    $LineWidthグリッド線の太さ
    $MosaicTRUE の場合 2 ラインごとに背景色が変更されモザイク状になる (下図参照)
    $Rグリッド色 (R)
    $Gグリッド色 (G)
    $Bグリッド色 (B)
    $Alphaモザイクエリアの透過度
    $Mosaic=FALSE の場合