go-gitconfigで自作ツールの設定を~/.gitconfigに書く
PythonのfileinputをGoで実装してみた
Pythonの○○をGoで実装してみたシリーズ
fileinputは、行単位で処理を行うコマンド(特にUNIXフィルタ)を作るときなどに便利なライブラリ。
import fileinput for line in fileinput.input(): process(line)
- コマンドライン引数で与えられたファイルの行に順番にアクセス
- 引数が空の場合は標準出力の行にアクセス
- ファイル名として '-' が与えられたときも標準出力の行にアクセス
使用例
sc := fileinput.Lines(os.Args[1:]) for sc.Scan() { process(sc.Text()) // 行を処理 } if sc.Err() != nil { os.Stderr.WriteString(sc.Err().Error() + "\n") os.Exit(1) } // なお、ファイルハンドラを閉じる処理は.Scan()や.Err()の中で自動で行われる
Python版との違い
Go版はbufio.Scannerを真似たインターフェースにしました。 そのため、Pythonほどシンプルではありません(Pythonはfor文に渡すだけで使えるが、Go版は覚えるべきメソッドが3つもある)。
行をchan string
で返せば、Python版に近い書き心地になるような気もしましたが、
標準に合わせたいことと、チャネルを返そうとするとGoroutineを1つ余分に消費してしまうことがあり、
あきらめました。
#リハビリを兼ねて、チョチョイと書くつもりが、なぜか半日もかかってしまった・・・
Dockerの6つのtips
1. イメージを作る方法はDockerfileだけじゃない
Packerもある。
Packerは様々な仮想環境のイメージを統一的な方法で作れるツールで、Virtualbox・AWS・DigitalOceanなどにも対応しています。 したがって、DigitalOceanイメージとDockerイメージを1つのソースから作るといったことができます。
PackerはDockerの全機能が使えるわけではない(差分ビルドができない)のですが、 場合によっては問題にならないかもしれません。
2.Dockerイメージはtarで保存できる
Dockerイメージをtarとして保存すれば、Jenkinsの成果物として保存したり、S3経由で配信したりできます。
tar出力するにはdocker exportを使います。また、packerはデフォルトではイメージをtarで出力します。
3. 出力ファイルをchown
する
docker run
に-v
を付けると、コンテナにホストのディレクトリをマウントできます。
ところで、一般ユーザーがdocker run
を実行しても、コンテナ内部ではrootユーザーとしてコマンドが実行されているため、出力ファイルもオーナー= rootで作られます。
このとき、ホスト側のディレクトリでもファイルのオーナーがrootになってしまうため、ファイルにアクセスできなくなってしまいます。
環境変数としてユーザー名を渡し、出力ファイルのオーナーを変更するとよいと思います。
docker-test.sh
#!/bin/bash go test -v ./... | tee /docker/output/gotest.log EXIT_CODE=$? useradd "${OUTPUT_USER}" chown "${OUTPUT_USER}:${OUTPUT_USER}" /docker/output/gotest.log exit ${EXIT_CODE} docker run \ --env=OUTPUT_USER="${USER}" \ -v "/workspace:/docker" \ centos \ docker-test.sh
4. --rm
でコンテナを削除する
普通にdocker run
するとコマンド終了後もコンテナが残り、いずれこのコンテナが溜まってディスクが溢れてしまいます。
docker run
に--rm
をつけると、コマンド成功時には自動でコンテナを削除します。
5. cidfileで失敗時にもコンテナを削除する
docker run
はコマンドが失敗したときにはコンテナを終了しません。
そのため、--rm
をつけていてもコンテナが残ってしまいます。
docker run
に--cidfile=<file>
をつけるとdocker stop
します。
docker run --rm --cidfile=dockercid centos /bin/false if [ -e dockercid ]; then CID=$(cat dockercid | cut -b -12) (docker ps -aq | grep "${CID}") && docker stop "${CID}" rm -f dockercid fi
6. 古いコンテナ・イメージを削除する
さらに定期的に以下のコマンドを実行すれば、さらに安心です。
for cid in $(docker ps -aq); do docker rm "${cid}" done for iid in $(docker images | awk '/^<none>/ { print $3 }'); do docker rmi "${iid}" done
まとめ
DockerはWordのイルカより有能です。
VMWare fusion上のXubuntuで?GVimが正しく描画されない問題
GVimでスクロールしたり、gg
でジャンプしたりすると正しく再描画されず画面が真っ黒に。
(たちの悪いことに、マウスで少しスクロールすると再描画される。 そのため、絶妙な「不便で作業効率は落ちるけど一応使えてしまう」不具合になっている)
どうやら前からある問題のよう https://groups.google.com/forum/#!topic/vim_use/_goVuyxdgWA
解決方法としては、掲示板にもあるように、最新版を諦めてv7-3-367を使うこと。
ただし、これはVimではなくVMWare Fusion側の問題かもしれない。
もしプログラミング言語がお昼ごはんだったら
ソフトウェアを開発するためのプログラミング言語には様々な種類があり、 歴史あるもの新しいもの、手軽さを重視したもの厳密さを追求したもの、など様々な種類があります。
ここでは、8種類のプログラミング言語を、それぞれお昼ごはんに例えてみました。 どれもとても美味しそうですね。
アセンブラ
ウサギ。まず血抜きの処理から始まる。
C言語
昔はこういうのを食べていた。
Python
色とりどりのおかずは栄養バランスがよく、持ち運びにも便利です。
Java (Version 1.5)
栄養バランスがよく、持ち運びにも便利ですが・・・
PHP
ハンバーガーセット。たまに食べる分には手軽で旨い。でも毎日はちょっとね。
Go
ステーキ定食。そうそう、こういうのでいいんだよ、こういうので。
Haskell
マナーに厳しいおフランス料理店のフルコース。味は絶品だけど、フォークの上げ下げにも一々注意され、 メインディッシュを食べる前に追い出されました。
Common Lisp
高級食材。いや、レ・ディシプル・ド・オーギュスト・エスコフィエのあなたにとっては最高の食材かもしれませんがね、 我々には調理する腕も時間も無いんです。今日のランチを食べたいだけなんです。
あとがき
ついカっとなってやりました。他言語の画像も募集中。