TIM Labs

問題

僕が一番 Vim のタブページをうまく使えるんだ(カレントディレクトリ編) で述べたように、 Vimのタブページはとても便利ですが、 ちょっと工夫するだけでさらに便利になります。

ところで、一般に Vim を使うような方は黒い画面を眺める機会が多いと思います。 また、端末をより便利に使うために GNU screen 等の端末マルチプレクサーを使用している方も多くいるはずです。 すると、 Vim でソースコードを編集しつつ、時折端末に切り替えて作業する......ということが多発します。

この時、以下の点で不便に感じることがあります。

  • 端末をアクティブにすることが面倒(GUI 版の Vim を使用している場合)。
  • 作業用のウィンドウに切り替えることが面倒(GNU screen 内で Vim を起動している場合)。
  • シェルで作業ができる状態になったとしても、 Vim で注目しているカレントディレクトリに移動する手間がかかって面倒。

特に最後の点が大問題で、 せっかくタブページ毎にカレントディレクトリを設定できるようにして便利さを高めたのにもかかわらず、 端末を使おうとするとその便利さも片手落ちという状態です。

つまり、 作業用のシェルにフォーカスを移し、さらにシェルのカレントディレクトリを Vim で注目しているディレクトリに切り替える ことが簡単にできるようにしたいものです。 しかし、一体全体どうすればよいのでしょうか。

問題

Vimのタブページ はとても便利です。 例えばウィンドウを分割して複数のファイルを並行してにらめっこしていたとしましょう。 その最中に誰かからの依頼等で全く関係のない作業をやることになったとします。 このとき、

  1. 新しいタブページを開いて、
  2. そこで作業を進めて、
  3. 作業が完了したらタブページを閉じて、
  4. 先程まで行っていたにらめっこ作業を再開する

という形で中断された作業をスムーズに再開することができます。 やりましたね。

しかし、これだけではまだタブページを全力全開で活用しきっているとは言えないのではないでしょうか。

Sphinx のベースになっている reST フォーマットには打ち消し線用の書式がありません。
ですが、お仕事で文書を書いていると「ある仕様がなくなったこと」を示したいことがあるため、
稀に打ち消し線を使いたくなることがあります。

周りの人に聞いてみたところ、テーマをいじる方法や
各 reST におまじないを書く方法などを教えてもらったのですが、
ふとした時に使いたくなっても忘れてしまいそうな印象を受けました。

そこで打ち消し線を簡単に使えるよう、簡単な拡張を作ってみました。
みなさん、負荷テストはどうやっているでしょうか。
私は無償で且つ機能のそれなりということで、Apache JMeterをよく利用します。

さて、JMeterを利用し負荷をかける際に当然ログをとります。後で解析する必要があるからです。
その際、画面上時間表記になっている個所でもなにもせずログ出力を行うとJavaの実装通り1970年1月1日0時0分0秒UTCからのミリsecの値で出力されます。
たとえば、「2012年4月5日11:09:37(ミリ秒は省略)」であれば「1333591776885」のようになります。

これを人間が見てわかる形、たとえば上記の「2012年4月5日11:09:37」のような「yyyy/mm/dd hh:mm:ss」フォーマットにする場合どうすればよいでしょうか。

方法は二つあります。

問題

一旦 Vim がメキメキと使えるようになるとプラグインもバリバリと導入したくなります。 最初は数個のプラグインを試しに使っているだけだったのが、 時を経るにつれて数多のプラグインを使うようになってくるものです。

こうなると問題になるのはプラグインの管理です。 数が増えてくると新しいものをインストールするのもインストール済みのものを新しいバージョンに更新するのも億劫になります。

そこで必要になるのが Vim プラグインを管理するためのツールです。 この手のツールは2008年8月に公開された vim-pathogen が最古だと思われますが、 とりわけ民衆に認知され始めたのは YAPC::Asia 2009 で発表 された Vimana からだと思います。

この手の Vim プラグインマネージャーは既にいくつかの実装が存在するものの、いずれも欠点が存在します。

問題

Vim の正規表現 はとても豊富で、 ベーシックなもの から アドバンスドなもの までかなりの道具が揃っています。 これを駆使すればありとあらゆる......は言い過ぎですが、 世の中のテキスト処理の九分九厘を快適に行うことができます。

ただ、あまりにも数が多いので、一体どこから覚えていけばいいのか困りますし、 :help に記載されているものの中には今後の人生で活用する機会があるかどうか分からないものもあります。 手っ取り早く正規表現力を高めて生産性を向上するには一先ずどれを覚えれば良いのでしょうか。

ほとんどタイトルで言い尽くしてしまった感がありますが、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'

最近のコメント