- 1. http.Handler あたりを 1 ページにざっくりまとめる
- 2. ebitenのwasm表示ではまった
- 3. containerd コンテナランタイムで情報収集
- 4. SPAのアプリケーションにおけるCookieの共有について
- 5. Go(golang)で気圧低下をお知らせするLINE botを作ってみた
- 6. Go のキャストが難しい
- 7. Go言語を使用して、RaspberryPiのカメラを操作する。
- 8. CloudWatch logsをgolangで操作してみる
- 9. Ebitenでのアイコン設定
- 10. DMMの API-Gatewayを構築した話 (第一話)
- 11. Go.spec.goからOpenAPI specの出力実験v2
- 12. Go 言語で日付を JSON に変換するとき構造体を使わずに任意のフォーマットにする
- 13. Go.spec.goからOpenAPI specの出力実験
- 14. REST APIを実装して遊ぶ
- 15. 値レシーバとポインタレシーバの違いについての備忘録(new UserとUser{}を使った場合について)
- 16. Raspberrypi Pi4にgo言語のインストール
- 17. Vectyを使ってGoでフロントエンドを作ってみた話
- 18. Go httpサーバー&リソースをワンバイナリにする
- 19. Go (Golang) コマンドラインツールの作り方
- 20. Go言語でAWS上、マスターデータ管理システムを実装した話
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 mainimport “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) //=> piyofalse
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.zipunzip 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 apitype 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
REST APIを実装して遊ぶ
# はじめに
最近Goしている。
RESTで遊んでいる。
OpenAPIで自動生成でやる。
書いてられない……
さて、どうしよう……# 解決案
ざっくり案だけど、JavaのSpringdocみたいに自動で仕様書書くのはどうだろう。
Goだと割と楽にコード解析ができる。
そこで、go自体でIDLっぽく、インタフェースを書いて、自動生成する。“`go
package idl// 適当に構造体を宣言→componentsに入れる。
type NewPet struct {
Name string
Tag string `idl:”制約条件”`
}type Pet interface {
// (GET /pets)→pathとmethodに使う。
Find(params FindPetsParams) Pet
// -> paramsクエリの情報。Pet 200の応答。
}
“`こんな感じで、定義書いておいて、go:generateでキックして、OpenAPI spec&コード生成できるといいんかなと。
値レシーバとポインタレシーバの違いについての備忘録(new UserとUser{}を使った場合について)
Go初心者で躓いたのでメモとして残します。
`type User struct { Name string }` があるとする。
`u := new(User)`と、`u := User{}`では、値レシーバとポインタレシーバを使う際どう異なるのかを、暗黙の変換に着目してまとめてみた。“`go
package mainimport “fmt”
type User struct {
Name string
}// メソッド(値レシーバ)
func (u User) setValueName() {
u.Name = “gopher”
}// メソッド(ポインターレシーバ)
func (u *User) setPointerName() {
u.Name = “gopher”
}func main() {
// 値レシーバ
u1 := new(User) // uは*User型
(*u1).setValueName()
fmt.Println(“u1.Name:”, u1.Name, “*u1:”, *u1, “&u1”, &u1)
// u1
Raspberrypi Pi4にgo言語のインストール
# はじめに
RaspberryPi4にGo言語のインストールをする必要が出たので最新版をインストールして動作テストしてみる
なお、OSは[64biのRaspberryPi OS](http://downloads.raspberrypi.org/raspios_arm64/images/)を使用している
# インストール
以下のコマンドで、Go言語をインストールする
“`bash
wget https://golang.org/dl/go1.17.1.linux-arm64.tar.gz
tar -xzf go1.17.1.linux-arm64.tar.gz
sudo mv go /usr/local
rm -rf go1.17.1.linux-arm64.tar.gz
echo “export PATH=\$PATH:/usr/local/go/bin” >> ~/.bashrc
sourc ~/.bashrc
“`# 動作テスト
goのパスが通っていることを確認
“`bash
$ go version
go version go1.17.1 linux/
Vectyを使ってGoでフロントエンドを作ってみた話
# 注意
本記事はとりあえず動く形にしたくらいの理解度で書いた記事です。内容に誤りが含まれる可能性があります。# 概要
Goでフロントエンドを作るフレームワークである[Vecty](https://github.com/hexops/vecty)を使ってみた際の備忘録です。また、状態管理のために[Redux](https://github.com/dannypsnl/redux)を使用しています。作成したリポジトリは[こちら](https://github.com/suger-131997/todos-vecty)です。Webページは[こちら](https://suger-131997.github.io/todos-vecty/)。
[Redux Todos Example](https://github.com/reduxjs/redux/tree/master/examples/todos)を参考にしています。
# 使用したバージョンなど
– Go 1.17
– github.com/hexops/vecty
Go httpサーバー&リソースをワンバイナリにする
Go言語で 標準package のみを使用して、
httpサーバーを作成するのをやってみたいと思います。ただ httpサーバー を立てるだけだと
すぐできてしまいそうなので、今回は `go:embed` を使ってみたいと思います。## go:embed とは
httpサーバーを立てて何かページを返すようなものを作ろうと思っています。
あとリソースは、外部アクセスさせずにローカルで完結するようにします。そのためには、リソースをローカルで持たなければいけません。
例えば、画像・CSS・JavaScript などのファイルとか。。。
実行体(exe)と同じところにファイルを置いて、
exeから読み込んで返してもらってもよいのですが
ファイルを入れ忘れるとかがあると面倒なので・・・ワンバイナリにしたい!そんな時に使えるのが `go:embed` です。
リソースも実行体に含めてワンバイナリにしてくれます。Go 1.16 からリリースされたので、それ以上で使えます!
使い方もそんなに難しくないので、さっそくやってみます。
## httpサーバーを立てる
まずは、h
Go (Golang) コマンドラインツールの作り方
Golang バージョン 1.16 以上をを想定しています
環境の構築方法については次の記事を参照してください:
[Docker とVisual Studio Code を使った Go (Golang) 開発環境構築 – Qiita](https://qiita.com/y_shinoda/items/e6e2fef46408c0bae83b)## 基本
まずは Golang プロジェクトを初期化します
プロジェクト用フォルダーを作成し、そのフォルダーの直下で次のコマンドを実行します:
“`console
go mod init <リポジトリーのパス>
“`例:
“`console
go mod init github.com/yukihiko-shinoda/go-commandline-tool
“`※ リポジトリーのパスは後から変えることもできます
すると、ファイル: `go.mod` が作成されます
“`text
project/
+—go.mod
“`次に `.go` ファイルを作成します
例:“`text
project/
Go言語でAWS上、マスターデータ管理システムを実装した話
# 概要
元々、各プロダクトでマスターデータをJSON、DB、コードなどで管理していました。
PaymentMDM (Master Data Management)というプロダクトをGo言語で実装して、決済システムの共通マスタ情報の取得と運用をRestful APIを目指しています。開発しやすく、拡張しやすく、低コストでメンテできるプロダクトを作りたいと思いました。まあ、それは普通ですよね! 我々の簡単とは、後で定義します。
最初から完璧にすることを目指していませんですた。気がつく問題や開発の非効率を改善するように、継続的にベストプラクティス、またはライブラリを導入しました。そして、コードのリファクタリングを行いまいした。なんのプロダクトでも適切であるテックスタックなんて存在していないです。おそらく、テックスタックがまた変わっていくと思いますので、現状のテックスタックです。しかし、Go言語開発の他のプロダクトのニーズに一部のテックスタックが適切であることの確認ができるのではないかと思いました。例えば、PaymentMDMのテックスタックがすでに、別のプロジェクトで完全に再利用