もう、アーサー王の話とか聞くと、あぁ、あれね、とか思ってしまって困る。
新撰組もそう(何)なんだけど。
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= 自分用のメモ。すばらしい。ずーっと困ってたんだ。
私が一番ダメかもしれない。いや、いろいろと。
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版) を利用しないと無理なのかなぁ。うーん。
無理っぽかったので、しょうがないから常駐させるようにしてみようかしらん。
詰まったところ:
パスフレーズぐらい入れさせろよ!>cvs pageant 怖いのよねぇ。
私は生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が見れないのは致命的だ。
irc bot の種類を考えてみる。
■ユーティリティ系
■協調系(?)
ユーティリティ系は、誰か一人居ればいい。つまり、みんながみんなやるもんじゃない。
なら、協調系をがんばるべきなんだと思うんだが、建設的なもの、面白いものが思いつかない。
いや、人工無脳がしゃべってるってのは、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で効いたんですが、今日のオススメネタ: [ネタ] 『囚人である』 ことと 『オフィスで働く』 ことの違い。なるほど。そうだったのか。
(UNIXの)シェルとつないでおくれ。GridIRC: http://www.shudo.net/diary/2001jul.html#20010703
op distributerは一匹じゃ足りません。
よーしパパGrid研究もはじめちゃうぞ。
bootstrap のため?>1匹じゃ足りない
あまり必要になることはないけど,チャンネル乗っ取り対策とか。 あとはserver splitとか接続の安定性の問題。数ヶ月に1度くらいは@なくなるから…ぼっとに自動おぺする人がいればよいんだけど,普段ぼっとが常駐してるとみんな設定しなくなるから。
http://abcdane.net/ ダメ系というかバカ系
今日は拓殖大学に行ってきた。広いね〜。
ドメインの有効活用をがんばって考えている。
at at at dot atdot dot net というメールアドレスがいいんじゃないかとちょっと思う。対称じゃないなぁ。
永遠のなんとかをちょいちょい進めてるんだけど、長い。こういうのは苦手。
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 って、ちょっとでもダメな文字列だと例外起こるんですね。何も考えないで使うにはやっぱり難しい。
content_encoding というメソッドがあるので、それに従ってデコードするのが正しいやりかたでしょうね。デコード済みのを返すのを考えたこともありますが、それは絶対デフォルトにしないと決心したほかは進んでません。あと、普通のファイルにも read を使うには、ファイル名を Pathname で表現することで出来ます。
そうそう、Pathname を使う程スタイルを変えたくないなら、to_s しないだけという手もあります。open-uri な open では引数に URI (というか、open メソッドをもつオブジェクト) を受け付けるので。
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 で場合わけは必要なのだなぁ、と思いました。
今回のアプリケーションの要求としては、
があると私は幸せになれそうです。限定的なシチュエーションになってしまいますか。
Pathname というのは pathname.rb で定義されるものであって相対 URI ではないです。
ああ、なるほど。でも、最初に Pathname を作るのは誰がどうやるのがいいんでしょうか。URI.parseした結果が Pathname になってくれるとか、そういうのだと嬉しそうな。
今のところ、自分で Pathname.new ですかね。RAA にある vfs-simple は VFS(string) というので URI.parse か Pathname.new をやってくれます。
何も考えないでできるようになるには、もうちょっと先ですか。
拡張子を使わずに gzip を判定するなら magic number でしょう。file コマンドが使ってるやつ。
うーん、さくっと簡単な方法は無理くさいですねえ
Iconvはブロックで不正キャラクタの処理をできるようにしようかと考えてはいます。
ずっと考えてるだけ。
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 の代わりに使う意義ってのは、どういうときにあるんだろう。明示的にファイルに限定したいときか?
別にめんどうでもないか。
保存しておくのは、「ファイルごとの最新更新時間(チェックした時間でいいのか?)」と、最新のエントリの時間。
気になるのは、複数の 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
openだとIOErrorじゃなくてErrno::ENOENTとかSystemCallError
open-uri が提供しているのは今のところは last_modified メソッドなので透過的な方法はないと思いますが、テンポラリファイルの mtime を Last-Modified: の時刻にセットするという手はあるかも知れませんね。
なぜ open-uri が mtime を設定しないか思い出しました。ちっちゃいファイルは StringIO になるので、mtime が存在しないのです。
mtimeメソッドを定義するわけにはいかないんでしょうか。
いけないというほどではありませんが、File#mtime と違って書き込んでも変わらないものになってしまうので、ちょっと躊躇するものがあります。
書き込みもできるんでしたっけ?
そのうちできるようにしようと思っています。
そうそう、open(@uri).read より @uri.read のほうがいいと思いますね。短いし、確実に close されるし。
そんなものまでくっつくんですねぇ。奥が深い。
@uri.last_modifed はできないんですねぇ。
ファイル名や URI をレシーバにする慣習を根付かせるという野望があるので、そっちのほうが短くないとね。反対する人もいますが。URI#last_modified は... あってもいいけどちょっと微妙かな。つけるとしても、Last-Modified: と同時に得られる他の情報を無駄にしたくない感じがします。
サイズとかですか。
ぱーみっしょんではまる。
なぜだー、こんちくしょー、って悩むこと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: 竹内郁雄先生の運転で北海道ドライバシの問題があまり生じない。
ドライバシって何。
cvsから取ってきたらふつーに動いたよーな。<gentoo まぁ,subversion-0.23な頃の話だし,gentooはswigとかライブラリ系については新しいものが怖いほど入ってくるから・・・ guileはswigからの依存でしょう。そういうものですし。ちなみにgentooならUSE=-guileするだけで外せる訳だけど。
open()のたびにカーネルが/etc/groupを見に行くわけはないよね。groups ko1と実行すると/etc/groupを見に行くけど、引数なしでgroupsとやると全然違うものを見に行くんですよ。
あぁ、なるほどー。
昨日の 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. #
初めて書いたけど、こんなもんでいいんだろうか。
適宜 ntpd で較正された時刻を RTC に設定するようにしておけば再起動後でもそんなにずれてない筈,っていうか RTC 狂い杉です
告白します。学部4年のとき、英語の論文1本読むのに1ヶ月とかかかってました。速くするには、量を読むだけだと思います。
某松岡先生は、Dの学生なら、週に3本は読まないと、と言ってました。。。うぅ。
鷲崎さんとは、実は去年の12/25にも同じ場、すぐそばにいたのだけど、彼は僕の顔を覚えてないみたいで(泣)。。。太ったからか!そうなのか!
あ-、記事にもありますけど、ちゃんと全部読むのは論文10本のうち1本程度ですので。
首藤さん、すみません。12/25にどこで何をしていたのか、全く思い出せません。大学でしょうか。。。
12/25は、早稲田で、上田研卒の上田学さんとの懇談会でした。最近、ずっとメガねで暮らすようになっちゃったんで、そのせいかも。
思い出しました。当日は、徹夜明けで周りがほとんど見えていなかったようです。。。失礼致しました。
でも、きちんと論文をチェックする習慣はやっぱり必要ですよね。研究室にくる論文誌・研究会報告(日本語)とかは目を通すけど、それ以外はなかなか見ようとしないのはダメダメ。
ししゃもさんを使わせてもらう。私の日記のログを読ませるとエラーをよく吐く。嫌われてるんだろうか。苦肉の策。
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には出せないことがわかりました。困った。
話すのは25分デスヨ。あとの20分は質問責めの時間。
20分も質問受けるネタがないかも・・・。
誰も質問しないで沈黙責めの方が辛いかも。
あぁ、ますます出せなく。
ダイジョウブデスヨ。ツッコムネタハイクラデモ… (←って、なぜカタカナ?)
ガクガクブルブル
madoka をさくっと置きかえるのはまだ危険かと思います。
素晴らしい。
debian(stable) で subversion を apt-get しようとしたら、さくっとエラー。
よく知らないんだけど 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 、設定ファイルは結局、クラス+定数になりました。
RAAに登録してくださーい
もう少し安定させたあかつきには登録させていただきます。
やっぱり、Hackしている後姿を見せるしかないのでは。先輩は背中で語らねば。
nadokaをnokadaと空目
tab幅も短い(3タブ)はずなんだけどなぁ
自分はフツーにnodokaに見えました
nodocaの方が可愛くて良いです。
せきのために眠れない、ということはなくなった。よかったよかった。
rice は複数のクライアント(bot?) を登録できるようになっているが、これをそのまま利用してしまっていいものか。
多分よくない。
うまい名前が思いつかない。
server <- -> clients server <- -> clients
と、4つの通信があるのだけれど、そのメソッド名。やることはそんなに多くないんだがなぁ。名前付けが多い。
とりあえず、だいたい動いた。
あとは設定項目のデザイン。これが一番大変そうだ・・・。
簡単な設定ファイルの作り方。
xml, yaml はやっぱり人間には書きづらいと思う(というか、書きたくない)。S式はパーサが無い(うーん)。
独自フォーマットは考えるのが面倒。
グローバル変数は、項目が増えたときに死にそう。
ハッシュを書かせると、行末にカンマが必要になり、けっこうウザイ。
はて、どうしたものか。
一番楽なのは、やっぱり Hash かなぁ。
$config = { # ... :var => val # ... :var2 => val2 }
みたいに書けないものか。自分でなんかがんばるのもめんどいしなぁ。'#' だけ見て、コメントアウトするようにしようか。でも、文字列中のはエスケープするとか、やっぱり考えるのめんどうくさい。コメントは行頭に '#' とか、そういうダメなルールにするか。
全部の行末に ',' って付ければいいか。・・・ダメか、そんな安易じゃ。
S式のパーザあるんでないの? Ruchemeのリーダが。
手元のだとこんなのが:
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) でどうこうな形とか。
Rucheme のは利用するのが面倒なように作っちゃってて。なんとかしようと思うことは思ってるんですが。
あー、定数がありましたか! もうハッシュで書いてしまいますた・・・。今度使わせてもらいます。
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 のなんとかを書くっていうのは、やっぱりいくつかすでにあって、しかもことごとく昔に終わってるっぽい。
とりあえず日本の方の。さて、どれを使おう。
ちなみに、クライアントばかりで、サーバがない。
とりあえず rice を見させてもらってるんだけど、ヒアドキュメントを E で閉じるって凄いなー。
うーん、何やってるかわかんないなー。reader thread, dispatcher thread, main thread と、他にもイロイロスレッドを作るみたいだけど、それぞれ何の役目なんだろう。うーん。
複数の IRCサーバにつなげることができるようになってる・・・のかなぁ。@conn が複数ある配列だしなぁ。
うーん、@conn[0] しか使ってないっぽいなぁ。
クライアントは @threads に保存して、いくらでもつなげられるようにしている、のか。じゃぁ、これ作る必要ないかなぁ。
rq, wq でデータやり取り、と。
せきが止まらない。喘息の人の気持ちがちょっとわかった。
お医者さんにせき止めもらったんだけどなぁ。
ただ単に 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 ネタ元。和田先生に教えて頂きました。
咳が出てるうちは喘息は大したことありません。
MDR-TB だったり
そうなのですか。幸い、今までマズー、という病気に罹ったことが無いので。まぁ、腹筋は付いた気がします。
結核の一種ですか。
(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:マクロの効用参照。
a >= b >= c >= d のように出力されるように思うのに、逆になるのはなんでだろう。
fold-left か。
せきは大分収まった。が、また微熱が出てきた。腹筋が痛い。
健康診断はむりぽ。すでに不健康だし。
でも、大分楽になった。
うは!
10:45〜11:30: ACL7.0の新しい正規表現ライブラリ (by 川合史朗, Scheme Arts, L.L.C.)
何ですかコレ。
つうか、面子が凄いな、これ。なんとなく。六月かー・・・。
TA っぽいことをやる。
うー、だめだ。死にそう。
せきが止まらない。腹筋が痛い・・・。
なぜか、目が真っ赤に充血している。うーん。
今更ですが、岸本さんに借りた「イリヤの空、UFOの夏 ドラマアルバム」を聞きました。
水前寺の声に納得がいかない。もっとかっこいいはずだ、こんなだみ声じゃなくて。
他は、まずまず、か。所詮秋山瑞人の作品を他の媒体には移せないってことなんだろう。
さて、なすきのこはイリヤの空を読んでいたんだろうか。
昨今では本学部でもオブジェクト指向プログラミング(B3用)という授業があるらしく。
その資料から引用:
オブジェクト指向の考え方をプログラミングに応用した技法であって、オブジェクト指向に対応したプログラミング言語を用いてプログラムをつくることをオブジェクト指向プログラミングと言います。他のオブジェクト指向言語の例としては、SmallTalk, C++, C#, Rubyなどがあります。
「他の」と言ってる割には、その前に出している例が Simula と SmallTalk なので、SmallTalk が被ってる。
CLOSとかは違う、と。Self なんてもってのほかですか。誰も知らないから、かもしれないが。でも、ECMAScript とか、あってもいいんじゃないかなぁ。C++ 入れるくらいなら。Java が入ってないのは、何か深いものがあるんだろうか。
あ、でも後で使うサンプルは Java だ。SmallTalk 教えるわけじゃないんだな・・・。
その授業の資料の終わりのほうに、
■ 質問のしかたについて
というのがある。素晴らしい。
だけど、読んで欲しい奴に限って、こういうのは読まない。
そこから引用。
「何をどうしようと思ったがうまくいかない」のかを自分に聞きましょう 「どこまではうまくいっているか」を自分で調べましょう 「何がわからない」のかを自分に聞きましましょう 「どうわからない」のかを自分に聞きましょう 「どこまでは理解している」のかを自分に聞きましょう 「どこまではわかったがこれこれがわからない」と自分に聞きましょう 本やWWW、Javaのソースを調べましょう そして「どこまではわかったがこれこれがわからない」と誰かに聞きましょう。 「なぜ駄目だったのか?自分は何が分かっていなかったのか?」を考えましょう。
「自分に聞きましょう」という表現は新鮮だ。祈りか。
うーん、素晴らしい。
(こういうのを書かなきゃわからない、書いてもわからない大学生ってのも・・・)
あと、ぐぐれ、って項目があればいいのか。
新しく着任された先生の授業なんだけど、とても丁寧な資料だ。すごい人のようだ。
まぁ、資料の中身についてはちょっと微妙なところがある気がするが・・・。「オブジェクト指向技術における5つの仕組み」について、いきなり「抽象化:クラスとオブジェクト」とかあるあたり。(OOP = クラスベースのOOPという発想)
入門ならそれでいいのか。
頭がクラスで固まっちゃうと、先が見えないんだよな。というか、見えなかった。
喉痛と微熱はだいぶ治まったけど、今度はせきが止まらなくなってきた。
さて、高橋さんにお借りした本を読んだので、ストックが尽きた。図書館にでも行くか。
飲みまくり、が一番か。何飲んでるんだろう。次はそれでいくか。
禅だ。>「自分に聞きましょう」
函数型と手続型のどっちかがもしかして消えた?
内容はともかく Smalltalk で `T' と大文字の時点でいかがなものかと
いつも「T」はどっちだったかなと悩むんですが、小文字でしたか。(どっちだっていいじゃん、ではまずいんだろうか、やっぱり)
多分残ってると思う>関数、手続き。学年違うじゃん。
Symbol#to_s はさくっと出るわけじゃないのか。うーん。
method-id -> method-table への表を置くとしたらどこになるんだろう・・・。うーん。
うがい薬の用量のオーダーを間違えていた。「1,2目盛」を「1,2滴」と勘違い。うがー。
そのようにやったら、喉痛がうそのように納まった。この週末の苦しみはいったい。
やっぱりオーダーの確認は大切だよね、という話。うぅ。
学校にくるも、気分が悪くなるばかり。やはり無理してでも家で寝ていたほうがよかったか。
アホな学生がパスワード忘れた、ト。ケド、あまりに礼儀を欠いていたのでキッチリ説教シマスタ。あれは気分がワルイ
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 辞書: さかだち 【逆立ち】より引用。
ネタにマジレス?
高校の同級生の結婚式だったらしい。多分、第一号なんだろう。末永くお幸せに。
html も見づらいので htmlhelp がいいのです(libc.chm)。MSマンセー。
さて、並行世界と並列世界。どちらがどうなのか。
あーー、やっと終わった。とりあえず一通りだけど。長かった。あとは落穂拾いか。
さすが同人ゲーム界の雄、リソースの規模が違う。
でも、なんというか、パーツは同じなんだよな。作り方というか。違うか、作り方と、パーツは同じで、その設計図に従ってパーツをシャッフルして流し込んだら前作だったり今作だったりするのか。
PlayTime は2日か。・・・そうかそうか。
夏が楽しみです(謎)。
途中まで道場の絵がつくりものじさんの絵だと気づかなかった私はやっぱりダメダメだな。
高橋さんからお借りしたJ・P・ホーガン「未来からのホットライン」読了。
偶然性をなんであんなに気にするのかよくわからない。
DECの人だったんだなぁ。
しかし、宇宙喪失とかf2eとかこれとか、なんというかその辺(ぱられるわーるど)の話ばかり読んでいる気がする。
fは違うって? いや、宝石剣・・・。
それだけポピュラーな話題ってことか。
コンプ。疲れた。
綺麗だなぁ。まだ曲が残ってたとは。流石流石。
そういえば、最後に「先生」にあたるものが居なかったな。今回の場合親父さんだから、もう居ないってことになるのか。
何か、超越する何かで締めるのが、そういうもんだと思うのだけれど、そうでもなかったらしい。
美綴さんの扱いが・・・。さっちんと比べてどうだったんだろう。
微熱が続く。PCの前に座ってたら治らないかな。
恥ずかしながら風邪をひきました。ばたんきゅー。
info はヤダ。みづらいし。
ptt@農工大でしりとりの話を予定してるらしいです。ほぼ決定って。
yarv の ML をちょっと移しました。
yarv-dev@quickml.atdot.net で、quickml です。興味ある方はどうぞ。過去ログどうしようかな。
ゴーゴー。
マルドゥック・スクランブル―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エンジニア。
か、かっこ良すぎる・・・。
逆立ちしても勝てない、と思うことはよくあるんだけど、実際に逆立ちをしないでそう思っていることのほうがほとんどだと思う。
マルドゥック・スクランブルは、割と面白かったけど、一冊だけ読んでも仕方ないと思われます(3部作とかじゃなくて一つの作品が三分冊されているだけなので)。
man のセクションは 1 と 2 と 3 と 8 で重なってたりしてる項目を選ぶために自然におぼえないかなぁ?
man するよりもぐぐるほうが先だから使わないのかも。
man n intro
whatis intro の方がサッパリしてていいですね。私は「1」「2か3」「5」「それ以外」でしか覚えてませんが……
おお、きれいだ> whatis intro そもそも whatis なんて使ったことなかったな。
逆立ちした方が勝つ確率が上がるものとは何なのだろうか?
「逆立ち」って、相手にさせるんじぁなかったっけ。
めざせ、ゲームセンターあらし
自分には与えられなかったからと言って、他人へも与えないのは狭量だよな。信念を曲げてすることじゃない。まだまだ修行が足りない。
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
ちょっと早くなってる。でも、激おそには違いない。何が原因なんだろう。働かせすぎ?
というか、物理的に同じディスクの別パーティションはそんなに遅くなってない。はてな。
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 を想定してみたんだけど。
「うーん、なんだか調子悪いなあ」と言いながら、かくかく歩くささださん。
カクカク
if defined?(obj.method) とか。
when :method は以前却下された覚えが。
メソッドを型推論すれば楽なのに……
obj.respond_to?(:foo)が真でも、そのfooはたまたま名前が一致しただけで 期待したものとは違う可能性がある、ということを問題にしてるんですよね? (Javaだとintefaceをimplementsしているかどうかでチェックできるけど。)
Rubyだとどうせ実行時のチェックになるので、kind_of?でチェックしてうれしいか どうかは微妙な気もします。 あと、モジュールをJavaのinterface的に使うのは何か抵抗が。 (既存のライブラリがそういうつくりになってないし。)
たぶん、そういうチェックをしたい人は、Rubyみたいに動的な型しかない言語に型チェックを導入するよりも、基本的に静的な型を持った言語で、型推論なりなんなりでラクしていく 方向の方がハッピーになれるんじゃないかなあ。
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にしかならない場合には,整数になるという性質な のです(整数定理と呼ばれている).専門分野でないとわからないよね.
そういうものらしいです。
.regに吐くとか。<PuTTY あと,ini化パッチとかもあったよーな。
FAQにregを吐くってのはあったんですが、面倒そうで。あと、さくさくと設定追加できないっぽいし。ポートフォワーディングの設定をさくさく追加したいのですよ。
putty を ini 対応にするパッチがありますよ.http://www007.upp.so-net.ne.jp/bemax/arita/putty.html
man qmail-users(5)参照。
sendmail からの移行組用って認識だったんですが(だから、無視無視〜)。
users/assignはメールonlyのユーザを(大量に)作るためじゃないのかな。vpopmailとか。普通はvirtualdomainsだけ知ってれば間に合うような。
なるほど。pop は何も考えてないんだよな。まだ。
とりあえず辛い。今日読書会いけるだろうか。
T福さん並に遅れて読書会。目的のPyCon話も聞く。
IronPython か。そういう方向性もありだよね。ParrotPythonとかさ。というか、堅実かもしれん。
あれ、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 なので、微妙な検索結果。やっぱり言語選べるようにしたいなぁ。
眠すぎ。
レジャーシートとお菓子はちょっと買った。あとよろしく。
〜 render と 〜 rendering の結果もキボンヌ
大学院博士前期課程から追い出されました。これからはPOO太郎日記でお送りします。
嘘じゃないです:
Ruby関連花見@東京 現状での予定 場所: 井の頭公園(JR吉祥寺駅 / 井の頭線 井の頭公園前駅) 集合場所:未定 日程:4/3(土) 時間: 15:30 集合 16:00 開始 18:00 片付け・移動 18:30 飲み会
お時間のある方は是非。詳細はML([ruby-list:39448])にて。
残念ながら(?)読書会は無いそうです。
一緒に場所取りしてくれる人募集(ぉ。
嘘じゃないです:
秋葉原いいなぁ。行きたかったなぁ。
嘘かも:
一番おもしろかったのがなんとかMNU。
嘘だったらいいな:
スライドだけのつもりでいたら、資料も作らなきゃいけなかったらしい。ヤバスギ。
登さんは一時間で10ページすすめるらしいので、人間はそんだけ書けるんだと信じて、書くしか。
ほんといい加減集中力がない。どっかで修行でもしたら集中力付くんだろうか。
もしもし、後期課程でしょ…
djb の dnscache 使えば? → DNS サーバ逝ってる
asd