
どう書く?orgというサイトが面白いです。
出されたお題についてプログラミング言語ごとの実装方法を投稿しあうというサービスなのですが、その裏にある思想が素敵。
運営者の方のブログにはその本来の目的が書かれています。
西尾泰和のブログ @ Cybozu Labs: 「どう書く?org」(ベータ版)を公開しました
どう書くorgは今まで「出されたお題をいかに解くか競い合う、プログラマのためのコロシアム」と名乗っていました。しかし「プログラマのためのコロシアム」なのは手段であって目的ではありません。どう書くorgの目的は「マルチリンガル・クックブック」を自然発生させることなのです。
と、いうことで、実際にどう書く?orgにはタグや評価システムなど、これを支援するための機能が備わっています。(UIが貧弱なのとレスポンスが悪いところだけはちょっと残念ですが)
今回はこの「どう書く?org」に関するちょっとしたRubyのスクリプトを紹介。
お題ごとファイル一括作成スクリプト(Ruby)
どう書く?orgのお題は既に100個近くが登録されており、手元に一つ一つファイルを作っていくのは面倒そうなので、お題のタイトルをファイル名としてまとめて空ファイルを作るスクリプトを書いてみました。
本当はお題の本文も取ってこようと思っていたんですが、サーバに負荷をかけても申し訳ないのでお題の一覧ページからタイトルとURLだけを取得しています。
以下、よろしければ使い方の分かる方だけ自己責任でお使いください。(改変・再配布などご自由にどうぞ)
require "mechanize"
require "nkf"
$KCODE = "s"
agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 6'
page = agent.get('http://ja.doukaku.org/challenge/').root
target = page.search("/html/body//div[@id=\"content\"]/ul[@class=\"topic_list\"]/li/a")
challenge_list = []
class String
def sjis; NKF.nkf("-s -xm0", self); end
end
puts "どう書く.orgからお題を取得します..."
challenge_num = target.length
target.each do |item|
challenge_list << [challenge_num, item.innerText.sjis, item.to_s.slice(/href="(.+?)"/, 1)]
challenge_num -= 1
end
challenge_list.each do |num, title, url|
file_name = sprintf("%03d", num) + "_" + title.gsub(/[\\:*?"<>|\/]/, "_") + ".rb"
print " - " + file_name + "..."
File.open(file_name, "w") { |file|
file.puts "\#" + num.to_s + "_" + title
file.puts "\#" + url
file.puts ""
file.puts ""
file.puts ""
}
print "done\n"
end
puts challenge_list.size.to_s + "個のファイルを作成しました。"
一応注意点だけちょこっと書いておきます。
- MechanizeとNKFが必要です
- このままだとWindows向けです
- スクリプトを実行したディレクトリ内にファイルが作成されます
- Windowsでファイル名に使用できない文字は「_」に置き換えられます
- 同名のファイルが存在すると上書きされます
本スクリプトの実行によって何らかの問題が発生しても管理人は責任を負えませんのであしからず。
VimからURLをブラウザで開く
作成されたファイルは2行目にお題のURLが入ります。
クリッカブルURLに対応したテキストエディタなどをお使いであれば問題ないと思いますが、Vimであれば以下のような設定でカレント行のURLをブラウザで開けます。
"wでURLを開く
let $PATH = $PATH . ‘;C:\Program Files\Mozilla Firefox’
“=== evoke a web browser
function! Browser()
let line0 = getline(”.”)
let line = matchstr(line0, “http[^ ]*”)
:if line==”"
let line = matchstr(line0, “ftp[^ ]*”)
:endif
:if line==”"
let line = matchstr(line0, “file[^ ]*”)
:endif
exec ‘:silent !firefox.exe ‘ . “\”" . line . “\”"
endfunction
map <Leader>w :call Browser()<CR>
どう書く?orgは本当に素晴らしいサービスだと思います。多くの参加者が集まることによって、コンテンツの精度もより高まることでしょう。
私のようなプログラミング初心者の投稿はどう頑張ってもノイズにしかならないかもしれませんが、そのあたりは集合知の自然淘汰に任せます。


Comments»
no comments yet