# -*- 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')
2013年6月16日日曜日
[Python][matplotlib]区間横棒グラフ
0 から開始ではなく途中からの横棒グラフを描くには broken_barh() を使う
[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 していく
4 つ載せる場合
# -*- 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 描画の方法を指定する。
numpy で生成した数列をグラフ化
Sine curve を描く
# -*- 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
Fedora
yum でインストール
動作確認
ここで Atcive Tcl を ActiveTcl Downloads - Tcl for Windows, Linux and Mac | ActiveState からダウンロード、インストールすると tkagg backend でも実行可能となる。
- Numerical Python - Browse /NumPy/1.5.1 at SourceForge.net から numpy-1.5.1-win32-superpack-python2.7.exe をダウンロードしてインストールする
- 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 に以下を記述
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 が使えるようにする
インストール
また、最終行の global-set-key で「半角/全角 漢字」キーによっても 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 に以下を追加する
ファイル名の文字コードを指定するには .emacs に以下を追加する
(setq file-name-coding-system 'utf-8-unix)
[Emacs]migemo
インストール
未完了
未完了
- migemo からダウンロード
- Ruby が必要なので Ruby をインストールする
- Ruby/Romkan を Ruby/Romkan からダウンロード
- Ruby/Bsearch を Ruby/Bsearch からダウンロードする
- Romkan と Bsearch を C:\usr\ruby\lib\ruby\site_ruby にコピー
- SKK-JISYO を SKK 辞書 からダウンロードする
- SKK-JISYO.L を migemo ディレクトリにコピー
- genchars.sh でエラーとなってしまう
> ./configure --with-emacs=emacs > make > make install
- C/Migemo を KaoriYa からダウンロード
- ダウンロードしたファイルを解凍する
- c:\usr\emacs\bin に migemo.dll を移動
- c:\usr\emacs に dict ディレクトリを移動
[Emacs]APEL
インストール
- APEL からダウンロード
- ダウンロードしたファイルを解凍し、makeit.bat を編集する
set PREFIX=c:\usr\emacs set EMACS=%PREFIX%\bin\emacs.exe set LISPDIR=%PREFIX%\site-lisp set DEFAULT_MAKE_ARG=elc
- コンパイル
> makeit.bat
- インストール
> makeit.bat install
[Emacs]sqlite-dump
インストール
動作確認
- sqlite-dump から sqlite-dump.el をダウンロードする
- .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))
動作確認
- テストファイル作成
> 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
- 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;
- 項目を追加
INSERT INTO "test" VALUES(4,'Sapporo');
- コマンドラインで確認
> 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
インストール
操作方法
Table: twittering-mode キーバインド
- twittering-mode から twittering-mode.el をダウンロードする
- trunk/twittering-mode.el のページに行き、一番下にある Download in other formats: Original Format からダウンロードできる。
- ダウンロードした twittering-mode.el を site-lisp の下に移動する
- .emacs に以下を追記
;;; ===== twittering-mode ===== (require 'twittering-mode) (setq twittering-username "ユーザ名") (setq twittering-password "パスワード")
- twittering-mode 開始
M-x twittering-mode
操作方法
Table: twittering-mode キーバインド
キーバインド | コマンド | 機能 |
C-c C-f | twittering-friends-timeline | フレンドタイムラインを表示 |
C-c C-s | twittering-update-status-interactive | つぶやきをポストする |
i | twittering-icon-mode | アイコンモード、テキストモードの toggle |
[Emacs]simple-hatena-mode
必要なもの
インストール
設定
.emacsに以下を追加
メモ
パスワード入力プロンプトが出てくるとのことだったが、どうしてもログインに失敗していた。~/.hatena/ユーザ名 /diary/config.txtにパスワードを記入すると投稿が可能となった。
- Perl
- はてなダイアリーライター はてなダイアリーライター(略称:はてダラ)
- simple-hatena-mode.el: simple-hatena-mode - Emacsのsimple-hatena-mode.el のインストールを参照
インストール
- site-lisp以下にsimple-hatena-modeというディレクトリを作る
- はてなダイアリーライターをhw.plで保存し、simple-hatena-modeディレクトリに置く
- 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 対応をインストール
動作確認
使用例
en-coding - Project Hosting on Google Code の Emacs 対応をインストール
- EmacsWiki: Zen Coding から zencoding-mode.el をダウンロードする。
- emacs\site-lisp に zencoding-mode.el を置く。
- .emacs に以下を追加
;;; ===== zen-coding === (require 'zencoding-mode) (add-hook 'nxml-mode-hook 'zencoding-mode)
動作確認
div#name.oneと入力して Ctrl + Enter を押すと下記のように変換される。
<div id="name" class="one"> </div>
使用例
a
ここで Ctrl + Enter を押すと<a></a>
html>(head>title)+body
ここで Ctrl + Enter を押すと<html> <head> <title> </title> </head> <body> </body> </html>
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 を使う
- Artistic Style - Index の Download から AStyle_1.24_windows.zip (2010/10/14 現在) をダウンロードする。
- PATH の通った場所に解凍したファイル内にある AStyle.exe を移動する。
- .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 ) )
- バッファを選択して M-x astyle-this-buffer を実行すると astyle.exe に渡す option を聞かれるので入力する。
[Emacs]org-mode
インストール
- Org からダウンロード
- ダウンロードしたファイルを解凍し、c:/usr/emacs 以下に置く
- org-6.13a ディレクトリ内で make を実行する
- .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 に以下を追加する
Table: nXML mode 設定の内容
Schema を設定
emacs/etc/schema に schema ファイルがある
Table: Schema ファイル操作
操作方法
Table: nXML mode 操作方法
初期設定
.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-mode | t:インデントはタブで行う, nil:インデントはスペースで行う |
tab-width | タブ幅 2 |
define-key nxml-mode-map "\r" 'newline-and-indent | Enter キーを押すと改行 + インデントが行われるようにする |
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 でのコンパイルをしてみた。
備考
22.2.1 で使用していた .emacs にある以下のものが使用できなくなっていたが、まずは起動できた
Emacs 23.1 の IME patch を当てる
Emacs 23.1 が 2009/7/29 にリリースされたので Windows でのコンパイルをしてみた。
- Emacs のソースファイルを Index of /gnu/emacs からダウンロードする
- MinGW (Automated MinGW Installer) を MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net からダウンロードする
- MinGW のインストーラを実行しパッケージをフルインストールする
- MSYS Base System を MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net からダウンロードする
- MSYS のインストーラを実行する
- GnuWin32 Packages から必要となるライブラリをダウンロード・インストールする。それぞれ Setup パッケージをインストールすればライブラリ、ヘッダファイルがインストールできる。
必要となるライブラリは以下のもの。- Xpm
- LibPng
- Zlib
- LibUnGif
- LibJpeg
- LibTiff
- Cygwin など他の実行ファイルが呼び出されないように MinGW, MSYS のみの PATH にしておく
> set PATH=C:\usr\MinGW\bin;c:\usr\msys\bin
- ダウンロードした Emacs のソースファイルを展開する
- 展開した 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.
- 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'
- mingw32-make.exe install を実行すると bin ディレクトリが生成され、そこに runemacs.exe が作成される
- 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 を当てる
- NTEmacs JP Project プロジェクト日本語トップページ - SourceForge.JP から Emacs-23.1-IME.patch.gz をダウンロードする
- emacs-23.1 を解凍したディレクトリのルート (INSTALL, COPYING, README などがあるディレクトリ) に Emacs-23.1-IME.patch を置く
- 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
- nt ディレクトリで configure.bat を実行する
> configure.bat --with-gcc --enable-w32-ime --no-cygwin --cflags -D_UNICODE --cflags -DRECONVERSION --prefix=c:/install
RECONVERSION フラグを付けてコンパイルすると入力済み文字列に対して "変換" ボタンを押した時に再変換が可能となる
"_UNICODE" フラグを付けてコンパイルすると Unicode 版を使用可能となる。
"--prefix" でインストール先ディレクトリを指定する - mingw32-make.exe を実行する
mingw32-make.exe bootstrap をしたところで elc ファイルが一旦削除され、その後再度作成される。> mingw32-make.exe bootstrap > mingw32-make.exe info > mingw32-make.exe > mingw32-make.exe install
- .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
Emacs 2.33
Emacs 23.2.1
- 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
関数またはローカル変数をしているすると、その定義の箇所に飛ぶ。
- M-x semantic-ia-complete-symbol
[Emacs]DocBook XML モード
- 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 をダウンロードする
- ダウンロードしたファイルを解凍し、emacs/site-lisp 以下に置く
- .emacs に以下を追記
;;; ===== DocBook XML ===== (load "docbook-xml-mode.el")
- 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 を使う
Windows XP で動作させた場合
Fedora13 で動作させた場合
matplotlib で日本語フォントを使う場合、Windows と Linux ではフォントの指定先が異なるので次のように分ける。
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 モジュールを使う
出力結果 (test.log)
ログレベルを設定, ログファイルに追記する場合
出力結果 (test.log)
# -*- 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
インストール
Search
Upload
スクリプトを実行すると Upload を許可しても良いかの確認画面が表示される
- 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
- Sign in to Yahoo! から API Key と Secret code を入手する
- 自分のページから 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() を使う
実行結果
ディレクトリ削除
ディレクトリ削除には os モジュールの rmdir() を使う
実行結果
ディレクトリ内のファイル走査
ディレクトリ作成には 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)
Example: csv ファイル (tokyo2010.csv)
実行結果
CSV ファイルへの出力
Example: CSV への出力スクリプト (test01.py)
出力結果
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 を操作して出力結果の違いを見てみる。
標準
文章全体の上下 margin を調整
次の指定を xsl に追加
本文上下の margin を調整
次の指定を xsl に追加
本文左右の margin を調整
次の指定を xsl に追加
段落の開始位置 左 margin を調整
次の指定を xsl に追加
Table of Contents, List of Figures なし
次の指定を xsl に追加
Header に draft を入れる, Background に draft 画像を貼る
次の指定を xsl に追加
Header, Footer に罫線なし
次の指定を xsl に追加
ページ定義
region
Table: region
<?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-master | margin-top | (1) |
margin-left | (2) | |
margin-right | (3) | |
margin-bottom | (4) | |
region-body | margin-top | (5) |
margin-left | (6) | |
margin-right | (7) | |
margin-bottom | (8) | |
region-before | extent | (9) |
region-start | extent | (10) |
region-end | extent | (11) |
region-after | extent | (12) |
[FOP]生成した fo ファイルから PDF を生成する
fo ファイル生成で sample_fo.xml というファイルが生成されたので、fop に渡して PDF を生成する。
Example: build.xml
C:\home\docbook\sample>..\fop-0.95\fop.bat -c ..\fop-0.95\conf\fop.xconf sample.fo sample.pdfpdf を生成できるように 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 に出力するには以下の手順を踏む
DocBook → fo
Example: 原稿 (sample.xml)
Example: build.xml
- DocBook の XML から fo ファイルを生成する
- 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
[FOP]日本語対応
fop.jar 内にある org.apache.fop.fonts.apps.TTFReader を実行すると下記のように org.apache.commons.logging.LogFactory クラスが見つからないとエラーが出る
commons.io も指定すると TTFReader が動作するようになる。ここでは ttcname オプションを指定していないのでエラーが発生しているが、meiryo.ttc ファイルに含まれるフォント名が "Meiryo", "Meiryo Italic" の 2 つであることが分かる。
これで meriyo.ttc から meiryo.xml が生成できた
PDF 化するデータ (hello.fo) を準備
Example: hello.fo
c オプションで使用する conf ファイルを指定し、上記の hello.fo を PDF に変換する
XSL でフォントを指定する場合
Example: pdf_jp.xsl
原稿となる XML ファイル (sample_pdf_jp.xml)
Example: sample_pdf_jp.xml
参考: Apache FOP: Fonts
> 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
Example: pdf.xsl
参考: DocBookで文系論文を書いてみる 1日目
PDF に変換する
XML, XSL から FO ファイルを生成
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 infile | xsl:fo input file |
-xml infile | xml input file, -xsl と一緒に使用すること |
-xsl stylesheet | xslt stylesheet |
-awt | 出力結果をディスプレイに表示 |
-pdf outfile | PDF ファイルを生成 |
-foout outfile | XSL-FO ファイルを生成する |
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 が生成できる環境を整える
LinuxMint12 へのインストール
- Apache FOP: Downloading A Distribution からバイナリをダウンロードする
- ダウンロードしたファイルを解凍する
LinuxMint12 へのインストール
- Menu -> その他 -> ソフトウェアの管理
- 右上の検索窓に fop と入力
- fop を選択
- [インストール] ボタンを押す
[CakePHP][pChart]pChart を使用してグラフを描く
pChart を利用して棒グラフとレーダーチャートを描く。
Example: views の exam_all.ctp
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]レーダーチャート
レーダーチャートの軸を描く
レーダーチャートを描く(線)
$BorderOffset と $MaxValue は drawRadarAxis() で設定した値と同じにすること。
レーダーチャートを描く(塗りつぶし)
$BorderOffset と $MaxValue は drawRadarAxis() で設定した値と同じにすること。
$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 |
$Mosaic | FALSE の場合は網領域が灰色に塗られない |
$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 | 最大値 |
レーダーチャートを描く(塗りつぶし)
$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 | 最大値 |
[pChart]装飾
凡例 (Legend) を追加する
グラフを描画する前に pChart::drawLegend() で凡例を追加する。
凡例に表示される文字列は以下のようにすると割り当てた名前が表示される。
タイトルを追加する
グラフを描画する前に pChart::drawTitle() でグラフのタイトルを追加する。
グラフ領域の見た目を変更する
グラフを描画する前に 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: drawFilledRoundedRectangleParameter 説明 $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: drawRoundedRectangleParameter 説明 $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: drawGraphAreaParameter 説明 $R 塗りつぶし色 (R) $G 塗りつぶし色 (G) $B 塗りつぶし色 (B) $Stripe 45 度のストライプ線で背景色を塗る - グリッド線を表示する
/* グリッド線を表示する */ $chart->drawGrid(4,TRUE,230,230,230,50);
void pChart::drawGrid($LineWidth,$Mosaic=TRUE,$R=220,$G=220,$B=220,$Alpha=255);
Table: drawGridParameter 説明 $LineWidth グリッド線の太さ $Mosaic TRUE の場合 2 ラインごとに背景色が変更されモザイク状になる (下図参照) $R グリッド色 (R) $G グリッド色 (G) $B グリッド色 (B) $Alpha モザイクエリアの透過度
登録:
投稿 (Atom)