Hatena::ブログ(Diary)

三等兵

2016-04-12

さよなら、Emacs

f:id:sandai:20160411220633p:image:w360


ついにこの時を迎えてしまった。

不満はない。しかし、居心地のよいHelm.elとお別れをしなければならないのかと思うと小指の古傷がうずいて仕方がない。私を引き止めようとしているのだろうか、まるで考えなおせといわんばかりに。

だが、私の小指はもう…...。

…...いや。

ああ、少し昔話をしよう。

私はその昔、Emacsを最高に使いこなせるようにと小指の修行をしていた。もうずいぶん昔の話だ。

2,3年ぐらい前だ。

なぜそのような修行をしていたのかというと最高の小指を用意するためである。もちろん、最高のEmacsに応えるために。

iPadやiPhoneは小指だけで操作し、かの松尾象山も躊躇したという片手小指逆立ち、小指ピンポンダッシュ、アマゾンの奥地にて小指を餌に見立てたピラニア小指一本釣りなど、様々な修行をしてきた。

なかでも特に困難を極め、私の小指もこれまでかと覚悟した修行がひとつあって、それが24時間耐久熱湯風呂だ。


全身が熱かった。

このように、一歩間違えば二度とEmacsを操作することができなくなってしまうような、そんな過酷な修行を私の小指は行ってきた。

なぜなら、私は最高のEmacsを、最高の小指によって、最高にEmacsを使いこなしたかったからだ。

そうして数々の修羅場をくぐり抜けてきた小指から繰り出されるC-x C-fは、この世の誰よりも美しく芸術的で、なにより速い。その速度は光を超えている。

動いているのは主に中指と人差し指だが。ともかく。

もはや私の小指は物理法則を超えて時間という概念にとらわれなくなったのだ。

私がキーボードで1文字をタイプするときにかかる時間はおよそ0.1秒ぐらいだが、C-x C-fだけはそれをはるかに超越し、光の速度を超えてタイプした瞬間に時(とき)が止まる。


ふぁさああって。

この通り、私は時間の向こう側に広がる宇宙を小指によって感じられるまでに至ったのだ。その瞬間に、本当の意味での自由を得られる。私は小指によって獲得したのだ。

世界を。宇宙を。自由を。


イッツ、フリーダム。

諸君、これがEmacsだ。そして、これがEmacs使いだ。

私だけではなく、この世に生きる全てのEmacs使いは誰しもその小指に宇宙を宿している。我々Emacs業界ではそれを「コスモ」と言いEmacsを使う上でかかせないパワーだ。

もしきみの同僚がEmacsを使っているのであれば目を凝らして彼、又は彼女の小指の「向こう側」をみてみるといい。

どうだ、みえるだろう。

いや、きみは、みえなければならない。真っ当であるならば。

きみが真っ当な人間であるならば、その彼、又は彼女がC-x C-fをタイプした瞬間、小指の向こう側に広がるそのコスモを感じ取ることができるはずだ。


ふぁさあああ。


それこそEmacs使いだけがなし得ることができるこの世の理からの解放、宇宙への回帰。そしてペガサス流星拳(小指のみ)。

我々Emacs使いは、Emacsとその小指に宿るコスモによって本当の意味でこの世界からの自由を獲得したのだ。


しかし。

私は、Emacsとさよならをしなければならない。今日、この鍛えぬいた傷だらけの小指と共に。小指を酷使をしすぎたせいか、いつからか小指のコスモが反応しなくなってしまったのだ。

以前にはできていた重力波も観測することはできなくなった。

ああ、今まで黙っていて申し訳ない。実は、小指から重力波を観測できていたのだ。人類史上初の快挙であると自負しているが「ちょっと偉大な一歩過ぎでは?」と思っていたから黙ってた。

だが、いまなら話しても大丈夫だろう。もはや、私の小指は…..。


ピクピク。

ふふ、ほら、この通りだ。ピクピクしかしない。しかし、重力波を観測するためにはクイクイなんだ。

でも......ああ、くそ、クイクイが、クイクイができやしない。アイムソーリーアインシュタイン。

もはや、こうなってしまってはもう……。

私に。

私に、Emacsを使う資格は、ない。

残念だがここまでだ。仕方がない。小指に宿る宇宙を失ってしまったEmacs使いなど、ただの小指同然だ。


さよなら、私の宇宙。

さよなら、Emacs。

さよなら、そして、こんにちは。


Vim。

ビム。

ヴィム。


さて、これからはVimを使っていこうと思います。Sublime TextやAtomは合いませんでした。今の時代にそもそもテキストエディタってどうなのかと疑問に思うわけでもありますが、とりあえずVimを使っていこうと考えています。

というわけで、これからVimとなかよ…...


っと、いや、ぬぅ!?

ま、まて!なんだ、このVIm圧は!

くぅ、なんと、まさか信じられん!私の小指が…..震えている、だと……っ!?


ブルブルブル。


そしてこの心臓にまで届く暗黒の波動…..ッ!

何者も逆らうことを許されない圧倒的なパワァー……!


まさか、これは!

いや!

お ま え は……っ!!!


あ ん こ っ く び む あ う ぇ !!!!

f:id:sandai:20160411220634p:image:w360

Dark Vim Master/暗黒美夢王(Uncock Vim Awe)

(???? ~ 2016 Vim生まれVim育ち存命中)


特徴 :

フーッハッハッハッハッハ


twitter:

https://twitter.com/shougomatsu


なぜ、このタイミングで私の前に…...!

いや、そうか。そういうことか。Vimに入門したいならまずは私を倒せと。そういっているのだな。

なるほど、通りでVim使いは誰も彼もが上質な闇のオーラをまとっていると関心していたのだが、そういうことか。この圧倒的な闇の力を持つあんこっくびむあうぇーを倒して入門しているからだったのか!なんと、おおぉ…..。


おお、なんということだ!

あんこっくびむあうぇーとは、Vim使いとは、なんと恐ろしい奴らなのだ!

さすが青春という人生の宝物を犠牲にしてVimの設定やプラギーンに費やしてきただけのことはある。通りで心に深い闇があるわけだ。

心の深淵に闇を宿す者、それがVim使いということか。

くそ、Vimの前にこのような大きな闇が存在していたとは。

こうなっては、この壁を乗り越えてVimに入門するためには。


Emacsで修行するしかない!

Vim使いが「心の深淵に闇を宿す者」なら、Emacs使いは「小指に聖なる宇宙を宿す者」である!設定は後付けだが!

ともかく私はその聖なる宇宙によって、Vimに入門するために、Vimの闇に打ち勝たなくてならない。


そういうことであれば、いまここに宣言する!

私は必ずEmacsを使いこなすための小指を取り戻し!

この小指から放たれるであろうペガサス流星拳によって闇を打ち砕くことを約束しよう!

そして、Vimに入門するという、その悲願を叶えるのだ!


さあ、では、こんにちは、Emacs!


Emacsを使いながらVimを使いながらザ・ワールドしながら私は元気です

ファンキーパーリーテキストエディターズのみなさん元気ですか。

私はEmacsをいじりしながらターミナルでVimを開きながら銀河に思いを馳せてときどき時間が止まったりしていやあまいったなあははあははうりいいいなんて日々を過ごしていました。

つい最近になって重力波の観測もできるようになったので、いよいよ私の小指も「…...至ったか」と感慨深いものがありましたが、まさかの負傷。深爪。まさかの。人類史の歴史を変える偉大な一歩が。深爪で。おやおや。

みなさんも少し気を抜くと時が止まったり重力波を観測したりといった現象に度々見舞われることがあるかとは思われますが、お互い気をつけて生きたいものですね。

それでは、さような…...って、おやおや!こ、これは!


仕事ですぐ役立つ Vim&Emacsエキスパート活用術 (SoftwareDesign別冊)
4774180076
出版社: 技術評論社(2016-04-09)


こんなところにEmacsもVimも扱う人にはもってこいの技術本があるのでは!?なぜここにあるのでは!?買ったらいいのでは!?

と思ったけどamazonには電子書籍版がありません。技評の電子書籍サイトにありました。


kindle版をまだ用意していないとは。これが......これが技評の選択、か。

どうしよう。

2013-07-03

Amazon Popup Reviewの不具合を修正しました

たろきち 2013/05/28 00:12

いつも便利に使わせていただいており、ありがとうございます。

amazonの仕様変更のためか、最近読み込みがずっと続いたまま、レビューが出てきません。

申し訳ありませんが、ご確認お願いできないでしょうか?

http://d.hatena.ne.jp/sandai/20110216/p1

amazon側でhtmlが変更されていたので、その関係でうまく動作していなかったみたいなのでその部分を修正しました。ついでに時々popupのリンクが出てこない不具合も直したので使いやすくなったと思います。1ヶ月も放置してしまい申し訳ありませんでした。

2013-05-25

凹んでいます

ずいぶん辛いままで、すぐに使いやすくしたり修正したり機能の追加をする気力がありません。こうして取り上げられるのはとてもうれしくて、ありがたくて、でもこんな中途半端で申し訳ない。

とはいえ、責任が大きくなってきたのでそのうちいくつか気になる部分に手を加えておきます。それから、リクエストがうまくいかなかった場合の処理はしていますが一応バックアップはとっておいてください。

  • http://b.hatena.ne.jp/はてなID/config
    • こちらでバックアップファイルがダウンロードできます

うまい棒一年分もらえたら凸れるかもしれません。味は選り取り見取りでお願いします。送料もそっち持ちでお願いします。

あとたけのこの里派です。たけのこの里が好きです。ということは、どういうことかわかりますね。

送料は、そっち持ちです。

送り先は日本地図にダーツを投げてあたったところに、きっと私はいるのでしょう。

2012-09-17

2回目のC言語で『12ステップで作る組込みOS自作入門 』の通りに組込みOSを作ってみた

12ステップで作る組込みOS自作入門
4877832394

出版社 : カットシステム (2010/05)
発行日 : 2010/05


前回の初めてのC言語で『30日でできる!OS自作入門』の通りに初めてのOSを作ってみた - 三等兵は汎用OSでしたが今度は組込みOSです。参考書は『12ステップで作る組込みOS自作入門 』です。こいつぁすげえや。丁寧に仕上げられた良書でした。

「組込み」とタイトルがついているので興味を示す層が狭そうですが、プログラムを書く多くの人にとって役立つ内容だったと思います。

前回は必死にわかんないーわかんないーを連呼しつつ頭を抱えて苦行みたいな感覚でやっちゃいましたけど、今回はそんな苦労もあったからか余裕を持って楽しめました。

本書ではWindowsだけではなくLinuxでも開発できるよう解説されているのでどんな環境でも問題ありません。Linux入れるのがめんどくさかった私は例によってMac OS Xでやりましたが大きな問題はなかったです。よってほぼ誰でも環境を用意することができる、と言いたいところですが。

こういったクロス開発ではシリアルケーブルとか使ってマイコンとイチャイチャする必要があるのです。でも、MacBook air(MBA)だとシリアルコネクタない...あるわけない。しょぼーん。

困ったなーと思ってたら2300円ぐらいのUSBのシリアルアダプタを使えば良いらしく、それ使ってやりました。

iBUFFALO USBシリアルケーブル(USBtypeA to D-sub9ピン)0.5m ブラックスケルトン BSUSRC0605BS
B007SI18YO

この記事では組込みの事前知識ゼロからやってみた者として、Macの開発環境を紹介しつつ書籍の内容について書いてみようと思います。


12ステップの内容をまとめたスライド

OS作りは一応2回目なので余裕もあるだろうと学習した内容を1ステップずつスライドにまとめながらやりました。荒いのと正確かどうかは保証できませんが、Macで詰まる部分はだいたいメモってあります。


開発環境を整えよう

WindowsとLinuxでの開発環境は本書で紹介されています。それらのOSであれば書籍を参考にしてください。この開発環境を作る時点で詰まったときはネットで検索したりGoogle グループで質問しながらがんばりましょう。

ハードな話

ソフトな話の前にハードな話。

本書ではマイコンボードとシリアル接続しながらのクロス開発を想定して書かれています。(クロス開発ってのは大雑把に言えばPCでコード書いてPCとは別の機器でそのプログラムを動かすことを目的とした開発のこと)

必要なものと金額は下記のリンク先にまとめられています。

実際に私が購入したものは以下の写真の通りです。

f:id:sandai:20120807145443j:image

面倒であればカットシステムさんからまとめて組込OSセットを買えます。全部で9110円です。

さらにシリアルコネクタがなければそこから2200円ぐらい増えますんで1万超えちゃいます。(左上のケーブルがシリアルケーブル。シリアルコネクタが無ければ必要です。ちなみにMBAにはないです)

合わせて1万2千円になりますざまぁーありませーんというわけで、レッドブル節約すべきかすべきでないか、それが問題だなブラザー。


Macの開発環境

それじゃあMacでの開発環境について紹介していきましょう。

動作確認はLion 10.7.4(64bit)です。

セルフ・コンパイラ

まずセルフ・コンパイラを用意します。これは要はgccのことです。

MacだとXcodeとそのうちのCommand Line Toolsを入れていればgcc(llvm-gcc)もあるので何もする必要はありません。Xcodeが無ければXcodeとCommand Line Toolsで検索かけてインストールしてください。

確かXcode4.3あたりからこうなったんで、Xcode4.2なら何もしなくていいはずかな。たぶん。

クロス・コンパイラ

次はクロス・コンパイラです。これもまあgccのことです。

gccが2つ出てきちゃいましたね。

えーと、セルフ・コンパイラは大雑把に言えばPC用のgccと考えてください。PC上で動作するプログラムをコンパイルするためのgccです。そしてクロス・コンパイラは組み込み用のgccです。マイコンで動作するプログラムをコンパイルするためのgccってわけです。

さっきのセルフ・コンパイラはクロス・コンパイラをビルドするのに必要なんで用意したのです。

で、クロス・コンパイラは「必要なくなったらまとめてゴミ箱行きできるインストール方法」でいきたいと思います。全部$HOMEにまとめちゃう感じですね。

それじゃあターミナルを開いて以下のように打ってください。

ちなみに書籍中ではターミナル開いてあれこれ操作するばっかりです。ターミナルの操作が全くわからない人はこれから厳しいかもしれません。慣れればなんとかなりますのでがんばっていじってみてください。

cd ~
mkdir 12step
cd 12step
mkdir build src tools

12stepというディレクトリをホームディレクトリに作成して、その下にbuild、src、toolsというディレクトリも作成しました。(ホームディレクトリはFinderのメニューバーから「移動>ホーム」で開かれるとこです)

  • build
    • インストールするツールをビルドするとこ
  • src
    • ここで12stepで開発していくプログラムを置きます
  • tools
    • クロス・コンパイラとか、その他必要なツールはここに置きます

これからクロス・コンパイラをダウンロードしてインストールします。ダウンロードするパッケージは以下の通り。

インストールは以下の記事を参考にしています。


まずは、12stepディレクトリのbuildディレクトリにパッケージをダウンロードします。

cd ~/12step/build
curl -O http://ftp.gnu.org/gnu/binutils/binutils-2.19.1.tar.bz2
curl -O http://ftp.gnu.org/gnu/gmp/gmp-5.0.5.tar.bz2
curl -O http://www.multiprecision.org/mpc/download/mpc-0.9.tar.gz
curl -O http://ftp.gnu.org/gnu/mpfr/mpfr-3.1.1.tar.gz
curl -O http://ftp.gnu.org/gnu/gcc/gcc-4.7.1/gcc-4.7.1.tar.gz

これらはターミナルから実行するコマンドですよ。じゃあ、5つダウンロードできたらそれぞれビルドしていきます。

binutils
cd ~/12step/build
tar jxvf binutils/binutils-2.19.1.tar.bz2
cd binutils-2.19.1
./configure --target=h8300-elf --disable-nls --disable-werror --prefix=$HOME/12step/tools
make
make install
gmp
cd ~/12step/build
tar jxvf gmp-5.0.5.tar.bz2
cd gmp-5.0.5
./configure --prefix=$HOME/12step/tools/gmp
make
make check
make install
mpfr
cd ~/12step/build
tar zxvf mpfr-3.1.1.tar.gz
cd mpfr-3.1.1
./configure --prefix=$HOME/12step/tools/mpfr --with-gmp=$HOME/12step/tools/gmp
make
make check
make install
mpc
cd ~/12step/build
tar zxvf mpc-0.9.tar.gz
cd mpc-0.9
./configure --prefix=$HOME/12step/tools/mpc --with-gmp=$HOME/12step/tools/gmp --with-mpfr=$HOME/12step/tools/mpfr
make
make check
make install
gcc
cd ~/12step/build
tar zxvf gcc-4.7.1.tar.gz
cd gcc-4.7.1
./configure --target=h8300-elf -disable-nls --disable-threads --disable-shared --disable-werror --enable-languages=c --prefix=$HOME/12step/tools --with-gmp=$HOME/12step/tools/gmp --with-mpfr=$HOME/12step/tools/mpfr --with-mpc=/usr/local/mpc
make     
make install

以上です。ビルドしてできたファイルは全て~/12step/toolsのtoolsディレクトリ以下にあります。

h8write

h8writeは、PCで書いたプログラムをマイコンのフラッシュROMに書き込むことができます。これもtoolsディレクトリ以下に入れます。

ただし、Lion以降はkz-h8writeでないと動作しないかもしれません。(32bitカーネルなら普通のh8writeで問題ないかと。h8writeを使うなら書籍を参考にビルドしたら、~/12step/tools以下にh8writeというファイルを置いてください)

そういうわけでkz-h8writeを使わせてもらいます。

ダウンロードして解凍したら~/12step/build/以下にkz_h8write-v0.1.0を置いてください。あとは以下のコマンドを実行するだけです。

cd ~/12step/build/kz_h8write-v0.1.0/src
make
mv kz_h8write ~/12step/tools/kz_h8write

クロス・コンパイラの用意は以上で終わりです。


シリアルコネクタが無いPCでの準備

次はシリアル接続できるようにするための準備です。

PCにシリアルコネクタが無い場合はUSBシリアルケーブルみたいなのが必要です。とりあえずネットで調べてみるとMacであれば下の機器で問題ないと書いてあったので、私もこれを買いました。

iBUFFALO USBシリアルケーブル(USBtypeA to D-sub9ピン)0.5m ブラックスケルトン BSUSRC0605BS
B007SI18YO

Windows向けと書かれてますが心配いりません。Macでも利用することができます。そのためにはMac用のドライバが必要でして、それは下記のURL先からダウンロードしてインストールしてください。

Snow Leopardであればx86 (32-bit)のドライバですね。(64bitで動作させていればx64です。こういうことしてなければ32bitで起動してるはずです)

Lion以降はx64のドライバをインストールしてください。

ドライバ名の確認

ドライバをインストールできたらUSBシリアルケーブルのドライバ名を確認します。

まずはUSBシリアルケーブルを接続してください。そしてターミナルから以下のようにコマンドを実行します。

ls /dev/tty.*
/dev/tty.Bluetooth-Modem     /dev/tty.Bluetooth-PDA-Sync     /dev/tty.usbserial-FTG6PQ4H

ls /dev/tty.*の部分がコマンドで、その下の行がコマンドを実行した結果です。結果のうち、「/dev/tty.usbserial-FTG6PQ4H」がこのデバイス名です。同じようにして自分のデバイス名を確認できたら後から使うので覚えておいてください。


1stステップだけ学習講座

以上の設定でどうやって学習していくかを1stステップを例に書いときます。

ソースコードの置き場所

1stステップはHello Worldを表示するプログラムを書くんですが、それぞれのファイルの置き場所は~/12step/src以下になります。

ディレクトリの構造は、

  • 12step
    • tools
    • src
      • 01
        • bootload
          • main.c
          • startup.s
          • ...
      • 02
        • bootload
          • ...

こんな形です。srcディレクトリの下に1stステップのコード、2ndのコードと並べていきます。src以下は書籍の通りなんでよくわかんなかったら書籍も参考にしてください。確かstep1にディレクトリ構造の図があったと思います。

Makefile

で、書籍の通りにコードを書くときMakefileの部分だけそのままじゃうまくいきません。書籍ではクロス・コンパイラを/usr/local以下に配置した形になってますが、こっちは~/12step/tools以下に置いてますからね。

それで、こっちの環境で動作させるためにはMakefileを以下のように直してください。

PREFIX = ~/12step/tools
ARCH = h8300-elf
BINDIR = $(PREFIX)/bin
ADDNAME = $(ARCH)-
.
.
.
H8WRITE = ../../../tools/kz_h8write

H8WRITE_SERDEV = /dev/tty.usbserial-FTG6PQ4H

これらのうち、H8WRITE_SERDEV = /dev/tty.usbserial-FTG6PQ4Hだけ皆さんそれぞれ違う記述になるはずです。ここはさっき確認したUSBシリアルケーブルのデバイス名を書いてください。

あと「H8WRITE = ../../../tools/kz_h8write」も単純なh8writeを使ってるなら、「H8WRITE = ../../../tools/h8write」としておいてください。

プログラムのビルドとフラッシュROMへの書き込み

指示された通り全てコードを書いて、Makefileもこっちの設定用にできたらビルドします。cd 12step/src/01/bootloadでmakeすると下記のように出力されれば成功です。

cd ~/12step/src/01/bootload
make
~/12step/tools/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD vector.c
~/12step/tools/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD startup.s
~/12step/tools/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD main.c
~/12step/tools/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD lib.c
~/12step/tools/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD serial.c
~/12step/tools/bin/h8300-elf-gcc vector.o startup.o main.o lib.o serial.o -o kzload -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD -static -T ld.scr -L.
cp kzload kzload.elf
~/12step/tools/bin/h8300-elf-strip kzload

次にmake imageというコマンドを実行してください。下記のように出力されるはずです。

make image
~/12step/tools/bin/h8300-elf-objcopy -O srec kzload kzload.mot

今度はマイコンのフラッシュROMにプログラムを書き込む作業をします。まずマイコンとMBAを接続します。

f:id:sandai:20120824122228j:image

次に書籍でも解説されていますがディップスイッチというのを書き込みモードにします。こうすることでフラッシュROMにプログラムを書き込めるようになります。

f:id:sandai:20120824122317j:image

この青いディップスイッチの右隣にポチっとあるのがリセットボタンです。一応試しにポチっとおしといてください。

それじゃあフラッシュROMに書き込みを行います。ターミナルからmake writeを実行してください。次のようになったら成功です。

make write
../../../tools/kz_h8write -3069 -f20 kzload.mot /dev/tty.usbserial-FTG6PQ4H
=================================================
 H8/3069F Flash Writer for KOZOS (Version 0.1.0)
 Copyright(C) 2011-2012 Shinichiro Nakamura
=================================================
Bitrate sequence: Done.
Inquiry device: Done.
Select device: Done.
Inquiry clock mode: Done.
Select clock mode: Done.
Select bitrate: Done.
Waiting for erase done:...
Programming:.....
Program: Done.
Complete.
フラッシュROMから起動

じゃあプログラムを実行してみましょう。書籍にもありますがcuコマンドを使って接続します。

まずはマイコンのディップスイッチを下の画像のようにします。

f:id:sandai:20120824122347j:image

ターミナルから下記のように実行してください。これは書籍でいうところのCUを使ってます。特に問題はないので、CU使っちゃってかまいません。

sudo cu -l /dev/tty.usbserial-FTG6PQ4H
Password:

「usbserial-ほにゃらら」の部分は自分のデバイス名にしてEnter押します。すると、Passwordを聞かれるのでいつもログインに使ってるパスワードを入力してください。

うまく接続されたらConnectied.と表示されるはずなので、ここでリセット・ボタンをポチっと押してみてください。

sudo cu -l /dev/tty.usbserial-FTG6PQ4H
Connected.
Hello World!

こんな感じでHello World!と表示されたら成功です。

学習の流れ

2ndでは~/12step/src/01を~/12step/src/02にコピーして書籍の通りにコードを修正しながら進めていく形になります。書き込みとプログラムの起動についてはさっきやったような感じですね。

あとは、エラーなどで詰まったところがあったらスライドで確認してみてください。細かい部分はメモってませんが、大きなエラーは内容と解決方法をメモってあります。

それ以外は書籍の通り進めていけば問題はないでしょう。


書籍について

入門と冠された本としては比較的高いレベルが求められます。高いといってもたいていの人は一般教養レベルでしょと言われるぐらいものでして、プログラミング初心者だと誰か指導してくれる人がいないと辛いって感じですね。

組込みの知識ゼロでも問題はありませんでした。ほとんど全て解説してくれるので、前提としてC言語だけ文法とかなんとなく理解できていれば大丈夫です。

コードは一生考えてもわからん!ってほど難しいところは無かったと思います。アルゴリズムやデータ構造はシンプルなものだし、動作に必要なコード以外はほとんど書かれていないので行数が少なく読みやすいはずです。文章は丁寧にまとまっていて構成がよく練られているといった印象を受けました。下手に話が展開していかないよう配慮している部分も好感が持てます。

開発は最初にひと通り動く小さなプログラムを書いて、それを毎ステップごとに少しずつコードを修正、追加していきながらOSを開発していくって流れです。

こういうのいいですよね。次はこういう機能を実装するからコードをこういうふうに書き換えるよ、こういうファイルを追加するよ、ってことが把握できるので理解しやすいですし、自分でOSを作っている感じがして楽しみながら開発することができます。

コードの量は最終的に2700行ぐらいで、毎ステップに書くコード量が200〜300行前後とバランスが良いですね。

だいたいの人は本書のうち第1部まで問題なく理解できるはずで、鬼門は後半の第2部の7thステップと8thステップでしょう。特に8thステップが私みたいになんちゃってでやってると、ここで壁にぶち当たります。

この部分を理解できているかどうかで9thステップに続く内容の理解度に影響してくるはずなので、難しいと感じたならめんどくさがらずにメモをとりつつ細かく流れを整理しておきましょう。

ここは中盤ながらのラスボスですね。中ボスなんだけどラスボス並みに強いじゃねえかっていう中ボスです。そうですね、バルバトスですね。

特技がストーカーで口を開く度にぶるぅぅあああああ!!と叫ぶバルバトス。タンスの角に小指をぶつけてぶるぅぅああああ!と泣き叫ぶバルバトス。人気のラーメン店で並んでいるとおばさんに横入りされてぶるぅああああ!と悔し泣きするバルバトス。バルバトスがぶるあああ!!過ぎて生きているのが辛い…。何の話か分からない人はスルーしてください。


他の組込みの書籍を知らないのでなんともいえませんがOS本の入門書としてなら良書だと思います。すごくわかりやすかったので。たぶん組込みの入門書としてもこの出来なら評価は高そうですね。

全体的に構成が丁寧で内容が分かりやすくまとまっており、文章に対するコード量の比もバランスがとれていて、自分でコード書きながら理屈も学べる良い本でした。

おそらく「組込み」というタイトルで興味を持つ層が限られているような気がします。しかし、プログラムを書く多くの人にとって役に立つ内容だったと思いますよ。関心の輪を広げてチャレンジしてみてはいかがでしょうか。

個人的には汎用OSより先にこっちやってみる方が良いかなと感じました。なんで、単純にOSに興味があるけどOS作り未経験な人もどうぞ。

本書であれば高度な知識を必要とせず最後までやり遂げられるでしょう。それにブートローダ作って実行ファイルを解析したり、ファイル転送のプロトコルを実装したりといったことを入門レベルで実践できるので楽しいですよ。

というわけで、前回でもそうでしたが、フルスクラッチでOS作るってのはどういうことか今回も良く身に染みました。なんだかんだと大変でしたが楽しかったです。

では、もしやってみようと挑戦する方がいらっしゃれば楽しんでやってみてください。

2012-07-28

初めてのC言語で『30日でできる!OS自作入門』の通りに初めてのOSを作ってみた

30日でできる! OS自作入門
4839919844

出版社 : 毎日コミュニケーションズ
発行日 : 2006/3/1

良い本です。アカデミックの匂いが良い意味で全くしない。その上での実践的な本は日本語で他に無いと思います。ガチムチアカデミックの批判にあえて真っ向勝負してるような意欲作です。

正しい知識だの用語だのそんなもんはどうでもいいから手を動かしてやってまえみたいな感じで。こういうのは頭いい人たちから批判されやすいですね。俗物な私にはぴったりでしたが。

本書はWindows用のサンプルしかないんですがMac用に整えたので、それ公開するついでに思ったことつらつらと書いときます。


開発環境

  • Mac
    • サンプルがWindows用なのでいろいろMac仕様にしなきゃいけない(後述)
  • テキストエディタ
    • EmacsだのVimだのなんでもいいので適当に用意
  • バイナリエディタ

とりあえずはこれらだけ用意して他にも必要なものがあるんだけど後述。

Macでの開発環境を整える

本書で開発するOSは著者の用意した開発ツールを使って開発します。名前はtolsetといって付属のCD-ROMに入っているんですがWindowsのみ対応しています。が、なんと、ウェブでMac用も配布されているんです(著者とは違う方が配布していらっしゃいます)

今回はそれを利用して開発しました。

また、OSを起動させるにあたってQEMUという仮想マシンも用意します。えーとこれはですね、VMwareとかVirtualBoxみたいなのと同じようなもんです。それらのソフトウェアが知らない人は、大雑把に言えばMacが起動している中でアプリみたいにWindowsが起動できたりするソフトと思ってください。Safari立ち上げている横でWindowsも操作できちゃったりします。

本書ではこの仮想マシンを使って開発したOSを起動させる方法と、フロッピーディスクを使い実機で起動させる方法が紹介されています。実機の方がそれっぽくはありますが、いろいろめんどくさいので仮想マシンを使いましょう。

それで、本書ではこのMacの中で他のOSを起動できるようにする仮想マシンとしてQEMUを使っています。しかし、例によってQEMUはWindows用です。ががーん。

でも大丈夫です。QEMUのMac移植版として公開されているQ.appがありますのでこれを使います。

でまあ、Mac用のtolsetとQ.appをなんやかんやと調節して開発環境を構築する必要があるんですが結構めんどくさい。さらにCD-ROMに入ってるサンプルもそのままだとMacでは動かない…...。

というわけで、そこら辺をうまくカバーできるようにしました。やったのは基本的にMakefileをこの開発環境用に書き換えたのと細かい部分を調節しただけですが。

いろいろ書くのめんどくさいので簡単に用意できるようにしてます。最終的にはターミナルからぽぽぽいとmakeするだけでQ.appからOSを起動できるようになってますんで、詳細は下記のページみてください。


とにかくここの準備はちゃんとしておかないとサンプルや作ったOSを試すときにかなりめんどくさいです。間違ってもコンパイルとかビルドを手作業でコマンド叩いてやろうなんて思わない方が良いです。


必要な知識とか技術とか

必要な知識や技術は挙げればたくさんありますが全くなくてもいいです。でもあったほうが良いです。どっちやねん。

というのも、必要な知識は学習しながら身に着けていけや三下どもが!という感じの書籍なのです。合理的ですが、知らないことばっかりだとモチベーションあがらないでしょう。だってOSに関係すること以外の部分も勉強しながらだったら絶対1日で終わらないもん。

C言語、アセンブリ、ターミナル(コマンドライン)、このあたりのことさえなんとなくわかれば大丈夫...かな。その他については本書でいろいろ説明があります。それでもよくわからなかったら調べながらやればなんとかなります。

たとえ分からないことがあってもなんとなしに分かった気になることが大切です。分かった気になればいいんです。いい加減なこと言ってますがそういう適当さがあった方が良いと思います。

あと、中学生でも分かるように書いたと書籍では述べられていますが…...たぶんわかんないと思います。巷で有名なスーパーハカーな人は知らないけど普通かそれ以下を自称する中学生ならきついでしょう。少なくとも私ならあきらめてます。

えーだめじゃんと落ち込むことなかれ。普通かそれ以下を自称する中学生が書籍で学ぶんだったらこれ以上易しいものなんて存在しません。たぶん。

つまり、作ってみたいならこれを参考にやるっきゃないということで。がんばれ青少年。まだフレッシュな感性のうちにやるのだ。無駄に年食ったおっさんやおばさんになったときだとヤル気が全然湧いてこないぞ。気力が全然湧いてこないんだ。昼からビールのみてぇとかしか思えなくなってくるんだ悲しくなってきた……。

そういうわけで今のフレッシュな感覚のうちにやっておいた方が無難でしょう。

もしやってみて途中であきらめてしまったとしてもそれは仕方がないです。誰も責めません。できたらすごいですよ。こんな内容の薄いものもできんのかとすごく頭の良い人たちは言ってくるかもしれませんが、そんな事言われてもわからんものはわからんです。

だから、できなかったらまた時間をおいてやればいい。たぶんきっと、そうやっても理解できない部分がたくさんあるかもしれない。でもそれでいい。がんばってるあなたはすばらしいんだ。ビジネスじゃないんだから結果なんてどうでもいい。

私が言うのもおかしなものだけどちゃんと全部理解できなくてもいい。感覚さえつかめればそれで良い。次があるなら問題ない。

わからないことがいけないんじゃなくてそれを5年後もわかっていないことが問題なんだ。そうやってつなげていければあるいは、たどり着く場所があると思う。


というクールな逃げ方をするのがハードボイルドな大人になるコツです。人生における逃げとは全てにおいて戦略的撤退なのだ。

初めてなら完全理解を捨ててOS入門すること

全てを完璧に覚えて理解してやろうなんて考えない方が良い。それよりも大要をつかむことに集中した方が良いと思う。

私もそうして30日以内で終わらせることはできた。結果的に毎日できたわけじゃないし、いろいろな理解を捨てたけど。わからない部分があるというのは居心地が悪い。だけど、ずっと立ち止まって考えるよりは良いと思う。

全部初めてのことだから全体的になんとなく理解できれば問題ないし、あるいは目的があるならそこの部分だけ理解できるように集中した方がいいでしょう。細かい部分気にしてたら時間が足りないしモチベーションも保てない。

ここでわからなくても次で理解できればいい。いくつかこなせばパターンも見えてくるだろうから、そうなったらあとは確認作業みたいなもので、突き詰めるとどれだけ真っ直ぐ向き合えるかという話になってくる。

というのは頭の中で考えた話でそんなすんなりいくわけじゃない。いくわけじゃないんだがそういうもんじゃないかなと予測している。

とはいえ、私は自分だけのOSを作りたいって目的があるわけじゃなくて、ハードとソフトがどんな関係で成り立っているのかってことが知りたいだけだから、曖昧でもいいからイメージできれば十分だったりする。

そんな線引きをしながら本心ではやっぱりもっと正しく理解したいんだよね。でもこの欲求に見合う頭が私には無いから、そのへんのバランスをとりながら踏み込んでいきたいなと思っている。

分からなかったら分かった気になれ

やっているうちに分からない部分がたくさん出てくるでしょう。そういうときは立ち止まって考えるより分かった気になって通り過ぎるのが良いです。

真面目な人はそんなのいけない!と怒るかもしれませんし、私も真面目じゃないけどそういうの嫌だなと思う。だのに、なんでこんなことを言うのかといういえば、分かった気になっちゃえばいいと坂村健さんもおっしゃっていたからです。TRONで有名な坂村さんです。

パソコン周りの用語とか概念て難しいから、とりあえず分かっちゃった気になればいいよみたいなことを『痛快!コンピュータ学』で言ってたのです。

だから分かった気になればいいんです。こんなすごい人がいってるんだから間違い無いです!(根拠は権威です!)

でも、分かっていないことは自覚しときましょう。えーとだから、「私は分かった気になったけれど実は分かっていない」ということを頭においておくんです。

それでどんどん突っ走って、途中で戻ったり、寄り道したり、そんな感じでやっていけばいいんじゃないでしょうか。というかそういうやり方の人の方が成長が早そうな気がします。


学習をする上でこうしたらよかったなと思ったこと

  • 自分の手でコード書く。サンプルをつぎはぎして作らない
    • めんどくさくて多くの部分をつぎはぎしちゃった。正直C言語扱えるって言えないレベルで反省
    • ただ本書では書き直す部分がたくさんでてきてめんどくさい><
    • でもこれは実際にコード書いて開発するってこんな流れなんだな、みたいなことを伝えたいからだと思う。それを察することなく無駄な文が多いだのまとまっていないだのと批判するのは的外れだと思うよ。そういう体系だった内容の書籍は他にあるんだからそっちにまかせちゃえばいいもの
  • 分からない関数があれば696pにある索引の付録を利用する
    • 印刷しておくと便利。改造の流れも忘れたとき把握できる。30日立った後に気づいて泣いた
  • 基本的な部分は16日目ぐらいまで。そこら辺をしっかり理解できればうまく波に乗れるはず
  • メモ取りながらやる
    • 一応取りながらやったけど、取らない日があったりまちまちでうーん。ちゃんととっておくと後々便利な気がする。でもめんどくさいからなくてもいいよ
  • 分からなくても分かった気になれ
    • 最強のコツ

これをふまえてもう一度挑めばもっと理解できるかもしれない!と思いつつ、もう一度やろうという気にはなれない。燃え尽きちまった。またいつかやるよ。たぶん。たぶん。

個人的に本書のレベルは調度良いより少し辛口で難しかったです。

でもいろいろ経験できてよかった。時間経つとなんもかんも忘れちゃいそうだけど、一度通ったことがある道ができたというのはいい事だ。きっと。そうだ。いや、そう思わないと、だって得たものが何もないなんて悲しすぎるじゃない。