米国製の計算機と日本製の計算機の違い


AppleとSonyの一番の違い part IIという記事を見て、「なるほど」と思ったのですが、こういう「たとえ」を使わなくても、そのままずばりのわかりやすい例がありました。

「高さが3の正三角形の面積は?」と訊かれたら、たいていの人は答えられると思いますが、ウェブで検索するより早く答えられる人は少ないでしょう。実際に、ウェブで解決しようとするとき、米国製の計算機と日本製の計算機、どっちを使いますか?

米国製の計算機

日本製の計算機

米国製の計算機、WolframAlphaの場合

「equilateral triangle height=3」と入力すれば答えが得られます。簡単に答えがわかるのはもちろん、結果のURLが得られるのもいいですね。

日本製の計算機、高精度計算サイトkeisanの場合

  1. 「数学・物理の計算」をクリックする
  2. 「三角形」をクリックする
  3. 「正三角形」をクリックする
  4. 入力指定を「高さ」にする
  5. 高さを「3」にする
  6. 「計算」ボタンをクリックする

これでやっと答えが得られます。初めて行く人は、どこに何があるかがわからないので、「手で計算した方が早い」ということになるでしょう。

keisanがWolframAlphaになる必要はありませんが、「英語がわからなくても大丈夫」以外のメリットを打ち出せるようになるといいですね。

第五世代筆記具


第五世代というと顔をしかめられる業界もあるようですが、文房具業界はどうでしょう。

パーカーから“第五世代”と銘打った筆記具「インジェニュイティ」が発売されたので試してみました。手で書く機会はあまりないにもかかわらず、いつもいい筆記具を探しているので、「書き味」をアピールする筆記具の新製品はだいたい試しています。

allaboutより)

まず、名前にちょっと問題があります。発音しにくく憶えにくい。限定販売の今のうちに、発音しやすい名前に変えておいた方がいいと思います。メーカーは違いますが、ぺんてる「プラマン」の高級版だってことがすぐわかる感じにするのはどうでしょうか。「ハイプマ」とか。

パーカーが勝手に言っていることではありますが、「世代」というのはこんな感じだそうです。

  1. 万年筆
  2. 油性ボールペン
  3. ローラーボール(水性ボールペン)
  4. メカニカルペン(シャープペンシル)
  5. 一般名称不明(製品例:インジェニュイティ)

サインペンが入っていないのも問題です、限定販売の今のうちに、「インジェニュイティ」は“第六世代”ということにして、空いたところにサインペンを入れておいた方がいいと思います。

私のお気に入りはこんな感じです。

万年筆
油性ボールペン
ローラーボール
  • Swift(映画マトリックスの小道具)
サインペン
メカニカルペン
  • クルトガ(すごいと思うが、シャープペンシル自体、あまり使わない)
“第五世代”
  • インジェニュイティ(品質・価格ともに高い)

「1本だけ」と言われればジェットストリームだという人が多いと思いますが、ピュアモルトシリーズ以外は手触りがあまりよくありません。リフィルは同じM66でも、TipoよりもSwiftがいい、これも同じ理由からでしょう。この点に関しては、「インジェニュイティ」はとてもいいと思います。

指先の神経は脳と大変密接に関係していますので、ペンの手触りという面でも満足してもらうというのはとても大切なことだと考えています。(「LAMY」社長が語る、モノ造りの真髄

インジェニュイティ (parkerpen.com)

VirtualBoxでUbuntu 11.04の新しいデスクトップであるUnityを試す


拙著『Webアプリケーション構築入門』で想定している作業環境は、UbuntuとWindows、Mac OS Xです(Ubuntuを推奨)。本書執筆時点のUbuntuの最新バージョンは10.10でしたが、よりサポート期間の長い10.04 LTS (Long Term Support) を採用しました。

Ubuntu 11.04がリリースされた現在においても、10.04 LTSを利用することに特に問題があるとは思いませんが、ソフトウェア環境は常に最新に保っていたいという読者にとっては問題でしょう。そこで、Ubuntu 11.04を導入する方法を動画にしておきました。

ついでに、Ubuntu 11.04の新しいデスクトップであるUnityを有効にする方法を紹介します。本書で利用しているデスクトップであるGNOMEとUnityはずいぶん違うので、「本のとおりにすすめたい。新しいものは今は要らない」という方は、無効のままにしておくことをおすすめします。

  1. 仮想マシンのディスプレイ設定で3Dアクセラレーションを有効にしてからUbuntuを起動する
  2. アプリケーション→アクセサリ→端末
  3. sudo apt-get update
  4. パスワードを訊かれたら入力する
  5. sudo apt-get install virtualbox-ose-guest-utils(この作業は、VirtualBoxのGuest Additionsをインストールの代わりになります。つまり、Guest Additionsをインストールする必要はもうありません。Guest Additionsは、これでうまくいかないときに試してみるといいでしょう)
  6. 再起動する(sudo reboot

手順が若干違いますが、この作業も動画にしました。

本書のための解説動画はFacebookページにまとめてあります。

リモートマシンにVNCを使ってログインする方法


目標

こんな感じでリモートマシンにVNCを使ってログインするのが目標です。SSHでログインしてから手動でVNCサーバを起動する方法は最後に書きます。CentOS 5.3で動作を確認しました。

vnc.png

リモート側の設定

参考:VNC Serverをxinetd経由で立てる方法 [Fedora 10]

  1. yum install xorg* gnome* gdm xinetd vnc-server nautilus
  2. /etc/inittab を編集し(id:5:initdefault:)、ランレベルを5にする
  3. /etc/servicesに「vnc 5900/tcp」と記述する
  4. /etc/xinetd.d/vncを作る。内容は以下の通り(解像度は1440×850くらいがいいという環境もあるかもしれない。解像度の設定を複数用意したい場合は、サービスの名前を変えて/etc/servicesに記載する)
    service vnc
    {
        disable         = no
        nice            = 10
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = nobody
        server          = /usr/bin/Xvnc
        server_args     = -inetd -query localhost -once -geometry 1024x768 -depth 24 --securitytypes=none
        log_on_success  += DURATION
        log_on_failure  += HOST
    }
  5. /etc/gdm/custom.confを以下のように修正する。
    [security]
    DisallowTCP=false
    AllowRemoteRoot=false
    
    [xdmcp]
    Enable=true
    
    [greeter]
    IncludeAll=false
  6. 通信を暗号化しなくてよいなら、/etc/sysconfig/iptablesを編集し、5900/tcpを開ける(暗号化する場合はこの作業は不要)
  7. リモートマシンを再起動する

ローカル側の操作

通信を暗号化しなくてよい場合

TightVNC(Windowsの場合)やChicken of the VNC(Mac OSの場合)のようなVNCクライアントで「リモートマシンのIPアドレス:0」にアクセスする。Mac OSのFinderの「サーバへ接続」で「vnc://リモートマシンのIPアドレス:0/」としても接続できるはずだが、私の環境(Mac OS X 10.6)ではうまくいかなかった。

通信路を暗号化する場合

  1. SSHでログインする
  2. 「ssh -2 -N -f -L 5900:localhost:5900 ユーザ名@リモートマシンのIPアドレス」などとして、localhostの5900/tcpをリモートマシンの5900/tcpに接続するように設定する(ローカル側のポートは任意。TeraTermの「SSH 転送」のようなものを使ってもよい)
  3. TightVNC(Windowsの場合)やChicken of the VNC(Mac OSの場合)のようなVNCクライアントで「localhost:0」にアクセスする。Mac OSのFinderの「サーバへ接続」で「vnc://localhost:0/」としても接続できるはずだが、私の環境(Mac OS X 10.6)ではうまくいかなかった(ポートを5901に変えてもだめだった)。

Eclipse上でPythonのプログラムを書くためのプラグインPyDev


「なぜPythonなのか」から続く

『Pythonスタートブック』4774142298を読んでいます。コードが単純な初めのうちは、Pythonの特徴を活用した、その場で試せるサンプルが続いていましたが、後の方ではコードが複雑になることもあって、ファイルにコードを書かなければいけなくなりました。オブジェクト指向のコードを一般的なエディタで書くのは私には無理なので、Python開発のためのEclipseプラグインであるPyDevを導入しました。コード補完機能や、エラーの即時表示機能が便利です。

Eclipse上でHelp→「Install New Software」とし、「Work with」に「http://pydev.org/updates」を入力すればインストールできます。

なぜPythonなのか


Quotes about Pythonを見ると、Pythonがさまざまな場所で重要な役割を担っているプログラミング言語だということがわかります。たとえば、GoogleのPeter Norvigさん、彼はハッカーを育てるためのLisp本Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp日本語訳)の著者ですが、Pythonも重視しているようで、次のように言っています。

Googleにとって、Pythonは最初から重要でした。システムが大きく成長した今もそれは変わりません。現在、Googleには多くのPythonエンジニアがいますが、もっとたくさん採用したいと考えています。

4274065979Paul Grahamさんは、『ハッカーと画家』に収録されているエッセイ「素晴らしきハッカー」の中で、「Googleは、Javaプログラミングの求人広告を出すとき、賢明にもPythonの経験を要求している」と言っています。(同様の議論が「Pythonのパラドックス」でもなされています。)

Javaのプロジェクトで働くために雇われるプログラマは、 Pythonを使うプロジェクトで雇えるプログラマほど 賢くはないだろう。そして、雇えるハッカーの質は、たぶん言語の選択よりもずっと重要だ。もっとも、正直に言えば、良いハッカーはJavaよりPythonを好むという事実が、これらの言語の相対的な利点について何かを暗示していると思う。

たしかに、かつてはそうだったのでしょう。学校で教えられるのは、C言語やC++、Javaなどでしょうから、Pythonを知っているということは、少なくとも「習ったことしかできない奴」ではないことの証ではあったわけです。

489471163Xしかし今は21世紀です。MITはSICPを使った伝説的な講義6.001で使うプログラミング言語をSchemeからPythonに変えたそうです(Why MIT switched from Scheme to Python)。ソフトウェアをGoogleのクラウド上で動かす仕組みGoogle App Engineが最初にサポートした言語はPythonでした(後にJavaが追加されました)。

こうなってくると、Pythonを使って優秀なエンジニアを簡単に見つけることはできなくなっているでしょう。普及のための閾値を超えて、「常識」になりつつあるからです。

これからは、経験を積んだエンジニアだけでなく、プログラミングの初心者がPythonを選択するということも増えてくるはずです。そういう人のための資料は、C言語やJavaに比べてまだまだ少なく、需要に供給が追いついていないことが予想されます。

辻真吾『Pythonスタートブック』(技術評論社, 2010)4774142298は、最初に学ぶプログラミング言語がPythonだという、新しい世代のための入門書です。キャプチャ画面を使って作業手順を丁寧にしているのはもちろん、つまずきそうなことがらについて説明の仕方や、対話的に使えるというPythonの特徴を最大限に生かす題材を独自に考案しています。まったくの初心者でも、この本を読めば短時間でプログラミングのエッセンスを学ぶことができるでしょう。たとえば、私はこの本を読むまで、「変数への代入」という概念につまずく初心者のことなんて考えたこともありませんでした(自分もかつてそうだったにも拘わらず)。そういうレベルから説明の仕方を見直そうという著者の姿勢には感心します(独自の工夫のすべてに賛同できるというわけではありませんが)。

Pythonがほんようによい言語かどうかの判断は、プログラマ個人に委ねるのがいいでしょう。Paul Grahamさんのように、「プログラミング言語の重要な9つのアイディアのうち、Pythonがサポートしているのは7つまでであり、Lispには劣っている」という人もあれば(技術野郎の復讐)、Paul Prescodさんのように、「Pythonはちょうど良いところで妥協している」という人もいます(PythonとLispの関係について)。

関連:Eclipse 上でPythonのプログラムを書くためのプラグインPyDev

Hadoopの疑似分散モード


Hadoop (大型本)スタンドアローンモードでの動作ビルド方法を確認したら、次は疑似分散モードです。

スタンドアローンモードではローカルのファイルシステムを使っていたのに対し、疑似分散モードでは分散ファイルシステム(HDFS)を使います。もちろん、マシンが1台なので、HDFSのコンテンツは本当はローカルにあるわけですが、見た目はそうではなくなります。

利用方法は、Quick Start日本語訳)のとおりです(前に作成した入力データinputがあるとして)。

  1. 設定用のXMLファイル(core-site.xmlとhdfs-site.xml, mapred-site.xml)を書き換える
  2. パスフレーズなしでlocalhostにssh接続できるようにする
  3. HDFSのフォーマット
    bin/hadoop namenode -format
    
  4. Hadoopデーモンの起動
    bin/start-all.sh
    
  5. 入力ファイルをHDFSにコピー(3番目の引数はローカル、4番目の引数はHDFSのファイル名)
    bin/hadoop fs -put input input
    
  6. プログラムの実行(WordCountの場合)
    bin/hadoop fs -rmr output
    bin/hadoop jar hadoop-0.20.1-examples.jar wordcount input output
    
  7. HDFS上の結果を読む
    bin/hadoop fs -cat "output/*"
    a       3
    b       3
    c       2
    
  8. Hadoopデーモンの停止
    bin/stop-all.sh
    

HDFSの様子はhttp://localhost:50070/で、MapReduceの様子はhttp://localhost:50030/でわかります。(外部からでも見えますが、その場合にはファイアウォールを正しく設定しておく必要があります。)

ヒント

  • デーモンを起動する前にフォーマットする
  • うまくいかないときは、デーモンを停止させてから/tmp/hadoop*を削除し、やり直す

つづく

  • Eclipseプラグイン
  • 完全分散モード
  • Cloudera’s Distribution for Hadoop

Hadoopコードのビルド方法


Hadoop (大型本)Hadoopの導入とサンプルによる動作確認が終わったら、コードをビルド・実行してみたくなります。

例として、Map/Reduce Tutorial日本語訳)で紹介されている単語を数えるプログラムWordCount v1.0をビルドしてみましょう。

パッケージ構成通りにディレクトリを作成し、コードを記述します。

mkdir -p org/myorg
touch org/myorg/WordCount.java
WordCount.javaを編集

Classファイルを格納するディレクトリを作ります。

mkdir wordcount_classes

コンパイルします(環境変数はどこかで1回設定すればいいです)。

export HADOOP_HOME=/home/yabuki/hadoop-0.20.1
export HADOOP_VERSION=0.20.1
javac -classpath ${HADOOP_HOME}/hadoop-${HADOOP_VERSION}-core.jar -d wordcount_classes org/myorg/WordCount.java

Classファイルをjarにまとめます。

jar -cvf wordcount.jar -C wordcount_classes/ .

入力データを作ります。

mkdir input
echo 'a b c' > input/a
echo 'a c b b a' > input/b

実行します。

rm -rf output
${HADOOP_HOME}/bin/hadoop jar wordcount.jar org.myorg.WordCount input output

結果を確認します。

cat output/*
a       3
b       3
c       2

AntやMavenのようなビルドツールを使うのが正統なのですが、あとでEclipseを使う方法を紹介するので、どうでもいいでしょう。

つづく

  • 疑似分散モード
  • Eclipseプラグイン
  • 完全分散モード
  • Cloudera’s Distribution for Hadoop

Hadoopの導入方法(スタンドアロンモード)


Hadoop (大型本)Googleが2004年に提唱した分散処理技術MapReduceがあると、手続きをmapとreduceという2つの形式に分けて記述しさえすれば、データを複数の計算機で分散処理できるようになります。

Googleが利用しているMapReduceの実装は公開されていませんが、Hadoopというオープンソースの実装を利用することで、MapReduceを簡単に試すことができます。具体的な方法は以下の通りです(GNU/Linuxの場合)。詳細はQuick Start日本語訳)を参照。

  1. SunのJDKをインストールする
  2. Hadoopをダウンロード・展開する
    wget http://ftp.kddilabs.jp/infosystems/apache/hadoop/core/hadoop-0.20.1/hadoop-0.20.1.tar.gz
    tar zxf hadoop-0.20.1.tar.gz
    cd hadoop-0.20.1
    
  3. conf/hadoop-env.shに、「JAVA_HOME=/usr/java/latest」のようにしてJDKの場所を記述する。

Hadoopには、スタンドアロンモードと疑似分散モード、完全分散モードという3つの動作モードがあります。運用時には完全分散モードにしなければなりませんが、ここではもっとも簡単なスタンドアロンモードで動作を、Hadoopに付属するサンプルで確認します(付属サンプルは「bin/hadoop jar hadoop-*-examples.jar」として確認できます)。

まず、入力データを用意します。

mkdir input
echo 'a b c' > input/a
echo 'a c b b a' > input/b

ディレクトリinputにあるファイルの中身の単語数は、サンプルのwordcountを使って次のようにして数えられます。

rm -rf output
bin/hadoop jar hadoop-*-examples.jar wordcount input output
cat output/*
a       3
b       3
c       2

サンプルをもう一つ試します。

cat > problem.dat <<'EOF'
1 ? ? ? ? 7 ? 9 ?
? 3 ? ? 2 ? ? ? 8
? ? 9 6 ? ? 5 ? ?
? ? 5 3 ? ? 9 ? ?
? 1 ? ? 8 ? ? ? 2
6 ? ? ? ? 4 ? ? ?
3 ? ? ? ? ? ? 1 ?
? 4 ? ? ? ? ? ? 7
? ? 7 ? ? ? 3 ? ?
EOF

この数独(Ai Escargot)は、サンプルのsudokuを使って次のように解けます(ファイルの形式はsrc/examples/org/apache/hadoop/examples/dancing/puzzle1.dtaを参照)。

bin/hadoop jar hadoop-*-examples.jar sudoku problem.dat
1 6 2 8 5 7 4 9 3
5 3 4 1 2 9 6 7 8
7 8 9 6 4 3 5 2 1
4 7 5 3 1 2 9 8 6
9 1 3 5 8 6 7 4 2
6 2 8 7 9 4 1 3 5
3 5 6 4 7 8 2 1 9
2 4 1 9 3 5 8 6 7
8 9 7 2 6 1 3 5 4
Found 1 solutions

つづく

32ビットと64ビットとの性能差(Mathematicaの場合)


Windows 7は、32ビット版と64ビット版のどちらを使うのがいいのでしょうか。

絶対欠かせないソフトウェアが64ビット版では動かない場合、32ビット版を使うしかありません。そのソフトのためだけにVirtualBoxのようなを使ってもいいのですが、たいていの人はそんなことはしたくないでしょう。

4GB以上の主記憶を使いたい場合には、64ビット版を使うしかありません。32ビット版ではそれだけのメモリを使うことはできないからです。

上記2点のどちらにも当てはまらない場合はどうしたらいいでしょうか。

Mathematicaが大好きな人には(あるいは大好きじゃなくても、Mathematicaをよく使う人には)、64ビット版がおすすめです。変わらないという話もありますが、少なくともベンチマークでは圧倒的な差が出ます。

OSをクリーンインストールして(Vistaの場合はマザーボード付属のCDで各種ドライバをインストール)、本稿執筆時点でのWindows Updateで自動的に選択される更新をすべて適用した状態で、Mathematicaをインストールし、MathematicaMark7を実行した結果は次の通りです(利用したマシンはIntel Core i5 750 2.67GHz, 主記憶4GB)。

  • Windows Vista SP2 (32 bits): 5.05(ちなみに、インストール直後は4.98)
  • Windows 7 (32 bits): 5.21
  • Windows 7 (64 bits): 5.95

Mathematicaに関して言えば、64ビットにすることの効果はかなり大きいようです。

とはいえ、どんな計算でも速くなるというわけではありません。ベンチマーク結果とソース(省略)を詳しく見ると、計算が速くなるのはデータフィッティングやπの計算、離散フーリエ変換、ガンマ関数、大きな整数の計算、行列のべき乗、行列の転置などだということがわかります。

項目 Vista SP2(32 bits) 7 (32 bits) 7 (64 bits)
Total 17.08 16.53 14.49
Data Fitting 1.23 0.97 0.69
Digits of Pi 0.64 0.61 0.39
Discrete Fourier Transform 0.56 0.47 0.36
Eigenvalues of a Matrix 1.15 1.08 1.06
Elementary Functions 0.94 1.05 1.00
Gamma Function 0.50 0.47 0.27
Large Integer Multiplication 0.80 0.80 0.50
Matrix Arithmetic 2.12 2.14 1.78
Matrix Multiplication 1.09 1.08 1.20
Matrix Transpose 1.34 1.36 0.84
Numerical Integration 1.84 1.70 1.75
Polynomial Expansion 1.23 1.19 1.14
Random Number Sort 1.37 1.37 1.23
Singular Value Decomposition 1.08 1.00 1.05
Solving a Linear System 1.19 1.28 1.25