読者です 読者をやめる 読者になる 読者になる

Go

Goライブラリもウルトラ簡単に作れる!

RubyGemはめっちゃ簡単に作れる! - 酒と泪とRubyとRailsとでRubyライブラリの公開方法が紹介されていました。 Goライブラリも知らないとハードル高そうに見えますが、実はかなり簡単につくれます。 これから積極的にGoライブラリを作ってOSSの世界に貢献し…

go-gitconfigで自作ツールの設定を~/.gitconfigに書く

Goプログラマ必携のGoライブラリ管理ツールghqは、 インストール先などを~/.gitconfigから取得するようになっています*1。 まぁ、非開発者はどうするかとか、そもそも他ツールの設定ファイルに相乗りするのはどうなのかとかは問題ですが、開発者用と割り切れ…

PythonのfileinputをGoで実装してみた

Pythonの○○をGoで実装してみたシリーズ fileinputは、行単位で処理を行うコマンド(特にUNIXフィルタ)を作るときなどに便利なライブラリ。 import fileinput for line in fileinput.input(): process(line) コマンドライン引数で与えられたファイルの行に順…

ソースに一行追加するだけで実行時にバイナリをバルスできるモジュールを書いた

バズーカが弾切れ、絶対絶命のピンチ、メガネの小悪党がmain関数を実行する前に実行ファイルを削除したいというのはよくあることです。 使用例 たとえばこういうコードに・・・ // get.go package main func main() { println("ハハハハハ!飛行石を手に入れ…

Goplay: Goで手軽に書捨て環境を作るツール

Go

goreの説明を追記。 LLから、Goに移るときの不満の一つに「標準のREPL(インタラクティブシェル)が無い」があります。 「ポインタはmapのキーになるんだっけ?」のような、つまらない(けど、ありがちな)疑問を解消するには、ドキュメントを漁るより、コー…

Go-GTKでCUIとGUIをつなぐ的なアプリを書いてみた

Go

プログラマーは往々にしてCUI世界の住人なのですが、 ごくたまに、ファイルをドラッグ&ドロップで指定できると便利、ということがあります。 doloopwhile/dap · GitHub スクリーンショット インストール go get github.com/doloopwhile/dap 使い方 ドラッグ…

Goライブラリを作ったら、とりあえずgodocdown

Go

小さなGoライブラリをつくった時、ほとんど自分しか使わないような規模なら、わざわざREADMEに「Usage」「Example」「Functions」なんて書くのは面倒ですよね。 そんな時は、godocdownで自動生成してしまうのがオススメです。 godocと同等の内容をGitHub用Ma…

Goでも独自型をrangeしたい!chanを使う

Go

Pythonでは__iter__メソッドを定義すれば((Rubyでは.eachメソッドを定義してEnumerableをincludeすれば、C#ではGetEnumerator()メソッドを定義すれば、 PHPではIteratorを実装すれば))、 晴れて独自のコレクション型でも、foreach文などでループできるように…

Goによるデザインパターン - Strategy パターン (2)

Strategy設計の失敗 前回で、HTMLとテキストでレポートを出力するコードを書きました。その中でFormatter interfaceを定義し、その具象型としてPlainTextFormatter HTMLFormatterを定義するというStrategyパターンを採用しました。 しかし、気になる点が無い…

Goのinterface - 使う側で定義する

Goのinterfaceは「使う側」が定義するもの 前回Formatter interface、Formatterを使ってレポートを出力するReport struct、 Formatterの実装PlainTextFormatterとHTMLFormatterを定義しました。 type Formatter interface { OutputStart() OutputHead(text s…

Goによるデザインパターン - Strategy パターン (1)

例:レポートを出力するクラス。 レポートをHTMLで出力するstruct*1を作ったあなた。上司からプレーンテキストでも出力してくれと言われてしまいました。とりあえず、フォーマットを引数で指定するようにしたのですが・・・ *1:レポートの内容はフィクション…

Golangビルド時に、サブパッケージ内の変数をいじる

Go

mainパッケージに変数を埋め込みたいとき Goで作ったアプリで --version 用にバージョン番号とビルド日時を埋め込みたい。 そんな時、-ldflagsを使えばいいのはwell-knownだと思います。 go build -ldflags=" -X main.compiled 'ビルド日時' -X main.version…

なぜCLIツールはGoで書くべきなのか? Go beyond Python

Go go

「Goは興味あるけど、会社は(Python|Ruby|PHP|Perl|Java|C#)だからなぁ」というあなた。 個人的なCLIツールを、Goで書き直してみたらいかがでしょう? GoはLL並に書きやすいだけでなく、LLには無い優れた特徴を兼ね備えた言語なのです。 上記は、自社のGo la…

Goで高速にLog10を計算する

数値を右揃えあるいは0詰めして表示するのはまれによく遭遇するタスクです。 fmt.Printfには出力幅を指定する機能がありますが、幅をいくつにとればよいか、 言い換えれば「一番大きな数値の、桁数はいくつか?」は、プログラマーが計算しなければなりません…

GoからVimを起動する

Go

「VimからGoを」ではありません。 CLIツールに設定ファイルをエディタで開く機能(git config --editのような)をつくろうとしたところ、上手く行きません。exec.Command("vim").Run() で vimを起動しようとしても、exit status 1で失敗してしまうのです。 …

pecoでgit rebase -i

peco/pecoでgit rebase -i のrebase先を選択するコマンドを作りました。 git-rebase-i-peco: select rebase -i target 私の場合、commit --fixupとrebase -iが「マウスでコミット番号をコピペしがち&よく使うコマンド」の双璧なので、これでマウスレス・Git…

pecoでgit commit --fixup

peco/pecoがそこそこ流行っているみたいなので、 git commit --fixup の fixup先を選択するコマンドを作ってみました。 git-fixup-peco: select fixup target with peco これで、git log してコミット番号をマウスでコピペする必要がなくなりました! # 実は…

cgoを試す(Goから./jqを呼ぶ)

Go

Go言語には、C言語のコードを呼べるcgoという機能があります。 「json版sed」の./jqの機能を呼んでみます。 jqを選んだのは、 * ./jqはコマンド自体はそこそこ有名 * Go言語から直接呼べれば役にたつ(かもしれない) * APIが単純 * mrubyやImageMagickのよ…

direnvで解決するGOPATHの3つの問題点

Go

GOPATH 問題 Gophers! 周知のようにgoはGOPATHで依存パッケージをどこにインストールするか決められます。 入門記事などでは、~/.bashrcや~/.zshrcの中で export GOPATH=$HOME/gocode または export GOPATH=$HOME とすることが多いようです。 しかし、GOPATH…

pyenvオワコン、direnv最強

社内勉強会で発表しようと思ったけど、寿司の運搬という重大任務を仰せつかって、流れてしまったスライドを転載 direnv is an awesome successorof ***env's. from Kenji Omoto (なお原稿では乱立する"***env"をマスコミは「目があって角が2本」としか認識…

PythonのitertoolsをGoで実装してみた

Go

Just a practice. go-itertools イテレータの代わりにchan intを引数に取るようにしました。 int型しか受け付けないし、nth repeat などの単純な関数しか実装していません。 しかし、個人的な気付きがいくつか: 送信側(ch <- xする側)で、全データを送り…

Gomの「指定バージョンをチェックアウトする機能」だけ取り出したコマンドを作ってみた

Go

https://github.com/doloopwhile/gocheckout 使用例 martiniのバージョン0.1を使いたいとき、 gocheckout github.com/go-martini/martini v0.1 なぜ作ったか? 周知の通り、Go本体にはRubyのBundlerのような、依存ライブラリのバージョンを指定する仕組みが…