2007年7月23日月曜日

JAVAでファイルのSHA-1を計算する

ダウンロードしたファイルが正しいかチェックするためにSHA-1のチェックサムを利用していることはよくあることですが、WindowsでSHA-1とかのダイジェストを得るためにはフリーウェアとかを使ったりします。その手のツールは便利でいいのですが、インストールするのが気が引けたりするので、そのくらいならJAVAでさくっとできないものかと思って、とりあえず作ってみました。

とりあえずなので、基本的なコンセプトは以下のような感じ。

Windowsなので結果をウィンドウで表示する
いわゆるメッセージボックスのようなもので計算結果を表示する。
機能は限りなくシンプル
こういうツールを作ろうとすると、いろいろ便利にしたくなるのですが、とりあえずは簡単なものにする。
エラーぐらいは表示
エラーが出ても突っ走って、何も表示されないと悲しいので、エラーメッセージぐらいは表示しようということ。

とりあえず、ソースコードはこちら。ちなみにソースコメントは入れてないです。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.swing.JOptionPane;

public class FileDigest {
 protected static int READ_SIZE = 1024;
 protected static String DIGEST_ALGORITHM = "SHA-1";
 protected static String DIALOG_TITLE = "File Digest Tool";
 protected MessageDigest messageDigest;
 public static void main(String[] args) {
  if (args.length == 0) {
   messageOut("No taget file.", true);
   System.exit(1);
  }
  FileDigest fileDigest = new FileDigest();
  try {
   fileDigest.setFile(args[0]);
  } catch (FileNotFoundException e) {
   messageOut(String.format("File not found (%s).", args[0]), true);
   System.exit(2);
  } catch (IOException e) {
   messageOut("File read error.", true);
   System.exit(3);
  }
  messageOut(fileDigest.digestString(), false);
 }
 public FileDigest() {
  try {
   messageDigest = MessageDigest.getInstance(DIGEST_ALGORITHM);
  } catch (NoSuchAlgorithmException e) {
   System.exit(4);
  }
 }
 public void setFile(String pathName) throws FileNotFoundException, IOException {
  FileInputStream inStream = new FileInputStream(pathName);
  DigestInputStream digestStream = new DigestInputStream(inStream, messageDigest);
  byte readBuffer[] = new byte[READ_SIZE];
  while (digestStream.read(readBuffer) > 0);
 }
 public String digestString() {
  byte codeList[] = messageDigest.digest();
  String digest = new String();
  for (byte code : codeList) {
   digest += String.format("%x", code);
  }
  return digest;
 }
 protected static void messageOut(String message, boolean isError) {
   JOptionPane.showMessageDialog(
     null, message, DIALOG_TITLE, 
     isError ? JOptionPane.ERROR_MESSAGE : JOptionPane.INFORMATION_MESSAGE);  
 }
}
あえてどう使うかという説明をするほどのものではないとは思っているのですが、デスクトップにショートカットをおいて、ドラッグ&ドロップで結果がわかるといいかと思ったので、そうするには以下のようにしてみてください。
ソースをコンパイルして.classファイルを作成
その方法は説明するまではないと思いますが、普通にやれば「FileDigest.class」というファイルができるはず。
デスクトップにショートカットを作成
explorerで右クリックして、「送る」のサブメニューのデスクトップを選択する。
できあがったショートカットのプロパティを表示
リンク先の変更
このときリンク先は、FileDigest.classのフルパスになっているので、「javaw FileDigest」(FileDigest.classではない)に変更する。 作業フォルダはそのままにしておく(CLASSPATHの代わり)。

これで、ショートカットから、ツールが起動できるはず。うまくいけば、アイコンがJAVAのものに変わる。 ちなみに単にそのショートカットで起動すると「No target file.」と書いてあるメッセージボックスが表示されます。ダイジェストを計算したいときは、explorerからこのショートカットへドラッグ&ドロップすると、計算結果がメッセージボックスで表示されます。

2007年7月10日火曜日

EclipseにZend Debuggerを組み込む

Eclipseを3.3に変えて、Zend Debuggerをインストールしたので、そのときのインストールメモです。ようするにZendの「Extension Binary」と「PHP Debugger Plugin」をインストールするということです。

まずはZendのPDTのページへいく
Debugger Extension Binaryをダウンロードする
「Download Debugger Extension Binaries」というリンクをクリックすると、バージョンとプラットホーム別にファイルがあるので、適切なファイルをダウンロードする。
ファイルを展開してコピー
ダウンロードしてきたファイルを展開して、適当なところへコピーする。ファイルを読み込ますときの設定はフルパスで設定するので、常識的な範囲でどこでもよい。
php.iniの設定
展開されたフォルダにREADMEがあるので、それを読むとわかりますが、php.iniに以下の項目を追加する。
zend_extensionまたはzend_extension_tsにsoまたはDLLのフルパスを設定
Windowsの場合、「zend_extension_ts=c:/path/ZendDebugger.dll」のような感じで設定する。このとき、実行しようとしているPHPのバージョンに合ったファイルを指定する必要がある。たとえば、PHPが5.2だったら「5_2_x_comp」のフォルダの下にあるファイルを設定する。
zend_debugger.allow_hostsに接続するホストを設定
デバッグしようとするマシンのIPアドレスを指定する。ローカルで閉じているならば、「zend_debugger.allow_hosts=127.0.0.1」と書けばよい。
zend_debugger.expose_remotely=alwaysを追加する
よくわからないが設定する。
dummy.phpをドキュメントルートにコピー
展開されたフォルダーにあるdummy.phpをWebサーバーのドキュメントルートにコピーする。と、READMEに書いてあるが、これをしなくてもデバッグできるもよう。
Webサーバーを再起動
phpinfo();を表示すると、失敗してなければ「Zend Debugger」という項目が表示される。表示されているディレクティブの中に「zend_debugger.allow_hosts」が設定した通りになっているか確認する。
Debugger Pluginのインストール
「Download Executable Debugger Plugin」というリンク先からファイルをダウンロードしてEclipseにインストールするか、Update SiteにZend PDTを登録して、「Zend Debugger Feature」インストールするかのどちらかであるが、これはEclipseのプラグインの一般的なインストール方法である。

Featureのインストールをしくじってなければ、「PHP Debug」のパースペクティブが追加可能になっているはずなので、これでWebサーバで実行されるPHPのデバッグが可能になる。

Eclipse PDTを使っていて 意味不明な"syntax error, unexpected~"がでる場合

小ネタですが、PDTを使ってPHPファイルを編集実行したときに、"syntax error, unexpected~"(~のところは"@"とかT_STRINGとか)が発生しているが、エディタ上ではどう見てもそんな文字がないのは、どういうことかというお話です。

おそらく、コード系がおかしいと思われます。しかし、ソースコード上でマルチバイト文字がないときでも、このようなエラーが出るようです
とりあえず、ソースファイルのプロパティを開いて、保存のエンコーディングを確認したほうがよいでしょう。おそらく、もっとも無難だと思われるのは「UTF-8」だと思います。UTF-8で保存するとあぶり出しのようにエラーになっている文字列が現れます。

あと、デフォルトのエンコーディング(新規作成、読み込み)を変更したいときは、「設定(Preferences)」(ウィンドウ(Window)メニューの一番下にある)を開いて、「一般(General)」の項目の中にある「ワークスペース(Workspace)」の画面で設定できます。

Eclipseを3.3にしたんですが、こんなエラーが出てきて、なんだかなぁと思ったら、こんなことになってました。