2009 年 4 月 のアーカイブ

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

「文字集合と文字エンコーディング」というタイトルで、経験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はシンプルに保って呼び出される側で条件判定した方がいいんじゃないでしょうか。