- 1. Go WebSocketを使ってみる
- 2. golangで動かして学ぶCognitoユーザプール、IDプール
- 3. 2022~2030年に学ぶべき未来のプログラミング言語3選
- 4. 【Golang】import したモジュール/パッケージのバージョン確認(外部モジュール情報を main から取得する)
- 5. Javaで飯食ってるエンジニアがGolangを学んでみる~Ginを使ってHelloWorld編~
- 6. Docker で Go の開発環境を作る(Docker × Go × Mysql)
- 7. VSCode + Remote Container + WSL2 Dockerで開発環境構築が捗る話
- 8. [Golang]GORMで論理削除を設定するときの注意
- 9. [QUIC]iOS15でNetwork.frameworkにNWProtocolQUICが来たのでquic-goと双方向ストリーム
- 10. exForm: PNG to Thinreports(枠線)! なツールを作りました
- 11. proto3 でGoのコードを proto ファイルと同じ場所に出力する
- 12. http.Handler あたりを 1 ページにざっくりまとめる
- 13. ebitenのwasm表示ではまった
- 14. containerd コンテナランタイムで情報収集
- 15. SPAのアプリケーションにおけるCookieの共有について
- 16. Go(golang)で気圧低下をお知らせするLINE botを作ってみた
- 17. Go のキャストが難しい
- 18. Go言語を使用して、RaspberryPiのカメラを操作する。
- 19. CloudWatch logsをgolangで操作してみる
- 20. Ebitenでのアイコン設定
Go WebSocketを使ってみる
今回は Go言語 で WebSocket を使用してみたいと思います。
軽く感じをつかむだけなので、あまり手の込んだものは作りませんw
## やりたいこと
サーバー と クライアント で メッセージ を キャッチボール する。
・・・のを WebSocket を使ってやります。
~~これくらいなら ajax とかでいい感じもしますが、、、~~
## WebSocket とは?
下記の資料がわかりやすかったです。
WebSocketのキホン from You_Kinjoh理解した感じでざっくり説明すると、
Webのアクセスは、キャッチボールみたいな感じでブラウザ「〇〇のページをちょうだい」(要求)
サーバー「はいよ!」(応答)
で接続が切れてしまうのですが、
WebSocket を使用すると 電話のように常時つなぎっぱなしにできます。
利点としては、先ほどのキャッチボールを始める前に
いろいろな前処理がなくなるので応答が早くなります。リアルタイム性を求めるものによく使われている感じですね。
##
golangで動かして学ぶCognitoユーザプール、IDプール
# Cognitoをgolnagから操作してみる
イマイチ理解しきれてなかったので、ラッパーライブラリを作りつつ、勉強してみました。
元ネタはhttps://dev.classmethod.jp/articles/get-aws-temporary-security-credentials-with-cognito-id-pool-by-aws-cli
で、AWS CLIベースの記事だったのをgolangに書き起こしつつ理解するって形を取りました。作ったラッパーは
https://gitlab.com/kuritayu/cognito
におきました。## ユーザプール、IDプールの違い
1. ユーザプール: ユーザ情報、ログイン情報の管理(認証担当)
1. IDプール: ユーザに応じた一時クレデンシャルキーの発行(認可担当)## パターン別のクレデンシャルキーの発行
1. 認証済・非認証に応じたクレデンシャルキーの発行(IAM Role)
1. ルールベースのクレデンシャルキーの発行
1. ユーザプールに設定したIAM Roleでクレデンシャルキーを発行## 環境
2022~2030年に学ぶべき未来のプログラミング言語3選
本記事は、[Eddy Goh](https://eddygte.medium.com/)氏による「[3 Future Programming Languages You Should Learn Between 2022 and 2030](https://betterprogramming.pub/3-future-programming-languages-you-should-learn-between-2022-and-2030-8a618a15eca6)」(2021年7月13日公開)の和訳を、著者の許可を得て掲載しているものです。
#2022~2030年に学ぶべき未来のプログラミング言語3選
>今後の世界を左右する可能性のあるプログラミング言語![](https://miro.medium.com/max/630/0*K8FlUIxA-fmPj38z)
Programming Books. Source: [NeONBRAND from Unsplash](https://unsplash.com/photos/uEcSKKDB1pg)テクノロジー市場で10年以上働
【Golang】import したモジュール/パッケージのバージョン確認(外部モジュール情報を main から取得する)
> Go 言語(以下 Golang)のソースコードの `main` パッケージで、アプリが利用しているモジュール/外部パッケージのバージョンを取得したい。
[「”golang” import パッケージ モジュール バージョン 確認」でググって](https://www.google.com/search?q=%22golang%22+import+%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8+%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB+%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3+%E7%A2%BA%E8%AA%8D)も、`go get` するモジュールのバージョン指定しか出てこなかったので、自分のググラビリティとして。
## TS; DR (今北産業)
1. [runtime/debug](https://pkg.go.dev/runtime/debu
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 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言語って、配列の設定でメゾッドへ送れたんだな…