
Outline
この記事は、Go2 Advent Calendar 2017の17日目です。
特にこれといったネタがなかったので、goyaccを使ってシェルを実装してみました。
何をしたのか
Linux/macOSなどのUnix系OSには、bashやzsh、fishなどあります。これらはとてもよく出来ていて、ユーザインタフェースとして使う分にはあまり困りません。しかし、プログラムを書く言語としては、少々貧弱であったり直感的でない文法があったりして、微妙だなと思っていました。例えばスペースを含む場合、どこでクオートが必要で、どこで書いてはいけないのかを正しく行うのは難しいです。
Plan 9にはrc
という、とてもCに近い文法のシェルがあって、これはプログラミング言語としてよくできています。Infernoのシェルにも、モジュールをロードするなど面白い要素があります。これらを参考に、今年はGoでプログラムを書く言語としてのシェルを実装しました。
このシェルは、プロンプトやヒストリなど、インタラクティブな機能はほとんどありません。また、最低限動作する程度なので、必要だけれど実装が終わっていない機能などはいっぱいありますが、最低限は使える状態まで実装できたかなと思います。
使い方
以下のコマンドでインストールできます。
$ go get github.com/lufia/qsh
qsh
を実行しても、現在はプロンプトなど一切出ませんが、1行入力すれば入力されたコマンドを実行します。終了する場合は ctl+d を入力してください。
$ qsh
ある程度は他のシェルと同じですが、Plan 9の rc と Infernoの sh を参考にしているので、少し変わった文法があります。
文法
コメント
コメントは他のシェルと同じで#
から行末までを無視します。ただし、文字の途中に含まれるものはそのまま文字として扱います。
# この行は無視する
echo a#b # "a#b"と出力
echo '#E' # "#E"と出力
コマンド実行
普通に書けばコマンドとして実行します。他と異なり、コマンド名に/を含む場合でもPATHから探して実行します。
ls -l
gitlab/users -a # $HOME/bin/gitlab/usersを実行
PATHにサブディレクトリが作れるのはPlan 9でも多用されていますが、とても便利だと思います。
変数
変数は全て一次元のリストです。リストは(a b c)
のように、カッコとスペースで表します。a=1
のように書くこともできますが、これはa=(1)
と等価です。また、全て大文字の変数は、自動的に環境変数として昇格するためexport
する必要はありません。
ranks=(S A B C)
echo $ranks # "S A B C"と出力
API_TOKEN=xxxx # 全て大文字なら環境変数になる
bash -c 'echo $API_TOKEN' # "xxx"と出力
特別に、PATHという文字を含む環境変数は、他のプロセスが参照した時に困るため、エクスポートする時に要素の区切りをfilepath.ListSeparator
へ変更しています。
PATH=(/bin /usr/bin)
echo $PATH # "/bin /usr/bin"と出力
bash -c 'echo $PATH' # "/bin:/usr/bin"と出力
変数を使って変数を間接参照することもできます。
Jan=1
January=Jan
c=January
echo $$$c # "1"と出力
スペースもまともに扱えます。
touch 'a b'
args=(-l 'a b')
ls $args
# ls -l 'a b'を実行
今のところ、リストから特定の要素を取り出すことはできませんが、近いうちに$a(1)
のような書き方で取り出せるようにする予定です。
If文・For文
これらは、よくあるシェルと見た目は異なります。Infernoのシェル由来ですが、ifの条件ブロックには複数のコマンドを書けるので少し便利です。
for i in 1 2 3 {
echo $i
}
if { echo a | grep -q . } {
echo match
}
&&
や||
で繋げることもできます。こっちは他のシェルと同じです。
cmp -s a b && echo same # aとbが同じ内容ならsameと出力
cmp -s a b || echo diff # aとbが異なる内容ならdiffと出力
リダイレクト・パイプ
普通ですね。
echo hello >out # 出力
echo hello >>out # 追記
cat <in # 入力
echo hello | wc # パイプ
モジュール
少し実験的な機能も入れてみました。load
命令で、Goで実装した関数を呼び出せます。Goのpluginパッケージを使って、シェルの機能を拡張するものです。
まずGoで以下のようなプラグインを実装します。
package main
var SampleModule = map[string]string{
// Hello関数をhelloという名前でシェルから呼び出せるようにする
"hello": "Hello",
}
func Hello(args []string) ([]string, error) {
a := make([]string, 0, len(args)+1)
a = append(a, "hello")
return append(a, args...), nil
}
このとき、ファイル名はsnake_caseで付けてください。また、モジュールの名前(上記の場合はSampleModule
)は、ファイル名をCamelCaseにして、末尾に Module を付けたものになります。上記例は、ファイル名がsample.goなので、モジュール名はSampleModuleです。sys_util.go の場合は SysUtilModule になります。
モジュールの実装ができたら、プラグインとしてコンパイルします。Go 1.9.2現在、Linuxしかサポートされていません。
$ go build -buildmode=plugin sample.go
これで sample.so が生成できるので、シェルからロードして使いましょう。モジュールは${name}
で呼び出します。
load sample # プラグインの読み込み
echo ${hello world} # "hello world"と出力
実装について
簡単にですが、実装について説明します。言語を実装する場合、ざっくり以下のフェーズを実装する必要があります。
- 字句解析
- 構文解析
- コード生成
他にも、最適化を行う場合もありますし、コード生成を行わずにツリーを直接実行する場合もありますが、単純な言語でない限りはコード生成を行ったほうが便利だと思います。
今回はgoyaccを使ったので、それを前提に書きます。goyacc自体の説明は、以下の記事を参考にしてください。
または、ANSI以前のC言語ですが、UNIXプログラミング環境にもyaccを使って計算機を作る章があり、とてもわかりやすいのでオススメです。
注意事項
全部書くと長くなるので、以下のコードは、雰囲気を知ってもらうために色々と省略して書いています。実際に動作するコードが見たい場合はリポジトリのコードを参照してください。
字句解析
字句解析は、言語のトークンを分割するものです。例えば以下の場合。
if { true } {
echo a is $a | wc
}
これは次のように分割します。
type Node struct {
Type int
Str string
}
Node{Type: IF}
Node{Type: '{'}
Node{Type: WORD, Str: "true"}
Node{Type: '}'}
Node{Type: '{'}
Node{Type: '\n'}
Node{Type: WORD, Str: "echo"}
Node{Type: WORD, Str: "a"}
Node{Type: WORD, Str: "is"}
Node{Type: '$'}
Node{Type: WORD, Str: "a"}
Node{Type: '|'}
Node{Type: WORD, Str: "wc"}
Node{Type: '\n'}
Node{Type: '}'}
ただし、goyaccを使う場合、字句解析のインターフェイスが決められていて、1回の呼び出しでは1つだけトークンを(lval
に詰めて)返すように実装しなければなりません。インターフェイスは以下の通りです。
type yyLexer interface {
Lex(lval *yySymType) int
Error(e string)
}
そのため、1文字読んで、区切りだったら戻しておいて次の呼び出しに使うことがよくあります。Goでは、text/scannerが用意されていて便利そうだったのですが、Scanner.Next
はまだ返すべき文字が残っていても入力を読むまで待ってしまうため、微妙に使いづらかったです。代わりに、io.RuneScanner
を満たすbufio.Reader
を使うといいでしょう。
初期のLex()
は以下のような雰囲気です。yySymType
型については構文解析のところで説明します。
const EOF = -1
type Lexer struct {
f io.RuneScanner
buf bytes.Buffer
}
func (l *Lexer) Lex(lval *yySymType) int {
l.buf.Reset()
var c rune
for {
c, _, err := l.f.ReadRune()
if err != nil {
return EOF
}
if c != ' ' && c != '\t' {
break
}
}
switch c {
case EOF:
return -1
case '$', '{', '}', '\n', '|':
return int(c)
case '\'':
// 省略
default:
l.buf.WriteRune(c)
for {
c, _, err := l.f.ReadRune()
if err != nil {
break
}
if c == EOF || unicode.IsSpace(c) || c == '$' || c == '{' || ... {
l.f.UnreadRune()
break
}
l.buf.WriteRune(c)
}
lval.tree = &Node{Type: WORD, Str: l.buf.String()}
return WORD
}
}
あとは、必要に応じてプログラムを分割するようなコードを書けばいいです。この辺りのコードはqsh/lex.goで実装しました。
構文解析
次に、字句解析で分割したトークンを使って、言語のツリーを作ります。このフェーズは主にgoyacc
で行います。YaccはBNFに近い記法を使って、言語の文法を定義するものです。例えばシェルで1つのコマンドを表すコードは以下のようなものになります。
%term IF
%term WORD
%left IF
%left '|'
%%
prog:
{
return 1
}
| line '\n'
{
Compile($1)
return 0
}
line:
cmd
| cmd ';' line { $$ = New(LIST, $1, $3) }
cmd:
| IF block block { $$ = New(IF, $2, $3) }
| simple
| cmd '|' cmd { $$ = New(PIPE, $1, $3) }
block:
'{' body '}' { $$ = New(BLOCK, $2, nil) }
body:
cmd
| cmd ';' cmd { $$ = New(LIST, $1, $3) }
| cmd '\n' cmd { $$ = New(LIST, $1, $3) }
simple:
word
| simple word { $$ = New(LIST, $1, $2) }
word:
'$' word { $$ = New(VAR, $2, nil) }
| WORD
これは、name: rule { code } | rule...
のような書き方になっています。rule
にマッチした場合はcode
が実行されます。慣れるまでは読みづらいかもしれませんが、例えばsimple
の定義は
-
word
が1回だけ登場する -
simple
に続いてword
が登場する
のどちらかである、と読みます。じゃあword
とは何なのかというと、
-
Lex()
が$
を返したトークンに続いてword
が登場する -
Lex()
がWORD
を返したトークン
のどちらか、という定義になっています。
ルールの読み方
例えばls
ですが、まずはLex()
が単語を読んでWORD
を返します。そのため、word
の2番目のルールにマッチして、次からはword
として扱われるようになります。word
はsimple
の1番目のルールにもマッチします。そのため、順に遡っていって、最終的にはline
として扱われます。'\n'
があれば、プログラムとして満たしているのでパーサは終わります。
次に、ls $opt
など2つ以上のトークンで構成される場合ですが、まずls
がsimple
として扱われます。次の$opt
は、Lex()
で分割したトークンとしては'$'
とWORD
であり、これはword
の1番目のルールにマッチするのでword
です。そのため、simple
に続いてword
が登場するパターンとなり、simple
の2番目のルールにマッチしてsimple
です。
3つ以上続く場合も同じですね。
トークン
上のYaccコードで、$$
とか$1
のような書き方がありましたが、これは%union
で定義した型のメンバー変数が対応しています。
%union {
tree *Node
}
%type<tree> line block body assign
%type<tree> cmd simple word
%type<tree> WORD
例えば以下の場合、
word:
'$' word { $$ = New(VAR, $2, nil) }
| WORD { $$ = $1 }
まずはWORD
のルール。字句解析の章でLex()
の引数にyySymType
という型が使われていましたが、これはYaccのコードで%union
を使って定義した型そのものです。この記事で書いたLex()
は、lval.tree
にポインタを代入していました。また、$1
などは%type<X>
のルールによってメンバー変数に置き換えられるので、Lex()
が代入したlval.tree
の値が$1
として参照できるようになっています。
$$
は、別のルールからword
を参照した場合に、何を値とするかを設定するものです。$$
が何も設定されなければ、$1
の値が暗黙的に使われます。WORD
のルールで$1
(実際はLex()
で設定した値)がそのまま$$
になるため、'$' word {}
の中で書かれた$2
はそのままLex()
の結果です。
構文解析の開始
Yaccで記述したパーサは、yyParse(l *yyLexer)
関数を呼ぶと実行されます。yyParse()
は内部的にl.Lex()
を必要なだけ呼び出し、プログラムを満たせばyyParse()
を抜けます。上記の場合はprog
を満たした時点で(simple
に続けて'\n'
が入力されたら)関数を抜けます。
一般的な言語の場合は、yyParse()
を1回だけ呼び出せばよいこともありますが、シェルの場合はコマンド実行が終わっても次の入力を待つ必要があります。yyParse()
は文法エラーなどがあった場合に非ゼロを返すので、エラーになるまで何度も繰り返すようにしました。
var l Lexer
f := bufio.NewReader(os.Stdin)
l.Init(f)
for yyParse(&l) == 0 {
}
Yaccでreturn
すると、その値がyyParse()
の戻り値として返るため、文法は正しいけどエラーにしたい場合などは、この方法を使うこともできます。
prog:
{
return 1
}
| line '\n'
{
return 0
}
最終的に、字句解析のところで書いた以下のコードは、
if { true } {
echo a is $a | wc
}
yyParse()
の結果このようなツリーになります。
type Node struct {
Type int
Str string
Left *Node
Right *Node
}
こういったツリーが完成したら構文解析は終わりです。
コード生成
最後にコード生成です。今回はシェルなので、マシン語にコンパイルする必要はありません。なので前の章で作成したツリーをそのまま実行してもいいのですが、個人的には、ループやユーザ定義関数などの実装を予定しているならコード生成を行ったほうが扱いやすいと思います。
今回実装したシェルでは、ls $opt
は以下のように内部コードへ変換します。
# ls $opt
MARK # 新規スタックを作成する
PUSH ls # lsという文字をスタックにpush
PUSH opt # optという文字をスタックにpush
VAR # 1つ取り出して変数参照; 結果をスタックに入れる
SIMPLE # スタックに溜まっているリストを実行
if
文の場合は少し複雑になります。以下はif { cmp -s a b } { echo ok }
の場合です。
# if { cmp -s a b } {
# echo ok
# }
MARK # 新規スタックを作成する
PUSH cmp # cmpという文字をスタックにpush
PUSH -s # -sという文字をスタックにpush
PUSH a # aという文字をスタックにpush
PUSH b # bという文字をスタックにpush
SIMPLE # スタックに溜まっているリストを実行
IF # 実行結果が正常終了なら1つ飛ばす(GOTOをスキップ)
GOTO end # endラベルへジャンプ
MARK # 新規スタックを作成する
PUSH echo # echoという文字をスタックにpush
PUSH ok # okという文字をスタックにpush
SIMPLE # スタックに溜まっているリストを実行
end: # endラベル; ls aがエラーならここに飛ぶ
こういった内部コードは、構文解析で作成したツリーがあれば比較的簡単に実装できます。
type Cmd struct {
pc int
}
type Code struct {
steps []func(cmd *Cmd)
}
func (c *Code) emit(f func(cmd *Cmd)) {
c.steps = append(c.steps, f)
}
func build(c *Code, p *Node) {
if p == nil {
return
}
switch p.Type {
case WORD:
c.emit(Push(p.Str))
case SIMPLE:
c.emit(Mark)
build(c, p.Left)
c.emit(Simple)
case LIST:
build(c, p.Left)
build(c, p.Right)
case BLOCK:
build(c, p.Left)
case VAR:
c.emit(Mark)
build(c, p.Left)
c.emit(Var)
case IF:
build(c, p.Left)
c.emit(If)
var end Label
c.emit(Goto(&end))
build(c, p.Right)
end.pos = len(c.steps)
}
}
以上で完成です。あとはコード生成が終わったCode.steps
を順番に実行していけば、それらしい動きをすると思います。
最初にも書きましたが、動作する完全なコードはリポジトリのコードを参照してください。
おわりに
今回、12月の頭からシェルを実装しはじめて、だいたい動作するかなというところまでで50コミット2,000行くらいでした。スペースの扱いとか、変数の間接参照とか、PATH以下にサブディレクトリを作れるとか、色々と好みの実装ができたかなという気持ちです。まだ足りない部分は一杯あるので、継続して開発していきます。
- Golangでの日付のフォーマット指定の方法について
- revelでHello World
- golang の net/http で basic auth
- AWS SDK for Go を使ってS3にファイルをアップロードする
- Goでスレッドセーフなシングルトン
- GolangでSHA-256ハッシュ
- もう目移り。ちょっち迷っている
- テーブルのカラムの値をnullかゼロ値かを判別する
- Go 言語に関するブックマーク
- Goでオブジェクト指向っぽく書く
- Revel templatesを使ったサンプルアプリケーション
- GoでRabbitMQに接続してみる
- CrystalとGoでHTTPサーバのベンチマーク
- Go言語のtestで、json apiのレスポンス検証を行う
- Chefのコマンド一発でサービスを作れる状態へ(CentOS6.6)
- gopherだからgoでgopherしよう
- Go Conference 2015 summer
- gbを知ったのでgojiを使ったWEBアプリケーションプロジェクトを管理してみた
- 「Docker」と新コンテナランタイム「rkt」をサクっと比較してみる
- 開発者から見た UNIX 哲学とコマンドラインツールと Go言語
- Go言語でAmazon Linux AMI向けのビルド
- SpheroをGo言語から制御して遊んでみた
- AWSでnginx+golangが動く環境を作る
- GoのBuild Constraintsに関するメモ
- Go言語(Go-Json-Rest)でAPIサーバーを立てるときのCORS設定 (Basic認証機能付きも)
- 「連結されたgzipを1行ずつ見る」をgolangでやったらハマった
- Goでwebサーバー作るときに考えたこと
- ginのBindingとValidationについての調査メモ
- iOSアプリのライセンス一覧のplistを半自動生成して設定画面にキレイに表示するプログラムをGo言語で作った
- Goのfor rangeで思った値が取れなかった話
- GoのWEBアプリケーション運用について
- Go言語(Go-Json-Rest)のCORSでのハマり。Safariだけでハマった話。
- deploy the MVMs of gae / go
- GolangでAPIを叩く
- Goji のアプリケーションサーバーを Circus で管理する
- 画像処理で写真をアニメ風に変換する
- gvmでgoをバージョン指定で簡単インストール
- golang の進捗どうですか
- Sensuでネットワーク監視やってみた
- Web Frameworkとして検討する言語とフレームワーク
- Golangで簡単にログを吐くことを考える
- Golangで簡単に一時ファイルを吐くことを考える
- go install時にno install location for directory ○○○ outside GOPATHのエラーが出る件について
- BigQuery の課金仕様と注意点をまとめてみた(2015-07 時点)
- 社内リポジトリのサブディレクトリをgo getするにはrepo名に.gitをつける
- gomobileでiOS用のライブラリをビルドするまで
- Gobotを使ってみよう
- Golangで、ResponseWriterを使ってHTTPレスポンスを組み立てる際にハマったこと
- Go の expvar パッケージを使ってアプリケーションのメトリクスを公開する
- Golang開発環境 3分クッキング
- ipから都市情報を取得する
- 文章を非可逆圧縮して容量削減を図る
- 多重起動を禁止する
- Create,NewFile,Open,OpenFileの違い
- Goで64bitと32bitの実行ファイルを同一Windows機で作成するために講じたこと
- やはり俺のgolangがCPUを一つしか使わないのはまちがっている。
- Windowsでtail -f
- x/net/context の実装パターン
- Git.io 短縮 URL を golang コードで取得してみる
- 任意のコマンドをWebサーバー化する
- はじめての Go 言語 (on Windows) その10
- Go言語でCSVの読み書き(sjis、euc、utf8対応)
- Go言語の文字列、バイト、ルーンと文字(翻訳)
- Golangのgormで、PrimaryKeyにUUIDを使う
- tcnksm/gcli を使った golang によるコマンドライン・ツール開発について
- Go言語でプロセス間同期処理
- Golangのgormで、カスタマイズしたtime.Timeに差し変える
- Go言語は空文字に対してstrings.splitを掛けると1要素の配列を返す
- goを1.5にアップデートして1.4とベンチを取る
- runtime.Caller(1)をなめて扱ったら危険かもしれない
- GoでCLIツール作るのに便利そうなパッケージを集めてみました
- Go Mockでインタフェースのモックを作ってテストする #golang
- Goのchannelの送受信用の型について
- そろそろ真面目に Golang 開発環境について考える — GOPATH 汚染問題
- 【Go】 go fmt でコード整形
- Golang による文字エンコーディング変換
- CircleCIでService Account使ってGAE/goへdeployする
- Javaばかり書いている僕がGo言語の勉強で参考になったサイトまとめ
- Go言語の作業ディレクトリをドキュメントに従って作り直してみた
- Go言語のドキュメントに従って簡単なライブラリとテストコードを作ってみた
- 文章からダジャレのみを抜き出すコマンドを作ってみた
- Go言語の自作パッケージに説明をつけてみる その2
- Go言語 http POSTする際のContent-Type
- 【Go】import 書き方まとめ
- go言語でベンチマーク
- Goでビルドバージョン情報を参照できるようにする(Go1.5)
- Golang の文字列連結はどちらが速い?
- そろそろ真面目に Golang 開発環境について考える — Internal Packages と Vendoring
- GoとRedisでアンテナサイトを作ってみた
- Goのバッチで統計を取得するAPIを用意しておくと便利
- Go言語の練習でTODOコマンドを作ってみた
- golangでhttpを監視するscriptを書いて結果をslackにpostする
- Mithril+golang Gin を試す
- モンティ・ホール問題をGoでやってみる
- Go言語でDIを試す
- 文中の人名をイニシャルに変換して匿名化をはかる
- golang+kocha で Web アプリケーションを作ってみて
- Docker の WebUI 作りました
- Alfred Qiita WorkflowをGoで書き直した
- gbでginをrunする
- Go言語版word2vecを作ってみた
- aws-sdk-goを使ってGoからAWS SQSを使う
- 楽ができるGolangのライブラリ達
- コンソールでGithubのReadme.mdを取得するコマンドを作ってみた
- char2vecを作ってみた
- 【Go】print系関数の違い
- Go言語のChannelは送信時にもブロックする
- Goのforとgoroutineでやりがちなミスとたった一つの冴えたgo vetと
- Dockerで独自レポジトリからgo getするお
- goからiOSまで一人でアプリ開発をしてたらいつの間にかマインクラフトエンジニアになった話
- Go 1.5をRaspberry Pi 2で使う
- Goで作ったプログラムでシグナルを受け取る
- 【Go】fmt.Print とビルトイン関数の print の違い
- cgoでMacのスリープログを勝手にとって作業時間の可視化してみた
- GAE/GoのRPCにフックするライブラリaespyを作った
- struct にアノテーションつけてたら go vet . すべき
- Goで多重連想配列
- AppEngine/PythonでDjangaeを試した
- gopherjs + electron テスト
- ISUCON5予選でスコア34000を出す方法
- Go言語の練習用にTwitterのOAuth認証をフルスクラッチしてみた
- Go言語でBigQueryのクエリを実行してみる
- GolangとPEGで作る言語処理系 vol.1
- Go(goquery)でQiitaのスクレイピングライブラリをつくった
- GoでJSONとYAMLを相互変換するツールを作った
- golangでスクレイピングをする準備
- Goroutine の同時実行数を制限する
- github でホストされている go アプリを fork して PR する時には、まず go get から始めよう
- Go言語のflagパッケージより便利というoptargを使ってみる
- Go言語の開発環境セットアップ
- PHP、Node.js、Go のミドルウェアに関する調査
- golangでnestしたstructの初期化がツライ
- go言語のslice操作をまとめてみた(shiftしたりpushしたり)
- sliceのシャッフル
- golangでi18n
- Go言語でチャネルとselect
- GoのEnumイディオム
- Go速習会
- Golangで自分自身で定義したパッケージをインポートする方法あれこれ
- RPG ツクール MV のゲームをブラウザ上でテストする
- ブラウザ上で動作する[開発|実行|チュートリアル|デモ]環境を作成できるCodePicnic
- 今後イケそうなデスクトップGUIフレームワーク
- おい、peco もいいけど fzf 使えよ
- Goで外部コマンドをパイプして実行する
- [Go] ビルドツール gb を使ってみた
- Go言語で簡単にHTTPリクエストを送ってJSONをパースするサンプル
- Go1.5でHTTP2サーバーとクライアント
- GoでXMLをパースする
- [Go] HerokuにRevelでつくったアプリをデプロイする
- [golang] struct の初期化で missing type in composite literal が出た場合の対処
- RubyからGoの関数をつかう → はやい
- UnixListener.Closeでソケットファイルが消えて困っている
- Goフレームワークのパフォーマンス比較
- Goでお手軽に行列の積を爆速並列計算
- Go で UTF-8 の文字列を扱う
- GroovyからGoの関数を使う→はやい
- loggingについて話そう
- GO 1.5 と C++ を SWIG でブリッジさせる方法
- golangでシグナルを拾ってgracefulにgoroutineを停めたい・改
- PHP から Go の関数を呼び出す
- goでDotenvを使用する
- golangでImageMagickを触りたい
- Go でパラメタライズドテストをする
- まだAWSのみに頼って生きてるの?複数のクラウド利用で、大幅コストダウンした話
- 【緩募】Golangでスライスの型のキャストをする方法が知りたい
- ATOM で Go
- GoでJsonファイルを読み込んで構造体として扱う。
- Go付属のツールでオレオレ証明書を生成する
- オブジェクト指向言語としてGolangをやろうとするとハマること
- オブジェクト指向言語としてGolangをやろうとするとハマる点を整理してみる
- “Swift” vs “Swift その2” (vs Go) 戦力比較
- 全くの素人がISUCON5本戦に参加しました
- GoのGUIライブラリshinyを試す #golang
- Goで連鎖性かつスタック指向の言語を実装する
- Tour of Go (Go言語基礎文法最速マスター)日本語版を更新しました #golang
- GoのChannelを使いこなせるようになるための手引
- Go http.RoundTripper 実装ガイド
- Go言語でRedshiftとつなぐ(というかただのPostgreSQL)
- Go言語で REST API + マイクロサービス
- すごく長い行を読む場合の注意点
- golang.org/x/net/websocketの使い方とkuiperbelt
- soracom-sdk-go ベータ版でいろいろ試す
- Google App Engineのリージョン別レイテンシ
- Zaif取引所(Bitcoin/Monacoin)のAPIをGolangから使う
- Goでフィルタコマンドを怠惰に書く
- goのmgoでfindするときの処理
- GolangのOpenGL事情(WebGLも含むよ)
- lazyなGoやリスト演算なGoについて
- Go と reflect と generate
- AWS SDK for Go の基本とRoute53へのHostedZone作成とレコード作成
- Go+Webアプリケーション+CircleCIで静的解析・テスト・バイナリリリースを効率良く行なう
- 外部APIを使うController用のTest Doubleライブラリを書いた
- Exifの回転情報をピクセル情報に反映する
- Go を レンタルサーバーで動かす方法
- GoでHTTP負荷テストフレームワークをつくった
- 1行もGo書いたこと無いけどGo Conference Winter 2015に参加したので資料をまとめた
- 簡易リバースプロキシ「ichigo」でWebアプリ開発が捗る話
- glide – パッケージ管理のお困りの方へ –
- Golangで静的ファイルをバイナリに含めるライブラリを書いてみた
- GoからBLE制御でPLAYBULB Candleの操作をしてみる
- Goのjson.Decoderの使い方
- Go言語でバイトニックソート実装してみた
- Go言語入門 パッケージの作成、便利ツール、interfaceとは。
- PythonのABC – 抽象クラスとダック・タイピング
- 初心者がごるーちんでハマるところ
- GoのMemcacheパッケージ比較
- Go開発向けVim設定
- Go言語に1日で入門したときの頭の使い方の話
- go の regexp が遅いと知らずに regexp で form に fillinするモジュールを書いた
- GoとDockerとMicroservices 最初の一歩
- OS XのネイティブHypervisorを使うxhyveと、ネイティブDockerを立ち上げるdocker-machine-driver-xhyveを作った話
- 手間をかけずに形態素解析を Elasticsearch Service (on AWS) で用意する
- Goで型を挿げ替え可能なデータ構造ライブラリを作る
- Go Web Frameworks 比較
- golangでgitのサブコマンドを作ろう
- golangでrecoverしたときの戻り値
- GAE/GoでSlackの’/’(スラッシュ)コマンドサーバーを立てる
- Goでのシリアル通信でハマった事
- go-swaggerの紹介
- gomobileで日本語フォントを扱ってみる
- Vim で引き籠る
- flag 並にシンプルでより強力な CLI パーサ kingpin の紹介
- GoでGitHub通知をデスクトップ通知として取得するアプリを書いた
- Go言語でRICOH THETA API v2を叩いてみた
- GoでBLEセンサーデータをBeamする
- GunosyでのGoパッケージ構成の歴史
- Packer プラグインの書き方(Provisionerを例に)
- Goでパケットキャプチャを実践してみる
- プロダクト開発でのGoのテストとモック活用事例
- vimでGoのシンタックスチェックをquickrun+vimprocで非同期に行う
- GAE/Goでもgoroutine使おうぜ!というハナシ
- ChromebookでGo!(ChromebookでGo言語を楽しんでみる)
- 本物の golang を… 本物の Gopher を、お見せしますよ。
- コネクションプールのチューニング
- Go、Scala、Clojureで開発する3社が集結!!
- GoとAlefとLimbo
- sidekiq用のmackerelプラグイン書きました
- Goだからこそ許される3つの作法
- Go言語で実現するフォースの覚醒 (Gobotで脳波をなんとかする)
- GoでShared Libraryをビルドしてみた(簡単ドキュメント指向DB)
- はてブ ホットエントリーを一覧表示してくれるCLIツールを書いた
- GoでHTTPサーバを立てる
- 最速という噂のFlatbuffersの速度のヒミツと、導入方法の紹介(Go)
- Go言語でサーボモータをキュイキュイ動かす
- emacsでGoの環境構築をやる
- z.shをGoで書き換え(ようとしてい)る話とGoの学びかた
- GoLearnについて
- GAE/GoとGojiの組み合わせでテストを書く
- Goで3Dモデル変換してプレビュー
- slackのログをAWS(DynamoDB)にためて、検索できるようにした
- vscode-go/READMEとdelve/Buildingの日本語訳
- あるとちょっと便利なコマンドラインツール3つ
- Concurrencyについてm9(^Д^)プギャーられないための基礎知識
- ターミナル画面を勝手に共有して他人の作業を覗いてみる
- Go最後の秘宝「GUI」を探しに行く
- [golang]RevelでCSRFの対策
- Goで小さなScheme、Gigueを実装しました
- Google Cloud Monitoringのカスタムメトリクスを使ってTask Queueを監視したいズラ๑◉ﻌ◉๑
- 気楽にDynamoDBを使おう
- gonp〜Goによるdiffのアルゴリズム実装〜
- Kami – process monitor. inspired by god.rb
- nanogui.goの進捗を記録するスレ
- Goでデーモンを作るにはどうするのが良い?
- IntelliJ で Go ファイル保存時に整形する
- Go + QML + QChart.js で素敵なチャートを表示する
- GoでRESTfulなWebアプリを作りたい (go-restfulを触ってみる)
- importによってパッケージを拡張する方法(プラグイン)
- golang で AB x CD / E – F * G * H = 2016 になる全パターン洗い出し
- go 1.6でhttp.Clientが自動的にhttp/2を使わないようにする方法
- ゲームにおける正しいアイテムドロップ抽選実装
- go-redis/redis のクライアントが PubSub で共用できることを確認した
- 値渡し、ポインタ渡し、参照渡しの違い
- golang coreutils 探しメモ
- 重みをつけてランダムに何か出したい
- iOSエンジニアがGoを使ってみての所感
- CLIのWebsocketクライアントを作ってみた
- GoでhttpリクエストにHostを設定するにはreq.Headerではなくreq.Hostを使う
- Goで帳票をPDFに作成するライブラリ。 請求書などの複雑なフォーマットにも対応
- Web Application周りのテスト方法
- はじめてのGo言語 – インストール〜nginx導入まで –
- Go言語でstructをmapに変換する
- ユニットテストが書きやすい設計〜自家製モックを添えて〜
- Go言語でMongoDB使う ②埋め込みとの相性
- go testの並列(-cpuと-parallel)がなんの事だったか忘れた時のメモ #golang
- database/sql の Rows.Scan で不要なカラムデータを読み捨てる
- Go で簡単に Excelを作成するライブラリ。 色、罫線、網掛けを事前定義済
- 複雑なPDFをテキストファイルから生成。Windows,Mac,Linuxの実行ファイルなので、どの言語でも使用可能
- GoのgRPCでRemote IPを取得する方法
- 複雑なExcelをテキストファイルから生成。Windows,Mac,Linuxの実行ファイルなので、どの言語でも使用可能
- Go 1.6 でポインタをcgoの関数へ渡す際の注意点
- Go1.6でポインタをcgoの関数へ渡す際に発生するcgoCheckPointerを回避する方法
- go言語でゲーム
- 複数のgroutineが連携する通信オブジェクトの設計方針
- GoでANSIエスケープコードを扱うライブラリを作った(色付け・カーソル移動等)
- CentOS6.5にGoをインストールする
- Go で “broken pipe” を無視したい僕達がハマる罠
- iOSアプリの新規レビューを通知してくれるSlack Button Appを作った~手順と申請手続き
- Go で interface {} の中身がポインタならその参照先を取得する
- Go1.6の新機能
- golangの AriticleExtractor “GoOse” を試してみる
- [翻訳+α] Go言語の設定ファイルライブラリ Viper
- net/httpでポート443のHTTPSサーバーを立ち上げるまで
- テキストをカジュアルに暗号化したい
- GolangのGin/bindataでシングルバイナリを試してみた(+React)
- Ruby,Golang,ES2015比較チートシート
- 概観からGoのWebFrameworkを選ぶ(2016/02)
- Go の DB アクセス用のパッケージを作った
- golangの静的解析,カバレッジ解析,バイナリリリースをCircleCIで簡単に整える
- 異なる環境間で private network を構築して接続する
- vim-go-ideでさくっとGolang開発を始める
- ひとりぼっちのサービス開発における技術選択の遷移と戦略
- Golangでparserをつくって、SQLを解析してみよう!
- [golang]GoでbitFlyerのAPIへアクセスしてみた
- Goのfor文で関数のリストを作ろうとして嵌った話
- golang コーディングテストで使うメソッド・テクニックまとめ
- Go のバッファ付きチャネル close の挙動
- Golang: nil Pointer Receiverの話
- 企業動向にアンテナを張るためにQiita Organizationのキュレーションサイトを作った。
- 何も考えずMac上のGit diffでExcelの差分を見れるようにする
- Go言語でプリント文デバッグするときのTips
- HomebrewでGo 1.6を入れる
- ElectronのスタンドアロンMacアプリに無理やりGoのHTTPサーバーを仕込む
- golangでcrontabからドキュメントを作成するコマンドラインツール crondocを作った
- ファイルベースのQiitaクライアントqiitactlを作った話
- Google App Engine SDK for Goを使ってGAE上でアプリを動かすまで
- goroutine 使い方まとめ
- Go言語でGoogle Cloud Vision APIを使う
- GolangでPostgreSQLのJSONデータ型を読み書きする
- Go言語の可変長配列(slice)を使う上での注意
- Go言語で作った実行ファイルを小さくしよう!
- goでスクレイピングするのにgoquery + bluemonday が最強な件
- Go 1.6 templateパッケージ新機能
- go言語でhttpモックサーバを作る方法(2016/02時点)
- RaspberryPi1(2とzeroも)で動かすgolang製アプリをクロスコンパイル(onMac)
- GoでSpreadsheetを操作するパッケージを作った
- VisualStudioCodeでGAE/Goの環境設定
- Golang開発環境構築 in MAC
- GoでGCEからGCSにファイルを書き込む/読み込む
- 10分で終わるGo言語の開発環境構築
- Go言語のスクレイピング系ライブラリまとめ
- vagrant、ansibleでgoの開発環境を構築してみた(所要時間:15分)
- Go+goqueryでGithubRankingにWebスクレイピングを試みる
- Ginの Middleware と HandlerFunc でデータの受け渡し
- vim-goをインストールしてみた(所要時間:15分)
- GoogleAppEngine/Goのインストールから使いやすくするとこまでをさくっと 後編
- ざっくりGoの文法まとめ
- Dockerのbusybox内でgolangのtimeを使ったらエラーになった
- Golangで外部コマンドを実行する方法まとめ
- golangでlogを標準出力とテキストファイルの2箇所の出力する
- ズンドコキヨシまとめ
- Go製のData Shipper Platform「Beats」が良さそうなので紹介してみる
- Go の echo ってWebサーバーでサクッと REST しちゃう
- Go 言語 1つの構造体に複数の validation を適応する
- SensorBeeとは何か?
- あえて aws-sdk-go で dynamoDB を使うときの基本操作
- WebRTCの勉強でむりやりGo使ってみた!
- gometalinter で楽々 lint
- Golangで標準入力がパイプで渡されたものか判定する
- Goのプログラムでどういうリクエストを飛ばしているのか見たい
- Go言語をyumで入れる
- [2016年3月時点]Mac用Electronバイナリに署名してApp Storeにアップするためのメモ
- microservicesの調査に向けて〜Golang製のzipking tracerのgo-kitを利用してみる
- GAE/Go 旧appengineパッケージから新appengineパッケージ(google.golang.org/appengine)への移行ガイド
- nginx+circus+gojiによるgolang webアプリケーションの動作環境構築
- GoでJSONの一部分を利用者が定義した構造体に読み込める便利な手法を見つけた
- CentOSにGo言語をインストール
- sliceの重複チェックを高速化
- go言語初心者が図を書きながらgoroutineやgo channelを理解する(Part1)
- Golang GinでReact.jsのサーバサイドレンダリングを試してみた
- 大谷翔平の打席になったら自動でチャンネルを変える
- CSV から構造化された JSON を生成するツールを Go で作った
- コードレビューに大事な褒め言葉
- 2016年から始める Google App Engine for Go
- 【取得できた!!】IntelliJ IDEAのオープンソースライセンスでUltimate版を無料で使いたい!
- Golang (heroku) で LINE Bot 作ってみる
- GAE/GoでLINE Bot Trial
- LINE BOT をgoで作ってみたよ
- ゴルーチンで発生したエラーの返し方
- cgoを使ったCとGoのリンクの裏側 (1)
- [2016年春版] 静的サイトジェネレーターHugo導入Tips ①インストールとサイトの初期作成
- atomicパッケージが必要な理由と使い方
- go言語初心者が図を書きながらgoroutineやgo channelを理解する(Part2)
- Google App Engine for GoでOAuth2による認証を用意する
- Facebook Bot API + Go でオウム作ってみた
- go言語でのマイクロサービスフレームワークの雑な比較メモ
- Go でコメントアウトせずに素早く複数行スキップさせる
- Angular2 Tour of Heroes with Golang (w/o npm)
- GAE/Go urlfetch.ClientでGetしたらタイムアウトエラー「urlfetch: DEADLINE_EXCEEDED」の解決方法
- phonyでテスト用データを超絶簡単に作る
- Go言語のHello Worldを3分で試す
- Go Conference 2016 Spring
- GoのWebフレームワークのGoji (goji.io) をGAEで動かす
- Go製のフレームワークechoを使ってJSONを返すWebサーバーを作り、GoogleAppEngineで動かす
- Golangで、テニスの大会のエントリーページから、大会情報をクローリングしてくるサンプル
- Arukas.io CLI、まだ β なのに便利だった
- あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた
- Goでのログ出力に標準logとcologを使う
- jsonpbはencoding/jsonより5倍遅い
- 他言語から来た人がGoを使い始めてすぐハマったこととその答え
- echoのAPIサーバ実装とエラーハンドリングの落とし穴
- ディープラーニングで「顔が似ているAV女優を教えてくれるbot」を構築
- [golang]GoのSDKで手軽にLINE BOT APIを試してみた
- 「Go言語によるWebアプリケーション開発」でハマったところ
- インタフェースを埋込む #golang
- Go言語のエラーハンドリングについて
- 愛が生まれた
- なんで愛が生まれるのか
- Goで値が文字列のJSONを構造体にパースする
- GolangのフレームワークEchoの話とHelloWorldサンプルを読み解くだけ
- UnityのネイティブプラグインをGoで書く #golang #unity
- Go製WAFのuconを触ってみた
- Terraform for さくらのクラウド
- Negroni + Gorilla/Muxで簡単なサーバーアプリケーション作る
- Goフレームワーク vs PHPフレームワーク
- Go言語で東京メトロAPIを叩く
- Cloud9でGAE/Goの環境構築
- GAE/Goで形態素解析してみた
- MySQLでのトランザクション処理をGolang+dbrで実現してゆく話
- コマンドラインからググれてもいいと思ったので作った
- Kubernetes の Go API クライアントライブラリを使って Kubernetes を直接操作する
- cgoを使ったCとGoのリンクの裏側 (2)
- Terraform for さくらのクラウド スタートガイド(第1回)
- Go言語のエラーハンドリングについて ~panic編~
- Lambda with Apex: Terraformを使った管理
- Amazon Linux に GoLang をインストールし、NginxのWebサーバを構築 & 簡単なHTTPレスポンスを受けるまで
- Gin(Golang)におけるHTMLテンプレート記述方法
- Amazon Linux に GoLang (1.5) をインストール & Gin、MongoDB (3.2) を導入し、APIサーバ を10分で作る
- Go言語の並行処理デザインパターン by Rob Pike 前編
- Go言語の並行処理デザインパターン by Rob Pike 後編
- go1.7 の気になるところを試した
- contextの使い方
- Windows に インストーラを使って GoLang を インストールするときの注意点
- HUGOで作れるCMSっぽいパーツ:関連記事・目次・JSON-LDなど
- Goのjson.Unmarshalで値にJSONのnumber、string両方の可能性がある場合
- GAE/Go+WebPushAPI+FCMでPush通知
- Hugoで新規記事を作成するときのTips的なメモ
- Go + WebDriver でブラウザ操作を自動化する
- Goでjqっぽくinterface{}の中を探索する
- go+ginでローカルで作ったWebアプリをGoogleAppEngineに載せる時に注意することまとめ
- Go+gin+dbrでセッション管理(ログイン・ログアウト)をする話+HTMLテンプレートにセッション情報を埋め込んで制御する
- Apexを使ってGoでlambdaを動かす
- labstack/echoの2.0がreleaseされてたのでAppEngineで動かしてみる
- Go+gin on GAEでBlobstoreを使ってCloudStorageにファイルをアップする話(公式ドキュメント解説を添えて)
- golangでURLをパース
- Goでパスワード入力を読み取る(Windows/Mac/Linux対応)
- Go言語による高速な接尾辞配列の実装(SA-ISの実装)
- Go で作ったゲームを Android/iOS 対応させた話 (1)
- UnityのセーブデータをGoogleAppEngine/Go(with Datastore)に保存したり読み込んだりする話
- ターミナルでスライドを再生するコマンド『pera』を作った。
- Docker Compose で Go の開発環境をサクッと作る
- GoogleスプレッドシートでGopherを描く with Go
- GAE/Go+ginでHTTPリクエストも含めてEnd to Endなテストをする話
- Github on BigQueryを使ってgoでよく使われるpackageを調べる
- Go製のフレームワークechoをHerokuで動かす
- Crystal 言語の 2016年を振り返ってみて
- Go でコードカバレッジを取得する
- 高速でダウンロードできるツールを Go で実装した。
- goでmicroserviceをつくる
- GoでGitHub Issuesのビューアを作った
- goimportsのスキャン対象から特定ディレクトリを除外する
- NHK番組表API を使ってアニメの音楽番組をslackに通知する
- (比較的)標準化をした Vuls/VulsRepo の導入
- NATSについて調べて動作を試してみた
- golang で Evernote のノートを Jekyll 用の HTML に書き出すツールを書いた
- 集合知で各言語、ライブラリ、フレームワーク、DB、アーキテクチャの適材適所をみんなでまとめたら面白いんじゃないか?
- goroutine と channel を使った並行処理のパターン
- Filebeatで複数行を扱うMultiline設定まとめ
- あなたのWebサービスでLDAPユーザ認証を実現するgo-ldapc
- golangで設定記述にTOMLを使う
- Termuxでお手軽ポケットlinux開発環境(例えばnvim+golangが手元に)
- Ubuntu 16.04 に GoLang 1.6 と Gin Web Framework をインストールし、HTMLテンプレートを読み込むまで
- Gin Web Framework と GORM を使って簡単なウェブアプリを作ってみる
- マイクロサービスのフレームワークまとめ [不定期更新](2017/02/25更新)
- WindowsのDLLをGoで作る
- Google Sheets API v4 と サービスアカウントと Go でスプレッドシートを操作する
- textqlが超便利
- CLI作成支援パッケージ Cobra を使い、Go 言語でコマンドラインツールを作ってみる
- データのバージョン管理が可能な分散データベースNomsをさわってみる
- Windows 使いの為の GAE/Go 開発環境構築
- go言語のwebフレームワークechoとpythonのwebフレームワークflaskの速度を比較してみた
- MacでGo開発環境構築
- golangの関数をまとめてみた。
- Go言語でサーバのGraceful Shutdown
- golang メソッドについてまとめてみた。
- #golang CodeReviewComments 日本語翻訳
- IntelliJ CE + Delve で Go 言語のデバッグ環境構築(Mac)
- golangではスタックとヒープを気にする必要が無い
- Go 言語で Websocket を使ったアプリケーションをつくる
- Google App Engine for Go のローカルサーバでデバッグをする #golang #GAE
- Go言語でランダムな文字列を生成する方法の比較
- Heroku への Go 言語製アプリケーションのデプロイと依存パッケージ管理方法の比較
- Docker for Macで開発環境がほんとに早くなったのか?(心の中のモヤ×100がモヤ×99になった)
- GoでAWS SDKを叩くCLIツールを作ってリリースするまでの流れ(aws-sdk-go+cobra+viper+gox+ghr)
- GAE/Goで本番のDatastoreをローカル環境に持ってくる 2016
- golang.org/x/time/rateで速度制限を行う
- インタフェースは型名を公開しなくても実装できる #golang
- ChatGopsで本物のGopherを、すぐそばに…
- 終了したことを他の複数のゴルーチンに伝えるのにチャネルのcloseを使う #golang
- Go で WebSocket を簡単に扱えるパッケージを作った
- else ifにも代入文が書ける #golang
- fmt.Formatterを実装して%vや%+vをカスタマイズしたり、%3🍺みたいな書式をつくってみよう #golang
- Go 言語の http パッケージにある Handle とか Handler とか HandleFunc とか HandlerFunc とかよくわからないままとりあえずイディオムとして使ってたのでちゃんと理解したメモ
- Go言語+Ginで相関項目チェックを実装する(テストコード含む)
- golangで部分文字列を取り出す
- Golang + Echo + MySQL まとめ
- Macでjupyter XXX (iruby, R, nodes, go) インストール
- logmon-goで簡単ログ監視
- Go 言語で JWT を使って認証と認可を低コストに
- Docker+AlpineLinux3.4+Go1.7+Nginxでfreshを使って自動ビルドする開発環境を作る
- Go 言語で Excel ファイル内の文字列を自力で置換する
- golangのioutilべしべし叩いてみた
- Golangのbundleコマンド
- Travis CI から複数ファイルを GitHub Releases にアップロードする
- gRPCを使った簡易的なマイクロサービスを作ってみた
- 競技プログラミングで使うGo言語基礎
- Go 言語 reflect チートシート
- 自宅の使用電力を見える化してみた
- Go WEBフレームワークEchoでmiddlewareを自作する
- gocsvを使ってラクにCSVファイルをつくる
- 全く新しい銀行を1から作るために必要な技術 (Monzo公式ブログより)
- Go 1.7のホスト名前解決の仕様変更
- LINE Developer Trialを GAE/Go で始める #linedevday
- スクレイピング結果をJSONで返すAPIをGAE/Goで作る。
- DatastoreからGetした時に余計なPropertyがある場合エラーになるが無視してもいい
- GoでSlackへ通知してみた
- golangでunix domain socket経由で通信するechoサーバーを書いてみた
- golangにgoto文が存在する理由
- [検証中]更新のあったファイルだけgo testを走らせテストを高速化する #golang #gae
- LINE NotifyをGoで送る #golang #linedevday
- golangで書くunix domain socketを使ったserver/clientのサンプルコード
- Goのpathとfilepathでは動作が異なる Windowsでも正しくパスを扱う
- tmux 上でバッテリーの残量が一目でわかるコマンドを Go で作った
- GoのJSON API ServerでゆるふわJSON responseを返す方法
- GAE/Go で公開鍵暗号を使う JWT 認証サーバーを作った
- Golangでエラー時にスタックトレースを表示する
- Golangでinterface{}を使ったJSONのパース
- Go言語でTodoistのCLIクライアントを作ってみた
- HerokuとGoでLINEの Messaging API環境を作ってみた
- Go のバイナリには -ldflags ‘-w -s’ でコンパイルしてもたくさんパスが埋め込まれていた
- 独自のfmt.Formatterを実装する
- Golang製DBマイグレーションツールgoose + MySQLを試してみた
- Go(golang)+HerokuでLINE Messaging APIに触れてみたよ!
- TwitterはGoでゴー。
- Go+GAE+Cloud Datastoreで簡単なREST APIを構築
- Firebase Realtime Database を Rest API と Golang でいじってみる
- Go言語でハマったNつのこと
- Go言語でJSONに泣かないためのコーディングパターン
- Firebase Notifications からメッセージを送ってみる iOS10版
- GAE/Go (echoフレームワーク)で Line Message API 使って Bot を作る。
- testeratorを使ってgae/goのunit testを高速化する
- Go で Neo Cowsay を作った
- context.Contextでリクエストスコープな値を持ち回す
- echoのv3にアップデートした時に修正した箇所
- オレオレGo入門2016
- 初心者が2016のプログラミングで思うこと
- Go言語でJSONの生成を構造体無しでJavaScript並に簡単に生成できる方法
- JSONをインタラクティブに掘り下げるコマンド jid
- go get しようとしたら SSL protocol error エラーが出るとき
- Go言語でS3にアップロードする時速度制限をかける
- PHPerに贈る、GoでWebサーバー開発環境構築
- GoでのWebアプリケーションの組み立て方
- GolangでGetWildの’89バージョンを演奏する
- boto3からaws-sdk-goにしただけでCPU使用率が75%->10%になった
- GoでSSHサーバにラインエディタが欲しいなら golang.org/x/crypto/ssh/terminal
- Golangでテストしやすいコードをかく
- 冷蔵庫の余った食材からレシピを提案するボットをリリースしました
- 新しく入ったReverse Binding機能を使ってPure GoでAndroidアプリを作ってみる #golang #gomobile
- 社内のバックエンド開発にgRPCを導入してみた
- PocketCHIPでGoのGUIアプリを動かしてみる
- 早明浦ダムの貯水率を見れるコマンド作った
- gojaを使ってGoでJavaScriptの実行を試してみた
- go言語のデバッガ(delveとgdb)とcore dump
- APIライブラリをgo-json(改)で楽に実装する
- VisualStudioCodeでGo言語開発環境を作ってみた
- Echoはver.3で結局のところ何が変わったのか?
- Go言語でファイルアップロードを使ってみる
- macの初期ターミナルでも画像を表示したい
- go-bindataで実行バイナリにWeb UIをバンドルする〜slackboardの場合〜
- 実践的なGAE/Goの構成について #golang #gcpja
- Go!プリンセスプリキュアのGo言語実装「GoPrecure」
- init関数のふしぎ #golang
- Goの構造体の研究
- Goを学びたての人が誤解しがちなtypeと構造体について #golang
- RubyistがGoに入門してDBマイグレーションツールを作った
- Goで真面目にコレクション操作ライブラリを作ってみた
- GoからCのライブラリを呼ぶ
- gorenameをライブラリとして使う #golang
- GitHubで自動生成コードをDiffに表示しない方法
- CとGolangの境界
- LINEBOT SDK GOを使って月曜日のたわわBOTを作った。
- git管理ファイルを透過的に暗号化するgit用フィルタを作った
- GetWildの信号強度を解析し、音の大きさを可視化する
- 秒間500件以上のLOGフローアーキテクチャ
- Go でツール書くときの Makefile 晒す
- GolangでKey-Valueリソースのキャッシュと分散合意によるコミットをする
- GAE/Go で巨大な Zip を扱う
- golangの開発で使っている色々
- Hacker Newsを一覧表示してくれるCLIツールを書いた
- Golangのconst識別子iotaの紹介
- Go言語をMacにインストールしてみる(goenv + direnv + glide)

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。