makeでfor文

makeは非常に優秀なツールだ。 一度依存関係を書いておきさえすれば、それにしたがって勝手にコンパイルしてくれる。 しかも一つの言語ともいえるような機能を持っている。 例えば変数を持てる。Makefile中では ARG = value ARG := value の2つの代入の形式がある。 ちょっと複雑なことを使用とするとき、両者の違いは重要だ。 違いは右辺に変数が含まれるときに生じる。 前者は右辺に含まれる変数も代入された変数が評価されるときに初めて評価される。 一方後者では、代入時に右辺値が確定される。 C言語でいえば、前者は引数のない関数の定義、あるいは参照変数に近く、後者は通常の手続きにおける代入に対応する。 さらにmakeの機能にinclude文がある。 include sub.mk とすればsub.mkの中身を今読んでいるMakefileに追加したのち、コンパイルを行ってくれる。 もう一つ、makeには文字列操作に関して非常に強力な組み込みの関数がある。 今回使うのはword,words,wordlistの3つである。 これらはlistの管理を簡単にしてくれる関数である。 list = a b c d $(word 2,$(list)) # b $(words $(list)) # 4 $(wordlist 2,3,$(list)) # b c wordは所定の位置の要素を抜きだし、wordsはlistの長さを返し、wordlistは部分listをつくる。 さて、本題のfor文に取り掛かろう。 種を先にあかしておくと、再帰的にsub.mkを読み込むのである。 幸いにもinclude文は自分自身を読み込むことを拒否しないので、自己再帰的にfor文を構成する。 次のMakefileを見て欲しい。 main.mk:
TARGET = test
LIST = a b c d
all : $(TARGET)
$(TARGET) : subd
    touch $(TARGET)
include sub.mk
sub.mk:
VAR := $(word 1,$(LIST))
LIST := $(wordlist 2,$(words $(LIST)),$(LIST))
sub$(VAR):
    touch $@
ifneq ($(VAR),) # VARが空でなければ真
include sub.mk
endif
依存関係を解決するだけの簡単なMakefileだが、 制御が自己再帰的になっているので読みにくいかもしれない。 ポイントはsub.mkの2行目のLISTを一つずらすところと、 最後のsub.mkからsub.mkをincludeするところである。 LISTの先頭の値をVARに受け取り、LISTは一つ前につめる。 この変数は次のincludeのときにも引き継がれるので、 LISTが空になるまでsubdの生成方法が検索され続ける。 これによりsubdが4回目のincludeの後に発見され、めでたくtestはコンパイルされるのであった。 。。。とまぁ、for文が出来上がったのだが。 なんに使おうかな? これを調べている途中で、
LIST = a.c b.c c.c d.c
$(LIST) : %.c : %.o
    icpc $< -o $@
のような条件付きルールを書く方法を知り、当初の目的が果たせたので、 このfor文は今回必要ないのであった。

LuaTeXについて2(日本語の扱い)

LuaTeXについて2(日本語の扱い) 前回は所々はしょりつつLuaTeXの特徴をあげてみたが、今回は使ってみる。 この記事を書いているArchLinux上のtexlive2011にはLuaTeX 0.70.1が含まれている。 本家のsvnのtagsには0.70.2があるが、とりあえずこれでいいだろう。 LuaTeXではunicodeが使えるので、日本語はデフォルトで通る。 \documentclass{article} \usepackage{fontspec} \setmainfont{IPAGothic} \begin{document} てすと Lua\TeX \end{document} これで通る。しかしながら、改行してくれない。 LuaTeXは欧文と和文を区別せず(これによりフォントの問題もある)、 両者で改行の方針が違うので結局和文ではうまく改行できないのである。 LuaTeXはこの辺をパッケージレベルで実装する方針らしく、 日本語用のパッケージをどこかで見つけてこないといけない。 とりあえず次の2つがある。 ・luajalayout En toi Pythmeni tes TeXnopoleos [電脳世界の奥底にて] によると、とりあえず使う分にはこれが一番完成度が高いとのこと。luajalayout パッケージ ―LuaLaTeX による日本語組版―にて入手可能。 ・LuaTeX-ja 他にもLuaTeX-jaというプロジェクトが進行中らしい。 とりあえず使えるものが最近完成したらしい。今後はこっちに移行するようだ。 さらにLuaTeXではjsarticle等、pTeX用のdocumentclassはそのままでは使えない。 En toi Pythmeni tes TeXnopoleos [電脳世界の奥底にて] にはjsarticleからpTeX用の部分を抜き出したdocumentclassが用意されている。BXjscls パッケージにて入手できる。 これで晴れてLuaTeXで日本語の文章がかける、と思う。 >>3に続く(予定)。 参考にしたHP: En toi Pythmeni tes TeXnopoleos [電脳世界の奥底にて] LuaTeX-ja(仮称)プロジェクト wiki

LuaTeXについて1(非常に基本的なこと)

台風で外出できないため、気になっていたことを調べる。 LuaTeXについて(非常に基本的なこと) 以前どこかで、En toi Pythmeni tes TeXnopoleos [電脳世界の奥底にて] で公開されているプレゼンを見てから気になっていたLuaTeXについて調べる。 どうやら日頃何気なく使っているlatexだが、どうも海外では国内より進んでいるらしい。 latexはとりあえず動かせる程度の知識しかなかったので、せっかくなので調べてみる。 まずはいつも使っているplatexコマンドがなんなのか確認する。 Fedora14に入っているのはyumでいれたtexlive2007のpTeX+LaTeX2e、 自宅のArchLinuxではtexlive2011のe-pTeX+LaTeX2eとなっている。 分けて書いた通り、前者はTeXのエンジン、 つまり.texを解釈して.dviなり.pdfを生成するプログラム、 後者はその上で解釈されるマクロの集合を表す。 pTeXというのはオリジナルのTeXの16bitの拡張でこれがあって初めて日本語が扱える。 これはさらに縦組もできる。このp-はPublishingの意味らしい。 もともとエンコーディングとしてsjis,jis,eucが対応していたが、最近utf-8のコードも扱えるようになった。 e-pTeXは所謂e-TeX拡張をpTeXにマージしたもので、どうやらtexlive2011になって標準に取り込まれるようだ(HPによるとまだ未解決のバグが放置とのこと)。 e-TeX拡張は基本的な機能の拡張で、使えるレジスタやプリミティブが増えたり、右から左に書けるようになった。 これだけ聞いても特に面白くないが、最近はこの拡張を必須とするマクロが増えているらしい。 LaTeX2eはTeX上で動くマクロの集合であって、数式の機能などもこのLaTeX2eによるものである。 どうもLaTeX3が開発中らしい。普段使っている機能は基本的にLaTeX2eのものである。 尚、LaTeXの他にもConTeXtというマクロパッケージがあるそうだ。そのうち調べよう。 さて、今回の本題であるLuaTeXに入る前に海外で主流のpdfTeXについて。 pdfTeXはe-TeX拡張をとりこみ、さらに.texから.pdfに.dviを解さず変換することで、いくつか品質が向上している。 このpdfTeXの後継として開発されているのがLuaTeXである。 LuaTeXでは大幅な改良が見込まれる。 ・unicodeのサポート ・MetaPost ・Lua interpreterの導入 ・フォントに関して これは面白そう!ということで、これについて調査する。 >>2以降に続く。 参考にしたHP: アスキー日本語TeX(pTeX) e-pTeX についての wiki En toi Pythmeni tes TeXnopoleos [電脳世界の奥底にて]

Headerの依存関係を自動処理

自動化は素晴らしい。適切に構築された自動化スクリプトは単調な作業からの開放を約束し、人為的ミスを事前に防ぐ。 ということでコンパイル時の依存関係の解決の自動化である。 結局は偉大な先人のあしあとをたどるだけなのだが、 http://d.hatena.ne.jp/ritchey/20070519/1179595462 ちょっとそのままでは問題が生じたので変更点をメモ。 上サイトから拝借した、
%.d: %.c
        @set -e; $(CC) -MM $(CPPFLAGS) $< \
                | sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@; \
                [ -s $@ ] || rm -f $@
が問題の部分。sedの所が問題で、もしファイル名に/が含まれる場合、それをsedコマンドが間違えて読んでしまうため、"「s」へのオプションが未知です"って怒られる。例えば一つ親のフォルダの.cppが必要なときはファイル名が../some.cppとなり/が含まれてしまう。 解決策1:$*を$(echo $* | sed 's/\//\\\//g')などとして、/を\/に置き換えてやる。こうするとsedは\/を文字の/として認識するのでのぞみの結果が得られる。 これならわざわざlogに残すまでもないことなのだが、その後とあることに気がついた。 解決策2:sedのパターンを区切る文字は「/」以外でも可。 参考HP:http://www.geocities.co.jp/geo_sunisland/filter_sed.html なので例えば
sed 's%\($*\)\.o[ :]*%\1.o $@ : %g' > $@
とする。こうすれば$*に/が含まれていても問題なく処理できる。 なお、同様のことがvimのコマンドにも使える。つまり
:%s%before%after%g
とできる。これを使えば、基本的に特殊文字をエスケープする必要がなくなる。 使える文字としては、アルファベット[a-zA-Z]は不可能、バックスラッシュ\も不可能。他の文字は可能のようだ。 思っても見なかった知識を得た。

gnuplotで凡例分割

gnuplotについてTips:凡例を分割する方法について。 gnuplotの凡例というのは普通にgnuplotでグラフを出力したとき、右上にでる "hoge.dat" -  x*sin(x) - みたいなあれである。 これはgnuplot中ではkeyというキーワードで管理する。例えば左上に出したかったら set key left 箱で囲みたかったら set key box などである。 ここまでわかれば、あとはhelp keyとすれば大概の情報は出てきそうなものだが、本題のこの凡例を分割する方法が見当たらない。なので場当たり的ではあるが、対処法を考えたので載せておく。 例によって大したことはないが、アイディアはmultiplotで複数のグラフを重ねる、というものである。 set xrange [-5:5] set yrange [-5:5] set multiplot multiplot> plot x multiplot> set key left multiplot> plot x*x とすればだいたいわかってもらえるだろう。こんな感じ multiplot.png rangeを設定しないと面白いことになるので注意が必要である。あと、なんか周囲の枠が太くなっているような気がする。 なんかもっといい方法があるのかな?

Numpyでの行列の扱い2

前回に引き続きNumpyについて。 以下では A = mat([[1,2,3],[4,5,6],[7,8,9]]) v = mat([1,2,3]).T とする。 行列要素へのアクセス: ここは注意が必要。C++のublas::matrix<double>のように A[i][j]でのアクセスができない。これはちょっと演算子のかたちが変わって、 A[i,j]でアクセスしないといけない。 同じクラスなので当たり前だが、v[i]では要素は取り出せない。 なお、AやvにはメンパにA.A,v.Aが存在し、これはarrayのインスタンスだった。 このメンバに対してはA.A[i][j]のようなアクセスができるので、 array型を想定した関数に投げるときはこれを使うと便利。

Numpyでの行列の扱い

pythonの便利な数学ライブラリ、Numpy。 本家HP:http://numpy.scipy.org/ この中の行列の扱いにはまったのでメモ。 ipython -pylabで起動かもしくは from numpy import * を想定。 numpyをimportして使うときは適宜読み替えること。 生成法: A = mat([[1,2,3],[4,5,6],[7,8,9]]) のようにつくる。引数はリストでもタプルでも可。 ベクトルの生成: v = mat([1,2,3]) で横ベクトルができる。縦ベクトルは v = mat([[1],[2],[3]]) とすればできるが、 v = mat([1,2,3]).T のように転置を取るほうが書きやすい。 ベクトルをこのように使うと、行列とベクトルの掛け算 A = mat([[1,2,3],[4,5,6],[7,8,9]]) v = mat([1,2,3]).T A*v とかける。