2009/12/16

QtとC++に対するいろいろな思い

最近はよく翻訳の傍らGUIプログラミングについて勉強していて、QtとC++の組み合わせで作業しています。これに関してもいろいろと書いていきたいのですが、とりあえずこの2つについて雑感をてきとーに。
  • Qtは便利。あんまりオブジェクトの所有権や参照カウントなどを考えなくてもきちんとメモリ管理してくれる。deleteする必要があるのは親を指定せずに明示的にnewした場合とかだけ。
  • 文字列のエンコードに関して悩まなくなったこともグッド。
  • シグナルとスロット機構は従来のイベントドリブン形式よりも使いやすい。静的な言語なのに動的な機構を混ぜるなんて不思議なかんじ。
  • 後発のライブラリだけあって、やっぱり考え方は洗練されている印象。最近LGPLも可能になってより使いやすくなった。
  • 日本語の文献が殆どない。オライリー本は必須。
  • 時々意味不明のビルドエラーが出るときはmake cleanすると直ったりする(唯一の不満)。
  • C++の行数が多い。Qtのおかげでだいぶ削減されているけど、これで削減されているってどんだけー
  • もしMFCなんかで作業することを考えたら…おそろしやおそろしや
  • コンパイル速度が遅い。すごい遅い。これは自分のパソコンがヘタレなだけじゃない。C++が遅すぎるんだ。
  • アクセッサ関数を定義するのが面倒。_valを定義したらval()とsetVal()を定義しなきゃなんない。でも面倒ってだけでそんな悩んでない。
  • MyClass obj; みたいな文法でコンストラクタが呼び出されるのは怖い。気づかないところでエラー出る可能性がある。
    いや、禁止することはできるんだけど、いちいちそのコードを書かないといけない。普通こんな形で呼び出したい人いないでしょー
  • 参照にあまりエレガントさを感じない。だってあれポインタを隠蔽しただけじゃん。引数を変更禁止にしたいんだったらconstつければいいだけのような気がする。
  • リスト内表記使いたい。無名関数使いたい…これ使えればだいぶ行数減るのに
ということで、やっぱ整理してみたらQtにはあんまり不満はなくて、C++にはけっこうあることが判明しました。でも慣れれば不満は減っていくかもしれませんので、しばらくは続けていきたいと思います。

追記
  • λ式あるね
  • テンプレート、ジェネリック、メタプログラミングはもうすこし勉強する必要がありそう。C++は奥が深い

2009/11/26

今までにやったプロジェクト一覧

*この記事は随時更新していきます。トップメニューの"PROJECTS"からも参照することができます。*

この記事では今まで立ち上げてきたプロジェクトやソフトウェアの一覧をまとめてみます。

(08/02/13) After Effectsのエクスプレッションでパーティクルを表現するシリーズ

particle03SS
  1. After Effectsのエクスプレッションでパーティクルを表現する-01
  2. After Effectsのエクスプレッションでパーティクルを表現する-02
  3. After Effectsのエクスプレッションでパーティクルを表現する-03
After Effectsを弄ってたころの話。AEのパーティクルは貧弱!貧弱ぅ!でもParticularは高価!買えるかアホ!みたいな反動から作った記事。実はAEは今でも普通に使うので、もしかしたら書くかもしれません。

(08/08/30) Processing(Proce55ing)と流体力学


流体力学とProce55ingを組み合わせてみた記事。地味にお気に入り。今度やるんだったら粒子法とか取り入れて煙の挙動などをシミュレートさせてみたいです。

(08/09/20) エッシャーっぽい絵を生成する「エッシャーくん」を作ってみた。



一番人気が出たときの記事。やっぱり理系はエッシャーとか好きなんでしょうか。

(08/12/08) Picasaのウェブアルバムに写真を自動的に載せるpythonスクリプトを組んでみた。


イライラしたので作った。後悔はしていないです。

(09/03/20) MeCabを用いてスパムフィルタを作ってみよう


文字通りスパムフィルタを作ってみた記事。確かここらへんはベイズ理論の勉強にハマってて、その反動で作ってみた記事だったような気がします。

(09/07/15) Pythonistaのための2chライブラリ"twopy"


Pythonから2chを操作したくて作った簡易ライブラリ。何を作りたかったかっていうと…それはごにょごにょ…

(09/10/04) 住所一覧からマックと吉野家の光の地図を作ってみたシリーズ

  1. 住所一覧からマックと吉野家の光の地図を作ってみた
  2. (追記)郵便局で作る日本全国の光の地図
Wiredの記事から触発されて作ってみた記事。こーゆうグラフって結構実用的な気がします。視覚的にわかりやすい。

(09/11/14) OMakeのマニュアルを日本語訳してみた


OMakeはとても便利なのにちゃんと使おうとすると英文読まなくちゃいけなくて、フラストレーションがたまって勢いで翻訳したプロジェクト。分量の多さにやって後悔。現在も鋭意制作中。

OMakeマニュアル 第9章翻訳完了.

OMakeマニュアル日本語訳の翻訳が第9章まで完了しました。

しかし長い。27000文字書いてようやっと1章終わるとか。でも一応早めに終わらせたいのでもう少しがんばります。

2009/11/19

サイトデザインを更新しました。


前のサイトデザインだとありきたりなんで他のサイトと被ってたりとか、横幅がちっちゃかったから思いっきりスクロールしなきゃなんなかったりで結構気になってたんです。ソースコードもあんまり載せられないですし。

というわけでサイトのデザインを更新しました。たぶんこっちのほうがいろいろと見やすいと思います。なんせ横幅がでかいですし。前のなんか2-30文字かいて改行レベルでしたから…

どうでもいいですけど、さあテンプレートを変えようということでBlogger Templatesっていうところに行ってみたんですが、皆なかなかクオリティ高くてビックリです。流石米国で流行っているBlogger。日本のごにょごにょなサイトとエラい違いです。

2009/11/17

OMakeでSphinxを自動継続ビルドしてみよう

題名通りです。Sphinxっていうドキュメント作成ツールがあって、これがなかなか簡単に作れる、かつ様々なフォーマットの書き出しに対応してるのですごく使いやすい。

Sphinxについて詳しく知りたい方は以下のURLを参照すればいいような気がします。

Pythonって何?という人のためのSphinxインストール入門

しかしSphinxには自動でプロジェクトのMakefileが生成されるので簡単にビルドできるようになっているんですけど、それでもhtmlファイルをrstファイルが変更される度に自動ビルドしてくれたらもっと便利になるのにとか思うのが人の常。

というわけで、前回の記事と絡めて、OMakeでSphinxを自動継続ビルドしてみようというのが今回の記事の目的です。

まずはOMakeのインストールから

まず、OMakeっていうのはGNU/BSDのmakeもどきみたいなソフトです。でも「もどき」っていうのは失礼で、従来のmakeとは比べ物にならないほど多くの機能を備えているソフトです。今回使う自動継続ビルドもOMakeの機能の一つです。

OMakeは標準では入っていないため、面倒くさいかもしれませんがOMakeをインストールする必要があります。とはいっても大抵のリポジトリに入っているので、

sudo apt-get install omake

の一行で完了します。Macは持っていないので分からないですが、恐らくportで十分いけるような気がします。

SphinxをOMakeに対応させる

次にSphinxのプロジェクトをOMakeに対応させます。まずプロジェクトの構成は以下のようなものとします。
  • Sphinxのビルドコマンドは"sphinx-build"
  • ビルドディレクトリは"_build"
  • A4用紙を使用する
  • ソースファイルはプロジェクトのルートディレクトリ
別にこれと全く同じじゃなくても勝手に変えればいい話なんですが…

それではOMakeのファイルをインストールしてみます。プロジェクトのルートディレクトリに移動してから、

omake --install

でインストール完了です。OMakerootとOMakefileという2つのファイルができたはずです。

ここでのOMakerootは別にいじらなくていいので無視します。それではOMakefileを改造してみます。

まず開くと変なコードが羅列してありますが、すべて削除。Makefileを開くと
# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
PAPER         =
BUILDDIR      = _build

# Internal variables.
PAPEROPT_a4     = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
とかいうhtmlを生成するコマンドがずらっと並んでいるので、その流儀に従ってOMakefileに以下を記述。
# OMakefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
PAPER         =
BUILDDIR      = _build

# Internal variables.
PAPEROPT_a4     = -D latex_paper_size=a4
ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_a4) $(SPHINXOPTS) .

SRCS = $(glob *.rst)

.DEFAULT: $(SRCS)
    $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html

ここで.DEFAULTの依存先にglob関数を用いてすべてのカレントディレクトリ以下のrstファイルを指定してるのがミソ。これで.DEFAULTターゲットの依存先はすべてのrstファイルになったので、このうちのどれかが変更されたら自動的にビルドが開始されるみたいな。

途中の変数を変更したのは、OMakeではその書き方が禁止されているためです。まーそりゃあそうかもしれません(makeの流儀なのかもしれないけど、自分は最初見たときキモいなーって思った)。

これだけでもうすべての手順は終わり。あとはルートディレクトリから継続監視ビルドの-Pオプションをつけて、

omake -P --verbose

を実行すればomakeが立ち上がり

$ omake -P --verbose
*** omake: reading OMakefiles
*** omake: finished reading OMakefiles (0.01 sec)
- build . <.DEFAULT>
+ sphinx-build -b html -d _build/doctrees -D latex_paper_size=a4 . _build/html
Running Sphinx v0.6.3
loading translations [ja]... done
loading pickled environment... done
building [html]: targets for 0 source files that are out of date
updating environment: 0 added, 0 changed, 0 removed
looking for now-outdated files... none found
no targets are out of date.
- exit . <.DEFAULT>, 0.56 sec, code 0
*** omake: done (0.57 sec, 0/0 scans, 1/1 rules, 0/74 digests)
*** omake: polling for filesystem changes

と監視してくれるのが分かります。あとはてきとーにrstファイルを変更すれば、自動的にOMakeが変更されたことを感知して勝手にビルドしてくれます。いちいち変更する度にmake htmlなどと打たなくてとっても便利。まさに悦楽の境地。

というように、OMakeはこっちが楽できるような仕掛けを大量に用意してくれています。なにかと便利なので覚えると楽かもしれないです。

ついでに

今思うと「継続監視」っていう機能は別にビルド用途だけじゃなく、他のことにも使えるかもしれないです。例えばhtmlファイルを変更したり追加したら差分だけ勝手にアップロードしてくれるとか、グループ作業で他の人の沢山の画像ファイルを別フォルダで縮小しなきゃなんない(しかもそれが頻繁に変更される)場合とか。

グループ作業にありがちな「どれが変更されてどれが変更されてないのかごっちゃになってわかんねーよ!誰かリスト作ってくれリスト」みたいなのにも威力を発揮しそうな気がします(ていうか今がまさにそんな感じ)。