もんりぃ is undefined.

育児ネタとか、技術ネタとか。

zsh の subversion コマンド補完がエラーを吐くようになってしまった件について。

前置

zsh と言えば、強力な補完を備えているシェルであることはお馴染みだと思います。

id:monry84 的にも、もはや zsh が無いと開発出来ない身体になってしまいました。

特に zsh は、git とか svn とかのサブコマンドの引数に応じて適切な保管を行ってくれる *1 のが素敵ポイントだったりもします。

んで、普段ボクは業務で git 使ってるんですが、一部の開発機では未だに svn が現役で稼働しています。

そんな中、同僚から「なんか動かないんだけど。」って言われたのでその調査と解決の道のりを記してみる次第。

前提

ディストリビューションCentOS 5.7

各種バージョンは以下の通り

zsh
4.3.10
svn
1.7.4

現象

$ svn status
M       hoge
A       fuga
?       piyo

みたいな状態だったとして、「よーし、パパ、hoge をコミットしちゃうぞー」と思い立ち、いつものように <TAB> でファイル名の補完をしようとすると…、

$ svn commit ho<TAB>
_arguments:comparguments:312: invalid argument: [--cl]:ARG:

と、盛大に怒られる。

どうやら、svn commit (当然 svn ci なショートハンドも。) に於けるファイル名補完が巧く動かないっぽい。

仮説

「ちょっと前に subversion のバージョンを 1.7 系にアップデートしたので、その辺が悪さしてるのかな?」と考える。

「んで、この手のエラーは大抵 zsh の functions が追従できてないコトによって引き起こされるコトが多かったなぁ…。」と考える。

「よし、Google 先生に聞いてみよう」と考える。

調査

実際にエラーメッセージそのものでググってみる。

と、それっぽい記事は何件か見付かる。

で、「このURLのパッチ当てれば直るよ!」って書いてある。

が、そのページに飛んでみると、某 github な猫さん?が朗らかに「404」って教えてくれる。

何でかは知らんが、該当するコミットが消えてるっぽい。

少なくとも、その修正をコミットした人の github アカウントは生きているので、commit history から頑張って漁ってみる。

解決

漁ってみたところ、以下の commit を見付けた。

https://github.com/simono/zsh/commit/0082320b79b49a12a497e730bb18807cc2d69bbd

で、これを /usr/share/zsh/4.3.10/functions/_subversion に当ててみると、見事に動きましたとさ!

万が一上記の URL がまた消えないとも限らないので、diff だけ抜粋して以下に貼っておく。

       ! _retrieve_cache svn-${cmd}-args;
   then
     args=(
-      ${=${${${(M)${(f)"$(LC_ALL=C _call_program options svn help $cmd)"#(*Valid options:|(#e))}:#* :*}%% #:*}/ (arg|ARG)/:arg:}/(#b)-([[:alpha:]]) \[--([a-z-]##)\](:arg:)#/(--$match[2])-$match[1]$match[3] (-$match[1])--$match[2]$match[3]}
+      ${=${${${(M)${(f)"$(LC_ALL=C _call_program options svn help $cmd)"#(*Valid options:|(#e))}:#* :*}%% #:*}/ (arg|ARG)/:arg:}/(#b)(-##)([[:alpha:]]##) \[--([a-z-]##)\](:arg:)#/(--$match[3])$match[1]$match[2]$match[4] ($match[1]$match[2])--$match[3]$match[4]}
     )
     _store_cache svn-${cmd}-args args
   fi

*1: 例えば svn add なら、まだバージョン管理されてないファイルだけを対象に補完リストを出してくれる。

Internet Explorer 9 では text-align の変更が効かない?

Internet Explorer 9 とかいうブラウザもどきなアプリケーションで text-align を変更しても見た目が変わらないという現象が発生したので、怒りをブログにぶつけてみる。

検証コードは以下のような感じ。

$('input[name="hoge"]').css({textAlign: 'right'});

IE の開発者ツールで見ても、値が変わっているようには見えなかったので、1時間くらいハマってたが、どうやら裏側では値が切り替わってるっぽい感じだった。

ので、以下のようにコードを書き換えて力業で対応してみた。

$('input[name="hoge"]').css({textAlign: 'right'});
var tmp = $('input[name="hoge"]').val();
$('input[name="hoge"]').val(tmp);

要するに中身の値をセットし直しただけなんだけど。

何か知らないけどこれで巧く動いたので、これでいいや。

jQuery heightAlign なるプラグインを書いてみた。

jQuery heightAlign って何?

複数のボックス要素の高さを調整するためのプラグイン。
通販サイトとかで、カタログ形式に商品を並べたいと思ったときに、金額とかボタンとかの縦位置がズレちゃう問題を解消出来たりするんじゃないかな?

jQuery replaceAttr なるプラグインを書いてみた。

jQuery replaceAttr って何?

もはや、何番煎じか分からないけど、属性値の置換を行うための jQuery Plugin です。
特長として、パターンマッチングさせる際にグルーピングすると、その後方参照を #1 とか #{2} とかで参照出来るトコかな?

jQuery sequel なるプラグインを書いてみた。

久しぶりのエントリです。
べ、別にサボってたワケじゃないんだからっ!

初めに

id:monry84jQuery 大好きっ子です。
設計思想とか、拡張性とかが素晴らしいと思ってます。
なので、他の人が書いたプラグインを眺めながらウヘウヘしたり、自分でプラグイン書いて自己満足したり、という jQuery ライフを送っています。
で、折角書いたんだから、いろんな人にツッコミをしてもらうべきだろうと考え至り、github に push してみた次第でした。

jQuery sequel って何?

端的に言えば "続きを読む" な機能を提供するための jQuery プラグインです。
当プラグインを起動させると、以下のような動作をします。

  • 特定の識別子 (default: "====") 以降のテキストを非表示にする
  • 識別子の代わりに "続きを読む" というアンカーを配置する
  • "続きを読む" を押下すると、blind なエフェクトと共に非表示だった領域を表示する

非常にシンプルですね。

オプションとかあるの?

詳しくは github に README 上げてるので、そっちを参照のコト。

MacBook Pro (Early 2011) のメモリを 16GB にしてみた。

f:id:monry84:20111222125306p:plain
こんな感じ。

ってことで、換装レポート。

用意するモノ

手順1

まずは、裏蓋を開けます。

精密ドライバーの #0 なプラスドライバーを用いて、ネジを外します。


f:id:monry84:20111222132949:plain
3本の長ネジと7本の短ネジがあるので、漏れなく全て外します。
# 赤丸が長ネジ、青丸が短ネジ


外したら、裏蓋を開けられる状態になるので、慎重に開けます。


f:id:monry84:20111222132951:plain
こんな感じ。

手順2

既存のメモリを外します。


f:id:monry84:20111222132940:plain
中央あたりにメモリ装着モジュールがあります。


f:id:monry84:20111222132945:plain
両サイドにあるプラスチックのピンを外側に開いて、1枚ずつ外します。


f:id:monry84:20111222132938:plain
「ぴょん!」って感じに飛び出してくるのでビックリしないようにw

手順3

新しいメモリを装着します。

外すときと逆の手順で慎重に。


f:id:monry84:20111222132948:plain
こんな感じ。

手順4

裏蓋を外したときと逆の手順で取り付けて完了!

終わりに

実際に、快適になったか?と言うと、かなり快適になりました!

業務特性上、Internet Explorer での動作確認を行う必要性が高いので、Parallels Desktop に Windows XP × 2 (IE6, IE7) と Windows 7 × 2 (IE8, IE9) をインストールしているんですが、今までは同時に2インスタンス以上起動すると、スワップしちゃって使い物にならなかった状態だったのが、4インスタンス同時に起動しても、全く問題無く使えています!
f:id:monry84:20111222155904:plain

ってことで、MacBook Pro (Early 2011 以降) をお持ちの方は、換装をオススメします!

ちなみに、2011年12月21日時点で、Patriot Memory ノートPC用メモリー PC3-10600(DDR3-1333) SODIMM 16GB(8GBx2)セット PSD316G1333SK のお値段は ¥17,220- でした。値下がり万歳!

jQuery 1.7 の .on() メソッドを使ってみた。

前置き

このエントリ執筆時点で jQuery の最新版 *1 である 1.7から、イベント取り扱いのためのメソッドとして .on() / .off() なるメソッドが追加された。

jQuery 大好きっ子な id:monry84 としては、「これは試さねば!」と思えたので、試してみた。その備忘録。

そもそも何?

.on() / .off() ってそもそも何よ?というと、以下の通り。

; .on()

Description: Attach an event handler function for one or more events to the selected elements.

; .off()
Description: Remove an event handler.

今まで、.bind(), .live(), .delegate() の使い分けがややこしかったのが、ひとまとめになった印象を受ける。

.off() は .unbind() と同じ感じなのかな?

実際に使ってみた。

.bind() っぽい使い方。

<p>
  <a id="hoge" href="#">Click me!</a>
</p>
// 要素を直接指定してイベント割り当て。
$('#hoge').on(
  'click'
  , function(event) {
    event.preventDefault();
    alert('Clicked!!');
  }
);

.live() っぽい使い方

<p id="hoge">
</p>
// document.ready() 時にP要素直下にA要素を追加する。
$(
  function() {
    $('p').append($('<a>').attr({href: '#'}));
  }
);
// スクリプト読み込み時には存在していない要素に対してイベント割り当て。
$('#hoge').on(
  'click'
  , 'a'
  , function(event) {
    event.preventDefault();
    alert('Clicked!!');
  }
);

.delegate() っぽい使い方

<p>
  <a id="hoge" href="#">Click me!</a>
</p>
// body 要素のクリックとしてイベント割り当てを行い、第二引数のセレクタにマッチする場合にイベント発火。
$('body').on(
  'click'
  , '#hoge'
  , function(event) {
    event.preventDefault();
    alert('Clicked!!');
  }
);

つまり?

一言で言うなら、.bind(), .live(), .delegate() が一つのメソッドで出来るようになりましたよ、と。

負荷を考慮せずに書くなら、全て以下のように書けば、楽になるかな?

$('body').on(
  '<event_name>'
  , '<selector>'
  , function(event) {
    // 何か処理
  }