2007-10-01
■ [javascript] JSSpec
RSpecのJavascript版作ったら面白いんじゃね?と思ったんだが、既にあった。
マニュアルはこちら。
expect("Hello World").should_match(/ello/); expect([1,2,3]).should_have_at_most(4, "items");
RSpecと違って「expect」から始まるんだなぁ。ArrayやStringを拡張すればexpectを無くすこともできると思うんだけど、 どうなんだろ。
デモがかっこいい。
RSpecについては先日出たばかりの伝説の記事(笑)を参照してください。
■ [scheme] R6RS.Org
来たね!
http://www.r7rs.org/ も既に用意されている。
http://www.r8rs.org/ はまだみたい。(まぁR6RSの策定にかかった年数を考えれば…)
■ [hiki] Hiki公式サイトが…
http://hikiwiki.org/ja/ が困ったことになってるな。
- 「インストール」「ダウンロード」などのページが全て表示不能
- トップページもフッタの上にエラーが
■ [hiki] コマンドライン一発でn個目のHikiを設置するスクリプトを書いた
./init-hiki.rb hoge
とやると、
- データ保存用ディレクトリ (/home/user/data/NAME/)
- Wiki公開用ディレクトリ (/home/user/public_html/NAME/)
- SVNのリポジトリ (/home/user/svn/NAME/)
を一度に初期化してくれる。これで、思いついた瞬間にWikiが増やせる環境が整った。やったぜ(それWikiFarmでっていうツッコミは無しで)。
そもそもどうやって複数設置すんのって話は 同一サーバで複数のHikiを管理する方法(2007-08-08) を参照のこと。
#!/usr/bin/env ruby require 'optparse' require 'pathname' require 'erb' # Configuration SERVER_URL = Pathname.new("http://mono.kmc.gr.jp/") PUBLIC_HTML = "public_html" HIKI_INSTALL_PATH = "/home/yhara/bin/hiki" DRY_RUN = false def abort(msg) puts msg + " abort." #exit end def shell(cmd) puts cmd system cmd unless DRY_RUN end def make_directory(path, opt={}) if path.exist? and opt[:must_not_exist] abort "directory #{path} already exists." end unless path.directory? puts "making directory #{path}" path.mkdir unless DRY_RUN end end def make_file(path, data, perm) if path.exist? abort "file #{path} already exists." end puts "writing file #{path} with permission #{perm}" unless DRY_RUN if perm path.open("wb", perm){|f| f.write data} else path.open("wb", perm){|f| f.write data} end end end def run_erb(filename, args) template = File.read(File.join(File.dirname(__FILE__), filename)) ERB.new(template).result(binding) end if ARGV.size != 1 puts "usage: #{$0} WIKINAME" else name = ARGV.first user = ENV['USER'] home = Pathname.new("/home") make_directory(home + user + "data") make_directory(home + user + PUBLIC_HTML) make_directory(home + user + "svn") data_dir = home + user + "data" + name make_directory(data_dir, {:must_not_exist => true}) web_dir = home + user + PUBLIC_HTML + name make_directory(web_dir, {:must_not_exist => true}) svn_dir = home + user + "svn" + name make_directory(svn_dir, {:must_not_exist => true}) puts "---- init web dir ----" opts = [ { :tmpl => "hiki.cgi.erb", :args => {:hiki_dir => HIKI_INSTALL_PATH}, :path => web_dir + "hiki.cgi", :perm => 0775 }, { :tmpl => "hikiconf.rb.erb", :args => {:repos_root => home + user + "svn" + name, :data_path => home + user + "data" + name}, :path => web_dir + "hikiconf.rb" }, { :tmpl => "htaccess.erb", :args => {}, :path => web_dir + ".htaccess", }, ] opts.each do |opt| make_file(opt[:path], run_erb(opt[:tmpl], opt[:args]), opt[:perm]) end puts "---- init data dir ----" puts "access #{SERVER_URL + "~#{user}" + "#{name}/"} to init data dir" puts "(press enter if done)" $stdin.gets puts "---- init svn dir ----" shell "svnadmin create #{svn_dir}" text_dir = data_dir + 'text' shell "svn import -m 'import' #{text_dir} file://#{svn_dir}" shell "rm -ri #{text_dir}" shell "svn co file://#{svn_dir} #{text_dir}" puts "---- done. ----" end
設定とかそのへんは勘で。
2007-10-02
■ [hiki] 更新しようとしたらPermissionErrorで書きかけのデータが飛びかけたときの対処法
Hikiで記事を書いてる途中に管理メニューにログインすると、「編集」押したときと「送信」押したときでログインユーザが違うので(という理由かは知らないが) PermissionErrorになるじゃん。
んで慌てて戻るボタン押してもIEだと内容が戻ってくれないという。
しかし戻るじゃなくて進むとか再読み込みすると「内容をもう一度送信して良いですか? OK/キャンセル」になるので、OKを押す前に hiki/command.rbを以下のように書き換える。
def generate_error_page( data ) @plugin.hiki_menu(data, @cmd) @plugin.title = title( 'Error' ) data[:cgi_name] = @conf.cgi_name data[:view_title] = 'Error' require 'kconv'; data[:view_title] = @cgi["contents"].tosjis #←ここね data[:header] = @plugin.header_proc data[:frontpage] = @plugin.page_name( 'FrontPage' ) @page = Hiki::Page::new( @cgi, @conf ) @page.template = @conf.read_template( 'error' ) @page.contents = data @page.process( @plugin ) @page.out( 'status' => 'NOT_FOUND' ) end
と、h1タグの中に書きかけのテキストが突っ込まれるので(強引だなおい)htmlソースから適当にサルベージしましょう。
…本当はこんな対処療法じゃなくて、Hiki本体を修正してもらうのが正しいけど。公式ページが復活したらITSに投げてみるか。
2007-10-04
■ [scheme] SXMLのあんまり好きでないところは
属性を「@」で表現するところだ。
(p (a (@ (href "index.html") (class "english")) "-> English page"))
例えば「属性は:から始める」とかの方が、シンプルで好きだな。
(p (a (:href "index.html") (:class "english") "-> English page"))
うーん、でもこれだと変な木構造になっちゃうか。
(p (a (@ href "index.html" class "english") "-> English page"))
こんなのはどうか。
…微妙だ。
■ [ruby] $<.any? で「標準入力から1行読み捨てる」という意味になるらしい
http://jarp.does.notwork.org/diary/200710a.html#200710031
なんでこれで「入力を1行おきに出力」になるんだぜ?
yhara@meteor:~/src % cat nums.txt 1 2 3 4 5 yhara@meteor:~/src % ruby -p -e '$<.any?' < nums.txt 1 3 5
できた!ふしぎ!
えーと、$<はARGFのことで、オプション-pだから、これは
ruby -e 'while(gets) do ARGF.any?; print $_; end
と一緒だろ。$_は「最後にgetsかreadlineで読み込んだ文字列」で…。
ああそうか、ARGFのany?メソッドを呼ぶと、内部でARGF.eachが呼ばれて、で最初の一行を読み込んでyieldしたところでany?がtrueを返すから、 結果的に「getsもreadlineも使わずに1行読み捨てる」が可能になるわけか。
なるほどなあ(笑)。
■ [scheme] GaucheでHTMLを操作する
htmlpragでhtmlからsxmlに変換するのがよさげ。
んで、sxml.ssaxとか sxml.sxpathで操作する。
(use file.util) (load "./htmlprag.scm") (define sxml (html->sxml (file->string "hoge.html"))) (display (length (sxml:child-nodes sxml)))
こんな感じか。
SSAXを使うと、「あるノードが見付かったとき」などのイベントに対するコールバックを定義する形でsxmlのパーサが書ける。
sxpathを使うと、CSSセレクタみたいに特定の条件を満たすノードだけを取り出したりできる。
使用例は IBM XMLの論考: SXMLとSSAXの調査が参考になりそう。
2007-10-09
■ [ruby] RubyのスクレイピングライブラリをまとめたWiki「RubyScraping」を立ち上げました
http://mono.kmc.gr.jp/~yhara/rubyscraping/
どうぞご利用ください。
いまのところ、HpricotとMechanizeのリファレンスがメインコンテンツです。 scRUBYt!, feedalizer, scrAPIは紹介程度に。
2007-10-21
■ [scheme] 4つのマクロ
Lisp/Schemeのマクロには define-macro, defmacro, syntax-rules(define-syntax), syntax-caseの4つの系列があり、 現在のGaucheではdefine-macroとsyntax-rulesが使える。
で、[Gauche-devel-jp] Re: define-macroをdefine-syntaxに直すには? から予測したのだが、
- define-macroはLisp由来のマクロで、hygenicではないが、展開中にScheme式の評価が使える。
- defmacroはLisp由来のマクロで、hygenicであり(gensymという関数を使う)、Lisp式の評価が使える。
- syntax-rulesはScheme(R5RS)由来のマクロで、hygenicであるが、Scheme式の評価は使えない。
- syntax-caseはScheme(R6RS, srfi-93)由来のマクロで、hygenicであり、Scheme式の評価が使える。
という理解で良いのだろうか。
2007-10-24
■ [event] 関西LifeHack研究会 Vol.3
行ってきた。
プレゼンをテーマにしたLT集。皆さんそれぞれ気をつけてるポイントが違って面白かった。
あと、行くとかならずなんかオモチャがもらえるところも良いです(笑)
社会人の人が多かったけど、学生な人ももっと参加すると良いと思うんだぜ。楽しいから。
■ [idea] 全自動タイトル付け機
タイトルつけるのが面倒くさい
* とよく思います。勝手についてくれるとうれしいです
[http://d.hatena.ne.jp/jkondo/20071024/1193242082より引用]
本文から3つくらい単語を適当に抜き出してタイトルにするとか。 (この日記なら「本文、単語、タイトル」とか)文章の中から「最も重要な」3つの単語を見つけるような技術が存在したら良いのだが。 *1
*1 チャットのログを読むのにも役立ちそう
□ かずひこ [> Hiki公式サイトが… * info.dbのownerがrootになってました。 * FastCGIで動かすと、..]
□ yhara [ありがとうございます。ご苦労さまです。 次からはメールすることにします。 # webmaster@hikiwiki...]