Ciliegia 0.0.0 をリリースしました。先日話題に出したアレです。一応の体裁は整ったので、取り敢えず公開しておきます。まだ (私以外の人にとって) 実用性のあるレベルではありません。大体の雰囲気だけ理解してもらえれば結構です。
今後の予定は、当面必要なモジュールの追加と、evaluator の書き直しです。特に後者は早く済ませたいところ。モジュール周りのセマンティクスやマクロの追加、それにもう少し親切なエラーメッセージを出すにはあのままだと不可能ですから。もっとも、一番の理由は properly tail-recursive ですらないのに Scheme のサブセットを名乗るのが恥ずかしいからです。
if (Ci_StringCompareC(method_name, N("XXX"), -1))
method_type = METHOD_TYPE_XXX;
else if (Ci_StringCompareC(method_name, N("YYY"), -1))
method_type = METHOD_TYPE_YYY;
else
...Ci_StringCompareC は文字列オブジェクトと普通の C の文字列を比較する関数だと思ってください。戻り値は strcmp(3) と同様です。
……ああああああ! if の条件部が「method_name と XXX の一致しない場合に真」になっていることに気付くのに何日かけたんだ、私は!
vim の folding 機能の存在にようやく気付きました。簡単に言えばテキストの特定の部分を折り畳んで (= folding) 表示するというものです。
うわー……今まで漠然とこんな感じのものが欲しいとは思っていたのですが、何故気付かなかったのやら。
コードを書いていて、「複数のファイルに分割する程ではないが、一つのファイルにまとめるには長すぎて全体の見通しが悪くなる」ということが多少あったのですが、これが folding で大分緩和されます。まだマニュアルをきちんと読んだ訳ではないので、自分の思うように賢く folding させることができないのですが、foldmethod=marker だけでも十分に役に立ちます。
簡単なプログラムや、仕様が固まっているプログラムならある程度書くことはできるようになったと思うのですが、いざ自分で一から設計して、プログラムを書こうと思うと中々手が進みません。
例えば英語を勉強していたとしましょう。文法と単語を完璧にマスターしました。では英語で小説を書けるかというと、書ける訳がありません。何故なら英語以外の様々な知識が必要になるからです。小説の舞台、構成、自分の伝えたいことの表現 -- 腐るほどあります。
プログラムを作る際も同じです。プログラミング言語以外に必要な暗黙知が色々とあるからです。C 言語の構文や標準ライブラリ関数を完璧にマスターしたからと言って、それだけで実用的なプログラムが作れる訳ではありません。
仮にシューティングゲームを作るとしましょう:
ゲームの本質自体はおいておくとしても、ちょっと考えただけでもこれだけ必要な知識が出てきます。
上記のような分かりやすい形の知識ばかりが必要という訳ではありません。問題 (あるいは自分のしたいこと) が何であるかきちんと把握できなければなりません。普通は直接解こうにも大きすぎますから、より小さいレベルの問題に分割して考えるということが必要です。それに、どのように / どの程度まで分割すれば良いのか、という判断もできなければなりません。
また、エディタを使いこなせているか、という点も挙げられます。カーソル移動ひとつを取っても、カーソルキーを何回も押すのと、1 回のキー入力で文字単位 / 単語単位 / 行単位 / ブロック単位 / 関数単位で移動するのと、どちらが効率的ですか? たかがカーソル移動とはいえ、ソースコードを自由自在にブラウジングできるのとできないのでは大いに違います。
後、問題を解く際にプログラミング言語で考えるのは辞めた方がいいでしょう。言語の制限内で物事を考えることになりますから。
他にも……えーっと……色々あります。挙げていくとキリがありません。でも別にプログラミングに限らず、他のことでもこういうことはあるでしょう?
それに最初からできる人なんていません。誰でも色々と躓きます。むしろ「書きたくても何故かできない」という壁に当たれるまでレベルアップできたのだからいいじゃないですか。
まあ、頭が回らないときは取り敢えず寝るといいですよ。どんな問題も一晩寝かせたら大体解けます。
もう遅いのですが、最初に学ぶなら Python 辺りがお勧めでしょうかね。未経験者に C は辛いと思います。多分、普段料理をしない人がフグ料理に挑戦するくらいに。
でも一旦始めたならある程度できるレベルに達するまでやった方がいいでしょう。他の言語を始める場合に色々と役に立ちます。
自分で「C が使いこなせる」と思えるようになったら、「エキスパート C プログラミング — 知られざる C の深層」という本があるので、こちらをお勧めします。面白いですよ。
ちなみに、シューティングゲームの例は大昔に私が経験したことそのまんまです。あの頃は若かった。色んな意味で。
konamistyle のメールより、CS 版 beatmaniaIIDX11 RED の発売が決定したそうです。
REDの新曲52曲すべてを収録
アーケード版スタッフによる書き下ろし新曲
スコアグラフ表示機能を搭載
半年ほど前から作成し始めた Scheme の処理系ですが、紆余曲折を経て、今月の頭でようやく仮完成というレベルまでできました。実際には最初の一ヶ月か二ヶ月で飽きて今年に入るまで全然手を付けていませんでしたけどね。今年に入って急にやる気が出てきたのですが、冷静に見直してみるとあちこちにボロがあり、結局全部書き直してしまいました。
実際には仮完成と言うのもおこがましいレベルですけどね。何がひどいって、(define (f args) ...) は扱えないし、let はないし、何より最悪なのは properly tail-recursive ですらない。なのでまだまだ処理系とは名乗れません。
とはいえ、ちょっとしたことをやる分にはこれでも十分なので、今は必要な機能を徐々に付け足しているところです。上記のスクリーンショットで写っているのはこの処理系を組み込んだシェルとその設定ファイルです (実質的に Scheme のスクリプトですけどね。大体の雰囲気は掴めるでしょう)。色々な点でかなり不親切なのでまだ公開できるレベルではありませんが、個人的に必要な機能はほとんどカバーできたのでデフォルトのシェルはこれに置き換えました。
他のシェルを試そうかと思いましたが、自分の要求を満たすものが見つからなかったので、結局自分で作ってしまいました。Scheme の処理系は自分の勉強のためなので自作しましたが、アプリケーションを作るだけならば既存のものを流用したでしょうね。そもそも、Scheme に出会わなければわざわざここまでしませんでしたよ。
これでようやく BB4W を捨てることができました。実際、半年前からは関連コミュニティは滅多に見ていませんし、BB4W 関連のページもメンテしていません。どうしたものかと今まで考えていましたが、シェルがある程度使い物になるレベルになった以上、今後はメンテしません。
MSDN の NOTIFYICONDDATA の説明では、dwState に使うフラグ NIS_HIDDEN と NIS_SHAREDICON の用途が不明だったのですが、ようやく分かりました。
通知領域では、表示するアイコンリソースを CopyIcon しておかなければならないのですが、そうすると表示するアイコンを頻繁に変えるアプリケーション (例えばタスクマネージャ) が起動している場合、毎回 CopyIcon することになるので少々具合が悪くなります。
NIS_HIDDEN と NIS_SHAREDICON は、この不要な CopyIcon を避けるためのものです。具体的には、アプリケーション側で (1) 予め使うアイコンリソースを NIS_HIDDEN 付きで Shell_NotifyIcon しておき、(2) 本来のアイコンには登録済みのアイコンリソースを利用することを明示するために NIS_SHAREDICON を付けて Shell_NotifyIcon します。
上記はあくまで推測に過ぎませんが、タスクマネージャの Shell_NotifyIcon の使い方を見る限り、多分そういう目的だと思われます。
cdbiff という、それはもう色々な意味で強力としかいいようがないソフトウェアを見つけました。新着メールの通知をするソフトなのですが、通知方法が凄い。
個人的には動作を示す画像の手書き文字がいい味を出していると思います。中央の穴で各単語が分断されているため、「メール届いた!」ではなく「メール 届いた!」(間の空白が重要) となっている辺りがますます素敵です。英語版は英語版でいいのですが、日本語版のあのシュールさ加減と語感と手書き文字の味には勝てません。
既存デバイスの斬新な利用方法としては cdfax も素敵です。いっそのこと、これらのアイデアを組み合わせて物理的に電子メールを届けてやればいいのではないかと思うくらいに。