トップ 最新 追記

Route 477



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.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

設定とかそのへんは勘で。

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

かずひこ [> Hiki公式サイトが… * info.dbのownerがrootになってました。 * FastCGIで動かすと、..]

yhara [ありがとうございます。ご苦労さまです。 次からはメールすることにします。 # webmaster@hikiwiki...]


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に直すには? から予測したのだが、

  1. define-macroはLisp由来のマクロで、hygenicではないが、展開中にScheme式の評価が使える。
  2. defmacroはLisp由来のマクロで、hygenicであり(gensymという関数を使う)、Lisp式の評価が使える。
  3. syntax-rulesはScheme(R5RS)由来のマクロで、hygenicであるが、Scheme式の評価は使えない。
  4. 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 チャットのログを読むのにも役立ちそう

[tDiary] URLにセクション名を含めたい

tDiaryでも(はてなダイアリーのように)

date=20071024p02

みたいなURL指定が許されればいいのに。

表示上は

date=20071024#p02

と同じだけど、<title>に指定したセクションのタイトルだけが入るような。

(たまに、全部のセクションタイトルが羅列されたリンクとかはてブを見るので考えてみた)