2009/11/23


とは言っても、freenodeのWebインタフェース使ってJSONやり取りして、発言するだけの物。以前C++で作った全裸botの簡易版といった所か。
動かすと、freenodeの"golang-daisuki"(仮)にJOINして「郷です!ジャパーーーン!」と発言した後に死亡します。
嫌がらせには持って来いですね。

package main

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

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));
  // freenodeはPOSTメソッドでGETクエリをおくらなきゃ駄目
  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, 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, nick;
      }
    }
  }
  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 main() {
  nick := "go-japan";
  sid, _ := login(nick);
  if (len(sid) > 0) {
    if (join(sid, "#golang-daisuki")) {
      say(sid, "#golang-daisuki", "郷です!ジャパーーーン!");
    }
  }
}
作ってみた感想としては、httpまわりにもう少しPOSTに便利なメソッドが欲しいのと、Postメソッドのデフォルトがcheckedになっている(Postメソッドでは変えれない)ので古くさいサーバで動かないんじゃないかと思ったり。

ただC++版に比べて幾らか短く書けたし、今回のコードでは例外等処理してないけど、例外処理を書きたくなった時にも簡単に実装が出来るのも分かった。

ところでpublicメソッドはメソッド名を先頭大文字にするってルールはいいけど、少しだけオモチャっぽく感じてしまうのは私だけだろうか。
Posted at by



2009/11/19


ふと思いつきで書いたコードを実行してしまって死にかけた。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <memory.h>

int main(void) {
  char *p = NULL;
  struct sigaction sa_sigint;
  memset(&sa_sigint, 0, sizeof(sa_sigint));
  sa_sigint.sa_handler = (void (*)(int))fork;
  sa_sigint.sa_flags = SA_RESTART;
  if (sigaction(SIGSEGV, &sa_sigint, NULL) < 0) {
    perror("sigaction");
    exit(1);
  }
  sleep(1);
  puts("僕は死にましぇん!");
  return *p = 0;
}
Ctrl-CとかCtrl-Zとか押しまくってようやく止めた。
良い子は真似しちゃ駄目よ。
Posted at by




今日、TypePadが提供するMicroblogを作ってみた。
http://mattn.typepad.com/
とてもグラフィカルで、reblogもついててfavoriteもついててカッコイイのだが、これを見て最近twitterのBeta機能として盛り込まれているReblogボタンの存在に疑問を感じた。
twitter-reblog-button
twitterではこれまでRT(Retweet)する際にはユーザがRTという接頭語を入れ、さらにその前にコメントを付与してポストするのだけれど、実はこのボタン、押すとそのまま自動でRetweetされる。まぁコメントが入れれない訳なんですが、私が疑問を感じたのはそこじゃない。

「何故ボタンにしたのか」

私が思うにtwitterが起こした革命の一つが「テキストの可能性」へ着目した事だと思う。140字以内で、かつ太字に出来る訳でもアンカーを貼れる訳でもなく、かつ宛名をGUIで指定出来る訳でもない。単なるテキストだけで、宛先、タグ、評価、位置などを表しているのだ。昨今リッチコンテンツが流行する中、メインとなるコンテンツの入力は、twitterサービス開始当初と変わらずテキストエリアなのだ。
このテキストによる表現は、replyこそ当初から入っていたが他の物については誰が取り決めた訳でもなく、ユーザが勝手に始め、後追いでオフィシャルが機能追加していったのが実状だ。
そしてそれは今や明文化され、一種のルール(nanoformat/twitter-syntax)になっている。
microblogging-nanoformats · Microformats Wiki
http://microformats.org/wiki/twitter-nanoformats
Twitter Syntax · Microformats Wiki
http://microformats.org/wiki/twitter-syntax
なのになぜ、ボタンにしたのか...。テキストでの表現があってこそ、Greasemonkeyによる拡張や、他のサービス連携が発展したのだと私は思うし、twitter自身が例えば画像添付や自動処理なんてすべきじゃないとも思う。

サービスを面白くする要因は、サービスが提供する機能以上に、ユーザが作るコンテンツが重要なんだと信じているが、この自動化の流れはユーザが作る新たなルール(コンテンツ)を阻害する可能性もあると思う。
twitterのあるべき姿は140字のテキストエリアであって、ボタン一つでアクションを起こせる様な、流行に流される物じゃない。今後このRetweetボタンがどの様に機能していくか分からないが、コンテンツを作るのはサービス提供側じゃなく、ユーザなんだという部分を忘れないでいて欲しいし、これからのtwitterがそうある事を信じたい。
Posted at by