タグ

Goに関するW53SAのブックマーク (97)

  • 作ってわかる! はじめてのgRPC

    gRPCは主にバックエンド、特にマイクロサービス同士の通信に多く使われる通信方式です。 しかしそれゆえに知名度が低く、「gRPCってどんな通信なんだろう?」「HTTPとは別の仕組みなの?」と思っている方もたくさんいるのではないでしょうか。 このでは、gRPCはそもそもどんなコンセプトで作られた通信方式なのかから、Goでの具体的な実装ノウハウ、AWSにデプロイするための設定までを通貫して解説することで、 「gRPC全くわからない」という人が「自分で実装して動かせそうな気がする……!」と思える段階までたどり着けるようにしました。

    作ってわかる! はじめてのgRPC
  • Goならわかるシステムプログラミング

    Goで始める、すこし低レイヤのプログラミング入門。入出力、ネットワーク、メモリなど、現実の世界でプログラムが動くために必要な機能をプログラム言語Goを通して覗いてみよう。OSの機能とは何か、それをプログラミングでどう利用するのか、システムプログラミングの世界をプログラマの視点から眺めていく連載企画。 2017年06月21日 17時00分 プログラミング+ Go言語によるプログラマー視点のシステムプログラミング 第20回 Go言語とコンテナ 連載の最終回。この連載ではプログラムがコンピュータ上で動くときに何が起きているのかをGo言語のコードを通して覗いてきました。今回はその締めくくりとしてコンテナについて紹介します。 2017年06月07日 21時30分 プログラミング+ Go言語によるプログラマー視点のシステムプログラミング 第19回 Go言語のメモリ管理 ソフトウェアにとってメモリは不

    Goならわかるシステムプログラミング
    W53SA
    W53SA 2022/05/30
  • Go言語で利用するLLVM入門 | POSTD

    はじめに LLVMは、コンパイラを作成するための基盤です。2000年にChris Lattnerによって作成され、2003年にリリースされました。それ以来、LLVMリンカ lld やLLVMデバッガ lldb など幅広いツール群を持つ包括的なプロジェクトに発展してきました。 LLVMの秀でた特徴は、一般に LLVM IR と呼ばれる、その中間表現です。LLVMの考え方は、まずこのIRにコンパイルし、次にそのIRを、JITコンパイルする、インタープリタで実行する、または実行しているマシンのネイティブアセンブリにコンパイルするといういうものです。このIRの主なターゲットは、コンパイラです。実際LLVMを使用するコンパイラは、世の中に数多くあります。C言語とC++用はそれぞれclangとclang++、D言語用の ldc2 、RustSwiftなどです。 Emscripten のようなプロジェ

    Go言語で利用するLLVM入門 | POSTD
    W53SA
    W53SA 2022/04/19
  • Go 言語製実行ファイル解析の紹介 - FFRIエンジニアブログ

    はじめに セキュリティエンジニアの桑原です。 プログラミング言語には様々なものがあります。 その中でも近年 Go 言語がシンプルなコードであり並行処理を簡単に書けるという特徴から人気が出ています。 しかしながら、マルウェアの作成者も Go 言語に目をつけはじめました。 その結果、WellMess や TellYouThePass といった Go 言語製のマルウェアが出現しています。 こうした Go 言語製の実行ファイルは C 言語等で作成された実行ファイルと異なる点が多く、それを知らずに解析を始めると戸惑うことがあります。 そこでブログでは、Go 言語で解説用に作成した無害な実行ファイルの解析を通して、その特徴を紹介します。 以下は今回使用したツールと環境です。 Windows 10 x64 20H2 Ghidra 10.1.1 x64dbg Mar 16 2021, 01:13:24

    Go 言語製実行ファイル解析の紹介 - FFRIエンジニアブログ
  • Go: selectでctx.Done()を受信するときの注意点 - castaneaiのブログ

    Goで非同期的な処理の中断を検知したい場合、次のように select と ctx.Done() を使って書くことが多い。 とても便利なパターンなのだが、いくつか使うときの注意点がある。 select { case <-ctx.Done(): // done case <-ch: // ... } selectによる受信のランダム性 channelに届いたタスクを順番に処理しつつ、キャンセル要求が来たら終了する簡単なプログラムを例にする。 コードにある通り次のような順序で実行される。 task1を送る キャンセル要求を送る task2を送る package main import ( "context" "log" "time" ) func main() { ctx, cancel := context.WithCancel(context.Background()) tasks := m

    Go: selectでctx.Done()を受信するときの注意点 - castaneaiのブログ
  • Goのmonorepoとworkspace mode - Qiita

    僕はmonorepoが好きで、これまでGoのsingle-module構成とmulti-module構成どちらも実運用してきました。最近ではメルカリShopsがmonorepoを採用して話題になったりとにわかに盛り上がっていて嬉しくあります。 https://engineering.mercari.com/blog/entry/20210817-8f561697cc/ さて、来たるGo 1.18の目玉はやはりGenericsで影に隠れがちですが、multi-moduleの体験を向上させるworkspace modeという機能が入る予定です。 https://github.com/golang/go/issues/45713 この記事ではGoでmonorepoするときの一般的な構成であるsingle-moduleとmulti-module、そしてworkspace modeが入ったあとの世界

    Goのmonorepoとworkspace mode - Qiita
  • strings.Cut と strings.SplitN はどっちが速いか

    はじめに Go の tip に strings.Cut が入ったのでベンチマークを取った。ちなみに strings.Cut は lhs, rhs, ok := strings.Cut("FooBarBaz", "Bar") // lhs: Foo // rhs: Baz // ok: true package main_test import ( "strings" "testing" ) func BenchmarkCut(b *testing.B) { s := "FooBarBaz" b.ResetTimer() for i := 0; i < b.N; i++ { lhs, rhs, ok := strings.Cut(s, "Bar") if !ok || lhs != "Foo" || rhs != "Baz" { b.Fatal("bad!") } } } func Benc

    strings.Cut と strings.SplitN はどっちが速いか
  • Middleware Patterns in Go

    Middleware Patterns in GoHow to do pre and post-processing on all requests Last edited on Oct 23, 2021 by Dave Stearns So far you've seen how to build a Go web server that routes requests to different functions depending on the requested URL. But what if you want execute some code before and after every request, regardless of the requested URL? For example, what if you wanted to log all requests m

    Middleware Patterns in Go
  • HTTP Middleware の作り方と使い方 - 技術メモ

    こちらは Making and Using HTTP Middleware の日語訳です。 HTTP Middleware の作り方と使い方 ウェブアプリケーションを構築しているときに、多くの(あるいはすべての)HTTPリクエストに対して実行したい共通機能があるかもしれません。すべてのリクエストをログに記録したり、すべてのレスポンスを gzip したり、重い処理を行う前にキャッシュをチェックしたりしたいと思うかもしれません。 このような共通機能を整理する一つの方法として、ミドルウェアを設定することがあります。Go では、HTTP リクエストの制御の流れが以下のようになるように、ServeMux とアプリケーションハンドラの間でミドルウェアを使用するのが一般的です。 ServeMux => Middleware Handler => Application Handler 今回は、このパタ

    HTTP Middleware の作り方と使い方 - 技術メモ
  • Goのメソッドのレシーバータイプ(値 or ポインタ)について調べてみる - CLOVER🍀

    これは、なにをしたくて書いたもの? Goの勉強をしていて、メソッドのレシーバー定義が2つあって、どういう使い分けをしたらいいのかよくわからなかったので 調べてみることにしました。 2つ、というのは、こういうのと func (p Point) Length() float64 { こういうのですね。 func (p *Point) Length() float64 { レシーバーの型に*がついているかどうか、というのが違いになります。 用語の整理 メソッド、レシーバーという言葉の意味を、最初にかいておきましょう。 Goのドキュメントの、こちらを参照します。 The Go Programming Language Specification / Method declarations メソッドとは、レシーバーを持つ関数のことです。 A method is a function with a r

    Goのメソッドのレシーバータイプ(値 or ポインタ)について調べてみる - CLOVER🍀
    W53SA
    W53SA 2022/01/17
  • GoでJSTのタイムゾーンを扱う方法 - 技術メモ

    記事はGoでJSTのタイムゾーンを指定する方法を紹介します。 *time.Location の取得方法 タイムゾーンを指定して時刻を取得する方法 方法1.時刻をパースする際に In でロケーションを指定する 方法2. time パッケージが保持しているグローバル変数を更新する 方法1'.ロケーション付で時刻が取得できる関数を生成 文字列から time.Time に変換する方法 まとめ 現在時刻を取得するには time.Now() を使うことになります。time.Now() はデフォルトではローカルな時刻が取得できます。例えばAWS Lambda上ではUTCの時刻が取得できます。日のロケーションで動作するアプリケーションを前提にすると、アプリケーションによっては時刻をJSTで統一したほうがシンプルで扱いやすい、といったケースもあるでしょう。記事ではGoのアプリケーションでJSTの時刻を

    GoでJSTのタイムゾーンを扱う方法 - 技術メモ
  • The Go init Function

  • init関数のふしぎ #golang - Qiita

    はじめに 知られているようで、案外知られてないことをQiitaに投稿していくのも良いと思い、軽いネタですがinit関数についてまとめたいと思います。 init関数とは init関数は特殊な関数で、パッケージの初期化に使われます。 以下のようにmainパッケージに書くとmain関数より先に実行されます。 mainパッケージでない場合は、importするだけで呼び出されます。 package main import ( "fmt" ) func init() { fmt.Println("hello, init") } func main() { fmt.Println("Hello, main") } Playgroundで動かす init関数は何に使うのか? 上記では、初期化に使うと書きました。名前からしてそれは想像できますよね。 init関数は基的にはパッケージ変数の初期化に用いられま

    init関数のふしぎ #golang - Qiita
  • Goの正規表現が遅いって言う人がいたから、(速い)正規表現エンジンを作ったよ

    はじめに 「Goの正規表現は遅い」 そんなふうによく言われていました。(最近はあまり聞かなくなりましたが) たとえば、↓の記事ではPythonの正規表現と比較して1.5倍くらい遅いという結果になっています: この話には「Goの正規表現は最悪時間が短くなるように安定したアルゴリズムを採用しているから」という回答があります: ↑の記事の比較では、GoPerlに対して約10倍以上高速という結果が出ているので、「Goの正規表現は遅くない!はい、論破ー!」というわけですね。 なんでこうなるのかも↑の記事で説明されているとおりですが、Perl(などのバックトラック型エンジン)が入力長に対して指数関数的に実行時間が伸びていくのに対し、Goの正規表現エンジンは入力長に対して線形時間で実行時間が伸びていくアルゴリズムを採用しているため、入力が長くなると急激にGoのほうが有利になるからです: 一方で、入力が

    Goの正規表現が遅いって言う人がいたから、(速い)正規表現エンジンを作ったよ
    W53SA
    W53SA 2021/12/22
  • Goのリリースプロセスとブランチ戦略 - YAMAGUCHI::weblog

    はじめに こんにちは!Google Cloudでオブザーバビリティの担当をしているものです。CVE-2021-44228のおかげでバタバタしていますがみなさんはお元気ですか? このエントリーはpyspa Advent Calendar 2021の15日目の記事です。昨日は @moriyoshit さんの「Goのロギングライブラリ 2021年冬」でした。めちゃめちゃ調べてあって良い記事でした。Goでログライブラリの選定をする際にはこちらをまず読むと良さそうです。 2021.12.21 追記: 穴が空いていたのでGo Advent Calendar 2021 その1の14日目の記事にもしました。 さて、今日は当は「Goならわかる確定申告第三表」という記事を書こうと思ったのですが、まだ確定申告の時期ではないのでそれは辞めにします。そのかわり、今日はGo 1.18がめでたくベータ版リリースとなっ

    Goのリリースプロセスとブランチ戦略 - YAMAGUCHI::weblog
    W53SA
    W53SA 2021/12/16
  • Go格言集に込められた詩情とダブルミーニング|TechRacho by BPS株式会社

    Go言語には、かなり初期から「Go Proverbs」と呼ばれるGoの格言集があります。 Go Proverbs 同サイトに記載されている格言は、2015年のRob Pikeの講演動画にもリンクされています。 日語訳はいくらでもネットに落ちているので探せばすぐに見つかるでしょう。 銀座Rails#38の発表「TechRacho翻訳記事の裏舞台」の中でこのGo Proverbsについて少し触れたのですが、惜しくも途中で時間切れとなってしまったのでここで供養したいと思います。 【銀座Rails#38発表紹介】 @hachi8833 さんより「TechRacho翻訳記事の裏舞台」 Ruby/Rails技術記事・海外の記事翻訳を継続的に公開されているTechRachoの担当者から、翻訳記事の舞台裏について発表頂きます(5/8) #ginzarails https://t.co/aaDkwbVS

    Go格言集に込められた詩情とダブルミーニング|TechRacho by BPS株式会社
    W53SA
    W53SA 2021/12/04
  • Goのリトライ処理で考慮すること

    概要 動機 サービス間通信でリトライ処理をする必要があります。なぜなら、一時的な通信先の不具合など、しばらくしてから再実行することで成功する場合があるからです。しかし、Goの標準パッケージからはリトライ機構は提供されていないので、自身で実装するか他のパッケージを利用しなければなりません。 ここでは具体的な実装例ではなく、net/httpパッケージの実装(主に、http.Clientとhttp.Transport)を踏まえた上で、何がリトライ処理で考慮されているべきかを整理しました。 要約 リトライ処理を実装する場合は以下の観点を考慮する必要があります。 リクエストの内容(Request.Body)をリトライ前に巻き戻す Request.Context()の終了を確認する リトライ前にResponse.Bodyを全て読み切ってから閉じる デフォルトのTransportを使ってコネクションプー

    Goのリトライ処理で考慮すること
    W53SA
    W53SA 2021/12/03
  • せめてリポジトリの各ディレクトリの概要説明だけでも欲しい思ったので dirmap というツールを作ってみた - Copy/Cut/Paste/Hatena

    既存の開発に参加するときや、0->1の開発をしているとき、いつも「せめてリポジトリの各ディレクトリの概要説明だけでも欲しい」と思っていました。 既存のプロジェクトに参加するときは「プロジェクトの理解をする側」、0->1のプロジェクトで開発をしているときは「説明をする側の立場」で、です。 Ruby on Railsのような基のディレクトリレイアウト決まっていてもそのプロジェクトの独自性がでてきますし、Goのようにスタンダードなレイアウトがないのであればなおさら初見ではわかりません。 「じゃあREADME.mdにでも書いておけばいい」というのはその通りです。 ただ、概要説明であっても一度書いたら終わりではなく、更新は必要になります。特に0->1のプロジェクトの初期ではディレクトリレイアウトすら途中で変わるということはままあります。 (ここらへんは「継続的ドキュメンテーション」として私の興味の

    せめてリポジトリの各ディレクトリの概要説明だけでも欲しい思ったので dirmap というツールを作ってみた - Copy/Cut/Paste/Hatena
  • テスト駆動開発でGO言語を学びましょう | テスト駆動開発でGO言語を学びましょう

    **テスト駆動開発(TDD)で基礎を身につけましょう。**GoはTDDを学習するのに適した言語です。なぜなら、学習するのが簡単な言語であり、テストが組み込まれているからです。

    テスト駆動開発でGO言語を学びましょう | テスト駆動開発でGO言語を学びましょう
  • 自作Goコンパイラでマルチスレッドが動くようにするまで

    自作Goコンパイラ babygo でマルチスレッドを動かすこと(=子スレッドの作成)に成功しました。 実は以前に挫折していた 1年半前に 一作目のGoコンパイラ minigo でもマルチスレッドに挑戦したことがあるんですが、そのときは子スレッド生成後すぐに Segmentation Faultが起きてしまい、解決方法わからずあきらめたのでした。(動かなかった syscall cloneの残骸 https://github.com/DQNEO/minigo/blob/5ab7420fbca2f65d81bc761d5cbe51a2b28953a8/internal/runtime/runtime.s#L41-L61 ) (当時は gdb でステップ実行すると他のスレッドも処理が進むということを知らなかったので、ただただ謎の挙動にしか見えなかった) 今回やったこと 今回は以下のように要素技術

    自作Goコンパイラでマルチスレッドが動くようにするまで