PCが壊れました。

表題のとおりです。より正確に表現すると、LMDE2 のパッケージマネージャの依存関係データベースがふっ飛んだ上に systemd などの OS の実行に必要な機能が使えなくなりました。

電源を入れても Linux Mint のロゴが表示されるだけで、init の次でコケている模様。ちょうど LMDE3 もリリースされていることだし、必要なファイルを避難させてインストールし直すことにしました。

ストレージ構成

元々の環境は以下のとおりです。

  • /dev/sda … GRUB
    • /dev/sda1 … スワップ領域
    • /dev/sda2 … 「/」にマウント。ext4。
  • /dev/sdb
    • /dev/sdb1 … RAID10 アレイ (1)
  • /dev/sdc
    • /dev/sdc1 … RAID10 アレイ (2)
  • /dev/sdd
    • /dev/sdd1 … RAID10 アレイ (3)
  • /dev/sde
    • /dev/sde1 … RAID10 アレイ (4)

RAID10 環境の復旧と、パーティションを切っていない 「/」 以下の必要ファイルの復旧が目的です。なお、sda は 256GB SSD、sdb 〜 sde はそれぞれ 3TB の HDDです。

ソフトウェア RAID ツールの mdadm を用いて、sdb1 〜 sde1 までの RAID10 アレイすべてを合わせて /dev/md0 として認識させていました。

サルベージ

まず、対象マシンが起動できないとどうにもこうにもならないので、別マシンで LMDE3 x64 の Live DVD イメージをダウンロードUnetbootin を使って、ブータブル USB キーを作成しました。

次に対象マシンの電源を入れ、ブートシーケンス設定で USB Key をプライマリに設定。作成したブータブル USB キーを USB ポートに挿して、LMDE3 をライブ起動しました。(…ライブ起動っていう表現でいいのかな。要は、対象マシンの内蔵ストレージにインストールせずに起動。)

ライブ起動した LMDE3 上のコンソールで /dev を確認すると、sda 〜 sde まですべて確認することができました。

SSDのsda1とHDDのsdb〜sdeたち。
sudo mkdir /mnt/sda1
sudo mount /dev/sda1 /mnt/sda1

/dev/sda1 をマウントすると、そのまま LMDE2 の「/」を覗くことができます。ここから必要なファイルを RAID ストレージに移動したいのですが、ライブ起動した LMDE3 には /dev/md0 がありません。

そこで、ターミナルより

sudo apt update
sudo apt install mdadm

とし、ソフトウェア RAID の mdadm を導入。

sudo mdadm --assemble --scan

すると、RAID アレイを認識し /dev/md/0 と /dev/md0 の仮想デバイスファイルが作成されました。あとはマウントして旧「/」配下のファイルを救出するだけです。

# マウントポイントを作成
sudo mkdir /mnt/md0
# マウント
sudo mount /dev/md0 /mnt/md0
# バックアップディレクトリを作成
sudo mkdir /mnt/md0/backup
# バックアップ
sudo time rsync -aAXv /mnt/sda1/ --exclude={"/mnt/sda1/dev/*",\
"/mnt/sda1/proc/*","/mnt/sda1/sys/*","/mnt/sda1/tmp/*",\
"/mnt/sda1/run/*","/mnt/sda1/mnt/*","/mnt/sda1/media/*",\
"v/lost+found"} /mnt/md0/backup; date

やたら時間がかかったので、 /mnt/md0 内にあるマンガを mcomix で読みながら待っていました。バックアップが終わったら、/dev/sda1 および /dev/md0 をアンマウントし、新しい OS をインストールします。

LMDE3 Cindy x64 のインストール

デスクトップにある「Linux Mintをインストール」アイコンから GUI で入れていきます。最近のディストリはインストールがとても簡単だし、Youtube を見ながらネットサーフィンしながらできるし、とても快適ですね〜。

ストレージの構成だけ注意して、 /dev/sda1 をこれまでどおりスワップ領域に、/dev/sda2 を新しい OS の「/」にして EXT4 でフォーマット。/dev/sda に GRUB をインストールする設定で進みました。

あと、セットアップウィザード中で行ったことといえば、僕は英語キーボード (PFU Happy Hacking Keyboard) を使っているのでキーレイアウトを US 配列にした程度です。滞りなくできました。

インストール完了後、USB キーを抜いて内蔵ストレージから再起動します。

環境の再構築

無事に起動できたら、また mdadm をインストール。マウントします。

sudo apt update
sudo apt upgrade
sudo apt install mdadm
sudo mdadm --asemble --scan
sudo mount /dev/md0 /mnt

OS 上で一度スキャンすると、/etc/mdadm/mdadm.conf にアレイ情報が書き込まれるようですね。

続いて、ユーザーやグループ情報の移動を行い、これまで使っていたソフトのインストールを行いました。

起動できなくなった時は少し焦ったけど、とりあえず使える程度までには現状回復できたし、ゴミファイルの整理にもなって良かったと思います。

イシューズ

下記は積み項目。

  • IMの調子が変。UIM で SKK 使いなんだけど、入力のタイミングでキーが変なことになったり、辞書を引き継げなかったり。
  • GeForce GTX460 の nVidia の公式ドライバの組み込みに失敗する。いや、組み込みはできるんだけど、cinnamon がクラッシュする。以前は lightdm を停止して X を殺して、端末から startx してたら起動できたけどそれも無理。んー、今のところ、noveau ドライバで問題ないけど…。グラボの替え時かなぁ。
  • 動画やコミックアーカイブのサムネイル表示が nemo でできなくなってる。ffmpegthumbnailer や ffmpegthumbs をインストールしても改善せず。謎ファイル名の動画が多いんで割と不便。
  • Ruby や Python といったプログラミング環境は必要になったら順次、入れていこうと思う。とりあえず Git は入れておいた。
  • オーディオや動画のオーサリングツール系も必要に応じて入れる。
  • LMDE3って標準で mozjpeg が入ってるんだ!

MD5ハッシュ値をURLセーフな文字列に変換

大量に保存した画像ファイルなどの重複潰しも兼ねて、ファイル名を MD5 ハッシュ値にリネームして保存しています。

dyama/hashmv · GitHub

まったく同一のファイルであれば、ハッシュ値が同一になりますので、ファイル名が同一になります。上のスクリプト「hashmv」ではリネーム時に同一ファイルを上書きしますので、結果、重複ファイルを除去することができます。

実行イメージ

    $ hashmv foobar.jpg
    foobar.jpg -> ./d41d8cd98f00b204e9800998ecf8427e.jpg    

hashmv では、32 文字のハッシュ値のそのままファイル名に変換しているので、ちょっと長いなと思いました。md5sum のオプションを見ても、もうちょっとコンパクトな出力を得るオプションが見当たらなかったので、車輪の再発明上等でシェルスクリプトを書いてみました。

    #!bash
    function compress_hash()
    {
      echo $2 | sed \
        -e 's/aaa*/A/g' \
        -e 's/abb*/B/g' \
        -e 's/acc*/C/g' \
        -e 's/add*/D/g' \
        -e 's/aee*/E/g' \
        -e 's/aff*/F/g' \
        -e 's/baa*/G/g' -e 's/ecc*/g/g' \
        -e 's/bbb*/H/g' -e 's/edd*/h/g' \
        -e 's/bcc*/I/g' -e 's/eee*/i/g' \
        -e 's/bdd*/J/g' -e 's/eff*/j/g' \
        -e 's/bee*/K/g' -e 's/faa*/k/g' \
        -e 's/bff*/L/g' -e 's/fbb*/l/g' \
        -e 's/caa*/N/g' -e 's/fcc*/n/g' \
        -e 's/cbb*/M/g' -e 's/fdd*/m/g' \
        -e 's/ccc*/O/g' -e 's/fee*/o/g' \
        -e 's/cdd*/P/g' -e 's/fff*/p/g' \
        -e 's/cee*/Q/g' -e 's/0[0-9][0-9]*/q/g' \
        -e 's/cff*/R/g' -e 's/1[0-9][0-9]*/r/g' \
        -e 's/daa*/S/g' -e 's/2[0-9][0-9]*/s/g' \
        -e 's/dbb*/T/g' -e 's/3[0-9][0-9]*/t/g' \
        -e 's/dcc*/U/g' -e 's/4[0-9][0-9]*/u/g' \
        -e 's/ddd*/V/g' -e 's/5[0-9][0-9]*/v/g' \
        -e 's/dee*/W/g' -e 's/6[0-9][0-9]*/w/g' \
        -e 's/dff*/X/g' -e 's/7[0-9][0-9]*/x/g' \
        -e 's/eaa*/Y/g' -e 's/8[0-9][0-9]*/y/g' \
        -e 's/ebb*/Z/g' -e 's/9[0-9][0-9]*/z/g' \
        | cut -c -$1
    }

    for hashstr in $@
    do
      compress_hash 6 $hashstr
    done

元のハッシュ値は [a-f0-9] の文字集合ですが、パターンマッチングによって [a-fA-Z0-9] の文字集合に置き替え、桁数を落としています。見たとおり、ある一定のパターンの繰り返しを単一文字に置き換えているので、上のスクリプトでは元ハッシュ値に対する可逆性はありません。さらに、破壊的に圧縮したハッシュ値をcut で任意の桁数に切り落としています。

次に、評価用のコードを示します。

    while :
    do
      hash=$(date +%s | md5sum | cut -f 1 -d ' ')
      compress_hash 6 $hash
      sleep 1
    done

1秒おきに、UNIX タイム文字列を変換して印字する評価コードです。実行すると

    dFc7wa
    vqA5cx
    rc1a1d
    ucufyV
    1d2b8c
    qm9Le4
    6sqc5c
    atavIr
    7bqc5r
    3auf7b
    ....

のように、6 桁の圧縮されたハッシュ値が出てきます。

短縮 URL などの用途に代表されるように、URL セーフな文字列で桁数を抑えつつもある程度のパターン数は稼ぎたい場合に有効かもしれません。なお、元のハッシュ値は基数が a-z0-f の 16 ですが、これは a-zA-Z0-9 の 62 となる為、6 桁でも約 568 億パターンも稼ぐことが可能です。

    # 62^10 = 839299365868340224 (約84京パターン)
    # 62^9  =  13537086546263552 (約1.3京パターン)
    # 62^8  =    218340105584896 (約218兆パターン)
    # 62^7  =      3521614606208 (約3.5兆パターン)
    # 62^6  =        56800235584 (約568億パターン)
    # 62^5  =          916132832 (約9億パターン)
    # 62^4  =           14776336 (約1477万パターン)

6 桁なら長くなく、覚えられない長さではないし、1/568億の確率で衝突するくらいの強さは持ってますので、ファイル管理には十分だと思いました。

なお、a-zA-Z0-9 の文字集合に加えて記号 /+= を許可する場合は、上のようなスクリプトではなくハッシュ値をそのまま base64 エンコードした方が手っ取り早いです。

USB フロッピーディスクドライブで FD をフォーマットする

フロッピーディスクを整理しようと Amazon で 1680 円だった USB フロッピーディスクドライブを買いました。一応 Windows 9x・古い MacOS 向けのインストール CD が付属していましたが、Linux Mint は挿すだけで認識しました。便利。

nemo にアイコンが表示され、そこからクリックや右クリックメニューを使ってマウントをすることができるけど、右クリックメニューの「フォーマット」は USB フラッシュメモリー向けのダイアログが表示されるので使えません。

ということでマニュアルでフォーマットします。

  1. dmesg でフロッピーディスクドライブのデバイスファイルを確認する。本例では、/def/sdf とする。
  2. root で fdformat /dev/sdf すると Invalid argument と怒られるので、mtools の mformat を使う。/etc/mtools.conf を次のように編集。

    - drive a: file="/dev/fd0" exclusive
    + drive a: file="/dev/sdf" exclusive        
    
  3. mformat a: && mkfs -t msdos -I /dev/sdf する。

  4. マウントしてみて読み書きできたら成功。

もちろん、マウント済みの場合は一旦アンマウントしてから実行します。

手元の FD は論理的に壊れているものはフォーマット。物理的に壊れているものは処分しました。 ちゃんと読み書きできたものの中に 1996年の Mac 版 NetScape インストーラの FD などがありました。

FD ドライブを使うの自体、10年ぶりくらいです。読み書きの音が懐しいですね。

Linux で 64GB SDXC カードを使う

今使っているラップトップは、SONY VAIO Z の BTO で SSD ストレージなのですが、予算をケチって 128 GB にしています。というのも、ストレージはどんどん安くなっていくので「必要になったら後から足せばいいか」と考えていたからです。

SD カードも SDHC カード、SDXC カードと進化しつつもどんどん安くなっていて、64 GB の SDXC カードが3200円〜3800円程度で買えるようになってきました。

そろそろ容量を確保しておきたくなったので、Amazon で 64 GB SDXC カードを購入。 Linux で SDXC カードを使う際の注意事項が、調べてみてもあまり情報がなかったので購入時は少し不安でした。

参考までにいくつかの側面からポイントを書いておきます。(もちろん保証はできませんのであしからず…)

物理的な問題

SDHC カードを想定していたハードウェアで使えるか?ということです。/dev/mmc* (本体に搭載されたSDカードリーダー)や /dev/sd* (USB SDカードリーダー)として認識し、今のところちゃんと使えているようです。

パーティションテーブル的な問題

問題なく、普通のストレージと同じようにパーティションが切れます。GParted でも確認済み。

ファイルシステム的な問題

インターネット上の SDXC カードに関する記事は exFAT とペアで掲載されていますが、ファイルシステムを exFAT しか許していないわけではなく、何でもいいようです。普通に mkfs コマンドでファイルシステムを作れます。うちでは ext4 を使っています。もちろん、SDXC カード対応と謳ったデジカメなどの類は exFAT しか読み書きできないはずです。なお、うちの Linux Mint では、購入直後にフォーマットされていたであろう exFAT な SDXC カードをマウントできませんでした。

暗号化的な問題

cryptsetup や LUKS で魔法をかけることもできました。

# cryptsetup luksFormat /dev/mmcblk0p1 

WARNING!
========
This will overwrite data on /dev/mmcblk0p1 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase: 
Verify passphrase: 
# cryptsetup luksOpen /dev/mmcblk0p1 sdxc
Enter passphrase for /dev/mmcblk0p1: 
# ls /dev/mapper/
control  sdxc
# mkfs.ext4 /dev/mapper/sdxc
# 略
# cryptsetup luksClose sdxc

SDXC カードを用いて Windows コンピュータやデジタル家電とデータをやりとりするには、Linux 側での exFAT サポートが必要になってくると思います。(「linux exfat」で検索するとたくさん情報が出てくるので可能なはずです。)しかし、単に Linux だけで完結する小さな拡張ストレージという用途では、普通に使えるようです。

さようなら Ubuntu、こんにちは Linux Mint

ここ5年ほどメイン機で使っていた Ubuntu にとうとう別れを告げました。 Ubuntu の採用を辞める理由として挙げるとすれば以下の点です。

重い?

ハードウェアは 2012 年の暮れに SONY の公式オンラインストアで購入した VAIO Z で、Core i7 の 8GB RAM、SSD 搭載機です。 購入から1年半が経ちますが、まだまだ陳腐化していないスペックだと思います。グラフィックはインテルのHDグラフィックス…とオンボードのものですが、一昔前の安物グラボに比べれば、よっぽど安定していて高速なハズです。

なので、特に処理能力の限界を感じていたわけではありませんでした。もちろん、無駄に○○しているな〜と感じる点はありましたが、ハードウェア的なボトルネックが顕著になる以前に、私の自宅の WiFi の不安定さであったり、ファイル置き場になっている自宅サーバーのスペック不足でひっかかったりしていました。

Unity デスクトップ環境な Ubuntu 自体は大手ディストリの中でもかなり「重い」部類ではあると思いますが、そんなに苦になることはなかったと思います。

Unity まわりのUI設計のマズさ

動作の軽快さよりも、こちらの方がネックでした。使い勝手が悪いと悪評の高い Unity をやめようと思い、Classic デスクトップ環境に切り替えていた時期もありましたが、やはりしっくり来ず。 特に問題だったのが、タスクバーとメインメニューの統合です。これは登場した当初から叩かれていたので今更詳しく書くのもアレですので、要点だけを書いておきます。

  • 広いデスクトップ上でウィンドウ表示していると、左上のタスクバーにメインメニューがあると、その持ち主であるウィンドウから遠い。これは Mac なんかもそうかな?
  • GIMP などの複数ウィンドウで構成されているアプリケーションの場合、メインウィンドウがアクティブじゃないとメインメニューが表示されなくてかなり困る。つまりツールウィンドウを選択している時にタスクバーにカーソルを持っていっても、期待したメニュー項目がないんですよ。
  • タスクバーにマウス・ホバーさせないとメニューが表示されない。メニューが常に表示されていればマウスをダイレクトにポインティングできますが、一度タスクバーに盲目状態でカーソルを持っていく→表示される→改めて目的のメニュー項目までカーソルを持っていく、のパターンになって、マウス操作主体のアプリケーションだと軽く死ねます。

もともと、「ウィンドウごとにタイトルバーの下にメニュー領域を確保するのがスペース的な無駄だ」という発想だったのか、Mac の UI を真似したのか分かりませんが、使いづらく感じる人のほうが多そうですよね。前者の理由だった場合、Unity デスクトップ環境の左側に表示されているアプリケーションアイコンのほうがよっぽど邪魔です。自動的に隠すこともできますが、それでもアイコンサイズの設定できる最小値が大きすぎます。 最近のディスプレイは、ほとんどがワイド画面であるため、縦方向に領域を占有するメインメニューよりも、横方向に領域を占有するアプリケーションアイコンの方が犠牲になるコストは小さいかもしれませんが、なんだかよく分かりません。また、タブレット PC やスマホなど、タッチ操作をしなければならない端末でも、標準のマウス環境でも、どちらでも対応できるような UI 設計にしている戦略的な意味合いがありそうな気がします。どちらでも対応、と書くと聞こえが良いですが、言い替えると、どちらも中途半端ってことでしょう。こういうデザインのごり押しを見ていると、もはや商売戦略ありきの設計である Windows と何も変わらない気がします。

しかし非標準を許さない

Linux なんかの良いところは、自分の好きな環境を自分で組み合わせて最適なモノに囲まれてコンピュータ・ライフを楽しめるところだと思うんですが、ここまで時代が変わってくると、いろんなフレームワークやらライブラリやら、それを動かすためのフレームワークやら、ちょっとした事でもバックエンドの巨大なものをずるずるとひっぱってきたり、そうしているうちに整合性が取れなくなって、ちょっとした事でも意図したとおりの事ができなくなっちゃったりと、もう訳が分からなくなる事も多いです。

Ubuntu はその良い例で、標準的な考え方と Ubuntu 独自の考え方の相性が悪い印象です。ちょっとしたカスタマイズを施して使っていると、次のメジャーアップデートの際に決まって不整合となってしまい、面倒なことが発生していました。ユーザーに自由という権限を与えない変わりに、ある程度責任を持って「ユーザーが何も考えなくても快適な環境が提供されるシステム」だったら良いのですが、そこまで力及ばず、といったところでしょうかね。

カノニカルが以前、「我々のライバルは Windows ではなく、Mac OS だ。」と宣言していた気がしますが、UNIX を Mac OS にしちゃった Apple と カノニカルの大きな違いは、やっぱり力の強さ(資本や行動力)じゃないでしょうか。UNIX 系 OS でいわゆる非 UNIX ユーザも幸せになれるような環境を提供するには、Mac OS や Android といった、もはや UNIX 系とは思えないくらいの商業的かつパーソナルユーザ視点での作り込み、あるいは作り替えが必要になるんじゃないかなと。

まあ、Ubuntu コミュニティやカノニカルも含め、パーソナルユースの Linux、UNIX 環境に大きく貢献しているのは大きな事実ですので、感謝していますし、これからも発展して欲しいと思っています。

細かいところ

Nautilus が 0 バイトの画像や動画のサムネイルを生成する時にすとんと落ちてしまいます。これは致命的に痛いです。totemか何かでサムネイルを生成しているっぽいですが、Nautilus の設定等々をいじるよりも thunar に切り替えて使うケースが多かったです。また、thunar では、SSHFS でマウントしているネットワークストレージも、動画サムネイルを生成しつつもそこそこ素早くファイル一覧を表示できていたのですが、Nautilus では時間がかかった上にタイムアウトするケースも多く見られました。

うちの環境も原因の一つかもしれませんが、ファイラを替えただけでストレスなくオペレーションができている以上、Nautilus の挙動に問題があるような気もします。

これだけ不安定かつぽこぽこと強制終了していたらネモ船長もたまったもんじゃないです。

Linux Mint

Ubuntu の「かゆいところ」はまだ他にもいろいろありますが、Ubuntu の良いところを引き継ぎつつ、悪いところを排除する目標を掲げている Linux Mint に興味を持ちました。

WiFi の設定

まずはともあれ、ネットにつながってないと困ります。最近の先進的なディストリでは、デフォルトで WiFi が有効になっているので嬉しい限りです。自宅のアクセスポイントを選んでパスワードを入れるだけで繋りました。

Firefox syncの同期

次に、ウェブで情報を得たり、動画を見たりしながらセットアップをするので Firefox syncを同期します。自宅、職場、スマホと同期できるってのは本当に助かりますね。

(2014/5/15追記・最新の Firefox では sync の認証方式が変更されたようです。端末によって新方式と旧方式を同時に運用することはできず、全て新しい Firefox にアップデートして新方式にしないと同期が出来ない模様…。Windows 以外のマシンではしっかりしたバージョン管理システムの自動アプデに任せているから色々面倒だなぁ。
ちなみに、Bluetooth のハードウェア認証のような旧方式は、リカバリーキーやらペアコードやら意味が分からないものが多く、どちらがマスターデータでどちらがスレーブなのか分かりづらかったので、予想していたとおり大不評だったんでしょう。
今回の一般的なアカウントによるサーバ認証方式が採用理由は分かりますが、一度同期して運用しちゃってる設定をバージョンアップで変更しなければならないのは労力ですね)

また、宗教上の理由により検索バーのデフォルトは DuckDuckGo っていうアヒルになっていますが、

http://www.linuxmint.com/searchengines.php

の下部にある「Commercial engines(営利目的の検索エンジン)」の Google のアイコンをクリック後、検索バーのアイコンをクリックして出てくるプルダウンメニューより「”Google”を追加」をクリックすれば追加することができます。
さらに「検索バーの管理…」から Google の優先度を上げてやれば、晴れて Google に監視されっぱなし状態になれます。

Ctrl キーと Caps Lock キーの入れ替え

システム設定の「地域と言語の設定」より、キーボードレイアウト→オプションから変更しました。
Xの設定ファイルをいじって、いじっている途中に Caps Lockを押してしまってイライラしていた時代が懐しい…(でも、もはやGUIなしじゃすぐに設定できない体になってしまいそうです)

ちなみにうちは、日本語環境、日本時刻、英語配列キーボードっていう環境です。

uim と skk の導入

Mint にはデフォルトで日本語 IM が入ってないらしいんですが、SKK 使いの自分としては 使いもしない Anthy などが入っているより好都合です。

sudo aptitude install uim uim-gtk3 uim-skk

としてサクっと入れます。
一度、ログアウトしてセッションを開始し直せば、C-j で日本語入力ができるようになりました。

sshfs の導入

以前のファイルは、別のサーバーマシンに預けているので、sshfs を導入。

sudo aptitude install sshfs

で、一般権限でも fuse できるようにします。

sudo chmod o+rw /dev/fuse
sudo chmod 4755 /bin/fusermount

これでマウント可能になりました。簡単すぎる…!

自分コマンドのパスを通す

HOMEの.ファイルを移す

Dropbox のセットアップ

$ mkdir ~/bin
$ wget -O ~/bin/dropbox.py http://www.dropbox.com/download?dl=packages/dropbox.py
$ chmod a+x ~/bin/dropbox.py
$ dropbox.py start -i

Skype

http://download.skype.com/linux/skype-debian_4.2.0.13-1_i386.deb

DraftSight

http://www.3ds.com/ja/products-services/draftsight/download-draftsight/

libgtk2.0-0:i386
/opt/dassault-systemes/DraftSight/Linux/DraftSight
/opt/dassault-systemes/DraftSight/Linux/DraftSight: error while loading shared libraries: libGLU.so.1: cannot open shared object file: No such file or directory

$ sudo apt-file search libGLU.so.1
libglu1-mesa: /usr/lib/x86_64-linux-gnu/libGLU.so.1
libglu1-mesa: /usr/lib/x86_64-linux-gnu/libGLU.so.1.3.1

sudo aptitude install libglu1-mesa:i386

デスクレットの追加

「システム設定」の「デスクレット」より、デスクレットとよばれるウィジェットをデスクトップに追加できます。
Ubuntu では天気とカレンダーを表示していたのですが、カレンダーがなかったので AccuWeather Desklet だけを入れてみました。

Monodevelop

sudo aptitude install libmono-cairo2.0-cil

virtualbox

sudo aptitude install virtualbox-qt virtualbox-dkms 

gvim

screenをtscreenからtmuxへ乗り換えた

普段、端末経由で作業をする際、GNU Screen ライクな tscreen を使っていました。tscreen は Screen 系の中ではマイナーな類のもので、Debian の公式リポジトリにも入っていません。自前でソースコードを取ってきてビルドして使っていました。 というのも、自分が Screen を使い始めた当初は今のようにあまり選択肢がなくて、GNU Screen 以外と言えば数えるほどもなかった気がします。

tscreen を使い始めた大きな(覚えている)理由としては、本家ではできなかった画面の縦分割をサポートしていた事でしょうか。本家のキーとも互換性が高かったのも理由の一つだったと思います。

tscreen を常駐させ、中でIRCメーラー、作業環境一式を立ち上げていましたが、cgdb などのターミナル制御をガリガリやっている一部のソフトとの相性が悪かった為、今さらながら tmux に乗り替えることにしました。

tscreen と比べて気付いたこと

画面ロック

tscreen ではスクリーンセイバーとして bsdgames の worms を表示させていました。tmux でも同じように画面ロック機能を用いて、任意のコマンドを実行できましたが、実装に差があるようです。

  • tscreen 画面ロック中もキー入力は tscreen がしっかり管理しており、任意のキーを押すだけで画面ロックが解除される。

  • ** tmux** 画面ロック中のキー入力は、スクリーンセイバーとして実行されたコマンドに移ってしまい、そのコマンドを終了させない限り、tmux はキー入力を感知しない。

worms は C-c で終了しない限り終了しないコマンドです。tscreen では任意のキーを押せば、tscreen が責任をもって worms を殺してくれますが、tmux では自分で殺す必要があるようです。 セキュリティロックさせる意味では、tmux のようにキー入力を完全に画面ロックコマンドに任せてしまう方が良い気がしますが、単にスクリーンセイバーとして使いたいだけだったら、画面ロックコマンドの使い勝手に依存しない tscreen の方が利便性は高いです。 どちらも一長一短なので、まあいいんじゃないかな、と思います。

Unicode 文字の扱い

IRC では UTF-8 のチャンネルに入っていて、最近 Twitter などで良く見る Unicode 文字を駆使したキモい顔文字なんかも表示できるようになっています。 tscreen では、意図的かどうか分かりませんが、とにかく表示しようとしてレイアウト(特に文字幅)が崩れる事がありました。tmux では、文字幅の扱いに不安がありそうな文字は全て半角の「?」で表示されているようで、レイアウトの崩れが少なくなっています。レイアウトが崩れても表示させたいもの、レイアウトが崩れてまで表示させたくないもの、いろいろあるかもしれませんが、Emacs でミニバッファを開きまくっている自分としては、tmux のほうが合っている気がしました。

# 多分、意図的にやっているわけじゃないんだろうな。curses 依存のような。
# ついでに言うと、未だに ISO-2022-JP のチャンネルで CP932 依存の半角カナを垂れ流す奴ら滅びろ。
# 往々にしてそういう発言は読めなくても困ることがないけれど。

ちなみに、tmux のほうが崩れない「気がする」程度で、崩れるタイミングではやっぱり崩れます。ただ、本来の目的であった cgdb がちゃんと表示できているから及第点は超えていますね。

ウィンドウとペインの概念

本家 GNU Screen から tmux へ乗り換えた人のブログ記事でもよく目につきますが、tscreen もウィンドウとペインの概念がなく、単にウィンドウだけです。 最初は戸惑いましたが、これも慣れれば大丈夫そうです。

デザイン比較

ガリガリとカスタマイズをした tscreen と、ほとんどまっさらな設定の tmux を比べるのはちょっとナンセンスですが、なかなかダサくなってしまいました。(tmux はこれから手を入れて行こうと思います。)

tscreen

tscreen

tmux

tmux

緑一色っておま…!

tmux のペインには、tscreen のウィンドウのタイトルバーみたいなものがないので、視覚的にどのペインがアクティブになっているか分かりづらいです。あくまでもデフォルト設定なので、カスタマイズする方法はあると思いますが。ちなみに、tscreen ではアクティブウィンドウのタイトルバーを赤く、ノンアクティブを薄い緑色で表現しています。tmux 側に立って言うと、タイトルバーがない分 1 行だけ広く使えるメリットもありますね。

tmux が使っている色が緑一色というのは、「ひょっとしてANSI 256 colorをサポートしていない端末向け…」と思ったりもしますが、このご時世、あんまりメリットがない気がします。ステータスバーのアクティブウィンドウ表示も「*」で表現していますが、背景色を変えたほうがよっぽど分かりやすいです。 かと言って、画面ダンプのモノクロ印字に耐えられるほどカラー表示にレイアウトが依存していないわけでもなさそうなので、今どき「4ビットカラー対応だぜ」っていうのもなんだか。

「最初からやっといてくれる」の感覚が、もうちょっとおせっかい気味でも良い気がしました。結局、RC ファイルをいじるなら量が減ろうが増えようが、普段使いにはあんまり関係なくなります。

その他 tmux の良いところ

他の方もたくさん書いていますが、軽い気がしたり、レイアウトがそこまで崩れなかったり、そんなに設定しなくてもそこそこ使えたり、とメリットもたくさんありそうです。

下のステータスバーには、ログイン名、ホスト名、カレントパスが常に表示されているので、bash のプロンプトは「$」だけにしても良さそうですね。tscreen でも設定をガリガリ書けば出来そうですが、地味に便利です。

時刻表示は、まあ当たり前として…あとはやはり慣れでしょうかね。

tscreen では日頃の惰性から C-a をコマンドキーにしていたのですが、bash や emacs で行頭に移動したい場合や、vim で数値をインクリメントしたい場合 C-a a とタイプしなければならず、少し手間でした。コマンドキーを変更すれば良かったんですが、慣れもあってついつい使い続けていました。 tmux のデフォルトは C-b なので、vim のバックスクロールにぶち当たりはしますが、こちらに「慣れ」を変更してもいいかもしれません。ちなみに ratpoison ではコマンドキーは C-t でした。

総評

ダサさは自分で改善できるので良いとして、全体的なメリットを考えても乗り換える理由には充分だと感じました。tscreen は、公式サイトも消えてしまっているようで、多分メンテナンスも行なわれていないと思います。代わって tmux は、今もっともナウい Screen 系ソフトらしいので、ユーザ数や開発頻度、これからの改善にも期待が持てます。

さっさと調教して慣れていきたいと思います。

オマケ

全く需要がないと思いますが、これまで使っていた tscreenrc を貼っておきます。

[perl] startup_message off autodetach on

backtick 0 5 5 sh /home/dyama/bin/stat

shelltitle “$ |shell”

caption always “%{= mW} %n %{-}%?%F%{= rW}%:%{= Gk}%? %t %=” defhstatus “%n:%t” hardstatus alwayslastline “%{= bW}%-w%{= Wk}%n:%t%{-}%+w%= $USER %0`(%m/%d %02c)”

msgwait 10

defscrollback 2000

bind r eval ‘echo “Resize Window”‘ ‘command -c resize’ bind -c resize ^] command bind -c resize j eval ‘resize +1’ ‘command -c resize’ bind -c resize k eval ‘resize -1’ ‘command -c resize’

defutf8 on encoding utf-8 utf-8 defencoding utf-8

cjkwidth on

defkanji utf-7

color

defbce “on”

do not use ‘screen-bce’

term rxvt-256color termcapinfo rxvt-256color ‘Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm:hs:ts=\E]0;:fs=\007:ds=\E]0;\007’

idle 1800 blankerprg /home/dyama/bin/worms2

↑たしか /usr/games/worms に上手く引数を渡せなかったので

シェルスクリプトを指定しています。

[/perl]

音声合成エンジン Open JTalk について

動画の生放送サイトを見ていると、リアルタイムに視聴者から来るコメントを合成音声によって読み上げている人が増えているようで、合成音声のジャンルも賑わってきたようです。ボーカロイドの初音ミクが登場するよりも前、AquesTalk をいじってみて調整次第ではかなり「聞ける」音声になるんだなあ、と実感した覚えがあります。 自分は合成音声を入れた動画を作成したり、配信したりするわけではないのですが、IRCのログやTwitterのタイムラインの読み上げ程度には使ってみたくなりました。 ということで、今更感が拭えませんが、Open JTalkを使ってみた時のメモを書いておきます。

Open JTalk とは

オープンソースの日本語音声合成エンジンです。音声合成エンジンには、入力文章の処理部と発音部に機能が分かれるんですが、文章処理にはオープンソースの形態素解析エンジン MeCab を利用しているようです。ChaSen や Kakasi に並んで有名なエンジンですね。発音部には、HMM-based Speech Synthesis System (HTS)というエンジンを利用しているようです。 Open JTalk のデモページでは、WWWブラウザ経由で音声合成を試すことができます。 試しに作ってみた音声を置いておきます。能登っぽい声ですね。 こちらのデモページでは、更新履歴を見る限り、Open JTalk のバージョン 1.06 を利用しているようです。

インストール

インストールした時点での私の環境は Ubuntu 13.04 x64 版です。2013年6月現在、Ubuntu のリポジトリに入っているのはバージョン 1.05 で、公式サイトにて公開されている最新版は 1.06 です。詳しい事は後述しますが、これらのバージョンによって利用できる音声データファイルの形式が違ってきます。

Debian GNU/Linux Squeeze の MOTD 周りのメモ

12月になったし、MOTD(5) をクリスマス仕様にでもしようかなと /etc/motd を修正しても上手くいかなかったのでメモしておきます。

Debian GNU/Linux の Squeeze サーバに対して SSH 接続すると、デフォルトの状態で「ターミナルログインとしての MOTD」と「PAM の MOTD」が二重に出力されてウザかったので、後者を無効にしていたら、いつの間にか MOTD が全く表示されなくなっていました。デフォルト挙動が変更されたのかな。

まずおさらい

Debian GNU/Linux Squeeze の MOTD は次のようになっています。

/etc/motd -> /var/run/motd
/etc/motd.tail

で、起動時に実行される /etc/init.d/bootmisc.sh にて

[bash]
uname -snrvm > /var/run/motd
[ -f /etc/motd.tail ] && cat /etc/motd.tail >> /var/run/motd
[/bash]

と毎度毎度、motd の中身を書き換えやがります。(/etc/motd または /var/run/motd に記載していた内容は、起動時毎にぶち消されてしまいます。)

永続的なメッセージは /etc/motd.tail に記載せよ、という意図でしょうね。それに従って、表示させたい motd テキストを /etc/motd.tail に記載しておきます。

PAM の設定

本来の motd 表示がどのプロセスで表示されているのかは知りませんが、少なくとも PAM による認証時、pam_motd.so を有効にしておくと motd を吐いてくれます。ちなみに PAM とは、Pluggable authentication module の略で、UNIX 系 OS の共通認証システムの API です。アプリケーションの機能が、一部、特権を必要とする処理を行いたい場合、PAM の API を叩くだけで認証周りの面倒を見てくれる便利な API ですね。SSHD の認証システムにもこの PAM が利用されています。

/etc/pam.d/sshd の次の行のコメントアウトを外しました。

[bash]

Print the message of the day upon successful login.

session    optional     pam_motd.so # [1]
[/bash]

また

[bash]

Print the status of the user’s mailbox upon successful login.

session    optional     pam_mail.so standard noenv # [1]
[/bash]

の部分は、コメントが書いてあるとおり、ログイン成功時にメールボックスのメール件数を表示するモジュールです。

2013-07-23 追記

Wheezy にアップグレードした時からか、いつの間に MOTD が二重表示されるようになりました。
今回は、/etc/ssh/sshd_config の次の部分を変更し、sshd をリスタートすれば二重表示されなくなりました。

[bash]
– PrintMotd yes
+ PrintMotd no
[/bash]

Wheezy では、確認してみたところ bootmisc.sh の起動時毎に上書きする処理や motd.tail がなくなっていますね。ほとんど意味がない上に、ユーザを混乱させるだけだったから廃止されたかな。

mumble VoIP サーバをインストール

mumbleとはBSDライセンスで提供されているVoIPクライアント・サーバアプリケーションです。VoIPクライアントとしては、米マイクロソフト社が昨年買収した『Skype』、韓国NHN社の日本法人NHN Japanが提供している『LINE』などが国内では有名ですが、mumbleはこれらサービスとは違ったアプローチのもと提供されています。

オンラインゲーム、特にリアルタイム性が求められるFPS(銃を打ち合って戦争するゲーム)使用中に利用することを想定としている為、重点を置いているところが違います。

  1. 常駐させても負荷が少なく、軽い。
  2. 音質をそこそこ維持しつつ、遅延が少なくするように設計されている。
  3. 連絡を取り合うことに特化されていて、余計な機能がない。
  4. 帯域や通信速度自体が制限されたナローバンドでも使える(らしい)。

VoIPクライアントの本質は「IPネットワーク網を利用した音声通信」ですので、正直なところ、他の機能は要りません。また、上記に挙げたVoIPクライアントとしてのメリットの他に

  1. オープンソースであり、特定企業の商売戦略上の都合に巻き込まれなくてすむ。
  2. サーバさえも自分で用意することができ、その気になれば何十年でも同じ環境が使える。
  3. クライアントはLinux、Windows、Androidなどで使用でき、サーバはLinux、Windowsで実行できる。

これらはmumbleに限らずオープンソースプロジェクト全体に言える話ですが、こういう通信手段このその利点が大きいんじゃないかなって思います。IRCもそうですが、コミュニケーションツールはライフラインの一つにも挙げられる時代ですから、自前で面倒が見られるようにしておきたいものです。また、自分だけで利用するシステムではないので、Linuxはもちろん、Windowsやスマートフォンから利用ができる点も大きなメリットです。

サーバのインストール

dpkg系のパッケージ管理システムを採用しているディストリビューションでは、例のごとく、APTにてインストールすることができます。私のDebian環境では、通常のリポジトリ内で見つけることができました。

[bash]$ sudo aptitude search mumble
p mumble – Low latency VoIP client
p mumble-11x – Low latency VoIP client (1.1.x)
p mumble-dbg – Low latency VoIP client (debugging symbols)
p mumble-django – A Mumble-Server web interface
p mumble-server – Low latency VoIP server
p mumble-server-web – Web scripts for mumble-server
p python-django-mumble – A Mumble-Server config application for Django
[/bash]

サーバにはクライアントをインストールする必要はないので、「mumble-server」だけをインストールします。

[bash]
$ sudo aptitude install mumble-server
[/bash]

何もエラーが発生しなかったら、mumbleサーバのインストールは正常に終わったということです。

サーバの実行

インストール時に自動実行されないので、手動で実行します。

[bash]$ sudo /etc/init.d/mumble-server start
$ sudo lsof -i TCP | grep murmurd[/bash]

2行目を実行してみて、murmurd(mumble-server)が出てきたら動いてます。
さて、早速クライアントから接続してみます。クライアントの設定はLinux/Windows/Androidとそれぞれちょっとずつ違うので、ここでは触れません。
mumble-serverの標準リスンポートは64738ですので、それを参考に設定してみてください。

[bash]
$ sudo tail -f /var/log/mumble-server/mumble-server.log
[/bash]

NEC Life Touch NOTE に Debian GNU/Linux を導入

NECのAndroid端末「Life Touch NOTE」にDebian GNU/Linux をインストールした時の覚え書きです。

root 権限の奪還

ホストマシンにAndroid SDKのインストールしたら、USBでホストとLTNをつないで、以下の手順でroot権限を取り返します。

まず、SuperOneClickのZIPをダウンロードし、適当な場所に解凍しておきます。配布物はWindows向けのアーカイブですが、気にせず解凍します。unzip後のディレクトリに移った後、

[bash]
adb push Exploits/psneuter /data/local/tmp
adb push Dependencies/busybox /data/local/tmp
adb push Root/su-v1 /data/local/tmp
adb push Root/su-v2 /data/local/tmp
[/bash]

と、必要そうなファイルをLTNの/data/local/tmpに転送します。次に、LTNに接続し、転送したものに実行権限を与えてからpsneuterを実行します。

[bash]
adb shell
(adb) cd /data/local/tmp
(adb) chmod 755 *
(adb) ./psneuter
[/bash]

上手くいけば勝手に切断されるので、接続しなおします。接続後、プロンプトが「#」になりスーパーユーザになっていることを確認してください。

[bash]
adb shell
[/bash]

次にデフォルトのPATHが設定されている位置に busybox をインストールします。

[bash]
(adb) set

/system/xbin がパスに登録されているが、このディレクトリは存在しない。

カスタムコマンドを設置するにはもってこい。

(adb) df

/system は /dev/block/mmcblk3p6 らしい。

(adb) mount -o remount,rw /dev/block/mmcblk3p6 /system
(adb) mkdir /system/xbin
(adb) chmod 755 /system/xbin
(adb) cd /system/xbin

cp コマンドがなかったので、busybox のアプレットで busybox をコピーする

(adb) /data/local/busybox cp /data/local/busybox .

リンクを展開

(adb) ./busybox –install .
[/bash]

ConnectBot で localhost 接続して、busybox が使える状態になっているか確認します。

[bash]
$ which wget
/system/xbin/wget
$ dc
1 2 + p
3
$ vi
[/bash]

よし、いい具合。これでroot権限が使え、かつ自由に作業する為の足がかりが整いました。

2. Debian GNU/Linux の導入

59414d41さんのハックの賜物であるLTN用Debian(Lenny)配布ページに従ってインストールします。ページを見ると詳しい事が書いてありますが、ここでは要点だけかいつまんで書いておきます。

まず、ホストマシンにSDカードを差して、起動用SDカードを作成します。ホストマシン上で次のコマンドを実行しました。

[bash]
mkdir backup
cp -r /mnt/sdcard/* backup/
su # ←ここからroot権限
mkfs.ext3 /dev/mmcblk0p1
mount -t ext3 -o rw /mnt/sdcard /dev/mmcblk0p1
cd /mnt/sdcard
wget http://205.196.121.246/q4mgjdew5pag/0rnq7nc7lc1d0uq/ltna-debian-010.tar.gz
tar xfpz ltna-debian-010.tar.gz
[/bash]

この時、カレントディレクトリである/mnt/sdcardには次のようなファイルが詰まっています。

busybox … 作業用 busybox。
ltna-debian-010 tar gz … 落としてきたアーカイブ。解凍したのでもう不要。
ltna-debian-rootfs cpio gz … SD カードに展開する予定のルート・ファイルシステム。
recovery2 img … init を書き換えた改造リカバリ領域データ。
setup_recovery sh … リカバリ領域のバックアップと上書きをするスクリプト。
setup_rootfs sh … 必要ファイルをコピーし、ルート・ファイルシステムを展開するスクリプト。
sh … 作業用シェル。

アンマウントしてホストのrootを抜けます。

[bash]
cd
umount /mnt/sdcard
exit
[/bash]

SD カードをホストマシンから LTN に差し替え、USB デバッグ接続します。SDカードを/sdcardにマウントして中を見てみると、準備したファイル群が見えると思います。それらを実行します。

[bash]
(ホストから)$ adb shell

root権限

mount -t ext3 /dev/block/mmcblk2p1 /sdcard
cd /sdcard
./setup_rootfs.sh ….. ルートファイルシステムを SD カード内に展開。
extract…
copy wpa_supplicant.conf
copy /system/lib/BCM4329B1.hcd
copy bcm4329 files…
copy /system/lib/hw/wlan/usibcm4329-RC218-nvram.txt
debian rootfs ready.
adb# ./setup_recovery.sh … リカバリ領域のバックアップと改造データでの上書き。
Backup recovery…
New recovery ready.
cp recovery_org.img /data/local/tmp …. オリジナルのリカバリ領域を移しておく。
cd /
umount /sdcard
exit
[/bash]

LTNで起動中の Android を普通に終了します。電源ボタンから「電源を切る」でOKです。
完全に電源が切れたことを確認し、HOMEボタンを押しながら電源を投入します。これにより、リカバリモードで起動します。NECのロゴが消えるまで、HOMEボタンを押しておけば確実です。

[bash]
Login: root
Password: (root)
passwd
ifup eth0
ping www.yahoo.co.jp .. 外とつながってるか調べる。
apt-get update …….. うちでは失敗したので、リポジトリを修正する。
vi /etc/apt/source.list
– deb http://ftp.ja.debian.org/debian lenny main non-free contrib
+ deb http://ftp2.ja.debian.org/debian lenny main non-free contrib
apt-get update …….. 今度はうまくいった。
apt-get install aptitude
aptitude install bluez-utils ntp ssh vim
aptitude install x-window-system ttf-mona ttf-kochi-gothic ttf-kochi-mincho
aptitude install xserver-xorg-input-evtouch rxvt-unicode ratpoison gdm
cp /opt/ltna/xorg.conf /etc/X11/
echo ‘inet:x:3003:user’ >> /etc/group
[/bash]

ここまで来て、startxとしたいところを我慢して、念の為再起動すると、Android が立ち上がりました。しまった!と思って、ホストマシンと繋ぎ直し、setup_recovery.sh を実行しなおしました。電源を一度切り、HOMEボタンを押しながら電源投入すると、Linux の起動メッセージが流れた後、嬉しい事に GDM がお出迎えしてくれました。

その後、

[bash]aptitude install locales && dpkg-reconfigure locales[/bash]

で日本語化を行いました。

2.1. SD カードの入れ替え

2.2. バッテリー残量を得るスクリプト

モバイル WiFi + Debian on LTN 環境で、バッテリー残量が取れないと不便だった。インストールしてみた acpi では上手く取れなかったので、簡単なスクリプトを書いてみました。もっと上手い方法があるかもしれませんが、これで十分かな。

[bash]

!/bin/sh

dev="/sys/devices/nvec/nvec_battery/power_supply/battery"
[ ! -e $device ] && exit 1

stat=$(cat $dev/status)

emp=$(cat $dev/charge_empty)
ful=$(cat $dev/charge_full)
now=$(cat $dev/charge_now)

par=$(expr $now * 100 / $(expr $ful – $emp))
[ $par -gt 100 ] && par=100

echo $par% $stat
[/bash]

実行すると、残量のパーセンテージと電源の状態(充電中か、など)が表示されます。