詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

Go で SOCKS5 プロキシを利用する

検索すると golang - net/httpでSOCKS proxyを扱う - Qiita という記事が見つかったけれど、今なら net/proxy パッケージを使えばよさそうだ。

雑な例だとこんな感じ。

import (
    "net/http"
    "golang.org/x/net/proxy"
)

func main() {
    p, err := proxy.SOCKS5("tcp", "127.0.0.1:10001", nil, proxy.Direct)

    client := http.DefaultClient
    client.Transport = &http.Transport{
        Dial: p.Dial,
    }

    resp, err := client.Get(...)
}

proxy.SOCKS5() 関数で proxy.Dialer というのが得られるので、これをたとえば http.TransportDial フィールドに渡してやればよい。簡単。

また proxy.FromEnvironment() を使うと環境変数からプロキシの設定を取得できる。この場合以下のように、all_proxy 環境変数をよしなに設定してやる必要がある。

all_proxy=socks5://127.0.0.1:10001 ./main

ghq v0.7 をリリースしました

2015-08-11 追記

@kyanny さんに指摘いただいた、ghq.root 配下にシンボリックリンクが存在すると ghq list などが不完全になる不具合を修正した バージョン 0.7.1 をリリースしています。最新版はこちらをご利用ください。

Release v0.7.1: Fixed symlink issue of v0.7 · motemen/ghq · GitHub

Vagrantfile による再現環境、シビれましたね。ありがとうございました!


Release v0.7 · motemen/ghq · GitHub

0.6 からだいぶ時間が経ってしまっていましたが、勢いをつけるための久しぶりのリリースです。リリースページからバイナリをダウンロードするか、go get で入手してください。

go get -u github.com/motemen/ghq

バイナリの配布は今回からすべて zip になってますので、自動化している人はご注意ください。

ghq とは

GitHub などのリモートリポジトリをローカルに clone し整理するための簡単なツールです。詳しくは ghqを使ったローカルリポジトリの統一的・効率的な管理について - delirious thoughts をご覧ください。

リリースノート

  • [feature] Bluemix DevOps Git service に対応 (#56, @uetchy)
  • [feature] GHQ_ROOT 環境変数で ghq.root 設定を上書きできるように (#59)
  • [feature] Darcs に対応 (#55, @maoe)
  • [feature] look コマンドがリモートリポジトリの URL も受けつけるように (#51, @ryotarai)
  • [feature] look コマンドが GHQ_LOOK 環境変数を設定するように (#47, @superbrothers)
  • [improvement] list の高速化 (#54, @maoe)
  • [fix] Windows でのテストの修正 (#48, @kkka)

特に #54 の高速化は変な見落としがないか心配なところです。パッケージングの仕方も変えているので、何か問題がありましたら GitHub から報告 いただければと思います。

ghq.root の新たなデフォルト値を考え中

ghq.root はデフォルトで ~/.ghq になっていますが、これで嬉しい人はいないんじゃないかな〜と最近思ってます(自分も ~/dev とかにしてる)。もうちょっとイカしたデフォルト設定があればそれを採用しようか(それとも初回起動時に設定させるとか)と考えてるところなので、もしご意見があればイシューにコメントいただけると幸いです。

Default value for `ghq.root` · Issue #60 · motemen/ghq · GitHub

シェルスクリプトで Go の簡易ベンダリング

Heroku で Go がサポートされたのは良いニュースだったけど godep を使わなきゃいけないのが気に入らないところで、Go で Heroku に乗せたい Web アプリケーションを作る時は Docker を使う ことにした(参考)。その際にも Docker コンテナ中で go get をいちいち待つのはストレスなのでベンダリングはしておいたほうがよい。そこで簡単なベンダリングスクリプトを書いた。Go 1.5 で試験的に導入されたベンダリングには特に対応していない。

https://gist.github.com/motemen/bb1fca4a92a29bad78dc

このスクリプトは

  • プロジェクトの依存しているサードパーティーライブラリを特定のパス以下にコピーできる
  • 上記のパスを GOPATH に含めて go コマンドを実行できる
  • リビジョンロッキングは行わない

なので、複数人開発には向かないと思う。

使い方は簡単で、プロジェクトのトップで

% go-vendor.sh save

とすれば _vendor/src 以下に(既存の GOPATH から)ソースコードをコピーして、

% go-vendor.sh go build

として _vendorGOPATH に含めつつ go コマンドを実行する。ディレクトリ名が _ ではじまっているので ./... などとしてもソースコードとしては判定されない。

ちなみに依存ライブラリの列挙は go list で行っており、まさにこれはスイスアーミーナイフですのでおすすめの逸品です。

はてなで一緒に働きませんか?