2009/04/25

大学3年の理系が行った、Ubuntu 9.04 Jaunty Jackalopeのアップグレードとメンテナンス



4月から大学3年生になりました。授業の内容が本格的になってきて、しかも事故によってまだ取得できていない前のセメスターの単位があったりとかで、結構大変です。

さて、4/23にUbuntuの新しいヴァージョン9.04 Jaunty Jackalope(軽快なツノウサギ)が発表され、その次の日には日本語版のRemix CDがダウンロードできるようになりましたので、いままで使っていた8.10から9.04にアップグレードすることにしました。その際に、8.10でいろいろアプリケーションやライブラリをインストールしたことによる不都合を起こしていたので、心機一転して一旦パーティションを初期化した後にクリーンインストールを行うという手法をとりました。
9.04が発表されたときは結構盛り上がるかなと思ったんですが、あんまりそのことをブログで書いている人が少なかったので、今回は自分が行ったアップデート作業を書いていきたいと思います。

Ubuntuの環境整理

1.VGAドライバのインストール
これは自動的にUbuntu側が認識してインストールを促してくれるので、特に悩む必要はないです。インストールしたら再起動して、ドライバが正常にインストールされているかを確認します。

2.アップデート・マネージャでアップデートのインストール
今回の場合、9.04の発表直後だったので何もありませんでしたが、通常はここでアップデートを行ってシステムの内容を最新に保ちます。

3.「日本語環境セットアップ・ヘルパ」を使用して日本語環境を整える
インストールしたいソフトを選択して、インストールを行います。Flashのプラグイン、Adobe Reader日本語版、IPAモナーフォントは結構お世話になるので、入れておいた方がいいかもしれません。

4.システムのフォントをIPAモナーフォントからVLゴシックに変更
3.でIPAモナーフォントをインストールするとシステムのフォントが自動的にIPAモナーフォントに変更されてしまいます。これを元のVLゴシックに戻すためにはターミナルを立ち上げて
$ sudo gedit /etc/fonts/conf.d/69-language-selector-ja-jp.conf
と入力。sans-serifとmonospaceの欄を

<edit name="family" mode="prepend" binding="strong">
<string>VL Gothic</string>
<string>IPAMonaGothic</string>
<string>IPAGothic</string>
<string>Sazanami Gothic</string>
<string>Kochi Gothic</string>
</edit>

のようにVL Gothicを先頭にもっていく。保存するとシステムのフォントとしてVLゴシックが使われるようになります。

5.システムの警告音をミュートにする
キーボードの打ち間違えでシステムのビープ音がいちいち鳴るのはとっても鬱々しいので、鳴らないように変更します。ターミナルを立ち上げて
$ sudo rmmod pcspkr
を入力。再起動後も鳴らないようにするには
$ sudo gedit /etc/modprobe.d/blacklist.conf
を入力。末尾に
blacklist pcspkr
を加えて保存します。

6.ホームフォルダの各フォルダを英語表記に直す
日本語でもいいんですが、ターミナルを使うといちいち日本語でフォルダを指定するのがめんどくさいので、英語表記に直します。ターミナル上から
$ LANG=C xdg-user-dirs-gtk-update
で英語表記に変更されます。再起動後はこの名前でいいのか聞かれるので、べつにいいよという感じのボタン(どんなんだったか忘れた)を押して英語表記のままにします。

以下の内容は各種ソフトやライブラリのインストールです。この操作はSynaptic上でも行えます。

7.各種コーデックのインストール、メディア環境を整える
各種コーデックをインストールして、メディア環境を整えます。ターミナル上から
$ sudo apt-get install ubuntu-restricted-extras
でインストールを行います。
ついでに動画鑑賞の定番であるvlcもインストール。
$ sudo apt-get install vlc
で簡単にインストールが行えます。

8.Nautilusの拡張
sudo apt-get install nautilus-gksu nautilus-open-terminal

9.日本語のLaTeX環境を整える
理系必須のLaTeX環境を整えます。「Ubuntu 8.10 Intrepid Ibex で 日本語 LaTeX 環境を整えてみよう」を参考にインストールを行います。
ついでにLaTeXのコンパイルが劇的に楽になるOMake(参考:OMake つかって LaTeX コンパイルしたら簡単すぎて身長が5cm伸びた)も同時にインストール。
$ sudo apt-get install omake
とっても簡単ですね。

10.各種計算ソフトのインストール
個人的によく使うライブラリやソフトをインストールします。
$ sudo apt-get install python-scipy python-matplotlib wxmaxima gnuplot r-base

所要時間にして約2時間。結構早く終わりました。Windowsだとあと2,3時間はかかるかもしれません。

まとめ

Ubuntuは初心者に優しいとかコマンド入力しなくてもいいとか言われていますがそれは全くの嘘で、ちょっとこみいったことをしようとすると依然としてターミナル上からの操作が必要とされます。
でも慣れればwindowsよりも保守管理がしやすいのは確か(apt-getで一括してすべてのソフトのアップグレード、インストール、アンインストールが行える)ですし、なにより理系がよく使うgnuplotやRが楽にインストールできるところがうれしいです。操作性もwindows上でインストールするよりたぶん数倍使いやすいと思うので、理系の方はUbuntuを試してみるという選択肢もありだと思います(べつにFedoraでもいいと思うけど)。

2009/04/12

辞書と組み合わせと再帰関数


Photo by joka2000, Double-flowered Cherry Blossoms

辞書が与えられて、そのキーと値の群の中でタプルやリストを持っている値を、任意の値で組み合わせたリストを返すという処理はどう実装すべきか悩んでいました。
言葉にすると難しく聞こえますが、要は
{"a":(1,2), "b":4, "c":(3,4)}という辞書が与えられた場合、返すリストは
[{"a":1, "b":4, "c":3},
{"a":1, "b":4, "c":4},
{"a":2, "b":4, "c":3},
{"a":2, "b":4, "c":4}]
となるわけです。

通常の行列のような処理は単純にループを2回回せばいいわけですが、今回の問題の場合ループ回数は変動するわけで、単純にループを回すわけにはいかない。どうすればいいのかちょっと考えて見たら、再帰関数を使えば案外スマートに実装できそうな気がしたので、実際にやってみました。


from copy import copy

def makeKwargsList(kwargs, exceptions=[]):
"""
タプルやリストを含んだ辞書から、それらの値を含む任意の組み合わせを
すべてリストとして返します.
例:
kwargs = {"a":(1,2), "b":3, "c":(True,False), "d":(1,2)}
exceptions = "d"の場合、返される辞書のリストは、
[{"a":1, "b":3, "c":True, "d":(1,2)},
{"a":1, "b":3, "c":False, "d":(1,2)},
{"a":2, "b":3, "c":True, "d":(1,2)},
{"a":2, "b":3, "c":False, "d":(1,2)}] となります.

kwargs : タプルやリストを含んだ辞書
exceptions : 組み合わせとして出力してほしくないキーのリスト
"""
if type(kwargs) != dict: raise TypeError
# キーワードの抽出
kwdict = {}
base = {}
for (key, value) in kwargs.items():
if (type(value) == list or type(value) == tuple) and \
(key not in exceptions):
kwdict[key] = value
else: base[key] = value
# key, kw の分離
keys = kwdict.keys()
values = kwdict.values()
kwargs_list = []
__makeKw(values, [], kwargs_list)
# 結合
r = [dict(zip(base.keys() + keys, base.values() + ag)) for ag in kwargs_list]
return r

def __makeKw(kwlist=[], base=[], kwargs_list=[]):
argslist = kwlist[0]
if len(kwlist) > 1:
newKwlist = kwlist[1:]
for kw in argslist:
new_base = copy(base)
new_base.append(kw)
__makeKw(newKwlist, new_base, kwargs_list)
else:
for kw in argslist:
new_base = copy(base)
new_base.append(kw)
kwargs_list.append(new_base)

__makeKw()が再帰関数で、この場合[(1,2),(3,4)]のリストから、[[1,3], [1,4], [2,3], [2,4]]をkwargs_listに代入させていく関数となっています。

本来のプログラマがどうやってこのようなアルゴリズムを組んでいるのかは残念ながら勉強不足で分かりませんが、とりあえずきちんと動作しますし、そこまで速度が重要となるような処理ではないですので(せいぜい100〜10000程度)、べつにこれでいいかなと。

それにしても、1年前は思いつかずに挫折していたであろうアルゴリズムが実際に組めるようになってくると、ちょっと成長している感がありますね。