観てきた。
これに続く今年二本目の邦画。上映時間は 145 分の長丁場。
高校時代の夏休みの最中に飛び込んできた事故。テレビの前から動けなかったことを今でも覚えている。そういえば、それ以来、個人的に JAL を利用することはなくなったっけ。
映画の方だけれど、原作も NHK のドラマも観たことも知ったこともなかったので、ストーリーは楽しめた。新聞社の編集局をリアルに映像に納め、それぞれ役者らも自分の役にのめり込んでいるの伝わってきたのは良かった。緊張感も一定のまま長く続くといった感じで。
ただ、大勢役者がいるもんで人間関係をつかむのがつらかったのと、海外で撮ったラストシーンはいただけなかったが :
New UI on Beagle 0.3.8.
3ヶ月ぶりのリリースであり 0.3.x 系になって二度目の UI Polished up だ。
最近はデーモンも起動することもなくなってしまったので、ja.po を更新するために起動してみるとちょっと新鮮な感じがするなぁ :
検索範囲を表すドメインの種類が増えた (システムはローカルのマシンのシステム規模の検索)
検索ダイアログからサービスを制御できるようになった
検索する際のヒントが一つ増えた
検索リソースの区分が更に細かくなった
更に親切になったエラー・メッセージ
設定で検索ダイアログを起動するショートカット・キーの変更方法も変わった
今回のリリースでは、UI 以外にもいろいろ修正されていて検索速度も心もち速くなった気がするが長い時間使ってみないとパフォーマンスはわからんな。このバージョンの日本語メッセージは全て更新してcommit しておいた。
で、バージョン 0.3.6 から GMail を検索するバックエンドが追加されているんだけどここを参考にち動作を確認してみた。このバックエンドは GMail のメールをインデックス化して検索するのではなく、直接 IMAP プロトコル経由でクエリを投げるみたいだ。さらに検索対象は1アカウントのみでかつ1個だけの IMAP フォルダらしい。
-
GMailSearch というバックエンドがインストールされているか確認する:
$ beagle-config --list-backends Allowed backends: - EvolutionMail - EvolutionDataServer - GMailSearch (..snip..)
-
このバックエンドが利用可能な状態にあるならば、次のコマンドを実行した一覧には表示されないので確認しておく:
$ beagle-config Daemon DeniedBackends | grep GMail $
-
検索する GMail アカウントを次のようにして登録する:
$ beagle-config GoogleBackends GMailUsername <gmail-user-name>@gmail.com Changed: - GMailUsername= (Username for GMail. Generally the full email address.) to: - GMailUsername=<gmail-user-name>@gmail.com (Username for GMail. Generally the full email address.) Debug: Done writing to /home/$USER/.beagle/config/GoogleBackends.xml $ beagle-config GoogleBackends GMailSearchFolder "[Gmail]/All Mail"
-
パスワードを次のコマンドで指定する:
$ beagle-config GoogleBackends GMailPassword <password> Changed: - GMailPassword= (Password for GMail stored in plaintext. WARNING!) to: - GMailPassword=<password> (Password for GMail stored in plaintext. WARNING!) Debug: Done writing to /home/$USER/.beagle/config/GoogleBackends.xml $ beagle-config GoogleBackends GMailPasswordSource conf-file Changed: - GMailPasswordSource=conf-file (Password obtained from:kdewallet/gnome-keyring/conf-file) to: - GMailPasswordSource=conf-file (Password obtained from:kdewallet/gnome-keyring/conf-file) Debug: Done writing to /home/$USER/.beagle/config/GoogleBackends.xml
そしてコマンドラインの beagle-query –domain global で検索したが GMail にはクエリを投げていないな…。何が問題なんだろうか。
Tabs in Applications for G30.
A long riding.
1ヶ月ぶりの長距離走行。
昼の 12:00 頃に出発したんだけどホント暑かった。Nalgene 500㍉㍑ に Gatorade を入れて持って行く。途中 500 のペットボトルを2回ほど購入したが、飲めば飲むほどそのまま汗としてでるだけだ 。500㍉㍑ ではとても足りないので、今度は 1㍑のボトルを購入するか。
京王多磨霊園前から坂を下って中央道の高架下あたりでカメラを忘れたことに気づいたが諦めた。そのまま多摩川競艇場の横を抜け、是政橋からサイクリングロードに入る。河川は葦が大量に生えていたが、火災になったら火の海ならぬ火の川になりそうだ。川辺の木も大きく育ち、その下で暑さをしのぎつつバーベQにいそしむ家族連れが多かった。そこから関戸橋まで向かい風だったが暑さの方がきつかったな。
それから鎌倉街道を北上して NEC 府中事業場前まで。時間帯的に休出連中がぞろぞろといたが。そのまま甲州街道まで上ろうとしたが、腹も減ってきたし買い物も思いついたので府中市街に突入。買い物した後、食事しようと思ったけどどこもかしこも大賑わい。家に戻る途中に美味しいラーメン屋があることを思い出し探したけど見つからず。
そのまま帰宅したが、その小一時間後、突然雷と大粒の雨が…。いやいや危いところだった 。
ということで、サイクリングの記録を作ってみた:
大きくなるよ!
手動で走行した道程を書いていくので、めちゃくちゃ面倒くさい。やっぱりあれであの機能を使って xml から自動生成がベストか!?
The details of Nautilus Renames (TAKE 3).
前回の続き。で、まずは
コマンドラインの実装:
この Nautilus 拡張の大部分の機能、すなわち指定したファイルやフォルダの名前を編集する機能はコマンドラインのプログラムで提供している。名前を編集する際のオプションも指定できるように GUI を備えている。ここで編集対象となるファイルやフォルダは、コマンドラインの引数として受け取るようにしている。GUI はダイアログ形式で、編集した名前に [変更する(R)] と編集そのものを [キャンセル(C)] するというボタンを用意してあり、このいずれかをクリックすると処理を完了しダイアログを消して終了する。
コマンドライン・オプションは次のとおり:
% nautilus-renames --help 用法: nautilus-renames [オプション...] [ファイル...]
ヘルプのオプション: -?, --help ヘルプのオプションを表示する --help-all ヘルプのオプションを全て表示する --help-gtk GTK+ のオプションを表示する
アプリケーションのオプション: -j, --just-directory フォルダの中身ではなくフォルダ自身の名前を変更する --legend テンプレートで使用可能な特殊文字の凡例を表示する --use-gconf GConf 設定サーバ経由でオプションを利用する --display=DISPLAY 使用するXのディスプレイを指定する
こんな感じなので、Nautilus 拡張機能からは Nautilus ファイル・マネージャ上で選択したファイルやフォルダの並びを引数にして、このコマンドを起動するだけである。
設計段階では、コマンドラインだし GUI で設定したオプション項目の再利用は必要ないだろうと考えていたのだけれど、Nautilus 拡張機能経由で実行する際はやっぱりあった方が便利だなということで GConf 対応した (ほとんど後付けな実装)。そういう経緯で –use-gconf なんて (一見、不要とも思える) オプションがついている。
必須の引数であるファイルの書式としては
- 通常の UNIX ファイル名 (例: /home/aihana/photos/0007.jpg)
- URI 形式の名前 (例: file:///home/aihana/photos/0007.jpg)
の二つをサポートしている。ファイルの他にフォルダを指定することも可能で、デフォルトではそのフォルダの中にある全てのファイルが変更対象になる。但し、–just-directory オプションを指定した場合はフォルダそのものが変換対象になる。
ファイルやフォルダを指定しないとコマンドラインのレベルでエラーを返す:
$ nautilus-renames オプションとして URI または ファイル名を指定して下さい
但し、指定したファイルやフォルダが一つでも実在していなければダイアログを出す:
nautilus-renames コマンドラインの実装は次のファイルから構成されている:
nautilus-renames |-- m4 |-- po `-- src |-- nautilus-renames-command.c (これが main でオプションの処理とか) |-- nautilus-renames-dialog.c (これが GUI の処理) |-- mkf-file-data.[c,h] (ファイル情報を扱う独自のデータ型とその処理) |-- mkf-file-utils.[c,h] (ファイル関連のユーティリティ関数) `-- mkf-debug.[c,h] (デバッグ出力用の関数)
nautilus-renames-command.c
このソースに nautilus-renames コマンドの main() がある。やっていることはというと:
- i18n 処理の初期化
- Threads の初期化
- 専用のデバッグ関数の初期化
- コマンドライン・オプションの解析
- GNOME-VFS の初期化
- 引数のファイル名を URI 形式に一括変換
- ファイル名変更ダイアログを表示
- gtk_main() でイベント待ち
- 終了処理
「i18n 処理の初期化」はプログラムの中でこれを使うための初期化を config.h 経由で行っているいつもの Boilerplate Codes。
「Threads の初期化」では、Nautilus の拡張機能で複数のスレッドから GLib の関数にアクセスする可能性があるので、一応おまじないとして。必ず GLib の関数を呼ぶ前に実施する。
/* Threads must be initialized before calling ANY glib functions */ g_thread_init (NULL);
「専用のデバッグ関数の初期化」はオリジナルのデバッグ・メッセージを出力する関数を利用するために環境変数 MKF_DEBUG を取得したり、デバッグ・メッセージ毎に処理時間を出力するためのタイマーを初期化したり。これは mkf-debug.h でエキスポートしている関数を呼び出すだけ。
「コマンドライン・オプションの解析」はもちろん GOption* を使った解析で、ほぼこれも Boilerplate Codes:
GOptionContext *context;
(..snip..)
context = g_option_context_new (N_("[FILES...]")); g_option_context_set_translation_domain (context, GETTEXT_PACKAGE); g_option_context_add_main_entries (context, option_entries, GETTEXT_PACKAGE); g_option_context_add_group (context, gtk_get_option_group (TRUE)); if (g_option_context_parse (context, &argc, &argv, &error) == FALSE) { g_print (_("Could not parse command-line options: %s\n"), error->message); g_error_free (error); return 1; } g_option_context_free (context);
GOption* を表現するコンテキストを生成し、お好みのオプション・リストを GOptionEntry 型で定義しておき、コンテキストにセットしてやる:
static const GOptionEntry option_entries[] = { { "just-directory", 'j', 0, G_OPTION_ARG_NONE, &just_directory, N_("Rename directory itself instead of contents in it"), NULL }, { "legend", 0, 0, G_OPTION_ARG_NONE, &show_legend, N_("Show legend to be able to use in the template"), NULL }, { "use-gconf", 0, 0, G_OPTION_ARG_NONE, &use_gconf, N_("Use options via GConf configuration server"), NULL }, /* Remains in arguments */ { G_OPTION_REMAINING, '', 0, G_OPTION_ARG_FILENAME_ARRAY, &pathnames, N_("Movies to index"), NULL }, { NULL } };
さらにオプションをグループ化して見やすくしてから、実際に受け取った引数を解析する。解析結果は予め定義しておいたグローバル変数に格納される:
/* Command-line options */ static gboolean just_directory = FALSE; static gboolean show_legend = FALSE; static gboolean use_gconf = FALSE; static char **pathnames = NULL;
GOption で i18n の機能を有効にするのであれば
g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);
は忘れない方がよい (案外、忘れる)。解析が終わったら使用したコンテキストを解放しておく。
これ以降はオプションに応じた処理になり、引数としてファイル名が指定されていなければ、前述ようなエラー・メッセージを表示して 1 で終了する。ファイル名が指定されていたら、次は gnome_vfs_init() を呼び出して GNOME-VFS の各種ユーティリティを利用できるようにしておく。
実装当初、ファイル名の変更そのものの処理は g_spwan_async() とか GLib のファイル・ユーティリティ関数なんかを使って UNIX コマンドで実行すればよいか程度に思っていたけど、それじゃあつまらないので Nautilus の実装に合わせて GNOME の仮想ファイルシステム経由で実施することにした。このコマンドは Nautilus 拡張機能だから新たにインストールする必要もないし。それに、将来は Nautilus 拡張機能のデフォルト・プロバイダ経由で (外部コマンドを起動せずに) ファイル名を変更できるかもしれないし。
「引数のファイル名を URI 形式に一括変換」では GNOME-VFS で処理しやすくするために全てのファイルを URI 形式に変更して GList 型のリストに格納する。変更する際は指定したファイルが実際に存在しているかテストしておき、存在していなければリストには格納しない。
リストの格納方法は、まず一つ一つ
list = g_list_prepend (list, fd);
して、最後に一気に
fd_list = g_list_reverse (fd_list);
するのが常道。
このリストに格納するのはオリジナルの FileData という簡単なデータ型:
typedef struct { gchar *uri; /* Full pathname with URI scheme */ const gchar *name; /* Filename only */ gchar *display_name; /* Filename displayed on GUI */ const gchar *mime_type; goffset size; time_t ctime; time_t mtime; } FileData;
で、実装は src/mkf-file-data.[c,h] にある。ちょっと補足しておくと、メンバの uri はここで変換した URI のことで完全な絶対パスになっており、その下の name はディレクトリを除いたファイル名 (システム内部表現) であり、次の display_name はダイアログに表示する際の name のことで、UTF-8 エンコーディングが施された文字列である (日本語のファイル名をダイアログにひょうじするため)。残りのメンバは、ファイル名を編集する上で必要となるパラメータである。
それから、もしリストが空ならば前述の GtkMessageDialog を表示し 1 で終了する。この一時的なメッセージ・ダイアログもよく利用するコードの集合:
if (fd_list == NULL) { GtkWidget *error_dialog;
error_dialog = gtk_message_dialog_new_with_markup (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("<big><b>Failed to rename target files</b><big>")); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (error_dialog), _("It looks specified URIs or filenames are not exist actually. " "Please check your targets.")); gtk_window_set_title (GTK_WINDOW (error_dialog), ""); gtk_container_set_border_width (GTK_CONTAINER (error_dialog), 5); gtk_dialog_set_default_response (GTK_DIALOG (error_dialog), GTK_RESPONSE_CLOSE); gtk_dialog_run (GTK_DIALOG (error_dialog)); return 1; }
ここまででファイル名を変更する材料が揃ってきたので、GTK+ 製のダイアログで名前の付け方を調整し実際に変更するわけで、GUI 関連は全て nautilus-renames-dialog.c と nautilus-renames-dialog.glade の方で行っている。ここではファイル名編集ダイアログを gtk_widget_show() して戻ってくるので、あとはメイン・ループに入ってイベントを待つ。
ファイル名を変更するかキャンセルするか、もしくはウィンドウで gtk_main_quit() すると次の「終了処理」にくるので、今まで利用してきたリストなどを解放し 0 で終了する。
ここまでが nautilus-renames コマンドの大きな流れ。次回は nautilus-renames-dialog.c と GNOME-VFS の API について説明する予定。
このブログを書くのに4日もかかった 。