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-03-23

もっと早く欲しかった。Emacsの鉄板入門書は『Emacs実践入門』で間違いない

f:id:sandai:20120322220840j:image
(友情出演:買ってきたうまいキャベツ)


id:tomoyaさんこと大竹智也さんご本人から『macs実践入門ー思考を直感的にコード化し、開発を加速する』を献本していただきました。ありがとうございます。書評が遅れてすみません。ちょっと血便でわさわさしてました。


いまなら確実にEmacsは入門しやすい

確かEmacsに出会ったのは2年前。おそらく当時の私であればEmacsを誰かに使ってみたらと安易にすすめることはなかったでしょう。

酷使した両手からしたたる血によってキーボードは真っ赤にそまり、Emacs Lispの括弧プレッシャーで括弧恐怖症となってしばらくかぎ括弧しか使えなかったあの頃。ロックマンに出てくるE缶のEの文字を見るたびにビビってティウンティウンだったあの日々・・・。

そんなトラウマを経験した私がすすめするわけがないでしょう。そしてこんなことがあったなんていう事実もないでしょう。

もちろん全て嘘なのですが、とはいえ、これは他人にすすめてええもんじゃねえだろと思っていました。だってできないんだもん。難しいもん。わけが分らないんじゃもん。

しかし、いまなら、興味があるなら使ってみたらとすすめることができます。

え?なぜかって?それはきまってるよ!現在にあって過去にないものがあるじゃないか!そう、『Emacs実践入門ー思考を直感的にコード化し、開発を加速する』があるじゃないか!!



という茶番はともかく。


ありそうでなかった初学者のための体系的なEmacs入門書

Emacs関係の書籍は入門書的な位置付けの書籍が少ないです。2年前にAmazonでEmacsと検索しうなだれていた私が言うのですからきっと少ないのです。

オライリーから入門と題して出版されていますが、オライリーの入門書は入門どころのさわぎではありません。じゃあ他には・・・と探すと、だいたい古くて昔のしかない。あとはid:rubikitchさんのEmacs本が2冊(Amazon.co.jp: emacs るびきち)ほどあったりしますが入門向けではありません。

このように、ありがちな初学者のための入門書がEmacsにはしばらく存在しなかったのです。だから以前あのような記事を自分で書いたりしました。ストレスたまってたのでおかしなことなってますが。

でも私はキーバインドの基本的な操作から概念的な内容をカバーしつつ、拡張を駆使した最新のEmacs環境が手に入れられる、そんな情報がまとまったEmacs本が一冊手元に欲しかった。あればいいのになとずっと思っていた。そしたらおかしなことにならなかった。

そして、ここに至ってようやく手にすることができました。今は、私の隣でぐっすり眠ってるぜ。キャベツ食ったからな。


本書が果たす入門書としての役割

本書の強みはEmacsの管理、操作、概念、拡張機能などといった、Emacsを入門する上で必要な情報が初学者でも分かりやすいように日本語でまとまっていることだと思います。

体系化されたそれは、Emacsのヘルプとウェブを彷徨う手間や時間を短縮し、正しい知識を身につけながら効率的に学ぶことができるでしょう。最初から最後まで読み進めれば最先端とはいきませんが、実用に近い開発環境が得られるようになっていると思います。


しかしながら、本当に初めてEmacsに触れる方は途中で脱落してしまうかもしれません。

でも、それはそれで問題はありません。たぶんキーバインドや拡張あたりでうんざりすると思いますが、だいたいの人はその道を通っているはずです。みんなうんざりしたことあるはずなんです。

私もうんざりしていました。他にもよくわからない専門用語にうんざりしていたし、ミニバッファとかいう一番下の用途が分からないやつにもうんざりしていたし、scratchの英語メッセージにもうんざりしていました。今でもdefadviceにうんざりしています。ああ、どうしようもなくうんざりしかしていない。


いえ、だから、逆に言えばそこで脱落したりうんざりしたり悩んだりするのは正解で、もっといえばこれを乗り越えるのが大正解です。

キーバインドが覚えきれなければ無理して覚える必要はありません。拡張の機能が分からなければ放置してください。もし用語さえも分からなかったらそれも放置です。

ずいぶんいい加減なことを言っているように思えるかもしれませんが、これぐらい余裕を持った方がすんなり乗り越えていけると思います。

本書の強みは先程も述べたように入門に必要な情報が初学者でも分かるよう日本語でまとまっていることです。これの意味することは、つまり、全ての知識を本書に頼ってしまえば良いというわけです。

全てを覚えて何事も自分で完結させるのはもっと後にしましょう。最初の1週間や2週間、まだ足りなかったら1ヶ月は本書に全て頼ってください。きっと時間が立つごとに本を開く回数が減っていくはずです。

こういった姿勢はゆるいといえばゆるいのですが、脱落してあきらめるよりマシではないかなと思います。

対象となる読者

Emacsの情報を日々追っていてがっつり拡張している人は物足りないと感じるでしょう。そして本書もそういった人はターゲットにしていないはずです。

となると、以下のような人が当てはまるのではないでしょうか。

  • Emacsに興味があるけれどなんか難しそうだから手を出していない人
  • Emacsを使っているけれど使いこなせているのか自信がない人
  • うんざりしてEmacsとさよならしちゃったけどやっぱり気になる人

などなど。

また、本書の冒頭でもまつもとひろゆき氏が「本書に寄せて」でこのようにおっしゃっています。

本書はEmacsのインストールから便利な拡張機能の紹介まで、Emacsの初歩から中級レベルまでの知識が紹介されています。本書がより多くの人々にEmacsの可能性を提示する入口となりますように。

少なくとも中級レベルまではあるとのことなので、初学者から中級に手が届きそうな人までといったところでしょうか。私もここに含まれますので、だから、もっと早く欲しかったのです。


今までのEmacsの入門は苦行だった

Emacsは入門が最大の壁と言えます。必要な情報が多い上に操作が複雑だからです。

しかし、「難しい」かというと少し違って「どうしたらいいのかが分からない」のです。どのように操作を覚えて知識を養っていけば良いのか道筋が見えません。この道は正しいのか、遭難していないのか、ビクビクしながら山登りをしているような感覚です。

ウェブを検索すると、あるのはキーバインドの表が載っているページと、おまじないとしかおもえないような内容の.emacs閲覧会と、Page not found · GitHub Pagesとかなんかいつの間にか死んでたページしかない。

まあ死んでてもいいけど、いや、良くないけどちょっとまってくれ、とりあえず最初は何を定石として学習したらいいのか教えてくれと、そんな思いです。

もちろんいくつか入門的な記事はあります。

本書の著者もこのように記事を書いていらっしゃいます。

しかし、知識がない者からすればドットファイルってなに?からスタートです。設定ファイルを自分で書かなければいけないことに驚きで、あたふたいろいろ調べてそのうちめんどくせって脱落してしまうでしょう。

こんなのUnixの世界でバリバリ生きている人にはぬるく感じるかもしれません。

でもそういった人間だってEmacsを使ってみたい。きっかけがEmacsであっても良いはずです。

だったら入門が苦行になっていてはいけません。入口はもっとハピハピハッピー*1であるべきです。

おれが苦労したことはお前も苦労しろだなんていう現実的な社会のルールはこの世界にはいりません。これから学ぶ人はもっと確実で簡単に入門して欲しい。入口はもっと楽に通りすぎるところで、そこから先の部分で悩むエネルギーを費やすべきなのです。

だからもし、これからEmacsを使ってみようかなと興味を持っている人や、なんとなくEmacsを使っているけれどもっとEmacsを使いこなせるようになりたいと思っている人がいたら。私は、私と同じようにEmacsがインストールされたPCの隣に本書を添えることをお薦めします。

Emacs実践入門 ~思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)
4774150029

サポート

サポートページ:Emacs実践入門―思考を直感的にコード化し,開発を加速する:|技術評論社


余談

ヘルプが好き

Emacsのヘルプの扱い方を覚えるとEmacsに対する苦手意識がなくなりました。それにヘルプの見方を覚えるとLispが読みやすいです。本書のp54で紹介されているのでこれだけはぜひ覚えてください。

さらにAnythingという拡張にもっと便利にヘルプが扱えるコマンドがいくつかあるので、慣れたらそっちに移行すると良いと思います。

覚えない

キーバインドは覚えようとしないことです。一度には無理です。天才と自他ともに認めるできすぎ君ならともかく、できすぎない君は覚えられないです。めんどうですがキーバインドを忘れたらその度にEmacsのヘルプや書籍で確認しましょう。たぶん3,4回目ぐらいで覚えてるはずです。

小指について

私はネタで言っているだけなんですが痛くはなりません。でも以前にLenovoのキーボードで腱鞘炎ぽいことになったことはあります。小指関係ない。

Lispについて

EmacsにはEmacs LispというLisp処理系がありまして、これでEmacsを拡張していきます。そして拡張するには当然Emacs Lispを読んだり書いたりしなければなりませんが、読むだけなら読みやすいです。だいたい雰囲気で読めます。括弧はハイライトさせて端っこで踊ってるだけなんで気になりません。

なので、拡張を少しいじったり、ちょろっと設定を変更する程度なら誰でもできるようになるはずです。Emacs Lispをもっと本格的に学びたいのであればウェブの情報よりるびきちさんのEmacs Lispテクニックバイブルが良いかもしれません。でも最初はヘルプで事足ると思います。

エディタ戦争とか宗教論争とか

時々話題にあがりますが軽い揶揄だと思います。多くの人は「そんなことよりおれの嫁を探してくれ」といった程度です。そんな不毛な争いはこりごりで関わりたくないし、それよりもおれの嫁を寄こせというわけですがごめんなさい適当なこといいました。

でもおそらくみんな嫁は探してます。

○○さんが使ってたからとか、単純に使いやすいと聞いたからとか、上司に強制させられたからとか、嫁ができそうだからとかそういう理由でエディタは選べば良いと思います。

なので、Emacs気に入らなかったらぴぇーつってVのあれをぴゅーと使えばいいです。

だがしかし、Emacsはモテるらしい

よめさがしにEmacsはつかえるぞやろうどもうおおおよめはいねぇがあ。


感謝

以前にVimっぽい本をくれといったらEmacs本を手に入れました。ツンデレ戦法が良かったのかもしれません。

少し言い訳をすると技評さんに対してなんかくれとふざけていったのであってご本人様ではないのですが、いずれにしても乞食的な悪態であるのにも関わらず、id:tomoyaさんのご好意によって自筆のお手紙と共に献本を頂戴しました。ありがとうございました。

普段は自分で買ったチロルチョコさえも小さい子どもに絶対に譲らず、0歳時の子供に対して高橋名人並の連射をもってほっぺをぷるんぷるんし、その子の使用済み紙おむつ片手にあひゃひゃひゃと腐ったみかんの大人共に制裁(うんこ)を下す悪童な私ではありますが、ここに態度を改めることに致します。

というわけで、感謝の気持ちと誠意を込めて書評?といえるか分かりませんがレビューさせていただきました。




じゃあ、さあ、Vimっぽいのくれ。

おわりw

2011-11-05

WEB+DB PRESS 総集編 [Vol.1~60]のPDFサイズがでか過ぎたからAutomatorとAppleScript使って圧縮した

でかすぎる。どうすればいいのかもふもふ調べていたら、

という記事を発見。これは素晴らしい。


MacだとAutomatorなるものを使えばPDFの画像を圧縮することが可能なようです。

で、そのサービスなのですが、上記のURLの文章中にあるんでありがたくダウンロードさせていただきまして。Automatorにサービスを登録します。登録方法については以下のURLをご覧ください。とはいえまあ普通に保存するだけです。

で、サービスを登録するとPDF選択時のコンテキストメニューから利用できるようになります。さっそくコンテキストメニューからサービスを実行してみたところ、

    • webdb_sp_vol01-24.pdf
    • 58.2MB→12.7MB
    • 78%減

よくやった。

で、他のファイルでもいくつかやってみたところだいたい約30〜60%減が最低ラインですね。画像が少ないとこんなもんでしょう。画像部分についてはiPhoneで確認したところ細かい文字も読むことができました。

ちなみにプレビュー.appで保存時にQuartz フィルタのReduce File Typeを使っても圧縮できるようですが、それだとやっぱり細かい文字はつぶれて読めませんでした。圧縮したときのサイズは上と同じファイルで9.7MBでした。


そういうわけでいざ全部圧縮しようと思ったらエラー。何がいけないのか分からんので、先ほどのワークフローを一部引用しつつ自分でアレンジしてみた。

  • 変更箇所
    • 1度に圧縮せずに1つ1つ圧縮するようにした
      • メモリが圧迫されるのでどうにかなるかと思ったらどうにもならずメモリパンパン意味なし。プロセスぷっつんしかないんかな。この辺の知識まったくない
      • 1つ1つの処理はループ使ってる。実はこれはAutomatorだとかなりやり辛い。Automatorのループは終了時の条件は制限があってこちらのタイミングで終わらすことができない。◯◯分後に停止ってのと、◯◯回で停止としてしか決定できない。あらかじめループ回数が決まってないと使えないという...。よって今回はプロセスぷっつんしたというゴリ押し
      • どうやらAutomator RunnerとAutomator Launcherがサービスを実行しているらしい。他にもなんかみかけたけどとりあえずまあいいや
    • オリジナルとサイズ比較して軽い方を残している
      • 圧縮したからといって軽くなるとは限らないので

そんなわけでワークフローは結局書いた意味がほぼなかったので公開しませんが、AppleScriptからシェルスクリプト実行のくだりだけ。

tell application "Finder"
    set len to length of (selection as list)
    if len = 0 then
        delay 3
        display dialog "圧縮作業が終了しました"
        do shell script "pids=(`ps -ef | grep -e'[A]utomator Runner' -e'[A]utomator Launcher'| awk  '{print $2}'`);for pid in ${pids[*]};do kill -9 ${pid};done"
    end if
end tell

こうやって実行できるAppleScriptすばらしい。


そんなわけで最終的にどうなったかというと、

2.85GB→1.97GB

となりました。約30%減。伸び悩んでます。まだ大きいです。テキストだけ抽出するというのはちょっと違いますからね...。このあたりで我慢するしかないかな。


AppleSctipt面白い

AppleScriptはシェルスクリプトも実行できるから便利。さらにtell application "System Events"でGUIのアプリも操作できるようで。正規表現が無いのが辛いけどperlやrubyやpythonで扱えるっぽい。詳しくは読んでないけど検索でひっかかってた気がする。

また、AutomatorもAppleScriptやシェルスクリプトを実行することができる。ループと変数が使いやすくなったら誰でも良いプログラミングできそう。

2011-09-30

パーフェクトJavaScriptはガチ本。クソと言われる言語仕様をまとめあげた良書

執筆した井上誠一郎氏ら共著者に敬服。お疲れさまでした。

パーフェクトJavaScript (PERFECT SERIES 4)
477414813X

言語仕様のpart2(2〜7章)まで読みました。その後はパラパラっと流し読み。まずは言語仕様までの内容について雑感を述べます。


JSには既にサイ本と呼ばれるバイブルが存在しますが、サイ本は「仕様を淡々と解説している本」といった印象を持っています。対してパーフェクトJavaScriptは「仕様における用語を整理し、分かりやすくまとめて解説している本」といった印象でした。そして表紙がダサいです。ガラケーがのってます。サイ本に対してガラケー本といったところでしょうか。・・・って不名誉な名称だからやめとこうと思いましたが、パーフェクトJavaScriptと長いのでやっぱり使います。


対象読者

入門書ではないと「はじめに」で言い切っています。対象読者についてもそのページで言及されていますが、

  • JSの入門書を読んだことがあって、よりJSの本質を知りたい人
  • JSを触っているけれど知識があやふやで不安な人
  • 他言語の知識を元になんとなくJSを触っている人
  • JSができれば勝つると思っている人

などが対象とされています。あとJavaと比較しているケースがいくつか見られますので、Javaと共に毎日を地獄の輪舞曲してる人は読みやすいかも。


それから、プログラミング未経験者でもわかるつもりで書いたと述べられていますが、個人的にはおすすめしません。

誰もがそういうわけではないのではっきりいえませんが、とはいえ、私なら未経験で読んだら挫折します。たぶん「詳しすぎて情報が多い」とか方向性のおかしいこと思っちゃいます。自分のふがいなさに頭抱えます。たぶん。

しかし、この1冊で質のよい体系的な知識を身につけられると思うので、入門書の次の次ぐらいに必読書としておすすめしたいです。あるいは、未経験者であればJSをやめてPythonをおすすめします。むしろPythonが良いです。そうだ、Pythonの話をしよう。

Pythonをプログラミング初心者にすすめたい1000の理由

1〜999省略。

1000個目の理由→結局のところ私はPythonが好きだから

話し戻す

言語経験者はどうなのかというと、入門書は表面的で内容が薄いから読みたくない、かといって日本語訳のサイ本5版みたいにびっちりな文章も嫌だという人にはちょうど良いかと思います。


言語仕様(Part2)の概要

簡単に言うと日本語訳のサイ本5版における言語仕様の内容をスリムにしてまとめたといったところ。JSの言語仕様にあたるEcmaScript 3(ES3)からEcmaScript 5(ES5)を体系的に解説がなされています。今までのJSとこれからのJSにおける言語仕様が述べられているわけですね。

この手の言語仕様を解説しているJS本はだいたいES3が中心です。しかも、サイ本をのぞくとほぼ入門書に偏るはずです。入門書は売りやすいですからね。でも入門書は言語仕様というか「こんなのがあるよ、あんなことができるよ」みたいなとにかくやってみれ的な内容ばかりなので、経験者はそういった本は読みたくないはず。知りたいことはもっとつっこんだ部分でしょう。

そういった書籍が出回っているなかで、ガラケー本はES3だけではなく、ES5も含めた仕様を体系的にまとめて解説した書籍です。他の書籍と比べると立ち位置的にも貴重ですし、ES5も含めた言語仕様の解説をしている書籍は日本語で初かもしれません。外国語であればサイ本6版がありますけど。というかそれ以外にありそうですけど。


本書はES3とES5をなるべく忠実に解説するため用語に配慮しつつ、それぞれ分かりやすいようにまとめられていると思われます。さらに関連する定石的なテクニックも細かく記述されているので、たとえば配列のコピーであるとか、型変換の方法など地味に重要なのに入門書が全くカバーしてない部分をおさえているのが良いです。

もう少しつっこんだテクニックはオライリーから出てるいくつかの書籍を読むことになると思いますが、ガラケー本でも基本的な部分は把握できるので十分かなと。

このように内容についてはサイ本をスリムに読みやすくしたものと言えます。入門書とか指南書ではなく、小奇麗に仕様書を解説している感じ。


サイ本5版との比較

比較するとなるとサイ本と同じ系統なので、日本語訳のサイ本5版になります。ただし、言語仕様の部分だけです。クライアントサイドについてはまた違いますので。

情報量に関してはサイ本が多いと思いますが、サンプルコードと文章に偏りがあって、あるページにはみっちり文章だけでコードが1つも出てこないっといったページがあったと思います。「そこはコードで説明してくれよ」って何度も思った覚えがありますね。

それから専門用語が矢のごとく飛んできます。これは言語覚えたての人であればきつい。用語とは意味や概念を含む重要なものなので、このように読者に依存する文章だと用語に対する前提知識が無ければ置いてけぼりになるでしょう。

それに気づかないと、理解した気にる現象が起きます。困ります。


ガラケー本でも用語については入門書ではないためそういった傾向は見受けられますが、バランスよく文章とサンプルコードが記述されているのでそこがサイ本と違って良い部分ですね。

仕様についてはサイ本は忠実です。そして、ガラケー本も仕様を忠実に伝えようという著者の意思が感じれられました。

だいたいの書籍だと伝わりやすさを優先するため、独自の用語を用意したり便宜的な用語を利用することが見受けられるのですが、本書ではそういった場合に注意書きがなされていますので、本質にそった知識を得ることができるのではないでしょうか。


それから、どうもサイ本を参考にしてる部分がいくつか見受けられるような気がします。憶測ですけど。

たとえば、コアオブジェクトにたいしてもクラスといった表現(実際はオブジェクトであるという前提を書いて)を選択しています。

JSを扱っている人からするとクラスだどう!?とムッとするようなことかもしれませんが、サイ本でもArrayクラスとか書いてたりしてるんで(これもオブジェクトであるみたいなことはいってたと思うけど)、そこら辺に合わせたのかなあと思います。


既存のJS書籍との大きな違い

2つ挙げます。

  • JSにおける基本をほぼまとめている
    • 言語仕様におけるそれぞれの要素で基本的なテクニックと、はまりどころや注意点など一緒にまとまっている。基本ならこの1冊でほぼ事たる
  • 用語を整理している
    • ものすごく大事

特に用語は大切。技術本において用語は軽視されている印象が強いです。入門書でも平気でオブジェクトという言葉が突然使われているケースもあります。

それが悪いわけではありませんが、たとえば、オブジェクトという言葉は文脈によって違う意味合いを持ちます。インスタンスとしてのオブジェクトなのか、連想配列としてのオブジェクトなのか、あるいは関数のオブジェクトなのか。

実体であるという根本的な概念は同じなので抽象的に表記しても問題ありませんが、表面的な操作が異なりますので、そこを読者が最初から区別できるかが微妙なんですね。

なので、こういった言葉は入門的な内容であればあるほど丁寧に扱わなければなりません。前後の文脈を読む知識がないと言葉のイメージが頭に思い浮かばないからです。


そんなの知るかよ勝手に判断できるようになれよと思っちゃうものですが、学術的価値はともかく用語を整理することは後発の学習者にとって大事です。

これからの人たちの学習経路のために、そういった知識のゆれを取り除き従来よりもスムーズに学習できるようになるためにです。

このような意味で本書は既存のJS書籍から頭ひとつ抜けています。それほど細く徹底して用語に敏感でした。すばらしいです。ひとつひとつの用語をイチから解説するような入門レベルではないのであれですが、入門してから次のステップに本書は最適です。


読んでガッカリしそうな人

求めていることは人それぞれ違うから仕方がない。いくつか想像して挙げてみます。

  • 新しいこと、先進的なことを求めている人
    • 既にES5まで手を広げている人には言語仕様のPartは新しい発見はそうないと思う。クライアントサイドのPartは別だけど
  • プログラミングの入門的なことを期待している人
    • 私がプログラミング未経験者のとき読んだたらたぶんガラケー本をジャイアントスイングして室伏シャウトする
    • まったくの主観だからあれだけどサンプルコードで意味は理解できても用語が難しい。用語気にならねえよって人はいけるけど、そもそも本書における言語仕様のPartの役割は概念と用語を正確に結びつけるためのものだと思う
  • JSをある程度理解している人
    • 冗長だと感じるかも。文章はいいからコードで説明しろよって思っちゃう人とか
    • でも知識が断片的であったり不安を覚えている人で、正しい概念とその用語を習得したいってときには便利
  • 何か1つアプリを作ることを期待している人
    • 得た知識によってアプリを作ることはできるかもしれないけれど、イチから作り方を指導してくれるものではないです
  • 文章読みたくない人
    • 言語経験者なら最速文法マスターみたいな記事で十分ですが、本書はそういった操作だけじゃなくて、本質的な概念を理解しようってスタンスの書籍なんですね。サイ本以外だとそういうの見かけていないので貴重
  • good partsやJSパターンのような内容を期待している人(※追記)
    • 言語仕様のPartはそういうものじゃないです。それらのテクニックの基礎となる文法とか概念とかです
  • Opera最強伝説人(※追記)
    • そういえば対象になかたよ。でも知ってる。最強だよ
  • ES3とES5の区別をしたい人(※追記)
    • これは区別してなかったような気がする。でも本書はする必要もないと思う
  • お嫁さんor旦那さんが欲しい人
    • Pythonをおすすめします

7章以降について

実践的な内容に入っていきます。言語仕様に興味がない人はここが気になると思いますが。

パラパラっと読んだ限りでは細かいところまで言及されており、まとまっている印象を受けました。というかHTML5やNode(node.js)は私が知らないことばっかりだったのでありがたいです。適当に箇条で感想書きます。

  • DOM
    • 基本は抑えられているので十分かと。Selectors APIやElement Traversal APIなども紹介されてる
  • Event
    • Level 2やLevel 3を表としてカテゴリ別にまとめてある。イベントドリブンなのだからイベント大事。でもだいたいさらっと流すことが多い書籍ばかりでいつもげんなりしてたけど、本書ではそんなことないのでよかった。仕様書がWebに云々ではなくこうして書籍でまとめているという点が重要
    • ついでに独自実装のイベントサポート表とか→Events in JavaScript
    • ついでに仕様→Document Object Model EventsUI Events
  • スタイル
    • 著者がこの分野は重要性が無いと判断したのかあっさり。JSでCSSをこねくり回すことはそうやらないからこれぐらいで十分なのでしょう
    • JSによるCSS周りの操作は羽田野さんの標準DOMスクリプティング JavaScript+DOMによるWebアプリデザインの基礎 がおすすめ。CSS周りに関しては実践的に扱わない知識かもしれないのと、結局私は使う機会がないのでほぼ忘れたw
    • 関係ないけど山田 祥寛さんと羽田野 太巳さんの書籍なかったら私は腐ってました。感謝してます
  • AJax
    • iframeハックやpostMessageまで記述されていたので、スタイルと違って置きにいった感じしますな。この辺は名前程度の知識しかないので個人的にありがたい
  • ライブラリ
    • jQueryの解説。Deferredが扱われていたのでこの辺すっぽかしている私としてはうれしいけれど、全体的には流して紹介しているといった具合。普段から扱っている人はつまんねっていうレベルかも。既存の書籍がいくつかあるから本書ではこれぐらいでいいかとは思う

ここからHTML5に関連する内容とWeb APIとNodeといった流れ。

HTML5についてはバズワード化してんじゃねえかと言及しています。W3Cがあの状態だしどうやって扱えばいいか困ったものですが。

WebSocketやHTML Canvas 2D ContextやWeb Workersなども同じ文脈で語られていていますし、それがHTML5であるというのが一般的?になっちゃってるような風潮でもありますからね。

それにこんなLogoがあるし・・・。それぞれ何を意味してるか図を見ても私はわからないです。

HTML5 Powered with Connectivity / Realtime, CSS3 / Styling, Device Access, Graphics, 3D & Effects, Multimedia, Performance & Integration, Semantics, and Offline & Storage

ガラケー本ではHTML5の定義について配慮しつつ以下のように扱うことにしています。

最近ではネイティブアプリケーションでできることをブラウザ上で実現するための機能拡張が非常に盛んで、本書ではこれらのブラウザ機能拡張をまとめてHTML5と呼んでいます。

こうする方が言葉を扱いやすいので普通だと思いますが、正しい定義についてこちらのスライドで学習しておくといいかも。

自分もHTML5の文脈でCSS3だのCanvasだのひどいこと言ってたりするし、それが楽だったりしてあれなのですが気をつけたいです。残りのWeb APIとNodeについてはほとんど触ったことがないのでなんとも言えません。これを機会に学習させていただきます。


というわけで後半はJS関連の要所を網羅した感じ。Nodeの章は気合入ってる気がした。


さいご

そんなわけで、ガラケー本は用語を整理しているという点で私は後発の人間にとって良書だと思っているんですが、この界隈だと一般的にはそういった部分は重視していない風潮も分かってます。

特にプログラマの人はそういったことが気にならないのでしょうし、そこに価値なんてないと思われているかもしれません。私はあると思ってるんですけど、そう思う気持ちがわからないわけではないです。

少数派かもしれませんが、言葉に含まれる意味や概念を突き詰めてしまうという人であれば、ガラケー本は良書であると感じられるでしょう。逆にそんなのどうでもいいしコードで全部分かる、という人であれば損をした気分になるかもしれません。


私が読んだ限りでは、言語仕様のPartのターゲットは、

  • 他言語の経験者で、これからJSを触ろうと思っている人
  • 仕様に忠実な意味や概念を求めている人
  • 自分の知識に不安な人

といった方々に絞られそうです。プログラミング未経験者は除いておきます。


用語を徹底して整理しているという部分に焦点を当てるとプログラミング未経験者でも大丈夫かなと思う反面、たとえば、ガラケー本では丁寧にリテラル表記という用語の意味を解説してくださっている節があるのですが、はたしてリテラル表記という用語を未経験者がその解説で理解できるのか疑問に思います。

これは解説そのものが悪いと言いたいのではなくて。

たとえば、具体的な日常において文字や数字と言われる対象を目視した瞬間、その1次元で表現されたものにたいして無意識に意味を求めるクセがついてますよね。

AとかBとか0といったものを見たら反射的に意味を持った文字や数字として認識してしまうため、これらは単に点や線の集合に意味付けされた記号であると抽象的に捉える機会があまりないでしょう。


もちろん日常でそんなことを毎回意識していたら面倒なんですけど、そういった抽象的思考を、ある意味人間としてはごく自然な思考を現代はぶっとばして生きているので、リテラル表記の解説にしても、varという言語規則もval0という識別子も'foo'という文字列も、テキストエディタ上において全て「文字列」としてしか認識できないのではないかなと。

もしそうであるならば、じゃあリテラルってなんだよ、実行時にその値のまま意味を持つものってなんだよと混乱してしまわないかと思うわけですが。


しかしながら、このように未経験者が認識しなければプログラミングできないのかといえば別にそうでもなくて、もしかしたらすんなり受け入れられるかもしれないし、そもそもわからないならスルーしちゃってもだいたい問題のないことだろうし、それなら私は一体何を考えていたのだろうと切なくなってきたので終わり・・・(´・ω・`)

とりあえず良い書籍が良いタイミングで出てきたのではないかなと思っております。

著者の方々の意思を正しく解釈できていないかもしれませんが、私なりに思ったことを書いた次第です。技術的な面での評価はそもそもできる知識がないんで見逃してください。こういう性分みたいです。私は。残念ながら。

それでは、おつかれさまでした。識者の方々の評価がどうか分かりませんが、私にとってはとても素晴らしい書籍でございます。うれしかったです。もっと早く出会っていたかったなと思う次第でございました。