以前まではXlibを使ったGUIアプリケーションを作っていました。
何故GTKやQTではなくXlibだったのかというと、XWindowシステムのプロトコルについての理解をする為でした。単に線を引いたり、円を描いたり、文字列を映したり、ただそれだけのことをするのにもXlibではちょっと面倒くさいくらいコードを書かなくてはなりません。
しかし低水準であるがゆえに、Xプロトコルを生に体感することが出来ます。

Xサーバーとのコネクト
ウィンドウの生成
ウィンドウのマッピング
グラフィックコンテキストの取得
グラフィックコンテキストを使った描画処理
受信するイベントの指定
イベントを受け取った後の処理

ざっと思いついたのはこれぐらい。他にもあったかな?

最近はXlibとOSS(Open Sound System)APIを使ってピアノを作っていました。

流れとしては以下のもの

1 鍵盤のウィンドウを生成する(1オクターブ分)

2 マウスクリックのイベントを受信するようにする。

3 マウスクリックのイベントが発生する。

4 イベントが発生したウィンドウ(鍵盤)はどれ?

5 押された鍵盤に合わせて、特定の周波数を自分で作ったsound関数に投げる
  ラならば440を引数に渡す

6 sound関数の内部処理としては、openシステムコールでデバイスファイルをオープンする
  ioctlシステムコールでサウンドデバイスファイルの受け取る値のフォーマットを再定義する。
  符号付き、符号なしの16bitとか。
  そしてサンプリング周波数(1秒間で何度値を取得するか)の指定
  内部では、音を出力する時間×16bit×サンプリング周波数分のバッファーを用意して
  周波数が渡されて来たらsin関数を使ってサイン波を表現し、サンプリング周波数の一瞬一瞬の
  サイン波の値×16bitの表現できる最大値
  をすることで、16bitの振幅の波が生成され、値を随時デバイスファイルにwriteしていきます。
  これによってスピーカーを通して、音が出力されます。

とりあえず、こういうのをメインループで回しとけば簡易ピアノの出来上がりというわけです。

とまぁ作ったはいいけど、実はこれ問題点だらけ。

1 まず一つの音を出している間、他の処理が出来ません。

2 和音が出せません。

3 僕の作った波形は純音の波形というもので波形がすごくきれい。ホントの楽器は波形が若干歪ん   でいます。要はピアノの音が出せない。

1の問題に関してはforkを使うなりしたらいいのではないかーと思うんですけど、改善には至っていません。その他の問題に関してはあきらめ気味。プログラムで音を作るんじゃなくて、直接音源拾ってきて再生する方が現実的かもね。


とまぁ、こんなプログラムを作っていたのですが。

僕の研究はピアノを作ることが目的ではなく、空間映像に適したインタラクションシステムの開発なのです。空中に浮遊した映像を操作するというシステムのことなのですが
Xlibで二次元図形を作ってちまちま操作するのはどうもかっこわるいし、しかもせっかくの空間映像を
生かしきれてない。

せっかくだから三次元図形を操作するアプリケーションにした方がかっこいいよね?
というわけでOpenGLの登場というわけです。

OpenGLはシリコングラフィックス社の主導で開発された、ハードウェアやOSに依存しないグラフィックライブラリです

これは図形表示機能を持つコンピュータのグラフィックス・ハードウェアを、ソフトウェアで制御するために使います。三次元図形の表示に高い性能と機能を発揮します。

つまりこれさえあれば、3Dの空中映像を触って操作出来るようになるわけです。

とまぁOpenGLに行き着いた経緯はここまで。

今はボチボチプログラム作ってるとこなので、完成したらまた報告するかもね。
サーバーとかandroidとかで人気があるjavaの話なんだけどー
なんであんなに人気があるんだろーね?

一般にjavaっていうとー、マルチプラットホームだとかオブジェクト指向だーっていうじゃん。

マルチプラットホームなのはさっき書いた、コンパイル後のjavaバイトコードが各プラットホームにのっかってるJavaVMでアセンブラに変換されるからーって話で、
結局JavaVMさえ入っていればどのアーキでコンパイルしようが、関係ないよね。
確かにすげーよな。


んでオブジェクト指向がなにかーって話になるんだけど。
オレもよく知らなくてコード書いてたんだよね。

クラスだー、とか、インスタンスだーとかメソッドだーとか
まぁこんな程度のもの。

もっとオブジェクト指向の神髄に迫ったほうがいいよね。

っていうことで、オブジェクト指向の話。

オブジェクト指向っていうとね
ウィキペディアによると、

「相互にメッセージを送り合うオブジェクトの集まりとしてプログラムを構成する技法」

ってのってんの。

これって、オブジェクトのレシーバとかメッセンジャーのことをいってんのかねー?

ちなみにオブジェクト指向というと

三大要素として

カプセル化
継承
ポリモフィズム

の3つがよく挙げられるよね。

んで、ちょっとソース書きながら次回からこの三大機能に詳しく迫ってみることにします。

言語はオブジェクト指向言語ってことでjavaとrubyでやっていこうかね
他の言語でやってーっていう要望とかあれば、それでもやってみるよー

じゃあ今日はここまで
個人的にrubyでコードを書く機会があって、バイトコードが処理されるまでの流れが気になったので
かなーり浅いレベルで探ってみました。

私の研究や開発では主にC言語でコーディングしているんですが、
(私の場合主にOSS APIやXlibなど低水準なものを使ったプログラム)

C言語の場合、コンパイルで字句解析と構文解析を経たあとにアセンブラに変換されそのバイトコードがロードされるという大まかな流れになっています。

javaの場合なら、コンパイル後javaバイトコードに変換され、それをロード、java仮想マシンを介してアセンブラ化して命令を渡すという流れ。(HotSpotとかネイティブに変換する機能もあるけど)

じゃあインタプリタ言語はなんぞ?っていうのが今回の疑問。

インタプリタ言語で代表的というか有名なのはPHPやPython,Perl,Ruby、だと思われます。
個人的にもそれらしか触ったことないっす。

インタプリタっていうとコンパイルと対照的なもので、実行するときに毎回アセンブラに変換して命令を飛ばすことになるんだけど、Rubyの場合の大まかな流れは、ソースをルーチンを介して構文木に変換(よう構造体のツリー構造ね)して、それを更にインタプリタのルーチンでアセンブリして命令を渡すという流れみたい。

普段何気なくRubyで書いてたりするけど、けっこういろいろやってんだなーって思った。
Pythonも同じ流れになってんのかな?どっちも同じオブジェクト指向スクリプト言語だし、
似てるとこ多いからやってることは同じだと思うんだけどねー

当方プロではないので、間違いがあっても責任とらんぜよ。

とりあえず、軽く調べただけだから、間違いとかあったら指摘してくださいな。