Go関連のことを調べてみた2023年02月07日

Go関連のことを調べてみた2023年02月07日

Bun, Deno, Go, Node, Rust, Zig: ベンチマーク

# Bun, Deno, Go, Node, Rust, Zig: シンプルな Web Server ベンチマーク

## イントロ

vim-jp slack の #lang-go で、Go vs Node が土日に繰り広げられていました(月曜日気づいた)。
mattn さんが、Go と Node の速度を比較するベンチマークを書いていたので、それを bun, deno, go, node, rust, zig で書いてみました。
(zig わからないので未完成です ?)

https://github.com/ekusiadadus/bench-web-server

## ベンチマーク

| Language | Requests per second | Time per request |
| :——- | :———————- | :—————- |
| bun | 11793.40 [#/sec] (mean) | 0.848 [ms] (mean) |
| deno | 32913.58

元記事を表示

gorm.DeletedAt と Delete をあれこれ検証してみた [GORM]

# はじめに
Go言語のORMパッケージとして、[GORM][GORM] があります。
「データの取得」「論理削除」「物理削除」について色々検証してみたので、その結果を共有します。

# 前提
– Go言語をある程度触ったことがある
– [GORM][GORM] パッケージをある程度触ったことがある
– 主に、`gorm.DeletedAt`とその周辺について話します
– データベースの内容は、VSCode 拡張機能の [MySQL](https://marketplace.visualstudio.com/items?itemName=cweijan.vscode-mysql-client2) で閲覧します
– [Gin][Gin] パッケージを触ったことがある
– 最終的にAPIレスポンスとして検証するので、Gin を使います
– APIへのリクエストは、VSCode 拡張機能の [RESTClient](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) を用います
– 論理

元記事を表示

機械学習で歌舞伎町ライブカメラの人流を3D化してみる

# はじめに
この記事は「画像処理系の技術をつかってなにか作ろう!」というゆるい授業で作成したグループ自由課題を抜粋・一部改変して投稿したものです。
モデルの考案やシステムの開発は自分で行いましたが、Introductionでの調査や、実地測定はグループメンバーに手伝ってもらっています

学術論文っぽい体裁になってますが中身はエンジョイ企画なので軽い気持ちで読んでいってください!

先に結果をみたい方は[こちら](#-results)!!

# ? Abstract

本プロジェクトでは莫大なサイズにもなりうるデータを利用価値を落とさずに、すなわち特定の人物の追跡などが可能な質を保ったまま効率的に保管・処理する手法を提案する。

新宿歌舞伎町に設置されている2台の防犯カメラに映る通行人を検出し、防犯カメラの仰俯角・方位角を推定した上でそれらの座標を3次元座標に変換した。複数の防犯カメラ映像から得られる座標群を合成することで2カメラに映る人物の同一判定を自動で行い、人流の追跡に十分な精度の3Dマッピングに成功した。

また、チェス盤模様のボードを用いる従来のカメラキャリブレーションでは、

元記事を表示

シーク法のgoでの実装

## 背景
DBからページネーション用のデータのリストを取ってきたい機会がありました。今までDBを全然扱ってこなかったので、色々調べていると、offset法とシーク法が主な実装方法で、**offset法はクソ遅い**ということがわかりました。そこで、シーク法をGoで実装したときのコードを共有したいと思います。
offset法とシーク法の比較についての資料は、以下の3つの資料がわかりやすかったです。
– [OFFSETは前の行を読み飛ばすのにはよくない方法](https://use-the-index-luke.com/ja/sql/partial-results/fetch-next-page)
– [offsetでページネーションは遅い。これからはシーク法だ!](https://qiita.com/madilloar/items/b4e786a932ef9d4551b9)
– [で、オフセット法に比べてシーク法のページネーションはどれだけ早いの?RDB毎に。](https://qiita.com/madilloar/items/5625e61cf3e348d08ef8)

## 方法

元記事を表示

VSCodeのGo言語デバッグで、”go: cannot find main module…”とエラーが出る【M1Mac】

# VSCodeのGo言語デバッグで”go: cannot find main module…”とエラーが出る【M1Mac】

## 環境
MacBook Pro (2021)M1Pro

## 原因
おそらく環境構築した時に入力されたPATHにデバッグしようとしているディレクトリが入っていない事によるエラー?(拙い英語力で曲解)

## 解決策
VSCodeの設定settings.jsonに設定を追加する

### 1 設定画面を開く
ステータスバーの”Code”>”基本設定”>”設定”を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125452/83fddb94-8ed7-9e1c-3bdb-2e433aaafd71.png)

### 2 settings.jsonを開く
VSCode右上のファイルみたいなマークが目印
![スクリーンショット 2023-02-05 17.11.41.png](https://qiita-image-store.s3.ap-northea

元記事を表示

gin + mysql + dockerでconnection refusedエラー

gin + mysql + dockerで環境を構築した際に遭遇したconnection refusedエラーと対応について記載する。

# 問題の概要
docker-compose.ymlでdepends_onを使い、mysql → goの順に起動するよう制御しているつもりが、
mysqlの起動を待たずにgoが起動してしまい、connection refusedで落ちる。

# TL;DR
docker-composeのconditonとhealthcheckを使うことでmysqlの起動を待ってからgoを起動させることに成功。
下記のようにapp/depends_onの`condition`とdbの`healthcheck`を追記した。

“`yaml:対処前のdocker-compose.ymlのdepends_on
services:
go:
depends_on:
– db

db:
(通常通りの設定)
“`

“`yaml:対処後のdocker-compose.ymlのdepends_on
services:
go:
de

元記事を表示

Go 基本

Goのプログラムは、パッケージ( package )で構成されます。
プログラムは main パッケージから開始されます。

規約で、パッケージ名はインポートパスの最後の要素と同じ名前になります。 例えば、インポートパスが “math/rand” のパッケージは、 package rand ステートメントで始まるファイル群で構成します。

Goでは、最初の文字が大文字で始まる名前は、外部のパッケージから参照できるエクスポート(公開)された名前( exported name )です。

関数は、0個以上の引数を取ることができます。
この例では、 add 関数は、 int 型の2つのパラメータを取ります。
変数名の 後ろ に型名を書くことに注意してください。

x int, y int

x, y int   へ省略可能

関数は複数の戻り値を返すことができます。

func swap(x, y string) (string, string) {
return y, x
}

Goの

Named return value

Goでは、関数の戻り値に名前をつけ

元記事を表示

Go案件を狙うなら他に何を学べばいいの?

# フリーランススタートでスキルをスクレイピング

[フリーランスエンジニア向けIT求人・案件サイト【フリーランススタート】](https://freelance-start.com/)

下記の絞り込み条件で検索。[スキル]をスクレイピングしカウントしてみた

– 絞り込み条件
– Go言語
– サーバーエンジニア
– 単価¥700,000-¥1000,000+
– 東京都

## 結果発表

| skill | count |
| — | — |
| Go言語 | 800 |
| TypeScript | 234 |
| PHP | 186 |
| JavaScript | 151 |
| Google Cloud Platform(GCP) | 138 |
| React | 135 |
| GitHub | 132 |
| Kotlin | 131 |
| Java | 131 |
| Python | 130 |
| MySQL | 126 |
| Git | 124 |
| Docker | 124 |
| Vue.js | 115

元記事を表示

値レシーバとポインタレシーバ

# はじめに
Golangをちょっと触れてみたので備忘録としての自分用メモ

# レシーバとは
Goにはクラスは存在しない。そのためJavaで言うインスタンスメソッドも存在しない。
一方、構造体というものを定義することができ、構造体に対してメソッドを定義することができる。

メソッドは以下の文法で記述される
`func (レシーバ 構造体) メソッド名(引数) 返り値`

“`golang
package main

import “fmt”

func main() {
s := Student{“nobita”, 60, 60}
fmt.Println(s.name, s.avg()) // nobita 60
}

type Student struct {
name string
math float64
english float64
}

func (s Student) avg() (avgRes float64) {
avgRes = (s.math + s.english) / 2
return
}
“`

# 値レシーバとポインタレシ

元記事を表示

Dapr の Actor 機能を試してみる

[Dapr](https://github.com/dapr/dapr) [^1]の Actor 機能を試してみました。

[^1]: Dapr の概要や環境構築に関しては [前回の記事](https://qiita.com/fits/items/3aab0d92e4f948c8cb3a) が参考になるかもしれません

個人的に、Dapr を使った実際のシステム開発では Actor の活用が重要そうな気がしています。

# Actor の実装方法

本来は、プログラミング言語毎に用意された Dapr SDK を使って Actor を実装する事になりそうですが、まずは仕組みを理解するために SDK 無しで実装してみました。

Actor の実装に必要な HTTP エンドポイントは [actors_api ドキュメント](https://docs.dapr.io/reference/api/actors_api) の “Dapr calling to user service code” 欄に記載されており、とりあえずはこのようになっていました。

||HTTP エンドポイント|概要|
|

元記事を表示

GoでApple Store Server APIのリクエスト

## 概要

本記事では、Apple Store Server API のリクエストに必要な JWT について説明し、Go言語で JWT を生成・使用する方法を紹介する。
また、実際に生成したJWTを利用して、Apple Server Notifications API のテストを要求する方法を紹介する。

## JWT とは

JWT は、[JSON Web Token](https://tools.ietf.org/html/rfc7519) の略で、属性情報を JSON 形式で記述したトークンのことである。
JWT には関連する仕様として、[JWS](https://tools.ietf.org/html/rfc7515) と [JWE](https://tools.ietf.org/html/rfc7516) がある。
JWS は、JSON 形式で署名されたデータを記述する仕様であり、JWE は、JSON 形式で暗号化されたデータを記述する仕様である。
Apple Store Server API では、JWS を利用するため、今回は JWS を用いた JWT

元記事を表示

Goで作った自作のコマンドラインをGitHub Actionsで使用する

最近、[こういったツール](https://github.com/iwashi623/gjobctl)を作りました。
せっかく作ったツールのなので、GitHub Actionsの中で実際に使ってみたいな〜と思ったのですが、自作のパッケージを配布する方法がわからなかったので調べました。その時のメモです。

## ツール紹介
ツールの中身のことを語っても仕方ないので、軽く説明すると、AWS GlueのデプロイなどをするAPIをラップしたものです。
ディレクトリ構成は以下のようになっています。
“`
gjobctl
├── cmd/gjobctl
│ └── main.go
├── go.mod
├── go.sum
├── cli.go
├── deploy.go
├── create.go
.
.
.
└── RAEDME.md
“`

Terminalで以下のようなコマンドが使えます。
“`bash
$ gjobctl
Usage: gjobctl

Flags:
-h, –help Show context-sensitive help.

元記事を表示

[書籍レビュー] 実用Go言語

## 書籍概要
[実用Go言語](https://www.oreilly.co.jp/books/9784873119694/)

タイトルの通り実用的なGo言語の書き方について書かれた本です。
若干文章の結論が分かりづらい節がありましたがサンプルコード多めなので特に気にせずに読むことができました。
[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1) や入門書でGoの言語機能を一通り使えるようになった後に読むのをおすすめします。

1〜6章まではGo言語についての基本と発展がまとまっているという感じで、7章以降はよりシステム開発チックな内容になっています。6章までは順に読みつつ7章以降は気になるトピックから読み進めるのが良さそうです。

## 本の目次

|章|内容|
|:-|:-|
|第1章|「Goらしさ」に触れる|
|第2章|定義型|
|第3章|構造体|
|第4章|インタフェース|
|第5章|エラーハンドリング|
|第6章|パッケージ、モジュール|
|第7章|Goプログラミングの環境を整備する|
|第8章|さまざまなデー

元記事を表示

XML,JSON,YAML のGo言語による操作について調べた結果

データ交換やAPIの利用などで、YAML,JSON,XMLなどのエンコードとデコード処理は必須だ。そこで、Go言語初学者なので、これらの処理方法を調べてみたメモである。この記事に、間違いや、もっと良い方法があれば、教えてください。

## パッケージ共通的機能
XML,JSON,YAMLなどを扱うパッケージは、以下の共通的な機能を持っている。
* XML https://pkg.go.dev/encoding/xml
* JSON https://pkg.go.dev/encoding/json
* YAML https://pkg.go.dev/gopkg.in/yaml.v2

### 共通的機能 Marshal/Unmarshal
バイト型配列を対象として機能する。

Unmarshalは、XML,JSON,YAMLのバイト配列([]byte)を構造体型へ格納する。
* func Unmarshal(data []byte, v any) error

Marshalは構造体型のデータから、XML,JSON,YAMLのバイト配列([]byte)を返す。
* func M

元記事を表示

windowsのdocker上にgo言語の環境を作りたい(dockerチュートリアルまで)

# はじめに
Go言語やりたい

[WSL上に環境構築はできた](https://qiita.com/KoHey94/items/5abf60e612cfb6ec263e)

今時ならdockerで環境作るべきか?

なんもわからんからとりあえずやろう←いまここ

~~自分用備忘録ってことにすればQiitaの肥やしを増やしてもいいと思いました~~

# 前提
Windows11です。

# Dockerって有料になったのでは?
https://www.itmedia.co.jp/news/articles/2201/31/news096.html
正確にはDocker Desktopが有料になったが、個人利用もしくはスモールビジネス(従業員数250人未満かつ年間売上高1000万ドル未満(訳注:1ドル110円換算で11億円))、教育機関、非商用のオープンソースプロジェクトでは引き続き無料で利用できるという条件がついているそうです。
今回は学習用の個人利用なので問題なさそう。

# docker hubのアカウント作成とDocker Desktopのインストール
imageのアップロ

元記事を表示

コードは最上級のドキュメントになり得るか

# はじめに

https://qiita.com/saetegaljewp/items/a15d769f6553f4ed75d3

という記事を投稿したところ、多くの方からコメントいただきました。
上記事は私のマネジメント失敗談を書いたものですが、私と同じように設計ドキュメントを正とする考えもあれば、コメントやドキュメントよりもコード!という考えもあるとわかりました。

そこで、**果たしてコードが最上級のドキュメントになりえるのか**を考察したいと思います。

## ディスクレーマー

本記事はコメントしてくださった方を批判するものではありません。
誤解のなきようお願いいたします。

# 最上級とは

ここで最上級とは**ドキュメントに取って代わることができる**つまりコードだけでプロダクト活動に包含される概念を示すことができる、という意味とします。

つまり、コードさえあればドキュメント無しでプロダクト活動(プロジェクト)は成立するということです。

# ドキュメントとは

ここでドキュメントとは**DDDの文脈におけるドキュメント**を指すことにします。

* ドキュメントはコ

元記事を表示

jackc/pgxでクエリー実行時にconn busyと出る場合

クエリーを複数回実行する場合は、一度も `Scan()` せず次のクエリーを実行しようとすると下記のエラーが出ます。

> conn busy

“`go:誤
err = conn.QueryRow(context.Background(), “INSERT INTO users(screen_name) VALUES (‘go’);”)
err = conn.QueryRow(context.Background(), “INSERT INTO users(screen_name) VALUES (‘mod’);”) // error!
rows, err := conn.Query(context.Background(), “INSERT INTO users(screen_name) VALUES (‘tidy’);”) // error!
“`

次のクエリー実行前に必ず `Scan()` するか、 `INSERT`, `UPDATE` など値を取得する必要がないクエリーには `Query()` (`QueryRow()`) の代わりに `Exec()` を使います。

元記事を表示

jackc/pgxで始めるgo+Postgres

Go言語でjackc/pgxを使ったPostgreSQLを使う機会ができたので、最小構成でスタートさせて理解を深めようとしました。

## 動作環境

“`console
$ cat /etc/os-release
PRETTY_NAME=”Ubuntu 22.04.1 LTS”
NAME=”Ubuntu”
VERSION_ID=”22.04″
VERSION=”22.04.1 LTS (Jammy Jellyfish)”
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL=”https://www.ubuntu.com/”
SUPPORT_URL=”https://help.ubuntu.com/”
BUG_REPORT_URL=”https://bugs.launchpad.net/ubuntu/”
PRIVACY_POLICY_URL=”https://www.ubuntu.com/legal/terms-and-policies/privacy-policy”
UBUNTU_CODENAME=jammy

$ g

元記事を表示

Dapr を Lima で実行してみる

[Dapr](https://github.com/dapr/dapr) という分散アプリケーション用のランタイムを [Lima](https://github.com/lima-vm/lima) で実行してみました。

# はじめに

## Dapr とは

Distributed Application Runtime の頭文字から Dapr と名付けられているように、分散アプリケーションの開発を容易にするためのランタイム(とフレームワーク)です。

マイクロサービスに特化したものではなく、考え方はサービスメッシュよりも Java/Scala の [Akka](https://github.com/akka/akka) に近い気がするので、マイクロサービス開発へ適用する際は注意が必要かもしれません。

### アプリケーションの開発モデル

Dapr のアプリケーションは、自身のサイドカーとして適用される Dapr Runtime とだけ直接やりとりする次のようなモデルを想定しているようです。

“`mermaid
flowchart LR
App1–>Dapr1[Da

元記事を表示

【Golang】Sentry (APMツール) の導入

# 概要
GoのAPIプロジェクト上に、Sentry(APMツール)を導入します。

# 環境構築
## 前提
Goプロジェクト上で動作するため、環境を用意します。
“`zsh:shell
go mod init
“`

## アカウント作成
https://sentry.io/welcome/

ホームページよりSentryのアカウントを作成します。
今回はTRIALで進めます。

## Welcome to Sentry
今回は、SDKを使用するため「Install Sentry」を選択します。
![スクリーンショット 2023-01-30 17.36.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433195/51b29a7a-809b-b5f9-c663-f864b3093b83.png)

## Select the platforms you want to monitor
Goを選択します。
![スクリーンショット 2023-01-30 17.37.14.png](https:

元記事を表示

OTHERカテゴリの最新記事