83's

Top > Archives > 2005 > October

October 02, 2005

Rubyで2ちゃんねる専用ブラウザ作るぜ 6 〜$ruby -d 23:46

今日はこれにはまった……スレッドと例外。

あるスレッドで例外が発生し、そのスレッド内で rescue で捕捉されなかっ た場合、 通常はそのスレッドだけがなにも警告なしに終了されます。

requireのし忘れで、スレッドが途中NameErrorか何かを投げて死んでたんだけど、 リファレンスにあるように警告なしに死んでしまうので死んでたことに気づかなかった……。 どっかでループしてんのかと思ったよ。

requireのし忘れなんてのは普段エラー表示に頼ってるんで、モロはまりましたw

rubyに-dオプションをつけると、スレッドの例外も表示するとのこと。 これからは忘れないようにしよう……。

そういえばPerlでは警告レベルをあげるためにuse strict;と-wをつけてたけど、 Rubyだと基本的に何をつけておけばいいんだろう。 なんだか-vやら-wやら-W[lebel]やら-dやら。ヽ(`Д´)ノ ウワァァァン!

テスト。

#test.rb
p $DEBUG
p $VERBOSE
[yz@localhost test]$ ruby test.rb
false
false
[yz@localhost test]$ ruby -d test.rb
true
true
[yz@localhost test]$ ruby -v test.rb
ruby 1.8.2 (2004-11-03) [i386-linux]
false
true
[yz@localhost test]$ ruby -w test.rb
false
true
[yz@localhost test]$ ruby -W test.rb
false
true
[yz@localhost test]$ ruby -W0 test.rb
false
nil
[yz@localhost test]$ ruby -W1 test.rb
false
false
[yz@localhost test]$ ruby -W2 test.rb
false
true

-dつけとけば両方trueになっていいですかね。

とりあえずスレッドの問題が解決したのでスレを選択・表示できるようになりました。

2ch browser

ただ、今度は大きなスレ読み込むと止まるというまためんどくさそうなバグが。 なんでメインスレッドで読み込んでないのにメインスレッドの応答がなくなるのか……。 datファイルのパースあたりで失敗してるだけだといいんだけど。

October 03, 2005

Rubyで2ちゃんねる専用ブラウザ作るぜ 7 〜gtkmozembed 03:45

前回のエントリで

ただ、今度は大きなスレ読み込むと止まるというまためんどくさそうなバグが。 なんでメインスレッドで読み込んでないのにメインスレッドの応答がなくなるのか……。

と書いたわけだけど、原因がわかりました。

今作っている2ちゃんねるブラウザではruby-gtkmozembedってのを使ってるんですが、 もとを辿るとGtkMozEmbedという GTKにMozillaを埋め込んだやつみたいで、つまりMozillaなんです。 スレのレンダリングをさぼってMozillaに任せてしまうわけです。 (その代わり、大抵の人が知ってるCSSを使って自由に見栄えを変えられるっていう利点があります)

で、スレのデータ(datファイル)をGETした後HTML化してMozillaに流し込むわけなんですが、 そこのメソッド(render_data, append_data)がネックになってました。

render_dataは中でappend_dataをやってると思うのでappend_dataに話をしぼって いきますが、これ、1度に大きなサイズのデータを送ると、そこでフリーズしちゃうみたいです (Vine Linux 3.2, Ruby 1.8.1, ruby-gnome2 0.13.0, ruby-gtkmozembed 0.3.1)。 まーここんとこオレの環境は調子悪いんで、ほかの人は再現しないかもしれないけれど。

サイズ(byte)
55983
47450
59636
60194
64892
65707×
68036×

このデータは、手元にあったテスト用のスレのレスの数を調節して最終サイズを変えていった結果です。 65KByte付近でブラウザが応答しなくなりました。

しょうがないのでHTMLを区切ってそれぞれ順にappend_dataを繰り返してやったらうまくいきました。 どのサイズに区切るかなんですが、微々たる差ですが限界の65000バイトに区切ってappend_dataするのが 一番速いようです(10000〜65000でテスト)。

問題はオレのPCではスレのサイズが100K越えると表示までの遅さが気になってくる点。 「Now Loading...」みたいなのが必要かも。

October 07, 2005

Subversionを覚えても卒業単位にはならない(涙 01:40

ここんとこは授業に出つつSubversionのマニュアルを読んでました。 これからは3分間プログラミング以外はしっかりバージョン管理しながら開発しようかなと。

就職組はあと半年たてば、たくさんの上級者から技術のシャワーを浴びる毎日なわけだけど、 俺は血迷って社会に出るのを2年先伸ばしにしてしまったので、 もうどんどん自分から新しいものを開拓していかないと!  でも見方を変えれば社会人と違って自由な時間があと2年もらえるわけで、 好きなことに存分に時間を使える最後の期間っぽくね?  よって生活費なんて省みずに本を買うべし(何買おうかな)。 親が元気なうちにスネをかじるぜ(最悪な長男)。

そう言えば今日3年生の実務実習(プログラミング演習と合体したらしい)の説明会に出てたら、 日本の若者は技術力が落ちてるだのソフトウェアの知識がないだのなんだのと、 そりゃもうへこむ話を聞かされたわけで。

まったくおっしゃる通りで。自分も猛反省しつつ禿同。クズですよ。ええ。 情報学について学んでるんだからソフトウェアについては学ばなくて良いっていう俺らの今のカリキュラムは変だ。 どうせSEになるくせに。1,2年の教養とか減らせば時間ありそうじゃない。 そうすれば俺も4年の後期まで卒業が確定しないなんてことにはならなかったのに……。 地球の科学とか教育の心理とか、俺が勉強したって絶対役には立たないし。 本読めばいい、そんなものは。 あーなんか自分がダメなのを必死に大学のせいにしてる俺カワイソス(´・ω・)

で、その実務実習ではグループ作って7日間でショッピングサイトを作るらしいすよ、12月に集中的に。 俺はその時期中間発表とかあって忙しそうだったんで履修やめたけど、 まー7日間とはいえ、そうやって大学生はもっと手を動かしたほうがいいと思うよ。 というか、動かしていれば良かったなと4年間振り返って思ってます。 おもしろいことはたくさんあるのに、技術力がついていかない……。

JavaとRubyのスレッドに関する対応表 03:25

結城さんの勉強日記の書き方のエントリに 「これは当たり前だからわざわざ書くまでもないな」と思ったことこそ書くようにしようと あったので、あとで忘れた時とか確認したい時のためにメモメモ。

機能JavaRuby
スレッドの定義と生成

Threadクラスを継承するか、Runnableインタフェースを実装する。

class A extends Thread{...}

class B impliments Runnable{...}

startメソッドでスレッドを生成。

new A().start();
new Thread(new B()).start();

Threadオブジェクトを生成するとスレッドも同時に作られる。

require 'thread'
a = Thread.new{...}
新しいスレッドの実行部分

runメソッドに記述する。

class A extends Thread
{
  void run(){ System.out.print("Inspire the Next"); }
}

実行部分はThread.newに渡すブロックに記述する。

Thread.new{
  puts 'Inspire the Mona'
}
スリープ
sleep(5000);
sleep
sleep 5000
スレッドの待ち合わせ
t = new A();
t.start();
t.join();
t = Thread.new{...}
t.join
メソッドの排他制御
public synchronized void foo(){...}
なし
ブロックを排他制御
void foo(){
  synchronized(this){...}
}
require 'monitor'
class A
  include MonitorMixin

  def initialize
    super
  end

  def foo
    synchronize{...}
  end
end
待つ

スレッドを、wait()を呼び出しているインスタンスのウェイトセットへ入れる。

wait();

new_condで作ったインスタンスのウェイトセットに入れる。

require 'monitor'

class A
  include MonitorMixin

  def initialize
    super
    @cond = new_cond
  end

  def foo
    @cond.wait
  end
end
ウェイトセットから出す
notify();    // 眠ってるスレッドを1つ起こす
notifyAll(); // 全部起こす
@cond.signal     # 1つ
@cond.broadcast  # 全部

とりあえずこんだけあればスレッドの基本的な扱いには足りるだろうか。 にしても、どっちもすげー忘れてる。完全に消える前にメモれてよかった……。

俺はスレッドについてはJavaのほうが見なれてるので、まだどうしてもJavaで考えてしまいます。 スレッドのプログラミングすることは圧倒的に少ないし。

October 11, 2005

Rubyで2ちゃんねる専用ブラウザ作るぜ 8 〜進捗報告 02:41

えーと、まだ飽きずに作ってますw 先週は学校に行っていたのであんまり 進んでないんだけど、とりあえず進捗報告を。

新スレが色分けされるようになりました。終わり。

新スレがリスト上で色分けされる

まーその前に軽く構造の整理をしたので、このあとはとんとんと進んでいくんじゃないかと。 邪魔が入らなければね。(なんかさっそくあさってのゼミの準備に追われそう)

とりあえずその画像が、最終的な図に結構近いです。あとはメニューバーと 色の調節とCSSとウィジット間のマージンを調整したら、見ため的には大体こんなもん。

見てわかるように、左のペインにスレの一覧が来ます。 で、右のスレの表示部分ではとりあえず上下に画面分割可能です。 右上のちょこちょこ文字があるやつが、開いているスレの一覧のテーブルです。 ここで表示するスレを切替えます。

こんなレイアウトなので、快適に見れるのは1280*1024以上の解像度だと思います。 画像はうちの17インチディスプレイの1280*1024でウィンドウ最大化した状態です。 1024*768だとスレ一覧の幅を縮めてスレタイがちょっと見にくくなるか、 スレの表示部分を縮めてレスがいくつか折り返されるか、どっちかになるんじゃないかな。 まー窮屈ではあると思う。たぶん。

みんなの大好きなWindows XPが古いPCでは快適ではないように、 このブラウザもターゲットをしぼって作ってるわけです。 たくさんのスレタイを画面に並べるのが目標なので、どうしてもこの形になります。 これで見にくい人にはドラッグして配置の変更ができるようにしておけばまーいいんだろうけど、 そこまで知識がありません。使う人が出てくるほど作り込むかもわからんし……。

るびまのプレゼント当たったw 18:02

言い忘れてたけど、昨日るびま10号が出まして、見たら るびま1周年記念企画のプレゼントでRubyレシピブック 268の技当たりましたよ!

やーこういうの今まで生きてて当たったことなくて、どうせ今度も当たらないだろうと、 ちょっと前に実は買ってしまったんですが、何冊あったっていいんすよ!  家と研究室に置いて、暇さえあればパラパラめくります。 こういうテクニックの本は何度読んでも新しい発見があるってもんです。

いやー、日本のRuby周辺はなんか温かいですね。るびまを初めとして、 オフィシャルのリファレンスマニュアルが しっかり日本語であったり、Rubyの作者の日記が読めたり。 うまく言えないけど、プログラミング言語というだけではない、ただならぬものを感じますw

October 12, 2005

金くれ〜 03:20

金がない……。2カ月に1度の水道料金を払い、3カ月に1度のコンタクト購入、 いろいろあって結局振り込まれていないような気がするバイトの給料、 何故か今月だけ2万円少ない親からの仕送り。 電気代として5000円をとりあえず残して貯金を下ろし、手元には3500円。ヽ(`Д´)ノ ウワァァァン!

コンビニ生活が身に染み着いて、行けば大体500円は出費。 以前は食パン焼いたりしてたのに、それが500円に……。 おかげで繰越金はここんとこほぼ0円。

あー学費の引き落としってまだだよなー。……コソーリ使っちゃおうかなー。 このままだと今度はスカパー代が残高不足になっちゃうよ。 つーかそれ以前に生活ができねーーーー(´Д⊂

スクラブ入り洗顔料の恐怖 20:18

寝る前にコンタクトを外した時に何かが目に入って、 それがずっととれなくてなかなか眠れないほど痛かったので眼科に行ってきた。

まつ毛だろうと思ってたら、入ってたのはなんと洗顔料のスクラブ。 あのちっこい粒が1つ、上まぶたの裏に貼りついてました。 あんなん1つで痛いのかよ……。

で、今日は医者に言われて片目コンタクトレンズなしで半日生活したんですが、こんなのムリポ。 かたっぽ何も見えないからぼやけるぼやける。 哀れなことにコンタクトがないとまともにパソコンもできない。もう寝るくらいしかすることがないすよ……。

しかし恐ろしいなスクラブ。生活費が1500円になっちまったじゃないか……。 結局今日の食事は夕飯だけ……。今から米炊いて、冷凍してあった豚肉を焼きます。 片目つぶって日記書くのもしんどい。

October 17, 2005

vimで代入文を=でそろえる for Ruby, Perl 02:21

Align.vimっていう、ここに載せたものより高機能なスクリプトがあります。

代入文がたくさん並んでると、なんか見にくいですよね。

     @close_listeners = []
     tool_bar = Gtk::HBox.new
     @label_title = Gtk::Label.new
     @btn_close = Gtk::Button.new('X')
     @moz = Gtk::MozEmbed.new

以下のようになったら見やすいよね? 

     @close_listeners = []
     tool_bar         = Gtk::HBox.new
     @label_title     = Gtk::Label.new
     @btn_close       = Gtk::Button.new('X')
     @moz             = Gtk::MozEmbed.new

viについてちょっと調べものをしていたら ヽ( ・∀・)ノきゅまきゅまーさんのところで この話がされているのが検索でひっかかって、興味津津。

Emacsについてはコメント欄にリンクが張ってあるんですが、 vimについてはインデントのためのRubyのコードを書いて vimから呼び出すと できてしまうらしい。おおおっ!

まーこういうスタイルの問題は、必ず「こういうの嫌い」って言う人が出てくるもんだけど (オレも以前Cでこのスタイルを見た時は好きではなかった)、 オレは少なくとも上の例については後者の方が見やすく感じるんです。

で、いろいろごにょってみたら、大体挙動がわかった。vimで範囲選択(13,15とか)して 外部のプログラムに渡す(:13,15 !ruby a.rb)と、プログラムでは範囲選択した部分を標準入力から読めると。 そして標準出力に吐き出すとそれがvimの範囲選択した部分とすりかわるみたい。

うむ。ならいっそのことコメントもそろえたらキレイなんジャマイカ?

@nulpo = "ga" #comment
@giko = :neko#aa
@mona = :nida
@nukedo = vs_kuma(3, 4) # func

これは汚い!(わざとw (ノ∀`)

で、作ってみた。

#!/usr/bin/env ruby

src = ARGF.read
l_max = r_max = 0

src.scan(/^\s*(.+?)\s*=\s*([^#]+?)\s*(#.*)?$/) do
  l_max = [l_max, $1.length].max
  r_max = [r_max, $2.length].max
end

src.gsub!(/^(\s*)(.+?)\s*=\s*([^#]+?)\s*(#.*)?$/) do
  if $4.nil?
    "%s%-#{l_max}s = %s" % [$1, $2, $3]
  else
    "%s%-#{l_max}s = %-#{r_max}s %s" % [$1, $2, $3, $4]
  end
end

print src

これをindent-equal.rbと名付けて実行権限を与えてパスの通ったところに配置。

そして~/.vimrcに、

au FileType ruby map + : !indent-equal.rb

としてみた。 これはrubyのファイルを開いたときには、indent-equal.rbの実行が+にマップされる。 なんで、Vを使ってビジュアルモードで複数行選択して+を押すと

:`<,`> !indent-equal.rb

と出るのでEnter or Ctrl-m。

すると……

@nulpo  = "ga"          #comment
@giko   = :neko         #aa
@mona   = :nida
@nukedo = vs_kuma(3, 4) # func

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

+を押して適用するには、なんかVで選択しないとダメみたい。:13,15+とやっても「コマンドじゃない」と怒られた……。

ちなみにこのプログラムはRubyの代入文を整理するために作ったけど、 Perlでも多分いけます。以下はオレにとっては懐かしい、このブログのコードの一部……。

    my $query = new CGI();
    my $id = $query->param('id') || 'toppage'; # top page's id is 'toppage'
    my $nmz = defined $query->param('query') ? 1 : 0;  # namazu flag
    my $query = new CGI();
    my $id    = $query->param('id') || 'toppage';       # top page's id is 'toppage'
    my $nmz   = defined $query->param('query') ? 1 : 0; # namazu flag

Perlのごちゃごちゃ感がとたんに薄らいだ感じ。

October 18, 2005

VNCを使ってみたよ 20:54

研究室のオレのパソコンはWinなので、もうプログラミングとかまったくする気になりません。 てことで研究室でのプログラミングのためにWin上でLinuxを動かそうとcoLinuxでブルースクリーンになったり QEMUにDebianを入れたりしていたのがこの前の話。 でも羽振りのいいうちの研究室はパソコンを余分に購入したので(来年のためらしい)、 それにLinuxを入れてリモートでやることにしたんです。電源入れてサーバ室に放置です。 もう24時間連続稼働でハードディスクがへたっても、使うのは来年の4年生なのでオレの知ったことじゃないです。 (つーか来年のオレの開発環境はどうしたら……)

まーまぬけなトラブルもありつつ、うまく逝きました。 リモートのデスクトップの領域を透過してくれるMetaVNCを使いました。

MetaVNCでGNOME!壁紙が痛い……。

VNCはデフォルトではウィンドウマネージャがtwmで(´・ω・`)ショボーンなんですが、 @ITの記事を参考に GNOMEになったよ!

こういうのおもしろいなー。自鯖始めたときにXでサーバのEmacsとかMozillaとかが ポコンと手元のパソコンで表示できた時は感動したっけ。 VNCはメニューやタスクバーに触れたりする点がいいすね。

2ちゃんねるブラウザの開発も完全にSubversionに移したし、 これで学校でも開発ができることに。やったー。(´∀`)ノ

October 21, 2005

Tera Term Proでの文字の色 21:26

CygwinはAlt-半角・全角でないとIMEがON/OFFされないうえにいろいろあって問題外だし、 PuttyはかなりよかったけどJapanistの親指キーがなぜか効かないので致命的だしってことで、 LinuxへのsshログインにはTera Term Proを使うことに。

これ、Puttyの使い方を見てたときに「ssh2に対応してないからダメだ」なんて文言を読んだんだけれども、 今はそんなことないみたい。UTF-8もssh2もいける。

さっそくログインしてviを使ってみたら、ハイライトされなかった。もう。

$ export TERM=teraterm

としたらハイライトされるようになった。

でも色が……

Tera Term Proでviを使った図(設定変更前)

なにこのギラギラしたのは。

ぐぐってたら、同じ不満を持つ人の日記が ひっかかったので、同じようにTERATERM.INIのANSIColorのところを変更(s/255/191/g)。

Tera Term Proでviを使った図(設定変更後)

目にやさしい色使いになった。まったく、プログラミングにとりかかるまでにどんだけ時間がかかるんだろう……。

そういえば今日研究室内の見習いvim使い(オレだけ!?)のために、バイブルを 校費で買いましたよ。これで研究室内のスキルがあがってくれるといいですね。

October 23, 2005

ruby-chasenのインストールメモ 23:08

茶筌をRubyから使うためにruby-chasenを 入れようとしたんだけど、なかなか入らなかった。こういうのは茶筌の本家に行けば情報があるんだろうけど、 なんか昨日今日と落ちてるみたい。ショボーン

こういうときはGoogleのキャッシュがほんとありがたいすね。

> %ruby -rmkmf -e'dir_config("chasen","/usr/local");
> create_makefile("chasen") if have_library("chasen")
> 
> を実行しましたが,

have_library("stdc++")

を追加してみてください.

てことで、添付されているextconf.rbを使わずに

$ ruby -rmkmf -e 'dir_config("chasen", "/usr/local");
create_makefile("chasen") if have_library("stdc++") and have_library("chasen")'

としてみたら

Exception `NoMethodError' at /usr/lib/ruby/1.8/mkmf.rb:657 - private method `split' called for nil:NilClass
Exception `NoMethodError' at /usr/lib/ruby/1.8/mkmf.rb:657 - private method `split' called for nil:NilClass
checking for main() in -lstdc++... yes
checking for main() in -lchasen... yes
creating Makefile

まーmkmf.rbがなんか言ってるけど、とりあえずこれでおk。 dir_configはリファレンスの説明見るといらないような気もするけど、まーいーや。

Makefileができたので、あとはmake;make install

注意点というか、はまったのがhave_library("stdc++")とhave_library("chasen")の順番。

$ irb -r mkmf
irb(main):001:0> have_library('chasen')
checking for main() in -lchasen... no
=> false
irb(main):002:0> exit
$ irb -r mkmf
irb(main):001:0> have_library('stdc++')
checking for main() in -lstdc++... yes
=> true
irb(main):002:0> have_library('chasen')
checking for main() in -lchasen... yes
=> true

stdc++が先でないといけないよ、と……。はあ、そうなんですか。 難しいことはワカンネ(´Д`)

October 24, 2005

VNCっておもしろw 20:45

これが最適かどうかは置いておいて、VNCはおもしろいです。 WinとLinuxの環境が融合していく感じ。研究室内はプライベートネットワークにしたんで、 VNCの転送量も多めで!

Winのデスクトップには見えない?
これでもWindowsのデスクトップですよ。どっちかっていうとLinuxに見えるww

なんてうける状況なんだ。「今頃VNCかよプッ」って人はスルーしてね。 俺はやっとこれのおもしろさがわかりかけてるところなんです。

takkan_mがこのリモートのLinuxにsambaを立てたので、 ドラッグ一つでLinuxのhomeディレクトリにファイルを置けるし(scpとかより楽)、 逆にLinuxで作ったファイルがダブルクリックでWin側のアプリを使って開ける(Adobe Readerなど)。 もうレジュメのPDF作るのにcygwinでカタカタ文字コード変換とかやらなくて済みます。

てことで、Winのソフトに依存しているところはWin、 それ以外はリモートのLinuxに置いて、慣れているLinuxのターミナルと Linuxのコマンドを存分に使えます。おお、ついにCygwinさよならかー?

あとはWin側にあるTera TermでLinuxのGUIアプリ(つまり作成中の2ちゃんブラウザ)を 起動できれば、もうLinux環境の中にいるような使い心地に。

VNCのディスプレイ番号は1にしてあるので、Tera Termから

$ DISPLAY=:1.0 gedit

とやったらgeditが出てきたwww よし。 あとは.bashrcにでもexport DISPLAY=:1.0と書いておけば、ホントにLinuxを使っているかのような錯覚に!  しかもJapanistとかiTunesとかMS Officeとか! LinuxとWinのいいとこ取り!  しかもCygwinいらず!!

ちなみにTera Termのためにexportなんてしなくてもgnome-terminal使えばいいじゃんて思うかもしれないけど(実際言われたけど)、 Tera Termなら

  • Japanistが使える(大事)
  • VNCサーバを落としても作業が続けられる(リモートLinuxのリソースは私物ではないのでvnc立てっぱなしにはできない)

って点を忘れちゃいけない。Tera Term1つでCUI→(vnc起動)→GUI→(vnc終了)→CUIとシームレスに扱えるのは大きいですよ。

October 25, 2005

HDがいっぱい 19:41

開発環境として使っている研究室の共用Linuxのハードディスクがいっぱいで作業ができんよー。

grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
grep: 出力の書込み: デバイスに空き領域がありません
        :
        :

ひー。初めて見た。

ファイルシステム    サイズ 使用中 空き 使用% マウント場所
/dev/hda6              62G   59G  592k 100% /
/dev/hda3              46M  8.8M   34M  21% /boot
none                  499M     0  499M   0% /dev/shm

Σ(゜д゜lll)ガーン

見ると、sambaのディレクトリの容量が恐ろしいことになってた。コーパスで溢れてるよ!

このLinuxは共有ストレージとして使うわけではないんだけど、 一時的にそういう使い方をしている。なぜならそのためのサーバがまだ届かないから。 でもこんなでかいとは思ってなかったな。今のところ55Gで、まだあるみたい。 メールスルーしちゃったのは失敗だったなぁ。

すぐには使わないコーパスのほうが大半のはずだから、申し訳ないけど一部消してもらうか。 どうせあのサーバが届いたらまた移すんだし。あ、明日秘書さん休みジャン。 どうしよう……勝手に消すのもよくないしなぁ。

不要ファイル消したらなんとか今やってる作業は続けられることに。 #pre ファイルシステム サイズ 使用中 空き 使用% マウント場所 /dev/hda6 62G 59G 232M 100% / /dev/hda3 46M 8.8M 34M 21% /boot none 499M 0 499M 0% /dev/shm #endpre うーん。

October 26, 2005

Juman/KNPのRubyバインディングってないの? 19:54

ないの?

今後研究室にRubyistを増やすには必要なんだけど、誰か作ってないのかな……。 ないなら作ってみるのも勉強になるしおもしろいんだけど、 やることがたまってきてるんだよねー、最近。レポートとか(´・ω・`)ショボーン

October 27, 2005

コードが腐っていく 22:33

ここんとこなかなか触れなかったんですが、久々に2ちゃんねるブラウザのプログラムと向き合いました。

まず触っていなかった間にRuby-Gnome2 0.14.0が出て、別パッケージだったruby-gtkmozembedが 吸収されました。

研究室のLinux(Vine 3.2)にブラウザ開発のための環境を作らなければならないんだよね。 とりあえずgtkmozembedだけmakeして入れることに。つーかVineのGtkはまだ2.4だったのか……。 (うちのはSeedなので2.8)

動かしてみると、こんなエラーが。

/usr/local/lib/site_ruby/1.8/gtkmozembed.rb:10: undefined method `set_log_domain' for GLib::Log:Module (NoMethodError)

Ruby/Glibについてはマニュアルがまだ書かれてない。 まーLogって書いてあるし、大丈夫だろうてことでgtkmozembed.rbの10行目をコメントアウト。

それでもまだ動かない。Ruby-Gnome2が古いからなのか、Gtkが古いからなのか、2つくらい メソッドがNoMethodErrorに。これらもコメントアウトしたり置き換えたり。うーん。まーなんとか動いたけど。

にしても、1カ月しか経ってないのにコードが汚く見える。 少し実装の詳細を忘れてしまっただけで読みにくくなるってことは、やっぱりまだまだしょぼいなー俺。 仕方がないのでしばらくリファクタリングします。

October 28, 2005

OpenOffice.org 2.0キタ━!! 04:26

出たよ日本語版

とりあえず条件反射的にVine 3.2にインストール。

$ tar zxvf OOo_2.0.0_LinuxIntel_install_ja.tar.gz
$ cd cd OOO680_m3_native_packed-3_ja.8968/RPMS/
$ su
# rpm -ivh *.rpm
# cd desktop-integration/
# rpm -ivh openoffice.org-freedesktop-menus-2.0.0-3.noarch.rpm  # ←メニューに追加

メニューの追加、うちのKDE 3.4はOKだったけど、Gnomeはしらね。

出たのはいいけど使うのかどうか……。研究室でMS Office買ってくれたからねぇ。 良くないな。お金のあるところにいると環境がMS化してしまう。 何が良くないって、ソフトに頼ってしまって苦労をしたがらない体質になってしまうこと。 「Linuxめんどくせー」って言って避けてる人は、実は損してるんですよ! とついでにLinux厨が煽ってみるテスト。

October 29, 2005

Ruby-Jumanを作りたいんだけど 00:02

結局やってみようかとw でもムズイお。

SWIGを使って Rubyバインディングを作ろうとしてるわけだが。 まー大体スタンドアロンでjumanを使う場合に呼ばなきゃならない関数ってのはわかったんで そのバインディングを作るだけなんだけど、結果を出力する最後の肝心なところでうまくいかない……。

char    **print_best_path(FILE* output);
char    **print_all_mrph(FILE* output);
char    **print_all_path(FILE* output);
char    **print_homograph_path(FILE* output);

こいつらなんだけど、結果をoutputに書き出すようで。これはRuby側としては使いにくい。 そうすると返り値をもらえばいいかと思うんだけど、ホントに返り値に結果入ってるのかな……。 確かこんな感じでやったらfprintfのとこで落ちたんですけど。

char** result;
result = print_best_path(NULL);
fprintf(stderr, "%s", result[0]);

Cが久々すぎて、なんか大事なこと忘れてるのかな俺。つーか、そもそも返り値に 結果が入っているっていう確証がなかったりするんだが……。

outputのほうを使うとするなら、使い方はこうなるのかな。

result = StringIO.new
Juman.print_best_path(result)

でも実際やってみるとTypeErrorが……。

Exception `TypeError' at test.rb:9 - wrong argument type IO (expected Data)

期待されているクラスはDataだと。これ、何……。リファレンスマニュアル見るとnewできないとしか書いてないし、 どう利用すれば……。

ちなみに、Jumanに添付されてるPerl版は別のプロセス作ってJuman動かしてるみたい。 うーん、それもありかなぁ。プロセスについてはほとんど知識がないんだけど、 どういったハンドリングが必要になってくるんだろう。 せっかくだからそっちを勉強するか……さよならSWIG(ノД`)

一応作ってみたやつはJumanのRubyバインディングにあるよ。

例題で学ぶLinuxプログラミング 18:21

Linuxのプロセスについては、なんと自分本持ってました。 『例題で学ぶLinuxプログラミング』がそれで、 以前『Linuxプログラミング―例題で学ぶUNIXプログラミング環境のすべて』と間違えて 買ってしまったという、いわくつきの本w

買ったのは半年前。半分くらい読んで意味さっぱりなので本棚に押し込んでしまったんですが、 やっとこの本が説明している内容がイメージできるように。やっぱり何かを勉強するには、 それ自体をまず見て触ってからやるべきだよね。そのほうが理解が早い。

でもこの本に関しては、意味プーだった原因は翻訳にもあるはず。ひどいんだからこれ。 amazonのレビューでも、

  • あまりにも翻訳がひどすぎる。これでお金を取るのが信じられない
  • 読むのが辛い
  • この訳者・監修者の本は、私は二度と購入しない
  • 訳が悪く、何を言っているか分からない所が多いです。

と酷評されてます。(※強調部分はオレが手を加えました)

例えば、こんな文章があってすごく困る。

ゾンビ・プロセス(zombie process)は親がwaitかwaitpidのある終了状態(exit status)を得る前に終了「してしまった」子のプロセス。

(snip)

反対に、孤児のプロセス(orphan process)は親がwaitかwaitpidを呼ぶ前に終わってしまった子プロセスのことだ。

例題で学ぶLinuxプログラミング

工工エエ(´Д`;)エエ工工 Linux勉強中の人でもすんなり頭に入るの? これ。 親が終了してしまったのか、子が終了してしまったのか、親によって子が終了させられてしまったのか。 うーん。

仕方がないので調べると、Unix Programming Frequently Asked Questions 日本語訳のゾンビプロセスのところに わかりやすい説明が! これを踏まえて前の文を直してみる。

  • ゾンビ・プロセス(zombie process)とは、終了した子プロセスのうち、まだその親プロセスによって終了状態の取得がされていない(wait, waitpidが呼ばれていない)ものをいう。
  • 孤児のプロセス(orphan process)とは、親プロセスが先に終了してしまって親がいなくなった子プロセスのことだ。

これならオレの鈍い頭でもすっきりだ。

ちなみに孤児になったプロセスはそのあとinitが新しい親になるんだけど、 これはこの文のあとですぐ説明があるので、 ここでは「親がいなくなった」と表現しておく。そのほうが「孤児」っていう名前に納得がいきやすい。 そうすると「ソンビの説明は?」ってことになるけど、これはその文章のあとに書いてあるんで。

扱っている内容は結構いいんだけどなぁ。レビュアーの人も言ってたけど。 gcc、プロセス、シグナル、パイプ……知りたいことばかり。