- 1. MongoDBのfindで配列フィールドの登録数を不等号条件でfilterしたい
- 2. Golangに入門してみた
- 3. GoでのWeb Framework選択時にルーティングの問題でGinを諦めてしまった人へ
- 4. [golang error] go: gopkg.in/yaml.v2@v2.2.2: unknown revision v2.2.2
- 5. multipass + docker on Mac
- 6. 【Go】学習メモ③~APIサーバの構築~
- 7. 【Golang】go path / go get / go install / go mod tidyについて
- 8. Go の気になったコミット (2021 年 12 月)
- 9. カフェでプログラミングしてる風(でも何もやってない)Go(クソ)コード
- 10. S3にCSVファイルをアップロードしたらDynamoDBに書き込んでくれるLambdaをGolang1.xで書いてSAMでデプロイする
- 11. 【Go】http.Client に独自ルート証明書を追加する
- 12. Go Modulesの使い方
- 13. Go のジェネリクスを使って map と filter を実装してみた
- 14. 【GO】base64形式で受け取った画像をGCSにアップロードする
- 15. Exercise: Loops and Functions
- 16. IntelliJ Go Pluginを設定する
- 17. 自分用GoでAPIを作る前に作るHttpClientラッパー
- 18. Go 言語スプレッドシートライブラリ:Excelize 2.5.0 がリリースされました
- 19. Microsoft Docs「Go でサーバーレス アプリを構築する」の補足情報
- 20. emacs+eglotでgoplsのロードが重い問題に対処した
MongoDBのfindで配列フィールドの登録数を不等号条件でfilterしたい
## 概要
MongoDBではフィールドに配列の型を持てますが、その登録数をfindで条件にしたい時もあるかなと思います。
特定の数(例えば配列の中に1個登録)を条件にしたい場合は、[$size](https://docs.mongodb.com/manual/reference/operator/query/size/)のオペレーターを使用すれば大丈夫ですが、1個以上とか不等号を使いたくなる場合もありますよね。ただ、`$size`は数値型しか設定できないので、例えば`array_field : { $size: { $gt : 1 }`のような指定は不可となります。
では、このように不等号を使いたい場合は、どのように対応すれば良いのかというのをメモ書きします。## 対応方法
[Is there a way to query array fields with size greater than some specified value?](https://www.mongodb.com/community/forums/t/is-there-a-way-to-query-arra
Golangに入門してみた
# Golangに入門してみた
最近、転職活動をしているときにgRPCについての話があり、あまり詳しく知らなかったのでハンズオンしたいな、と思いどうせならgRPCの醍醐味である別言語間での通信を実現してみたいなと思い、現在使えるJavaScript, Python, Rubyに加え、流行のGolangを用いてAPI作ってみたいなと思い、Glangのtutorialをやってみました。
そこで、とりあえずGolangのfor文 + if文を使って平方根を求めるエクササイズがあったので、それをググりながら書いてみた。そこまで難しくないし、ヒントも出されているので、5分くらいで終わったのですが、その回答を載せます。答えは見てないので、非効率なプログラム書いているかもしれませんが、まぁいいでしょう。
## エクササイズ内容
こちらのページのエクササイズを行いました。
https://go-tour-jp.appspot.com/flowcontrol/8![](https://storage.googleapis.com/zenn-user-upload/99d4cb256a76-2
GoでのWeb Framework選択時にルーティングの問題でGinを諦めてしまった人へ
## 前置き
久しぶりに記事を書いています。(結構雑にですが)
なんで書く気になったかというと、あまりに嬉しい修正が入っていたことに気が付いたからです。
恥ずかしながら結構前のアップデートだったようですが、12月中頃に気付きました・・・GoでAPIサーバを作成する際にWAFの選択肢は様々だと思います。
`go-swagger`を使ってみようかなんて考えたり、`Echo`と`Gin`ってどっちが良いんだろうと悩んだり。ちなみに僕は過去に`Gin`を選択したり、WAFというかRouterとして`gorilla/mux`を使用したりもしていました。
そして`Gin`についてはRouterのPathの記述というか、ルーティングに悩まされることがありました。
いくつかそのような記事も見かけたので気になる方は検索してみてください。
上記のようにPathが柔軟に作れないことで一定数`Gin`を選択肢から外してしまった方もいるのでは無いでしょうか。
今回はそんなルーティングに難があったGinでかなり問題が解決されていた部分について書いていこうと思う。
## 前提
– go versi
[golang error] go: gopkg.in/yaml.v2@v2.2.2: unknown revision v2.2.2
### 状況
Dockerでgolangとmysqlの環境構築### エラー内容
“`
go: gopkg.in/yaml.v2@v2.2.2: unknown revision v2.2.2
go: error loading module requirements
“`### さきに結論
– version (1.17)にupdateしましょう
– [上記をすでに試した場合](#自分の場合)### より詳しく
結論の繰り返しになりますが
versionを更新することで解決できます
*参考にしたissueは[こちら](https://github.com/go-yaml/yaml/issues/791)*解決できてない方は自分と同じ場合かもしれないので
先にお進みください### 自分の場合
Dockerfile
“`
FROM golang:1.17WORKDIR /go/src/github.com/mahiro72/todo_api_pra
COPY . .ENV GO111MODULE=on
“`そもそも**version
multipass + docker on Mac
# Mac でのDocker環境構築
いよいよ DockerDesktopの猶予期限がくるので、移行しました。
下記どちらでコマンドをうっているのか分かりづらいので セクションタイトルに Macで実行する場合は “on Mac”、 仮想環境のUbuntuで実行する場合は ”on Ubuntu”と入れる## multipass (ubuntu の仮想起動環境)インストール on Mac
https://multipass.run/
1. 上記からmac用binaryをDownload
2. installer を起動## multipass でubuntu:latest(20.04) 起動 on Mac
あとからmemory, disk sizeを変更するのがとても大変なので最初から必要な分指定する“` shell
% multipass launch –name ryujidev -m 8G -d 12G
Launched: ryujidev
【Go】学習メモ③~APIサーバの構築~
#はじめに
Go学習の一環として、簡単なAPIサーバを作成してみました。その他のGoの記事については以下をご覧ください。
https://qiita.com/suzuki0430/items/6674ffa239dc539e0fd7#%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF
https://qiita.com/suzuki0430/items/dc82131e5e26e2cf3ae0
#実装
DBにmovies, genres, movies_genresテーブルを作成し、指定したIDのmovieを取得するようなAPIをつくります。movies
![スクリーンショット 2022-01-07 21.41.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/92ef94ef-8163-7b74-ad69-0cf08ff42ed8.png)
genres
![スクリーンショット 2022-01-07 21.41.41.png](https://qii
【Golang】go path / go get / go install / go mod tidyについて
## はじめに
Go1.17のエコシステムをまとめました。
意外に情報が少なく、私がGoを学ぶ上で最初に苦戦した領域でした。
もし間違いがあれば優しくご指摘いただけると幸いです><## GOPATHについて
GOPAHTのデフォルトは`~/go`。この下に `src/` `bin/` `pkg/`という3つのディレクトリがある。
### `bin/`
mainパッケージをビルドしたバイナリーファイルが格納される。コマンドとして実行できる。
(mainパッケージはビルドするとコマンドになる!!コマンド=実行可能なファイル)### `src/`
Goのソースコードが格納される。かつてはこのディレクトリ以下で開発する必要があった。GitHubからダウンロードしたライブラリもかつてはここに配置されていた。
### `pkg/`
ダウンロードしたパッケージのソースコード(ビルド前)が格納されるディレクトリ。コマンド以外(つまりmain pacakge以外)のビルド済のバイナリーファイルが置かれる場所でもある。mainパッケージ以外の名前のパッケージをビルドすると`hoge.
Go の気になったコミット (2021 年 12 月)
[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。
前回作成したリストはこちら。
https://qiita.com/sg0hsmt/items/c3c3523e4f0fe6b69320
軽く説明を追加していますが勘違いや誤りがあるかもしれません。
## Topic
https://go.dev/blog/go1.18beta1
– Go 1.18 Beta 1 がリリースされました。 :rocket:
## Commits
### 2021-12-02
https://github.com/golang/go/commit/08ecdf7c2e9e9ecc4e2d7c6d9438faeed2338140
弱いメモリ一貫性モデル (メモリ参照命令が任意に並び変えられる) のアーキテクチャで実行した場合に GC が nil アクセスする不具合が修正されています。
関連 Issue を見ると以前から CI で発生していたようです。 [^1] [
カフェでプログラミングしてる風(でも何もやってない)Go(クソ)コード
# 概要
[こちら](https://qiita.com/3S_Laboo/items/660883a0184dabaea65b “こちら”)と[こちら](https://qiita.com/YottyPG/items/e988ebacab94a8f4645f “こちら”)の記事を拝見し、学び始めの言語を使うにはちょうど良さそうだと思ったので、Goで作ってみました。# 見た目
こんな感じで、ただただ何かをダウンロードしているだけの人間になります。
数秒程度であれば周りの目を誤魔化せるはず、、、、
![go_cofe.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521898/1f1f4d8b-dbef-8306-4a35-2402921fc003.gif)# 実装
“`go
package installsimport (
“fmt”
“math/rand”
“time”
)func PrintInstall() {
// 時刻からランダムなシード値を設定
rand.S
S3にCSVファイルをアップロードしたらDynamoDBに書き込んでくれるLambdaをGolang1.xで書いてSAMでデプロイする
GoでLambdaを書いてる記事が意外と少なかったので、備忘録を兼ねてさくっとまとめます。
ハマりどころもメモ程度にいくつか併記したので、別途ググってみてください。完成したコードは最後にあります。
また、DynamoDBのテーブルは「アプリ内のお知らせ機能で新しいお知らせを打つために、データのCSVをバッチ処理でDynamoDBに書き込む」という目的でつくったものです。
後半でそんな感じの記述が出てきますので、それぞれの用途に応じてよしなに読み替え書き換えてください。# 諸々のバージョン
“`:go.mod
module hogego 1.16
require (
github.com/aws/aws-lambda-go v1.27.1
github.com/aws/aws-sdk-go v1.42.25
)
“`Goは1.16である必要はなく、動かしたいものが動くバージョンであればOKです。
aws-sdk-goのREADMEには「Go1.5で`go get`するならちょっと注意が必要だよ」みたいな注意書きがあるので、少なくとも1.5以上なら動くのでしょう
【Go】http.Client に独自ルート証明書を追加する
次のようなコードになります。
実行するディレクトリに独自ルート証明書ファイルとして `my-cacert.pem` があることを想定しています。“`go
package mainimport (
“crypto/tls”
“crypto/x509”
“fmt”
“log”
“net/http”
“os”
)func main() {
pem, err := os.ReadFile(“my-cacert.pem”)
if err != nil {
log.Fatal(err)
}caCertPool, err := x509.SystemCertPool()
if err != nil {
log.Fatal(err)
}if !caCertPool.AppendCertsFromPEM(pem) {
log.Fatal(“failed to add ca cert”)
}defaultTransport, ok := http.DefaultTransport.(*http.Transport)
if !ok {
Go Modulesの使い方
## v2以上のバージョンを持つライブラリのimport
[golang/goのWiki](https://github.com/golang/go/wiki/Modules#semantic-import-versioning) に書いてある通り、v2以上ではモジュールのパスに `/vN` をいれる必要がある。これを読むだけだとわかりにくいのだが、具体的には、importする際に `import “github.com/k0kubun/pp”` のかわりに“`go
import (
pp “github.com/k0kubun/pp/v3”
)
“`とする必要がある。`/v3` なしで書くとgo.mod内で `v3.0.1+incompatible` とかになってしまう。
k0kubun/ppのリポジトリがディレクトリをv3で開始していたり、ブランチにv3を持っていたりといったことをする必要はない。
## go mod tidy
“`bash
go mod tidy
“`をやるとgo.modがいい感じになる。使わなくなったものを消したい時などに使うと
Go のジェネリクスを使って map と filter を実装してみた
C# の LINQ、JS の map, filter など、多くのプログラミング言語には一般的なコレクション操作が提供されています。
一方、Go にはそういった機能・ライブラリはありません。しかし、Go1.18 で導入されるジェネリクスを使えばこういった一般的なコレクション操作を実装できるのでは?### やってみた
`myMap` と `myFilter` を実装してみました。“`go
package mainimport “fmt”
func myMap[T1, T2 any](s []T1, f func(T1) T2) []T2 {
var ret []T2
for _, v := range s {
ret = append(ret, f(v))
}
return ret
}func myFilter[T any](s []T, f func(T) bool) []T {
var ret []T
for _, v := range s {
if f(v) {
ret = append(ret, v)
}
}
return r
【GO】base64形式で受け取った画像をGCSにアップロードする
# はじめに
画像をGCSアップロードする際、画像をフロント側から
1. **「multipart/form-data」**で受けとる記事は多くはあったのですが、
2. **「Base64(json)」**で受け取るものが見当たらなかったので、こちらを実装してみました。:relieved:### 本記事のゴール
「**GO**を使って、フロント側から**base64**で受け取った画像をGCSにアップロードすること」### 動作環境
go 1.17# 目次
– [準備](#準備)
– [ソースコード](#ソースコード)
– [解説](#解説)
– [補足](#補足)
– [参考サイト](#参考サイト)# 準備
### jsonKeyの取得
取得した~~~.jsonをルート直下に配置します。(どこでも良いです)“`markdown
main.go
gstorage.go
~~~.json
“`細かい取得手順は割愛します。自分は以下記事を参考にさせていただきました:slight_smile:
[Google Cloud Storageの接続設定](https:
Exercise: Loops and Functions
## 概要
Goのチュートリアル「A Tour of Go」で、[関数とループを使って平方根の計算を実装する課題](https://go-tour-jp.appspot.com/flowcontrol/8)があったので記念に記録します。 時間的には5分程で解きました。「強い」エンジニアの」方々からしたら亀の歩みですね。
## 初期コード
“`exercise-loops-and-functions.go
package mainimport (
“fmt”
)func Sqrt(x float64) float64 {
}func main() {
fmt.Println(Sqrt(2))
}“`
## 完成コード
“`exercise-loops-and-functions.go
package mainimport (
“fmt”
“math”
)func Sqrt(x float64) float64 {
z := 1.0for i := 1; i <= 10; i++ { z -= (z*z - x) / (2
IntelliJ Go Pluginを設定する
IntelliJ Go Pluginは起動直後はまともに動かないので設定が必要。
## GOROOT
* Languages & Frameworks > Go > GOROOTGoがインストールされたprefixをいれる。macOSだと `/usr/local/opt/go/libexec` が自動的に指定されるのでそれをセットする。
## GOPATH
* Languages & Frameworks > Go > GOPATHGOPATHをいれる。僕はGOPATHはHOMEなので `$HOME` にあたるパスをセットする。
Go Modulesを使っている場合は「Index entire GOPATH」のチェックは外しておいた方がいいらしい。## Go Modules
* Languages & Frameworks > Go > Go Modulesgo.mod を使っているリポジトリでインデックスが動くようにするには、Enable Go modules integrationにチェックをいれる。Environmentは空のままでも動く。
自分用GoでAPIを作る前に作るHttpClientラッパー
Go で API を作るときは実際にサーバを起動して HTTP で叩くテストを作りたいので HTTP で叩くのを簡単にする自分用ツール。認証を回避できない環境で Swagger とか POSTMAN を手作業でAuth通して叩くのは面倒なので Go Test 上で認証して叩くことができる。おまけでレスポンスの Unmarshalもできる。[GitHubはここ](https://github.com/turanukimaru/knocker)。
いつでもAPIが叩けると精神衛生上良いし、フロントからエラー報告が来た時もすぐ検証ができる。
GitHub にアクセスできない仕事場が稀に良く有るので貼り付けさせてください。使い方
“`Go
// ここまで省略。 Server を起動しておいてから以下を実行するテストコードを書く。
// サーバー接続情報を作る
k := Knocker{“127.0.0.1”, 8080, “”}
// シンプルな Get ただし認証が通らない。b は res.Body の文字列
t.Run(“Required authorization toke
Go 言語スプレッドシートライブラリ:Excelize 2.5.0 がリリースされました
![Go 言語スプレッドシートライブラリ:Excelize 2.5.0 がリリースされました](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144042/37b9bc8f-77d5-70d4-3eaa-d34086abc3e7.png)
[Excelize](https://github.com/xuri/excelize) は、純粋な Go で記述されたライブラリで、XLSX / XLSM / XLTM ファイルの読み書きを可能にする一連の関数を提供します。Microsoft Excel™ 2007 以降で生成されたスプレッドシートドキュメントの読み取りと書き込みをサポートします。 高い互換性により複雑なコンポーネントをサポートし、大量のデータを含むワークシートからデータを生成または読み取るためのストリーミング API を提供します。
場合によっては、既存の Excel ドキュメントコンテンツの読み込み、新しい Excel ドキュメントの作成、既存のドキュメント(テンプレート)に基づく新しい
Microsoft Docs「Go でサーバーレス アプリを構築する」の補足情報
# はじめに
Microsoft Docsの「[Go でサーバーレス アプリを構築する](https://docs.microsoft.com/ja-jp/learn/modules/serverless-go/)」を使ってGo入門ハンズオンを開催しようとしているのですが、誤植があったり情報が足りなかったりと、このまま使用するのは難しいため、補足情報を用意しました。
動作確認はmacOSで行いましたが、WindowsとLinuxでも大丈夫なように記述しています。
ローカル環境で動作させる分には、2021年11月以降の各製品のバージョンに対応できています。
– [Azure Functions 4.0 and .NET 6 support are now generally available – Microsoft Tech Community](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/azure-functions-4-0-and-net-6-support-are-now-generally/ba-
emacs+eglotでgoplsのロードが重い問題に対処した
単純なのだが、引っかかったためメモとして残す
# 1. 問題
– emacsでLanguage Server Protocolクライアントであるeglotを使用し、Go言語のserverとしてgoplsを使用した
– 設定した状態のemacsで`.go`ファイルを開くと、ものすごく重い以下のようなエラーがでてくる
“`
Error in menu-bar-update-hook (imenu-update-menubar): (jsonrpc-error “request id=2 failed:” (jsonrpc-error-message . “Timed out”))
“`# 2. 原因
eglotがプロジェクトルートを正しく探すことができていなかった。今回の場合はこのようなメッセージがでていた。“`
[eglot] Connected! Server `gopls’ now managing `go-mode’ buffers in project `~’.
“`ホームフォルダ直下を全て探しにいっていたため、時間がかかっていた。
# 3. 解