青木日記

<前月 | 最新 | 次月>

2003-11-03

お買い物

あー、またちょっと間が開いてしまいました。

そのあいだいったい何をやっていたかと言うと、 いま噂のアレを買ってきたあと勢いにまかせて アレとかアレを買い込んでました。 相当長いこといじってないから腕が落ちてそうだ。

ruby-dev summary

うぁ、今週おれの番か。やばっ。

追記: なんかトピックがいまいち少ないから休もうかなあ。

Racc Runtime in Ruby 1.8

今日のコミットでは Racc 1.4.4 のランタイムをインポートしました。 と思いきや実は Racc 1.4.4 よりも微妙に新しいファイルが入ってます。 これではいつまでたっても同期しないなあ。

コミットログ第三点は

* ext/racc/cparse/cparse.c (parse_main): should abort when
  the length of LR state stack <=1, not ==0.
  (含意: LR 状態スタックの長さチェックが間違ってた)

と、いう意味です。とは言え別に落ちるわけでもなく、 実害が出ることも滅多にないのでリリースはしません。


2003-11-04

printf

突然、Ruby で printf が書けるかなあーっと思ってみた。 いやそりゃ書けるに決まってるけどな。 どのくらい短かく書けるかなあとか、ちょっと気になったわけだ。 でもよくよく調べると仕様がめんどくさい。簡略版にしておこう。 でも適当に書き散らしていたら (途中で) 満足したので放置して、 次は Haskell に printf (sprintf) があるのか調べてみる。 するとこういうものがあった。

どうやらこいつは Template Haskell というのを使っているようだ。 ようするにあれか。マクロみたいなもんか。

GHC 6 には添付されているらしい。 うちはまだ 5.04 なので、この機会にバージョンを上げておこう。

ruby-dev summary

ああ……やっぱりだめだ、スキップできるほど薄くないや。 うおー気分がのらねー

吉野家

そういえば 5/4 の日記で

全然関係ないけど近所の吉野家が食券制になってた。許せん。

とか書いたんですが、今度は元に戻ってました。 評判が悪かったのか?

多重代入

使いみちがわからない Ruby の仕様と言えばなんたってこれでしょ。

* = 1,2,3

まあたぶん直交性を重視した結果なんだろうけどね。 「a, b, = 1, 2, 3」みたいにカンマで終わるのが嫌だから 「a, b, *dummy = 1, 2, 3」とかしたい。 でも dummy なんて無駄な変数を作ってしまうのも嫌だから省略して 「a, b, * = 1, 2, 3」とできるとさらに嬉しい。 で、これができるなら「* = 1, 2, 3」もできないと直交性が低くなるだろう、 という理屈だな。(たぶん)

あと「こんなもんが書けたのかよ」つながりではこんなのもある。

a = []
[1,2,3].each do |a[1]|
  p a
end

2003-11-06

いろいろ更新

Ruby と tDiary を CVS HEAD に上げた。

ついでにプラグインもいろいろインストール。makelirs, output_rdf, whats_new, disp_referrer

メールで更新すると本文が化ける問題が発生。

本日のツッコミ (全2件)

arton [あれー更新してたんだ。Linkavailableだと10/22に食中毒で倒れたことになってるけど。って言うか他のアンテナでは見えてるんですね。]

あおき [22 日に日記のURLを (ホスト内で) 移動したんですよ。
それで追えなくなってるみたいです。]


2003-11-07

動作テスト中

本文が化けるよー

追記 1: uconv.so を入れるとメール経由で追加した日記が 生 JIS になってしまうようだ。これで直すべき場所が絞られてきたな。

追記 2: その後の調査により、tDiary 本体のどこかで ひっかかっているらしいことがわかった。

追記 3: 当面 tDiary 本体にだけ uconv を使わせないことにして解決した。

追記 4: それは解決したとは言わない。

追記 5: uconv を使わなくしたら突然速くなった。 もしかして to_native で一文字ずつ処理してるのが遅くなる原因か?

追記 6: ああそんなことないや。 gsub!(re) ならたいして遅くならないはずだ。 もうちょっと考えよう。

文字化けの原因判明

あー、そうか! 単純な話じゃん。 to_native では Uconv.u8toeuc してるのに iso-2022-jp が来るもんだからそのままスカッと通ってしまうわけだな。 tDiary の posttdiary.rb が EUC で POST するのに対し、 家の独自ブリッジは iso-2022-jp で POST するから文字コードがずれるわけだ。 これですっきりした。

解決

原因がわかればたいしたことないな。 ESC が入ってたら iso-2022-jp 扱いにしよう。

--- tdiary/lang/ja.rb.org       2003-11-07 17:50:37.000000000 +0900
+++ tdiary/lang/ja.rb   2003-11-07 17:51:44.000000000 +0900
@@ -31,6 +31,7 @@ begin
 
        @reg_char_utf8 = /&#[0-9]+;/
        def to_native( str )
+               return NKF::nkf( '-Je m0', str ) if /\e/ =~ str
                if @reg_char_utf8 =~ str then
                        str.gsub!( @reg_char_utf8 ) do |v|
                                Uconv.u8toeuc( [$1.to_i].pack( "U" ) )

解決?

それよりメールブリッジが EUC で投げればいいのかな?

本日のツッコミ (全1件)

ただただし [posttdiary.rbでは、EUC化してます。が、そのパッチは入れておいた方がいいかなー]


2003-11-10

TD4制作記 #1.1

『CPUの創りかた』を読んですっかり萌え^H^H燃えてしまったわたしは 迂闊にも TD4 を作ることを決心しました。

ちなみにわたしのハードウェア関係の力量はこんなもん。

  • パソコン自作はフツーにできる
  • 小学生のころに電子工作講座をやっていたのでハンダ付けはできる。 部品の名前もなんとか覚えている。
  • 理 I でやったエリちゃんの法則はかろうじて覚えていた (E=RI)
  • 健全な日本国民なのでテスタなんてもってない

まずは部品がないと何もできないね。 あとテスタ持ってないから買わないといけないし、 ハンダごても古くなってきたからできれば買い換えたいな。

TD4制作記 #1.2 買い物 (11/3)

いろいろ買いました。

電子部品 (値段は、抵抗が100本入りで 100 円。他は記載がない限り一個 50 円くらい)

  • 抵抗 1/4W 100Ω × 100
  • 抵抗 1/4W 1KΩ × 100
  • 抵抗 1/4W 10KΩ × 100
  • 抵抗 1/4W 100KΩ × 100
  • 抵抗 1/4W 3.3KΩ × 100
  • 抵抗 1/4W 33KΩ × 100
  • 電解コンデンサ 10μF 16V × 5
  • 電解コンデンサ 100μF 16V × 3
  • 無極性電解コンデンサ 10μF 16V × 2
  • セラミックコンデンサ 0.1μF × 30 …… 特価 10 本 50 円
  • ダイオード 1S1588 × 200 …… 720 円
  • ダイオードアレイ B1 technology D5-1C × 6 …… @100 円
  • LED 赤 × 5
  • LED 緑 × 100 …… 550 円

IC (各 30~100 円くらい)

  • 74HC10 × 1
  • 74HC14 × 1
  • 74HC32 × 1
  • 74HC74 × 1
  • 74HC153 × 2
  • 74HC154 × 1
  • 74HC161 × 4
  • 74HC283 × 1
  • 74HC540 × 1
  • IC ソケット × 16 …… @30 円 (60 円だったかも)

その他のパーツ

  • 基板 サンハヤト ICB-98GU …… 3350 円
  • リード線 ジュンフロンETFE電線 AWG30 青 50m …… 1000 円
  • 4 連ディップスイッチ × 1 …… 50 円
  • 8 連ディップスイッチ × 16 …… @290 円
  • 押しスイッチ × 2 …… @100 円
  • 切り替えスイッチ × 2 …… @100 円
  • DC 5V 安定化電源 …… 780 円
  • 電源プラグ …… 100 円
  • 電子ブザー …… 100 円

ツール類

  • テスタ:三和電機(株) YX-361TR …… 4480 円
  • テスタリード線 クリップアダプタ …… 780 円
  • ハンダごて (20W) …… 780 円
  • こて台 …… 270 円
  • ハンダ 1.0mm 100g …… 780 円
  • ハンダ吸い取り線 1.5m …… 180 円

買った店は、秋月、千石、ラジオデパート、ラジオ会館あたり。 あと末広町方面の小綺麗なパーツ屋。 秋葉原には慣れてるのでこのへんは楽だ。

金額は全部で 2 万ぐらいか。 部品だけなら、モノを選べば 1 万くらいで済むはず。

TD4制作記 #1.3 買い物失敗

帰ってきてから Google したり動作確認したりしたところ、 当然というか予想通りにというか、いろいろ間違っていた。

  • リード線が細すぎた。 線の太さを表す AWG というのは数字が小さくなると 太くなるということを知らなかったため
  • IC 用のテスタリード線を買うのを忘れた。
  • 赤 LED が足りなかった。
  • 緑 LED が普通の LED じゃなかった。
  • 基板実装用でないスイッチを買ってしまった。
  • 間違いではないが、8 連ディップスイッチは明らかに相場より高すぎた。
  • これも間違いではないが、ダイオードアレイ (ダイオードを連結したもの) が 見付からなかった。というか、箱しかなかった。

特にリード線の間違いが痛い。 これがないと全く実装が進められない。

TD4制作記 #1.4 買い物その 2 (11/5)

しかたがないのでもう一回秋葉原へ行ってきた。

  • リード線 AWG22 相当 …… 400 円
  • テスタリード線 IC クリップ …… 980 円
  • 赤 LED 10 セット × 2 …… @150 円
  • 切り替えスイッチ × 2 …… @100 円
  • 切り替えスイッチ × 2 …… @50 円

電車代が高いよなー。(往復 720 円)

TD4制作記 #1.5 実装開始

作り始めよう。

うーむ、何から始めたらいいんだろう? かすかな記憶を掘り出してみるに、 確か熱に強い部品から付けていくのが正しかったような気がする。 熱に強いと言えば抵抗とか、IC ソケットみたいなやつだな。 このへんからハンダ付けていくことにしよう。

む、どこに付ければいいんだこれは? p.278 の実装例の写真と p.81 の図を見た感じ、 この互い違いになってる二本のパターンが 5V と GND なんだね? んで、電源ラインの周辺に IC とかをくっつけていけばいいのか。

はたして数年ぶりのハンダ付けはうまくいくのか。 あっさりと次回に続く。

余談

本当は完成してから書こうと思ったんですが、 なんかこのままだと作らなそうな気がしたので 日記に書いてプレッシャーを高めることにしました。

一昨日聞いたところによると高橋さんも部品を買ったそうです。 他に作ってる人はいないんですかー。

本日のツッコミ (全3件)

kawaji [私じゃないけど
http://www.wnishida.com/~brs/wiliki.cgi?TD4&l=jp]

あおき [おおっ、ありがとうございます。
やっぱりいたんですね。
こういう作成記は助かるなあ。]

takeda [半田付け、セオリー的には、背の低いパーツから。裏返して机に
おくと、全部平べったく基板に押し付けられて高さがそろうから。

横置きの抵抗、ICソケット、コンデンサ、縦置きの抵抗、トラン
ジスタ類、コネクタ類の順。

友達がこのページ参考に組み立てようとしてるらしい。ばんがれー]


2003-11-11

Rubyな理由

結局のところ、(俺が) Ruby を使う最大の理由は 「Shift JIS と EUC-JP の文字列をまともに扱えるから」 というただ一点に収束する。


2003-11-12

例の

唐突だけども、例の『CPUの創りかた』で一番ウケたネタは ドモルガン律子だった。不覚にも。

TD4制作記 #2.1 とりあえず何か付けてみよう

今度こそハンダ付けしよう。 このままだと本当に部品を買っただけで終わるからな。

しかしアレだね (と、また唐突に話題が転換するわけだが)、 前々から思ってはいたが自宅で仕事をするのは大変だ。 いつからいつまでやればいいのか曖昧で全然けじめがつかない。 ちょっと油断すると知らないうちに 2ch 眺めてて全然書いてなかったり、 その逆に朝から晩まで書き続けて挙句に徹夜してしまって次の日は一日中寝てたりする。 これはよくない。非常によくない。免許の講習で習ったことによれば、 いくらあせって追い抜きをしても到達時間はほとんど変わらないのだ。 もうちょっと身近な例を挙げるならば、ボトルネックを解消しない限り プログラムの速度はちっとも上がらないのだ (それは身近な例なのか?)。 ようするに、毎日平均的にたんたんと書くほうが全体的な執筆速度は上がるのである。

言い訳はこんなところにしておいて本音を言うと、 こんな朝っぱらから原稿書いてられるかよ! かよ! よ! (エコー)

TD4制作記 #2.2

作成記なのに全然作ってないじゃんとか言ってはいけない。 それがたとえ事実でも世界は欺瞞と矛盾に満ちているんだ。

法則 1。 このようなわけのわからないノリが続くときは常に徹夜明けである。

∴ 今日も徹夜明けである。

TD4制作記 #2.3 ハンダ付け

うわぉ、ハンダづけができなくなってる!

回路が細かくて手がぷるぷるする……

TD4制作記 #2.4 初ハマり

とりあえず電源 LED でも付けてみるかと思ったらいきなりはまった。

新しいハンダごてがどうもうまくない。 まともにハンダが溶けないし基板にハンダが乗らない。 結局古いハンダごてを使うことにした。

次は電源ソケットがなんかおかしい。 どうやら接触不良みたいだ。

ソケットはいずれ買い直すとして、 今日のところは適当に DIP スイッチでも付けておくか。

しかしこれは……思ったより遥かに時間がかかるな。

本日のツッコミ (全2件)

zunda [初めまして。背の高い人を先に付けると後でまたハマりますよん。(楽しそうだなあ。)]

あおき [あ、初めまして。でしたっけ。
TD4、もうスイッチとかいろいろ付けちゃいました……(泣)。]


2003-11-13

Alpha EV79 出荷中止

http://www.zdnet.co.jp/enterprise/0311/11/epc06.html

……もういい。 hp にはひとかけらも期待してはいけないということが改めてよくわかった。

VAIO X505

http://www.jp.sonystyle.com/Style-a/Product/X505/

うおー、かっこいぃ……。これは欲しい! この匡体だけでスペックとかどうでもよくなるな。 たとえ CPU が MIPS だったりビデオチップが グラフィックシンセサイザーだったりしようと問題なし!

というかそれはむしろイイかもしんない。

aa

[ruby-talk:85001] 見て気付いたけど、 RAA にアクセスするライブラリは是非とも aa.rb にすべきだね!

ruby -raa -e download -- racc

む、そうか! すると、

ruby -refe
ruby -racc
ruby -ripper

というのもありうるのだな。いやそれより

ruby -ruby
ruby -rb
ruby -rd
ruby -rdoc -e tohtml -- net/http

あたりをまず考えるべきか。これは盲点だった。 ロリとかルリとか言ってる場合じゃない。

本日のツッコミ (全1件)

ささだ [ごめんなさい。]


2003-11-14

朝食

賞味期限切れ食物で生活しているというイメージを払拭するため、 しばらくのあいだ、食ったものをすべて書いていこうと思います!

今日の朝食。偶然がかさなって非常に豪華。

  • 米。なんと魚沼産コシヒカリ新米。とうぜん賞味期限内。
  • 味噌汁。具: キャベツ (期限切れ)、わかめ (期限切れ)、たまねぎ (期限切れ)、卵 (期限内)
  • うなぎ切り身 1/4 尾 (今日まで)

……なんか、恒常的に賞味期限を切らしているということが 証明されるだけのような気がしてきました。

あ、あと

  • アリナミン A 錠剤

風邪ひいた。しくしく……。

ところでアリナミンで思い出しましたが、 オロナミン C とリポビタン D とアリナミン A をよく間違えます。 いや、わかってるねんで? ファイト一発がオロナミンC。

TD4制作記 #3.1 手動クロック回路

(画像はあとでまとめてアップします)

ようやく回路っぽいものにとりかかります。 まずは川路さんから教えてもらったページにあったとおり クロック回路とリセット回路から。

そうか、早くも IC が登場するんだな。 74HC14 (シュミットトリガ・インバータ 6 個入り) を使います。 これの IC ソケットを付けてと。

うあ! 付ける場所間違った! まあいいや、ささいなことだ無視しよう。

IC の電源をつなぐ。んー、足の内側にある電源パターンに直結でいいのかな? こういう短い部分はどうやってつなげばいいんだろう。 とりあえずハンダを大量に盛ってつなげてみた…… が、ノリが悪くてすごい巨大なダマができた。 どうもこのハンダごては使いにくいな。

だまだま

ところでリード線ですが、AWG 22 の単芯リード線をみつけられなかったので 多芯のリード線を使ってます。皮むきはカッターで。 ワイヤーストリッパーなんて高いもん持ってないしー。

次は手動クロックをつないでいこうかな。抵抗をつなぐ……。 つなぐ……。つなぐ……。コンデンサつなぐ……。IC につなぐ……。 パスコン付けて 5V と GND につないで終わりと。

そんなに簡単なわけないじゃん。 うああ、ピンセットがないのは致命傷だー! 配線が難しいよ! 鬼のように難しいよ!

これから作る人はぜひとも単芯のリード線を用意してください。 あとピンセット必須。 なんか「手先が器用選手権」の修行をしてるような気分になってきますた。

ハンダと「ぷよ」は挙動が似ている。

ハンダ付け。テスタで導通確認。 ハンダ付け。テスタで導通確認。 ハンダ付け。テスタで導通確認。

あ、そうか。 部品の足を切らずに折り曲げてそのまま 5V まで持っていけば楽かもな。

どう見ても実装例で使ってるリード線は AWG22 より細くないか? いや違うな。おれの買ったリード線の被覆が無駄に太いんだ。

えっと、やっぱり写真の配置はかなり合理的なのでした。 IC の場所を間違えると非常に配線がやりづらくなります。 何度も確認しましょう。

知らないあいだに 5V と GND がつながっとるー。 ううう、どこがつながってるんだ……。

と思ったらこないだつないだ LED 回路が犯人だった。 どうりでテスタの+-変えたら反応しないわけだよ! 自分で自分の首をしめたか……。

そういえば電源パターンの強化をしてなかったな (p.81 参照)。 上のほうだけやっておこう。

3000 行の main() で goto を使いまくる初心者プログラマの気分。

あーあーあー早くも空中スパゲッティ配線。 もう見てらんない。



ようやく手動クロック完了。先は長い。

本日のツッコミ (全6件)

はりせん [ベシッ]

ただただし [薬にも賞味期限あるからね]

ょゎ [ファイト一発はリポビタンDです]

あおき [ボケに真面目につっこんじゃだめぇ~っ (笑)]

ょゎ [もう一回「わかってるねんで!?」と返ってくるのを期待したんですが……(嘘泣)]

あおき [ああっ! そういうことかっ (遅)
それはそうと、「それがごっちゃに……」が足りないすね。
詰めが甘かった。]


2003-11-15

stat(飯)

不幸な事故により今日は寝てすごしてしまったので 昨日今日とほとんど食べてない。腹へった……。

昨日の昼食: なし

昨日の夕食: 調理パン 2 個 (期限内)

今日の朝食: なし

今日の昼食: なし

今日の夕食: 調理パン 1 個 (期限内)

おまけ: アリナミンA: とっくに有効期限切れ

インデント

文字列をインデントしようと思ってこういうのを書いた。

def indent(str, n, tabstop = 8)
  str.map {|line|
    indented = (' ' * n) + untabify(line, tabstop)
    if tabstop
    then tabify(indented, tabstop)
    else indented
    end
  }.join('')
end

んでこういうテストを書いた。

def test_indent
  assert_equal '  ', indent('', 2)
end

そしたら結果が "" になって失敗した。 "".to_a は [] になるんだね……。

ついでに vi と Emacs の挙動を調べたところ、 実は両方とも Ruby と同じ結果 (indent("") == "") になるということがわかった。 びっくりだ。


2003-11-16

まだ思い出せない……

一定の容量の純水に溶かすことができる塩分の限界量のことは 何て言うんだったかなあ……

と、味噌汁に味噌を溶かしつつ考えたんですが、 「飽和水蒸気量」という単語が浮かんできて離れなくなってしまいました。

その次は「浸透圧」という単語が浮かんできて離れなくなりました。 少しだけ正解に近付いたような気がしなくもありません。

従って今日の朝ごはんは (も) 味噌汁です。

(追記) ぐぐった感じだと「溶解平衡」が一番近いか? でも高校化学って書いてあったけど、やった覚えがないぞ。

stat(昼食)

  • 米 (期限内)
  • 味噌 (期限内)
  • キャベツ (賞味期限切れ)
  • わかめ (賞味期限切れ)
  • たまねぎ (賞味期限切れ)
  • 納豆 (賞味期限切れ)

今日もピンチだごはんがうまい。

のしらっとう

納豆で思い出しましたが、子供のころに考案した メニューで「のしらっとう」というのがあります。

「の」り + 「しら」す + な「っとう」 = のしらっとう

メニューっていうか、御飯にのりとしらすと納豆をのっけるだけです。 ちなみに乗せるときは上から「のり・しらす・なっとう」になるように 乗せなければいけません。 間違えると「しらのっとう」や「っとうのしら」のようなパチモンになります。

おいしいので一回やってみてね。

なお、これに生卵を追加すると「のしらっとうたまご」になります。 これもうまいです。ちなみにこれも順番に意味があります (The order does matter.)。

本日のツッコミ (全2件)

kjana [こんなんみっけ
<http://chemserv.b-ed.smz.u-tokai.ac.jp/chemilab/Salon/yougosyuu.html>
溶解度ですね。]

あおき [おお! そのものの単語があったんですね。
(でもやっぱりやった覚えはないな……)]


2003-11-17

MMR

そうか……。

『萌え萌えRuby』で頭文字が MMR になるな。

「Rubyという言語名はこれを予期して付けられていたんだよ!!」

「「「な、なん (ry

パク森

やまださんの日記で「パク森」という単語を見て、 どこかで見たような……と思ったら、 さっき食べたレトルトカレーも「パク森」だった。

レトルトカレーなので今朝は賞味期限切れなし。

とか言われて素直に信じた人は甘い。 福神漬が賞味期限切れてた。

stat(昼飯)

スパゲティ。乾物ゆえ賞味期限内。

tdiary grep

アクセシビリティが微妙に低い表現で言うと、 このページの右上のほうに grep 窓を付けてみた。 検索窓はよく見るが grep 窓はそうそうあるまい。

RubyConf2003 のまつもとさんのスライド

http://www.rubyist.net/~matz/slides/rc2003/

おっ、Rite についてずいぶん詳しく出てますね。 ここまで整理されてるのは初めて見るなあ。

オプショナルな静的型付けっ?! いや、静的とは書いてないな。実行時チェック?

む、丸括弧を文に使うのはあきらめたんですね。 この仕様は意外と混乱の原因になってたし、いいかも。

新しい Hash リテラルなんて作るんだ。 キーワード引数導入の布石だろうな。

GC は 1bit reference count + mark&sweep か。へー。

でも秘かに一番驚いたのは定数の

  • then surrounding nesting class (1 level)

だなあ。だって 1 level ってことは、

module A
  module B
    module C
      module D
        p A      # エラー
      end
    end
  end
end

ということでしょ。 モジュールを気軽にネストしてると痛いめに合いそうだな。 もっとも個人的にはこっちのが嬉しい。

他の項目は多かれ少なかれどこかで聞いたことがあるな。

本日のツッコミ (全4件)

なかだ [しかもf!]

なひ [なひもConstantをみて、soap4rはやばいなぁと思ってました。こまめにincludeするしかないかな。
privateを別のnamespaceにというのがよくわかりません! 実装し易いのかな?]

なひ [てんてんてん。改行。
なんじゃろ?]

あおき [独自の shorten がしくじってました。
バイト数で長さを判断してるのに文字数で削ってたもんで、
「省略したかったのに省略されてない」という事態に……。]


2003-11-18

Rite / 定数参照

あ、昨日のは違うな。こうでなくてはだめだ。

module A
  module B
    module C
      module D
        p B    # エラー
      end
    end
  end
end

トップレベルの定数は別の規則で見えるもんな。

ruby / fileutils

cp a a がエラーにならないぞって言われたので直してチェックインした。 ruby-talk のパッチのように expand_path だけだとシンボリックリンクが はさまったときに同じファイルとわからないことがあったので、 readlink も入れた。

あれ? シンボリックリンクって何段追えばいいんだっけ。 えーと、

~/tmp/symlink % uname -srm
Linux 2.4.22 i686
~/tmp/symlink % echo OK > 0
~/tmp/symlink % prev=0
~/tmp/symlink % for i in {1..64}; do
for> ln -s $prev $i; prev=$i; cat $i > /dev/null
for> done
cat: 6: Too many levels of symbolic links
cat: 7: Too many levels of symbolic links

うあ、こんなに浅いのか。 すると fileutils の 128 は大きすぎだな。 16 もあれば十分か。

いやその前に Solaris も試そう。

aamine@ultra30 % uname -srm
SunOS 5.9 sun4u
aamine@ultra30 % echo OK > 0
aamine@ultra30 % prev=0
aamine@ultra30 % for i in {1..64};do
for> ln -s $prev $i; prev=$i; cat $i > /dev/null
for> done
cat: cannot open 21
cat: cannot open 22

Solaris 9 は 20 か。

もしかしてユーザレベルで設定できたりしないだろうな。 とりあえず Linux の /proc にはそれっぽいのはないね。

NetBSD はどうだろう。

aamine@asv800 % uname -srm
NetBSD 1.6.1 alpha
aamine@asv800 % echo OK > 0
aamine@asv800 % prev=0
aamine@asv800 % for i in {1..64}; do
for> ln -s $prev $i; prev=$i; cat $i > /dev/null
for> done
cat: 33: Too many levels of symbolic links
cat: 34: Too many levels of symbolic links

NetBSD は 32。どんどん上限がのびていくー。

うーむ、それでは Ruby ではいくつくらい追えば十分だろう。 適当に 64 くらいでいい?

いや最後に Cygwin もやってみるか。

~/tmp/symlink % uname -srm
CYGWIN_NT-5.0 1.3.22 (0.78/3/2) i686
~/tmp/symlink % echo OK > 0
~/tmp/symlink % prev=0
~/tmp/symlink % for i in {1..64}; do
for> ln -s $prev $i; prev=$i; cat $i > /dev/null
for> done
cat: 11: Too many symbolic links
cat: 12: Too many symbolic links

Cygwin は 10 と。もしかしてとんでもない値に なってるんじゃないかと思ったが意外と常識的だった。

結論としては 64 ってことで。

シンボリックリンク限界

いや、こんなのがあったんで、 動的に変わる可能性もあるんじゃないでしょうか。

http://www.gnu.org/manual/glibc-2.2.5/html_node/Symbolic-Links.html

int MAXSYMLINKS Macro
 
The macro MAXSYMLINKS specifies how many symlinks some function
will follow before returning ELOOP. Not all functions behave the
same and this value is not the same a that returned for _SC_SYMLOOP
by sysconf. In fact, the sysconf result can indicate that there
is no fixed limit although MAXSYMLINKS exists and has a finite value.

いずれにしても、akr さんのおっしゃるように inode を見るほうがいいみたいですね。 st_ino がポータルなのかどうかでひっかかってたんですが、 Ruby の file.c を見る限り特に限定はないし、 少なくとも Ruby の上においては inode は得られると仮定していいんですね。

そういうわけで、inode を見ることにします。

i

あああ! i-mode と i-node は似てる!

本日のツッコミ (全2件)

きしもと [MAXSYMLINKS ( sys/param.h ) を見ませう ;-)]

akr [stat して dev/ino を比べるのでは?
そうしないとハードリンクが扱えないし。

% echo a > a
% ln a b
% cp a b
cp: `a' and `b' are the same file]


2003-11-19

stat(昼飯)

  • 米 (期限内)
  • さけ切り身 (今日まで。今回はちゃんと期限内に食べ終わったぜ!)
  • 味噌 (期限内、買ったばっかり!)
  • 大根 (賞味期限が付いてないんだけど、そろそろ怪しい)

「もっとがんばってもらわないと」とか言われても、 どっちにがんばればいいものやら。

NTFS で inode

結局シンボリックリンクを追うのは stat(2) に任せることにしたので段数を指定する必要はなくなりました。 が、そのかわりに Windows でドツボにはまると。

ruby-dev では Tietew さんの試験パッチが出てますが、 せっかくの機会なので Windows API を使う練習をしてみました。

// fileid.c -- print file ID (works only with NTFS)
// Usage: ./fileid.exe filename
 
#include <windows.h>
#include <stdio.h>
 
int
main(int argc, char **argv)
{
    HANDLE f;
    BY_HANDLE_FILE_INFORMATION info;
    BOOL ok;
 
    if (argc < 2) {
        puts("too few argc");
        exit(1);
    }
    f = CreateFile(argv[1], 0, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (f == INVALID_HANDLE_VALUE) {
        puts("CreateFile failed");
        exit(1);
    }
    ok = GetFileInformationByHandle(f, &info);
    if (!ok) {
        puts("GetFileInformation failed");
        CloseHandle(f);
        exit(1);
    }
    printf("%08x %08x\n", info.nFileIndexHigh, info.nFileIndexLow);
    CloseHandle(f);
    exit(0);
}

stdio 使っていいのかな。 ま、動いてるみたいだから今回はこれでいいや。


2003-11-20

Duck Typing

Duck Typing (名詞)

「猫っぽく見えるなら猫ってことにしとけばいいじゃん」という、現代的・殺那的な考えかた。 にゃーと鳴いたら猫。わんと鳴いたら犬。respond_to?(:each) なら Enumerable。

参考: http://c2.com/cgi/wiki?DuckTyping

stat(昼飯)

おにぎりと煮物のみだったので期限内。 夕飯は食べるのさぼろかな。

本日のツッコミ (全2件)

ささだ [そういえば、研究室に置きっぱなしにしていたレトルトカレーとかが、期限切れてたんですが、来週くらいにもっていきますか?]

あおき [なんでやねん (笑)]


2003-11-22

Wiki + CVS

『バカが征く』から。

CVS を組み込むところまではいきませんけど、 CVS や RCS を外部コマンドとして使って バージョン管理機能を実装した Wiki ならけっこうたくさんありますよね。 実はついこないだ自分でも調べたとこなんですけど、 AsWiki は RCS が使えてウェブインターフェイスもあります。 あと www.ruby-lang.org の RWiki は裏に CVS がいるはず。

『WikiWay』の 9 章にも、衝突回避やバックアップのために バージョン管理システムを使うのがよい、という話がありますし、 けっこう Wiki とバージョン管理システムは関係が深いもの なのではないでしょうか。

Hiki

おっと、Hiki はすっかり見落としてました。 迂闊です。CVS が使えるのはいいですねえ。

ただ、Hiki は家のサーバで動かしたらすんごい遅かったのが気になります。 Wiki に関してはリファラとか記録してくれなくても気にならないし、 どうせテーマもそのまま使うことはないだろうから tDiary との テーマ互換性にはあまり魅かれません。

そもそも、tDiary のテーマってどれも格好いいんですけど、 この日記みたいに突然コードや文章が大量に出現する場合には合わないと思うですよ。 この日記で CSS を自分で書いてるのもそういう理由からです。 んで Wiki であれば分量の多いページも増えると思うので、 tDiary のテーマが使えても個人的にはメリットに感じられないわけです。

まあしかし、そのあたりは実は些細な問題です。 速度の問題はサーバを速くすればいいだけだし、 簡単とかカッコいいことのほうが重要に決まってます。 いまのところ Hiki に感じる最大の問題点はと言うと、

名前が嫌。

(-_-)
(∩∩) ← 「Hiki」って名前を聞くといつもこれを思い出すなあ

stat(飯)

昨日の昼はカップラーメンのみ (期限内)。

夕飯は実家で食ってきたのでバッチリ期限内です! 量もあります! 栄養もあります!

んで今日はまだ何も食ってません。

stat(昼飯)

しまった! 米を水につけたまま一晩放置してしまった! これを炊くとどうなるんだろう。

  • 米 (一晩放置)
  • 味噌 (期限内)
  • もやし (今日まで)
  • 卵 (まだまだ余裕)
  • あじの干物 (今日まで)
  • 納豆 (明日まで)

X クリップボードのプロトコル

http://freedesktop.org/Standards/clipboards-spec/clipboards.txt

X のクリップボードの標準てのがずっと謎だったんだけど、 ruby-talk を読んでたらいい URL が出てた。 以下要約。

  • セレクションを使え。カットバッファは忘れろ。
  • ICCCM 標準では PRIMARY・SECONDARY・CLIPBOARD の三つのセレクションを使うことになっているが、 SECONDARY は事実上使われていない。これも忘れてよい。
  • 選択しただけのオブジェクト (暗黙のうちにコピーされたオブジェクト、X スタイル) は PRIMARY セレクションに入れる。
  • cut などのメニューコマンドを使って明示的にコピーされた場合 (Windows スタイル) は CLIPBOARD セレクションに入れる。

最後の PRIMARY と CLIPBOARD の違いは初めて知った。

ClipShare や xclipstr は明示的なコピーと考えられるから、 CLIPBOARD セレクションを使うべきなのかな。 現実的には両方提供するのが一番か。

○○○とり

repository は -tory。 registry は -try。

本日のツッコミ (全10件)

ただただし [HikiもCVSやsubversionが使えますよ]

ょゎ [どこで見たか忘れましたが、由来はまさにそれらしいです<Hiki]

(う) [お米を一晩水につけるのは、水温がじゅうぶん低ければ特に問題ありませんよ。
水温が高かったり、水につける時間がかなり長かったりすると、米から糠が溶け出して、炊き上がりったときにご飯が糠臭くなることもあります。]

Yuya [私も一度やったことがあります。<水につけて一晩放置
その時はちゃんと炊けましたけど。]

あおき [え? アレなんですか?!>Hiki]

あおき [米は無事においしく炊けましたー。
ちょっと糠っぽかったけど。]

shiro [へぇーへぇーへぇー>Hikiの名前の由来。
ハワイ語でhikiは「できる、可能である」とか、「到着する、到達する」とかの意味があるので、もしかするとそっちかなとか思ってました。]

あおき [むしろハワイ語の Hiki の意味に 20 へぇー]

smbd [ハワイ語の"Hiki"の意味に
(;・∀・)つ〃∩ ヘェーヘェーヘェーヘェーヘェーヘェーヘェーヘェーヘェーヘェー]

ささだ [Suntory はとりいさん。]


2003-11-24

Ripperの行く末

Ripperの現状と今後の展開について。

まず、現在の Ripper のインターフェイスが不完全であることは宣言しておきたい。 ハンドラの名前が on__xxxx とわざわざ下線二つになっているのは、 Ruby レベルでラッパーをかぶせてより使いやすいイベント on_xxxx を定義しようと思っているからである。

例えば on__nl と on__ignored_nl というイベントがある。 nl のほうは文末として使われる LF で発生し、 ignored_nl は単に無視される LF で発生する。 でもたぶん「LF 全部」という取りかたはしたくなるだろうから、 on__nl と on__ignored_nl の両方で on_nl を発生して そういう要求にも応えられるようにする。 同時に on_eos_nl と on_ignored_nl も定義して、 情報が失われないようにする。

もう一つ実装したいのが高レベルインターフェイス。 「この if に対応する end まで」とか「構文木作成」とかの、 超お手軽メソッドを用意したい。 これは別クラス (Ruby::Parser?) で提供する予定。

※ LF で思い出したが、コメントの後にある LF が取れてなかったような記憶がある。直さなきゃ。

stat(飯)

こないだから何気なく書いているこの題名ですが、 stat のあとに ctime を見るか mtime を見るかで議論は 堂々巡りの様相を呈してきています。

もちろん口からでまかせです。

今日の昼飯。

  • 米 (期限内)
  • 味噌 (期限内)
  • 大根 (もはやいつ買ったのかわからない)
  • 納豆 (昨日で賞味期限切れ)
  • あじの干物 (一昨日で賞味期限切れ)

今日の夕飯。

  • 米 (期限内)
  • 納豆 (昨日で賞味期限切れ) やっとかたづいた……

なんて変わりばえしないんだっ!

『今日の料理』でも買ってくるべきだろうか?


2003-11-25

本領発揮

寒いっすね。

こういう季節はパソコンを暖房代わりにするに限ります。 Pentium 4 は熱まみれなので冬は助かります。

……あれ? あんまり暖かくならない。

しかたがないので AlphaServer 800 も動かしました。 ついでに Ruby もコンパイルしとこう。おお、これは暖かいな!

結論: 冬は Alpha に限る。


2003-11-26

is_a? と ===

これまでクラスの判定が必要なときは Class#=== を使ってきたが、 Object#is_a? に乗り換えることにした。 dRuby とかで幸せになれそうな気がしたからだ。

だが、気がしただけで DRbObject#is_a?(c) は転送されないのであった。 あああ、DelegateClass も is_a? はフォワードしないのか……。 だめだ、クラスの判定はダメだ……。

もういい! どっちでも同じなら Class#=== を使うよ!

QuickiWiki

WikiWay を読んでいたら QuickiWiki のコードを実際に見てみたくなった。 以下のところからたどればよさそうだ。

結城さんとこの Wiki の QuickiWiki ページ: http://www.hyuki.com/yukiwiki/wiki.cgi?QuickiWiki

で、見た。

なんで脈絡もなくインデントが 1 になったり 8 にしてみたり 4 になったりするんですか? 閉じブレースの位置くらい統一しろと。

いろいろな意味で凄いコードだ。 HTML 断片をヒアドキュメントでソースコードに 埋め込みまくりなのは、ある意味潔い。 いわゆる日本のわたしとしてはちょっとためらうやりかただが、 これはこれでよいものだ。

うーんと、

open(T, "template.html") or die "template.html: $!";
undef $/;
$_ = <T>;
close(T);
s/\$(\w+)/defined($par{$1}) ? $par{$1} : ''/geo;
print;
$/ = "\n";

こういうことか。

params = {'title' => 'Search Result', ....}
print File.read('template.html').gsub(/\$(\w+)/) { params[$1] || '' }

この調子で全部書き直したらめっちゃ短くなりそうだな。

そういえば『PerlユーザーのためのRuby入門』でまさにこれをやっていたはずだ。 変更後のソースコードはどこかに落ちてないものだろうか。

2chsucc

~ % cat succ2ch.rb
require 'jcode'
class String
  def succ2ch
    prefix = ['','','','','','','じゃ','それじゃ','じゃあ']
    prefix[rand(prefix.length)] + gsub(/[\d0-9]+/) {|s| s.succ }
  end
end
puts '2!'.succ2ch
puts '>>102 典型的なバカ'.succ2ch
puts '5取ったら脱ぎます'.succ2ch
 
 
~ % ruby -Ke succ2ch.rb
じゃ3!
>>103 典型的なバカ
それじゃ6取ったら脱ぎます

net/http todo

net/http の ToDo がたまりまくり。 1.9 でやろうかと思ってたら 1.9 がなかなか始まらなくて泣きを見た。 とりあえずここにメモっとく。

  • テストを書きなおす
  • 環境変数 HTTP_PROXY を見る (CGI除く)
  • ヘッダが複数ある場合に、それを配列で得られるメソッドを作る。
  • WebDAV 用のリクエストクラスを作る
  • HTTP#post/put のリクエストボディに大量のデータを渡せるようにする
  • 例外クラスを考えなおす
本日のツッコミ (全2件)

ささだ [私は kind_of? を使うんですが,自分でもなぜかわかりません.]

あおき [kind_of?……そういえばそんなものもあったなあ。]


2003-11-27

Wiki + GraphViz

今日の深夜に突然 「Wikiのリンク構造が絵で見られたら面白いなあーっ」 と思いついた。当然そんなことはみんな考えてるらしく、 「Wiki GraphViz visualize」で Google したら、出るわ出るわ。 ヒットしまくってるじゃん。

これはもうちょっと別なことを考えないとだめだな。 最新の RWiki だと PageRank が計算できたりするけど、 それを考慮に入れて重み付けしてみるとか?

特定のページを指定するとそれを中心に図示してくれる……。 自分の名前のページをピックアップできると便利かも。 はてなの「おとなり日記」とちょっと似てるな。

Wiki + Referer

そうか、Referer はサイトを越えた ReverseLink なんだな。 そう考えると Referer は重要か。 「Wiki で Referer はいらないし」ってのは撤回しよう。

うむ、ということは、意図的に ReverseLink の扱いと似せてみたらいいかもしれない。 例えば、(tDiary の「34 | 21 | 5 | 6 | 1 | 1」のような表示ではなく) ページのタイトルと更新時刻を出すってのはどうだろう。 あるいは最初/最後に Referer が付いた時刻でもいいな。 それで時刻順にソートすればいい。


2003-11-28

グラコロ

グラコロってそんなにいいものなのか。 明日食べてみよう。

stat(飯)

朝昼夜飯を全部兼ねておにぎり二つ。

そして冷蔵庫では着々と鯖がいたみはじめている。

ちなみにサーバではない。

本日のツッコミ (全3件)

(う) [殺意を覚えるほどのものではないと思います :)]

arton [グラコロの賞味期限でやっぱりその日限りなのかな]

smbd [自分もそこまでうまい物とは思いませんねぇ…]


2003-11-30

RHG 読書会 reloaded #4

昨日でした。年末は人が少ないね。 そんなこともあって今回は 3 章『名前と名前表』だけです。

今回のハイライト

  • 演算子、前か後か!
  • 五月雨 samidare が集まって速くなるアンテナ「最上川」
  • 笹田さん、ruby-dev summary に参加表明

もっと真面目な記録はいつも通り RWiki にあります。

グラコロ

グラコロセット食べてきたー。

感想: 普通だった。

でも、マックの普通のハンバーガーよりはうまいかな。

stat(昼飯, 夕飯)

なんと stat は可変長引数関数だったのだ!

  • こめ (期限内)
  • 味噌 (期限内)
  • キャベツ (茶色がかってる)
  • たまねぎ (茶色がかってる)
  • さば (賞味期限 + 2 日)
本日のツッコミ (全2件)

たむら [さばの +2 はヤバいだろう ...]

あおき [これまでの経験からすると 3 日でもなんとか]


<前月 | 最新 | 次月>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|