« 2006年09月 | メイン | 2006年12月 »

2006年10月03日

[web2.0] レッシグ教授の札幌市立大公開講座を聞いてきました

web レポート

ちょっと前の話ですが、札幌市立大学の公開講座「価値創造経済へのロードマップ」を聴講してきました。講師にはローレンス・レッシグ教授。通訳にデジタルガレージの伊藤穰一氏という豪華な講演。

予定が合わずに後半の1時間ほどしか聴講できませんでしたが、ユーモアを交えた説明とキーワードをたたみかけるシンプルなプレゼン資料(一瞬高橋メソッドかと思いました)とで、非常にわかりやすく興味深い講演でした。
内容としては、著作権法と現在のインターネット文化との矛盾・問題点を説明し、その解決策としてCreative Commonsの有用性を訴えるというモノ。詳細については割愛しますが、締めのお言葉が印象に残ったので覚えている限りで引用させていただきます。

インターネット上で著作物が改変・公開(リミックス)される今の潮流はもはや止めることができないだろう。リミックスを行っているのは主に子供達だが、この流れを無理に止めようとすると、子供達は地下にもぐって活動を続けるだろう。そして、自分達の行っていることが違法であることを認識しながら活動するだろう。
子供達を犯罪者にするような、地下にもぐらせるような、子供達があえて犯罪者になる道を選択するような、そんな社会にはするべきではない。
そのために、デジタル社会に適した著作権法にかかわる活動を続けていかねばならない。

2006年10月13日

[おぼえがき] Digesterと文字エンコーディング

Digester Java XML 日本語 文字化け

Digesterを使ってXMLをパースする際に文字コードでハマった経験があるので、覚え書き。

今回のお題は「MS932のくせにencoding="Shift_JIS"と記述しているXMLをDigesterに食わせるとどうなるか。」です。
サンプルとして下記のようなXMLをDigesterを使ってパースしてみたいと思います。
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE sample SYSTEM "../dtd/932sample.dtd">
<sample>
<item>
<id>1</id>
<value>あああ</value>
</item>
<item>
<id>2</id>
<value>全角のにょろ「〜」</value>
</item>
<item>
<id>3</id>
<value>全角のマイナス「−」</value>
</item>
</sample>

最初のXML宣言のところで、
<?xml version="1.0" encoding="Shift_JIS"?>
と、エンコーディングをShift_JISで指定しています。が、もし、このXMLファイルがShift_JISのつもりなのに実際はMS932で作成されていたらどうなるでしょうか?
エンコーディングを気にせずに普通にDigester#parse(url)メソッドでパースすると、〜や−が文字化けしてしまいます。
/////////////////何も考えずにパースするの例///////////////////////////
/** パース対象のXML */
public static final String TARGET = "./xml/932sample.xml";

public Sample parseNormal() throws IOException, SAXException {

Digester digester = createDigester();
Sample sample = (Sample)digester.parse(TARGET);

return sample;
}

public static void main(String[] args) {
Digester932Test test = new Digester932Test();
try {
Sample sample = test.parseNormal();
System.out.println(sample);

} catch (IOException ex) {
System.out.println(ex.toString());
} catch (SAXException ex) {
System.out.println(ex.toString());
}
}

パースした結果を表示させて見ると、下記のように文字化けするはずです。

item = [ id:1, value:あああ ]
item = [ id:2, value:全角のにょろ「?」 ]
item = [ id:3, value:全角のマイナス「?」 ]

そこで、今度はparseする際にXMLファイルのURLを指定するのではなく、文字エンコーディングを指定したInputSourceを利用してみましょう。
/////////////////エンコーディングを指定してパースするの例///////////////////////////
public Sample parseByInputSource() throws IOException, SAXException {
InputSource is = null;
InputStreamReader reader = null;
//エンコーディングを指定したInputStreamReaderを作成してInputSourceを初期化する
reader = new InputStreamReader(
new FileInputStream(TARGET), "MS932");
is = new InputSource(reader);

Digester digester = createDigester();
Sample sample = (Sample)digester.parse(is);
return sample;
}

さて、これでエンコーディングを指定したので、ちゃんとパースされるはず。
ですが、実行してみると、環境によっては下記のようなエラーが発生します。

java.io.FileNotFoundException: /path/to/932sample.dtd (指定されたパスが見つかりません。)

どうも、XMLのDOCTYPEでDTDが相対パスで指定されている場合、

  • Digester#parse(url)を使用した場合:xmlファイルからの相対パスでDTDを探しに行く。

  • Digester#parse(inputsource)を使用した場合:javaを実行したディレクトリからの相対パスでDTDを探しに行く。


という動きになるように見受けられます。
これではイカンのでもう一工夫必要のようです。色々試してみた結果、下記の工夫に行き着きました。
InputSource#setSystemIdメソッドでXMLファイルを指定すると、XMLファイルからの相対パスでDTDを探しにいくようだ。
/////////////////エンコーディングを指定してパースするの例///////////////////////////
public Sample parseByInputSource() throws IOException, SAXException {
InputSource is = null;
InputStreamReader reader = null;
//エンコーディングを指定したInputStreamReaderを作成してInputSourceを初期化する
reader = new InputStreamReader(
new FileInputStream(TARGET), "MS932");
is = new InputSource(reader);
//XMLファイルのURLをSystemIdとしてsetする。
is.setSystemId(TARGET);

Digester digester = createDigester();
Sample sample = (Sample)digester.parse(is);
return sample;
}

こうすると、下記のように文字化けしないでパースできました。

item = [ id:1, value:あああ ]
item = [ id:2, value:全角のにょろ「〜」 ]
item = [ id:3, value:全角のマイナス「−」 ]


と、ここまで試してみて、InputSource#setEncodingというメソッドがあることに気がついてこれも試してみました。
InputSource is = new InputSource();
is.setSystemId(TARGET);
is.setEncoding("MS932");

APIドキュメント的にはこれで期待通りに動いてくれるはず。。。だったのですが、こちらはきれいに文字化けしてしまいました。
うーむ。なんか納得いかない。

本日のまとめ。
エンコーディングを指定したInputStreamReaderを渡してInputSourceを初期化する。
InputSource#setSytemIdでXMLファイルへのURLを指定する。
そのInputSourceをDigester#parseメソッドへ渡す。

2006年10月19日

[つぶやき] Googleブログ検索

google web

グーグル、「Googleブログ検索」を提供開始--英語版よりも範囲を拡大
Googleのブログ検索の日本語版がβリリースされたようです。
英語版よりも日本語ブログの範囲を広げたり、検索精度をあげたりという工夫がされているとか。(日本語版なので当たり前)
ためしに、アンタスブログの方々のブログを検索してみると、ちゃんと検索されるようですね。

日時を指定した検索ができるようですが、
タグ検索などはないんですね。
テクノラティとどっちが使いやすいかしばらく様子見。

とりあえず、
http://blogsearch.google.com/ping/RPC2
をPING通知先に追加しておいた。

それにしても、今回のブログ検索にしろ、
先日の世界に先駆け、グーグルが携帯で路線検索開始にしろ、
Googleの日本戦略が熱くなってきましたな。

更新PING打っているから当然といえば当然なんだけど、
エントリを書き込んでから、ものの1〜2分で検索されるようになった。
ちょっとスゴい。

2006年10月27日

[北海道] シンジラレナ〜イ

日ハム 野球 北海道

いまだに興奮さめやらないので。
日本シリーズの第5戦をパブリックビューイングで見てきました。と言っても、第3戦も第4戦も見に行っているんですけどね:-p
今日にも日本一が決まるぞ!ということで、頑張って仕事を早く終わらせて試合開始40分前くらいにパブリックビューイング会場に駆けつけたのですが、席はおろか床まで全て埋まっていました。仕方ないので吹き抜けの上の階の廊下から観戦することにしました。「ここはアッパーシート、特等席」と自分達に言い聞かせて、遠い画面をにらみながら必死に応援。
200610261810000.jpg
この日、サッポロファクトリーのパブリックビューイング会場には2,500人も集まったそうです。現場にいると会場全体に割れんばかりの声援が響きわたり、稲葉選手の打席の時にはイナバジャンプで建物が揺れるのを感じました。ドームの熱気にはかなわないのだろうけど、これだけ大勢の人たちが心をひとつにして応援している中に一緒にいると、とても勇気づけられますね。僕は今年北海道へUターン転職をしてきて色々と悩んだり心細かったり戸惑ったりしたわけですが、そんな中で地元のチームが日本一になる活躍をしてくれるのはすごく心強く感じましたし、純粋にうれしかったです。
夢と勇気をありがとうございました。来年も頑張ってください。

ちなみに、試合の終盤は我慢がきかなくなって最前列で応援していたのですが、後日、その様子がテレビに映っていたとの報告を各方面からいただきました。かなり恥ずかしい思いをしたので、来年からはもう少しおとなしく応援することにします。

2006年10月31日

[おぼえがき] MySQL4.1のLOAD DATAで日本語データをインポートする

MySQL 日本語 文字化け

MySQL4.1のLOAD DATAコマンドで日本語データをインポートしようとした時に少しハマったので覚え書き。

【やったこと】
UTF8で作成された日本語を含むCSVファイルを下記のコマンドにてMySQLのテーブルにインポートしようとした。

LOAD DATA INFILE 'foo.csv' INTO TABLE 'bar_table' FIELDS TERMINATED BY ','

なお、テーブルのデフォルト文字コードもUTF8にあわせている。
mysql> show create table bar_table \G
*************************** 1. row ***************************
Table: bar_table
Create Table: CREATE TABLE `bar_table` (
〜〜(中略)〜〜
) ENGINE=MyISAM DEFAULT CHARSET=utf8

【起こった問題】
インポートした日本語データが文字化けしていた。

【疑問】
CSVファイルとテーブルの両方とも文字コードをUTF8に統一しているのにどうして文字化けするのだろうか?

【原因】
結論から先に書くと、この時、データベースのデフォルトキャラセットがlatin1になっていたことが文字化けの原因だったようです。

mysql> show create database moo_database \G
*************************** 1. row ***************************
Database: moo_database
Create Database: CREATE DATABASE `moo_database` /*!40100 DEFAULT CHARACTER SET latin1 */

そこで、databaseのデフォルトキャラクターセットもUTF8に統一して再度インポートしてみると・・・
おお!文字化けせずにデータを登録することができました。

試しに、eucのデータベースにeucのテーブルを作成し、eucのcsvデータをインポートすると、こちらも文字化けせずに登録することができました。

【結論・本日の覚え書き】
MySQL4.1で日本語データをインポートする際には文字コードを統一しよう!
データベースの文字コード=テーブルの文字コード=インポート元ファイルの文字コード