Fork me on GitHub

2010/01/28

はてな
長きに渡り活躍したWIDEプロジェクトのIRCサーバが役割を終えようとしています。そして惜しまれる中、livedoorがIRCサーバの提供をかって出てくれました。
livedoor ラボ「EDGE」 開発日誌 : livedoorからIRCnetへIRCサーバを提供します - livedoor Blog(ブログ)

WIDEプロジェクトIRCワーキンググループによるIRCサーバ運用終了について
という発表がありましたが IPv6を応援し、IRCをこよなく愛するlivedoorは、IRCnetへIRCサーバを提供することを決定しました。
※IPv4とIPv6で利用可能なデュアルスタック環境を用意する予定
※接続数などの仕様は現行と同じです

現在、関係各所と調整を行っているところですが近日中に接続先情報などはお知らせ出来ると思いますので、お待ちください。

宜しくお願いいたします。

http://blog.livedoor.jp/edge_labs/archives/1092902.html
すばらしいですね。これを期にIRCユーザがまた増え出すといいですね。
ぜんぜん関係ないですが、今日はvimからIRC出来るスクリプトを書いてみました。IRCプロトコルを喋るのではなく、freenode.netのウェブインタフェースを叩いています。
curlコマンドを使っているのでお使いのvimがperl拡張(if_perl)やpython拡張(if_python)、ruby拡張(if_ruby)でコンパイルされている必要はありません。Windowsでも動きます。
生のIRCと違い、プロキシさえ通れば防火壁内の人でもvimからIRC出来ます。
一つ問題があるとすれば、クライアントサーバをサポートしたvimである事と起動方法が難しい事。クライアントサーバはUNIX系OSであればgvimで、Windowsであればコマンドライン版でもOKです。クライアントサーバをサポートしているかどうかは、一つvimを起動しておいて
# vim --serverlist
とする事で確認出来ます。vimは内部で非同期に生成したプロセスとやりとりするのが苦手なので、vimを2つ使っています。
以下起動手順。
  1. 新しく端末を開きvimを起動する
  2. さらに新しく端末を開きもう一つvimを起動する
  3. 片方のvimで「:Irc」と入力します。
  4. もう片方のvimで「:IrcServer #mychannel mynick」と入力します。
場合により上記vimをgvimで置き換えて下さい。
これで「IrcServer」と入力した側がIRCサーバとなり、「Irc」と入力した側がIRCクライアントになります。内部でremote_expr()による通信をしています。
実際にはサーバがremote_expr()でコンテキスト、発言者、メッセージを飛ばし、受け側であるクライアント側がバッファに追加しています。
Linux版で試した所、若干とろい気もしますが十分楽しめます。(ネタとして)

pureirc-vim
一人で寂しいよー。
どうぞ遊んでやって下さい。
mattn's pureirc-vim at master - GitHub

vimscript for IRC. This make possible to access freenode.net from vim via HTTP protocol. it don't require if_xxx. using 'curl'

http://github.com/mattn/pureirc-vim
Posted at 01:39 in ソフトウェア::vim | WriteBacks (0)
Tagged as: freenode, irc, vim
Bookmarks: このエントリーのtweets add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip | add to buzzurl add to buzzurl | add to fc2bookmark add to fc2bookmark | add to Yahoo Bookmark add to Yahoo Bookmark | add to Pookmark add to Pookmark

2009/11/23

はてな
昨日書いたGoのIRCボットに手を入れ、mecabで要素解析する様にした。色々弄ってたら、某所で有名な「悪く言うなbot」になってた。
goによるmecab wrapperの実装がある事をtokuhiromさんに教えてもらったので、さっそく使わせて頂いた。
package main

import (
  "fmt";
  "http";
  "bytes";
  "json";
  "strings";
  "io";
  "mecab";
)

func get_json(url string, data map[string]string) json.Json {
  q := "";
  for key, val := range data {
    if (len(q) > 0) { q += "&" }
    q += fmt.Sprintf("%s=%s", key, http.URLEscape(val));
  }
  bb := &bytes.Buffer{};
  bb.Write(strings.Bytes(q));
  r, err := http.Post(url + "?" + q, "application/x-www-form-urlencoded", nil);
  if err == nil {
    b, _ := io.ReadAll(r.Body);
    r.Body.Close();
    j, _, _ := json.StringToJson(string(b));
    return j
  }
  return nil
}

func get_sid(nick string) string {
  j := get_json("http://webchat.freenode.net/e/n", map[string]string{"nick":nick});
  return j.Elem(1).String();
}

func login(nick *string) string {
  sid := get_sid(*nick);
  for {
    j := get_json("http://webchat.freenode.net/e/s", map[string]string{"s":sid});
    if j == nil {
      break;
    }
    for i := 0; i < j.Len(); i++ {
      data := j.Elem(i);
      println(data.String());
      if (data.Elem(0).String() != "c") {
        continue;
      }
      if (data.Elem(1).String() == "433") {
        *nick += "_";
        sid = get_sid(*nick);
      }
      if (data.Elem(1).String() == "376") {
        return sid;
      }
    }
  }
  return "";
}

func join(sid string, room string) bool {
  j := get_json("http://webchat.freenode.net/e/p", map[string]string{"s":sid, "c":"JOIN " + room});
  if j == nil {
    return false;
  }
  return true;
}

func say(sid string, room string, msg string) bool {
  j := get_json("http://webchat.freenode.net/e/p", map[string]string{"s":sid, "c":"NOTICE " + room + " :" + msg});
  if j == nil {
    return false;
  }
  return true;
}

func listen(sid string, nick string, room string) {
  for {
    j := get_json("http://webchat.freenode.net/e/s", map[string]string{"s":sid});
    if j == nil {
      continue;
    }
    for i := 0; i < j.Len(); i++ {
      data := j.Elem(i);
      println(data.String());
      if (data.Elem(0).String() != "c") {
        continue;
      }
      if (data.Elem(1).String() != "PRIVMSG") {
        continue;
      }
      line := data.Elem(3);
      if (line.Elem(0).String() == nick) {
        continue;
      }
      s := line.Elem(1).String();
      m := mecab.New2("");
      r := mecab.SparseToStr(m, s);
      ss := strings.Split(r, "\n", 999);
      for l := 0; l < len(ss); l++ {
        st := strings.Split(ss[l], "\t", 2);
        if (len(st) < 2) {
          continue;
        }
        if (strings.Index(st[1], "固有名詞") != -1 ||
            strings.Index(st[1], "人名") != -1 ||
            strings.Index(st[1], "組織") != -1) {
          say(sid, room, st[0] + "は良い奴だ。悪く言うな。俺が許さん。");
        }
      }
    }
  }
}

func main() {
  nick := "go-japan";
  room := "#mattn";
  sid := login(&nick);
  if (len(sid) > 0) {
    if (join(sid, room)) {
      listen(sid, nick, room);
    }
  }
}
channelに固有名詞や人名等が現れると「XXXは良い奴だ。悪く言うな。俺が許さん。」と発言します。
mecabライブラリについては、やっぱりfeatureとかsurfaceを扱いたいのでこれからに期待したいと思います。まぁ、現状でも上記の様にstrings.Split使えば出来なくないんですけどね。

なんとなくだけど、だんだん「C++書きの為のGo言語」と言われてる理由が分かって来た気がする。
Posted at 23:19 in ソフトウェア::lang::go | WriteBacks (0)
Tagged as: freenode, go, golang, irc
Bookmarks: このエントリーのtweets add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip | add to buzzurl add to buzzurl | add to fc2bookmark add to fc2bookmark | add to Yahoo Bookmark add to Yahoo Bookmark | add to Pookmark add to Pookmark

2009/07/15

はてな
javascript:(function(e){e[0].value='your-name';e[1].value='#room-1,#room-2,#room-3';e[5].click()})(document.getElementsByTagName('form')[0].elements);
javascriptで動的にform/input要素を作っているのでname属性もid属性も無い。なのでこんなjs。
これでwebhatを開いてブックマークレット一発でログイン。
your-name, room-1, room-2, room-3 等を修正してお使い下さい。

2009/06/24

はてな
Freenodeのwebchatインタフェースを叩いて通信し、携帯電話からでもIRC出来るCGI書いた。
欲しい人なんかいるんかなーとか思いながら、作ったのでメッセージの送受信しか出来ません。 nick登録もなし、nickの自動割り当てもなしです。
私はこんだけあったら十分なので...。コードはこの辺にあります。
mattn's freenode-mobile-gateway at master - GitHub

IRC gateway for freenode writen in perl.

http://github.com/mattn/freenode-mobile-gateway/tree/master
SoftBank携帯ですが、一応動いてます。欲しい機能があればgithubでforkして下さい。