- 1. Goの空の構造体
- 2. 【Go】環境毎の設定値運用戦略
- 3. PythonまたはGoでDockerコンテナに立ち上げたMySQLサーバーと通信する方法
- 4. 【Go言語】echoを使って簡単なWebAPIを実装するハンズオン
- 5. learn-go-with-tests Select
- 6. goでJWSの署名と検証をやってみる
- 7. GoでWebSocket通信をやってみる
- 8. 【Go言語】golangci-lintの使い方
- 9. brainf*ckのインタプリタを書いて高速化しよう
- 10. Shell作ってみる:Goバージョン
- 11. Goのlog/slogパッケージを使ってみる
- 12. Generics: A Boon for Strongly Typed Languages
- 13. 【個人開発】PaPut(パプト)を支える技術
- 14. 【個人開発】エンジニアのインプット・アウトプットを加速させるサービス「PaPut(パプト)」β版をリリースしました!🎉
- 15. GolangのYamlパッケージのバグを見つけた話
- 16. Goのcontextを使ってみる
- 17. 【Go言語】ジェネリクス
- 18. 【初学者はとりあえずこれでOK】とにかく書いてみるGraphQL スキーマ設計3ステップ
- 19. Goのテストを書いてみる
- 20. 【Go】地味に嬉しい整形ライブラリ – pretty
Goの空の構造体
Goの特定のデータセットを扱える構造体で、A Tour of Goにも出てくる。
“`go
package mainimport “fmt”
type Vertex struct {
X int
Y int
}func main() {
fmt.Println(Vertex{1, 2})
}
“`この例ではX, Yをintとして持つVertexという構造体を定義している。
そんな構造体のフィールドを持たない空の構造体を使うこともある。
空の構造体の特徴と使う例をまとめる。
## 空の構造体
空の構造体は以下のようなものである。
“`go
type emptyStruct struct{}var emptyStructVar struct{}{}
“`再度の説明にはなってしまうが、空の構造体はフィールドを持たない構造体である。
フィールドを持たないため使い道がないじゃん?と思うかもしれないが、メモリを消費しない。
通常の構造体はフィールドを持つためその分のメモリを確保するが、空の構造体はフィールドがないためメモリを消費
【Go】環境毎の設定値運用戦略
# はじめに
こんにちは!mizukoです!
先日[PaPut](https://paput.io)という個人開発のサービスをβ版としてリリースしました!その際、今後の個人開発ライフのために、基盤作りを行ったのですが、
環境毎の設定値運用の戦略も検討したので、アウトプットしていきたいと思います!PaPutについてはぜひ[こちら](https://qiita.com/mizuko_dev/items/5335f93bb3c93f407796)をご覧いただけますと幸いです🤗
# 戦略
環境毎の設定値を運用するにあたり、以下方針で運用していきます。
– .envやtomlを使わず、環境変数を利用する
– ローカル開発では.envrcを使う
– 本番環境では、ホスティングサービスやIaaSで環境変数を扱えるサービスを選ぶ
– デプロイはGithubと連携し自動で行う# ソースコード
“`go
package configimport (
“os”
“strconv”
)type DatabaseConfig struct {
Host string
Na
PythonまたはGoでDockerコンテナに立ち上げたMySQLサーバーと通信する方法
データベースを構築するにあたって,DockerコンテナでDBもアプリも動くといいですよね?ローカルで動かす際にdockerコンテナ内で処理が完結するのでシームレスに通信することができる.
本記事ではPythonまたはGoを用いてDockerコンテナ上のMySQLサーバーと通信する方法について記載する.
![スクリーンショット 2024-07-05 13.21.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/e36ccd6a-bc6c-5805-2adb-e506be6011b3.png)今回は以下の知識はある前提で話をする
**SQLの文法**https://qiita.com/tarakokko3233/items/f038fbaccdd92fb0308a
**Dockerの基本**
https://qiita.com/tarakokko3233/items/6f6d03bd6d1e69c9e67e
**仮想環境とDockerコンテナの違い**
https://qi
【Go言語】echoを使って簡単なWebAPIを実装するハンズオン
# 1. はじめに
ひととおりechoの機能を確かめるために、簡単なWebAPIのアプリを試作して主要な機能は把握できました。
その過程でまとまったコードが書けたので、せっかくならとハンズオン形式で公開しようと思い、記事にしました。お役に立てれば幸いです。
問題点等ありましたら教えてください。# 目次
– [1. はじめに](#1-はじめに)
– [2. フォルダ構成](#2-フォルダ構成)
– [3. HTTPメソッド](#3-httpメソッド)
– [3-1. 基本設定](#3-1-基本設定)
– [3-2. GetUser](#3-2-getuser)
– [3-3. PostUser](#3-3-postuser)
– [3-4. PatchUser](#3-4-patchuser)
– [3-5. DeleteUser](#3-5-deleteuser)
– [3-6. GetUers](#3-6-getusers)
– [4. プロダクトの全体像](#4-プロダクトの全体像)
– [5. 参考](#6-参考)# 2.
learn-go-with-tests Select
# Select
2つのURLを取得し、それらをHTTP GETでヒットして最初に返されたURLを返すことで「競合」するWebsiteRacerと呼ばれる関数を作成するように求められました。 10秒以内に戻らない場合は、「エラー(error)」を返します。これには
– HTTP呼び出しを行うための net/http
– ゴルーチン
– プロセスを同期するためのselect# 最初にテストを書く
“`go
func TestRacer(t *testing.T){
slowURL := “http://www.facebook.com”
fastURL := “http://www.quii.co.uk”want := fastURL
got := Racer(slowURL, fastURL)if got != want {
t.Errorf(“got %q, want %q”, got, want)
}
}
“`
テストを実行すると`./racer_test.go:14:9: undefined: Racer`で失敗します。## テストを実行
goでJWSの署名と検証をやってみる
# 概要
[golang-jwt](https://pkg.go.dev/github.com/golang-jwt/jwt/v5)でJWSの署名作成と検証をやってみた。## コード
“`go
package mainimport (
“crypto/ecdsa”
“crypto/elliptic”
“crypto/rand”
“crypto/rsa”
“time”“github.com/golang-jwt/jwt/v5”
)func main() {
// 署名アルゴリズムの設定
signKey, _ := rsa.GenerateKey(rand.Reader, 2048)
verifyKey := &(signKey.PublicKey)
method := jwt.SigningMethodRS256// JWSの作成と署名
token := jwt.NewWithClaims(method,
jwt.MapClaims{
GoでWebSocket通信をやってみる
## はじめに
クライアントとサーバーで双方向通信ができるWebSocket通信を、Goでやってみました。## Goのコード
Go側では、gorilla/websocketパッケージを利用して、WebSocketの接続を待ち受けます。
接続を確立した後は、for文で永続的にコネクションを維持します。
サーバーからのプッシュ通信をゴールーチンを使って5秒ごとにクライアントに送信しています。
“`go
package mainimport (
“log”
“net/http”
“time”“github.com/gorilla/websocket”
)var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return true
},
}func echo(w http.ResponseWriter, r *http.Request) {
conn,
【Go言語】golangci-lintの使い方
## はじめに
Goでは [golangci-lint](https://github.com/golangci/golangci-lint) というリンターに`gofmt`, `goimports`, `govet`など100以上のリンターが入っている。
https://golangci-lint.run
## インストール
### バイナリ
“`sh
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s — -b $(go env GOPATH)/bin v1.59.1
“`### brew
“`sh
brew install golangci-lint
brew upgrade golangci-lint
“`最新リリースがbrew似ない時は`brew tap`からインストールする。
“`sh
brew tap golangci/tap
brew install golangci/tap/golangci-lint
brainf*ckのインタプリタを書いて高速化しよう
# なんだこれは
少し前に、Goのプログラムをチューニングして遊びたいなと思い、brainf*ckインタプリタを作って高速化しました。
忘れないうちにそのときのことを書いておこうという記事になります。
高速化!高速化!うおおおおお!# できたもの
こちらが最終的に完成したものになります。
ベンチマークにはbfでマンデルブロ集合を描画するプログラムを利用しています。
それを私の手元のPCでインタプリタに食わせたときの実行時間を減らしていくという形で高速化を進めました。始めた当初は描画に**42.36s**かかったところ、最終的には**2.271s**で描画できるようになりました。ついでにbfをllvm irにトランスパイル?するプログラムも書いていて、それを使ってコンパイルした場合は**0.466s**でマンデルブロ集合を描画することができます。
https://github.com/uchijo/bf-eval
# 皆さんもぜひ高速化を…
途中からは以下のようなルールを設け、友人らと速度を競いながら遊んでいました:
– https://github.com/pabl
Shell作ってみる:Goバージョン
## 内容
– [この記事](https://blog.init-io.net/post/2018/07-01-go-unix-shell/#introduction)を参考に実施した
– Cの記事もあるので、今後そちらでも作成したいと思う## 記事のコード(一部改変)
動かしたところ、EOFが無限に表示されてしまったため、一部変更した
また独自のコマンド`hello`を追加した
“`go:main.go
package mainimport (
“bufio”
“errors”
“fmt”
“os”
“os/exec”
“strings”
)// learn-memo: メイン関数。プログラムのエントリーポイントとなり、ユーザーの入力を無限ループで処理する
func main() {
fmt.Print(“Golang Shell\n”)
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print(“> “)
// learn-memo: キーボードからの入力を読み取る
input, err :
Goのlog/slogパッケージを使ってみる
## はじめに
今まで、文字列などを出力するときはlogかfmtを使って標準出力か標準エラー出力をしていたが、APIサーバを作るにあたり利用者の行動をファイルに記録する必要があると考えた。そこで、Goの標準パッケージであるlog/slogを用いて、json形式での構造化ロギングを行った。## 実装
### コード
このコードは、GoのWebフレームワークに一つであるginを用いた簡単なAPIサーバです。エンドポイントへのアクセスが行われたとき、その情報をlog/slogを用いてserver.logに出力します。https://github.com/Sawawa42/slog-qiita
“`golang:main.go
package mainimport (
“github.com/gin-gonic/gin”
“io”
“log”
“log/slog”
“os”
“time”
)func main() {
// ファイルを開く
file, err := os.OpenFile(“server.log”, os.O_APPEND|os.O_CREA
Generics: A Boon for Strongly Typed Languages
![Generics_typed_languages_36a2c0a02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778885/058d68b5-b803-9d93-c619-245a68166d0c.png)
> Exciting News! Our blog has a new **[home](https://canopas.com/blog)**!🚀
## Background
Consider a scenario, You have two glasses one with milk and the other with buttermilk. Your task is to identify between milk and buttermilk before drinking it(of course without tasting and touching!).
Hard to admit that, right? Just because they seem sim
【個人開発】PaPut(パプト)を支える技術
# はじめに
こんにちは、mizukoです!
この度、エンジニアのためのインプット・アウトプットを加速させるサービス「[PaPut(パプト)](https://paput.io)」のβ版をリリースしました!
サービスについてはぜひ[こちら](https://qiita.com/mizuko_dev/items/5335f93bb3c93f407796)をご覧ください!本記事では、PaPutを支える技術について記載していきたいと思います!
# 技術選定の軸
私が技術選定を行う際に軸にしているのは以下です。
– モダンか?
– 情報は多いか?
– 市場価値は高いか?
– 人材確保は容易か?いくら素晴らしい技術でも、導入や保守が大変だと無駄なコストがかかってしまいます。
他人にも受け入れやすく、できるだけモダンで今後に繋がるような技術を選定するように心がけています。# フロントエンド
## フレームワーク
フロントエンドには[Next.js](https://github.com/vercel/next.js)を使っています。
開発当初、丁度App Routerが登場したので、
【個人開発】エンジニアのインプット・アウトプットを加速させるサービス「PaPut(パプト)」β版をリリースしました!🎉
# はじめに
こんにちは、mizukoです!
この度、エンジニアのためのインプット・アウトプットを加速させるサービス「[PaPut(パプト)](https://paput.io)」のβ版をリリースしました!
新サービスについて、宣伝も兼ねて色々とアウトプットしていきたいと思います!# 自己紹介
改めて私が何者なのか、自己紹介させていただきます🙏– 年齢
– 29歳
– 職歴
– 新卒1年間フリーの音楽奏者
– その間独学でプログラミングを勉強
– 勉強して作ったアプリを元にエンジニアへ転職
– 25歳でフリーランスへ普段はGo、Typescript(Node、React、Next.js)、AWSを軸にフルスタックのフリーランスエンジニアとして活動しています。
お仕事依頼待ってます🫶# どんなサービスか
PaPutは、「インとアウトをパパッとプット」をコンセプトに、
技術的なナレッジの投稿ハードルを極力下げ、「メモ」という単位で簡単に自分が学んだことをアウトプットでき、Xの様な感覚でメモを閲覧し、簡単にインプットできるサービ
GolangのYamlパッケージのバグを見つけた話
## 初めに
弊社プロダクトでは設定に関する項目をyamlで記述していてAPI起動時にUnmarshalしているのですが、その結果が期待していたものと異なることが以前発生したので原因は何だったのか、どうやって突き止めたのかをまとめてみました。
とりあえず原因だけ知りたいという方は[こちら](https://github.com/go-yaml/yaml/issues/1035)のissueを見て頂くと良いかと思います。## 使用環境
[yamlライブラリ](https://github.com/go-yaml/yaml)
“`bash
% go version
go version go1.21.1 darwin/amd64
“`## バグの詳細
yaml上に書いた一部の設定が構造体に反映されませんでした。
具体的には次のようなyamlを用意した時に、 `merger_val` の値がマッピング先に反映されていませんでした。
“`config.yaml
mergee_param: &mergee
param_key:
keywords: []merger
Goのcontextを使ってみる
## WithCancel
WithCancel()でキャンセル用のcontextを作成しておき、2秒待ってから、cancel()を実行して処理を中止するように、longRunningTask()に伝えています。
こうすることで、それ以上実施する必要のない処理を止めることができるようになります。
“`go
package mainimport (
“context”
“fmt”
“time”
)// 長時間かかる処理をシミュレートする関数
func longRunningTask(ctx context.Context) {
select {
case <-time.After(5 * time.Second): // 処理が完了した場合 fmt.Println("Task completed") case <-ctx.Done(): // キャンセルやタイムアウトが発生した場合 fmt.Println("Task canceled:", ctx.Err()) } } func main() { // キャンセル可能なコンテキストを生成
【Go言語】ジェネリクス
# はじめに
今回はGoのジェネリクスの使い方をまとめました。
スライドもあります。# any
## anyとは
anyとは空インターフェイス`interface{}`のエイリアスで、どんな型でも保持することが可能。
以下は実際にanyにいろんな型を入れてみた例。
[Go Playground](https://go.dev/play/p/DDtuiq_VxwV)
“`go
func main() {
var i any
i = 42 // int
i = “foo” // stringi = struct {
s string
}{
s: “bar”,
} // structi = func() {} //関数
【初学者はとりあえずこれでOK】とにかく書いてみるGraphQL スキーマ設計3ステップ
## はじめに
この記事が、GraphQL はじめてみたいけど、スキーマ設計とかクライアントライブラリとか、色々な情報が溢れていてわからないといった初学者向けに、まずはこれで書いてみよう!と迷わず実際に触るための一助になれば嬉しいです。## スキーマファーストとコードファースト
GraphQLを使ったAPIの開発では、**2つの進め方があります。**
GraphQLってなにー??な状態の方はまず[こちらの記事](https://speakerdeck.com/kazukihayase/graphqlkuraiantonoji-shu-xuan-ding-2023dong?slide=14)の前半部分をどうぞ。進め方1つ目の**スキーマファースト**では、まずGraphQLスキーマ(型定義)をサーバーチーム、フロントチームが一緒に話して作成します。作成したスキーマの設計を基盤として、両チームが実装を並行して進めていくことができます。
2つ目の**コードファースト**は、GraphQLスキーマ(型定義)を、主にサーバーチームが作成します。**まずサーバーのコードを書き、そこか
Goのテストを書いてみる
## はじめに
Goでテストコードを書いてみました。## 足し算と引き算をする関数
“`go
package mathfunc Add(a, b int) int {
return a + b
}func Sub(a, b int) int {
return a – b
}
“`## テストコード
1つずつの条件でも書けるし、テーブルドリブンテストで複数条件を構造体に定義して、ループで回すことでテストを分かりやすく書くことができる。
“`go
package math_testimport (
“testing”“example/math”
)func TestAdd(t *testing.T) {
want := 3
if got := Add(1, 2); got != 3 {
t.Errorf(“want %d but got %d”, want, got)
}
}func TestSub(t *testing.T) {
// テーブルドリブンテスト
tests := []struct {
name string
【Go】地味に嬉しい整形ライブラリ – pretty
# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。(同担OKです😉)今回は複雑な構造体や、ログなどを見やすく整形してくれるGoのライブラリである**pretty**をご紹介します!
# prettyの魅力
こちらの [The Go Playground](https://go.dev/play/p/IiwoGJ79IOb) でも体験できるように、`pretty.Formatter()`を使うことで整形された結果を確認することが出来ます!“` main.go
package mainimport (
“fmt”“github.com/kr/pretty”
)func main() {
type myType struct {
a, b int
}
var x = []myType{{1, 2}, {3, 4}, {5, 6}}
fmt.Printf(“%# v\n”, x)
fmt.Printf(“%# v”, pretty.Formatter(x))
}
“`“` zsh
[]main.myType{main.myType