hishidaの開発blog

EBシリーズ(EBPocket,EBWin,EBMac,EBStudio),KWIC Finder,xdoc2txt,読書尚友の開発者ブログ

EBStudio リニューアル計画(5) 今後の予定

すでにHPで告知済みですが、EBStudio2のリリースについて、次のように決めさせていただきました。

  • EBStudio 1.70 は2017/11/30をもって販売終了。
  • EBStudio2は2017年12月に販売開始(予価1000円+税)。
  • 既存のユーザの方は、優待アップグレードを実施(500円)。
  • EBStudio2の開発意向発表を行った2017年9月以降に購入された方は、希望者は無償アップグレード
  • Mac OS X版は来年リリース。ライセンスキーはWindows版と共通とする。
  • 「ライセンスキーを入力しない場合は前方一致検索だけ作成できる」という仕様は以前と同じ。

無償アップグレードを期待しておられた方には大変申し訳ありませんが、旧ソースからのリファクタリングに多大な時間を要しており、新アプリを開発するぐらいの作業量がかかっているので、ご理解いただければ幸いです。

なお、旧 EBStudioとの互換性に関しては、次の大型辞書での変換で確認しており、各種変換ツールキットで変換したEBStudio用HTMLは、ほぼ変換できると考えています。

  • マイぺディア
  • 世界大百科事典
  • 小学館スーパーニッポニカ2003
  • 大辞泉
  • 岩波仏教辞典
  • グランドコンサイス(DTONIC)
  • LDOCE4
  • Collins COBUILD
  • 学研Super日本語大辞典

EBStudio リニューアル計画(4) CSVファイルからの変換

今回新たに、CSVからEPWINGへの変換をサポートした。一般的な利用者がEPWING辞書を自作したいと思った場合は、CSVからの変換が一番簡単だと思う。EXCELAccessなどで作りためた個人辞書をCSVで保存すれば、EBStudio2 でEPWING辞書に変換できるので、非常に便利だ。
CSV変換の仕様:

  • 一行目は見出し行とする
  • 項目区切りは、カンマ(,) タブ 縦棒(|)をサポートする
  • 文字エンコードShift_JIS,UTF-8,UTF-16をサポートする
  • テキストウィザードを起動すると、CSVの一行目を読み込み、列ごとに見出し語(headword)、本文(meaning)、かなインデックス(kana)、表記インデックス(keyword)を定義する。見出し語からは表記インデックスも作成する。

ソースのタイプからCSVを選ぶ

Text Wizardを起動し、列ごとに型を指定する

EBStudio2で利用できる入力形式をまとめると:

Shift_JIS UTF-16 UTF-8
HTML(EBStudio互換)
PDICテキスト
PDIC一行形式
PDIC PDIC for Win32 PDIC/Unicode
辞郎形式
プレインテキスト
XHTML(libxml2)
CSV

◎ - EBStudio2で新たに追加したもの

EBStudio リニューアル計画(3) XMLライブラリ

おさらいすると、EBStudioでは次のようにHTMLからEPWINGへの変換をサポートしている。
辞書系のコンテンツ
EBStudioの設計を行ったのは1999年頃だが、辞書や書籍の入力ソース形式をHTMLにしたのは正解だったと思っている。HTMLなら理解が簡単で、プログラマでなくても記述が容易だ。なによりも辞書コンテンツはすでにSGMLなどの何らかのマークアップ言語で記述されていることが多いはずで、HTMLなら既存のマークアップ言語からの変換が簡単だからである。当時はXML1.0が出たばかりで、利用が広がるかどうかはわからなかった。

さてHTMLやXMLを解釈するには構文を解釈するパーサーが必要だが、当時はデファクトといえるパーサーのライブラリがなかった。当時利用できたC言語XMLパーサーのなかで今日も命脈を保っているライブラリとしてはexpatがあるが、結局EBStudioではexpatは使わずにパーサーを自作した。
実はこのパーサーを自作したことが、EBStudioの欠点の一つになった。その後XML関連の技術はXSLTやXPointerを始め大きく発展したが、EBStudioではこれらが使用できない。きちんとしたHTML/XMLパーサーを搭載したいという構想はずっと持っていた。

Libxml2

今回のリニューアルでは、広く使われているXML CパーサーであるLibxml2を採用した。Libxml2はHTML/XMLの両方がパースでき、DOM,SAX,XSLT,XPointerに対応している。
The XML C parser and toolkit of Gnome
Libxml2のライセンスはMIT Licenseなので商用でも利用できる。ただし、Libxml2と同時に使用する文字コード変換ライブラリであるlibiconvはLGPLなので、商用に使うには問題がある。調べたところ、libiconvの代わりにicuが使用出来ることが分かった。
Kotorel: VC++でxmlを扱おう - libxml2の紹介
ただし、従来の自前のHTMLパーサーも残してあって、どちらのパーサーを使うかを選択できる。なぜなら、EBStudioを前提とした変換ツールキットがネット上に多数存在するので、下位互換性を残しておかないといけないからだ。

JepaX,DicX,LeXMLについて

さてXMLが利用できますと言っても、XMLは拡張可能なマークアップ言語に過ぎなくて、マークアップされた要素が見出しなのか、本文なのか、検索キーなのかを指定しなければならない。
実は日本電子出版協会(JEPA)出版データフォーマット標準化研究委員会が定めた出版物交換用XMLフォーマットJepaXというものがあり、Ver0.9で仕様が止まっているが、出版業界内部では利用されていると聞いている。
このJepaXをさらに辞書向けに改良したDicXという仕様案(イースト株式会社)もあったのだが、DicXはすでにメンテナンスがされておらず、サイトも消滅している。
その後DicXの後継規格として株式会社ディジタルアシストが策定したLeXMLが普及し、出版業界ではデファクトになっている。
JEPA|日本電子出版協会 LeXMLとは?
EBStudioのリニューアルにあたっては、一応これらの規格との整合性を考えておかないといけない。

新パーサーの考え方

ではJepaXとLeXMLをサポートすればいいのかということだが、サポートしても恩恵をうけるユーザはほとんどいないという結論に達した(ディジタルアシストさんは確実に喜ぶと思うけど)。
結局、EBStudio2の新パーサーでも、基本はHTML4.0とXHTML1.0を使用することにした。EPWINGは利用できる書式指定が限られており、HTMLでも十分なことが多いのと、利用者もHTMLに慣れているからだ。
ただし部分的にLeXMLの要素を利用したいケースがどうしてもある。具体的には、辞書の検索インデックスを指定したい場合だ。
EBStudioでは <h1>〜<h6>タグと<dt>タグは検索キーになるという仕様だが、それ以外に本文上は現れない検索インデックスをつけたい場合がある。
DicX/LeXMLには<key>という専用の要素が定義されており、従来のEBStudioでも、HTMLに対する独自の拡張仕様として利用できた。だがこれはHTMLとしては文法違反であり、Libxml2を使うならちゃんと整合性をとらないといけない。
そこで次のようにXMLネームスペースを利用して、XHTMLで記述してもらう。これならXMLとして正当だ。



ああようがん

既存のXMLへの対応

既存のXMLコンテンツがあった場合に、EBStudioで変換したい場合にどうするかだが、今のところは、「XSLTXHTML に変換してね」、というスタンスだ。
だが、既存のXMLの各要素に対して、個別に [見出し語] [本文] [検索キー] [修飾要素] ... のように意味を割り当てる方法もありえる。これなら既存のXMLをそのまま読ませることが可能なので、たとえばWikipediaXMLを読ませることもできるかもしれない。
こちらも将来の追加開発で検討したい。

EBStudio リニューアル計画(2) Unicode外字自動割り当て

今回のリニューアルの目玉の一つとして考えているのが、Unicode外字の自動割り当て機能である。
ご存知の通り、EPWINGは規格の制定時期が古いために、文字コードJIS X 0208(第一水準、第二水準)しか使用できない。それ以外の文字は外字としてビットマップで定義することになる。
EPWING辞書を自作しようとすると、外字のビットマップを作字する手間が避けられない。EBStudioの場合、次のように外字のビットパターンを指定する外字定義ファイルと、外字コードとunicodeマッピングを定義する外字マップファイルの二つのファイルを用意する必要があった。非常に手間のかかる面倒な作業だ。

外字定義ファイル:




  ##    
  ##    
   #    
   #    
  #     
        
        
        
        
        
        
        
        
        
        
        


        
        
        
        
        
   ### #
  #   ##
 #     #
 #     #
 #     #
 #     #
 #     #
  #   ##
   ### #
        
        


        
        
        
        
        
   ###  
  #   # 
 #     #
       #
       #
       #
 #     #
  #   # 
   ###  
        
        


外字マップファイル:





EBStudioを利用するには、辞書・書籍のソースをEBStudio用のHTMLに変換することと、外字の作成という二つのハードルがあった。実際にはほとんどのユーザは、有志が作成した辞書変換ツールキットの結果をそのまま使っていたのではないかと思う。
今回のリニューアルの目的の一つは、EPWING辞書の自作のハードルを下げることであり、外字作成の手間はどうしても簡略化したかった。
今日ではせっかくUnicodeデファクトになっているのだから、辞書のソースはUnicodeで記述し、Unicode文字集合のビットマップフォントをEBStudioの内部で持てば、外字を作成しなくてもいい。
もちろんUnicodeにない記号を使用したいこともあるので、従来の外字定義ファイル、外字マップファイルも併用できるように残してある。
問題はUnicodeのフォントをどこから持ってくるかだ。OSのフォントを使用することはライセンスの問題でできないので、フリーで使用出来るビットマップフォントとして、電子書体オープンラボで配布されているhexファイルを使用することにした。
/efont/ Electronic Font Open Laboratory

hexファイルとはこのような形式である:

8 16
0020:00000000000000000000000000000000
0021:00000000080808080808080008080000
0022:00006622224400000000000000000000
0023:000000001212127E24247E4848480000
0024:00000000083E4948380E09493E080000

次の画面はPDIC Unicode版の英辞郎から EBStudio 2 で変換したものだが、外字は上記の電子書体オープンラボのフォントから自動作成しており、作字は一切行っていない。発音記号に注目してほしい。

もう一つの目玉の機能として、EBPocketやEBWin4,EBMac用の外字Unicodeマップファイル(.map .plist)も同時に作成される。CATALOGSと同じ場所に外字Unicodeマップを置いておけば、外字をUnicodeで表示するので、何もしなくてもきれいに外字を表示できる。

EBStudio リニューアル計画(1)

EPWING辞書作成アプリであるEBStudioの最終バージョンのリリースは2009年で、もう8年も開発を中断している。その頃からEBPocketのiOS版やAndroid版の開発を始め、さらに青空文庫ビューアまで手を出したため、手が回らなかったというのが正直なところだ。リニューアルの構想自体はもう何年も前からあったが、様々なプロジェクトが一段落してきたので、いよいよ手をつけることにした。

EBStudioの開発の着手は1999年に遡る。
EPWINGソニーの電子ブックは1990年代には興隆を誇ったが、その後電子辞書の主力はCD-ROMから電子辞書端末に移り、さらにスマートフォンの辞書アプリやネット辞書に移行した。気がつけば電子辞書端末の雄だったセイコーも市場から去り、隔世の感がある。EPWINGは新たな製品が全く出なくなったが、規格がJIS化されているために、オープンな辞書規格として生き残ることが可能になった。翻訳者の間ではEPWINGは現在でも現役で使われていると言われており、今後も細々と生き続けるのではないかと思っている。

作者が考えるEBStudioの問題点

  • 開発言語がVisual C++6.0 であり、C++の仕様が古いため、最近のVisual Studioではコンパイルができない。
  • MFCライブラリを多用しているために他のプラットフォームに移植が困難
  • 1999年当時はHTMLパーサーのデファクトがないために独自パーサーを開発したため、その後のXMLテクノロジーの進化に対応できていない
  • 入力エンコーディングSJISのみでUTF-8に未対応
  • EPWING外字の作成が難しい
  • 変換用の内部バッファサイズを細かく指定しないといけないので利用しづらい
  • HONMON のサイズの上限が4GB
  • EPWING Ver2までのサポートのため、マルチメディアデータもHONMONに全て収納する必要がある(EPWING Ver4から画像をHONMONG,音声をHONMONSに分けることができるようになった)

-

EBStudio 2.0の目標

  • モダンなC++コンパイルできるようにソースのリファクタリングを行う。MFCは全てATLで置き換える。
  • Unicodeのサポート。JIS外の文字はEPWING外字を自動割当し、EBWin用の外字マップを自動作成する
  • XMLパーサーのサポート
  • バッファサイズの指定を不要とすること
  • マルメディアファイルをHONMONG,HONMONSに分割できるようにする
  • EBStudioのファイル形式との互換性の確保(各種EPWING化Toolkitの資産がそのまま使用できること)

-

現時点で達成できていること

  • VisualStudio 2010と、Mac OS XXcodeでのコンパイル
  • EBStudioのファイル形式との互換性の確保
  • 4GB超のHONMON
  • マルメディアファイルをHONMONG,HONMONSに分割可能
  • EBStudio用HTMLのutf-8のサポート
  • unicode外字の自動割り当て。外字パターンはefontオープンラボのhexファイルを使用する。もう外字を作字しなくてもいい!
  • CSVからの変換のサポート。EXCELのテキスト変換ウィザード風に、列の意味を指定する。
  • PDIC Unicodeからの直接変換。
  • libxml2パーサーによるHTML4.0/XHTML1.0からの変換(こちらのパーサーは従来のEBStudio用HTMLと互換性はない)

これからの予定

順調にいけば年内にWindows版をリリース。ただし根本的に書き直しているので、従来のライセンスとは別になるかもしれない。その場合価格面で配慮したい。
Mac OS X はまだ変換コアエンジンが動いただけでUIを書いていないので、来年になるとおもう。

Visual C++2010ランタイムをインストーラに含める方法

EBWin4はVisual Studio 2010 のC#C++で開発しているため、実行には.Net Framework 4.0とVisual C++ 2010 ランタイムが要る。
.Net Framework 4はWindows Vista以降は標準でWindowsに含まれているため、通常はインストールの必要はない。
だがVisual C++ 2010 ランタイムは Windows に含まれていないため、別途ユーザに「Visual C++ 2010 再配布可能パッケージ(x86)」をインストールしてもらわないといけない。やっかいなことに、Visual C++ はバージョンごとにランタイムが違い、さらに32bit(x86)版と64bit版(x64)が存在する。EBWin4のREADMEには対応するバージョンの再配布可能パッケージのリンクが書いてあるが、利用者にとって敷居が高いことは事実である。

これまでインストーラにはフリーの Inno Setup を使っていたが、Visual Studioインストーラを使用すれば、必須コンポーネントをインターネットから自動インストールするようにできるので、今回からインストーラを変更することにした。

Visual Studioインストーラの作り方

  • セットアップの追加→新しいプロジェクト→その他のプロジェクトの種類→セットアップと配置
  • ここでInstallShield LEとVisual Studio インストーラーが選択できるので、Visual Studio インストーラーを選択
  • セットアップウィザードで各プロジェクトの「プライマリ出力」「ローカライズされたリソース」「サテライトDLL」を全て選択。これでセットアッププロジェクトが生成される。
  • インストーラに含める追加ファイルやアイコンを追加してセットアッププロジェクトを完成させる。
  • セットアップのプロパティ→構成プロパティ→必須コンポーネント

ここでインストールする必須コンポーネントVisual Studio 2010ランタイムライブラリ(x86)を追加する。(なお、必須コンポーネントインストーラに含めるか、インターネットからダウンロードするかを選ぶことができる。)

  • セットアップをビルドすると、setup.exeと<プロジェクト名>.msiの2つのファイルができる。

インストーラの本体は.msiだが、setup.exeはコンピュータに必須コンポーネントがあるかどうかを調べ、インストールされていなければ次のような画面が出て、インターネットからダウンロードしてインストールまで行う。

これで起動トラブルは減ると思う。

ここで一つ問題があって、Visual Studio 2010にはSP1が提供されており、2010無印と 2010 SP1とでランタイムライブラリが異なる。再配布可能パッケージも2010無印と2010 SP1の2種類が存在する。
Download Microsoft Visual C++ 2010 再頒布可能パッケージ (x86) from Official Microsoft Download Center
Download Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ (x86) from Official Microsoft Download Center
ユーザのコンピューターにVisual C++ 2010 SP1のランタイムが先に入っていた場合、 「より新しいバージョンのMicrosoft Visual C++ Redistributableがコンピューター上で検出されました」 と表示されてインストールが止まってしまう。
この場合は.msiを実行していただければ、EBWin4の本体だけインストールされる。

Visual Studio 2015 Installer Projects

Visual Studioインストーラはその後、Visual Studio 2012 で削除されてInstallShield LEだけになったが、 Visual Studio 2013から復活した。ただしVisual Studio Marketplaceから別途インストールする必要がある。現在のVisual Studio Community 2015でも使用できる。

Microsoft Visual Studio 2013 Installer Projects の設定方法について - マコーの日記
Microsoft Visual Studio 2015 Installer Projects をインストールする (Visual Studioの使い方 Tips)

補足:Inno setup でVisual C++ ランタイムを自動インストールする方法

なお、Inno setup でもスクリプトを書けば、Visual C++ Redistribuableのインストール有無をチェックして自動インストールすることができる。
inno setup - How to make vcredist_x86 reinstall only if not yet installed? - Stack Overflow
ただし、vcredist_x86.exeはあらかじめダウンロードしてパッケージに含めなければならない。

xdoc2txt の64bit版

ユーザからの要望があって、xdoc2txtおよびdllの64bit版を作成したので、忘備録を書いておく。

x64コンパイラおよびツールのインストール

Visual Studio 2010を標準でインストールすると、64ビット用コンパイラはインストールされないので、インストール時のオプションで「x64コンパイラおよびツール」を指定してインストールする。

既存のプロジェクトの64bit化

32bit版の既存のプロジェクトを64bit化する場合の手順。

  • 32bit版の既存のプロジェクトを読み込んだ後、メニュー→ビルド(B)→構成マネージャー(O)を起動
  • アクティブソリュージョン構成(C)→新規作成...を選び、64bit用の新しいソリュージョン構成を作成する。名称は例えば"Release x64"とする。この時設定のコピー元に(32bitの)既存のソリュージョンを選択すると、ソリュージョンがコピーされる。
  • アクティブソリュージョンプラットフォーム(P)→新規作成

新しいプラットフォームを入力または選択してください(P) : x64
設定のコピー元 : Win32

  • 構成マネージャーで、プラットフォームをWin32からx64に変更する。基本的にはこれだけで64bit版になる。
  • プロパティを開き、ライブラリアン→全般→対象コンピュータが MachineX64(/MACHINE:X64)になっていることを確認する(なっていなければ変更する)。

EXE、LIB、DLLも全て同様の手順で64bit化される。
注意点は、32bitのDLLと64bitのDLLを混ぜて使うことはできないので、関連するDLLやライブラリは全て64bitで揃える必要がある。xdoc2txtは内部でzlib1.2.3を使用しているので、zlib1.2.3もソースから64bitで再コンパイルした。
またVisual C++の64bit版を使用してコンパイルしたモジュールを実行する場合、Visual C++ 再頒布可能パッケージもx64用をインストールする必要がある。

32bit版 Download Microsoft Visual C++ 2010 再頒布可能パッケージ (x86) from Official Microsoft Download Center
64bit版 Download Microsoft Visual C++ 2010 再頒布可能パッケージ (x64) from Official Microsoft Download Center

一般的な注意

Visual C++ の64bit版の一般的な注意は、

  • 64 ビット Windows OS上ではポインタは64bitだが、int と long は相変わらず32bit ( 64bit整数は__int64 または long long ! )。したがってポインタをintやlongに代入してはいけない。
  • size_t、time_t、 ptrdiff_t は、64 ビット Windows OS上では 64 ビット。したがってtime_tをlongに代入してはいけない。

C# で64bit版のdllを使用する場合の注意点

C#のプロジェクトのプラットフォームターゲットはデフォルトではx86になっているため、デフォルトのままだと32ビット版のdllしか読み込まない。C#から64bitのdllを呼び出す場合は、プラットフォームターゲットをAnyCPUに変える。