2008/11/25

AM2NF3-VSTAに8GBメモリを載せてみる

メモリメーカーの供給過剰が原因なのか、2GBx2メモリパッケージの値段が非常に安くなってきたので、昔に揃えた4GB分のメモリを捨てて新たに2GBモジュールを4枚購入しました。
昔ならバルクだったけれど、値段も安いのでUMAXのPulsar DCDDR2-4GB-800を2セット買いました。載せるマザーボードはずっと使っているAM2NF3-VSTAというAGPなビデオカードが使えるASRockの変則的なものです。
ちなみにビデオカードはNVIDIA Quadro NVS 280を使っています。

  • CPU: AMD Phenom 9350e
  • Memory: UMAX Pulsar DCDDR2-4GB-800 (2GB Modulex4)
  • Mother Board: AM2NF3-VSTA
  • HDD: HGST HDS721616PLA380 (160G SATAII300 7200) (x4 RAID5)
  • OS: Ubuntu 8.04 amd64 Edition

普通に載せるだけで動くかと思いきや、DDR2-533として認識されたあげくにUbuntu 8.04がカーネルパニックを起したため、手動でDDR2-800を指定しています。
カーネルパニックは偶然だったかもしれませんが、いずれにしてもちゃんと動いています。 DDR2-800だから早くなったという気はしないけれど、ファイルキャッシュに4GBほど収まっている現状でキャッシュからの読み出しが増えたせいか、きびきび動き8GBにして良かったと思います。

2008/11/22

netbeans-6.5を試してみる

3連休だし、なんとなく出たばかりのNetBeans 6.5をUbuntu 8.04で試してみます。

まずは文字化けの対応

たぶん気をつけるのは、最新版のJDK 6を自力で展開して使っている場合にUbuntu 8.04上でそのまま実行すると日本語フォントが正しく表示されないという点です。 apt-getでsun-java6-jdkパッケージを導入している場合には、文字化けの問題はなくNetBeansのインストーラーが"/usr/lib/jvm/java-6-sun"をJDKのトップディレクトリとして認識してくれます。導入していなければバージョンは古いですが、導入してしまいましょう。

$ sudo apt-get install sun-java6-jdk sun-java6-fonts
インストーラーは正しく動きますが、この中で通常使用するJDKとしてダウンロードした最新版のJDK 6のトップディレクトリを指定すると、~/netbeans-6.5/bin/netbeansを実行した時に文字化けしてしまうという現象に遭遇します。

Javaでのフォントの指定は、jre/lib/fontconfig.propertiesにあります。 今回はUbuntuのパッケージに含まれる/etc/java-6-sun/fontconfig.propertiesファイルを流用させてもらいます。 自分で最新版のJDK 6を/usr/java/1.6.0ディレクトリに入れているので、次のような作業をしました。 もしまだ"sun-java6-jdk"パッケージを導入していない場合には、導入しましょう。

$ cd /usr/java/1.6.0/jre/lib
$ sudo rm fontconfig.properties
$ sudo ln -s /etc/java-6-sun/fontconfig.properties .
これで"~/netbeans-6.5/bin/netbeans"を実行すると、綺麗な日本語でIDEが表示されました。

続いてC++サンプルの高速道路シミュレータを試す

NetBeansはダウンロードする時に、一番サイズが大きい全部入っているものを選択したので、JRuby開発狙いでしたが、C++のサンプルを実行してみようと思いました。 転職する時にはC++でプログラムを書くはずだったのが、そんな事はまだ一度もしていなくて、けれどいつか必要になる時のために少し慣れておこうかなと思ったのでした。

さて、メニューから”新規プロジェクト”を選択すると、カテゴリ選択できますが、”サンプル”をみると各カテゴリに割と具体的な名前が並んでいます。 なんとなく”高速道路シミュレータ”を実行させてみようと考えました。 さっそく選択して、まずはビルドしてみます。 しかしエラーが…。

callbacks.cc:168: error: cast from ‘void*’ to ‘int’ loses precision
callbacks.ccファイルをみてみると、C++プログラムなのに普通に"gpointer user_data"で宣言されている変数がint型にキャスト((int) usre_data)されています。 うーん、README.txtファイルにはUbuntu 7.10で確認済みとあるので、g++のバージョンが違う事が原因のようです。O'REILLYのC++ランゲージクイックリファレンスによれば、C++では従来のC言語から引き継いだキャストの他にプログラマが意図を伝えるためのキャスト方法があります。
//int zone = ((int) user_data) - 1;
    int zone = reinterpret_cast<int&>(user_data) - 1;
これとrandx()のところを同様に修正すると、無事にコンパイルが通り、シミュレータを動かす事ができました。

2008/11/15

Thinkpad x22:CD-ROMを使わずにHDD入れ替えWindows XPの引越し

前の会社に入社した時に13万円ぐらいで買った英語版キーボードのThinkPad x22。
さすがに古くなり、ハードディスクに空きがなくなってきたので手持ちのIDE HDDの中から大容量の160GB HDDと交換してみました。 今回のテーマは次の2点です。

  • 無料で手に入るツールを使う事
  • 交換用OSをCD-ROMから起動しない事

CD-ROMで新しいHDDにOSを入れずにHDDを新しくする方法はMicrosoftのサイトでみつける事はできませんでしたが、ツールを購入したり、Knoppixを使うなどの選択肢はいろいろあるようです。 Knoppixが使えればddで起動するだけですが、余ったHDDの領域はDドライブなど他のパーティションになってしまいます。
Googleさんではこれぞという方法が見付からなかったので、Unix系OSでいうところのddコマンドを使った移行と同じ事ができないかいろいろ調べてみると、GUIを持つ"SelfImage"というツールでディスク単位でのコピーができるということがわかりました。

SelfImageのサイトに書かれている説明をみるとWindows版の"dd"コマンドでは、稼働中のディスクのコピーはできないが"SelfImage"はできると書かれています。

linuxでの"dd"コマンドと同様に"selfimage"では移行元のディスクと同容量のCドライブが作成されるという事で、余った部分はDドライブにするなどして使う必要があると調べたサイトに書かれていました。
けれどDドライブはいらないし、余った領域をCドライブに追加できないか調べてみます。 まずはGNU partedでNTFSの拡張ができるか調べたところNG。 ただしWindows XP付属する"diskpart"コマンドでNTFSの拡張操作のみは可能だという事が判明。

単純に、

  1. 160GB HDDをDドライブとして追加
  2. "selfimage"でCドライブをDドライブにVolumeコピーし再起動
  3. DOS窓で"diskpart"を実行しCドライブのVolumeを拡張+再起動
  4. その後で物理的にDドライブをCドライブに交換
"SelfImage"コマンドと"diskpart"コマンドを利用して、2-3時間程度で20GBのCドライブを、およそ145GBに拡張することができました。

注意点

気をつける事はBIOSを最新にして120GB以上のディスクを認識させる点と、ThinkPadにドッキングベイ+ウルトラベイ2000などを使って2台目のHDDを付けなければいけない点。
またMicrosoft純正の"diskpart"コマンドといえどもCドライブは拡張できないため、"selfimage"でのディスクコピー後にNTFSの拡張操作をしてから、CドライブとDドライブの物理的入れ替えを行なうという手順を守る点。

CD-ROMでKnoppixを起動して、HDD2台の内容をコピーする必要があるかと思って外付けUSB CD-ROMドライブを買わないとかなと躊躇していましたが、Dドライブをマウントするためのウルトラベイ2000を持っていたので、2台目のディスクを接続するだけで可能でした。 もう少し早くやっておけば良かったと少し後悔しました。

2008/11/08

Ubuntu 8.04 LTSでArduino Diecimilaを使ってみる

後継機としてはDuemilanoveというモデルが出ているらしいけれど、Diecimilaもどっちも発音できないのでどうでもいい。

USBで接続する前にドライバの導入

とりあえずUbuntu 8.04にUSBでArduinoを接続するためのドライバを導入する。 とはいってもしばらく前にBuffaloのSirial-USBケーブルを接続するために導入してしまったので思い出してみる。

$ sudo apt-get install libftdi0
これでいいはず。

UbuntuとArduinoをUSBでつないでみる

まず必要なものは次のようなもの。

  • 公式サイトで配布している開発環境 - Arduino - 0012
  • gccとライブラリ、ヘッダーファイル一式
開発環境はダウンロードして適当な場所に展開して、その中にあるarduinoを起動します。
$ cd /tmp
$ tar xvzf ~/arduino-0012-linux-amd64.tgz
$ cd arduino-0012
$ ./arduino
ここで適当なサンプルプログラムを公式サイトからコピーして実行してみたところ、エラーがいろいろ出てしまいました。とりあえず最初のエラーは"avr-gccがない"で、次に"avr/io.hが発見できません”でした。 これを回避するためにavr関連のパッケージを導入します。
sudo apt-get install avr-libc gcc-avr
ちなみにarコマンドなどが入っているbinutilsはgcc-avrと一緒に導入されます。
avr用のgccクロスコンパイラを導入しただけではヘッダーファイルがなくて怒られてしまいます。

サンプルプログラムの実行

公式サイトでは"Learning"というメニューから用途別のサンプルコードをみる事ができます。最初にあるDigital I/Oの"Blink"というコードをそのまま実行(Fileメニューから"Upload to I/O Board"を選択)してみます。
コードと一緒にある写真ではLEDをポート13番にさしていますが、Diecimila君はボード上にLEDがあるためLEDを別途接続しなくても確認できます。 手持ちのLEDをGNDとポート13に接続したところ明るく点滅し、オンボードのLEDは暗くなりました。

2008/11/07

コンビニ受け取りの荷物が行方不明に…

ちゃんと出てきたから良かったのですが、某所で購入したArduino Diecimila君を受け取るために某宅急便会社のコンビニ受け取りサービスを使いました。月曜日に不在通知が届いたから、週末まで待つのもなぁ、と思ってコンビニで受け取る事にしたところ一時行方不明に…。いつも通りに土曜日の午前中に届けてもらえばよかった。

仕事帰りに受け取りに行ったところ店員と責任者らしき方の二人が出てきて当店にはそのような荷物はない旨の回答をもらいました。まぁWebで地図に出てきた店をクリックして指定したとはいえコンビニの店名か場所を間違えたかもしれないし、と思って一時帰宅。 けれどメールチェックの住所をGoogle Mapでみても、どうも勘違いではなさそう。

結局コールセンター経由で探してもらう事にしました。 そこでも配達員はコンビニに確かに置いたし、電話で近くのコンビニに聞いたけれど、どこにもないって事になりました。それでも人を送って探しますという事で、折り返し発見した旨の返事がきました。

でもね、コンビニで最初に物がないっていう返事をした人もしらんぷりだし、こうなってくると配達員がそっとコンビニに置き忘れた荷物を持っていったのかもしれない。 横浜に住んでいた時は便利に使ってたんだけどなぁ。田舎だからこんなサービス使うのは僕だけなのかなぁ。 まぁ対応にはそれほど問題はなかったけれど、コンビニに荷物を預けるのは止める事にしよう。

この事件の隙をついて実家から来た荷物はすぐに営業所預かりにしました。今度はどうかなぁ…。ちなみにArduino君はlinuxに繋いでいて、LEDを光らせながら元気に動いています。

2008/11/04

ニコニコ小沢ライブで「片手落ち」が差別的発言といわれていた

ニコニコ動画で民主党小沢代表のライブ番組をやっていたのを聞いて、その録画動画をみてみた。内容はどうでもいいのですが、その中で「片手落ち」という言葉への反応が気になりました。
小沢代表の発言にあった「片手落ち」について自分が聞いた時の感覚からいっても差別的な意味合いはまったく感じられませんでしたし、経験からこの言葉自体にもそのような意味合いを持って使われている事はないと考えています。

すごーく難しい連想ゲームをやっていくと「手が落ちる」様を連想するのかもしれませんが、その論理で制限を加えていくのは、客観的な事実、道理に基づいて判断せずに世間体という仮想的な第三者の目を判断基準にしてきた日本の差別的な風潮そのもののように思えます。

もちろん不快な印象を受ける人がでるような発言は良くありませんが、現状でこの言葉を差別的と捉える人が少なくない事は事実のようです。
この言葉を差別的と考える人は、この単語に反応するような回路を持っているのだと思いますが、この言葉を差別的な意味合いで使う状況というのはイメージできないのではないでしょうか。差別的な言葉として現在避けられている言葉は、直接的に特定の障害を持った人を指す言葉や特定の状況をイメージさせるものだと感じています。

ただ差別的な言葉とされているものには、一般的な名詞にも拘わらず過去に差別的意図を強く持って使われた言葉である場合もあるので、「片手落ち」という言葉が特定の障害を持つ人を指す言葉として定着してしまえば、公で使うには不適切な言葉になるでしょう。そうならない事、そんな意図で発言する人が出てこない事を願っています。

更迭された航空幕僚長の論文

テレビで散々やっている話題ですが、問題になった論文の文言だけ取り上げられて、その記述前後の内容についてはまったく触れられていないので論文を読んでみた。
書かれている個々の記述は引用などで裏付けがあって、細かい点では微妙なものもあるけれど、全体としてはよくまとまっていると思います。

けれど、現代の感覚で当時を解釈仕直したというか、結論ありきでそこに至るまでの間に都合の良い事実を並べたという感じは強く感じました。それは当時の状況を考えれば日本の対応は非常に紳士的であったし、戦争という行為に至った事にも列強に陥れられたためという事実を述べた流れで、侵略国家というのは濡れ衣だと表現している点に表れていると思います。

中国や韓国での日本叩きは内政の問題を外交に向けさせるために政府から放置されエスカレートした結果だから、日本が繰り返し謝罪や補償を含めた対応をする必要はないと思うけれど、かといって侵略戦争ではないというのは当てはまらないと思う。
仕向けられたものだとしてもそれに乗った責任はあると思うし、侵略でないとするならば自衛という事になりそうですが、石油を求めて南下して戦線を拡大したのは間違いないと思います。そんな戦争に巻き込まれた市民の事を考えれば、日本として申し分けないという気持ちを持つ事は重要なのではないでしょうか。侵略したけれど当時の状況の中で日本人は立派に対応したという事なら理解できるんですけれど、戦争はしたけれど侵略していないというのは成立しないように思います。

問題は必要以上にネガティブな歴史観を持ったまま、それを自ら修正する事もなく受けいれてしまう日本人がいる事と、そんな事を教えてしまう教育にあると思いますが、そういう憤りを論文という形にまとめてしまったように感じました。幕僚長という立場を考えれば退官後にゆっくりと堂々と意見を主張するべきだったでしょう。
こんなに素直な人が組織のトップになるなんて、老練かつ狡猾なやり取りが必要とされている現代にあってつくづく日本は平和なんだと思います。

2008/11/03

vmwareでclone化したUbuntu 8.04でeth0がeth1になってしまう

まぁなんてことはないんですが、CMSパッケージをいくつか試してみようと考えて、VmwareにインストールしたUbuntu 8.04 Server版のイメージを元にCloneを作成しました。

なにげなく起動してパッケージ情報を更新しようと"sudo apt-get update"を実行したところネットワークに接続されていない事でエラーが発生してしまいました。
わりとすぐに以前ALIXで調べた/etc/udev/rules.d以下のファイルを書き換える必要があるんだろうと気がついてよかったですが、ひさしぶりに慣れない事をするとはまりそうになります。
調べ方だけまとめておきます。

ネットワークインタフェースの状態を把握する

linuxではネットワークインタフェースはループバックデバイス"lo"の他に"eth0", "eth1"、...といった"eth"+"数字"で認識されていて、昔は物理的なネットワークカードに対応して0番目から1..nと増えていったものです。最近は後述するようにネットワークカード毎にユニークなMACアドレスを紐づけて、電源を入れる度にランダムにネットワークカードとデバイス名の対応が壊れないように管理されています。一つのインタフェースに複数のIPアドレスを"eth0:0"のような形式で設定する("sudo ifconfig eth0:0 192.168.x.y"等)事もできますが、現在のような形で管理されてしまうとなかなか見る機会も使う機会もなさそうです。

というわけでネットワークに接続できない場合には、まずどんなネットワークデバイスが認識され、有効になっているか確認します。 まずは有効になっているネットワークアドレスを調べます。

$ ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
これで127.0.0.1という必ず設定されている自分自身を表すループバックアドレスだけが認識されている事がわかります。これはお約束で設定されているため、これだけではネットワークに接続する事ができません。

次にネットワークに認識されているデバイスを調べます。

ifconfig -a
eth1      Link encap:Ethernet  HWaddr 00:0c:29:14:yy:yy  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          ...
lo
          ...
通常は2行目にIPアドレスの指定が入り、"BROADCAST"で始まる行が"UP BROADCAST"と稼働中を表わす"UP"で始まるようになります。

ここで"eth0"ではなく、"eth1"が認識されているものの稼働していない理由を調べます。Ubuntu 8.04では"/etc/network/interfaces"にデバイス毎の設定が入ります。

$ cat /etc/network/interfaces 
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp
ここで"eth1"に対応する設定が入っていない事でDHCPサーバーからの自動IP設定もIPアドレスの直接指定もできずに"eth1"が認識されたまま起動しないのだとわかります。
ここでの解決策はおそらく次のいずれかになるでしょう。
  1. /etc/network/interfacesファイルにeth1用の記述を追加する
  2. eth1をeth0として認識させる
ここでは2番目のeth1をeth0として認識させる方法で対応します。 設定ファイルは"eth0"という文字を含むでしょうから、まずこのファイルを表示させます。
$ sudo find /etc/ -type f -exec grep eth0 {} \; -print
...
/etc/network/interfaces
...
/etc/dhcp3/dhclient.conf.dpkg-dist
...
/etc/udev/rules.d/70-persistent-net.rules
...
/etc/initramfs-tools/initramfs.conf
sudoを使用するのは一般ユーザーでは読めないファイルがあった時のエラーを防ぐためだけで、必要性は高くありません。grepの結果が表示されて、続いてそのファイルが表示されます。この中で2つのファイル、"interfaces"と"initramfs.conf"、はmanで何のファイルか確認する事ができます。"dhclient.conf.dpkg-dist"のファイルの後ろにある".dpkg-dist"はパッケージの更新時に既存のファイルを残す選択をした時に作成されたもので、普通は新しいパッケージについてくる未編集の設定ファイルです。"man dhclient.conf"と".dpkg-dist"を除いた形では説明を読む事ができます。
残った"/etc/udev/rules.d/70-persistent-net.rules"ファイルが問題のファイルで、この中は次のようになっています。
$ cat /etc/udev/rules.d/70-persistent-net.rules 
# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:14:xx:xx", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:14:yy:yy", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
いま認識されているMACアドレスは"00:0c:29:14:yy:yy"なので、これがeth1になっているのは、このファイルの記述通りです。"00:0c:29:14:xx:xx"はVMWareでCloneを作成する元になった方で使用していました。これは今後使われる可能性がないので、おもいきって消してeth1をeth0にしてしまいます。
$ cat /etc/udev/rules.d/70-persistent-net.rules 
# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:14:yy:yy", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
これで再起動すれば、"eth0"となったデバイスに、/etc/network/interfacesの設定通りdhcpで設定されたIPアドレスが設定されます。