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

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

リモートマシンに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のコンテンツは本当はローカルにあるわけですが、見た目はそうではなくなります。

利用方法は、クイックスタートのとおりです(前に作成した入力データ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