GoはGoogleが中心となってオープンソースで開発が進んでいるプログラミング言語です。いろいろなプログラミング言語の良いところを採り入れたGoは、様々な“顔”を持っています。Go言語の生まれた背景や特徴などについて、グーグルのソフトウェアエンジニアである鵜飼文敏氏にお話を伺いました。 Goが生まれた経緯や背景について教えてください。 Googleの中には検索エンジンや「Google App Engine」など、様々なサーバーがたくさんあるのですが、その中でスピードを要求する部分ではC++を使っています。ただ、C++は実行速度は速いのですが、ビルドに非常に時間がかかります。社内では分散コンパイル環境を作っていますが、仮に検索エンジンのサーバーを1台のマシンでビルドしようとすると、1日くらいの単位で時間を見ておかなければなりません。CPUなどが速くなっているのにコンパイルが遅いというのは何か
a systems programming language - expressive, concurrent, garbage-collected Goプロジェクトは3月24日(米国時間)、「The Go Gopher」においてプログラミング言語Goの特徴的なマスコットキャラクターである「Go Gopher」の生い立ちについて伝えた。このキャラクターに名前はなく、ただ「Go Gopher(Goのリス)」と呼ばれている。彼(彼女?)はもともと15年前にニュージャージー州のWFMUラジオ番組のプロモーションキャラクターとして誕生したものだという。 その後、ベル研究所のメールシステムでBob Flandrena氏が「Go Gopher」を自身のアバターとして採用。ベル研究所のメンバー向けにアバターを制作したRenee French氏は、Plan 9のマスコットであるGlendaについてもアバタ
Sitepointに書かれたBEMやSMACSSを使っている開発者たちからのアドバイスを読んでいた。僕は今いかにして命名規則をなくすかといったことを考えている最中のため否定的に読んだが、それでもここに書かれたアドバイスは正しいとは感じた。BEMやSMACSSが概ね想定以上に機能することは確かだし、スケールするし、指揮もとりやすい。 僕が避けたいのは何かしらへの強い依存だ。薄いレイヤーならともかく、厚いレイヤーの場合は重度の依存をもたらす。その依存はこれからもそのまま通用するのかというと、不安が大きい。厚いレイヤーとは心中する覚悟が必要というのは正しいが、多くの場合心中する羽目になるのは導入した人ではなかったりもする。もっと薄いレイヤーでウェブ標準(など)に寄せた形の解があれば安心できるはずだ。 HTML 4.01に対するHTML5を始めとして、CSS 2.1に対するCSS 3、いわゆるJa
高校数学がボロボロでも大丈夫です。( もともと個人的にインプットし貯めていたものですが、書きなおして公開します。 地味ですが、派手な動きはこの地味な数式・概念がベースになってきます。 また、メディアアートとは言ったものの、ゲーム制作などにも役立つでしょう。 「ラジアンとは?」「サイン波を描く」「円軌道を描く」「弾幕(2点間の距離系&角度系)」「多角形を描く」「フラクタル」といったテーマです。 また、そのプレイグラウンドとしてp5.js(Processingのjs版)をご紹介します。2014年にリリースされたものでまだマイナーですがCodePenのような海外サイトでは人気が出つつあります。またProcessing公式プロジェクトなので安心感もありますね。ちなみに、Processing.jsとは別プロジェクトです。 ラジアンとは? ・ラジアンは単位 角度についてのもう一つの単位です。 角度とラ
個人的に、Go言語からのバインディングに興味をもち、ちょうど必要だったmecabのバインドをつくっている。(shinpei/go-mecab)Go言語には、バインディングのためのCGO(シーゴー)というツールがついている。そこでgo-mecabの経験から、Goでのバインディングメモを書いてみた。先に、まとめておくと、CGOには以下のよい点、よろしくない点があった。 Cの関数を直接呼べる。このためラッパー関数は(ほぼ)必要ないのは楽で良い。 CのソースをGoの中に書ける。必要なラッパーはここで追加できるのは楽で良い。 typedefされたシンボルを区別する。このため、型変換関数を定義する必要があり、よろしくない。 コンパイルに必要なLDFLAGSなどをテキストとして読む。pkg-configなどが使えずよろしくない。 3,4について、特に4について、workaroundをお持ちの方は、教えて
Goでウェブアプリのクライアントを書いている。 ローカルでテストする場合は、サーバもローカルにたてるので、アクセスする先はlocalhostになる。 リリースするときは正しいウェブアプリのURLを指定しなければならない。 この際、切り替えはナイーブにコメントアウトで行ってきた。 1 2 3 4 const ( // APIServer = "http://www.mywebapp.com" APIServer = "http://localhost:8080" ) 当然、デバッグ用を有効にしたままリリースしてしまったり、その逆だったりと、混乱があった。 このような、デバッグ・リリースで機能を切り替えたい場合はBuild constrainsを使えば良いらしい。 Build Constrainsとは? 従来の機能が充実しているGoに抜かりはない。Build constrainsとは必要に応じ
概要 Goでテストを書く際にt.Errorfなどで問題を表示することは多々ある。しかし、テストがいくつかあった際にダンプをズラズラと表示されたときは、一概でどのテストが失敗したのか追うのがめんどくさいと感じることもあるだろう。そういう時は、recoverとdeferをうまく使えばよいらしい。 具体的にはテストに以下ようなコードを足せば、うまく省略できる。 1 2 3 4 5 defer func() { if r := recover(); r != nil { t.Error("Too lazy to show stack trace. This test has failed. Fix it.") } }() 問題 たとえば、以下のようなテストを考える。例ではStackという型を定義したパッケージでも作ったこととしよう。 1 2 3 4 5 6 7 8 9 10 11 12 packa
Goで作られるプログラムサイズはそこそこ大きい。配布する場合はやはり小さい方が良い。 そんなときは、リンカの設定を利用するといいようだ。 go build -ldflags '-s -w' Linuxならバイナリサイズが小さくなるはずだ。拙作、comstockでは8MiBから5.2MiBに縮んだ。 何をやっているか? -ldflagsは、gccなどを使ったことある方はよくご存知だろうが、ldへの引数である。 ldとはgccが使うリンカであり、Goもリンカを持っている。Goのリンカは、例えば、go tool 6l(番号はアーキテクチャ依存)から呼び出せる。伝統的にリンカへのフラグは LDFLAGSであるので、goでは小文字で指定するようになってる。 go buildはリンカへの引数を-ldflagsの後で文字列として渡すことができる。 指定できるリンカフラグは様々で、標準ドキュメントよりもg
go1.4でtestingパッケージにTestMainが追加されました。 func TestMain(m *testing.M)を定義してあると、go testはこのメソッドを呼び出します。試しに書いてみます: package example_test import ( "os" "testing" ) func TestA(t *testing.T) { } func TestB(t *testing.T) { } func setup() { println("setup") } func teardown() { println("teardown") } func TestMain(m *testing.M) { setup() ret := m.Run() if ret == 0 { teardown() } os.Exit(ret) } gist: go1.4 TestMain
commit cmd/go, testing: add TestMain support · 182d131 · golang/go · GitHub issue testing: allow tests to control main execution · Issue #8202 · golang/go · GitHub 例えば // main_test.go var exitCode = 0 func TestMain(m *testing.M) { defer os.Exit(exitCode) beforeAll() defer afterAll() exitCode = m.Run() } func beforeAll() {} func afterAll() {} みたいにして、mainパッケージのようにテスト実行の前後に適当処理入れたりとかが出来るようになった(1.4rc2
Go言語でコマンドラインオプションを使うときは標準のflagsパッケージを使うことが多いと思いますが、go-flagsを使うとオプションの仕様を定義するだけでうまいことやってくれるので便利です。 go-flags go-flagsはコマンドラインオプションのパーサーです。オプションの仕様を定義した構造体に、コマンドライン引数をバインドしたり、定義した仕様からヘルプを整形・表示してくれます。 標準のflagsパッケージに比べて、オプション指定方法が柔軟であること、指定されたオプションを構造体としてプログラム内で利用できること、値のバインドやヘルプの生成などの定型的な実装を行わないでよくなること、といいコトずくめなので使わない理由はないでしょう。 インストール
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く