Googleはなぜgolangを作ったのか?
なにより中島さんがよく口にされていた「おもてなし」のためじゃないだろうかと思ってた。
UIE 中島さんのBlogで、GoogleはなぜAndroidやChrome OSを無料で配布するのか?と言うポストを読んで。Blog炎上っていうか微妙な発言ほどコメントやTBが集まるけど、本筋の正論にはコメントが集まらないのが寂しいなぁとか変なことを考えつつ。
確かにコモディティとか戦略って意味もあるだろうけど一番の根底にあるのはgoogleとしてのおもてなし。現状、携帯電話や携帯端末での主流はOperaのサブセットとかNetFrontとか。Googleがネットのでのおもてなしのために必要と考えているHTML5のサポートは微妙な状況。唯一AppleのiPhoneだけ。そんな中でGoogleユーザ(ネットユーザ)に気持ちよく携帯電話や携帯端末を使ってもらうために、AndroidやChrome OSを配布している。無いものは自分たちで作って提供すると言う方針。無料なのはGoogleが検索やその他のサービスを無料で提供しているのと同じ無料で特に深い意味はない。またGoogleとして全体的まとまりが今ひとつ見えないのは、Appleで言うところのジョブズの様な神が居ないから。
さて一方、go言語はどうだろうか?pkgのソースを見てるとほとんど既成のライブラリを使っていない。先日エントリしたdnsclientや、X11、どちらもcgoで既存ライブラリを呼び出せばもっと互換性高く簡単に実装できるはず。それを敢えてgoで自前で実装してる。基本的にCでインターフェイスして呼び出しているのはsyscallだけ。つまりKernelさえ動いていれば後のユーザーランドは不要。
と、言う事に気がついて微妙に既存のCライブラリをラップするcgoの作成には気が乗らない。Chrome OSはあくまでChrome OS。Google OSではない。Chrome OSがUbuntuにChromeをシェルとして被せただけとか色々な意見があった。今後、Kernelだけvmlinuzやmach_kernelで後のユーザーランドはgo nativeなOSが出てきても全然おかしくない。goのhttpサーバにブラウザがあれば完了だ。goで書かれたGoogle OSが登場しないと誰も言い切ることは出来ないだろう。
goで継承は出来ない…けど
んー、確かに「継承」はできないんだけど。似たような別の方法はあるってことで。
golangのLanguage Design FAQ::「Why is there no type inheritance?」辺りを読むといいかも。
method setを無名で内包する形で定義すると継承したみたいな感じになるっていうのと、interfaceは使いたい放題っていう当たりがキモかなぁ。
継承というよりは拡張という感じだけど感じ方はひとそれぞれ。
以下、サンプル。
goで関数内に複数のreturnを書くことができないなんて嘘
@itのGolangの記事の誤解
を見て知ったんだけど、全く同意。
記事を@ITに書くというのは非常に有意義で、是非これからも末永く続けて欲しいと思う。だけどミスリーディングはヤメテ欲しい。
package main func Fx(i int) (ret int) { if i > 0 { ret = i*i; return; } else { ret = 0; return; } return; } func Fx2(i int)(int) { if i > 0 { return i*i } else { return 0; } return 0; }
単純にコントロールパスの問題。最後のreturnには絶対に入らないからそれぐらい察しろよgoコンパイラって事かもしれないけど、だからといって関数内に複数のreturnを書くことができないというのは無茶。
その他、記事全体的に微妙な感じがする。
「Google Go登場の背景」はもう少し別のところにあるとおもう今日この頃。
goの名前解決(Linux)
なんやかんややりつつOAuthの実験にサーバにgoの吐いたオブジェクトを持っていった時の話。
どうしてもnet.dialで名前解決に失敗する。あれ?と思ってping打ってみたりnslookupしてみたりすると普通に名前解決できる。し、サーバじゃなければOSXでもLinuxでも普通に動くのだ・・・。
この辺、Issue 345: DNS being very flaky.見て、resolv.confにoptions?って思ったけどちょっと現象が違う。
んむむ、って思って go/src/pkg/net/dnsclient.goをじっと眺めると…解ったorz
普通、resolv.confのnameserver行にはプロバイダに割り当てられたDNSサーバのIPアドレス書くなり、dhclientが勝手に追記してくれるんだけど、このサーバ web兼、dns兼、mailというサーバで、ローカルでbind9が動いてるので、
nameserver localhost
って設定が。
goのdnsclient.goは御丁寧にnameserverでの指定がIPアドレスかどうか見てくれてる。libresolvだと、/etc/host.conf見て/etc/hostsも見に行ってくれるんだけど。
って、事でnameserver 127.0.0.1
に修正。あっさり動いた。
んー…、色々思うことも有るものの後術w
Link:: Go の X11 ライブラリを試してみる
releaseブランチしか見てなかったというか更新追いかけてなかったというか。
こういうのも有るのね。
Skypeのブリッジも結構簡単に書ける・・・かも。
ということでdefaultブランチをごにょごにょ中w