- 1. Goのshadowingでハマる前にVSCodeの設定を見直すべし
- 2. GoでMarkdownからExcel試験書を作成するソフトを作った
- 3. Go言語製Let’s Encryptクライアントlegoをライブラリとして使う
- 4. ubuntuでgo関連のパッケージをインストールした時のメモ
- 5. Go 言語スプレッドシートライブラリ:Excelize 2.6.0 がリリースされました
- 6. Go言語 パッケージ
- 7. goで実装した関数をpythonから呼び出す
- 8. M1MacでGo/Ginの環境を作った過程
- 9. Lambda function URLsをTerraformでお手軽構築する
- 10. 【Go】forループのrangeで要素を更新したいとき、2つ目の変数は使えない
- 11. Go言語のキャラクター「Gopherくん」が可愛いので、GO言語始めてみる
- 12. 【Go】DTOの使い方メモ
- 13. goquery & chrome driver
- 14. Golangはじめて物語(第11話: Gin+time/rateでお手軽に流量制御を行う)
- 15. 【Go】sqlxの使い方メモ
- 16. Go言語 エラー処理
- 17. Container-Optimized OS用にコマンドを定期実行するコンテナを作ってみた
- 18. 【Go】ロギングライブラリzapの使い方メモ
- 19. Goのcontext実装にお手本のようなDouble-Checked Lockingが利用されていた話
- 20. GolangでPKI入門 – 6
Goのshadowingでハマる前にVSCodeの設定を見直すべし
# GoにおけるShadowとは?
こちらの記事に詳しいですが、要は**変数の再定義**のことです。
予期せぬバグの温床になるので気をつけましょう。https://yourbasic.org/golang/gotcha-shadowing-variables/
`go vet –shadow GO_FILE`
で検知できるのですが、IDEでリアルタイムに検知したいところですよね。というわけで以下です。
# VSCodeで–shadow機能を有効化する
UserでもWorkspaceでもどちらでも良いので、`settings.json` に以下を追記しておきましょう。
“`json
{
“gopls”: {
“analyses”: {
“shadow”: true
}
}
}
“`# Golandで–shadow機能を有効化する
この方の記事に詳しいです。
https://zenn.dev/uuusu/articles/6554631b4c08ba
GoでMarkdownからExcel試験書を作成するソフトを作った
## 入力

[このmd文書](https://github.com/botanic7arc/markdown2excel/blob/master/src/test.md)を入力すると
## 出力

こうなります。(横が入りきらなかったため、縮小して表示しています)
## ソース
https://github.com/botanic7arc/markdown2excel/tree/master/src
##
Go言語製Let’s Encryptクライアントlegoをライブラリとして使う
ピリカではほとんどのサービスでGCPやAWSが発行するHTTPS証明書を使っていますが、見える化ページと呼ばれる、自治体や企業など、一定の範囲内でのごみ拾い活動を集約しているサービスで使っているワイルドカード証明書はLet’s Encryptで発行しています。
Let’s Encryptで証明書発行するためのクライアントとしては標準のcertbotの他にもいろいろなものがあります。
個人的に、[lego](https://github.com/go-acme/lego)を気に入って使っています。お気に入りポイントはこんな感じです。– Go言語で作られていて、Pythonの言語環境に依存せずに使える
– いろいろなDNSサービスに対応している
– コマンドラインがcertbotよりもわかりやすいコマンドとしてずっと使っていて、このコマンドを内部的に使用する形で証明書を自動更新をするCloud Runを作ろうとしていたのですが、改めてリファレンスを読んでいたところ[ライブラリとしても運用できる](https://go-acme.github.io/lego/usage/libra
ubuntuでgo関連のパッケージをインストールした時のメモ
## やりたかったこと
こちらのパッケージをubuntuのサーバーに入れようとしたhttps://github.com/prasmussen/gdrive
README.mdには、ソースからのインストールは下記のコマンドでやろうということだった
“`
go get github.com/prasmussen/gdrive
“`そうかgoがいるのか、と思いapt-getでgoをインストールした後に`go get`のコマンドを実行しようとしたらハマったのでメモ。
### 間違えた手順と発生したエラー
“`bash
sudo apt-get golang
go get github.com/prasmussen/gdrive
“`
でインストールしようとしたところ、`go get`のところでこんなエラーが
“`
package context: unrecognized import path “context” (import path does not begin with hostname)
“`どうやらバージョン問題っぽい。apt-getで入れると古い
Go 言語スプレッドシートライブラリ:Excelize 2.6.0 がリリースされました

Excelize は、純粋な Go で記述されたライブラリで、XLAM / XLSM / XLSX / XLTM / XLTX ファイルの読み書きを可能にする一連の関数を提供します。Microsoft Excel™ 2007 以降で生成されたスプレッドシートドキュメントの読み取りと書き込みをサポートします。 高い互換性により複雑なコンポーネントをサポートし、大量のデータを含むワークシートからデータを生成または読み取るためのストリーミング API を提供します。
場合によっては、既存の Excel ドキュメントコンテンツの読み込み、新しい Excel ドキュメントの作成、既存のドキュメント(テンプレート)に基づく新しい Excel ドキュメントの生成、Excel
Go言語 パッケージ
## Package
Goのプログラムは、全て何らかのパッケージに属する。
Importによって指定することにより、対象のパッケージが使用できるようになる。
また、1つのパッケージ内で、複数のソースコードファイルを使用してプログラムを定義できる。
変数や関数の頭文字を大文字にすれば、他のパッケージから参照出来るようになる。## Code
“`Go
package mainimport (
“fmt”
“./calculation”
)// Main function
func main() {// Calculation with functions in the calculation package
add := calculation.CalcAdd(10, 5)
sub := calculation.CalcSub(10, 5)
multi := calculation.CalcMulti(10, 5)
div := calculation.CalcDiv(10, 5)// Output Value
fmt.Printf(“A
goで実装した関数をpythonから呼び出す
# やりたいこと
下図のようにGoで記述した関数をPythonから呼び出します。
まずはGoプログラムをビルドして共有ライブラリ(※)を作成し、ビルドした共有ライブラリをPythonから呼び出します。
※ Linuxだと共有ライブラリ`.so`、Windowsだとダイナミックライブラリ`.dll`。
# 1. 共有ライブラリを作成
まずはGoでスクリプトを記述します。
記述する上でのポイントは以下です。– package名はmainにする
– main関数を記述する
– 特殊コメントの`export`を記述する“`go:test.go
// package名はmainにする
package mainimport (
“fmt”
“C”
)func main() {
// main関数を記述
}
M1MacでGo/Ginの環境を作った過程
# はじめに
もともとWindowsユーザーだったけど、2022年01月からM1Macに変えました。
ただでさえ新しいガジェット(Mac)なのに、最新チップ(M1)でやったことない言語(Go)のさっき知ったフレームワーク(Gin)の環境を準備しようとしているんだから大変に決まってるよね。
だって記事がないんだもの。そして、この記事はただの記録用です。
自分がこの後沼にハマる(確信)時に何をしたかを覚えておくためです。**だからこの記事正しくないと思うよ!**
## 諸々のバージョン
Go: 1.18
OS: MacOS
チップ: M1## Goのダウンロード&インストール
(やめればいいのに)最新verをインストールしました。
**go1.18.darwin-arm64.pkg**
です。
– ServerとProxyのLambdaそれぞれにfunction URLsを設定する
【Go】forループのrangeで要素を更新したいとき、2つ目の変数は使えない
# 概要
`range` が返す変数の仕様で躓いたので、備忘録として残しておきます。
(下記でいう`k`, `v`)“`go
package mainimport “fmt”
func main() {
foo := map[string]string{“key”: “value”}
for k, v := range foo {
fmt.Printf(“foo[%v]: %v”, k, v)
}
}// => foo[key]: value
“`
# 詳細
## 結論
`range` を使うときは以下の方針で書くのがいいと思います。
– 要素を値を更新したい ⇒ 1つ目の変数を使う
– 要素を更新したくない ⇒ 2つ目の変数を使う理由は、
– 1つ目の変数は配列, mapのindex, keyであり、この値を使えばループしている配列, mapの要素の実体を指定できる
– 2つ目の変数は1つ目の変数で返されたindex, keyで示される値の**コピー**である(値渡しである)というGoの仕様があるからです。つまり、2つ目の引数に再代入
Go言語のキャラクター「Gopherくん」が可愛いので、GO言語始めてみる
タイトルのとおりで、GO言語のマスコットキャラクターであるGopherくんが可愛いのでGO言語始めてみよう思います。
https://go.dev/
# Go言語とは
Googleが作ったWeb系の言語程度の前知識しかありませんでしたので、ちょっと調べてみました。
**以下、全部Wiki調べです。**1. 静的型付け、C言語の伝統に則ったコンパイル言語、メモリ安全性、ガベージコレクション、構造的型付け、CSPスタイルの並行性などの特徴を持つ
2. Goのコンパイラ、ツール、およびソースコードは、すべてフリーかつオープンソースである
3. Pythonのような動的型付け言語のようなプログラミングの容易性、などの特徴もある
4. Go処理系としてはコンパイラのみが開発されている
5. **マスコット・キャラクターはGopher(ホリネズミ)**コンパイル言語ということもあり、C言語やJavaに文法は近いらしいです。
**C言語で意識しなければいけないメモリリークなどはガベージコレクションでサポートして、Javaで言うVMは用いないため高速実行が可能**という素敵な言語みたいで
【Go】DTOの使い方メモ
# はじめに
GoでDTOを使用する方法についてメモ。
以前、NestJSでバリデーションを行ったときにもDTOを利用したので、興味がある方はこちらもご覧ください。https://qiita.com/suzuki0430/items/894e2da2b44156a2a437
# DTOとは
ドメイン層をインフラ層(DB)から分離したいときに使います。
例えば、以下のようなモデルが定義されているとします。
このとき、DBで`status = “0” or “1”`が管理されているとしても、DTOを使用すれば、ドメイン側では`Status = “active” or “inactive”`などに変換して取り扱うことができます。“`go:domain/customer.go
type Customer struct {
Id string
Name string
City string
Zipcode string
DateofBirth string
Status string
}
“`また、ドメインモデルの中にインフラ層のタグが入らないようにする
goquery & chrome driver
https://worklog.be/archives/3422
https://jpdebug.com/p/2334398
https://sites.google.com/chromium.org/driver/
https://chromedriver.chromium.org/downloads
https://qiita.com/libra_lt/items/b1e3ba2c9fc33a23951d
https://qiita.com/isao_e_dev/items/3a0f4e881fc7142ef489
https://gosamples.dev/string-padding/
Golangはじめて物語(第11話: Gin+time/rateでお手軽に流量制御を行う)
# はじめに
[以前書いたSpringBoot編](https://qiita.com/neruneruo/items/37f0a0181b291eb6ffbd)で触れたとおり、マイクロサービスなシステムを作っていく上で、RateLimitは重要な要素になってくる。
Golangでは標準ライブラリでRateLimitが実装できるものが容易されているので、今回はそれをGinに組み込んで、お手軽に流量制御をやってみよう。なお、記事執筆時点でGolangのランタイムは1.13を使っている。
# RateLimitライブラリ
RateLimitを行うライブラリは、[公式ドキュメント](https://pkg.go.dev/golang.org/x/time/rate)を参考にしよう。
このライブラリは、[トークンバケットアルゴリズム](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%83%90%E3%82%B1%E3%83%83%E3%83%88)を用いているので、まずはこの基本を押さえておこう。
【Go】sqlxの使い方メモ
# はじめに
sqlxというライブラリを使ってみたのでメモ。# sqlxとは
標準ライブラリ`database/sql`の拡張ライブラリです。
`database/sql`では、DBからとってきたデータをカラムごとにScan(型変換)して構造体にマッピングする必要があるのですが、カラム数が多いとこの部分の記述が非常に苦痛です。
この面倒な作業を勝手にやってくれたりするのが`sqlx`の役割です。https://github.com/jmoiron/sqlx
↓`database/sql`を使った場合のScan処理の例
“`go:customerRepositoryDb.go
type CustomerRepositoryDb struct {
client *sql.DB
}func (d CustomerRepositoryDb) FindAll() ([]Customer, error) {
findAllSql := “select customer_id, name, city, zipcode, date_of_birth, status from cu
Go言語 エラー処理
## エラー処理
Goにおけるエラー処理は、関数の多値返しにて実現する。
関数は処理結果とエラー値を返し、エラー値を確認することにより異常処理の場合を見分ける。
正常処理の場合は、エラー値はnil(Null)である。
異常が起こった場合は、エラー値の中にエラー情報が格納されている。## Code
“`Go
// 割り算を行う関数
func calcDiv(molec int, denomi int) (result int, err error) {
result = molec / denomi
return result, err
}func main() {
// 正常に計算される割り算
result1, err := calcDiv(128, 4)
if err != nil { // 正常処理の場合は、errに値が格納されない
log.Fatal(err)
}
fmt.Printf(“Answer : %d \n”, result1)// エラーが発生する0による割り算
result2, err := calcDiv(128, 0)
i
Container-Optimized OS用にコマンドを定期実行するコンテナを作ってみた
突然ですが、 GCE の Container-Optimized OS で、定期実行がしたいです。より具体的には、**定期的に Let’s Encrypt の certbot が動かしたい**のです。
調べたところ、
* (アプリケーションサーバとか)使う連中のどこかに cron をインストールして一緒に動かす
* cron をインストールしたコンテナを作ってがんばる
* tasker コンテナを使うみたいなのが出てきます。一番上はちょっと…と思い、他二つをがんばってみましたが、**なんでか苦労する**のですよね。**たかが定期実行したいだけなのに…**。
だったら雑に、無限ループで `sleep` とコマンド実行をし続けるプログラムを書いちゃうほうが楽じゃないか、と思いました。
# 要件
* Docker コンテナを使って任意のコマンドを定期実行したい
* cron のように「何時何分に実行したい」のではなく、**概ね一定間隔で実行されていれば厳密性は問わない**全く何も考えずに書くとつまりこういうことがしたい。
“`go:runner.go
packa
【Go】ロギングライブラリzapの使い方メモ
# はじめに
Goのロギングライブラリであるzapに関するメモです。# zapとは
構造化メッセージを自由に構築できる、高速なロギングライブラリです。
ベンチマークによると、標準ライブラリ(fmt, encoding/json)やlogrusより高速とのことです。https://github.com/uber-go/zap#performance
# 実装
以下が初期化のプログラムです。“`go:logger.go
package loggerimport (
“go.uber.org/zap”
“go.uber.org/zap/zapcore”
)var log *zap.Logger
func init() {
var err errorconfig := zap.NewProductionConfig()
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.TimeKey = “timestamp”
encoderConfig.EncodeTime = zap
Goのcontext実装にお手本のようなDouble-Checked Lockingが利用されていた話
# `cancelCtx.done`の型変更
Goの標準ライブラリを読んだことがある人ならば、`context`パッケージを読んだことがある人が多いのではないだろうか。自分もその一人で、`context.Context`の機能自体が好きなのもあるが、`context`パッケージの実装はGoらしさが詰まっていて、十分短い(600秒未満)のでサクッと読めてとても参考になる。
過去3回ほど読み直しているが久しぶりに読み直してみたら、「おっ」と思うような修正が入っていた。
以下の一年前のパッチである。
https://github.com/golang/go/commit/ae1fa08e4138c49c8e7fa10c3eadbfca0233842b下がdiffの一部であるが、`cancelCtx.done`の型が `chan struct{}`から`atomic.Value`に変更されているではないか。
 を扱いたい人
– Golang で DN (Subject や Issuer) を扱う[ライブラリ](https://github.com/tardevnull/dnutil)を探している人# 2.DNとは
DN(Distinguished Name) は X.500 と X.501 で定義されたディレクトリサービスモデルにおいて、そのオブジェクトを一意に識別するための識別名です。X.509 PKI は、ディレクトリサービスモデルを採用しているので、そのオブジェクトの一つである 主体者(Subject)や発行者(Issuer) も、DN によって表現されます。ディレクトリでは、オブジェクトはオブジェクトクラスに基づきエントリとして表現されます。ディレクトリはエントリによるツリー構造で構成され、このツリーは DIT (Directory Information Tree)と呼ばれます。エントリはクラスに基づき複数の属性をもち、属性は属性型と属性値をもちます。このエントリを DIT 内の同一階