トップ «前の日(06-14) 最新 次の日(06-16)» 追記

じじぃの日記、ツッコミ可

Twitter: @jijixi_org
Xbox Live: jijixi

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|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|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|11|
2011|05|
2012|01|

2004-06-15 たまにはこんなネタで間を繋いでみる……どんな間だ(苦笑

% わしだって男の子

ねえ、すごく綺麗な女の子がまんがみたいな短いスカート履いてたら、そりゃまじまじと見ちゃうでしょ?つーか見るなってのが無茶ですよ。なのにさあ、そんな睨むことないじゃん。それとも自覚は無いが、すごくいやらしい目つきとかしてましたか。自分ではどちらかというとキリッとした顔で見てたつもりなんだが(苦笑

ちなみに『まんがみたいな短いスカート』ってのは、まあなんつーか、アニメみたいでもギャルゲーみたいでも何でも良いんだが、要するに普通じゃなかなかお目にかからないような短さってこってす。イメージ的には下図参照。え?見てもわからん?そうか、それはそれで仕方ない。あきらめてください(爆)。タイトスカートなら、まあ無くはないんだが普通の拡がったやつではちょっと見ないぞ、なかなか。

UFO? パーフェクトジオング

わざわざこんな絵書いたくらいにして…アホかわしゃ。

本日のツッコミ(全1件) [ツッコミを入れる]

% Zapper [足の太さの違いにしか見えない罠w]


2005-06-15 S/N 比に問題があるだけで、2ch だって役に立つんだと見直した今日この頃

% [Mac] fink の gettext が UTF-8 でメッセージを流しちゃう問題

2ch の fink スレで対処法発見。

/sw/lib/charset.alias のファイルが悪さをしていたようです。
内容は次のようですが、最後の行にて何故かUTF-8を指定していますので、
コメントアウトしたら、ロケールを読んでEUC-JPでの出力をしてくれるようになりました。

そもそも最近まで fink のスレがあることを知らなかった罠。 何でかって言うと、どう考えてもスレタイがおかしいから。検索で出ねえよ(苦笑

% [Mac] Intel な Mac では OpenFirmware は使われない

らしい。情報元はこちら

じゃあ何を使うの?てのはわからない。

% [Mac] Intel な Mac ではディスクのパーテーションフォーマットが異なる

らしい。情報元はこちら

じゃあ、いわゆる FDISK パーテーションテーブル(正式には何て言うんだったかな)になるのか?と言うと、それは明言されていない。

% [Mac] ファイルシステムは依然として HFS+ になりそう

こことかここを見る限りは、そんな風に思える。

% [雑談] コメントスパム再び

RSS で読んでる人は気付いてると思うが、コメントキーフィルタ&プラグインを入れて以来ご無沙汰だったコメントスパムが久々に襲来した。 くぅ、このフィルタを抜けてくるタイプか。めんどくせえ。

とりあえず、コメントキーは変更しておいたけど、効果があるかは微妙だな。 たしか英数字のみのコメントははじくプラグインてのがあった気がするが、それも入れてみるか。 うまく同居できると良いんだが…

% [雑談] コメントスパム対策

とりあえず、Anti Referer Spam Plugin を入れてみた。コメントキーフィルタとコンフリクトするとイヤだなと思って、必要に迫られるまでは放置っていう方針だったが、そろそろそうも言ってられないのかも知れないんで。

たぶん、両方使ってる人は結構いるはずなんで、それでも話題に上らないということは特に問題は無いんであろう…とは思うが、もし何か不具合を感じた方はご一報を。

これでも抜けてくるスパムが現れたら……もう良いや、好きにしてくれ(苦笑

本日のツッコミ(全1件) [ツッコミを入れる]

% jijixi [ツッコミテスト。]


2006-06-15

% [PC][雑談] 富豪なクイックソート

Haskell のすごいところっていう文脈でよくでてくるクイックソートって、たしかにシンプルでカッコイイけど、あれって曲芸的なかっこ良さであって現実には役に立たないんとちゃうのー?? みたいなネタを書こうと思ったんだけど、念のため調べてみたら向井さんがとっくの昔に言いたいこと全部言ってくれてたので終了。

基本的にクイックソートのアルゴリズムってリストに向いてないと思う。 ちなみに OCaml の List モジュールのソートは向井さんの言うとおりマージソートだけど、Array モジュールでは sort がヒープソートで stable_sort, fast_sort がマージソートらしい。

あとクイックソートはある程度入力値の傾向がわかってて、それに応じたチューニングができるようなシチュエーションじゃないとオーダーの変動が大きすぎるから、ライブラリ側が用意することってあんまり無いんじゃないかって気もする。 C には qsort ってのがあるけど、現実はともかく規格上は別にどんなアルゴリズムで実装しようが関係ないはず。

% [OCaml][アルゴリズム事典] ISBN 番号

定義上はかけ算を使うのに、隣の要素との足し算だけで済ませてしまうのがおもしろい。 自分じゃこんなの絶対思いつかない気がする。 つーか、思いつこうとも思わないってか?

% cat isbn.ml
let rec read_number s =
   let re = Str.regexp "^[0-9]+[0-9xX]$" in
   match String.length s with
   | 10 as len when Str.string_match re s 0 ->
        let rec loop ct ret =
           match ct with
           | 0 -> ret
           | _ ->
                let n = ct - 1 in
                let i =
                   let c = s.[n] in
                   if c = 'x' || c = 'X'
                   then 10
                   else int_of_string (Char.escaped c)
                in
                loop n (i :: ret)
        in
        loop len []
   | _ ->
        invalid_arg "error"

let check s =
   let lst = read_number s in
   let f a b =
      match a with
      | [] -> invalid_arg "error"
      | x :: xs as l ->
           (x + b) :: l
   in
   let result =
      let seed = [0] in
      let l1 = List.fold_left f seed lst in
      let l2 = List.fold_left f seed (List.rev l1) in
      (List.hd l2) mod 11
   in
   if result = 0
   then `Valid
   else `Wrong

それにしても、Str モジュールはしょぼいなー。

% [OCaml][雑談] List.stable_sort

…のソースを読むとちょっとおもしろい。 まあ、自分でマージソート書くとしても似たようなことやりそうな気はするけど。

要するに、マージ時に append じゃなく rev_append を使うために、正順ソートと逆順ソートを交互にやってんのね。 スタック消費を抑えるための涙ぐましい努力だなー(笑)。 や、標準ライブラリとして作るなら、これくらいやるべきだとは思うけども。


2007-06-15

% [Ruby] 『『クロージャによる超軽量並行プロセス』を Ruby で』をもう少し Ruby っぽく

昨日の続き。

% cat picalc2.rb
class Chan
   def initialize
      @receive = false
      @val = []
   end

   def <<(x)
      unless @receive
         @val << x
      else
         if @val.empty?
            @receive = !@receive
            @val = [x]
         else
            f, *rs = @val
            @val = rs
            f.call(x)
         end
      end
      self
   end
   alias :send :<<

   def >>(f)
      if @receive
         @val << f
      else
         if @val.empty?
            @receive = !@receive
            @val = [f]
         else
            x, *ss = @val
            @val = ss
            f.call(x)
         end
      end
      self
   end

   def recv(&f)
      self >> f
   end
end

ほんとは @receive って変数名を、もっと別のにしたかったんだけど、ちょっと良いのが思い付かんかった。 あとはこんな感じで。

irb(main):001:0> require 'picalc2'
=> true
irb(main):002:0> x = Chan.new
=> #<Chan:0x42090 @val=[], @receive=false>
irb(main):003:0> x << 3
=> #<Chan:0x42090 @val=[3], @receive=false>
irb(main):004:0> x >> method(:p)
3
=> #<Chan:0x42090 @val=[], @receive=false>
irb(main):005:0> x << 5 >> lambda do |y| p y end
5
=> #<Chan:0x42090 @val=[], @receive=false>
irb(main):006:0> c = Chan.new
=> #<Chan:0x5abcc @val=[], @receive=false>
irb(main):007:0> repeat = proc { c >> proc {|i| p i; repeat.call} }
=> #<Proc:0x000434e0@(irb):7>
irb(main):008:0> repeat.call
=> #<Chan:0x5abcc @val=[#<Proc:0x00043558@(irb):7>], @receive=true>
irb(main):009:0> c << 1
1
=> #<Chan:0x5abcc @val=[#<Proc:0x00043558@(irb):7>], @receive=true>
irb(main):010:0> c << 2 << 3
2
3
=> #<Chan:0x5abcc @val=[#<Proc:0x00043558@(irb):7>], @receive=true>

あとはまあ、repeat のとことかが末尾呼び出しで終わってるのをジャンプに書き換えたかったんだけど、考えるのめんどくさなったので止めた。 つーか、上記のように書いてても、ちっとも「スタック溢れたらどうしよう」とか思わない (つまり当たり前のように末尾呼び出しの最適化を期待している) のは、ちょっとヤバいかもと思った(苦笑

(追記) ん、待てよ? repeat.call で処理がブロックしてるわけじゃないから、別にスタックは溢れないか。 単にチャンネルの @val に Proc オブジェクトが積まれていくだけだもんな。

% [Ruby][雑談] きむらさんが丸投げを受けてくれたようだが…

なんかちょっと思ってたのと違う気が。 もっとこう、1.8 の挙動がまとめてあって、これはこういう理由だったんだけど、1.9 では云々…みたいな話があったような気がするんだけど、メールじゃなく誰かの日記とかだったかなあ。

ところで全然関係無い話。 今、ふと思って試してみたら、Method クラスには yield メソッドが無いみたいなんだけど、良いのかなこれで。

% irb19
irb(main):001:0> method(:p).yield(1)
NoMethodError: undefined method `yield' for #<Method: Object(Kernel)#p>
        from (irb):1:in `method_missing'
        from (irb):1
        from /usr/local/lib/ruby/1.9/irb.rb:150:in `block (2 levels) in eval_input'
        from /usr/local/lib/ruby/1.9/irb.rb:259:in `signal_status'
        from /usr/local/lib/ruby/1.9/irb.rb:147:in `block in eval_input'
        from /usr/local/lib/ruby/1.9/irb.rb:146:in `eval_input'
        from /usr/local/lib/ruby/1.9/irb.rb:70:in `block in start'
        from /usr/local/lib/ruby/1.9/irb.rb:69:in `catch'
        from /usr/local/lib/ruby/1.9/irb.rb:69:in `start'
        from /usr/local/bin/irb19:13:in `<main>'

% [Ruby][雑談] ブロック無しの Proc.new, proc, lambda

せっかくなのでこの辺も、わかる範囲で。

ブロック無しの Proc.new, proc, lambda は、それが使われてるメソッドが持っているブロックを暗黙のブロックとして Proc オブジェクトを作るものです。 で、proc と lambda で警告が出るのは非推奨だから (要するに、それをやるなら Proc.new 使いましょうということです)。

&block という仮引数は、ブロックを Proc オブジェクトにして block という変数に束縛する、というのと同義なので、

def a(&b)
  b.call
end

は、

def a
  b = Proc.new
  b.call
end

と同じような意味です。 で、ここからは個人的な趣味の話。

上の例からもわかるように、ブロックに名前を付ける必要が無い場合は、ブロックを実行するなら yield、Proc にして何かするなら Proc.new を使えば良いので、仮引数すら必要無いわけだけど、これがもう、なんつーか個人的には我慢ならん。 だって、それじゃ def の行だけ見ても、それがブロックを受け取るメソッドなのか、そうでないのか判断できないじゃん。 &block って仮引数があれば、「ああ、これはブロックを受け取るメソッドなんだな」って一目で判る。

そんなわけで、わしは yield も引数無しの Proc.new も大嫌いなので、ブロック使うメソッド書くときは必ず、仮引数で受け取って、そいつに call メソッドを使うようにしてるのであった。

あー、でも、パフォーマンスのことを考えると、ブロックをそのまま実行するだけなら仮引数無しで yield した方が良いんだっけ? それとも、その辺はうまいこと最適化してくれてるんかな。

% [雑談][Ruby][JoCaml] ちょっと知ったかぶりしてみよう

なんかトラックバック来てたんだけど、

ちゃんとプロセスを並行に動作させるにはどうしたらいいんでしょうか。スレッドプール?

ここで言われてる『並行』がどの程度のものをイメージしてるかはともかく、例のアレも一応ちゃんと並行 (concurrent) に動いていると言えると思う。 ただ、コンテキストスイッチが起きるのが『関数が終わったとき』だけなんで、粒度が粗いってだけで。

あとはまあ、あるプロセスが無限ループしたりして戻ってこない場合、全体がそこでストップしてしまうのを何とかしたいとか、並列 (parallel) プロセス (CPU が複数あるときに、本当に複数同時に動くようなプロセス) を作りたいとか、って話になると、通常の言語の機能だけでは辛くなってくるはず。 とりあえず Ruby の場合なら言語自体がスレッドの機能を持ってるので、それを利用してスケジューラを構築すればできるようになると思う (並列プロセスは利用するスレッドが並列駆動に対応してないと無理だけど)。 あとはスレッドプールなり何なりを作って、そこに各プロセスを割り振ってやる。 ちなみに、JoCaml は正にそういうことをやってるはず。

じゃあ、言語自体がスレッドの機能を持っていない C とかは、どうやって pthread みたいなスレッドライブラリを作ってんの?というと、たぶんハードウェアのタイマー割り込みを使ってると思う (確かめないで書いてるけど)。 結局、非同期プロセス (スレッド) とか、そいつらのタイムスケジューリングを実装するためには、

  • 通常の処理の流れとは独立して動くタイマー (と割り込み)
  • タイマー割り込みに対応して、何か処理をするためのハンドラ

くらいが最低限必要なんじゃないかな。 スレッドライブラリを持っている言語なら、この二つは作ることができるはず。

……ほんとか?

本日のツッコミ(全1件) [ツッコミを入れる]

% TrackBack [http://d.hatena.ne.jp/ytakamiya/20070615#1181897876 たかみやの日..]


2008-06-15

% [雑談] ペルソナ 23 話

今まで書いたこと無かった気がするけど見てる。 GyaO なんでこの辺。 即消しされるようになる前は某所で見てたんだけども。

あーもー、この手の話は卑怯すぎる。 というか、わしがこの手の話に弱すぎる。 あらゆる点でツボを突いてきやがるもんだから、もう何だか悔しいけど泣いたよ、ああ泣いたさ。

% [clip] sm3667834 (忙しい人?のための 「はたらくくるま」)

あいわからず傑作w

町中きれいに平らにブルドーザー

なんという地球クリーン作戦w

本日のツッコミ(全1件) [ツッコミを入れる]

% keisuken [> もう何だか悔しいけど泣いたよ、ああ泣いたさ。 確かに卑怯ですね:-)。 録画したものは観れないことが判ってた..]


トップ «前の日(06-14) 最新 次の日(06-16)» 追記

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com