2009/12/22


Go binding for GTK GoのGTKバインディングを現在作業中なのですが、ようやく簡単なTwitterクライアントくらいならば作れる程度に出来上がってきたのでご報告。
mattn's go-gtk at master - GitHub

Go binding for GTK

http://github.com/mattn/go-gtk
イベントハンドラがJavaScriptっぽく書けるので、結構見通し良いコードになります。
package main

import "gtk"
import "gdk-pixbuf"
import "unsafe"
import "http"
import "json"
import "io"
import "os"
import "strconv"
import "strings"
import "reflect"

func url2pixbuf(url string) *gdkpixbuf.GdkPixbuf {
    if r, _, err := http.Get(url); err == nil {
        n, _ := strconv.Atoi64(r.GetHeader("Content-Length"));
        t := r.GetHeader("Content-Type");
        b := make([]byte, n);
        io.ReadFull(r.Body, b);
        var loader *gdkpixbuf.GdkPixbufLoader;
        if strings.Index(t, "jpeg") >= 0 {
            loader, _ = gdkpixbuf.PixbufLoaderWithMimeType("image/jpeg");
        } else {
            loader, _ = gdkpixbuf.PixbufLoaderWithMimeType("image/png");
        }
        loader.SetSize(24, 24);
        loader.Write(b);
        loader.Close();
        return loader.GetPixbuf();
    }
    return nil;
}

func main() {
    gtk.Init(&os.Args);
    window := gtk.Window(gtk.GTK_WINDOW_TOPLEVEL);
    window.SetTitle("Twitter!");
    window.Connect("destroy", func(w *gtk.GtkWidget, args []unsafe.Pointer) {
        gtk.MainQuit();
    }, nil);

    vbox := gtk.VBox(false, 1);

    scrolledwin := gtk.ScrolledWindow(nil, nil);
    textview := gtk.TextView();
    textview.SetEditable(false);
    textview.SetCursorVisible(false);
    scrolledwin.Add(textview);
    vbox.Add(scrolledwin);

    buffer := textview.GetBuffer();

    tag := buffer.CreateTag("blue", map[string] string {
        "foreground": "#0000FF", "weight": "700" });
    button := gtk.ButtonWithLabel("Update Timeline");
    button.Clicked(func(w *gtk.GtkWidget, args []unsafe.Pointer) {
        if r, _, err := http.Get("http://twitter.com/statuses/public_timeline.json"); err == nil {
            n, _ := strconv.Atoi64(r.GetHeader("Content-Length"));
            b := make([]byte, n);
            io.ReadFull(r.Body, b);
            j, _ := json.Decode(string(b));
            arr := reflect.NewValue(j).(*reflect.SliceValue);
            for i := 0; i < arr.Len(); i++ {
                data := arr.Elem(i).(*reflect.InterfaceValue).Elem().(*reflect.MapValue);
                icon := data.Elem(reflect.NewValue("user")).(*reflect.InterfaceValue).Elem().(*reflect.MapValue).Elem(reflect.NewValue("profile_image_url")).(*reflect.InterfaceValue).Elem().(*reflect.StringValue).Get();
                var iter gtk.GtkTextIter;
                buffer.GetStartIter(&iter);
                buffer.InsertPixbuf(&iter, url2pixbuf(icon));
                name := data.Elem(reflect.NewValue("user")).(*reflect.InterfaceValue).Elem().(*reflect.MapValue).Elem(reflect.NewValue("screen_name")).(*reflect.InterfaceValue).Elem().(*reflect.StringValue).Get();
                text := data.Elem(reflect.NewValue("text")).(*reflect.InterfaceValue).Elem().(*reflect.StringValue).Get();
                buffer.Insert(&iter, " ");
                buffer.InsertWithTag(&iter, name, tag);
                buffer.Insert(&iter, ":" + text + "\n");
            }  
        }
    }, nil);
    vbox.PackEnd(button, false, false, 0);

    window.Add(vbox);
    window.SetSizeRequest(300, 400);
    window.ShowAll();
    gtk.Main();
}
実行すると以下の様な画面になります。
go-gtk-twitter-client
まだ、完成じゃないです。がんばります!
Posted at by



2009/12/13


やっぱり少し私とは認識が違う気がする。
おごちゃんの雑文 » Blog Archive » 「はまちちゃん」をspamと断じる思考停止
この穴を「カンチョウ」で済ませているところが、はまちちゃんのサジ加減なのだ。

「スキだらけの後ろ」があることは、彼にはわかっている。わかっていてそこを突かないのは一見親切で礼儀正しい態度に見える。でも、そういった非常に突きやすい、単純な穴があることは、わかる人にはわかってしまっていて、気がついてないのは運営者だけという状態になっているのが、「Amebaなう」だったわけだ。はまちちゃんのやったのは「カンチョウ」かも知れないけれど、やれることがわかっている悪意の者であれば、

後ろから刺す

ことだって出来るわけだ。「悪の組織」がはまちちゃんの彼女をどーこーしたら… とかだってないとは言えない。Amebaには首相官邸のブログだってあるわけで、ポストにちょっとした仕掛けを入れるだけで、

公式チャネルからデマを流す

ことだって可能になる。仕手筋とかなら5分デマが流れりゃ十分満足だろう。Amebaには日本の最終兵器とも言われるデスブログだってあるわけでw
http://www.nurs.or.jp/~ogochan/essay/archives/2156

カンチョーで済ましてあげてるだけ、やさしい?

違うでしょ、肩をトントンと叩いて「ちょっと、スキだらけですよ。世の中ひどい人ばかりなので、気をつけないとカンチョーされますよ。」と言ってあげるのがやさしいんじゃないの?
おまけに傍観者とし面白い話かもしれないけどカンチョーでどんだけ人が動くか想像してもいいんじゃないかな?復旧にはSE一人じゃなかったかもしれないし、対策検討会の様な物もあったかもしれない。SE一人終日動かせば1日で原価数万飛びますよ。それ十分被害でしょ。
カンチョーがどんな印象を与えたのかは受けた者でないと分かんないよ。
はまちちゃんと脆弱性報告のあり方 - 世界線航跡蔵
これは「隙があった」んじゃないだろう。「開腹したまま内臓が露出している」んだ。

ところが、どうも現実の医師とは違ってこの世界の、特にAmebaみたいな大きな会社の開発者はその辺の意識が甘い。「手術したけど、まー、内臓が見えててもすぐに死ぬ訳じゃないし、適当に皮被せておけばいいよね」とか思ってる。下手したら開腹後に塞ぐべきという常識的なことを考えすらしない。で、そこら中を内臓が見えたままの患者が歩いている。
http://yugui.jp/articles/851
それも違う気がする。
この件で傍観している人たちは技術者だ。そしてその脆弱性は技術者でしか分からない。これはいわば院内感染ですよ。脆弱な病棟に気付かず通院/入院している一般の人達と、そこに「院内感染だー!」と叫ぶ人でしょ。彼らにはそれが冗談なのか何なのか分かってない。確かに今回のはまちちゃんの行為を「カンチョウ」と命名したのは私だが、このカンチョウで不安になった人がいたかもしれないし、Amebaの印象を悪くした人もいるかもしれない。

カンチョーで痔になってたら軟膏塗ってくれるの?はたまたカンチョーで筋うんこ付いてたら、パンツ洗ってくれるの?
カンチョーだってやり方次第では十分犯罪ですよ。


ただし言いっておきたいのは、私はこういったサービス全て注意勧告してあげるべきとは思ってない。注意して効かなかったサービスは勝手に潰れるだろうし、言い方変えれば潰れるべきだと思う。
私は脆弱性を見つけて注意勧告する事はとても大切だと思うが、それを手法交えて公に広める事については賛同出来ない。セキュリティを扱う人たちにとってはそれがステータスかもしれないけし、知名度を上げるチャンスなのかもしれないけど、私はそんなチャンスは欲しくないし、それで知名度を上げられたとしても嬉しくない。

私ならばもっと技術者らしい知名度の上げ方をする。ただそれだけの話ですよ。

ちなみに全然関係ない話ですが、私が中学生だった時の友達は、「起立!礼!着席!」のタイミングで前に座っていた同級生にカンチョウを食らわそうとしてたが、思っていた以上にズボンが固かった為、中指第二関節を骨折した事がありますよ!カンチョウには十分気をつけましょう。
Posted at by



2009/12/10


Tatsumakiって面白そうとは思ってたけど、触った事なかったので、勉強してみた。
なるほど面白そう。と思ったのとPSGIでも動かせるんだーと感動しました。今日は勉強がてら、以前紹介した事もあるDiggのDUI Streamと混ぜて遊んでみた。
Digg the Blog » Blog Archive » DUI.Stream and MXHR

We call this technique MXHR (short for Multipart XMLHttpRequests), and we wrote an addition to our Digg User Interface library called DUI.Stream to implement it. Specifically, DUI.Stream opens and reads multipart HTTP responses piece-by-piece through an XHR, passing each chunk to a JavaScript handler as it loads.

http://blog.digg.com/?p=621
miyagawa's Tatsumaki at master - GitHub

Plack-based nonblocking Web framework for IO-bound delayed response, server push (streaming) and long-poll comet

http://github.com/miyagawa/tatsumaki
ルートとなるHTMLからjavascriptでストリームへのエンドポイントへリクエストさせ、そこからmultipart/mixedで送出されるgif画像(静止画)を断続的に送出し、DUI Streamでパースしながら1個のIMGタグを高速に切り替えます。
名前をTatsumakiSenpukyakuと名付けました。
mattn's TatsumakiSenpukyaku at master - GitHub

竜巻旋風脚

http://github.com/mattn/TatsumakiSenpukyaku
実行するとポート9999でサーバが起動し、「せーのー」と勢いを付けたあとに、高速な「竜巻旋風脚」が始まります。
竜巻旋風脚
javascriptからタイマでリクエストしているのではなく、サーバから断続的に、切断せずに送出されています。上記DUIのリンク先にある画像を使ったデモでも分かる通り、ストリーミングによりパラパラと表示されていた画像コンテンツがまるで動画の様に見せる事が出来ます。
ネタっぽい作りですが、へーこんな事出来るんだー...てな感じで動かしてみて下さい。
Posted at by