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

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

【認証機能バグ】Apple IDを利用したログインができなくなった

## シチュエーション
ある日、これまで利用できていたAppleIDを利用した認証機能が利用できなくなった。
AppleIDを利用して認証するユーザーはサービスを利用することができない。
早期に問題の解決を求められる。

– ログインをしていないため、UserIDでログを絞り込むことができない
– [Appleのシステム状況は問題発生していない](https://www.apple.com/jp/support/systemstatus/)
– Twitterなどを見てもAppleIDでログインできないサービスは複数ある様子

なぜ、認証機能がうまく動作しないのだろうか?

## 問題箇所

> email_verified
A string or Boolean value that indicates whether the service verifies the email. The value can either be a string (“true” or “false”) or a Boolean (true or false). The system may n

元記事を表示

Go言語でAWSを操る: パッケージsessionについて


Go言語でAWSを操る: パッケージsessionについて

**とあるバンドマン**

_「いやー、いいセッションだったね」_

_「こちらこそ、魂が震えるライブだった」_

_「それにしてもこんな所で、こんな良いギタリストに出会えるとは」_

_「私こそ!こんなに良いドラマーに出会えるとは」_

_「いやー」_

_「いやー」_

_「「ここが異世界でなければなー」」_

_「あの私たちをひいてきたトラックの

Go言語における「nil」とゼロ値の理解

Go言語では、変数に初期値を割り当てずに宣言すると、その型のゼロ値が自動的に割り当てられます。この機能は、プログラムのバグを減らし、初期化の手間を省くことに役立ちます。

### 基本型のゼロ値

– 整数型(int, int8, int16, int32, int64 など): ゼロ値は 0 です。
– 浮動小数点型(float32, float64): ゼロ値は 0.0 です。
– 論理型(bool): ゼロ値は false です。
– 文字列型(string): ゼロ値は空文字列 “” です。

### 複合型のゼロ値

– ポインタ: ゼロ値は nil です。これは、何も指していないことを意味します。
– スライス: ゼロ値も nil です。長さと容量がともに0のスライスを表します。
– マップ: ゼロ値は nil で、キーと値のペアが存在しないことを意味します。
– チャネル: ゼロ値は nil で、初期化されていないチャネルを表します。
– インターフェース: ゼロ値は nil で、どの具体的な値も保持していないことを意味します。
– 構造体(struct): 各フィールド

Goのスライスの定義で少しハマったこと

かなり初歩的な理解不足だったと思うのですが、忘れないために備忘録として残します。

## TL;DR
スライスの宣言だけと初期化は厳密には違い、nil sliceと空sliceの挙動が違うよという話

## 何をしてしまったのか
以下のようなことを実現するつもりでした。
– 特定のスライスとスライスを組み合わせて、一つの変数(hogeList)にしてレスポンスを返す
– 空だった場合は`{“List”:[]}`でjsonで返却する
echoを使った簡単なイメージは以下の通りです。
“`go
package main

import (
“net/http”

“github.com/labstack/echo/v4”
)

type (
Hoge struct {
ID int `json:”id”`
Name string `json:”name”`
}
HogeResponse struct {
HogeList []Hoge `json:”hogeList”`
}
)

func main() {
e := echo.New()
e.GET

Go言語でSlackのOAuth2認証を使ってみた

## はじめに

前回は魔法のスプレッドシートの更新通知を流してくれるSlackAppを作成しました。

https://qiita.com/piny940/items/2f0126ad5d71775b3628

一般にSlack Appを公開するにはOAuth2.0認証をできるようにする必要があります。今回はGo言語でOAuth認証のためのサーバーを(サクッと?)立てる方法を解説していこうと思います。

完成したコードはGithub上で公開しているので参考程度にどうぞ。

https://github.com/piny940/magic-spreadsheet-notifier

## 環境

Golang 1.21.1
labstack/echo 4.11.4
slack-go/slack 0.12.3

今回はechoを用いてサーバーを立てましたが、Ginとかを使っても大体同じようなコードになると思うので適宜読み替えてください。

## 手順

基本的に[ドキュメント](https://api.slack.com/authentication/oauth-v2)に従い実装

Ruby + Goで魔法のスプレッドシートの更新を通知するSlackAppを作ってみた

## はじめに
IT企業のインターン情報が多数掲載されている[魔法のスプレッドシート](https://magic-spreadsheets.pages.dev)ですが、新しい募集が掲載されても変更の通知を受け取ったり差分を確認する機能がないため、優秀な人材と企業がマッチする機会が損なわれるという課題を感じていました。

そこで今回は、魔法のスプレッドシートが更新されたときにSlackに通知を流すSlackAppを作ってみました。

完成したコードはGithubで公開しているので参考程度にどうぞ。

https://github.com/piny940/magic-spreadsheet-notifier

SlackAppはこちらのサイトから追加できるようにしました。

https://magic-spreadsheet-notifier.piny940.com

## 技術選定

今回作るSlackAppの動作は写真のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3

Go言語でマイグレーションしたらエラーが出た

実行環境:mac

モデル、マイグレートファイルを作成後「GO_ENV=dev go run migrate/migrate.go」のコマンド実行でエラーが出ました。

`watashinomac-Pro-go-study % GO_ENV=dev go run migrate/migrate.go
gorm.io/driver/postgres
../go/pkg/mod/gorm.io/driver/postgres@v1.5.5/migrator.go:411:26: m.GuessConstraintInterfaceAndTable undefined (type Migrator has no field or method GuessConstraintInterfaceAndTable)`

調べたところ、driver/postgres@v1.5.5のドライバーのバージョンを下げればいいとのこと。

go.modの
`gorm.io/driver/postgres v1.5.5`→ `gorm.io/driver/postgres v1.5.4`
と修正し再度実行し

[技育CAMPキャラバン]GitHubの統計情報を用いたユーザーのランク付け

# 概要
2024年2月3日に東京で行われた技育CAMPキャラバンハッカソンに参加しました。

本ハッカソンにてGitHub統計情報からユーザーをランク付けして画像を生成するGitHub Personaを作成したのでその概要や感想を書こうと思います。

サービスURL: https://read-me-psi.vercel.app/
GitHubレポジトリ: https://github.com/tomoish/github-persona

# サービス概要
GitHub Personaは、GitHubの統計情報を取得し、ユーザーに異世界系の世界観で役職とランクを割り当てるサービスです。

以下はその一例です。

![result_tomoish.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507134/44d6bc32-d0b8-7f5e-6951-90ee413540d8.png)

# システム
今回は以下のような設計としました。

![github-persona-system-desi

【JavaScript】let宣言は for ループに特化される

# はじめに
次の記事を読んで、JavaScriptのfor文における`let`宣言のループ変数が各ループごとに異なる変数としてバインディングされる動作に違和感を覚えました。

https://qiita.com/twrcd1227/items/e7541a196d6bc1422dac

以下では、違和感を覚えた理由と、調査を進めた結果たどり着いた結論について書いています。

# 結論
結論から言うと、JavaScriptの言語仕様において、`let`はforループに特化されるので、ループ本体のスコープ内でループ変数の作成・値のコピーがされることがわかりました。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for#初期化ブロックの字句の宣言

> 初期化ブロックの字句の宣言
>
> 初期化ブロックのスコープ効果は、宣言がループ本体の中で行われ、condition部分とafterthought部分でアクセス可能であるかのように理解できます。より正確には、`let`宣言はforループに

cobraとhuhを使って毎日のニュースをチェックできるCLIアプリを作ってみるハンズオン

# はじめに
こんにちは!最近はGoを集中的に触っているのですが、Goを使うと簡単にCLIアプリを作れることを知りました。本記事では、**cobra**と**huh**を使い、毎日の最新ニュースを取得し、LINEに通知してストックするCLIアプリをハンズオン形式で作ってみたいと思います。

:::note
技術記事だけでなく、ちゃんとニュース記事も読むべし!というモチベーションです。
:::

# 実装するもの
![news-cli.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2816396/28e84a20-a4cd-fc1c-ffda-4600d0bf2a1f.gif)

コードはこちらです。

https://github.com/ayanami274/mynews-cli

# 使用技術
– go 1.21
– cobra v1.8.0
– huh v0.3.0
– News API v2
– LINE Notify API

### cobraとは
cobraはCLIアプリケーションを作るた

goのfor文を用いて構造体に変数代入しようとしたら頭を抱えた話

# 問題
`User`構造体の`introduction`を`Introduction`構造体に代入しようとしたら、全て一番最後のプロパティの値が代入されてしまった
## ソースコード

“`golang
package main

import “fmt”

type User struct {
name string
age int
introduction string
}

type Introduction struct {
introduction *string
}

func main() {
users := []User{
{“Alice”, 25, “Hello, I’m Alice!”},
{“Bob”, 30, “Hi there, I’m Bob.”},
{“Charlie”, 22, “Greetings! I’m Charlie.”},
}
introductions := makeIntroductions(users)

for _, introduction := range intr

Go言語で実装するダイクストラのアルゴリズム: 重み付きグラフでの最短経路探索


Go言語で実装するダイクストラのアルゴリズム: 重み付きグラフでの最短経路探索

人は、生まれながらにして、ゴールが決まっている。

いつ、どこで、どのように死ぬのかが決まっているのだ。

問題はそれを最短経路で行くのか
遠回りしていくのか、だ。

死ぬ時期が決まっているのなら
そこに深みを持たせるしか価値は見出せない。

また、その経路も一つではない。

また、誰もどこがゴールかもわからない。

また、何に価値があるのかも決まっていない。

人生という名の迷路は
いかなるアルゴリズム、プログラムをもってしてでも解けないだろう。

ただ一つ、我々が幸運なことは
この迷路には行き止まりがないという事だ。

**目次**
– [1. ダイクストラのアルゴリズムとは](#1-ダイクストラのアルゴリズムとは)
– [2. コード例](#2-コード例)
– [3. おわりに](#3-おわりに)

## 1. ダイクストラのアルゴリズムとは

 ダイクストラ法(Dijkstra’s algorithm)とは、様々な

[Go言語]ワーカープールパターン並列処理 メモ

* Go言語におけるワーカープールパターン並列処理についてメモする。

## ワーカープールパターンとは

* 複数のタスクやジョブを効率的に処理するためのデザインパターン。
* 特定の数のワーカー(ゴルーチンなど)を用意し、これらのワーカーがタスクキューからタスクを取り出して並行処理することで、リソースの使用効率を最適化し、処理速度を向上させる。

### 概念

“`mermaid
graph TD
A[タスクキュー] –>|タスクを提供| B(ワーカープール)
B –>|タスク1を処理| D[ワーカー1]
B –>|タスク2を処理| E[ワーカー2]
B –>|タスク3を処理| F[ワーカー3]
B –>|タスクNを処理| G[ワーカーN]
D –> H[結果]
E –> H
F –> H
G –> H

“`

– **ワーカー**:
– 同時に実行されるタスクやジョブを処理する単位(スレッドやゴルーチンなど)。
– ワーカープール内の各ワーカーは、タスクキュ

Go言語における nil の利用時の注意点

Go言語では、nil は特定の型が値を持たないことを示すために使用されますが、その利用にはいくつかの重要な注意点があります。nil の利用時に考慮すべきポイントに焦点を当てます。

### 1. ポインタとnil
Go言語において、ポインタ型の変数はデフォルトでnilとなります。未初期化のポインタは、特定のメモリアドレスを指しておらず、注意して扱う必要があります。

“`go
package main

import “fmt”

func main() {
// int型の変数を宣言
var myInteger int

// int型のポインタを宣言し、未初期化(nil)で初期化
var myPointer *int

// ポインタがnilであることを確認
if myPointer == nil {
fmt.Println(“ポインタはnilです。”)
}

// ポインタに変数のアドレスを割り当て
myPointer = &myInteger

// ポインタがnilでないことを確認
if myPointer != nil {
fmt.Pr

GO言語における nil と null の違い

GO言語において、nil と null は似ているようで異なる概念です。これらの用語は、異なるプログラミング言語で使われることがあり、それぞれの言語において異なる挙動を示すことがあります。GO言語では、nil という用語がより一般的に使用されていますが、一部の文脈では null という言葉も見られることがあります。

### 1. nil の使用
GO言語では、nil は主に[ポインタ、スライス、チャネル、マップ、インターフェース](https://qiita.com/zhao-xy/items/4fcbf5b64eb4cbf23b6c)、関数などの特定の型の変数が値を持たないことを示すために使用されます。例えば、ポインタの初期値は通常 nil です。

“`go
package main

import “fmt”

func main() {
var myPointer *int
if myPointer == nil {
fmt.Println(“ポインタはnilです。”)
}

}
“`

“`
ポインタはnilです。
“`

### 2. null の使用

【Git】モノレポ時のDev Containerにおけるバージョン管理

# はじめに
 サービス開発、特にAPIをコンパイル言語で構築する場合、[Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)を用いると便利である。しかし、モノレポ構造でサービスを開発している場合、.gitリポジトリが親ディレクトリに存在することでVSCodeがリポジトリを認識しない。gitコマンドを利用する際にVSCodeをLocalでReOpenし対応可能だが、現実的でない。
 今回はモノレポ構造の開発環境でDev Containerを用いた際にGitでバージョン管理を行う方法についてまとめる。

# ディレクトリ構造
 開発を行うにあたり、ディレクトリ構造の抜粋を以下に示す。
> root/
> ├ .git
> ├ .devcontainer/
> │ └ devcontainer.json
> ├ backend/
> │ └ build
> │   └ package
> │     └ Dockerfile
> └ d

楽天トラベルAPIを使ってみた


楽天トラベルAPIを使ってみた

**食べ頃のプリン**

友達の髪が茶髪から色が黒みを取り戻し、プリンみたいな感じになってました。

「食べ頃だね」

と私がいうと

「あ、いい感じの焦がしプリンでしょ」

と言いました。

甘い プリンって いいよね
API……。

**目次**
[1. 楽天トラベルAPIとは](#1-楽天トラベルapiとは)
[2. Go言語で簡単な実装してみた](#2-go言語で簡単な実装してみた)
[3. おわりに](#3-おわりに)

# 1. 楽天トラベルAPIとは

 APIでなんか遊んでみたいと思い、楽天トラベルAPIというものを使ってみました。

 楽天トラベルAPIは、楽天トラベルが提供するウェブサービスの一つで、開発者が楽天の旅行関連のデータや機能を自分のアプリケーションやウェブサイトに統合することができるプログラミングインターフェースです。

 まず、Rakuten Developersへアクセスし、アカウントを登録します。
[Rakuten Developers](https://w

GoでgRPCサーバーを立ててみる4(service.go、server.goの実装)

お疲れ様です。

今日は「service.go、server.goの実装」について部分いたします。

# service.goの実装

repositoryでやり取りしたデータをもとにgRPCのレスポンスを返すservice.goの実装をしていきます。

“`article/service/service.go
package service

import (
“context”

“github.com/k88t76/GraphQL-gRPC-demo/article/pb”
“github.com/k88t76/GraphQL-gRPC-demo/article/repository”
)

type Service interface {
CreateArticle(ctx context.Context, req *pb.CreateArticleRequest) (*pb.CreateArticleResponse, error)
ReadArticle(ctx context.Context, req *pb.ReadArticleRequest) (*pb.

go test時に”%1 is not a valid Win32 application”とエラーが出る

# 概要

題名通り、ある日 `go test` を実行したら
“`
fork/exec C:\Users\XXX\AppData\Local\Temp\go-build2550557918\b001\YYY.test:
%1 is not a valid Win32 application.
“`
とエラーが出て失敗するようになったので、その原因と解消方法を調べた結果をメモした記事です。

蓋を開けると非常にしょうもない&滅多にない原因なので記事としての価値は微妙ですが、同じような事態に遭遇した方のために書き残しておきます。

# 原因: GOOS、GOARCHの設定がおかしかった
結論から言うと、上記エラーが出る前、Goのクロスコンパイルについて調べたり遊んだりしていて[^1]、
“`zsh
go env -w GOOS=linux GOARCH=arm64
“`
を実行したまま後始末していなかったのが原因でした[^1-2]。

Goはビルド時の想定OSや`go install`のインストール先など諸々の環境依存の設定を環境変数で管理しており、`go env -w` はそ

Go言語のスライスでよくある勘違いとその解説

Go言語のスライスは非常に強力な機能を提供しますが、理解しにくい部分もあります。ここでは、Go言語のスライスを使用する際によくある勘違いや混乱の原因となるポイントをいくつか紹介し、それらを明確にします。

### 1. スライスと配列の違い

Go言語の新規ユーザーはしばしばスライスと配列を混同します。配列は固定長であり、そのサイズはコンパイル時に決定されますが、スライスは動的な長さを持ち、実行時にサイズが変更可能です。配列をスライスに変換することはできますが、その逆は直接的には行えません。

### 2. スライスの長さと容量

スライスの[「長さ」と「容量」](https://qiita.com/zhao-xy/items/a2bba7619ba10b02f38a)は異なる概念ですが、これらが混同されることがあります。長さはスライスに含まれる要素の数を指し、容量はスライスの背後にある配列が持つ要素の最大数を指します。`append`を使用してスライスに要素を追加すると、必要に応じて容量が自動的に増加しますが、この挙動を誤解すると予期せぬパフォーマンスの問題が発生する可能性があります