KVM上にVirtIOドライバを使うWindows 7をインストールする

準仮想化ドライバであるVirtIOを使うことでWindows仮想マシンのIOが速くなるか試してみたかったので、KVM上にVirtIOドライバを使うWindows 7をインストールしてみました。

凖仮想化とは、全ての命令をソフトウェアエミュレーションする完全仮想化に対して、ゲストOSなどにある程度修正を加えて、物理ハードウェア上で動かすのに近い形で動作させる仮想化のことです。Windowsの場合はカーネル自体には修正を加えれられないので、準仮想化ドライバであるVirtIOを使うことで準仮想化を実現できます。

環境

  • ホストOS: Ubuntu 14.04 64bit
  • ゲストOS: Windows 7 64bit
  • ハイパーバイザ: qemu-kvm 2.0.0
  • ドライバ: virtio-win-0.1-74.iso

インストール

kvmvirt-managerのインストール

$ sudo apt-get install qemu-kvm qemu-system libvert-bin virt-manager

libvirtdグループに入っていないと仮想マシンの操作ができないみたいですが、上のコマンドを実行するだけで現在のユーザーをlibvirtdグループに追加してくれるので、ログインし直してグループの設定を反映させます。

Windows用のVirtIOドライバをダウンロード

Vistaより新しい64bit版Windowsでは通常デジタル署名されたドライバしかインストールできません。
幸いFedoraプロジェクトでデジタル署名されたドライバを公開してくれているので、それを使います。
公式ページ WindowsGuestDrivers/Download Drivers - KVMLatest VirtIO drivers for Windows from Fedora からドライバが入ったisoファイルをダウンロードできます。

仮想マシンの作成

virt-managerを起動して、通常と同じように仮想マシンを作成します。
最後の画面でCustomize configuration before installにチェックを入れておきます。

f:id:itiut:20140602233341p:plain

設定画面が開くので、ディスクの設定でDisk busVirtioに、NICの設定でDevice modelvirtioに設定してインストールを開始します。

f:id:itiut:20140602233342p:plain

f:id:itiut:20140602233343p:plain

Windowsのインストール

インストールを進めると、初めはドライバが無いためディスクが認識されません。

f:id:itiut:20140602233344p:plain

Load driverを押すと次のような画面になります。

f:id:itiut:20140602233345p:plain

仮想マシンの設定画面からCDROMの設定を開き、Windowsのインストールisoファイルをダウンロードしておいたドライバのisoファイルに変更した後、仮想マシンの画面に戻ります。

f:id:itiut:20140602233346p:plain

Browseを押すとドライバを探す画面になるので、CDROMの中からインストールするWindowsにあったバージョンとアーキテクチャのディレクトリを選択します。

f:id:itiut:20140602233348p:plain

ドライバが見つかったので、全て選択してNextを押してインストールします。

f:id:itiut:20140602233349p:plain

ドライバのインストールが終わるとディスクが認識されます。

f:id:itiut:20140602233350p:plain

ここではWindows cannot be installed to this disk.と出てきて先に進めなくなっていますが、CDROMをWindowsインストーラisoファイルに変更し直せば先に進むことができます。

f:id:itiut:20140602233351p:plain

後は普通にインストールするだけです。

インストールして少し使ってみて思ったのですが、KVMにはVMwareVirtualBoxにはあるディスプレイの解像度の自動調整機能とかは無いんでしょうか。ググってもよくわかりませんでした。

卒論提出にあたって私はどう生きようと思うか

近況報告

本日2月7日、私は卒業論文を提出し、無事に受理されました。 発表や学位審査をまだ控えていますが、とりあえず一段落といった感じです。

昨年の10月下旬から3ヶ月少々メールやLINEなど軒並み連絡を絶っており、関係者各位におかれましては心配した方もしなかった方もいるかもしれませんが、私は生きています。

物理的に何かあったというわけではなく精神的な問題を抱え、自分の人生をどう生きるかという悩みに答えを出せずに、何も手を付けることができないという状態でした。

3ヶ月間何をしていたか

11月末までは、読書50%ゲーム50%ぐらいの時間配分で過ごしていました。 悩みの答えを求めて読書をして、読むのに疲れたらゲームで現実逃避をする、というパターンを繰り返していました。

12月に入ってからは、このままでは卒業が危ういという危機感から研究室には復帰し、卒論を進めていました。

しかし、悩みに対してある程度明確な答えを出せたのは12月の中旬になってからでした。 また、絶っていた連絡を再び取り戻そうするのにもしばらく時間がかかりました。

人生をどう生きるかという悩み

私の頭の中のどこかに必ず潜んでいる悩みが、人生をどう生きるかという悩みです。 なぜこのことについて悩むようになったかはよくわかりませんが、初めに悩むようになったのは高校2年の頃です。 普段は悩みについてほんの薄っすら考えている程度でしかありませんが、ふとした拍子に思考の中に悩みの占める割合が大きくなると、 悩みのせいで何も手を付けられず身動きが取れなくなってしまうことがあります。

何も手を付けられないほど思い悩んだことは、今回を含めると3回あります。

1回目は、高校2年の時です。 高校2年の終わりが近づくに連れて、1年後に迫る大学受験の危機感から、「偏差値の高い大学に行けばなんとかなるだろし、そうしなければならない」と思考を停止させて受験勉強に逃げ込み、悩みを先送りにするというその場しのぎの対処しかできませんでした。

2回目は、大学入学の1年後くらいです。 受験という悩みの先送り要因がなくなってしまったため、当然その悩みは立ち現れました。 入学直後は新たな大学生活に目を奪われていたため、悩みは大きくなかったものの、半年もするとしだいに悩みが大きくなり、1年後には大学生活に支障をきたすまで思い悩むようになっていました。 一人で思い悩むだけでは解決しないと思い、いろいろなことに手を出してはみたものの中途半端に終わったり失敗したりする、ということを繰り返したことを覚えています。

その過程で、自分が楽しめることをして生きる、という生き方が私にとっては一番良いのではないかと思い至りました。 自分が楽しめないことをしていても、いずれ耐えられなくなり精神的に病んでしまうということを、経験則として学んだからです。

いずれ考えを改める可能性もあるかもしれないが、ひとまずは「楽しめることをして生きる」という生き方を暫定的に掲げて生きていこうと思いました。 いろいろ手を出した中でプログラミングは楽しめたので、将来的にIT技術者として生計を立てることを念頭に置き、情報系の学科に進学したり、プログラマのアルバイトをしたりと、自分で進路を決めてきました。

プログラミングは本当に楽しかったのか

進学した学科では、電気の講義には苦しめられたものの、情報の講義はとても楽しく、概ね満足していたのだが、ここに来て3回目の悩みが生まれました。

プログラミングは確かに楽しい。しかし、プログラミングが楽しいと、他人に向かって言える自信を持てなくなってきていたのです。

なぜかというと、プログラミングが上達するにつれて、すごい人のすごさを実感できる機会がしだいに増えていき、プログラミングの実力やプログラミングに対する情熱を自分と比較して勝手に落ち込んでしまうのです。 実力という点では、ネットを見ていると、働いている年上の人はもちろん、同世代や下の世代の人でも、いろいろなプロダクトやサービスを作っているという人がたくさん見受けられます。 情熱という意味でも、寝食を除いて起きている時間は呼吸をするようにプログラミングをしている人もいるらしいし、そういう人たちに対して私もプログラミングが楽しいと胸を張って言えるかというと、言える自信はないとどうしても思ってしまうのです。

それに加えて、プログラミングの対象に、時間を忘れて熱中できるという意味での「楽しさ」を持てていなかったことに気づきました。 中間発表までの卒論にしろ、この前参加したハッカソンにしろ、これは自分が本当にやり遂げるべき仕事ではないという感覚をどこかで抱いていました。

プログラミングが楽しいと自信を持って言えなくなりつつあり、プログラミングの対象も楽しめていないのならば、「楽しめることをして生きる」という方針だと、プログラミングで生計を立てようとすることにいずれ無理が生じるだろうと思うようになり、苦悩が生じました。

私にとってのプログラミングの楽しさとは

プログラミングの楽しさがどこから来ていたのかを振り返ってみました。 するとプログラミング自体よりも、プログラミングを通して問題を解決することに楽しさを見出していたのではないか、と思うようになりました。

プログラミングを楽しいと感じたきっかけとしては、PC1台さえあれば自分の好きなモノが作れるということもさることながら、独学したての頃に競技プログラミングにハマったことも挙げられます。

また4年弱のプログラミング経験を振り返ると、自分の創造力を働かせてユニークなものを作るよりも、身の回りの不便なことを解決するものであったり、チャレンジングな課題に挑戦することの方により楽しんで取り組んでいたように思います。

その時点ではできなかったことを、プログラミングによってできるようにするという、問題解決プロセスにこそ私は楽しさを感じていたのでしょう。

どう生きようと思うか

自分が楽しいと感じることは「プログラミングによる問題解決」だとわかった今、次なる問題は、解決すべき問題は何かということです。 今回の悩みの原因になった、プログラミングの対象に情熱を持てていないということとも直接関係してくる問題です。

妥当な考えとしては、自分が解決することに情熱を持てて、かつ、それによって生計を立てるためには、社会的にも解決することに価値があるような問題なのでしょう。

「楽しいことをして生きる」という生き方の下、自分が情熱を持てる問題をプログラミングによって解決すること。 それが現時点で私が考える人生の生き方です。

Ubuntu 13.10 で fcitx-mozc を使う

Ubuntu13.10のiBusでは、今まで出来ていた次の2つの使い方が難しそうだったので、Fcitxをインストールして使えるようにしました。

  • 変換キーでIMオン / 無変換キーでIMオフ
  • IMのオン/オフがインジケータ・アプレット上に表示される

とりあえずは満足に動かせるように設定できたので、まとめておきます。

インストール

japanese-testersのリポジトリを追加。
デフォルトのリポジトリのFicitxだと、IMオンのホットキーがIMのトグルとして動き、IMオフのホットキーが何も動作しないバグ?が起こりました。

$ sudo add-apt-repository ppa:japanese-testers/ppa
$ sudo apt-get update

fcitxとfcitx-mozcをインストール。

$ sudo apt-get install fcitx fcitx-mozc

設定

System Settings の Language Support を開き、Keyboard input mehtod systemfcitxを選択する。

f:id:itiut:20131025144935j:plain

ログインし直すとFcitxのインジケータ・アプレットが現れるので、アプレットをクリックしてメニューからComfigure Current Imput Methodを開く。

Imput Methodのタブで、左下のプラスアイコンからMozcを追加し、Mozcが上から2番目になるように並べ替える。

f:id:itiut:20131025144948j:plain

Global Configのタブで、Show Advance Optionにチェックを入れ、
Trigger Imput Methodに全角半角キー
Activate Input Methodに変換キー
Inactivate Input Methodに無変換キーを設定する。
extra trigger keyはデフォルトの左SHiftだけでIMの状態が変わるのが嫌だったので、無効にしました。

f:id:itiut:20131025145000j:plain

Ubuntu で背景画像を変更してもログイン画面に反映されない

最近のバージョンの Ubuntu では、背景画像を変更するとログイン画面の背景も同じ画像になるはずなのですが、なぜか背景を変更してもログイン画面はデフォルトの背景のままになっていることが何度かありました。 どうやら設定した背景画像のパーミッションが、他のユーザーからも読み込み可能になっていないと、ログイン画面に反映されないみたいです。

  • 背景画像を変更したのに、ログイン画面はデフォルトのまま

    f:id:itiut:20130930212414p:plain

  • 背景画像のパーミッションを、他のユーザーから読み込み可に変更

    f:id:itiut:20130930212446p:plain

  • 反映されました

    f:id:itiut:20130930212540p:plain

Nested Virtualization を使って仮想マシン上で Vagrant する

普段開発するときは、Windows 上に仮想マシンUbuntu を起動して、その仮想マシンで開発することがほとんどなのですが、仮想マシン上で Vagrant を使いたいと思って色々調べて設定していたら、結構時間がかかってしまいました。 結論から言うと、ゲストOSの Windows で仮想化ソフトとして VMware Player を使うと、仮想マシン上でも仮想マシンを起動することができます。

仮想マシン上で仮想マシンを動かすことを、Nested Virtualization といい、それが可能どうかはゲストOSで使う仮想化ソフトに依存します。 ゲストOS上の仮想化ソフトが、ハードウェア仮想化支援機能(Intel VT や AMD-V)を仮想化してホストOS上でも有効にできるのであれば、Nested Virtualization が可能になります。

調べた範囲だと、VMware Player では Nested Virtualization が可能でしたが、VirtualBox では不可能でした。 なので、ホストOS(Windows)上で VMware、ゲストOS(Ubuntu)上で VirtualBox を起動するようにすると、仮想マシン上で Vagrant を使えました。

f:id:itiut:20130929150053p:plain

設定

ゲストOS上の VirtualBox はインストールするだけでいいですが、ホストOS上の VMware Playerでは、ゲストOS上でもハードウェア仮想化支援機能を有効にするための設定が必要です。

仮想マシン設定の編集からプロセッサを選択し、仮想化エンジンのオプション設定で、Intel VT-x/EPT または AMD-V/RVI を仮想化にチェックを入れるだけです。

f:id:itiut:20130929150104p:plain

参考

大江戸ハッカソンで入賞できませんでした

このたびスローガン株式会社主催の大江戸ハッカソンに参加して、ものの見事に入賞できませんでした。
振り返って反省点などを書いておこうと思います。

大江戸ハッカソンとは

f:id:itiut:20130909075932p:plain

大江戸Hackathon ~仲間たちと完成させる「粋」なアプリケーション

8/30から9/1の3日間+最終審査までの1週間という期間で行われたハッカソンです。
「和」というテーマで粋なwebサービスを作れ、みたいな課題でした。

参加者は学生限定で、高校生(高専生)もいましたが、僕の知る限りでは学部4年や修士など年齢層が高めな人が多い印象でした。

参加まで

お前誰よ?

工学部電子情報専攻の学部4年。
プログラミング歴は大学入ってからの3年半。
1年半くらいweb系企業でプログラマとしてアルバイトやってました。

なぜ参加したか

  • 制作物の実績作り

プログラミングをやってて、これを作ったと堂々と言えるものを何も作れていないことに焦りを持ってました。具体的には、「プログラミングやってます」→「作ったの見せて」→「あれ、大したもの作ってない」っていう流れを変えたかったです。

僕が趣味のプログラミングで主に何をしているのかというと、公開するほどではない細々としたツールみたいな何かを作って遊んでたりすることが多いです。
時には何か不満があって、こういうサービスがあったらいいなと思うことがありますが、ググると既にそれっぽいサービスが存在して、それを使えばいいやと思ってしまい、結局大したものは何も作れていません。

なんとしてでも作って公開してやるみたいな意識が低いのかなと思っていたので、意識の高いことに挑戦しようと思いました。

  • チーム開発の経験

プログラマとしてアルバイトしていたことはありますが、チーム開発の経験はあまりありません。
大学の課題で2人チームで開発を行ったこともありますが、そのときは自分主導でエイヤッと無理やりやって終わらせた感があって、チーム開発とは言えないと自分では思っています。

意識高い?系の学生団体で活動していたという、今となっては少し恥ずかしい僕の少ない経験からいうと、僕が仕事選びの際に何を一番重視するのかというと、誰と一緒に仕事をするかだと思うのです。
なので将来的には、こいつと一緒に仕事したいと他人から思われるようなエンジニアになりたいと思っています。
ということで、チーム開発の経験を積んでおくのは悪くないと思いました。

実際に参加して

チームについて

申込時からチームを組んでいたところもありましたが、多くは初対面で3~5人1組のチームを組みました。 僕のチームも初対面同士の3人でチームを組むことになりました。初対面で3人というのは僕のチームだけでした。

申し込みの時にプログラミング経験を言語とその年数で聞かれたのですが、割りと正直に書いたらできるやつ扱いされたっぽく、3人でもなんとかなるかと思われたのかなと思ったり。
実際のところ、経験期間に対して誇れるものはあまりないです。プログラミング経験は期間ではなく中身だと思います。

作業分担としてはメンバーの技術面の差を考慮し、サービス発案者と僕の2人が主に開発して、残り1人が主にマネジメントをするという形で進めていきました。 なんか開発に集中しちゃって、マネージャーを手持ち無沙汰にさせてしまった感は否めないです。

作ろうと思ったサービス

コンセプトとして次の2つを満たすようなサービスを作ろうと当初は考えました。

  • 漫画のコマのセリフ改変をweb上だけで簡単にできる
  • 他人の作った4コマ漫画をより面白く改変できる

1つ目は、発案者がよくtwitterでレス画像を使ったリプライのやりとりをしていて、それを画像編集ソフトを使わずにもっと簡単に作れないかところから考えました。

2つ目は、GitHubのfork機能から発想していて、誰かの作った4コマ漫画をforkしてより面白く改変するみたいなことができたら面白いのでは?という思いがありました。サービス名もここから名づけました。

実際に作ったサービス

サービス名: 「MangaHub」

  • 漫画のコマのセリフ改変をweb上だけで一応はできる
  • 誰かが作ったコマを組み合わせて、4コマ漫画を編集できる

結局リリースもできていませんし、fork機能も途中で頓挫し、誰かが作ってアップロードしたコマを組み合わせて4コマ漫画を編集できるという、中途半端なものとなってしまいました。

結果

7チーム中4チームに何らかの賞が与えられましたが、僕のチームは入賞すらできませんでした。
このコンセプトはぶっちゃけ入賞できるポテンシャルがあると思っていただけに、とても悔しいです。

反省点

チームとして

なまじ中間審査での評判が良かったために、これから先このサービスをリリースしていくことに注意が向いてしまって、最終審査に意識を集中できていなかった。
そのため、期限を意識して機能を絞って作りこんでいくということをあまりせずに、ただただ機能追加にばかり取り組み、しかもその完成度が高くない状態で最終審査を迎えるという愚行を犯してしまった。
またプレゼンテーションの準備もおろそかになってしまった。

  • どう見られるかを考えるのが甘かった

ユーザーからサービスがどう見られるかや、プレゼンテーションで審査員からどう見られるかをあまり意識せず、自分たちが作りたいものを一人よがりに作ってしまったのではないかと思う。

個人として

  • 自分の意見を強く言えなかった

僕は普段から自分の意見を押し通すタイプではなく、今回のハッカソンでも、論拠があって80%以上は確信を持っているくらいの意見じゃないと言えていなかった。
「こう疑問に思うんだけどどう?」みたいな形で話を切り出せるようになるのがいいのかなと思う。

また、1回言えば意見が伝わっているだろうと勝手に思い込んで、何回も言わなかったために、意思疎通ができていないことがあった。 くどくど言うくらいのほうがいいのか。

  • 自分がこれ作りたいと思う当事者意識が欠けていた

発案者が、よくセリフ改変を画像編集ソフトで行ってtweetしてたりする、いわばこのサービスのコアユーザーに当たる人だったので、コアユーザーがここにいるんだから、この人が作りたいものを作っていこうと甘く考えてしまっていた。

そのため、既存の画像編集ソフトを使うときにはどこに不満があるのかとか、どういうシチュエーションでセリフ改変を行ってどうtweetしているのか、など発案者に詳しく突っ込まなかったため、コアユーザーがどういうものを望んでいるのかを深堀りできなかった。

fork機能が頓挫したのは、なんとなく面白いかもと勝手に思っているだけで、実際はその面白さがどこにあるかを突き詰められていなかったから。でも、いざ切り捨てるという決断もできず、ずるずる中途半端なものを作ってしまった。

サービスをどうするか

当初の目的として実績作りを掲げているので、何かリリースはしたいと考えています。
僕としては、機能を縮小し、セリフ改変をより簡単にできることに特化して、ユーザーの利用シーンにマッチしたサービスにするのがいいのではないかと思います。そこはチームメンバーと要相談ですが。

終わりに

自分の反省点が見えてきたり、また他の参加者のすごさを見たりして、何だか意識が高まってきました。参加してよかったです。

これからはプログラミングだけでなくいろいろ精進していきたいです。
まずは卒論がんばるところからかな。

Ruby歴半年もないけどRuby技術者認定試験Silverに合格しました

f:id:itiut:20130830001331j:plain

タイトル通りなんですが、Ruby技術者認定試験Silverを受験して、94点で合格しました。

どうして受験したか

今年の4月頃にChefやVagrantなどのRuby製のツールを触ることがあり、それで少しRubyについて知り、なんだか良さげな言語なのかなーと思うようになりました。
Rubyを勉強しようかなと思ったけど、その頃はまだRuby 2.0対応の書籍が出版されてなかったので、とりあえず必要な部分な調べるという遅延評価勉強をやっていました。

6月に『たのしいRuby 第4版』が発売されて、Ruby 2.0に対応しているということだったので、そこからRubyを体系立てて入門し始めました。
でも、買ったはいいものの1ヶ月たっても半分も読めていなくて、このままじゃアカンなと思い、無理やり読むために1週間後の試験に申し込んで、試験までの1週間で読みきりました。

勉強法

上にも書いたとおり『たのしいRuby 第4版』と、あと『Ruby技術者認定試験 公式ガイド』を使いました。

公式ガイドは前半の説明を一通り読んだ後、後半の模擬問題を解いて、間違えたりわからなかったりした部分について、説明を見返したり、るりまで確認して覚えるようにしていました。

試験本番の実行環境は、すでにサポートが終了しているRuby 1.8.7が想定されていたので、バージョン間の差についても少しググって調べました。

Ruby技術者認定試験 公式ガイド (ITpro BOOKs)

Ruby技術者認定試験 公式ガイド (ITpro BOOKs)