久しぶりにゆっくりと寝た。11時頃まで。
午後からはレポートと卒研中間発表の前刷りとスライド作成。結局、スライドを作るツールとして MagicPoint を使うことにした。これなら Tgif で作成した図や pLaTeX の数式が簡単に取り込める。卒論と同時に進行させることができるので、かなり便利。
デフォルトのスタイルが黒背景に白前景というのも素晴らしい。暗い場所で明るすぎるスライドを見ると、目が疲れる。あまりごてごてした装飾も嫌いだ。特にアニメーションは。
それなりに時間があったので、ノートパソコンへ ALSA をインストールしてみることにした。何しろデフォルトのままではまともに音が出ない。
ちょっと検索してみたら、Vine Linux の Wiki に全部載っているではないか。早速試してみる。
成功。
そして、ついでに MPlayer も入れてみる。以下のサイトが参考になった。
付け加えるなら、gmplayer &
コマンドでの起動に注意が必要。& をつけると何故かまともに起動しないのだ。WindowMaker 固有の問題なのかもしれない。解決法は、メニューに登録してしまうこと。そこから立ち上げれば問題なく起動する。
これで、家に帰っても DVD を観れる。わくわく。
ようやく DOM Tetris を 1.3 にバージョンアップ。
キーの連続入力を実装。しかしこれ、keydown
ではなく keypress
を使えばよかっただけと思いたかった。だが違った。
Gecko にしろ Opera にしろ、keypress
イベントの keyCode
で取得できるのはアルファベットや記号に対応したキー以外。つまり方向キーや Enter だけ。
なので keydown
と keyup
、それに setTimeout
を活用。何とか自前で連続入力を実装している。
昨日気付いたのだが、DOM Level2 Event にはキー入力系の仕様が定義されていない。マウスだけ。キー入力も定義すればいいのにと思った。
スタイル「Space」の擬似フレーム実装を position : absolute
と overflow : auto
の混合方式に一本化した。これは、rv:1.8 相当の Gecko でマウスホイールによる overflow : auto
時のスクロールが可能になったことを踏まえての変更。確かに表現の自由度が減る(縦幅にパーセンテージしか指定できないとは何たることか!)実装方法ではあるが、現状の「Space」デザインには問題にならないと考えを改めた。
それに、前の擬似フレーム実装は position : fixed
を使うものだが、この方法、Gecko ではスクロールするとかなりの CPU 負荷を与える。私のノートパソコンではあまりにも処理が重すぎて、まともにスクロールができなかった。Opera でさえその状況は同様。方法は最良なのに、実装は最悪。それが現実だった。
何にしても、理想と現実にはギャップがある。……それは嫌というほど学校で味わされた。
例えばステッピングモータ。私はこいつを制御する必要に迫られ、A-D コンバータを使いパソコンからパルスを送出、回転させることとなった。
しかし、周波数を大きくすると(つまり周期を短くすると)モータが回転しなくなる。何故か?
それも当然のことで、ステッピングモータにはあらかじめ限界応答周波数(正式名称は忘れた)があり、それ以上の周波数でパルスを送出してもそれはパルスとして認識されず、つまりは制御ができないということだった。
この物理的限界は、おのずと応答速度・角速度の限界も内包している。応答が鈍いということは制御にとって致命的だ。どう足掻いても、物理的限界による壁を突破する方法がないのだから。高価なサーボモータの購入など夢のまた夢。結局何とかステッピングモータを操って、4年次の「創造設計」を完了した。
とはいうものの、ソフトウェアはハードウェアよりも、文字通り柔軟な部分がある(勿論ソフトウェアならではの限界も存在する)。人工言語で何かを創るとき、その組み合わせ如何によっては素晴らしいものができあがる。CSS は私に、泥臭い現実と素晴らしい実装とあいまった時の表現力を教えてくれた。
結局、理想と現実は違う。でも、それをすり合せることが技術屋の仕事であり、それがまた面白いことも確か(但し、機械いじりは嫌い)。これ、真面目にそう思う。
卒研の中間発表が近い。そろそろ講演原稿を作らなければならない。
そこで問題になるのがプレゼン用スライドを何で作るか。今のところ次のような選択肢がある。
え? MS Office の PowerPoint? 却下。だって持ってないし。
今のところ最有力候補は pLaTeX。卒研の先生が講義スライドの作成用に便利ツールを作ったらしいので、それを使わせてもらえばいい。
でも、就職後は PowerPoint を使わされるのだろう。何しろ研修課題の仕様書が MS Word ファイルで、しかもファイル名日本語。当然といえば当然か。故人的には TeX と長くつきあっていきたいのだが……。
休みの暇な時間を使って DOM Tetris を 1.2 にアップグレード。
一番メインの追加機能はプレイ時間の表示。勿論ポーズをかければカウントアップも停止する。その他細々とした修正も加えてある。
さてさて、次は何を実装するか。
映画「TRON」を観る。
1982年に公開されたこの映画は、当時まだ珍しかった CG をフル活用した代物。ストーリーこそ単純すぎてあくびが出るものの、その映像は今なお観るに耐えるものだ。
プログラムを擬人化しているという点で SF と呼ぶには抵抗のあるものになっているが、まあ軽いノリで受け流せばいいだけの話。とはいえ博士が物質をデジタル化する云々と蘊蓄を垂れる場面では思わず爆笑してしまった。
プロットはボロボロ、ストーリーは陳腐、しかし映像は秀逸。そんな映画。
いつの間にか出ていたので再び入れ換え。日本語版がなかったので RC1 の言語パックを残しておいた。特に目だった変更は見当たらない。
そして DOM Tetris を 1.1 にバージョンアップ。ブロックの加速機能を追加。
ようやく週末。レポートが溜っているので仕上げなければ……。
自作のテトリスクローン、DOM Tetris をやっと公開。ページの構築などに手間取った。
DOM / JavaScript / XHTML / CSS によるアプリケーション。Firefox、Opera、IE に対応。多分 KHTML でもオッケー。
体裁は全て CSS ファイルによるもの(JSSS 未使用)なので、スタイルチェンジが簡単にできるのが特徴。
殆どがオリジナルのコード。ただ、ブロックのデータ構造は SVG Tetris のものを少し改変して使用。ライセンスが明示されていなかったのでどうなのだろうかとも思ったが、とりあえず現状はそのまま。問題があれば別のデータ構造にする。
実装していない機能があるものの、遊べることは遊べるので公開。もしバグを見つけたり要望があれば、ソースコードにある注意事項を読んでからお知らせを。気力があれば対応する予定。
話題だったので DVD 借りて観てみたら。なかなかどうして面白いじゃないか。背景に力入れてるのはさることながら、その設定がまた何というか無茶苦茶。
だって神様で中学生。なんだこれは。
ゆっくりとコーヒーでも飲みながら観ることができる。最近観てた他のアニメや映画はコーヒーを飲んでいるどころじゃないものばかりだった。「ビッグオー」とか、「時計じかけのオレンジ」とか。
「かみちゅ!」は、DVD のオーディオコメンタリがまた面白い。一応技術的な面の話もあるのだが、かなり脱線しやすく、最早関係者の掛け合い漫才状態。2巻、3巻は声優陣も参戦してもう何だこれはと。一度で二度おいしい気分。
で、そのコメンタリで言っていて気付いたのだが、この作品の監督、「R.O.D.」の監督だった。2話から入ってくるオープニングのスタイルはどこかで見たことあるなと思っていたら……。「R.O.D.」の時と同じアニメータを引っ張ってきてお願いしたらしい。
更に、1話のコメンタリでいきなり「隠れキャラ」という話があったので何なんだそれはと画面を注視してみると。いましたよ。読子が。黒淵眼鏡に黒のロングヘア。本を読んでいる。間違いない。ものすごい仏頂面だけれども。
今月にも4巻が出るようだ。愉しみに待つとしよう。
テトリスは Web 公開用スタイルの構築にもう少し時間がかかる。二、三日だと思うが。
今日は高専祭準備日なので殆ど休みと同一。よって点呼を済ませ準備に顔を出し、それから本屋へ。そして予約。
テトリスプログラムは、高専祭の後にこのサイトで公開する予定。
早速入れ換え。今回は日本語版も同時リリースのようだ。
それよりも、今はテトリスの作成で忙しい。ぶっちゃけ今日の1、2時限もサボってシコシコとプログラムを書いていた。
ようやく昨日ブロックの回転を実装した。その時重宝したのが JavaScript の Array
オブジェクトに関する仕様。
Array
オブジェクトは定義されていないアイテムを参照した場合、undefined
を返す。以下のプログラムはその実例。
var arr = ["define"]; alert(arr[1]);
出力は undefined となる。
テトリスのマス目は、2次元配列 cell[y][x]
で表現されている。y は行方向、x は列方向。
ブロックは cell[y][x]
上のアイテムに描写する。
さて、ここでマス目の「境界」をどうやって判別するかについて考える。そうすると、先程の Array
オブジェクトの性質が役に立つ。つまり、値として undefined
を返したらそこはもうマス目の境界外。そこに描写してはならないので、つまり移動・回転してはならない。
それを判別するメソッドを書いて、一件落着という具合。移動・回転してはならない場合はメソッドが true
を返すので、if
で return
させればいい。
今日は時間軸処理をもっと煮詰める予定。
高専祭まで、残り4日。
今週土曜日と来週日曜日にかけて行われる文化祭(高専祭)の展示物として、プログラムを作成することになった。というか現在実装中。
色々あって、テトリスになってしまった。
しかも、DOM と JavaScript と XHTML と CSS の組み合わせで。
正直、結構つらい。まだスコア計算、ブロックの消去判定、コントロールが実装できていない。
それでも、時間軸実行機構(要するに setTimeout
で云々するところ)、ブロック、ブロックを表示するセル、セルやスコア表示などを格納するフィールド、テトリス本体はおおむね実装完了。
完成したらこのサイトにも掲載する予定。