ubuntu 13.04(32bit)から13.10(64bit)へアップグレードしてわかったこと


結論:すごい。超速い。すごい

少しでも記憶に残りやすいインパクトのある出だしになればと思って、小学生並みの感想で始めてみましたが以下普通に続けます。
まず経緯について。

年末あたりからPCが不調を訴える。
(電源が入らない、フリーズ、mikutter+chromiumで死ねる)

年が明けたら買い換えることを決意。
この時ついでにOSも入れ直すことを決める。

新年早々価格コムを眺めつつ計画を練る。
重要視したのはグラボ周りの拡張性。
予算10万弱で将来6面ディスプレイに耐えられるようなマシンという要望。
mini-Displayport*4とかのグラボも一時は考えた(高すぎるし総出力数が変わらないのでやめた)

細かく調べるのは面倒なので大雑把なスペック遷移。
CPU:Core2Duo -> i5 4670(Haswell)
マザボ:P5K -> Z87-PRO
グラボ:GF9400GT -> HD770
電源とケースは価格コム上位のを適当に。
ストレージと光学ドライブは以前のものを流用。
ついでに折角だからTVキャプチャをつけた。

CPUのファンが回らないとか(CPUファンのコードが引っかかってた)
グラボつけたら画面が出ないとか(画面優先出力先がマザボからグラボに変わってた)
デュアルディスプレイの片面回転ができない(64bitにしたできた)
マザボ出力のUSBが一部使えないとか(未だ不明)
TVキャプチャ用のソフトが動かないとか(未だ不明)
いろいろ問題はあった。
でもとりあえず一旦旧PCから引っこ抜いたSSDのままで動いた。

ここからが本題。
旧PCの中に入っていたOSはubuntu13.04(32bit)。
しかも全然違う構成マシンにインストールしたもの。

電源を入れた当初は「これ、動くのか?」と思ってはいた。
SSDだけ引っこ抜いて別マシンに移すこと自体は以前やったことがあったが、その時と今回とでは構成内容の変化が違い過ぎた。
今回の引越しはその前後の構成内容の規格が1,2世代ほど変化するほど時間が経っている。
まぁ懸念は懸念、結果としてきちんと動いたから問題ない。
動かなかったら旧PCに戻してバックアップを取り直していただけのこと。
そして初めて新PCを動かした時の第一印象は「びっくりするほど変わらない」だった。
SSDを移す前と後で使い勝手が何も変わらなかった。あれ、これi5なんだよね、とびっくりした。
そして下記のサイトを参考にバックアップをとる。

Ubuntuの64bit版へのアップグレード方法(超手抜きバージョン)

(「ubuntu 32bit 64bit アップグレード」でググった時の検索トップサイト 2013/01/17)

そして早速64bitをクリーンインストール――と、思いきや、ここでコケた。
LiveUSBが作れない。Ubuntu標準搭載の「ブータブルUSBの作成」で作るとエラーが出て権限がないと言われてしまう。
無茶な入れ替えをしたからか、と予備のネットブックでも試したが同様のエラーが出た。
別のUSB作成ソフトを試してみたがダメ。しょうがなく結局sudo suしてターミナル上からusb-creator-gtkを呼び出して事なきをえる。
今までこんなことはなかったんだけどなぁ。どうしてだろう。
権限の要求なら書き込み操作よりUSBのディスク消去操作の方がよっぽど危険だと思うのだけど。

ともかくなんとかして13.10(64bit)をクリーンインストールする準備が整った。
早速USBを指してLiveUSBを起動……上手くいかないのでBIOSから起動。
見慣れたブート画面が表れて、いつもより若干遅く感じながらクリーンインストール作業を行う。
再度起動した時、ようやく新しいPCの真価を実感できた。
めちゃくちゃ速い。ぬるぬるというかサクサクというか、ともかく快適。
上手くいかずに不便を感じていた画面の回転も当たり前のように問題なくできた。
やはり構成を変えたらクリーンインストールしなければいけないようだ。

問題はここからだった。
僕はこのあとなんの考えもなしにバックアップにとったhomeとetcを戻した。
大量のファイルがあるため時間がかかり、ちょっと放置していた。
homeとetcの同期が終わり、端末上でコマンドを叩いて驚いた。

sudoが通らない。
どうやら大事な設定ファイルまで変えてしまったらしい。

どこをどう直したらいいのかもわからない。幸いバックアップ用のファイルは健在だ。
仕方なくクリーンインストールをやり直した。2回目。
sudoに関わる設定ファイルはetcにあるらしい。じゃあhomeだけ移せばいいか、とhomeをrsync -Cav

またsudoが通らない。
仕方なくクリーンインストール。3回目。

homeを戻すときにrsyncというよくわかってないコマンドを使うからいけないのだ、とこんどはGUIで動かす。これならroot権限の危ないファイルとかも触らないで済むはずだ。
homeについてはこれでなんとかなった。ではetcは?

諦めた

また下手に触ってsudoが通らなくなるのも怖いのでやめてしまった。
apt-get installも自動でバックアップをとったリストから読み込んでインストールしてくれるのかと思いきや、全部手動でいれることになってしまった。

今回の教訓
クリーンインストール大事、思わぬ力を授けてくれる
・でも自動化がキモ。こんなん毎回やってられない。

あ、あと13.10リリース当初に言われていた日本語周り、やっぱりちょっと違和感がありますね。Japaneseチームの人たちが作ってくれた日本語Remixを使っているのですが、なんだか以前とIME切り替えの感じが違います。
以前は日本語(Mozc)と英語をCtrl+Spaceで切り替えつつのDvorakをAlt+Shiftで切り替えてたと思います(多分)
日本語・英語切り替えはできるんですが、Dvorak切り替えが出来なくなりました。
Dvorakを使おうとすると日本語・英語・Dvorakの三択をCtrl+Spaceでローテーションする感じです。
Dvorakはたまに練習する感じなので、そんな頻繁に切り替わらなくてもいいです。
一番つらいのはCtrl+Spaceの反応が若干遅いことでしょうか。少し長めに押し続けていないと切り替わらないように感じます。個人差でしょうか? 今度設定とか調べてみます。

とりあえず一旦はこんなところでしょうか。
新環境に移行したことでリモートPCとかTVチューナーとかいろいろ導入していこうかと思っているので今後もアウトプットしていけたら、と思います。

チューリング機械を学ぶ

気を抜いたら前回の投稿から2ヶ月も開いてしまった。その間色々あったような気もするけど、とりあえず今思いついてることをメモしておこう。

最近はLisp熱が再燃している。そしてそれと同時にそろそろこの先自分がどういう分野を勉強しようか、それを考える足がかりとしてチューリング機械について学び直している。
(ちなみに今は計算複雑性理論を学びたいなーなんて漠然と考えている)

チューリング機械についての簡単なことは随分前からwikipediaなんかで読んだこともあったし本で目にすることもあった。それどころか昨きちんと大学の授業の中で勉強する機会もあった。
しかしやはり表層的な理解しかしていないのではないかと薄々感じてはいた。
そこで偶然図書館でこの本をみかけたのでとりあえず読んで見ることにした。


いや正直なところをいうと実は勘違いして本来とは別の本を借りてしまったのだ。
当初借りる予定だった本はこちら。




Amazonのオススメか何かでよくみかけていた。
しかし今になって見てみると後者はあまり評判が良くなく、前者の方がレビューは高評価だったのでまぁいいかと思っている。とりあえず、「チューリングを読む」を読み終えたらこちらも借りてみようかと思っている。

これと並行してLispSBCLでのCommon Lispの勉強もしている。
今回はそんな中思いついたことをいくつかメモしておこうと思って投稿を書いている。

[その1]
Lispにおいてプログラムとはデータである、という文言をよくみかけるけど今までよくわからなかった。
とりあえずシングルクオートがそれを直観的に理解する分かりやすい例だと今は思っている。
本当はS式の仕組みだとかマクロだとかのことかもしれないが、ともかくぼくにはそう感じた。

[その2]
チューリング完全の性質には「自己記述が可能である」が含まれている?
でも自己記述とは2種類あるのではないか
1.自己複製
要するにクワイン、自己増殖をするプログラムのこと。
現実ではウイルスとか。ニコニコ動画ライフゲーム動画の最後にあった。

2.自己言及
フラクタルみたいな。枠組みそのものをコピーする。
Lisp上でのLispの実装とか、ライフゲームの中でライフゲームとか。

前者はある体系の中で自己言及を行うオブジェクトが記述できるという話。
しかし後者はある体系そのものを自己言及し、再現することが可能という話。
枠組みの段階、というかメタ度(?)が異なっている。
GBE本に再挑戦する必要があるのだろうか。

[その3]
色々な文章で既に書かれているが、Lispはことこのチューリング機械にかんする話題と親和性が高いらしい。
それはやはりLispメタプログラミングしやすいという特徴からきているのだろうか。
なぜLispなのか? そこをもう少し知りたいと思う。


ps.
Lispの勉強法をゆるく募集している。
とりあえずりりかる☆Lispを終えて、はじめての人のためのLispを途中まで読んでいる。
でもはじめての〜は途中でわけがわからなくなって投げてしまった。
再入門には何が良いだろうか?
他の言語に比べれば数は少ないが、それでも入門書はある。
問題は、またそれらを読んでも挫折するんじゃないかという点だ。
プログラミングの本は安くないのでできれば入門書は一冊に留めたいところ。

2013/1/8 追記
タイトル脱字を修正

選択と未練

ruby on railsを扱うということで事前に勉強していったけれど、研修ではまだ使っていない。
というかJavaScriptが便利すぎるのだ。
あまり面倒なことをしようと思わなければ、たいていのことはHTML+CSS+JSですむ。
今回のrails使用も「え、それでrails使うの?」という気がした。
railsのインストールやらMVCやらデーターベースやら使えるようになるまでに必要となる知識の習得コストが高すぎるんじゃないかと思う。それだけの知識を要請する機能を実装したい、というのなら話は別だが、今回の件はどうもそうは思わない。

一番気になるのは保守性と速度だ。
都合上、JSを使った方が早い部分が多い。特にUIに関わる部分は。そうなるとJSが外せなくなる。つまりJSとrubyのコードが混ざった状態になる。それはソースコード保守の観点から考えて大丈夫なのだろうか?
HTMLとCSSが別ファイルになっているにも関わらずそういった心配がないのは、おそらく機能面で階層が異なっているからだと思われる。HTMLは組み版を作り、CSSはデザインやレイアウトを作る。それぞれの階層は切り離されている。しかし、JSとrailsではサイトの動的部分というほぼ同じ階層を扱っている。
そういうのは体験してみないことにはわからないが、どうも心配だ。

そして速度面。JSが速いとも、railsが遅いとも言わない。というかそもそも両者の速度を感じられるほどまだ慣れ親しんでいない。
だが、railsの高速化とJSの高速化、これらに関するウェブの資料にはかなりの差があると思う。
皆JSの高速化には興味があるが、railsの高速化となると一部の人間しか気にしないのではないか。
これから作るサイトの速度面はほとんど気にする必要のないものだが、簡単に、より多くの高速化体験を得られるJSにどうしても未練を感じてしまう。

最終的に「今後の拡張性を考えるとやはりrailsがよい」と言われて納得してしまった。
今度研修が終わったら自分でJSを使ったサイトを作って見ようか。

それと最近若干いろいろな言語に手を出しすぎて器用貧乏的な状況になっている感が否めない。
何かを極めなければ。

これも車輪の再発明か

Rubyでとりあえず簡単なプログラムは書けるようになったので、cygwinemacsを導入がてらproject eulerの問題を解いてみた。
余談だがcygwinのapt-cygの挙動がどうもおかしい様子。
既に気づいていた人がいるらしく、七日前の記事に修正したという内容が載っていたが自前の環境での修正方法がわからないので放っておいている。
irbが使えないのが地味につらい。

さて、rubyに触れていてきづいたこと。
CやJavaでいうfor文を回す時pythonではrange関数を使う。
rubyでこれと同じような動作をするRangeクラスがある。
こちらは関数ではなくクラスとして定義されていて、こういう使い方をする。

for i in 1..10
  print "#{i} "
end
#=> 1 2 3 4 5 6 7 8 9 10

で、じゃあ「10..1」という書き方ができないのかと試してみたら動かない。
エラーではなくそこの部分が無視されてしまう。
じゃ、1..10.reverseで、と思ったらエラーが出た。
(最初、Rangeクラスというものを知らなくて、てっきり配列だと思っていたのだ。)
Rangeクラスにはreverseはないらしい。
そこで仕方なくdownto()を使うことにした。

10.downto(1) do |i|
  print "#{i} "
end
#=> 10 9 8 7 6 5 4 3 2 1

うん、これなら動く。
で、ここまできてようやくRangeクラスというものの存在を知って「ruby range 逆順」でググったら既に同じような記事がいくつかあった。
その記事によるとRangeクラスにsuccが使われているため、らしい(?)。
つまり昇順(段々大きくなる順序)しかないわけで。

直観的なプログラミングをするとしたら10..1は欲しいと思うんだけどなぁ。

Ruby-ing now

最後の投稿から一ヶ月以上開いてしまった。
これは反省しなければならない。

現在帰省先でRubyを学んでいる。結局夏期休暇は9/6~9/20の間インターンに行くことになった。
逆に言えばそれ以外の期間は全て暇だというわけでもある。
折角なのだからきちっと何か身につけよう、ということもあって書籍も色々持ってきた。

今回の夏期休暇で手を付けようと思っているテーマは三つ。
Ruby
機械学習
・セキュリティ

後ろ二つは単純な興味からきているのだが、Rubyインターン課題という外部要因があったためだ。
最初はPythonでプログラミングしてるしRubyくらい三日で身につくだろうと思っていた。
しかし帰省して五日近く経つが、まだ制御文が終わったあたりだ。
いや、単純にサボりすぎただけという話である。
だがここまでくれば後は実際にコードをガリガリ書くだけの話だろう。
これからRuby機械学習のコードを書こうと思っている。

機械学習は元々興味のある分野で、以前からどうやって勉強したらいいかと考えていた。
折角なのだから自分の手で実装したいと思っていたが、「機械学習」で見つかる情報の大体は数式や理論ばかりで一見しても実装の仕方がわからなかった。
更に在籍する大学の図書館で「機械学習」を探すとどれも既に借りられてしまっていた。
研究室選びでもぜひこの分野を軸に考えていきたいところなので今の内に基礎だけでも身につけたい。
ただ問題なのは研究室が志望する生徒の中からどの生徒を採用するかを選ぶ際、完全に成績のみしか見られないという点だ。
つまりいくら適正や希望があろうと成績がよくないとどうにもならない。
今はどうか希望研究室に入れますようにと祈って学習を続けるしかない。


セキュリティについては応用情報(AP)に合格したので、折角だから秋も何か挑戦しようと思ったのが理由だ。
ただ正直今度の情報セキュリティスペシャリスト(SC)に合格できる気がしない。
まだ2ヶ月もあるのに何を今からと思うかもしれないが、9月まではインターンにかかりっきりだろうし、10月から始めて間に合うような学習量ではない。
SCにはもう申し込んでしまったので引くに引けない。やれるだけやってみようとは思う。



はじめてのじぇねりっくぷろぐらみんぐ

あと2,3週間を目処にバイトをやめようということで、先生に話した結果ライブラリの拡張作業を行うことになった。
実はライブラリを作ったことがなかったりする。
それで見せられた基となるメインプログラムとライブラリが、C++のtemplateをふんだんに駆使したジェネリックプログラミングによるものだった。
実は以前LSHをやめる際、先生に参考として見せていただいたソースもジェネリックな内容だった。
僕はそのコードを追っかけるのにいっぱいいっぱいで、とても自分がこんなコードを書けるとは思っていなかった。templateなんか恐怖の対象でしかなかった。templateを実際に書くわけではないコンテナですら、エラーログが意味不明過ぎてわけがわからなかったのだ。コレに加えて自作のtemplate関数・クラスなど正気の沙汰とは思えない、というわけだ。

だがいつまでもそうも言っていられないわけで、ともかく取り組んでみることに。
今回は直前までのmultiprocessingと違って参考にすべきソースがあった。
これが何よりも一番の手助けとなった。わからない部分(主にoperatorとtemplate)は検索や書籍で補いつつ、コードをちょこちょこ書いては消しを繰り返した。
一番辛いのは今までのようにflymakeを使って連続的にコーディングできなかったこと。
仕方なかったのでGCCとclangの両コンパイラコンパイルしてエラーログを見比べつつ逐一修正する作業を行なっていた。
自分でも非常に効率が悪いような気がしてならない。
誰か改善案を教えて欲しい。やはりIDEを使うべきだろうか。

とりあえずtemplateには慣れてきたように思う。なんとなくだが、どうしてここでtemplateを使い、どうしてここでtypedefをするのかが見えてきた。しかしやはりなぜ静的言語でわざわざジェネリックプログラミングを? と思わずにはいられない部分もある。
もっと言語仕様と設計思想から理解しなければ見えてこない部分が多いんだろうと思っている。

今回は自分で一からコーディングしたわけではないのでソースを公開できそうにない。
いつかは自分もあんなパワフルなライブラリを作ってみたいと思う。

ところでC++のソースを何時間も眺めていてふと思ったのだけれど、実際の現場ではC++による開発はどのように行われているのだろう。
プロジェクトのチームで規約を守りながら使う言語とも、一人の優秀なプログラマーが爆速開発に使う言語とも違う気がする。
前者ならJavaとかもっと意思統一しやすい言語があるだろうし、後者ならLLの方がいいだろう。
C++はあまりにも自由に書けすぎて、しかし使うのには重すぎるように感じる。
C/C++と考えてパッと浮かぶのは他の言語の基盤だとかOS開発だとかだが、それはどちらもC言語であってC++ではないような気がする。となるとやはり組み込み系だろうか。リソースが限られた分野などに強そうだ。
メモリもそうだがきっとC++による非常に強力なデータ構造が高速化をもたらすのではないだろうか。
これからももっと書き続けてこの言語の長所を見極めたいと思う。

俺達の戦いはこれからだ!

インターンセキュリティキャンプも駄目だった。
インターンはまだ来年があるからいいが、セキュリティキャンプは年齢制限があるため、もうチャンスが無い。
非常に残念でならない。
ともかく夏の予定がぽっかりと空いてしまった。埋めなければ。
少なくともどちらかは引っかかるのではなどと楽観視していたため、エントリーできる応募先がかなり減ってしまった。開催日程なんか気にせず応募できるところすべてにガンガン送っておけばよかった。被ったら断れば良いだけという話だ。

今更とやかく言っていても仕方ない、なんとかして夏を開発に捧げたい。
別にインターンやキャンプなんかにこだわらなくとも開発はいくらでもできるんだろうが、やはりチャンスがあるなら掴みたいと思う。
完全独力での開発はその努力をして全部蹴られた後でいい。
Shut the fuck up and write some code
ぐだぐだ言ってないでコード書けよ、ハゲ
さっきも7時間書いて帰ってきたところ。
夏休みも書いてたいからこんなことしてるわけで。
それともコーディングするためにコーディングの時間を削るのは本末転倒だろうか?