2006年 05月 13日

IRC /join

#hxxk@ircnet に新しく入った。


IRC は良いです。メッセンジャーとかだと、1:1とか、話そうとするたびにセッションを張るという行為が必要になるので話しかけづらいのですが、IRC は常駐という形でぼーっと眺めていられるのでよいです。かなりやる気がないときでも、情報が入ってくるのでよいのです。

2006年 03月 29日

Riece, emacs vs xyzzy

コンソール上で IRC するのに Riece を入れてみた。というのも、りなざう使用時にいちいちウィンドウ切り替えるのがめんどいから、端末内で全て完結させたいのだ。

新しいフレームを作るのが、xyzzy だと C-x 5 2 で、emacs だと C-x 6 2 ってところに激しくハマる。いぢめだ。いぢめだ。

うーん。フレームの名前ってひたすらインクリメントされるのかな。一覧の出し方がわからない。

問題は、SKK の確定キーを RET にしていること。ぼーっとしてるといちいち▼と一緒に変換文字列を送っちゃうのだ。困った。C-j を送信にして RET は RET のままにすればいいかな。

2005年 10月 03日

IRC の MODE をパースするのがめんどい

寝たり起きたりするうちになんとなく実装したのがソレっぽく動いた。睡眠回数が多いほうがアイデアが浮かぶに違いない。

positive_mode = []
negative_mode = []
mode = positive_mode
arg_pos = 0
message[1].each_byte do |c|
case c
when ?+
mode = positive_mode
when ?-
mode = negative_mode
when ?o, ?v, ?k, ?l, ?b, ?e
mode << [c.chr, message[2+arg_pos]]
arg_pos += 1
else
mode << [c.chr, nil]
end
end
mode = nil
# when message is ["#chokan", "-o+v", "chokan", "chokan"]
p negative_mode #=> [["o", "chokan"]]
p positive_mode #=> [["v", "chokan"]]

うっさい

2005年 05月 16日

HTTP のみの世界で IRC をしたい

大学内のアレはHTTP以外使えない (プロキシ経由) ので、keitairc を使ったり使わなかったりするんだけど、やっぱチャンネルに join できないのとか、メンバーリストが表示できないのがちょと不便だなぁとか思ったりするので、Javascript+XMLHTTPRequest+IRCGateway でなんか作ってください。むしろ作りたいけど作る気が起きない (矛盾)

2005年 02月 04日

UTF-8 対応の IRC クライアント

思うところあって (使わないけど) UTF-8 対応なのが欲しいけど、なんかイマイチよろしいのが見つからない。とりあえず Chatzilla を使ってみるけど……使いにくい

  1. チャンネルごとの charset 変更
  2. UTF-8 と iso-2022-jp 使えればいい。
  3. Limechat の固定チャンネル番号相当の機能。(Ctrl+[0-9] でチャンネル切り替え)
  4. いろいろ
2005年 02月 03日

IRC nickserv の使用法メモ

なんか nick 管理にアレゲな機能がついているので使ってみる。memo 機能とかあって面白いけど使ってない。freenode と phasenet でやった。phasenet は register するときメールアドレスが必須で、さらにそのメールアドレスが有効化どうか確かめる。

コマンドの類は全て caseinsensitive

nickserv help [command] @freenode
nickserv help {commands,command} @phasenet
使えるコマンド一覧。省略可能な command が指定された場合指定したコマンドのヘルプを表示。
REGISTER
Register a nickname
DROP
Cancel the registration of a nickname
IDENTIFY
Identify yourself with your password
ACCESS
Modify the list of authorized addresses
SET
Set various options for your nickname
LIST
Display list of nicks matching a pattern
RECOVER
Kill another user who has taken your nick
RELEASE
Regain custody of your nick after RECOVER
GHOST
Kill a ghosted nickname
INFO
Get information for a nickname
LINK
Link your nickname to another
UNLINK
UnLink your nickname

忘れそう。/raw なのは tiarra 経由で繋いでいるから。fn は freenode の略。

認証
/raw fn nickserv identify password
パスワードを変更
/raw fn nickserv set password new-password
エイリアス (alternate nick) をリンク (リンクすると nick 変えたり、元に戻したりしても再認証 (identify) の必要なし。あーでも secure を off にすれば接続ホストだけ見るらしい)
identify された nick で /raw fn nickserv link alternate-nick your-password

おそらく chanserv は使わない。ircnet がデフォルトだし……

って /raw phasenet nickserv set language 8 すれば日本語で送ってくれるじゃんか!さきに言ってy でも freenode じゃ使えない。

あ、普通に ChanServ と privmsg で会話すればいいらしい。(Limechat だとトークと呼ばれているやつ)

2005年 01月 15日

chokan & FOAF

実験的に Rena を使ってみたかったので、よろしそうなプログラムを考える。

IRC BOT に何か FOAF アレこれできるような機能をつけてみたかった (意味があるかは考えない) ので、とりあえず URI に反応して、それが FOAF だったら foaf:nick と foaf:name をとってくるようにしてみた。

URI (http:) が PRIV されたら HEAD でアクセスして、ステータスコードと Content-Type を確認。`text/xml', `application/xml', `application/rdf+xml', `text/ntriples' であれば Rena にロードさせる。

ロードしたら rdf:about="" なリソースを探し、それが foaf:PersonalProfileDocument であれば foaf:primaryTopic のさすリソースの foaf:nick と foaf:name をてけとーに取得して IRC に NOTICE

Rena は結構遅いので、RDF パース中は chokan が他の処理しないかもしれない。

作るにあたって Using Rena to Process RDF in Ruby が役に立った。

よく考えると open-uri に Accept ヘッダを加えるのは無理 (もしくはめんどう) なので、最初から GET して、response.body を StringIO にして Rena に投げることにする。こうしないとネゴシエーション効いてる場合ダメになる。

メイン部分のコード。

# uri は読み込んだ RDF の URI の URI クラスのインスタンス
# res は HTTP#get の値
model = Rena::MemModel.new
model.load(StringIO.new(res.body),{
:content_type => Regexp.last_match[0],
:base => uri.to_s
})
resource = model[uri.to_s] # 相対 URI は絶対 URI に変換されている。
if resource &&
resource.get_property(RDF + "type").uri == URI.parse(FOAF + "PersonalProfileDocument")
mes = "foaf:PersonalProfileDocument"
foaf = resource.get_property(FOAF + "primaryTopic")
nick = foaf.get_property_values(FOAF + "nick")
name = foaf.get_property_values(FOAF + "name")
# string_array は rdf:Alt とかも全部ひっくるめて単一の文字列の配列にする
mes += " [nick:#{string_array(nick).join(", ")}]" unless nick.empty?
mes += " [name:#{string_array(name).join(", ")}]" unless name.empty?
subject << notice(channel, mes.to_jis)
else
puts "Not FOAF"
end
2005年 01月 12日

chokan 再実装

IRC BOT を作り直し。RICE 使うことにする。

プラグインのロード方法を変えた。新しい無名のモジュールを作ってその中で実行してクラスのインスタンスを得るようにする。そうすれば空間が汚れないし GC 的にも嬉しいっぽい。たぶん。

    def load(klass_name)
filename = klass2file(klass_name)
mod = Module.new
mod.module_eval(File.open("#{dir}/#{filename}") {|f| f.read}, filename)
c = nil
begin
c = mod.const_get(klass_name)
rescue NameError
raise ClassNotFoundError.new("#{dir}/#{filename} must include #{klass_name} class")
end
# @klass (new に渡した上位クラス) を継承していなかったらエラー
if c < @klass
@plugins[klass_name] = {
:instance => c.new,
:loaded   => Time.now,
}
else
raise NotInheritAbstractClassError.new("The class #{klass_name} must inherit #{@klass}")
end
klass_name
end

Abstract っていうのはなんか違う気がする。

2004年 08月 30日

ロイディ

どれぐらいメモリ使ってるかなぁって見てみたら 14,732KB だってさ。随分学習したねぇ。マルチチャンネルに対応しないかなぁ。改造するとバージョンアップがめんどいよね。