[UPDATE2]多看 (Duokan) が Kindle3に魔法をかける

多看といわれるKindle2/3で動作する中国語OSを試してみました。名前だけは以前から知っていたのですが単純にKindle3を中国語化するハックという程度の認識しかありませんでしたが、実際使用してみるととにかくすごい機能が盛りだくさんでした。チャイナパワーはスゴイですね。

多看(Duokan) for Kindle3 のホーム画面

読み方はわかりませんが、英語では”Duokan”なので、「ドゥオカン」と発音するのでしょうか。サイトが中国語のために機能や不具合、アップデート内容、豊富な機能を理解するのなかなか難しいですが、英語に翻訳してくれているサイトもあるのでそちらを参考にできます。インストールは簡単にできますがアップデータを使ったハックのため、不具合が生じて文鎮化する可能性もありますので興味のある方は下記のサイトを参考にして自己責任で試してみてください。

このハックはNiLuJe氏らの実績あるハックと異なり環境構築や文鎮化防止対策の程度がはっきりしません。いまのところアンインストーラーも実装されていないようでリスクは高いです(起動ログの下に追記)。シリアル接続環境がない方、あるいはusbNetworkハックでコマンドラインから修正することができない方は自重された方がよいと思います。

オフィシャルサイト:http://www.duokan.com
英語の翻訳サイト:Duokan is now available with an english GUI
英語のFAQ:Duokan FAQ

メニューは英語表記に変更が可能ですから、英語に変更します。驚いた機能は表示可能なフォーマットにEPUB、DOC形式が追加されていたこと。実際に試してみましたが、画像データがややポジションがズレる場所もありますが、内容を確認する程度なら全く問題ありませんでした。フォントサイズはもちろん、濃さも調節可能です。中国語なら読み上げも可能です。日本語TTSを入れてしまえば日本語での読み上げも可能なのかもしれません。

もうひとつ。PDFファイルの余白トリミングが可能なことです。電子書籍への関心の高まりから、書籍を裁断してスキャンして電子ブックリーダーに取り込む、いわゆる「自炊」する方が増えているようですが、Kindle3で表示させる場合は、原稿の余白のトリミングが課題だったりします。

キーボードの”Aa”を押した際のメニュー

ターゲットマークを左上→右下の順番で決定してトリミングできる

インストールするとノーマルのKindleとのデュアルブートが可能になります。中国語でとっつきにくいのですがこれはアツイですね。スクリーンセーバーやフォントの変更も可能なようですし、いろいろといじりがいありそうです。参考までに本体をリブートしてから多看を起動した際のログは以下のとおりです。

—-begin—-
Welcome to Kindle!
kindle login: root
Password:
#################################################
# N O T I C E * N O T I C E * N O T I C E #
#################################################
Rootfs is mounted read-only. Invoke mntroot rw to
switch back to a writable rootfs.
#################################################
[root@kindle root]# reboot
WARNING: could not determine runlevel – doing soft reboot
(it’s better to use shutdown instead of reboot from the command line)
Broadcast message from root (ttymxc/0) (Wed Nov 10 10:54:17 2010):
The system is going down for reboot NOW!
Broadcast message from root (ttymxc/0) (Wed Nov 10 10:54:17 2010):
The system is going down for reboot NOW!
INIT: Switching to runlevel: 6
INIT: Sending processes the TERM signal
INIT: Sending processes the KILL signasystem: I K04framework:def:stopping booklet framework
system: I start.sh:stop:signal=15,exitval=143:CVM stopped using SIGTERM
system: I K06browserd:def:Stopping Browser Daemon
system: I K10cron:def:stopping crond
start-stop-daemon: lseek: Invalid argument
Stopping lipc-daemon: system: I K10tmd:def:Stopping Transfer Manager Daemon
system: I K15audio:def:stopping audio server
system: I K17ttsd:def:stopping TTS daemon
system: I K19userstore:def:Found BOOTUP flag file
system: I K20volumd:def:stopping Volume daemon
system: I K25phd:def:Stopping Phone-Home Daemon
system: I K30cmd:def:stopping CMD daemon
system: I K30wifid:def:stopping wifid
Stopping Power Management Daemon: stopped /usr/bin/wpa_supplicant (pid 10926)
system: W wpa_supplicant:def:wpa supplicant stopped
system: I wifi:def:WiFi Device mac = 28:EF:01:44:C9:C4
Platform set to SHASTA_NATIVEMMC-SDIO
Platform Setup Script is: /opt/ar6k/host/support/platformscripts/plat_SHASTA_NATIVEMMC-SDIO.sh
Image path: /sbin
..unloading all
system: I wifi:def:loadAR6000 finished, args=(unloadall)
system: I K76mcsd:def:stopping MCS server
Stopping Process Monitoring Daemon: system: I K85dbus:def:stopping system message bus
system: I K90video:def:stopping eInk HAL lifeguard
system: I K98sdtime_stop:sdtime:time=6970:shutdown time in milliseconds
system: I K99syslog-ng:def:stopping syslog-ng
system: I mntroot:def:Making root filesystem read-only
system: I tinyrot:def::Rotating file /var/log/messages with max size 256
system: I loginfo:devhw:boardID=SP1B:Shasta PVT device – rev 1
system: I loginfo:devhwphy::USB PHY built by unknown
system: I loginfo:devsworig::Original System Software Version: 111-shasta0.7-053672
Sun Oct 10 13:48:23 PDT 2010
system: I loginfo:devswota::OTA Kindle 3.0.3 (~~otaVersion~~)
lipc-get-prop[12130]: E lipc:con::Connection error(Failed to connect to socket /var/run/dbus/system_bus_socket: Co)
lipc-get-prop[12130]: C def:dbusi::Failed to init dbus
lipc-get-prop[12130]: E def:open::Failed to open LIPC
com.lab126.wan failed to open lipc for localTimeOffset event
system: E loginfo:ltofailunknowerror:cannot retrieve local time offset – unknown error
/usr/sbin/tinyrot : Signaling syslog
killall: syslog-ng: no process killed
system: W tinyrot:def:Failed to HUP syslog
killall: syslog-ng: no process killed
/usr/sbin/tinyrot : Calculating total size /var/local/log/messages_*.gz
/usr/sbin/tinyrot : Total size of /var/local/log/messages_*.gz is 148kb
Rebooting in 1 second…
Restarting system.
EXT3-fs error (device mmcblk0p1): ext3_find_entry: reading directory #12184 offset 0
EXT3-fs error (device mmcblk0p1): ext3_find_entry: reading directory #12184 offset 1
U-Boot 1.3.0-rc3-lab126 (Jul 31 2010 – 01:08:40)
CPU: Freescale i.MX35 at 532 MHz
Board: MX35 Luigi [ POR]
WDOG_WCR = 0xff31
WDOG_WMCR = 0x0
Board Id: SP1B000000000000
S/N: B008XXXXXXXXXXXX
DRAM: 256 MB
Using default environment
In: serial
Out: serial
Err: serial
No ethernet found.
i.MX35 CPU board version 2.0
Net: No ethernet found.
Hit any key to stop autoboot: 0
## Booting image at 87f40400 …
Image Name: Linux-2.6.26-rt-lab126
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2150840 Bytes = 2.1 MB
Load Address: 80008000
Entry Point: 80008000
Verifying Checksum … OK
Loading Kernel Image … OK
Starting kernel …
Uncompressing Linux……………………………………………………………………………………
boot: W def:rbt:reset=watchdog:
2.6.26-rt-lab126 #5 Sun Oct 10 13:46:42 PDT 2010 armv6l
INFO:Using default keypad setting. (not passing “kb_rev” to module)
INFO:Loaded module /lib/modules/mxc_keyb.ko (22508 bytes)
Press [ENTER] for recovery menu… 0 /INFO:Partition table verified for /dev/mmcblk0
INFO:Checking for updates… (auto-pilot mode)
/dev/mmcblk0p4:
CHS=4/16/101575 size=3328409600 bytes
flag type first last lba first lba size
Partition p1:
0x00 0x0b 16 16 6500784
CHS: 0/1/1 –
Partition p2:
Partition p3:
Partition p4:
INFO:Setup loop device /dev/loop0 for /dev/mmcblk0p4 + 8192
INFO:No update*.bin found; no update needed.
INFO:no updates found.
BOOTING DEFAULT.
argc == 9
argv[0]: “kinit”
argv[1]: “console=ttymxc0,115200”
argv[2]: “mem=256M”
argv[3]: “panic=10”
argv[4]: “root=/dev/mmcblk0p1”
argv[5]: “ro”
argv[6]: “ip=none”
argv[7]: “quiet”
argv[8]: “lpj=2555904”
Running ipconfig
argc == 4
argv[0]: “IP-Config”
argv[1]: “-i”
argv[2]: “Linux kinit”
argv[3]: “ip=none”
IP-Config: no devices to configure
kinit: do_mounts
kinit: name_to_dev_t(/dev/mmcblk0p1) = dev(179,1)
kinit: root_dev = dev(179,1)
kinit: /dev/root appears to be a ext3 filesystem
kinit: trying to mount /dev/root on /root with type ext3
kinit: Mounted root (ext3 filesystem) readonly.
Checking for init: /sbin/init
Checking for init: /bin/init
Checking for init: /etc/init
Checking for init: /sbin/init.sysvinit
INIT: version 2.86 booting
system: I rcS:def:starting /etc/rcS.d/S02kdb
system: I S02kdb:def:Setting boot device to mmcblk0
kdb set: ‘system/driver/filesystem/DEV_ROOT’
system: I rcS:def:starting /etc/rcS.d/S03udev
system: I S03udev:def:setting up virtual fs for hotplug event handling
system: I S03udev:def:starting the hotplug events dispatcher
system: I S03udev:def:synthesizing initial hotplug events
lipc-send-event[380]: E lipc:con::Connection error(Failed to connect to socket /var/run/dbus/system_bus_socket: No)
lipc-send-event[380]: C def:dbusi::Failed to init dbus
lipc-send-event[380]: E def:open::Failed to open LIPC
lipc-send-event[380]: E def:fail:source=com.lab126.hal, event=usbPlugIn:Sending event failed
lipc-send-event[481]: E lipc:con::Connection error(Failed to connect to socket /var/run/dbus/system_bus_socket: No)
lipc-send-event[481]: C def:dbusi::Failed to init dbus
lipc-send-event[481]: E def:open::Failed to open LIPC
lipc-send-event[481]: E def:fail:source=com.lab126.hal, event=audioHS:Sending event failed
system: I rcS:def:starting /etc/rcS.d/S04rootfsresize
system: I S04rootfsresize:def:No rootfs on /dev/mmcblk0p1 resizing needed
system: I rcS:def:starting /etc/rcS.d/S10filesystems
system: I rcS:def:starting /etc/rcS.d/S10hostname
system: I rcS:def:starting /etc/rcS.d/S10network
system: I S10hostname:def:setting device hostname
system: I S10filesystems:def:mounting filesystems
system: I S10network:def:initializing network configuration
system: I S10network:def:Installed Firewall
system: I rcS:def:starting /etc/rcS.d/S11chpriority
system: I rcS:def:starting /etc/rcS.d/S11video
Unknown HZ value! (76) Assume 100.
system: W S11chpriority:def:Cannot set priority for IRQ-7
system: I S11video:def:initializing eInk HAL for system use
system: I S11video:def:eink_debug=0
system: I S11video:def:Controller set to broads
system: I rcS:def:starting /etc/rcS.d/S20syslog-ng
system: I S20syslog-ng:def:starting syslog-ng
system: I rcS:def:starting /etc/rcS.d/S21init_time
system: I S21init_time:initboot:time=17220:boot time after init in milliseconds
system: I rcS:def:starting /etc/rcS.d/S45modules
system: I S45modules:def:loading module mwan
system: I S45modules:def:loading module g_file_storage
system: I S45modules:def:loading module fuse
system: I S45modules:def:loading module uinput
system: I S45modules:def:loading module mxc_keyb
system: I S45modules:def:loading module fiveway
system: I S45modules:def:loading module volume
system: I rcS:def:starting /etc/rcS.d/S50system
mount: mount point /proc/bus/usb does not exist
system: I rcS:def:starting /etc/rcS.d/S55scroll
system: I S55scroll:def:skipping; no luigi-based work to do here
system: I rcS:def:starting /etc/rcS.d/S70ethernet
system: I rcS:def:starting /etc/rcS.d/S70userstore
system: I S70ethernet:def:not enet
system: I S70ethernet:def:not usbnet
system: I S70userstore:def:Found SHUTDOWN flag file
system: I rcS:def:starting /etc/rcS.d/S79switch
Show menu
2
Run Kindle System
system: I mntroot:def:Making root filesystem writeable
mv: cannot rename ‘/etc/rc5.d/S96rundk’: No such file or directory
system: I mntroot:def:Making root filesystem read-only
Run Prog
Press a Key . Key Code : 16 .
Run DK program
system: I mntroot:def:Making root filesystem writeable
system: I mntroot:def:Making root filesystem read-only
system: I rcS:def:starting /etc/rcS.d/S90video
system: I S90video:def:initializing eInk HAL for rootfs use
INIT: Entering runlevel: 2
system: I lifeguard:def:starting eInk HAL lifeguard
system: I S40diags:def:not starting Diagnostic Services
system: I S40diags:def:/mnt/base-us/ENABLE_DIAGS does not exist, forcing diagnostic disable
system: I S50battcheck:def:running
Wed Nov 10 10:55:48 2010 INFO:battery voltage: 4127 mV
Wed Nov 10 10:55:48 2010 INFO:battery charge: 97%
system: I S50battcheck:def:current voltage = 4127mV
Wed Nov 10 10:55:48 2010 INFO:battery charge: 97%
Wed Nov 10 10:55:48 2010 INFO:battery voltage: 4127 mV
Wed Nov 10 10:55:48 2010 INFO:battery current: -113 mA
system: I S50battcheck:def:gasgauge capacity=97% volts=4127 mV current=-113 mA
system: I S50battcheck:def:Waiting for 3460mV or 4%
system: I S50battcheck:def:battery sufficient, booting to normal runlevel
INIT: Switching to runlevel: 5
INIT: Sending processes the TERM signal
system: I wifi:def:WiFi Device mac = 28:EF:01:44:C9:C4
Platform set to SHASTA_NATIVEMMC-SDIO
Platform Setup Script is: /opt/ar6k/host/support/platformscripts/plat_SHASTA_NATIVEMMC-SDIO.sh
Image path: /sbin
No debug record limit set
Load Board Data from /opt/ar6k/target/AR6002/hw2.0/bin/lab126_15dBm_nodiv_WWR_CTL.bin
Updating MAC address
BMI Set App Start (address: 0x913950)
BMI Bit-Wise (OR) modify Register (address: 0x500410, orig:0x8, new: 0x9, mask:0x1)
BMI Write compressed Memory (address: 0x502070, filename: /opt/ar6k/target/AR6002/hw2.0/bin/athwlan.bin.z77)
BMI Write Memory (address: 0x52d6d0, filename: /opt/ar6k/target/AR6002/hw2.0/bin/data.patch.hw2_0.bin)
BMI Write Memory (address: 0x500418, value: 0x52d6d0)
BMI Done
system: I wifi:def:loadAR6000 finished, args=()
system: I wpa_supplicant:def:wpa supplicant started
system: I S30network:def:initializing network configuration
system: I S30network:def:Installed Firewall
system: I S60dbus:def:starting system message bus
Starting Process Monitoring Daemon: Retrieved 127 keys for system/daemon/pmond/
Starting Power Management Daemon: system: I S70cmd:def:starting CMD daemon
system: I S70wifid:def:starting wifid
system: I S75phd:def:Starting Phone-Home Daemon
system: I S76mcsd:def:starting MCS server
system: I S80volumd:def:starting Volume daemon
system: I S85audio:def:initializing audio driver defaults
No state is present for card mx35luigi
system: I S85audio:def:starting audio server
system: I S87ttsd:def:starting TTS daemon
Battery Level: 97%
Wed Nov 10 10:55:59 2010 INFO:battery charge: 97%
system: I S90tmd:def:Starting Transfer Manager Daemon
system: I S90cron:def:starting crond
Starting lipc-daemon: wlan0 (WE) : Wireless Event too big (33)
system: I S94browserd:def:Starting Browser Daemon
system: I S95framework:def:starting booklet framework
Update DK
cp: cannot remove ‘/etc/init.d/usb_switch’: Read-only file system
system: I S95framework:def:logging reset type: soft
Run DK
Run DK
rm: cannot remove ‘/dev/viewinfodat1.txt’: No such file or directory
rm: cannot remove ‘/dev/viewinfodat.txt’: No such file or directory
do while /DK_System/ebook
killall: ebook: no process killed
start.sh: starting framework
1
system: I S96boot_finished:def:Boot finished script running
system: I S96boot_finished:symboot:time=46620:boot time before framework starts, in milliseconds
system: I mntroot:def:Making root filesystem writeable
system: I S99usbnet:def:usbnet is disabled
system: I mntroot:def:Making root filesystem read-only
DebugOff
switch usb state
use usb as storage
system: I mntroot:def:Making root filesystem read-only
sh: 0: unknown operand
Welcome to Kindle!
kindle login: system: I framework:def:stopping booklet framework
system: I start.sh:stop:signal=15,exitval=143:CVM stopped using SIGTERM
/mnt/base-us/DK_System/system/key/keymap.k
rm: cannot remove ‘/mnt/base-us/DK_Mbp/download.dat’: No such file or directory
REGISTER ????ニエ??
REGISTER ???????
Play thread running…
he chen prepare to out
Synth thread begin wait…
sh: syntax error: “(” unexpected
program: No such file or directory
program: No such file or directory
rm: cannot remove ‘/dev/activeevent’: No such file or directory
rm: cannot remove ‘/dev/usbevent’: No such file or directory
—-end—-

アンインストール方法について
中国語サイトが理解出来ないため、英語FAQでアンインストール方法を確認しますと、USBストレージにある”DK_System”、”DK_Documents”、”DK_Pictures”を削除してKindleをリブートするだけとあります。しかし、インストーラーを見ると、”/etc/rcS.d”、”/etc/rc5.d/”以下に起動スクリプトを追加していますので、クリーン・アンインストールするには、これらのディレクトリにある”S79switch”、”s96rundk”、”rundk.sh”、”S95dkupdate”も削除しなければなりません。これはシリアル接続環境、またはJailBreakしてusbNetworkハックを使うしかありません。

これらの起動スクリプトの中身をすべて確認したわけではありませんが、USBストレージにあるDuokan関連ディレクトリ以下のファイルだけを参照しているようですから、実質的にはこれらのスクリプトが残ってしまっても、関連ファイルが削除されていますのでKindle起動時には呼ばれても空回りするだけのため、問題が起こることはまずないと思います。もちろん、Kindle Software Versionのアップデート等で構成が変更になると影響が出る可能性は十分考えられますが。

動作環境
Kindle3 WIFI Software Version 3.0.3
Jailbreak Version 0.4 by NiLuJe
Duokan for Kindle3 Version 0.5.13.6613 (2010/11/06)

Update Information —-
[UPDATE1 2010年11月11日]ハックのリスクについて追記
[UPDATE2 2010年11月12日]アンインストールの注意点について追記