83's

Top > Archives > 2005 > September

September 06, 2005

texのレイアウト・スタイル情報を変えるスクリプト作った 03:03

普段からrdtool+rd2latexのお世話になっているんですが、 rd2latexはレイアウト情報を全く入れないので、デフォルトのスカスカしたのができあがります。

rd2latexで作ったpdfの画像

そこで、rd2latexが吐いたtexを編集してスタイルを追加していくやつが欲しいなぁと。 でもrdのためのただの使い捨てのプログラム作るのもなんか面白くなかったんで、 のちのち拡張できるような汎用性の高めなものを作ってみた。 しょうもないもんですが、アウトプットします。

( ・∀・)つ[texpref 0.1]

なんか複雑すぎて自分でも使い方わからないんで、一応説明書。。。

  • texファイルのスタイルを変更する
  • コマンドラインにオプションを指定してスタイルを変更できる(指定できるオプションは--helpで見れます)
  • ファイルに保存しておいたスタイルを適用できる
  • ファイルとオプションを同時に使える(ファイルの設定をオプションが上書きします)
  • 変更したtexデータは標準出力に吐く
  • プログラムに読み込んだスタイルを設定ファイルとして保存できる

texファイルを読み込むには-iを使います。これだけだと何にもスタイルは変更されません。

$ ruby texpref.rb -i a.tex
\documentclass{jarticle}
\begin{document}
\end{document}

-iの後にファイル名を指定しない場合、標準入力から読みます。

$ rd2 -r rd/rd2latex-lib a.rd | ruby texpref.rb -i

--で始まるオプションでスタイルを変更できます。

$ ruby texpref.rb -i a.tex --fontsize=11pt
\documentclass[11pt]{jarticle}
\begin{document}
\end{document}

圧縮ファイルに、pref.yamlという名前の設定ファイルを添付しておきました。 設定ファイルを使ってスタイルを変更するには-lで指定します。

$ ruby texpref.rb -i a.tex -l pref.yaml
\documentclass[10pt,a4paper,onecolumn]{jarticle}
\setlength{\\textwidth}{47zw}
\setlength{\\oddsidemargin}{0pt}
\setlength{\\textheight}{43\\baselineskip}
\setlength{\\evensidemargin}{0pt}
\setlength{\\topmargin}{-0.3in}
\begin{document}
\end{document}

-lのあとのファイル名を省略すると、~/.texpref.yamlを読み込みます。 使い回すスタイルはこのファイルにしておくといいです。

設定ファイルとオプションは、同時に使えます。かぶった場合、オプションのほうが優先されます。

$ ruby texpref.rb -i a.tex -l --fontsize=12pt --paper=b5paper
\documentclass[12pt,b5paper,onecolumn]{jarticle}
\setlength{\\textwidth}{47zw}
\setlength{\\oddsidemargin}{0pt}
\setlength{\\evensidemargin}{0pt}
\setlength{\\textheight}{43\\baselineskip}
\setlength{\\topmargin}{-0.3in}
\begin{document}
\end{document}

このようにしてプログラムに読み込んだ設定は、ファイルに書き出して次回以降利用できます。 書き出すファイル名は-sオプションで指定します。ちなみに形式はyamlです。 次の例では、texファイルを読み込まずに、設定ファイルとオプションから読み込んだ スタイルを保存してます。もちろん上の例に-sを使うこともできます。

$ ruby texpref.rb -l --fontsize=12pt --paper=b5paper -s pref2.yaml
$ cat pref2.yaml
---
SetlengthStyle:
  "\\topmargin": "-0.3in"
  "\\evensidemargin": 0pt
  "\\textheight": 43\baselineskip
  "\\oddsidemargin": 0pt
  "\\textwidth": 47zw
DocumentclassStyle:
  column: onecolumn
  paper: b5paper
  fontsize: 12pt
  doc_class: jarticle

ちなみにyamlをいじるのはいいけど、この項目以外を追加しても適用されないんで。

rd2latexでは脚注が{\footnote はときいん}に変換されるが、 どうやら正しくは\footnote{はときいん}のようなので この修正をする機能もつけときました。

あとはrd→pdfのシェルスクリプトに追加してやれば、 オレの生活はいくらか幸せになります。

nkf -e $1 | rd2 -r rd/rd2latex-lib | texpref.rb -i -l > $texfile

こんだけのことをするのにソースがかなり膨らんでる分、 あとは変更するパラメータをどんどんプログラムに追加していけばいい状態にはなった感じ。 「これ設定できるようにしてよ」ってのあれば言って下さい。作ってくれてもいいですが。

でも結局texがわからないと(オレもわかってませんが)スタイルを指定できないのが痛いところ。 編集はこれでいけるから、あとは設定ファイルを作るGUIがあればよさげ。 wxRuby試そうかなーと思う。やる気があれば……。

September 07, 2005

モヒカン族 16:20

はてなのキーワードが「現代用語の基礎知識2006」ってのに掲載されるらしいけど、 なんか掲載されるキーワード見てると基礎知識のわりに知らない用語が多いんですが。 半分以上知らない。 サザエさん症候群いいね。 サザエさんを見ると、「もう休みも終わりか」と憂鬱になってしまうって状態のことらしいけど、 中学までオレはそうだった。

一つ一つ見てても楽しいんですが、そのなかにちょっと前にたまに見かけたモヒカン族があった。 これ、VIPかなんかのネタかと思って調べなかったんだけど、見てみると……

こういう人がモヒカン族

(注1:モヒカン族の中にも様々なタイプがあるため、モヒカン族はこれらの要素が全て当てはまる、ということはない)

(注2:一部誤解が含まれているかもしれないが、モヒカン族の思想に倣い、躊躇なく修正して欲しい)

  • W3Cの勧告に正しく従うことが合理的であると考える(補注:これを強く主張する人たちは特に「W3C原理主義者」と呼ばれる。)
  • いわゆる「意味と見栄えの分離」を尊重する。(補注:これを強く主張する人たちは特に「CSS原理主義者」と呼ばれることがある。)
  • W3Cの勧告通りの表示をしないブラウザは非合理的だと考える
  • 「モヒカン族の解説はこちら」の「こちら」にリンクをつけるようなやり方に疑問を持つ
  • いわゆる1バイト系カタカナ・いわゆる2バイト系英数字・いわゆる機種依存文字に疑問を持つ
  • 「無断リンク禁止」という考えに疑問を持つ
  • 「教えて君」の態度に疑問を持つ
  • 会話中の言い間違いや相手の誤解は指摘するほうが良いと考える
  • 一般人から「理系的」と呼ばれやすい

あれ? これはまんまオレのことじゃないか。

1バイト系カタカナってのは半角カタカナですか? それはよくコピペして使いますね(nicolatterは半角打てない)。 ワロタとワロタでは、なんか笑い方が違うんだよね。

勝ったー日本が勝ったー 23:30

      ┌─┐  ┌─┐
      │●│  │●│
      └─┤  └─┤
      _   ∩   _  ∩ ニッポン!
    ( ゜∀゜)彡  ( ゜∀゜)彡  ニッポン!
 ┌─┬⊂彡┌─┬⊂彡
 |●|    |●|
 └─┘    └─┘

前半良くなかったけど、後半は相手のいい動きが少なくなって良かったですね。 5得点なんて、滅多に見れないすからね。

ホンジュラスもうまかったな……。

September 09, 2005

10時間以上寝ると… 20:13

死にやすい((((゜Д゜;))))ガタガタブルブル テレビでやってました。

夜更しした時は半日寝てることも……。今日は6時くらいから16時くらいまで寝てた。

7時間がベストで、睡眠時間4時間以下は7時間の1.6倍、10時間以上は7時間の1.8倍の死亡率とのこと。 気をつけよう……。

September 10, 2005

S式→Array, Array→S式 18:24

茶筌まわりの設定ファイルがことごとくS式だかなんだかっていうLispな書式なので、 プログラムからどうにもいじりにくい。てことで、S式とRubyの配列を変換するモジュールを作ってみた。 まーもっといいのが探せばありそうだけど、プログラミングしたかっただけだから再発明も気にしない。 (「S式」で名前はあってる?)

( ・∀・)つ[s-expression.rb]

()を[]に変えるだけなんでしょぼしょぼです。

まー例えば茶筌の活用形定義ファイルcforms.chaの初めの2つを抜き出した以下のようなa.chaファイルが あったとすると、

(カ変・クル
    (   ; (語幹          *       *     )
     (基本形        くる    クル  )
     (未然形        こ      コ    )
     (未然ウ接続    こよ    コヨ  )
     (連用形        き      キ    )
     (仮定形        くれ    クレ  )
     (命令yo      こよ    コヨ  )
     (命令i        こい    コイ  )
     (仮定縮約1    くりゃ  クリャ)
     (体言接続特殊  くん    クン  )
     (体言接続特殊2  く    ク    ))    ; for Dtag <5 October 1999>
)

(カ変・来ル
    (   ; (語幹          *       *     )
     (基本形        来る    クル  )
     (未然形        来      コ    )
     (未然ウ接続    来よ    コヨ  )
     (連用形        来      キ    )
     (仮定形        来れ    クレ  )
     (命令yo      来よ    コヨ  )
     (命令i        来い    コイ  )
     (仮定縮約1    来りゃ  クリャ)
     (体言接続特殊  来ん    クン  )
     (体言接続特殊2  来    ク    ))    ; for Dtag <5 October 1999>
)

SExpression.loadを使えばArrayにして返します。 ちなみに日本語が入ってる場合は文字コード指定しないと動きません、きっと。

#test1.rb
require 'pp'
require 's-expression'
$KCODE = 'euc'

a = SExpression.load(ARGF.read)
pp a
$ ruby test1.rb a.cha
[["カ変・クル",
  [["基本形", "くる", "クル"],
   ["未然形", "こ", "コ"],
   ["未然ウ接続", "こよ", "コヨ"],
   ["連用形", "き", "キ"],
   ["仮定形", "くれ", "クレ"],
   ["命令yo", "こよ", "コヨ"],
   ["命令i", "こい", "コイ"],
   ["仮定縮約1", "くりゃ", "クリャ"],
   ["体言接続特殊", "くん", "クン"],
   ["体言接続特殊2", "く", "ク"]]],
 ["カ変・来ル",
  [["基本形", "来る", "クル"],
   ["未然形", "来", "コ"],
   ["未然ウ接続", "来よ", "コヨ"],
   ["連用形", "来", "キ"],
   ["仮定形", "来れ", "クレ"],
   ["命令yo", "来よ", "コヨ"],
   ["命令i", "来い", "コイ"],
   ["仮定縮約1", "来りゃ", "クリャ"],
   ["体言接続特殊", "来ん", "クン"],
   ["体言接続特殊2", "来", "ク"]]]]

このように、複数の式を1つの配列にして返します。今のところすべて文字列として格納します。

SExpression.loadfileを使えば直接ファイルを読めます。

a = SExpression.load_file('a.cha') #=>上の出力例と同じ

この配列をS式に戻すには、SExpression.to_seを使います。

#test2.rb
require 'pp'
require 's-expression'
$KCODE = 'euc'

a = SExpression.load(ARGF.read)
puts SExpression.to_se(a)
$ ruby test2.rb a.cha
(カ変・クル
  (
      (基本形 くる クル)
      (未然形 こ コ)
      (未然ウ接続 こよ コヨ)
      (連用形 き キ)
      (仮定形 くれ クレ)
      (命令yo こよ コヨ)
      (命令i こい コイ)
      (仮定縮約1 くりゃ クリャ)
      (体言接続特殊 くん クン)
      (体言接続特殊2 く ク)))
(カ変・来ル
  (
      (基本形 来る クル)
      (未然形 来 コ)
      (未然ウ接続 来よ コヨ)
      (連用形 来 キ)
      (仮定形 来れ クレ)
      (命令yo 来よ コヨ)
      (命令i 来い コイ)
      (仮定縮約1 来りゃ クリャ)
      (体言接続特殊 来ん クン)
      (体言接続特殊2 来 ク)))

SExpression.to_seの第2引数にtrueを渡すと、整形をしないで1行で返します。 なんでこんな機能をつけたんだろう……。

SExpression.to_se(a, true)
$ ruby test2.rb a.cha
(カ変・クル ((基本形 くる クル) (未然形 こ コ) (未然ウ接続 こよ コヨ) (連用形 き キ) (仮定形 くれ クレ) (命令yo こよ コヨ) (命令i こい コイ) (仮定縮約1 くりゃ クリャ) (体言接続特殊 くん クン) (体言接続特殊2 く ク)))(カ変・来ル ((基本形 来る クル) (未然形 来 コ) (未然ウ接続 来よ コヨ) (連用形 来 キ) (仮定形 来れ クレ) (命令yo 来よ コヨ) (命令i 来い コイ) (仮定縮約1 来りゃ クリャ) (体言接続特殊 来ん クン) (体言接続特殊2 来 ク)))

このモジュールを茶筌の設定ファイル以外で用いる場合の注意点は、 SExpression.load, SExpression.load_fileの入力は 1つ以上の式を想定していて、出力は各式が1次元に並んだ配列であることです。 SExpression.to_seはその逆です。

SExpression.load('(a b c)') #=> [["a", "b", "c"]]
SExpression.load('(a b c)(1 2 3)') #=> [["a", "b", "c"], ["1", "2", "3"]]
SExpression.to_se([["a", "b", "c"]], true) #=> "(a b c)"
SExpression.to_se([["a", "b", "c"], [1, 2, 3]], true) #=> "(a b c)(1 2 3)"

まとめると、["a", "b", "c"] <=> (a b c)の変換ではない点に注意です。

処理の必要上SExpression.array_to_se(引数はto_seと同じ)という関数があって、 一応これを使うと["a", "b", "c"] => (a b c)はできます。

SExpression.array_to_se(["a", "b", "c"], true) #=> "(a b c)"

バグはきっとあるはずw

September 11, 2005

MeCabの辞書作成補助 18:19

形態素解析器MeCabの 辞書を自分で作る場合、動詞や形容詞など活用する品詞については 自分で活用を書かなければいけないんですが、 激しく面倒なのでこれを自動化するやつを作ってみた。

( ・∀・)つ[katsuyou.tar.gz]

このプログラムを使うには、別途ローマ字ひらがな変換ライブラリ suikyoと、 茶筌に(多分)付属しているcforms.chaが必要です。 まー基本的にはcforms.chaでなくても、同じフォーマットで、かつ活用形の中に「基本形」が 入っていれば動くはずです。 あとRubyも必須です。

katsuyou.rbは、入力されたMeCabの辞書の中で活用できるものがあるとそれを活用展開します。 だからあらかじめ1つだけ書いておきます。

ちなみにフォーマットはこう。

表層形,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音

例を示します。こんな感じで作っておきます。

ワロス,3206,感動詞,*,*,*,*,*,ワロス,ワロス,ワロス
ナウい,3206,形容詞,自立,*,*,形容詞・アウオ段,*,ナウい,ナウイ,ナウイ
あああ,3206,動詞,自立,*,*,一段,*,ageる,アゲル,アゲル

この中で、展開されるのは2行目と3行目です。展開には表層形と活用形の情報は使わないので、 それ以外をしっかり書いておきます(展開に大事なのは活用型と原形・読み・発音です)。

品詞や活用型については、茶筌のgrammar.chaとcforms.chaに定義してある ものを使います。ipadic-ja.pdfが参考になります。これはlocateしたら出てきたんで、 配布元のリンクは知らないです。茶筌のとこにないかな?  というか、MeCabも茶筌と同じ品詞・活用型で良かったのかね……? もし違ったら( ゜д゜)……

1つ目の引数にcforms.chaを、2つ目に展開したい辞書を渡します。

$ ruby katsuyou.rb cforms.cha test.dic
ワロス,3206,感動詞,*,*,*,*,*,ワロス,ワロス,ワロス
ナウかっ,3206,形容詞,自立,*,*,形容詞・アウオ段,連用タ接続,ナウい,ナウカッ,ナウカッ
ナウい,3206,形容詞,自立,*,*,形容詞・アウオ段,基本形,ナウい,ナウイ,ナウイ
ナウかろ,3206,形容詞,自立,*,*,形容詞・アウオ段,未然ウ接続,ナウい,ナウカロ,ナウカロ
ナウし,3206,形容詞,自立,*,*,形容詞・アウオ段,文語基本形,ナウい,ナウシ,ナウシ
ナウけりゃ,3206,形容詞,自立,*,*,形容詞・アウオ段,仮定縮約1,ナウい,ナウケリャ,ナウケリャ
ナウきゃ,3206,形容詞,自立,*,*,形容詞・アウオ段,仮定縮約2,ナウい,ナウキャ,ナウキャ
ナウき,3206,形容詞,自立,*,*,形容詞・アウオ段,体言接続,ナウい,ナウキ,ナウキ
ナウぅ,3206,形容詞,自立,*,*,形容詞・アウオ段,連用ゴザイ接続,ナウい,ナウゥ,ナウー
ナウ,3206,形容詞,自立,*,*,形容詞・アウオ段,ガル接続,ナウい,ナウ,ナウ
ナウかれ,3206,形容詞,自立,*,*,形容詞・アウオ段,命令e,ナウい,ナウカレ,ナウカレ
ナウから,3206,形容詞,自立,*,*,形容詞・アウオ段,未然ヌ接続,ナウい,ナウカラ,ナウカラ
ナウくっ,3206,形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,ナウい,ナウクッ,ナウクッ
ナウけれ,3206,形容詞,自立,*,*,形容詞・アウオ段,仮定形,ナウい,ナウケレ,ナウケレ
ageろ,3206,動詞,自立,*,*,一段,命令ro,ageる,アゲロ,アゲロ
age,3206,動詞,自立,*,*,一段,連用形,ageる,アゲ,アゲ
ageる,3206,動詞,自立,*,*,一段,基本形,ageる,アゲル,アゲル
ageよ,3206,動詞,自立,*,*,一段,未然ウ接続,ageる,アゲヨ,アゲヨ
ageりゃ,3206,動詞,自立,*,*,一段,仮定縮約1,ageる,アゲリャ,アゲリャ
ageん,3206,動詞,自立,*,*,一段,体言接続特殊,ageる,アゲン,アゲン
ageよ,3206,動詞,自立,*,*,一段,命令yo,ageる,アゲヨ,アゲヨ
age,3206,動詞,自立,*,*,一段,未然形,ageる,アゲ,アゲ
ageれ,3206,動詞,自立,*,*,一段,仮定形,ageる,アゲレ,アゲレ

原形の語尾がカタカナの場合はカタカナで活用するようにしたんだけど、どうなんだろ。

ライブラリとして使う場合は、dic-entry.rb内のDicEntryクラスと、katsuyou.rbのKatsuyouクラスの コンストラクタ、katsuyouメソッドの使い方を見ておくと使えると思います。

ChangeLog

2005-09-18

katsuyou.rbに2ちゃんねる辞書を作るためのコードが混じり込んでて、(no such file 'convert_table'みたいな) エラーになってました。修正しますた。

MeCab用、2ちゃんねる辞書 18:31

かな漢字変換用の2ちゃんねる辞書を 元に、MeCab用の辞書を作った。

( ・∀・)つ[2ch.dic.2005-09-11-22-47]

辞書の追加の仕方はMeCabのサイトの辞書の追加方法のページを 見て下さい。

なんかあんまり正確でないんで、動詞・形容詞・接続詞の中で変だったやつは消しました。 それでもまだまだ変な定義されてる語が多い……。 あとコストが今んとこ3206で一律なんだけど、どうなんだろう。

$ mecab
こんなスレageるなよ厨房
こんな  連体詞,*,*,*,*,*,こんな,コンナ,コンナ
スレ    名詞,一般,*,*,*,*,スレ,スレ,スレ
ageる   動詞,自立,*,*,一段,基本形,ageる,アゲル,アゲル
な      助詞,終助詞,*,*,*,*,な,ナ,ナ
よ      助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
厨房    名詞,一般,*,*,*,*,厨房,チュウボう,チュウボう
EOS
おまえキショいな……
おまえ  名詞,代名詞,一般,*,*,*,おまえ,オマエ,オマエ
キショい        形容詞,自立,*,*,形容詞・アウオ段,基本形,キショい,キショイ,キショイ
な      助詞,終助詞,*,*,*,*,な,ナ,ナ
…      記号,一般,*,*,*,*,…,…,…
…      記号,一般,*,*,*,*,…,…,…
EOS
DQNは氏ね
DQN  名詞,一般,*,*,*,*,DQN,ドキュン,ドキュン
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
氏ね    動詞,自立,*,*,五段・ナ行,命令e,氏ぬ,シネ,シネ
EOS

いいかもw あとは追加ですねw

ChangeLog

2ch.dic.2005-09-11-22-47

動詞の原形に語尾がないものがあったので修正 :2ch.dic.2005-09-11-17-32 公開

September 15, 2005

ruby-gtkmozembedインストール覚書… 02:40

ruby-gtkmozembedを Vine 3.1にインストールしようとしたら、mkmf-gnome2.rbがrequireしているpkg-config.rbがなくて止まった。 工工エエ(´Д`)エエ工工

これ、調べるとRuby/GLibに付属しているはずなんですが、なぜか無い。 てことで、ruby-gtk2-0.13.0.tar.gzを 落してきて、ruby-gtk2-0.13.0/glib/src/lib/pkg-config.rbを/usr/lib/ruby/1.8/にコピーでいけた。

apt-get install ruby-gnome2-develも忘れずに。

APIのリファレンスは英語しかないのか……。とりあえずサンプルを 動かしてみる。

$ ruby moz.rb
moz.rb:4: undefined method `resize' for "Lean & mean browser":String (NoMethodError)

あれ?

w = Gtk::Window.new.title = "Lean & mean browser"

( ゜д゜)…

w = Gtk::Window.new
w.title = "Lean & mean browser"

に変更。

ruby-gtkmozembedのサンプル実行画面

キタ━━━━━━(゜∀゜)━━━━━━ !!!!!

まーいつものように続かない気もするけど、ちょっと遊んでみますわ。

September 20, 2005

Rubyで2ちゃんねる専用ブラウザ作るぜ 02:08

Ruby-GNOME2で作ろうと思いますっていうか、もうやり始めてますw

GTKアプリケーションにMozillaを埋め込むことができるgtkmozembedを見た時にピコーンときて、 普段使ってるおちゅ〜しゃとはちょっと違う2ちゃんブラウザを思いついたので作ることにした。

といっても、実用レベルまでがんばるかはわからない。 GUIの勉強ができて、あと楽しければいい。楽しくなくなったら終了。

今こんな感じ。

開発し始めた2ちゃんブラウザの画面

画面はスレ一覧表示(上)とスレの表示(下)です。 よくある2ちゃんブラウザのように縦に並べてみた。 まだこの2つはつなげてないので、 それぞれのテスト用プログラムで別々に動かしてます。 ちなみにローカルに保存したファイルを表示してるだけです。

ネットに繋がるようになるとまた新しく課題が出てくると思うけど (例えばローカルと違ってスレが更新される。これへの対応はローカルだけで簡単にテストできそうにない)、 その前に当分は個々の部品ごとに作り込みます。1つにくっつける時が楽しみ……(´ー`)

September 23, 2005

Rubyで2ちゃんねる専用ブラウザ作るぜ 2get 〜画面分割 02:10

実況の住人chamiにアイデアをもらったこともあるし、どんどんアウトプットしていきますよ。

いやいや、やっぱり人(と板)によってスレの見方が異なるなーと。 chamiは新しいテレビの見方に はまっているようで。 流れの速い実況ならではの事情を教えてもらいました。

  • 同時に開くスレは多くないから、タブの切替えはめんどい
  • 自動で更新してほしい
  • 次スレの自動検出が欲しい(次スレを探して切替えるのがめんどい)

オレは複数同時に表示ってのには必要性を感じていなかったんですが、2つのスレを 行ったり来たりって場合には結構需要があるのかもしれない。

また、同じスレを画面分割することで、一方では新しいレスを追いながら、もう一方で過去のレスを読むっていう 使い方も考えられる。てことで採用。

画面分割

で、実装としてスレそれぞれを子ウィンドウとしたMDIが考えられるけど、絶対必要な 自動整列で問題が出てくる。てのは、たくさんスレ開いてるときに、全部のウィンドウを 整列させるわけにはいかない(画面が足りない)わけです。せいぜい2つか3つのウィンドウしか 画面には並べられない。じゃーその2つか3つをどう選ぶかということになって、 ユーザに強いる操作が難しくなってしまう。

だから右・左か上・下の2ペインの分割だけにしてしまって、ユーザには右と左(上と下) どちらに開くかを右クリック・左クリックで選べるようにするつもり。

とりあえずこのあと3、4時間は作ります。さっきまでちょっと寝てたので。 今作ってるのはいわゆるタブに当たるところ。

GTKでのタブwidgetであるGtk::Notebookがタブを複数行にしてくれないみたい(わかってないだけかも) こともあって、タブにはしません。イメージとしてはパネルみたいな感じ。 おちゅーしゃはタブが画面に収まりきらなくなるとタブを左右にスクロールするかコンボボックスから スレを選ぶってことになるけど、これは個人的に面倒なので。

大体次の画像のような感じを考えてます。パネルは板の区別なく、開いてるものを一覧にします。 ただ、ここはあんまりイメージが決まってない。今のところGtk::Tableで3か4列で 並べようと思ってるけど、いいのか悪いのか。 とりあえず板の間の移動をなくすのが設計方針になってます。

パネルとスレ

September 24, 2005

Rubyで2ちゃんねる専用ブラウザ作るぜ 3ボマスター 〜HTTPクライアント 00:08

今日はHTTPクライアントのところを1日考えてた。 とりあえずスレッド使うのは決定だったんだけど、スレッドってなかなか今までまともに使う場面なかったんだよね。 前にヌルポゲーム作って以来なので、実に4カ月ぶりですか。 ただでさえオブジェクト指向がまともにできてるか疑わしいところに、 スレッドまで出てきたんで設計に苦労しましたよ。

まー多分Worker Threadパターンになる。正解だといいんだけど。 Client threadとしてメインとスレ自動更新の2つ、 Worker threadとしてHTTPアクセスと状態更新を行なういくつかのスレッドを用意し、 時間のかかるHTTPアクセスでユーザへのレスポンスがもたらないようにします。 やーデザインパターンの本が手元にないとなんもできないすよ。まだまだヒヨッコだ……しょぼーん。

で、あとは2ちゃんねるへのアクセス。これについては と〜く2ちゃんねるが 大変参考になりました。もちろんmonazilla(wも。

HTTPクライアントがアクセスするのは次の3つです。

  • 板へのリンク集であるbbsmenu.html
  • スレの一覧であるsubject.txt
  • スレのデータである*.dat

まー今はLRの表示とかは考えないことに。あ、書き込み忘れてた。まーこれもあと。

サーバとネットワークにやさしいソフトにするために必要な機能がこれ。

  • gzip転送への対応
  • If-Modified-Sinceヘッダを使ってキャッシュが使える場合はキャッシュを使う
  • 更新では差分だけをもらうようにする

gzip使うと速い……感動した。ただ、標準添付でないruby-zlibライブラリをインストールしないと いけない。まー、VineのRubyが1.8.1になってるせいですでにUTF-8の対応のためにuconvをインストール しなきゃならないので、もう追加パッケージの1つや2つは気にしません。zlibは標準で入ってるみたい。 でもオレのPCはlocateしてもzlib.soが出てこない……(インストールしたやつはまだlocateのDBに載ってない)。 Ruby-GNOMEでも変な挙動があるし……オレの環境だけ。なんなんだろう。 誰かVine用にRuby 1.8.3 or 1.8.2のrpm作ってくれませんか?

しかし差分だけ取得できるのは目から鱗だった。レジュームのためにあるみたい、これ。 いや知らなかった。

追記[2005-09-24 04:09]

スレの更新(新しいレスの取得)のときに、gzipで差分を取得してもそれを展開できないことにやっと気がついた。 前回とファイルサイズが変わっているので、前回取得したgzipデータと結合してもダメ、と。 あってる?

subject.txtは迷うことなくgzipで全部取得だけど、 datファイルの取得については、

  • gzipで全体を取得
  • 圧縮なしの差分GETで取得

の2種類が方法としてあることになります。マンドクセ('A`)

場面場面でどちらにするかは、起きてから考えることにします……。もうねむぃ…。 とりあえずTeruサンクス。

September 26, 2005

Rubyで2ちゃんねる専用ブラウザ作るぜ 4様 〜HTTPクライアントのアクセス方法 17:58

gzip圧縮転送でファイル全部をGETするか、圧縮無しで差分をGETするかの2通りあって悩んでたんですが、 とりあえず以下のように決定。

自動更新チェック

開いているスレの更新をHEADメソッドでチェック。

以前開いたスレを更新する時

更新があるなら差分をGET。 gzipによるdatファイルの圧縮率は0.30〜0.35くらいだった。 まーサンプル少ないんで(5つ)確実ではないし、スレの内容によって変わるはずだが。 すると差分が全体の30〜35%より小さいなら差分GET、でかいならgzipで全部GETがよい、と。 この辺を閾値にして切替えようかな。とりあえず問題がなければそんな感じでいく。

新しくスレを開く時

gzipでGET。

bbsmenu.htmlの更新

gzipでGET。If-Modified-Sinceヘッダを付加。

subject.txtの更新

gzipでGET。これって頻繁に変わるファイルなので、If-Modified-Sinceは無し。 これつけると比較とか更新時間の保持のための処理の方が大きくなりそうな予感。 まだわかんない。

アクセス方法が決まっただけです……。そろそろ全体的な構造を設計し始めないとなぁ。

September 27, 2005

DebianをQEMUで 21:47

研究室のWindows機にQEMU入れて、Debian 3.1の最小イメージというやつをインストールしました。

coLinuxがよかったんだけど、動かないどころかブルースクリーンになってWinごと死ぬ。 2カ月前くらいにも挑戦してたんだけど、もう完璧にあきらめました。

QEMUも前に試してるんだけど、Win用のQEMU 0.7.0でやったらどこかで失敗した。 今回QEMU on Windowsという ページで配られている0.7.2を使ったんですが、今度は成功しますた。

恐ろしいことにこの最小イメージってのはほんと最小って感じで、 ほとんどはDebianのインストール後にaptで入れないといけないみたい。 だけどそのaptがたびたびダウンロードでタイムアウトするんだけど、なにこれ?

QEMUに原因があるのか、Debianにあるのか、ただのアクセス制限なのか……。 状況が複雑すぎてわけわからんよー。 おかげでまったくインストールがはかどらないすよ。数MByteごとにプツプツ止まってくれる。 まだGUIのグの字も見えない。

目標はRuby-GNOME2が動く環境にすることです。そうしないと学校来る気しない……。 あ、でも動いても重かったら意味ねぇー。学校こねー。

September 28, 2005

GNOME on Debian on QEMU on Windowsキタコレ! 00:19

やっと動いたよー。QEMU上のDebian Gnome

Linuxな生活さんやその他のサイトの情報がなかったら、 無力な俺はここまでこれなかったです。サイトの著者さんとネットのアウトプット文化に感謝!

今のところ文字化けしてるけど気にしない。そんなことよりGNOME立ちあがるのが遅い。 相当重いんだろうか。Vineと比べていいものかわからないけど、 800MHzのノートパソコンより明らかに重い。これはきついかも。 やっぱこの最新日立パソコンをもってしてもダメだったか……。

あとはWindowMakerのような軽いやつで試して、それでも重いようなら Ruby-GNOMEは研究室の余ったLinuxサーバにコソーリVNCで入って動かすことにしようかな。 できるよね? それで。 と言ってもVNCってやったことも見たこともないから、どのみち1度は試してみたいですね。 パフォーマンスはどんなもんなんだろうか気になる。

Debianはまーコンソールだけにしておいて、そこでRubyとwebサーバくらいが なんとなく動けば、研究の開発環境として使うってのもいいかも。 もうCygwinにつきあうのは疲れた。

にしても、X WindowとかまったくわかってないのがDebianのセッティングでモロバレ(誰に)だったよ。 どっかいい解説ページはないものか。

September 29, 2005

Rubyで2ちゃんねる専用ブラウザ作るぜ (゜Д゜)5ルァ! 〜板の一覧 02:15

2chへのアクセスモジュールと並列処理のためのスレッドの仕組みが完成したので、 今度作るのはリストです。

リストというのは、実際には次にあげるものをタブでまとめたものです。

  • 板一覧(1つ)
  • 特定の板のスレ一覧(複数、開いている分だけ)
  • 履歴(1つ)
  • お気に入りに登録したスレ(1つ)
  • ヒ・ミ・ツ( ^ー゜)b(1つ)

まーつまり、大多数の2chブラウザと違って板の一覧とスレの一覧は同じペインに来ます。 これは、オレの場合見たい板を開いたら板の一覧には全く用がなくなるという経験からそうしました。 このブラウザでは前回開いた板のタブは次回の起動時にも自動で開くようにするつもりなので、 オレみたいなネラーにとって板一覧が必要なのは初めだけってことになります。

まーネタバレはこのくらいで。今日作ったのは、その板一覧のところです。

板一覧

検索用のテキストエリアが上にあって、どっかで見たようなかたちをしてますw 「X」ってのはタブを閉じるボタン、「R」はタブの内容をネットから再読み込みするボタンです (まだ機能してない)。

アルファベットの大文字・子文字は区別しません。画像では子文字で「pc」と打ってます。 PCニュース板は2つあるんだね……。

この板の検索ってのは結構オレ的に欲しかった機能で、ねらーになりたての頃は行きたい板が どのカテゴリにあるのかわからなくて(覚えてなくて)探し回らなければならなかったんで、 それを改善したいわけです。最近はVIPがよく話題になるけど、どのカテゴリにあるか知ってます?

で、この検索ですが、残念ながらインクリメンタルサーチじゃないです。Enterキーを押さないといけないので、 それを知らない人はちょっとストレスがたまりそうなインタフェース……なんとかしないと。

もちろん本当はインクリメンタルサーチにしたいんだけど、テキストエリアの中の文字が変わったことを知らせる シグナルがわからない。 個人的にはinsert-at-cursorが そうかなと思うんだけど、APIリファレンスにDoesn't this work?と 書いてあるように、動いてないみたい。とりあえず文字を変更してもこれはemitされてない。 どうしたらいいんだろう……。またスレッドでも動かすかな?ww

話変わるけど、Rubyによる2chブラウザはオレの知っているものでは goRuaC.i.があります。 ただ、開発が終わっているような感じ。さみしい。