Assyのリベラル文学研究所もご覧ください。

Java勉強中

作業所でJavaを勉強中

今日は、デザインの作業所でJavaの勉強をした。
今やっているデザインの仕事で、
紙面の1ページが午前中に完成したため、
次のページは来週やることにして、
午後はJavaの勉強をしていた。
デザインで使っているMacにAdoptOpenJDKを入れて、
結城浩の「Java言語プログラミングレッスン(上)」を読みながら、
九九のプログラムを打ち込んだ。

AdoptOpenJDKについて

僕の開発環境は、Mac(デザインの仕事に使っている)とAdoptOpenJDKとvi。
JDKはjavac(Javaソースコードをクラスファイルにコンパイルするコマンド)や
java(JavaVMでJavaのクラスファイルを実行するコマンド)が含まれており、
Javaの開発に必要である。
長らくSun Microsystemsによって提供されてきたJDKは無料で利用できたが、
OracleによるSunの買収に従い、方針が変わった。
Oracleは2つのJDKバージョンを保守・開発し、
一方がOracleによる公式のビルドであるOracle JDKで、
もう一方がオープンソースのOpenJDK。
Oracle JDKは長期のサポートがOracleによって受けられるが、
無償で使用できるのは個人利用に限られ、商用利用は有償となり、
ビジネスで使うためにはOracleにお金を払う必要がある。
これに対して、OpenJDKはオープンソースであり、GPLでライセンスされ、
個人利用も商用利用も関係なくフリーで利用できるが、サポート期間が短い。
新機能の追加などはOracle JDKに先立ってOpenJDKで行われる。
しかしながら、OpenJDKのコードを元にビルドされた
Oracleではない別の会社がサポートしてくれる」という
AdoptOpenJDKがあり、
IBMMicrosoftなど大きな会社がサポートしてくれる。
これはOpenJDKがGPLであるためGPLでライセンスされる。
商用利用でもフリーで利用でき、サポート期間も長い。
僕はこのAdoptOpenJDKをMacに導入した。
また、Eclipseが上手く入らなかったので、エディタにはviを使っている。
vi(vim)には、タブをスペース4文字に表示し、
タブを入力した時にスペース4文字を入力してくれる設定を.vimrcで行った。

九九のプログラム

九九のプログラムは、結城浩さんの本に書いてあったもので、
ランダムに九九の問題を10問表示し、
ユーザーはそこに答えを入力して、
正解か間違いかを表示して、
最後に正答率を表示するというものである。

時間切れ機能をつける

しかしながら、そのままでは、
何時間でも制限なく答えを考えられてしまう。
そこで、時間切れ機能をつけようと考えた。
Javaではコマンドラインでの入力をBufferedReaderオブジェクトで行うため、
時間切れ機能を使うにはBufferedReaderクラスに機能を追加する必要がある。
ここで、Javaの便利な機能、「継承」を利用する。
継承をすることで、既存のクラスに新しい機能を付け加えることができる。
まず、BufferedReaderクラスを継承した、WaitingReaderクラスを作る。
コンストラクタには、
与えられた引数をsuper()で親クラスを呼び出してそのまま与える。
WaitingReaderには、
新しいメソッドであるwaitingReadLine()メソッドを作る。
ここで、入力を待機するスレッドと、
時間切れまでスリープをを行うスレッドを分けるために、
Runnableインターフェースを実装してマルチスレッド化をする。
waitingReadLine()メソッドでは、
スレッドを作ってth.start()を実行したら、
その後にreadLine()メソッドを実行し、その結果を返す。
そしてもうひとつのスレッドであるオーバーライドしたrun()メソッドでは、
10秒間スリープして、
10秒後にまだ入力がされていなければ例外を吐くようにする。
例外の名前はTimeOverExceptionとする。
これを、main関数の方でtry - catchブロックで捕捉し、
10秒後に「時間切れです」と表示するようにすればいい。
(たぶんこれで作れるはずだが、
僕はJavaに詳しくないため間違っているかもしれない。
10秒間何も操作できずに停止したりした時は
Javaやプログラミングに無知な僕のせいである。)

Javaは素晴らしい言語

また、僕が思うに、Javaは素晴らしい言語である。
C/C++は高速で自由度が高いが、機械に近い。
逆に、Python/Rubyは遅い代わり、人間に近い。
また、C/C++は、何でも自分で作る必要があるが、
Python/Rubyは逆に整いすぎていて、
何もしなくても言語やライブラリがやってくれる。
JavaC/C++Python/Rubyの中間に位置しており、
「プログラミング学習者としてちょうどいい」のである。

メモリやストレージをカーネルとは別のもうひとつのシステムがやる

僕は、今のOSというのは、
ひとつのカーネルが主役で、
そのカーネルがメモリやストレージの管理をしているが、
これを「もうひとつのシステム」がやるようにすると面白いと思う。
すなわち、プログラムの実行は決められたメモリ位置にある
データを使って行われるが、
カーネルのCPUとは「別のCPU」があり、
そのCPUで動く「メモリ管理専用カーネル」や
「ストレージ再編成専用カーネル」があって、
プログラムを実行しているカーネルとは別に、
ほかのカーネルがメモリやストレージを
「プログラムがもっとも高速にアクセスできるように
常に整備してくれる」のである。

レジスタのログを取る

また、CPUのレジスタにログ機能を付けてみてはどうかと思う。
CPUのレジスタは一時的な領域であり、
プログラムを終了した段階で消えてしまうが、
ログ機能を作ることで、
「プログラムが過去にどんな状態であったとしても、
その過去の全ての状態を復元することができる」。
これによって、プログラムは不正終了することが「絶対になくなる」。

死んだ時に脳から記憶を取り出す

また、僕は生物学の研究として、
脳から記憶を取り出す研究をしてはどうかと思う。
たとえば、老人が死を迎える時に、
脳から記憶を取り出して、
それを別の人間に移植する。
こうすることで、記憶を「他の人にコピー」することができ、
「人間が死ぬことは実質的になくなる」のである。

パソコンは分かってしまうと面白い

パソコンについて言うと、
むしろ、「分かってしまうと面白い」ものである。
K&RJavaコードについても、
なぜそのようにするのかが分かるようになるし、
プログラムを書くのも楽しくなる。
だが、やりたくない人間には、むしろおすすめしない。
C/C++の書き方を学べば学ぶほど、
C/C++で書くことによる弊害」ばかりが分かって、
C/C++ではない別の言語で書くと、
その「C/C++には無い面白さ」が分かるのだが、
結局学べば学ぶほど、
「プログラミングがなぜ悪いのか」ということばかりが分かるからである。
しかし、そうした「手続き型による弊害の理屈」をいったん乗り越えて、
「手続き型でも関数型でも書ける」ようになった時に、
はじめて分かる「悟り」の体験があると、僕は思っている。