コマンドプロンプトの文字コードをUTF-8にする

やっぱり厄介だったコマンドプロンプトUTF-8化。

WindowsXP時代はコマンドプロンプトのフォントをMSゴシックに変更し、
chcp65001でUTF-8にコードページを変更すれば
日本語もきちんと表示できた。

Windows7になってからは、どうもうまくいかない。
chcp 65001 として何とか日本語表示できたものの、
フォントをMSゴシックに変更できない。
これが原因で、かどうか分からないが、MongoDBのシェル(mongo.exe)の挙動が変。

日本語を含むtestコレクションに対して

> db.test.find();

を実行すると「Failed to write to logfile: errno:0」のようなエラーが出る。

どうやっても解決できなかったので、いっそのことEmacsのシェル(eshell)を使うことに。

普通に M-x eshell を起動すると文字化けするので、以下の設定が必要。

(set-default-coding-systems 'utf-8)

これで何とかいけそう。


2012/6/1 追記
コマンドプロンプトUTF-8化については、レジストリを変更して解決する方法もあるようだが、自分の環境(Windows7 64-bit)ではうまくいかなかった。

java/javacの起動高速化

PCをWindowsXPから64bit版Windows7に替えて以来、java/javacの起動が異様に遅くイライラしていたが・・・
Pleiades 付属のjava(32bit版)を使っていたことがどうも原因。

Oracleのサイトから入手したWindows x64(64-bit)版に変更してからはそれなりのスピードになりました。

64bitのPCでも32bitアプリケーションが普通に動いてしまうのであまり気にしていなかったが、
あまりの違いに唖然。頻繁に使うソフトは64bit版があるか調べてみる価値ありです。

2012/5/21 追記
PC起動後の初回起動時だけ遅かった(2回目以降は普通に速い)のが疑問でよくよく調べてみた。
原因はウイルススキャンのリアルタイム検索(トレンドマイクロを使っている)。
初回起動時はrt.jarやら何やらしこたまスキャンしている。
遅さに耐えられない人はjavaのインストーディレクトリをウイルススキャン対象外としてもいいかもしれない。

iPhoneでDVDを見る

  1. DVD DecrypterでDVDをISOイメージに落とす
  2. HandbrakeでISOイメージをMP4に変換する

たったこれだけ。超簡単でした。
さて、それぞれのソフトの使い方です。まずはDVD Dectypterから。

  1. PCのドライブにDVDを入れます。
  2. DVD Decrypterを起動します。こんな画面が表示されますね。
  3. メニューの Mode > ISO で Read を選択、DestinationでISOファイルの保存先を選択します(下図の赤枠部分。なお、Windows7でC直下に保存するのは止めた方がいいです。詳しくは2012-04-12の日記を見てください)。後は青枠部分をクリックすれば取り込み開始。少し時間がかかるのでしばらく待ちましょう。
  4. 取り込みが終わると楽しげな音楽とともにこんな画面が表示されます。
  5. Windowsエクスプローラーで、保存場所に指定したフォルダにISOファイルがあれば取り込み成功です。DAEMON ToolsでISOイメージをマウントして再生できれば完璧ですね。

次はHandbrakeの出番です。

  1. Handbrakeを起動します。画面左上の Source > Video File で上で取り込んだISOファイルを選択します。
    なお、ファイル選択後に以下のメッセージがでる場合がありますが、無視して問題ありません。
  2. 次に、Destination の Browse をクリックして、MP4の出力先フォルダを指定します。
  3. 画面右側の Presets は iPhone4 を選択(下図の青枠部分)。他にもいろいろ細かく設定できますが、ここでは省略。画面左上の Start (下図の赤枠部分)をクリックするとMP4への変換が始まります。これもかなり時間がかかるのでしばらく待ちましょう。
  4. Handbrakeの画面左下に Encoding Finished と表示され、Windowsエクスプローラーで保存場所に指定したフォルダにMP4があれば成功です。ファイルを開いて動画が再生されればとりあえずはOK。

後はiTunesiPhoneに転送するだけ。

有効桁数を指定して割り算

とある要件で小数点以下40位まで割り算する必要があった。
WindowsXPの電卓では無理(有効桁数32桁)なので、elispの勉強がてら書いてみた。

(defun div (dividend divisor precision &optional answer)
  (if (< precision 0)
      answer
    (setq quotient (truncate (/ dividend divisor)))
    (setq answer (concat answer (format "%d" quotient)))
    (if (= quotient 0)
        (div (* dividend 10) divisor (1- precision) answer)
      (div (* (% dividend divisor) 10) divisor (1- precision) answer))))

(div 4999 12350 40)                     ; => "04047773279352226720647773279352226720647"
(/ 4999 12350.0)                        ; => 0.4047773279352227

時間があればバージョンアップ予定だが、ちょっとした検証には耐えられそう。

Emacs Lispテクニックバイブル

Emacs Lispテクニックバイブル

DVD Decrypterで取り込んだISOファイルが無い!?

DVD DecrypterでCドライブ直下に取り込んだはずのISOイメージが見当たらない。
DVD Decrypterのメニューから File > Browse すると確かにISOファイルが存在するが、
Windowsエクスプローラーにはファイルが表示されない。

よくよくファイルを見ると、アイコンに鍵マークが付いているではないか。

プロパティを開いて所有者を変更しようとするがNG。
アクセス権すら変更できない。

さてどうするか。

  1. DVD Decrypterのメニュー File > Browse で開いたエクスプローラー上で、取り込んだISOファイルを別のフォルダに移動する。移動後のファイルはWindowsエクスプローラーにも表示される。
  2. Windowsエクスプローラーで、上で移動したファイルを別のフォルダにコピーする(これで自分がファイルの所有者になる)

今回はこれで何とか解決できたが、今後はC直下に取り込むのはやめよう。。


2012/5/10 追記
この現象はWindows Vistaから導入されたVirtual Store機能によるもの。
DVD DecrypterからすればCドライブ直下に保存されたかのように見えるが、
実際には %LOCALAPPDATA%\VirtualStore にファイルが保存されている。

※%LOCALAPPDATA%は通常C:\Users\[ユーザー名]\AppData\Local となる

ResultSetをcloseする時はNULL判定すべし

気になるソースを見かけた。具体的にはこんな感じ。

try {
  Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);

  String sql = "SELECT * FROM SOMETABLE WHERE ID = ?";

  PreparedStatement ps = conn.prepareStatement(sql);

  ps.setString(1, "foo");

  ResultSet rs = stmt.executeQuery();

  if (rs != null) {
    while (rs.next()) {
      // データ取得
    }
  }
} catch (SQLException e) {
  e.printStackTrace();
} finally {
  rs.close();
  ps.close();
  conn.close();
}

このソースのどこがいけないか?
作者の意図としてはエラーが発生してもResultSet、PreparedStatement、Connectionは必ずcloseしたい考えなのだろう。
だが、何らかの理由でDBにつながらない/テーブルにアクセスできない/データが取れない事態が発生しても、finallyは必ず実行される。
この場合、ResultSet、PreparedStatement、ConnectionはNULLの可能性があり、NULL判定を入れないとNullPointerExceptionで落ちる。(Web系だと最悪画面にStackTraceが表示されてしまう。)
finallyの中はこう書くべき。

} finally {
  if (rs != null) {
    rs.close();
  }
  if (ps != null) {
    ps.close();
  }
  if (conn != null) {
    conn.close();
  }
}

最近セキュアプログラミングという言葉を良く聞くが、少なくとも防御的プログラミングは心がけよう。

Effective Java 第2版 (The Java Series)

Effective Java 第2版 (The Java Series)

SQLのWHERE条件を作る

A0001
A0002
A0003

といった文字を

IN ('A0001', 'A0002', 'A0003')

のように整形するelispを書いてみた。

(defun sql-where-in (s e)
  (interactive "r")                     ; リージョンを扱うコマンド
  (save-excursion
    (save-restriction           ; 設定されているナロイングの範囲を記録
      (narrow-to-region s e)
      (beginning-of-buffer)
      (while (re-search-forward "^" nil t)
        (replace-match "'"))
      (beginning-of-buffer)
      (while (re-search-forward "\n" nil t)
        (replace-match "',"))
      (beginning-of-buffer)
      (re-search-forward "^" nil t)
      (replace-match "IN (")
      (re-search-forward ",'$" nil t)
      (replace-match ")")
      (widen))))

Emacs Lispテクニックバイブル

Emacs Lispテクニックバイブル

Sylpheedでメール受信を自動化

少し前からSylpheedというメーラーを使っている。
1メール1ファイルという信頼性の高さと扱いやすさ(特にバックアップの容易さ)が気に入っている。

とある要件でExchangeのメールサーバーからメールをダウンロードしないといけないのだが、
こんな時はSylpheedコマンドラインで実行させるのが良さそう。

> sylpheed --receive-all --exit

このコマンド一発で自動的に全メールを受信してローカルに保存してくれる。
コマンドを実行すると一時的にSylpheedGUIが起動するが、
受信が終わり次第画面は自動的に閉じる。

※以下未検証
上記はWindows7にログオンした状態で実験した結果。
通常サーバーマシンはログオフした状態なので、その場合でも上手くいくかどうか...
自動アップデートも無効にしとかないとダメかも。

U2ライブ

実に4年ぶりのライブ♪
と期待するも埼玉アリーナの照明とスクリーンには閉口。。
次に来た時は武道館か、屋外にしてください。

それはさておき、
Bonoの身振り手振り、足腰の入り方、一つ一つの行動における感性と、とてつもない注意深さを目前にし、僕はとてもついていくことができなかった。

なんて凄い人なんだろう。