<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>kumama &#187; golang</title>
	<atom:link href="http://kumama.org/category/golang/feed/" rel="self" type="application/rss+xml" />
	<link>http://kumama.org</link>
	<description>go言語とかgolangとかGAEとかネットサービスとかその他色々・・・</description>
	<lastBuildDate>Thu, 28 Apr 2011 09:39:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>ワンセグを http live streaming して iphone で見る</title>
		<link>http://kumama.org/2010/06/1sg-http-live-streaming-iphone/</link>
		<comments>http://kumama.org/2010/06/1sg-http-live-streaming-iphone/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 14:50:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[etc]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=204</guid>
		<description><![CDATA[って、試してるのはipod touch (1st gen)なんだけどw。 iphone 4g買う気でいるのでその準備と言うか。 寝てる部屋でもテレビ見たいというか。 要るもの（ハード）： OSX(雪豹が望ましい) Friio等（生TSが抜ける地デジチューナー） ってここまでで敷居高杉ですが。 要るもの（ソフト）： recfriio改 tssplitter_lite改 mediastreamsegmenter recfriioは終了まわり、tssplitter_liteはパイプ対応など修正。 mediastreamsegmenterはsnow leopard標準で入ってるコマンド。 iphone側はQuicktime playerで見るので特にソフトは不要です。 あ、あとWebのUIをgolangで作ってて、iphoneからはsafariで操作する感じ。 mediastreamsegmenterはオープンソースのsegmenterでも行けそうなんだけど、 AACとの相性が悪いのか成功せず。 トランスコードしてる訳じゃないので、 これさえ動けばlinuxとかbeagleboardでOKなんだけど。 と、需要あるのかないのかなのでとりあえず。]]></description>
			<content:encoded><![CDATA[<p>って、試してるのはipod touch (1st gen)なんだけどw。</p>
<p>iphone 4g買う気でいるのでその準備と言うか。<br />
寝てる部屋でもテレビ見たいというか。</p>
<p>要るもの（ハード）：</p>
<ul>
<li>OSX(雪豹が望ましい)</li>
<li>Friio等（生TSが抜ける地デジチューナー）</li>
</ul>
<p>ってここまでで敷居高杉ですが。</p>
<p>要るもの（ソフト）：</p>
<ul>
<li>recfriio改</li>
<li>tssplitter_lite改</li>
<li>mediastreamsegmenter</li>
</ul>
<p>recfriioは終了まわり、tssplitter_liteはパイプ対応など修正。<br />
mediastreamsegmenterはsnow leopard標準で入ってるコマンド。</p>
<p>iphone側はQuicktime playerで見るので特にソフトは不要です。</p>
<p>あ、あとWebのUIをgolangで作ってて、iphoneからはsafariで操作する感じ。</p>
<p>mediastreamsegmenterはオープンソースのsegmenterでも行けそうなんだけど、<br />
AACとの相性が悪いのか成功せず。<br />
トランスコードしてる訳じゃないので、<br />
これさえ動けばlinuxとかbeagleboardでOKなんだけど。</p>
<p>と、需要あるのかないのかなのでとりあえず。</p>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2010/06/1sg-http-live-streaming-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WebSocket Draft76</title>
		<link>http://kumama.org/2010/05/websocket-draft76/</link>
		<comments>http://kumama.org/2010/05/websocket-draft76/#comments</comments>
		<pubDate>Sat, 08 May 2010 01:21:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=173</guid>
		<description><![CDATA[１周半ぐらい周回遅れですが、WebSocketのDraftが更新されていて76に成っています。 Handshake周りが変わっていて前バージョンとの互換性が実装次第なので注意が必要。 って、WebSocket Draft75 « ケンタテクブロで先を越されてエントリしていませんでしたが一応記事にしておきます。]]></description>
			<content:encoded><![CDATA[<p>１周半ぐらい周回遅れですが、WebSocketのDraftが更新されていて76に成っています。<br />
Handshake周りが変わっていて前バージョンとの互換性が実装次第なので注意が必要。</p>
<p>って、<a href="http://kentablog.cluscore.com/?p=62" >WebSocket Draft75 « ケンタテクブロ</a>で先を越されてエントリしていませんでしたが一応記事にしておきます。</p>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2010/05/websocket-draft76/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>websockets を proxy 環境でも利用する場合の注意点</title>
		<link>http://kumama.org/2010/03/websockets-proxy-trick/</link>
		<comments>http://kumama.org/2010/03/websockets-proxy-trick/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 12:49:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=154</guid>
		<description><![CDATA[ええとコメント頂いたのでまじめに書くことにします。 （ちょっとアングラな世界でドライバ作ってました） 現在のwebsocketsのクライアント側の実装でproxy越えをしようとする場合、サーバ側で特殊な考慮をしておかないと繋がらない環境が多いと思います。 ちょっとややこしいので順を追って説明します。 ・クライアント側の実装でproxy越えする際にはProxyに対し CONNECT を発行する ・proxyでCONNECTできるのは接続先ポートがhttps(443)に制限されている場合が多い （squidはデフォルト。443以外のSSLポートをSquidでプロキシするには辺り参考） ・一方、サーバ側はというとhttps使ってるならhttpsの場合が多い。 ・websocketsで443に繋いだとしてもSSLのハンドシェークは行われない 以上から、proxy経由でのwebsocketsをなるべく利用可能にするならrawな（SSLでない）websocketsの口をポート443であけて置く必要があります。このblogに張ったwebsockets chatはこの対応をやってます。(httpsは潰してますｗ） ま、現状の実装（websockets, proxy）での話しなのでこの先は分かりませんが…。 後、思い浮かぶことをつらつらと。 # 元記事の proxy のキャッシュっていうのは、元記事のネタ元Blogの記事でjpegという静的ファイルのダウンロードの高速化を取り上げててそれに反応しての記述です。もちろんキャッシュが効かないコンテンツに対してProxyのキャッシュ云々という話は、websocketsだろうがajaxだろうがhttpだろうが関係ありません。 新技術って何のために有るのかを考える必要が有ります。 既存技術を使って出来ること新技術で置き換える場合、そこには何らかのメリットが必要ですよね。 またデメリットが有るならそのメリットとデメリットどちらが大きいか計る必要も有ります。 単純にメリットデメリットと言っても、立場はそれぞれでサービサー・顧客・開発者色々です。 webの高速化に１台のクライアントからセッションがんがん張ってそのためにwebsockets利用って言うのは違う気がしたんですよね。クライアントからのセッション数がHTTP/1.0で4本、HTTP/1.1で2本に制限されてるのも訳有ってのことなのですよ。 pipelineに関してはもっと低レベルな話でGoogleのSPDYとかがまっとうなアプローチな気がします。サーバ、クライアント、Proxyその他色々インフラ面での対応が必要ですがコンテンツ側は意識する必要が無いという利点が有ります。 websocketsに関して言えばまだまだ出てきたばかり動くようになったところで、websocketsを使って何をするかって言うのもこれからだと思います。そんな中でwebcoskets + pipelineで高速データ転送！っていうのがスタンダードな使い方に成ってほしく無いなと。]]></description>
			<content:encoded><![CDATA[<p>ええとコメント頂いたのでまじめに書くことにします。<br />
（ちょっとアングラな世界でドライバ作ってました）</p>
<p>現在のwebsocketsのクライアント側の実装でproxy越えをしようとする場合、サーバ側で特殊な考慮をしておかないと繋がらない環境が多いと思います。</p>
<p>ちょっとややこしいので順を追って説明します。</p>
<p>・クライアント側の実装でproxy越えする際にはProxyに対し CONNECT を発行する<br />
・proxyでCONNECTできるのは接続先ポートがhttps(443)に制限されている場合が多い<br />
（squidはデフォルト。<a href="http://d.hatena.ne.jp/shibainu55/20100220/1267341365">443以外のSSLポートをSquidでプロキシするには</a>辺り参考）<br />
・一方、サーバ側はというとhttps使ってるならhttpsの場合が多い。<br />
・websocketsで443に繋いだとしてもSSLのハンドシェークは行われない</p>
<p>以上から、proxy経由でのwebsocketsをなるべく利用可能にするならrawな（SSLでない）websocketsの口をポート443であけて置く必要があります。このblogに張ったwebsockets chatはこの対応をやってます。(httpsは潰してますｗ）</p>
<p>ま、現状の実装（websockets, proxy）での話しなのでこの先は分かりませんが…。</p>
<p><span id="more-154"></span><br />
後、思い浮かぶことをつらつらと。</p>
<p># <a href=http://kumama.org/2010/02/websockets%e3%81%aepipeline/>元記事</a>の proxy のキャッシュっていうのは、元記事のネタ元Blogの<a href="http://blog.livedoor.jp/kotesaki/archives/1385591.html">記事</a>でjpegという静的ファイルのダウンロードの高速化を取り上げててそれに反応しての記述です。もちろんキャッシュが効かないコンテンツに対してProxyのキャッシュ云々という話は、websocketsだろうがajaxだろうがhttpだろうが関係ありません。</p>
<p>新技術って何のために有るのかを考える必要が有ります。</p>
<p>既存技術を使って出来ること新技術で置き換える場合、そこには何らかのメリットが必要ですよね。<br />
またデメリットが有るならそのメリットとデメリットどちらが大きいか計る必要も有ります。<br />
単純にメリットデメリットと言っても、立場はそれぞれでサービサー・顧客・開発者色々です。</p>
<p>webの高速化に１台のクライアントからセッションがんがん張ってそのためにwebsockets利用って言うのは違う気がしたんですよね。クライアントからのセッション数がHTTP/1.0で4本、HTTP/1.1で2本に制限されてるのも訳有ってのことなのですよ。</p>
<p>pipelineに関してはもっと低レベルな話で<a href="http://dev.chromium.org/spdy/spdy-whitepaper">GoogleのSPDY</a>とかがまっとうなアプローチな気がします。サーバ、クライアント、Proxyその他色々インフラ面での対応が必要ですがコンテンツ側は意識する必要が無いという利点が有ります。</p>
<p>websocketsに関して言えばまだまだ出てきたばかり動くようになったところで、websocketsを使って何をするかって言うのもこれからだと思います。そんな中でwebcoskets + pipelineで高速データ転送！っていうのがスタンダードな使い方に成ってほしく無いなと。</p>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2010/03/websockets-proxy-trick/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>golangリリースニュース（w</title>
		<link>http://kumama.org/2010/03/golang-release20100304/</link>
		<comments>http://kumama.org/2010/03/golang-release20100304/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 13:47:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=156</guid>
		<description><![CDATA[2010-03-04のリリースで言語仕様に変更が有った模様。 http://go.googlecode.com/hg/doc/devel/release.html strings.Bytes(x) -> []byte(x) strings.Runes(x) -> []int(x) って、結構当たり大きいような。 個人的にreleaseブランチじゃなくてdefault使ってるんだけど、 hg updateした瞬間にstrings.Bytesが通らなくなってrelease noteにも何も書かれてなくて （updateしたのが３／４とか微妙なタイミングでした） pkgのソースまで見たりして、無くなってて愕然としたのは内緒]]></description>
			<content:encoded><![CDATA[<p>2010-03-04のリリースで言語仕様に変更が有った模様。<br />
<a href="http://go.googlecode.com/hg/doc/devel/release.html">http://go.googlecode.com/hg/doc/devel/release.html</a></p>
<p>strings.Bytes(x) -> []byte(x)<br />
strings.Runes(x) -> []int(x)</p>
<p>って、結構当たり大きいような。<br />
<span id="more-156"></span><br />
個人的にreleaseブランチじゃなくてdefault使ってるんだけど、<br />
hg updateした瞬間にstrings.Bytesが通らなくなってrelease noteにも何も書かれてなくて<br />
（updateしたのが３／４とか微妙なタイミングでした）<br />
pkgのソースまで見たりして、無くなってて愕然としたのは内緒</p>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2010/03/golang-release20100304/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>websocketsのpipeline</title>
		<link>http://kumama.org/2010/02/websockets%e3%81%aepipeline/</link>
		<comments>http://kumama.org/2010/02/websockets%e3%81%aepipeline/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 12:54:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[etc]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=140</guid>
		<description><![CDATA[またもEmerge Technologyからのネタ。 この、websocket pipelineのサンプルが意味するところら辺の話。 # ちなみにHTML5のドラフト上、「websocket」ではなく「websockets」が正解・・・だったと思うw websocketsの利用シーンとしては現状httpでは出来ないサーバ側からの通知とか、 非同期通信ばかりを思い浮かべていたけど、ajaxで出来る事もwebsockets化する！って 言うのはなんと言うか着眼点が面白いというかちょっと思いつかなかったなぁと言う感じ。 ただ、なんと言うか記事読んでいて思ったのは、 「websockets+pipelineが凄い！」っていう結論に成るような論旨展開に成っているんじゃない？！という事。 pipelineにするとシーケンシャルにしか処理できません。 例えば、１件処理するのに３秒かかるリクエストを３件行うとします。 ３並列で実行すれば３秒、シーケンシャルに処理すれば３秒x３＝９秒かかるのは当たり前です。 ただ、この話は３並列で処理を実行した場合のオーバーヘッドが０という前提が必要です。 それをふまえ、何故、「websocket+pipeline」のサンプルがajaxでの処理が遅いのか考えてみると、 サーバ側でリクエスト１件に対するオーバーヘッドが大きいからに他成りません。 mod_python使っていても、handlerがpublisherの場合のTPSはそんなに良くないはずです。 またサーバ側のCPUのスレッド数も分かりませんし、 apacheのpreforkがいくつに成っているのかも分かりません。 websockets版はスレッドとしてpython上でread/writeをループしているだけで、 pythonの初期化とかしてないので早くて当たり前ですね。 上記のような事を考察せずNWの遅延とかターンアラウンドの話ばかりを引き合いに出しているあたり、 微妙に突っ込まれる事も有るかも知れません。 その上WebSocketsの方はページを開いたときにコネクションを張ってしまっています。 なんと言うか、インフラとかapacheとかajaxに詳しくない人って印象を受けてしまうのは気のせいでしょうか。 穿って考えると、websocket+pipelineが早い、という事ではなく、 「自分のサーバとかJSだとwebsockets+pipelineの方が早いみたい。」 と、言う話で一般的にAjaxよりもwebsockets+pipelineが早いという話では無いような気がしてきます。 と、色々書きましたがやっぱりWebSocketsは現状httpでは出来ない事を実装するためのものと、 思った方が良いのかも。 http(s)なら今までの資産として、javascriptのライブラリも使えるし、 cookieとか認証とか文字コード変換とかjsonとかproxyでのキャッシュとか 今まで蓄積してきたモノが使えます。 websockets上で独自プロトコル作るのがデファクトとは思えず。 まー、apache + mod_pythonなんてケチな環境じゃなく、 golangで専用プロセス上げてればもうちょっと違う結果になったのかもw]]></description>
			<content:encoded><![CDATA[<p>またも<a href="http://blog.liris.org/">Emerge Technology</a>からのネタ。<br />
この、<a href="http://blog.livedoor.jp/kotesaki/archives/1376548.html">websocket pipelineのサンプルが意味するところ</a>ら辺の話。</p>
<p># ちなみにHTML5のドラフト上、「websocket」ではなく「websockets」が正解・・・だったと思うw</p>
<p>websocketsの利用シーンとしては現状httpでは出来ないサーバ側からの通知とか、<br />
非同期通信ばかりを思い浮かべていたけど、ajaxで出来る事もwebsockets化する！って<br />
言うのはなんと言うか着眼点が面白いというかちょっと思いつかなかったなぁと言う感じ。</p>
<p>ただ、なんと言うか記事読んでいて思ったのは、<br />
「websockets+pipelineが凄い！」っていう結論に成るような論旨展開に成っているんじゃない？！という事。</p>
<p>pipelineにするとシーケンシャルにしか処理できません。<br />
例えば、１件処理するのに３秒かかるリクエストを３件行うとします。<br />
３並列で実行すれば３秒、シーケンシャルに処理すれば３秒x３＝９秒かかるのは当たり前です。<br />
ただ、この話は３並列で処理を実行した場合のオーバーヘッドが０という前提が必要です。</p>
<p>それをふまえ、何故、「websocket+pipeline」のサンプルがajaxでの処理が遅いのか考えてみると、<br />
サーバ側でリクエスト１件に対するオーバーヘッドが大きいからに他成りません。<br />
mod_python使っていても、handlerがpublisherの場合のTPSはそんなに良くないはずです。<br />
またサーバ側のCPUのスレッド数も分かりませんし、<br />
apacheのpreforkがいくつに成っているのかも分かりません。</p>
<p>websockets版はスレッドとしてpython上でread/writeをループしているだけで、<br />
pythonの初期化とかしてないので早くて当たり前ですね。</p>
<p>上記のような事を考察せずNWの遅延とかターンアラウンドの話ばかりを引き合いに出しているあたり、<br />
微妙に突っ込まれる事も有るかも知れません。</p>
<p>その上WebSocketsの方はページを開いたときにコネクションを張ってしまっています。<br />
なんと言うか、インフラとかapacheとかajaxに詳しくない人って印象を受けてしまうのは気のせいでしょうか。</p>
<p>穿って考えると、websocket+pipelineが早い、という事ではなく、<br />
「自分のサーバとかJSだとwebsockets+pipelineの方が早いみたい。」<br />
と、言う話で一般的にAjaxよりもwebsockets+pipelineが早いという話では無いような気がしてきます。</p>
<p>と、色々書きましたがやっぱりWebSocketsは現状httpでは出来ない事を実装するためのものと、<br />
思った方が良いのかも。</p>
<p>http(s)なら今までの資産として、javascriptのライブラリも使えるし、<br />
cookieとか認証とか文字コード変換とかjsonとかproxyでのキャッシュとか<br />
今まで蓄積してきたモノが使えます。</p>
<p>websockets上で独自プロトコル作るのがデファクトとは思えず。</p>
<p>まー、apache + mod_pythonなんてケチな環境じゃなく、<br />
golangで専用プロセス上げてればもうちょっと違う結果になったのかもw</p>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2010/02/websockets%e3%81%aepipeline/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>golang::発展途上</title>
		<link>http://kumama.org/2010/01/golang-progress-now/</link>
		<comments>http://kumama.org/2010/01/golang-progress-now/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 12:29:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=129</guid>
		<description><![CDATA[ちょっと気になってたsliceとかをコピーするbuilt-in関数copy. 流量が多そうだからGo Nuts mailing listに入ってなかったから知らなかったのもあるんだけど、release.2009-12-09で入った模様。WebSocketで必要になるまでは全然defaultを追いかけてなかったから気にもしてなかった。 2009-12-22と2010-01-05にreleaseタグが更新されてて現在の最新releaseは2010-01-05。 変更点とかはrelease.2010-01-05だと、http://go.googlecode.com/hg/doc/devel/release.htmlに書かれている。っていうか1/5までここじゃなくて/にあった様な。 と、日々進化しています。（が、上げたissueは放置プレイw） ま、ちょびっとづづ期待という事で。 android/chrome osにしてもgoogleブランドとしての統一感が希薄だから、googleのサービスを使って( 組み合わせて)google以上のサービスを作れる可能性は有るなぁと思いつつ。]]></description>
			<content:encoded><![CDATA[<p>ちょっと気になってたsliceとかをコピーするbuilt-in関数copy.</p>
<p>流量が多そうだからGo Nuts mailing listに入ってなかったから知らなかったのもあるんだけど、release.2009-12-09で入った模様。WebSocketで必要になるまでは全然defaultを追いかけてなかったから気にもしてなかった。</p>
<p>2009-12-22と2010-01-05にreleaseタグが更新されてて現在の最新releaseは2010-01-05。</p>
<p>変更点とかはrelease.2010-01-05だと、<a href="http://go.googlecode.com/hg/doc/devel/release.html">http://go.googlecode.com/hg/doc/devel/release.html</a>に書かれている。っていうか1/5までここじゃなくて/にあった様な。</p>
<p>と、日々進化しています。（が、上げたissueは放置プレイw）</p>
<p>ま、ちょびっとづづ期待という事で。</p>
<p>android/chrome osにしてもgoogleブランドとしての統一感が希薄だから、googleのサービスを使って(<br />
組み合わせて)google以上のサービスを作れる可能性は有るなぁと思いつつ。</p>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2010/01/golang-progress-now/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>golang:　小ネタ集</title>
		<link>http://kumama.org/2009/12/golang-tips-1/</link>
		<comments>http://kumama.org/2009/12/golang-tips-1/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 11:05:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=116</guid>
		<description><![CDATA[・templateパッケージのデフォルトデリミタは"{","}"でJavascriptと相性が悪い →さっさとSetDelims("{{", "}}");とかして変えた方がいい （JavaScript外出しにしなさいって話もあるけど、それはそれでFileServerのハンドラが必要） ・htmlEscapeはtemplate.HTMLEscapeで ・Formの値は、req.FormValueで簡単に取得できる goじゃなくてchromeだけど、 ・ChromeのWebSocketはProxy環境下だと GET じゃなく、CONNECTで接続。 →ポート443（つまりhttpsのポート）使えばほとんどの環境で接続可能（なはず）]]></description>
			<content:encoded><![CDATA[<p>・templateパッケージのデフォルトデリミタは"{","}"でJavascriptと相性が悪い<br />
→さっさとSetDelims("{{", "}}");とかして変えた方がいい<br />
（JavaScript外出しにしなさいって話もあるけど、それはそれでFileServerのハンドラが必要）<br />
・htmlEscapeはtemplate.HTMLEscapeで<br />
・Formの値は、req.FormValueで簡単に取得できる</p>
<p>goじゃなくてchromeだけど、<br />
・ChromeのWebSocketはProxy環境下だと GET じゃなく、CONNECTで接続。<br />
→ポート443（つまりhttpsのポート）使えばほとんどの環境で接続可能（なはず）</p>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2009/12/golang-tips-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>golang: ARM用バイナリのクロスコンパイルに挑戦</title>
		<link>http://kumama.org/2009/12/golang-crosscompie-arm-binary/</link>
		<comments>http://kumama.org/2009/12/golang-crosscompie-arm-binary/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 12:30:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=109</guid>
		<description><![CDATA[cgoは試してない（クロスコンパイラの設定が面倒ｗ）けど、ごく普通に動きましたよ。環境変数を、 export GOARCH=arm にしてgoをコンパイル。5a 5c 5g 5lができたのを確認して、 $ 5g hello.go $ 5l -o hello hello.5 $ file hello hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, stripped をを。 BeagleBoardに持っていて実行。 # ./hello hello, world # cat /proc/version Linux version 2.6.29-omap1-00007-gdebf08f-dirty (ku....@kumama) (gcc version 4.4.1 (0xlab) ) #8 Wed Dec 23 04:06:34 PST 2009 [...]]]></description>
			<content:encoded><![CDATA[<p>cgoは試してない（クロスコンパイラの設定が面倒ｗ）けど、ごく普通に動きましたよ。環境変数を、</p>
<blockquote><p>export GOARCH=arm</p></blockquote>
<p>にしてgoをコンパイル。5a 5c 5g 5lができたのを確認して、<br />
$ 5g hello.go<br />
$ 5l -o hello hello.5<br />
$ file hello<br />
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, stripped</p>
<p>をを。</p>
<p>BeagleBoardに持っていて実行。<br />
# ./hello<br />
hello, world<br />
# cat /proc/version<br />
Linux version 2.6.29-omap1-00007-gdebf08f-dirty (ku....@kumama) (gcc version 4.4.1 (0xlab) ) #8 Wed Dec 23 04:06:34 PST 2009</p>
<p>をを。</p>
<p>当たり前と言えば当たり前だけどなんか凄いｗ</p>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2009/12/golang-crosscompie-arm-binary/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WebSocket:golang chat</title>
		<link>http://kumama.org/2009/12/websocketgolang-chat/</link>
		<comments>http://kumama.org/2009/12/websocketgolang-chat/#comments</comments>
		<pubDate>Fri, 25 Dec 2009 14:12:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=95</guid>
		<description><![CDATA[メーリークリスマス！ と、言う事で（笑）WebSocketのchatを色々と実装。 って言っても切り貼りでベースは、WebSocketでChatを作ってみた。 http://kumama.org/chat/ で実際に動かしています。メッセージをDBに書いてたりWSサポートしてないブラウザでも一応掲示板として動いたりといった実装を追加。 # 止めました HTML5の規格ではあるもののWebSocketは、 現状Chrome β(release 4.0.249.0から)でしかサポートされていないので、 βを入れるかChromiumのdaily buildを突っ込まないとWebSocketのお試しには成りません。 ブラウザを２つ立ち上げて片方で書き込んだメッセージがもう片方に届くさまを見てください。 メッセンジャーとかも作れそうな感じ有ってFlashとかAdobe Air使うよりは全然まともな気がします。 コードは以下に。 template使ったりsqlite使ったり色々やってみるとgo言語の理解が進む感じ。 書いていて「をを！」って思った事は小ネタ集として明日にでもまた書きます。 あー、sqliteは微妙に下記の方がいい感じだったので前に紹介したのは使ってなかったりw http://github.com/phf/go-sqlite3 http://github.com/phf/go-db cgo経由でのCライブラリの呼び出しは色々疑問も有るものの、現状DBが無いので仕方なし。っていうか、presistent storegeが欲しいって事かなぁ。 嗚呼、golangもreleaseブランチじゃなくてdefaultブランチじゃないとだめですよ。 package main import ( "http"; "io/ioutil"; "strings"; "bytes"; "log"; "db"; "db/sqlite3"; "template"; "websocket"; "os"; // "io"; ) const createTableSql = "CREATE TABLE messages (t DATETIME DEFAULT CURRENT_TIMESTAMP, s VARCHAR(4096));"; const [...]]]></description>
			<content:encoded><![CDATA[<p>メーリークリスマス！</p>
<p>と、言う事で（笑）WebSocketのchatを色々と実装。<br />
って言っても切り貼りでベースは、<a href="http://blog.liris.org/2009/12/websocketchat.html">WebSocketでChatを作ってみた</a>。</p>
<p><del datetime="2010-05-10T01:29:21+00:00">http://kumama.org/chat/<br />
で実際に動かしています。</del>メッセージをDBに書いてたりWSサポートしてないブラウザでも一応掲示板として動いたりといった実装を追加。<br />
# 止めました</p>
<p>HTML5の規格ではあるもののWebSocketは、<br />
現状Chrome β(release 4.0.249.0から)でしかサポートされていないので、<br />
βを入れるかChromiumのdaily buildを突っ込まないとWebSocketのお試しには成りません。<br />
ブラウザを２つ立ち上げて片方で書き込んだメッセージがもう片方に届くさまを見てください。</p>
<p>メッセンジャーとかも作れそうな感じ有ってFlashとかAdobe Air使うよりは全然まともな気がします。</p>
<p>コードは以下に。</p>
<p>template使ったりsqlite使ったり色々やってみるとgo言語の理解が進む感じ。</p>
<p>書いていて「をを！」って思った事は小ネタ集として明日にでもまた書きます。<br />
あー、sqliteは微妙に下記の方がいい感じだったので前に紹介したのは使ってなかったりw</p>
<p>http://github.com/phf/go-sqlite3</p>
<p>http://github.com/phf/go-db</p>
<p>cgo経由でのCライブラリの呼び出しは色々疑問も有るものの、現状DBが無いので仕方なし。っていうか、presistent storegeが欲しいって事かなぁ。</p>
<p>嗚呼、golangもreleaseブランチじゃなくてdefaultブランチじゃないとだめですよ。<br />
<span id="more-95"></span></p>
<pre class="brush:go">package main

import (
    "http";
    "io/ioutil";
    "strings";
    "bytes";
    "log";
    "db";
    "db/sqlite3";
    "template";
    "websocket";
    "os";
//  "io";
)

const createTableSql = "CREATE TABLE messages (t DATETIME DEFAULT CURRENT_TIMESTAMP, s VARCHAR(4096));";
const MAXREQSIZE = 0x1000;

func htmlEscape(s string) string {
    var buf bytes.Buffer
    template.HTMLEscape(&#038;buf, strings.Bytes(s))
    return buf.String()
}

func routeDefault(){

    templateBytes, _ := ioutil.ReadFile("index.html");
    var templateBuffer = bytes.NewBuffer(templateBytes);
    var templateStr = templateBuffer.String();
    defaultTemplate := template.New(nil);
    defaultTemplate.SetDelims("{{", "}}");
    defaultTemplate.Parse(templateStr);

    dbh, _ := sqlite3.Open("test.db" + "?" + sqlite3.FlagsURL(sqlite3.OpenReadWrite));
    conn := dbh.(db.ClassicConnection);

    http.Handle("/", http.HandlerFunc(func(c *http.Conn, req *http.Request) {

        stm, err := conn.Prepare("select s from (select t,s from messages order by t desc limit 20) order by t asc;");
        if (err != nil ){
            log.Stderr(err);
        }
        cur, err := conn.ExecuteClassic(stm);
        data, err := db.ClassicFetchAll(cur);

        params         := new(struct { title string; messages [20]string });
        params.title       = "一行掲示板ｗ";
        i := 0;
        for _, msg := range data {
            params.messages[i],_ = msg[0].(string);
            i++;
        }

        defaultTemplate.Execute( params, c);
    }));

}

func routeChat() {

    // initialize
    queue := make(chan string);
    listen_chan := make(map [*websocket.Conn] chan string);

    go func() {
        for {
            message := <- queue;
            for ws, _ := range listen_chan {
                ws.Write(bytes.NewBufferString(message).Bytes());
            }
        }
    }();

    read := func(ws *websocket.Conn, errChan chan os.Error) {
        buf := make([]byte, MAXREQSIZE);
        for {
            log.Stdout("Reading...
");
            l, err := ws.Read(buf);
            if err != nil {
                log.Stderr(err);
                errChan <- err;
                return;
            }
            log.Stdoutf("received: %s
", buf[0:l]);
            queue <- string(buf[0:l]);
            insertMessage( htmlEscape(string(buf[0:l])) );
        }
    };

    OnConnected := func(ws *websocket.Conn) {
        log.Stdout("Connection Opend
");
        mesgChan := make(chan string);

        listen_chan[ws] = mesgChan;

        errChan := make(chan os.Error);

        go read(ws, errChan);

        err := <-errChan;

        log.Stderrf("Done %d
", err);
        listen_chan[ws] = nil, false;
    };

    http.Handle("/chat/ws", websocket.Handler(OnConnected));

    http.Handle("/chat/write", http.HandlerFunc(func(c *http.Conn, req *http.Request) {

        log.Stdoutf( "%v
", req );

        var message string = htmlEscape( req.FormValue( "m" ) );

        queue <- message;
        insertMessage( message );

        http.Redirect(c, "/chat/", 302);

    }));

}

func initialize(){

    conn, _ := sqlite3.Open("test.db" + "?" + sqlite3.FlagsURL(sqlite3.OpenCreate));
    _, err := db.ExecuteDirectly(conn, createTableSql);
    if (err != nil){
        log.Stderr(err);
    }

}

func insertMessage(message string) {

    conn, _ := sqlite3.Open("test.db" + "?" + sqlite3.FlagsURL(sqlite3.OpenReadWrite));
    db.ExecuteDirectly( conn,
        "INSERT INTO messages values (CURRENT_TIMESTAMP, ?)", message );

}

func main() {

    initialize();

    routeDefault();
    routeChat();

    err := http.ListenAndServe(":12345", nil);
    if err != nil {
        panic("ListenAndServe: ", err.String())
    }

}</pre>
<p>htmlのテンプレートは、</p>
<pre class="brush:go">&lt;html&gt;
&lt;head&gt;
&lt;title&gt;{{title|str}}&lt;/title&gt;
&lt;/head&gt;
&lt;body onload="document.f.m.focus()" &gt;
&lt;script&gt;
var ws = null;
try {
  ws = new WebSocket("ws://kumama.org:443/chat/ws");
} catch(e){}
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);
};
window.onunload = function() { if( ws != null ){ws.close();} };
function send(){
  if( ws != null &#038;& ws.readyState == WebSocket.OPEN ){
    ws.send(document.f.m.value);
    document.f.m.value='';
    document.f.m.focus();
    return false;
  }
  return true;
};
&lt;/script&gt;

&lt;div id=content&gt;
{{.repeated section messages}}
  {{.section @}}
      {{ @|str }}&lt;br /&gt;
  {{.end}}
{{.end}}
&lt;/div&gt;

&lt;form name=f method=post action="/chat/write" name=read onsubmit="return send()" &gt;
	&lt;input type=hidden name=check value="check" /&gt;
	&lt;input name=m /&gt;
	&lt;input type=submit value="post" /&gt;
&lt;/form&gt; 

&lt;/body&gt;
&lt;/html&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2009/12/websocketgolang-chat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>golangでスライスには代入出来ない…</title>
		<link>http://kumama.org/2009/12/golang-copy-slice/</link>
		<comments>http://kumama.org/2009/12/golang-copy-slice/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 12:33:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=87</guid>
		<description><![CDATA[多分、参照だからって理由だと思うけど、 スライスの要素には代入できるけど、スライスのコピーができないのは…。 確かに要素数違い場合とか元配列の方の残り要素で移動が必要になるけど、 要素数が同じ場合ぐらいは代入させて欲しい。 多分、いろんなところで copySlice って関数が出来てる気がする。 # defaultブランチ追いかけてる人の間では WebSocket っていうのが話題に Add WebSocket server framework hooked into http. WebSocketでChatを作ってみた 今はclient側のコードでProxy対応は入ってないけど…。 httpだけじゃなく https で CONNECT して、Proxyのタイムアウトごまかすために noop して…とかそのうち進化していくんだろうなぁ。]]></description>
			<content:encoded><![CDATA[<p>多分、参照だからって理由だと思うけど、<br />
スライスの要素には代入できるけど、スライスのコピーができないのは…。</p>
<p>確かに要素数違い場合とか元配列の方の残り要素で移動が必要になるけど、<br />
要素数が同じ場合ぐらいは代入させて欲しい。</p>
<p>多分、いろんなところで copySlice って関数が出来てる気がする。</p>
<p># defaultブランチ追いかけてる人の間では WebSocket っていうのが話題に</p>
<p><a href="http://code.google.com/p/go/source/detail?r=657a1a72a243">Add WebSocket server framework hooked into http.<br />
</a><br />
<a href="http://blog.liris.org/2009/12/websocketchat.html">WebSocketでChatを作ってみた</a></p>
<p>今はclient側のコードでProxy対応は入ってないけど…。<br />
httpだけじゃなく https で CONNECT して、Proxyのタイムアウトごまかすために noop して…とかそのうち進化していくんだろうなぁ。</p>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2009/12/golang-copy-slice/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

