File-Roller Dirty Hacking.

書庫マネージャって、GNOME 最新版でも、未だ Windows の SJIS エンコーディングを含んだ zip ファイルをまともに扱えないんだねぇ…:|。未だに文字化けする:
FileRoller_and_SJIS-Encoding-01.png
ちょっと仕事でそういう書庫ファイルを扱うことが多くなってきて、それを毎回手動で変換するのがだんだんと面倒になってきたので Web で調べてみたんだけど、上位にあがってくる検索結果としては、例えば “p7zip-full” をインストールしていると文字化けするとか、”unzip” を日本語対応のパッチ付きのもので置き換えるとか、古くて信ぴょう性の低い情報ばかり (例えば、前者のパッケージをインストールしていない環境でも文字化けは発生しているとか)。
で、一体正解は何なのだろうかと :$。ちなみに、今の環境はと言うと:

$ dpkg -l file-roller  unzip
ii  file-roller             3.10.2.1-mikeforce1 amd64            archive manager for GNOME
ii  unzip                   6.0-9ubuntu1        amd64            De-archiver for .zip files

おそらくは “unzip” 側が怪しいだろうということで、その deb-src をダウンロードしてみると、changelog に以下のような記述が:

unzip (6.0-9ubuntu1) saucy; urgency=low
* Resynchronise with Debian.  Remaining changes:
- Add patch from archlinux which adds the -O option, allowing a charset
to be specified for the proper unzipping of non-Latin and non-Unicode
filenames.
-- Colin Watson   Mon, 13 May 2013 13:00:12 +0100

この -O オプションに対するパッチファイルは:

06-unzip60-alt-iconv-utf8

で、実際のコマンドライン・オプションは:

$ unzip -h
UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.
Usage: unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]
Default action is to extract files in list, except those in xlist, to exdir;
file[.zip] may be a wildcard.  -Z => ZipInfo mode ("unzip -Z" for usage).
-p  extract files to pipe, no messages     -l  list files (short format)
-f  freshen existing files, create none    -t  test compressed archive data
-u  update files, create if necessary      -z  display archive comment only
-v  list verbosely/show version info       -T  timestamp archive to latest
-x  exclude files that follow (in xlist)   -d  extract files into exdir
modifiers:
-n  never overwrite existing files         -q  quiet mode (-qq => quieter)
-o  overwrite files WITHOUT prompting      -a  auto-convert any text files
-j  junk paths (do not make directories)   -aa treat ALL files as text
-U  use escapes for all non-ASCII Unicode  -UU ignore any Unicode fields
-C  match filenames case-insensitively     -L  make (some) names lowercase
-X  restore UID/GID info                   -V  retain VMS version numbers
-K  keep setuid/setgid/tacky permissions   -M  pipe through "more" pager
-O CHARSET  specify a character encoding for DOS, Windows and OS/2 archives
-I CHARSET  specify a character encoding for UNIX and other archives
See "unzip -hh" or unzip.txt for more help.  Examples:
unzip data1 -x joe   => extract all files except joe from zipfile data1.zip
unzip -p foo | more  => send contents of foo.zip via pipe into program more
unzip -fo foo ReadMe => quietly replace existing ReadMe if archive file newer

太字のオプション」を使うと日本語SJISなどを正しくエンコーディングしてくれるっぽい。実際に試してみると:

$ uznip -l test-zip-from-winxp.zip
Archive:  test-zip-from-winxp.zip
Length      Date    Time    Name
---------  ---------- -----   ----
0  2013-12-30 15:45   test-zip-from-winxp/ГEГBГУГhГEГYВ┼НьРмВ╡В╜ГtГ@ГCГЛ.txt
277040  2013-12-28 13:38   test-zip-from-winxp/У·Ц{МъВ╠ZIPГtГHГЛГ_.zip
0  2013-12-30 15:45   test-zip-from-winxp/У·Ц{МъВ╠ГtГHГЛГ_/
---------                     -------
277040                     3 files
$ unzip -l -O shift-jis test-zip-from-winxp.zip
Archive:  test-zip-from-winxp.zip
Length      Date    Time    Name
---------  ---------- -----   ----
0  2013-12-30 15:45   test-zip-from-winxp/ウィンドウズで作成したファイル.txt
277040  2013-12-28 13:38   test-zip-from-winxp/日本語のZIPフォルダ.zip
0  2013-12-30 15:45   test-zip-from-winxp/日本語のフォルダ/
---------                     -------
277040                     3 files

ということで、このオプションは利用できるっぽいので試しに書庫マネージャの zip コマンドクラスにオプションを追加してみる:

diff -uNrdp file-roller-3.10.2.1~/src/fr-command-zip.c file-roller-3.10.2.1/src/fr-command-zip.c
--- file-roller-3.10.2.1~/src/fr-command-zip.c  2013-10-27 21:28:46.000000000 +0900
+++ file-roller-3.10.2.1/src/fr-command-zip.c   2013-12-30 09:35:10.193504249 +0900
@@ -182,6 +182,10 @@ fr_command_zip_list (FrCommand  *comm)
fr_process_begin_command (comm->process, "unzip");
fr_process_set_begin_func (comm->process, list__begin, comm);
fr_process_add_arg (comm->process, "-ZTs");
+
+       fr_process_add_arg (comm->process, "-O");
+       fr_process_add_arg (comm->process, "shift-jis");
+
fr_process_add_arg (comm->process, "--");
fr_process_add_arg (comm->process, comm->filename);
fr_process_end_command (comm->process);
@@ -315,6 +319,9 @@ fr_command_zip_extract (FrCommand  *comm
fr_process_add_arg (comm->process, "-j");
add_password_arg (comm, FR_ARCHIVE (comm)->password);
+       fr_process_add_arg (comm->process, "-O");
+       fr_process_add_arg (comm->process, "shift-jis");
+
fr_process_add_arg (comm->process, "--");
fr_process_add_arg (comm->process, comm->filename);

で、リビルドして実際に開いてみると:
FileRoller_and_SJIS-Encoding-02.png
ちなみに、Linux (UTF-8) と WindowsXP (Shift-JIS) の双方で作成した書庫の閲覧や展開も問題なかった。iconv で実装されたパッチなので Shift-JIS 以外のエンコーディングもちゃんと処理してくれているようだ。こんな Dirty なパッチに対して、Dirty なハックで対応してみたけれど、当分このまま使ってみることにする。

Up to GNOME 3.10 (TAKE 2).

前回の続き。
GNOME シェルとデスクトップ全般(つづき)
やはり書き忘れていたことがあったので :X
まず、トップバーの右端にあるメニューはメイン・メニューではなくて「システム・ステータス・メニュー」と言うそうで:
G310-GNOME_Shell_MainMenuButton.png
なぜこんな形になったかというと、GNOME 3.8 ではユーザ名を表示していたけど、実際のところ、これが結構な幅を専有してしまい (ノートパソコン系のような) 画面の小さいデスクトップでは不評だったことと、(若干後つけ感があるけど) ユーザ名をおおっぴろげに表示するのはセキュリティ上いかがなものかということだったらしい。ステータスというだけあって設計段階ではいろいろ検討されていた模様
次は 3.8 から導入された、アクティビティ画面のメイン・ビュー (全てのアプリ) で表示されるカテゴリ別のフォルダ:
GNOME-shell-3.10-app_folder_categories-sample.png
これはグループ化したいくつかのアプリのランチャが「iOSみたいに」フォルダ形式として表示され、クリックすると次のようにフォルダが開いてアプリののランチャが表示される仕組み (ちょっと見づらいけど):
GNOME-shell-3.10-app_folder_categories.png
デフォルトでは「Utilities (ユーティリティ)」というカテゴリなんかがフォルダとして表示される。このフォルダは手動ながら指定することが可能で、org.gnome.shell::app-folder-categories というキーがリスト型になっており、そこにフォルダとして表示したいカテゴリ名を追加する。カテゴリ名はおそらく alacarte といったメニュー編集ツールで使用する .desktop ファイルの Categories に相当する名前 (但し英語表記) を使用できると思う。現在、何のグループがフォルダ表示されているか確認して、新たにゲーム・アプリをフォルダ表示する場合は:

$ gsettings get org.gnome.shell app-folder-categories
['Utilities', 'Sundry', 'Internet']
$ gsettings set org.gnome.shell app-folder-categories "[ 'Utilities', 'Sundry', 'Internet', 'Games' ]"
$ gsettings get org.gnome.shell app-folder-categories
['Utilities', 'Sundry', 'Internet', 'Games']

リスト型の指定がちょっと厳密だけど (リスト全体を double quotation で括り、リストを表す記号の ‘[‘ と ‘]’、そして先頭と末尾の要素の間にそれぞれスペースを挿入しないと怒られる) :$…。
まぁ iOS ほどの機能や完成ではないけど。というか、あんまり使わないかな。
Evolution
前バージョンと比較して、特に目新しい大きな変更は無いのだけど、メールの送受信のショートカットが従来の [F9] から [F12] に変更になってしまい、他のアプリと衝突したりしていろいろ面倒だったので、パッチ当てて対処した。
続きはまた気が向いたら:D

Somehow up to GNOME 3.10.

3.8 の紹介ブログを書き終えないうちに 3.10 のビルドを始めてしまい中途半端になってしまったけど、ここは区切りをつけて次のバージョンについてブログしてみる :P
いつものとおり最新版の ubuntu (Kernel 3.11 / libc6 2.17 / gcc 4.8.1) をベースにビルドを開始したのは、3.10 が 2nd リリースされ始めた10月の初めくらい、マイペースで終わったのが11月の中くらい。しかしながら、今回はリリース物を全てインストールしても問題がいくつかあって、それが解決したのが先週の12月初め、といった具合。時間はともかくとして、結果として ubuntu Trap にハマってしまったのと、やはり今回の GNOME リリースも完成度がいまイチだなぁというが総評といったところ。個人的に仕事などで他のデスクトップ (Microsoft Windows 7 とか Apple MacOS X Mavericks) に触れる機会があって、そちらと比較しても User ExperiencesFeatures の面で物足りなさがあり、なんと言うか新鮮さがない感じ。
特に Mavericks の Safari の描画の速さには驚いた。その一方で、同じ (かな?) Webkit を使っている Epiphany の遅さと重さは半端ないんだけど ;(
いくつか遭遇した現象
パッチが足りないとか、依存関係やビルド方法が悪いとか、使っているシステムやディストリによっては発生しないかもしれないけど、とりあえず。一応公式リリース後に発生した現象:

  1. Shutdown/Reboot できない
  2. GNOME シェルでロック画面のロックを解除できない
  3. gnome-maps が起動しない
  4. gnome-documents に何も表示されない
  5. 巨大化する GtkDialog
  6. GNOME コントロール・センターのオンライン・アカウントが SIGSEGV する
  7. GNOME 3.8 の環境に gnome-settings-daemon 3.10.x をインストールしてから再ログインするとカーソルが消えてしまう

最初の gnome-session 経由で電源 OFF したり再起動できないのは非常に苦痛だった。ubuntu 13.10 からログイン関係は systemd がデフォルトになったため gnome-session の他に、gdm を –enable-systemd もしくは –with-systemd するなどして有効にすると上手く機能しなくなった。前の 3.8 から共に systemd をサポートしていたのだけれど、全て無効にしていたので問題はなかった。3.10 では無効にすると逆にログインできなかった。この現象は、ubuntu パッチとして提供さている XDG_CURRENT_DESKTOP なんていう環境変数を gnome-session と gdm 共に export しておくことで解決した。どうやら片方にしか適用していなかったのが問題っぽい。ubuntu って、こういうパッケージを超えたポリシーを多用するので困る :$。まぁ debian/changelog にそれぞれ書いてあると言われるとそれまでだけど。
2は gnome-shell のバグ。
3は原因不明。システム規模のアップグレードをしていたらいつの間にか表示されるようになった。JS のエラーだったような気がするけど。
4は Tracker 0.16 をリビルドする (かアップグレードする) 必要がある。
5は GTK+ 3.10.5 から発生している。例えば g-c-c を開くと、こんな感じ:
G310-GTK_3.10_Issu_with_line-wrap.png
どうもラベルのラッピングのパラメータを指定していないと発生する現象らしく git の log には

Author: Matthias Clasen <mclasen@redhat.com>
Date:   Sun Dec 1 14:55:02 2013 -0500
Fix problems with dialog sizing
Many dialogs contain wrapping labels, but don't set max-width-chars on them. Previously, we were capping their width at 640, but since 3.10.5, they extend all the way to the width of the screen, which is not the desired behaviour.
Go back to capping the width of dialogs at 640 in the stable series. In git master, we will set max-width-chars on the labels instead.
https://bugzilla.gnome.org/show_bug.cgi?id=719516 https://bugzilla.gnome.org/show_bug.cgi?id=719569

って 3.10.6 で直ったとあるけどまだ再現するものがある :$
6 は g-c-c のオンラインアカウントで新規にアカウントを追加しようと [+] ボタンを押下するとクラッシュする。ちょうどここで報告されている現象と全く同じ。Bugzilla には一応登録されているようだけど解決したのかどうかは不明。
7 は修正方法はわかったんだけど、まだ稀に発生する。GNOMEシェルを再起動すると直ったり直らなかったり:

$ gsettings get org.gnome.settings-daemon.plugins.cursor active
true
$ gsettings set org.gnome.settings-daemon.plugins.cursor active false

で、以下はアプリ別に気づいた点など。
GTK+ など
Cairo 1.2.16 は初めて –enable-gl=yes でリビルドした。DRI を使って Kernel の Nvidia ドライバが提供する DRM でアクセスしているのか、体感でも描画は速くなった (このあたりは以前翻訳した “The Linux Graphics Stack” を参照のこと)。
GTK+ 3.10 はというとコンテナ・クラスがいくつか追加されている。例えばアニメーションを消したり出したりする GtkRevealer クラス、いろいろなコンテナをリスト状に配置する GtkListBox クラス、スタックに格納した子ウィジェットを一度に一つだけ順番に表示する GtkStack クラスの他、Nautilus のサイドバー相当の機能を提供する GtkPlaceSidebar クラスなど。
あと GTK+ のウィジェットを HTML5 互換のブラウザ上で描画するためのバックエンドである Bloadway のデーモンもビルドできるようになている。使い方は説明にあるとおり:

①まずデーモンを起動する
$ broadwayd
Listening on /run/user/1000/broadway1.socket
②別の端末から GDK のバックエンドとして broadway を指定して、GTK+ のアプリを起動する
$ GDK_BACKEND=broadway LIBOVERLAY_SCROLLBAR=0 gtk3-demo
とか
$ GDK_BACKEND=broadway LIBOVERLAY_SCROLLBAR=0 gedit

最後に HTML5 をサポートするブラウザから http://localhost:8080/ にアクセスするだけ:
G310-GTK_3.10_Broadway_demo.png
あとは、上であげたダイアログの幅が妙に大きくなる問題をなんとかしてもらいたい。
GNOME シェルとデスクトップ全般
これが現在の GNOME シェルとデスクトップ。小物は 3.8 からあまり変更していない:
G310-GNOME_Shell_Desktop.png
ちなみに、前バージョンを紹介したブロクでも書いたけど、背景と Nautilus との関係は無くなってしまったので、この 3.10 でも同様に Nautilus と g-s-d にパッチをあてて Nautilus で背景を描画するようにしている。
リリースする度に思うのだけれど、慣れ親しんだテーマが次のリリースでは使い物にならないのは、なんとかならないものだろうか :(。GTK+ しかり、GNOME シェルしかり。毎回アップグレードするとテーマの一部または全部が「ボロボロ」になってしまい、新しいテーマを探さなくてならない。それにリリース出始めは満足できるテーマが揃っていないし。
これは GNOME シェルの拡張機能にも言える。新しくしたのは良いけど、また新たに User Experiences を構築しないといけないって言うのはダメでしょ。
次は、検索時のアクティビティ画面。外観は 3.8の頃とあまり変わらない。「全てのアプリ」の一覧がページ単位でスクロールするようになったくらいか:
G310-GNOME_Shell_Activity.png
強化されたのは検索機能。これは tracker を起動して情報を収集しておかないと、あまり期待した結果にならないけど、結構便利 (下は「gnome」を検索した結果):
G310-GNOME_Shell_Activity_and_Search.png
トップバーの右端にある音量と電源ボタンの部分をクリックすると、メイン・メニューが表示される:
G310-GNOME_Shell_MainMenuButton.png
メイン・メニューは、使用しているテーマ (や拡張機能) によって若干変わるけど、概ねつぎのような感じ:
G310-GNOME_Shell_MainMenu.png
テーマに関わらず決まって一番下にメニュー項目が並んでいて、左から設定 (g-c-c)、画面のロック、電源OFF/再起動のボタン。メイン・メニューの中には音量系の部品がデフォルトで含まれている。さらにユーザ名の横にある折りたたみのボタンを押して展開すると、ログアウトボタンとユーザの切り替えボタンが表示される:
G310-GNOME_Shell_MainMenuUserButton.png
あと、ネットワーク設定や Bluetooth のアイコンは、これらのハードウェアが実際に接続されている場合にしか表示されなくなった。この設計思想も理解できないよね。有線 LAN 使っていても何かと設定したくなるだろうに。一応 g-c-c からはできるけど:
G310-GNOME_Shell_MainMenu_WiFiButton.png
あと GNOME シェルで何か書くことあったかな。3.8 の拡張機能も未だに半分以上は利用できないし。多少メモリ・リークが少なくなった!?くらいか。
上にある画面のロックを解除できない問題があった時はホント大変だった。3.8 で、普通にディスプレイの電源が切れるとロックがかかるようにしていたので、一度ロックがかかると毎回バックグランドから gnome-shell に HUP を投げて解除していた :(
GNOME Tweaks
UI が作り直しで、3.8 の頃よりもわかりやすく、日本語に翻訳しがいがあるようになった:
G310-GNOME_Tweaks-01.png
G310-GNOME_Tweaks-02.png
とはいえ、いつも思うけど、このアプリと g-c-c の関係がわからんなぁ :/
Nautilus
変わったところは、サイドバーを GtkPlaceSidebar クラスで置き換えたくらいか。おかげで、かなり前から当てていた、サイドバーに表示するアイテムの順番を変えるパッチが無用になってしまった。なんで「ブックマークの一覧」は折りたためないんだろうか。
あとは、自分の場合は背景を描画する機能を revert するパッチを ubuntu から移植している。
ということで、スクリーンショットは割愛。
と、まぁホントはもっと他のアプリなどを紹介したかったけど、だらだらと長くなってきたので、またの機会 (TAKE 2) に持ち越すことにする (やる気があればだけど… :X)。

Up to GNOME 3.8 (TAKE 02).


【Note】
2013年12月現在、既に GNOME 3.10 にアップグレードしてしまったけど、せっかくなので、当時書きかけの投稿を出来ているところだけ公開してみる。苦心して screencast も撮ったし。



移行した GNOME 3.8 のデスクトップで (良し悪しを含め) 気になったアプリをまとめてみた。
Nautilus
前のバージョンでの使い勝手については散々な感想にしたけど、この半年間使っていて基本的な操作を行う上では (いやがおうにも) 慣れてしまったという感じが否めなくなってしまった :|:
GNOME3.8-NautilusFileBrowser-20130721.png
今回のアップグレードで印象が良かった機能が二つあって、そのうちの一つがアイコンをドラッグしてフォルダの上に移動させると、フォーカスが当たったフォルダが自動的に開くというもの:

GNOME3.8-NautilusFileAction-20130721.png
アイコンをフォルダの上にドラッグすればどんどんフォルダ間を移動できる。
もう一つは gnome-terminal に Nautilus プラグインが追加されたので、従来まで使用していた buggy な nautilus-open-terminal が不要になったこと。なんと言っても端末がちゃんと指定したフォルダの中で開くようになって、端末指向のユーザにとっては今まで無かったのが不思議なほど当たり前でお世話になる機能:
GNOME3.8-GnomeTerminalPlugins-20130722.png
これが Nautilus 用のプラグイン:

$ dpkg -S  /usr/lib/nautilus/extensions-3.0/libterminal-nautilus.so
gnome-terminal: /usr/lib/nautilus/extensions-3.0/libterminal-nautilus.so

GTK+ Ref. translation (TAKE 11).

一気に「いろいろなレイアウト用コンテナ」から「スクロール」まで完了。
GTK+ によるユーザ・インタフェース構築の礎となるコンテナクラス。GTK+ がバージョンを重ねる毎にモダンで洗練されたユーザ・インタフェースが追加されてきたけど、このコンテナ・クラスはバージョン1系から特に大きな変化はなく、プロパティやメソッドが追加されているくらいか。逆に3系になると、ほとんどが Deprecated になっちゃうけど :o
See Also GTK+ リファレンスマニュアル: v2.14.7 版の API リファレンス
See Also GIT リポジトリ: 作業用の GIT リポジトリ (英文併記)
See Also 誤植/誤訳の報告はメールの他にこちらにて。
さてさて、この「GTK+ のウィジェットとオブジェクト」の翻訳もなんとか折り返し地点までたどり着いた8)。と言っても、これからは新しいユーザ・インタフェースの解説が多くなるので新規に翻訳する機会が増えてしまい、ますます完成までに時間がかかりそうな予感が…。