Go関連のことを調べてみた

Go関連のことを調べてみた

Web フロントエンドしかやってこなかった人がバックエンドに入門する

:::note warning
この記事は書きかけです。
:::

## 概要

 皆さん Web はお好きでしょうか。筆者はずっとフロントと esbuild プラグインばかりを書いてきてバックエンドはサボってきたのでそろそろバックエンドを触れるようになろうとおもいました。この記事はバックエンドに入門するために行ったことの記録です。

 今回は Docker Compose を用いてすべてのコンポーネントを作成します。すなわち nginx、API サーバー (Go)、データベース (PostgreSQL)、Redis をそれぞれ別のコンテナで作成しルーティングします。

 成果物のレポジトリは以下のものになります。

https://github.com/Tsukina-7mochi/web-backend-practice

## Step 1. 仮設 API サーバーを作る

### サーバーを書く

 今回は REST API サーバーを Go で書いていきます。まず `api` ディレクトリで `go mod init main` してプロジェクトを作り、`main.go` に

元記事を表示

サークルのgithubコントリビューション数ランキングサイトを作った話

初めまして!今回は個人で作成したサークルメンバーのgithubのコントリビューション数を可視化したサイト、DiscordBotについて紹介しようと思います😃

## なんで作ったのか
webの勉強を始めて、何か人のためになるものを作りたい!という思いから
たまたまGithubのAPIを叩けるということを知っていて、サークル内で誰がどのくらいコミット(草を生やしているのか)がランキング化できたら、サークルの活性化にもつながるのでは!という思いから作成しました。

## 技術スタック
使用言語、技術は以下の画像のとおりです。
基本的に、フロントはReact、DiscordBot側はGoで書いています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1579922/9280ba5c-770f-f2d1-4dce-d1ce82f341e0.png)

## 開発スタンス
イテレーティブ開発で、とにかく小さな機能をコツコツ肉付けしていったといった感じです。
一番最初は、フロントエンドのみでただ

元記事を表示

[Go×Supabase]ReactとGoを用いてDB連携をしてみる

## はじめに
初めましての人もそうでない人もこんにちは!

あまりにソシャゲに課金したすぎてアフィリエイト的な何かで小遣い稼ぎをしたいなーと思っている今日この頃です。

今回はフロントエンドにReact×TypeScript、バックエンドにGo×Supabaseを使ってフロントとバックのDB連携をしてみたいと思います!

## 今回作るもの
今回は絵文字を登録していつでも簡単にコピペできるようなwebアプリを作成しようと思います!

## DB構造
“`
テーブル名:Emojis
カラム: id => INT型、 character => TEXT型
“`

## 主なディレクトリ構成
“`
.emoji-app/
├── backend/
│ ├── main.go
│ ├── .env
│ ├── go.mod
│ └── go.sum
└── frontend/
├──src/
… ├──components/
│ ├── EmojiApp.css
│ └── EmojiApp

元記事を表示

ent勉強メモ

# ent勉強メモ

GoのORMのentを勉強したときのメモが手元で眠っていたのでとりあえず公開。PostgreSQL on Docker でローカル開発したコードもそのうち公開したい。

いい感じの記事がすでにあった

https://zenn.dev/tkb/articles/d1e6e3b7d62051

– go generateした時点でDBへ接続して操作するAPIが用意される
– 接続先のDBさえありさえすればGoogle DriveからSDKのAPIを使って情報を引き出すとかの操作をするだけ、特に身構えて考えすぎる必要はなさそう

## **Quick Introduction**

[Quick Introduction | ent](https://entgo.io/ja/docs/getting-started/)

– entはシンプルかつ強力なGoのエンティティフレームワーク
– 大きいデータモデルを持つアプリケーションの構築と保守を簡単にする
– 次の原則を守る
– データベーススキーマをグラフ構造として簡単にモデル化する
– Goの

元記事を表示

GoのORM sqlcのType Overridesを自動生成する(MySQL用)

[前回](https://qiita.com/ktat/items/74c9f78e96e57282fc5d)はsqlcのType Overridesの紹介をしましたが、Type Overridesで自前の型にマッピングすると便利だけど、手でやるのはちょっとしんどいかもしれません。

はい、そうですね、自動生成すればいいですね。

## おさらい: Type Overrides の何が嬉しいのか?

その前に、何が嬉しいのか、もう一度、おさらいしましょう(お腹いっぱいの人は次へGo)。例えば、`category_id` というものがあったとします。ですが、categoryは別にテーブル定義されておらず、カテゴリ名はハードコーディングされていたとします。残念ですね。DBで引っ張ってから、Category型でおきかえるかー…。いや、Type Overridesしましょう。

“`go
type CategoryID int

var categoryMap map[CategoryID]string = map[CategoryID]string {
1: “Sports”,

元記事を表示

iCloudにアップされる.pdfファイルの監視・圧縮処理自動化

# 前提
– [Golang](https://go.dev/)インストール済み
– 社内でのファイル共有にはiCloudを使用

# 要件
– 極力低コストで毎月大量の税務資料ファイルを税理士側(全員Windows)と共有したい→月単位で用意したフォルダの圧縮ファイルをメール送信
– スキャンした.pdfデータの容量が必要以上に大きく、クラウド容量を圧迫したり税理士側にメール送信する際にファイル添付出来なかったりする為、.pdfファイルをiCloudにアップされたタイミングで自動圧縮処理したい

Automator(フォルダアクション等)+AppleScriptの設定では自由度が低いのと、MacOSでしか使えないので、環境の変化に対応しやすいGolangで行こう!となりました

# 手順
Golangで共有フォルダ内の更新を監視し、.pdfファイルが追加された場合のみシェルスクリプトで該当ファイルのバックアップを保存した上で適宜圧縮処理します

## 1. 共有フォルダ更新をGolangで監視

### (1) .goファイルを置くディレクトリに移動

“`bash:bash
cd

元記事を表示

Go言語(Golang)の指標分析のライブラリ

1. **go-metrics**
– **特徴**:
– メトリクスのカウンタ、ゲージ、ヒストグラムをサポート。
– 統計情報を収集し、平均、中央値、パーセンタイルなどを計算可能。
– **インポート方法**:
“`go
import “github.com/rcrowley/go-metrics”
“`
– **リンク**: [go-metrics GitHub](https://github.com/rcrowley/go-metrics)

2. **prometheus/client_golang**
– **特徴**:
– HTTPエンドポイントでメトリクスをエクスポート可能。
– ヒストグラム、サマリー、カウンタなどをサポート。
– **インポート方法**:
“`go
import “github.com/prometheus/client_golang/prometheus”
import “github.com/prometheu

元記事を表示

Raspberry Pi 4 model B で Golangを使う

# Raspberry Pi でGolangを使えるようにする

Golang公式からlinuxのarm64をダウンロード
“`
wget https://go.dev/dl/go1.23.1.linux-arm64.tar.gz
sudo tar -C /usr/local -xzf go1.23.1.linux-arm64.tar.gz
rm -rf go1.23.1.linux-arm64.tar.gz
“`

“`
# /usr/local/go/配下にgoがインストールされる
ls /usr/local/go/

# パスを通す
nano ~/.bashrc
export PATH=$PATH:/usr/local/go/bin
source ~/.bashrc
go version

# 適当なディレクトリで
go mod init go-sample
touch main.go
nano main.go
“`
“`
package main

import {
“fmt”
}

func main() {
fmt.Pri

元記事を表示

Web開発エンジニアになるために

# 目次
1. Webエンジニアとは
1. そのために必要な知識
1. 現在の研究と業務のつながり
1. まとめ

# Webエンジニアとは
主に, フロントエンドとバックエンドの2つに分ける. ユーザからみてわかるフロントと在庫数やカード情報の照会等を行うバックエンドから成る.

# そのために必要な知識
1. インターネットについて
1. OSについて
1. データベースについて
1. APIについて
1. プログラミング
1. セキュリティ

多くの知識を必要とする.
>引用 https://tech-parrot.com/engineer/backend-engineer-roadmap-and-skills/#i-2

# 現在の研究と業務のつながり
セキュリティについて学ぶ ➡ 必須の知識となる(特に, バックエンドエンジニア)

# まとめ
多くの知識を必要とするため, 勉強量も凄まじいことになる. 現研究と並行して空き時間でGoやRubyの勉強を行う必要があるのではないか. シンプルに用語の理解を深める必要もある.

元記事を表示

sqlcでType Overrides の活用とgo-optionalの話

[前回](https://qiita.com/ktat/items/ddf0e5e510279503feee)、[前々回](https://qiita.com/ktat/items/2ed13afcd29f49aee6a1)に続き、sqlcの話です。もう少し続きます。

## Type Overrides

sqlcは、YAMLで設定を書きますが、`overrides`という項目があります([ドキュメント](https://docs.sqlc.dev/en/stable/howto/overrides.html))。これは何かというと、DBの型に対するGoの型(例えば、`VARCHAR`を`string`にする)のデフォルトを上書きできるというものです。

ちなみに、実際これを使わないと、MySQLの`DECIMAL`はGoの`string`になってしまいます。

### MySQLの`DECIMAL`にGoの型(`decimal.Decimal`)を指定する

MySQLの型をGoの型で置き換えるためには、sqlc.ymlの`overrides`に、以下のように書きます。

“`y

元記事を表示

【Go】配列(スライス)などの値を標準出力でデバッグするときは、エスケープして出したほうがいいかもという話

普通に出力した場合
“`go
arry := []string{“a b”, “c”, “d”}
fmt.Println(arry)
// [a b c d]
“`
“a b” は一つのアイテムであるが、普通に出力するとアイテムごとに空白で区切られてしまうので分かりづらい。

エスケープして出してみる
“`go
arry := []string{“a b”, “c”, “d”}
fmt.Println(fmt.Sprintf(“%#v”, arry))
// []string{“a b”, “c”, “d”}
“`
printf系の関数を使って、書式指定子を `%#v` とする。
`#`をつけることで、Go構文表現のままで出力してくれるので認識しやすい。

参考にしたもの
https://qiita.com/KEINOS/items/9bf8d33b0c616f85ba4a
https://pkg.go.dev/fmt

元記事を表示

golangci-lintとgolangci-lint-actionを使った開発メモ 

# 概要

ローカルの `golangci-lint` のバージョンとCIの `golangci-lint-action` による `golangci-lint` のバージョンの違いでたびたび詰まることを観測したのでざっと調べたメモ

# 背景

チーム共通のアクションに `golangci-lint-action` を組み込んでおり、golangのプロジェクトでは `.golangci.yaml` を直近のプロジェクトからコピペして使い回す運用になっていた。

`golangci-lint-action` はversionの指定ができるが、チーム内であまり認識されていなく、CIの設定でも”stable”を固定にしていることが多い。

基本は最新を使っていくと安全なはずなので、”stable”は良いが、 `.golangci.yaml` の使い回しが良くない。

この辺りどう運用していくのが良いのかざっくり考えてみる

# 公式のドキュメント確認

> IMPORTANT: It’s highly recommended installing a specific version of

元記事を表示

障害になる前に知っておくべき、sql.Rowsのコネクション管理

標準パッケージ`database/sql`を使用したDB操作では、コネクションが適切に開放されるよう注意する必要があります。誤った実装をすると、SQLの実行が終了してもコネクションが開放されず、コネクションプールが枯渇してしまいます。その結果、新規SQLを実行できずアプリケーションが応答しなくなり、システム障害になる可能性があります。

今回は、コネクションの開放において、`database/sql`パッケージの`Rows`構造体(`sql.Rows`)を利用する際に知っておくべきことを、アンチパターンと共に紹介したいと思います。

# コネクションプールについて軽くおさらい
`database/sql`パッケージの`DB`構造体(`sql.DB`)のQueryメソッドやExecメソッドを呼び出すと、`sql.DB`はコネクションプールから利用可能な接続(idleな接続)を取得するか、ない場合は新規接続を作成します。接続が不要になるとクローズして、接続をプールに返します。

オープンな接続の最大数はデフォルトで無限ですが、`db.SetMacOpenConns()`で最大接続数を設定可

元記事を表示

[GCP]Cloud Run services

[公式ドキュメント](https://cloud.google.com/run/docs/overview/what-is-cloud-run?hl=ja)をベースに自分の言葉でまとめた記事。
初稿は1,2年前に限定共有で作成し、継ぎ足し継ぎ足しで書いてきたので、ちょっとおかしい点あるかもしれませんがご了承ください。

注意
[Cloud Run jobsはまた別のGCPサービスです](https://qiita.com/WisteriaWave/items/d7507510840eea141ece)。

# 1. 概要
**フルマネージドでサーバレス**なコンテナサービス。Kubernetesの機能を気軽に利用できる。
主な用途はAPI, Webアプリケーション、ストリーミング。
Webサーバの役割(HTTP/gRPC対応)はCloud Runが吸収してくれる。
デプロイは数秒で完了、スケーリングもいい感じに自動でやってくれる

## リソースモデル

|![x](https://cloud.google.com/static/run/docs/images/resource-mod

元記事を表示

Go・GORMチートシート

本記事ではgo言語の超基礎を記載する.初めてgoを学ぶ人向けに最低限知ってほしいことのみまとめたので本記事を読み切ると基礎を学ぶ/復習することができます!おまけにgo向けのORMのgormチートシートもあります.

# 他のチートシート
git/ghコマンド

https://qiita.com/JavaLangRuntimeException/items/6b46551f56e0def76eba

SQL

https://qiita.com/JavaLangRuntimeException/items/f038fbaccdd92fb0308a

TypeScript

https://qiita.com/JavaLangRuntimeException/items/5894391c08e0d8e28389

Docker コマンド

https://qiita.com/JavaLangRuntimeException/items/21f7c7bf3d143f821697

ステータスコード

https://qiita.com/JavaLangRuntimeException/it

元記事を表示

Goのjson.Marshalで非公開フィールドも出力する方法

## 背景
こんにちは。エンジニアのKennieです。
以前の業務で、非公開フィールドを持つ構造体をシリアライズする必要がありました。その際にデフォルトでのMarshalJsonではシリアライズすることができなかったので、その際に学んだことを記載します。

## デフォルトのMarshalJsonを使用したコード例
まずは、Goのデフォルトの MarshalJSON を使ったシンプルなコード例を見てみましょう。以下のコードでは、公開フィールドを持つ構造体がJSONとしてシリアライズされています。

“`go
package main

import (
“encoding/json”
“fmt”
)

type Person struct {
Name string
Age int
}

func main() {
p := Person{Name: “Alice”, Age: 30}
data, err := json.Marshal(p)
if err != nil {
fmt.Println(“Error:”, err)
return
}
fmt.P

元記事を表示

golangで、brainfuckソースをx86_64アセンブリに落とすコンパイラを書いてみた。[習作]

go言語を取り掛かるにしたら、何を書けばよいかを思案しているうちに、brainfuck compilerを書くことにした。やってることは難しそうに見えても、実際の処理は簡単だし、すぐにできるだろうと思って書いたが、変数のscopeで、ちょっと引っ掛かった。

### 実行

goはシバンをつけるのがややこしいので、`go run bfs.go >out.s`としてコンパイルして下さい。
out.sはccでアセンブルできるので、`cc out.s`として、アセンブリファイルをアセンブル、
`$./a.out` で実行して下さい。

### コメント

標準出力に結果が出力されます。やってることは、拙作のbfs.c,bfs.pyと一緒です。

https://qiita.com/fygar256/items/3274f1dfc14378645350

相変わらずエラー処理がプアです。人間は何をするかわからないから、エラー処理はいくらやってもキリがないので。ガベージイン・ガベージアウトです。
しかし、生まれて初めて書いたgolangのコードがbrainfuckコンパイラ

元記事を表示

ヘキサゴナルアーキテクチャでポケモンバトルを実施する。(Step2: coreのテスト実装)

## はじめに
[前回の記事](https://qiita.com/koji0705/items/65246ce4dc0b12501216)の続きです。

## テストコード
プロダクトコードに乱数を含むケースがあり、テストが安定しないため、プロダクトコードも一部修正しています。

“`go:internal/core/move.go
package core

import (
“math/rand”
“time”
)

type Move struct {
Name string
Power int // 技の威力
Accuracy int // 命中率(0-100%)
Type string // 技の属性(例: 電気、炎など)
randSource *rand.Rand // 乱数生成器を保持
randomFactorFunc func() float64 // ランダムなダメージ倍率を計算する

元記事を表示

ヘキサゴナルアーキテクチャでポケモンバトルを実施する。(Step1: coreの実装)

## はじめに
表題通り、ヘキサゴナルアーキテクチャでポケモンバトルを実装します。
今回はドメインのコアとなる部分を中心に実装していきます

## 要件
### enititityの定義
1. ポケモンの定義
• 各ポケモンは以下のステータスを持つ。
• 名前: ポケモンの名前を保持する(例: “ピカチュウ”)。
• HP: ポケモンのヒットポイント。0になると戦闘不能となる。
• 攻撃力: ダメージ計算のために使用される攻撃ステータス。
• 防御力: 受けるダメージを軽減するための防御ステータス。
• 素早さ: バトルでの行動順を決定するためのステータス。
• 技のリスト: ポケモンが使用できる技のリスト(複数の技を保持)。
2. 技(Move)の定義
• 技は以下のプロパティを持つ。
• 名前: 技の名前(例: “10まんボルト”)。
• 威力: 技が持つ基礎ダメージ値。
• 命中率: 技が命中する確率。0~100%の範囲。
• タイプ: 技の属性(例: 電気、炎、草など)。
• 特殊効果(オプション): 特定の技が持つ追加効果(例: 相手をまひ状態にする

元記事を表示

Goでクラス図を自動生成する

## はじめに
表題通り、Goでクラス図を自動生成します。goplantumlを使うと簡単に生成できます。

https://github.com/jfeliu007/goplantuml

## 成果物
goplantumlを使うとクラス図を自動生成できます。
![pokemon_battle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/7ab56c06-31d0-0d2a-769f-b5a9ee7e3c24.png)

## 準備
“`go:goplantumlのinstall
go install github.com/jfeliu007/goplantuml/cmd/goplantuml@latest
“`

“`shell:PNG画像を生成するためのツール
brew install plantuml
“`

## UMLを作成する
“`go:UMLを作成する
~/develop/pokemon_battle (feat/initial)$ goplantuml int

元記事を表示

OTHERカテゴリの最新記事