2011/05/20


4chan BBS - Genius sorting algorithm: Sleep sort
http://dis.4chan.org/read/prog/1295544154
常識を覆すソートアルゴリズム!その名も"sleep sort"! - Islands in the byte stream
http://d.hatena.ne.jp/gfx/20110519/1305810786
Sleep sort with AnyEvent - TokuLog 改メ tokuhirom’s blog
http://d.hatena.ne.jp/tokuhirom/20110519/1305814594
こういうのはGoが得意分野だよね。 package main

import (
    "os"
    "strconv"
    "syscall"
)

func main() {
    args := os.Args[1:]

    done := make(chan int64)
    for _, arg := range args {
        i, _ := strconv.Atoi64(arg)
        go func(i int64) {
            syscall.Sleep(i * 1e9)
            done <- i
        }(i)
    }
    for _ = range args {
        println(<-done)
    }
}
Posted at by



2011/05/11


僕にとってデカいニュースが飛び込んできた。
Goの開発プロジェクトに関わってて良かった。今日はそう思える日になりそうだ。
まだGoogle App Engine Blogにもエントリされてないが、Google App EngineにGo言語が仲間入りした。
Downloads - Google App Engine - Google Code

Google App Engine SDK for Go

http://code.google.com/intl/en/appengine/downloads.html#Google_App_Engine_SDK_for_Go
Go言語は元々Google社員が開発している言語で、コンパイル型言語とは言えDuckTypingを前面に押し出した、スクリプト言語に近い仕様になっています。またWebに関するAPIは豊富で短いコードで簡単にWebアプリケーションを書く事が出来る様になっています。
例えば、先日書いたコマンドライン向けTwitter Clientであれば、OAuthライブラリこそ他に頼っているがメインのコードは350行だ。

さて今回公開されたGoogle App Engine for Goだが仕組みはGoが元々持っているWebサーバ機能を使っている。ソースはコンパイルせずに配置しapp.yamlファイルは以下の様に書く。 application: helloworld
vesion: 1
runtime: go
api_version: 1

handlers:
url: .*
  script: _go_app
この _go_app は固定。実行すると内部でコンパイルされ、applicationで指定したパッケージのinit関数が呼び出される。アプリケーションはあくまでパッケージとして提供し、main関数は書かない。なのでinitでハンドラを登録する。
極端に簡単なアプリケーションを書くとすると、以下の様になる。 package helloworld

import "http"

func init() {
    http.HandleFunc("/"func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type""text/plain")
        w.Write([]byte("Hello, World"))
    })
}
まぁ簡単。もちろんGoogle App Engine上で動く言語 Python や Java と同様に appspot.com でホストする場合はローカルディスクにはアクセス出来ない。ただし既に
  • blobstore
  • datastore
  • mail
  • memcache
  • taskque
  • urlfetch
  • user
という他の言語と同じだけのAPIは既に用意されている。Goにはポインタやアドレスという概念がある為にメモリに直接アクセスする様な事も出来るが、Goはその全てをランタイムを介して行っているのでそれらを例外として扱う事が出来る。
なお、appengine向けのGoランタイム上で動作する為、appspot.com でホストする場合にはコンパイル済みのモジュールを配置する事が出来ない。こちらは python で pyd が置けないのと同じですね。

まさかPerlよりも先にGoogle App Engine向け言語として採用されるとは思ってませんでした。ようやく日の目を浴びる事になりますね。

Go言語はじまったな

Posted at by



2011/05/02


普段からvimでtwitterしてますが、どっちかっていうとtwitter見たりボヤいたりするのにもコンソールのままでいたい派です。

ページャとか、自分で拾うのでコンソールにまま出力されてくれればいい...そんなtwitterクライアントが欲しかったので自分で書いた。

mattn/twty - GitHub

twty: command-line twitter client

https://github.com/mattn/twty

Go言語で書いたのは一度ビルドすればexeだけでランタイムが要らないから。あとGoだと簡単に書けるのよね。僕は。

ただ残念ながらどうしてもWindowsのコマンドプロンプトをサポートから外す訳にいかなかったのでGoのiconv拡張だけはライブラリとして入れる必要があります。

なお、この場合出来上がったexeとiconv.dllだけあれば動作します。USBかなんかで持ち歩けばどこでもtwitter出来ます。

go-iconv には依存しなくなりました。

実行すると初回は自動でブラウザが起動して、PINコードの入力を求められるので、ブラウザに出てる番号をコピペして下さい。使い方は

# twty -h

で分かる内容のままですが、だいたいこんな動きになります。

# twty -h
Usage of twty:
  -f ID: specify favorite ID
  -i ID: specify in-reply ID, if not specify text, it will be RT.
  -l USER/LIST: show list's timeline (ex: mattn_jp/subtech)
  -u USER: show user's timeline
  -r: show replies
  -v: detail display

# twty
mattn_jp: あーあー
☃☃☃☃☃☃☃☃☃: いーいー
...

こんな感じ

# twty -r
☃☃☃☃☃☃☃☃: @mattn_jp こちらこそです。ドキュメント直したり、ソースに手を入れて pull したりという程の腕も頭もないです。この程度のお手伝いでしたら、喜んでヤリマッセw
☃☃☃☃☃☃☃☃: ハァハァwww RT @mattn_jp: うし。コマンドラインで使えるtwitter clientでけた。goで書いたからランタイム要らない。USBに入れとけばいつでもどこでも... もちろんwin32も対応。
...

こんな感じ

# twty -u mattn_jp
mattn_jp: うし。コマンドラインで使えるtwitter clientでけた。goで書いたからランタイム要らない。URLに入れとけばいつでもどこでも... もちろんwin32も対応。
mattn_jp: URLってなんだ。USBねw
...

こんな感じ

# twty -l mattn_jp/subtech
☃☃☃☃☃☃☃☃☃: java-ja からきました、っていえば下品なこともいい放題ですし。
☃☃☃☃☃: 懇談会どこ? #perlcasual
...

こんな感じ

# twty -v
☃☃☃☃☃: ☃☃☃☃☃☃☃
  懇談会どこ? #perlcasual
  XXXXXXXXXXXXXXXXX
  Thu Apr 28 10:11:08 +0000 2011

☃☃☃☃☃☃☃☃☃: ☃☃ ☃☃
  朝までのんでればいいんじゃ RT @☃☃☃☃☃: &gt;&lt; RT @☃☃☃☃☃☃☃☃: 俺明日早いんすよねー RT @☃☃☃☃☃: @☃☃☃☃☃☃☃☃ 見せ決まったらおしえて///  #perlcasual
  YYYYYYYYYYYYYYYYY
  Thu Apr 28 10:14:34 +0000 2011

設定ファイルはWindowだと

%APPDATA¥&twty¥settings.json

に格納されます。

Posted at by