2大プロジェクト発表!


お久しぶりです。

半年ぶりのブログ記事です。

半年間、僕はいろいろな事を学び、かなり成長しましたので、
みなさんにかなりよい情報を提供することができるようになりました。

その間はオフラインでいる時間が圧倒的に長かったです。

僕はどうやら家では集中できないようです。

机の上にはいろいろな物があるし、
ネットサーフィンの誘惑があったり、
家族がいきなり部屋に入ってくることもあります。

そのため、ネットブックを購入して、
図書館で作業していました。

図書館の机の上だと、視界を邪魔するものは
何もなく、目の前にはネットブックだけです。

ネットにつなげていないので、
ネットサーフィンもできません。

もちろん誰からも邪魔をされません。

あなたも、どうも集中力が上がらないときってありますよね?

そういうときって、決まって机や
部屋の中が散らかってたりしませんか?

人間、綺麗な場所でないと集中できないようになっているんです。

なぜなら、人間の脳は視界に入る
ものすべてに注意がいくからです。

余計な物が置いてあったら、
それが集中力を奪い取るのです。

だから机の上をきれいに片付ける事は大切なんですね。

手軽に集中力を高めたければ、机の上に
余計なものを置かないようにしましょう。

これだけでもかなり違ってきます。

ちなみにネットブックですが、Windows XPです。

実に15年ぶりのWindowsマシンです。

あくまでも、Emacs専用機という位置付けなので、
OSはWindowsだろうがLinuxだろうが関係ないのです。

ネットブックはあくまでもサブのマシンであるために、
当然、母艦(メインPC)とデータの同期が取れないといけません。

まずは、母艦とのデータを一致させておく環境を構築します。

そうしないと、母艦とネットブックのデータに食い違いが生じ、
2つのバージョンができてしまうからです。

こうなるとどちらかが上書き保存されてしまい、
作業結果が失われてしまうのです。

同期が取れるようになったら、その後は
Emacsをインストールし、環境構築をします。

Emacs環境も、狭い画面でキーが少ない
ネットブックに合わせたノウハウが必要です。

それでは、次回、母艦との同期環境づくりについてお話します。

プロジェクトについては後日発表します。

お楽しみに!

Yokohama.vimへ行ってきました!

24日、Yokohama.vim #1へ行ってきました。

Yokohama.vim #1 を開催しました - Guyon Diary

意外なことに、これが勉強会初参加です。 しかも、自分のフィールドであるEmacsRubyではなくて、アウェイなVimの勉強会。

いろいろ事故ってしまい、遅刻してしまいました。本当にごめんなさい。

それにしても、みんなノートパソコンを持ってきていて、僕は持っていないので肩身が狭かったです。 そのうち安価なネットブックを手に入れたいところです。

感想はみんな書いているし、多忙なので、僕はやや短めで(笑)

テーブルシャッフル

VimLevelにあわせてテーブルシャッフルを行いました。 VimLevelの順番に後ろにみんなが並ぶのです。 こーゆーのは初体験で意外におもしろかったです。 高レベルの人はとても少なく、初心者・初級者が多かったです。

僕はhjklとかiaxrあたりが使えるVimLevel1です。 モード切り替えという考え方が好きで苦にならないのでVimLevel 1-2です。

しかし、いろいろカオスになってしまったのでシャッフルはなしになりました。

Shougoさんの発表

なんと、同じテーブルにShougoさんが! これはうれしかったです。

内容は、彼が使っているVimプラグインの紹介です。 「レベルが高いVim使いは、ほぼ自作プラグインで埋めつくされている」ということがわかりました。 まあ、僕もたくさんの自作elispを使っているので、気持ちはよくわかります。

僕とShougoさんの対談 「EmacsVim〜二人の異端児による次世代エディタ裏話〜」

これは僕のセッションでShougoさんとの対談です。 勉強会に初登場して、しかもセッション持つとか、あまりそういう人はいないと思います(笑) Vimmerにとっては「あんただれ?」という感じだったかもしれませんが、空気読まずに対談を開始。

タイトルは「EmacsVim〜二人の異端児による次世代エディタ裏話〜」です。 EmacsVimという対極にいる二人が、独自エディタ論を熱く語りあうのがコンセプトです。 正直、かなりディープでコアでアブない対談なので、ついていける人がどれくらいいるかわかりませんが(^^; それでも、Vimプラグインelispを書く人にとっては、聞き逃せない対談なのは間違いありません。

Shougoさんは、数々のVimプラグインを作っており、VimEmacs的に使っている人です。 unite.vimは僕のanything.elをかなり参考にしており、ここまで真似できるのかというほどのクオリティで、びっくりしました。 また、僕が使っているeshellも参考にvimshellを開発していたりと、Vimでやりたい放題しています。

前日から、対談の筋書きをしっかり練って、台本を見ながらの対談です。 予定では45分でしたが、お互い熱く語りあって、大幅にオーバーし、70分になってしまいました(^^;

僕もShougoさんもエディタに関する考え方はものすごい似ていていました。 「エディタはOSだ」という言葉にはとても共感できます。 僕も文字入力はほぼすべてEmacsに統合しているので、X Window Systemでの日本語入力は設定していません。 お互い、既存の腐ったインターフェース・概念をぶち壊し、新たなモノを設計する「創造的破壊」をやっています。

みんなの前で対談をするとか、初めてなので、正直、最初は右も左もわからない状態でした。 しかし、僕のアドバイザーが効果的な対談の作法を教えてくださったおかげで、対談は成功しました。 アドバイザーに感謝です。

moozさんとの交流

対談後に id:mooz さんと少しお話をしました。 Firefox界のanything.elであるKeySnailを実演してくれました。 anything-c-moccurみたいなこともできたりとか、すごかったです。 flashからフォーカスを奪い返すことができたりするので、第2ブラウザをChromeからFirefoxに乗り換えようかなと思いました。 是非とも使いたいです。 ちなみに第1ブラウザはw3mです、はい(笑)

VimEmacsユーザ交流セッション

交流セッションでは、同じ机にShougoさんがいたので、かなり盛り上がりました。

お題1:Vim(もしくはEmacs)を使ってない自分はすごく損をしている?

もちろん、大損ですね。 Emacsを使っていない僕なんて、考えられません。

お題2: 春から"プログラマー"になる人はどんなEditorを使うといいか?(VimまたはEmacsまたはその他Editorをお勧めする理由)

先輩やメンターが使っているものが鉄板です。 意志の強い人、あえて茨の道へ行きたい人は、VimEmacsをどうぞ(笑) 年配の人と仲良くなりたい人にもVimEmacsがいいでしょう。

ちなみに僕はEmacsへの憧れからEmacs道へ進みました。

お題3:VimまたはEmacsで開発をしている方の開発からリリースまでの手順や使用しているツールが知りたい

ヒューマンエラー防止のために自動化は不可欠だと思います。

ちなみに僕のelispのリリース手順はS式ハイパーリンクです。 こんな式をファイルの末尾に書いて、リリースするときはそこでC-x C-e! Gitにpushし、EmacsWiki公開、Twitter告知すべてやります。


;; (progn (magit-push) (emacswiki-post "anything-complete.el"))
お題4: フリーディスカッション(質問にひたすら応えるターン)

ここはgdgd雑談。

vimgolf

ノートパソコン持ってないので他の人がやっているのを見るくらいしか(涙) やはり勉強会にノートパソコンは必須ですね。

その後

帰りは、横浜の街をぶらぶら歩いていました。 横浜とかめったに行かないので、どうせだから探索しました。 探索とか好きなので。

そしたら、どこかの百貨店で巨大な駄菓子屋がありました。 子供のころ見かけた懐しい駄菓子がいっぱい、あの頃のままでいまだに生産されていたのが驚きでした。 会社つぶれてなくてよかったと思い、買いあさり、食べまくりました。

駄菓子は、久々に食べるとおいしいと感じるものですが、今食べたら昔ほどの感動はありませんでした。 数年前に食べたときは、それなりにおいしいと感じたものですが。 今の食生活は玄米菜食で糖分もかなり減らしているので、味に違和感がありました。 着色料などの添加物もけっこう入っていますし。 甘いのはめちゃくちゃ甘いです。

これを機に駄菓子はもう食べないでしょう。 しかし、一時とはいえ昔の感情を振り返ることができたのでよかったです。

Linuxと決別します!


ども、るびきちです。

この度、14年間使ってきたLinuxから決別することにしました。
今日からWindowsを使うことにしました。

なぜ、突然このような決断を、と思ったでしょう。
自分でいろいろいじれるLinuxは今でも大好きです。
車にたとえたら、マニュアル車ですから。

しかし、いくら自分がLinux大好きといっても、世の中はまだWindows全盛です。
便利なツールがあっても、Windowsでしか使えなくて、齒痒い思いをすることもたびたびありました。

Windowsといえば、たしかにウィルスは怖いです。
しっかりWindows Updateをして、きちんとウィルス対策ソフトを導入します。
もちろん怪しいサイトからダウンロードすることはしませんし。

今更Windowsに転向するのは茨の道だと思っています。
慣れない操作体系ですから。

しかし、考えてみれば、EmacsRubyWindowsで動きます。
シェルといえば、コマンドプロンプトは糞でしかないが、最強のシェルであるeshellがあります。
わざわざLinuxにこだわる理由はもはやありません。
様々な便利ツールが存在するWindowsがすばらしいに決まっています。

そして、Windows転向の最大の理由は、初心者の気持ちを思い出すためです。
今までLinuxEmacsというニッチな世界にいてましたが、原点回帰したいのです。
今、Windows初心者として再スタートを切ることには意味があると考えています。
なるべくマニアックな操作体系をもたずに、「ふつう」の環境で操作することに努めます。
そうすることで、一般人と同じ目線で物事を考えられるようになります。

今からDebian GNU/Linuxを消して部屋に置いてあるWindows XPをインストールします。

今までありがとう、そして、さようなら、Linux
Linuxが恋しくなったらcoLinuxという形で共存させますね。

<2011-04-19 火> 騙されてる人多すぎワロタwww

Twitterでまんまと騙されてる人がいるみたいだけど、これエイプリル・フールですよ。 日付見てみなさいよ。 僕、嘘つくの下手だと思っているので、騙されている人がこれだけいたのは意外でした。

ただ、初心者の気持ちを忘れないことはとても大切なことなので、新たなPCを購入したときには、vmware上でWindowsを動かすと思います。

インテルのオンボードグラフィックでDebian squeezeのX Window Systemを動かす5つのステップ

<2011-03-23 水> 更新!本家から最新版を取ってくる必要があります。

先月、Debian GNU/Linux squeezeがリリースされました。 もちろん僕もアップグレードしました。

この話は、おそらくUbuntu ユーザにも関係があるかもしれません。

Debian GNU/Linux squeezeにアップグレードしたとき、一番困ったのがX Window Systemの設定でした。 インテルオンボードグラフィックでは xserver-xorg-video-intel というXサーバを使うのですが、これがフリーズするのです。 フリーズが解決したと思ったら、今度は描画速度がめちゃくちゃ遅いという。 特に端末の描画速度がやばいほど遅く、イライラしていました。

しょうがないから xserver-xorg-video-fbdev を使っていたのですが、今度はmplayerで -vo xv が使えず、動画の拡大再生が遅くなる問題が起きました。 解決策がわからないまま1ヶ月もの間もがき苦しんでいました。 特にカーネル2.6.38は3/15に出たばかりなので、それ以前では解決できなかったのかもしれません。*1

今、やっとの思いで xserver-xorg-video-intel を普通に使えるようになりました。 そのためのステップは、

  1. /etc/modprobe.d/i915-kms.conf を書き換える
  2. カーネルを 2.6.38 にアップグレードする
  3. xserver-xorg-video-intelの最新版を取ってくる
  4. /etc/X11/xorg.confを書き換える
  5. startxを実行する(xdmの人は実行しなくてもよい)*2

/etc/modprobe.d/i915-kms.confを書き換える

/etc/modprobe.d/i915-kms.confを以下のように書き換えます。 これでKMSが有効になります。 Linuxを立ち上げたときに、すでに解像度が広くなっていたら、設定済と思われます。


options i915 modeset=1

もしこの設定をしても解像度が広くならなければ、~/.bash_profileや~/.zprofileに以下の行を書き加えます。


sudo modprobe i915 modeset=1

カーネルを2.6.38にアップグレードする

僕の環境では、xserver-xorg-video-intelは、2.6.37までのカーネルだとフリーズしていました。 それが、2.6.38にアップグレードすることでフリーズはなくなりました。

The Linux Kernel Archives

展開した後、「make oldconfig」を実行すれば、現在の設定を引き継ぐことができます。 あのミラクルパッチも入っているので、アップグレードすると幸せになれます。 デフォルトではNoになっているので、Yesを選んでください。


CONFIG_SCHED_AUTOGROUP=y

具体的なコマンドはこんな感じです。


$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.tar.bz2; tar xjf linux-2.6.38.tar.bz2; cd linux-2.6.38
$ make oldconfig
$ sudo nice make-kpkg clean; sudo nice make-kpkg --initrd --revision=001 kernel_image kernel_headers
$ sudo dpkg -i ../linux-headers-2.6.38-rc7_001_i386.deb ../linux-image-2.6.38_001_i386.deb

xserver-xorg-video-intelの最新版を取ってくる

ここまででフリーズは解決しましたが、今度は描画速度の問題を解決します。 Debian squeezeの xserver-xorg-video-intel はDRIが無効になっています。 このせいで描画速度がガタ落ちなのです。

これは最新版 xserver-xorg-video-intel を本家から取ってコンパイルくることで解決します。 最新版では、たとえグラボが固まっても復帰してくれます。

コンパイルのためのヘッダファイルは一括して取ってこれます。

コンパイル後、squeezeにインストールされているファイルを強引に置き換えます。


$ sudo apt-get build-dep xserver-xorg-video-intel
$ wget http://cgit.freedesktop.org/xorg/driver/xf86-video-intel/snapshot/xf86-video-intel-2.14.901.tar.bz2
$ tar xjf xf86-video-intel-2.14.901.tar.bz2
$ cd xf86-video-intel-2.14.901
$ sh autogen.sh
$ make
$ cd src
$ sudo cp legacy/i810/xvmc/.libs/libI810XvMC.so.1.0.0 /usr/lib/libI810XvMC.so.1.0.0
$ sudo cp xvmc/.libs/libIntelXvMC.so.1.0.0 /usr/lib/libIntelXvMC.so.1.0.0
$ sudo cp .libs/intel_drv.so /usr/lib/xorg/modules/drivers/intel_drv.so

/etc/X11/xorg.confを書き換える

僕のxorg.confを貼り付けておきます。 この設定にしてから、まだ固まったことはありません。


Section "Device"
Identifier "Configured Video Device"
Driver "intel"
# これを入れないと固まる
Option "Shadow" "True"
EndSection

Section "Monitor"
Identifier "Configured Monitor"
EndSection

Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
Device "Configured Video Device"
# 速度優先のため16bppにしている
DefaultDepth 16
SubSection "Display"
Depth 16
Modes "1920x1080"
EndSubSection
SubSection "Display"
Depth 24
Modes "1920x1080"
EndSubSection
SubSection "Display"
Depth 32
Modes "1920x1080"
EndSubSection
EndSection

DRIが有効になっているならば、以下のように表示されるはずです。 無効のときは「direct rendering: Failed」と出てきます。


$ grep 'direct render' /var/log/Xorg.0.log
(II) intel(0): direct rendering: DRI2 Enabled

その結果

xengineの値が8000→24000と大幅に上がり、描画はかなり速くなりました。めでたしめでたし。

*1:2.6.38rc7を試しましたが、OSそのものがフリーズする問題があり、使えませんでした。

*2:startxを実行している人は少数派?

savekill.elリリース - Emacsの突然死に備えて

savekill.elをリリースしました。


動機

最近、なぜかよくわかりませんが、Emacsが突然死することありますよね?


あまり使いこんでない人はあまり経験がないかもしれませんが、ヘビーユーザーにとっては日常茶飯事です。
不安定すぎて落ちまくるほどではないですが、僕のところでは数日に1回のペースで落ちてしまいます。


Emacs以外を使っていると、ソフトウェアの突然死の恐怖はよくわかると思います。


「保存してなくて、今までの作業がパーになった!」


誰もが一度はそんな経験があるでしょう。


もちろん、そこは我等がEmacs、ちゃんと防衛線は張っています。
Emacsには自動セーブ機能があり、一定時間以上保存していないと、一時ファイルに保存する仕組みになっています。
そのため、Emacsが落ちたとしても、当該ファイルに対し M-x recover-file を実行すれば、ほとんどの作業を取り戻すことができます。


あるいは、 auto-save-buffers.el を使うことで、手で保存をする必要をなくすことすらできます。


しかし、これでも障害対策は不十分だと僕は思っています。


大量のテキストをC-wでカットすると、当然バッファ(ファイル)からは、大量のテキストが失われます。
カットしたテキストはキルリングに格納されています。
もし、C-yで貼り付けする前にEmacsがお亡くなりになったら…


当然目もあてられません。


そこで、キルリングにも防衛線を張っておくのが、このsavekill.elです。


概要

savekill.elは、キルリングをディスクに保存・復元する小さなEmacs Lispです。
実質10行に満たないサイズです。


C-wやM-w等、テキストをキルリングに入れる動作をしたときに、自動的に保存されます。
そして、Emacs起動時にキルリングの内容は復元されます。


これならば、万一の時も安心ですね!


インストールと設定

拙作auto-install.el(導入記事)を導入すると、


M-x install-elisp-from-emacswiki savekill.el


でダウンロード、保存、バイトコンパイル、ロードまでできます!


ブラウザで見るには↓へどうぞ。


http://www.emacswiki.org/cgi-bin/wiki/download/savekill.el


そして、以下の設定を.emacsに加えてください。



(require 'savekill)




使い方

特になし!通常通りEmacsを操作してください。空気のようなEmacs Lispです。


参考リンク

http://d.hatena.ne.jp/tomoya/20110217/1297928222 では、recentfのリストを一定時間後に自動保存することで、突然死に備えています。


Emacsの突然死を憎むのは勝手です。
しかし、そもそもバグのないソフトウェアは存在しません。


突然死は起こるものとして防衛線を張っておくことこそが、我々ユーザにできる現実的な行動だと考えています。


返信



rilさん

きちんとキルリングは保存されるのですが、起動時に、*Compile-Log*バッファにWarning: ad-Orig-kill-new called with 3 arguments, but accepts only 1-2と表示されるようになって しまいました。



こちらでは再現しませんね。他のパッケージがkill-newをアドバイスしてたりしませんか?


id:tkf41 さん

anything.elのadaptive-historyのバグの可能性があります。
使っているならば、Emacs起動時に
rm ~/.emacs.d/anything-c-adaptive-history
で削除してください。
最新のanything.elでも起きますか?

続・Emacsで連番を挿入する方法

久々のEmacsネタ。

歴史は繰り返すものです。 今はブラウザでなんでもできてしまう時代、かつてのEmacsを彷彿とさせます。 だが、ブラウザがEmacsに決定的に劣っているのは、『速さが足りない』ことだと思ってます。

フレーム、フラッシュなどマウス前提のIFなので、素早い動作が難しいです。 対して、Emacsはテキスト入力のスペシャリスト。 テキスト入力が関わる場面があれば、そこに必ずEmacsの活躍があります。 dabbrevyasnippetなど、入力に不可欠なツールが無数に存在するからです。

さてさて…

2年前に書いた記事 では、外部コマンドやloopを使ってEmacsで連番を入力する方法を紹介しました。 しかし、めんどいですね。 なので、Emacs Lispで書きました。

M-x duplicate-this-line-forward 直前の行をコピーする

直前の行と同じ行を作成することはよくあります。 C-a C-k C-k C-y C-y ...と操作すると思いますが、キルリングが置き換わってしまう問題があります。 そこで、このコード。

(defun duplicate-this-line-forward (n)
  "Duplicates the line point is on.  The point is next line.
 With prefix arg, duplicate current line this many times."
  (interactive "p")
  (when (eq (point-at-eol)(point-max))
    (save-excursion (end-of-line) (insert "\n")))
  (save-excursion
    (beginning-of-line)
    (dotimes (i n)
      (insert-buffer-substring (current-buffer) (point-at-bol)(1+ (point-at-eol))))))

僕は F5 に割り当てています。 連打することでたくさんコピーできます。 数引数を指定すると、その回数だけコピーします。

M-x seq 数字のみが違う同じ行を作成する

「第1回」から「第10回」までの行を作成したいとします。 そのとき、「第1回」という行をM-x duplicate-this-line-forwardでコピーして数字だけを書き換えるのは面倒です。 そこで、このコード。

(defun count-string-matches (regexp string)
  (with-temp-buffer
    (insert string)
    (count-matches regexp (point-min) (point-max))))
(defun seq (format-string from to)
  "Insert sequences with FORMAT-STRING.
FORMAT-STRING is like `format', but it can have multiple %-sequences."
  (interactive
   (list (read-string "Input sequence Format: ")
         (read-number "From: " 1)
         (read-number "To: ")))
  (save-excursion
    (loop for i from from to to do
          (insert (apply 'format format-string
                         (make-list (count-string-matches "%[^%]" format-string) i))
                  "\n")))
  (end-of-line))

M-x seqでは、数字部分をformat関数の書式指定にしておくことでそこが数字に置き換わります。 このコマンドは、書式指定→開始番号→終了番号の順で聞いてきます。 この例では、「M-x seq RET 第%d回 RET RET 10 RET」と操作します。

%dは複数個持つことができます。 「M-x seq RET [%02d]第%d回 RET RET 3 RET」で以下の行が挿入されます。


[01]第1回
[02]第2回
[03]第3回

M-x number-rectangle 連番の長方形を作成する

最後に、連番の長方形を作成するコマンドを作りました。

(eval-when-compile (require 'cl))
(defun number-rectangle (start end format-string from)
  "Delete (don't save) text in the region-rectangle, then number it."
  (interactive
   (list (region-beginning) (region-end)
         (read-string "Number rectangle: " (if (looking-back "^ *") "%d. " "%d"))
         (read-number "From: " 1)))
  (save-excursion
    (goto-char start)
    (setq start (point-marker))
    (goto-char end)
    (setq end (point-marker))
    (delete-rectangle start end)
    (goto-char start)
    (loop with column = (current-column)
          while (<= (point) end)
          for i from from   do
          (insert (format format-string i))
          (forward-line 1)
          (move-to-column column)))
  (goto-char start))

(global-set-key "\C-xrN" 'number-rectangle)

C-x r t (string-rectangle)は、同じ文字列を複数行に書く(行頭の「*」や引用符「> 」など)のに便利です。 その連番バージョンです。

使い方は連番を入れたい行の行頭をリージョンとして指定し、C-x r Nと操作します。 すると、連番の書式、開始番号を聞いてきます。 書式は「%d. 」ならば「1. 」、「2. 」〜という感じです。

あるいは、「第1回」の行をM-x duplicate-this-line-forwardでコピーして、数字部分を長方形リージョンに指定する使い方もあります。 そのときは書式は「%d」と指定します。

なお、このコマンドと同じような働きをするコマンドM-x rectangle-number-linesが開発版Emacsに存在し、C-x r Nに割り当ててあります。

両者の違いは、M-x number-rectangleの方が賢くて使いやすいことです。

  • カーソル位置によってデフォルトの書式が異なる
    • 行頭(インデントがあってもよい)のときは「%d. 」
    • 行頭以外では「%d」
  • M-x number-rectangleはC-uをつけないと細かな指定ができない

ただのリサーチ不足ではありますが、この程度のコマンドはすぐ書けるので。 結果的には好みのコマンドが出来上がりました。

まとめ

今回はM-x seq、M-x number-rectangleの2種類の連番コマンドを定義しました。 それに付随してM-x duplicate-this-line-forwardも定義しました。

では、よりよいEmacsライフを! お役に立てれば幸いだ。

サンヨーのICレコーダーICR-PS401RMをDebian GNU/Linuxで使ってみた

先日、サンヨーのICレコーダーICR-PS401RMを購入しました。 結論を言うと、Linuxからふつうに使えます。 メーカー側はMacにすら非対応と言っていますが。

録音機能つきMP3プレーヤーが欲しい

以前から録音機能つきMP3プレーヤーが欲しいと思っていました。

というのは、パソコン作業をしていなくても音楽やオーディオブックを聴いていたいからです。 これがないとパソコンでしか聞くことができません。 つまり、パソコンに束縛されている状態ですね。

パソコンどころか外出中でも聞くことができれば、隙間時間を勉強時間にできます。

そして、録音ができるといろいろ便利です。 会議や打ち合わせを録音することができます。

また、自分用のボイスメモとしても使うことができます。 声を録音するなら、メモ紙に書くよりも早いし、楽です。 帰宅後、改めて録音を再生してパソコンのGTDシステムに放り込めばいいのです。

レバレッジメモを音読したのを録音して聞き流す勉強法も考えられます。

条件

俺的にはただ録音と再生ができればいいわけではありません。

まず必須なのは、スピード調整できる倍速再生機能です。 これがないとオーディオブックを速聴することができません。 パソコン側で速聴音源を作ることは可能ですが、調整できないと困ります。

また、MP3プレーヤーとして実用的に使えることも大事です。 目的のファイルをはやく見つけ出すことができないと嫌です。

俺の場合、一番気になるのは、何といっても、Linuxから使えることです。 Linuxから使えない機械は俺にとっては、ただのがらくたに過ぎません。

電源は乾電池で動くものがよいです。 俺は乾電池ヲタです。 とことん乾電池モデルにはこだわります。 理由は出先で電池切れになっても予備用電池さえ用意していれば、すぐに使えるからです。 eneloopを使えば、万全です。

ICR-PS401RMに決定

そして、リサーチの末サンヨーのICR-PS401RMに決定しました。 サンヨーのは倍速再生ができ、Linuxで使えるという情報を手に入れたからです。 その後、機種間の機能の違いを仕様比較から確認すると、ICR-PS401RMが妥当という結論に達しました。 下位モデルは3000円くらいでありますが、力不足です。

アマゾンで7574円で買いました。 他機種と比べるとコストパフォーマンスがよく、評判がよいです。

色は白です。 下位モデルは銀色でカッコイイのですが、このモデルは白とピンクしかありません。 まあ仕方ないです。

音声・動画をMP3に変換する

mp3ファイルには、可変ビットレートと固定ビットレートのものがあります。 可変にしておくと、音質が要求されないところではビットレートを抑えることができ、容量を節約できます。

しかし、この機種、可変ビットレートには対応していないのです。 せっかくmp3ファイルがあっても可変ビットレートの場合は再エンコードする必要があります。

ふつうに考えたら、これ耐えられない糞仕様なのですが、そこはLinuxスクリプトを書けばいいのです。 動画ファイルも音声を抜き取ってmp3化してくれます。

#!/usr/local/bin/ruby19
require 'fileutils'
def make_mp3(flv, mp3, bitrate=128)          # 128kbps
  if flv =~ /mp3$/ and `mp3info -r v -p '%r' '#{flv}'` =~ /\d+/
    FileUtils.cp flv, mp3
  else
    re_encoding(flv, mp3, bitrate)
  end
end

def make_mp3_low(flv, mp3)
  re_encoding(flv, mp3, 32)
end


def re_encoding(flv, mp3, bitrate)
  tmp = "/tmp/#$$.wav"
  system "mplayer", "-quiet", "-really-quiet", flv, "-vo", "null", "-ao", "pcm:file=#{tmp}"
  system "lame", "--silent", "--cbr", "-b", bitrate.to_s, tmp, mp3
  File.unlink tmp
end



if __FILE__==$0
  if ARGV.first == '--low'
    make_mp3_low *ARGV[1..2]
  else
    make_mp3 *ARGV
  end
end

このスクリプトを send-icrec.rb として保存します。 ruby、mp3info、mplayerlameはインストールしておきましょう。

最初の引数に音楽・動画ファイル(mp3, flv, mp4など)を指定し、次の引数にmp3ファイルを指定します。

「--low」オプションをつけると、容量を最小の32kbpsにします。 長いセミナーやオーディオブックには最適です。 音質不要のファイルを--lowにしたら1GB節約できました。


$ send-icrec.rb audio_or_video_file output.mp3
$ send-icrec.rb --low audio_or_video_file output.mp3

内蔵メモリをマウントする

認識

ICレコーダーをUSB接続するだけで内蔵メモリをハードディスクとして認識してくれます。 syslogには以下のように出ます。


Jan 25 22:27:05 meg kernel: [1653806.368032] usb 2-3: new high speed USB device using ehci_hcd and address 122
Jan 25 22:27:05 meg kernel: [1653806.501409] usb 2-3: New USB device found, idVendor=0474, idProduct=0135
Jan 25 22:27:05 meg kernel: [1653806.501417] usb 2-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Jan 25 22:27:05 meg kernel: [1653806.501421] usb 2-3: Product: Digital Voice Recorder to USB2
Jan 25 22:27:05 meg kernel: [1653806.501424] usb 2-3: Manufacturer: Sanyo Electric Co., Ltd.
Jan 25 22:27:05 meg kernel: [1653806.501428] usb 2-3: SerialNumber:
Jan 25 22:27:05 meg kernel: [1653806.501602] usb 2-3: configuration #1 chosen from 1 choice
Jan 25 22:27:05 meg kernel: [1653806.506627] scsi72 : SCSI emulation for USB Mass Storage devices
Jan 25 22:27:05 meg kernel: [1653806.508924] usb-storage: device found at 122
Jan 25 22:27:05 meg kernel: [1653806.508929] usb-storage: waiting for device to settle before scanning
Jan 25 22:27:10 meg kernel: [1653811.508272] usb-storage: device scan complete
Jan 25 22:27:10 meg kernel: [1653811.508873] scsi 72:0:0:0: Direct-Access SANYO IC Recorder 1.01 PQ: 0 ANSI: 0 CCS
Jan 25 22:27:10 meg kernel: [1653811.509223] scsi 72:0:0:1: Direct-Access SANYO IC Recorder SD 1.01 PQ: 0 ANSI: 0 CCS
Jan 25 22:27:10 meg kernel: [1653811.515673] sd 72:0:0:0: Attached scsi generic sg6 type 0
Jan 25 22:27:10 meg kernel: [1653811.515862] sd 72:0:0:1: Attached scsi generic sg7 type 0
Jan 25 22:27:10 meg kernel: [1653811.530117] sd 72:0:0:0: [sdf] 7725056 512-byte logical blocks: (3.95 GB/3.68 GiB)
Jan 25 22:27:10 meg kernel: [1653811.531363] sd 72:0:0:0: [sdf] Write Protect is off
Jan 25 22:27:10 meg kernel: [1653811.531370] sd 72:0:0:0: [sdf] Mode Sense: 03 00 00 00
Jan 25 22:27:10 meg kernel: [1653811.531374] sd 72:0:0:0: [sdf] Assuming drive cache: write through
Jan 25 22:27:10 meg kernel: [1653811.534032] sd 72:0:0:1: [sdg] Attached SCSI removable disk
Jan 25 22:27:10 meg kernel: [1653811.535114] sd 72:0:0:0: [sdf] Assuming drive cache: write through
Jan 25 22:27:10 meg kernel: [1653811.535127] sdf: sdf1
Jan 25 22:27:10 meg kernel: [1653811.542387] sd 72:0:0:0: [sdf] Assuming drive cache: write through
Jan 25 22:27:10 meg kernel: [1653811.542396] sd 72:0:0:0: [sdf] Attached SCSI removable disk

この場合、/dev/sdfとして認識されているのがわかります。 /dev/sdgは外部メモリ(microSDHCカード)ですが、持っていないので無視です。

vfatでマウント

とりあえずvfatでマウントしてみましょう。 マウントポイントは/recとしておきます。


$ sudo mkdir /rec
$ sudo mount -t vfat /dev/sdf1 /rec
$ ls -l /rec
合計 256
drwxr-xr-x 2 root root 32768 1980-01-01 00:00 DATA
drwxr-xr-x 2 root root 32768 1980-01-01 00:00 LINE
drwxr-xr-x 2 root root 32768 1980-01-01 00:00 MIC_A
drwxr-xr-x 2 root root 32768 1980-01-01 00:00 MIC_B
drwxr-xr-x 2 root root 32768 1980-01-01 00:00 MIC_C
drwxr-xr-x 2 root root 32768 1980-01-01 00:00 MIC_D
drwxr-xr-x 7 root root 32768 2011-01-24 19:06 MUSIC
drwxr-xr-x 2 root root 32768 1980-01-01 00:00 RECYCLE
$ ls -l /rec/MUSIC
合計 192

  • rwxr-xr-x 1 root root 24000 2011-01-23 21:43 ALL_LIST.bin

drwxr-xr-x 2 root root 32768 2011-01-26 23:02 PLAYLIST
$ ls -l /rec/MUSIC/PLAYLIST

  • rwxr-xr-x 1 root root 0 2011-01-26 23:02 PLAYLIST1.M3U
  • rwxr-xr-x 1 root root 0 2011-01-26 23:02 PLAYLIST2.M3U
  • rwxr-xr-x 1 root root 0 2011-01-26 23:02 PLAYLIST3.M3U
  • rwxr-xr-x 1 root root 0 2011-01-26 23:02 PLAYLIST4.M3U
  • rwxr-xr-x 1 root root 0 2011-01-26 23:02 PLAYLIST5.M3U

ハードディスクから内蔵メモリに転送する

僕の場合、変換したmp3ファイルを直接ICレコーダーに入れるのではなくて、ハードディスクにファイルシステムツリーを作ります。 そうすることで、rsyncコマンド一発で転送できるし、バックアップも兼ねます。 ハードディスク上のツリーは /log/rec-music としておきます。

変換したmp3ファイルを配置する

先程作成した send-icrec.rb は次のように使います。 音楽ファイルを選択したら、以下のコマンドが使えるように、適宜設定しておきましょう。 僕の場合は、もちろんanything.elですが(笑)


$ send-icrec.rb music.flv /log/rec-music/music.mp3
転送する

MUSIC/PLAYLISTはICレコーダー側で更新されるので、最初にパソコンに転送しておきます。 その後で /log/rec-music を /rec/MUSIC に転送します。


$ rsync -ruv /rec/MUSIC/PLAYLIST/ /log/rec-music/PLAYLIST
$ rsync --delete -ruv /log/rec-music/ /rec/MUSIC; sync; sync; sync

これでMUSICフォルダ内は完全に同期されます。 パソコン側で削除したファイルはICレコーダー側でも削除されます。

自動マウントでUSBに差し込むだけで同期する

いちいち同期コマンドを打たないといけないのは面倒ですね。 USB接続しただけで勝手に同期してくれたら完璧です。

<2011-02-27 日> 【注意】Debian GNU/Linux squeezeでは、/etc/fstabにICレコーダーのエントリを書くと、mount.dが実行されません!

usbmountを設定する

そのためには、usbmountをインストールします。 Debian GNU/Linuxならば apt-get install usbmount であっさりインストールできます。

その後は、/etc/usbmount/usbmount.confを書き換えます。


MOUNTPOINTS="/rec"
FILESYSTEMS="ext2 ext3 vfat"
MOUNTOPTIONS="sync,noexec,nodev,noatime,user"
FS_MOUNTOPTIONS="-fstype=vfat"
VERBOSE="yes"
usbmountを早くする

この段階で、USB接続をした時点で/recにマウントできますが、若干遅いです。 原因は、microSDHCカードがないのに20回もアクセスを試みているからです。 そこは /m/usr/share/usbmount/usbmount の行を次のように書き換えます。


for t in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19; do

for t in 0 1; do
自動同期!

usbmountはマウント時に etc/usbmount/mount.d 以下のスクリプトを順次実行していきます。 ここに2桁の数字から始まるスクリプトを突っ込んでおけば、マウント時にコマンドを実行させることができます。

#!/usr/local/bin/ruby19
if `mount` =~ /\/rec /
  system "rsync -ruv /rec/MUSIC/PLAYLIST/ /log/rec-music/PLAYLIST"
  system "rsync --delete -ruv /log/rec-music/ /rec/MUSIC | logger; df /rec | logger; sync; sync; sync"
end
exit 0

僕の環境では細々としたことをやっているのでRubyスクリプトです。

感想

とにかく、俺にとっては初めての「現代版」携帯オーディオプレーヤーです。 メモリに音楽を記憶する装置は初めてです。 フラッシュメモリを使うのも初めてです。 これまでは古いCDプレイヤーを使いていました。 CDプレーヤーという前世紀の機械から、一気に20年も時代が先に進みました。

内蔵メモリは4GB。 中程度の音質のMP3(128kbps)ならば68時間、モノラル(32kbps)ならば273時間も入るという、とんでもない容量です。 ありったけの音源を詰め込んでも2GBしか使っていません。 CDだとCD-Rに焼いてもたかだか1時間という制限があります。

しかも、機体はとても小さく50gほどしかありません。 ポケットに余裕で入る上、振動で音がきれることもありません。

あまりに便利なので、とにかくものすごい感動しました。

録音感度もなかなかよいです。

サンヨー製品だけあって、eneloopに正式対応しているのが好感持てます。 カタログでは15時間持つらしいですが、体感的に半分くらいしか持たないようです。 それでもeneloopなので十分です。 eneloop万歳ー!

ケータイストラップが使えるのもいいです。 小さいので落下事故や紛失が怖いですが、ストラップとチェーンを使ってズボンに装備しておけば安心です。

ただ、不満がないわけでもありません。

ICレコーダーとはいえ、普段の用途はMP3プレーヤーだと思うのです。 実際録音する機会は多くありません。 フォルダ検索機能があるのですが、すぐにMUSICフォルダを開けないので操作性にやや難です。

「リスト」ボタンの機能は反対にすべきです。 リストボタンの機能は以下の2つです。

  1. ルートから音楽を探す
  2. 同じフォルダから音楽を探す(1秒長押し)

どうしても1よりも2の方が頻度が高いのに、長押ししないといけないのはいささか不便です。

「最近録音したファイル」検索はあるのに、「最近再生した音楽」検索がないのも嫌です。 あってしかるべきでしょう。

時計機能もあるので、ケータイみたいに時計モードがあってもよいと思います。

プレイリスト機能はなかなか便利だと思いますが、本機では5つまでしか作れません。 パソコンから任意の名前のM3Uファイルを作ってMUSIC/PLAYLISTフォルダに放り込めばよいので、 パソコンからプレイリストを作って運用していくつもりです。

電池蓋が外れないようになっているなど、細かい配慮が行き届いているかと思えば、意外に配慮が足りないところもあります。 もう少しユースケースをリサーチしてほしいところです。

どうあれ、anything.elを使って音楽・動画ファイルをmp3に変換し、wdiredで適宜リネームし、パソコン側で準備できたら、USBケーブルを差して放ったらかしにしとけば勝手に音楽が転送される…という環境が構築できたので快適ですね。