Hatena::ブログ(Diary)

三等兵

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日目ぐらいまで。そこら辺をしっかり理解できればうまく波に乗れるはず
  • メモ取りながらやる
    • 一応取りながらやったけど、取らない日があったりまちまちでうーん。ちゃんととっておくと後々便利な気がする。でもめんどくさいからなくてもいいよ
  • 分からなくても分かった気になれ
    • 最強のコツ

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

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

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

2012-06-22

決定版!EvernoteにMarkdown記法で構造化されたデザイン文書を作るやつ!

今までの流れで一応形になって落ち着きましたー。

madeverというAppleScriptで書いたスクリプトを使って、Evernoteクライアント上でMarkdown記法が使えるようになります。文章を書くときはmarkdown、ちゃんとした形として保存するならリッチテキスト。そういった使い方で利用できるようイメージしました。(もちろんリッチテキストでも編集可能)

インストールや詳しい使い方については下記のURLでどうぞ。


Evernoteの使い道

ネットだとEvernoteはよくあるライフハック的な使い方やEvernoteにライフログを残すといった情報ばかりです。というか、私はそういったイメージが強くて使っていなかったのですが、

  • 読書メモ
  • 技術的な知識のまとめ
  • アイデアメモ
  • 領収書
  • pdf書籍の保管

などで利用すると便利でした。

ウェブページ保存とかライフログとかはやらないです。めんどくさいです。

個人的にEvernoteの一番の魅力はドキュメントや画像管理が楽なとこですね。テキストファイルとか邪魔で、そういうの保存する、管理するってめんどくさいし、さらに画像も含まれてくると嫌になるんですが、Evernoteだとそういうことを気にせず扱えます。あとクラウドって部分も大きい。

だけれど構造的な文書を作るのには向いていない

Evernoteのクライアントは構造的な文章が書きにくい。書きにくいというか向いていない。Evernoteって普通だとメモ程度にしか使えないので、それ向けに使ってる人も不満に感じないと思います。

ちゃんとした文書を作るとなると自分に馴染んだアプリを使いますね。自分もそうしていたんですがめんどくさくなりました。読書メモで電子書籍のスクショとか取ると画像の扱いとか面倒で。あと文書がかければ私はメモ帳でもなんでも良いです。

で、個人的な文書ならEvernoteだけで終わらせてしまってもいいんじゃないかと。でも文書の見た目はちゃんとさせたい。構造化された文書はパッと見てポイントがつかみやすいのでこれだけはちゃんとしたい。

そういった動機からmadeverみたいなのを作りました。

Evernoteでそんな文書を書きたいなんて人は稀でしょうが同じような人の役に立てたらうれしいです。

2012-06-13

EvernoteだけでMarkdown<=>リッチテキストの相互変換できるスクリプト書いた

前回Pandocを入れたのはEvernoteだけでmarkdownとhtml(リッチテキスト)を相互変換できないものかという考えからだった。

そういうわけでやってみたできた。こうやってEvernoteでmarkdownの文書を書いて、

f:id:sandai:20120612234852p:image


スクリプト実行すると、

f:id:sandai:20120612234853p:image


markdownにするかhtml(リッチテキスト)にするかダイアログが出るのでリッチテキスト(html)にして変換。

f:id:sandai:20120612234855p:image


リッチテキストからmarkdownにするにはさっきのダイアログをmarkdownにする。

すると、

f:id:sandai:20120612234856p:image

こうして元に戻せる。

markdownで文書を編集、きれいにしたければリッチテキストに変換、また問題があればmarkdownに変換して文書を編集、といった使い方ができる。

若干最初と違いがあるのはPandocの仕様。複雑な構造部分も基本的には問題ない。

f:id:sandai:20120612234857p:image


まあ以前の使い回しなので変換するコードに特に手を入れなきゃいけない部分がなかったのもあってか問題はなかった。が、なんかいろいろめんどくさいことがあったけどそれはいいや。

とりあえずEvernoteのクライアントだけでMarkdownを使えるようになった!これでEvernoteでいろいろ書きやすくなると思う!

さらに、

を使えばショートカットでいけるようになると思うけど、試してない。また今度。


相互変換のために準備するもの

2つ必要。Pandocと相互変換するmadever.applescriptというスクリプト。


AppleScriptはAlfredでも呼び出せる。設定画面のFeaturesのAppleScriptsにチェック入れると表示されるけど、/Users/ユーザ名/Library/Scriptsだとうまく表示されなかった。ホームディレクトリに適当にフォルダ作って置けばみつかると思う。あとscptにすること。エディタで開いて別名で保存して、フォーマットをスクリプトにすればできる。

HomebrewからPandocをインストール

Pandocはいろんなテキストフォーマットのコンバータ。これを利用して変換作業を行なってますのでお手持ちのMacにインストール。Homebrewからインストールするには、まずhaskell-platformというのをインストール。

% brew install haskell-platform

結構時間かかるので待機。

完了したらcabalというHaskellのパッケージ管理システムを使ってPandocをインストール。RubyのgemのHaskell版みたいなもの。

% cabal update
% cabal install pandoc

インストールできたら.zshrcから$HOME/.cabal/binにパス通す。bashの人も適当にどうぞ。

PATH=$HOME/.cabal/bin:$PATH

記述して保存したらターミナルを再起動して、

pandoc -v

とすると、

% pandoc 1.9.4
Compiled with citeproc-hs 0.3.4, texmath 0.6.0.6, highlighting-kate 0.5.1.
Syntax highlighting is supported for the following languages:
    Actionscript, Ada, Alert, Alert_indent, Apache, Asn1, Asp, Awk, Bash,
    Bibtex, Boo, C, Changelog, Clojure, Cmake, Coffeescript, Coldfusion,
    Commonlisp, Cpp, Cs, Css, D, Diff, Djangotemplate, Doxygen, Dtd, Eiffel,
    Email, Erlang, Fortran, Fsharp, Gnuassembler, Go, Haskell, Haxe, Html, Ini,
    Java, Javadoc, Javascript, Json, Jsp, Latex, Lex, LiterateHaskell, Lua,
    Makefile, Mandoc, Matlab, Maxima, Metafont, Mips, Modula2, Modula3,
    Monobasic, Nasm, Noweb, Objectivec, Objectivecpp, Ocaml, Octave, Pascal,
    Perl, Php, Pike, Postscript, Prolog, Python, R, Relaxngcompact, Rhtml, Ruby,
    Scala, Scheme, Sci, Sed, Sgml, Sql, SqlMysql, SqlPostgresql, Tcl, Texinfo,
    Verilog, Vhdl, Xml, Xorg, Xslt, Xul, Yacc, Yaml
Copyright (C) 2006-2012 John MacFarlane
Web:  http://johnmacfarlane.net/pandoc
This is free software; see the source for copying conditions.  There is no
warranty, not even for merchantability or fitness for a particular purpose.

みたいに出てきたらうまくいってる。

なんのこっちゃお前なにいってんのかよくわからんぞボケという人は普通にダウンロード。

インストーラが助けてくれますんで誰でも導入できます。

もし.cabalやインストーラ以外のパスにPandocの実行ファイルがある場合madeverスクリプトの上部にそこまでのパスを書いてほしい。たぶんすぐわかると思う。

Markdown記法について

いくつか特殊というか、他のMarkdown記法と互換性のない記法が存在する。全てを把握できているかどうかはっきりテストしていないが、現在分かるものは次の通り。

  • 改行は半角スペース2つだけじゃなくて、バックスラッシュ(\)を使う
  • html→markdownにしたときにリストの間に不自然な行が入る
    • 特に問題はないのでそのままだがこちらで対応しようかどうか検討中
  • 引用のネスト時に1行余計に書く必要がある
    • これは言葉では表しにくい
  • プログラミングコードのシンタックスハイライトがある
    • 便利ではあるがhtml→markdown時に対応できない。どうしようか検討中
  • tableのalignがmarkdown→html→markdownに変換したとき無効になる
    • pandoc側のバグといっていいのか。ちょっとこれは調節するのが難しそう

とりあえず改行と引用だけ書き方を気をつければ良い。あと画像はEvernoteの関係でmarkdownやらhtmlやら変換していると無くなっちゃうので、画像なしで。

それ以外はだいたい安心できると思う。

まあちょこちょこ直していく。

引用の書き方

問題ない書き方はこれ。

> 引用のテスト 段落と同じような扱いを受けている。改行するときは末尾に□□

> と半角スペースを2つ入れることで改行になる

>

> Markdownで`1行`あけることで行が開く

>

> > ネストした引用のテスト

> >

> > > さらにネスト引用。ネストには一行あける必要がある

> > > これはPandocだけの仕様。普通にやるなら–strictを使う必要がある

>

> 引用された文章です 

>

> 引用された文章です

>

> ### hタグのテスト

>

> - リストのテスト1

> - リストのテスト2

問題が出る書き方

> 引用のテスト

> 段落と同じような扱いを受けている。改行するときは末尾に□□

> と半角スペースを2つ入れることで改行になる

>

> Markdownで`1行`あけることで行が開く

> > ネストした引用のテスト

> > > さらにネスト引用

> ネストした引用ではPandoc-1.9.4で正しく動作しない

>

> 引用された文章です 

>

> 引用された文章です

>

> ### hタグのテスト

>

> * リストのテスト1

> * リストのテスト2

ネストするとき気をつけて。あんまりやらないと思うけど。

2012-06-02

全部無料で。EvernoteにMarkdownで書いたCSS対応の文書を投稿するやり方

MacのEvernoteのクライアントは使いにくい。とくにMarkdownが使えないのは辛い。リッチテキストだって全然リッチにできない。もっときれいなデザインの文書を投稿したい。

そんなことを思っていて、じゃあMouというMarkdownエディタで書いた文書をEvernoteに保存できるようにしたらいいんじゃないか、という誰もが考えそうだけどあえて誰もやらなかった(めんどくさいから)であろうようなことをできるようにした。

結果的にどうなったかというと、下の画像のようなCSSでデザインされた文書をEvernoteに投稿できるようになった。

f:id:sandai:20120602015847p:image


デザインはMouで用意されているgithub.cssをそのまま割り当てている。

これはAppleScriptっていうマイナーな言語で書いたスクリプトを使う。ちょっと試験的なんだけど今回はそのスクリプトを公開。


必要なもの

Mouの文書をEvernoteに投稿するにはMouとその内容を投稿するスクリプトの2つ必要。

  • Mou
    • 無料のMarkdownエディタ。ヘタな有料のアプリより良かった
  • mouever.applescript
    • Mouで書いた文書をEvernoteに投稿するスクリプト。名前は適当
Mou
mouever.applescript

ちなみに私はAlfredというランチャーを使ってスクリプトを実行している。設定画面のFeaturesのAppleScriptsにチェック入れるとAppleScriptも表示されるようになる。(拡張子が.scptじゃないと見えないっぽいので注意)

実行方法についてはお好みで。


使い方

Mouで適当に文書書く書く。

f:id:sandai:20120602015848p:image


文書ができたらさっきダウンロードしたスクリプトを実行。

下の画像は/Users/ユーザ名/Library/Scripts/以下にmouever.scptを置いて、http://d.hatena.ne.jp/shinya_ohtani/20091109/1257777144の設定でメニューバーから実行しようとしている例。

f:id:sandai:20120602015849p:image


実行したときに「システム環境設定」の「ユニバーサルアクセス」で「補助装置にアクセスできるようにする」にチェックが入っていない場合、それの設定を促す案内が出てくるのでチェックを入れる。これをしないとうまいこと動作しないので注意。

そうしてしばらくするとダイアログが表示される。

このダイアログの「設定」ボタンで、

  • ノートの名前
  • 投稿先のノートブック
  • タグ

を設定することができる。

f:id:sandai:20120602015850p:image


適当に設定してみた。たぶんなんとなく使えると思うのでこのあたりの詳細は省く。

f:id:sandai:20120602015851p:image


投稿が完了すると完了のダイアログが表示されるので、これで終わり。

f:id:sandai:20120602015852p:image


投稿した文書のEvernoteでの画面。デザインそのまままんもすうれぴー。

f:id:sandai:20120602015853p:image


その他細かい部分も他人が使えるレベルにはしたので実用できると思う。


デザインカスタマイズ

投稿する文書のデザインを変更したい場合。スクリプトを直接いじる必要がある。スクリプトのソースコードの上らへんに下の画像のような部分があるのでここいじればいい。

f:id:sandai:20120602015854p:image


ただ、少し癖があるというか、いくつかの構造は特別に割り当てたりしているのでそのへんの仕組みを把握しないとうまくできない。というか私自身もめんどくさくてやっつけ。

ほんとはCSSファイル読み込むだけでできるようになりゃいいなとは思うけど時間かかりそうだからやめた。ある程度限定したフォーマットなら簡単に対応できるのだろうけど。

まあ、いろいろデザイン変えたくなったらそのうちちゃんと何かやるかも。


その他のMarkdown系のアプリでも使えるようにできる

このEvernoteにきれいな文書を投稿するスクリプトはどのエディタやアプリでも簡単に対応できると思う。というかできた。

というのも、Mouより先にMarkdown ProというMacの有料アプリを買ってて、書いたスクリプトはもともとMarkdown Pro用のスクリプトだった。で、後からMouに気づいて、スクリプト書き換えたらちょろかったので簡単だなーと。たぶん他のエディタでも似たような修正を加えればいける。

そういえば私は無料で済まなかったんだけどもまあいいや。自分好みのエディタで扱える方法についてもそのうちいつか書く。


Markdown記法早見表

おまけ。これだけ覚えれば問題ないという記法を自分用にまとめてたのでそれものせておく。

Markdown記法は同じ結果を出力するのに記法が違うときがあって、その場合簡単な書き方を採用している。

見出し
markdown表示html
# 見出し1

見出し1

<h1>見出し1</h1>
## 見出し2

見出し2

<h2>見出し2</h2>
### 見出し3

見出し3

<h3>見出し3</h3>
#### 見出し4

見出し4

<h4>見出し4</h4>
##### 見出し5
見出し5
<h5>見出し5</h5>
###### 見出し6
見出し6
<h6>見出し6</h6>
段落
markdown表示html
普通の文章です

普通の文章です

<p>普通の文章です</p>

普通の文章です
普通の文章その2です

普通の文章です 普通の文章その2です

<p>普通の文章です
普通の文章その2です</p>

この文は文末に半角スペースを2つ入れています
普通の文章その2です

この文は文末に半角スペースを2つ入れています
普通の文章その2です

<p>この文は文末に半角スペースを2つ入れています<br />
普通の文章その2です</p>

文末に半角スペースを2つ入れることで改行を表現することができる。全然知らなくてずっと悩んでた。

文字装飾
markdown表示html
*イタリック体*ですイタリック体です<em>イタリック体</em>です
*太字*です太字です<strong>太字</strong>です
***イタリック体と太字***ですイタリック体と太字です<strong><em>イタリック体と太字</em><strong>です
~~打ち消し線~~です打ち消し線です<del>打ち消し線</del>です
リンクとアドレス
markdown表示html

[googleへのリンク](http://google.co.jp/)です

googleへのリンクです

<a href="http://google.co.jp/ ">googleへのリンク</a>です

メールアドレスは<example@example.com>メールアドレスはexample@example.com

メールアドレスは<a href="example@example.com">example@example.com</a>

インラインコード
markdown表示html
文章中に`<li>`といったコードを表示する目的で使用します文章中に<li>といったコードを表示する目的で使用します文章中に<code>&lt;li&gt;</code>といったコードを表示する目的で使用します
`` `バッククォート` ``の表示方法です`バッククォート`の表示方法です<code>`バッククォート`</code>の表示方法です
リスト
markdown表示html
* リスト1
    * リスト1-1
        * リスト1-1-1
    * リスト1-2
* リスト2
  • リスト1
    • リスト1-1
      • リスト1-1-1
    • リスト1-2
  • リスト2
<ul>
<li>リスト1
<ul>
<li>リスト1-1
<ul>
<li>リスト1-1-1</li>
</ul>
</li>
<li>リスト1-2</li>
</ul>
</li>
<li>リスト2</li>
</ul>
1. リスト1
    1. リスト1-1
        1. リスト1-1-1
    2. リスト1-2
2. リスト2
  1. リスト1
    1. リスト1-1
      1. リスト1-1-1
    2. リスト1-2
  2. リスト2
<ol>
<li>リスト1
<ol>
<li>リスト1-1
<ol>
<li>リスト1-1-1</li>
</ol>
</li>
<li>リスト1-2</li>
</ol>
</li>
<li>リスト2</li>
</ol>
* リスト1
    * リスト1-1
        1. リスト1-1-1
        2. リスト1-1-2
        3. リスト1-1-3
    * リスト1-2
* リスト2
  • リスト1
    • リスト1-1
      1. リスト1-1-1
      2. リスト1-1-2
      3. リスト1-1-3
    • リスト1-2
  • リスト2
<ul>
<li>リスト1
<ul>
<li>リスト1-1
<ol>
<li> リスト1-1-1</li>
<li> リスト1-1-2</li>
<li> リスト1-1-3</li>
</ol>
</li>
<li>リスト1-2</li>
</ul>
</li>
<li>リスト2</li>
</ul>

箇条書きリストについては、*の他に、

  • +
  • -

などでも利用できる。

引用
markdown表示html
> 引用された文章です
> 引用された文章です

引用された文章です 引用された文章です

<blockquote>
<p>引用された文章です
引用された文章です</p>
</blockquote>
> 引用されたこの文は文末に半角スペースが2つ入れています
> 引用された文章です

引用されたこの文は文末に半角スペースが2つ入れています
引用された文章です

<blockquote>
<p>引用されたこの文は文末に半角スペースが2つ入れています<br />
引用された文章です</p>
</blockquote>

> 引用された文章です

> 引用された文章です

引用された文章です


引用された文章です

<blockquote>
<p>引用された文章です</p>
<p>引用された文章です</p>
</blockquote>

文末に半角スペース2つ入れることで改行を表現できる。最初は気が付かないこともあると思うので注意。

整形済みテキスト
markdown表示html
    行頭にタブか4つの半角スペースが入ってます
    行を続けるときもタブか4つの半角スペースをいれます
行頭にタブか4つの半角スペースが入ってます
行を続けるときもタブか4つの半角スペースをいれます
<pre>
<code>行頭にタブか4つの半角スペースが入ってます
行を続けるときもタブか4つの半角スペースをいれます
</code>
</pre>

表示されているものはこのブログで利用しているpre要素のCSS。デフォルトでこうはならない。

画像
markdown表示html

![alt属性のテキスト](https://www.google.co.jp/images/srpr/logo3w.png)

alt属性のテキスト
※表示が大きいので手を加えて小さく表示しています

<img src="https://www.google.co.jp/images/srpr/logo3w.png" alt="alt属性のテキスト" />

境界線
markdown表示html
---
<hr>

短かくて分かりにくいが<hr>タグ。最低ハイフンを3つ並べればhrになる。3つ以上でもhrになる。

markdown表示html
タイトル1 | タイトル2
------------- | -------------
筋肉愛    | 贅肉愛
蛋白愛    | 油愛
タイトル1タイトル2
筋肉愛贅肉愛
蛋白愛油愛
<table>
<thead>
<tr>
<th>タイトル1</th>
<th>タイトル2</th>
</tr>
</thead>
<tbody>
<tr>
<td>筋肉愛</td>
<td>贅肉愛</td>
</tr>
<tr>
<td>蛋白愛</td>
<td>油愛</td>
</tr>
</tbody>
</table>

markdownはこの他にもいくつか表を作成できる記法が存在するがどれも面倒なんで使わない方がいい。そもそも表自体が作るのめんどくさい。