« Amazon EC2に無料のテレビ会議サーバを立ち上げるE: Internal Error, Could not perform immediate configuration (2) »

Kindle2 on Ubuntu Linux and Calibre

2010/07/04

  13:14:00 by , Categories: Linux, Ubuntu

Link: http://bugs.calibre-ebook.com/ticket/6086

Kindle2を使っている。電子ブックを上手に使うには、calibreというアプリケーションが便利だ。Linuxだけではなく、mac, windowsでも使えるだろう。

Ubuntu GNU/Linux (10.04)上で、Calibreをつかって、外部のWebニュースを巡回して、電子ブックを生成して、Kindle2に流し込んでいる。

Calibreは、スケジュールされた時間帯にWebを巡回して、たとえばLWNやTimes, CNN, BBC, Japan Timesなどニュースサイトからニュースを取得して、ebookを生成してくれる。
また、kindle2を接続すると、自動的に、まだkindle2に取り込んでいないNewsを転送してくれる。すぐれものだ。

ただし、ちょっとした不具合がある。
Calibreを英語以外のlocaleで起動すると、Timesなどのサイト巡回結果のタイトルに日付がつくのだが、それが日本語混じりになる。技術的にはstrftime()がロケールLC_TIMEの影響を受けるためだ。

一方、Kindle2は、まだ英語以外の言語に対応していない。Kindle2をUbnutuにつなぐと、vfatとして認識されて自動マウントされる。マウントオプションは、

/dev/sdc1 on /media/Kindle type vfat (rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,flush)

こんな感じ。
そこに、日本語のファイル名のついたニュースファイルを流し込むと、怪しいことが起こる。
具体的には、マウントしたKindleが読み込みのみになってしまう。

で、リンク先のようなバグレポートとなった。

でも、本当は、OSがわで対応すべきではないのか?ということで、たとえばuni_xlateというマウントオプションをつけることを考えたい。これは、unicode文字がきたときに、適当なエスケープシーケンスでlatin文字に変換するというものだ。

では、オートマウントされるときの機構でどこをどのようにいじればいいのか。

gconf-editorで、設定を開いて、system/storage/vfatあたりを見ればいいのかとおもったが、ここに設定を追加すると、すべてのデバイスで影響してしまう。kindleの時だけ、オプションを追加するには、どうすればいいか。

Automounting a storage device with GNOMEを参考にすると、hal-device というコマンドを見ればいいらしい。

Kindleに関わる部分をみるとこんなふうになっている。

0: udi = '/org/freedesktop/Hal/devices/volume_uuid_0096_AB41'
  linux.hotplug_type = 3  (0x3)  (int)
  info.interfaces = { 'org.freedesktop.Hal.Device.Volume' } (string list)
  block.storage_device = '/org/freedesktop/Hal/devices/storage_serial_Kindle_Internal_Storage_B003B0A200930A7F_0_0'  (string)
  volume.fstype = 'vfat'  (string)
  volume.fsusage = 'filesystem'  (string)
  volume.fsversion = 'FAT32'  (string)
  volume.uuid = '0096-AB41'  (string)
  volume.label = 'Kindle'  (string)
  info.udi = '/org/freedesktop/Hal/devices/volume_uuid_0096_AB41'  (string)
  volume.mount_point = '/media/Kindle'  (string)
  volume.is_mounted = true  (bool)
  volume.is_mounted_read_only = false  (bool)
  volume.is_disc = false  (bool)
  info.product = 'Kindle'  (string)
  volume.partition.number = 1  (0x1)  (int)
  block.major = 8  (0x8)  (int)
  block.device = '/dev/sdc1'  (string)
  block.is_volume = true  (bool)
  volume.partition.start = 8192  (0x2000)  (uint64)
  volume.partition.media_size = 1602191360  (0x5f7f8000)  (uint64)
  volume.size = 1602183168  (0x5f7f6000)  (uint64)
  block.minor = 33  (0x21)  (int)
  volume.num_blocks = 3129264  (0x2fbfb0)  (uint64)
  volume.is_partition = true  (bool)
  org.freedesktop.Hal.Device.Volume.method_names = { 'Mount', 'Unmount', 'Eject' } (string list)
  volume.block_size = 512  (0x200)  (int)
  volume.linux.is_device_mapper = false  (bool)
  org.freedesktop.Hal.Device.Volume.method_execpaths = { 'hal-storage-mount', 'hal-storage-unmount', 'hal-storage-eject' } (string li
st)
  org.freedesktop.Hal.Device.Volume.method_signatures = { 'ssas', 'as', 'as' } (string list)
  org.freedesktop.Hal.Device.Volume.method_argnames = { 'mount_point fstype extra_options', 'extra_options', 'extra_options' } (strin
g list)
  volume.ignore = false  (bool)
  volume.mount.valid_options = { 'ro', 'sync', 'dirsync', 'noatime', 'nodiratime', 'relatime', 'noexec', 'quiet', 'remount', 'exec', 
'utf8', 'shortname=', 'codepage=', 'iocharset=', 'umask=', 'dmask=', 'fmask=', 'uid=', 'flush' } (string list)
  volume.unmount.valid_options = { 'lazy' } (string list)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8:1.0/host16/target16:0:0/16:0:0:0/block/sdc/sdc1'  (string)
  info.parent = '/org/freedesktop/Hal/devices/storage_serial_Kindle_Internal_Storage_B003B0A200930A7F_0_0'  (string)
  info.capabilities = { 'volume', 'block' } (string list)
  info.category = 'volume'  (string)

あとは、このUDIなどをつかって、labelがKindleのようなストレージデバイスのときは、こうしろ的な設定を gconftoolなんかつかって、書き込めばいいらしい。

No feedback yet


Form is loading...