プログラミングを楽しもう
執筆中、とりあえずはHow To Become A Hackerでも読んでろってこと。
しばくこのページをほったらかしにしてますが、気が付いたことがあります。 別にプログラムなどのソフトウェアに限ったことではないのですが、 何かを生み出そうとするには欲望が必要だと言うことです。 随分抽象的なことになるかもしれませんが、 何かを欲したときに始めて考え出され生み出されるものが道具ではないでしょうか。
私が何も生み出せないのは欲望が無いからなのでしょうね。 しかし私は物を作り出す方法を考え付くことが出来ます。 私に必要なのは欲望を持ったパートナーでしょうかw。
C言語はUNIX OSを記述 するために、ベル研究所のD.Ritchie氏によって設計された言語です。 linuxもCによってカーネルが記述されています。 もし、linuxについてもっと知りたいと思うのならば、C言語で書かれた カーネルソースを読むことをお勧めします。
さて、linuxカーネルの ほとんどはGNUのgccを用いてコンパイルされており、 標準で使用されているのもgccといった感があります。 ですから、ここでプログラミングするのもgccを使用するものとします。
- calendar
これは下でgtk+を使ったカレンダーを作成するのに calコマンドで表示されるようなテキストを作成する必要があったので 作ったプログラムです。 思い付くままにコードを書いてるので無駄が多くエラー処理なんて付加してません。
カレンダーの作成をするのに 月始めの曜日を調べなければならない。 現在の日付と曜日が分かっている場合には
(weekday+7-(day+6)%7)%7
で求まる。 これは現在の日付は1〜7までの行列の1つにスカラー倍したものであるので 1〜7までの要素にもどす。 次に1日との差を求める。 単に6を加えて7で割ることで1日との差が求まる。
ここで求まった値と曜日のは1対1に対応しているので 求まった値を曜日に線形変換する。
そうすると現在の曜日は
現在の曜日=1日の曜日+差日
なので
1日の曜日=現在の曜日-差日
となる。 これが線形変換するための式です。 もっと簡単に
(weekday+36-day)%7
とすれば多少は速くなるかもしれない。 (ほとんど影響ないですし、逆にどういう式か忘れてしまうかもしれませんね)
GUIプログラミング
GUIに興味を持ち始めて少しばかりプログラムを作ってみようと思っています。 冒頭で述べたように何かを生み出したいと望むには始めに欲望がなければならないと 思いますので、これが欲望かどうかはともかくGUIカレンダーを作成してみようと 思います。(別にテーマがあれば欲望は要らないのですが、ここは一つ自分自身で コードを考えたGUIカレンダーが溜らなく欲しくなったとしますw。)
面倒なので機能は当該月のカレンダー表示が出来ること、そして終了ボタンがあること、この2点だけとします。
表示はcalコマンドで表示される様式と同じにしましょう。
で、何を使ってプログラムを組むかと言うと・・・ Xlib、XToolkit、gtk+、Tcl/Tk、Perl/Tk・・・ 色々ありますがgtk+を使ってみようと思います。
XToolkitでやりたいのですが参考にするソースを探すのが面倒なもので.
プログラムの簡単な流れを考える。 gtk+では(XToolkitでもそうだが)、widgetと言うものを組み合わせてアプリケーションを 表現します。
まず、widgetを使用するための準備として使用するwidgetを初期化します。
次にwidgetを部品として登録します。
必要のあるwidgetにシグナルハンドラを設定します。
シグナルが発生したときに引き渡すべきコールバック関数を設定します。
widgetを可視化します。
ループに入ってイベントが起こるのを待ちます。
特に変わったことはしてません。上でCで作成したカレンダーを tcl/tkでやるとどのように表現できるかと思ってやってみました。
現在、取り調べ中 .
これもシステムの保守などで威力を発揮するので是非やっておきたいことだ。
なんだかゴチャゴチャと偉そうに抜かしてますが、 結局のところプログラムは道具を産み出すための道具でしかなく、 本人に何かを為すために道具を渇望する気持ちと道具を作りだすアイデアが なければ中々修得することができないかもしれません。
後、ごちゃごちゃ御託をならべる書物を読むよりも 簡単なコードで良いからソースを読んで関数の使い方を覚えたほうが良いと思います。
むしろまともな処理よりもエラーの場合の処理の仕方を覚えるほうが重要になってきたりします。