著作一覧 |
上美谷さんの日記の「最近書いたコードの日本語度」。多分、実際の仕事コードか、それの擬似コードだと思うが、テーブル名、カラム名、メソッド名に日本語を利用しているようだ。
newrow.オーダー番号 = 決済用オーダー番号算出(ds);
という行が象徴的。業務システムのソースコードの1つのあるべき姿だろうな、と感じる。
VS.NETにmigemoが欲しいというのは納得。
#難点にも気付いた。日本語文書が横に長いと読みにくいというやつだ。慣れの問題かも知れないけど。ソースコードの説明度は(一般論として)極めて高いが、視覚表現としては微妙な印象。
#と書いたこのエントリー自身を読むとそれほど読みにくくない……。ASCII漢字仮名混じりの行が横に長いと、英字部分が落ち込むから横に追いにくくなるのか? (主観度高し)
遅い遅いと思ったらRewriteRuleのdispatch.cgiをdispatch.fcgiに直し忘れていた。
非マニアックな人がルータの内側でHTTPサーバを立てるとしたら何が良いかにコメントくださった方々、Blog/日記でご教示くださった方々(RefererとTBしか確認できてないけど)ありがとうございました。
(ちょっとここで迷い――さすがにそれはさもしいだろうという悪魔の声と、やっぱり利便性ってのはあるよねという天使の声とが聴こえてくるから天使の声に耳を傾けることにしてアマゾンを開いてASNを引っ張ることにするので一度中断)
ダントツ(bakelattaさん、babieさん、たださん、ogijunさん、上美谷さん)で
B0007YT8WA
まさか、こういう時代が来るとは思わなかったのだけど、主な理由は以下の通り。
・静か、小さい―の中では圧倒的に高速
・アップデートは簡単(これがある意味では最も重要)
・基本的になんでも入っている(Apache、Ruby)
・直接操作する場合にきれい(これは確かに。最初にSafariで世界を見たときの衝撃は忘れられない)
追記:とは言うのものmputさんから「 Mac mini でサーバするのはちょっと玄人向け」(というか読むとちょっとどころかほぼやめとけと読める)という反論あり(というかbindが出てきたあたりから最初の前提より深くなっている気がするけど)。
LinuxならばDebian GNU/Linux(babieさん、woodsさん、おれ)
・安定版は安定していることが期待できる
・aptの存在(それなりに敷居は高いとは思うけど、十分に許容範囲だと思う。というかapt-getもできないでサーバー立てるとはと小一時間)
・神の本がある
Debian GNU/Linux徹底入門第3版 Sarge対応(武藤 健志)
#というか、Fedoraを恐れもなく使う勇者が本当に勇者なら良いのだが(るいもさん、woodsさん、僕も同意)。
個人的にはSolaris 10も良いと思う。
・でも、Sun Solveは相当敷居が高い。
・とか見ていくとマニアックでしたか……とすると、woodsさんのFreeBSDと変わらないか。
番外:Windows(Lady.BUGさん、woodsさん、上美谷さん、僕もこれもありだとは思う)
・ソフトウェアの自動更新はでかい
・RubyのインストールはASRがある(が、近い将来署名が無いからだめになるのではないかという恐れも)
・というか普通(!= ふつう)だし
・でもライセンス―というか現在は実際の制約になっていると思ったし、やはり微妙過ぎて上のような選択肢がある以上Pro版やHome版をサーバーにするのは勧められない。ということで現実的には上美谷さんがポイントしれくれたMicrosoft Action Pack サブスクリプションが37,800円で良い線。
番外の番外:KKさんのWindows98+AnHTTP。確かにこれもわかる。(Windows98 SP2だとは思うけど)が、さすがにこれは古過ぎ。
拡張メソッドとstatic import。
どっちも外部のstaticメソッドをあたかもあらかじめthisに結合しているかのように記述できる。
でも、static importはimportしたクラスの記述にのみ影響。拡張メソッドは引数で指定したthisに影響。その意味では拡張メソッドのほうが応用がきく(というよりも応用例が先にあってそれを実現するために考えられたようだ)。
どちらもmixinのように見えるが、インスタンスの内部に入り込むのではなく外部操作を与えるだけなので少なくてもRubyのmixinとは異なる(mixinの定義次第ではある)。
どうやってLINQを実装するか、というヘルスバーグのセッションがおもしろかった。
最初にLINQ構文があって、それを実現するために.NET Framework2.0を変更せずにコンパイラの変更だけで済ませる。
導入したのは
・無名タイプ
・オブジェクト初期化構文(一見Javaのイニシャライザみたいだが、インスタンス生成後に実行されることと、外部からのnew呼び出しでの記述となる点が異なる)
・型推論(式から求められる型=無名型をそのスコープで有効な型として扱う−インテリセンス対象になるのだから編集時にも見ている?)
・ラムダ式(デリゲートに変換される)−クロージャの例も示していたがrefを利用したとしてもスタックが畳まれた後も生き残るのだから、値型については実際にはrefではなくコピーが取り込まれるのだと思う)
・拡張メソッド(外部のstaticメソッドをthisのメソッドルックアップの対象として組み込む)
特に無名タイプというのは、猛烈に便利そうな機構だと思った。
大前提としての強型付け(=Visual Studioでインテリセンスが有効であること。と、コンパイル時の名前解決とは言わなかったがこれが重要なのは多分合っていると思う)を生かすための無名タイプのコンパイル時(編集時?)生成というのがキモに見えた。
とにかくヘルスバーグはプレゼンがむちゃくちゃにうまい。スライドの内容を暗記しているのはもちろんのこと(だからスクリーンに映されているのは日本語版。一箇所資料の左右を間違えて説明した箇所があったが途中で気づいて言い直した)、緩急自在、立ち居振る舞い、トピック切り替えのタイミングなど。プレゼンってのもデザインなのであるな、と思った。
#そうか、無名クラスと呼ぶとJavaの無名クラスのように見えるが、LINQの場合結果セットを格納するためのオブジェクトで、メソッドのセットを作るためのJavaの無名クラスとは目的が異なるから、無名タイプと呼ぶのかも。
「Dave Provert」(soutaroにっき)の講義の実際。
さらにリンク先の登さんのところがおもしろい(本当に雑談なのだけど)。Priusに乗りたがるところとか。
#今日の薀蓄。HALはHardware Adaptation Layerが正しい。(だからどうというわけでもないけど、MS Pressの公式の呼び方と実際に作ってるところで名前が違うという点。確かにあるな)
今は資料が手元にあるので、セッションの内容を書いてみる(適当にこちらで再構成して、さらに省略してある)。
出発点
public class Foo { public Foo(string r, int z) { bar = r; baz = z; } string Bar; int Baz; } public class Foos { public static Foo[] GetItems() { return new Foo[] { new Foo("a", 0), new Foo("b", 1), new Foo("c", 2) }; } }LINQは、SQL専用の構文ではなく、コレクションに対する統一した操作を提供するものだ。したがって、上のFoosを処理できなければならない。
var v = from foo in Foos.GetItems() where foo.baz > 0 select new { foo.bar };この結果としてvには
class ? { public ?(string s) { bar = s; } string bar; } ?[] { new ?("b"), new ?("c") };が入る。
foreach (var i in v) { System.Console.WriteLine(i.と打つとインテリセンスが
bar
を表示する。var v = Foos.GetItems().Where(foo => foo.baz > 0).Select(foo => new { foo.bar, boo.baz});ここで新たに加わった言語要素が、
var
というローカル変数の型推論指定子Where
やSelect
という外部メソッド(Foo[]がWhereを実装する必要があってはならないことは自明)をオブジェクトのメソッドルックアップの対象とする機構(拡張メソッド)=>
ブロック本体)new { 初期化指定 }
という無名型とその初期化構文public static class Sequence { public static IEnumerable<T> Where<T>(IEnumerable<T> source, Funcというユーティリティを作ってそれを直接呼ばせる方法。そうすればpredicate) { ... } ... }
var v = Sequence.Select(Sequence.Where(Foos.GetItems(), foo => foo.baz > 0), foo => new { foo.bar, boo.baz});というようにスタティックメソッドのネストを利用することができる。
#でも、この展開はコンパイラがLINQの構文から自動的に行うのだから、それほど必然性は無いようにも思えるな、今、思い返すと。
ただし、もしLINQ構文を利用しないのであれば、引数そのものにはインテリセンスは効かないのに対して、Foos.GetItems().
と打った時点でWhereを出すことができる拡張メソッドのほうがVisual Studioを前提とした場合には望ましいということはわかる。
public static class Sequence { public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate) { ... } ... }第1引数を
this
で修飾すると、第1引数の型のメソッドルックアップテーブルにメソッドが追加される。プログラムはプログラムだからどこにも疑問の余地はない。
でも、ソリューション、サービス、アプリケーション、システムという言葉は便利過ぎて適当に使える。
このうち最初の2つはプログラムを後置できないところが多分、ミソではないだろうか。後の2つはプログラムを後置すると対概念っぽく見える。
あるコンピュータをハードウェアとソフトウェアの2つに分割した場合、ソフトウェアはアプリケーションとシステムに2分割できる。この場合のシステムというのはOSのカーネルやデバイスドライバーだ。ではたとえばXはシステムプログラムなのかアプリケーションプログラムなのか? グラフィックドライバーやネットワークシステムプログラムから見れば上位にあるからアプリケーションプログラム、でもXeyeから見ればシステムプログラムだ。
ソフトウェアはレイヤーに分かれているのでアプリケーションとシステムという見方は相対的にならざるを得ない。したがって今となってはそれほど意味のある区別がつけられないように見える。しかもプログラムというのが単一の実行(むしろロード)単位として利用されるようにモジュラー化されているため、アプリケーションの中にシステムもあればシステムの中にアプリケーションがあることもある(ように見える)。
システムというのはこれまた便利な言葉である。Wordはアプリケーションであってシステムではない。でも、Officeはシステムと言えそうだ。つまり結合されて全体として何かの機能を提供するものはシステムと呼ぶことができる。
そこでより抽象化してしまって、ソリューションとサービスと呼ぶほうが具合が良いということだろうか。
この場合、ソリューションというのはほとんどの場合、システム化されたアプリケーションを意味するように見える(が、その下にはハードウェア構成や運用までもカバーしている)。そのように見ると、Officeソリューションと呼ぶことも可能だ。
でも、Officeサービスとは(多分)呼ばない。
ではサービスとは何かと考えるとWebサービスという使い方が典型だろうが、ソリューションの一部かも知れないが、その外部にあって呼び出して利用する別のソリューションと考えるとしっくりするように思える。だが外部、内部というのもまた相対的なものである。
サービスとソリューションはむしろ所有の有無や制御権の有無に関する分類かも知れない(そもそも、その2つを対概念として考えなければそれまでだが)。
というようなことを、ソリューションを考えながら考えるのであった。
アマゾンアフィリエイトの良い点の1つは知らない本が買われることで自分の知識が増える点だ。
で、興味を惹かれたのが
Software Estimation: Demystifying the Black Art (Developer Best Practices)(McConnell, Steve)
タイトルを直訳すると、「ソフトウェアの見積もり:黒い技法を詳細解説」という感じ。結構売れているようなのだが、全く知らなかった。というかThe Black Artとはなんだろう?
(後でMSDNで調べる予定のメモ)
調べた:
Software Estimation: Demystifying the Black Art
Often referred to as the “black art” because of its complexity and uncertainty, software estimation is not as difficult or puzzling as people think. In fact, generating accurate estimates is straightforward―once you understand the art of creating them.
複雑さと不確実さからブラックアート扱いされているが、そう思われているほどは難しくもなければこんがらがっているわけでもない、ということか。
といわれても、普通はそりゃそうですな、とは納得しないから本になるのだろけど。
ただ、real-worldという言葉の適応対象が、Wordみたいなシュリンクラップだと、そんなに役には立たない(とは言い切れないとも思う)わけで、どういう分野を想定しているんだろうか、というのはよくわからない。
ガラス片は凶器になるわけだし、そうでなくても割れれば危険だから、メガネは機内持ち込みはもちろん荷物に入れるのも禁止。X線で見つけやすいから良いね。
というような規制は厄介だな、と思う。
日本人は結構迷惑するんじゃなかろうか。メガネを使う人が多い国に対する嫌がらせのような。
くそーポーカーとかチープとかは入れてなかったorz。
止めるのも手ではあるが、ブックマークにも利用しているからそれも詰まらんし。
後で消す(このエントリじゃなくてリファラ)。
(つうか、まだしつこく砲撃を続けてるのか……)
僕は勘違いしていたようだ。(追記:というわけでもないのかな。PowerBookを見ると/etc/apache/httpd.confが入っているのでServerが付かないOS XにもApacheは導入済みなのかと思ったけど、バイナリそのものが見つからない――単に見る場所が違うだけかも――ので、最初から全部入りというはOS X Serverのことなのか、と思ったとかいろいろ。最初想定していたのはServer抜きのOS Xだったんだけど後からogijunさんやmputさんが書かれていたのはServer付きの話なのかと思って冒頭の「勘違い」という書き方になった)
Mac OS X Server v10.4 10クライアント(-)
10クライアントライセンスということならば、Windows XP Proと同じ条件なのか、もしかして。でも値段は良いぞ。
【旧商品/サポート終了】Microsoft Windows XP Professional Service Pack 2 通常版(-)
でも、unlimitedバージョンを見てから
Mac OS X Server v10.4 Unlimitedクライアント(-)
Windows 2003 serverを見ると
Microsoft Windows Server 2003 Standard Edition 5クライアントアクセスライセンス付(-)
は5クライアントとなっているな。
#ファイルサーバーとしてのクライアント数とHTTPサーバーとしてだけのクライアント数って別なのか(追記:ogijunさんが先に書いてくれたけどOS Xの場合ファイルサーバーとしての(認証が必要な)クライアント数ということだそうです)、とか考えたり調べたりするくらいならDebian GNU/Linuxのほうが良いと思わざるを得ないのだが(Solaris 10もあるけど)。
追記:上美谷さんの日記も参照。
開発者のための実装系Webソースコードマガジン CodeZine(コードジン)傑作選 Vol.1(SE編集部)
出ました。僕のも1つ載ってます。
いまや稀少なコードが主体な紙媒体なので(出自はWebだけど)、続くと良いですね、と思います。
というような言葉を「暗黙的インタフェースの実装」を眺めていて思いついた(程度の話)。
もちろん、それほどは困らない。もし、元のclassがfinalでなく、かつメソッドのセットが十分に小さければ。
class Purse { public boolean isStolen() { return this == null; } public Coin[] parse() { return new Coin[0]; } public void add(Coin c) { } public boolean isBroken() { return true; } }があるとして
class UsefulPurse extends Purse { Map coins = new HashMap(); public boolean isStolen() { throw new IllegalOperationException("wakarukai"); } public Coin[] parse() { return CashDispenser.sort(coins); } public void add(Coin c) { CoinBag bag = coins.get(c.getFace()); if (bag == null) coins.put(c.getFace(), bag = new CoinBag(c.getFace())); bag.add(c); } public boolean isBroken() { return false; } }
問題は、そういうことを何も考えていないクラスの場合にある。
class PerfectPurse { public boolean isStolen() { return this == null; } public boolean isBroken() { return true; } public void addFiveCent(Coin<FiveCent> c) { } public void addDime(Coin<Dime> c) { } public void addQuarter(Coin<Quarter> c) { } public void add1Yen(Coin<Yen1> c) { } public void add5Yen(Coin<Yen5> c) { } public void addPenny(Coin<Penny> c) { } public void addOkinawaKinenCoin(Coin<OkinawaKinenCoin> c) { } ... public void add(Coin<FiveCent> c) { } public void add(Coin<Dime> c) { } public void add(Coin<Quarter> c) { } public void add(Coin<Yen1> c) { } public void add(Coin<Yen5> c) { } ... }
インテリセンスって素晴らしい。山ほどメソッドがあっても適切なメソッド名をドロップダウンから選択できる。そればかりか型をチェックするIDEの機能もすばらしいものだ。メソッドを記述すると引数に与えられる変数の絞り込みまでしてくれる。でも、その上等な料理にハチミツをぶちまけるかのごとくクラス設計ができるのはいかがなものか(from monky on a raft)。
使える財布にしようと思ったら(幸いなことにまだ232個しかない)メソッドをオーバーライドしてやれば、この財布が直接newされていない限りはまともな財布に交換することができるかも知れない。
でも、233個もメソッドがあったら、すでに作られてしまったアプリケーションを全部廃棄処分にしたくなるだろう。
それはオーバーライドする手間がばかばかしいからだ。
「いや、それは怠慢ですよ」とこの素晴らしいインテリセンス−エイブルな財布の考案者が語りかける。「IDEでこのクラスをポイントしてから<派生>コマンドをクリックしてください。voila!」
するとIDEが新たな編集画面を開いてくれる。
class MyPerfectPurse extends PerfectPurse { public boolean isStolen() { return super.isStolen(); } public boolean isBroken() { return super.isBroken(); } public void addFiveCent(Coin<FiveCent> c) { super.addFiveCent(c); } ... }
「ささ、この完全無欠な財布に何か付け加えるものがあると言うのでしたら、いくらでも追加してください。ささ、ささ。」(と、チケットピアの相撲取りのごとく、ささするのであった)
どうも、何かが違うようだ。問題は、「オーバーライドする手間がばかばかしい」という手間の問題だと考えてしまった点にあるようだ。
教訓:臭い匂いは元から絶たなきゃダメ
日記は書けるが、サーバーのメンテナンス(この場合は、ログの直接編集とか.htaccessの設定とか、tdiary.confの設定とかだ、というか本日のリンク元を最新版にするとか)ができないというのは、実にいらいらするものだ。まだ、ポーカーとチープな肥満薬が来てるのか……(もしかして日本語が読めるのかな? 読めないと思ってカタカナで書いてるのだが、「おお、話題にしてくれてる。こりゃ効果が出てるぞ」と喜んでるとか?)
「 トランザクションがないのに金になるシステム」を読んで。
「事前の負荷限界」がある世界とそうでない世界には、それぞれ違う種類の高度な技術があるということだと思います。
ということが本当に、いろんな場所でコメントをするたくさんのyamatoさんたち(という名前の1人をさすのではなく、そういう主張の人たち)や、その逆の人たちには理解できないのだろうか?
そうは思えない。
本当にバカの壁ってあるんだろうか? やはり、そうも思えない。
そこまで世の中に視野が狭い人であふれてるってことはないんじゃないかなぁ。もしそうなら、集団知という相互作用はいつまでたっても生まれることはなく、単に狭い仕切りで区切られた箱のようなものしか出てこないように思える。いくらふっても仕切りの中身は混ざらないから、どこまでいっても単にカタログとしてしか扱いようがない。それはつまらない。
では、なぜ、そういう壁があるかのようにしか見えない意見が出てくるのだろうか。むしろ、そっちに興味が湧く。
いろいろ考えてみると、それは発言に対する壁ってやつなのかも。たとえば、僕(以下の「僕」はこの仮想的な人格だというのは自明だけど一応、注)が都市銀行のATMのネットワーク構成を考え、保守プランを考え、運用プランを考える技術者だと仮定する。
僕は自分の職業的ミッションのすさまじいまでの困難さとそれを解決するための知恵と技術に誇りを当然だが持つ。たまに複数の事象が原因で起きた予測不能な障害のために5分間停止して新聞に叩かれまくるときっとへこむよりも、その特殊な事象の発生と予見の不可能性に対する無知と無理解に対して、怒りを覚えるだろう。
でも、僕はその僕が持つ高度な技術の実際についてあるいはそれによって獲得したさまざまな知見や技術的な考察、技術的な展望――そういった種々の技術的な知識や知恵について、公の場で誇ったり説明したりすることは、多分できない。なぜならばそのネットワークの企業的知的財産の保護に引っかかることが容易に想像つくし、仮にそうでなくてもそういう行動に出ること自体が保守プランに対する穴を開けることになるし、さらには職業的倫理に反することになると思える(し、それに反しないことがまた高い誇りに繋がる)からだ。
ところが、どうもそれに比べると屁みたいに見える(が、そこには当然別の技術があることは当然ながら理解できるのは、幾つかの点において技術は技術で自明だからだ)技術について、語らっていたり誇っていたりするのを、Web上で良く(では実際にはなくても、職業的な興味からは突出して見えるので「良く」となる)見かける。
おもしろくない。なぜ僕はもっと賞賛されないんだろうか?
一発コメントでも書いてへこましてやるとするか。もっと僕を誉めてくれよ。は無理だから、僕のほうがすごくて君のほうがへたれだと、一言入れてやることにするか。
――と、(ここから先の「僕」は仮想人格ではなく、本来の「僕」に戻る)いうような考えにあるのではないだろうか。
これがもし正しいとすれば、壁は視野の狭さにあるのではなく、職業倫理による発言の封じ込めにあると考えることができる。
ネットは、匿名を許容する。たとえば、僕が誰かは僕と直接面識のある人しか知らないことになっている。だから僕は、壁を基本的には無視できる。なぜなら、匿名の人間は壁抜け男だからだ。
いや、こっちのオノレシュブラックか。
アポリネール傑作短篇集 (福武文庫―海外文学シリーズ)(ギヨーム アポリネール)
で、そういう人たちも壁を抜けていろいろそのへんについて書いてくれれば良いのにな、と僕は思うのであった(抜けないまでも高さを低めることは可能なはずだ)。
注)実際にはいくつかのBlogでそういう壁抜けを見ることがある。だが、たくさんのyamatoさんがそうであれば良いな、と思う。その場が現在は2chとコメント欄にしかないところが、あまりおもしろくない点なのだ。2chはノイズが多いし、コメント欄にはノイズしか乗らないように見える。
_ hyuki [「インテリジェント・コピペ」という用語を思いつきました :-) > IDEは戦車]
リンク元を見るとFastCGIのほうにリダイレクトされるほうのURLなのに、なぜ読めるんだ?
#この時点では/diary/はFastCGIが死んでいるのでタイムアウトするはず。/diary/index.rbだと読めるけど。(と、注記)
#追記:携帯側はアクセスできる。
いやーおもしろいなぁ。法定相続とか国民にも敷衍しちゃえば楽しそうだな。気に食わない弟の息子とか、顔もみたこともない祖父の兄のひ孫とかにばんばん遺産とか渡っちゃうわけ。長女がどんなに可愛かろうが権利なし。
そうなれば、子供減少も解決かも。男が生まれるまで遺産と言えるだけのもの(家なんか買っちゃったらもうそうなるだろうね)ばんばん子供作りだすよ。
ああ、そうか。Yの人たちの深慮遠謀なわけか。国家繁栄、人口減少の歯止めのための。
溜まっていた分を処理。
それにしても、どの程度のマーケティング効果が上げられるものなんだろうか。あまり役に立ちそうにもないのだが(木馬のダウンロード基地とかだったらわからないでもないけど、そこまで悪質そうなのは今のところ見てないんだが)。
寸暇は惜しむものだが、寸志は与えるものだ。
とは言うものの、一体、その職業は何かというのが気にかかる。
芸術家はすべてを芸術のために捨てる必要はない。が、画家は絵を描いているときだけが彼の仕事時間ではないだろう。いや、画商と交渉している時だけが彼のビジネスタイムなのだろうか? だとしたらいつ絵を描けば良いのだろうか。
あるいは企業に属するという言葉が本質的には2つの意味を持つということも考えるべきではないだろうか。1つはたまたまその企業に草鞋を脱いだという状態。股旅者はもしかしたらある日突然去るかも知れず、居心地良ければ居つくかも知れず。その一方で、心身ともに属するという状態もある。その企業が廃業すれば明日からの身の振り方に頭を抱えることになる。
股旅者が長ドスの手入れを怠らないのは、去るべき日が来る可能性があることを知っているからだ(仮に今の日がどれほど心地よかろうと)。
去る気のない子分衆に、家へけえってからドスを研げと言うのはせん無きことだ。またそれを勧めるのは確かに偽善であるかも知れない。
しかし、股旅者ならばまた異なる振舞いもあろうというものだ。
とか、思った。そこでやくざものの話になるのは、たまたま目の前にこんなのがあるからだが。
蛇足を追記:
しかし仮にも一宿一飯以上の義理もあれば一緒に釜の飯を食った仲でもある。そこで一家と共に心中覚悟の子分衆にやはり一言声もかけたくなるのもまた人情。差し出がましいとは思いもするが、おいおめぇら、何の因果か渡世の世界に身をおいちまったのを恨むなら恨め、お天道様の下は何もここばかりじゃない。でいりに負けて夜逃げの算段することもありゃ親分の勘気に触れて出入り禁止になることもあらぁな、だからと言ってそのまんま食いっぱぐれになることぁなかろう。そんときものを言うのはてめぇの脇のその長ドスひとつ、ちったぁ磨いてやってもバチがあたることぁあるめぇ。
#しかし、自動小銃を発明するという方法論もある。
どちらも出来なければ、それまでだ。
Visual Studio 2005の発売を記念して開発者応援キャンペーンが本日からスタート! 抽選で8名様にムービーも見れるiPod 30GB Blackをプレゼント!
「ら」抜き表現orz(そこかよ)−ただしMSDN Flashだけで読めるわけだが。
(しかしヒント4を除けばLinuxに限定する意味はまったく無い)
このヒント1についてHTTPに限定して見ると、イントラでは相当意味がある反面、インターネットではほとんど意味がなかったりする(というかNODELAYは悪というほうが良かったり)。
勘違いでなければ、スィッチ全盛(だからイントラ限定)の現在ではNagleアルゴリズムは無効と考えるのがデフォルトではないだろうか。コリジョンデテクション(パケット数が少ないほうが有利)とキャリアセンス(パケット長が長いほうが有利)って今でも有意なんだっけ?
正確な発音がわからない……と考えることもないので日本語訳もつけているわけだが。
もともと好きなモノから意味に意味を重ねて響きに響きを乗せて作った言葉なので意味はないけど、カタカナで書けばレクラデジュール。英語だとthe fragment of the days。だがfragmentではなく、ウアクセンテギュの硬質な響きを持つエクラ。
どんな意味や響きを重ねていたのだろうか?
トムとジェリーが戯れる日光がきらきらと泡化したもの。
伊東守男による微妙に意図的な誤訳っぽい意訳。だけど浮雲のような生活をイメージさせるという意味では必ずしも間違いでもなく。
100年前から、ジュール、ジュール、フランス人はこれだから保守反動の権化みたく言われるのよ。
でもベルヌ条約は守りたいかも。
Ritual in Memoriam Maderna / Eclat / Multiples(Boulez)
しかしすべては一連のつながり(セリエ)をぶつ切れにしたところから再生する。
仲見世通りを駆け抜けて夢のかけらを探すのさ。
日々よ(ジョイディビジョンのこれらの日々というのも脳裏をかすめている)。
おまけ(ブレーズのを検索して見つけた)。どんなんだろう?
L'Eclat Du Ciel Etait Insoutenable(Hrsta)
飯は天(シエルがついたエクラ)。
#まあ、中二病の自分も大切に、というようなのが真意だったり。
あと、リエゾンがある(関係性を失わない)というのも重要(L'eみたいなのもリエゾンでいいんだかどうだかは忘れた)。
ブックマーク整理してたら出てきた。ken Perlin。
main(k){float i,j,r,x,y=-16;while(puts(""),y++<15)for(x =0;x++<84;putchar(" .:-;!/>)|&IH%*#"[k&15]))for(i=k=r=0; j=r*r-i*i-2+x/25,i=2*r*i+y/10,j*j+i*i<11&&k++<111;r=j);}
フラクタルとかトロンとかワニとか。
クラスへ向かう生徒たちをクリックするとペリンメソッド(クリックベースプレゼン)。
トロン [DVD](ジェフ・ブリッジズ)1982: two years before Gibson's Neuromancer!
そうだったのか。というかそうだな、そりゃ。
その理由が、MSDNフォーラムの開設にあり、しかも
MSDN フォーラムでは、GDNJ 掲示板のユーザーエクスペリエンスを保ちつつ、Visual Studio 2005 および SQL Server 2005 の各製品との統合を図り、Visual Studio 2005 の IDE から MSDN フォーラム内を直接検索する機能、過去に投稿したスレッドを一覧するマイ スレッド機能、投稿内容の評価などのさまざまな機能を追加し、皆様の開発環境がより快適になるよう機能強化を施しました。
この「統合」というのは読む限り(というかVS2005Jは手元に届いたが今インストール可能なマシンが無いので確認できない)文字通りにIDE内のコンテンツとして(きっとAlt-Hのどっかなんだろうけど)VS内に表示されるように見える。
#バグが出た時のレポート送信機能に双方向性を持たせたもの+2.0という感じか。
#言語対応はどうなるのか? コンテキストベースだったり。コンパイルエラーになった時点でAlt-H-なんちゃらすると、その言語の「コンパイルエラーの愚痴をたれるスレ」とかに飛ぶとか。
とかいろいろ考えるのだが、あらゆるアプリケーションで可能な方策であり、かつその双方向性に対して課金するとかのサービスの方向とか。
#ガレージバンドとかにそんな機能があるとか、イラレとかワードとか、いろいろありそう。
さて、るいもさんがうんざりしたりあきれたり感動したりしているし、それに対してmarsさんが感心したりしている。
それに対してsakitoさんがネタを出している。
ふむ。
もう結論のうち幾つかはわかっている。でもそれは誰でもわかっている業界の了解なので取り上げてもしょうがない。
ネタがネタに過ぎないのは、教育対象がずれているからだから良しとして、るいもさんのほうの話にフォーカスを当ててみる。
問題は
逃げ去る恋〔フランソワ・トリュフォー監督傑作選4〕 [DVD](ジャン=ピエール・レオー)
にある。よくできたシステムのことだ。これが元凶の1つであり、したがって教育がどうしたが的外れだという点にある。だって、既に教育された人間を雇ってる(はずな)んだからね。
そこでやっぱり国民総背番号制の導入ですよ。
脱税や隠し口座もばっちり摘発できるし。
で、納入するプログラムはすべてRFID内蔵チップに焼くこととして(ハードウェア納入ってことね)それを背番号と紐付けて、そうだな経産省でもいいや、のマスターデータベースで管理する。
バグったら地の果てまでも追跡可能とする。絶対に修正させる。本人が隠れたら保証人を追い込む。
「あの、求人広告を見て応募にうかがったのですが……」
「どうぞはいってください」
……
「じゃーこれ。我が社は筆記試験があるんだよ」
「はい、がんばります」
「時間は十分にあるからね。できたら呼んで下さい」
「はい」
――実践Javaを読んでおいてよかった。これなら全部できる
カリカリ
――カンペキだ
「フムー勉強してきたのかね」
「はい」
「立派な心がけだ。ヨシ待ってろ。社長に報告してくる」
……
「入りたまえ」
「ひさしぶりに優秀な新人が現れましたよ、社長!」
「ほんとうかね。キミの評価は当てにならないからね!」
「いや、こんどはまちがいおまへん。満点でっせ、満点!!」
「どれ見せてみろ、フムーいいじゃないか。28歳か。年齢も問題ないな、宇野君とってみたまえ」
「はい」
……ピピピルルルツーツーピリッ
「どや該当ナシやろ」
「いいえ、SI屋1社で去年と今年、無意味なコメントと意味のない条件分岐が入ったソースを納入して、しかもデッドロックを3回起こしてます。でも修正してますけど……」
「エーッ、彼がつまんでいたって! しょうがない野郎だな」
「そらみろキミの評価はあてにならん! 東島君! 我々はソフトウェアを扱う商売なんだぞ! いったんバグを出したヤツは 必ずまたバグをだすもんなんだ!」
「ハッ、こころえております」
「そういうヤツを入れると事故のもとや! 断りたまえ!」
……(テストは満点にも関わらず不採用の結果を聞かされ憤然とする灰原)
「わかりました。失礼します」
「ああ、ちょっと待ち。ワシの忠告やがな。あんたはまともなSI屋は雇わんと思うで。まあ、Web系やったらわからんけどなー」
この強烈なトレーサビリティーの導入によって、日本のエンタープライズアプリケーションプログラミングの世界は壊滅したのであった。いや、おれなんか真っ先に国外追放されそうな気がする。
タブレットiMacが出たら買う。すぐ買う。バッテリ内蔵で、台が携帯の置物みたく充電器兼ねててすぐ取り出せるようになってる必要はあるけど。当然、マウスとキーボードはBT。電源とつながってるのは充電器なわけだし、LANはWiFiだから早い話があの白い塗り壁だけをすぐに持ち運び可能になっているのだ。当然、iBookのように出っ張りがないつるつるデザイン。iBookじゃなくてiMacなのはでかさが20インチのほうが嬉しいからだ。多分、Appleは小さいノートは出さないだろう。だったらでっかなタブレットのほうが便利であるな。
たとえば、デスクトップで使ってて、疲れたとする。そこで充電器兼置き台からスポッと抜いてペンを持って小脇に20インチを抱えてカウチへ行き、寝転がって作業だ。重さを考えると仰向けは無理だな。うつぶせか。とするとカウチじゃないほうが良いかも。
あるいは、デスクトップでWeb見てたら良い料理ページがある。そのままスポッと充電器から持ち上げて台所へ塗り壁持ってって見ながら料理だ。
Googleマップを出しておいてスポッと抜いて車へ……ちょっと無理があるかも。でも、iTunesをiPod抜きで使えればそれで良いような。だって車を運転している時はデスクトップ上のコンピュータに用は無いし、逆もまた真。
(問題は、タッチスキャナを付けると液晶の質が低下する可能性が高いことだな。すると、ジョブスがこんな汚い画はMacじゃないとか言って怒って製品化できない)
現在、VS6でビルドしてMSVCRT6と一緒にASRを作成しているけど、次からはVS2005でビルドすることにします。
除外ライセンスについての規定が
再頒布可能コードのソースコードを改変または再頒布すること
と明示的に限定されているからです。ASRのソースコードにはATLを継承したものは含まれていますが、それは「ソースコード形式で改変し」とは異なることは明らかです。
と、一応、書いておく。
の使い#ライセンスを読むとバイナリー(msvcrtをスタティックリンクしたものを含む)をWINEなどのWindowsプラットフォーム以外のプラットフォームでの実行を目的としての配布はできない(やらないけど)。
#でも、メインマシンには当分インストールできそうにない。どうしようかな。
#実際にはMSのライセンスには抵触していなくてもGPL2には抵触している(少なくても付随条項の追加が必要であるが無視している)ということは一応書いておく。というか、付随条項を入れれば良いのか。
迷彩記憶を開いて何か間違えたかなとすぐ閉じてしまって後でまだ読んでないことに気付いて開きなおしたり。使ってる人を見ないのでなんとなく自分専用のような意識になってたようだ。
#!/usr/bin/env ruby -Ks class Calculator def initialize() change_behavior(?+) end def change_behavior(o) if o == ?+ def calc(x,y) x + y end elsif o == ?- def calc(x,y) x - y end end end end c = Calculator.new p c.calc(1, 5) c.change_behavior(?-) p c.calc(1, 5) c.change_behavior(?+) p c.calc(1, 5)動かすと
C:\tmp>ruby calc.rb 6 -4 6
こうやるとインスタンスではなくクラスの振る舞いに影響するのか。
c.change_behavior(?-) p c.calc(1, 5) c2 = Calculator.new p c.calc(1, 5)とすると、c2のためにinitialize()が走り、cのcalcが元の動作に戻る。
defを呼ぶのが先か、メソッドを呼ぶのが先か、微妙な処理順によってうまく動いたりmethod_missingになったり。もちろんmethod_missingになったらゲームオーバー。(defするスレッドと呼び出すスレッドのレースゲーム)
結局ノートパソコンにVS2005をインストールした。ということは、readline、zlib、openssl、tcl/tkとか全部作り直し。
……とやっていって、opensslで負けた。
ntdll.makから/WXを削除の刑。
1. extern int read()みたいなのがあって警告→停止
2. time_tを無条件にlong(unsigned long)に代入
このあたりまではまじめにソースを修正していたのだが
3. ある一点でaccessを修正したとたん、stdioあたりで_W64というシンボルに関するsyntax errorが山ほど出るようになった。解決できん。_W64が__w64に展開されるところでsyntax errorに変わることまでは追えたがどのような関連があるのかがつかめない。深追い禁止。
ms/testはcompleteだと言っているからOKとは思うが。
.\miniruby.exe ./../win32/mkexports.rb -output=msvcr80-ruby18.def msvcr80-ruby18-static.lib This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. ./../win32/mkexports.rb:6: [BUG] Segmentation fault ruby 1.8.4 (2005-12-24) [i386-mswin32] NMAKE : fatal error U1077: '.\miniruby.exe' : .\miniruby.exe ./../win32/mkexports.rb -output=msvcr80-ruby18.def msvcr80-ruby18-static.lib This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. ./../win32/mkexports.rb:6: [BUG] Segmentation fault ruby 1.8.4 (2005-12-24) [i386-mswin32] NMAKE : fatal error U1077: '.\miniruby.exe' : Stop. Stop.
stable snapshotだとMSC_VERを見るように修正されていた。さすが。
で、今は、「../.././../ext/openssl/ossl.c(118) : error C2065: '__func__' : 定義されていない識別子です。」を見てるとこ。
……なぜ、HAVE_VA_ARGS_MACROが立っているんだ?
if try_compile("#define FOO(a, ...) foo(a, ##__VA_ARGS__)\n int x(){FOO(1);FOO(1,2);FOO(1,2,3);}\n") $defs.push("-DHAVE_VA_ARGS_MACRO") end
チェックが甘いのか……。__func__を含めれば良さそうだな。
……ではなくて、__func__が標準ということだから、
#if !defined(__func__) #if !defined(__FUNCTION__) #define __func__ "unknown" #else #define __func__ __FUNCTION__ #end #end
とすれば良いような。というか、標準マクロとgccのマクロとVC8のマクロと全部押さえないとどうすれば良いかというのは難しい……
スリランカカレーを食いに行った。サモサのスリランカ版みたいなやつ(三角のと春巻きみたいな形のと2種類あった。芋とひき肉が具の基本みたいだが名前は覚えられなかった。パンはチャパティとナンの間みたい。チャパティをさらに層を増やして油分を補ったという感じ。
これでパキスタンとインドとスリランカとネパールは制覇した(というか、横浜のほうでもスリランカは食ったらしい)。
あとはバングラディッシュだな。
ところでブータンって何を食ってんだろう?
Rails' Ridiculous Restrictions, a Rant.
最後のカキコ(How many posts does it take to make the point that Joel did not write the rant?)。
_get_osfhandleに3を引数として与えたところでワトソンの呼び出しが走ることが原因らしい。
VS2005ってPDBの位置の指定方法がなんだか良くわからん(前のVSはスタックフレームをクリックした時にシンボルの位置を聞いてきたと思うんだが)。
13号。
青木さんのが最高におもしろい。
でも、これを作るのが面倒で、アドホックにやってしまったり。
そこで思うのだが、このあたりをprototypeとして標準添付しといてくれると楽なんじゃなかろうか(――ここの括弧に何か疑念とかあやふやなものがいろいろ入る――)。
いきなり冒頭でオープンソースに限らないと書いているところが面白すぎるが、「失礼」という言葉の使い方がなんとなく気持ちよさそうに見えた。
rudeか。コンサイス6版だと不作法とか激しいとか自然のままのとか猥褻とか書いてある。
ルーディーキャントフェイル。
なんか概念が混乱しているような言葉だ。
これ以外にも猥褻な行為はさまざまにあるが、そのほとんどはオープンソースカルチャに限定されるものではない。
どんな行為だろう。(追記:そりゃやっぱりソースを剥き出し―オープン―にすることだな)
自然のままというのは、洗練されていないという意味だから不作法に通じるものがあるが、
これ以外にも自然な行為はさまざまにあるが、そのほとんどはオープンソースカルチャに限定されるものではない。
とすると文意が全く変わってしまう。
#記事の内容は至極妥当だと思います。それとは別に失礼という言葉に興味が惹かれたということ。
るびまの咳さんの記事読んでてRWikiとオブジェクトシリアライズのあたりに感動した。
シリアライズした結果がHTML(*)で、リンクがリレーションシップで、一意キー(というかオブジェクトID)がURLということなのかな。
*)RWikiの場合はRDだと書いてあるけど、一般化して考えたのでHTMLとここでは書いている。が良く考えなくてもシリアライズした結果は別にHTMLの必要はないことに気づく。URLの付け替えすれば良いのだから、deserialize.cgi?objid=20050808.objを外に見せるときには20050808.htmlにすれば良いだけの話か。で、deserializeのプラグインか何かでHTMLにするとかXMLにするとかオブジェクトそのものにするとかして返せば良い。
こういう発想はしたことなかったが、確かにWebサーバーとそのコンテンツというのは、DBMSそのものだ(でそこに言語としてRESTが来るのか?)。
#Wikiっていうのはその観点からはすごく筋が良いとあらためて思う。リレーションシップの作り易さ。
#というか、リレーションシップの自由度がネットワークデータベースみたいだ→ODBMSと、DBMSにOを前置できる。
まだ、時々追っていたり。
とりあえずテストが死ぬ場所は特定できた。とは言うものの
(@obj2soap[obj_class] ||= []).unshift([soap_class, factory, info])
soap/mapping/registry.rbのここだよ。うーん、次のじゃ再現しない。
class A def initialize @a = {} end def add(b) (@a[b] ||= []).unshift(b) end end a = A.new p a a.add(:a)
で、(@obj2soap[obj_class] ||= []).unshift...
を@obj2soap[obj_class] = [];@obj2soap[obj_class].unshift...
にすると問題なし。(とは言え、さらに進めると最終的には_get_osfhandle
で落ちる。というか、nmake test-allと、cd test;ruby runner.rbで死に方が異なるというのがなんとも……
というとこまで。
Strutsについて思うところを書いてみる。
もし、5人の特攻野郎Aチームなら
(ここにテンプレから生成したキャラクタ紹介が入る)
いらない。より優れた代替を作る、保守する、文句なし。
もし、1人(おれ)なら
いらない。ケースバイケースで対処する。生JSPあり。
もし、1人(おれ以外)なら
やっぱり、いらない。指示が必要ならケースバイケースで考えてやるし、不要な勝手におまかせ、だけど0からフレームワークを作るのは勘弁な。
もし、30人以上のビジネスパートナー混成チームなら、おれはHTML出力チームとビジネスロジックチームと副官に分けるね。副官にはActionとXML、ビジネスロジックチームのサポートを依頼する。おれは、CSSとXMLの管理だ。Strutsはこういう場合にとっても役に立つ。
そういうことだ。
JavaでHTTPサーバーを作るシリーズ第3弾の「自作HTTPサーバーのマルチスレッド化と動作検証」です。
今回は何も考えないマルチスレッド化と、考えたマルチスレッド化であるスレッドプールの実装、これまでと同じくシングルスレッドの3通りの実装です。
無名内部クラスを当然のようにそこにある技術として利用してます。
さて、そのようにViewとModelそしてControllerという分業ってのは絶対的なものだろうか? というと全くそうは思わない。全レイヤーを押さえるのってのは基本じゃなかろうか。
とか、まあいろいろな見方があるのであった。
そんな突き放したような……。ライセンスは8でやっとGPLと共存可能な形にまとまったように見えるのに。
APIドキュメントを見ると_get_osfhandleの動作は正しく見えます(がちょっとこれ書いている時点ではまだあやふや)。別件で何かあるのならそれはそれとして。いずれにしろデバッガのシンボルファイルとソースファイルの関連付けがなんかまだ良く見えないけど。
うう、途中でFirefoxがcoreを残して消えたため(SPARC-Solaris版だと頻繁にある)どこで読んだかわかんなくなっちゃったが(追記:babieさんのコメント参照)、Saisseさんの「DIはスクリプトへの移行の予兆」というようなコメントが、ぴぴぴぴぴと来ましたよ。
さて10年前を思い出してみよう。
一体どこの誰が(という「みんな」のこと)、中間言語へコンパイルするプログラム言語が主流になると思っただろうか? VBは5でネイティブ対応(6だったかも。忘れた)とかで開発者が大喜びで延命とか。
もちろん、ここで想定しているのはJavaなわけだが、どんな予兆が当時見られたか?
中間言語に落とす言語の歴史は古い。僕が知っているのはせいぜいPコード(PASCALのつもりで書いたけどVBもP-Codeとか言ってたような)とLispのバイトコードくらいだけど。
でも、中間言語が主流化したのはJITのせいだと考えることもできる。
Rubyはテキストファイルのままでevalすることで構文木にコンパイルされる。そうではなく、YARVだとテキストファイルを読み込み中間言語になる。中間言語の最適化技術(丸ごとJIT経由ホットスポット)の定着がJava(.NETを加えても良い)が主流となった一つの理由だ。YARV-RubyとJavaや.NETのような中間言語を利用するコンパイラ言語の差は、最初にロードするファイルがテキストのままか中間言語化は済んでいるかの差に過ぎない。(だから、さらにYARV-JITとかYARV-Hotspotとかが出てくることになるんだろうけど−−多分)
とすれば、確かに、スクリプト言語への移行というのは十分現実的なシナリオだ。
とすれば、やっぱりRailsですよ(となるのか?)。いや、JavaScriptかもとも思ったり。C#はC#だろうし、C++はやはりC++だろうが。Javaそのものはそう考えてみると比較的簡単に2番手の位置になってしまうようにも思う。
とりあえず、「オープンコミュニティによってサポートされているプログラミング言語 2」が公開されているようです。
#実際のHTMLに対して校正(という名の推敲)をしないと、7歩の間にひねり出したまま、豆を煎ると煮るの音韻の調整ができていないようなことになるので、あまり嬉しくない。
いえ、それではありません。
MSDN 2005(VS.NET 2005 付属のもの)から引用します。
_get_osfhandle 関数は、fd (低水準ファイル記述子) が使用できる範囲内にあり、未使用のマークが内部的に付いている場合、オペレーティング システムのファイル ハンドルを返します。それ以外の場合、「パラメータの検証」に説明されているように、無効なパラメータ ハンドラが呼び出されます。実行の継続が許可された場合、この関数は INVALID_HANDLE_VALUE (–1) を返し、errno を無効なファイル ハンドルを示す EBADF に設定します。
で、この「パラメータの検証」とは
セキュリティが強化された CRT 関数の大部分と既存の関数の多くは自身のパラメータを検証します。この検証には、null ポインタのチェック、整数が有効な範囲内にあるかどうかのチェック、列挙値が有効かどうかのチェックなどがあります。無効なパラメータが見つかった場合、無効なパラメータ ハンドラが実行されます。
つまり、ここに書かれたメッセージを読む限りは、スタックオーバーフローガードなどと同様に、システム的にありえない状況を発見するとワームなどによるコード/実行時イメージ破壊と解釈してプロセスを殺す、という意味に取れます。
ファイルハンドルは確かにファーストクラスもファーストクラスなリソースなのでMSの意図通りの動作だと思うわけです。
#したがってハンドラを設定すればすむだろうと思っているので、実は僕は_get_osfhandleの件はそれほど問題だとは思いません。win32.cの中でMSVC_VERで囲って設定すれば良さそうだから。(言うだけだと安いので、週末あたりを利用してパッチを投げます)
それよりもregistry.rbでクラッシュする(しかも完全にプロセスが消失してしまうため現時点では追いようがない)ほうが引っかかっています。
#追加:ファイルハンドルだけでなく、jumpbufとかSEHチェーンとか他にもやばそうなのがいっぱいあるので(とは言うもののどういう利用のされかたか全然確証なし)、早めに動かさないと全然動かなくなるのではないかというのも気になります。
.....F.............................................../readline/test_readline.rb: 20: [BUG] Segmentation fault ruby 1.8.4 (2006-02-19) [i386-mswin32] This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.とりあえずreadlineを作り直して試すことにする。
Sunの藤井さんに招待していただいてDeveloper Loungeに参加。
元紀ノ国屋のあたりを歩いていたらひがさんと出会って一緒に目的地へ。
軽い気持ちで行ったらそうそうたる顔ぶれでちょっとびびった。吉岡さんやMikiさんやSpamAssassinの久保さんといった方々と名刺交換したり。
で、Jetspeedの菅谷さんからお話を伺ったり。JSR-168のポートレットというのは不勉強にしてまったく知らなかったが、デモサイトを見るとイントラとか作るのには良さそうに見える。Railsのことは知らないとのことなので、ActiveRecordとかデモしたり(X31に簡単なのが入ってたので)。
その後、いがぴょんさんからblancoのシートを見せてもらったり。確かにキングバインダー(だっけ?)の世界に向いてる仕組みだな、と感心した。それが良いか悪いか判断は難しい(僕の趣向には合わない。しかしそれを利用したい局面があるのも事実)が、普通の人の作業用と考えると徹底したリアリズムの解決案だとは思った。
その普通の人を考える高橋会長も後から参加。栗原さんやJa-Jakartaの(ジャジャカルタではなくジェイジャカルタと読むのが正しいそうだ)横田さん(修正しました)と2次会へ。ジ・アシクネプ・コタンとそれに続く構想について聞く。うむ、確かに栗原さんは発想と実行力がおもしろい。
もちろん僕は、registry.rbに問題があるとはこれっぽっちも思って無くて、ちょうどそのコードに差し掛かった時に(したがって再現性があり、タイミングではなく数量−ノード数なのかオブジェクト数なのかは現時点では不明−に依存した)問題が発生するのだと思っています。
また、nmake test-allでは発現しなくて、cd test;ruby runner.rb(その前にnmake installしていある)の場合にだけ発現するところが特徴的です。
(単にもう一度snapshotを取り直すと直ってる可能性もあるな、と気づいたので帰ったらそうしてみる、予定)
1254 tests, 12940 assertions, 7 failures, 44 errorsで、エラーはどうも日付周りとwsdlが取りあえずは目立つ。 たとえば
51) Error: est_time_now_cycle(YAML_Unit_Tests): rgumentError: localtime error c:/docume~1/arton/mydocu~1/lib/ruby/1.8/pp.rb:245:in `inspect'とか
49) Failure: test_spec_builtin_time(YAML_Unit_Tests) [./yaml/test_yaml.rb:32:in `assert_parse_only' ./yaml/test_yaml.rb:1006:in `test_spec_builtin_time']: <{"space separated"=>Mon Jun 29 05:52:20 東京 (標準時) 1992, "canonical"=>>Sat Dec 15 02:59:43 UTC 2001, "valid iso8601"=>Mon Apr 13 21:21:10 東京 (標準時) 1992, "date (noon UTC)"=>#<Date: 4905245/2,0,2299161>}> expected but was <{"space separated"=>Mon Sep 14 09:10:01 東京 (標準時) 1970, "canonical"=>Sat Dec 15 02:59:43 UTC 2001, "date (noon UTC)"=>#<Date: 4905245/2,0,2299161>, "valid iso8601"=>Mon Sep 14 09:10:01 東京 (標準時) 1970}>.順に見られるものは見てみようかな。
deploymentってのはコンポーネント化によって出てきた言葉みたく僕は思うんだけど(というのは1990年代の後半からやたら目につくようになったからだけど)、ちょっと日本語化しにくいし、かといってカタカナのままでもそれほど通りが良くない難しい言葉に思う。でもとりあえず訳語とし。ては配備とか配置とかを使い分けていたわけだ。
ところが、今日、とある資料を営業の人が訳したのを見たらdeployment planを導入計画としていた(同じ資料を僕は配備計画と訳してたわけだが)。わお、今まで見た中で日本語的には1番こなれた訳だ。
というわけで、日本語として通じなくなりそうな場合以外は導入を使おうかな、と思った。もっとも、システムについては良いけど、warみたいな単位だと導入って感じでもないな、とも思うのであった。
#あと導入とか展開とかは、初回のdeploy時には日本語的にしっくり来るけど、更新時のdeployに使うのはイマイチかも。追加時には投入ってのはどうだろうか。
どっかでtime_tが負になる話が出てたけどわかんなくなっちゃったし(ruby-devには無い)、まじめに調べるのも面倒になったので_USE_32BIT_TIME_Tを設定してRubyをビルドしたら、OpenSSLのほうはデフォルトのVC8で作っていたもので今度はOpenSSLのところでエラーになりまくり。
選択肢は、
1. OpenSSLも_USE_32BIT_TIME_Tを設定して作成する
2. time.cを見る(というか、NEGATIVE_TIME_Tを単に設定すれば良いだけなのか?)
どっちか。とりあえずNEGATIVE_TIME_Tを設定して_USE_32BIT_TIME_Tは外してみるか。
#これは問題外であった。
struct time_object { struct timeval tv; struct tm tm; int gmt; int tm_got; };に対して
time_new_internal(klass, sec, usec) VALUE klass; time_t sec, usec; { VALUE time = time_s_alloc(klass); struct time_object *tobj; GetTimeval(time, tobj); time_overflow_p(&sec, &usec); tobj->tv.tv_sec = sec; tobj->tv.tv_usec = usec; return time; }しかしstruct timevalは
struct timeval { long tv_sec; /* seconds */ long tv_usec; /* and microseconds */ };
とwinsock.hで定義されている。time_tは64ビットだけどlongは32ビット、でも精度が落ちるわけではない(まだ)。winsockの定義が符号付longだから負値になるということだ。
missing.hのstruct timevalを使えればよいのだが、その時点では既にwinsock.hは読み込んでいるし#defineと異なりstructだからundefできるわけでもない。
#define TIMEVALをtime_objectで利用する(missing.h、time.cにまたがる修正)とかにするか、それともtime.cに出てくるすべてのtv_secをtime_tでキャストするか、どちらにしてもちょっと汚い感じになりそうな気がする。
追記:この話はこのことだったのかと今頃になって納得。
連載は続いていないみたいだけど機械猫さんがRubyでデザパタというのを書いている。
なんかるびまや---(良くわからない)向きの企画だなぁと思った。
まずリストがシンプルだから読みやすい。次にまあいろいろあるし既に10年たってもう古典(古典となると趣味人と研究者の世界に入ってしまう)の領分だから言語を変えることでちょっと見直しをかけられて良いかも、とかまあいろいろ。
#if defined(HAVE_SYS_TIME_H) # include <sys/time.h> typedef struct timeval timeval_t; #else #if !defined(_WIN32) #define time_t long struct timeval { #else struct win32_timeval { #endif time_t tv_sec; /* seconds */ time_t tv_usec; /* microseconds */ }; #if !defined(_WIN32) typedef struct timeval timeval_t; #else typedef struct win32_timeval timeval_t ; #endif #endif結果は
1254 tests, 13349 assertions, 0 failures, 34 errors
昨日が1254 tests, 12940 assertions, 7 failures, 44 errors
だからそれなりの進展ぶりだが、問題は汚いことだな。
とりあえずdevに投げるか、それとも32ビットに戻すパッチのほうに挑戦してみるか、どうしようかな。
#missing/の下をいじればもっときれいにできそうだからやめとくか。
ちなみにこの時点ではこんなの(例:process.c)
static VALUE rb_f_sleep(argc, argv) int argc; VALUE *argv; { int beg, end; #if defined(_WIN32) timeval_t tvalt; struct timeval tval; #endif beg = time(0); if (argc == 0) { rb_thread_sleep_forever(); } else if (argc == 1) { #if defined(_WIN32) tvalt = rb_time_interval(argv[0]); tval.tv_sec = tvalt.tv_sec; tval.tv_usec = tvalt.tv_usec; rb_thread_wait_for(tval); #else rb_thread_wait_for(rb_time_interval(argv[0])); #endif } else { rb_raise(rb_eArgError, "wrong number of arguments"); }
missingの中を変えてそちらをtimeval_tを認めるようにすれば、_WIN32の場合そちらを参照することになるからいちいち本当のstruct timevalに詰め替える必要がなくなる(はず)。
#と思ったが、やはりその場合影響があまりに広範囲になる(eval.cの修正も必要になる)。time.cの中でtime_tにtv_secとtv_usecをキャストするのが当面は良さそうな予感。 #追記:その予感は正しくはないということはわかった。(キャストだけじゃどちらにしても符号拡張が先に来るからだめだけど、それだけでも不足)なんか、助田さんの新しいタイトルが胸をうつのですが……
1254 tests, 13431 assertions, 0 failures, 2 errors一気に減ったのでさすがに何か見落としるんじゃ無いかと(追記:WSDL関係のが空白入りディレクトリ名に引っ掛かっていた。自分でcdした時には短縮名を使っていて、かつ短縮名でcdした場合にはその名前がプログラムから参照されているみたいでエラーにならないようだ)気になるが、下のマクロをtime.cに虱潰しに埋め込んでいった。
#if defined(_WIN32) && SIZEOF_TIME_T == SIZEOF_LONG_LONG #define TO_TIMET(v) ((time_t)(v & 0xffffffff)) #else #define TO_TIMET(v) v #endif #if SIZEOF_TIME_T == SIZEOF_LONG typedef unsigned long unsigned_time_t; #define TIMET2NUM(x) LONG2NUM(x) #define NUM2TIMET(x) NUM2LONG(x) #elif SIZEOF_TIME_T == SIZEOF_INT typedef unsigned int unsigned_time_t; #define TIMET2NUM(x) INT2NUM(x) #define NUM2TIMET(x) NUM2INT(x) #elif SIZEOF_TIME_T == SIZEOF_LONG_LONG typedef unsigned LONG_LONG unsigned_time_t; #define TIMET2NUM(x) LL2NUM(x) #define NUM2TIMET(x) NUM2LL(x) #else # error cannot find integer type which size is same as time_t. #endif残っているのは
1) Error: test_huge_difference(TestTime): ArgumentError: time must be positive ./ruby/test_time.rb:68:in `-' ./ruby/test_time.rb:68:in `test_huge_difference' 2) Error: test_timegm(TestTime): ArgumentError: argument out of range ./ruby/test_time.rb:38:in `utc' ./ruby/test_time.rb:38:in `test_timegm'#追記:つまるところは虱潰しはいいのだが虱の選別がちゃんとできていなかったということ(と書いているということは0になったということだけど)。
#if sizeof(((struct timeval*)0)->tv_sec) == SIZEOF_LONG && SIZEOF_TIME_T == SIZEOF_LONG_LONGのほうが良さそうだ。と思ったけどプリプロセッサはコンパイラじゃないからこれはだめか。
time.c(Tue Feb 14 14:03:12 2006)用。
1254 tests, 13440 assertions, 0 failures, 0 errors
一応できたけど、もうちょっとどうにかならないかな、という気はする。
「配備」って言葉はあまりビジネス的に良いイメージがない気がするのが問題で、たとえば新聞とかに出てくる用例って「パトリオットの配備」とか「核配備」とかすごく特殊領域になってしまように思える(まあ、印象ということでもあるけど、強く目立つ用例ということで)。おそらく軍事用語の転用という面は実際にあるんじゃないかとは思うが、仮にそうだとしてアメリカは知らないけど日本では軍事用語を使う人自体がちょっと特殊な気がする。
それに対して「導入」って確かにdeploymentの直訳からは外れるけど、ソフトウェアなり(ハードウェアを含む)システムなりのdeployment作業としては同等の意味に思える。かつ、軍事用語のような色が付いていないところが良いと思った。
デプロイというカタカナ表記は相手をだまくらかして煙に巻こうという場合を除いてはビジネス的にはだめだと思うし(デルポイだとdelphiだけど、なんか字面が似ているが、ご託宣ってのは確かに相手をだまくらかして煙に巻くことではある)、とかそんな感じ。
なぜ、((unsigned long)v)
とせずに伸ばしてから論理積とか取ってるんだ?
AWDwRがあるはずないと思いながらも本屋に行ったら案の定なかったが、マイロボットとかいうムックがあったのでつい手に取ってみると妙に安い。各号に少しずつ部品が付いてくるのか。
ってことは最後に組み立て終わると武装蜂起するっていう仕組みだな。あぶないあぶない。
#include <stdio.h> long long calc(ll1, ll2) long long ll1; long long ll2; { return ll1 + ll2; } long long prot_calc(long long ll1, long long ll2) { return ll1 + ll2; } int main(int argc, char* argv[]) { printf("%lld\n", calc(-80, 128)); printf("%lld\n", prot_calc(-80, 128)); return 0; }をコンパイルして実行。
C:\DOCUME~1\arton\MYDOCU~1\test>cl test.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. test.c Microsoft (R) Incremental Linker Version 8.00.50727.42 Copyright (C) Microsoft Corporation. All rights reserved. /out:test.exe test.obj C:\DOCUME~1\arton\MYDOCU~1\test>test 18035912001912688 48
なるほど。
デフォルトはintなのがCだから、プロトタイプなしだとlong long(64ビット)ではなくint(32ビット)として引数を積むのが理由だろう。
というのを確認するにはアセンブラ出力を取れば良い。
VC++8の場合のアセンブラリストの出力オプションは"/Faファイル名"だ。
C:\DOCUME~1\arton\MYDOCU~1\test>cl /Fatest.asm test.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. test.c Microsoft (R) Incremental Linker Version 8.00.50727.42 Copyright (C) Microsoft Corporation. All rights reserved. /out:test.exe test.obj C:\DOCUME~1\arton\MYDOCU~1\test>type test.asm ……(snip)…… ; Line 16 push 128 ; 00000080H push -80 ; ffffffb0H call _calc add esp, 8 push edx push eax push OFFSET $SG2236 call _printf add esp, 12 ; 0000000cH ; Line 17 push 0 push 128 ; 00000080H push -1 push -80 ; ffffffb0H call _prot_calc add esp, 16 ; 00000010H push edx push eax push OFFSET $SG2237 call _printf
Line17(プロトタイプあり)のほうでは、push 0(正値)とpush -1(負値)が余分に入っていることが確認できる。
プロトタイプ無しのほうも、関数内部では64ビットずつスタックから引数を取り出すから、当然値はゴミになる(実際にはリターンアドレスとBPが取り出されるはずだから、特定の呼び出し単位に定数となる――再起呼び出しとかしたり動的にallocaしたりするとBPが変わるから定数ってのはちょっと大げさ)。
結論:int以外の引数をとるK&R関数呼び出しを見たら疑ってみよう。
問題:charやshortが引数の場合はどうなるか?
引数の型をそのまま利用している。VC++8の場合、charやshortは符号拡張して32ビットをスタックに積む。
なんか、全然K&Rの仕様をわかっていない(もしかしたら15年以上前はわかっていてその後きれいに忘れたのかも)ことがわかった。
しかし「未来を作った人々」によれば、PARCがLisaとMacintoshの設計者たちに及ぼした影響で最も重要なのは、おそらく精神的なものであり、訪問後にLisaの設計者たちが出した設計要綱は、アラン・ケイやラリー・テスラーの精神の完全な開花と言えた。何しろそこには「Lisaは使って楽しくなければならない」と命じているという。
続けて「このシステムは『仕事だから』とか『上司がやれというから』使うようなシステムにはしない。Lisaを使うことそのものが報酬となって、仕事が充実するよう、ユーザーとの相互作用における友好性と機微には特に注意を払わなければならない」とあるという。
クォートすべきことはこれに尽きるし、しかもすぐに忘れてしまうのだから、何度でも思い出せる機会には思い出しておかなければならないのだが、僕がこのエピソードで最も好きなのは、Appleの連中が本気でAltoがなんなのかを知りたがり、しかもそれを食ってしまったことだと思う(姿はわかっていても、それが実装可能かどうかは良くわからないという状態だったのだと想像される)。
CodeZineの『自作HTTPサーバーのマルチスレッド化』でちょっと触れたが、リファレンスを目的指向で利用すると罠にはまることがある。
事典とか辞典とかって、本来的には特定の項目を調べるために目的指向で紐解くものだけど、無目的に関連知識を拾い読みして知識を増やしていく。実際にはそういう使い方をまずすべきなんじゃなかろうか。
多分生まれてから最初に触れるリファレンスというのは、国語辞典かさもなければポケモン事典(僕の場合だと怪獣大事典か、妖怪大百科とかだったりしたはずだが)みたいなものだと思う。で、大抵の場合は実際にはそれほど目的指向で利用することはないのではないかと思う。つまり、「えーと、この目玉の化け物ってどんな特徴があるんだっけなぁ……」みたいな引き方はしないで、適当に開いたところで面白そうなのを拾い読みして、関連項目とか宿命のライバルとか相性が悪いとかといったリンクをたどってどんどん拾い読みしていくという感じ。
そういう読み方であらかじめ周辺に転がっている情報を見ておかないと、Runnableにたどりつけない(という例を出したわけだが)のと同様なことは結構ある。個人的には、Calendar.MAYだのCalendar.MARCHだのの存在にまったく気づかなかったとか。Calendarは当然、知っている。で、Calendar#setでフィールドを指定するというところから、Calendar.HOURとかも見ているのだけど、山ほどある定数からHOURとか調べる過程では当然MAYみたいなものを目にしているはずなのに目的とは異なるから見た先から見落としていく。当然知識としては取り込まれない。したがって存在そのものに気づかない。
これははっきり言って無駄に思える。だからあらかじめぼつぼつ拾い読みしといたほうが良いのではなかろうか。
ただ、あくまでもこういった○典は個々の情報の内部のリンクは意味があるけど列挙方法それ自体にはあまり意味がないから先頭から順番に読んでいくというのには向かないし、そういう読み方をすると飽きてしまうものだ。だから、関連情報をリンクでたどれたほうが良いし、したがってリファレンスを作る場合には重複を恐れずに関連項目への言及はできるだけしたほうが良いかも知れない。
(突然、えらく懐かしい本を思い出してみる。黒い表紙の変形版ーー引用は文庫なので当然違うーーだったが、この頃買ったのは脱走と追跡のサンバを除いてすべて捨ててしまった)
悪魔の辞典とか、乱調文学事典とかはどう読むのが良いのだろうか? やっぱり拾い読みだと思うな。
ジェズイットを見習え |
_ babie [お客様側で使ってる用語が、ふさわしくない・誤解を招くような言葉だった場合困るなぁ。]
_ arton [それはわかる気がする。]