2006-05-02
■ [softs] Subversion
部室のマシンにSubversionを入れてみた。
今まで知らなかったんだけど、svn+ssh使えばサーバ(svnserve)立てたりする必要ないのな! (Subversionを ssh 経由で使おう(ApacheもWebDAVも必要ないよ))
Rubyから扱う場合は、標準でRubyバインディングがついているらしいです。 CVSは標準でそういうのはないのかな?(RAAにruby-cvsがあるけど)
RAAのVCSもダウンロードしてみたけど、 「CVSやSVN等を統一したインターフェイスでアクセスできるようにする」というもののようで、 リポジトリを直接触るとかそういう感じではなさそう。(というかREADMEがフランス語でよくわからん(笑))
何がやりたいのかというと部内のプロジェクトの進行状況をウォッチしたいのだけど。
■ [misc] Fortress
Guy Steele氏の講演が京大であったので聞いてきた。英語なんで1/10くらいしか聞き取れず…
メモを書いたノートが研究室にあるんで内容はそのうち。というか k.inabaさんの記事を読んでくださいというのでも良いんですけど(笑)、 付け足すとすれば「=」と「:=」が両方用意されてる*1 のとか僕は面白いと思いました。
*1 たぶん、副作用を伴うかの違い。前者は「束縛」、後者は「代入」
2006-05-04
2006-05-05
■ [tDiary] はてなブックマーク関連のプラグイン
はてブ関連のtDiaryプラグインについて調べてみたよ。
- セクションタイトルの横にはてブへのリンクを表示する
- これを探してた!contribに入ってる模様。
- 自分がブクマした記事を日記に埋め込む
- ブクマばっかりで日記の更新が滞っている人に(^^;
- 被ブクマ数の多い人気の日記を表示する
- セクション末尾に「このエントリ(を|の)ブクマ」を表示する
- MM/Memoやdel.icio.usも対応。人気の日記プラグインと併用すれば被ブクマ数表示も可能
- リファラの検索語句をはてブのタグクラウドっぽく表示する
- 自分の日記のはてブコメントを表示する
- 自分の見えないところでコメントされるのがイヤ!って人に。
ょゎさんの日記のはどうやってるのかな?と思ったらプラグインじゃなかったらしい。
2006-05-06
■ [javascript] printf
なんでjavasciptにはprintfがないのかと小一時間。いや別に printfでなくてもいいけど、0詰めとか簡単にやる方法が欲しいよ。
ぐぐったら頭に"0"を付けておいて最後の2文字を切り取る なんて方法が出てきた。なるほどなぁ。
例えば %04d なら
str = ("000" + i).substr(-4);
とかか。(iは4桁以下とします)
2006-05-07
■ [junk] ついにGW最終日
,. -‐'''''""¨¨¨ヽ (.___,,,... -ァァフ| あ…ありのまま 今 起こった事を話すぜ! |i i| }! }} //| |l、{ j} /,,ィ//| 『おれはゴールデンウィークを満喫していたと i|:!ヾ、_ノ/ u {:}//ヘ 思ったらいつのまにかもう最終日』 |リ u' } ,ノ _,!V,ハ | /´fト、_{ル{,ィ'eラ , タ人 な… 何を言ってるのか わからねーと思うが /' ヾ|宀| {´,)⌒`/ |<ヽトiゝ おれも何をされたのかわからなかった ,゛ / )ヽ iLレ u' | | ヾlトハ〉 |/_/ ハ !ニ⊇ '/:} V:::::ヽ 頭がどうにかなりそうだった… // 二二二7'T'' /u' __ /:::::::/`ヽ /'´r -—一ァ‐゛T´ '"´ /::::/-‐ \ 超スピードだとか催眠術だとか / // 广¨´ /' /:::::/´‾`ヽ ⌒ヽ そんなチャチなもんじゃあ 断じてねえ ノ ' / ノ:::::`ー-、___/:::::// ヽ } _/`丶 /::::::::::::::::::::::::::‾`ー-{:::... イ もっと恐ろしいものの片鱗を味わったぜ…
2006-05-09
■ [prog] Curry-Howard Isomorphism
「命題 ⇔ 型」 という一対一の対応関係、そして 「証明 ⇔ プログラム」という一対一の対応関係のことをいいます。命題や証明というのが論理学の概念ですね("命題"というのはtrueかfalseなのかを議論できるような対象のことで…例えば "1" は命題じゃないですが "1+1=2" は命題、みたいな。 "証明"はみなさんご存じのいわゆる証明です)。型やプログラムというのがλ計算などなど、プログラミング言語の世界の用語です。この二つの一見あんまり関係なさそうな世界に見事な対応関係がある、というのがCurry-Howard 対応です。
面白かったっす。僕も論理学とλ計算は教わったけど*1 はこういう話は出てこなかったと思います。
*1 あれ、「計算と論理」で「ラムダ計算とは」という話ってやったっけ
■ [ruby][SDL] on Mac OS X
新入部員の一人が(KMCには珍しく)Mac使いで、Ruby/SDLのインストールに挑戦しているようです。 Ruby/SDLとMac OS Xというと
- http://www2s.biglobe.ne.jp/~nunokawa/wiki.cgi?page=Ruby%2FSDL+on+Mac+OS+X
- http://www.kumaryu.net/?%28Ruby%29+Ruby%2FSDL%CD%D1ruby
あたりが参考になります。
「最後の一行がうまく行かない」らしいので(make install)、手動でインストールしたらOKな気がするんだけど。
- sdl.rb, rubysdl_alias.rb を /usr/local/lib/ruby/site_ruby/1.8/ あたりに
- sdl.so を /usr/local/lib/ruby/site_ruby/1.8/i386-macosx(??) あたりに
コピーします(suが必要かも)。具体的なディレクトリ名は
ruby -e 'p $LOAD_PATH'
とかやると分かるはず。
2006-05-11
■ [vim] VIM7
via jarp
はてなの技術勉強会でも話題になっている vimの最新版が出た模様。
- Intelligent completion for C, HTML, Ruby, Python, PHP, etc.
- Tab pages, each containing multiple windows
- Internal grep; works on all platforms, searches compressed files
- Browsing remote directories, zip and tar archives
この辺がすげー気になる。特に最初のとか!
■ [prog] Programming Challenge
ICPCっぽい問題を考えてみたよ。
次のような形式で、何人かのスケジュールが与えられているとする。
2 3 4 5 (限) 5/15 x x o o 5/16 x x x o 5/17 x x x o 5/18 o x x x 5/19 x o o o
全員が「o」になっている部分の日付と時間をすべて求めなさい。
sample input
2 3 4 5 (限) 5/15 x x o o 5/16 x x x o 5/17 x x x o 5/18 o x x x 5/19 x o o o 2 3 4 5 (限) 5/15 x x o x 5/16 x x o o 5/17 x x x x 5/18 o o o o 5/19 x o o o 2 3 4 5 (限) 5/15 o x x x 5/16 o x o o 5/17 o x x o 5/18 x x o o 5/19 x x x o
出力形式は自由とします(^^;
2006-05-12
■ [web] Google Calendar
試用中。月ごとの表示ができるのはとても良い(ってカレンダーならだいたい月表示できるか)
今は紙の手帳をカレンダーに使っているので、それと比較して要望を挙げるとすれば
- 週末は別の色で表示してほしい。
- イベントの見た目が「時刻指定あり」と「なし(一日中)」の2種類しかないけど、表示色を指定できるようにしてほしい
- TODO管理に使いたいので。いまのところ、日付指定なしをTODOの代わりに使ってます。
- 「あまり重要でない項目」で全体が見づらくなるので。
人によってイベントの存在する密度が全然違うので*1、カレンダーアプリの仕様づくりは難しそうだ。
とりあえず予定を全部書いてみたら来週の予定がいっぱいすぎて泣いた。3rpw*2 とかいつ以来だよ。
2006-05-16
■ [scheme] WebScheme……"SchemeでAjaxしよう"
去年卒論で作ったWebSchemeを、研究室のページで 公開しました。
詳細は向こうのページを見てもらうとして、ここでは向こうに書けないQ&Aを…。(^^;
- これは何?
- JavaScriptで書かれたSchemeインタプリタ(に、ウェブアプリケーション向けの機能を追加したもの)です。オリジナルの処理系はこちら。
- 何ができるの?
- Schemeを用いて、ブラウザ上で動くアプリケーションを作成することができます。とりあえずデモ(数独)とか見ていただければ。Ajax (XMLHttpRequest) もできますよ!
- なぜScheme?
Schemeとか好きだからていうか湯淺研だしえーと、Schemeの高い記述力を生かしてなんたらかんたら。一級継続とか。- 継続ですか?
- 例えば関数内で「一定時間待つ(sleep)」命令は、現在の継続を保存し、一定時間後に再開することでうまく実装できたりします。…とかなんとか。
- jsSchemeとの違いって、ライブラリ追加しただけ?
基本的にそうです。が、FireFoxに対応したり、あと通信関連やJavaScriptのメソッドの実行のためにインタプリタをいじったりもしてます。jsSchemeはほぼ「素のScheme」なので、アプリケーションを作るのに便利な関数を追加した、という感じです。- 結局これはネタなの?マジなの?
- うーん、マシンの高速化次第ではこういう未来もあり得るんじゃないかな、という感じです。デモはそれなりに実用的な速度で動いているし。ブラウザ上の言語がJavaScriptしかないよりは、いろいろあった方がきっと楽しいですよね。
- どういう人をターゲットにしているのでしょうか?
- とりあえず「Schemeを勉強したい」という人にとっては、世界一お手軽な処理系かも知れません。Schemeに慣れたら、なんか面白いもん作ってみてください。
- まだ未整備なところがいろいろありそうだけど、実用化を目指すの?
- 当面、僕がやらないといけないのは実用化することよりも修論を書くことのようです。(…研究室インターンでM1の人に何かアプリケーションを作ってもらうことになったんで、もうちょっと機能の整備は行われそうです。)
■ [ruby] map派とcollect派
昨日出たばかりのるびまより。Rubyにはmapとcollectという同じ機能をもつメソッドがあるんだけど、 どっちを使うのが好きか(読みやすいと思うか)という議論。
僕はmap派です。
というのに賛成(笑)。笹田 だって collect って全然 collect っぽくないじゃん。
でもどっちかというとmapも直感的じゃない気がしてて、 「配列の中身をある関数で変換する」という意味では「convert」とかそれっぽいかなぁと思うんですが。
[1,2,3].convert{|i| i*2}
どうでしょ?
2006-05-22
■ [scheme] GaucheでHTTPサーバを書いてみる
- GaucheでCGIを書いてみたい。
- けどこのマシンはWindowsだなぁ。
- 適当にHTTPサーバを拾ってくるって手もあるけど、せっかくだからGaucheで書いてみるか。
- (GaucheでHTTPサーバを書くためのライブラリ*1を探したんだけど、見つからず)
というわけで。
- とりあえずリファレンスを眺める。www.cgiはCGIを書くためのものだから違うな。rfc.httpはHTTP「クライアント」って書いてあるから違うな。うーん、gauche.net使って頑張るのか。
- 高レベルインターフェイスにHTTP「クライアント」の例はあるな。サーバは…そうか、bindとかlistenとかするのか。実習でやったなぁ。
- socket(),bind(),listen(),accept(),read/write/send/recv(),close()らしい
- 今回は、socket,bind,listenまでmake-server-socketがやってくれそう。
というわけでhttpserv.scmできたよー。
(use gauche.net) (define sock #f) (define (server-start) (make-server-socket 10800)) (define (server-accept sock) (let ((new-sock (socket-accept sock))) (display (socket-status new-sock)) (display (socket-recv new-sock 100000)) (socket-send new-sock "HTTP/1.1 200 OK\ncontent-type: text/html;\n\nasdf,fdsa") (socket-close new-sock))) (define (main arg) (let ((server (server-start))) (server-accept server)))
gosh httpserv.scmとやって、ブラウザでhttp://localhost:10800/を開くとasdf,fdsaと表示されます。
*1 Rubyのwebrickのような
■ [scheme] GaucheでHTTP
次はCGIか。
…あれ、GaucheでRubyの「$0==__FILE__」(そのファイルをインタプリタで実行されたときは真に、requireされたときは偽に なる)ってどう書くんだろう。
まあいいや、CGIのリクエスト文字列を引数に取るようなmain関数をCGIスクリプト側で書くようにしよう。 サーバからはそのmainを呼ぶ、と。
cgitest.scm:
(use www.cgi) (define (main arg) ...
httpserv.scm:
(use gauche.net) (load "./cgitest.scm") ... (socket-send new-sock (main req_str))
■ [scheme] GaucheでHTTP(3)
いろんなデータを文字列に直すのはどうするのかな?(Rubyのto_sやinspectみたいな)
(x->string hoge) を使えばいいのか。
■ [scheme] GaucheでHTTP(4)
さて、じゃあHTTPのリクエストのパースをするか。
文字列処理だから6.10(文字列)と10.9(srfi-13)あたりを読んどけば大丈夫かな。正規表現使うなら6.11と9.16(gauche.regexp)か。 *1
うあ、caseの同値判定はeqv?か!文字列には使えないじゃん。cond使うか…。
こんな感じでいいか。
(use gauche.net) (use srfi-1) (use srfi-13) (load "./cgitest.scm") (define (parse-request request) (rxmatch-let (rxmatch #/^(GET|POST)/ (car request)) (method) (cond ((string= "GET" method) ((#/^GET \/?([^\?]+\?)?(\S+) HTTP/ (car request)) 2)) ((string= "POST" method) (last request)) (else "error: unknown method")))) ... (socket-send new-sock (main (parse-request request)))
*1 「あれ、この処理標準ライブラリにあるじゃん!」という経験はRubyで何回かやってるので、リファレンスはちゃんと読むことにしています(^^;
2006-05-26
■ [softs] Irolog
IRCでソースを貼り付けてみて、タブやスペースがちゃんと表示されないことに気づいた。
が、HTMLで空白をちゃんと表示する方法がわからない。とりあえず全角スペースに変換する(^^;;; という方法で ごまかしてみたけど、日本語でしか使えないしなぁ。
右側のmarginだけ大きいようなspanタグを生成するとか?
■ [ruby] eto.com/d - 組み込みRuby
CのプログラムからRubyのスクリプトを実行するという話。
■ [ruby] Rubyインストールガイド
http://www.ruby-lang.org/ja/install.cgi?cmd=view;name=top;navi=top
こんなページあったのか…
VC++でのコンパイル方法とかもある。
2006-05-28
■ [ruby] 統合アーカイバDLL
Rubyから圧縮ファイルの解凍をしたい場合、どうすればいいか。 unixならtarとかunzipとかを呼び出すのが良さそう。 じゃあ、windowsは?
ということで、Rubyから統合アーカイバDLLを呼び出すことを考えてみる。
試しにUNZIP32.DLL。
require 'Win32API' class ZIP def self.version Win32API.new('UNZIP32.DLL', 'UnZipGetVersion', 'v', 'i').call end def self.unpack #int WINAPI UnZip(const HWND hWnd,LPCSTR szCmdLine,LPSTR szOutput, const DWORD dwSize); func = Win32API.new('UNZIP32.DLL', 'UnZip', %w(p p p i), 'i') ret = "\0"*256 func.call(0, "z.zip", ret, 256) ret end end p ZIP.version p ZIP.unpack
超適当だが、なんか解凍できたっぽい。
ライブラリ化するとしたらどういうインターフェイスが良いだろうか。
2006-05-29
■ [scheme] GaucheでHTTP(5)
ファイルの読み込みはstring->portを使うと超簡単!
…っと思ったんだが、日本語の文字列*1が出てきたところで 読み込みが止まってしまう。read-blockでは普通に読めるのに、何でだ。
(追記:file.utilにfile->stringっていう関数があった。こっちの方がより簡単だな。)
*1 「盤面を〜」の「を」以降が読めない
□ hanyawn [わーんあんまり休んでないよう。 腹いせに平日に休んでやる。]
□ yhara [スタンド使いのしわざとしか考えられません。]