TIM Labs

2012年2月アーカイブ

ほとんどタイトルで言い尽くしてしまった感がありますが、Windows XP SP3 + .Net Framework 4.0 の環境では標準ライブラリにあるSHA256ハッシュ関数を使うことができません。いや、その環境では動かないと言ったほうがいいでしょう。

上記リンク先のMSDNのページをみると、.Net Framework 4.0の場合
Windows 7, Windows Vista SP1 以降, Windows Server 2008 (Server Core はサポート対象外), Windows Server 2008 R2 (SP1 以降で Server Core をサポート), Windows Server 2003 SP2
.Net Framework 3.5 では
Windows Vista, Windows XP SP2, Windows Server 2003
となっています。Windows XP SP3 では、どちらにも当てはまらないためSHA256が使うことができないのです。ちなみにWindows XP SP2+.Net Framework 3.5 の場合は動く模様です。見事な落とし穴です。

幸い、こちらの方が対応策を書いていますので、場合によってはレジストリをいじって回避するというのもありです。ただし、当然ランタイム環境で気にしなければならないのは確かですけどね。
私は基本的にプログラマでインフラは専門ではありませんが、開発環境の構築など必要に応じてLinux/UNIXを触ることがあります。今回はその開発環境構築の際にはまったことを書いてみたいと思います。

構築内容は
  • Solaris10 が NFSv4のサーバとして、/export/home をexport
  • Debian6.0 がNFSv4クライアントとして、SolarisからexportされたディレクトリをNFSv4でマウント
という比較的シンプルなものです。
Solaris10とDebianの混成とちょっと変わっていますが、今までお客様の環境はSolaris10のみで構成されていたものを、今回一部Debianに置き換えるためにこのような構成に変更となりました。つまりこの構成は未検証というものです。

NFSは以前少しだけサーバ/クライアントともにCentOS5.xで構築したことがあり、最低限動かすだけならばそんなに難しいものではないと思っていました。ただ、今回は
  • サーバとクライアントでOSが異なる
  • そもそもDebianおよびSolaris、特にSolarisに不慣れ
  • /etc/passwd, /etc/shadow, /etc/group がLDAPを参照している
という点で不安要素がありました。

さて、実際にNFSのexport/mount を行ってみたところ問題が発生しました。

問題

世の中にはシンタックスハイライトを行うツールが既に多数存在しています。例えば以下のようなものがあります:

メジャーな言語やフォーマットなら標準でシンタックスハイライトの設定が同梱されていますが、 ニッチな言語やフォーマットだとまずそのような設定は存在しません。 それならば独自に設定を書けばいいのですが、 大抵のツールでは構文の定義方法が特定のパーツに該当する正規表現を並べるだけなので、 言語によっては構文の妥当な記述が不可能な場合もあります。

となると独自に実装せざるを得ません。 例えば Vim の :help ドキュメントを良い感じに Web ブラウザ上で見るためのツール を作って Heroku で動かそうと思った場合、 Vim の :help ドキュメントの構文のいい加減さ から、まず既存のツールを利用してのシンタックスハイライトはできません。 さらにこのツールの場合はリンク周りもあれこれ面倒を見る必要があるため、 ますます既存のツールの利用はできません。

という訳で元のソースをパースしていい感じにシンタックスハイライトする仕組みを作る必要があります。 ことパースに関して言えば Ruby には様々な gem が存在しているので、そのどれかを使うことになります。 パース関連で言うと以下のような gem があるのですが:

  • treetop (Lex/Yacc のように独自 DSL を Ruby のコードへコンパイルする必要がある。ダサい)
  • citrus (treetop と同様のダサさ)
  • rsec (Ruby 上の DSL で構文の記述を行う。でもその DSL がダサい)
  • parslet (Ruby 上の DSL で構文の記述を行う。 DSL が超COOOOOOOOOL。構文エラー時の出力もCOOOOOOOOOL)

という感じなので parslet 一択という状態です。 そういう訳で parslet を使って Ruby でシンタックスハイライトを実装してみましょう。

みなさん仕事でPhantomJS使っていますか?僕は使っていません。でもそろそろ使ってみたいので、仕事でよく使うCentOSにPhantomJSをインストールする方法を調べてみました。

環境

今回はVirtualBoxes - Free VirtualBox® Imagesで公開されているCentOS-6.2のイメージを利用します。

PhantomJSをインストールする前に、あらかじめ次のコマンドでライブラリを更新と開発ツールのインストールを行います。依存関係などが面倒なので、開発ツールは全部インストールします。

sudo yum upgrade
sudo yum groupinstall 'Development tools' 'Additional Development'

問題

パッチのレビューなどで Git の diff の出力を読む機会はそれなりにあると思います。 その際、 diff で列挙されている内容だけでなく前後のコードも確認するために変更のあったファイルを開くことも多々あるでしょう。

Vim にはこの状況にぴったりのコマンド gf があります。 gf はカーソル下にあるテキストからファイル名らしき文字列を探してそれを開くというコマンドです。 diff の出力には変更のあったファイルのパスが含まれていますから、 そこへカーソルを移動して gf を使えば良いというわけです。

gf はとても便利なコマンドではあるものの、 上記の操作を何度か行っていると不満が募ってきます。 というのも、以下のような手間があるからです:

  • gf を実行するためにパスの書かれている位置までカーソルを移動しなければならない。
  • gf でファイルを開いた後、レビューしたい場所までカーソルを移動しなければならない。

例えばカレントバッファに以下の内容が含まれているとしましょう (左端の数字は行番号なので適宜無視してください):

 1 diff --git a/autoload/gf/diff.vim b/autoload/gf/diff.vim
 2 index 469fdb3..b135316 100644
 3 --- a/autoload/gf/diff.vim
 4 +++ b/autoload/gf/diff.vim
 5 @@ -21,7 +22,7 @@
 6  "     SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 7  "
 8  " Interface
 9 -function! gf#diff#go_to_hunk(type)
10 +function! gf#diff#go(type)
11    let d = gf#diff#investigate_the_hunk_under_the_cursor()
12    if d is 0
13      echomsg 'There is no diff hunk to jump.'
14 @@ -113,7 +114,7 @@ function! gf#diff#investigate_the_hunk_under_the_c
15        return 0
16      endif
17      let [d.from_path, d.to_path] = xs
18 +  call setpos('.', original_position)
19 -  call setpos(original_position)
20
21    return d
22  endfunction

このとき:

  • 12行目で gf をすると autoload/gf/diff.vim の25行目まで移動する。
  • 16行目で gf をすると autoload/gf/diff.vim の117行目まで移動する。

のような感じで 手作業によるカーソル移動なしに目的の位置へ移動 できればとても便利です。 このように gf の動作を拡張するにはどうすれば良いでしょうか。

このアーカイブについて

このページには、2012年2月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2012年1月です。

次のアーカイブは2012年3月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。