‘OS’ カテゴリーのアーカイブ

autotest で Symfony + Lime を自動テストする

screen-shot-2010-05-12-at-140931
ruby 界隈でよく使われている自動テストツール autotest の Symfony + Lime 用スタイルを書いて公開しました。
プロジェクトのローカルルールに合わせてあるのですが、軽く手を入れれば他のプロジェクトでも、また Symfony や PHP 以外でも使えると思います。

  • TDD で書いていないと不安が高じて動悸と息切れが始まる
  • red-green-refactoring を唱えなさいとじっちゃに言われた
  • growl の red を見ないとコードが先に進まない

よくある話だと思います。
まずテストが無いと何も始まらない!書いたテストはがんがん自動実行して使い倒したい!
となるとやはり、自動テストの出番ですね。

(続きを読む…)

続・$HOME/.ssh/configを活用していますか?

以前の記事「$HOME/.ssh/configを活用していますか?」では、設定ファイルを少し頑張って書けば普段のSSHライフが随分変わりますよ、と紹介しました。今日はその続編です。前回よりマニアックな設定を紹介します。

(続きを読む…)

lgrepコマンドで再帰的に日本語をファイル検索する

lgrepコマンドをご存知でしょうか。日本語対応ページャlvの付属品で、対象ファイルの文字コードを推定して日本語文字列をうまく見つけてくれるという、優れもののgrepです。

古いプロジェクトだと、プログラムはEUCだけど静的ファイルはSJIS、なんてことがあると思います。そんなときに大活躍です。

grepした結果の文字コード変換も勝手にやってくれるので、grep結果をnkfする必要もありません。至れり尽くせりですね。

そんなlgrepコマンドにも弱点があります。grepで言う-r(再帰的にファイルを検索)オプションが無いのです。どこに書いてあるかわからないエラーメッセージを探す、なんてときに-rは必須ですよね。無いなら作ってしまえ、ということで作ってみました。

alias lgrep-r="find . -type d -name .svn -prune -o -type f -print | xargs lgrep"

上記を.bashrcなり.zshrcなりに書けばlgrep-rコマンド(というかエイリアス)の出来上がりです。私は普段の便利さのために.svnディレクトリを無視するようにしてみましたが、環境に合わせて工夫してみてください。

思いつきで作ったんですが、これは便利!最近UTF-8のプロジェクトオンリーの恵まれた人はともかく、そうでない人にはオススメですよ。

cronでは「毎月第1月曜日に実行」ができない

社内の技術メモに「cronでは第1月曜日に実行などはできないので、実行されるスクリプト側で条件判定しないとダメ」というような記述がありました。一体どういうことでしょうか。

crontabの書式は「分 時 日 月 曜日 コマンド」です。また、数字はハイフンで範囲指定ができます。下記のように指定すれば毎月第1月曜日の午前3時にコマンドを実行できそうな気がします。

0 3 1-7 * 1 /path/to/command/execute-only-1st-monday

しかし、これは期待通りには動きません。「1日から7日までの期間の唯一の月曜日」を指定したつもりが、実際には「1日から7日のすべて、または日付に関係なく月曜日」と解釈されます。マニュアルにも書いてあるのですが、「日」と「曜日」が両方指定された場合、OR条件になるのです。

ネット上を探すと、これでハマって試行錯誤した人が複数いるようです。testコマンドとdateコマンドを使ってcrontabのコマンド指定部分で条件判定している人を見つけましたが、それは頑張り過ぎな気がします。趣味の問題ですけど、crontabはシンプルに保って呼び出される側で条件判定した方がいいんじゃないでしょうか。

cronでエラーメールの送り先を指定する方法

cronは良く使うツールの一つだと思いますが、何故かトラブルの思い出がつきまとうのは僕だけでしょうか。今日はそんなcronの便利な機能を一つ紹介します。

(続きを読む…)

講習会「シェルスクリプト入門」を開催しました

「シェルスクリプト入門」というタイトルで社内勉強会を開催しました。社内でアンケートを取ってみたところ、シェルスクリプトに苦手意識を持っている人がいるようです。「いやいや、普段のコマンドラインと大差ないよ」ということを伝えたくて、簡単な講習をしてみました。これで苦手意識が無くなってくれればいいんですが。

まとめ

  • if文がわかればシェルスクリプトは完璧(?)
    • 条件式の評価には[コマンド(又はtestコマンド)
    • 変数展開はクオーティングに注意
      • 比較するときは”x$hogehoge”を使えば万全
    • exit codeで他のコマンドと連携
      • 0は正常終了、1〜255は異常終了

(続きを読む…)

端末がグチャグチャになったときのためのコマンドjclearを作りました

みなさん、もちろん端末エミュレータは大好きですよね。PuTTYとかTeraTermとか、MacならTerminal.appとかitermとか、生活の5割は端末エミュレータが相手ですよね(残りの5割はエディタが相手でしょう、きっと)。

ところで、たまに端末に変な文字をペーストしたり、何を血迷ったか「cat *」とかしてしまって、端末の画面制御が壊れてしまうことがありませんか?派手に壊れるときと、微妙に壊れるときと差はありますけど、何にせよこのまま作業し続けたらストレスがたまるぞ、という状態になってしまうことがあると思います。

中でも、X11のktermが特に壊れやすい気がします。ちょっと試してみたところ、バッチリ壊れてくれました。

(続きを読む…)

姉妹サイト「ディノオープンディレクトリ」を公開しました。

こんにちわ。サーバ・インフラ管理担当のarashoです。

この度姉妹サイト「ディノオープンディレクトリ」を公開しました。
(続きを読む…)

OmniOutliner ProとCarbon Emacsを仲良くさせる方法

今回は普段以上にピンポイントな情報をお届けします。個人ブログでやれば?というくらいに読者を選ぶ話題ですが、気にしないことにします。

早速ですが、私は次のような悲惨な目にあったことがあります。

  1. MacOSX上で
  2. OmniOutliner Proをインストールした後で
  3. Carbon Emacsでバッファ末尾に移動(Command + >)しようとしたら
  4. ウギャー

上記のように不幸な条件が重なると、Emacsで編集作業をしていたはずなのに、なぜかOmniOutlinerが起動します。こんなイジメを受けたらEmacs使いは生きていけません。きっとOmniの中の人はvi使いなんでしょうね。しくしく。(多分どちらでもないと思いますが)

実は、MacOSXにはserviceという仕組みがあります。これは、セレクションの情報を別のアプリケーションに投げるような枠組みのようです。別のアプリケーションとの連携方法として、起動するアプリケーションをメニューから選ぶこともできますし、キーボードショートカットを割り当てる事も可能です。Command + >でOmniOutlinerが起動したのはこの機能によるものです。(ちなみに、Pro版でしかこの悲劇は起こらなかったと記憶しています)

(続きを読む…)

文字エンコーディングが仲間外れのファイルを素早く見つける方法

プロジェクトに多人数が参加するようになると、なぜかプロジェクトの標準とは異なる文字エンコーディングのファイルがcommitされていることがあります。UTF-8で統一しているはずなのにShift_JISのファイルがある、なんて場合ですね。そこでメンバーの注意力不足を指摘したり、「だから***(自分の使っていないエディタの名前を入れてください)はダメなんだ」とかいう宗教論争に発展させたりというのでは不毛ですよね。簡単に気づく方法があればそれでいいんですよ。

方法は色々あると思いますが、今日はどこのご家庭にも必ずあるnkfを使ってみましょう。最近のnkfには–guessというオプションがあり、文字エンコーディングを推測してくれます。

$ nkf --guess hoge*.txt
hoge1.txt:EUC-JP (LF)
hoge2.txt:UTF-8 (LF)
hoge3.txt:BINARY

これを使えば、変な文字エンコーディングのファイルが隠れていないかどうかすぐにわかります。私はプロジェクトルートディレクトリで以下のようなコマンドを実行しています。

(続きを読む…)