K.Sasada's Home Page

Diary - 2004 April

研究日記

卯月

_30(Fri)

また風邪ひいた。


cygwin で binutils をクロスコンパイルしたら、エラー。何かと思ったら、作ったショートカットがうまくひけてなかったらしい。環境がまずいのかなぁ。

_KM(Fri Apr 30 10:49:55 JST 2004)

 djb の dnscache 使えば? → DNS サーバ逝ってる

_asd(Thu Jun 03 18:06:17 JST 2004)

 asd

_29(Thu)

もう、アーサー王の話とか聞くと、あぁ、あれね、とか思ってしまって困る。

新撰組もそう(何)なんだけど。


ruby って nadoka の設定ファイルに使われてる言語だっけ、だな(無理)。


commit mail を ML に流すためにちょっとスクリプト書いたんだけど、なんか間抜け。quickml に、素通りするメールアドレスが登録できればいいんだろうけど、それはそれで面倒。

作ったやつが一般化できればいいんだけど。


1.6.7 環境で Enumerable#any? を使って動かなくてはまった。


svn + viewcvs 出来た。

問題になっていたのは、libswig1.3 のバージョンが違う、というところだったのだけれど、それは libswig1.3 が正しくアップデートできていなかった、ということで、バージョンを 1.3.21-0.woody.1 (apt-get install libswig1.3=1.3.21-0.woody.1) と、きちんと指定したら、apt-get -f install しろよ、って言われて、それをやったら出来た。

ということで、今後は nadoka とか yarv とか、 subversion でやってみよう。annotate は出来なさそう。commit mail ってどうなのかな。

まぁ、とりあえず woody で動いたってことで。


cygwinでなんで ssh がうまく動かないのかやっとわかった。

鍵を /home/ko1/.ssh/id_rsa とか見に行くわけだが、俺の環境では ~/ は /cygdrive/g/ko1。だから、見つかるわけが無い。つまり、ホームディレクトリが違うやつに対しては、駄目っぽい仕様ってことだよな、多分。

オプションの -i で鍵を指定すると、ちゃんと動く。疲れた。

で、/home/ko1/.ssh/known_hosts に書き込もうとするから、known_hosts の更新も失敗する。しかし、なぜ /home/ko1 固定なんだろうな。どっか cygwin の設定が駄目なのかな。


研究室にシール作るやつがきたので、練習がてらなんか作ってみる。

いちねんせい


今日は帰りたいなぁと思うも、いろいろとできなくて・・・。また風邪気味だし無理はしたくないんだが。


あれこれやらなきゃなぁ、と思っていると、ドイツの人とVM談義を始めてしまって終わらなくなってしまった。

レジスタベースのVMを作るらしい。


へぇ、蔵等出たんだ。


で、そのドイツの方は3Dでボンバーマンを作ってるらしい(CubeCombat)んだが、イラストレータが足りないらしい。もしそういうのに興味がある人がいれば、ぜひ手伝ってくれ、だそうで。俺の日記で書いてもどれほど効果があるか知らんが・・・。


で、他の人に入ってもらおうって思って公開鍵をその人のアカウントにセットして、入ってもらうも、出来ず。

なぜだー、ってえらい悩んだ結果:/etc/ssh/sshd_config の allowusers を俺だけにしていた・・・。入れるわけないよ、これじゃ・・・。


考えてみると、コミットメールの From を詐称して送れば、問題ないような気がした。なんてこった。


http://yama-gnz.kir.jp/bug/cgi-bin/c-board.cgi?cmd=one;no=324;id= 自分用のメモ。すばらしい。ずーっと困ってたんだ。

_28(Wed)

私が一番ダメかもしれない。いや、いろいろと。


0.5.1

ruby を eval するやつと、shell command を実行してしまう bot を追加。


そういえば、法政大学のM1は中田育夫先生の授業をマンツーマンで受けるらしい。

単に、コンパイラを選択する人が一人しかいなかっただけらしいが、うらやましすぎる。


はじめていたずらに綺麗に成功した気がします。

でも、綺麗すぎて、悪いような気がしました。今度はもっとうまくやります(何


今日のししゃもさん。

sixamo: グインチベイが6個もつ関数 or ruby -v とかで確認できました

グインチベイって何。

sixamo: [[おにいちゃんねるに行くと、身元とか名前とか、書き込みがありそうな。

おにいちゃんねるってなんだ!


irc で聞いたんですが、欧州などでは水というと炭酸水が出てくるらしい、ということで。

NAVER - 知識plus [ヨーロッパでは市販されている水は炭酸水が多いのは何故?] とのことです。

へ〜。


ruby は nadoka を・・・(無理)


今回の投票は種類がたくさんでいつものごとく悩みましたが、まぁ、いつもどおり。


putty で cvs を動かすために、いろいろ調べるも、最後のパスフレーズのところで詰まる。pageant.exe(ssh-agentのputty版) を利用しないと無理なのかなぁ。うーん。

無理っぽかったので、しょうがないから常駐させるようにしてみようかしらん。

詰まったところ:

  • plink の使い方
    • CVS_RSH=plink_path(-i などで秘密鍵ファイルの指定などはいらない)
    • putty に、接続先をエントリ名にして設定を。ここで秘密鍵ファイルの指定などを行う
    • putty エントリ名は「接続先のドメイン名」じゃないといけない
  • pageant.exe をしょうがないので使う

パスフレーズぐらい入れさせろよ!>cvs pageant 怖いのよねぇ。

参考:PuTTYを使ったCVS利用法

私は生CVS(でも日本語ごった煮版)使ってますが。


うぅ、CVS経由オセー。diff をとるのに1,2秒かかる。これはウザイ。

やっぱり ssh portforwarding + cvs pserver がいいのかなぁ。

akrさんには先月の読書会でなんとなく怒られたような気がしたんですが、これってなんで駄目なんでしょうか。


commit mail の設定をしようとしてはまる。

log.pl なんてのは使いたくなかったので(よくわからなかったので)、どうせなら rdiff も送ってみたかったので、ruby で書いてるんだけど、status を外からやる方法がわからん。むー。

cvs status を log.pm の中でやっているようなのだけど、これって作業ディレクトリの中でやってんだろうか。それとも、リポジトリの中に chdir してるんだろうか。

って、関係ないよなぁ。

それとも、loginfo で起動したディレクトリの中では作業ファイルがあるような環境に強制的になったりするんだろうか。

さっきやったらできなかったら、なんか違うんだろうなぁ。


標準入力でなんかきてるのかー。やっとわかった。

でも、log.pm のような出力は得られない。さて。


cvs rdiff を、loginfo 中でやると、コミットがとまってしまう。なぜだーーー、と悩んでいたら、ロックの話か。なんてこった。

ってことは、diff は取れないのか? もしかして。


status はできることはわかったが(どうやら、その環境では作業ディレクトリ相当らしい)、ロックが消えないので、rdiff と同様の問題が起こっている。つまり、止まっちゃう。

さて、なぜロックは消えないのか。

でも、log.pl は、中で cvs をやっているわけで。ロックが取れてないとおかしい。うーん、なんでじゃ。


ってのを、いろいろぐちゃぐちゃ考えていたら、ちゃんとぐーぐるさまは知っていた。

C.7.2 取得済のコピーを最新に保つ。うへー。


って、標準入力が消えてしまった。

DEFAULT /home/Stud/ko1/bin/commit.rb %{sVv} 1> /dev/null 2> /dev/null &

みたいにしたら。

うーん、わけがわからん。


複数ファイルをコミットすると、それらのファイルで全部すんなりいくとは限らないことがわかった。

しかし、どうしたもんか。


うーむ、sleep をはさんだら動くようになった。なんてこった。


結局、

#!/usr/bin/ruby
cvs = '/home/ochimus/cvs'
argv = ARGV[0].split(/\s+/)
mod = argv.shift


body = $stdin.read
body << "----------------------\n"

def status_and_diff mod, file, orev, nrev
  str = "\n\n#{mod}, #{file}, #{orev}, #{nrev}: \n"

  path = "#{mod}/#{file}"

  str << "status:\n"
  str << `cvs -nQq status #{file}`

  str << "diff:\n"
  str << `cvs -nQq rdiff -u -r #{orev} -r #{nrev} #{path}`
end

sleep 1 unless argv.empty?

argv.each{|line|
  body << status_and_diff(mod, *line.split(','))
}

IO.popen('/var/qmail/bin/qmail-inject', 'w'){|io|
io.puts <<EOS
To: ko1@atdot.net
Subject: Commit mail

#{body}
EOS
}

exit(0)

みたいなのになった。sleep 1 が謎。


考えてみると、quickml に commit mail を投げるのって難しい気がする。どうしようかな。


学内のDNSが逝ってるようで、外につながらない。ニュースとかも見れない。連休開始だからか。こっちはこれからだっていうのに・・・。

というか、Googleが見れないのは致命的だ。

_akr(Wed Apr 28 20:43:16 JST 2004)

 駄目じゃないです。私は笹田さんより怠惰なので port forwarding を起動する手間が我慢できないだけです。

_ささだ(Wed Apr 28 23:57:07 JST 2004)

 ssh-agent を起動するのと手間変わんなくないですか?

_27(Tue)

irc bot の種類を考えてみる。

■ユーティリティ系

  • google bot(google で検索してくれる)
  • amazon bot(amazon で検索してくれる)
  • calc bot(電卓)
  • op distributer
  • rss check(RSS をチェックしてウェブの更新があったら知らせてくれる)
  • biff(メールがきたらおしえてくれる)

■協調系(?)

  • 人工無脳とか

ユーティリティ系は、誰か一人居ればいい。つまり、みんながみんなやるもんじゃない。

なら、協調系をがんばるべきなんだと思うんだが、建設的なもの、面白いものが思いつかない。

いや、人工無脳がしゃべってるってのは、IRCを楽しむ上ではあんまり必須ではないので、やっぱり、これも協調系じゃないかも。

じゃぁ、何をやればいいか。うーん。

思いつくのはユーティリティ系ばっかりだが。たとえば俺一人の nadokaさんがそれをやっていればいいので、nadokaさんに標準添付する意味はあんまりない。すくなくとも、nadokaさんのキラーぼっとにはなれそうにない(このぼっとがあるから、みんな使ってくれる、みたいな)。

うーん。


個人的に、nadoka のキラー機能はそのマシンの rubyのバージョンなどが何かを簡単に知ることができること、なんじゃないかと思うんだが。


とりあえず、eval bot なんてのを作ってみるか。$SAFE=4の練習。


となると、実は irc を端末として使えるような何かがあったほうが幸せになれたりなれなかったりするんじゃないだろうか。サーバに転送せずに。irc になるかどうかは知らんが。たとえば、他のインスタントメッセンジャーとつないで、irc クライアントに表示させてみるとか。

どれくらい幸せかどうかは不明。


nuance de Diary の Words が Windows に見えた。damedame。Me。


IRCnet #nadoka_check で、RSS更新チェック実験。asahi.com の更新が激しい。

これからのニュースチェックは IRC で(何)。


今日のししゃもさん。

sixamo:  アホな学生が変わらずノートによるチャレンスとシンポジウムとワークショップで量子化するような言語ってないんだろうか。

知るか。


ファンディスクを FD と略しているところを見て、ちょっとびびる。

うーむ。


だめ系のニュースサイトのようなものを探してみるも、縁遠いのでよくわからない。皆様はどういうところをチェックしているんでしょうか。


ircで効いたんですが、今日のオススメネタ: [ネタ] 『囚人である』 ことと 『オフィスで働く』 ことの違い。なるほど。そうだったのか。

_しゅどう(Tue Apr 27 00:35:20 JST 2004)

 (UNIXの)シェルとつないでおくれ。GridIRC: http://www.shudo.net/diary/2001jul.html#20010703

_こーのいけ(Tue Apr 27 01:39:06 JST 2004)

 op distributerは一匹じゃ足りません。

_ささだ(Tue Apr 27 11:47:08 JST 2004)

 よーしパパGrid研究もはじめちゃうぞ。

_ささだ(Tue Apr 27 11:52:35 JST 2004)

 bootstrap のため?>1匹じゃ足りない

_こーのいけ(Tue Apr 27 17:17:29 JST 2004)

 あまり必要になることはないけど,チャンネル乗っ取り対策とか。 あとはserver splitとか接続の安定性の問題。数ヶ月に1度くらいは@なくなるから…ぼっとに自動おぺする人がいればよいんだけど,普段ぼっとが常駐してるとみんな設定しなくなるから。

_あひる(Tue Apr 27 21:45:41 JST 2004)

 http://abcdane.net/ ダメ系というかバカ系

_26(Mon)

0.5.0


今日は拓殖大学に行ってきた。広いね〜。

拓殖大学案内板


ドメインの有効活用をがんばって考えている。

at at at dot atdot dot net というメールアドレスがいいんじゃないかとちょっと思う。対称じゃないなぁ。


永遠のなんとかをちょいちょい進めてるんだけど、長い。こういうのは苦手。

_25(Sun)

RSS で(いんちきくさい)更新チェックはやってみたが、LIRS とかも、同様の枠組みでできそうなできなさそうな。

でも、rss_check.rb って名前にしてしまったのに、無理やり LIRS を入れるのはダメくさい。うーん、おまけ機能ってことで、なんとなく入れてしまうか。


require 'open-uri'
URI.parse('http://rrr.jin.gr.jp/~znz/samidare/sites.lirs.gz').read 

ってやったらやっぱりgzだった。うーん、どうしたもんかな。


ruby -e "puts `w3m http://rrr.jin.gr.jp/~znz/samidare/sites.lirs.gz`"

いいんか、本当にこれでいいんか!?


open-uri で deflate な文書を扱う(認識する)正しい方法ってなんかありますか。/gz$/ =~ path なのかなぁ。


考えてみると、普通のファイルの場合もあるので、@uri.read は使えないことに気づいた。

open(@uri.to_s){|f|
  f.read
}

だと、多分どちらでも正しい。なんか、間抜けっぽい。


というわけで、

動かなかったので削除

みたいなのものをつけておく。

でも、ローカルファイルが gzipped だったらどうすればいいんだろう。うーん。拡張子ってのもアレだ。

#
# Copyright (c) 2004 SASADA Koichi <ko1 at atdot.net>
#
# This program is free software with ABSOLUTELY NO WARRANTY.
# You can re-distribute and/or modify this program under
# the same terms of the Ruby's lisence.
#
# 
# $Id: rss_check.rb,v 1.2 2004/04/25 03:34:48 ko1 Exp $
# Create : K.S. Sat, 24 Apr 2004 12:10:31 +0900
#

require "rss/parser"
require "rss/1.0"
require "rss/2.0"
require "rss/syndication"
require "rss/dublincore"
require "open-uri"
require 'uri'
require 'yaml/store'
require 'csv'
require 'stringio'
require 'zlib'

class RSS_Check
  class RSS_File
    def initialize path, init_now
      @uri = URI.parse(path)
      @entry_time = @file_time = (init_now ? Time.now : Time.at(0))
    end
    
    def check
      if (mt=mtime) > @file_time
        @file_time = mt
        check_entries
      else
        []
      end
    end

    def date_of e
      if e.respond_to? :dc_date
        e.dc_date
      else
        e.pubDate || 0
      end
    end
    
    def check_entries
      rss = RSS::Parser.parse(read_content, false)
      et = @entry_time
      items = rss.items.sort_by{|e|
        date_of(e)
      }.map{|e|
        if e.dc_date > @entry_time
          if date_of(e) > et
            et = date_of(e)
          end
          {
            :about => e.about,
            :title => e.title,
            :ccode => 'UTF-8'
          }
        end
      }.compact
      @entry_time = et
      items
    end

    def read_content
      case @uri.scheme
      when 'http'
        open(@uri){|f|
          if f.content_encoding.any?{|e| /gzip/ =~ e}
            Zlib::GzipReader.new(StringIO.new(f.read)).read || ''
          else
            f.read
          end
        }
      else
        open(@uri.to_s){|f|
          f.read
        }
      end
    end

    def mtime
      case @uri.scheme
      when 'http'
        open(@uri).last_modified
      else
        File.mtime(@rss_file)
      end
    end
  end

  class LIRS_File < RSS_File
    def check_entries
      et = @entry_time
      res = []
      CSV::Reader.parse(read_content){|row|
        last_detected = Time.at(row[2].data.to_i)
        if last_detected > @entry_time
          if last_detected > et
            et = last_detected
          end
          res << {
            :about => row[5].data,
            :title => row[6].data,
            :ccode => 'EUC-JP'
          }
        end
      }
      @entry_time = et
      res
    end
  end
  
  def initialize paths, cache_file=nil, init_now=false
    @paths = paths
    @db = YAML::Store.new(cache_file) if cache_file
    @rss_files = paths.map{|uri|
      load_file(uri) ||
        if /LIRS:(.+)/ =~ uri
          LIRS_File.new($1, init_now)
        else
          RSS_File.new(uri, init_now)
        end
    }
  end

  def check
    @rss_files.map{|rf|
      rf.check
    }.flatten
  end

  def dump
    @db.transaction{
      @paths.each_with_index{|path, i|
        @db[path] = @rss_files[i]
      }
    } if @db
  end

  def load_file file
    @db.transaction{
      @db[file]
    } if @db
  end

  def clear
    if @db
      @db.transaction{
        @db.keys.each{|k|
          @db.delete k
        }
      }
    end
  end
end


if $0 == __FILE__
  rss_uri = [
  'http://www.ruby-lang.org/ja/index.rdf',
  'http://slashdot.jp/slashdotjp.rss',
  'http://www3.asahi.com/rss/index.rdf']
  lirs_uri = [
  'LIRS:http://rrr.jin.gr.jp/~znz/samidare/sites.lirs.gz'
  ]
  
  rssc = RSS_Check.new(
    rss_uri + lirs_uri,
    ARGV.shift || './rss_cache',
    true # false
  )
  require 'iconv'
  require 'kconv'
  ic = Iconv.open("EUC-JP", "UTF-8")
  
  rssc.check.each{|e|
    puts e[:about]
    title = (e[:ccode] == 'UTF-8') ? ic.iconv(e[:title]) : e[:title]
    puts title
  }
  rssc.dump
end

しかし、見れば見るほどダメなコードだ。


samidare の LIRS を見ていると、どうもずっと最新を返すところがあるようだ。条件はよくわからない。とりあえず last modified を返さないところだったけど。

どうしようかな。巡回後必ず表示されてしまうと、それはそれで鬱陶しい。

last modified == last detected なら棄てるようにしてみようか。


複数のアンテナのLIRSを登録すると、検出するサイトに重複が生じる問題があるが、これを解決するにはどのようにすればよいか。hash にしてしまう? うーん。

うーん、十分一般的な解決方法は無いかも。


数ヶ月ぶりに髪を切りに行く。ついでに髭もそってもらう。


randomize=>sort_by{rand(size)} ってのは感動した。(ダメすぎ)


Iconv#iconv って、ちょっとでもダメな文字列だと例外起こるんですね。何も考えないで使うにはやっぱり難しい。

_akr(Sun Apr 25 01:55:20 JST 2004)

 content_encoding というメソッドがあるので、それに従ってデコードするのが正しいやりかたでしょうね。デコード済みのを返すのを考えたこともありますが、それは絶対デフォルトにしないと決心したほかは進んでません。あと、普通のファイルにも read を使うには、ファイル名を Pathname で表現することで出来ます。

_akr(Sun Apr 25 01:59:59 JST 2004)

 そうそう、Pathname を使う程スタイルを変えたくないなら、to_s しないだけという手もあります。open-uri な open では引数に URI (というか、open メソッドをもつオブジェクト) を受け付けるので。

_ささだ(Sun Apr 25 11:52:37 JST 2004)
require 'open-uri'
uri = URI.parse('http://rrr.jin.gr.jp/~znz/samidare/sites.lirs.gz')
file= URI.parse('sites.lirs.gz')

open(uri){|f|
  p f.content_encoding
}
open(file){|f|
  p f.content_encoding
}

#=>
["x-gzip"]
Exception `TypeError' at c:/cygwin/usr/local/lib/ruby/1.9/open-uri.rb:87 - 
cannot convert URI::Generic into String
c:/cygwin/usr/local/lib/ruby/1.9/open-uri.rb:87:in `open_uri_original_open': 
cannot convert URI::Generic into String (TypeError)
	from c:/cygwin/usr/local/lib/ruby/1.9/open-uri.rb:87:in `open'
	from t.rb:10

to_s しないとまずいような気がしました。あと、やっぱりuri#scheme で場合わけは必要なのだなぁ、と思いました。

今回のアプリケーションの要求としては、

  • uri_object.last_modified(or uri_object.mtime) でその URI の最新日付を取ることができる
  • uri_object.read_nantoka で、その URI の内容を読むことができる(deflateしているやつでも)

があると私は幸せになれそうです。限定的なシチュエーションになってしまいますか。

_akr(Sun Apr 25 13:31:08 JST 2004)

 Pathname というのは pathname.rb で定義されるものであって相対 URI ではないです。

_ささだ(Sun Apr 25 13:37:29 JST 2004)

 ああ、なるほど。でも、最初に Pathname を作るのは誰がどうやるのがいいんでしょうか。URI.parseした結果が Pathname になってくれるとか、そういうのだと嬉しそうな。

_akr(Sun Apr 25 13:49:24 JST 2004)

 今のところ、自分で Pathname.new ですかね。RAA にある vfs-simple は VFS(string) というので URI.parse か Pathname.new をやってくれます。

_ささだ(Sun Apr 25 13:55:32 JST 2004)

 何も考えないでできるようになるには、もうちょっと先ですか。

_akr(Sun Apr 25 14:40:08 JST 2004)

 拡張子を使わずに gzip を判定するなら magic number でしょう。file コマンドが使ってるやつ。

_ささだ(Sun Apr 25 17:52:17 JST 2004)

 うーん、さくっと簡単な方法は無理くさいですねえ

_なかだ(Sun Apr 25 21:41:31 JST 2004)

Iconvはブロックで不正キャラクタの処理をできるようにしようかと考えてはいます。

ずっと考えてるだけ。

_24(Sat)

String#strip を知る。

というか、nadoka やって ruby の使い方をたくさん教えてもらいました。ありがとうございます。


焦らなくていいほど何かの基盤があるから言えるんじゃないかなぁ。

私はいつも焦りまくりです。もう、どうしようもないぐらい。

で、焦って手に何も付かない。ダメジャン。


あるファイルを開くとき、あるディレクトリより下位のであるなら、そのディレクトリが無ければ作る、っていうありがちな処理は。

require 'fileutils'
def mkdir_and_open file
  begin
    open(file, &proc)
  rescue IOError => e
    full_path = File.expand_path(file)
    if /^#{Aru_dir}/ =~ full_path
      FileUtils.mkdir_p(File.base_path(full_path))
      open(full_path, &proc)
    end
  end
end

とか、寝ぼけて書いたようなやつで本当にいいんだろうか。先にディレクトリのチェックかなぁ。でも、殆どの場合、エラーしないしなぁ。

ログを月ごととか年ごとに分けときたい場合とか、あるといいしなぁ。安全面が、よくわからないので謎。

log/%y/%m-${channel_name}.log みたいな。

log/%y/${setting_name}-${channel_name}-%m.log くらいがいいのか。


何かそれっぽいことができないかなぁ、と思って、最近の流行はやっぱり RSS かなぁ、とか思う。でも、全然知らない。

とりあえず、きっと誰か何も考えなくても使えるものを用意してくれているだろう、ということで、COZMIXNG RWiki - RSS Parser を見せてもらう。さて、俺に理解できるだろうか。

ちょっと弄って

ruby -ropen-uri rss_recent.rb http://www.ruby-lang.org/ja/index.rdf > log

みたいに、サンプルを使ってみる。

で、どうやって最新を見るんだ、これ。キャッシュしといて、差分を取り出すとかするのかなあ。めんどうくさいなぁ。


open-uri は File.new(uri) には効かないのか。まぁ、そうか。

で、プログラム的に File.new とか File.open って、Kernel.open の代わりに使う意義ってのは、どういうときにあるんだろう。明示的にファイルに限定したいときか?


別にめんどうでもないか。

  1. とりあえず、取りに行く前にファイルの日時でチェック
  2. 新しそうなら、エントリ(時間、タイトル、URI)を、最新エントリの時間を比べる

保存しておくのは、「ファイルごとの最新更新時間(チェックした時間でいいのか?)」と、最新のエントリの時間。

気になるのは、複数の RSS を扱うとき、時間の基準を同じにしていいのか。ファイルごとに、最新エントリの時間を持っているのが安全か。マシンタイム狂ってたりするかもしれないしね。12時間くらい。


データ構造としては、ハッシュで十分だろうか。ストレージは YAML::Store で十分だろう。

rss_check = {
  'dokka no rss' = {
     :file_time         => ファイルの更新時間(HEAD),
     :newest_entry_time => 最新エントリの時間,
   },
   ...
}

で十分なのか。

これくらい、オブジェクトをさくっと作ってしまうのがいいのか。

人に入力させるのは RSS ファイルの配列でいいか。


open-uri は、パスによって適当に開いて読んでってやってくれるけど、更新日時をファイルとかHTTPなやつとかと透過でなんかやってくれる便利なものはないだろうか。


あぁ、わからん。やっぱり RSS を調べないでサンプルだけを見てやるのは無理があるんだろうか。



require "rss/parser"
require "rss/1.0"
require "rss/2.0"
require "rss/syndication"
require "rss/dublincore"
require "open-uri"
require 'uri'
require 'net/http'

class RSS_Check
  class RSS_File
    def initialize path
      @uri = URI.parse(path)
      @file_time  = Time.at(0)
      @entry_time = Time.at(0)
    end
    
    def check
      if mtime > @file_time
        check_entries
      else
        []
      end
    end

    def check_entries
      rss = RSS::Parser.parse(open(@uri).read, false)
      et = @entry_time
      items = rss.items.map{|e|
        if e.dc_date > @entry_time
          if e.dc_date > et
            et = e.dc_date
          end
          {
            :about => e.about,
            :title => e.title,
          }
        end
      }.compact
      @entry_time = et
      items
    end

    def mtime
      case @uri.scheme
      when 'http'
        response = nil
        Net::HTTP.start(@uri.host, @uri.port) {|http|
          response = http.head(@uri.path)
        }
        Time.httpdate(response['Last-Modified']) || Time.now
      else
        File.mtime(@rss_file)
      end
    end
  end
  
  def initialize paths
    @rss_files = paths.map{|f|
      RSS_File.new(f)
    }
  end

  def check
    @rss_files.map{|rf|
      rf.check
    }.flatten
  end
end


if $0 == __FILE__
  rssc = RSS_Check.new(['http://www.ruby-lang.org/ja/index.rdf'])
  require 'pp'
  rssc.check.each{|e|
    puts e[:about]
    puts e[:title]
  }
  
end
http://www.ruby-lang.org/ja/20040407.html
春だ4月だ Rubyを始めませんか
http://www.ruby-lang.org/ja/20040406.html
お花見
http://www.ruby-lang.org/ja/20040405.html
Lightweight Language Magazine 登場
http://www.ruby-lang.org/ja/20040224.html
祝11周年
http://www.ruby-lang.org/ja/20040117.html
RSSフィード開始しました
http://www.ruby-lang.org/ja/20020102.html
ダウンロード
http://www.ruby-lang.org/ja/20031225.html
Ruby 1.8.1公開
http://www.ruby-lang.org/ja/20031222.html
ruby 1.8.1 preview4 公開
http://www.ruby-lang.org/ja/20031207.html
ruby 1.8.1 preview3 公開
http://www.ruby-lang.org/ja/20031031.html
ruby 1.8.1 preview2 公開
http://www.ruby-lang.org/ja/20031030.html
ruby 1.8.1 preview1 公開
http://www.ruby-lang.org/ja/20020101.html
What's Ruby
http://www.ruby-lang.org/ja/20031017.html
関西オープンソース+フリーウェア2003でRuby関連企画
http://www.ruby-lang.org/ja/20031002.html
artima.comにインタビュー記事「The Philosophy of Ruby」
http://www.ruby-lang.org/ja/20031001.html
Ruby Conference 2003参加者申し込み受付中
http://www.ruby-lang.org/ja/20030908.html
Ruby Onsen Meeting
http://www.ruby-lang.org/ja/20030804.html
Ruby 1.8.0 リリース!

ずいぶんてきとー。

なんとなくメソッド名を methods で探してやってしまった。いいんだろうか、これで、ほんとに。

ちゃんねるってなんだ。わかんないで無視無視。


ありがとうございます。last_modifed なんてあったのですね。とりあえず。

    def mtime
      case @uri.scheme
      when 'http'
        open(@uri).last_modified
      else
        File.mtime(@rss_file)
      end
    end

古い順。

require "rss/parser"
require "rss/1.0"
require "rss/2.0"
require "rss/syndication"
require "rss/dublincore"
require "open-uri"
require 'uri'
require 'yaml/store'

class RSS_Check
  class RSS_File
    def initialize path
      @uri = URI.parse(path)
      @file_time  = Time.at(0)
      @entry_time = Time.at(0)
    end
    
    def check
      if mtime > @file_time
        check_entries
      else
        []
      end
    end

    def date_of e
      if e.respond_to? :dc_date
        e.dc_date
      else
        e.pubDate || 0
      end
    end
    
    def check_entries
      rss = RSS::Parser.parse(open(@uri).read, false)
      et = @entry_time
      items = rss.items.sort_by{|e|
        date_of(e)
      }.map{|e|
        if e.dc_date > @entry_time
          if date_of(e) > et
            et = date_of(e)
          end
          {
            :about => e.about,
            :title => e.title,
          }
        end
      }.compact
      @entry_time = et
      items
    end

    def mtime
      case @uri.scheme
      when 'http'
        open(@uri).last_modified
      else
        File.mtime(@rss_file)
      end
    end
  end
  
  def initialize paths, cache_file=nil
    @paths = paths
    @db = YAML::Store.new(cache_file) if cache_file
    @rss_files = paths.map{|f|
      load_file(f) || RSS_File.new(f)
    }
  end

  def check
    @rss_files.map{|rf|
      rf.check
    }.flatten
  end

  def dump
    @db.transaction{
      @paths.each_with_index{|path, i|
        @db[path] = @rss_files[i]
      }
    } if @db
  end

  def load_file file
    @db.transaction{
      @db[file]
    } if @db
  end

  def clear
    if @db
      @db.transaction{
        @db.keys.each{|k|
          @db.delete k
        }
      }
    end
  end
end


if $0 == __FILE__
  rssc = RSS_Check.new(
    ['http://www.ruby-lang.org/ja/index.rdf', 'http://slashdot.jp/slashdotjp.rss'],
    'cache'
  )
  rssc.check.each{|e|
    puts e[:about]
    puts e[:title]
  }
  rssc.dump
end

ちゃんとキャッシュするようにしてみた。

明示的な dump が必要なのは、よくないだろうか。


bot にしたらこんな感じ。

# -*-ruby-*-
#
# Copyright (c) 2004 SASADA Koichi <ko1 at atdot.net>
#
# This program is free software with ABSOLUTELY NO WARRANTY.
# You can re-distribute and/or modify this program under
# the same terms of the Ruby's lisence.
#
#
# $Id: rss_check.nb,v 1.1 2004/04/24 04:13:36 ko1 Exp $
#

=begin
configuration like follows:

  BotConfig = {
    :RSS_CheckBot => {
      :rss_paths => [
      'http://www.ruby-lang.org/ja/index.rdf',
      'http://slashdot.jp/slashdotjp.rss',
      'http://www3.asahi.com/rss/index.rdf',
      ],
      :cache     => "./prog-rss-cache",
      :ch        => '#nadoka',
    }
  }
  
=end

require 'rss_check'
require 'iconv'

class RSS_CheckBot < Nadoka::NDK_Bot
  def bot_initialize
    @cache = File.expand_path(config[:cache] || '~/.rss_check')
    @paths = config[:rss_paths] || ['http://www.ruby-lang.org/ja/index.rdf']
    @ch    = config[:ch] || '#nadoka'
    @rssc  = RSS_Check.new(@paths, @cache)
    @ic    = Iconv.open("EUC-JP", "UTF-8")
  end
  
  def on_timer tm
    items = @rssc.check
    @rssc.dump
    Thread.new{
      items.each{|e|
        title = @ic.iconv(e[:title]).tojis
        send_notice(@ch, "rss bot: #{title} <#{e[:about]}>")
        sleep 3 # Flood Protection
      }
    }
  end
  
end
_なかだ(Sat Apr 24 09:34:24 JST 2004)

 openだとIOErrorじゃなくてErrno::ENOENTとかSystemCallError

_akr(Sat Apr 24 11:20:22 JST 2004)

 open-uri が提供しているのは今のところは last_modified メソッドなので透過的な方法はないと思いますが、テンポラリファイルの mtime を Last-Modified: の時刻にセットするという手はあるかも知れませんね。

_akr(Sat Apr 24 12:14:15 JST 2004)

 なぜ open-uri が mtime を設定しないか思い出しました。ちっちゃいファイルは StringIO になるので、mtime が存在しないのです。

_なかだ(Sat Apr 24 13:00:37 JST 2004)

 mtimeメソッドを定義するわけにはいかないんでしょうか。

_akr(Sat Apr 24 13:18:21 JST 2004)

 いけないというほどではありませんが、File#mtime と違って書き込んでも変わらないものになってしまうので、ちょっと躊躇するものがあります。

_なかだ(Sat Apr 24 13:59:22 JST 2004)

 書き込みもできるんでしたっけ?

_akr(Sat Apr 24 14:19:30 JST 2004)

 そのうちできるようにしようと思っています。

_akr(Sat Apr 24 15:22:47 JST 2004)

 そうそう、open(@uri).read より @uri.read のほうがいいと思いますね。短いし、確実に close されるし。

_ささだ(Sat Apr 24 15:53:03 JST 2004)

 そんなものまでくっつくんですねぇ。奥が深い。

_ささだ(Sat Apr 24 15:56:29 JST 2004)

 @uri.last_modifed はできないんですねぇ。

_akr(Sat Apr 24 17:25:05 JST 2004)

 ファイル名や URI をレシーバにする慣習を根付かせるという野望があるので、そっちのほうが短くないとね。反対する人もいますが。URI#last_modified は... あってもいいけどちょっと微妙かな。つけるとしても、Last-Modified: と同時に得られる他の情報を無駄にしたくない感じがします。

_ささだ(Sun Apr 25 00:31:20 JST 2004)

 サイズとかですか。

_23(Fri)

ぱーみっしょんではまる。

  1. ディレクトリ /hoge のグループを G にして 775 にする。
  2. 自分に G を追加
  3. echo hoge > /hoge/hoge
  4. ぱーみっしょんでぃないど

なぜだー、こんちくしょー、って悩むこと30分。なぜかログアウト・ログインしなおしたら書けた。謎。


viewcvs を apt-get install しただけじゃ、svn リポジトリは見れないのか。困ったな、どうしよう。


しょうがないから、cvs からとってきて入れてみるが、失敗。libswig のバージョンが古いらしい。でも、woodyでapt-get できるのは、前のバージョンまで。つまり、諦めろということか。

誰か、それでも入れた人居ません?

libswig1.3/unstable が要るのか・・・。

なんで guile が要るのかな。あぁ、libc6 もアップグレードしなくちゃいけないのか。きついな、これ。

困った。

要するに、まだ subversion は安定してないってことなのか。


0.3.5


0.4.0

だいぶ安定。チャンネルの管理とかモードの管理とかするようにした。


ししゃもさん(人工無脳)が IRCnet#nadoka に生息してるんですが、

sixamo:  竹内郁雄先生の運転で北海道ドライバシの問題があまり生じない。

ドライバシって何。

_こーのいけ(Fri Apr 23 07:18:50 JST 2004)

 cvsから取ってきたらふつーに動いたよーな。<gentoo まぁ,subversion-0.23な頃の話だし,gentooはswigとかライブラリ系については新しいものが怖いほど入ってくるから・・・ guileはswigからの依存でしょう。そういうものですし。ちなみにgentooならUSE=-guileするだけで外せる訳だけど。

_maeda(Fri Apr 23 16:22:06 JST 2004)

 open()のたびにカーネルが/etc/groupを見に行くわけはないよね。groups ko1と実行すると/etc/groupを見に行くけど、引数なしでgroupsとやると全然違うものを見に行くんですよ。

_ささだ(Fri Apr 23 20:16:07 JST 2004)

 あぁ、なるほどー。

_22(Thu)

昨日の reboot のためか、自宅Linuxマシンの時計が12時間ほど狂っていた。

どうやら、大量に誤差があると、ntpd が落ちるから、調整してくれないってことか。よく 12時間も狂ったものだ。


疲れた。


「ビで〜〜するのどうやるの?」と聞かれた。

なんのことかと思ったら vi だった。


花見のときのお饅頭がなぜか残ってるんですが、どうすればいいでしょうか。4/4期限らしい>aさん


IRCnet - madoka --------------+
         |           |        |
         client1     nadoka   nadoka
                     |        |
                     client2  client3

すごいですね、nadokaさん mswin でも動きましたよ。mswinスゲー、というべきか。


OO エンジニアの輪 〜 第 26 回 鷲崎 弘宜さんの巻 〜 キター。

私は以前修士の 1 年から 2 年の時に、毎日 1 本論文や解説記事を読む事を心がけていました。当時は、飲み会があろうが、旅行に行こうが、必ず読んでいました。

・・・すごすぎる。そうだよなぁ、それくらいしないと追いつけないよなぁ。うーん。

日本語ならそれもできるんだろうが、英語は読めない。やっぱりなんとかしないと。


KMさんの先生にちょっとメールしたら、英語で返事が返ってきた。すげぇびびった。


#!/usr/bin/env ruby
#
# Nadoka: Irc Client Server Program
#
# Copyright (c) 2004 SASADA Koichi <ko1 at atdot.net>
#
# This program is free software with ABSOLUTELY NO WARRANTY.
# You can re-distribute and/or modify this program under
# the same terms of the Ruby's lisence.
#

初めて書いたけど、こんなもんでいいんだろうか。

_KM(Thu Apr 22 11:02:41 JST 2004)

 適宜 ntpd で較正された時刻を RTC に設定するようにしておけば再起動後でもそんなにずれてない筈,っていうか RTC 狂い杉です

_shiro(Thu Apr 22 21:23:56 JST 2004)

 告白します。学部4年のとき、英語の論文1本読むのに1ヶ月とかかかってました。速くするには、量を読むだけだと思います。

_しゅどう(Thu Apr 22 22:02:05 JST 2004)

 某松岡先生は、Dの学生なら、週に3本は読まないと、と言ってました。。。うぅ。

_しゅどう(Thu Apr 22 22:03:58 JST 2004)

 鷲崎さんとは、実は去年の12/25にも同じ場、すぐそばにいたのだけど、彼は僕の顔を覚えてないみたいで(泣)。。。太ったからか!そうなのか!

_washizaki(Thu Apr 22 23:20:32 JST 2004)

 あ-、記事にもありますけど、ちゃんと全部読むのは論文10本のうち1本程度ですので。

_washizaki(Thu Apr 22 23:23:44 JST 2004)

 首藤さん、すみません。12/25にどこで何をしていたのか、全く思い出せません。大学でしょうか。。。

_しゅどう(Fri Apr 23 00:11:41 JST 2004)

 12/25は、早稲田で、上田研卒の上田学さんとの懇談会でした。最近、ずっとメガねで暮らすようになっちゃったんで、そのせいかも。

_washizaki(Fri Apr 23 01:58:29 JST 2004)

 思い出しました。当日は、徹夜明けで周りがほとんど見えていなかったようです。。。失礼致しました。

_ささだ(Fri Apr 23 09:37:11 JST 2004)

 でも、きちんと論文をチェックする習慣はやっぱり必要ですよね。研究室にくる論文誌・研究会報告(日本語)とかは目を通すけど、それ以外はなかなか見ようとしないのはダメダメ。

_21(Wed)

ししゃもさんを使わせてもらう。私の日記のログを読ませるとエラーをよく吐く。嫌われてるんだろうか。苦肉の策。

require 'sixamo'
require 'kconv'

s = Sixamo.new(File.expand_path('~/sixamo'))
while line=ARGF.gets
  line = Kconv.toeuc(line)
  begin
    s.memorize line
  rescue
    puts "#{$.}  #{line}"
    s = Sixamo.new(File.expand_path('~/sixamo'))
  end
end

IRCnet の #nadoka で公開中かもしれない。


ログを読ませていたら、Linux Kernel が死んだ。凄いぞししゃも! 凄いぞ Ruby!

HDD障害かなぁ・・・。


というわけで、HDD障害なようです。怖すぎる。HDD換装すべきなんだろうけどなぁ。金と暇が。


SWoPP って研究会を選ぶのか。コンパイラの話をするんだったら、やっぱり PRO になるんだろうか。でも 45分も話せねー気がする。うーん、どうしようかな。


0.2.0。そろそろ安定してきたような気がします。


cvs-ja.chm 追加。


0.3.0。ユーザは私を入れて 3人。私の作ったものにしては、多い。


PRO の申し込みには 600字の概要が必要なことを今知りました。調査不足。

そのため、PROには出せないことがわかりました。困った。

_maeda(Wed Apr 21 16:25:54 JST 2004)

 話すのは25分デスヨ。あとの20分は質問責めの時間。

_ささだ(Wed Apr 21 16:55:12 JST 2004)

 20分も質問受けるネタがないかも・・・。

_しゅどう(Wed Apr 21 17:45:00 JST 2004)

 誰も質問しないで沈黙責めの方が辛いかも。

_ささだ(Wed Apr 21 18:18:40 JST 2004)

 あぁ、ますます出せなく。

_maeda(Wed Apr 21 20:13:27 JST 2004)

 ダイジョウブデスヨ。ツッコムネタハイクラデモ… (←って、なぜカタカナ?)

_ささだ(Wed Apr 21 20:36:32 JST 2004)

 ガクガクブルブル

_20(Tue)

0.1.0

madoka をさくっと置きかえるのはまだ危険かと思います。


Subversion によるバージョン管理

素晴らしい。


debian(stable) で subversion を apt-get しようとしたら、さくっとエラー。

_19(Mon)

よく知らないんだけど ctcp というものがあるらしい。

さて、何をどうすればいいのかな。

rica をちょっと見ていると、対応しているらしい。ぱくろう。

げぇ、なんかまじめにやると面倒くさいっぽい。

うーん、さっぱりわからん。

あぁ、arg[0][0] == 1 って、そうかそのままか。

VERSION だけ良しなに計らって、あとはそのまま流すだけでいいやー。

DCC なんてシラネー。


QUIT を見て、PART の代わりのようにログを取ろうと考えると、意外と大変っぽいことに気づく。

チャンネルの情報をトレースしておかなければならない。

というわけで、諦める。面倒だし。


使いものにするには、やっぱりちゃんとしないといけないような気がしてきた。やれやれ。


というわけで、nadoka-0.0.1 です。

madoka くろーん。

お問い合わせは nadoka at quickml.atdot.net (QuickML で、ko1 at atdot.net を CC に入れて)まで。


つーかね、さくっと動かないわけですよ。どうしたもんかな。#Ruby:*.jp とかで、ユーザ一覧が渡せていないらしい。

あとでデバッグしよう。


しかし、ニッチだよな。俺が作るのって。たまには人に役立つソフトを作らないと、とは思うんだけれど。

つか、作るといっても、rice が非常によくできているのでほとんど何もしてないんだが。


Nadoka: IRC Client Server Program。ページつくり。いんちき英語。

さて、あとはバナーだ(何)。


deadlock 0x2ea9270: sleep:-  - ./rice/irc.rb:140
deadlock 0x2ea97f8: sleep:-  - ./ndk_manager.rb:69
deadlock 0x2eaa128: sleep:-  - h:/cygwin/usr/local/lib/ruby/1.8/thread.rb:278
deadlock 0x2eab4c0: sleep:-  - ./rice/irc.rb:217
deadlock 0x2ac5808: sleep:J(0x2ea95a0) (main) - ./ndk_manager.rb:159
deadlock 0x2ea95a0: sleep:-  - h:/cygwin/usr/local/lib/ruby/1.8/thread.rb:96
./ndk_manager.rb:164:in `start': undefined method `close' for nil:NilClass (NoMe
thodError)
        from nadoka.rb:23

さくっとデッドロック。ruby-1.8.1 mswin.

TCPSocket との組み合わせがだめなのか。

ruby 1.8.1 (2003-12-25) [i386-cygwin]
/usr/lib/ruby/1.8/resolv.rb:291:in `open': cannot convert nil into String (TypeE
rror)
        from ./ndk_manager.rb:159:in `join'
        from ./ndk_manager.rb:159:in `start'
        from nadoka.rb:23

はてな?


「わからないんですけどー」「ソース見ないとなんとも言えないねえ」「じゃぁソース送りましょうか」

自分でやれよ!


IrcNet --- madoka --- nadoka 
             |          |
           client1    client2

ひょんなことから tdiary をダウンロード。なんで日記ツールに 1.5MB もあるんだ!(テーマ)

短くまとまってるコードですね。tab幅はおいといて。


おかげさまで、いつのまにか 0.0.3 、設定ファイルは結局、クラス+定数になりました。

_宣伝部長なひ(Mon Apr 19 14:00:43 JST 2004)

 RAAに登録してくださーい

_ささだ(Mon Apr 19 15:02:48 JST 2004)

 もう少し安定させたあかつきには登録させていただきます。

_nobsun(Mon Apr 19 15:42:40 JST 2004)

 やっぱり、Hackしている後姿を見せるしかないのでは。先輩は背中で語らねば。

_ogino.(Mon Apr 19 17:33:15 JST 2004)

 nadokaをnokadaと空目

_mput(Mon Apr 19 19:29:36 JST 2004)

 tab幅も短い(3タブ)はずなんだけどなぁ

_nanasi(Tue Apr 20 03:00:09 JST 2004)

 自分はフツーにnodokaに見えました

_Aki(Tue Apr 20 16:15:38 JST 2004)

 nodocaの方が可愛くて良いです。

_18(Sun)

せきのために眠れない、ということはなくなった。よかったよかった。


rice は複数のクライアント(bot?) を登録できるようになっているが、これをそのまま利用してしまっていいものか。

多分よくない。


うまい名前が思いつかない。

server <- -> clients server <- -> clients

と、4つの通信があるのだけれど、そのメソッド名。やることはそんなに多くないんだがなぁ。名前付けが多い。


とりあえず、だいたい動いた。

あとは設定項目のデザイン。これが一番大変そうだ・・・。


簡単な設定ファイルの作り方。

  1. ruby script を書かせる
    1. グローバル変数に代入させる
    2. ハッシュを書かせる
  2. xml を書かせる
  3. yaml を書かせる
  4. S式を書かせる
  5. 独自フォーマットを書かせて、がんばってパースする

xml, yaml はやっぱり人間には書きづらいと思う(というか、書きたくない)。S式はパーサが無い(うーん)。

独自フォーマットは考えるのが面倒。

グローバル変数は、項目が増えたときに死にそう。

ハッシュを書かせると、行末にカンマが必要になり、けっこうウザイ。

はて、どうしたものか。

一番楽なのは、やっぱり Hash かなぁ。

$config = {
  # ...
  :var  => val
  # ...
  :var2 => val2
}

みたいに書けないものか。自分でなんかがんばるのもめんどいしなぁ。'#' だけ見て、コメントアウトするようにしようか。でも、文字列中のはエスケープするとか、やっぱり考えるのめんどうくさい。コメントは行頭に '#' とか、そういうダメなルールにするか。

全部の行末に ',' って付ければいいか。・・・ダメか、そんな安易じゃ。

_maeda(Sun Apr 18 22:11:17 JST 2004)

 S式のパーザあるんでないの? Ruchemeのリーダが。

_kjana(Sun Apr 18 22:28:19 JST 2004)

手元のだとこんなのが:

module MemoConfig
  TemplateDir           = "#{ENV['HOME']}/mkmemo"
  RecentTemplate        = "#{TemplateDir}/recent-template.html"
  MonthTemplate         = "#{TemplateDir}/month-template.html"
  DestDir               = "#{ENV['HOME']}/www/memo"
  # 以下略
end

安直に行くなら key, value = line.chomp.split(/:\s*/, 2) でどうこうな形とか。

_ささだ(Sun Apr 18 22:40:33 JST 2004)

 Rucheme のは利用するのが面倒なように作っちゃってて。なんとかしようと思うことは思ってるんですが。

_ささだ(Sun Apr 18 22:41:02 JST 2004)

 あー、定数がありましたか! もうハッシュで書いてしまいますた・・・。今度使わせてもらいます。

_17(Sat)

GUIプログラミングは面白くないという発想 -> 病的 -> お大事に

かと思ってしまいました。いや、そうなのかもしれませんが。この解釈が病的か。

まぁ、少なくとも私には面白くないなぁ。Win32API ばっか叩いてたからかもしれないけど。せめて MFC とか使っていればなぁ。なんか、そういう楽で楽しいGUIプログラミングを楽しみたいなぁ。


なんか、寝ると体調が悪くなっているような気がする。起きたときが最悪。何か大切な機能まで寝てるんだろうか。


いや、面白くないわけじゃないとは思うんですが、やっぱり細かいところまではやらないんじゃないかな。なかなか。

イメージ的には、インフラ整備をするのは楽しいが、その上に載せるものは面白くない、みたいな。

最表層の開発・研究は金になるから、とか。きょうび、Kernel には金を払わないが、みてくれに金を払う人はたくさんいるし。


らぐらんじゅなんとかの話の続き。ぱっと見たとき、どちらがわかりやすいかといわれれば、do文を4重にしていたほうが、ああ、4つの値の組を求めてるのね、ってわかりやすいのかもしれない。20ならわかりづらいだろうが、4ならいいのか。じゃぁ、5だったら。


shiroさんの日記, iwaoさん経由: Suugaku ha tairyoku da!

「朝起きた時に,きょうも一日数学をやるぞと思ってるようでは,とてもものにならない。数学を考えながら,いつのまにか眠り,朝,目が覚めたときは既に数学の世界に入っていなければならない。どの位,数学に浸っているかが,勝負の分かれ目だ。数学は自分の命を削ってやるようなものなのだ」

そうかー。やっぱ研究はこれくらいやんないと実を結ばね−よなあ。とくに俺みたいのじゃ。


「TOEIC(など)で n点取れなかったら返金します」っていうのはどういうシステムなんだろう、と思ってちょっと見てみると、最低保証点数ってのがあるのね。m点以下の人には付ける薬は無いですよ、と。1万x円かと思ったら、1x万円だった。けたが違う。


読書会にいけないので、ひとりで RHG読書。

チャットには誰も実況中継してくれない。


ソフトを作ろうと思うと、息を止めて水に沈むような気合を込めないと、始められない。で作り始めたらとりあえず終わるまで、息を止めたまま。なので、失速するというパターンが。

体力なんだろうなぁ。


某cc を終わらせておこう、と思ったら、なんか再インストールを要求される。

ごちょごちょやったら、セーブデータごと全部消された。なんてこった。酷すぎ。


ruby で IRC のなんとかを書くっていうのは、やっぱりいくつかすでにあって、しかもことごとく昔に終わってるっぽい。

  • ruby/irc
  • rice
  • rica

とりあえず日本の方の。さて、どれを使おう。

ちなみに、クライアントばかりで、サーバがない。


とりあえず rice を見させてもらってるんだけど、ヒアドキュメントを E で閉じるって凄いなー。

うーん、何やってるかわかんないなー。reader thread, dispatcher thread, main thread と、他にもイロイロスレッドを作るみたいだけど、それぞれ何の役目なんだろう。うーん。

複数の IRCサーバにつなげることができるようになってる・・・のかなぁ。@conn が複数ある配列だしなぁ。

うーん、@conn[0] しか使ってないっぽいなぁ。

クライアントは @threads に保存して、いくらでもつなげられるようにしている、のか。じゃぁ、これ作る必要ないかなぁ。

rq, wq でデータやり取り、と。

_6x6(Sat Apr 17 11:23:12 JST 2004)

 VB6、vs.net、C++Builder、Qt/win>なんか、そういう楽で楽しいGUIプログラミングを楽しみたいなぁ。

_shiro(Sat Apr 17 14:33:11 JST 2004)

 息継ぎの仕方を覚える、という手も。

_ささだ(Sat Apr 17 14:47:07 JST 2004)

 たしかに。

_16(Fri)

せきが止まらない。喘息の人の気持ちがちょっとわかった。

お医者さんにせき止めもらったんだけどなぁ。


ただ単に GUI のプログラミングって面白くないからなんじゃ。


ptt(http://www.ipl.t.u-tokyo.ac.jp/~kaz/ptt/arc/299/299.html より引用):

■第299回 PTT 
日時:2004年 4月22日(木) 18:30から

場所:東京工業大学大岡山キャンパス 西8号館10階1008号室

      地図(http://www.titech.ac.jp/access-and-campusmap/j/o-okayamaO-j.html)
      を参考に、大岡山駅(東急大井町線、東急目黒線)からおいで下さい。
      駅前交差点を渡ったところがキャンパスの正門です(図の右下)。

      開催場所は図の25番で示される建物です。

      西8号館はふたつの建屋から構成されています。正面玄関を入ったところ
      がE棟で玄関奥にのびる廊下を渡ってW棟に行けます。開催場所はW棟の
      10階の最奥にあります。


話者:薄井 義行

題目:アスペクト指向を利用してデバッグコードを挿入できるソフトウェア開発環境

概要:
デバッグの際に記述するデバッグコードをアスペクト指向(AOP)を利用して挿入する
システムを提案する。システムの特徴として、デバッグコードとソースコードを分
離して記述することができる。また、AOPを利用しているため特定のパターン(メソ
ッド呼び出しなど)を入力することで、バッグコード挿入位置を一度に複数指定する
ことができる。デバッグコードの挿入位置の指定はGUIで行うこともできる。発表で
は一般的なAOPの話と本システムの特徴について話します。

どうにも、do文の入れ子が嫌なので、関数にしてみた。

(define (isq n)
  (inexact->exact (floor (sqrt n))))

(define (lag n0)
  (let ((c 0))
    (define (answer n)
      (set! c (+ c 1))
            (display n))
    (define (lag-iter rest lst)
      (if (< (length lst) 4)
          (let ((q (if (null? lst)
                     (isq rest)
                     (min (isq rest) (car lst)))))
            (do ((i q (- i 1)))
                ((< i 1))
              (let ((r (- rest (* i i))))
                (if (= r 0)
                    (answer (cons i lst))
                  (lag-iter r (cons i lst))))))))
    (lag-iter n0 '())
    c))

あんまり綺麗じゃない。

2変数の再帰ってのも嫌だしなぁ。

しかも、遅い。綺麗さを求めるなら遅くてもいいや。

ネタ元:今月の「情報処理」Program Promenade「4平方定理」



(define (lag n0)
  (let ((c 0))
    (define (answer n)
      (set! c (+ c 1))
            (display n))
    (define (lag-iter rest lst)
      (if (< (length lst) 4)
          (let* ((q (isq rest))
                 (q (if (null? lst) q (min q (car lst)))))
            (do ((i q (- i 1)))
                ((< i 1))
              (let ((r (- rest (* i i))))
                (if (= r 0)
                    (answer (cons i lst))
                  (lag-iter r (cons i lst))))))))
    (lag-iter n0 '())
    c))

(use srfi-1)
(for-each (lambda (i)
            (display (format "\nlag(~a) = ~a" i (lag i)))
            (newline))
     (iota 150))

うーん、do 使わないで綺麗に書く方法はないだろうか。

しかし、(let* ((q ...) (q ...)) ... は人によってはすげー嫌いそう。

(define (lag n0)
  (let ((c 0))
    (define (answer n)
      (set! c (+ c 1))
            (display n))
    (define (lag-iter rest lst)
      (if (< (length lst) 4)
          (let* ((q (isq rest))
                 (q (if (null? lst) q (min q (car lst)))))
            (lag-iter2 rest lst q))))
    
    (define (lag-iter2 rest lst i)
       (if (> i 0)
         (let ((r (- rest (* i i))))
           (if (= r 0)
             (answer (cons i lst))
             (lag-iter r (cons i lst)))
           (lag-iter2 rest lst (- i 1)))))
        
    (lag-iter n0 '())
    c))

わかりやすくなったかは・・・微妙。素直に do 使うのがいいのか。dotimes を環境依存と割り切って使うか。


ちなみに、昔 ruby で書いた覚えがある。これだと ruby のほうが綺麗に書けるなぁ。多分。


scheme でリストのリストがあったとき、car部について max し、その max のリスト全体を表示したいときはどうすればいいんだろう(どうするのが綺麗なんだろう)。

sort して car すればいいか。

1023 まで見てみると、990 = i^2 + j^2 + k^2 + l^2 の i,j,k,l の組み合わせが一番多いらしい。

lag(990) = 63
(1 2 5 31)(1 3 9 30)(2 5 11 29)(1 7 10 29)
(5 5 10 29)(1 6 15 27)(9 9 10 27)(1 5 17 26)
(3 9 15 26)(5 11 13 26)(1 2 19 25)(1 13 14 25)
(7 11 14 25)(1 10 19 23)(2 13 17 23)(5 11 19 22)
(7 13 17 22)(13 13 13 22)(3 10 21 21)(1 15 18 21)
(6 15 17 21)(10 15 15 21)(10 13 19 19)(9 15 18 19)

haskell だと、4つの0以上の自然数の組を作るストリームをどさどさとつくり、フィルタリングでもするんだろうか。

でも、それだと「何組できますか」って問題には対応できないか。


明日の読書会は病欠します。ああ、残念。


寝てたらせきをコンコンいってたのが、上のを書いてたら出なくなった。足りなかったのは薬じゃなくてコーディングなのか。

ただし、目は痛いし頭はフラフラ。

で、お医者さんに目薬させ、といわれたので買ったのがアイルビー・ローズ

どうにも I'll be lose って読めてしまって。文法(と発音)違うけどさ。


まぁ、たったの4重ループなんだから、do をネストさせたほうが、細かい最適化もやりやすいし、手っ取り早いと考えるべきなのかなぁ。


http://www.ipsj.or.jp/07editj/promenade/4504.pdf ネタ元。和田先生に教えて頂きました。

_なかだ(Fri Apr 16 12:58:30 JST 2004)

 咳が出てるうちは喘息は大したことありません。

_n某(Fri Apr 16 13:37:43 JST 2004)

 MDR-TB だったり

_ささだ(Fri Apr 16 13:52:29 JST 2004)

 そうなのですか。幸い、今までマズー、という病気に罹ったことが無いので。まぁ、腹筋は付いた気がします。

_ささだ(Fri Apr 16 13:52:42 JST 2004)

 結核の一種ですか。

_shiro(Sat Apr 17 05:28:52 JST 2004)
 (define (lag n0)
   (let ((lim (+ 1 (inexact->exact (floor (sqrt n0)))))
         (sq  (lambda (x) (* x x))))
     (list-of (list a b c d)
       (a in (iota lim))
       (b in (iota (- lim a) a))
       (c in (iota (- lim b) b))
       (d in (iota (- lim c) c))
       (= n0 (+ (sq a) (sq b) (sq c) (sq d))))))

list-ofはWiLiKi:マクロの効用参照。

_ささだ(Sat Apr 17 06:47:30 JST 2004)

 a >= b >= c >= d のように出力されるように思うのに、逆になるのはなんでだろう。

_ささだ(Sat Apr 17 07:15:17 JST 2004)

 fold-left か。

_15(Thu)

せきは大分収まった。が、また微熱が出てきた。腹筋が痛い。

健康診断はむりぽ。すでに不健康だし。

でも、大分楽になった。


うは!

10:45〜11:30: ACL7.0の新しい正規表現ライブラリ (by 川合史朗, Scheme Arts, L.L.C.)

何ですかコレ。

つうか、面子が凄いな、これ。なんとなく。六月かー・・・。


TA っぽいことをやる。

うー、だめだ。死にそう。

_14(Wed)

せきが止まらない。腹筋が痛い・・・。

なぜか、目が真っ赤に充血している。うーん。


今更ですが、岸本さんに借りた「イリヤの空、UFOの夏 ドラマアルバム」を聞きました。

水前寺の声に納得がいかない。もっとかっこいいはずだ、こんなだみ声じゃなくて。

他は、まずまず、か。所詮秋山瑞人の作品を他の媒体には移せないってことなんだろう。


さて、なすきのこはイリヤの空を読んでいたんだろうか。

_KM(Wed Apr 14 12:46:19 JST 2004)

 NeWS と NEWS みたいに 1 字の違いがとても大きな違いになることが...

_しゅどう(Wed Apr 14 14:55:42 JST 2004)

 Goslingのニュース、SONYのニュース、ジャニーズ事務所のタレントのニュース

_13(Tue)

昨今では本学部でもオブジェクト指向プログラミング(B3用)という授業があるらしく。

その資料から引用:

オブジェクト指向の考え方をプログラミングに応用した技法であって、オブジェクト指向に対応したプログラミング言語を用いてプログラムをつくることをオブジェクト指向プログラミングと言います。他のオブジェクト指向言語の例としては、SmallTalk, C++, C#, Rubyなどがあります。

「他の」と言ってる割には、その前に出している例が Simula と SmallTalk なので、SmallTalk が被ってる。

CLOSとかは違う、と。Self なんてもってのほかですか。誰も知らないから、かもしれないが。でも、ECMAScript とか、あってもいいんじゃないかなぁ。C++ 入れるくらいなら。Java が入ってないのは、何か深いものがあるんだろうか。

あ、でも後で使うサンプルは Java だ。SmallTalk 教えるわけじゃないんだな・・・。


その授業の資料の終わりのほうに、

■ 質問のしかたについて

というのがある。素晴らしい。

だけど、読んで欲しい奴に限って、こういうのは読まない。

そこから引用。

「何をどうしようと思ったがうまくいかない」のかを自分に聞きましょう
「どこまではうまくいっているか」を自分で調べましょう
「何がわからない」のかを自分に聞きましましょう
「どうわからない」のかを自分に聞きましょう
「どこまでは理解している」のかを自分に聞きましょう
「どこまではわかったがこれこれがわからない」と自分に聞きましょう

本やWWW、Javaのソースを調べましょう

そして「どこまではわかったがこれこれがわからない」と誰かに聞きましょう。
「なぜ駄目だったのか?自分は何が分かっていなかったのか?」を考えましょう。

「自分に聞きましょう」という表現は新鮮だ。祈りか。

うーん、素晴らしい。

(こういうのを書かなきゃわからない、書いてもわからない大学生ってのも・・・)

あと、ぐぐれ、って項目があればいいのか。


新しく着任された先生の授業なんだけど、とても丁寧な資料だ。すごい人のようだ。


まぁ、資料の中身についてはちょっと微妙なところがある気がするが・・・。「オブジェクト指向技術における5つの仕組み」について、いきなり「抽象化:クラスとオブジェクト」とかあるあたり。(OOP = クラスベースのOOPという発想)

入門ならそれでいいのか。


頭がクラスで固まっちゃうと、先が見えないんだよな。というか、見えなかった。


喉痛と微熱はだいぶ治まったけど、今度はせきが止まらなくなってきた。


さて、高橋さんにお借りした本を読んだので、ストックが尽きた。図書館にでも行くか。


飲みまくり、が一番か。何飲んでるんだろう。次はそれでいくか。

_6(Tue Apr 13 11:33:57 JST 2004)

 禅だ。>「自分に聞きましょう」

_KM(Tue Apr 13 13:11:17 JST 2004)

 函数型と手続型のどっちかがもしかして消えた?

_たむら(Tue Apr 13 16:55:44 JST 2004)

 内容はともかく Smalltalk で `T' と大文字の時点でいかがなものかと

_ささだ(Wed Apr 14 05:40:13 JST 2004)

 いつも「T」はどっちだったかなと悩むんですが、小文字でしたか。(どっちだっていいじゃん、ではまずいんだろうか、やっぱり)

_ささだ(Wed Apr 14 05:40:34 JST 2004)

 多分残ってると思う>関数、手続き。学年違うじゃん。

_12(Mon)

Symbol#to_s はさくっと出るわけじゃないのか。うーん。

method-id -> method-table への表を置くとしたらどこになるんだろう・・・。うーん。


うがい薬の用量のオーダーを間違えていた。「1,2目盛」を「1,2滴」と勘違い。うがー。

そのようにやったら、喉痛がうそのように納まった。この週末の苦しみはいったい。


やっぱりオーダーの確認は大切だよね、という話。うぅ。


学校にくるも、気分が悪くなるばかり。やはり無理してでも家で寝ていたほうがよかったか。

_ぶー(Mon Apr 12 20:14:17 JST 2004)

 アホな学生がパスワード忘れた、ト。ケド、あまりに礼儀を欠いていたのでキッチリ説教シマスタ。あれは気分がワルイ

_11(Sun)

f2eが凄かったので、kiri-kiri ver.2 をダウンロードしてみる。JavaScriptっぽいって書いてあるけど、どちらかというと PHP?

ドキュメントがきっちりしてある。素晴らしい。

TJS2 というスクリプト言語とVMらしい。

GCはリファレンスカウント。

VMはレジスタマシン。というか、ローカル変数=レジスタってことなんだろうな、この仕様は。これはこれでわかりやすい。optimize とかその辺は、別に重要じゃないんだろう。多分。

 chgthis
(change this) 
書式: chgthis %dest, %src

 %dest で表されたオブジェクトのクロージャ部分を、%src で示された
オブジェクトに変更します。 

クロージャってなんだろ。 うーん・・・。

(delete member)

ってのがあるな。必要なんだろうか。


再起動を「必ずさせる」アンインストーラってなんだ・・・。せめて、後からさせてくれよ。


というかね、VM命令とか、そういうのを略したがるってなぜなんだろう。そうじゃないのを(yarv以外で)見たことが無い。いや、見る数が少ないということなのだろうが。


式中関数というのがあるのか。クロージャというのはここで使うんだろうか。説明のサンプルでは書いてないが・・・。


風邪がなおらない。微熱は続くし、のどは痛い。せきも出てきた。

貴重な週末が・・・。


気になったので、 国語辞典 英和辞典 和英辞典 - goo 辞書: さかだち 【逆立ち】より引用。

――しても
精一杯がんばっても。 「―かなわない」

ネタにマジレス?


高校の同級生の結婚式だったらしい。多分、第一号なんだろう。末永くお幸せに。

_shiro(Sun Apr 11 08:48:42 JST 2004)

 VM命令:トレースをばーっと出す時なんかは短いと便利だったりします (一行に、現在のインストラクションやらフラグの値やらを詰め込んだのを並べて出すっていうこと)。今ちょっといじってる中間言語は省略無しにしたんだけど、それのトレースを出しながらそんなふうに思いました。

_ささだ(Sun Apr 11 19:10:22 JST 2004)

 なるほど、トレースの問題がありましたか。後、アセンブラ直接書くしかない時代の、tokenの長さに制限があったとか、書きやすいほうがいいとか、そういうのを引きずってるんでしょうが。

_10(Sat)

html も見づらいので htmlhelp がいいのです(libc.chm)。MSマンセー。


さて、並行世界と並列世界。どちらがどうなのか。


あーー、やっと終わった。とりあえず一通りだけど。長かった。あとは落穂拾いか。

さすが同人ゲーム界の雄、リソースの規模が違う。

でも、なんというか、パーツは同じなんだよな。作り方というか。違うか、作り方と、パーツは同じで、その設計図に従ってパーツをシャッフルして流し込んだら前作だったり今作だったりするのか。

PlayTime は2日か。・・・そうかそうか。


夏が楽しみです(謎)。


途中まで道場の絵がつくりものじさんの絵だと気づかなかった私はやっぱりダメダメだな。


高橋さんからお借りしたJ・P・ホーガン「未来からのホットライン」読了。

偶然性をなんであんなに気にするのかよくわからない。

DECの人だったんだなぁ。


しかし、宇宙喪失とかf2eとかこれとか、なんというかその辺(ぱられるわーるど)の話ばかり読んでいる気がする。

fは違うって? いや、宝石剣・・・。

それだけポピュラーな話題ってことか。


コンプ。疲れた。

綺麗だなぁ。まだ曲が残ってたとは。流石流石。


そういえば、最後に「先生」にあたるものが居なかったな。今回の場合親父さんだから、もう居ないってことになるのか。

何か、超越する何かで締めるのが、そういうもんだと思うのだけれど、そうでもなかったらしい。


美綴さんの扱いが・・・。さっちんと比べてどうだったんだろう。


微熱が続く。PCの前に座ってたら治らないかな。

_9(Fri)

恥ずかしながら風邪をひきました。ばたんきゅー。


info はヤダ。みづらいし。


ptt@農工大でしりとりの話を予定してるらしいです。ほぼ決定って。


yarv の ML をちょっと移しました。

yarv-dev@quickml.atdot.net で、quickml です。興味ある方はどうぞ。過去ログどうしようかな。


ゴーゴー。

_8(Thu)

マルドゥック・スクランブル―The First Compression 圧縮というのがはやってるらしいと聞いたんですが、そういうもんなんでしょうか。


いいかげん、Real One Player はうざいので、Real Alternative というのを入れてみる。聞けるもんだなぁ。


だらだらとウェブを見ていたら ペラペラ-英語学習フリーソフト 時の故郷(英語版) なんてのを見つけた。

なんかいろいろとすげー。ここ。


#include <stdio.h>
main(){
  int ary[10];
  func(&ary);
  func(ary);
  return 0;
}

int func(int (*ary)[10]){
  printf("%08x\n", ary);
  printf("%08x\n", *ary);
  return 0;
}

うーん。C言語初心者であることが発覚。


なんとなく徹夜。だめだめだ。もうだめぽ。


さすがに、man n something とか、そういうのは知ってはいるんですが、section n がなんだったっけーっていうのをぜんぜんおぼえてねーってことです。man man は何度かやってんだけど、何度やっても覚えられない。とりあえずあんまり困ったことがないんで気合入れて覚えようという気にならない。


略称はそれでいいとして、英語表記はどうなるんだろう。


SACSIS のプログラムが回ってきたので見る。

あー、面白そうだなぁ。いきたいなぁ、北海道。


              1 コマンド
                        シ ェルの中からユーザによって実行されうる
                        コマンド。

              2 システムコール
                        カーネルが処理しなければならない関数。

              3 ライブラリコール
                        libc の関数の大部分。例えば qsort(3) など
                        。

              4 スペシャルファイル
                        /dev 以下にあるファイル。

              5 ファイルのフォーマットと規約
                        /etc/passwd  など、人間に可読であるファイ
                        ルのフォーマット。

              6 ゲーム

              7 マクロパッケージと規約
                        標準的なファイルシステム配置、ネットワ ー
                        クプロトコル、 ASCII などの文字コード、な
                        どなどに関する説明 (この man ページ も こ
                        こ)。

              8 システム管理コマンド
                        mount(8) のような root のみが実行可能なコ
                        マンド。

              9 カーネルルーチン
                        このマニュアルセクションは古いものであ る
                        。かつてはここに Linux カーネルのドキュメ
                        ントを置くのが良いことだと考えられてい た
                        が 、しかし文書化されたものは非常に少なく
                        、またそれらもすでに古いものとなってし ま
                        っ た。カーネル開発者にとってより良い情報
                        は他にあるだろう。

MAN(7)              Linux Programmer's Manual              MAN(7)
                           16 June 1999

著者
       -- James Clark (jjc@jclark.com) がマクロパッケージの実装を
          書いた。

       -- Rickard  E. Faith (faith@cs.unc.edu) がこのマニュアルペ
          ージの最初の版を書いた。

       -- Jens Schweikhardt (schweikh@noc.fdn.de) は  Linux  Man-
          Page  Mini-HOWTO を書いた (この文書は本マニュアルページ
          に影響を与えた)。 David A.  Wheeler  (dwheeler@ida.org)
          は このマニュアルページを大きく変更し、セクションやマク
          ロに関する細かな情報を追加するなどした。

より引用。

これを機に覚えますか。


IT Pro Java/J2EE : 【連載◎開発現場から時代を眺める by arton】第1回(Mirage Tower)。

筆者紹介 arton

謎のITエンジニア。

か、かっこ良すぎる・・・。


逆立ちしても勝てない、と思うことはよくあるんだけど、実際に逆立ちをしないでそう思っていることのほうがほとんどだと思う。

_(う)(Thu Apr 08 09:18:24 JST 2004)

 マルドゥック・スクランブルは、割と面白かったけど、一冊だけ読んでも仕方ないと思われます(3部作とかじゃなくて一つの作品が三分冊されているだけなので)。

_KM(Thu Apr 08 10:11:56 JST 2004)

 man のセクションは 1 と 2 と 3 と 8 で重なってたりしてる項目を選ぶために自然におぼえないかなぁ?

_ささだ(Thu Apr 08 10:22:36 JST 2004)

 man するよりもぐぐるほうが先だから使わないのかも。

_向井(Thu Apr 08 14:04:16 JST 2004)

 man n intro

_向井(Thu Apr 08 16:24:07 JST 2004)

 whatis intro の方がサッパリしてていいですね。私は「1」「2か3」「5」「それ以外」でしか覚えてませんが……

_ささだ(Thu Apr 08 18:56:27 JST 2004)

 おお、きれいだ> whatis intro そもそも whatis なんて使ったことなかったな。

_ogino.(Thu Apr 08 19:55:16 JST 2004)

 逆立ちした方が勝つ確率が上がるものとは何なのだろうか?

_nobsun(Fri Apr 09 09:40:52 JST 2004)

 「逆立ち」って、相手にさせるんじぁなかったっけ。

_shugo(Fri Apr 09 11:18:11 JST 2004)

 めざせ、ゲームセンターあらし

_7(Wed)

自分には与えられなかったからと言って、他人へも与えないのは狭量だよな。信念を曲げてすることじゃない。まだまだ修行が足りない。


OSの起動に5分、eclipseの起動に2分。

ハードディスクが逝きそうなのかな・・・。困った。

HDDBENCH の結果。

Read   Write   RRead  RWrite  Drive
 205   27183     160   11356  C:\ 100MB

うがー。こりゃダメだわ。

しかし、何が原因でこんなに read が壊滅的なんだろう。

しょうがないので HDD 交換。

あー・・・。こんなことしてる時間なんて無いのに。


昨日、というか今朝の話は SPA2004 の「データマイニングを利用したプログラムの改善」田中 哲(産総研)を読んでの話なんですが。

ruby 標準ライブラリにも kind_of? がけっこうあって、よくないよね、って話が書いてあって、それに関して。

n万行って行数は、やっぱすごいな、とか、解析に何時間かかったんだろうか、とか。

ソースコードです>shudoさん


なんとなく、当分はノート生活かも。

ハードウェア障害って怖すぎる。

家のサーバマシン、バックアップ取らないと・・・。


ソフトウェア書法 P.102

だめなプログラムを修正するのはやめて、全部書き直そう

これ '82年の本か。


う、これデータの移行に何時間かかるんだろう。

あかん、VC も入れなきゃいけんかったか。ついでだから VS.Net にしようかなぁ。


今日は入学式だったらしい。もちろん行かなかったけど。

学生証を貰えたので、どうやらまだ学生らしい。というか、また学籍番号変わった。去年の分、やっと覚えたと思ったのに。


今回の投票、まだnokadaさんには入れてもらってないらしい。

少数でも「食べまくり」がいるんですね。

そういえば、吸いまくり、を忘れていた。


irc で聞いたんですが、ドラえもん 最速・ザコ敵倒さない・ノーミスクリアー

クリアできるんだな、これ・・・。小学生には不可能だよ、これ。微妙にトラウマ的ゲーム。BGM覚えてるし。


う、あとは putty の設定の回復か。ちょうどその話をしていた後で・・・。面倒なので、全部やりなおす。


初心者なので、man(n) の (n) がそれぞれどういう意味か覚えていない。


Office 2003 の PowerPoint。デザインテンプレートが 2000 よりも増えてる。おー。いいねえ。PowerPoint は研究者にもっとも必要なツールのひとつだと思う。あと TeX関係。Excel と gnuplot は微妙。

というわけで、テンプレート詰め合わせって売ってないかな。どっかに。


だいたい、再インストール終わったかな・・・。一日がこれで終わってしまった。疲れた。


tex の設定とか ram disk の設定とか終わってなかった。つら・・・。


今計ってみたら。

Read   Write   RRead  RWrite  Drive
3919   31644    2501   17952  C:\ 100MB

ちょっと早くなってる。でも、激おそには違いない。何が原因なんだろう。働かせすぎ?

というか、物理的に同じディスクの別パーティションはそんなに遅くなってない。はてな。

_なかだ(Wed Apr 07 18:35:49 JST 2004)

 なんでやねん

_しゅどう(Wed Apr 07 19:17:31 JST 2004)

 通して見ちゃったじゃん!>ドラえもん

_青木(Thu Apr 08 05:34:51 JST 2004)

 例えば section 2 について知りたければ man 2 intro とかするとよさげ

_ささだ(Thu Apr 08 07:22:12 JST 2004)

 おー、intro なんて項目があったんですか。いったいどんなシステムコールかと思った。

_6(Tue)

Windowsの調子が悪い。動作がかくかくとする。何か悪いものにひっかかったか。


社会人2年目の同期が研究室に遊びに来る。いろんな話を聞く。でも、幸せそうだ。やはり、彼は凄いなぁ。

丁度アレなナニがあり、3人でアレでナニな話をする。私はあと3年。大人への道のりは遠い。


とりあえず AntiVirus みたいなものを入れる。ついでにノートにもいれて、全部チェックする。

それから、デフラグをする。昼からやって、全然終わらない。今日は何もできなかった。家でやろう。家ではやらないと、昨日決めたばっかりだったんだが。


やっぱり、メモリ256MB で eclipse やるのは辛いな。


require 'strscan'

def scan(str)
  sc = StringScanner.new(str)
  strs = []
  while !sc.eos?
    if sc.scan(/\[(.+?)\]/)
      strs << sc[1].split(//)
    elsif sc.scan(/([^\[]+)/)
      strs << sc[1]
    end
  end
  strs
end

def expand_str str
  nodes = scan(str)
  strs = ['']
  nodes.each{|item|
    pstrs = []
    strs.each{|pstr|
      if item.respond_to? :each
        item.each{|e|
          pstrs << (pstr + e)
        }
      else
        pstrs << (pstr + item)
      end
    }
    strs = pstrs
  }
  strs
end


p expand_str('hoge [ab][cd][ef]')
["hoge ace", "hoge acf", "hoge ade", "hoge adf", 
 "hoge bce", "hoge bcf", "hoge bde", "hoge bdf"]

ださださ。


ごーごー。


duck typing において、同じ名前で別の意味をもつメソッド(sendとか)を解決する方法はあるんだろうか。それがないと、kind_of? の利用を悪だとは言えないと思うんだけど。

あと、複数メソッドを確認したいときとか、respond_to? を何個も使うのはダサいし。kind_of? を使いたい気がする。

あと、名前が長い。

それを奨励するなら、構文要素に組み込んでみるとか。

if(obj respondto method)
  ...
end

case obj
when :method1
  ...
when :method2
  ...
else
  ...
end

うわー・・・。もちろん instanceof を想定してみたんだけど。

_しゅどう(Tue Apr 06 14:50:45 JST 2004)

 「うーん、なんだか調子悪いなあ」と言いながら、かくかく歩くささださん。

_ササダ(Tue Apr 06 20:23:46 JST 2004)

 カクカク

_なかだ(Wed Apr 07 02:11:36 JST 2004)

if defined?(obj.method) とか。

when :method は以前却下された覚えが。

_向井(Wed Apr 07 03:23:39 JST 2004)

 メソッドを型推論すれば楽なのに……

_shugo(Wed Apr 07 11:18:47 JST 2004)

obj.respond_to?(:foo)が真でも、そのfooはたまたま名前が一致しただけで 期待したものとは違う可能性がある、ということを問題にしてるんですよね? (Javaだとintefaceをimplementsしているかどうかでチェックできるけど。)

Rubyだとどうせ実行時のチェックになるので、kind_of?でチェックしてうれしいか どうかは微妙な気もします。 あと、モジュールをJavaのinterface的に使うのは何か抵抗が。 (既存のライブラリがそういうつくりになってないし。)

たぶん、そういうチェックをしたい人は、Rubyみたいに動的な型しかない言語に型チェックを導入するよりも、基本的に静的な型を持った言語で、型推論なりなんなりでラクしていく 方向の方がハッピーになれるんじゃないかなあ。

_5(Mon)

UPS の設定終わり。


最近、やっとメールのことがわかってきた。今まではメーラを起動して、POPの設定とか入れて、勝手になんかやってくれるもんだと思ってたんだけど。echo hoge | mail -s subj ko1 とか、そういうのが出来るんだなあ。

起動時、終了時にメールを送るようにしておこう。さて、何処を触るのか。

.qmail-root と .qmail-default を置いていたら、.qmail-default にしか行かない。うーん。面倒なので、.qmail-default はもう削除してしまうか・・・。聞いて回ると、無い人のほうが多かったし。


そういえば、samidare は日付をクリックするものだということを花見で聞いた。うーん、そういうものだったのか。


xyzzy + 秀丸 は珍しい(はじめて見た)と言われたが、世の中そういうもんなんだろうか。

C-[zxcv] でなんかやるのは便利だと思うけどなぁ。M-w + C-y ってわかりづらいし。(vi ではやり方知らないし。p だっけ)


首藤さんとこ経由でFlashMob Computingのページ見ましたが、写真が面白すぎ。


誰かに投票を編集できるようにしろ、とか言われた気がしたんだけど、どうするべきか。

  • 新規投票を勝手に作れるようにする
  • 選択肢を追加できるようにする
  • 選択肢を編集できるようにする
  • 得票数を編集できるようにする

さて、どうしよう。

そもそもさ、今の投票フォームって手で書いてるんだよね、実は。


putty の設定をファイルで出来るようになれば最強なのに。

パッチはちょっと怖い(面倒)。でも、ja化もパッチなんだよな。


花見で話していたtailプロトコル。どうなんしょうねぇ。あると便利な気がしなくも無いが。

何も考えずにircに突っ込むというのが一番楽かも。

しかし、cvsに突っ込んで diff で見てるってのは衝撃だったのだけど、世の中そういうもんなんだろうか。

で、その辺全部 irc で流す。

            irc server--------...(irc clients)
             |
             +
        irc client server
        |   |     |      |
      diff  biff  logger ...

やっぱりなどかちゃんが必要だ。


/var/qmail/alias/.qmail-root に書いてるはずなのに転送されず。はてな。

/var/qmail/control/users/... があったかららしい。debianで入れると勝手に入るのか。こいつの編集のやりかたよくわからないな。消し消し。


lily というのを、川y と見間違えたのは、やっぱり疲れてるからかな。


ウェブページを tail -f なんてツールは誰かが考えてると思うんだけどな。

結局 diff 取った結果を垂れ流す、になるのか。


あれー? citeseer 場所かわっちゃってる? なんかデータベース減ったような。あと、微妙に非力になったような。


結局 nrk なのかなぁ。


とくにリクエストもなければ投票に関してのシステムは変えず。


今回の投票は、花見のとき、A木さんとハック中何か食べるかって話してて、俺が食べまくりといったら「ありえない」と言われてしまったので。ついつい口が寂しくて食べてしまうんだよねぇ。太るってのはわかるんだけど。


井の頭公園のさくら

さくらと言っても今期からの再放送とか、そういう会話はなかったのはさすがですね(何が)。


トリビアのしりとりの話。

数理計画が専門でない方のための「最も長いしりとり」の作り方 - どうやって“最も長い”ことを保証するかについてのお話を中心に

詳細だそうです。私は難しいことはよくわからないんですが、11秒らしい。

広めたいそうなので、よかったら広めてください(笑)。テレビ見てないんで知らないんだけど、テレビでは(やっぱり)誤解を与えるような説明だったらしく。それの、ちゃんとした説明版、らしい。

式を書かないで説明するのは大変らしい。


yarv をソロソロ再起動しないとあれだよなぁ、と思う。cvs どこにしようか悩む。rubyforge なんだかんだ言って使いづらいし。

atdot に作るのはもっと面倒な気がする。どうしたもんかな。

wiki は atdot に移そうとは思ってんだけど。


自分のプロバイダのメールアドレスから、自分の学校のメールアドレスにういるすが来た。その添付ファイル名が nomoney.zip 。いや、間違っちゃ居ないんで、ついつい実行したくなったんだけど。


/.で見たんですが、 TRON Costume。坂村先生も凄いことするなぁ、と思ってしまった。


しりとりの話、なぜ整数な最適解が見つかるのかわからなかったんですが、品野先生に教えてもらいました。引用。

これは,条件を記述している式の係数行列の性質によります.係数行列の任意 の小行列式の値が0,+1,-1にしかならない場合には,整数になるという性質な のです(整数定理と呼ばれている).専門分野でないとわからないよね.

そういうものらしいです。

_こーのいけ(Mon Apr 05 13:20:39 JST 2004)

 .regに吐くとか。<PuTTY あと,ini化パッチとかもあったよーな。

_ささだ(Mon Apr 05 13:24:06 JST 2004)

 FAQにregを吐くってのはあったんですが、面倒そうで。あと、さくさくと設定追加できないっぽいし。ポートフォワーディングの設定をさくさく追加したいのですよ。

_とくひろ(Mon Apr 05 15:53:17 JST 2004)

 putty を ini 対応にするパッチがありますよ.http://www007.upp.so-net.ne.jp/bemax/arita/putty.html

_maeda(Mon Apr 05 16:23:08 JST 2004)

 man qmail-users(5)参照。

_ささだ(Mon Apr 05 17:50:22 JST 2004)

 sendmail からの移行組用って認識だったんですが(だから、無視無視〜)。

_maeda(Mon Apr 05 19:26:07 JST 2004)

 users/assignはメールonlyのユーザを(大量に)作るためじゃないのかな。vpopmailとか。普通はvirtualdomainsだけ知ってれば間に合うような。

_ささだ(Mon Apr 05 19:42:21 JST 2004)

 なるほど。pop は何も考えてないんだよな。まだ。

_4(Sun)

とりあえず辛い。今日読書会いけるだろうか。


T福さん並に遅れて読書会。目的のPyCon話も聞く。

IronPython か。そういう方向性もありだよね。ParrotPythonとかさ。というか、堅実かもしれん。

_ogino.(Mon Apr 05 00:17:46 JST 2004)

 ひよりました。ううう。

_ささだ(Mon Apr 05 09:50:51 JST 2004)

 今回は無限ストリームとかなんだかの数学への応用(級数の演算)とかで、色々難しかったらしいです。

_2(Fri)

あれ、SWoPP の原稿締め切りって何時頃だったかな・・・。


グレッグ・イーガン「宇宙消失」読了。なんや難しかった。というかようわからんかった。

解説にもあるけど、選択についての話がうますぎる気がするなぁ。

しかし、やっと読み終わった。1,2週間かかった気がする。


bot: googlec: toon shader(26), toon shading(30)

bot: googlec: cartoon shader(3), cartoon shading(8)

bot: googlec: toon render(2), toon rendering(3), cartoon render(0), cartoon rendering(13)

ja なので、微妙な検索結果。やっぱり言語選べるようにしたいなぁ。


眠すぎ。

レジャーシートとお菓子はちょっと買った。あとよろしく。

_KM(Fri Apr 02 19:28:53 JST 2004)

 〜 render と 〜 rendering の結果もキボンヌ

_1(Thu)

大学院博士前期課程から追い出されました。これからはPOO太郎日記でお送りします。


嘘じゃないです:

Ruby関連花見@東京 現状での予定

場所:  井の頭公園(JR吉祥寺駅 / 井の頭線 井の頭公園前駅)
集合場所:未定
日程:4/3(土)
時間:
 15:30 集合
 16:00 開始
 18:00 片付け・移動
 18:30 飲み会

お時間のある方は是非。詳細はML([ruby-list:39448])にて。

残念ながら(?)読書会は無いそうです。

一緒に場所取りしてくれる人募集(ぉ。


嘘じゃないです:

秋葉原いいなぁ。行きたかったなぁ。


嘘かも:

一番おもしろかったのがなんとかMNU。


嘘だったらいいな:

スライドだけのつもりでいたら、資料も作らなきゃいけなかったらしい。ヤバスギ。

登さんは一時間で10ページすすめるらしいので、人間はそんだけ書けるんだと信じて、書くしか。

ほんといい加減集中力がない。どっかで修行でもしたら集中力付くんだろうか。

_み(Thu Apr 01 09:43:27 JST 2004)

 もしもし、後期課程でしょ…

Sasada Koichi / sasada@namikilab.tuat.ac.jp
$Date: 2003/04/28 10:27:51 $