Go関連のことを調べてみた2021年09月27日

Go関連のことを調べてみた2021年09月27日

Javaで飯食ってるエンジニアがGolangを学んでみる~Ginを使ってHelloWorld編~

今回は実際にローカルでGolangのフレームワークGinを用いて、ブラウザに「Hello World」を描画してみようじゃないかということで、
結構苦戦した結果、Hello Worldできたので、苦戦の証というか、はまりポイントを覚えている範囲で残しておこうと思います。

※結構雑になってしまってるので、適宜更新はするつもりではいますが、とりあえず自分がわかるので公開しちゃいます。

なおGolangについては、少なくとも弊社のプロダクトでは使われていない(と思う)し、周りにやっている人も(知る限り)聞いたことないので、完全独学です。
そのため、もがきあがいた結果なので、「もっとこうやったら楽なのに~」とかあったらコメントなどでご教示いただけるとありがたいです。

#ローカルの環境

– macOS Big sur11.6
– Safali 15.0
– Editor VSCode

※普段の仕事ではWindowsなのでマジで慣れてません(自宅にはWindowsのデスクトップとMacBook Airがあります)

#Hello worldまでの流れ

ざっくり、流れをメモっておきます。

元記事を表示

Docker で Go の開発環境を作る(Docker × Go × Mysql)

# やりたいこと
docker を使って go の開発環境を作る
ローカル環境で go の開発、実行ができるように docker で環境構築を行なっていきます。

# 作るもの
docker, docker-compose を使った go の開発環境
以下の環境をつくっていきます。
・ docker コンテナで go が動く
・ docker コンテナで mysql が動く
・ docker コンテナで phpadmin が動く(おまけ)

# やってき
## 今回作っていくものは以下の通りです。

“`
../
└── go-template
├── Dockerfile
├── docker-compose.yml
└── main.go
“`

### 1.Dockerfile の作成
go の動作環境を作るための Dockerfile です

“`ruby:Dockerfile
# ベースになる docker イメージを指定
FROM golang:1.17.1-alpine

# 作業ディレクトリの作成
RUN mkdir /go/src/ap

元記事を表示

VSCode + Remote Container + WSL2 Dockerで開発環境構築が捗る話

# 概要

VSCodeでDev Container使って開発環境作ると、OS環境汚さないしとても便利という話を聞いたので、周辺諸々調べてみたので、備忘録的に記事にまとめる。
環境はWindows10 pro。

# 経緯

Windows環境でDockerを使って開発環境作るのは昔から興味があったけど、特にコードを書くこともない人生だったので手を付けずにいた。
ただ、最近自宅IoTや電子工作周りでコードを書く機会が増えてきたのと、VSCode+Dev Containerがとても便利という話をTwitterで見かけたので、重い腰を上げてみた。
WSL2バックエンドのDockerもこの機会に設定。

# やったこと

## WSL2とDockerインストール
[こちらのサイト](https://dev.classmethod.jp/articles/docker-desktop-for-windows-on-wsl2/)の作業を手順通りにするだけ。
基本的にDockerは、WSL2バックエンドの設定がデフォルトみたい。
WSL2のディストリビューションはUbuntu20にしました。

#

元記事を表示

[Golang]GORMで論理削除を設定するときの注意

# はじめに
GORMの論理削除の設定にちょっとクセがあることが分かりました。

# やり方
GORMはdeleted_atカラムがあれば、自動で論理削除にすることが出来ます。
しかし、型の指定でtime.Timeにするとエラーが起きます。

### 修正前

“`go
type Presentation struct {
ID int `json:”id”`
Title string `json:”title”`
CreatedAt time.Time `json:”created_at”`
DeletedAt time.TIme `json:”deleted_at”`
}
“`

上記のように、“time.Time“型にしてしまうと、レコード作成時にデフォルトの値が入ってしまい、エラーが起きてしまいます。

### 修正後

“`go
type Presentation struct {
ID int `json:”id”`
Title

元記事を表示

[QUIC]iOS15でNetwork.frameworkにNWProtocolQUICが来たのでquic-goと双方向ストリーム

# iOS15でNetwork.frameworkにNWProtocolQUICが来たのでquic-goと双方向ストリームしてみた

* iOS15 から iOS が QUIC が諸々使えるようになりました???????
* WWDC2021 での発表はこちら

https://developer.apple.com/videos/play/wwdc2021/10094

* この中で紹介されているのですが、URLSession が http3 をサポートするので、http リクエストは複雑な事をしなくても QUIC が使えそうです
* また、Network.framework に NWProtocolQUIC が新しく入っており、ほかの TCP や UDP のソケットと同じインタフェースで QUIC のストリームを扱えるようになったようです

https://developer.apple.com/documentation/network/nwprotocolquic

* そこで、今回は **NWProtocolQUIC を使って、quic-go で建てたサーバと双方向ストリーム

元記事を表示

exForm: PNG to Thinreports(枠線)! なツールを作りました

[Thinreportsでの帳票作成をより手軽に](https://qiita.com/tkotobu1048/items/d103afa8588d3ea67c4b) はTLFから情報を抽出してコーディング等に活用する主旨でした。
今回はTLFそのものを手軽に作成するツールをGoで作って公開しました。
読みはエクスフォームのつもりです。

タイトルの通り、PNGを読み込んでTLFを生成します。

あ、OCRとかのフォースは使えないので罫線のみです。
テキストを除くよう鋭意努力しましたが、ゴミが出たらすみません。(不可避)

## 仕様

* 抽出対象: 水平線、垂直線
* 傾いていると残念な結果が。紙からスキャンした画像は要注意。
* 実線のみで点線・破線は非対応。

* 用紙サイズ: A4 (縦/横)
* 勝手にリサイズするので、画像はA4の比率に近い方が良いです。

## 使用方法
““
exForm -i=image.png
““

指定したファイル名 + “.tlf” が作成されます。

## 生成イメージ
左が元画像、右が生成したTLFをエディタで開いたも

元記事を表示

proto3 でGoのコードを proto ファイルと同じ場所に出力する

# はじめに

`protoc` を使って Go のコードを生成するときにハマったのでメモがてら気をつけることを書いておきます。

## 前提条件

– `protoc` がコマンドラインで使えるようになっていること
– Golang の知識があること
– proto3 の文法がわかっていること

## コマンドラインオプションを指定する

### paths=source_relative を使う

proto ファイルの中で `go_package` を指定しなければなりませんが、その proto ファイルが格納されているディレクトリと Go におけるパッケージ名は同一にすることが推奨されています。なので、proto ファイルの中の `go_package` は以下のようになります。

“`protobuf
option go_package = “github.com/your-account-name/protobuf-example-go/simple”;
“`

この上で、公式ドキュメントにも書いてあるのですが、`protoc` を実行するときにオプションを渡してあげま

元記事を表示

http.Handler あたりを 1 ページにざっくりまとめる

`http.Handle` 周りの知識をよく忘れてしますので、1 ページにまとめてみました。

思った以上に、シンプルにまとまってよかった。。。

これでもう忘れない!

いや、忘れてもすぐ思い出せる!

## ざっくりまとめた結果がこれ
![Go_ Http.Handler.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157574/d6f6949c-2dca-23c6-6efc-467a357f1c77.jpeg)

## 関連記事

過去に書いた関連記事。

より詳しく知りたい場合は、こちらを参照ください。

https://qiita.com/yNavS4Ki/items/5b7a0c7c41eb8da8f12a

https://qiita.com/yNavS4Ki/items/8bc2199e204d445ab6bc

元記事を表示

ebitenのwasm表示ではまった

 sakura.ne.jpでapplication/wasmを設定しても実行できなかったのでメモを残しておきます。ebitenでのwasmを扱うマニュアルは、 https://ebiten.org/documents/webassembly.html にあります。

まず、コンパイルはWindowsでは、&&を足して

“`bat
set GOOS=js&& set GOARCH=wasm&& go build -o ../build/game.wasm
“`

でコンパイル出来ます。

 sakura.ne.jpでサーバー設定が効かなかったので、PHPのスプリクトにて、

“`php:wasm.php

元記事を表示

containerd コンテナランタイムで情報収集

# はじめに
先日 [An experiment of how to detect OOMKilled events on Container-Optimized OS with containerd](https://medium.com/zeals-tech-blog/an-experiment-of-how-to-detect-oomkilled-events-on-container-optimized-os-with-containerd-a7e036a1b2f9) というタイトルでテックブログを執筆しました。ここでは必要最低限度の情報を取得するための方法だけ簡単に紹介しましたが、このブログを書くにあたって試行錯誤していたことを備忘録的に残しておきます。

# 環境
この実験に使用した環境は以下の通りです。

| 項目名 | 値 |
| — | — |
| GKE node version | v1.18.20-gke.901 |
| OS Image | Container-Optimized OS from Google |
| Kernel version |

元記事を表示

SPAのアプリケーションにおけるCookieの共有について

個人のアプリケーションを開発において、SPAにする機会が多いのですが、開発のたびにどのような設定をするんだっけ?と忘れてしまうことが多いです。
SPAの場合、バックエンドとフロントエンドをそれぞれデプロイし、オリジンが異なるケースがほとんどかと思いますが、この場合、知っておくべきこと、設定すべきことが多く忘れてしまいやすいので、バックエンドとフロントエンドに分けてまとめます。

## バックエンドで対応すべきこと

### リクエストを受け付ける別オリジンを指定する

これによって、レスポンスの `Access-Control-Allow-Origin` ヘッダーには許可するオリジンが入り返却される。
**`*` で全オリジンを指定すると資格情報を共有できないので注意**する。資格情報を伴わないオリジン間のリソース共有であれば、`*`指定でも(セキュリティ的には問題があるものの)可能である。

以下、`https://example.com`からのリクエストを受け付けるように指定した場合のレスポンスヘッダー例

“`
Access-Control-Allow-Origin: http

元記事を表示

Go(golang)で気圧低下をお知らせするLINE botを作ってみた

Goを使って、気圧低下をお知らせするLINE botを作ってみました。
1時間に1回、気圧の状態をチェックして、注意・警戒の場合は状態の場合は通知するようになっています。

![todomaru_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/dc783a8d-e94c-b836-e807-e9e163122cfe.png)
(トド丸くんというのは我が家でいろいろお知らせ通知をしてくれる子です
 最初はtodoリストを通知するのが目的だった子なので、トド(todo)丸です)
**※今回はグループにLINE botを招待し、そこで通知する仕組みにしているのですこし特殊です**

今回実装したアプリのソースコードは以下にて公開しています

https://github.com/chasegawa1209/linebot-notify-barometric-pressure

## LINE developersの設定
[LINE developers 公式サイト](https://dev

元記事を表示

Go のキャストが難しい

# これは何?

Go のキャストが難しいなと思う事例があったので紹介する。

# 事例

ちょっと長いけど、まあソースコード。

“`go:go
package main

import “log”

type hoge interface {
foo() string
}

type fuga struct {
hoge
}

type piyo struct{}

func (h *piyo) foo() string {
return “piyo”
}

func main() {
f := &fuga{hoge: &piyo{}}
test := func(h hoge) {
p, ok := h.(*piyo)
log.Println(h.foo(), p, ok)
}
test(f) //=> piyo false
test(f.hoge) //=> piyo &{} true
}
“`

このコードの

“`go:go
log.Println(h.foo(), p, ok)
“`

の部分。
`h.foo()` が

元記事を表示

Go言語を使用して、RaspberryPiのカメラを操作する。

# はじめに
Go言語でカメラ操作するプログラムを作りたかったので、調べてみた。
Go言語でOpenCVのライブラリーを使用すれば、操作できそうなので、そのライブラリをインストールしてテストする
あと、テスト環境は以下の通り

||名称|
|–|–|
|本体|RaspberryPi4 8G|
|OS|Raspberrypi OS 64bit|

# OpenCVのインストール
調べていたら、32bitのRaspberryPi OSではうまくいかなかったので、64bitのやり方だと以下の通りになる

“`:bash
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.3.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.3.zip

unzip opencv.zip
unzip opencv_contrib.zip
mv opencv-4.5.3 opencv
mv opencv_contr

元記事を表示

CloudWatch logsをgolangで操作してみる

# CloudWatch logsをgolangで操作するには?

CloudWatchはかなりAWSの中でもかなり便利なサービスで大好きなんですが、いかんせんSDKにクセがあるので、
自分用のメモがてらラッパーライブラリを実装してみました。

## 作った機能

業務で使っている限り、大部分の時間は`Logs Insight`で検索したりしているのですが、
これが結構もっさりしてたり、そもそもコンソール開くのが煩わしいので、CLI化したい、というのがモチベーションでした。

ただ、APを新規で作っているときはメッセージ保存とかも当然やるので、必要そうな機能は実装しました。

1. LogGroup
1. LogGroup一覧を返す
1. メッセージ検索
1. LogStream
1. 新規作成
1. LogStream一覧を返す
1. LogEvent
1. 新規作成
1. 保存

## リポジトリ

https://gitlab.com/kuritayu/logs

## install

`go get gitlab.com/kur

元記事を表示

Ebitenでのアイコン設定

 Ebitenでゲームを作ってますが、ウインドウのアイコン設定でハマったのでqiitaでソース残しておきます

“`golang
import (
“image”
“image/png”
“os”

“github.com/hajimehoshi/ebiten/v2”
)
“`
 golangの方のimageを使っているので、いつもの

“`
_ “image/png”
“`
では無いです

“`golang
func iconSet() {
p, err := os.Open(“icon.png”)
if err != nil {
panic(err)
}
defer p.Close()

img, err := png.Decode(p)
if err != nil {
panic(err)
}

ebiten.SetWindowIcon([]image.Image{img})
}
“`
 Go言語って、配列の設定でメゾッドへ送れたんだな…

元記事を表示

DMMの API-Gatewayを構築した話 (第一話)

こんにちは、DMMのプラットフォーム事業本部の基盤開発グループの恩田です。プラットフォーム事業本部では、DMMの各事業を支える共通のAPIやGUI部分を提供しています。その基盤を開発しているのが我々基盤開発グループとなります。昨今では特に APIの品質強化や運用の自動化に取り組んでいます。

さて、我々が手掛けた DMMの第二世代 API-Gateway(Gen2-GW)が稼働して1年以上が経ちました。基盤選定から開発・テストに至る全行程で苦労させられたこのプロダクトですが、そろそろ実績も出来てきたので、制作秘話や簡単な内部構造を共有したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375665/0effd88e-5834-9984-dde6-3fd714c5bb67.png)

## 新型 API-Gatewayは何を改善したのか
以降は、Gen2-GWの改善点と改善方法を述べるスタイルで進めたいと思いますが、忙しい人のためにざっとリストアップしてみました。今回はこの

元記事を表示

Go.spec.goからOpenAPI specの出力実験v2

## infoを出したい!

const OpenAPISpecに埋め込んでもらう→const OpenAPISpecの文字列をyamlにして読み込む。

“`go
const OpenAPISpec = `
info:
version: 1.0.0
title: Swagger Petstore
description: A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification
`
“`

## 制約を書きたい!

大方針として、StructTagを使う。

1. 普通のタグと一応混在できる。
1. 解析が簡単。
1. 短くかける。

ということを考えて、yamlがjsonも行けるってことなので、「`{a:”b”} `」が解析に失敗するので断念。
「`{a: “b”} `」と空白を書かないとダメなのね……
ということで、素直にjson5でやることにした。
が、ライブラリが更新されてない。けど、大丈夫だろう。

元記事を表示

Go 言語で日付を JSON に変換するとき構造体を使わずに任意のフォーマットにする

## はじめに

Go 言語で構造体を JSON に変換すると `time.Time` 型の要素は RFC3339 フォーマットに変換されます。
これを他のフォーマットにしたくて

> golang time json marshal

といったキーワードでググると `time.Time` 型を要素に持つ構造体 (`jsonTime`) を定義して `MarshalJSON()` メソッドを実装する、以下のような方法がヒットします。

“`go
type jsonTime struct {
time.Time
}

func (j jsonTime) MarshalJSON() ([]byte, error) {
return json.Marshal(j.Format(“2006/01/02”))
}
“`

これで解決なのですが、私にとっては `jsonTime` が構造体だと都合が悪かったため、それを使わない方法を調べました。

## 環境

“`zsh
% go version
go version go1.17.1 darwin/amd64
“`

#

元記事を表示

Go.spec.goからOpenAPI specの出力実験

# はじめに

OpenAPI spec書くのきついよね。
ソースで書きたいじゃん。
ということで、実際にやってみた。

## input

“`go
package api

type Error struct {
Code int32
Message string
}

type NewPet struct {
Name string
Tag string
}

type Pet struct {
NewPet
Id int64
}

type FindPetsParams struct {
Tags []string
Limit int32
}

type Interface interface {
// (GET /pets)
FindPets(params FindPetsParams) []Pet

// (POST /pets)
AddPet(body Pet) Pet

// (DELETE /pets/{id})
DeletePet(id int64)

// (GET /pets/{id})
FindPetById(id

元記事を表示

OTHERカテゴリの最新記事