檜山正幸のキマイラ飼育記 このページをアンテナに追加 RSSフィード

キマイラ・サイトは http://www.chimaira.org/です。
トラックバック/コメントは日付を気にせずにどうぞ。
連絡は hiyama{at}chimaira{dot}org へ。
蒸し返し歓迎!
このブログの更新は、Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama
ところで、アーカイブってけっこう便利ですよ。

2013-09-06 (金)

なぜか「デシリットル問題」に反響が

| 09:07 | なぜか「デシリットル問題」に反響が - 檜山正幸のキマイラ飼育記 を含むブックマーク

えっ? なに?

たわいもない会話を記しただけのエントリー「デシリットル問題」に、コメント、スター、ブックマークがいっぱい。最近では珍しくなったトラックバックまで来てる。

デシリットル(dL)を小学校で教える意味は、みなさん気になっていたのでしょうか?

http://b.hatena.ne.jp/entry/d.hatena.ne.jp/m-hiyama/20130905/1378353319 の「すべてのブックマーク」を開いてみてください。ブックマークコメントの率が異常に高く、有益な情報、ご意見・見解、ジョーク・ギャグと、ほんとに面白いです。

いろいろなご意見があるのですが、まず、職種、分野、国・文化によってはデシリットルが使われているよ、という話。kosakiさんによる、豆や穀類の小売りが最初の情報ですが、お米屋さん、お酒の量、水溶液濃度などでもデシリットルが使われるそうです。

デシリットルそれ自体よりは、SI単位系における 10n を表す接頭辞の事例として意味がある -- というご意見も多いですね。ミリやキロだと、10-3, 103 で、基本の量(例えばリットル)とギャップがありすぎて理解が困難だから、デシ(10-1)やセンチ(10-2)から入るのが適当だろう、と。

「デシ」という接頭辞の他の用例としては、デシベルが比較的よく知られてます。センチリットルやデシメートルの例も報告があります。繊維の太さの単位がデシテックスだそうで、トリビアですねー。

小学校低学年の子が、実際に水や容器を使って学ぶのに、ミリリットルやキロリットルは向いてない、デシリットルなら操作が容易、って話もありました。なるほど。実際、デシリットルからビーカーとかマスを連想する人が多いみたいです。

尺貫法(容積は升・合)との親和性が関係するのでは、なんてご指摘もありました。それは考えもしなかったな。


はてブの陰りの内部要因は「ヘイトが溢れてるから」」という匿名ダイアリーを読んだのですが、最近のはてなブックマークの状況を嘆いています。そのなかで、

絶好調だった頃のはてブはコメント欄が大変有用な場になってた。たったの100文字を駆使して議論が交わされる事も。気付き、ひらめき、バランス、そういったものが溢れてた。理性的で本質をえぐるコメントがキラ星のように煌めいてたし、感情的なコメントは逆に埋もれる傾向にあった。

過去のはてなブックマークをちょと美化・礼賛し過ぎな気がしますが、今回のブックマークコメント欄は、往年のそれ(があたっとして)のように「有用な場」でしたね。ありがとうございます。


[追記]メタブックマークの階層が出来てる。

  1. http://b.hatena.ne.jp/entry/d.hatena.ne.jp/m-hiyama/20130905/1378353319
  2. http://b.hatena.ne.jp/entry/b.hatena.ne.jp/entry/d.hatena.ne.jp/m-hiyama/20130905/1378353319
  3. http://b.hatena.ne.jp/entry/b.hatena.ne.jp/entry/b.hatena.ne.jp/entry/d.hatena.ne.jp/m-hiyama/20130905/1378353319
  4. http://b.hatena.ne.jp/entry/b.hatena.ne.jp/entry/b.hatena.ne.jp/entry/b.hatena.ne.jp/entry/d.hatena.ne.jp/m-hiyama/20130905/1378353319
  5. http://b.hatena.ne.jp/entry/b.hatena.ne.jp/entry/b.hatena.ne.jp/entry/b.hatena.ne.jp/entry/b.hatena.ne.jp/entry/d.hatena.ne.jp/m-hiyama/20130905/1378353319

[/追記]

熱川熱川 2013/09/10 05:54 どうも このブログ面白い

sumiisumii 2013/09/14 23:01 まさに子供がちょうどその辺を習っていますが、「23-8=15」みたいな2桁の足し算・引き算とほぼ並行して「2L3dL - 8dL = 1L5dL」みたいな計算をやっているので、そういう意図なのかも?(「今来た」状態なので既出だったらすみません)

m-hiyamam-hiyama 2013/09/16 18:59 sumiiさん、
>そういう意図なのかも?
キロやミリだと、数の計算のほうができないだろう、って話は出てましたね。
デシ、デカだと二桁の計算と釣り合うという教育的配慮はありそうです。
しかしながら(残念ながら)、デシ、デカはあまり使われることはない、と。

2009-11-06 (金)

浅海さんによるCatyの感想記事

| 11:45 | 浅海さんによるCatyの感想記事 - 檜山正幸のキマイラ飼育記 を含むブックマーク

BPStudy#26から1週間たってしまったのですが、今ごろになって浅海智晴さんによる記事を見つけました。

浅海さん、いらっしゃっていたのなら声かけてくれれば/せめてトラックバックいただければ、と思いましたが … 以下に少しだけ反応を:

流通するデータ構造をXMLではなくJSONにしている [...] 正確にはJSONの上位互換の独自アイデアのプロパティ付きJSONであり、意味論的にはXMLに近くなっている。

概念と表層構文は確かにJSON上位互換です。けど、シンタックスシュガーを剥ぎ取れば、通常のJSONにマーシャリング可能です。マーシャルした結果は、人間には読みにくいですが、任意のJSONツールで扱えます -- このために互換性を維持したのですよね。

「意味論的にはXMLに近くなっている」はまったくそのとおりで、「独自アイデアのプロパティ」を我々は単に「タグ」と呼んでいます。XMLのタグと意味/用法がほぼ同じなので。

最終形はJSON静的型付純粋関数型Webコンポーネント糊言語ということになりそうである。

さすが、ズバリ本質をついた表現ですね。ただし、「静的型付」を看板にするのは誇大かもしれません。静的解析でガンバルつもりですが、諸般の事情により静的に型安全を保証できないケースもあります。静的であれ動的(実行時チェック)であれ、ともかく手段を選ばず強い型付けを実現する、という方針です。

したがって、「JSON強烈型付純粋関数型Webコンポーネント糊言語」でしょうか。「烈」の字は単に雰囲気、意味はありません。

一般的には状態遷移する現実世界を純粋関数型言語で扱うためにはモナドといった道具立てが必要になってくるはずなので、この点をどのように対応していくのかというのが技術的に面白そうな論点である。

ここは、一番つっこんで欲しいツボですね :-) 通常ですと、モナドについてよく知っている人がモナド実装を書くのですが、Catyにおけるポイントは、モナドの知識を一切持たないプログラマに、結果としてモナドを書いてもらうようにすることです。

モナド法則の成立をソフトウェアにより保証する(法則を機械的に証明する)とかは、ちょっと現実性がないので、コンベンションやモラルに頼ることになりますけど。

goldenportgoldenport 2009/11/06 12:37 人が沢山ごったがえしていたので声をかけそびれてしまいました。すみません。Caty期待してます。

m-hiyamam-hiyama 2009/11/06 13:45 goldenport(浅海)さん、
適切かつ好意的なレビューをありがとうございます。
> 人が沢山ごったがえしていたので
あー、そうでしたね。またの機会に。

kosakikosaki 2009/11/06 14:31 ああ、「本人の意見は少数意見なので却下します」プロトコルですね。小さいのによく教育が行き届いているなぁ :-)

m-hiyamam-hiyama 2009/11/06 14:39 kosakiさん、
>「本人の意見は少数意見なので却下します」プロトコル
はじめて聞いたプロトコルだ。いつごろRFCになりますか?

hokuto-heihokuto-hei 2009/11/06 21:43 私も抜いた鼻毛が白かったとき「あ〜ジジイになったなぁ」と思いました。

m-hiyamam-hiyama 2009/11/07 12:25 hokuto-heiさん、
そうですなー、まったくジジイになりました。

2009-10-23 (金)

当方記事には過ぎた続編、よみがえる妄想*1

| 10:39 | 当方記事には過ぎた続編、よみがえる妄想*1 - 檜山正幸のキマイラ飼育記 を含むブックマーク

ちょうど3年前(2006年10月28日)のエントリー「古典論理は可換環論なんだよ」へのトラックバック、「なんだろな」とか病み上がりのモンヤリ頭でたどってみました。ンガッ。id:tri_iro さん、この書きっぷり、こりゃ基礎論のプロですよね -- 「ゲーデルの不完全性定理を代数学を使って表現してみた」

僕は、古典論理と可換環の関係を、初等的計算を愚直にガリゴリやれば分かる範囲でとりあえず書いてみたのですが、tri_iroさんがより発展的で深い内容、なんと2007年の結果を示唆するようなところまで書いてくれました。「続き」とかいうと失礼になりそう、レベルが違い過ぎますからね。

再帰的可算イデアルとか実効的閉集合とかになると、僕はもうよく知らない。「3. スペクトルの空間: 記述集合論,再帰理論,位相と測度」以降に書いてある話は「ほえー、そんなことがあるんですか」という感じ。いやー、すごいもんですな。

それで思い出してみると、「古典論理と可換環の関係」に何で僕が興味を持ったかというと、「コンパクト性定理はなんで『コンパクト』っていうんだ?」とかどうでもいい好奇心もあったし、「古典論理は可換環論なんだよ」の最後で述べたように、手計算だけ頑張れば割と面白い結果が出るので楽しいって理由があります。

もうひとつの下心として、例によって計算(computation、主にコンピュータの行為)の話に適用できないかなーと探っていた(妄想していた)のです: p, q などを古典論理の命題(構文的には論理式)として、M, N などをモデルとします。M |= p は「Mがpを満足(充当、satisfy)する」ことを表すとしましょう。ライプニッツは「性質で区別できないモノは同じとみなせ」と言ったとか言わないとかなんで、「すべてのpに対して M |= p ⇔ N |= p」のとき M ≡ N と定義します。

いま定義した関係≡はモデル全体の集まりModel(集合かどうかは不明)の上の同値関係になります。Model/≡ は、Modelより小さくなってはいますが、これだけではあまりハッキリとしません。ところが、{p∈命題 | M |= p} のほうはブール代数のイデアル(フィルターと言っても事実上同じ)になり、このイデアルと(Model/≡)の要素が1:1に対応します。多少のゴニョゴニョで、(Model/≡)をハッキリとした位相空間と捉えていいことになります。

モデル全体という茫漠とした集まりに自然な同値関係を入れると、サイズの小さな集合*2になるばかりか、位相まで付いて来るという実にありがたい状況。古典命題論理の場合では、モデルとはいっても、命題変数への真偽値割り当てに過ぎないので、モデル全体をイメージできないわけでもないですが、もっと事情が複雑になると、モデル全体はほんとにとらえどころがありません。

計算で便利に使える論理として、状態遷移による作用を様相オペレータと考えた一種の様相論理があります。そのモデルの全体は余代数の圏としていちおう定式化はできます。が、適当な同値関係で割ってサイズの小さな集合になれば扱いやすいし、なんらかのスペクトルとしての位相(ないしは位相もどき)が入ればもっと扱いやすいでしょう。

ちょと考えた後で、これは、僕の知っている道具、僕の知力・気力ではジェンジェンできそうにない、と判断してサッサとあきらめました。計算向け論理のスペクトルって誰か作っているんかな? ご存知の方、教えてください。

*1[追記]見出しから「る」を取りました。「る」があると、「過ぎたは及ばざるがごとし」を連想されそうだから。用法としては、「ウチの息子には過ぎた嫁でございます」とか使う「過ぎた」です。「できが良すぎる」の意味。[/追記]

*2[追記]日本語が大変曖昧でした。集合のなかでサイズが小さなモノのことではなくて、集合であることがすなわちサイズが小さいことだって意味です。[/追記]

2009-04-27 (月)

しりとりごっこの輪

| 09:40 | しりとりごっこの輪  - 檜山正幸のキマイラ飼育記 を含むブックマーク

木曜日にモニャドセミナーを行って、それから週末にかけて、随分とたくさんのトラックバックをいただきました。ちょっと反応しきれないのですが、とりあえずリンクを並べておくことにします。

Kuwataさん記事には派手に取消線が付いてますが、僕にとっては取消線の下の内容が興味深かったりします。その他の方々も、どこがどう分かりにくいか、どこを誤解したかなどを記述しています。このような「間違いや誤解の記録」はホントに貴重な価値ある情報です。それを公開してくださった皆さんに感謝します。

モニャドセミナー懇親会で、ぼくはあっちこっちと動き回りながら、どんな話題が出ているのかモニター(?)してたのですが、次のようなハナシが進行していたのは把握できませんでした(派生勉強会の件は、後からジョニーからうかがいました)。

モニャド&しりとりと直接の関係はないみたいですが、次のようなトラックバックもいただきました。

みなさん、ありがとうございます。

[1..100]>>=pen[1..100]>>=pen 2009/04/27 19:39 第四十八回圏論勉強会 2009-01-11(日)
http://www.sampou.org/cgi-bin/haskell.cgi?CategoryTheory%3a%b7%f7%cf%c0%ca%d9%b6%af%b2%f1%3aTemperleyLiebAlgebra
の2次会(於天狗渋谷宮益坂店)の「shelarcy の名前の読みについて」参照。
shelarcyさんの話をしていたら檜山さんが「え?白石さん?」と言ったのがきっかけだったような。

[1..100]>>=pen[1..100]>>=pen 2009/04/27 20:30 ん?「白石さんネタまだ引き摺りますか!」と書いてあるところを見るとそれより前の別の勉強会のときが初出なのかな。「え?白石さん?」と聞き間違えたのは別の人だったかも。

bonotakebonotake 2009/04/27 22:11 >「僕(檜山)は、てっきり本名が白石なんだと思っていたよー」と言った記憶はあります。
これを勉強会中の雑談で檜山さんが言って、盛り上がってた記憶あります。んで多分、僕が「白石さん」という単語を聴いたのはこれが初。2次会でもその話題で盛り上がった記憶が。

↓からして、それが11月の勉強会?1月ではなかった気がします。
http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20081109

でも、↓こういう話(コメント欄)もあるので、この呼び名は同時発生的に生まれていた可能性もあります。
http://d.hatena.ne.jp/Cryolite/20081207

田辺田辺 2009/04/28 00:29 ご紹介ありがとうございます。

そのほか、以下の記事も参考になりますので、未読の方はご一読を。

はじめての圏論 第9歩:基本に戻って、圏論感覚を養うハナシとか
圏の直感的イメージを作る:孤立から連絡へ
http://d.hatena.ne.jp/m-hiyama/20070111/1168508641

m-hiyamam-hiyama 2009/04/28 08:44 1..100]>>=penさん、bonotakeさん、
> この呼び名は同時発生的に生まれていた可能性もあります。
同時発生的かぁー、なんか都市伝説の様相を呈してきたな。

田辺さん、
> ご紹介ありがとうございます。
こちらこそ感謝しております。

m-hiyamam-hiyama 2009/04/28 13:20 > date=20081109
> Cryolite/20081207
日付の話なら、僕が「本名が白石では」とか言ったのは2007年の春ですね。量子ファイナンスで盛り上がっていた http://d.hatena.ne.jp/m-hiyama/20070501/1177990932 、、この頃ですから。oskimuraさんあたりが檜山発言の生き証人になってくれるかと(すっかり歴史の謎を解くみたいな話になっている)。

2008-05-20 (火)

続・引き算なしでやる話

| 12:12 | 続・引き算なしでやる話 - 檜山正幸のキマイラ飼育記 を含むブックマーク

「引き算はなくてもだいたい大丈夫」に、MarriageTheoremさんからトラックバックをいただきました。ありがとうございます。

ある程度大きな数xに対して、「最初は大股でジャンプして接近、最後のほうで小股でチマチマ調整する」という例えはとても分かりやすいです。僕が思いついたのは、「ある程度大きな凸体には格子点が含まれる」という事実に依拠するので、説明が面倒(たぶん分かりにくい)。

実際に「ホッピングボール・マシンの構造推測」に使うときは、n個の正整数a1, a2, ..., an に関する同様な結果が必要です。N > 0 とか x ≧ N とかのイコールのありなしはどうでもいいです(1ずれるだけですから)。

  1. 任意のn(n≧1)に対して使える
  2. できるだけ単純、明解
  3. Nの最小値を具体的に求められる

そのような方法を引き続き募集。

内海内海 2008/05/21 10:02 檜山さん腰の方は大丈夫でしょうか?
お身体大事になさってください。

>今後も注意せよ

体を捻らない歩き方も腰に負担はかかりにくいとは思いますが、以前腰痛の人が歩く時は「大きめの歩幅でゆっくりと歩く」事で症状が出にくいと聞いた事があります。
あとは檜山さんはご多忙でしょうからなかなかプール等に通う時間が無いかもしれませんが、水泳も腰痛に効果があるとは結構よく聞きます。

m-hiyamam-hiyama 2008/05/21 10:29 内海さん、
お心遣いありがとうございます。
> 「大きめの歩幅でゆっくりと歩く」
なるべく心掛けます。
> 水泳も腰痛に効果があるとは結構よく聞きます。
はい、お医者さんからも聞きました。higeponさんも行ってるらしいプールが近くにあり、回数券が残っているし、行こうかと考えてます。

ささはらささはら 2008/05/21 12:22 n=2の場合だとNの最小値を求めることができます.

二個の互いに素な正整数a, bに対し,
x≧(a-1)(b-1)ならばx=ma+nbとなる非負整数の組(m,n)が存在します.
また, ma+nb=(a-1)(b-1)-1となる非負整数の組は存在しません.

0≦k≦b-1に対しf(k) = ka % b と定めると, a,bは互いに素だから,
fは全単射となる.

ka<abより, 非負整数j(k)を(a-1)b ≦ ka+j(k)b ≦ ab-1となる
ように選べる. このときfが全単射であることと,
(ka+j(k)b)%b = f(k)により集合{ka+j(k)b}
は{(a-1)b ≦ x ≦ ab-1}に等しくなる.

これによりx≧(a-1)bならばx=ma+nbとなる(m,n)が存在.

a<bよりab-a>(a-1)bで, fは全単射であるから, ka<(a-1)bならばf(k)は
b-aとは異なる. したがってma+nb=(a-2)b+(b-a)となる(m,n)
は存在しない.

またab-a < ka < abとなるkは存在しないから
f(k)>b-aならばka<(a-1)bとなる. よってb-a<r<bなるrに対し,
f^{-1}(r)a+nb=(a-2)b+rとなるようにnをとることができる.

m-hiyamam-hiyama 2008/05/21 14:42 ささはらさん、
以前、アミダのクイズではお世話になりました。
今回もまたご回答ありがとうございます。
一般のnに対して、Mのsharpestな評価はなんか難しそうですね。
僕は手を出す前にあきらめちゃいました ^^;

2008-01-10 (木)

すんません、絵を描いてもらっちょります

| 17:40 | すんません、絵を描いてもらっちょります - 檜山正幸のキマイラ飼育記 を含むブックマーク

昨日のエントリー「いまさらながらだけど、オブジェクトとクラスの関係を究めてみようよ」に、手書きの汚い絵(字は輪をかけて汚い)が散りばめられているんですが、見かねて(?)あかさたさんが、UML図を描いてくれました。[追記]sumimさんのエントリーにも色つきの絵があります。[追記]

そういえば、「シェルのリダイレクトを『こわいものなし』というくらい完全に理解しよう」にも、

と、絵を描いてもらっています。

ありがとうございます。

僕、ホワイトボードやナプキンペーパーにはしょっちゅう絵を描いているのだけど、パワーポイントとか、ずえっーったいに触ろうとしないからにゃぁー。


「いまさらながらだけど、オブジェクトとクラスの関係を究めてみようよ」のブックマークコメントを見たら、

  • 立体の図示が素敵です
  • 図解がかっこいいな
  • 手書きの絵が分かりやすい
  • 手書きの説明がわかりやすい。

と好意的な意見が、、、 「手がきも味がある」とか言ってひらきなおろうかな。

※1 あかさたさんの「北欧系」ってなんのことか分からない。
※2 見出しの「ちょります」って、どこの言葉かも知らずに雰囲気で使っている。
※3 こういう絵だと、ツールじゃむずかしかろう、たぶん。

tohokuaikitohokuaiki 2008/01/10 22:37 いや、どうもありがとうございます。(恐縮)
改行かセミコロンがShellの区切りってことですね。

m-hiyamam-hiyama 2008/01/11 09:11 tohokuaikiさん、
> 改行かセミコロンがShellの区切りってことですね。
はい。セミコロンが出てきたら、改行に直すとわかりやすいかも。

2007-12-22 (土)

シェルのリダイレクトの補遺

| 12:54 | シェルのリダイレクトの補遺 - 檜山正幸のキマイラ飼育記 を含むブックマーク

昨日書いた「シェルのリダイレクトを『こわいものなし』というくらい完全に理解しよう」に、随分とブックマークやトラックバックをいただきました。それらのフィードバックを拝見して、僕の説明にいたらない所があったと思いますので、ここで補足します。

コマンド実行単位≒simple command

パイプ記号「|」や逐次実行の記号「;」を含んだ長いコマンドラインも、1つのコマンドとその引数、それとリダイレクト指定からなる“成分”に分解できます。こういった成分をなんと呼ぶか僕は知らないので、仮に「コマンド実行単位」とでも呼びましょう。

シェルの構文(grammar)的概念としてsimple commandというものがあります。ここで言ったコマンド実行単位は、ほぼsimple commandだと言っていいでしょう。「ほぼ」と付けたのは次の理由からです; 「コマンド実行単位」は、1つのプロセスを起動することを念頭においた言葉ですが、simple command は構文的な単位なので、シェルの変数代入や組み込みコマンドも含まれます。

コマンドラインの構文

yoshukiさん、http://saikyoline.jp/weblog/2007/12/post_165.html にて:

そうか、自分は[檜山注:コマンドラインの]バラし方を知らなかったんだ。

コマンドラインの構文はあまり構造化されてないので、バラし方、つまりパージング(構文解析)方法やパーズツリー(パージング結果のデータ構造)が分かりにくいですよね。

おおよそ次のような階層構造だと理解すればいいかと:

  1. 前節のsimple commandが基本単位(リダイレクトはsimple commandの一部です)。
  2. いくつかのsimple commandをパイプ記号「|」でつないだものがパイプライン、単一のsimple commandも特別なパイプラインとみなす。
  3. いくつかのパイプラインを逐次実行記号「;」でつないだものがコマンドライン、単一のパイプライン(単一のsimple commandかもしれない)も特別なコマンドラインとみなす。

ほかに、「&」を添えてバックグラウンド実行、「(」と「)」で囲めばまとめてサブシェルで実行とかでアクセントを付けます。

「&&」と「||」も実行制御に使えますが、これらは、終了ステータスを反転させる「!」と共に、論理演算子とみなすほうが理解しやすいでしょう。つまり、「&&」、「||」、「!」を使うときは、コマンドを真偽値を返す関数のように扱っているのです。commandA && commandB が if (commandA) then commandB else false と同値であることから、「&&」や「||」を条件付き実行のために流用できるのです。

右から左か、左から右か

tohokuaikiさん、http://d.hatena.ne.jp/tohokuaiki/20071221 にて:

んで、次に思ったのは、「左から右って書いてあるのに、パイプは違うじゃん」ってこと。

全体を読んでると、「パイプしてあるって」言うのは「後ろの方に」書かれているのにもかかわらず、「最初に」考慮しなければいけないこととなる。これって、左から右の原則に従ってないよ。

おっしゃるとおり。僕は、「シェルがコマンドラインを右から左に解釈実行するなんてウソ」と書いて、解釈実行は左から右だと強調しました。しかし、どうも強調し過ぎたようです。

シェルは、コマンドラインを左から順に少し読んでは実行し、少し読んでは実行しとやっているわけではありません。コマンドライン全体の構造を把握してから実行します。「|」や「;」で切り分けて、パイプの配管、ファイルディスクリプタの繋ぎ替え(リダイレクト)、サブシェルを含むプロセスの割り当てなどを計画します。

コマンド実行単位内で、右に書いてあるリダイレクト指定を先に考慮し、コマンドそのものをその後で実行する点では、「右から左」とも言えますね。ただし、僕がほんとに強調したかったのは、リダイレクト指定が「左から右」に処理されることです。

ファイルディスクリプタと標準入出力

tohokuaikiさん:

ファイルディスクリプタってなに?って感じだったのだけど、データを出し入れ運ばせられるホースみたいな機能を持ったものを想像した。

はい、その理解でいいと思います。ファイルディスクリプタはデータ(生のバイトや、文字と解釈されたバイト)のストリームの出入り口を表すものです。

また、コマンドにファイル引数があるときはそれが入力に使われるメカニズムですが:

grepは第二引数にきたものをファイルとして認識し、ファイルディスクリプタの0にリダイレクトさせるという処理を最初に行う。

っていう機能があるからだと思う。

ちょっと違います。grepは、「第二引数がなければ標準入力を使い、あればそのファイルを入力とする」だけです。わざわざ「ファイルディスクリプタの0にリダイレクト」はしません。実例で示しましょう; 次はcatの単純版です。

/* kitten.c -- tiny cat */
#include <stdio.h>
#include <string.h>

main(int argc, char** argv)
{
  if (argc == 1) {
    /* no args */
    output(stdin);
  } else {
    /* some args */
    int i;
    FILE *fp;
    for (i = 1; i < argc; i++) {
      if (strcmp(argv[i], "-") == 0) {
        fp = stdin;
      } else {
        fp = fopen(argv[i], "r");
      }
      if (fp == NULL) {
        fprintf(stderr, "kitten: Can not open file %s\n", argv[i]);
        continue;
      } else {
        output(fp);
      }
      if (fp != stdin)
        fclose(fp);
    }
  }
}
output(FILE *fp)
{
  int c;
  while ((c = getc(fp)) != EOF) {
    putchar(c);
  }
}

  1. 引数がない(argc == 1)なら、標準入力(stdin)を処理。
  2. 引数があれば、それらをファイルとみなして順番に処理。
  3. 特別なファイル名"-" は、標準入力を意味する*1

というルールです。

$ echo This is foo.txt | kitten - foo.txt

とすると、This is foo.txt に続けてfoo.txtの内容が表示されます。

標準出力と端末画面

標準出力(stdout)と端末画面(/dev/tty)は概念的に違います。デフォルトでは、標準出力も標準エラー出力も端末画面に繋がっているので混乱しがちです。

標準入出力(ファイルディスクリプタの0, 1, 2番)は、プログラム(実行時はプロセス)から見た概念です。プログラムが、それらの標準入出力が実際にどこに向かっているか(ファイルか端末かなど)は知りませんし、知らなくていいことがすごいメリットなのです。

ですから、

$grep [ prototype.js 2>&1 > hoge

だと、標準出力にエラーがでる

は、やや不正確な表現です。プログラムgrepは、いつだって標準エラー出力にエラーメッセージを書いています。我々がコマンドラインを実行して観測したら、端末画面にエラーメッセージがでたのです。

どうでもいいけど

僕は、「とあるコマンド」を表すためにcommandを使って、command >file 2>&1とか書いてました。bashには、その名もズバリcommandという組み込みコマンドがあります。ですから、commandという綴りをそのまま入力して実行すると、不可解な結果になるかも知れません。

勘違いする人はそういないと思いますが、「シェルのリダイレクトを『こわいものなし』というくらい完全に理解しよう」のcommandをsome-commandに直しました。

*1:それじゃ、ほんとに"-"って名前のファイルがあったらどうすんだ? ってのがクイズ・ネタになったりします。

yoshukiyoshuki 2007/12/22 23:53 さらに詳しい説明ありがとうございました。
知らないなりに済んじゃってたんで、ちゃんと知るいい機会になりました。

m-hiyamam-hiyama 2007/12/25 09:54 yoshukiさん、
> ちゃんと知るいい機会になりました。
拙文がキッカケとなったなら幸いです。

2007-05-21 (月)

イミュータブル・データとミュータブル・オブジェクトの境界線

| 08:49 | イミュータブル・データとミュータブル・オブジェクトの境界線 - 檜山正幸のキマイラ飼育記 を含むブックマーク

再び向井さんからトラックバックをいただき、その向井さん記事から参照されているjijixiさんの記事も拝見しました。なるほど、fold を使うのはカッコイイですね。でも、僕のモヤモヤした感じは晴れません。

僕が話題としているのは、ディクショナリとかセットとかのコレクション系データです。コレクション系データは、その実装がイミュータブルであれ、心理的モデルは変更可能なストレージでしょう(後で詳論)。そのようなデータへの操作とは、変更コマンド(ミューテータ)を時間軸に沿って、次々と送り込むことです。少なくとも僕の感覚としてはそうですね。

関数型言語の純度が高ければ高いほど、“時間軸に沿った変更”を直接的には扱いにくくなります。処方箋は、時間を空間に変換してしまうことです。例えば、時間軸に沿って順次発生するイベント列 foo, bar, baz をリスト [foo, bar, baz] で表現するとか。

これ、手法として素晴らしいですが、「やっぱり、時間は時間だろうや」という感覚を僕は払拭できません。その意味では、“コレクション・データと変更コマンド”を、“プロセスとメッセージ”で表現する向井さんの提案は心理的にしっくりきます。

と、ここまで書いて自分でハタと気が付いたのだけど、論点は全然テクニカル/フォーマルなものじゃなくて、心理モデルのほうかも知れない。つまり、心情的にイミュータブル(時間概念なし)であるべきモノと、ミュータブル(時間概念あり、状態とアイデンティティを持つ)でいいモノの境界線問題が議論の背景だったのではないか。話題にしていたコレクション・データが、境界線付近の微妙な位置にいた*1、って、そういう事情だな、たぶん。

で、心情的な話だと割り切った上で; ディスクファイルへの書き込み、次のように書くと違和感持つ人いるのでしょうか?

sample() ->
 {ok, F} = file:open("greeting.out", [write]),
 file:write(F, "Hello, "),
 file:write(F, "World.\n"),
 file:close(F).

もし仮に(思考実験ね)、「ファイルもディクショナリ(dict)やセット(gb_sets)のように、イミュータブルのごとく振る舞うべし」となると(単純化のため、オープン時エラーとクローズを無視):

sample() ->
 F0 = file:open("greeting.out", [write]),
 F1 = file:write("Hello, ", F0),
 F2 = file:write("World.\n", F1),
 ok.

これをfoldで書き直すと:

sample() ->
 lists:foldl(fun(Msg, F) -> file:write(Msg, F) end,
             file:open("greeting.out", [write]),
             ["Hello, ", "World.\n"]),
 ok.

ウーム…。心情的には、シロウト用の構文糖衣かモナドのほうがいいなー、と思う、あくまで心情的なハナシだけどさ。

P.S. 皆さん、どのような心情をお持ちでしょうか?

Erlang、ほんとに困るのか?

| 09:24 | Erlang、ほんとに困るのか? - 檜山正幸のキマイラ飼育記 を含むブックマーク

id:lethevertさんからもトラックバックで、「Erlangのとても困ったところ」(「単一代入」「階層的パッケージ」)にご指摘をいただきました。

これは単一代入のせいではないですよ。

そうではなくて、Erlangの = は代入ではなくてパターンマッチだということからくる問題です。

これは例えば:

X = 1, % (1) Xはここで初出
X = 2, % (2) 2を代入したい

がうまくいかないのは、(2)のところで 1 = 2 (1と2のマッチング)が失敗するせいだ、ってハナシですよね。そんなメカニズムにより結局は変数の書き換えが禁止されることを「単一代入」という言い方をするんじゃないの?

Prologに関しては、そんな感じで「単一代入」を使っていたような気がするんだけど…(ガサゴソ)… 今はとうてい手に入りそうにない金田悠紀夫・著『Prologマシン』(森北出版、1992)に(ブラケット内は檜山):

[Prologが]他言語と異なるのは[箇条書き1から3を省略] 4. 変数への代入は未定義変数に対して1回だけ行われる単一代入方式であること。

なんて記述がありました。Erlangのマッチングって、Prologと同じようなもんじゃないの?


パッケージに関しては:

それは言いがかりです。Javaだって同じ仕様ですよ。

これは「言いがかり」といわれてもしょうがないですね。というのも、Erlangの仕様に不整合も理不尽さもありませんから。僕が何も調べずに試してみて、ムッとしたのは、根拠のない先入観があったせいです。それは:

  1. 自分が作ったモジュールが、名前空間のルートに配置されるとは思わなかった。
  2. io:*、lists:* などが自由に使えるのは、システム付属のライブラリは暗黙にインポートされるからだと思っていた。
  3. io:*、lists:* を上書きしてないのに、何で見えなくなるんだ? ムカッ!

「mymoduleが.mymoduleと同じ」とか、「-import(io)すればいい」とかは、後から知ったことです。はい、早とちりで感情的になり失礼しました。

*1:dictとgb_setsの使い勝手と実装方法がまったく違っていたことは、その証拠の一つでしょう。

2007-05-18 (金)

Erlangのコレクションと簡易データベース

| 10:06 | Erlangのコレクションと簡易データベース - 檜山正幸のキマイラ飼育記 を含むブックマーク

昨日のエントリー「Erlangのとても困ったところ:単一代入の思わぬ弊害」に、向井淳さんからトラックバックをいただきました。ありがとうございます。

「いー」けど「だめ」

向井さん記事は、Erlangのプロセス・ディクショナリ(プロセスに作り付けのディクショナリ)を使えばスッキリと書けるよ、てな内容。

このようにして書けるのでした。いーでしょ。……だめ?

僕が例として挙げた個別特定具体的なアノ問題に関しては「いー」と思います。が、一般的な文脈では「だめ」です。ディクショナリは、時間的に状態が変化しながらもアイデンティティ(識別性、持続する固有性)を持ち続けるデータの典型例として出したものです。そのディクショナリに関しては、たまたまプロセスに組み込まれたものがあってラッキーですが、他の状態を持つ(かのごとき)データ構造ではどうでしょう。

例えば、gb_setsというライブラリ・モジュールがあります。内部構造に General Balanced Trees を使った順序集合の実装だそうです;マニュアルから抜粋:

An implementation of ordered sets using Prof. Arne Andersson's General Balanced Trees.

使い方は次のようになります。

sample() ->
 S0 = gb_sets:new(), % セットを生成
 S1 = gb_sets:add_element("板東トン吉", S0), % 要素を追加
 S2 = gb_sets:add_element("大垣ペケ子", S1), % さらに要素を追加
 gb_sets:is_element("板東トン吉", S2). % 要素かどうか調べる

もちろん、関数呼び出しの入れ子で書いてもいいし、あるいは、リストを作っておいて適当な関数で一括処理という手もあるでしょう。が、いずれの方法もうっとうしく面倒に感じます。

「セットだって、がんばればプロセス・ディクショナリで出来るよ」ってハナシもあるかも知れませんが、じゃあ、モジュールgb_setsは何のために存在しているのでしょう。それを使うのが適切な場面があるからこそgb_setsが提供されているはずです。そもそもモジュールdictも、プロセス・ディクショナリで代替困難/不可能な状況のために準備されているのでしょう。

僕の不満は、「コレクション類など、状態とアイデンティティを持つ(かのごとき)データを扱う記法が不格好でイヤだ、構文糖衣でいいからなんとかしてくれ」ってものです。

有向グラフと組み込み項ストレージ

コレクション類といえば、有向グラフ(directed graph)のモジュールもありました。モジュールdigraphです。ディクショナリやセットと同じ使い勝手かと思ったら:

sample() ->
 G = digraph:new(), % グラフを生成
 V1 = digraph:add_vertex(G), % 頂点を追加
 V2 = digraph:add_vertex(G), % さらに頂点を追加
 V3 = digraph:add_vertex(G), % もっと頂点を追加
 digraph:add_edge(G, V1, V2, edge1), % 辺を追加
 digraph:add_edge(G, V1, V3, edge2), % さらに辺を追加
 G. % このグラフを返す

なんか違いますよ。digraph:new()が返すのは、一種の識別子であり、これを第1引数にしていろんな操作をするようになってます。有向グラフはミュータブルみたい。

僕知らなかったんですけど、Erlangランタイムごとに組み込み項ストレージ(Erlang Built-in Term Storage; ETS)というものがあって、簡易データベースのように使えるようです。コマンドets:i().でEシェルからETS状況を確認できます。有向グラフはこのETSにより実装されていたのでした。

ということは、Erlangでコレクション・データ/オンメモリ・ストレージを使いたいときは:

  1. プロセス・ディクショナリ -- お手軽簡単
  2. ライブラリが提供するデータ構造 -- ツリー、セット、ディクショナリなど
  3. 組み込み項ストレージ -- 大容量でミュータブル

といった選択肢があるってことですね。

jmkjmk 2007/05/18 11:10 ありがとうございます。じつはエントリーを書いてトラックバックをうってから「単に辞書だけじゃなくて単一代入形式の話に一般化した問題だからこの回答だけじゃだめだな」と遅まきながら気付いたのですが、時すでに遅しでした。

ごく単純には、ひとつのデータを何度も更新して変数として受け取るのではなく、たとえば再帰などを使ってつねに同じ名前で束縛する、という手はあると思いますが(で、その再帰をプロセスとしておき利用者は外からメッセージを送るとか)、なんというか、根本的にはおっしゃる通りだと思います。

あと、あんまりよく知らないんですが mnesia というDBMSもあるらしいですよ。

m-hiyamam-hiyama 2007/05/18 12:49 jmk(向井)さん、
「うっとうしい、面倒だ、イヤだ」というのも習慣・文化の問題かもしれません。Erlang文化になじめば、そのなかで快適と感じる方法(再帰とプロセスなのか?)があるのかもしれませんね。
> mnesia というDBMSもあるらしいですよ。
名前だけは見たことがあります。現状、僕にとっての最大の疑問は「Mnesia -- なんて読むんだ、これ?」です。

sumiisumii 2007/05/18 13:01 私の耳で聞いた限り「エムネジア」でした。:-)(もちろんamnesiaのダジャレ)

m-hiyamam-hiyama 2007/05/18 17:56 sumiiさん、
「エムネジア」ですか。読み方がわかったら、なんか親しみが持てました。調べてみようかな。

lethevertlethevert 2007/05/19 21:14 あ、あれは「エムネジア」と呼ぶんですか。
ちなみに、初期のころ、ram only dbでシャットダウンするとデータが消えるところからamnesiaという名前がつけられたそうです。
http://d.hatena.ne.jp/lethevert/20061108/p2

sumiisumii 2007/05/19 23:14 あーいや、あくまでICFPやErlangワークショップ等で(エリクソンの人などから)私の耳で聞いた音を、私が日本語の片仮名で書いてみただけなので、「ムニージャ」でも近かったと思います。「ム」の音は確かに聞こえたように思いますが、ひょっとしたら空耳かもしれません。

lethevertlethevert 2007/05/19 23:20 私のは想像なので、実際に聞いた音の方が正確ではないかと思います。
それに、sumiiさんの語学力で空耳はないかと :)

m-hiyamam-hiyama 2007/05/21 08:52 原音に忠実であることが最重要ってわけではなくて、カタカナ表記が定まることに意義があるかと。「エムネジア」にしましょうよ。

2007-03-13 (火)

代数系と準同型写像の絵を描いてみました

| 12:15 | 代数系と準同型写像の絵を描いてみました - 檜山正幸のキマイラ飼育記 を含むブックマーク

みずすまし(id:Mizusumashi)さんのエントリー(「圏論メモ」と「関数型言語Haskellとの関係」)からトラックバックをいただきました。なかなか力が入ったエントリーだな、と感心しました。少し応答したいのですが、コメント蘭に書くには長過ぎるので、エントリーを起こします。とりあえず、代数系(代数構造)の例に一言。


せっかく具体的で面白い例を出しておられるので、説明芸の観点からは、もう一工夫あると良かったかな、と。で、僕も絵を描いてみました。みずすましさんが使っていた記号「I」をintegerのIと勘違いして(実際は、Iは非負整数でした)、オリジナルと少し変わってしまったのですが、描き直すのがめんどうなんで、ご容赦を*1

整数{..., -2, -1, 0, 1, 2, 3, ...}を無限に延びた数珠<じゅず>だと思って、それを円筒に丁寧<ていねい>に巻き付けると螺旋<らせん>になります。「ジャックと豆の木」に出てくるツルのようなもんです。整数を 0, 1, 2, ... とたどっていくと、グルグルとまわりながら無限に上に登れます。(地面を0とするなら、負の数はないほうがやっぱり落ち着きますね。みずすましさんのオリジナルのほうが良かった。)

さて一方、目盛りが、0分、15分、30分、45分だけの時計盤を考えます。0分、15分、30分、45分を0, 1, 2, 3で置き換えておけば、1を足していくと、0, 1, 2, 3, 0, 1, 2, 3, 0, ... と循環して無限にグルグル回ります。

僕が描いた絵は、螺旋階段の影を時計盤に落としたものです。螺旋階段(あるいは豆の木)にいる誰か(ジャックでしょうね:-))の影を、分針<ふんしん>の代わりの目印だと思いましょう。ジャックが螺旋階段を1ステップずつ昇る行為は、影である時計盤の分針を1ステップ(15分だけ)進めます。ジャックがドンドン螺旋を限れば、影はグルグル回り続けます。

これが、「整数と、1を足す演算」からなる代数系から、「{0, 1, 2, 3}と、1を足す演算(ただし循環する)」からなる代数系への射(準同型写像)の図解です。たしか『らせん』と『リング』って恐い小説/映画がありましたよね。ここでは、整数(記号Z)がラセン、時計盤(記号Z4)がリングです。ちっとも恐くないです*2


「{0, 1, 2, 3}と、1を足す演算」の代数系から「{true, false}と、tureとfalseを入れ替える演算」の代数系への射(準同型写像)は次のような図解でどうでしょう。

{true, false} は{0, 1}としても本質的な差はないので、{0, 1}のフリップ(入れ替え、反転)と考えましょう。これは、0分と30分にしか目盛りがない時計盤とも思え、分針は、0, 1(30分), 0, 1, ... と2つの目盛りを交互に指すだけの運動をします。

4目盛りの時計盤と2目盛りの時計盤を歯数2:1の歯車で繋いでおくと、4目盛り側の0, 1(15分), 2(30分), 3(45分), 0, ... という運動は、2目盛り(フリップ)側の 0, 1(30分), 0, 1(30分), 0, ... という運動になります。この連動が「{0, 1, 2, 3}と、1を足す演算」代数系から「{0, 1}と、0と1を入れ替える演算」代数系への準同型写像を与えます。


圏論の概念や用語で少し気になる点もあるんですが、それは次の機会(があれば)にしましょう。それと、長文記事を読んでもらいたい人は印刷向けスタイルシート設定した方がいいよ

そうそう、みずすましさんところのコメント欄に書いておいたのだけど、ここにも再掲:

絵はなにを使って描いたのですか? モノグサの僕でも手軽に手早く描けるツールがありましたら教えてください。


[追記]螺旋階段て、時計回りで昇るものなのかな? と疑問に思って、イメージ検索してみました。

この写真(鉄創庵さん:http://www.tessoan.com/cate1/03/7_12/tenjin.html より)は時計回りだけど、逆向きもあったので決まってはいないみたい。[/追記]

*1:あれっ、デッサンも狂ってる、けど、シロートの僕にそれは言わないでよ。

*2:いやっ、僕は高所恐怖症なので、やっぱり無限螺旋階段はコワイ!

masamasa 2007/03/13 20:48 有名な螺旋階段と言えばこれとかですかね。
http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%81%E3%82%AB%E3%83%B3%E7%BE%8E%E8%A1%93%E9%A4%A8

m-hiyamam-hiyama 2007/03/14 10:18 masaさん、
> 有名な螺旋階段と言えばこれとかですかね。
ホーッ。これは反時計回りで昇るみたいですね。