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

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

ginフレームワークのテンプレートエンジンで画像を表示する方法

# はじめに
こんにちは,りゅうです
GoのwebフレームワークであるGinを利用してアプリを作っているのですが,フロントで画像を表示するためのAPIを作成中に情報がなくて困ったので記事にしました

# やりたいこと
GitHubもそうですが,フロント側で画像を表示するときには画像がレンダリングされたHTMLを埋めこんでいるようです(ちがったらごめんなさい)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842766/10fb9188-cc41-ff1d-6df9-5aa96a00d93c.png)

この画像表示用URLを発行するためにGOのテンプレートエンジン機能を活用します.
テンプレートエンジンの機能自体はGO側にもあるのですが,今回はGinフレームワークを使っているので,Ginのみを使ってこれを実装していきたいと思います.

# 実装してみる
まずはテンプレートのためのGoのコードです
`ioutil`を使ってバイト列として画像をファイルを開きます
そのバイト列をさらにbas

元記事を表示

Jaeger超入門

# 概要

この記事は、Jaegerを理解する第一歩目として読むことを目的に書きました。この記事の前半では、Jaegerの概要を説明し、類似OSSといくつかの観点で比較します。後半では、Jaegerを動かしながら理解を深めていきます。

![jaeger-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/78ef9a17-7982-41d7-2245-627753a1a894.png)

:::note info
この記事の執筆時点のJaegerの最新バージョンは、1.5.4です。参照する公式ドキュメントや動作確認するデモアプリケーションのバージョンも1.5.4です。
:::

# Jaegerとは

Jaegerは、分散トレーシングを実現するOSSです。分散トレーシングとは、マイクロサービスアーキテクチャーで分散されたサービス間のリクエストのフローを追跡することで、システム全体のパフォーマンスの改善とトラブルシューティングに役立てる機能です。

例えば、以下のような複数のサービスで構

元記事を表示

Go言語のtestingパッケージを使ってみた

自分の関わっているWebサービスは、一部をGo言語で実装している。
今回、testingパッケージを導入して、単体テストの一部を自動化したので、そのメモを残します。

# 環境
“`
% sw_vers
ProductName: macOS
ProductVersion: 13.5
BuildVersion: 22G74
% go version
go version go1.21.6 darwin/arm64
“`

# ソースコード
2つの数値を加算する関数`add`をテスト対象として記述したテストコードを例としています。
### テスト対象
“`example/add.go
package example

func add(a, b int) int {
return a + b
}
“`

### テストコード
“`example/add_test.go
package example

import “testing”

func TestAdd(t *testing.T) {
type Args struct {
a int
b int

元記事を表示

GoでgRPCサーバーを立ててみる5(client.goの実装、動作確認)

お疲れ様です。

今日は「client.goの実装、動作確認」について部分いたします。

# client.goの実装

gRPCサーバーとやり取りするclient.goの実装をしていきます。

“`article/client/client.go
package client

import (
“context”
“io”

“github.com/k88t76/GraphQL-gRPC-demo/article/pb”
“github.com/k88t76/GraphQL-gRPC-demo/graph/model”
“google.golang.org/grpc”
)

// Clientからサービスを呼び出せるようにする
type Client struct {
conn *grpc.ClientConn
Service pb.ArticleServiceClient
}

func NewClient(url string) (*Client, error) {
// client connectionを生成
conn, err := grpc.D

元記事を表示

Go言語でLINE botを使って画像を送信してみた


Go言語でLINE botを使って画像を送信してみた

**imagin**

考えるな、感じろ。

感じるな、動け。

動くな、手を上げろ。

強盗だ!

何?理解できない?

考えるな、感じろ。

……。

**目次**
– [1. LINE botとは](#1-line-botとは)
– [2. コード例](#2-コード例)
– [3. おわりに](#3-おわりに)

## 1. LINE botとは

 LINE botは、LINE Messaging APIを使用してLINEプラットフォーム上で動作する自動応答プログラムです。

 ユーザーからのメッセージに対して自動で返信したり、特定のイベントに基づいて情報を提供することができます。

 ビジネスでの顧客サポートや、エンターテイメント、教育目的での情報提供など、幅広い用途に使用されています。

## 2. コード例

以下に簡単なコード例を示します。

`YOUR_SECRET_TOKEN`
`YOUR_ACCESS_TOKEN`

元記事を表示

Go言語での重複排除処理とカスタムマップ型の利用

## はじめに
配列やスライスから重複する要素を排除したい場面って、意外としばしば出くわしますよね。今回は、そんな時に役立つ`CustomMap`型を使った解決方法をご紹介します。

### `CustomMap`型の定義
まずはじめに、重複をスマートに管理し、すっきりと排除するための`CustomMap`型を定義してみましょう。この型は、`map[string]bool`をうまくラップして、文字列のキーに`true`を割り当てます。キーが自動的に一意になるので、これを使えば重複排除の土台がしっかりと築かれます。

“`go
type CustomMap map[string]bool
“`

### `NewCustomMap`関数の実装
重複排除の鍵となるのは、`NewCustomMap`関数です。この関数が、与えられた文字列リストから新しい`CustomMap`インスタンスを作り上げるんです。文字列をマップのキーとして使うことで、キーの一意性が保証されます。**Goのマップでは、各キーは一意でなければならず、同じキーに対して値を再度設定しようとしても、最初の値が上書きされる

元記事を表示

【Go言語】Katana使ってみた

# katanaとは

https://github.com/projectdiscovery/katana

Project Discovery社が開発したOSINTのWebクローラーツール。
OSINTとは、*Open Source Intelligence*の略で、公開されている情報を収集・分析する手法の1つ。意図しない情報が公開されていた場合、サイバー攻撃に用いられる可能性がある。

# Katanaでなにができる?

* 高速かつ完全に構成可能な Web クローリング
* 標準モードとヘッドレスモードのサポート
* JavaScriptの解析・クローリング
* カスタマイズ可能な自動フォーム入力
* スコープ制御(正規表現などによるフィルタリング)
* JSON形式やファイル形式の出力
* STDIN、URL、複数URLのリストによる入力

# インストール

以下コマンドでインストールする。

“`
go install github.com/projectdiscovery/katana/cmd/katana@latest
“`

# 使い方

`-h`をつけるとオ

元記事を表示

Mattermost をフル活用するために Mattermost の拡張機能を調べてみた

## この記事の目的

以前 Slack の拡張機能を調べたので,Mattermost の拡張機能も確認します.

https://qiita.com/caunu-s/items/5981d6faff2a3736abb0

本記事は Mattermost の起動方法,拡張機能の検証,Slack との比較をまとめたものです.

:::note info
こちらの記事を参考にして,Mattermost サーバーの構築および Plugin や Apps framework の開発を行うことができます.
:::

## 構成

![mattermost-network-architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997806/431a7fb7-74b7-2d38-5dd6-affe1dbf6276.png)

本記事では様々な経路・構成を用いて接続を検証しています.
(結果として図が複雑化してしまいましたが…) 通信経路の自由度が高いことがよくわかると思います.

## サービ

元記事を表示

【認証機能バグ】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 ループに特化される

:::note alert
この記事でのGoの動作は、Go 1.21 の仕様に基づいています。
1.22 で、for の仕様に変更が入っています。
詳しくは、https://tip.golang.org/doc/go1.22 を参照してください。
:::

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

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

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

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

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/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)とは、様々な