f

2017-06-24

Solution for escaping '$' in completing variable on bash 4.2

bash 4.2系で作業しているときに,変数を経由してディレクトリにアクセスするときにタブキーで補完を行うと$がエスケープされてしまい,補完が効かなくなってしまった。この問題と対処方法を説明する。

Introduction

bash-4.2.0の対話シェルから,$HOME/tmpのファイルを確認しようと,$HOMEの後にタブキーで補完しようとすると$がエスケープされてしまう。

ls $HOME/T # <- Input Tab key
ls $HOME/Templates # expected
ls \$HOME/Templates # real

$がエスケープされてしまったがために,それ以降の補完が作動しない。補完は頻繁に使うため,煩わしい。

この問題は以下で報告・議論されている。

  1. readline - Bash variable expansion on tab complete - Stack Overflow
  2. Bug #778627 “bash completion now quotes shell variable reference...” : Bugs : bash package : Ubuntu

どうやらbash 4.2系特有の問題であり,それ以前のバージョンでは発生していないようだ。

2番目の記事(バグレポートのフォーラム )にbashのバージョンごとの対策の導入状況が議論されている。この記事を元に対策を解説する。

A.1. Use bash 4.2.29 or later

最初の解決策はbashのバージョンを4.2.29以上にあげることだ。

以下のコメントのとおり,このバグ自体はbash-4.2.29のパッチで解決したらしい。

SOLUTION: This was a bug in bash which is fixed in patch bash4.2-029. See
http://lists.gnu.org/archive/html/bug-bash/2012-07/msg00018.html
Comment #14 : Bug #778627 : Bugs : bash package : Ubuntu

GNU Bashのページからダウンロードして,実際にbash 4.2にbash42-029のパッチを当ててビルドすると問題が直っていることを確認できた。ただし,これだけでは以下2点の理由から解決できないことがある。

  1. bash-4.2.29以降でも発生した。
  2. 自分でbashをバージョンアップできないことがある。

自分が最初に問題を確認したFedora 19のbashは4.2.45だった。bash-4.2.29以降であればパッチがあたっていて問題が発生しないはずなのだが,何かの手違いかで解決していなかった。

インターネットに接続できなかったり,客先のPCで自由にソフトのダウンロードやインストールが許可されていない環境がある。

このことから別の対策をとる必要がある。

A.2. shopt -s direxpand

bashのdirexpandオプションを有効にして対処する。

以下にある通り,bash-4.2-3から導入されたshoptコマンドのdirexpandオプションで回避可能と提案されている。

This bug was fixed in 4.2-3 upload, and hence is fixed in quantal and raring.

However, there is a new option that one needs to set - direxpand.

direxpand
If set, bash replaces directory names with the results of word expansion when performing filename completion. This
changes the contents of the readline editing buffer. If not set, bash attempts to preserve what the user typed.
Comment #27 : Bug #778627 :Bug : bash package : Ubuntu

direxpandオプションを有効にすると,対話シェル上でタブキーでディレクトリやファイル名の補完するときに変数を展開する。以下に例を示す。

shopt -s direxpand
ls $HOME/T # Input Tab key
ls /home/senooken/Templates # $HOME is expanded to /home/senooken

この方法であれば,.bashrcに設定を書くか,対話シェル上で一度コマンドを実行して有効にするだけでいいので簡単だ。

欠点は以下2点となる。

  1. bash-4.0から4.2まではdirexpandオプションが導入されていないので使えない。
  2. 変数が常に展開されるので,コマンドラインが冗長になる。

変数を展開すると,コマンドラインが文字で埋め尽くされてしまい冗長になってしまうので,個人的にはdirexpandオプションはあまり使いたくない。しかし,bash 4.2に限ってはタブでの補完が効かないことのほうが問題なので,bash-4.2に限りこのオプションを使うようにする。

上記欠点を踏まえた設定例は以下となる。

[ "$BASH_VERSION%.*}" = 4.2 ] && shopt -s direxpand 2>&-

&&の手前の前半部分でbashのバージョンが4.2であることを判定している。&&以降の後半部分でdirexpandオプションを有効にしている。shoptコマンドはbashのバージョンが古い場合などで,オプション名が有効でなければ標準誤りに以下のようなメッセージを表示してしまう。

bash: shopt: direxpand: invalid shell option name

このメッセージを防ぐために,末尾の2>&-で標準誤りを閉じている。shoptの設定を.bashrcなどにまとめて書く場合は,以下のようにグループ化してエラーメッセージをまとめて抑制すれば個別に2>&-を書く手間を省くこともできる。

{
shopt -s option1
shopt -s option2
# Avoid completing $VAR -> \$VAR [ "${BASH_VERSION%.*}" = 4.2 ] && shopt -s direxpand # 4.2.3+
} 2>&-

Summary

bash-4.2系でのみ発生する補完時のバグとその対処方法について解説した。

bashはLinuxの標準シェルとして広く普及しているが,今回のような細かいバグがいくつか見つかる。機能追加に付随するバグなのである程度はしかたないのかもしれない。また見つけたら記録していく。

2017-06-10

How to solve 'Possible directory traversal hack attempt in ./file' on lha command

LHA形式のファイル(.lzh/.lha)をlhaコマンドで解凍しようとするとエラーが発生した。この問題の対処方法を記述する。

Reproduction

  1. 昔の配布元から[lha for unix verion 1.14i+ac20040929]までのバージョンのlhaをインストールする。
  2. インストールしたlhaを使って以下のコマンドを実行する。
touch a.dat
lha c a.lzh ./a.dat
lha x a.lzh
Possible directory traversal hack attempt in ./a.dat

圧縮ファイル(a.lzh)内に./a.datのように./から始まるファイルがある場合,解答しようとするとエラーが出てしまっている。

以下のサイトで解説されている通り,おそらく圧縮ファイル内に../a.datのような相対パスがある場合に圧縮ファイル外のファイルを上書きして破壊することを防ぐための安全策が誤動作している。./から始まるファイルは現在位置を意味するので,展開できなければならない。

Possible directory traversal hack attempt - まじかる☆やす (aka. マミ) の Ragnarok Online 日記 - ラグナロク オン はてな

Answer 1: Update lha

この問題は,[lha for unix verion 1.14i+ac20040929]またはそれ以前のバージョンのlhaで発生する。そこで,新しい配布元から,[lha (1.14i-ac20050924)]またはそれより新しいバージョンのインストールし直す。

Answer 2: Use 7z or jLHA

lhaの他にLHA形式のファイルを解凍するコマンドとして,7zとjLHAが存在する。lhaの代わりにこれらのコマンドを使う。

7zは多くのLinux環境に標準でインストールされているので,これを使うのがオススメだ。

LHA書庫(.lzh/.lhaファイル)をLinuxで扱う - kakurasan

2017-05-27

ブログ記事ランキングの公開

2016年10月からGoogle Analyticsでアクセス解析を始めてみた。半年ほど経過してデータが溜まってきたのでどの記事が人気なのか集計して,閲覧用のページを作った。

Introduction

アクセス数を集計するにあたって,期間を決めて集計することが大事だと考えている。単純にアクセス数だけをみると,最初に書いた記事が有利になるのであまり効果的でない。一定期間でコンスタントにアクセス数を稼いでいる記事がアクセス数においては重要だ。

例えば,このブログ記事のサイドバーに表示させているBloggerの機能での人気記事ランキングでは,「My first post」や「LaTeXで表の中の棒グラフを描画」のように初期の記事が累計のアクセス数が多くなっている。

また,以下の記事でも言及されているが,Bloggerが集計するアクセス数は機械によるアクセスもカウントしているようだ。Google Analyticsで計測したアクセス数の方が意味があるのだろう。

花見川流域を歩く HANAMIGAWA RYUIKI wo ARUKU: blogger国別ページビュー数から判った意外な真実

そこで,2016年10月から2017年4月までの毎月の記事アクセス数を集計して,各月のランキングを作ってみた。2016年については10月から12月までで年間ランキングも作った。すぐに閲覧できるように,ブログ上部のナビゲーションバーにRankingのページを作った。

2017

2017-04
Rank Page view Percent Date Title
1 503 9.52% 2015-10-28 Windows標準のリモートデスクトップでWindows Home Premiumにリモート接続する方法
2 309 5.85% 2014-07-24 WindowsでのPythonデスクトップアプリ開発環境構築
3 273 5.17% 2014-12-11 LibreOfficeでのVBAの実行方法LibreOfficeでのVBAの実行方法
4 248 4.70% 2016-01-31 2016-01-29頃のアップデート後にUbuntu 14.04がインターネットに接続できない問題の解決策
5 240 4.54% 2014-10-13 Ubuntu14.04で休止状態(ハイバネーション)を有効化
6 174 3.29% 2016-01-02 敬称に「様」ではなく「さま」を使うべき理由
7 115 2.18% 2016-01-02 敬称に「様」ではなく「さま」を使うべき理由
8 103 1.95% 2016-01-31 2016-01-29頃のアップデート後にUbuntu 14.04がインターネットに接続できない問題の解決策
9 95 1.80% 2014-07-24 WindowsでのPythonデスクトップアプリ開発環境構築
10 95 1.80% 2014-09-23 18個から厳選したベストWYSIWYG HTMLエディタAmaya
Total 2155 40.80%

Site Total 5282 100.00%

2017-03
Rank Page view Percent Date Title
1 382 8.35% 2015-10-28 Windows標準のリモートデスクトップでWindows Home Premiumにリモート接続する方法
2 290 6.34% 2014-07-24 WindowsでのPythonデスクトップアプリ開発環境構築
3 239 5.22% 2014-12-11 LibreOfficeでのVBAの実行方法LibreOfficeでのVBAの実行方法
4 184 4.02% 2016-01-31 2016-01-29頃のアップデート後にUbuntu 14.04がインターネットに接続できない問題の解決策
5 174 3.80% 2014-10-13 Ubuntu14.04で休止状態(ハイバネーション)を有効化
6 149 3.26% 2016-01-02 敬称に「様」ではなく「さま」を使うべき理由
7 146 3.19% 2015-12-04 LibreCADでの日本語の文字化けの対処法
8 98 2.14% 2014-05-12 PythonのExcelファイル(xls/xlsx)の読み書きモジュールまとめ
9 86 1.88% 2015-08-28 Google日本語入力(Mozc)のIME設定をWindows・Linux・Androidで同期
10 80 1.75% 2016-01-02 敬称に「様」ではなく「さま」を使うべき理由
Total 1828 39.96%

Site Total 4575 100.00%

2017-02
Rank Page view Percent Date Title
1 360 7.68% 2015-10-28 Windows標準のリモートデスクトップでWindows Home Premiumにリモート接続する方法
2 246 5.25% 2014-12-11 LibreOfficeでのVBAの実行方法LibreOfficeでのVBAの実行方法
3 238 5.07% 2014-07-24 WindowsでのPythonデスクトップアプリ開発環境構築
4 210 4.48% 2014-10-13 Ubuntu14.04で休止状態(ハイバネーション)を有効化
5 149 3.18% 2016-01-31 2016-01-29頃のアップデート後にUbuntu 14.04がインターネットに接続できない問題の解決策
6 113 2.41% 2016-01-02 敬称に「様」ではなく「さま」を使うべき理由
7 91 1.94% 2014-05-12 PythonのExcelファイル(xls/xlsx)の読み書きモジュールまとめ
8 88 1.88% 2015-12-04 LibreCADでの日本語の文字化けの対処法
9 81 1.73% 2014-09-23 18個から厳選したベストWYSIWYG HTMLエディタAmaya
10 67 1.43% 2013-12-04 初心者にとってのLaTeXの問題点とLyXの紹介
Total 1643 35.03%

Site Total 4690 100.00%

2017-01
Rank Page view Percent Date Title
1 418 8.59% 2015-10-28 Windows標準のリモートデスクトップでWindows Home Premiumにリモート接続する方法
2 287 5.90% 2014-07-24 WindowsでのPythonデスクトップアプリ開発環境構築
3 231 4.75% 2014-12-11 LibreOfficeでのVBAの実行方法LibreOfficeでのVBAの実行方法
4 215 4.42% 2016-01-31 2016-01-29頃のアップデート後にUbuntu 14.04がインターネットに接続できない問題の解決策
5 213 4.38% 2014-10-13 Ubuntu14.04で休止状態(ハイバネーション)を有効化
6 104 2.14% 2013-12-04 初心者にとってのLaTeXの問題点とLyXの紹介
7 92 1.89% 2015-12-04 LibreCADでの日本語の文字化けの対処法
8 80 1.64% 2015-08-28 Google日本語入力(Mozc)のIME設定をWindows・Linux・Androidで同期
9 72 1.48% 2014-02-24 BibTeXのbibファイルのMS Wordでの利用方法
10 71 1.46% 2016-01-02 敬称に「様」ではなく「さま」を使うべき理由
Total 1783 36.64%

Site Total 4866 100.00%

2016

Total Page View from 2016-10 to 12
Rank Page view Percent Date Title
1 1317 9.20% 2015-10-28 Windows標準のリモートデスクトップでWindows Home Premiumにリモート接続する方法
2 683 4.77% 2016-01-31 2016-01-29頃のアップデート後にUbuntu 14.04がインターネットに接続できない問題の解決策
3 616 4.30% 2014-07-24 WindowsでのPythonデスクトップアプリ開発環境構築
4 579 4.05% 2014-12-11 LibreOfficeでのVBAの実行方法LibreOfficeでのVBAの実行方法
5 521 3.64% 2014-10-13 Ubuntu14.04で休止状態(ハイバネーション)を有効化
6 265 1.85% 2013-12-04 初心者にとってのLaTeXの問題点とLyXの紹介
7 263 1.84% 2014-09-23 18個から厳選したベストWYSIWYG HTMLエディタAmaya
8 252 1.76% 2016-01-31 2016-01-29頃のアップデート後にUbuntu 14.04がインターネットに接続できない問題の解決策
9 221 1.54% 2015-12-04 LibreCADでの日本語の文字化けの対処法
10 189 1.32% 2014-06-08 ThinkPad E440上のUbuntu 14.04で無線LANの認識
11 180 1.26% 2016-12-01 What is POSIXism (POSIX fundamentalism)?
12 176 1.23% 2015-12-08 TeXにはまらないための基本
13 175 1.22% 2015-10-28 Windows標準のリモートデスクトップでWindows Home Premiumにリモート接続する方法
14 170 1.19% 2013-12-29 欧文フォントにフリーで高品質なTeX Gyreフォントを使おう
15 169 1.18% 2014-05-12 PythonのExcelファイル(xls/xlsx)の読み書きモジュールまとめ
16 161 1.13% 2015-08-28 Google日本語入力(Mozc)のIME設定をWindows・Linux・Androidで同期
17 147 1.03% 2014-07-24 WindowsでのPythonデスクトップアプリ開発環境構築
18 147 1.03% 2015-10-31 CygwinとMSYS2でのWindowsコマンドの文字化け対策
19 146 1.02% 2016-07-24 Install Adobe Flash Player plugin for Chromium on Ubuntu 16.04
20 139 0.97% 2014-05-18 Ubuntu 14.04でログインのキーリングのロック解除
21 136 0.95% 2014-09-03 CygwinでMinGW-w64を使いWindowsネイティブなバイナリを作成
22 132 0.92% 2014-02-24 BibTeXのbibファイルのMS Wordでの利用方法
23 126 0.88% 2014-09-11 Copy to clipboard in tmux on Linux, Cygwin, Mac
24 118 0.82% 2014-07-16 VirtualBoxで「仮想マシンにアクセスできません」の解決
25 117 0.82% 2016-01-02 敬称に「様」ではなく「さま」を使うべき理由
26 111 0.78% 2014-07-24 PythonのCAD(.dxf)ファイル読み書きモジュールまとめ
27 102 0.71% 2016-06-06 How to upgrade Ubuntu 16.04 from 14.04
28 93 0.65% 2016-12-05 Introduction of references about POSIXism (POSIX fundamentalism)
29 93 0.65% 2016-12-01 What is POSIXism (POSIX fundamentalism)?
30 91 0.64% 2014-08-08 Summary of Fortran 77 to 90 converter
Total 7635 53.35%

Site Total 14311 100.00%

2016-12
Rank Page view Percent Date Title
1 431 8.05% 2015-10-28 Windows標準のリモートデスクトップでWindows Home Premiumにリモート接続する方法
2 216 4.03% 2014-12-11 LibreOfficeでのVBAの実行方法LibreOfficeでのVBAの実行方法
3 204 3.81% 2014-10-13 Ubuntu14.04で休止状態(ハイバネーション)を有効化
4 193 3.60% 2014-07-24 WindowsでのPythonデスクトップアプリ開発環境構築
5 180 3.36% 2016-12-01 What is POSIXism (POSIX fundamentalism)?
6 153 2.86% 2014-10-13 Ubuntu14.04で休止状態(ハイバネーション)を有効化
7 119 2.22% 2016-01-31 2016-01-29頃のアップデート後にUbuntu 14.04がインターネットに接続できない問題の解決策
8 93 1.74% 2016-12-05 Introduction of references about POSIXism (POSIX fundamentalism)
9 93 1.74% 2016-12-01 What is POSIXism (POSIX fundamentalism)?
10 85 1.59% 2014-09-23 18個から厳選したベストWYSIWYG HTMLエディタAmaya
Total 1767 33.00%

Site Total 5354 100.00%

2016-11
Rank Page view Percent Date Title
1 484 10.49% 2015-10-28 Windows標準のリモートデスクトップでWindows Home Premiumにリモート接続する方法
2 249 5.39% 2014-10-13 Ubuntu14.04で休止状態(ハイバネーション)を有効化
3 228 4.94% 2014-07-24 WindowsでのPythonデスクトップアプリ開発環境構築
4 208 4.51% 2014-10-13 Ubuntu14.04で休止状態(ハイバネーション)を有効化
5 145 3.14% 2014-12-11 LibreOfficeでのVBAの実行方法LibreOfficeでのVBAの実行方法
6 105 2.27% 2013-12-04 初心者にとってのLaTeXの問題点とLyXの紹介
7 86 1.86% 2014-09-23 18個から厳選したベストWYSIWYG HTMLエディタAmaya
8 81 1.75% 2015-12-04 LibreCADでの日本語の文字化けの対処法
9 73 1.58% 2016-07-24 Install Adobe Flash Player plugin for Chromium on Ubuntu 16.04
10 65 1.41% 2015-12-08 TeXにはまらないための基本
Total 1724 37.35%

Site Total 4616 100.00%

2016-10
Rank Page view Percent Date Title
1 402 9.26% 2015-10-28 Windows標準のリモートデスクトップでWindows Home Premiumにリモート接続する方法
2 230 5.30% 2014-10-13 Ubuntu14.04で休止状態(ハイバネーション)を有効化
3 218 5.02% 2014-12-11 LibreOfficeでのVBAの実行方法LibreOfficeでのVBAの実行方法
4 195 4.49% 2014-07-24 WindowsでのPythonデスクトップアプリ開発環境構築
5 160 3.69% 2014-10-13 Ubuntu14.04で休止状態(ハイバネーション)を有効化
6 92 2.12% 2014-09-23 18個から厳選したベストWYSIWYG HTMLエディタAmaya
7 82 1.89% 2016-01-31 2016-01-29頃のアップデート後にUbuntu 14.04がインターネットに接続できない問題の解決策
8 81 1.87% 2015-10-28 Windows標準のリモートデスクトップでWindows Home Premiumにリモート接続する方法
9 78 1.80% 2013-12-04 初心者にとってのLaTeXの問題点とLyXの紹介
10 77 1.77% 2014-06-08 ThinkPad E440上のUbuntu 14.04で無線LANの認識
Total 1615 37.20%

Site Total 4341 100.00%

Summary

集計結果から,このブログでの人気の記事は以下のようだ。

Windowsであったり,Ubuntuなど利用者の多い環境に関するものは関心が高いようだ。

また,ランキングを作って以下のようなことが分かった。

  • 毎月のPVはだいたい4700。
  • 毎月上位に来るものは,年間ランキングでも上位にくる。
  • Bloggerのアクセス数とGoogle Analyticsでのアクセス数は倍くらい違う。Google Analyticsの方が少ない。
  • 日本語のタイトルの記事が人気。
  • PC用とスマホ用とでアクセスがわかれているものが一部ある。

当初は,毎月ランキングを追加していっても面白いかと思っていたが,あまり変化しないので意味がないと思った。半年に1回くらいのペースでランキングを集計すればいいと思った。

元々自分の備忘録的な位置づけで書き始めていたのもあり,ニッチな内容が多い,アクセス数はたいしたことはなかった。今後も位置づけは変わらないが,記事執筆時の一つの参考にしようと思う。

2017-05-06

Summary for Git GUI Clients

GitのGUIクライアントを調査した。その結果git-gui/gitkを採用するのがいいだろうという結論を得た。

Introduction

今後の開発において主流のバージョン管理ソフトとなりつつあるGitに慣れておいたほうがよいと感じている。

Gitは端末からコマンドを入力することを念頭に置かれているが,慣れるまではコマンドを覚えきれない。Gitはできることが多いので,覚えることも多く,ある目的を達成するためにいくつかの方法がありややこしい。最初の段階では何ができるのか,どういうコマンドがあるのかというのを記憶するために,できるだけ触る機会を多くする必要がある。

Gitを起動するまでの障害を減らすうえで,GitのGUIクライアントが必要だ。そこでGitのGUIクライアントについて調査をしてどのGUIクライアントを使っていけばいいかを検討した。

Method

以下のサイトでGitのGUIクライアントがリストされている。

上記サイトで紹介されているGUIクライアントは数が多いので,常用しているLinuxに対応しているものと利用者の多いWindowsで有名なものを中心に検討する。

比較・検討するにあたって以下の項目に注目する。

  • ライセンス(商用利用可能かどうか)
  • 対応OS(Windows,Mac,Linuxの全てで利用可能か)
  • 最新リリース日(開発が活発か)

Result

調査結果を以下の表にまとめた。

Git GUI Clients
Item Library Commercial or License OS Latest release
git gui/gitk Tcl/Tk GPLv2
Windows, Mac, Linux
2017-03-24
git-cola PyQt GPLv2 Windows, Mac, Linux 2017-01-04
SmartGit Java
$79/user Windows, Mac, Linux
2017-03-21
GitEye Java Register Windows, Mac, Linux
?
GitKraken Electoron Fee Windows, Mac, Linux
2017-05-02
RabbitVCS PyGTK
GPLv2
Linux
2014-03-02
ungit node.js MIT Windows, Mac, Linux 2017-01-05
SourceTree ?
Register Windows, Mac 2017-05-05
Tower ?
$79/user Windows, Mac 2017-02-13
Qgit Qt4
GPLv2
Windows, Linux
2009-05-09
Giggle GTK+ GPLv2
Linux 2012-11-01
gitg GTK+ GPLv2 Windows, Linux 2017-04-30
Git Extensions C#, Mono
GPLv3
Windows, Linux
2017-03-26
GitHub Desktop ? Free Windows, Mac 2017-01-24
TortoiseGit C++ GPLv2 Windows 2017-03-19
GitAhead ? Fee Windows, Mac, Linux 2017-04-28
Cycligent Git Tool Electron Angular 2 Register Windows, Mac, Linux ?
Git Force C#, Mono GPL Windows, Linux 2017-03-12

この中で,Windows, Mac, Linuxのどれでも無料で使え,1年以内に更新があったものを抽出すると以下の4ソフトとなる。

  • git-gui/gitk
  • git-cola
  • ungit
  • GitEye

この4ソフトについて利点・欠点についてさらに検討してみる。

クロスプラットフォームなGitのGUIクライアントの利点・欠点
Name Good Bad
git-gui/gitk
  • Gitの最新バージョンに常に追随
  • Git標準付属であり追加インストール不要
  • 機能が最低限
  • 見た目が古臭い
git-cola
  • 見た目が比較的リッチ
  • 2007年から開発されており歴史が長い
  • Pythonなどの追加インストールが必要
ungit
  • グラフィカル
  • マイナー
  • npmインストール必要
GitEye
  • 開発元が企業であり安心
  • 比較的メジャー
  • 登録が必要なので,会社などでの利用で困難

上記の利点と欠点の比較から,git-gui/gitkを使うのがよいのではないかと考えた。理由は,Gitに標準で付属しており,追加インストール不要でどこでも使えるからだ。

会社と自宅,OSによってソフトを変えると使い勝手が変わるので避けたい。追加インストールが必要である場合,所属組織によっては利用申請が必要であり,そもそも利用できない可能性がある。Gitに標準付属ということは,Gitさえインストールされていればどこでも利用できるということであり,利用可能性という点でとても魅力的だ。

代わりに機能が他のソフトに比べて見劣りするという点はある。しかし,git-guiでは自分でメニューに項目を追加できるので,Gitさえ使いこなせれば最悪自分でカスタマイズすることで対応できる。

Summary

GitのGUIクライアントについて紹介した。Git自体が寿命の長いソフトになると思うので,Gitを使い込んでいくうえで,GUIは重要だと考えていた。

SourceTreeやTortoiseGit,Git Extensionsなどよい評判をきくクライアントもあるが,Windows,Mac,Linuxのどこでもいつでも使えるということを考えるとGitに標準付属するgit-gui/gitkがベストだろうと判断した。

今後はgit-gui/gitkを使い込んでGitに慣れていきたい。

GenerateTOC: Generator for Table of Contents from HTML Headings

HTMLの見出しh1-h6要素から目次を自動生成するシングルページアプリケーションGenerateTOCを作ったので紹介する。

Introduction

ある程度まとまった量の文章には全体を概観するために目次があると便利だ。特に,電子データにおいては,ハイパーリンクにより目次から目当ての節に即座に移動でき,利用者の利便性が高い。

ワープロソフトである,MS WordやLibreOffice Writer,TeXなどには標準で目次の自動生成機能があり,特に設定などしなくても利用できる。しかし,Webの標準文書形式であるHTMLには目次を自動で生成する仕組みはない。つまり,目次を作りたければ,手作業を含め何らかの方法で目次用のHTMLコードを用意する必要がある。このことについては以下2点の問題があると考えている。

  1. 目次生成機能の互換性のなさ
  2. 正しい目次のマークアップの欠如

まず1点目だ。HTMLに目次を生成する仕組みがないということは,目次を必要とするならば各人が個別に目次を作ることになる。勿論手作業で作ってもいいのだが,目次を作る場合,基本的に以下の3工程を行うことになり,これを毎回手作業でやるのは時間がかかる

  1. 目次からハイパーリンクを貼るための,リンク対象の見出し要素にid属性を設定
  2. 目次一覧の文字列を生成
  3. 見出しへハイパーリンクを設定

CMSやブログサービスであれば,拡張機能などで目次を自動生成してくれるところもある。しかし,サービスが提供する目次は形式がばらばらであり,サービスが提供されていなければ利用不可能という互換性の問題がある。

そして2点目の問題だ。仮に手作業で目次を作ったり,外部サービスが提供する目次生成機能を使って目次を生成したとしても,その目次のマークアップがよくないことがある。例えば,この記事では目次のマークアップにblockquote要素を使っている。しかし,blockquoteは引用を示す要素なので,目次のマークアップに使うのは的はずれだ。さらに,外部サービスが対応する見出しの自動生成はsection要素を伴わずにh1-h6要素を単独で使う暗黙のセクションニングのみであることが多かった。

この2点の不満を解消するため,自分で目次を自動生成するツールを作成した。

Markup for Table of Contents

作成したツールの紹介の前に,HTMLではどのように目次をマークアップするのが正しいのかという点についての検討する。

HTMLの仕様を勧告しているW3CのHTML 5.1では,目次のマークアップについて決定的な記述は見当たらなかった。しかし,HTMLをベースにした電子書籍の仕様であるEPUB 3のガイドラインで以下の記述がある。

Each publication must provide a table of contents in the EPUB navigation document (the toc nav).
...
The table of contents is constructed using ordered lists (ol). Each list item must either contain a single link (a) to a section of the document, or a link or heading (span) followed by a list of subsections.
Table of Contents | Navigation | EPUB 3 Accessibility Guidelines

つまり,目次全体をnav要素で囲み,ol要素で各項目を記述し,a要素でリンクを貼ればよいことがわかる。また,目次には通常「目次」や「Table of Contents」という見出しを付ける。この見出しをどのようにマークアップするかという議論がある。これはnav要素の直下にh1-h6要素で見出しを付けることにするのがよい。理由は以下2点だ。

  1. nav要素がセクショニングコンテンツ(sectioning content)
  2. 目次マークアップ方法の指針を出していたEPUB 3 Accessibility Guidelinesの目次見出しで採用。

ここまでのことから目次のマークアップは例えば以下のようになる。

<nav>
<h2>Table of Contents</h2>
<ol>
<li><a href="#Heading-1">Heading 1</a></li>
<li><a href="#Heading-2">Heading 2</a></li>
</ol>
</nav>

なお,書籍のように目次自体を一つのセクションとして扱う場合は,以下のExampleにあるようにnav要素全体をsection要素で囲むことで行う。

Table of Contents | XHTML Content Documents | EPUB 3 Accessibility Guidelines

<section>
<nav>
<h2>Table of Contents</h2>
<ol>
<li><a href="#Heading-1">Heading 1</a></li>
<li><a href="#Heading-2">Heading 2</a></li>
</ol>
</nav>
</section>

GenerateTOC

HTMLで目次を自動で作るための不満を解消するために作成したGenerateTOCを紹介する。

GenerateTOC

このツールはHTML+JavaScriptによるシングルページアプリケーションである。リンク先のgeneratetoc.xhtmlの1ファイルで完結しているのでこのファイルをダウンロードすればオフラインでも利用可能だ。

使い方は簡単で,以下の手順となる。

  1. [Input HTML]に目次を生成したいHTMLコードを記入する。
  2. [Convert]を押下する。
  3. [Output HTML]に目次とリンクの作成のために見出し要素(h1-h6)のid属性が記入されたHTMLコードが出力される。また,[Result View]に見出し追加後のHTMLコードの描画結果を表示する。

注意点は以下2点となる。

  1. 入力はXHTML。
  2. section要素を使った明示的なセクショニングのみ対応。

1点目の入力形式がXHTMLなのは,出力形式を自分がメインで使っているXHTML形式にするためだ。JavaScriptでinnerHTMLなどのプロパティにアクセスしており,XHTMLの形式で出力するにはこのツール自体をXHTMLにする必要があったからだ。こうしなければ,ブラウザーが勝手に整形してHTML形式にするため,拡張子をgenteratetoc.xhtmlとした。XHTML形式にするといっても,基本的にはaimgなどの空要素の終端スラッシュを付ける必要があるなどいくつか細かい点で修正が必要なくらいで,修正自体不要なケースもあるだろう。変換自体も以下のサイトで簡単にできる。

HTML To XHTML Code Converter

2点目の対応する見出し要素の制限だが,目次自動生成ツールでは単にh1-h6要素だけをみて作るものが多い。作る側にしたら,h1-h6だけに対応するほうが簡単だ。しかし,僕は明示的にセクショニングを行うべきだと思い,これに従ったHTMLを記述しているので,これに対応していないと困る。だからこのような仕様にした。明示的と暗黙的の両方セクショニングに対応できればベストなのだが,そこまでの力が及ばなかったので最低限自分に必要な機能に限定した。

ツール自体は2016年10月頃にほぼできており,その頃から自分の書くブログではこの記事も含めてこのツールを使って目次を生成していた。しかし,一部&<>'"などの文字列のエスケープ処理がうまくできておらず,これに対処するのに時間がかかり放置していた。連休により時間に余裕ができて対応できたので今頃の公開となった。

Summary

HTMLにおける目次の作成という問題について自分なりに取り組んで解決のためのツールを作った。自分に必要だからという理由で作ったのもあり,個人的には満足している。長い記事を書く場合,目次は必要であるが,これを手作業で作るのはかなり面倒だった。このツールが作れて本当に良かったと思っている。今後も使い続けるつもりだ。

2017-05-05

Nautilus Git GUI for nautilus git-gui/gitk extension

GNOMEデスクトップ環境の標準ファイルマネージャーNautilusで使えるgit-gui/gitkの拡張機能を作ったので紹介する。

lamsh/nautilus-git-gui: Extension for Nautilus more easily accessing git-gui and gitk

Introduction

今後ソフトウェアや文書を作成していくうえで,バージョン管理をちゃんとした方がいいだろうと考えていた。世の中の主流になりつつあるバージョン管理ソフトのGitに慣れたいと思った。

Gitは基本的にはコマンドラインから実行することを念頭に作られている。しかし,Gitには詳しくなく,さらにいちいち端末を開いて作業するのが面倒であり,このことがバージョン管理への障害となっていた。つまり,ファイルマネージャーから使えるGitのGUIクライアントを用意する必要があると考えた。

Windowsであれば,TortoiseGitなどユーザーに優しいGUI環境が用意されているが,自分がメインで使っているLinux(Ubuntu)にはピンとくるものがない。

RabbitVCSやGit Colaなど近いことができるものがあるのだが,インストールに管理者権限が必要だったり,RabbitVCSについては自分の環境でうまく動作しなかった。

GitのGUIクライアントに何を使うのかというのは一つ議論のテーマである。種々のGUIクライアントの開発状況やライセンス,対応環境を調べた所,Gitに標準付属のgit-guigitkを使うのがよいだろうと判断した。

理由は以下3点だ。

  1. Gitに付属されているのでGitが使えるならどこでも使える
  2. ライセンスがゆるい
  3. クロスプラットフォーム

gitkはGitのコミットログや履歴を閲覧するだけのもので,git-guiは実際にコミットしたりマージできる。git-guiを起動するとわかるが,見た目はやや古臭く,標準で使える機能は簡単なものに限られる。しかし,メニューの[Tools]から自分でコマンドを追加できる(.gitconfigでカスタマイズ可能)ので,自分のGitの知識の増加に合わせてできることが増える。面白くてよいGUIクライアントだと思った。

git-guiを使うことにしたとして,問題が起きる。LinuxでのGUIの起動をどう簡単にするかだ。git-guiは端末からgit guiコマンドを実行することで,実行したディレクトリでリポジトリブラウザが開かれる。常に端末で作業しているわけではなく,複数のディレクトリを開いたり,表計算ソフトや文書を書いたりするのに,ファイルマネージャーのNautilusを多用している。いちいち端末を開いてコマンドを手入力するのは面倒なので,Nautilus上でマウス操作でできるようにしたい。

WindowsのGitのインストーラーであるGit for Windowsでは,インストールするだけで以下のようにExplorer上で右クリックしたときのメニューに[Git GUI Here]が追加される。この項目を選択することで,ファイルマネージャー上から直接git-guiを起動できるため,とても使いやすい。

LinuxのNautilusでも同じ機能がほしい。これがこの拡張機能を作った動機だ。幸いなことにNautilusにはPythonで拡張機能を作る仕組みが備わっているので,これを利用して作った。

Installation

以下のリポジトリにアクセスしてファイルをダウンロードする。

lamsh/nautilus-git-gui: Extension for Nautilus more easily accessing git-gui and gitk

extensionsディレクトリに配置されているnautilus-git-gui.py~/.local/share/nautilus-python/extensions/に配置する(シンボリックリンクにしてもよい)。ディレクトリが存在しなければ作成しておく。システム全体にインストールしたければ,/usr/share/nautilus-python/extensions/に配置する。

その後,以下のコマンドでnautilusを終了させて,再起動すれば有効になる。

nautilus -q
nautilus &

アンインストールは,配置したnautilus-git-gui.pyとnautilusの起動時に生成されるnautilus-git-gui.pycを削除するだけでよい。

Usage

Nautilusを開いて空の部分を右クリックする。すると,以下の2項目がメニューに追加されている。

  • [Git GUI Here]:git guiコマンドを実行
  • [Gitk Here]:gitkコマンドを実行
Application menu [Git GUI Here] and [Gitk Here]

それぞれ,現在のディレクトリでgit guigitkコマンドを実行する。Gitリポジトリのあるディレクトリで実行すれば以下のような画面が表示される。

git gui window
gitk window

Summary

Nautilusでgit-guigitkを簡単に使うための拡張機能Nautilus Git GUIを作成した。右クリックメニューにgit guigitkコマンドを追加するためのメニューを追加するとてもシンプルな拡張機能だ。シンプルだが,Gitを常用していくうえでGUIは自分にとって必要なので作ってよかった。

作成にあたってはnautilus-adminを参考にした。

brunonova/nautilus-admin: Extension for Nautilus to do administrative operations