virtualbox のゲスト Debian で nat ネットワークがつながらなかった件

掲題の通り、virtualbox で nat に設定したネットワークアダプタを用意してインストールすると、再起動後に外部ネットワークに接続できない状態になっていたので、開通させるまでの手順をメモ。

結論から言うと以下の 4手順で完了。

  1. ifconfig eth0 10.0.2.15 netmask 255.255.255.0
  2. route add default gw 10.0.2.2
  3. apt-get install ifupdown
  4. /etc/network/interfaces を編集
    • iface eth0 inet dhcp をコメントアウト
    • iface eth0 inet static
    • address 10.0.2.15
    • netmask 255.255.255.0
    • up route add default gw 10.0.2.2
    • down route del default gw 10.0.2.2

ここに行き着くまでに /etc/default/network をいじったり、何度も /etc/network/interfaces を書き直したり、手動で ip コマンドを叩きまくったりと大変だった…
特に /etc/network/interfaces を有効にするには ifupdown パッケージが入ってないとダメだと分かるまでに、だいぶかかってしまった。

debian の preseed.cfg で躓いた所

昨日に引き続き仮想マシン関連で、インストールを自動化しようと Debian の preseed.cfg をいじった記録。

一番大きな問題は apt のプロキシ設定で、ホスト名だけかと思ったらフル URL を入れる必要があったという話。
具体的には「d-i mirror/http/proxy string http://host:port/」と入れなきゃダメ。(port は apt-cacher-ng なら 3142)

あとはまあ、以下を変更するくらい。

  • d-i debian-installer/locale string ja_JP.UTF-8
  • d-i mirror/http/hostname string ftp.jp.debian.org
  • d-i time/zone string Asia/Tokyo
  • d-i clock-setup/ntp-server string jp.pool.ntp.org
  • d-i base-installer/kernel/image string linux-image-amd64
  • tasksel tasksel/first multiselect standard
  • d-i pkgsel/include string openssh-server

気分と趣味によっては以下も。

  • d-i netcfg/choose_interface select eth0
  • d-i netcfg/get_hostname string preseed-test
  • d-i netcfg/get_domain string vagrant.com
  • d-i apt-setup/non-free boolean true
  • d-i apt-setup/contrib boolean true

それから、「d-i keyboard-configuration/xkb-keymap select us」になっていても再起動後のキーボード設定は日本語になっており、なぜか「loadkeys us」も効かないようなので /etc/default/keyboard で「XKB_LAYOUT=”en”」にして再起動すると直る模様。ちなみに PuTTY とかで SSH 接続した場合は、設定してなくても問題無く英語キーボードで使える。

debian 7.6 に docker をインストール

docker がブームらしいという事で、仮想マシンの debian 7.6 にインストールしようとしたら躓いたのでメモ。

探してみた手順では以下のようになっていた。
$ sudo apt-get install -qqy ca-certificates
$ sudo apt-get install apt-transport-https
$ sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"
$ sudo sh -c "echo 'deb https://get.docker.io/ubuntu docker main' | tee /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update && sudo apt-get install -qqy lxc-docker

ところが、この手順で apt-get update したところ、docker リポジトリが取得エラーになってしまった。メインマシンから https で対象サイトにアクセスすると、ちゃんと Packages が取得できてたので悩んだ。

色々試してみたところ、結局 docker.list の中身を次のように書いたら動いてくれた。
deb http://get.docker.com/ubuntu docker main
(サイトの「io」を「com」に、「https」を「http」に変更した)

wget では https でも取得できてるので、何故こうしないと動かないのかは不明。

追記:よく見たら関連リンクに 7.6 用の手順があった…

on lisp 用のユニットテストで困った件

買ってから放置してあった「On Lisp」を読み始めたんですが、どうせだからサンプルソース用のユニットテストを書いてみようと思ったのが、この話の始まりです。

とりあえずユニットテストフレームワークについて調べ回って、FiveAM がいいんじゃないかという事になりました。
最初の方は大した問題も無く、すらすらと(←一部誇張あり)テストを書けました。
で、コンソールとの入出力を行うユーティリティの章まで進んだところで壁(たぶん Lisper には路肩の段差程度)にぶつかったのです。
続きを読む

Linux で SSD

続けて投稿です。まあ、前のと併せて SSD 追加 → マウント という流れだっただけですが。

とりあえず Linux ではカーネル 2.6.33(CentOS 6は2.6.32にバックポートあり)から Trim コマンドに対応しているそうです。
ただし ext4 ファイルシステムでマウントオプションに「discard」を指定した場合のみとのお話なので要注意。

チェック方法としては、それぞれ次のようになります。

  • TRIM 対応状況(SSD側) 「hdparm -I /dev/sda | grep -i TRIM」
  • SSD かどうか? 「cat /sys/block/sda/queue/rotational」が 0 なら SSD
  • 使うI/Oスケジューラ「cat /sys/block/sda/queue/scheduler」
    •   基本的には「cfq」になっていますが、SSD の場合には「noop」や「deadline」にすると効率が良くなるという噂があります

 

また、以下に参考リンクをメモしておきます。

 

 

fstab で UUID を使う

また結構な間が空いてしまいました。

今回は /etc/fstab のマウント設定で UUID を使う方法です。
今更と言えば今更なのですが、これまでインストーラが書いてくれたものしか使っていなかったので、自分で設定するのは初めてでした。

fstab 側の書き方としては、デバイスパス(/dev/sda1 みたいな)の代わりに「UUID=xxxxxxxx」とすればいいわけです。が、その肝心な UUID の調べ方がサッパリでした。

まあ、ここ数年で検索すれば何でも見付かる状態になってくれたので、あっさり分かったのですが、いちおう備忘録ということで。

スーパーユーザで「blkid /dev/sda1」などとするか、直接「ls /dev/disk/by-uuid」で見えるそうです。

簡単なのですが、あまりに単純すぎてコマンド「blkid」やパス「/dev/disk/by-uuid」を忘れて、結局また探すことになる予感がします…

MySQL の varchar 最大文字数について

掲題の件でちょっと引っかかってしまったので、忘れないようにメモしておきます。

MySQL のリファレンスを見ると、「10.5 データタイプが必要とする記憶容量」ページに 『varchar 型カラムの有効最大長は 65532 まで』と書いてあったので、素直に「varchar(65532)」で使おうとしたら怒られました。
というか、勝手に mediumtext に変更されてしまいました。

仕方無いので色々試していたところ、なぜか「varchar(20000)」だと通ったので、その後に alter table でカラム長を varchar(25000) に増やそうとしたところで 「最大 21845 までしか使えへんで(意訳)」というお叱りを受け、そういえば UTF-8 が最大3バイト食うんだっけと思い出して 3 × 21845 を計算してみたら、ぴったり 65535 だったというお話でした。

つまり varchar のサイズ指定は、最大でも「65535 ÷ 文字のバイト数」までしか使えないという教訓を得たのでした。
あと、text系のカラムでも「長さ=文字数×文字のバイト数」で計算されるようです。上の例で text よりも長い型である mediumtext (2^16(=65536) < L < 2^32) に変換されていた事から気付きました。

メモ帳の置き換えで手間取った話

ずっと前に windows7 のメモ帳を置き換えて、別アプリで起動するように設定していました。ところが、一部のアプリでレポート表示を行うとエラーになる事があり、直らないかと色々試した経過を、忘れないように書いておきます。

まず結論から言うと、レジストリの HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe 中で Debugger に文字列(REG_SZ)としてアプリへのフルパス(とオプション)が書いてある場合、拡張子の関連付けよりも優先されていました。このため、いくら関連付けや notepad.exe の置き換えを試しても効果がありませんでした。おそらく環境設定系のアプリを利用した際に追加されたのだと思うのですが、普段使っているツールフォルダの中には入っていなかったようで、具体的にどうやって設定されたのかは不明です。

更に面倒を増やしていたのが、拡張子によって動作を変更するソフトを経由していた事でした。当時の自分としては設定の柔軟性を期待していたのだと思います。しかし、これがまた問題で、関連付けに従ってファイルを表示する場合は大丈夫なのですが、自力でメモ帳を指定されてしまうと exe ファイルへの拡張子別設定が利用されてしまい、肝心のテキストファイルが開かれない状態になっていました。

以上のように複数レイヤで設定されていたため、結論に辿り着くまでに散々 Try & Error を繰り返すことになりました… つくづく作業記録の重要性を感じた2時間でした。

最後に備忘録として、メモ帳置き換えを行うために試したアプリを挙げておきます。

  • Terapper : notepad.exe 置き換え型。手作業版。(本来はTerapad用)
  • NotepadBranch : notepad.exe 置き換え型。インストール版。
  • Anterix : 拡張子関連付け変更型。関連する拡張子をまとめて設定可能。
  • Contexter : 拡張子関連付け変更型。「新規作成」や「送る」の変更も可能。

 

How to add elisp library on Debian

突然ですが Emacs 紹介のページで rainbow-delimiters という「対応する括弧を色付けする」elisp を見付けました。
これは早速入れるべしという事で、まずはパッケージを探したのですが案の定そんなパッケージは存在せず、泣きながら(←誇張)手動でインストールとなりました。

で、「どうせだからパッケージと同じようにシステムにインストールしよう」と(いつもと同様)唐突に思い立ち、なんとか目的を達成したのでメモしておきます。

なお、フォルダのパーミッションの都合上、以下の作業は root で行いました。
手順は windows-el パッケージを参照させて頂きました。メンテナの方に感謝です。

  1. まずは elisp ファイルをダウンロードします。しないと話が始まりません。
  2. それを /usr/share/emacs/site-lisp/ 以下に置きます。今回は 1ファイルだったのでグループ化しませんでしたが、複数ファイルの場合はフォルダを掘って入れるのが良いようです。
  3. 続いて、元と同様のフォルダ構造で /usr/share/?flavor?/site-lisp/ 以下に elisp ファイルへの symlink を張ります。「?flavor?」の部分には実際の emacs の名前を入れてください。今回は「emacs24」でした。
  4. いよいよバイトコンパイルの時間です。symlink したファイル群に対して「emacs24 -batch -q -no-site-file -f batch-byte-compile elispファイル名」を叩いてください。「emacs24」の部分は環境に合わせて読み替えて下さい。(当然ながら作業フォルダは symlink 先だった  /usr/share/?flavor?/site-lisp/ 以下ですよ)
    コンパイル時に別ファイルを読ませる必要があれば「-l ファイルパス」(←小文字のエルです。アイでも1でもありません)をコマンドラインに追加すればいいようです。
  5. 最後に /etc/emacs/site-start.d/ に、ライブラリ読み込み用の設定ファイルを作成します。今回は 50windows-el.el70rainbow-delimiters.el にコピーさせてもらって、ちょこっと編集して使いました。
    基本的には元の elisp ファイルの存在を確認した後で emacs の load-path に追加して、require しているようでした。
    1ファイルしか無い今回は load-path 設定の部分をコメントアウトして require だけにしましたが、動作したので OK ということで。

これでシステムワイドにライブラリを読み込んでくれるので、後は個人設定で add-hook するなり global-rainbow-delimiters-mode で常に ON にするなり、好きなように料理できます。

いやぁ、今日の思い付きは短時間で済んだので本人もびっくりです。持つべきものは「バラせる(←ここ重要。テストに出ます)既存品(つまり windows-el パッケージ)」ですね。

3.times{ print “あけましておめでとうございます” }

…早いもので、前の記事を書いてから三回も年が改まってしまいました。
「ブログはじめました」なのに始まってないだろうというご指摘は謹んでお受けいたします。

…まあ、その間に色々あったせいもあるのですが。

さて、正月の間 vcsh というツールを使おうと README を読んでいたのですが、「どうせなら全部日本語訳してみるか」などと新年早々から血迷った考えに取り憑かれ、その勢いのままサイトを更新したところ、実に2年半も放置していたという事実にショックを隠し切れない現状です。
(この無駄に長い文もそのせいです… え、いつもと同じですって?)

そんな(どんな?)わけで、タイトル通り 3回分の新年のご挨拶と共にサイト更新 & ブログ投稿 と相成りました次第です。

今年は(気が向いた範囲で)なるべくコンテンツを更新していきたいと思います。思うだけなら毎年の抱負と同じですね、はい。

ではまた(なるべく)近いうちに。