2011-12-02

_
2011/12/03 22:34
まじかるばいなりぃずの方の人の行方を知りませんか?字戦がほしいのですが、銀行振り込みして大丈夫な状態には見えないので・・・
xor
2011/12/08 23:26
まじかるばいなりぃずの方に、連絡を取っていただくよう手配いたしましょうか?返信先を添えて、メールをinfotech[AT!MARK]hotmail.co.jpまでお送りください。
gunbird
2011/12/09 01:43
代理連絡をよろしくお願いいたします。
2011-09-01
■1日の終わりは23:59:59ぴったりではない!

時刻tが○月×日内であることを判定する条件文に「○月×日0:00:00 ≦ 時刻t ≦ ○月×日23:59:59」と書く阿呆が一定数いる。このロジックは○月×日23:59:59.001を「翌日」と判定するので、秒未満を扱う処理系において1/86400の確率で誤動作する。絶対に書いてはいけない。正しくは「○月×日0:00:00 ≦ 時刻t < 翌日0:00:00」である。
秒単位で時刻を取り扱う処理系においても、移植性を考慮し、正しいロジックで実装を行うべきである。たとえばMySQLの日付型は秒単位だが、Microsoft SQL Serverの日付型はミリ秒単位である。したがって、MySQLで(ロジックは間違っているが正しく)動作するコードは、SQL Serverに移植すると動かなくなる。
2010-02-11
■hCalendarは用法を守って使わないと「更新」に弱い

ご無沙汰しております。最近何をしていたかと申しますと、気がついたら「スケジュール情報」に関する研究に従事しておりました。マニアックなテーマであるためにうまくfitする学会が見つからず、あまり学会発表できませんでしたが、紆余曲折の末に修士号をいただける運びとなりました。
そんな話はさておき。
先日、id:amachang氏によるhCalendarの紹介記事を見つけました(→ hCalendar を使って予定を公開しよう! - IT戦記)。この記事はhCalendarの概要と自作のJavaScriptライブラリについて記述されたものであり、特にhCalendarの概要については非常にわかりやすく説明されております。自作のライブラリを開発してしまうくらいですから、id:amachang氏のhCalendarへの期待は並ではないでしょう。
しかし私は、hCalendarを使用してスケジュール情報を記述する際に「1つのHTMLリソースにつき1つのスケジュール情報」というルールを守らない限り、スケジュール情報を利用する側の人間に不便を強いることになると考えております(このルールは私が勝手に考えているものであり、hCalendarの思想には無いものですのでご注意ください)。
確かにhCalendarで記述されたスケジュール情報はGoogleのロボットに特別扱いされたり、コピペだけで簡単にGoogle Calendar・Yahoo Calendarに取り込むライブラリを作れたりするかもしれません。それが便利であることに関して異論はありません。
ですが、そのライブラリを使用してGoogle Calendarにスケジュール情報を取り込んだ後に、内容が変更されたらどうなるのでしょうか。願わくはGoogle Calendarに取り込んだ「私のスケジュール情報」に変更内容が反映されたいところです。
スケジュール情報は往々にして、開催されるまでに何度も内容が変更・加筆されるものです。例えば私は、修士論文審査の日程に関するメールを2週間おきに3通も受信しました。最初のメールには「日程の詳細は後日お知らせいたします。」と記述されておりました。次のメールに記述された日程が最後だろう思ったら、直前になって発表者の変更があったために、またまた変更を通知するメールが届きました。このようなローカルな場合でなくても、例えば様々な学会の論文投稿締め切り日は頻繁に延期になりますし、電車・飛行機の発着予定時刻も事故などの理由により頻繁に変わります。予定を決める側としても「最初から開始日時・終了日時・詳細をキッチリ決めてください。あとで修正できませんから」というのはやりづらくて堪らないのではないでしょうか。
この理由から、スケジュール情報の内容に更新があったことを検知する方法について考えなければなりません。修士論文発表会の場合はたまたま変更通知がメールで届いたので助かりましたが、全てのスケジュール情報についてこれが可能なわけではありません(飛行機の発着時刻の変更を全てメールで送られたら堪らないでしょう)。PubSubHubbubなども同様です。
RSSのように、固有のURLをスケジュール情報に対応付ける方法があります。hCalendarはHTMLリソースに記述されているのですから、そのHTMLを示すURLを定期的にクロールすれば良いのです。iCalendar形式で記述されたスケジュール情報では、よく行われていることです。
1つのHTMLリソース(対応するURLも1つだけ)に複数のスケジュール情報が記述してはいけない理由がここにあります。1つのURLに対応するスケジュール情報が複数できてしまうので、1つのスケジュール情報に対応できないのです。出現する順番をURLに付加する方法は、はてなブックマークみたくコンテンツの順番が頻繁に変更される場合に破綻します。
例えばイベント開催支援ツール アテンド : ATNDは、用法を正しく守って使用している例です。イベント詳細ページ(例:ATNDデモイベント(タイトル) : ATND)には、hCalendarで記述されたスケジュール情報が1つしか無いことがわかります。ですので、このスケジュール情報に更新があったかどうかを検知するには、http://atnd.org/events/1の内容をクロールすれば良いのです。
このような例であれば良いのですが、例えばスケジュール情報のまとめサイトを作る際に苦労するかもしれませんね。スケジュール情報一覧があるページ(以下「一覧ページ」)には複数のスケジュール情報が掲載されるでしょうが、用法を守るとなるとhCalendarで記述できるスケジュール情報は1つだけ。仕方が無いので、1つのスケジュール情報について詳細に記述するページ(以下「詳細ページ」)にジャンプしてもらって、そこからhCalendarを取り込んでもらうことになるでしょう。一覧ページからわざわざ詳細ページにジャンプしないと欲しいスケジュール情報が取り込めないなんて、聞くからに不便そうではありませんか。まぁ、これはhCalendarのコンセプト上の限界なので、諦めるしかなさそうですが。
そんなわけで、個人的には
いいことずくめです!
これは hCalendar を使わない手はない!
というのは言いすぎかな、という気がします。iCalendar形式で記述されたファイルをHTTPでダウンロードできるようにする方が数倍は有意義な気がしてなりません*1(もちろん、iCalendarファイルには1つのVEVENTコンポーネントしか含まれていない、という前提で)。
amachang
携帯電話からなので単文にて失礼します。
イベント固有の識別子はUIDで、変更日はLAST-MODIFIEDで与えることが出来ると思っておりますが、それを使うというのはいかがでしょうか?
xor
コメントありがとうございます。長文になりそうなので、閲覧はPCでしていただければと思います。
返答ですが、「私」は「手動でhCalendarを記述する場合」に限り、UID・LAST-MODIFIEDでは不足していると考えます。不足している機能をUID・LAST-MODIFIEDが補えないという意味ではなく、現実問題としてUID・LAST-MODIFIEDが設定されることを期待すること自体が酷である、という意味で不足していると考えるのです。
UID・LAST-MODIFIEDが設定されることが期待できない理由は、以下の2点です。
1. UIDとLAST-MODIFIEDは、両方とも必須プロパティではなく任意プロパティである
2. hCalendarのコンセプトとUID・LAST-MODIFIEDは親和性が良くない
1は事実です。これについては仕様書に書かれておりますので、私が語るまでもないでしょう(この仕様はiCalendarから引き継いでいるみたいです)。UIDとLAST-MODIFIEDはともに任意プロパティですから、仮に設定しなくても誰も文句を言いません。
2は私の主張です。UIDとLAST-MODIFIEDは、付与はおろか生成にもそれなりの労力がかかるため、多くのシステムでは計算機が自動的に生成・付与しております。手動で付与しなさいと言われても、付加する方は殆どいないでしょう。
さらに、hCalendarが従っているとされる「セマンティックXHTMLデザイン指針」の5条にある通り、人間になじまないデータを取り扱う際に「人間になじむ形式で表されたエイリアス」を用意することが良いとされています。多くの場合、UIDとLAST-MODIFIEDはこれに該当する項目であると考えられます。それでなくとも用意するのが面倒なデータに対して、人間に読みやすい別名まで用意しなければならないとなると、「設定したくない、省略したい」と考える方が多いと考えられます。
以上の理由により、多くの場合にUIDとLAST-MODIFIEDは設定されず、結果的にUID・LAST-MODIFIEDの付与による機械的な更新の検知は期待できないと考えます。
2008-04-19
■[Apache]Apacheモジュール開発記 その1

改めましてこんにちはxorです。その0を書いた後、あらぬトラブルに見舞われ、その解決に時間を取られておりました。情けない。
おさらい
さて、その0にて必要最低限のApacheモジュールの作り方を説明したが、ここで改めて簡単な説明をしておきましょう。
- apxs2が使える環境にする
- 前回はaptitude(apt-get)を用いた場合しか書いてませんでした
- yumの場合はhttpd-develをインストールすると良いらしい(参考:http://ke-tai.org/blog/2008/01/09/mod_chxj_install/)
- $ apxs2 -n モジュール名 -g
- $ cd モジュール名
- ここから下はroot権限でやらないと失敗すると思うのでsu
- # apxs2 -i -a -c モジュール名.c
- Apacheの設定ファイルにモジュールのことを記述
- Debianの場合
- 他の場合もだいたい同じだと信じたい
- Apacheを再起動 $ apache2ctl restart
こうすると、「http://localhost/ディレクトリ名/」にアクセスすることで「The sample page from mod_モジュール名.c」と書かれたページが表示されるはずです。ここでは「モジュール名」とか「ディレクトリ名」とか書きましたが、どちらも任意のものを使ってください。例えばモジュール名が「gvr」なら、/etc/apache2/mods-enabledにはgvr.loadとgvr.confという名前のシンボリックリンクができていると思われます。こんな感じで、適宜置き換えて読んでください。…というのもかなりきついので、ここではmod_testというモジュールを作ります。モジュール名は「test」です。
あと、モジュール名とディレクトリ名は別に一致してなくても問題はありません。まぁ、今回は混乱を避けるために一致させておきます。そんなわけでディレクトリ名も「test」です。できあがったモジュールはhttp://localhost/testにて動作確認できます。
基本的な原理
さて、それでは早速apxs2によって生成したmod_test.cの中身を見てみましょう。こんな感じだと思います。
/* ** mod_test.c -- Apache sample test module ** [Autogenerated via ``apxs -n test -g''] ** ** To play with this sample module first compile it into a ** DSO file and install it into Apache's modules directory ** by running: ** ** $ apxs -c -i mod_test.c ** ** Then activate it in Apache's apache2.conf file for instance ** for the URL /test in as follows: ** ** # apache2.conf ** LoadModule test_module modules/mod_test.so ** <Location /test> ** SetHandler test ** </Location> ** ** Then after restarting Apache via ** ** $ apachectl restart ** ** you immediately can request the URL /test and watch for the ** output of this module. This can be achieved for instance via: ** ** $ lynx -mime_header http://localhost/test ** ** The output should be similar to the following one: ** ** HTTP/1.1 200 OK ** Date: Tue, 31 Mar 1998 14:42:22 GMT ** Server: Apache/1.3.4 (Unix) ** Connection: close ** Content-Type: text/html ** ** The sample page from mod_test.c */ #include "httpd.h" #include "http_config.h" #include "http_protocol.h" #include "ap_config.h" /* The sample content handler */ static int test_handler(request_rec *r) { if (strcmp(r->handler, "test")) { return DECLINED; } r->content_type = "text/html"; if (!r->header_only) ap_rputs("The sample page from mod_test.c\n", r); return OK; } static void test_register_hooks(apr_pool_t *p) { ap_hook_handler(test_handler, NULL, NULL, APR_HOOK_MIDDLE); } /* Dispatch list for API hooks */ module AP_MODULE_DECLARE_DATA test_module = { STANDARD20_MODULE_STUFF, NULL, /* create per-dir config structures */ NULL, /* merge per-dir config structures */ NULL, /* create per-server config structures */ NULL, /* merge per-server config structures */ NULL, /* table of config file commands */ test_register_hooks /* register hooks */ };
test_handlerという関数とtest_register_hooksという関数がありますね。しかし、お馴染みのmain関数がありません。
なぜなら、Apacheのモジュールは単独で動作するアプリではなく、Apacheに寄生するものだからです。つまり、main関数のように実行して終わり、では無いのです。代わりに必要な処理は
くらいでしょうか。いきなり浮世離れしてますね。
ですが、ソースコード中に出てくる文字列をよく見てみると、Webアプリを作ったことのある人ならお馴染みのキーワードが出てきていると思われます。例えば「r->content_type = "text/html"」とか「return OK」とか。
弄ってみる
試しにいろいろ弄ってみましょう。この「OK」って、実は「200 OK」のことです。その証拠に、この「return OK」を「return HTTP_NOT_FOUND」に書き換えてみてください。http://localhost/testにアクセスすると404 Not Foundが返ってくるでしょう。他にもHTTP_FORBIDDENとかHTTP_METHOD_NOT_ALLOWEDとかHTTP_GONEとか、いろいろなメッセージが用意されています。全部見てみたい方はhttp://httpd.apache.org/dev/apidoc/apidoc_HTTP_ACCEPTED.htmlを御覧ください。ただ、残念ながらRFC2324で定義された418 I'm a teapotは用意されていない…(まぁアレはHTTPじゃなくてHTCPCPなのだが)。
次に、content_typeを弄ってみましょう。初期値はtext/htmlですが、これをtext/plainにすれば全てがプレーンテキストとして表示されるはずです。application/xxにすれば「どのアプリケーションで開きますか?」とブラウザが訊いてくるかもしれません。まぁ、好きなMIMEタイプを書いて遊んでみてください。
最後に「The sample page from mod_test.c」ですね。ここも、書き換えればその通りに出力されます。また、ここではap_rputs関数を1回しか呼んでいませんが、もちろん2回でも3回でも呼んでいただいてOKです。例えば1回目で「jinsei」、2回目で「makegumi」を引数にして2回呼んだ場合、「jinseimakegumi」と出力されます。また、rputs関数の代わりにrprintf関数を使うこともできます。これはその名の通り、printf風のフォーマットを使って出力ができる関数です。例えば「ap_rputs("test",r)」の代わりに「ap_rprintf(r,"test")」と書いても、同じく「test」と出力されます。さらにap_rprintfはprintfと同等の機能を持つので、例えば「ap_rprintf(r,"add:%02d+%04d=%d",5,12,5+12)」と書けば「add:05+0012=17」と出力されます。
こんな感じで、雛型だけでも弄りまくってみてください。
2008-03-17
■[Apache]Apacheモジュール開発記 その0

突然、Apacheのモジュールを作りたくなった。別に必要に迫られたわけではない。単なる趣味である。
そもそもApacheが単独で使われることは殆ど無い。Apache単独では、Perlで書かれたCGIスクリプトを実行することすらできない。Apacheは、モジュールをインストールすることによって多機能になるのである。有名なモジュールとしてはmod_dir、mod_ssl、mod_cgi、mod_userdir、mod_perl…などが挙げられる。
先ほど挙げたモジュールは最初から提供されているものだが、これが全てではない。Apacheのモジュールは自分で作ることも出来る。例えばmod_uploaderは、よくあるアップローダをApacheのモジュールにしたものである。Perlやphpを使ったアップローダがあるにも関わらずApacheモジュール版が作られたのは、Apacheのモジュールに次のような利点があるからである。
- 高速
- 省メモリ
こりゃもうやるしかないっすよ。「高速」とか「省メモリ」って、まさに厨をワクワクさせる単語のオンパレードじゃないですか。
開発に必要な道具
幸いなことにxorはDebianを使っていたので、必要なパッケージはapt-get installでほぼ全て手に入った。使用しているApacheのバージョンは2なので、1.3系のパッケージを使ってはいけない(使っても正しく実行されない)。
まず、apxs2が実行できるかどうかを確認する。実行できない場合はapt-get installで
- apache2-prefork-dev
- apache2-threaded-dev
というパッケージのいずれかをインストールしなければならない。使用するのはどちらか片方だけである。どちらをインストールするかは、Apacheのプロセスのモードによって決定する。Apacheのプロセスを調べるにはapache2 -Vと入力する。すると、
$ apache2 -V Server version: Apache/2.2.X (Unix) Server built: AAA 99 200X 99:99:99 Server's Module Magic Number: 99999999:9 Server loaded: XXX 9.9.9, XXX-Util 9.9.9 Compiled using: XXX 9.9.9, XXX-Util 9.9.9 Architecture: 32-bit Server MPM: Prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APACHE_MPM_DIR="server/mpm/prefork" :
となる(http://d.hatena.ne.jp/j7400157/20070612/1181574944から拝借)。この例の7行目に「Server MPM : Prefork」と書いてあるのがお解りだろうか。この場合はapache2-prefork-devをインストールする。そうではなく、例えば
$ apache2 -V Server version: Apache/2.2.X (Unix) Server built: AAA 99 200X 99:99:99 Server's Module Magic Number: 99999999:9 Server loaded: XXX 9.9.9, XXX-Util 9.9.9 Compiled using: XXX 9.9.9, XXX-Util 9.9.9 Architecture: 32-bit Server MPM: Worker threaded: yes (fixed thread count) forked: yes (variable process count) Server compiled with.... -D APACHE_MPM_DIR="server/mpm/worker" :
のような場合にはapache2-threaded-devをインストールする。
# apt-get install apache2-****-dev
以上によってapxs2というシェルスクリプトがインストールされているはずである。
apxs2でひな形生成〜コンパイル〜インストール
apxs2はすさまじく万能なモジュール開発支援プログラムである。ひな形の生成からコンパイル・インストールまで一通りのことを全てやってくれる。ここではmod_infotechという名前のモジュールを作ってみることにする。
最初にひな形の作り方からである。ひな形を作るディレクトリにて
$ apxs2 -n infotech -g
とやることで、infotechというディレクトリが作られるはずである。このディレクトリの中にはMakefile・modules.mk・mod_infotech.cという3つのファイルが入っているはずだ。このmod_infotech.cこそがmod_infotechのソースコードである。
次にmod_infotech.cのコンパイルである。Makefileがあることからも解るとおりmakeすればコンパイルされるが、apxs2を使うことでコンパイルしたファイルをApacheモジュールのディレクトリにコピーするところまでやってくれる。というわけで
# apxs2 -i -a -c mod_infotech.c
とやる。これでコンパイル自体は完了だ。なお、Apacheモジュールのディレクトリにコピーする際にはroot権限が必要である場合が多い。その場合はこのコマンドもroot権限で行わないと途中で失敗する。
最後にApacheにこのモジュールをインストールするところである。Apacheのモジュールの設定は全て/etc/apache2/mods-available(ここに無かったらfindとgrepを駆使してmods-availableを探してください)に保存されている。ここにinfotech.loadとinfotech.confというファイルを作成する(touchでOK)。次にinfotech.loadに以下のような記述を行う。
LoadModule infotech_module /usr/lib/apache2/modules/mod_infotech.so
infotech.confには次のような記述を行う。
<Location "/infotech/"> SetHandler infotech </Location>
最後にApache2をRestartする。
# apache2ctl restart
これでhttp://localhost/infotech/にアクセスすると、The sample page from mod_infotech.cと表示されるはずである。
2006-04-20
■[V]PCに何を求めているのか

久々にたくさんのトラックバックをもらって、やっとわかった。どうしてこんなに自分の考えは受け入れられないんだろう?と思っていたが…なるほど、そういうことをPCにしてもらいたいわけか。確かに現段階のPCの性能では絶対に実現できないだろうと思える機能ばかりだ。
今の自分にはPCに対する不満がない。もう十分過ぎる。これ以上PCが強力になったら、自分の能力では理解できなくなってしまうからだ。CPUの速度はすでに(俺には)理解不能な領域に達している。HDDの容量も理解不能(具体的に中に何が入っているのかをすべて把握するとか)だ。これからどんなにCPUが進化しても、どんなにHDDが進化しても、それらはいずれも俺にとって理解不能な物体であり、それ故に新しいものに交換することに意味は無い(意味不明であることに変わりは無いから)。
:
きっと、ものを作るのが好きだという俺の性格が災いしているんだと思う。目の前で何かが動いているとき、それがどうして動いているのか解らないと俺はダメなんだ。PCが速くなったら、ある時にはもう理解できない領域にいるだろう。そうなったら、ついこの間まで俺の相棒だったマシンは一気にブラックボックスと化す。そんな恐ろしい装置を使うことは俺にはできない。
2006-04-18
■[V]PCを使いこなせるようになりたい

すごい偏見なのだが、俺には世の中のPCユーザーのほとんどがPCを使っているように見えない。使われているように見える(もちろん俺も含めて)。特に、たとえば自分の使っているマシンの性能の話とかをされるとどうにも…その高性能なマシンに使われているようにしか見えないのだ。おそらく俺の奥深くに「良いものを作るのに道具の善し悪しは関係ない」というくだらない思いこみがあるからなのだろうが…。
たとえばネットをするためとかメールを見るためとか、挙げ句の果てにはテレビを録画するためとか音楽を聴くためにPCを買おうとする人が世の中にいる。乱暴な言い方だが、そんなことのために買われたPCがかわいそうだと考えてしまう。買われたその物体はテレビよりも遙かに高性能なのに、その性能がテレビに写るものを高画質かつ軽いサイズにエンコードするために使われているのかと思うと、もう胸が詰まる思いだ。確かに性能が良くないとリアルタイムエンコードはできないだろう、そりゃ確かにそうなんだろうけど、しかしその装置はそんな程度のもんじゃない、下手すりゃテレビに写っているその映像を作ることだって可能な装置なんだぞ、と叫びたい。
正直、現在のPCの性能は有り余りすぎている感がある。アポロ11号に積まれていたCPUはファミコン以下の性能だったらしいが、それでも月へ行って帰ってくるという大仕事を果たすのには十分な性能だったらしい。現在、人間がやらなければならない仕事の中で、これほど「CPUの性能対実績」の比が尋常じゃない仕事があるのだろうか。そんなものはもうほとんど無いだろう。現在のCPUには、これ以上の性能は必要無いと考えている。
今の自分が使っているPCも、自分の要求(Flash制作・CGI制作・音楽制作・画像制作・動画制作・印刷物制作・その他もろもろ)を満たすのには十分すぎる性能だ。しかし、このマシンはもうすでに時代遅れだと言われる。きっと自分のマシン以上の性能…それこそすさまじい性能を持った(自分のマシンでさえすさまじい性能だと思うのに)マシンがたくさん存在するということなのであろう。そんなマシンを保有している人たちは、そのマシンに何をやらせているのだろうか。本当にそこまで性能が必要なのだろうか。
CPUだけではない。それを一番実感するのはHDDだ。たとえばHDDの容量が10GBしか無くて、作業領域として必要な容量が明らかにそれ以上必要だと解っているとき(たとえば最低でも30GBはほしい時)に、あらかじめ何百GBのHDDを付け足しておくというのは本当に正しい方法なのだろうかと考えてしまうのが俺という人間…むしろ、他に方法は無いのかと考えないのだろうか?たとえば自分のマシンがLAN上にあって、LAN上に大容量HDDを積んでいるマシンがあるなら、そこに一時的にファイルを待避させておくことだって可能なはずだ。WANなら、たとえば誰かの立ててくれたFTPサーバにアップロードしておくことだって可能だ。この考え方が自分のダメなところなのだろうが…どうせ何百GBのHDDを買ったところで、そのHDDの寿命がくるまでにどれだけの領域を使うことができる?と思う。
HDDは保存をすること以外にも、どこに保存されたデータだろうと瞬時に取り出すことができるという特徴があるのだから、保存されたデータを取り出すことをしないと本当の実力が発揮できないだろうと思う。自分の感覚では理解できないほど大容量のHDDを持っている人たちが世の中にはいっぱいいるわけだが、そういう人はHDDからデータを何度取り出したことがあるのだろうか?というのも、そんな大容量のHDDを使いこなすことは自分には絶対にできないだろうと思うからだ。4.7GBのDVDに120分の映画が1本入るとすると、たとえば100GBのHDDには2553.1分(42.55時間)の映像が保存できることになる。つまり、信号のもっとも非効率な使い方である(と俺は思う)動画でさえ、100GB分のデータを1回取り出すのに丸1.77日もかかる。非効率な動画を1回だけで、だ。それを何回もやるとしたら、それに比例してかかる時間も増える。100回使うのに177日もかかってしまうのだ。それは短い人生の何分の一だろうか?俺にとって、HDDを「使う」というのはそういうことだ。上記の内容から理解できると思うが、100GBのHDDを使うことなど自分には絶対に不可能だ。それどころか普通に使っている分には10GBだって不可能なのに(30GBの領域が必要になったのは動画を編集するためだが、そのうちの25GBは削り取る分だった…つまり30GBの領域は25GBを削るための領域だった)。それにもかかわらず、店で売っているHDDの最低ラインは80GBだ。俺には全く理解できない。このような恐ろしいHDDの積まれているPCを使いこなすことなど絶対にできないだろう。
2005-07-20
■[R]箸って便利

これを使えば、PCを弄ったり原稿を描いたりしながらポテチが食べられる!手を汚さないから!そもそもPC弄ったり原稿描いてる時にそんなもの食うなよボケと言われたらそれまでなんだけど、それでも無性に食べたくなることがあるのだ!何を隠そう、この文章を書いている最中にも俺は噛むほど美味いブラックペッパーのポテチを食っている!
ところで、箸ってこういう時にはすごく便利なんだけど、他に使い道があまりないのよね…。箸って「正しく」使うことが(どちらかというと)難しいものだと思うのよ。「広義的には『箸の正しい使い方』なんて存在しない!」と言われそうだが、それじゃあ貴方は物体を摘む目的以外で箸を使うの?と言いたい。摘む目的で使っていない2本の棒は「箸」じゃないからね。
…さっき「正しく」って言ったんだけど、実は最近、「正しいことって何なんだろう」と考えるようになってきた自分がいる。卑怯な理論を繰り広げそうになる前に「何にとって」正しいのかを明確にしておくと、「この世の全てにとって『正しい』もの」である。この定義でいくと、例えば人を殺すのは「正しくない」とは言い切れない。生きるために生物を殺している人間は間違ったことをしていると言い切れるのか?貴方は生物を殺さずに生きていけるのか?そもそも、この論争は無機物には関係しない。…そうすると、世の中で唯一正しいのは物理法則だけになる。物体Aと物体Bが衝突すれば双方に同じ大きさの力が反対方向に作用し、それなりの影響を及ぼす。光の速度は座標系に関わらず一定である。その他諸々。プログラムに関しても同じことが言えるのではないか?仕様書通りに動くプログラムならば、プログラミング言語の選択やアルゴリズムの選択に関わらず、間違ったものなど何一つ存在しない…と俺は信じている。
はっきりしたことは解らないが、ひょっとしたら将来の俺はマジで「正しい」「間違っている」で判断される世界ではない世界に足を踏み入れることになるかもしれないのだ。ぶっちゃけ芸術系って奴なんだけど、この世界って「間違ったこと」が無いことがかえって仇に出るような気がする。正しいことだけをやっていればいいってもんじゃないからさ。レールを自分で引かなきゃならない。
そんなわけで、俺はポテチを箸で食うという行為は決して間違っていないと思う。そして、来週がテストだというのにこんな文章を真剣に書いている自分は相当間違ったことをしていると思う。
