タグ

goに関するcastaneaiのブックマーク (30)

  • research!rsc: Coroutines for Go

    This post is about why we need a coroutine package for Go, and what it would look like. But first, what are coroutines? Every programmer today is familiar with function calls (subroutines): F calls G, which stops F and runs G. G does its work, potentially calling and waiting for other functions, and eventually returns. When G returns, G is gone and F continues running. In this pattern, only one fu

    castaneai
    castaneai 2023/07/18
  • Docker コンテナ上で Go のプロジェクトを delve でデバッグするには ptrace の許可が必要

    Docker コンテナ上で Goプロジェクトを delve でデバッグしたいとき。Docker はデフォルトで ptrace(2) システムコールの呼び出しを制限しているので、これを緩和する必要がある。 具体的には docker run に次のように --cap-add=SYS_PTRACE というオプションを渡してあげるとよい。 docker container run --cap-add=SYS_PTRACE -it your-image:latest bash 背景 Docker コンテナ上で Go のプログラムを delve を使ってデバッグしようとすると次のようなエラーで動かなかった。 root@a135f59c96cb:/go# dlv debug could not launch process: fork/exec /go/debug: operation not pe

    Docker コンテナ上で Go のプロジェクトを delve でデバッグするには ptrace の許可が必要
    castaneai
    castaneai 2021/06/18
  • Go Modules Cheat Sheet

    Go Modules Cheat SheetA handy reference for common operations with Go modules.

    Go Modules Cheat Sheet
    castaneai
    castaneai 2021/05/06
    go modulesを思い出す用
  • Designing libraries in Go way

    Monorepo における Go テストの差分実行 / Running Differential Go Tests in a Monorepo

    Designing libraries in Go way
    castaneai
    castaneai 2021/03/11
    良い資料!!
  • On the road to pure Go X11 GUIs

    I write applications for personal use. For the past few years I've been mostly using the C language for the task, and trying to treat the terminal as a graphical device. Why C? It's a clean, rather simple language that I've ‘mastered’ at one point and acts as a common denominator to important libraries, no bullshit in between. As of late I've also warmed up somewhat to C++, mainly its latest versi

  • GoのWebアプリケーションでステータスコード499を記録する | おそらくはそれさえも平凡な日々

    この記事は、Go 4 Advent Calendar 2020の16日目の記事です。 さて、ある日、Goで書かれたHTTP APIサーバーのdeployをしたところ、急に500エラーの発生率が上がったことがありました。しかし幸いにもユーザー影響は出ていません。どうしたのでしょうか? ALBログの調査 このシステムはAWSのApplication Load Balancer(ALB)からプロキシされていますが、エラーリクエストに対応するALBのログを調べるとステータスコード460が記録されていました。460を調べると以下のように書いてあります。 The load balancer received a request from a client, but the client closed the connection with the load balancer before the id

    GoのWebアプリケーションでステータスコード499を記録する | おそらくはそれさえも平凡な日々
    castaneai
    castaneai 2020/12/17
    req.Context().Done() でリクエストがキャンセルされたかを判別する / nginxでは499なのにALBでは460なのか・・
  • Keeping Your Modules Compatible - The Go Programming Language

    Jean de Klerk and Jonathan Amsterdam 7 July 2020 Introduction This post is part 5 in a series. Part 1 — Using Go Modules Part 2 — Migrating To Go Modules Part 3 — Publishing Go Modules Part 4 — Go Modules: v2 and Beyond Part 5 — Keeping Your Modules Compatible (this post) Note: For documentation on developing modules, see Developing and publishing modules. Your modules will evolve over time as you

    Keeping Your Modules Compatible - The Go Programming Language
    castaneai
    castaneai 2020/07/08
    interface を外部で実装不可にする private() 、構造体を比較不可能にする [0]func() など
  • Goでインメモリキャッシュを取り扱う時にハマった話 - Gunosy Tech Blog

    こんにちは、Gunosy Tech Labの片木(@jkatagi)です(普段はGunosyデータ分析ブログの方に生息しています)。 記事では社内のとあるAPIGo製)の改修をしていたときに遭遇したインメモリキャッシュの落とし穴について共有します。 普段からGoを書いている人にとっては当たり前のことかもしれませんが、アンチパターンとして共有できれば幸いです。 落とし穴にハマるGopherくん 要約 APIのアーキテクチャについて なにが起きたのか なぜ起こったのか 単体テストでは気づけなかったのか どう解決したか おわりに 要約 長くなるので最初に要約しますと 当該APIでインメモリキャッシュとして構造体のスライスを格納していた キャッシュしている値を変えてしまうとキャッシュ元も変わってしまう という事態が発生しました。 ですのでインメモリキャッシュを使う時は対象の値が変更されないこと

    Goでインメモリキャッシュを取り扱う時にハマった話 - Gunosy Tech Blog
    castaneai
    castaneai 2020/07/03
    キャッシュ内部のmapのvalue型をポインタにすると取り出した後の書き換えが元のキャッシュにも反映されちゃったということかな
  • Goで多層キャッシュを実装するときに役立つtips - Gunosy Tech Blog

    こんにちは、メディア事業部所属の石塚(@ij_spitz)です。こちらはGunosy Advent Calendar 2018、4日目の記事です。なお、昨日の記事は@timakinさんのGoで多層キャッシュ実装と@aibouさんのInfrastructure as Codeの心構えでした。 何を書くか全然決めてなかったのですが、昨日@timakinさんがGoでの多層キャッシュの実装ポイントについて書いていたことに加えて、僕も最近業務で多層キャッシュについて取り組んでいたので、Goで多層キャッシュを実装するときに役立つtipsについて書きたいと思います。 ちなみに僕は多層キャッシュのことを多段キャッシュと呼んでいましたが、曖昧さを解消するために記事では多層キャッシュで統一します。 なぜ多層キャッシュを使うのか 多層キャッシュ自体については昨日のブログで既に説明されているので詳細は控えます

    Goで多層キャッシュを実装するときに役立つtips - Gunosy Tech Blog
    castaneai
    castaneai 2020/06/26
  • Goのインターフェース抽象度を美しく保つ為の思考 - 好奇心に殺される。

    Go Goのインターフェース抽象度を美しく保つ為の思考 Goで抽象化を適切に、そして美しく保つ為の自分の考えやTipsを紹介します。 Overview とある場面でGoのinterfaceが持つ振る舞いの抽象度について議論があり、今回はそれをアウトプットしておきます。Go初心者でinterfaceを使った設計に苦手意識を持つ人向けです。 目次 今回の目次です!下記について自分の考えをお話しします! 振る舞いの抽象化の度合いを意識する 抽象度をどこまであげるか 引数や返り値から発生する「抽象化の漏れ」 抽象度をあげる為の統合 Getter/Setterと抽象度 それではいってみましょう! 振る舞いの抽象化の度合いを意識する 振る舞いをinterfaceとして定義していくのがGoの抽象化ですが、そもそも 抽象化は度合いのある概念です 。この度合いを意識しないと適切なinterfaceの設計は困

    Goのインターフェース抽象度を美しく保つ為の思考 - 好奇心に殺される。
    castaneai
    castaneai 2020/06/23
    こういった考えが言語化されていくの良いですね
  • Serverless連載3: Goでサーバーレス用の検索エンジンwatertowerを作ってみました | フューチャー技術ブログ

    サーバーレス連載の3回目は検索エンジンを作ってみたお話です。 クラウドサービスが充実してくるにつれて、サーバーレスではいろいろなことができるようになっています。HTTPサーバーは動きますし、RDBやNoSQLなストレージも使えますし、PubSubみたいなサービスも利用できます。これらを駆使するとそこそこ複雑な処理も記述できます。 一方で、上から下までサーバーレスにしようとするとできないものもいくつかあります。例えば、RDBも使えるといっても制約があり、LambdaやCloud FunctionsからRDSやCloudSQLを雑に使うとコネクションを張りすぎる問題があります。LambdaにはRDS Proxyが出始めています。あと、RDBそのものは基的に常駐型なのでサーバーレスではないです。一応サーバーレスなのもありますが、起動時間が結構かかるらしい(自分ではまだ試してないです)。それ以外

    Serverless連載3: Goでサーバーレス用の検索エンジンwatertowerを作ってみました | フューチャー技術ブログ
    castaneai
    castaneai 2020/03/27
    “GoCloudのmemdocstoreを使うと、オンメモリで動作するので、ユニットテストが超高速ではかどります。”
  • GoとRustの言語比較記事を書くのが流行ってるらしい

    コンテキスト 私もGoRustの比較記事書いてバズるやつやりたい — みょん (@myuon_myon) February 27, 2020 仕事GoRustを書いています。いずれもWebのサーバーサイドです。パフォーマンスとかほとほどって感じなので極限までチューニングしたりしません。という前提で読んでください。 Rust/Goはいずれも習得してから2年くらい書いています。書いてる量も多分そんなに変わりません。 Go なんと言っても習得難度が低いので人を選ばず書けるようになります。現状だと仕事で書くなら一番無難な選択肢だなと思っています。一方言語もエコシステムも何もかもかなりクセが強いので、Go Wayにちゃんと従うことが大事だなと思ったりします。 ジェネリクスがないことは高速なコンパイルなど利点もありますがmap,filter等を型ごとにfor文書きまくることになるのでとても手が疲

    castaneai
    castaneai 2020/03/04
    "Rustがあまり憎しみの対象にならないのは単に仕事で書いてる人の数が少ないからだよ"
  • Golang lock-free values with atomic.Value

    Earlier this week, I had the privilege of attending to an sneak preview of Andrew Gerrand’s talk “Stupid Gopher Tricks”, which he should be presenting at the Golang UK conference as I publish these lines. It’s a great talk about lesser-known Go features. I won’t spoil his talk here, you should instead attend the next conference if you can or check out the slides once they become available. But the

    castaneai
    castaneai 2020/03/03
    atomic.Valueはたしかに速いけどそこまで大きな差は出ないし、異なる型を入れてしまうとpanicしたりと色々危ない
  • Go 1.14でシステムコールがEINTRエラーを返すようになった - Plan 9とGo言語のブログ

    Go 1.13までのゴルーチンの切り替えは、チャネルの送受信やシステムコール呼び出し、関数呼び出し前にコンパイラが暗黙的に挿入する処理などによって行われていました。そのため、上記の切り替わり操作を全く行わないループなどがあれば、そのゴルーチンがずっと実行されます。 func loop() { // この辺りにコンパイラがコード挿入している for { // 切り替わり処理が行われないので無限に実行される } } この結果、$GOMAXPROCSが1の場合はプログラムが停止します。コンパイラが挿入するコードは、インライン展開された場合やgo:nosplitディレクティブが記述された場合には行われないので、関数呼び出しをしていてもゴルーチンが切り替わらない場合はあります。 ゴルーチンの切り替えと関数のスタックチェック go doc compile/Compiler Directives Go

    Go 1.14でシステムコールがEINTRエラーを返すようになった - Plan 9とGo言語のブログ
    castaneai
    castaneai 2020/02/29
    “Go 1.13まではエラーにならなかったシステムコールがEINTRエラーになるパターンが増えます。”
  • Big Sky :: Go 言語の struct の実体を引数で(なるべく)渡せない様にするテクニック

    Go 言語は struct のレシーバがポインタの場合は実体であってもポインタの場合であっても呼び出せるので、もし struct が参照カウントに従い動作する様な場合は実体でコピーされてしまっては困る場合があります。例えば以下の様なインタフェースを考えます。 package main import ( "fmt" "sync/atomic" "time" ) type foo struct { n int64 q chan struct{} } func (f *foo) Add() { if atomic.AddInt64(&f.n, 1) == 1 { f.q = make(chan struct{}) } } func (f *foo) Done() { if atomic.AddInt64(&f.n, -1) == 0 { f.q <- struct{}{} } } func (f

    Big Sky :: Go 言語の struct の実体を引数で(なるべく)渡せない様にするテクニック
    castaneai
    castaneai 2020/02/21
    “使い手側に「ポインタで使って欲しい」と示す事ができないと、いくらでもバグが発生してしまいます。そこで使うテクニックが noCopy です。”
  • Golang Memory Management: Allocation Efficiency in Go Services

    Connections Overview Integrate web and mobile app data with a single API Warehouses Easily transform and load customer data Reverse ETL Move warehouse data to your applications Functions Customize your customer data pipeline Developer Toolkit Build on Twilio Segment

    Golang Memory Management: Allocation Efficiency in Go Services
    castaneai
    castaneai 2020/02/13
    Goで値がヒープに割り当てられるか、スタックに割り当てられるかを判断したりコンパイラに指示したりする方法、実際のチューニングの例もあり
  • Goでchannelがcloseしてるかどうか知りたい というアンチパターン

    そういえば金沢に行って来た話の2〜4日目をかいてる途中で2ヶ月くらい経ったことに気付きましたが、まぁその話はおいておいて今日はGoの話です。 さて、このタイトルを見てGoに詳しく賢明な読者の方々は「あぁまたこの話題だよ、Goでchannelがcloseしてるかどうか知りたいようなパターンはだいたい書いてるアプリの設計とかchannelの使い方が間違ってるんだからやめとけ」と眉をひそめるかもしれません。まぁちょっとまって! オレもそうなんじゃないかなぁという気はしているし、ハマリどころがありそうということはうすうす分かってるけど一応調べて考えてみてもいいじゃないか。 結局の所調べて「こうすればいいね!」ってことは分かったんですが、それも破綻する場合があるので、アンチパターンだなぁと思いつつこの記事を書くことにしました。 まずGoのchannelのナイーブさを再確認する そもそもGoのchan

    Goでchannelがcloseしてるかどうか知りたい というアンチパターン
    castaneai
    castaneai 2020/01/20
    “Goでchannelをcloseしてるかどうかを気にする設計はヤバイ徴候 closeする必要があるときは1回だけ確実にcloseするように設計しよう”
  • panicはともかくrecoverに使いどころはほとんどない - Qiita

    Goを書いていてrecoverを使うことはまずほとんどない。頻繁にrecoverを書いているとしたらなにかが間違っているのでプログラミングスタイルを見直すこと。 Goでのエラーハンドリング Effective Goなどで説明されているように、Goではエラーは関数の返り値として返される。たとえばio.ReaderのRead関数は、読み込んだバイト数と、(nilかもしれない)エラーの2つの値を返す。Goでは基的に、エラーは常にこういう通常の値としてハンドルするべきで、エラーの時のための特別な制御構造(try 〜 catch)のようなものを使うのは、利点より害のほうが多いという考え方をとっている。 (同じような考えで例外を使用禁止にしている大規模C++プログラムはいくつもある。たとえばChromiumなどはそうだ。LLVM/Clangもパフォーマンス上の問題で例外を使っていない。C++コンパイ

    panicはともかくrecoverに使いどころはほとんどない - Qiita
    castaneai
    castaneai 2020/01/15
    “net/http リクエストハンドラがpanicしたのをrecoverして単一のHTTPリクエストがプロセス全体を終了させないようにしている(これがよいことかどうかは議論の余地があるし、しかもドキュメントされていない)”
  • (More) Effective Go

    castaneai
    castaneai 2020/01/15
  • Why are my Go executable files so large?

    This blog post was originally published on the author's personal blog. OverviewI built some tooling to extract details about the contents of a Go executable file, and a small D3 application to visualize this information interactively as zoomable tree maps. Here’s a static screenshot of how the app illustrates the size of the compiled code, in this example for a group modules in CockroachDB: The re

    Why are my Go executable files so large?
    castaneai
    castaneai 2020/01/10