12/29 (木)
12/26 (月)
シュトレン
ドイツのクリスマス菓子シュトレンを友達に送って貰ったので、職場に持って行って食べる。 山口県のトロアメゾンというお店のシュトレンだそうな。
シュトレンは表面に砂糖をまぶしたパウンドケーキですな。 美味しいですが、かなり甘いです。
[Food] イタリア食堂ピアチェーレ Trattorla Piacereabc@武蔵中原
お昼ごはん。 このお店のランチを頼むと、セルフサービスでボロネーゼソース風カレーを自由食べれます。
12/25 (日)
12/24 (土)
秋葉原散策
仮面ライダーシリーズ40周年(!)をお祝いするクリスマスツリー(?)が飾られていました。
Fate/Zero に出てくるセイバー・モータード・キュイラッシェの実物大模型。 模型と言うか本物のヤマハのバイクを改造したものかしら?
[Food] メーヤウ@神田神保町
神田神保町にあるメーヤウに初めて入る。 早稲田にあるのは辛〜いタイカレーの店と言う印象があるのだが、神保町店はそんな雰囲気がしない店だった。
12/22 (木)
富士通川崎工場のクリスマスイベント
武蔵中原駅前の富士通川崎工場が一般開放してクリスマスイベントを実施しています。 庭園は色々なライトアップで飾られ、本館の壁に地域住民・社員から募集されたイラストが投影されます。
屋台が出ていました。
12/20 (月)
VMware Player や複数ゲスト起動ができるのね
これまで VMware Workstation と違って VMware Player はゲストを一つだけしか起動できないと思っていた。 なぜなら VMware Workstation の場合、1度起動すると Multi Document Interface(MDI) の中で複数のゲスト VM を起動する操作が可能だが、VMware Player は Single Document Interface(SDI) で同時に一つしかゲスト VM を起動できないからだ。
しかし VMware Player 自身を複数起動すれば、別々のゲスト VM を起動可能だった。
ただし 2つ VMware Player を起動すると、最大化の操作が独立に実行できない。 片方の VMware Player を最大化すると、もう片方も連動して最大化されてしまう。
12/19 (月)
[Linux] Btrfs の固有機能を使う
btrfs は ioctl
を使うことによって btrfs の固有機能を利用することができる。
トランザクション
Btrfs はトランザクション書き込み機能を持っている。 これはファイルシステムに一連の書き込みを「トランザクション」として扱い、マシンシャットダウン等で「トランザクション」が中断された場合は一連の書き込みを全て破棄する機能である。
プログラムとしては以下のように btrfs 内のファイルまたはディレクトリを open
して、それに BTRFS_IOC_TRANS_START
の ioctl
を実行する。
これが開始の宣言となり、以降 BTRFS_IOC_TRANS_END
を指定して ioctl
までが一つのトランザクションとなる。
トランザクションの対象となるのは fd
を含む btrfs ファイルシステムとなる。
複数の btrfs ファイルシステムがマウントされている場合は、open
するパスで区別する。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #define BTRFS_IOCTL_MAGIC 0x94 #define BTRFS_IOC_TRANS_START _IO(BTRFS_IOCTL_MAGIC, 6) #define BTRFS_IOC_TRANS_END _IO(BTRFS_IOCTL_MAGIC, 7) int fd, ret; fd = open("a file in btrfs", O_RDONLY); if (fd < 0) { int eno = errno; fprintf(stderr, "open = %d\n", eno); exit(EXIT_FAILURE); } ret = ioctl(fd, BTRFS_IOC_TRANS_START); if (ret < 0) { int eno = errno; fprintf(stderr, "ioctl(fd, BTRFS_IOC_TRANS_START) = %d\n", eno); exit(EXIT_FAILURE); } // 適当な書き込み ioctl(fd, BTRFS_IOC_TRANS_END); close(fd);
ファイルクローニング(file cloning)
Btrfs はファイルのクローニング(cloning)をすることができる。 ファイルのクローニングは一種のファイルのコピーだが、copy-on-write の手法でクローニング直後はコピー元ファイルとコピー先ファイルはデータブロックを共有する。 そのためディスク消費が小さく、一瞬でクローニングすることが可能である。
クローニング以降にコピー元ファイルまたはコピー先ファイルに変更が加えられると、二つのファイルの共有部分は徐々に減ってゆくので容量は増えてゆく。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#define BTRFS_IOCTL_MAGIC 0x94
#define BTRFS_IOC_CLONE _IOW(BTRFS_IOCTL_MAGIC, 9, int)
int main(int argc, const char **argv)
{
int in, out;
in = open(argv[1], O_RDONLY);
out = open(argv[2], O_CREAT|O_TRUNC|O_WRONLY, 0644);
if (ioctl(out, BTRFS_IOC_CLONE, in) == -1) {
int eno = errno;
fprintf(stderr, "ioctl error = %u\n", eno);
exit(EXIT_FAILURE);
}
close(in);
close(out);
return 0;
}
とはいえ最近の cp
コマンドは --reflink
オプションを付けることによって同じ効果を出すことができるので、わざわざプログラムを書く必要はない。
12/12 (月)
[Prog] C++ でコンパイラ時値範囲チェック
Ceph のソースコードを読んでいるうちに見たチェックコード。 v が -1 から 200 の範囲までに入っていることをチェックし、範囲を外れていればコンパイラエラーを表示させる。
#define dout_impl(cct, v) \ if (0) {\ char __array[((v >= -1) && (v <= 200)) ? 0 : -1] __attribute__((unused)); \ }\
char __array[(condition) ? 0 : -1]
を使わない方法としては、GCC の built-in 関数と関数 attributes を使う方法がある。
extern void error_message() __attribute__((error("message"))); inline void check_value(int v) { if (__builtin_constant_p(v)) if ((v >= -1) && (v <= 200)) return; error_message(); }
上記の方法の場合、check_value(100)
のようなコードを挟んだ上で、gcc の最適化レベルを -O1 以上に上げてコンパイルするとチェックがかかる。
ただし -O0 だと範囲内の値でもコンパイルエラーが出てしまう。
南無三。
if (-1 >= v && v >= 200)
は
if (v >= -1 && v >= 200)
ですよね?
googleで「sigaction linux SEGV_MAPERR」の検索をしてずいぶん前の記事をみつけたのですが、あまりに面白いのでここまで読んできて上記間違いを見つけました。
linux mmap SEGV
日記の内容を修正しました。
12/11 (日)
[Movie] タンタンの冒険 (公式)
川崎チネチッタで「タンタンの冒険」を観てきた。 時間の都合で通常吹き替え版になったが、他に通常字幕版と 3D 字幕版と 3D 吹き替え版がある。
モーションキャプチャーで実写に限りなく近い CG を作っている。 そのせいで主人公タンタンと犬のスノーウィは CG 的な造形なのだが、敵方のサッカリンはリアルすぎて実写取り込みなんじゃないかと疑わせる。 というか実写だろうオマエ。 とはいえ、リアルな背景の中に不気味の谷の手前にいる CG キャラクタを登場させるというのが、今後の主流になっていくのかもしれない。
ストーリーは随所にギャグが散りばめられて、劇中観客席から笑い声があがる。 視聴後感が爽やかなファミリー映画でした。
12/8 (木)
Windows7 の復元ポイント
会社の個人 PC のバックアップを iSCSI をマウントしたドライブ上で行っていたのだが、1TB ほどの容量のあるディスクが数十MBを残していっぱいになった。
「ディスククリーンアップ」で起動して「詳細オプション」タグの中にある「システムの復元とシャドウコピー」の「クリーンアップ(C)」を選択し、iSCSI ドライブを指定して古い復元ポイントを削除すると 88.9GB 空いた。
しかし後で確認すると iSCSI ドライブの「システム保護」は無効になっている。 ディスククリーンアップは何を削除したんだろう? 空き容量が増えているので何かを削除しているのだろうが。
追記:12/15
バックアップデータ中のデータファイルのバックアップの履歴が問題のようだ。
「コントロールパネル」-「バックアップと復元」-「領域の管理(M)」を選択して、「Windowsバックアップディスク領域の管理」を呼び出し、データファイルのバックアップの「バックアップの表示(V)」を選択する。 新しいダイアログボックス中で「削除するバックアップの期間を選択します」とでるので、バックアップ期間から古いものを削除してゆくとディスクが空いてゆく。
これ手作業で削除しなくちゃならんのかしら? バックアップ容量を決めてディスクが溢れそうになった、適当に古い世代を消して欲しいところのなのだが。
12/4 (日)
12/3 (土)
アパートに iTSCOM のモデムが来た
地上波アナログ放送の停波にアパートに iTSCOM のケーブルテレビが引かれたのだが、今度はアパート単位でインターネットも導入したようだ。 業者がモデムを持ってきて調整をしていった。
iTSCOM のインターネットの基本プランは大家持ちで 1Mbps の回線が使える。 自腹を切って追加プランに入れば 160Mbps になるようだが、うちはフレッツ光にすでに入っているからなぁ。 フレッツ光をやめて iTSCOM にすると固定 IP 回線引けないけど、それは nminoru.jp をレンタルサーバを移すという手はあるからなぁ…(以下沈思黙考)。
[Food] 手ごねハンバーグ ぐーばーぐ
元住吉にできた「手ごねハンバーグ ぐーばーぐ」に行ってみる。 新装開店の店にしては微妙に客の入りが悪く、並ばずに入れた。
「土鍋ビーフシチューばーぐ」にはアボカドを入れてみた。 入れた直後には少し後悔したが、意外にアボカドはあう、、、ような気がする。多分。
12/2 (金)
Amazon Product Advertising API の仕様変更
うちのサイトのISBN検索支援CGIが動かなくなって気づいたのだが、Amazon の Product Advertising API の仕様がまた変わったようだ。 Amazon アオシエイトプログラム オフィシャルブログの 2011/07/26 の記事 によると、AssociateTag が必須のパラメータとなったようだ。 そのほか SellerLookup、SellerListingLookup、SellerListingSearch オペレーションが使用できなくなった。 MerchantId パラメータも実質使えなくなったもよう。
前回の変更は2009年の11月(2009年6月22日の日記、2009年11月11日の日記)だった。 結構、頻繁に仕様が更新されている印象がある。 もうそろそろメソッドを削る方向への仕様変更は止めて欲しいものだ。