Go関連のことを調べてみた2022年10月12日

Go関連のことを調べてみた2022年10月12日

BaggageをREST/gRPC/SQSで伝播できるようにした話

## はじめに
[Kyash](https://www.kyash.co/)でサーバサイドのエンジニアをしているhirobeです。

Kyashでは30ほどのマイクロサービスを運用しており、マイクロサービス間ではREST/gRPCでの同期通信やSQSを介した非同期通信をしています。

マイクロサービスを運用していると[Context Propagation](https://opentelemetry.io/docs/concepts/signals/traces/#context-propagation)という単語を聞く機会があると思います。

Context Propagationとは、マイクロサービスをまたがって情報を紐付けすることを可能にする仕組みを指します。[^1]

Context Propagationによって実現できることとしてまず挙げるべきは[Tracing](https://opentelemetry.io/docs/concepts/observability-primer/#distributed-traces)でしょう。
Datadog、New Relicなど

元記事を表示

docker compose 初心者によるハンズオン形式備忘録

## この記事について

シンプルな構成のコンテナネットワークを作りながら学ぶ`docker compose`のハンズオンです。

現場で自チームが担当している複数のマイクロサービス(MS)が他のMSに依存していて、手元で気軽に業務シナリオをテスト出来ないのはよくある状況だと思います。
そこで、複数コンテナをポートフォワードで他のMSに接続しつつ手元で動作させる`docker-compose.yml`を用意しよう、と言う動機で調べたことをハンズオン形式でまとめました。

以下のような人(つまり自分)が対象です

– docker を触ったことがある
– `docker compose`の存在は知っている
– Dockerfile, docker-compose.yml を書く度に一日中ググってる
– dockerのネットワークについて何も知らない
– docker関連はリファレンスを読んでもイマイチ頭に入らない
– 手元にgolangが入っている (サーバのモックをGoで書くため。他言語でも構わない)

## そもそも Docker とは?

勉強したのでせっかくなので備忘

元記事を表示

【Terraform】VPCエンドポイントの設定で service_name が取得できなかった場合、service から組み立てられる件

# はじめに

こちらのモジュールをつかって、VPCエンドポイントを作成する際、`service_name`を渡さなくても、自動で設定されます

https://github.com/terraform-aws-modules/terraform-aws-vpc/tree/master/modules/vpc-endpoints

“`tf
module “endpoints” {
source = “terraform-aws-modules/vpc/aws//modules/vpc-endpoints”

vpc_id = “vpc-12345678”
security_group_ids = [“sg-12345678”]

endpoints = {
s3 = {
# interface endpoint
service = “s3”
tags = { Name = “s3-vpc-endpoint” }
},
}

tag

元記事を表示

goで画像の色調変換の処理を行う

# はじめに

こんにちは、icemint0828です。
今回は自作パッケージの紹介も兼ねて、goでの画像の色調変換の処理の方法を紹介します。

## 動作環境
go 1.18.3

## 使用パッケージ

* icemint0828/imgedit
画像の色調変換の処理に使用しています。
画像ファイルの拡張子の変換にも使用しています。

https://github.com/icemint0828/imgedit

## インストール

“`shell
$ go get github.com/icemint0828/imgedit@v1.6.0
“`

# 画像の色調変換の処理

“`main.go
package main

import (
“github.com/icemint0828/imgedit”
)

func main() {
// FileConverter
fc, _, err := imgedit.NewFileConverter(“srcImage.png”)
if err != nil {
panic(err)
}
/

元記事を表示

【Go】リリース直後の自作モジュールをgo getしてくれない問題について

# 経緯
先日Goで開発を行なっていた所、
自作したモジュールのプログラムを修正して更新しようとしました。

しかし、
最新のコミットのモジュールを**go get**しようとしても、
一向に**go.mod**のバージョンが書き変わりません。

`go env GOPATH`
で本体の場所を確認。

コードを確認

やっぱりプログラム変わっていない。。

# 試した事
`go clean -modcache`
でモジュールをクリア

対象のモジュールを**go get**し直し

修正前のモジュールを取得してきているようで、
変化なし。。

`@latest`を付けてもダメ❌
`@HEAD`でもダメ❌
`go get -u`でもダメ❌
`go install`でもダメ❌
で暗礁に乗り上げてしまっていました。

# 原因
調べていると、
proxyがモジュールの新規リリースを認識していない事が原因だと判明。

※明確な公式のソースは未確認です。
※個人ブログのtipsにより確認しました。
(記事下にリンクあり)

# 解決する為にやった事
対象のモジュールの最新のバージョンを確

元記事を表示

[Go] 構造体の変換と比較

Goの構造体間で変換できる条件と比較できる条件について書きます。

## 構造体の変換について

Goの構造体の変換はフィールドの名・型・順番・数が一致していることが前提で変換することができます。例えば以下の様に, AとBでは構造体間の変換が可能です。

“`go
package main

import “fmt”

type A struct {
aa int
bb int
}

type B struct {
aa int
bb int
}

func main() {
a := A{
aa: 1,
bb: 2,
}
var b B
b = B(a) // 変換可能
fmt.Println(b) //=> {1 2}
}
“`

逆に以下の様に、フィールド名が異なる・フィールドの型が異なる・フィールドの順番が異なる・フィールドの数が異なる、等の状態だと変換することができないです。

“`go
package main

type A struct {
aa int
bb int
}

type DifferentFieldName struct

元記事を表示

DockerでGoのAPIサーバーを立てる

# はじめに
DockerでGoのAPIサーバーを立てるDockerFileを作成しました。
調べたこと、DockerFileについて調べたことをまとめます。

[入門Docker 学習メモ](https://qiita.com/bear05/items/302de545018948b5c9c7)
後の実践

# 基礎知識の補足
### ビルドコンテキスト(build context)
>docker buildコマンドを実行したときの、カレントなワーキングディレクトリのこと

[Dockerfile 記述のベストプラクティス](https://matsuand.github.io/docs.docker.jp.onthefly/develop/develop-images/dockerfile_best-practices/)

### Dockerデーモン
Docker Engineの一部。
Docker EngineはDocker CLI、Docker Engine API、 Dockerデーモンで構成されている。
イメージのビルドやコンテナの起動を行ってくれるもの。
> Doc

元記事を表示

Go言語を始めたい方へ ~ Hello World から ゴルーチン まで ~

![gopher_fiveyears.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2173896/d6a4258e-a9cb-91f2-b29d-04617034515b.jpeg)

## 概要
本記事は、Go言語を始めたい方に対して、Go言語開発者として抑えておきたい『 1〜10 +α 』をまとめたものである。
初心者はもちろん、中級者の方の基本振り返り用としても活用して頂けることを期待している。

## How to Go言語
### HelloWorld
https://qiita.com/GL-Kageyama/items/8b012d078e484100ec85

### スライス
https://qiita.com/GL-Kageyama/items/46cd77f71ef6b03e7816

### マップ
https://qiita.com/GL-Kageyama/items/f753e3b807d1894e88a4

### 構造体
https://qiita.com/GL-Kag

元記事を表示

Oracleを使うGoアプリのコンテナ化メモ(最終回)

https://qiita.com/yuuman/items/9f988a9cf4b6dcf4a969

続きます

# 6. mattn/go-oci8 ⇒ sijms/go-ora への変更
結局`mattn/go-oci8`がOracle提供のOracle Instant Clientに依存していることがすべの原因なので、`mattn/go-oci8`からOracle Instant Clientに依存していないGoのみで実装した`sijms/go-ora`に変更することにします。

https://github.com/sijms/go-ora

書き直したコードは下記となります。

“`main.go
package main

import (
“database/sql”
“log”

_ “github.com/sijms/go-ora/v2”
)

var (
VERSION = “default”
REVISION = “dev”
)

func main() {

log.Printf(“Version:%s, Revision:%s”, VER

元記事を表示

Oracleを使うGoアプリのコンテナ化メモ(挫折編)

https://qiita.com/yuuman/items/09f6d3e43e96de0a5096

続きます。

# 4. アプリのDockerイメージ化
前回作成したサンプルのGoアプリをコンテナ化して実行できることを確認します。

## 4.1 Dockerfileの準備
まずはアプリビルド用のDockerfileをベースイメージ`golang:1.18.5`で作成します。

“`dockerfile:Dockerfile
FROM golang:1.18.5

WORKDIR /workspace

ENV ORACLE_URL=https://download.oracle.com/otn_software/linux/instantclient/217000/
ENV BASIC_ZIP=instantclient-basic-linux.x64-21.7.0.0.0dbru.zip
ENV SDK_ZIP=instantclient-sdk-linux.x64-21.7.0.0.0dbru.zip

ENV PKG_CONFIG_PATH=/usr/lib/pkg

元記事を表示

Raspberry pi で BME280 を使用する (Golang)

# はじめに
Raspberry pi にて、
温度、湿度、気圧を測定できる環境を構築することを目的とする。
BME280の基本部分のみを使用する。

追記:2022/10/10
Appソースの一部を修正

# 使用機材
raspi : raspberry pi 4 (4GB)
sensor : bme280 (GYBMEP)

“`
$ cat /etc/debian_version
> 10.13

$ go version
> go version go1.11.6 linux/arm
“`

# i2c 準備
i2c 系ライブラリのインストール
“`
sudo apt install i2c-tools
“`

raspberry pi 側の i2c の Enabe
“`
sudo raspi-config
“`
3 Interface Option
P5 I2C
Yes
OK
Finish
の順

再起動(不要かも)
“`
sudo reboot
“`
# i2c 確認
“`
sudo i2cdetect -l
>i2c-1 i2c bcm2835 (i2c

元記事を表示

Go言語 : キュー(Queue)

## キュー(Queue)
キューとは、入ってきたデータを順番に格納し、先に格納したデータから順に取り出すデータ構造。
先入れ先出し(FIFO:First-In First-Out)方式のデータ構造とも呼ばれる。

## ライブラリ
今回使用したライブラリは、 “go-datastructures”.
https://github.com/Workiva/go-datastructures

“go-datastructures”ライブラリのキューには、複数の型の値が入れられる。

インストール用コマンド
$ go get -u github.com/Workiva/go-datastructures/…

## コード
“`Go
package main

import (
“fmt”
“strconv”

“github.com/Workiva/go-datastructures/queue”
)

func main() {

// キューの作成
var queueObj queue.Queue
// 現在のキューの値 : []

// キューへ値の追加
q

元記事を表示

【Golang】数値をコンマ区切りで出力する【1000桁単位のカンマ区切りフォーマット出力】

> Go 言語(以下 Golang)で `int(1000)` —> `”1,000″` と[コンマ](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%9E)区切りでフォーマット出力したい。
>
> しかし、`fmt` パッケージには専用の関数がなさげ。どうしよう。

**独自実装やサードパーティのパッケージを使わずに、golang.org 管轄下のパッケージでフォーマットできないものか**。

[「golang コンマ区切り カンマ区切り 出力 フォーマット」でググる](https://www.google.com/search?q=golang+%E3%82%B3%E3%83%B3%E3%83%9E%E5%8C%BA%E5%88%87%E3%82%8A+%E3%82%AB%E3%83%B3%E3%83%9E%E5%8C%BA%E5%88%87%E3%82%8A+%E5%87%BA%E5%8A%9B+%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88)も、独自実

元記事を表示

【Golang】文字間の複数ホワイトスペースを削除して1つのスペースに置き換える関数

> Go 言語(以下 Golang)で、文字列内の文字間にある複数スペースを 1 つに変換したい。
> つまり、**単語間の空白を詰めたい**のです。
>
> “`bash:こういうことがしたい(before–>after)
> ” Hello, World ! ” –> “Hello, World !”
> “Hello,\tWorld ! ” –> “Hello, World !”
> ” \t\n\t Hello,\tWorld\n!\n\t” –> “Hello, World !”
> “`

[「golang 文字間の複数スペースを削除する」でググって](https://www.google.com/search?q=golang+%E6%96%87%E5%AD%97%E9%96%93%E3%81%AE%E8%A4%87%E6%95%B0%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B)も、正規表現や `

元記事を表示

プログラミング言語Go アウトプット(4章)

# はじめに
これまでの章のアウトプットやプログラミング言語Goのアウトプットをしようと思ったきっかけなどは[こちら](https://qiita.com/AtomuIshida/items/6e05c02a2bd82f1e133d)でまとめているのでぜひ読んで欲しいです。

# 4章 コンポジット型
## 重要・学びになったと思うところ
### 配列について
Go言語において、配列は“`固定長“`のため直接使われることが少ない(らしい)
しかし、よく使われる“`スライス“`を理解するためには、配列の理解は必須!

配列の宣言
“`go
var a [3]int // 3個の整数の配列
“`

for文を使ったインデックと要素の表示・要素のみの表示
“`go
var a [3]int{1,2,3}

for i, v := range a {
fmt.Printf(“%d, %d\n”, i, v) // 0,1 1,2 2,3
}

for _, v : = range a {
fmt.Printf(“%d\n”, v) // 1,2,3
}
“`

元記事を表示

Go強化月間~開発する上で知っておくべき知見を共有しよう~ 結果発表?

こんにちは、Qiita運営スタッフです。

8月15日(月)〜9月16日(金)の期間に開催いたしました記事投稿キャンペーン「Go強化月間~開発する上で知っておくべき知見を共有しよう~」 へのたくさんのご参加、誠にありがとうございます!

今回のイベントでは、合計123名の方にご参加いただき、59本もの記事が投稿されました!
ご投稿いただき誠にありがとうございます?

本テーマでは、Goを用いて開発する上で知っておくべきことについて様々な内容を記事にまとめていただきました。
投稿された多くの知見を日々の開発に活かしてみましょう :muscle:

今回はご投稿いただいた記事の紹介といいね数のランキングを発表いたします!

## Qiita運営ピックアップ記事
たくさんのご投稿の中から、Qiita運営がおすすめ記事をピックアップしました!
まだ記事を確認できていない方はご参考にしてみてください!

### [Go で Stack と FIFO](https://qiita.com/mattn/items/774280a746c82ee63fc0) by [@mattn](https://q

元記事を表示

Go Moduleって何

# はじめに
GoでDockerでGoサーバーを立てるとき、改めてGo Moduleって何となったので調べたことをまとめます。

# Go Moduleとは
パッケージ(Package)をまとめたもの。パッケージはコードをまとめるもの。すべてのコードはパッケージに入っている。
モジュールがパッケージの依存関係を管理する。
例えばAパッケージの関数がBパッケージの関数を使用するとする。
つまり、AパッケージはBパッケージがないと動かない、AはBに依存しているということになる。

補足:goはmainパッケージのmain関数から処理が始まる。

# go mod でGoモジュールを作成する
goプログラムが入っているフォルダ内で、以下のコマンドを実行することでモジュールが作成できる。
ユニークな名前は、公開する場合はgithubのリポジトリ名、
非公開の場合はローカルでユニークな名前を付ける。
ユニークな名前とは、世界(非公開の場合はローカルで)同じモジュール名がないようにすること。
モジュールを参照するとき、同じ名前のモジュールがあったらどっちのモジュールを参照すべきかわからなくなるため

元記事を表示

Goで2つのスライスから共通要素を取得したいときはgolang-setをつかおう

# はじめに

Goで2つのスライスの共通要素を取得する際、愚直にループを回すと以下のようになると思います

“`go
package main

import (
“fmt”
)

func ExampleIntersect() {
hoge := []string{“a”, “b”}
fuga := []string{“a”, “b”, “c”}

var intersection []string
for _, h := range hoge {
for _, f := range fuga {
if h == f {
intersection = append(intersection, f)
}
}
}

fmt.Printf(“%+v\n”, intersection)
// Output:
// [a b]
}
“`

# Intersect(other Set[T]) Set[T]

golang-setをつかいます

https://github.com/deckarep/golang-set

`target.Int

元記事を表示

Ory Kratosをセルフデプロイ&SSO設定(GitHub)

# はじめに

はじめまして。あかこうです。

最近Ory Kratosを使っているのですが、
その備忘録をここに書きなぐっておきます。

本記事でまとめられているのは、以下の内容です。

1. Ory Kratosをセルフホストする
2. Ory KratosにGithubでSSOする

(※本番用のデプロイではないです。)

# 1. Ory Kratosをセルフホストする

以下のコマンドで、Ory Kratosをセルフデプロイできます。。
[参考にした公式サイト](https://www.ory.sh/docs/kratos/quickstart#clone-ory-kratos-and-run-it-in-docker)

“`sh
git clone https://github.com/ory/kratos
cd kratos
docker-compose -f quickstart.yml -f quickstart-standalone.yml up –build –force-recreate
“`

うまく動けば、http://0.0.0.0:4455/

元記事を表示

PostGISベクトルタイルサーバーの比較: tegola/martin/pg_tileserv

## 概要

通常、ベクトルタイルはGeoJSONなどから変換した静的なファイルとして配信されることが多いです(.pbfファイルの配信)。パフォーマンスやサーバーのコストの観点ではベストな方法と言えますが、いくつか典型的な問題があります。

– 変換に大きなコストがかかる(特にplanet級の、タイル数が膨大な場合に問題となる)。
– データの追加・削除や更新が苦手

そんなわけで、データベースから動的にタイルを配信出来ることはとても重要です。しかしこのアプローチにもパフォーマンス面などで課題があるため、どの方法をなぜ採用するのか、よく検討する必要があります。

FOSS4Gの世界のデータベースといえばPostGISです。世間では、PostGISのテーブルからベクトルタイルを動的に配信するためのアプリケーションがいくつか実装されています。

– [t-rex(Rust)](https://github.com/t-rex-tileserver/t-rex)
– [tegola(Go)](https://github.com/go-spatial/tegola)
– [martin(Ru

元記事を表示

OTHERカテゴリの最新記事