Plan 9とGo言語のブログ

主にPlan 9やGo言語の日々気づいたことを書きます。

Exported from Qiita

http.RoundTripperでHTTPクライアントを拡張する

この記事はQiitaで公開されていました GoでHTTPリクエストを行いたい場合、一般的には net/http のhttp.Getやhttp.Postを使うことになると思います。もしくは少し複雑なリクエストする場合、http.NewRequestを使うかもしれません。 net/httpの公式ドキュメン…

Go 2のgenerics/contract簡易まとめ

この記事はQiitaで公開されていました 2020年8月追記 この記事は2018年頃に出てきたGoのジェネリクスに関するドラフトを読んで、個人的に理解した内容をまとめたものです。2020年時点ですでに、contractの代わりにinterfaceが使われるなど、十分に内容が古く…

GoDocドキュメントの書き方

この記事はQiitaで公開されていました Goでドキュメントを書くとき、一般的にはGoDocを使うと思います。GoDocはシンプルにみえて、実際は色々な書き方をサポートしていますし、ブラウザで単純に表示する以外の読み方もあるので、一通りの方法をまとめてみま…

golang.org/x/oauth2で色々な認可フローや方言に対応する

この記事はQiitaで公開されていました OAuth 2.0クライアントの実装 golang.org/x/oauth2を使ってトークンを発行する際に、複数の認可フローや方言があるけれど、どうやって実装するんだろう?と思ったことを調べました。OAuth 2.0自体については、OAuth 2.0…

macOSでNixpkgsのアップグレード

この記事はQiitaで公開されていました TL;DR NixpkgsのmacOSインストーラはマルチユーザインストーラなので、rootユーザにインストールされているnixパッケージのアップデートが必要。 $ sudo -i nix-env -q nix-2.0 nss-cacert-3.35 $ nix-env --version ni…

Go & Versioning(vgo)を読んで大きな変更が入ったなと思った

この記事はQiitaで公開されていました このQiita記事は、Go & Versioningで掲載された一連の記事を読んで、自分なりのまとめと感想です。私の周りはあまり騒いでないけど、これ感覚的なものが大きく変わるなあ、と思ったので、主に表面上に現れる変更をまと…

golang.org/x/sync/semaphoreを使ってゴルーチンの同時実行数を制御する

この記事はQiitaで公開されていました 特定の処理をゴルーチンで並列実行したいけれど、サーバの負荷等を考慮して、同時実行数の上限を設定したい話です。元ネタの記事では、チャネルやsync.Poolを使って実現していて、すでに十分シンプルなのですが、x/sync…

Jenkinsfileの書き方

この記事はQiitaで公開されていました ほとんど情報がなかったので調べながら書いたメモ。基本的に、公式情報が最もまとまっている。 Using a Jenkinsfile Pipeline Syntax Pipeline Steps Reference Jenkins Job DSL API また、古い情報らしいけど、現状こ…

bashのあまり知られていないけど便利な話

この記事はQiitaで公開されていました ~と*を展開する場合はクオートしない クオートされた文字列の中にある~はそのまま文字として扱われる。扱いは*と同じようにみえる。 $ echo ~/bin /Users/kadota/bin $ echo "~/bin" ~/bin $ echo *.txt hello.txt $ ec…

Go+goyaccでシェルを実装する

この記事はQiitaで公開されていました この記事は、Go2 Advent Calendar 2017の17日目です。 特にこれといったネタがなかったので、goyaccを使ってシェルを実装してみました。 何をしたのか Linux/macOSなどのUnix系OSには、bashやzsh、fishなどあります。こ…

TimeoutHandlerでnet/httpのリクエストをタイムアウトさせる

この記事はQiitaで公開されていました 素直な実装 特に何もしない場合、net/httpはタイムアウトしません。以下のサーバにHTTPアクセスをすると、1分後にhello!というレスポンスを返します。 package main import ( "log" "net/http" "time" ) type handler s…

Goでサブディレクトリを含むProtocol Buffers定義ファイルを扱う場合の上手な書き方

この記事はQiitaで公開されていました 問題 Goは、$GOPATH/src/ 以下にパッケージのソースコードを置くルール。自分で書いたコードも例外ではないので、以下の例では、自分で書くコードを $GOPATH/src/example.com/app に置いている。 $GOPATH/ └ ─ /src ├ ─…

Ventiディスクをオフサイトバックアップする方法[9fans]

この記事はQiitaで公開されていました [9fans]Venti off-site backupsより、Ventiストレージのバックアップを行う方法をメモ。最後は個人的によく使う方法。 venti/mirrorarenasでミラーリング plan9portに含まれているmirrorarenas(8)コマンドで以下のよう…

golang.org/x/sync/singleflightで重複呼び出しを排除する

この記事はQiitaで公開されていました ユーザ操作などで、同じAPIを同時にリクエストされたけれど、例えばGETメソッドの場合は結果もほとんど同じになるので、リクエストを1回にまとめてしまいたい場合は少なくないと思います。 または、期限付きの認証トー…

plan9portのsecstoreを秘密のメモとして使う

この記事はQiitaで公開されていました Plan 9 from User Spaceのsecstoreを使って秘密メモの扱いを便利にしました。 コマンドから秘密メモを扱いやすくなった ある程度安全に秘密メモをGit管理できるようになった 毎回パスワードを入れなくてもよくなった 動…

GitのリモートURL単位でuser.nameとuser.emailを強制する

この記事はQiitaで公開されていました 困ったこと GitHubは、コミットログのアイコン表示などで、Authorのメールアドレスを使います。なので、例えば普段とは違うマシンからコミットした場合、Authorのメールアドレスが普段と異なる場合は、アイコンが表示さ…

GoでFUSEを使ってGitHubのIssuesをマウントする

この記事はQiitaで公開されていました この記事は、Goアドベントカレンダー(その2)の19日目です。 何を言っているのか分からないかもしれませんので、動画を用意しました。 アドベントカレンダーはこれを作った話です。本当はPlan 9対応までやりたかった。 p…

Unix-timeと日時の相互変換

この記事はQiitaで公開されていました Unixコマンドで日時の変換をする方法が、OSによって全然違うのでまとめました。 日時からUnix-timeへの変換 ローカル時刻からUnix-time 2015年12月1日(JST)をUnix-timeに変換するコマンドです。 macOS: $ date -v15y -v…

Sierraでgo1.7.3のコンパイル

この記事はQiitaで公開されていました macOS SierraでソースからGoをコンパイルできなくて調べた内容です。macOSなら公式からバイナリパッケージが提供されているので、自分でコンパイルしなくてもそれを使えばいいだけなのですが、他の環境でも使える内容だ…

golang.org/x/time/rateで速度制限を行う

この記事はQiitaで公開されていました 例えば、APIの結果を使った処理を行う場合、ユーザとしてはなるべく早く処理をしたいけど、早すぎるとサーバの処理が追いつかないケースはよくあると思います。 そういう時、APIを実行した後でtime.After等を使って少し…

Mac OS XでNixパッケージマネージャを使う

この記事はQiitaで公開されていました Nixパッケージマネージャは、純関数型OSと言われているNixOSで使われているパッケージングシステムです。上書き更新を行わず、ユーザ単位でパッケージを管理できるのが良い所かなと思います。名前から、Plan 9由来のNix…

パッケージのimport pathを好みのURLにする

この記事はQiitaで公開されていました Goのパッケージ名は、リポジトリのURLをそのまま使うことが多いと思いますが、リポジトリはそのままで、別のURLをパッケージ名にすることもできます。 例えば、あるパッケージのリポジトリをGitHubに置いていて、リポジ…

atomicパッケージが必要な理由と使い方

この記事はQiitaで公開されていました 以下のコードは通常分かりづらいバグを持っています。 package main import ( "fmt" "runtime" "sync" ) type Counter int32 func (c *Counter) Inc() { *c++ } func main() { var c Counter var wg sync.WaitGroup for…

ゴルーチンで発生したエラーの返し方

この記事はQiitaで公開されていました ゴルーチンで並行実行中させた処理の中で、エラーが発生した場合にどう扱うかは割と面倒です。 package main import ( "io/ioutil" "log" "net/http" "os" ) func main() { c := make(chan []byte) go func() { res, er…

MacでQEMUを使ってCoreOS環境を構築する

この記事はQiitaで公開されていました 開発環境として、CoreOSをMac OS X+QEMUに導入したのでメモ書き。 情報 QEMU stable 2.5.0 CoreOS 835.13.0 QEMU お手軽にHomebrewでインストールします。 $ brew install qemu 時間がかかるので、待ちましょう。 CoreO…

GoとAlefとLimbo

この記事はQiitaで公開されていました GoとLimboは、一部のファンから、似ていると言われますので、そんなに似ているのか、実際に比較してみました。ついでに、この2つの言語は共通してAlefが先祖になりますので、Alefも含めます。 いちおうこの記事は、Go A…

Plan 9 from User Space(plan9port)を使う

この記事はQiitaで公開されていました INSTALL ソースを取得 $ git clone https://github.com/9fans/plan9port plan9 ソースを取得したディレクトリに移動してビルドすれば終わりです。通常は、git pullしたディレクトリがplan9portのインストール先になりま…

管理者権限が無くてもMacにGoをインストールする

この記事はQiitaで公開されていました brew本体をインストールするのもGo公式パッケージを入れるのも管理者権限を要求されますが、権限が無くてもGoはソースからインストール可能ですしなるべく環境を汚さないようにしたい場合にも有用だと思います。 ただし…

Windows Azure上でLinuxをventiバックアップ先にする

この記事はQiitaで公開されていました Plan 9のventiバックアップ用に、Windows Azure上でventiサーバを立てます。 plan9portのインストール あらかじめplan9portを/usr/local/plan9にインストールしておく。 ventiディスクの作成 Windows AzureポータルでHD…

Plan 9でのユーザ管理

この記事はQiitaで公開されていました Ken fs 追加 fs: newuser web Fossil 追加 webというユーザを作成する。 # con -l /srv/fscons prompt: uname web web (ホームディレクトリが不要な場合は:webとする) prompt: uname web +glenda (glendaをメンバー追加…