2009年12月29日
2009年12月22日
ブレスの位置
さて、golangは(多分trunkだけだと思う)文のセパレータとして基本的に改行が使われるようになりました。;をセパレータに使ってもいいですが、僕はない方が好きです。Pythonの影響です。それと同時にブレスの位置も微妙に厳しくなりました。
func myfunc() {....}
はコンパイルできますが、
func myfunc(){...}
はコンパイルエラーになります。基本的に僕は最初の方の書き方しかしないのでいいのですが、今まで書いたコードの中に一カ所だけ下の方のコードのような箇所があり、コンパイルエラーがでました。
そんなことはどうでもいいのですが、それを開発部長に話したら、「そんな書き方するんですか?」と。まあ、間違って改行がはいちゃっただけなのですが。で、下の方の書き方は、C世代のおじさんたち書き方と言う結論になりました。今時のJava世代の若者は上の方の書き方をするのです。「僕はCでも上のような書き方をしてたよ」と言うと、「おおたにさんのAirOneのコードは全部下のかきかたですよ。」と開発部長。なかなかあなどれません。でも、AirOneのC/C++のあとにJavaになって、上の方になれてくると下の書き方は少し、違和感がありますが、開発部長はおじさんなので、「Cは下の方の書き方じゃないと違和感がある」と。おじさんは新しいものになじめません。(うーん、かなり事実をねじ曲げているような・・・)
まあ、言語ごとにコーディングスタイルが統一されていればそれでいいのです。
2009年12月17日
2009年12月16日
Google Readerの「送信先」
僕はGoogle Readerをかなり前から使っています。Googleに思い入れがあるとかじゃなくって、単にユーザIDとパスワードの管理コストを減らしたいだけです。大昔はクライアントソフトを使っていましたが、iPhoneでも見たいと思うようになってからGoogle Readerだけを使うようになりました。
さて、そんなGoogle Readerですが、かなり前から英語版はSendToとかでInstapaperにエントリを保存できていました。でも日本語版はありませんでした。英語でも日本語でもどっちでもいいのですが、なぜか日本語で使っていました。で、今日、送信先という項目が追加されていることに気づきました。うーん、遅い?
で、送信先でInstapaperを使えるようにしましたが、新しいウィンドウがでて、保存ボタンを押さないと保存してくれません。僕はそんな確認をしてもらわなくても結構です。なので、カスタムリンクで登録します。ブックマークレットの内容をみて、リンク先はこんな感じ。
http://www.instapaper.com/b?v=4&k=よくわからないブックマークレットのキー&u=${url}&t=${title} - ${source}&s=
「よく分からないキー」は、ブックマークレットをみて、&k=の後に続いている文字列で、その次の&までです。。ついでに、アイコンは http://www.instapaper.com/favicon.png としてInstapaperのものを使います。これで、送信先を選択するとウィンドウが立ち上がってInstaperに勝手に保存してからウィンドウが勝手に閉じます。これならそれほどストレスになりません。
めでたしめでたし。
2009年12月14日
websocketsの覚え書き
HTML 5 Web Sockets vs. Comet and Ajax
なかなかおもしろいような、当たり前のような・・・。AJAXは定期的にポーリングするので負荷が高くなりますね。Cometのロングポーリングは、コネクションの管理が大変な上に、HTTPヘッダーのオーバーヘッドの方が大きいよね。だからWebSocketsだよね。と言うお話。
W3Cの仕様。なんだか、HTTPを拡張した方がよくね?
HTTPのGETを使ってネゴシエーションした後に、コネクションをオープンにしたままデータの送受信を行う。wsと言うプロトコルが新たに定義されていて、ポート番号は81。ReverseHTTPとか言うのがあるらしいけど、WebSockets使った方がよくね?
これを使えば、IEなどHTML 5を使っていなくてもWebSocketsでハッピーになれるらしい。Cometみたいな感じでエミュレートするっぽい。サーバサイドでもGateway的に動作できるらしい。
どうでもいいけど、XMPP使ってサーバ同士がもっとおしゃべりしあうのもいいかも、と少し思った。今の会社の製品はデータベースかmemcacheを使っておしゃべりしている。
2009年12月11日
ChromeとWebSocket
WebSocketの仕組みはまだ、ちゃんと調べていませんが、昨日の続き。Chromeを立ち上げてreloadすると、netstatで見たコネクションの数が一個だったのが二個に増えます。一つのブラウザで三個以上になることはありませんが、気持ち悪いです。
window.onunload = function() {ws.close();};などして、明示的に接続を切ってあげると、コネクションは二個に増殖することはありません。closeを呼んであげないと、サーバの方で接続がまだ維持されているかのように振る舞い続けます。つまり、readは待ち続けるし、writeに至ってはちゃんと書き込めたかのようにみえます。
で、機能のサンプルは書き込み、読み込みそれぞれ、goroutineが作られるので、うれしくありません。クライアントがcloseをコールするとちゃんと、読み込み・書き込みでエラーというかEOFとかでてくれます。
やっぱり、オブジェクトのメモリが破棄されるときはcloseして欲しいですが、メモリが破棄されていないのかもしれません。
まあ、接続は明示的に閉じろと言うことで。
window.onunload = function() {ws.close();};などして、明示的に接続を切ってあげると、コネクションは二個に増殖することはありません。closeを呼んであげないと、サーバの方で接続がまだ維持されているかのように振る舞い続けます。つまり、readは待ち続けるし、writeに至ってはちゃんと書き込めたかのようにみえます。
で、機能のサンプルは書き込み、読み込みそれぞれ、goroutineが作られるので、うれしくありません。クライアントがcloseをコールするとちゃんと、読み込み・書き込みでエラーというかEOFとかでてくれます。
やっぱり、オブジェクトのメモリが破棄されるときはcloseして欲しいですが、メモリが破棄されていないのかもしれません。
まあ、接続は明示的に閉じろと言うことで。
2009年12月10日
WebSocketでChatを作ってみた
MacにChromeを入れたことだし、HTML5のWebSocketでChatを作ってみました。サーバがgolangで作っています。クライアント側のコードは、こんな感じです。
ポイントは赤い文字の部分で、簡単にWebSocketのオブジェクトを制御できます。
サーバサイドはgolangでこんな感じ。まあ、いつぞやのチャットサーバを書き換えたものです。
これを実行して、Chromeを複数動かして、どれかで何かを打ち込むと、他のブラウザに打ち込んだものが出現します
<html>
<head><title>Web Socket Chat</title></head>
<body>
<script>
var ws = new WebSocket("ws://127.0.0.1:1972/chat");
ws.onopen = function() {
};
ws.onmessage = function(message) {
var txtNode = document.createTextNode(message.data);
var brNode = document.createElement('br');
var cnode = document.getElementById("content");
cnode.appendChild(txtNode);
cnode.appendChild(brNode);
};
</script>
<h1>Web Socket Chat</h1>
<div id="content">
</div>
<input id="message" type="text" onChange="javascript:ws.send(this.value);this.value='';"/>
</body>
</html>
ポイントは赤い文字の部分で、簡単にWebSocketのオブジェクトを制御できます。
サーバサイドはgolangでこんな感じ。まあ、いつぞやのチャットサーバを書き換えたものです。
package main
import (
"http";
"log";
"bytes";
"fmt";
"os";
"websocket";
)
const MAXREQSIZE = 0x10000;
func startServer() {
// initialize
queue := make(chan string);
listen_chan := make(map [*websocket.Conn] chan string);
go func() {
for {
mesg := <- queue;
for _, c := range listen_chan {
c <- mesg;
}
}
}();
read := func(ws *websocket.Conn, errChan chan os.Error) {
buf := make([]byte, MAXREQSIZE);
for {
fmt.Print("Reading...\n");
l, err := ws.Read(buf);
if err != nil {
fmt.Print(err);
errChan <- err;
return;
}
fmt.Printf("received: %s¥n", buf[0:l]);
queue <- string(buf[0:l]);
}
};
write := func(ws *websocket.Conn, mesgChan chan string, errChan chan os.Error) {
for {
mesg := <- mesgChan;
_, err := ws.Write(bytes.NewBufferString(mesg).Bytes());
if err != nil {
errChan <- err;
return;
}
}
};
OnConnected := func(ws *websocket.Conn) {
fmt.Printf("Connection Opend\n");
mesgChan := make(chan string);
listen_chan[ws] = mesgChan;
errChan := make(chan os.Error);
go read(ws, errChan);
go write(ws, mesgChan, errChan);
err := <-errChan;
fmt.Printf("Done%d\n", err);
listen_chan[ws] = nil, false;
};
// http handlers
http.Handle("/", http.HandlerFunc(func(c *http.Conn, req *http.Request) {
path := req.URL.Path;
log.Stdout("Request URL: " + path);
http.ServeFile(c, req, "." + path);
}));
http.Handle("/chat", websocket.Handler(OnConnected));
err := http.ListenAndServe(":1972", nil);
if err != nil {
log.Stderr(err.String());
return;
}
}
func main() {
log.Stdout("starting server...");
startServer()
}
これを実行して、Chromeを複数動かして、どれかで何かを打ち込むと、他のブラウザに打ち込んだものが出現します
2009年12月8日
遅延証明書
電車が遅れたので、遅延証明書をもらいました。まあ、出す必要性はないのですが、今の会社の管理の仕方が?なので、出します。駅でもらった遅延証明書を出すと遅れた時間が書いていません。自分で本当に遅れた時間を書いて出そうとすると、それではだめです。と言われます。ホームページで何分遅れたかのっているのでそれを出してよこせと言います。自己申告だと嘘を書いているかもしれないと言うのです。うーん、駅の人に聞いたら、自分で書いていいって言われたんだけど(これ本当)。
めんどくさくなったのでそのまま出さないでおこうかと思ったんですが、JRのページで調べてみると一時間以上おくれたことになっています。それをそのまま出したら、その通り処理してくれました。うーん、僕は嘘はついていないし、言われた通りにしただけなのに、20分の遅延が1時間以上の遅延に変わっています。インターネットはすごいです。管理の人って馬鹿なの?
数百人規模の会社であればいろな人が混じりますが、顔と名前が一致する規模の会社で「嘘」を申告するかもしれないって言われると、どうなのかなー、と思います。そうやって、みんなきっちり給料分というか、時間分しか働かなくなります。
まあ、開発の人は管理されるのが嫌いなので、宿命かもしれません。
2009年12月4日
2009年12月3日
2009年12月2日
@itのGolangの記事の誤解
第1回 Google Go登場の背景に
現状のGoでは関数内に複数のreturnを書くことができない
って、それはすごーい誤解。と言うか、これぐらいはもう少し勉強してから書いて欲しい。if xxx { return x;} else {return y;}のように書けないと言うだけで、if xxx { return x;} return y;のようには書けるし。と言うか、複数のreturn書けないってありえないでしょう。
「クラスの継承」とオブジェクト指向が同一視されているところはなんとなーくJava脳になっているような気がする。で、書き方は変かもしれないけど継承も一応できるし。interfaceがduck typingなところが好き嫌いとか、今までと違うところのような気がする。genericはあまり興味がないけど、例外が欲しいというのは納得できるんだけど、僕はそれは単にjumpしたいから。
文法は、Pascalっぽくって、僕は好きじゃない。なれれば気にならないけど。
登録:
投稿 (Atom)




