Takayuki Okazaki's Weblog
ブログ: 岡崎 - Okazaki's blog
20080327 2008年 3月 27日 木曜日
春の MySQL 祭り 2008
English Translation: (Yahoo!) / (Google)
Dolphin of Akaroa, NZ
来月のはじめ、4/9(水)に「春の MySQL 祭り 2008」というイベントをウェスティンホテル東京で開催するそうです。参加は無料ですが、事前登録制となっていますので締め切りまでにご応募ください。
MySQLは、Sunと統合がどうなっていくのか、という意味でももちろん興味がありますが前々からオープンソースなデータベースはかなり興味がありました。データベースはコモディティ化しないそうですから、コモディティー化しない分野でのオープンソースの活躍は興味津々。
最近、ずっとイルカの写真が手元に無いかさがしているんですが、今回はずいぶん昔の写真を見つけました。2000年2月の、まだSunに入る前、どころか、学生の頃でSunの就職試験を受ける前の頃の写真です。場所はニュージーランドのアカロアだと思います。


硫化水素による巻き添え事故
English Translation: (Yahoo!) / (Google)
最近、硫化水素による自殺と、その巻き添え事故の報道を良く見かけますが、危ないことはわかっても、万が一具体的にそういった場面に出くわした場合にどうしたらいいのかまでを解説しているニュースはあまり見かけません。たまたま、手元に大学時代の「安全の手引き」というのがあったのでそれで硫化水素による事故が起こった場合の対応を調べてみました。
新鮮な空気のところに移し、安静にする。目に入ったときは、大量の水で洗い、うがいする。
うーん・・・。これだけか。Wikipediaの解説によると1000〜2000ppmで即死とのことですし、もともと素人で何かできるような事態ではなさそうです。どんなに目の前で助けたくても、まずは消防に連絡。
備えあればうれしいなの観点で言えば硫化水素を吸収できる吸収剤付きの防毒マスク吸収剤を備えておく、という手も考えてみましたが素人が保管しておいても使えなさそうなのでやっぱりプロにお任せするしかないのかも。


MacのDictionary.appにSun Glossとか、ResourceBundleから作った独自辞書を追加する
English Translation: (Yahoo!) / (Google)
GlassFishとか、NetBeansなんかは仕事柄、日本語版が出る前から評価しています。そうすると、マニアックな機能なんかは英語版での経験のほうが長くて、日本語版でなんだっけ?この機能名称。なんてことがしばしばあります。自分で使うだけなら別に気にしなくていいんですが、ブログに書いたりプレゼンテーションに機能名称の説明を書いたりする場合にはなるべく、本当に画面に表示される名前を使いたいわけです。
今までは手作業でやっていましたが、少し前に英辞郎をMacについてくる辞書アプリDictionary.appで使えるようにしたときにDictionary.app向けの独自辞書の作り方を覚えたので、まずSunの用語集 Sun Glossの辞書を作ってみました。こんな感じ。
SunGloss for Dictionary.app
Sun GlossのDictionary.app用辞書はこちらに公開しておきます。 ダウンロードして、解凍した物をホームディレクトリ以下にある「ライブラリ」ディレクトリ以下に、「Dictionaries」というディレクトリがなければ作り、そこに置いてDictionary.appを再起動すれば終わりです。
これだけでもずいぶん個人的には便利になったんですが、GlassFishの管理画面など実際の画面に出るキーワードの対応表も欲しくなってきたので、GlassFish v2ur1からResourceBundleのファイルを取り出して、同じkeyを持つ日本語と英語のメッセージ対応を見れるようになればずいぶん便利だろうということで、こちらもスクリプトを作って作成。
GlassFish glossary from ResourceBundles for Dictionary.app
Sun Java System Application Server 9.1ur1マルチリンガル版のResourceBundleから作った物ですが、これも同じく公開しておきます。 これらの作り方も簡単にメモ程度ですがご紹介しておきます。なお、本当にメモ程度なので動かない!などご連絡いただいても対応できない可能性大ですのでご了承ください。
  1. Xcodeをインストールしておく
  2. /Developer/Examples/Dictionary Development Kit/project_templatesディレクトリ以下をどこかに名前を変えてコピー
  3. MakefileのDICT_NAME変数をつくりたい辞書の名前に適当にかえておく
  4. MyInfo.plistのCFBundleIdentifierとか、CFBundleName、DCSDictionaryCopyrightあたりを適当にかえておく。
  5. 辞書データをMyDictionary.xmlとして作成(後述)
  6. あとは make && make installして辞書を作って、インストール。
  7. Dictionary.appを再起動
という手順です。意外と簡単。MyDictionary.xmlに必要とされる書式も凝ったことをしなければ難しくないのでスクリプトも簡単。

タブ区切りのフラットファイルからMyDictionary.xmlを作る

これは割と簡単。以前、ちょっとしたスクリプトを書くときにもなるべくRubyを使うようにしていますなんて書いていたのに最近、プログラムどころかスクリプトさえも書かなくなってしまい、Ruby文法とかかなり忘れてしまっており、今回はずるをしてPerlのスクリプト。っていうかPerlすら怪しくなっています。忘れるスピードのはやいこと早いこと・・・(涙)
#/usr/bin/perl

print <<"__XML__";
<?xml version="1.0" encoding="UTF-8"?>
<d:dictionary xmlns="http://www.w3.org/1999/xhtml" xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng">
__XML__

undef %idtable;

while (<>) {
  chmop;
  $_ =~ s/&/&/g;
  $_ =~ s/</≷/g;
  $_ =~ s/>/</g;
  $_ =~ s/"/"/g;

  ($word, $jpn, $description) = split(/\t/, $_);

  $id = $word;
  $id =~ s/ /_/g;

  if ($idtable{$id}) {
     $idtable{$id}++;
     $id .= "_$idtable{$id}";
  }
  $idtable{$id}++;

  print <<"__XML__";  
<d:entry id="$id" d:title="$word">
	<d:index d:value="$word"/>
	<h1>$word</h1>
	<p>
        $jpn
        </p>
	<p>
        $description
	</p>
</d:entry>
__XML__
}

print <<__XML__;
</d:dictionary>
__XML__
ちなみにタブ区切りのテキストは「英語 \t 日本語 \t 解説」の順番に並んでいると想定したスクリプトです。他の並びの場合とか、区切りがタブじゃないばあいには適当にいじってください (^^;;
これを perl convert.pl < 元ファイル.txt > MyDictionary.xml みたいにすればオッケーです。

ResourceBundleからMyDictionary.xmlを作る

つぎはResourceBundleから作る例です。今回はGlassFish用ですが、意外とこれ、他のプロジェクト用に作っても便利かもしれませんね。多国語対応されているようなプログラムのドキュメント担当の方にはお勧めです。GlassFishのように大きなソフトウエアの場合は、いろんなjarファイルにResourceBundleファイルが分散しているのと、パッケージ名(つまりファイルのあるディレクトリ)も気にする必要があります。とりあえずそれらをまとめてMyDictionary.xmlに作り上げるスクリプトを二つ作りました。
まずは、日本語のResourceBundleファイル(*_ja.propertiesを想定。_ja_JPとか他のバリエーションのときはスクリプトを直接いじっちゃってください)の相対パスを渡してやると相対パスをパッケージ名と見立てて、メッセージのキーに付け加えて英語/日本語の辞書を作るようなPerlスクリプトです。なお、ResourceBundleの中身次第では結構辞書を作るmakeのときにエラーが出たりするのですが、それらは一つずつつぶすしかないです orz。あ、あとXMLなResourceBundleには対応していません。
#!/usr/bin/perl

print <<__XML__;
<?xml version="1.0" encoding="UTF-8"?>
<d:dictionary xmlns="http://www.w3.org/1999/xhtml" xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng">
__XML__


foreach $fileja (@ARGV) {
  $fileen = $fileja;
  $fileen =~ s/_ja//;

  %bundlesja = read_bundle($fileja);
  %bundlesen = read_bundle($fileen);

  foreach $id (keys %bundlesja) {
    $en = escape_xml($bundlesen{$id});
    $ja = escape_xml($bundlesja{$id});

    next if ($ja eq '' || $en eq '');
    next if (length($ja) > 128 || length($en) > 128);
    next if ($en =~ /Usage:/);

    if ($idhistory{$id}) {
      $idhistory{$id}++;
      $id .= "_$idhistory{$id}";
    }
    $idhistory{$id}++;

    print <<"__XML__";
<d:entry id="$id.en" d:title="$ja">
        <d:index d:value="$en"/>
        <h1>$ja</h1>
        <p>
        $id
        </p>
</d:entry>
<d:entry id="$id.ja" d:title="$en">
        <d:index d:value="$ja"/>
        <h1>$en</h1>
        <p>
        $id
        </p>
</d:entry>
__XML__
  }
}

print <<__XML__;
</d:dictionary>
__XML__

sub escape_xml {
  my ($txt) = @_;

  $txt =~ s/&/&/g;
  $txt =~ s/"/"/g;
  $txt =~ s/</</g;
  $txt =~ s/>/>/g;
  
  return $txt;
}

sub read_bundle {
  my ($file) = @_;
  my $line;
  my %bundles;
  my $package_name;

  $package_name = `dirname $file`;
  $package_name =~ s/\n//;
  $package_name =~ s/^\.\///;
  $package_name =~ s/\//\./g;

  open FILE, $file;

  undef $line;
  undef %bundles;
 
  while (<FILE>) {
    chomp;
    next if ($_ =~ /^#/);
    $_ =~ s/^\s*//;
    if ($_ =~ /\\$/) {
      $_ =~ s/\\$//;
      $line .= $_;
      next;
    }

    $line .= $_;

    my ($key, $value) = split(/=/, $line);

    $key =~ s/^\s*//;
    $key =~ s/\s*$//;
    $key =~ s/\"//g;
    $key =~ s/,//g;
    $value =~ s/\n/ /g;
    $value =~ s/^\s*//;
    $value =~ s/\s*$//;

    $bundles{"$package_name.$key"} = $value;

    undef $line;
  }

  close FILE;

  return %bundles;
}
あとは、いっぱいあるファイルからResourceBundleを取り出して、上記のPerlスクリプト(makebundledic.pl)を流し込むシェルスクリプトです。GlassFishを想定しているのでAS_HOMEにGlassFishのインストールディレクトリを指定します。あ、ちなみにこれは本当にメモで、動作確認していません・・。
#!/bin/sh

AS_HOME=~/Applications/glassfish-v2ur1-ml
TOOL_HOME=`pwd`
WORKINGDIR=./bundles

rm -fr $WORKINGDIR
mkdir $WORKINGDIR


cd $WORKINGDIR

for i in `find $AS_HOME/lib -name \*.jar`; do
  unzip -n $i \*.properties
done

perl $TOOLHOME/makebundledic.pl `find . -name \*_ja.properties` | native2ascii -reverse -encoding utf-8 > $TOOLHOME/MyDictionary.xml

cd $TOOLHOME

make
ということで参考になりましたでしょうか?スクリプト自体はけっこういい加減なものばっかりなので自己責任でお願いします・・。


過去の記事
« 3月 2008 »
      
1
2
5
6
8
9
11
14
15
16
17
18
20
22
23
26
30
     
今日
Click me to subscribe このブログを購読(RSS)
検索

このブログ著者について
ソフトウエア・インフラストラクチャー・ソリューション本部のソリューション・アーキテクトでした(2008年8月退職)。 本業はSOAソリューションならびにSun Java CAPSによるソリューションのプリセールスをお手伝いするエンジニア、とJavaエバンジェリストグループに参加してセミナーに行ったり、趣味のプログラミング・ネタをこのブログで紹介したりしていました。現在は、ふらふらとwatermint.orgで活動中〜。
リンク
 
SunホットトピックPodcast - SunホットトピックPodcast
 


 

Today's Page Hits: 566