- 1. GoでgRPCサーバーを立ててみる1(はじめに)
- 2. Go/ginで外部APIリクエスト、結果を表示する簡易アプリを作成
- 3. Goで様々なフォーマットの時刻JSONをtime.Timeとして扱う
- 4. Go言語: フレームワークなしからGinとGORMへの移行ガイド
- 5. Goのnet/httpではパスパラメータは取得できない!なので実装してみた
- 6. Go言語を初めたい人におすすめの本
- 7. 2023年の振り返り(KPT)と今年の目標
- 8. GCP Cloud Load Balancing機能
- 9. マルチステージビルドとDistrolessでDockerイメージを最適化する
- 10. 【Go言語】フレームワーク8種のベンチマークを測定してみた
- 11. Go製Bombardierで爆速負荷テスト
- 12. [net/http] サーバータイムアウトを付け忘れた結果エラー地獄になった
- 13. OpenFaaS を使って API サーバをたててみた
- 14. GoによるAPIエラーの返却
- 15. Goによるlocale(言語と地域の設定)の取得
- 16. 【Go】ポリシーに則ったランダムパスワード文字列の生成
- 17. 家族向け書籍管理アプリの作成②(GoでバックエンドAPI)
- 18. Goで学ぶGraphQLサーバーサイド(13)ーGraphQLサーバーのテスト
- 19. Goで構造体へのポインタをデリファレンスした変数の扱いに関して
- 20. [Go言語] ポインタの使い方メモ
GoでgRPCサーバーを立ててみる1(はじめに)
本日からGraphQLサーバーに繋ぐためのgRPCサーバーを立てていきます。
GoでgRPCサーバーを構築してみたいと考えている人に見てもらえたらいいなと思います!# はじめに
## 今回やること
– Goで簡単なgRPCサーバーを立てる(
## 今回やらないこと
– Dockerの利用
– gRPC、GraphQLの概念説明## 構成
gRPCを用いるarticleサービスの部分を実装していきます。
## アーキテクチャ
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507088/701f20c7-db73-9b2b-db18-af6fa87d75a2.png)
## ディレクトリ
– article ・・・ gRPCを用いたCRUDな記事投稿サービス
– graph ・・・ gqlgenを用いたGraphQLサービス“`
.
├── article (今回実装する部分)
│ ├── client
| ├── pb
| ├── repository
Go/ginで外部APIリクエスト、結果を表示する簡易アプリを作成
# はじめに
ここ最近Go言語の入門を開始し、チュートリアル等で基本的な文法を学んだので、何か簡単なアプリを作成してみようと思い、ブラウザからアクセスするシンプルなアプリを作成してみました。# 作成したアプリ
指定の都市の現在の天気情報を取得して結果(都市名・気温・天候)を画面に表示する簡易アプリを作成しました。(といっても都市は事前に指定したSelectリスト内の中から選択する形式)
天気情報は OpenWeatherMap から取得してます。
要アカウント作成ですが、フリーアカウントで1日1000リクエストまで使え、自分には十分なリクエスト数でした。(画面キャプチャ)
画面で都市を選択![スクリーンショット 2024-01-09 234212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/018d11f7-0
Goで様々なフォーマットの時刻JSONをtime.Timeとして扱う
# はじめに
始めまして。最近業務でGoを書いているハセガワカンタです。
先日、みなさんも日常的に使っているであろうtime.Timeの仕様で困ったことがありました。使用しているAPIの関係で以下のようなJSONをtime.Timeとして扱わなければいけなくなったのです。“`json
{
“date”: “2024-01-01”
}
“`
“`go
type Example struct {
Date time.Time `json:”date”`
}
“`
実はこれ普通にUnmarshalしても上手くいきません“`go
type Example struct {
Date time.Time `json:”date”`
}func main() {
j := `{“date”: “2024-01-01”}`
var e Example
json.Unmarshal([]byte(j), &e)
fmt.Println(“date is”, e.Date)
}“`
“`
date is 0001-01-01 00:00:00 +0000
Go言語: フレームワークなしからGinとGORMへの移行ガイド
# はじめに
ソフトウェア開発における効率と品質の向上は、技術選択によって大きく左右されます。特に、Go 言語を用いた開発においては、フレームワークや ORM(オブジェクトリレーショナルマッピング)の導入が、その鍵を握ることが多いです。本記事では、Go 言語での開発プロセスを、フレームワーク「Gin」と ORM「GORM」を導入することでどのように変化させることができるかを詳細に解説します。加えて、機能改善に関する変更点も取り上げます。
https://github.com/tonbiattack/go-task-management-api
従来、フレームワークや ORM を使用しない「素の Go」での開発は、柔軟性と軽量さを持ち合わせていますが、大規模なプロジェクトや複雑なデータハンドリングを伴う場合、コードの管理や拡張性の面で課題を抱えることがあります。Gin と GORM の導入は、これらの課題に対して効果的な解決策を提供し、開発の生産性を向上させる可能性があります。
本記事では、Gin と GORM を用いることのメリットと、それを実現するための具体的なステップ、さら
Goのnet/httpではパスパラメータは取得できない!なので実装してみた
## net/httpでパスパラメータが取得できない件
GoでWebアプリやAPIを開発する時には、Goの標準パッケージであるnet/httpを使うことができる。JavaやPythonなどの他の言語だと、WebフレームワークやAPI開発のフレームワークを使う必要がある一方で、Goではサードパーティーのライブラリを使う必要がないというのだから、それはそれは便利である。
しかし、net/httpを実際に使ってみて感じた最大のデメリットは、**パスパラメータが取得できない**ということだ。
パスパラメータはアプリを開発するのであれば、99%取得する必要が出てくるだろう。これは困ったというのが事実だが、話は簡単。無いのであれば作ればいい。
そこで今回は、Goのnet/httpでパスパラメータを取得するための実装をしてみた。
※なお、クエリパラメータやボディパラメータ、さらにはHTTPメソッド(GETなのかPOSTなのかの情報)については、取得する機能が存在する。やり方は割愛するのでググっていただきたい。
## パスパラメータを取得するコード
/item/{itemId} のよう
Go言語を初めたい人におすすめの本
## はじめに
Go言語を初めたい人におすすめの本をまとめました。初心者未満、初心者、初心者超えとまとめました。
上から順番に読破を推奨しますが、能力や好みに合わせて好きに選んでもらって大丈夫です。## Goを初める前に薦めたい本
[「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか](https://www.amazon.co.jp/%E3%80%8C%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%E3%80%8D-%E2%80%95%E2%80%95%E3%81%AA%E3%81%9C%E3%80%81%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%
2023年の振り返り(KPT)と今年の目標
@Esperna です。明けましておめでとうございます。
遅くなりましたが昨年の振り返りと今年の目標を。
昨年は様々なライフイベントや天候等に翻弄され続けた一年でした。
自分でコントロール不能なものが多過ぎた割には総じてよくやったと言える一年でした。
昨年の振り返り(KPT)と今年の目標を書きます。# Keep
* ブログは[個人](https://qiita.com/Esperna)で13件、社内で3件
* 英語の記事は見送ったがそれなりに量のアウトプットを出せたので良し
* 読んだ書籍の数7冊
* [OAuth徹底入門 セキュアな認可システムを適用するための原則と実践](https://www.amazon.co.jp/gp/product/B07L5M7DXS/ref=ppx_yo_dt_b_d_asin_title_351_o02?ie=UTF8&psc=1)
* 実際に動かしたコードを[GitHub](https://github.com/Esperna/oauth-in-action-code)に上げながら読んでます
*
GCP Cloud Load Balancing機能
# GCPのCloud Load Balancingの概要と機能
## 目次
1. [概要](#概要)
2. [機能/詳細](#機能/詳細)
3. [まとめ](#まとめ)## 概要
GCPのCloud Load Balancingは、Google Cloud Platform(GCP)上で提供される負荷分散サービスです。このサービスは、アプリケーションやウェブサイトへのアクセスを複数の仮想マシンやサーバーに均等に分散することができます。これにより、トラフィックの増減に柔軟に対応し、高可用性とパフォーマンスの向上を実現することが可能です。Cloud Load Balancingは、GCP内にデプロイされた複数のリソース間でトラフィックを分散するために使用されます。特定のリクエストに対して最適なリソースへのルーティングを行い、セッションの保持やヘルスチェックなどの高度な機能を備えています。
## 機能/詳細
次に、Cloud Load Balancingの主な機能とその詳細について説明します。### 1. HTTP(S) ロード バランシング
– HTTP(S)プロトコルを
マルチステージビルドとDistrolessでDockerイメージを最適化する
Node.js(Express)ベースのアプリケーションをGoに移行した際、Dockerイメージのサイズを2.8 GBから400 MBまで大幅に削減できて一旦満足したのですが、リソースの効率的な利用やデプロイの速度向上を目指す中で、さらなるイメージサイズの削減ができることがわかったので、新たな試みをしてみることにしました。
DevOps経験のあるエンジニアには既知の内容だと思いますが、初心者の方々への参考として、改善内容を共有します。
# 元のDockerfile
元のDockerfileでは、`golang:1.21.0`ベースのイメージを使用し、Goのモジュールのダウンロード、アプリケーションのビルド、実行のためのステップを含んでいます。しかし、この方法では開発環境に必要な全てのファイルがイメージに含まれるため、最終的なイメージサイズが大きくなってしまいます。“`dockerfile
# Goの公式イメージをベースにする
FROM golang:1.21.0# アプリケーションディレクトリを作成する
WORKDIR /app# Goのモジュールを有効にする
ENV
【Go言語】フレームワーク8種のベンチマークを測定してみた
# はじめに
Gin, Fiber, Echo, Iris, Aero, Gorilla, Chi, Beegoの8つのフレームワーク(Gorilla等は厳密にいうとフレームワークではない)のパフォーマンスを比較してみました。
[Bombardier](https://qiita.com/twrcd1227/items/e2165cec501b176495fa)というGo製のツールを用いて、ベンチマークを測定しました。結果だけ知りたい人は [結果](#結果) まで飛んでください。
# テスト環境情報
MacBook Air M2
メモリ 16GB
macOS 13.6
Docker Compose version v2.23.0-desktop.1
Docker version 24.0.6
go version 1.21.5
gin v1.9.1
Fiber v2.52.0
Echo v4.11.4
Iris v12.2.8
Aero v1.3.59
Gorilla v1.8.1
Chi v1.5.5
Beego v2.1.4# テスト対象サーバのコード
## Gin
Go製Bombardierで爆速負荷テスト
# Bombardierとは
[Bombardier](https://github.com/codesenberg/bombardier)とは、Go言語で書かれているHTTP(S)ベンチマークツール。Go言語の標準ライブラリである **net/http** ではなく、**fasthttp** を使用しているため超高速パフォーマンスで動く。(**net/http**クライアントも指定可能)
また、使い方もシンプルなため、**誰でも爆速で** ベンチマークを計測できる。以下は、実際にBombardierを使って、Golangのフレームワークを比較してみた記事です。
https://qiita.com/twrcd1227/items/d871480ec9f8a581099e
# インストール
“`
go install github.com/codesenberg/bombardier@latest
“`## bombardierの使い方
“`
bombardier [オプション]
“`コマンド例
“`bash
bombardier -c [コ
[net/http] サーバータイムアウトを付け忘れた結果エラー地獄になった
## 前書き
この記事は下記記事の続きです。
https://qiita.com/Domao/items/d24e57c5793d09ab214a
超絶遅いクエリを直した後、謎のエラー地獄をどうやって解決するかを調べてみました。
## 実行環境
– サーバー
– Oracle Cloud Infrastructure
– Go/Gorm/OpenTelemetryを使ったとあるゲームAPI(Docker-compose)
– MySQL 8.1(Docker-compose)
– ログ基盤
– Uptrace(デプロイ環境)
– Jaeger(ローカル環境)## 今回のトラブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254984/ea2c2216-686c-fb9a-88eb-05a82911d43d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazon
OpenFaaS を使って API サーバをたててみた
## この記事の目的
Kubernetes を学ぶ途中で出現した OpenFaaS を使ってみます.
本記事では OpenFaaS を利用して API サーバを立ち上げる手順をご紹介します.:::note info
こちらの記事では OpenFaaS の立ち上げからモックサーバの作成までを行います.
::::::note warn
本記事は API サーバを爆速で立ち上げる方法をご紹介するものではありません.
~~OpenFaaS を触ってみることを主眼に置いているので「[json-server](https://github.com/typicode/json-server) とか使った方が早くない?」は禁止です~~
:::## 構成
https://docs.openfaas.com/architecture/stack/
![openfaas-service.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997806/94a05351-5b19-d7db-577c-cb3421
GoによるAPIエラーの返却
## はじめに
GoによるAPIエラーの返却について説明したい。## そもそも何をエラーとして何を返却するか
参考にさせていただいたAPIエラーの返却内容
https://qiita.com/suin/items/f7ac4de914e9f3f35884こちらを参考にすると、code,messageは入れておくのが定石みたいですね。エラー内容がわからなくなるので当然かと思います。ほかはサービスによって異なりますね。
個人的にはどこにアクセスしたかを知れるとデバッグで助かるので、urlは欲しいと思います。## 実際にコードを見てみよう
下記は上の内容を踏まえて作成した、APIエラーを返却する1例です。“`
return func(w http.ResponseWriter, req *http.Request){
if err != nil {
apiError, _ := json.Marshal(map[string]interface{}{
“code”: http.Status…,
Goによるlocale(言語と地域の設定)の取得
## はじめに
多言語対応などのために、Goによるlocale(言語と地域の設定)の取得方法の一例を記載します。
## 要点
#### Request HeaderのAccept-Languageを取得する。
#### HeaderになかったらSessionの中身を取得する。(既に設定しているかもしれない)
#### 一切設定されていないならデフォルト値を設定する。
## 実際にコードを見てみよう
“`
func GetLocale(w http.ResponseWriter, req *http.Request) (locale string){
locale := req.Header.Get(“Accept-Language”)
session := sessions.GetSession(req)
default := “en-us”if locale == “” {
l := session.Get(“locale”)
if l == nil {
lo
【Go】ポリシーに則ったランダムパスワード文字列の生成
– Go でランダム文字列を生成するには crypt/rand などの乱数生成器を使う方法がある
– https://qiita.com/nakaryooo/items/7d269525a288c4b3ecda
– 加えて、パスワードなどの平文を生成する際に、「**英大文字、小文字、数字が必ず一つ以上含まれていること**」などのポリシーに則った文字列を生成したい時がある
– そんな時用のスニペット“`main.go
package mainimport (
“crypto/rand”
“fmt”
“math/big”
)func main() {
pp, _ := newPlainPassword(16)
fmt.Println(pp)
}func newPlainPassword(length int) (string, error) {
const (
uppercaseCharset = “ABCDEFGHIJKLMNOPQRSTUVWXYZ”
lowercaseCharset = “abcdefghijklmnopqrstuvwxy
家族向け書籍管理アプリの作成②(GoでバックエンドAPI)
## はじめに
前回の記事では、家族向け書籍管理アプリのフロントエンドの環境構築と、GoogleBooksAPIを使用して書籍情報を検索する機能を実装しました。
今回は、Golangを利用してバックエンドAPIを作成します。バックエンドAPIでは、書籍の登録、検索、更新、削除などの機能を提供します。
## プロジェクトの概要
このアプリケーションは、家族全員の書籍を一元管理するためのものです。GoogleBooksAPIを使用して書籍情報を検索し、各書籍の紙媒体と電子媒体の所有状況、読了状況などを管理します。
最終的には、Flutterを使用してモバイルアプリケーションを作成し、バーコードをスキャンして書籍を登録できるようにする予定です。
## 必要な環境
– Docker Desktop
– Visual Studio Code
– Remote Development(拡張機能)## 技術スタック
このプロジェクトで使用した主な技術は以下の通りです:
– Docker: アプリケーションとその依存関係をコンテナとしてパッケージ化し、どの環境でも同じように動
Goで学ぶGraphQLサーバーサイド(13)ーGraphQLサーバーのテスト
こんにちは。
皆さん、あけましておめでとうございます!
今回は「GraphQLサーバーのテスト」について説明していきます。
# この章について
品質の良いコードを作るためには、テストを書いて実行することがとても重要です。
ここからは、`gqlgen`で作ったGraphQLサーバーをテストするために便利なライブラリ・Tipsを紹介します。# サービス層のテスト
## 考えられるテスト手法
サービス層は`sql.DB`構造体を用いてDBからデータを取得する処理を実装しています。
そのため、ここのテストをするためには– テスト用のDBを立てて、そこに向き先を変えてテストを実行する
– sql.DB構造体をモックに差し替えるという2つの方法が考えられます。
1つ目の方法は、テストの実行前後にDBの起動・終了処理を挟んだり、DBの中にテスト用データを入れる前処理が必要になるため少々面倒です。
そのため、[github.com/DATA-DOG/go-sqlmock](https://pkg.go.dev/github.com/DATA-DOG/go-sqlmock)パッケ
Goで構造体へのポインタをデリファレンスした変数の扱いに関して
## 概要
Go言語において、構造体へのポインタをデリファレンスして得られた値を新しい変数に格納すると、その変数は元の構造体のデータのコピーになるということを知ったので備忘録のため投稿します## 実例
下記を見ると、構造体へのポインタをデリファレンスした`copiedPerson`を変更しても`originalPerson`の値が変わらないことが分かります。
“`go
package mainimport “fmt”
type Person struct {
firstName string
lastName string
}func main() {
originalPerson := &Person{“Taro”, “Yamada”}
fmt.Println(originalPerson) // &{Taro Yamada}// 構造体のフィールドを変更します。
originalPerson.firstName = “太郎”
originalPerson.lastName = “山田”
fmt.Println(originalPerson) /
[Go言語] ポインタの使い方メモ
## ポインタ
ポインタとかアドレスとか調べてわかった気にはなったけど実際のコード見てもよくわからん!!となったので自分なりに簡単にメモします。## 使用例
“`golang
type Server struct {
srv *http.Server
l net.Listener
}func NewServer(l net.Listener, mux http.Handler) *Server {
return &Server{
srv: &http.Server{Handler: mux},
l: l,
}
}
“`
例えばこういうNewなんちゃらで新しい構造体を生成する関数をよく見ます。## Server構造体
`Server`構造体の`srv`にはポインタが使われていて、`l`には使われていません。
理由は`http.Server`は
“`golang
type Server struct {
Addr string
Handler Handler
// 以下略
}
“`
というような構造体なのに対して、`net