Monorepo における Go テストの差分実行 / Running Differential Go Tests in a Monorepo
Goのエラーハンドリングが採ったスタイル 多値返し 直積(関数の返値とエラーを両方返す) try-finallyをdeferという機構でカバー panicはプロセスを落とすためのもの Goはこの戦略でエラーハンドリングを行うとしましたので、「多値はなぜタプルじゃないんだ?」、「直和(返値orエラー)で十分じゃ?」「panic-recoverでtry-catchできそう?」などいう様な他の処理系の風習を持ち込むことは意味がありません。そしてそれらの提案の多くはすでに検討されリジェクトされてきた経緯があります。 「try組み込み関数」プロポーザルなんかも検討されマージ直前くらいまで進んだこともありますが、「Goのエラーハンドリング」にとって一長一短がありました。その欠点課題は解決できずに最終的にリジェクトされました。 「多値返し」は実にCPUフレンドリーな機構で、C言語の関数呼び出し規約にちょ
Goのプロジェクトをどの様なファイル構成で配置すれば良いか読み物が少ないという指摘を見たのでまとめてみようと思う。 GOPATHについて Go1.16がリリースされたことでGo-Moduleによるプロジェクト構成が標準で推奨されることになりました。(Go1.11までさかのぼってGo-Moduleは使える様になってます) Go-Moduleモードでは「GOPATH配下にプロジェクトを置かなければならない」という制約からは解放されています。なので、実質GOPATHはどこを指していても構わないし設定されていなくても「ユーザーホーム/go」というデフォルトの場所が決まっているので開発できます。 おすすめの環境変数設定は以下の2つだけ。 「GOPATH=~/.go」(WindowsはGOPATH=%USERPROFILE%\.go) 「PATH=$GOPATH/bin:$PATH」(Windowsは
はじめに この記事は、海外サイトhttps://tutorialedge.net/golang/go-grpc-beginners-tutorial/ の内容をベースに一部修正を加えたものです。この記事を読み進めることでGoでシンプルなgRPCクライアントとサーバーを構築することができるようになります。 ※gRPC公式より抜粋(また、以下の説明でも一部参考にしています。) gRPCとは? gRPCはGoogleによって開発されたRPCフレームワークです。 RPCはRemote Procedure Callの略で、逐語的に訳すと「遠隔手続呼び出し」となります。これはすなわち、「あるプログラムがネットワーク上の異なる場所に配置されたプログラムを呼び出して実行すること」と読み取れます。 公式による定義 サービス定義 多くのRPCシステムと同様に、gRPCはサービスを定義するという考えに基づいてお
こんにちは、TIGの辻です。Go 1.16連載の3記事目です。 Go1.16でアップデートがあった io/ioutil パッケージが "deprecated" になる話題のまとめです。 サマリ Go1.16から io/ioutil パッケージの機能が os と io パッケージに移行した これから新しく実装するコードは io や os パッケージの新しい関数を使うことが推奨される io/ioutil パッケージが "deprecated" になるが "deprecated" といっても将来壊れる、ということではない 既存のコードは動作し続ける go fix コマンドは未対応 内容Go1.16から io/ioutil パッケージに含まれる関数が "deprecated" になります。関連するプロポーザルは #40025 と #42026 です。Package names で良くないパッケージ
package main import "plugin" func main() { p, err := plugin.Open("plugin.so") // error handling f, err := p.Lookup("F") // error handling f.(func())() // prints "Hello, world" } この標準の plugin パッケージについて、先程あげた評価項目がどうかを考えてみます。 User Experience : いまいち プラグインをインストールの仕組みを考えないと難しそう 利用者は、ツール側が規定したルールに従って.soを配置する必要があるというのがポイント ありそうな仕組み ツールにプラグインの URL を渡すとダウンロードして適切な場所に配置してくれる プラグインのレジストリを提供する プラグインがいい感じにインストー
さくらインターネット Advent Calendar 2020の23日目です。 現時点では最新版のRedis 6.0のRedis Clusterに対して、Go言語の代表的なRedisクライアントライブラリであるgo-redisからアクセスしたときに、性能が深刻なレベルで劣化しました。 この記事では、ミドルウェアを利用したGo言語アプリケーションの性能劣化に関する問題調査の事例として、この性能劣化を修正するまでの話をまとめました。 go-redisへのPull Requestはhttps://github.com/go-redis/redis/pull/1355です。 はじめに 半年ほど前の論文の締め切りに追われていたある日、評価実験のためにRedisを使った時系列データベースのプロトタイプを開発していました。 ベンチマークツールでプロトタイプの性能を測定したところ、単一インスタンスのRed
こんにちは、m3 エンジニアリンググループ CTO 矢崎(id:Saiya)です。 過去に Go 言語の仕様を一通り見た経験があったのですが、久しぶりに Go のコードを最近読み書きした際に、ここ数年の Go 言語やエコシステムの進化による変化もあり、発見やハマりが多々ありました。 Go 言語公式のロゴもスピード感ありますね。 同じような迷い・回り道をしてしまう方ももしかしたらおられるのではないかと思いますゆえ、 エムスリー Advent Calendar 2020 6 日目の記事として、筆者が実際に「最初から知っていれば時間を無駄にしなかったのに...!」と感じた知見をざっくばらんにシェアいたします。 本記事がどなたかの一助になりますと幸いです。 なお本記事の内容は筆者個人の理解・自身で直接読み書きしたユースケースの範囲での知見であり、全ての Go 利用事例に当てはまらない点も含みうりま
TL;DR 並行計算の理解を間違ってる人が多いので正したい 並行計算=同時に実行すること 並列計算≒同等のタスクを並行計算すること もうちょっとちゃんと書いたフォローアップ記事も合わせて、お時間が許すようであればお読みください。 状況 並列と並行 / 多言語からみるマルチコアの活かし方に見られるように並行(concurrent)とは「複数の処理を順番に実行すること」とする誤った記述を、この記事に限らずチラホラ目にします。 大事になことなので繰り返しますが、間違った記述を含んでいるのはこの記事だけに限りません。 そのような誤った記述を見かけるたびに「ああこの人も間違ってるのか」と諦観を抱くだけというのもあまりに非生産的なので、間違ってますよとポインタとして示せるように簡単な読み物にしたものがこの記事です。 事実 計算=computingの分野においては並行=concurrentと並列=par
オンラインイベントで聞かれて、ツイッターにつぶやいたら思った以上に反響があったので、もう少し詳細に書いてみます。 思ったより反響があったまとめ信頼できる暗号ライブラリがある自分が TypeScript より Go のほうが書けるGo の Wasm バイナリサイズを気にする必要がないWebCrypto にない暗号が必要自社の WebRTC SFU において End to End Encryption (E2EE) をブラウザ上で実現するためにはいくつかの壁がありました。 一つは WebCrypto が提供していない暗号を利用したいというものです。 今回 E2EE を実装するにあたり採用した Signal プロトコルでは公開鍵暗号に Curve25519 を採用しています。残念ながら WebCrypto では Curve25519 に対応していません。この時点で「暗号ライブラリをどこからもって
概要 Goでは簡単にコマンドラインツールが作れますが、人によって引数やオプションといったインタフェースがバラバラになりがちです。 POSIX Utility Syntax Guidelinesというガイドラインがあるので、これに則るとUnixライクな統一されたインタフェースのCLIツールになります。 環境 golang/go v1.15.1 インタフェースのイメージ 例えば文字列の入ったファイルがあり $ cat sample.txt hogefuga 入力文字列をすべて大文字にするコマンドcapitalizeを作る場合、以下の3つのインタフェースをサポートするイメージです。 $ cat sample.txt | capitalize HOGEFUGA $ cat sample.txt | capitalize - HOGEFUGA $ capitalize sample.txt HOGE
この記事は、Merpay Tech Openness Month 2020 の6日目の記事です。 メルペイでBackendエンジニアをしている柴田(@yoshiki_shibata)です。この記事では、Go言語のtestingパッケージに用意されている並列化の機能について説明します。 Go言語では、テストコードを作成するためのtestingパッケージが用意されています。一般に開発するソフトウェアの規模が大きくなるに従って、作成されるテストコードの量も多くなり、すべてのテストが終了するまでの時間も長くなっていきます。特に、データベースへアクセスするようなテストでは、データベースへの通信時間がテスト時間の多く占めますので、テストコードを逐次実行するよりは並列実行することで、テスト時間を短縮できます(厳密には用語「並行」ですが、t.Parallel()メソッドの説明なので、この記事では用語「並列
概要 ホント誰得でもないのは重々承知していますが、思い立って 形態素解析器 kagome v2 をリリースしました。とはいっても、だいたいの機能は今ある kagome でも実装済みで、今さら変更してもどうよ・・・という感じではあります。 なので、モチベーションを維持するのが非常に難しくて、だらだらと時間だけがかかってしまいました。 折角作ったのでリリースノートです。 TL;DR; v2 で実現した事 辞書の分離 / バージョン管理 辞書毎に異なる素性項目の扱いの共通化 韓国語辞書対応 辞書の分離 辞書を別リポジトリに分離しました。これにより、長年(?)懸案だった辞書のバージョン管理が可能になりました。go.mod で指定すれば、どのバージョンの辞書を利用しているかがわかります。 また、これにより、これまで kagome.ipadic のような単独辞書を利用するだけのためのライブラリを別に切
Go 1.13 からの新しい errors Go 1.13 からエラー処理が強化され、errors パッケージに As と Is 関数が追加されました。これにより、今までは pkg/errors のようなライブラリを使用しなければ実現するのが難しかった、型情報を保持したままの wrap/unwrap が可能になりました。 サードパーティのライブラリに依存せずに実現できるのは非常にありがたい反面、移行コストが高そうでなかなか移行できていないプロジェクトも多いかと思います。また、pkg/errors ではスタックトレース情報を保持してくれますが、Go 1.13 errors では保持してくれないといった問題もあるため、完全移行が難しいといったケースもあると思います。 pkg/errors の Go 1.13 errors 対応 しかし最近、以下の Pull Request がマージされ pkg
Go言語でstrftime・strptime相当の関数を提供するライブラリを実装しました。 t, _ := timefmt.Parse("2020/07/24 09:07:29", "%Y/%m/%d %H:%M:%S") fmt.Println(t) // 2020-07-24 09:07:29 +0000 UTC str := timefmt.Format(t, "%Y/%m/%d %H:%M:%S") fmt.Println(str) // 2020/07/24 09:07:29 str = timefmt.Format(t, "%a, %d %b %Y %T %z") fmt.Println(str) // Fri, 24 Jul 2020 09:07:29 +0000 なぜ作ったか Go言語の標準ライブラリには日時と文字列を変換する関数がありますが、2006年1月2日の15:04
Full-Text Search is one of those tools people use every day without realizing it. If you ever googled "golang coverage report" or tried to find "indoor wireless camera" on an e-commerce website, you used some kind of full-text search. Full-Text Search (FTS) is a technique for searching text in a collection of documents. A document can refer to a web page, a newspaper article, an email message, or
Goコンパイラをゼロから書いてセルフホストを達成しました。(1年ぶり2回目) https://github.com/DQNEO/babygo (ちなみに 前回の話はこちら 「Goコンパイラをゼロから作って147日でセルフホストを達成した」 ) 主な特徴 全部手書き。標準ライブラリも自作。system call 呼び出しも自作。libc非依存。 コンパイルするとアセンブリを吐きます。これをビルドすると単一静的バイナリになります。 設計は、go/parser + chibicicc + α かかった期間 2020/3/29に開始、2020/7/28にセルフホスト達成。 コミットした日 (Author date)を数えたら93日でした。 平均1日2-3時間としてざっくり240 時間 ほど。 前回は500時間かかってるので、今回は半分の期間で達成できたことになります。 なんでまたやろうと思ったの?
READMEにpkg.go.devのバッジを貼る godoc.orgはpkg.go.devに移行していくことが告知されているので、新しいプロジェクトではREADME.mdに貼っているバッジを移行しましょう。pkg.go.devのURLやバッジは // バッジ https://pkg.go.dev/badge/<package path> // リンク https://pkg.go.dev/<package path> の形を取ります。例えばgithub.com/lufia/backoffの場合は以下のように書きます。 # Backoff ...summary... [![GoDev][godev-image]][godev-url] ...description... [godev-image]: https://pkg.go.dev/badge/github.com/lufia/back
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く