9/24 (火)
[時事] パキスタン南部で M 7.7 の地震が発生
2005年にパキスタンの北東部カシミール地方で M 7.6 の地震が発生したが、今回は南西部バルチスタン州で地震が発生。 地震の影響で海上に島が発生するなどの影響が出ている。
9/23 (月)
ミケランジェロ展@国立西洋美術館
上野の国立西洋美術館でミケランジェロ展(公式)をやっている。 システィーナ礼拝堂500年祭ということで、システィーナ礼拝堂の天井画等を描くのに使われた習作の素描が来ていた。 とはいえいくらミケランジェロの直筆でシスティーナ礼拝堂の宗教画の元ネタになったとはいえ、腕やポーズの断片のスケッチばかり見せられてもあまりうれしくない。 あまりお奨めできない。
美術展で知ったのだがミケランジェロがフィレンツェ市要塞建設監督に就任していたのね。 ダ・ヴィンチが芸術家である前に軍事技術者であり軍事方面にも実績を残しけど、ミケランジェロと軍事はマッチしない感じ。 展示されている要塞のラフを見ても何じゃこりゃという感じだし
9/21 (日)
[Movie] エリジウム
『エリジウム』(公式)を観てきた。 原題は ELYSIUM。 ジョディー・フォースターが SF 映画に出るのは『コンタクト』以来ではなかろうか?
エリジウムはどんな病気でも全身スキャンしただけで治せる機械が全ての家庭に置いてあって、地球には一台もないというのはどんなもんだのだろう? アレを作っている企業は地球の富裕層を狙って販路拡大をしないのかしら? そもそも人口爆発が問題になった世界だから、寿命を大幅に伸ばせる機械は制限したいのかしらん。
9/19 (木)
Tera Term Pro でサイト毎に設定を変更するやり方
Tera Term Pro でログインするサイトが UTF-8 だったり EUC-JP だったりとバラバラなので毎回切り替えていたが、Tera Term Pro コマンドライン によると /KR
、/KT
で指定ができる。
ログインサイトごとに設定を変えたい場合は設定ファイルを複数用意して /F
を指定すればよい。
Bourne Shell の覚書
Bourn shell のスクリプトを書いている時に 1〜10の繰り返しループを以下のように書いたが、これは文法的にダメなようだ。
for i in {1 .. 10}
do
echo $i
done
隙間を空けないで続けて書く。
for i in {1..10}
do
echo $i
done
9/16 (月)
[Movie] 怪盗グルー ミニオン危機一発
「怪盗グルー ミニオン危機一発」(原題:Despicable Me 2)を観てきた。
『怪盗』グルーは、英語では super-villain なんだね。 Wikipedia を読むとホームズのモリアティ教授のようなのが supervillain だそうな。 日本語の『怪盗』はルブランのルパンが自称する gentleman-cambrioleur の邦訳でこれはこれで正しい訳だと思うのだけど、すでに「怪盗」という言葉が元の意味を離れて一人歩きしているような。
9/15 (日)
ベトナムフェス@代々木公園
毎年代々木公園でやっているベトナムフェスに行ってきた。
今日もロボットレストランの宣伝カーがやってきていたが、いつもの形容し難い人形を載せた車ではなかった。 別の場所にいっているのかしら?
渋谷の塩とたばこの博物館は閉館。 ここは休憩するのにちょうどいい場所だったんだけど。
[Movie] ウルヴァリン SAMURAI
川崎チネチッタでウルヴァリン SAMURAIを観てきた。 レ・ミゼラブルを観た時は主演のヒュー・ジャックマンがウルヴァリンにしか見えなかったが、今だとジャンバルジャンに見えてしまう不思議。
9/12 (木)
GDB でブレークポイントのハンドリング
GDBによるテスト自動化への試みのように、GDB をコマンドファイルを使って自動化する場合、ブレークポイントをハンドリングしたくなる。
恣意的だが仮に下記のようなプログラムがあり、sendmsg
と recvmsg
の後にそれぞれブレークポイントを仕掛けて、別々の処理を書きたいとする。
100: void recvmsg_or_sendmsg(int is_send, int sockfd, struct msghdr *msg, int flags) 101: int ret; 102: if (is_send) { 103: ret = sendmsg(sockfd, msg, flags); 105: 106: } else { 107: ret = recvmsg(sockfd, msg, flags); 108: 109: } 110: }
こういう場合は Break Commands が役に立つ。
commands
と end
で囲まれたコマンド群は、直前のブレークポイント(breakpoint)、ウォッチポイント(watchpoint)、キャッチポイント(catchpoint)などで停止した場合にのみ実行される。
コマンド群の最後に continue
や step
を置くことで、GDB の実行を自動的に再開することができる。
break test.c:105 commands silent print "sendmsg is done." continue end break test.c:108 commands silent print "recvmsg is done." continue end run
commands
は本当は commands [range ..]
のようにハンドルしたいブレークポイントの番号を並べることも可能だ。
でも break
コマンドがつける番号は GDB のコマンドスクリプトの中で簡単に取得できないので、あまり使い道がない。
(追記) 最後に仕掛けたブレークポイント等の番号は $bpnum
で採取できるそうだ。
Scripting GDB using Python
2月1日の日記に書いたScripting GDB using Pythonだと、 gdb.Breakpointを継承したクラスを使うことでフック可能な専用ブレークを作ったり、あるいは gdb.events.stop.connect を使うことで GDB の全ての停止タイミングにフックしたりできる(はず)。
後者は gdb を立ち上げた後に mybreakpoint.py
と読み込み、GDB 標準の break
コマンドの替わりに mybreak
コマンドを使うと、ブレークポイントで停止した時にメッセージを表示するようになる(はず)。
import gdb class MyBreakpoint (gdb.Breakpoint): def __init__(self, spec): super(MyBreakpoint, self).__init__(spec, gdb.BP_BREAKPOINT) def stop (self): print "Happy stopping breakpoint= " + str(event.breakpoint.number) class MyBreakCommand (gdb.Command): def __init__(self, spec): super(MyBreakCommand, self).__init__("mybreak", gdb.COMMAND_USER) def invoke(self, arg, from_tty): MyBreakpoint(str(arg))
後者は gdb を立ち上げた後に source breakpoint_hook.py
と読み込むとブレークポイントで停止する度にメッセージを表示するようになる(はず)。
import gdb def breakpoint_stop_handler(event): if (isinstance(event, gdb.BreakpointEvent)): print "Happy stopping breakpoint= " + str(event.breakpoint.number) return gdb.events.stop.connect(breakpoint_stop_handler)
ただし GDB 7.3 以降が必要らしく、私はまだ実行できていない。
9/8 (日)
GNU Make の使い方メモ
テスト用のスタブコードを作成する Makefile を作成していたのだがコンパクトに書く方法が分かったのでメモする。
複数のターゲットに個別の依存関係を注入
テスト対象コードが UTILS_OBJ に変数として並んでいる。 これに test1.c、test2.c、test3.c … のような頭のスタブコードを付けてテストプログラム化したいのだが、下のプログラムの青字 のようにカッコ悪く並べていた。
OBJDIR = obj TARGET_SRC = test1.c test2.c test3.c TARGET = $(TARGET_C_SRC:%.c=%) TARGET_OBJ = $(TARGET_C_SRC:%.c=$(OBJDIR)/%.o) UTILS_SRC = harness.c utils.c UTILS_OBJ = $(UTILS_SRC:%.c=$(OBJDIR)/%.o) all: $(TARGET) test1: test1.o $(UTILS_OBJ) $(CC) $^ $(LIBS) -o $@ test2: test2.o $(UTILS_OBJ) $(CC) $^ $(LIBS) -o $@ test3: test3.o $(UTILS_OBJ) $(CC) $^ $(LIBS) -o $@ $(OBJDIR)/%.o: %.c $(HEADERS) $(CC) -c $(CFLAGS) $< -o $@ clean: rm -f $(TARGET) $(TARGET_OBJ) $(UTILS_OBJ) .PHONY: all clean
これを以下のように書き改めると、test1 が test2.o や test3.o のコードを含んでしまう。
$(TARGET): $(TARGET_OBJ) $(UTILS_OBJ)
$(CC) $^ $(LIBS) -o $@
これをうまくやる方法はないかと思っていたら、4.12.1 Syntax of Static Pattern Rulesが使えるようだ。 この構文だと依存関係(prerequisites)に、$@ に相当するターゲットに対して変換を掛けたものを依存関係として含めることができる。
targets ...: target-pattern: prereq-patterns ...
recipe
...
自分はこの構文を見て ... の部分に通常の依存関係が置けることにしばらく気づかなかった。 結局、元の Makefile は以下のように書けばすっきりする。
$(TARGET): % : $(OBJ)/%.o $(UTILS_OBJ)
$(CC) $^ $(LIBS) -o $@
順序のある依存関係
ビルド中の .o ファイルを特定のディレクトリに固めるために、そのディレクトリ自身を Makefile 中で mkdir しよとするとトラブルことが多かった。 例えば以下のような依存関係はうまく動かない。
$(OBJDIR)/%.o: %.c $(HEADERS) $(OBJDIR)
$(CC) -c $(CFLAGS) $< -o $@
$(OBJDIR):
mkdir $(OBJDIR)
これまでは 1つの Makefile で解決するのはあきらめて、Makefile の中から Makefile を呼び出して mkdir する処理とコンパイル処理を分離し、強制的に順序関係がつくようにしていた。 しかし Types of Prerequisites にある order-only-prerequisites という機能を使うとこれが解決できるらしい。 通常の依存関係は同順序でどれから処理されるかは決定できなかったが、| で区切った後の依存関係は他のものより優先して処理される。
先のプログラムを書き直すと以下のようになる。
OBJDIR = obj TARGET_SRC = test1.c test2.c test3.c TARGET = $(TARGET_C_SRC:%.c=%) TARGET_OBJ = $(TARGET_C_SRC:%.c=$(OBJDIR)/%.o) UTILS_SRC = harness.c utils.c UTILS_OBJ = $(UTILS_SRC:%.c=$(OBJDIR)/%.o) all: $(TARGET) $(TARGET): % : $(OBJ)/%.o $(UTILS_OBJ) | $(OBJDIR) $(CC) $^ $(LIBS) -o $@ $(OBJDIR)/%.o: %.c $(HEADERS) | $(OBJDIR) $(CC) -c $(CFLAGS) $< -o $@ $(OBJDIR): mkdir $(OBJDIR) clean: rm -f $(TARGET) rm -rf $(OBJDIR) .PHONY: all clean
レオナール・フジタ展@渋谷BUNKAMURA
渋谷 BUNKAMURA でやっている「レオナール・フジタ展」(公式)を見てきた。 レオナール・フジタこと藤田 嗣治は子供を中心においた絵本的な絵画として断片的に知っていたけど、まとまってみるのは初めて。
出展されている絵画の多くは箱根にあるポーラ美術館が所蔵しているものを借り出したらしい。 ポーラ美術館は一度行ってみるか。 県内だし。
9/5 (木)
LCOV
gcov の出力結果を HTML 形式に変換して可視化してくれる LCOV を試しているのだが、デフォルトでは C0(命令網羅) のカバレッジデータしか表示してくれない。
C1(分岐網羅)のカバレッジを表示するには /etc/lcovrc にインストールされるファイル、または ~/.lcovrc の以下の設定を有効にする必要がある。
# Include branch coverage data display (can be disabled by the # --no-branch-coverage option of genhtml) genhtml_branch_coverage = 1 # Specify if branch coverage data should be collected and processed. lcov_branch_coverage = 1
C1(分岐網羅)でカバレッジ率を計算してくれるようになる。
個々のソース行の塗りわけでは、if 文を通ったか(taken)か通ってないか(not-taken)かだけではなく、if (aaa && bbb)
のような &&
や ||
で条件をつなげた場合、個々の条件の成立を判定する C2(条件網羅)になっている。
ただし集計はしてくれない。