- 1. GO言語のgo-echartsパッケージを使って時系列チャートを出力する方法
- 2. ユースケースから考えるgoroutine
- 3. Gin/Go言語(Golang)のReatAPIの基本(飲食店情報サイトでの具体例)
- 4. Goの標準ライブラリでuse of internal packageエラーが大量発生した場合の対処方法
- 5. Go lang 勉強メモ
- 6. [golang]golangで作ったAPIをコンテナ化する方法(docker image の作成方法)
- 7. Go初心者でもNext.jsとGoでWebアプリを作りたい!その3
- 8. Go初心者でもNext.jsとGoでWebアプリを作りたい!その2
- 9. Web フロントエンドしかやってこなかった人がバックエンドに入門する
- 10. [Go×Supabase]ReactとGoを用いてDB連携をしてみる
- 11. ent勉強メモ
- 12. GoのORM sqlcのType Overridesを自動生成する(MySQL用)
- 13. iCloudにアップされる.pdfファイルの監視・圧縮処理自動化
- 14. Go言語(Golang)の指標分析のライブラリ
- 15. Raspberry Pi 4 model B で Golangを使う
- 16. Web開発エンジニアになるために
- 17. sqlcでType Overrides の活用とgo-optionalの話
- 18. 【Go】配列(スライス)などの値を標準出力でデバッグするときは、エスケープして出したほうがいいかもという話
- 19. golangci-lintとgolangci-lint-actionを使った開発メモ
- 20. 障害になる前に知っておくべき、sql.Rowsのコネクション管理
GO言語のgo-echartsパッケージを使って時系列チャートを出力する方法
# はじめに
GO言語で開発したプログラムか、ちょっとしたチャート(グラフ)を出力する時にgo-echartsというパッケージが便利です。
https://github.com/go-echarts/go-echarts
しかし、サンプルプログラムが少ないのでグラフを出力するためのデータ構造がわかりにくいです。そこで、誰かのためになればと思って解説の記事を書いてみました。
# go-echartsについて
go-echartsは、JavaScriptのチャートライブラリApache ECharts
https://echarts.apache.org/en/index.html
を使ったインターラクティブなチャートを含むHTMLファイルをGO言語から出力するものです。このライブラリのサンプル
https://echarts.apache.org/examples/en/index.html
にあるようなチャートの一部を出力できます。チャートを出力するための設定やデータは、JavaScript版と同じように考えればよいと思います。
go-echartsのサンプルは、
ユースケースから考えるgoroutine
## はじめに
突然ですが、goroutineを扱うのって難しくないですか?
処理が並行で走るので、「データ競合大丈夫なのか?」「このchannelどの関数で使われてるんだっけ?」など、いろいろ把握するのが大変だなと思っています。そのためgoroutineはできるだけ使わないようにしています。ただ、それでも使わざるを得ない場面が出てくるのは事実です。
そこで今回は、goroutineを使うべきユースケースについて考えてみようと思います。要件によってどのように使っていくのかを見ていこうと思います。この記事はあくまで私僕の個人的な意見モリモリな内容ですので、1個人のエッセイというかポエムとして気軽に楽しんでいただければ!## ユースケース
今回はバッチ処理について考えてみましょう。> サービスAから定期的に顧客情報を取得し、自社のDBに反映させたい。
![usecase1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/d56bf604-9ea7-43f8-bd35-e415bc02
Gin/Go言語(Golang)のReatAPIの基本(飲食店情報サイトでの具体例)
## ソースコード
#### 1. プロジェクト構造
“`
restaurant-api/
├── main.go
├── models/
│ ├── user.go
│ └── restaurant.go
├── handlers/
│ ├── user_handler.go
│ └── restaurant_handler.go
├── middleware/
│ └── auth_middleware.go
└── database/
└── database.go
“`#### 2. データベース接続の設定
“`database/database.go
package databaseimport (
“log”“gorm.io/driver/sqlite”
“gorm.io/gorm”
)var DB *gorm.DB
func ConnectDatabas
Goの標準ライブラリでuse of internal packageエラーが大量発生した場合の対処方法
## 背景
Go言語のソースコードをVSCodeで閲覧時、大量のuse of internal packageエラーが発生しました。なんとその数3,000以上・・・!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122367/4eaf1408-8be7-1b84-3d0d-55655295703c.png)## 対処方法
settings.jsonでgorootをcloneしたGoのソースコードのパスに設定をしたら解決しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122367/723cd081-5704-710d-3a32-bd6f37dc3d85.png)通常はinternal directoryはinternal directoryと同階層以下にいないと参照できませんが、`$GOROOT/src`配下の標準ライブラリは`$GOROOT/src`配下のinterna
Go lang 勉強メモ
# 参考サイト
* [Goの初心者が見ると幸せになれる場所 #golang #Go – Qiita](https://qiita.com/tenntenn/items/0e33a4959250d1a55045)
* [A Tour of Go (公式チュートリアル)](https://go-tour-jp.appspot.com/welcome/1)# day1
* プログラムは main パッケージから開始 ([*](https://go-tour-jp.appspot.com/basics/1))
* 規約。インポートパスが “math/rand” のパッケージは、 package rand ステートメントで始まる ([*](https://go-tour-jp.appspot.com/basics/1))
* import の書き方. 1の方が良いスタイル ([*](https://go-tour-jp.appspot.com/basics/2))
“`1.go
import (
“fmt”
“math”
)
“`
“`2.go
import “fmt”
impo
[golang]golangで作ったAPIをコンテナ化する方法(docker image の作成方法)
# はじめに
作ったアプリのコンテナ化(docker image の作成)ってどうやるんだっけ?
っていう話になったので備忘を兼ねてメモ# 今回のゴール
golang 製のAPIアプリをコンテナ化(docker image を作成)して、 docker run で動くようにする## 作業の流れ
1. コンテナ化する go アプリの準備
1. Dockerファイル作成
1. コンテナイメージ(docker image)作成
1. コンテナを起動(docker run)# 準備
コンテナ化するアプリを準備します
golang で gin を使った簡単な API です
`/ping`なエンドポイントを叩くと `pong`と応答します
コードはこんな感じ
“`golang:main.go
package mainimport (
“net/http”“github.com/gin-gonic/gin”
)func main() {
r := gin.Default()
r.GET(“/ping”, func(c *gin.Context) {
c.JS
Go初心者でもNext.jsとGoでWebアプリを作りたい!その3
# 写真の保存
今回はフロント側で撮った写真をバックエンドに送信し、保存する処理について取り扱います。### 1. バックエンド側でupload処理を実装
“`golang:usecase/upload_img.gopackage usecase
import (
“fmt”“github.com/gin-gonic/gin”
“net/http”
“path/filepath”
)func UploadImg(c *gin.Context) {
file, err := c.FormFile(“file”)
if err != nil {
c.String(http.StatusBadRequest, “get form err: %s”, err.Error())
return
}savepath := filepath.Join(“./images”, file.Filename)
if err := c.SaveUploadedFile(file, savepath); err != nil {
c.String(http
Go初心者でもNext.jsとGoでWebアプリを作りたい!その2
# カメラ機能
今回はreact-webcamを使ってカメラを起動させていきます。
詳細は以下のサイトをご覧ください
https://www.npmjs.com/package/react-webcam### 1. react-webcamのインストール
“`
npm install react-webcam @types/react-webcam
“`
### 2. page.tsxを変更する
“`javascript:
“use client”;import { useRef, useState } from “react”;
import Webcam from “react-webcam”;
import Image from “next/image”;const videoConstraints = {
width: 500,
height: 500,
facingMode: “user”,
};const Page = () => {
const webcamRef = useRef(null);
const [u
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` に
[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 intvar categoryMap map[CategoryID]string = map[CategoryID]string {
1: “Sports”,
iCloudにアップされる.pdfファイルの監視・圧縮処理自動化
# 前提
– 開発環境:MacBook
– [Golang](https://go.dev/)インストール済み
– 社内でのファイル共有にはiCloudを使用# 要件
– 極力低コストで毎月大量の税務資料ファイルを税理士側(全員Windows)と共有したい→月単位で用意したフォルダの圧縮ファイルをメール送信
– スキャンした.pdfデータの容量が必要以上に大きく、クラウド容量を圧迫したり税理士側に送る際に圧縮ファイルを直接メール添付出来なかったりする為、.pdfファイルをiCloudにアップされたタイミングで自動圧縮処理したいAutomator(フォルダアクション等)+AppleScriptの設定では自由度が低いのと、MacOSでしか使えないので、環境の変化に対応しやすいGolangで行こう!となりました
# 手順
`Golang`で`fsnotify`パッケージを使用してiCloud上の共有フォルダ内の更新を監視し、.pdfファイルが追加された場合のみシェルスクリプトで該当ファイルのバックアップを保存した上で適宜圧縮処理します## 1. 共有フォルダ更新をGolangで
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 mainimport {
“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()`で最大接続数を設定可