著作一覧 |
どうして日本語のあいさつはなますてじゃないんだ? (昨日からこの言葉の響きに取り付かれているのだが、きっとチャドファウラー本のせいもあるだろう)
ふんぎりがついたのでDELLの9200Cというのを発注。なぜか当初買おうかどうか迷っていたC521(AMD64)からCore2Duoマシンに変わったのは筐体の高さが10cm低いからだ。やっぱコンピュータは小さくて静かなのが一番だ(速度と容量と信頼性がある程度確保されていれば、というのが最初に来るけど)。
っていうのと多分Vista用パッケージなんだと思うが、今日見つけたお買い得パッケージの2GB+Core2Duo(E6300)+160G HDD+RADEON X1300Pro(256MB)+19"LCD で11万円弱(ただしプレミアアカウント価格——去年さんざん買った後になって勤め先がDELLと契約していて結構な額がディスカウントされることが判明して衝撃を受けたのだが)というのが魅力的だったからというのもある。っていうか、この組み合わせがこう来るのなら玄人志向を買わずにこっちをVistaテストマシンにしてE521をサーバーに回せば良かったが、あきらめる。上の逃したディスカウントを合わせると去年はコンピュータ関係で相当無駄な出費をしたことになる。今年は子供にMacBookを買う以外にはこれ以上の出費はしない予定(自分用のMacBookについては保留)。
しかし振り返ってみれば、去年のコンピュータ関係の出費で一番一件あたりの額が大きかったのはやはりMSDNだな。
脱YAおめ。
ふと気付くとnewsと書いただけのトラックバックスパムがそこら中に埋め込まれているではないか。
ツッコミスパムと違ってRSS配信対象にしてないから気付かなかった。
(最新や月単位のを見ている限りは目に止まらないってのもあるかも)
消す方法はおいおい考えるとして、なぜツッコミスパムと違って弾けてないのか疑問に思って、しばらくtb.rbから追いかける→tdiary.rb。
結局、comment_filterメソッドに入るからtdiary/filter/*.rbのcomment_filterメソッドが呼ばれることを確認する。ってことは、ツッコミスパムと同じ方法で弾いてるはずだ。そこで5文字以内の本文は捨ててるんだが、news4文字のが山ほど入っているから不思議だ。
で、もういちどtdiary.rbに戻るとbodyは[url, blog_name, title, excerpt].join("\n")
なのか。それじゃ長さチェックを擦り抜けるのも当然だ。
でしばし考えた末、^news$にだけ対処することにする。
後は、nameがTrackBackだったら最初の行をチェックするとかかなぁ。
ロスロボスかぁとか思いながら、iTunesでとりあえず聴いてみるかとかを経由してなぜかプロパガンダ、プロパガンダと呼ぶ声がしてきた。
で、アモンティリャードの酒樽から機械仕掛けの神の谷が出てきて、気に入ってしまう。
iTunes Store - Propaganda - Valley of the Machine Gods - EP - Valley of the Machine Gods - EP.
が、これはおれが求めているプロパガンダなのか? という疑問も湧いてくる。ドイツ表現派とポウは近くても他人だし。
とは言え、いまさらこれはなかろうというわけで、機械仕掛けの神の谷を購入。
なんて便利なんだろうなぁ、とか思いながらApp_Dataの下にFoo.mdfとか作って悦に入っているわけなんだが(でも、サーバーエクスプローラから直接接続したり作成したりできないのはなんでだろうか? とちょっと不思議なのだ。というか、それで3日以上を費やしたりして。Windowsユーザーのパスワードの有無とか、TCP接続にしてファイアウォールを疑ったり、名前付きパイプにして見張ってみたり、いろいろな組み合わせ。でも考え付くあたりはすべて玉砕。でも職場では普通につながってたんだけど(SQL認証を使っているからかも、でもExpressでSQL認証を使うのっていまいち良くわからんとか、どっちにしてもSQL認証字体がObsoleteっぽいから避けたいとか。それよりも職場のはSQL Server 2005そのものだからなのかも。でもExpress Editionも「そのもの」のはずだが……と思ったけどもしかしたら接続はできない制限なのかな? と一瞬疑ったが、でもPortがListen状態になるのは確認してるしなぁ。追記:リモート接続の設定方法、合ってるようだが、FAQの残りも読む必要がありそうなのでURLをメモ)、ふと気付いた。
DebianにMono入れてMonoのASP.NETを試してみようとした瞬間だ。
つまりだめじゃん。いや、SqlClient使っている時点で当然だめなんだけど、あまりにも簡単に手元にデータベースが作れるから(Rails+MySQLより楽勝だ)、そういったことをまったく意識してなかった。
(このあたりに次のブリッジ開発意欲がむらむらしてくるのだが、今はそれどころではないのであった)
#マシンさえ高速なら10分でブックマークが作れる。でも、マシンが低速だとVS2005を起動してプロジェクトを作ってApp_Dataにデータベースを作るだけで気分的には10分が過ぎてしまうだろうな。
えーと、おれにはリスに見えるんだが。しかも蛍の光なんだが。
アニメ自体はロシア(USSR時代か?)製だ。
シベリウスが亡くなってから50年が経とうとしている。
以前書いたこの部分の感想。
シベリウスピアノアルバム 全音ピアノライブラリー(舘野 泉)
LilyPondについての雑感:
さすがにペダルの部分をmidi化はしてくれないのか。後、最後の部分は音が相当抜けているように聴こえる。あと、これだけでも結構、書き間違えた。
・\\keyを指定していても音符自体はcisのように記述する必要があるので入れ忘れる
・付点の書式を忘れていた
・多声の書き方(<<{...} \\\\ {...}>>)を忘れる
・楽想記号の書式
・アクセントやテヌート(-でエスケープ)
・\\clef baseのつけ忘れ
・オクターブ指定の打ち損ないとか
・ペダル(今回初めて調べた)
冒頭の拍子記号を無視した(1)左右にまたがる分散和音(2)の書き方がわからない。
mumurikさんが強烈に悲観的なエントリーを書いている。
でも、早急に結論を出すのは早すぎるんじゃないかな。今すぐではなくても必要とする人は間違いなくいる。だから記事がWeb上に、しかも検索可能な場所にあるというのはとても重要なのだ。
たとえば、Kazzzさんが先日ITemplateの記事を見つけている。
PDC+MSDN(+TechEd)の時間と世の中の時間はへたすりゃ3年くらい流れが異なるのだからしょうがない。
(上流は流れが急だし岩だらけでおまけに細い(でも水は清らかだ)。下流は流れがゆっくりで広い(でも水は結構濁ってたり汚れてたり)とか見てくれも違うけど、そもそも水が流れてくるまで時間もかかる)
UI(インターフェイスのIというよりはインタラクションのI)がからむテストは今後より重要度が増すんじゃないかと思う。というのは、エンタープライズ側のビジネスロジックのテストの有効性を知った人たちがユーザーコンポーネント側にも同様にユニットテストを持ち込むことは(そして今までの手法が単純には適用できないことを知ってとまどうことは)十分にありえるし、Ajaxになるのかもっとリッチなクライアントになるのかはともかく、今後、よりユーザー寄りのコードの重要性が高まることは間違いないようにみえるからだ。2007年以降、まずは上のシステム側の世代交代、そしてユーザビリティの改善に進むというシナリオだ。
とにかくこの本がお勧めということはわかった。
Working Effectively With Legacy Code(Feathers, Michael)
#それにしてもPermalinkを見つけにくい(「この記事を引用」がJavaScriptでしかもLive Spacesを強要する)Blogツールだな。
以下、あまりに粗いので都市伝説的な何かと思ったほうが良いかも知れない。
僕は、フォードの偉大な点を次のように理解している。
・自動車作る
・金持ちしか買えない
・少ししか売れない
・少ししか自動車作らない
・コストもかかり大して儲からない
なら、まずは鶏から変えようとフォードは考えた。
そこで自社の労働者の給料をいきなり跳ね上げた。おまいらは自動車を所有することのうれしさを知ってるよね、ということだ。
・労働者、金いっぱいもらう
・自動車買う
・たくさん売れる
・たくさん作れる
・生産コスト減らせる(大量生産の始まり)
・儲かる
・給料をさらに上げる
・さらに自動車売れる
・たくさん作れる
・生産コストもっと減る
・たっぷり儲かる
今も、春闘とかで主要な企業の回答額が社会的に周知されるのは、このサイクルをまわすためには社会全体で可処分所得を増やしたりする必要があるからだ。
市場開発のための投資先として従業員を選ぶというのはフォードのベルトコンベア以上に画期的な考えだ。
(その意味において、前期の成果だけを勘案して給与を決定するというのはフォード未満な方法論なのではないか)
と、「最低賃金が底上げされても、社会全体が労働者全体に支払える金額が変わらないので税収は変わらんですよ。分配が変わるだけ。」を読んで考えた。
市場が成長しないと前提すれば、分配が変わるだけという結論になる。
フォードの従業員にも、もちろん上がった給料で車を買わずに貯金とかに回したやつもいるだろう。でも、そういう行動を取る人間だけを基準に考えていたら成長しないだろう。でも重要なのは成長を考えることじゃないだろうか? 開発というのはそういうことだ。
だからフォードが偉いのは、自社の製品(と限定する必要なく、自動車という新しい機械)の魅力に賭けたところなのだ。
追記:このフォードは今のフォードという会社のことじゃなくて20世紀の初めに海のものとも山のものともわからない自動車っていう機械に財産賭けたベンチャー野郎のことです。
何か良い点もあるだろうと我慢して使ってみてきたが、ついに怒り爆発。
IME2003スタンダードを既定のIMEに変更した。(削除するとOffice Updateの時に厄介がおきそうだから、残すだけは残しておいてやる)
もしかして8日? 15日? おれが持ってる電話のカレンダーは今年の分から祝日表記が無いんだけど(ちょっと愕然。買い換えろというメッセージなのか?)
追記:メーカーのサイトに行ったらダウンロードできるようになってた。やっぱり8日なのか。でも1週間も早まるってのは不思議だな。
さっそく(というわけではないか)
Working Effectively With Legacy Code(Feathers, Michael)
を購入。
というか、ランキングが凄まじいことになってるんだけど(見た時は63位で、購入後の今は60位)、textfile効果なのか?
それから、江川さん達のGWT本。
ただ、今の時点では、Javaで全部やるよりはむしろJavaScriptで全部のほうが良いかも、とか思い始めてる。(Netscapeのサーバーサイドスクリプトへの偉大なる後退)
(追記:今となっては、Ruby、C#、Javaについてはどうとでもできるわけで(VB.NETも含めても良いか)、その中でクライアントサイドスクリプトとの一貫性を求めるのなら、プラスしてJavaScriptという選択肢もオレの中にはあるという意味。サーバーサイドでJavaScriptがはやるというような予言では全然ない)
ASP.NETならJScript.NET、JavaならRhinoがあるわけで。
上で書いた本とは別に、USBメモリーも購入。
グリーンハウス USB2.0フラッシュメモリ 2GB GH-UFD2GTB(-)
でも実はドキドキものなのだ。
っていうのは、こないだ安さに釣られて購入した
BUFFALO RUF2-E1G-B USB2.0対応フラッシュメモリ エントリーモデル(-)
で、とても悲しい思いをしたからだ。
これについては、それは目的じゃなかったから、あきらめもつくのだが、今度は明確にそれを目的にしている(だってその機能を知ったら試してみたくなるじゃん)ので、外れたら辛い。
Windowsを買わなかった人がPHPを見て、これイイと思ったというのが歴史なのかな?
おもしろい。すげー、いろいろ来た。
だったら、逆目を張るのがおもしろい。
つまり、#2以外は勝てる(あ、すでにデスクトップは負けという前提なのだ)。
SQL Server Expressをどう使うかだ。
#突然思い出したが、最初間抜けなことにマウスでフィードをランダムにクリックしてたんだよな、とか。読むとき(リラックマ)と作業するとき(デベロッパ)では手の位置が違うのだ。
何しろ、マイクロスレッドを実装してしまうんだからな(と、新語だと思うを思いついたので使ってみたり。Javaではグリーンスレッド)。
っていうか、ExplorerのデベロッパーがmalaだったらWindowsは今の100倍は確実に快適だったろうな(zipフォルダあり状態で)。
#まず自分の仕事に戻ろう。
Hotspotを使ってみたくて、OCNの一番安いやつ(ADSL 下り12MbpsでIP電話が使えないやつ)に加入してみた。まだモデムは来てないし工事も何もないが、どうもHotspotだけはすぐにでも使えそうに思える。
でも、雨が降っているからまだ試せない。
湯島天神の裏から坂を折りきったところの十字路の角にある和菓子屋でおこわを棒状にして昆布の佃煮と大豆を煮たのと梅干を埋め込んで笹で包んだような感じの食い物を買って食ったらうまかった。
桜もちもうまかった。
しかし、花びらもちというのは素甘みたいであまり好みではなかった。
というようなことは昨日(というか5日)に済ませておいて良かったと感じた雨の一日。
イオンというかジャスコを妻の買い物が終わるまでうろうろしていたら、肌着コーナーにやたらとぴたぴたしたシャツとかが売られているので眺めていたら、いろいろ書いてある。
水分を熱に変化させるとか、いろいろ。
そういうこともあるのかなぁとか思って値段を見ると3000円を超えている。ヘインズのTシャツあたりと比べると何倍にもなる(っていうか3枚1000円ちょっとくらいだったような記憶があるけど)なとか、最近はカンファレンスTシャツで済ませているからシャツの値段なんて知らないのだが安くはないということはわかる。
この強気の価格は本当なんだろうかと強く興味を惹かれる。で、買ってしまった。
水通しとかせずに面倒なんで着てしまったが、確かに温かく感じる。でも、ぴたぴたしてるからかも知れない。もっとも、その効果を得るためにはぴたぴたしてる必要があるんだろうとは想像が付くからしょうがない気もする。
というか、化繊のぴたぴたの肌着を着るというのは考えてみると相当に気持ちが悪いのだが、さすがに最近の化繊は肌が痒くなったりはしないようだ(装着後8時間は経過しているはず)。というか、そのあたりは保湿効果によるものなんだろう。毛の細さがそういう効果も持つはずだというかそっちを主眼に開発したら結果的に熱がどうこうという効果も得られたんだったりして。(追記:そうでもなさそうだ)
トレンドどころか当たり前なのか。
この分野では圧倒的にレイトマジョリティなポジションにいるのだなと思ったのであった。
追記:いろいろ調べてたらこれは嘘だろうなものまであるんだな。
これまでで一番のユーザーエクスペリエンス。
Windows Updateの自動更新じゃないところに、「NVIDIA driver update for NVIDIA GeForce 7600 GS」というのがおいてあったので、別に再起動してもかまわないのでクリックした。
するとだらだらダウンロードしたあげく、画面がブラックアウトして、なんか640×480くらいで表示されて、またしばらく画面がブラックアウトして、元に戻ったと思ったら更新が完了していた。
(生きているウィンドウがみな、シュリンクされてしまったのには閉口したが、その程度だ)
これはちょっと驚いた。
1994年頃、つまり僕が本格的にコンポーネントの開発をする必要が出た頃ですら、すでに巨大極まりないものだった。
確かにMFCを使えばそこそこのOCXが作れるわけだが、それはIDispatch以外のVTblを使えないから、VBからはペタポトできてもC++からはえらく使いにくいものだった。
そこで、COMの永遠のベータ仕様書を読み、TechNoteに隅々まで目を通してMFCのIUnknwonをMap(ユーザー定義関数ポインタテーブル用マクロ)へマッピングする方法を調べて、そしてデュアルインターフェイスを作り、するとVB4が単なるコンポーネントについてはデュアルインターフェイスを見つけるもののOCXについてはインターフェイスが見つからない状態になることがわかり、しょうがないのでODLにDispInterfaceも実装しQueryInterfaceをオーバーライドして振り分けを実装し、するとIPropertyBagの取り方に問題が出てきて……というようなことが必要だった。
回り道だ。
というようなことを思い出すASP.NETのなんでもありあり(しかしこちらを立てるとあちらは立たない)アプローチ。ポストバックするのか、Transferするのか、クライアントコールバックするのか、Redirectで十分なのか、5種類あるクライアントサイド状態管理のどれを使うのか、それとも3種類あるサーバーサイド状態管理のどれを使うのか(これは明確に役割が分かれているから良いのか。とすると4種類あるセッション状態管理のどれを使うのかあたりにしておくか)、全部知らなければ確実に痛い思いをする可能性はあり、かつ何も知らなくてもそれなりにできる。ASP.NET1.0を知らない人間がASP.NET2.0をはたして正しく使えるのか?
別に正しく使う必要はないのだとすれば、そしてそのアプローチはコスト的にはそれなりに正当ではあるのだが、するとASP.NETが持つたくさんの機能はいったいなんのためなんだろうか? もちろん、MSのASP.NET開発チームのためなのだろう。でも、回り回ってオレのためとも言える。
どうしようかなぁ。
あらためて読むとすごくおもしろい。というか、ASP.NETに対する知識と必要性が最初読んだときと今ではえらく異なるからな。
.NETが、COMよりも格段におもしろいのは、それがVMだからでもクラスライブラリが完備しつつあるからでもないんじゃないかという気がしてくる。というか、そういうことは実用的ではあってもおもしろい理由ではない。
COMは結局はVTblだし、つまりはC++だ。そして、C++は実行時に参照できるものはほとんどない。多分。
// test.cpp #include <fstream> int main(int argc, char* argv[]) { std::ofstream o; o.open("temp.cpp"); o << "#include <iostream>\n"; o << "int main(int argc, char* argv[]) {\n"; for (int i = 1; i < argc; i++) { o << argv[i] << '\n'; } o << "}\n"; o.close(); std::string s("cl "); s += "temp.cpp"; system(s.c_str()); return system(".\\temp.exe"); }実行する。
C:\temp\cpl>test "return 3 + 4 * 12;" Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. temp.cpp (……すごくたくさんのアンワインドセマンティクスに関する警告……) /out:temp.exe temp.obj C:\temp\cpl>echo %ERRORLEVEL% 51 C:\temp\cpl>当然の結果だ。
というわけで、別に普通にできることなのに、なぜC++では実行時にコンパイルしないでこれまで来たのか、そしてなぜ、ここ最近になってASP.NETとかは実行時にコンパイルするようになったのか?
CLRが仮想マシンだということはこのさい全然関係ない。
なんなら、上のC++プログラムをバーチャルPCの上で実行したって良いわけだし。仮想マシンでAPIが完全無欠なWin32API。
ヘッダファイルの参照の仕組みとプリプロセッサ。とはいっても実行時コンパイルしてすぐ実行というのに、この2つが制約になるこたないだろう。
速度かな?
でも、JSPのおそーいおそーい初回実行について知っていれば、あるいは最近のマシンは結構早いのに助けられてるからだろうけど、ASP.NETの遅い初回実行を知っていれば、そういうものか、で済ませられる程度の話だ。
必要ならば、最初に一発ダミーの要求を打ってやるというような手段もある。
上の例(test.cpp)は、動的コード(ここでは引数で指定するコード)に対して別段マクロは提供していないが(iostreamの参照だけを認めている)、便利なマクロを吐き出すソースコード上に定義することは可能だ。
その場合、動的コードはC++とは異なる書き方ができる。
LISP最強伝説にマクロという言葉が頻出するのはそういうことだ。
だって、不等号がたくさん出てくるから、tDiaryを普通に使っているとやたらと実体参照が必要になって面倒なんだもん。
ASP.NETの本質は実行時コンパイルにある。
もちろん、ふつうはテストをするからそれで構わないのだ。
でも、ってことは、すでに静的なコンパイルがあるから動的でアジャイルな言語(Rubyとか)ではなく、.NETを選びますとか、Java(JSP式言語について、どう処理されるか想像すれば良い)を選びますとか言えるのだろうか?
もちろん、言えない。恥知らずか無知でない限り。
それでも、Javaの場合にはまだビジネスオブジェクトとUIの切り離しがスタンダードだから、式言語程度でしか利用しないのなら知らなかったふりはできるだろう。
でも、ASP.NETの場合、App_Codeはあるけれど、コードビハインドのPage派生クラスにロジックを埋めることは多いんじゃないかな? (どうなんだろうね)
IISとの連動とかは、十二分に理由になるとは思うけど、つまりはプログラミング環境は選択の理由には、ほとんどならない。
つまり、テストは重要で、しかももっとも脆いのはUIの部分だ。
ここで、ASP.NETの場合、ユーザー定義サーバーコントロールがDIベースだというのが意味を持つ。
DIといえばテスト。
と、mumurikさんのブログを巡る旅の1つのコースが閉じる。
こいつらのテストってどうやるんだ?
というか、以前TagLib書いたとき何かやったような記憶があるが、作ったのは山ほどあるうちの2クラスだけだから全然覚えてないな。
というか、TagLibって良く考えなくてもうまい仕組みだったような気がしてきたぞ。
_ mumurik [そのうちControlBuilderとReadマクロを比較して普通のJavaユーザーの上を行く話を書こうと思いつつ最..]
copy java\util\prefs\Base64.java Base64.javaしてからパッケージ名変えるというんじゃだめなのかなぁ。 というか、Base64がオフィシャルに無いということはどういうことかと言うと、
なんだかなー感が漂うね。
僕はルックアップテーブルを使ったprefsの実装が好きかな。
RFC2045準拠度だと多分、security.utilsが固そうな気がする(xercesの実装を元にしたOptimized codeだとコメントしてるし)。
ちなみにprefsのはジョシュアブロックの実装と@authorに書いてある。
ジョシュアブロックといえば
Java Puzzlers 罠、落とし穴、コーナーケース(ジョシュア・ブロック)
こういうのも書いているしJavaOneでもやってるみたいだけど、僕が読んだのは幾つかのソースコードと、
Effective Java™ Programming Language Guide (Java Series)(Bloch, Joshua)
これ。
Effective Javaな人はルックアップテーブルを使うのであった。
int result = 0; for (char ch : "08Ab5") { result *= 16; if (Character.isDigit(ch)) { result += ch - '0'; } else if (Character.isLowerCase(ch)) { result += ch - 'a' + 10; } else if (Character.isUpperCase(ch)) { result += ch - 'A' + 10; } else { throw new IllegalArgumentException("bad character: " + ch + " in given string"); } } return result;多分、最適化すると
int result = 0; for (char ch : "08Ab5") { result *= 16; if (ch >= '0' && ch <= '9') { result += ch - '0'; } else if (ch >= 'A' && ch <= 'F') { result += ch - 'A' + 10; } else if (ch >= 'a' && ch <= 'f') { result += ch - 'a' + 10; } else { throw new IllegalArgumentException("bad character: " + ch + " in given string"); } }となる。
static final int[] lookuptable = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, 16, -1, -1, -1, -1, -1, -1, -1, -1, }; int result = 0; for (char ch : "08Ab5") { result *= 16; if (lookuptable[ch] < 0) { // maybe thrown IndexOutOfBoundsException throw new IllegalArgumentException("bad character: " + ch + " in given string"); } result += lookuptable[ch]; }となる。
ルックアップテーブルを参照する方法はロジックがコードからテーブルに移動するため、一般的にはメンテナンスがしやすく、しかも高速になりえる(ルックアップテーブルってドメインモデルみたいだな)。
追記:文字列に拡張forは適用できないのか。残念。
上のforは、for (int i = 0; i < "08Ab5".length(); i++) { char ch = "08Ab5".charAt(i);
と書いたものとしておこう。
さらに追記:leajistさんのツッコミが正しいですね、この場合。for (char ch : "08Ab5".toCharArray()) {
ということで。
QTは、embedタグで貼るんだけど、JavaScriptから、play、stopは当然として、秒数(だと思う)の取得、再生する秒数の設定(そこから再生始まる)、再生速度の設定とか自由自在なので音声再生には具合が良いらしい。で、Jsh使って、MP3でスクラッチ(死語かな?)みたいなのをやってみせたりして、とても刺激的だった。
FlashProxy: FlashからJavaScriptを呼ぶのはわりとどうにかなる(そうかなぁとかちょっと思い出してみたり)。でもJavaScriptからFlash呼ぶのはめんどう。イベントを取れないとか、あともう一点。そこでFlashProxy(AdobeのFlashProxyのこととは違う)。Flash側は汎用にして(JavaScript用拡張ライブラリということだろう)、FlashProxy経由でJavaScriptで呼び出すようにすれば可能性たくさん。たとえばマイクデモでは、息を吹きかけるとブラウザーがスクロールする。
空耳アワー
アテレコってのは、口をぱくぱくしている映像に音を当てることだが、そうではなく声が流れているところにまったく異なる文字を当てるということも逆にあっても良いだろうな、とかちょっと違うことを考えてみたり。
Miroとかあったなぁとか思い出したが、Quadro FX540ってクローン出力しかできないのか?
どうも勘違いしていたのではないか、と気づいた。
Officeについては、デスクトップとラップトップの2台にインストールできるわけだが、これは限定的なものだと思っていたが、よく考えてみたらそれはおかしいのではないか。
この2台というのは、プロダクトモードで利用するためのライセンスがOfficeについては与えられていて、それが通常のパッケージ版と同じく2台(というのは不正確で運用的な母艦とモバイル用)ということなのじゃないだろうか。
っていうのは、そうじゃなければOfficeを使った開発なんてできないからだ。(というか、開発マシンにはインストールできないと思ってたからインストールしてないわけだし)。
と、InfoPathをいじってみたいなと考えていて気づいた。
まじめにパスワード入力を扱う場合って、入力されたStringの内容をクリアしておく必要があると思うんだけど、というのは、後からヒープの中を見ることができるからだけど、kmem覗くって方法もあるわけだし、でも、Stringって明示的な破壊はできないはず。
と思って調べたらJPasswordFieldを使えば良いのか。というか、JPasswordField専用のJOptionPaneは無いのか。厄介だな。
JOptionPane pane = new JOptionPane("パスワード", JOptionPane.QUESTION_MESSAGE); JPasswordField pass = new JPasswordField(32); pane.setOptions(new Object[] { pass, "OK" }); JDialog dialog = pane.createDialog(this, "パスワード入力"); dialog.setVisible(true); if ("OK".equals(pane.getValue())) { char[] pwd = pass.getPassword(); if (pwd.length > 0) { // パスワード処理 Arrays.fill(pwd, Character.MIN_VALUE); } }
で、「思われる」が取れて、無事(なのか?)バグ登録されたようです(コメント欄参照)。
で、注目すべき点は、きしださんが再現コードを作ったことと、水島さんがコマンドライン用にさらに手を入れたこと(実際にはきしださんも作っていたようだけど。コメント欄参照)。プログラムってのは素晴らしいな。
(で、再現することを確認してみたりして)
DELL 9200CにVistaを入れてパフォーマンスを見てみる。
すると、ATI X1300Proってのは少なくてもNvidia7600GSよりパフォーマンスは悪いみたいだ。
というわけで心置きなくサーバー用に潰すことにする。
そこでいろいろ考えた末、Solaris10にしようと思ってブータブルDVDとか作ったのだが、うう、ディスクを認識しない。
でも何かやり方が悪いだけかも、と考えて、SunのサイトからDevice Chckerをダウンロードする。が、サポートしていないOSとか言われる。ああああああ、Vistaだからか。
で、しょうがないので、XPに戻すというのもあほくさいので、Debianと思ったらx64は次期からなのか。それでTestingのNetinstを始めたり。でもドキュメントを読むとSATAで問題ありとか書いてある。でも対処法も出てるのでOKと思って進めるとやっぱりCDを認識しない。
書いてあることを順に試してもだめ。USB接続のCDならどうかと思うと、そもそもブートしない。で、BIOS設定に入ってみる。と、ATAとAHCIのどちらかという設定に気付いた。設定はAHCIになっている。ATAじゃないからだめだったのか。で、ATAに変更してリブート。でもやっぱり認識しないな。認識しないといったって、ブート時はちゃんと動作しているわけだし、メッセージ上も認識しているようなのだが。
で、ちょっと戻ってSolarisを入れてみると今度はすんなりと入っていく。ATAに変えたのがこっちではきいているようだ。途中USBマウスでいろいろあったが、特殊なKVM切り替え器のせいかな、と直接予備のマウスを差したら先へ進めたり。
でもふと気付くとx64をインストールしたいのにx86になっているのだが。EM64Tはだめなのかな? でもそりゃないだろう。なんで選択できないんだ? というところまで。
#今気付いたが、LilyPondのSolarisバイナリは無いようだ。しかも、ソースからのコンパイルはお勧めしないとか書いてあるし。ちょっと仕切り直そうかな。
#追記:さらにチップセット内蔵NICを認識してないことがわかって困る。ubuntuの6.10で9200Cが動いている情報を見つけたのでそっちを検討してみる。
#ubuntuはすんなり入り、完全無欠(しかしどうも自由の2文字が欠けているように感じるのはなぜだろうか)に見える。が、emacsが無いじゃん。aptitudeでemacs21を入れる。が、skkが入ってない。困る。と思って調べたらるいもさんが書いているページを再発見。
これすごいな。ただあまりに画面がきれいにまとまり過ぎているので自由度が低く感じるのかも知れない(プロプラっぽ過ぎる印象を受けているみたいだ)。比較的新し目のマシンなのにデバイスの自動認識が完全なのは驚くべきだ(まるでWindowsみたいだ。でももう面倒くさいからそのほうが望ましいわけだが)。
今のところ難点は、スリープから画面の復帰ができないこと(最終的には連続稼動になるので問題じゃない)。ウィンドウの再描画がものすごく遅いこと(多分、nVIDIAだと速いんじゃないかな? ATIの新し目なGPUなのが問題なんだろうとは思う。Firefoxをドラッグしたりすると紙芝居が始まるので悲しくなるわけだが)。ただ、これも最終的にはWindowsからXで入ることになるから、まあいいや。むしろ、このままDesktop版で走るか、Server版に入れ替えるかが悩みどころのような。
function false_check(x) { if (x) { alert('true'); } else { alert('false'); } } false_check(false); false_check(0); false_check(Number(0)); false_check(new Number(0)); var x; false_check(x); false_check(Boolean(false)); false_check(new Boolean(false)); false_check(Boolean(new Boolean(false)));
function substr(s) { try { alert(s.substring(0, 2)); } catch (e) { alert(e); } } StringX = function(x) { this.value = x; } StringX.prototype = "abcdef"; StringY = function(x) { this.value = x; } StringY.prototype = new String("abcdef"); var x = new StringX("abcdef"); var y = new StringY("abcdef"); substr(x); substr(y);
alert('abc'); alert(new String('abc')); alert('abc'[0]); alert(new String('abc')[0]);(追加:IE7とFirefoxでは表示が異なる。どちらがECMAScriptの仕様に合致するか答えよ)
var x = [1,2,3,4,5] var y = x.concat([6]); x[0] = 8; alert(y); x = [1,2,3,4,5] y = x.reverse(); x[0] = 8; alert(y); x = [1,2,3,4,5] y = x.push(6); alert(y);
function eval_result(x) { try { alert(eval(x)); } catch (e) { alert(e); } } eval_result('a'); eval_result("32 +"); eval_result(32); eval_result(1, 3); eval_result(["e", "v", "a", "l"]); var s = "eval_result(s)"; eval_result(s); var x = "eval_result(x)"; eval_result(x); eval_result("eval_result(1)");
Test = function(x) { this.value = x; } Test.prototype.get = function() { return this.value; } XTest = function(y) { Test(y); } XTest.prototype = new Test(0); var x = new XTest(3); alert(x.get()); Test.prototype.sub = function(x) { return this.value - x; } alert(x.sub(30)); Test2 = function(x) { this.value = x; } Test2.prototype.get = function() { return this.value; } XTest2 = function(y) { Test2(y); } XTest2.prototype = Test2.prototype; var x = new XTest2(3); alert(x.get()); Test2.prototype.sub = function(x) { return this.value - x; } alert(x.sub(30));
Test = function(x) { this.value = x; } Test.prototype.get = function() { return this.value; } XTest = function(y) { this.value = y; } XTest.prototype = new Test(0); var x = new XTest(3); alert(x.get()); Test.prototype.sub = function(x) { return this.value - x; } alert(x.sub(30)); Test2 = function(x) { this.value = x; } Test2.prototype.get = function() { return this.value; } XTest2 = function(y) { this.value = y; } XTest2.prototype = Test2.prototype; var x = new XTest2(3); alert(x.get()); Test2.prototype.sub = function(x) { return this.value - x; } alert(x.sub(30));
Test = function(x) { this.value = x; } Test.prototype.get = function() { return this.value; } XTest = function(y) { this.value = y; } XTest.prototype = new Test(0); var x = new XTest(3); alert(x.get()); XTest.prototype.sub = function(x) { return this.value - x; } alert(x.sub(30)); var x = new Test(3); alert(x.sub(30)); Test2 = function(x) { this.value = x; } Test2.prototype.get = function() { return this.value; } XTest2 = function(y) { this.value = y; } XTest2.prototype = Test2.prototype; var x = new XTest2(3); alert(x.get()); XTest2.prototype.sub = function(x) { return this.value - x; } alert(x.sub(30)); var x = new Test2(3); alert(x.sub(30));
var add = new Function('a', 'b', 'return a + b;'); alert(add(5,6)); var mul = new Function('a,b', 'return a * b;'); alert(mul(5,6)); var div = Function('a', 'b', 'return a / b;'); alert(div(10,2));
var func = function(x) { if (x == 0) { return 1; } return x * arguments.callee.call(null, x - 1); } alert(func.apply(null, [5]));
RegExp
Test = function(x) { this.value = x; } XTest = function(x) { Test(x); } XTest.prototype = new Test(0); var x = new XTest(10); alert(x.value);
想定できる動作は、
Test = function(x) { this.value = x; alert('Test():' + this.value); } XTest = function(x) { for (var p in this) { alert(p + "=" + this[p]); } Test(x); for (var p in this) { alert(p + "=" + this[p]); } } XTest.prototype = new Test(0); var x = new XTest(10); alert(x.value); for (var p in x) { alert(p + '=' + x[p]); }
実際に動かすと、thisが同一と仮定すると
Test = function(x) { this.value = x; } var test = new Test(10); XTest = function(x) { Test(x); } XTest.prototype = test; var xtest = new XTest(11); var xtest2 = new XTest(12); alert(test.value); alert(xtest.value); alert(xtest2.value); test.value = 38; alert(test.value); alert(xtest.value); alert(xtest2.value); xtest.value = 40; alert(test.value); alert(xtest.value); alert(xtest2.value);
む、コンストラクタのスコープで代入しないとプロパティが作られないということのようだ(というか実行コンテキストのthisが別のものになる)。(ECMAScriptのnew expressionの仕様(11.2.2)ではこの部分の詳細な動作は規定されていないように見えるけど、違うところを読んでいるかも——追記:規定されるもなにも定義した通りに動作しているだけ)
結論:オブジェクトによって異なるプロパティ値が必要な場合、コンストラクタから呼び出したコンストラクタ内で定義したプロパティはコンストラクタ内で上書きしなければならない。もしプロパティの初期化処理を共通化したいなら、こうすりゃいいかな。
function setValue(o, v) { o.value = v; } Test = function(x) { setValue(this, x); } XTest = function(x) { setValue(this, x); } XTest.prototype = new Test(0); var x = new XTest(10); alert(x.value);
別の言い方をすると、クラス変数に相当するものは、prototypeとして利用するオブジェクトのプロパティを利用すれば良い。と書いたけどそれだけでは間違い。自分をthisとして代入するとその時点で新たなプロパティが作られるので、書き換え可能なクラス変数とはならない(読み込み専用となる)。あくまでもprototypeののプロパティを利用する。
function ctr_in_ctr5() { Test = function(x) { this.classvar = x; } XTest = function() { ; } XTest.prototype = new Test(30); XTest.prototype.cvarset = function(x) { XTest.prototype.classvar = x; } XTest.prototype.cvarget = function() { return XTest.prototype.classvar; } var x = new XTest(); alert(x.cvarget()); var y = new XTest(); alert(y.cvarget()); x.cvarset(31); alert(x.cvarget()); alert(y.cvarget()); }
遅い遅いと思ったらvesaになってた。(コメントはATIと出てるのでてっきりATIのドライバが利用されてると思った)
で、xorg.confでvesaからatiへ書き換え。
すると、Xが起動できない。ログを読むと、こんなチップは知らないと出ている。むむ。
でも、ふと気づいたがrestrictedなドライバーを落としてたはずだ。で、選択肢を見るとfglrxというのが確かにある。で、そっちに書き換え。
お、使える。というか、普通にウィンドウが移動できる。
めでたし(実際にはdpkg-reconfigure xserver-xorgしているわけだが、なぜか勝手にkbdをusの105にしてしまう。そういえば最初のインストール時にはusと勝手になっていたので手動で修正したのだが、指がASCII配列を覚えているとは言え、使いにくいので手で修正。HWはREALFORCE USBタイプ)。
で、音を聴くためにいろいろやってたらFlashが無いことに気づく。なぜだ? で、x64で動いていることを知り。というか、x64用のFlash playerってないのかな?
配列はわかるがListがわからないと言われて、Listを教える。C#の話だ。
何がわからないのかと聞くと<>が一番わからないらしい。
っていうか、もうCを最初に教えるのはやめれ、と思った。せめてC++にしといてくれ。
と、考えると、C++のSTLは最初に覚えるには規模がでか過ぎる。C#かせめてJavaくらい(LinkedListの分だけ多いような気がする。もっとも<>の中に書けるタイプの数はC#のほうが倍以上ありそうではあるが、プリミティブだけで)が良さそうだな。
どうも、最初に教えとくべきものほど後から実装されているんじゃなかろうか。そりゃ、知恵は後からついて回るからかも。でも、JavaにしたってC#にしたって、最初の時点で型パラメータって考えはあったんじゃなかったかなぁ(Javaはもっと遡るといささか微妙かも知れないけど)。
中途半端なのだ。
型を教える/強制する言語を教えるのなら、本当に強制すべきだし、そうじゃないなら、そんなものは表面上は見えないものを教えるようにしといて内部表現に分け入るときに知れば良いのだ。と思ったけどclassがあればそれは型を作るときなんだから、そんなに単純ではないのか。型はどちらにしても教える必要があるなぁ、じゃなかった、記述上、強制するなら完全に強制すべきで、そうじゃないなら無しのほうが良いということだった。
一日中大江戸線で移動か。
svnを後から1.4にしたのが敗因か、それともtracを.10に上げた時点からなのかも今となってはわからないな。svnのpythonバインディングは作るのを忘れてたので昨日作ったのだが。
python -c "import svn"はエラーにはならないが。
GWTとはGoogle Web Toolkitのことだ(Apache Licence 2.0)。
豆蔵ナイトで、江川さんのレクチャーに行ってきた。
入門Google Web Toolkit(吉野 雅人)すごくおもしろいなと感じたのは、江川さんのプレゼンの中で、Ajaxとかを業務システムに組み込む時の問題点として、従来のQAとかで対応できなくなる(たとえばJavaScriptでのカバレッジ率とか)=採用したくても採用できないというのがGWTを採用することでクリアできるというような視点だった。僕自身は考えもしなかったが、妙に説得力があった。
GWTは、Java 1.4.2のサブセットのランタイムライブラリと最終的にはDOMに変換されるJavaのクラスライブラリ、Java→JavaScriptコンパイラ、JavaScriptエミュレータ搭載ブラウザ(GWT用に記述したJavaプログラムをJavaScriptとして実行可能なブラウザ)から構成される。開発時はJava1.4.2以降のJavaそのものが利用されるから、NetBeansやEclipseで開発できるということだ。
正直言って、自分ではまったく使いたくは無いツールキットだが(と言うと嘘になる。ある種のアプリケーション用には向いているからだが、ここでの文脈とは異なる)、確かに有用性はわかる。しかも、どう考えたって企業システム開発用にしか意味がなさそうなツールキットを、なぜかGoogleが出してきたというのが興味深い。だって、PythonでもなければRubyでもなく、もちろんJavaScriptそのものでもなく、JavaでEclipseとかNetBenasとかで型チェックしながら開発するわけだからね。
これ使って開発したAjaxアプリケーションはWeb2.0とは言わないんだろうか? と思ったが、逆にこれを使ってコンパイルエラーを全部つぶして、カバレッジ率100%のソフトウェアにこそ「Web2.0」という名前が付けられることになるのかも。つまり、Web2.0企業と呼ばれる企業が使うのではなく、Web2.0という言葉を唱えたい企業が使う。で、プログラムそのものはまるでSwingだ。
本からTextAreaのところをちょっと引用。数字キー以外ははねるという処理。
TextArea textArea = new TextArea(); textArea.setCharacterWidth(40); textArea.setVisibleLines(10); textArea.addKeyboardListener(new KeyboardListenerAdapter() { public void onKeyPress(Widget sender, char keyCode, int modifiers) { if (!Character.isDigit(keyCode)) { ((TextArea)sender).cancelKey(); } } }); RootPane1.get().add(textArea);
うむ、読みやすい(=何をやっているか見通しが良い)。
以前、GWTの話を聞いてJavaScriptはDSLで表現されるようになるんじゃないかとか、ここで与太を飛ばしたけど、これ、まったくそれだ(あまりにも極端なのである意味予想外の方向だけど。でも極端じゃなきゃ意味がない)。というのも生成されるJavaScriptがすげぇのなんのって、C++をコンパイルして生成したx86アセンブラよりもっと強烈だ。難読化のためなんだろうか? というか、JavaScriptハッカーでかつパズル好きなら、GWTが生成したJavaScriptを追ってみると死ぬまで楽しめると思う。おれはいやだね。だから多分、Javaで記述したうちに検証をかっちりできるようにしてるんだ$蹐Δ韻鼻/p>
これは、業務アプリケーションの開発プロジェクト用に特化したJavaScript(Ajax)アプリケーション開発用のランゲージだ。確かにそうだ。
で、江川さんたちの本は、クラスライブラリの解説と、S2DaoやS2Containerとかを組み合わせたGWTアプリケーションのチュートリアル、テスト、チップスとか。
ここでS2が出てくるのは、これもおもしろい。確かにGWTが企業システム向けなら、プレゼンテーション層がどうだろうが、モデルはモデルだ。
もう1点。テストと言えばGWTの初期化が必要なので単にTestCaseを継承するとGWTのWidgetいじるとエラーになる。そこでGWTはGWTTestCaseというクラスをスーパークラスとして用意している。良い時代だ。
Eclipse以外の環境を利用したくなくて、かつ静的な型検証がなければ落ち着かなくて、しかもAjaxを使いたいのなら、試してみる価値は大いにありそうだし、そういう意味で江川さんたちの本は良いタイミングみたいだな。
でも、おれはASP.NETとRailsの2股があればとりあえずは十分なんだよな。今のところ。(Atlasの方向とGWTの方向の相違がまたおもしろいわけだが)
#で、もちろん、JavaScriptそのものをとても気に入っている今日この頃だし。
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.ja/dv_aspnetcon/html/dfaaa7d4-e1f2-4322-b2f5-796e0419f185.htm
「クライアント スクリプト関数の作成」のサンプルコード
誤)Page.GetCallbackEventReference
正)Page.ClientScript.GetCallbackEventReference
多分、これは誰もが読むべき(で、その後、自分の立場、見解、方向を考察してみるべき)筋合いのものだと思う。
ので、リンクしておく。ほんとうの創作者利益について
via ものがたり
遅くなりましたが、るいもさんとの連載が掲載されている「開発の現場」が発売されています。
今号は前号に引き続き、ソースコード管理の後編です。
巻頭記事はアークランプの中の人(結構ご縁があって時々顔を合わせることがあったりする——というか昨日も遭遇してたり——ゆうすけさんと書いたほうがいいのかな? さらに本業で微妙なニアではないけどミスしたようだったり)とかで、興味深かったり。(アークランプって、なんか時々ものすごくおっちょこちょいな感じを受けるんだけど、根がまじめな感じで好感は持ってるんだよね)
Prev by Dateを見よ。
nspluginをダウンロードする。
とか、スラドを見ながら作業。
と、rpmなのか、と手が止まる。
フランス人のページが見付かったので真似してみる。
$ sudo apt-get install alien linux32 $ wget http://gwenole.beauchesne.info/projects/nspluginwrapper/files/nspluginwrapper-0.9.91.2-1.x86_64.rpm $ wget http://gwenole.beauchesne.info/projects/nspluginwrapper/files/nspluginwrapper-i386-0.9.91.2-1.x86_64.rpm $ sudo alien -d nspluginwrapper*.rpm $ sudo dpkg- i nspluginwapper*.deb
alienってrpmをdebに変換するツールなのか。
$ sudo dpkg -i nspluginwrapper*.deb 未選択パッケージ nspluginwrapper-i386 を選択しています。 (データベースを読み込んでいます ... 現在 114936 個のファイルとディレクトリがインストールされています。) (nspluginwrapper-i386_0.9.91.2-2_amd64.deb から) nspluginwrapper-i386 を展開しています... 未選択パッケージ nspluginwrapper を選択しています。 (nspluginwrapper_0.9.91.2-2_amd64.deb から) nspluginwrapper を展開しています... nspluginwrapper-i386 (0.9.91.2-2) を設定しています ... nspluginwrapper (0.9.91.2-2) を設定しています ...ここまではあっさりできたみたいな気がする。で、Flash9を入れてみれば本当にうまくいってるのかわかるはず。
$ sudo alien -d flash-plugin-9.0.31.0-release.i386.rpm Warning: Skipping conversion of scripts in package flash-plugin: postinst prerm Warning: Use the --scripts parameter to include the scripts. hostname: Unknown host hostname: Unknown host Package build failed. Here's the log: dh_testdir dh_testdir dh_testroot dh_clean -k -d dh_installdirs dh_installdocs dh_installchangelogs find . -maxdepth 1 -mindepth 1 -not -name debian -print0 | \ xargs -0 -r -i cp -a {} debian/flash-plugin dh_compress dh_makeshlibs dh_installdeb dh_shlibdeps dh_gencontrol dpkg-gencontrol: error: current build architecture amd64 does not appear in package's list (i386) dh_gencontrol: command returned error code 65280 make: *** [binary-arch] エラー 1 find: flash-plugin-9.0.31.0: No such file or directoryつい味をしめてalienを使ってみようと思ったら、なるほどアーキテクチャを見ているのか。当り前か。で、素直にtar.gzを展開してテンポラリなディレクトリにコピーしてから、
$ sudo nspluginwrapper -i /usr/lib/plugin-web32/libflashplayer.so /usr/lib/nspluginwrapper/i386/linux/npviewer.bin: error while loading shared libraries: libgtk-x11-2.0.so.0: cannot open shared object file: No such file or directory /usr/lib/nspluginwrapper/i386/linux/npviewer.bin: error while loading shared libraries: libgtk-x11-2.0.so.0: cannot open shared object file: No such file or directory nspluginwrapper: /usr/lib/plugin-web32/libflashplayer.so is not a valid NPAPI pluginなぜだ? libgtk-x11-2.0.so.0は当然のように入っているのだが。
$ ldd /usr/lib/plugin-web32/libflashplayer.so linux-gate.so.1 => (0xffffe000) libdl.so.2 => /lib32/libdl.so.2 (0xf77f8000) libpthread.so.0 => /lib32/libpthread.so.0 (0xf77e5000) libX11.so.6 => not found libXext.so.6 => not found libXt.so.6 => not found libfreetype.so.6 => not found libfontconfig.so.1 => not found libgtk-x11-2.0.so.0 => not found ...
あ、32ビット版のライブラリが必要なのか。面倒になってきたので、また今度にしよう。
と思ったけど、Synapticを見たらia32-libs-gtkというのを発見したのでインストール。
$ sudo nspluginwrapper -i /usr/lib/plugin-web32/libflashplayer.so
あっさりと入った。
$ sudo ln -sf /usr/lib/mozilla/plugins/npwrapper.libflashplayer.so /usr/lib/firefox/plugins
おお、youtubeが見える。でも音が出ない。というところまで。
寝る前に思い付いて(というか気づかないほうがどうかしてる気もするが)32ビットALSAライブラリ(lib32asound2)をインストールして完了。快適な環境だ。
見本誌をいただいたので読む。
COMPUTERWORLD (コンピュータワールド) 2007年 03月号 [雑誌](-)
米国版の翻訳記事だが、向こうのCOBOL事情というのもすごいな。マイクロフォーカスのCOBOLは.NETなんでVisual Studioで動くのか(富士通だか日立もそういえば出してたのを思い出す)。
というか開発言語の利用状況(複数回答あり)のComputerworldサーベイだと1位のVB(67%)に次ぐ62%の堂々の2位で、3位のJava(61%)を引き離しているありさま。社内アプリケーションの占有率が60%以上の企業が43%、新規開発での利用状況が58%、以前、生越さんが軽く書いてた通り以上の状況になっている。ただ、アメリカ事情かな、と思うのがプログラマの平均年齢が高くて、日本の企業プログラマではちょっとありえないかな、という気もするところ(45〜55歳が52%で過半数越え)。日本の企業のキャリアのあり方だとこの年齢層のプログラマというのはほとんどいないんじゃないかな。おれはそうだけど、特殊といえば特殊な気はするし。なんというか、層の作り方がへたくそで、いつも薄い層しかないような気がしている美しい国(美国のほうじゃなくて)だったり。ミルクレープのような。食べれば甘いがそれだけだ。
#バッチを考えてみろ、現在も標準化が進行中(XMLとかOOコレクションとかIEEEの浮動小数点とか。最後のが現在標準化案策定中というところが、この言語の特色みたいな)とか、メリットから見た論考も入っているので状況はわかりやすい。
あと、以前も思ったんだが、巻末のほうの佐々木、江島、栗原3氏の1ページコラムが、Web上のとはまた違った味わいで読みやすく、おもしろいんだけど(2.0と付けるってのは1998年のBusiness 2.0という雑誌が嚆矢だとか)。エディトリアル(というカタカナ)が強い雑誌という印象はそのへんからも受けてるみたいかも(レイアウトとかページデザインが好きなのが最初に来るわけだが、コンポジションを眺める雑誌というわけではないからだろう)。
#コンピューティングはコンピューティングで土俵は同じなんだよね。
70年代後半から80年代前半にかけてのUKチャートって不思議だった(カラクリがわからなかったからだ)。Pistolsの大ヒットだの、ブームタウンラッツのラットトリップがチャート席捲だの、トム・ロビンソンの2468モーターウェイだの。
Power in the Darkness (CCCD) [Bonus Tracks](Robinson, Tom)
その後もギャリーヌーマンがカーズで1位とか。
でも、USチャートって、どうでも良いパチンコ屋のBGMにもならないような音楽ばかり。日本のチャートもオフコース(嫌いなのの代表のひとつ)だし。
そのあたりの知識から、チャートのトップってことは、みんながそれを聴いているってことだと想像するわけだから、するとイギリスではコーダ伯爵も森番の老人も子供も大人もみんなトムロビンソンを聴いて拳を振り上げたりしてるのか? と疑問に思うわけであった。
後になって、そうではなくて、英国は単に音楽マーケットが小さいから、ちょっとある層の人達が買うとそれだけでチャートの上位に入るということがわかったので、納得したわけだった。
プログラミング言語マーケットというのもそんな感じのマーケットだ。
オフコースを好きな連中はオフコースオフコースもちろんオフコースと連呼してるかも知れないが、演歌(しか名前知らないのでいい加減)とかのほうがヒットしてたりして。ましてアメリカじゃ、片方でMTVチャートがあったりしてもやっぱり売れてるのはC&Wだったり。
だから、意味ある調査って、層分けしなきゃだめかも知れないな。
Eコマース系、Webサービス系、企業情報系、企業勘定系、教育関係、研究系(これはさらにどの方面の研究かとかで細かく分類しないとさらに無意味かも)、といった具合にだ。で、それぞれの割合に各系ごとの市場規模を乗じて割合を出す。うむ、COBOLが強いんだろう。でも、企業の時価総額を市場規模の算出に含めると、Pythonがすごく強かったりするかも。
でも、そう分類すると実は意味なんかなくなっちゃうような気がするのだった。
というのは、プログミング言語で肝要なのは、
−種別1
・プログラマが気持ちよく仕事できる
−種別2
・設計者の設計通りにプログラマがメイキング(という妙な言葉をこないだ耳にした)できる
・したがって方眼紙で進捗管理ができる
−種別3
・発注者(多分勘違いしているか騙されている)が、同業者の集まりで「うちは今度〜でシステムを刷新するんですぞ」と自慢できるほど満足を高められる
−種別4
・設計者=プログラマが、要求に応じてシステムを構築できる/要求者=プログラマが、必要な結果を出力できる
といった、実際の顧客満足度にどれだけマッチしているか、だからだ。
(実際には何を使っても動くものは作れるのだから、何に着目するかに過ぎない。別の切り口にはパフォーマンスという観点があるが、これは本当に有意な計測が難しいので結局は選択しないのと同じことになってしまう)
おれだったら、上のとりあえず挙げてみた4種別に対して、それぞれ1つのプログラミング言語をマッピングするとすると、どうするだろうか?
1は今のところRubyか、C#か、Javaだな。
2だったら、設計の粒度を方眼紙の升目に合わせるわけだからCにするかも。現実的にはJava、プログラマがいればCOBOLも悪くはない。C#はちょっとインタラクションが入りすぎるので方眼紙には合わなそうだ。
3だったら、社会通念に照らし合わせてJavaだろうな。
4だったら、おれの要求する出力なんだから、Ruby、速度重視かつOffice系ならVBA、あとはJDKかCLRか使いたいクラスの有無でJavaかC#というところ。
#顧客満足度という観点では、COBOLは安心感という点から高めを狙えるのかな? (そこで将来的な不安感を煽って顧客満足度を低めて別口を売り込むという手口を使っている人たちも居るだろう)
Kazzzさんが恐ろしいエントリーを上げているけど、どの場合にそうなるんだろうか?
僕のVista環境ではまだWebアプリケーションを動かせるようにはなっていないので、以下の簡単なプログラムを試した。
import java.net.InetAddress; public class HostAddr { public static void main(String[] args) throws Exception { System.out.println(InetAddress.getByName("localhost")); } }これをXP SP2と、Vista RTMで実行するとどちらも出力は
localhost/127.0.0.1となる。
using System.Net; public class Host { public static void Main() { System.Console.WriteLine(IPAddress.Loopback); } } /* * 追記: このプログラムは間抜けでした。 * System.Console.WriteLine(IPAddress.IPv6Loopback); * というのが書けるわけで * でも、XPSP2だと0000:0000:0000:0000:0000:0000:0.0.0.1 * Vistaだと::1 * となって出力が異なるのはもしかしてすごく嫌な気がするんだが。 * IPAddress.Loopback = IPv4アドレスなんだから当然の結果。 */こっちの場合は、どちらも
127.0.0.1
だ。この結果を見ると、VistaだからといってIPv6アドレスが返るようには見えないのだが。
でも確かにVistaでping localhost
を実行すると、Kazzzさんのところと同様に::1
が表示される。
なんでもやってみるものだな。
どこかの誰かがアフィリエイト経由でカントの啓蒙とは何かを買ったのだった。カントは子供のころ、正確無比な行動のおかげで近所の人たちが時報代わりに使ったというエピソードくらいしか知らずに過ごしてきたから、この人がルソーなんかのフォロワーだということすら知らなかった(あるいは知っても忘れていた)。でも、時計のように暮らすってことは、時間を無駄にしないとも言えるわけだな。ただものじゃない(少なくても真似できないし、したくない)。
そこで、これも何かの機会だからと買って、他に読む本もあるんだが、各論考が短いからっていうのもあってつい読んでしまった。
感動した。すげぇおっさんだ。これが、18世紀、明治維新の100年前に書かれたことなのか。すでに民主主義とか集団知(!)とか、について考察してたのか。
哲学にはいくつかの目的があるが、カントの目的は政治の持つ2つの側面のうち、富の分配と利害調停では無いほうの側面、つまり富を蓄積しやすくするための治世の方策のほうの哲学だということを知った。(このジャンルの哲学をおれが好むということもある。中国の諸子百家の各種哲学というのも、ほとんどはこのジャンルに属する。つまり、優れた王は優れた治世により国民を富ませる。しかしその治世の方策は属人性に帰する(その王様が偉かったということ)。したがって、次の王、別の王、異なる国では、そのような治世を行えない。したがってせっかくの治世の方策が無駄になる。そこでこのジャンルの哲学は、その属人性に分け入り、普遍化することで(経綸とすることで)、劣った王でも優れた治世を可能とすることを最終的な目的とする。今は王が不在なので、そしてそんなものには戻って来てはほしくはないのだが、そこでこの種の哲学も限りなく不在にならざるを得ない)。
カントの場合は、啓蒙君主のフリードリヒ2世の治世を元に考察する。啓蒙というのは、他人の考えの影響下にある状態を抜け出し自分で考えるようになることだ、というのが当面の結論だ。
次に、それが無秩序となり破壊方向に進まないための制限を加える。
公共の福祉という考え方の原点にはこういう哲学があるのだろうな。
社会益となるものについては無制限の許可を与え、個人益となるものについてはこれを制限する。
戦場で出会った敵は撃ち殺し、上官の命令には絶対服従せよ。兵役についているというのは個人のロールである。理性を私的領域に使用する自由は制限されているのだ。しかし、非殺を説き、不服従の哲学を展開するのは大いにやるべし。その論を張るというのは公のロールである。理性を公的領域に使用するのは完全に自由だ。牧師は説教壇の上では神の愛を説かなければならない。しかし、無神論の著述を行うのは大いに結構。
そのようにして、多くの論が生まれお互いに揉まれることで、社会は反動したり進歩したりしながら、正しい道筋を進んで行く、というのが要点だった。
それにしても、おれは啓蒙君主というものを長いこと誤解していた。単に学問にお金を出したという程度のものだと思っていた。そうではなく、少なくてもカントが描くところの(時代的な制約や政治的な立場などを差し引いた上でも)フリードリヒ2世は、言論の自由を保証した故に啓蒙君主なのか。
ところで、アジャイラーはカントに影響を受けたのだろうか?
(引用注—他人の指導がなければ自分自身の悟性を使用し得ない状態にとどまっている原因は)悟性が欠けているためではなくて、むしろ他人の指導がなくても自分自身の悟性を敢えて使用しようとする決意と勇気とを欠くところにあるからである。…(略)…「自分自身の悟性を使用する勇気をもて!」——これがすなわち啓蒙の標語である。
どうも、この「勇気」という言葉がすごくアジャイルっぽく響くのだ。そして、どうも哲学のもつ政治の方策面への関与という側面を強く現在において受け継いでいるのが、プロジェクト管理に関する方策面での種々の論考なように感じるからだろう。
さて、あなたの頭の中は空っぽの洞窟だ。洞窟だけど洞窟のイドラは今はいない。
準備ができたかな?
NHKを見てみよう。
めがねをかけた薄気味悪いとっつぁん坊やが演説してる。
「情報を集める。情報を全部集める。検索している情報はすべて吸い上げる。全部、全部」
これって、悪の親玉以外には見えないね。
(空っぽの頭の)僕は、この人を見て、ドクターノオとか、パトリオットゲーム(違ったかも)トゥモロー・ネバー・ダイ(多分)の敵役のメディア王とかを連想したよ。
お……お……おまえは……何をしようというんだ
1000人(1個大隊)の博士を率いて
おまえは一体何をするつもりだ
おっかねーなー。
おいおい、株式市場の支配かよ。
こわいこわい。
#という演出だった。
プログラミングについての知識がゼロの状態からLISPを学ぶというわけじゃないと思えば、別にelisp(EmacsのLISP)でいいじゃん。そりゃCommon LISPとは違うかも知れないけど、何が違うかくらいは必要になった時にわかるだろう。C99じゃなくてANSI CでだってCは学べる(相当違う気がするけど)。
ってのは、カッコが問題だってだけなら、つまりカッコにまずは慣れときゃいいわけだし。
で、安い、軽い、薄い、読みやすいのがこれだ。
リスト遊び―Emacsで学ぶLispの世界 (ASCII SOFTWARE SCIENCE Language)(山本 和彦)
内容はリストの操作と再帰がほとんど。でも、それでいいじゃん。それ以上のことをしたければその後でやりゃいいんだから。もし、やっぱりカッコがいやなら、どちらにしてもそこまでだ。だったらこの薄さなら最後までは読めるだろうし。
ちなみにこの本で知った豆知識:
while (i < 100) のwhileという英単語にしっくりこない人はいないと思う。知らなきゃそれまでだけど。
ではfor (int i = 0; i < 100; i++)のforとは? 繰り返しの「ために」? ではもちろんなくて、これは期間を示すfor。例文: for a while(暫時), for tow days(2日間)。したがって、forはwhileと同様に「〜の間」という意味。
思わぬ本がアフィリエイトの直接クリックで買われていて、いったいどんな言及をしたのか気になって調べていたら、このリンクを発見して、思わず読みふける。そのときもおもしろがっているが、今読んでもやっぱりおもしろい。それもすごく。
Emacsキーバインドで、イミディエイトウィンドウの操作が可能になった!!!
やっとまともなIDEと言えますな。
でも、職場のVS2005にはSP1が入っていなくて今日一日、死ぬほどうんざりしたのだった。
今、自分のバグで、.NET FrameworkのXMLDocumentを疑った。
自戒の意味で、そのバグのあるプログラム。
function htmlEncode(s) { return s.replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&'); }
20年以上ぶりか、に読み返し、それほど変化はないようでもあり、大いにあるようでもある。
コンピュータの操作と身体感覚。
テクノロジーをほめたたえる文章などは、だれでも無責任に書きちらすことができます。
そんなものをのせるより、テクノロジーをつかって編集システムを変えることや、
すっきりとしたページをレイアウトするほうがたいせつなことではないでしょうか。
作品は、その作者の占有物ではなく、共同作業によって完成するという強い意思。音楽は、楽譜に書いただけでは作品ではなく、演奏され、それが聴かれ始めて音楽となる。
プログラムはソースを書いただけではただのテキストに過ぎず、解釈され実行されて始めてプログラムとなるのか、それともテキストの状態をプログラムと呼ぶのか。
9600bpsではうまく動く(ターゲットデバイスが)のだが、38400bpsだとエラーがちかちかする。つまりうまく動いていない。しかしホスト側ではエラーを検出していない。いずれにしても本物のシリアルだとうまく動いてた(ターゲットデバイスが。ホストの能力不足という可能性もゼロじゃないのかな)。
何を調べりゃいいんだ?
というところで、10年以上前に廃棄したオンラインモニタ(HW)がほしい。送ったつもりのものが送れてなけりゃそれが原因だろうし、立てたつもりもないシグナルが立ってればそれが原因だろう。
なければ作れば良いのだが、ソフトは作れるがハードはどうすりゃ良いのか? RS232Cのメスから2本ケーブルを出せば良いのか。で片方をホストにつないで片方をモニタマシンにつなげる。でモニタ側は読んでいれば良いのか? (2つに分岐した場合って減衰したりしないんだっけ、というかそのあたりの電子的な知識が無いというのは辛いな)
という具合にハードウェア(といってもたかがケーブルなのだが)で最初から躓いている上に、なんか昔のインターフェイスに出てそうなプログラム(中島信行さんとかがさらっと特集号でリストを掲載してたりしそうだ)を今更作るのもなんかかったるいな、とかいろいろ考えたり。
(で、結局、試行錯誤することになるんだろうか、というか面倒なんで9600bpsに落としてしまうという逃げ方もあるわけだし)
アマゾンというのを、みんな列車を愛してるから眺めてみたり。
もし、おれが無人島に住んでいて、CD PlayerはあってもCDがなければ、What's Going onと、とうにゴールドラッシュを過ぎてと、夜のハエ男(という意味ではないけど)、スペシャルズと、クラッシュシティロッカーのシングルズと、キャッチアファイアー(ジッポのジャケットじゃないんだな。ガンジャきめてるところがキャッチアファイアーなのか? フォーハンドレッドイヤーズ、フォーハンドレッドイヤーズ、トクガワセイケン フォーハンドレッドイヤーズというフレーズが耳にコダマするのだが、そういえばスペシャルズにもコンクリートジャングルという同名の曲があってどっちも好きだが、夜明けのどんよりのようなボブマーレイのやつのほうが好きだ)で、コックコックバズコックス、気にすんなよ金玉兄弟とか、なかなかのラインアップだけど、見事に旬は過ぎている。というか持ってるし、持ってないのは歴史的に興味がなかったり好きじゃなかったりの結果で持ってないわけだし。
おもしれぇ。
カントを読んであらためて考えてみたが、といっても考えるというほども考えず、アプリオリに、まあ感じたってとこだが、言論の自由ってのはいいね。
今、目の前で起こってることなんて、まさにそうだ。
あるとき、あるところでは、ハガネを使ったものすごく切れ味の良い道具は、門外不出の秘伝だったりして、よそものが手に入れるには決死の覚悟が必要だったり。
でも、そういうものはふつうの技術となり、誰でも手に入れることができるようになる。自分で作れなくても誰かに作ってもらえばよい。作る人はふつうの技術を使うだけなんだから、ふつうの値段で売ってくれるし。
そうやって、いろんなものが、特権的な秘密から、公開されたものに変わる。秘伝の継承者たちはいろいろ失う気分になるだろう。でも、かれらがそれを失うことより、それを得る人がおおくなることってのが結局は良いことだということだったのだろう。もし、それが残るものであれば。消えるものはそれだけのもので、その程度のものなら、秘匿しておく価値もない。価値があれば広がり、なければ消える。それだけのことだ。
いたみをともなうかいかくってやつじゃね?
卒業式の風景。演台の壁に日の丸。手前に卒業生がひなだんに座る。客席を向いて。客席(演台の下だ)には在校生が演台を向いて座っている。
というのが子供の学校の卒業式の去年までのカタチだ。
今年は変わるらしい。
校長がね、なにか大きな意志によって決定したからだ。
卒業生の向きが問題だそうだ。日の丸に尻を向けているからだって。そこでみんなで壁を向くカタチにするそうだ。
ばかだね。
そんなに子供の尻がいやなら、おれなら、じゃあ、日の丸を壁から下ろすね。それでいいじゃん。
みやぎまえだと思ったのは、忘れもしない中学生のころだ。
アルフレッドベスターの虎よ虎よを読んでたら(中学の入学祝いに買ってもらった早川のSF全集にのってたのだった。その頃はベスターは分解された男が創元文庫に入ってただけで、ポケットブックのほうは絶版状態だった。例によってSF事典に載ってて読みたかったのだな)、最後、時空を越えまくってそこらじゅうに虎が出現してくるわ、タイポグラフィがカリグラするわ、のクライマックスのところで、虎が宮城前にも現れるのだった。
虎よ、虎よ! (ハヤカワ文庫SF)(アルフレッド・ベスター)
で、それをみやぎまえと読んでとっても疑問符が浮かんだりするくらい、その頃でさえ、すでに宮城前は忘れられた場所になっていたということ。
というか、おれは、二重橋前という千代田線の駅名を知っているが、幻影のように手前に下の橋、後景に上の橋、そこに白馬にまたがる大元帥なんて光景が演じられていたところだなんてまるで知らなかったし、それどころかどう記憶をたどっても二重橋そのものを見たこともない。
それにしても中田耕治はなぜ皇居前ではなく宮城前という訳語を選んだんだろう、なぜベスターは宮城前を選んだんだろうか。
というような疑問に対して、サンフランシスコ平和条約の前には、多国籍軍だの米軍だのが頻繁にパレードをしまくっていたから(おそらくベスターはその印象を持っているに違いない)だったり、警察の誘導によって共産党員が虐殺されるまでは別名人民広場と呼ばれて10万人規模の大集会が開かれていたり、それよりも天安門前広場よりも巨大な大広場だという事実であるとか、愛の広場と呼ばれる丸の内の若者ののどかな享楽の場であったり、というようなことは物心ついた経済成長期にはすっかり歴史の闇に呑まれていたのだった。
いや、それよりなにより、びっくりしたのは、灘波大助の襲撃が、おれの想像とまったく異なる風景の下で行われたということだ。広場じゃなかったのだ。おれは、まったく異なる風景を想像していた。広場を車が走ってくる。そこへ向かってステッキを持って駆け出すテロリスト。ぜんぜん違った。
震災を逃れた数千という都民がテントやバラックで大貧民窟というか難民キャンプというかを広場に展開していたおかげで、灘波大助は車に近づくことができたという話。そこを難民キャンプとして開放することを認めたのが摂政その人だったということ。
その摂政は、1坪ほどの台の上に雨に打たれてコートも脱いで8000人の行列が通り過ぎるまで4時間弱を直立不動で手をあげて見送る演出を自分で考えて、役人が気をきかせて頭上に張ったテントを外させるとか。英国に遊学中にジョージ5世から学んだ近代における王のあり方とはどういうものだったのか、なんとなくだがわかってくる。ある種のソフトランディングを考えていたのだろうか。
まったく知らない歴史がそこにある。機関説でよろしいと言うだけのことはある。
それにしても、オリンピック通り沿いの小学校に通っていたおれは、お召し列車が駅を出るときは、学校のアナウンスがあるからそれとわかって、友達と沿道で、黒い車が来るのを待って乗っている男を見たものだが、まっすぐ前を見ていたものだが、一体何が見えていたのか、どういう心境で晩年を過ごしたのだろうか。
結局は、余分で過剰で口先だけの愛国心がすべてをだめにしたということだろう。226の時に怒ったというが、その後もすべてが逆に動いていったのだろう。かくして、摂政時代に思い描いていた場所の機能を果たすこともできず、ただそこにあるだけの広場が利用されたと思ったら黛だ。
#
著者は気づいていないか、それとも場についての本で音についての本ではないから言及しなかったのか謎だが、新聞記事で明治期には「勇ましい」と表現される君が代が、昭和期には「厳か」と表現されるのは、実に興味深い。明治期の勇ましいがフェントン版ということはありそうな気はするが時期は奥版が出た後なので、今の旋律のほうかも知れない。エッケルトの編曲がどういうものかわからないが、もしかすると現在(というか「厳か」バージョン)はエッケルトの手を払いのけた無名の作曲家によるバージョンになっているのかも。では、どのタイミングで勇ましい君が代が、厳かな君が代に切り替わったのか、切り替わったときにどのような評価があったのか、そいういったこともおもしろそうではある。
MicrosoftのサイトからExpress Editionをダウンロードしようとしたのだが、最初にパスポートサインアップがある。まあ、これは良い。
ところが、パスポート認証の後、個人情報を入れろと言ってくる。
担当部署ごとに別名簿管理してるのかな、と思うわけで、まあ、これも良いだろう。
で、電話番号の入力欄があって、そこに赤いアスタリスク(入力必須)が付いている。
で、その下には、電話で宣伝しても良いか? チェックボックスがあってチェックされている。そんなものが昼間に家にかかってきてもまったく役にも立たない(おれは不在だ)ので当然、チェックを外すのだが待てよ? 電話番号の入力目的が、まさに今、チェックをはずした広告電話が理由だと最初のところに書いてあるように読める。で、チェックをはずすということは、電話番号を入力させる意味ないじゃん。だって、広告目的のために電話番号を入れろと書いてあるんだが、広告電話は不要と宣言できるんだぜ。なぜに、赤いアスタリスクは消えないんだ? ばかですか。
連動しろということだ。
チェックが外れていたら、電話番号の入力をディスエイブルするか、せめて赤いアスタリスクは消して、入力しなくても良いようにすべきだろう。入力目的に利用するなとこっちはチェックを外すことで宣言しているからだ。
チェックしたら、あらためて赤いアスタリスクを付けるなり、イネイブルするなりすればよろしい。
って、実際全部1個しか売り上げてないよ、と思ったら2個売り上げたのがあった(3Qは、舞波一人勝ち、僅差でDI&AOP)。
その輝かしい1位は、
The Glenn Gould Edition - Chopin/Mendelssohn/Scriabin/Prokofiev(Chopin)
確かに、名盤だと思う。すごく緩慢なスクリアビンの5番のおどおどした胎児も良いが(って言うかプレスト コン アレグレッツァってどういう意味なんだろう。プレストのほうがアレグロより早いってことは、アレグロ風のプレストなんだと思うから少し遅めのプレストって意味かな? それを「遅めの」プレストと読み替えてすさまじい遅さで弾いているという感じだ)、3番の美しさときたら天国だ。でも、ショパンはほかの演奏を聴きなれてないのでなんとも言えない。というか、ショパンのソナタってピアノ協奏曲もそうだが、なんていうか、構成力が奔放ですね。
というわけで、スクリャービンにはダンスランギド(読み方知らん)という小品があるが、おどおどした胎児(SONATA No.5 Op.53(1907)——なにげに神秘和音100年記念になってるな)から、それを利用した第1主題相当の部分の柔らかさとか。
(しかしlilypondは難しいな。もっと簡単に文法チェックができる仕組みを考えないとだめだな。)
スクリャービン全集1 (世界音楽全集 ピアノ篇 新校訂版)(伊達 純)
おれが持ってるMCA PIANO LIBRARYのソナタ全集みたいにお得な楽譜はないのかな?
もし、midiの生成まで自動的にしてくれるんじゃなきゃ、誰がこんなかったるいことをするだろうか?
上のたかだか8小節を入力するのに、10回以上のコンパイルエラー(コンパイルには1分は余裕で必要だ)に出くわしたり、楽想記号をすっぽかしているのに気づいてパッチを当てたり。
でも、なぜコンパイルエラーをつぶすんだろうか?
それは、楽譜が見たいからだ。midiでこの音群を聞きたいからだ。
つまり、おれはフィードバックがほしい。
自分の(いや、これはスクリアビンの作品だが)作品を、モノにしたいからだ。そうでなければ、考えるだけでよい。「ここのdivの中には楽譜があるつもり。クリックすればmidiがダウンロードされてメディアプレイヤーを鳴らすつもり」
音楽は、ではなぜ音楽なんだろうか? 作曲家の頭の中にあるだけではそれは音楽ではない。ただの夢だ。
では楽譜は? まだ記憶媒体が、作曲家の頭から、紙へ変わっただけじゃないか?(LilyPondの場合は、謎テキスト—TeX—pngと変遷を遂げるが、謎テキストは音楽じゃなく、TeXソースも音楽じゃなく、もちろんpngも音楽ではない) つまりそれも夢だ。ただ、可視化されたという違いはある。
ここまで来て、ただの夢から、伝達可能な夢に変わる。もう一声(と変換ミスされた。本当は「一越え」だが、逆にうまい言い回しに驚く)。
そして声が出て、空気を振るわせる。この振動は音楽か? いや、媒体が波に変わっただけで、まだ夢の続きだ。
そして、それが鼓膜を震わせ、脳の中で、ほら、音楽だ。
でも、それってエネルギー保存の法則ってやつじゃね? 作曲家の頭の中の夢と同じじゃないか?
もちろん違う、ぜんぜん違う。エネルギー保存の法則とは異なる。なぜなら、その夢は聴いた人の数だけ増加するからだ。
うむ、波は波でもちょっと電波っぽい。
つまりは、情報というのは、伝えられて初めて完結する。
(伝達されたことを見届ける必要は、多分ないはず。無人島からボトルにメッセージを入れて流したって、ボイジャーを宇宙の果て目掛けて飛ばしたって、それは多分、情報になっている、と思う。でも本当だろうか? ボイジャーは宇宙人の届かなくても、地球の我々に情報を伝えている。すでにしてこの地上におけるメッセージは伝わっている。ボトルの中のメッセージはどうだろうか? 多分、それはボトルにメッセージを詰めて、海に流した、その時点で元の発信者にとっては十分に情報として、フィードバクがあったと言えるんじゃないだろうか。つまり、頭の中でボトルにメッセージを入れて流そう、と考えている状態とは異なる状態に変わったからだ。——情報とは、ある状態Aから別の状態Bへの遷移のトリガー/イベントである、と考えることができる)
だから、プログラマーはプログラムし、動かし、修正し、完成させる。TDDの正しさが直観的なのは、フィードバックのシステムがそこにあるからだ。音楽家は、紙に楽譜を書いたり、楽器を使って即興したり、口三味線したりする。脳の中の音を実際の音にしてそれを耳に戻して完結させる。
おれはそのフィードバックの過程がすごく重要だと思うが、そのフィードバックを生じさせるためには、「表現」にしなければならないということだ。単に夢を見るのではなく、モノ化すること。
だから、実際には、プログラムをテキストにするだけで、夢を越えた状態にはなる。それが実行され、結果がフィードバックされればより望ましい。
さて、では数学とは夢なのか? おれにはそう見える。だから数学は美しいんじゃないだろうか? (でも、それが応用され実世界の何かとして具現化されたときは、もっと美しいかも知れない)
たとえば上の2つのエントリーの中に最初に想定されている結論と、8合目あたりの結論めいたものと、最後の部分(メタな情報と本来の情報が区別されずに書かれているのであれだが、本来の情報は夢であって、メタな情報は当然可視化できるわけなのでなんだかわけがわからなくなっている)では、異なることが語られている。これは書くことにより、最初にあった情報がフィードバックされ、それによって状態が次の状態に遷移したと見ることもできる。
演説しているうちに、結論が最初に話し始めたときとは逆になることがある(というようなギャグがあるが)それがフィードバックでそのフィードバックストリーム内のデータが情報ということだ。
えーと、結局のところ、人間にとって手を使って何かするというのは相当重要だということとか、外部の媒体に出力することでそれなりに客観化できるためにフィードバックループが生じて、それによって多少は先へ進めるかも知れないとか、そんな感じらしい。
というか、デバッグするには、実際に動かしたほうが楽だな。
何か考えたんだが、別のことしてたら忘れた。
多分、ルンシュン(漢字忘れた、と思ったら、ためしにかな変換したら出てきた。魯迅)が子供について書いたことだ。
というか思い出した。
その感覚を20年後にも覚えていて、それを再現しないようにすれば、世界はおそらく良くなるだろうということ。いや、20年後には真意がわかるので、再現させるということもあり得る。重要なのは、どっちだろう? それはケースバイケースだろう。
Q1)1年生のとき、死ぬほどしごかれて死にそうになった。おれが3年になったらこういう馬鹿な慣習はやめよう。
A1-1) しごきは伝統だ。これがあるから、われわれの強さ、結束力、根性があるのだ! 1年にはそれがわからないのです。
A1-2)みなさん、まったく無意味なのでああいうこたぁやめますわ。
Q2)もう朝の4時か。どこのどいつが四当五落(4時間睡眠それ以外勉強なら合格、5時間以上寝るようだと不合格というような意味だった記憶がある)な状況を作ったんだ? それにつけても、詰め込み教育のせいで、自由な発想はできなくなったし、のんびりと思索にふけりまくることもできなかった。文部官僚になって、こんなあほうな教育制度は変えてくれるわ。
A2-1)ゆとり教育のせいで、ばかばかりですな。やめやめ。
A2-2)運用がまだこなれていない(実作業者が理念を理解していない)ために、本来のありようが実現されていない。理想の実現にはあと20年はかかるかも知れないが、ここでもうひとふんばりだ。
Vista対応のバージョンが公開されたのでインストール。
なんか全然ブーストされないなぁとか思ってたら(っていうかそれっぽいファイルもできてないし、いつプロパティを見ても「有効にする」にチェックが付いてない)、「プライバシーに関する声明」をクリックする必要があったのか。でもなぜ、ここでプライバシーが出てくるんだ? 書いてあることを読んでもまったくわからんが。ブーストした情報(アクセスされた箇所と頻度とか?)をMSに送りまくるということなんだろうか。
それはそれとして、これで、やっと有効化されたらしい。
来月の中旬くらいに出るそうです。
良く見るとVol.1 と書いてあるから、続くのかな? (トレンドでテクノロジーがすごい速さで動いているから、たしかにシリーズ化できるのだろうな、と。Jakartaが求心力をすさまじく発揮していたころのJavaのような動きが今のJavaScript界隈にある——という見方をすると、実はあのころのというか実は今もまさにその最中なのだが、Javaというのは、Enterprise 2.0 だったわけだろう。で、その2.0——古くからあるシステムを新しいテクノロジーを利用して価値や意味付けを見直したり変えたりして創り直すこと——を誰もが見える/操作できる場所に持ってきたのがWeb 2.0だと考えれば、軍事→民生のような流れと並立して古くから存在する、メインフレーム(クラス)コンピューティング→パーソナルコンピューティングという流れの中に実のところはあるのかも。でも1度目は悲劇だけど2度目は喜劇なので、そりゃJavaよりJavaScriptのほうが楽しいだろう)
まるごとJavaScript & Ajax ! Vol.1(天野 仁史)
で、IT戦士天野さんや舘野さんといったWeb 2.0系の執筆陣にまざってなぜか僕もいます。とはいえ、RHGでのネタ(1)、(2)の採録ですのでご愛敬ということで。
#これについては4月のRHG読書会の夜の部の足しにしましょう。
というわけで、どんな内容なのかは2ページ分を除いて僕もわからないわけだけど目次を見ると、方向性はみえるような。少なくてもGWTとRails(id:secondlife)が出てきてJavaScript無しJavaScriptがあるわけだし、このタイミングでIE7 とかSafari3とかが出てくるのは実利的だし、Prototype.jsとMochiKitというのはそうなんだろうなぁ、とか。
iBUFFALO Arvel USBシリアルケーブル 1M グラファイト カラー SRC06USB(-)
会社行って見てみたら、福福電子工房さん推薦のアーベルのケーブルだった。
で、やっぱり38400bpsだとデバイス側(RS232C側)のERRがちかちかしまくる。9600bpsだと問題なし。
ちょっとこのデバイスが何物かは知ってる人は知ってるが、当然秘密なので書かないわけだが、前回困ってたときと違うのは、実際に動かすための条件がやっと揃ったってことだ。で、ダメもとで使ってみたら元気に動いてるんだ、これが。でも、ERRはちかちかちかすごい勢いで点滅を繰り返している。
これは結局、何か予期していないシグナルが立っているのは間違いないんだけど(そうじゃなきゃデバイス側のERRが点滅しているはずはない)、それ自体は悪影響を持っていないのかなぁと、思えるので(いかんとは思うがいかんともしがたい事情もあって)とりあえず様子見となりました。
でも、福福電子工房の
あなたは、テスターを持っていないハードウェア技士を信頼できますか?通信を少しでも行うのであれば、オンラインモニタは一人一台の必須ツールです。
Analyze232Cなら、一人一台オンラインモニタが実現できます。必ず用意してください。これが、通信に関係する技術者の最低条件です。
というのは、納得がいくのだよな(いや、さらに言ってしまえばオンラインモニタは作れるのが最低条件だろ? たとえばおれはLANモニタを公開してるぜ——ケーブルを作らなくても良いからだけど、というか韓非子の言葉にもあるけれど、最高の権謀術策は知っていてこれを用いないことだというのもあるわけなので、作らずに買うというのはもちろんありだけど。安いし)。というわけで、プライオリティは落とすけど、最終的には詰める予定ではある。
というわけで、通信そのものは確かにうまく行っているようです。いろいろご教示ありがとうございました。
映画化された(もう公開されたのか?)はずなのに、全然、書店でも見かけないが8巻が出てるのか。
フリージア 第8集 (IKKI COMICS)(松本 次郎)
会社の帰りに本屋に寄って買うとする。
.NET Frameworkで、SerialPortオブジェクトを使って制御しているのであった。
で、これが困った。というか運用でカバーというやつで逃げるけど。
本物のRS-232Cなら、コネクタ抜けば(当然、アクティビティタイムアウトが検出されて一度リソース解放した後)リトライしてればまた接続状態に復帰できる。
ところがどっこい。
コネクタ抜いてアクティビティタイムアウト検出するまでは良いのだが、そこでSerialPort.Closeを呼び出すと、しばらーくたってから、いきなりネイティブスレッド例外(ポートが存在しない)になってプロセスごと死亡する。
しょうがないのでAppDomain.UnhandledExceptionHandlerを設定してやるのだが、IsTerminatingがtrueだ。どうにもならない。
そこで、メッセージを出してからApplication.Restart()でプロセスごと再起動ということにした。
SerialPort.Closeを呼ばなければ良いのだろうか? でも、そうするとアクティビティタイムアウトの検出後の復帰動作を返る例外でいろいろ分岐させなきゃならなくなる。
それは良いとして、上がってくるのがUnauthorizedAccessExceptionなので、ちょっとこれをもって抜かれたとみなすのも無理があるような。
ジェズイットを見習え |
_ 米田 [ 米田です。 もしかするとIKVM.NET経由で、JDBC接続が回避策に使えるかもしれません。 http://blo..]
_ arton [情報ありがとうございます。 次に手が空いたときに試してみます。確かにJDBC経由ならJDBCがシステム非依存なのでで..]