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のプロジェクトオンリーの恵まれた人はともかく、そうでない人にはオススメですよ。

dsvn.el + subversion 1.6が変だったのでパッチを作りました

たかはらです、いつもながら小ネタですいません。

以前、arasho紹介してくれたdsvn.elを便利に使っていたのですが、先日Subversionを1.6.1にバージョンアップしたらステータスバッファのファイル名の認識を誤るようになり、先頭に空白が一つ入るようになりました。

dsvn.elが古いのか?と思い以下の最新版を試したのですが結果は同じでした。

wget http://svn.collab.net/repos/svn/trunk/contrib/client-side/emacs/dsvn.el

svn statusの出力の解釈に失敗しているようだったので、dsvn.elのファイルの中身を以下のように書き換えたところ動作するようになりました。

--- dsvn.el.orig        2008-12-02 23:46:43.000000000 +0900
+++ dsvn.el     2009-05-13 17:08:30.000000000 +0900
@@ -1041,7 +1041,7 @@
(insert str)
(goto-char svn-output-marker)
(while (cond ((looking-at
-                     "\\([ ACDGIMRX?!~][ CM][ L][ +][ S][ KOTB]\\) \\(.*\\)\n")
+                     "\\([ ACDGIMRX?!~][ CM][ L][ +][ S][ KOTB]\\) +\\(.*\\)\n")
(let ((status (match-string 1))
(filename (match-string 2)))

他に困っている方はどうぞ。

講習会「文字集合と文字エンコーディング」を開催しました

「文字集合と文字エンコーディング」というタイトルで、経験2〜3年目の人をターゲットに社内勉強会を開催しました。文字集合という単語を知っている必要はないですけど、少なくともUTF-8とShift_JISとでは扱える文字の種類数が違うことだけは伝えたかったので、その意味では目標が達成できたと思っています。

まとめ

  • 文字集合とは、扱える文字の集合
    • JIS X 0208なら6000文字くらいの日本語の文字
    • UCS-2なら60000文字くらいの世界中の主要な文字
  • 文字エンコーディングとは、文字の集合をバイト列に直す方式
    • Shift_JISはJIS X 0208(など)を1〜2バイトにする
    • UTF-8はUCS-2を1〜3バイトにする
  • 文字エンコーディング関連のツールを使いこなそう
    • nkfやlvを使いこなそう
    • 日本語を探すならlgrep
    • 最終兵器:hexjaで16進ダンプ

この投稿の続きを読む »

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の便利な機能を一つ紹介します。

この投稿の続きを読む »

サイトデザインをリニューアルしました

WordPressのバージョンアップに伴い、利用するテーマを変更しました。

データの移行については結構トラブルがあったので、まだ変な部分が残っていると思います。もし親切な方がいらっしゃれば、何でも指摘して頂ければ助かります。

このテーマについて言うと、海外の有名サイトのデザインの原型みたいですね。おそらく有料で作ったデザインをCreative Commonsで公開しているってことなんでしょうか。日本ではありえない気がしますね。

WordPressで利用しているプラグイン

今回、次のプラグインを利用しています。コメントスパムが減ったり、携帯対応できちゃったりと非常に助かっています。

他にオススメがあったり、逆にオススメしないものがあれば教えてください。

Emacsでサーバ作業を行う際の注意点

Emacs使いの人はサーバ作業の際もEmacsを使うことが多いかと思います。ところが、Emacs使いはvi使いの人より少しだけ気をつけることがあるんです。今回はそんな内容をまとめてみました。

バックアップファイルに注意

Emacsは標準設定だと元のファイル名に「~」を付加した名前でバックアップファイルを作ります。普段は便利な機能なんですが、サーバ上の作業だと困ることもあります。

例えばWebサーバで公開中のPHPファイルを直接編集する場合、index.phpを編集したらバックアップとしてindex.php~ファイルが作成されてしまいます。標準的なWebサーバの設定ではindex.php~はtext/htmlとして出力されてしまいますので、一つ前のバージョンのPHPソースコードが全世界に公開されてしまいます。

また、特定ディレクトリ以下の全ファイルを処理対象にする処理があった場合、バックアップファイルも処理対象になる可能性があります。万一Linuxで/etc/rc.d/rc3.d/S55sshd~なんてファイルを作ってしまうと、トラブルの元になりかねません。

そこで、バックアップファイルを作らないような設定を紹介します。~root/.emacsに次のように書いておけば、rootで起動したEmacsはバックアップファイルを作らなくなります。これでひと安心ですね。念のため、自動保存ファイルも別ディレクトリに作るようにします。

この投稿の続きを読む »

Web/JS(あまくち) part.7 - jQuery セレクタクイズ

jQuery と言えばセレクタ、大変に便利で使える機能です。
さーて新卒皆にもセレクタ教えるぞーと意気込んでみたところ、バージョンアップに伴いセレクタがパワーアップしておりまして知らない表現が色々と・・
これではいかんと密かに自分の勉強も兼ねつつ jQuery Selector クイズを作って勉強会に持ち出してみました。

まるっと暗記するのではなく

  • 何となく知っている
  • 解決する手段を身につけている

状態になるため、リファレンスにざっと目を通した後にクイズとリファレンスを交互に見比べながら遊んで貰えると良いと思います。
興味ある方はチャレンジしてみてください。

この投稿の続きを読む »

講習会「サーバセキュリティ」

「サーバセキュリティ」というタイトルで社内勉強会を開催しました。普段の勉強会ではSQLインジェクションやXSSなどWebアプリケーションのセキュリティの話題が多く、サーバのセキュリティについては人によって知識がまちまちなので、簡単にまとめてみました。普段サーバをいじらないポジションの人でも、セキュリティフィックスを当てる際にお客さんに説明することはあるでしょうから、サーバまわりについても概要を知っておいた方が良いと思います。

まとめ

  • remote exploitは要注意
    • セキュリティフィックスが出たらすぐ適用すべき
  • 公開サーバは常時パスワード総当たり攻撃を受ける
    • 簡単なパスワードをつけない
    • 可能ならパスワードログインを禁止すべき
  • トロイの木馬は現実にあり得る脅威
  • うっかりopen proxyを作ったりしないように

この投稿の続きを読む »

講習会「メール」第一回

「メール」をテーマに講習会を開きました。今後、複数回に渡りメール周りの様々な知識を紹介して行ければと考えています。

プログラマとしての担当範囲という視点では、「mb_sendmail()等の関数を用いればメールが送れる」しか知らなくてもギリギリ仕事はできるかもしれませんが、本当にそれだけの知識しか無いとしたら不安です。メールに限らず、ある程度の周辺知識は何事にも必要ですよね。

「メール」第一回目の今回は、送信した後の事がイメージできるようになることを目標に、メールを送信してからどのような過程を経て相手に届くかについて説明しました。

メールの送受信の仕組みには、多くの登場人物(アクター)が絡んでいます。登場人物が多い分、トラブルが起こるポイントも様々です。

今回の講義では、各過程におけるトラブルの原因や、確認方法も合わせて紹介しています。メール送受信の仕組みを知る事で、トラブルの原因発見や解決の一助となるのではないでしょうか。

この投稿の続きを読む »