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

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

Docker on WSL2でawesome-composeのnginx-golang-mysqlを立ち上げる

Dockerの勉強を兼ねていろんなサーバを構築して遊んでいるのですが、次のような素晴らしい(awesome!な)リポジトリがあったので、早速試しました。

https://github.com/docker/awesome-compose

基本的には好きなディレクトリに入って “` docker compose up -d “` するだけなのですが、自分の環境(WSL2)では少々詰まってしまったところがあったので、備忘録として残しておきます。

この記事では、アプリケーションサーバにGo、プロキシサーバ(Webサーバ)にNginx、データベースサーバにMySQLを使ったアーキテクチャ “` nginx-golang-mysql “` を立ち上げてみます。

### git clone & ディレクトリに入る
“`
$ git clone https://github.com/docker/awesome-compose.git
$ cd awesome-compose/nginx-golang-mysql/
“`

### docker compose実行
“` doc

元記事を表示

Asterisk AGIでGo言語を使う方法

# 1. AGIファイルを用意する

“`agi.go
package main

import (
“log”
)

func main() {
log.Println(“AGI TEST”)
}
“`

# 2. AGIファイルをビルドする

“`
# $ go build agi.go

$ ls
agi.go
agi
“`

# 3. extension.confでビルドしたバイナリを指定する
“`extensions.conf
same => n,AGI(agi)
“`

元記事を表示

CKADを駆け抜けろ!kubectl短縮コマンドを体に叩き込むツールを作った

# TL; DR

“`bash
# リソース名が長い!
$ k get replicasets
ERROR: too long! should be `kubectl get rs`

# オプション名が長い!
$ k get rs –namespace foo
ERROR: too long! should be `kubectl get rs -n foo`

# ヨシ!
$ k get rs -n foo
NAME DESIRED CURRENT READY AGE
nginx-76d6c9b8c 1 1 1 23h
“`

https://github.com/Syuparn/kuberta

# はじめに

CKADは、k8sを利用するアプリケーション開発者向けの試験です。

https://training.linuxfoundation.org/ja/certification/certified-kubernetes-application-developer-ckad/

元記事を表示

構造体の埋め込みを GORM で利用すると便利

## 構造体の埋め込み

“`go
type A struct{}

func (A) Execute() { println(“A”) }

type C struct { A }

func Test(t *testing.T) {
c := C{}
c.Execute()
}
“`

上記のコードは正しく動作します。
このように、構造体を別の構造体に埋め込むことを Struct Embedding と呼びます。

## GORM での利用

GORM では、構造体からテーブル名を得る際に、構造体の `TableName` メソッドが使われます。
たとえば次のコードを書いたとき、GORM は `a` というテーブル名を得ます。

“`go
type A struct{}

func (A) TableName() string { return “a” }
“`

Struct Embedding により、以下の `B` 構造体は、外から見ると `TableName` メソッドを持つかのように見えます。

“`go
type A struct{}
type B str

元記事を表示

DDDとは?GOとは?って状態からAPIのユニットテストをつくってみた

# テストコード

今回は[DDDとは?GOとは?って状態からAPIをつくってみた](https://qiita.com/tauemo/items/87e34c5a7d631236ab4d)で作ったプログラムにテストコードを作ってみます。

まず、テストコードはどこからどこまで作成するのか、と言うのが大きく意見が分かれてくるところです。
個人的にはテストコードを書くなら、徹底的に書く。書かないならまったく書かない。と言うのが好きです。

と言うのは、引き継いだプロジェクトで「テストコード書いててCI環境も構築してコミットしたらテストコードが走るようになってるから。」と言われて安心してたんだけど、テストコードは中途半端に実装されているだけで、当然バグとして発見されるべきものが発見されず、リリース後に気づくということが頻発したことがありました。
テストコードのおかげでバグを見つけられることもあり、捨てるのはもったいなく、メソッドに変更を加えるとテストコードの変更も加えないといけない、時間のある時にテストコードの漏れを補っていかないといけない。手動のテストもやらないといけない。と言う経験があ

元記事を表示

GOを使ってLaravelのSeederクラスを生成するプログラムを作った

最近、GOを学習しているのと、csvファイルのデータからLaravelのSeederを作成するタスクがあったので、Seederを作成するツールをGOを使って作ってみました。

## 作ったソース
ついでに、DBからデータを取得し、Seederを作成するプログラムも作りました。
使い方は、README.mdを参照してください。

https://github.com/murapon/generate_seeder_by_golang

## 参考にしたサイト
https://qiita.com/ikawaha/items/28186d965780fab5533d

https://chat.openai.com/chat
を使って、回答を得た。

スネークケースのファイル名をアッパーケースに変更する方法
![スクリーンショット 2023-02-08 17.59.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37929/358e0ba1-f95b-64c6-5903-526059b7780f.png)

元記事を表示

【Golang】go.mod file not found in current directory or any parent directory.の対処法

## はじめに
最近Golangの学習を始めました。ざっと[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)を一通りやったので、実際に何かを書いてみようと思い、Go+Gin+Gorm+Mysql+Docker+Nginxで簡単なAPIを作成しようとしていました。そんな時に下記のようなエラーに遭遇したので、備忘録がてら記事にします。

## 実行手順とエラーの内容
さて、簡単なREST APIを作成するために、Dockerで環境を構築しようと下記のように最小構成でDockerfileを記載しました。

“`dockerfile:Dockerfile_修正前
FROM golang:1.20.0-bullseye

WORKDIR /data

RUN apt-get update \
&& apt-get install git \
&& go get github.com/gin-gonic/gin \
&& go get github.com/jinzhu/gorm \
&& go get

元記事を表示

helper = osxkeychainしながら自作のプライベートリポジトリーをGoで使う方法

## 検証環境
* macOS Monterey バージョン 12.4(21F79)
* git version 2.32.1 (Apple Git-133)
* go version 1.19.1 darwin/amd64

## 導入
[macOSのキーチェーンアクセスに自作のプライベートリポジトリーのユーザー名やパスワードを登録](https://support.apple.com/ja-jp/guide/keychain-access/kyca1120/mac)し、[Gitに`helper = osxkeychain`を設定してそれを読み込ませることで自動的にログインする](https://qiita.com/yurachika2020/items/4453fbf20b49fb93fcff)と便利です。
これを使って`go get`や`go build`ができたらどんなに良いかと思い、実行してみたら以下のようなエラーにぶち当たる人は多いでしょう。
“`zsh
% go build
go: git-codecommit.ap-northeast-1.amazonaws.com

元記事を表示

一周年記念に”THE FIRST CODE”を完走した感想

# `THE FIRST CODE` ってなあに?

`THE FIRST CODE` という遊びを皆様ご存知でしょうか?

「一度だけの実行しかできない条件で、指定のプログラムコードを開発する」という、プログラミング系Youtuberの間で流行っている遊びです。
音楽系Youtubeチャンネルの `THE FIRST TAKE` をモジったタイトルになっています。

YoutubeやTwitterで #thefirstcode というタグで検索するといろいろな方がUploadしている動画を見ることができます。

# ゆにるユニ一周年記念でやってみた!

ところで私はゆにるユニ、IT TechLeadのVTuberです。はじめましての方ははじめまして!
普段は [プログラミング言語を作った](https://qiita.com/yuniruyuni/items/2c4aa81097a4e5578d46) り、Yuniru’s HackerNews Summaryとして、ハッカーなニュースを毎週まとめてお伝えしています。。。!

実は2月5日に一周年を迎えたので、その日の遊びとして `T

元記事を表示

Golang、PresignURLでファイルをアップロードするときハマったところ

GolangでPresignURLを使ってファイルをアップロードすると下記のエラーが出てしまい
“`
NotImplemented
A header you provided implies functionality that is not implemented

Transfer-Encoding

“`

RequestのHeaderをDumpすると`Transfer-Encoding:chunked`になってる。この値だとAWS側が対応してないみたいです。

## 解決方法
go version 1.19
“`
req.ContentLength = #content size <- ファイルのサイズ値を設定する ``` ContentLengthを設定するだけで解決しました 因みに、`req.Header.Set("Content-Length", xxx)`を設定しても解決できないです。これのせいで結構ハマりました理由です。 Full Codeはここです

元記事を表示

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 エンドポイント|概要|
|

元記事を表示

OTHERカテゴリの最新記事