kobo touchで英和辞書 リターンズ

えー、先日のアップデートで使えなくなった英和辞書ですが、ついカッとなってバイナリハックしてしまいました。もう、意地で。

その結果、とりあえず辞書の差し替えに成功したので v2.1.1 用の辞書を置いておきます。

語彙等の辞書データは前回の wordnet の辞書と全く同じです。

v2.1.1 でも英和辞書
v2.1.1 ファームでも英和辞書 

案の定、辞書データは暗号化されていました。

もともと平文だったファイルを暗号化したという経緯から、楽天は kobo 内部の辞書データにはアクセスして欲しくないという思いを持っていると思いますので、暗号化の形式などの詳細は非公開にしたいと思います。

 暗号化情報の公開によって、暗号化方式の変更を余儀なくされ、無駄に Kobo 社のマンパワーが使われてしまうのは本意ではありませんので。もっと改良や改善といった方向にエネルギーを使ってほしいですからね。

 

英辞郎用コンバータですが、完成したとしても、上記理由でクローズドソースでリリースすることになると思います。本当は、趣味で作ったプログラムはできるだけオープンソースにしたいんですけどね・・・。

おかげでまた英辞郎コンバータは完成まで遠のいてしまいました・・・。気を長くしてお待ちください。 

kobo で英和辞書が使えなくなった

先日作ったkobo 用英和辞書ですが、それなりに好評でブログに取り上げていただいたり、お礼のコメントまでいただきました。

使っていただいたみなさま、ありがとうございました。

 

その英和辞書ですが、残念ながら先日 kobo のファームアップデートで使えなくなってしまいました。  

原因は辞書フォーマットの変更です。以前は html ファイルを gzip で圧縮したものが辞書ファイルとして使われていたのですが、v2.1.1 では全く知らないファイル形式になっていました。

ファイルサイズはほとんど変わっていないので、圧縮の方式を変えたと言うよりは、暗号化の意味合いが強いのではないかと予想しています。

仮に暗号化したとすると、 ライセンス料を払っている辞書データを抜かれたくない or 辞書データの提供側から暗号化をリクエストされた、というのが対応目的ではないかと思います。

暗号化となると解析はかなり困難ですので、新しいファームウェア用の英和辞書は作れない可能性が高いです。英辞郎用のコンバータもチビチビと作っていたので、一応無駄あがきはやってみるつもりですけども。

こうなったらオフィシャルで英和辞書に対応してもらうしかないですね

kobo touchで英和辞書

—-2012/09/01追記ここから—- 

この記事はファームウェア v2.0.2 の頃のものです。v2.1.1 ではこの英和辞書は使えなくなっています。

—-2012/09/01追記ここまで—-  

kobo Touch には英英辞書、国語辞書、英独辞書など、いくつかの辞書が入っています。ただ、日本語がからむものとしては国語辞書しかありません。

英語が苦手な私にとっては、洋書を読むには英和辞書は必須です。個人的に一番使いたいのは英和辞書なので、なんとか英和辞書が使えるようにならないか試行錯誤してみました。

その結果、英英辞書の内容を差し替えることで英和辞書が使えるようになりました!

 kobo touch で英和辞書!!

とりあえず簡単に試せるパッケージを作ってみました。動作保証は出来かねますので最悪工場出荷に戻してもいい人だけ試してください。

また、この英和辞書は WordNet のフリーな辞書データを使用している関係上、日本語が登録されていない単語もあります。あまり過剰な期待はしないでください。

適用すると英英辞書と差し替えますので、英英辞書は使えなくなるのでご注意ください。

2012/09/01追記:  v2.0.2 用です。v2.1.1 では使えませんのでご注意ください。 

zipファイルを展開すると Kobo.tgz が入っていますので、Kobo touch を PC に接続して認識されるドライブの .kobo ディレクトリにコピーしてください。

kobo Touch を PC から切断するとアップデートが開始されます。

元の英英辞書に戻すには工場出荷時に戻す必要があります。

 

さて、この英和辞書ですが、上でも書いたとおり、フリーな辞書データを使っています。辞書データの取り出しには、以下のサイトのスクリプトを使わせて頂きました。いじったスクリプトは整理して公開するつもりです。

細かいことはよくわかりませんが、WordNet, 日本語WordNet というプロジェクトの成果物としてフリーの英和辞書が作れるようです。

また、上記ブログにも書かれていますが、単語の意味は日本語が表示されますが、例文は英語のものが表示されます。そのあたりも上記ブログと同じです。 (というよりいじり方が分からなかった :p)

 

辞書の形式ですが、辞書ファイルは本体の /usr/local/Kobo/dicthtml-* に置いてあります。英英辞書は dicthtml, 国語辞書は dicthtml-ja と言った感じです。

dicthtml 以下には

  • aa.html
  • ab.html
  • ac.html

といったように単語の頭文字2文字ごとにファイルが用意されています。拡張子は html となっていますが、実際は gzip された html です。

html ファイルの中身は実際に覗いてみたほうが早いので割愛します。<w>タグで1単語ずつ区切られています。

また、dicthtml ディレクトリには *.html ファイルの他に words という単語のデータベースファイルがあります。

これは marisa 用のデータベースだそうです。marisa 自体初めて知りました。

*.html ファイルに存在する語を1行1語としたファイルを作り、以下のように marisa-build コマンドに入力することで words ファイルを生成することができます。marisa-build コマンドは marisa をビルドすると tools/ 以下に生成されます。

$ cat word-list.txt
A
A battery 
A horizon
      :
      : 
$ ./marisa-build < word-list.txt > words

ちょっと駆け足でしたが、こんな感じで辞書データを差し替えることが可能なようです。

英辞郎の辞書が使えれば完璧なんですが、試したら容量が大きくて kobo 本体に入りませんでした。 ある程度間引くなどの工夫が必要みたいです。もう少し試してみます。

Kobo 用のシリアルコネクタ作成

今回は kobo Touch にシリアルを繋げるためのコネクタを作りました。

直接ハンダ付けしてしまってもいいんですが、裏蓋を閉めて使うことも考えると簡単に脱着できたほうがいいかなと思い、 コネクタを作ることにしました。

本当はストロベリーリナックスのスルーホールテストクリップが欲しかったんですが、ちょっと高いので・・。

参考にしたのは以下のページ。

ハンダ付けしやすい金属で、比較的弾性が強い順として洋白線、燐青銅線、真鍮の順らしいので、これらの 0.3mm の線材を買って来ました。

燐青銅線、真鍮線
真鍮線(上)と燐青銅線(下2本)

洋白線は在庫切れで売っていなかったので、燐青銅線と真鍮線 (ともに0.3mm) を買って来ました。

これを折り曲げて作ったのがこちら

自作コネクタ
自作コネクタ

燐青銅線で作ってみました。

こんな感じで装着します。

コネクタを装着
コネクタを装着

とりあえずはいい感じで満足です。

ただ、思っていたよりバネが弱く、数回抜き差しすると緩んでしまいそうです。ちょっと様子見ですね。

これで裏蓋さえ開ければ手軽にシリアルデバッグができるようになったので、本格的にいじってみようと思います。

kobo touch にUSBシリアルを繋げる

kobo Touch のシリアルピンがわかったので、USBシリアルをつなげてログインしてみました。

使ったのは秋月のFT232RLモジュールです。1.8Vから5VまでのUARTを繋げられるので便利です。

ICクリップを使ってこんな感じで引き出して・・・

kobo touchからUARTを引き出す
kobo TouchからUARTを引き出す 

FT232RLにつなげます。

FT232RLと接続
FT232RLに接続

kobo Touch のJ5と FT232RL モジュールは以下のようにつなぎます。

 Kobo J5       FT232RL
  1 VCC
  2 TX   -----  5 RX
  3 RX   -----  1 TX
  4 GND  ----- 24 GND

電源OFFから起動した時のログは以下のようになりました。

U-Boot 2009.08-dirty-svn (12 13 2011 - 16:52:29)

CPU: Freescale i.MX50 family 1.1V at 800 MHz
mx50 pll1: 800MHz
mx50 pll2: 400MHz
mx50 pll3: 216MHz
ipg clock : 66666666Hz
ipg per clock : 66666666Hz
uart clock : 24000000Hz
ahb clock : 133333333Hz
axi_a clock : 400000000Hz
axi_b clock : 200000000Hz
weim_clock : 100000000Hz
ddr clock : 200000000Hz
esdhc1 clock : 80000000Hz
esdhc2 clock : 80000000Hz
esdhc3 clock : 80000000Hz
esdhc4 clock : 80000000Hz
Board: MX50 RDP board
Boot Reason: [POR]
Boot Device: SD
I2C: ready
DRAM: 256 MB
MMC: FSL_ESDHC: 0, FSL_ESDHC: 1
In: serial
Out: serial
Err: serial

MMC read: dev # 0, block # 1023, count 1 partition # 0 …
1 blocks read: OK

MMC read: dev # 0, block # 1024, count 1 partition # 0 …
1 blocks read: OK
[only 1 key]
0 keys,0x00,0x00
0 keys,0x00,0x00
0 keys,0x00,0x00
0 keys,0x00,0x00
ram p=70000000,size=268435456

MMC read: dev # 0, block # 1023, count 1 partition # 0 …
1 blocks read: OK

MMC read: dev # 0, block # 1024, count 1 partition # 0 …
1 blocks read: OK

MMC read: dev # 0, block # 18431, count 1 partition # 0 …
1 blocks read: OK

MMC read: dev # 0, block # 14335, count 1 partition # 0 …
1 blocks read: OK

MMC read: dev # 0, block # 14336, count 1979 partition # 0 …
1979 blocks read: OK
Kernel RAM visiable size=255M->255M
Hit any key to stop autoboot: 0

MMC read: dev # 0, block # 2047, count 1 partition # 0 …
1 blocks read: OK
cmd=mmc read 0 0x778205a0 0x7ff 0x1
no kernel image signature !
cmd=mmc read 0 0x70800000 0x800 0x1800

MMC read: dev # 0, block # 2048, count 6144 partition # 0 …
6144 blocks read: OK
## Booting kernel from Legacy Image at 70800000 …
Image Name: Linux-2.6.35.3-850-gbc67621+
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1904568 Bytes = 1.8 MB
Load Address: 70008000
Entry Point: 70008000
Loading Kernel Image … OK
OK

Starting kernel …

Uncompressing Linux… done, booting the kernel.
epdc_init_sequence(994) : epd_power_on request fail !
1+0 records in
1+0 records out
512 bytes (512B) copied, 0.002350 seconds, 212.8KB/s
cannot open /dev/null
dosfsck 3.0.6, 04 Oct 2009, FAT32, LFN
There are differences between boot sector and its backup.
Differences: (offset:original/backup)
494:9c/00, 495:e2/00, 496:48/00, 497:42/00, 498:2a/00, 499:dc/00, 500:b3/00
, 501:7b/00, 502:4b/00, 503:25/00, 504:a0/00, 505:b1/00, 506:65/00
, 507:43/00, 508:ed/00, 509:52/00
Not automatically fixing this.
/dev/mmcblk0p3: 299 files, 3579/348630 clusters
FAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case sensitive!

(none) login: Screen resolution is.. 600 x 800
> ApplicationBase: loading locale: “:/translations/trans_ja_JP”
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
> WebSyncScheduler: scheduleTimer: No need to schedule a sync
loadPlugin: loaded plugin for QFontEngine
Loading iType.. YES
> FTE Startup stage: 0. Language selection…
> FTE Startup stage: 1. Select setup type…
> FTE Startup stage: 2. Changelog…
> FTE Startup stage: 3. Auxillary notifications…
> Warning: You haven’t called pageView yet: “5(Settings*Set%20View%20Type*List)”
> Warning: Why are you deselecting an unselectable textheader?
> Warning: Why are you deselecting an unselectable textheader?
static QList Repository::retrieve(QString, QString, const QMap&, const QList&, int, int, const QString&) [with T = ShelfContent] Falling back to db
> Warning: You haven’t called pageView yet: “5(Settings*Set%20View%20Type*List)”
> FSCheckThread: dbMalformed: false fsCorrupted: false
loadPlugin: loaded plugin for QRasterPaintEngine

(none) login:
(none) login:
(none) login: sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
Object::connect: No such slot KepubBookReader::displayTitlePage()
Object::connect: (sender name: ‘ReadingView’)
Object::connect: No such signal KepubBookReader::showFooter()
Object::connect: (receiver name: ‘ReadingView’)
Object::connect: No such signal KepubBookReader::hideFooter()
Object::connect: (receiver name: ‘ReadingView’)
Object::connect: No such signal KepubBookReader::openFooterMenu()
Object::connect: (receiver name: ‘ReadingView’)
Object::connect: No such signal KepubBookReader::closeFooterMenu()
Object::connect: (receiver name: ‘ReadingView’)
Object::connect: No such slot KepubBookReader::footerMenuClosed()
Object::connect: (sender name: ‘ReadingView’)
Object::connect: No such slot KepubBookReader::footerMenuOpened()
Object::connect: (sender name: ‘ReadingView’)
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
loadPlugin: loaded plugin for QRawFont

(none) login: sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill

(none) login:
(none) login: sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill
sh: you need to specify whom to kill

(none) login:
(none) login:
(none) login:
(none) login:
(none) login:
(none) login:

root 、パスワード無しでログインできます。

ただ、数秒触らないとすぐにサスペンド(?)してしまいます。頻繁にサスペンドできるのはE-ink端末ならではですね。 そりゃ電池ももつわけだ。

ryoさんのブログによると、killall nickel で nickel プロセスを止めると、このスリープも止まるそうです。

これで色々いじれる環境が整いました。