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

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

Container-Optimized OS用にコマンドを定期実行するコンテナを作ってみた

突然ですが、 GCE の Container-Optimized OS で、定期実行がしたいです。より具体的には、**定期的に Let’s Encrypt の certbot が動かしたい**のです。

調べたところ、

* (アプリケーションサーバとか)使う連中のどこかに cron をインストールして一緒に動かす
* 適当なコンテナに cron をインストールしてがんばる
* tasker コンテナを使う

みたいなのが出てきます。一番上はちょっと…と思い、他二つをがんばってみましたが、**なんでか苦労する**のですよね。**たかが定期実行したいだけなのに…**。

だったら雑に、無限ループで `sleep` とコマンド実行をし続けるプログラムを書いちゃうほうが楽じゃないか、と思いました。

# 要件

* Docker コンテナを使って任意のコマンドを定期実行したい
* cron のように「何時何分に実行したい」のではなく、**概ね一定間隔で実行されていれば厳密性は問わない**

全く何も考えずに書くとつまりこういうことがしたい。

“`go:runner.go
pack

元記事を表示

【Go】ロギングライブラリzapの使い方メモ

# はじめに
Goのロギングライブラリであるzapに関するメモです。

# zapとは
構造化メッセージを自由に構築できる、高速なロギングライブラリです。
ベンチマークによると、標準ライブラリ(fmt, encoding/json)やlogrusより高速とのことです。

https://github.com/uber-go/zap#performance

# 実装
以下が初期化のプログラムです。

“`go:logger.go
package logger

import (
“go.uber.org/zap”
“go.uber.org/zap/zapcore”
)

var log *zap.Logger

func init() {
var err error

config := 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`に変更されているではないか。

![スクリーンショット 2022-04-09 0.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazona

元記事を表示

GolangでPKI入門 – 6

# 1.この記事の対象の人
– Golang で DN (Subject や Issuer) を扱いたい人
– 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 内の同一階

元記事を表示

paizaの練習問題でを活用してGoのUnitテストを書いてみた

## 単体テストのやり方のイメージが湧かない
これまで業務でperlを使っていたこともあってテストを手動、かつブラウザの画面上から手動で行なっていたため
Goを導入してからローカルでかつ自動でテストを行うパッケージが標準で用意されていると知っても
– 「どのように使えばいいか」
– 「どういう時に使用するのか」

といったイメージが全く湧かない状態でした。

ともあれ、使ってみなければ一生理解できることなどない!ということでtestingパッケージをまずは使ってみようと考えていたところ、paizaの問題の全部または一部をtestingパッケージでテストしてみることを思いつきました。

初めて自動で単体テストをやる人の足掛かりになれば幸いです。

## 事前のインプット
[みんなのGo言語](https://gihyo.jp/book/2019/978-4-297-10727-7)という書籍を読みました。
Go界隈で有名な人が共著で出版していて、業務で必要なGoの基礎知識が書かれた本で、
テストについてもこの書籍の第6章で取り上げられていました。
章単位で取り上げるほどテストが重要項目

元記事を表示

Go言語 メソッド

## Method
任意の型に特化した関数を、定義する仕組み。
通常の関数と異なる点は、メソッド名の前にレシーバーが必要になること。

## Code
“`Go
// 映画タイトルのための構造体
type Movie struct {
Directer string
Title string
Year int
}

// 映画情報を出力するメソッド
func (m *Movie) infoMovie() {
// レシーバーの変数を介して、値を出力
fmt.Printf(“Title : %s, Directer : %s, Year : %d \n”, m.Title, m.Directer, m.Year)
}

// メイン関数
func main() {

// 映画情報を格納
movie1 := &Movie{
Directer: “Steven Spielberg”,
Title: “Saving Private Ryan”,
Year: 1998,
}

// infoMovieメソッドの呼び出し
movie1.infoMo

元記事を表示

Goのポインタに関して図を用いて説明する

## 初めに
Goのポインタを理解するのに苦戦したため、基本的な内容を自分なりにかみ砕いて投稿する。

■ 実行環境
[The Go Playground](https://go.dev/play/)
■ GOのバージョン
1.18

## 前提情報の整理
### 用語
– メインメモリ(主記憶装置)・・・コンピュータのデータ記憶領域。
– メモリアドレス・・・各メモリに割り振られるメモリのアドレス。
– ポインタ(ポインタ変数)・・・メモリアドレスとその領域の型を格納する変数。
– ポインタ型・・・ポインタの型。(Int型へのポインタ型、string型へのポイント型など)

※ポインタとポインタ変数に関しては、記事によって表現にブレがあるため、必ずしも今回の定義であるとは限らない。

### ポインタは何を実現するものか
メモリアドレスを使用して、メモリにアクセスする手段である。
### なぜポインタに型が必要なのか
型によって必要なバイト数が異なるため。

### 変数とメモリ
コンピュータは、変数が定義された際にメインメモリに変数を格納する。
※本来データ型によって使用する

元記事を表示

goenvとさよならして、goのバージョンを使い分ける

![macOS-12.3.1](https://img.shields.io/badge/macOS-12.3.1-brightgreen) ![go-1.18](https://img.shields.io/badge/go-1.18-brightgreen)

公式からGoの複数バージョンの取り扱い方が発表されていたので、goenvとさよならして公式の方法で運用することにしました。
goenvのアンインストールと複数バージョンのGoの扱い方について公式を引用しつつ記載します。

## goenvのアンインストール方法

アンインストール方法は、goenvのgithubに記載があります。
https://github.com/syndbg/goenv/blob/master/INSTALL.md#uninstalling-goenv

まずは、自分のローカルマシンに設定している環境変数の設定を削除します。
私の場合は.zshrcに記載している以下の3行(コメント入れて4行)を削除しました。

“`zsh
# for goenv
export GOENV_ROOT=”$HOME/.g

元記事を表示

Go言語 構造体

## 構造体
構造体とは、複数の任意の型を、1つの要素にまとめたもの。
さまざまなデータ構造を、1つの「型」として扱うことが可能。

## Code
“`Go
// 監督名のための共通化用構造体
type Directer struct {
Name string
Country string
}

// 映画タイトルのための構造体
type Movie struct {
Directer
Title string
Year int
}

// 受賞タイトルのための構造体
type Prise struct {
Directer
Title string
Year int
}

// メイン関数
func main() {

// スティーブン・スピルバーグ
movie1 := Movie{
Directer: Directer{“Steven Spielberg”, “USA”},
Title: “Saving Private Ryan”,
Year: 1998,
}
prise1 := Prise{
Dir

元記事を表示

Go の気になったコミット (2022 年 3 月)

[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。
タイトルに 2022 年 3 月と銘打っていますが 2 月のコミットも含まれています。

前回作成したリストはこちら。

https://qiita.com/sg0hsmt/items/f726dc783f4382897d47

軽く説明を追加していますが勘違いや誤りがあるかもしれません。

## Topic

https://go.dev/blog/go1.18

– Go 1.18 がリリースされました。 :rocket:
– Go 1.19 の開発がスタートしました。 :rocket:

## Commits

### 2022-02-10

https://github.com/golang/go/commit/9cec77ac11b012283e654b423cf85cf9976bedd9

Go 1.18 で追加される `debug.BuildInfo` が提供する関数が変更されました。

htt

元記事を表示

Go言語 ゴルーチン

## ゴルーチン
ゴールーチンと呼ばれる、スレッドを用いて並行処理を行う機能。
関数に「go」を付加することで、その関数は並行的に処理される。

## Code
“`Go
// 素数をチェックする関数
func checkPrime(number int) bool {
isPrime := true
if number == 0 || number == 1 {
return false
} else {
for i := 2; i <= number/2; i++ { if number%i == 0 { isPrime = false break } } if isPrime == true { return true } } return false } // 素数を生成する関数 func primeRoutine1() { i := 0 for { i += 1 if checkPrime(i) { fmt.Printf("PrimeRoutine1 ☆ : %d\n", i) } }

元記事を表示

初心者がGoを学ぶときに気になったことメモ

最近のはやりに乗って、GoとBlockchainの両方をこの動画(シリコンバレーエンジニアの酒井潤さんの「現役シリコンバレーエンジニアが教えるGoで始めるスクラッチからのブロックチェーン開発入門」https://www.udemy.com/course/go-blockchain/
)を見て勉強し始め、ここ最近終了したところなのだが、なんせbackendもblockchainもまるで初心者なもので、この動画を通してGOの理解しにくかった部分を自分なりにかみくだいてアウトプットしていこうと思う。僕のようにバックエンド完全初心者の手助けになれば幸いです

# MarshalJsonって何?

MarshalJsonというのは、構造体→JSON形式に変換することらしい。
(逆にUnMarshalJsonというのは、JSON形式→構造体に変換すること)

しかし、この講座をみていると、少し不思議な書き方をしていた。

“`golang:blockchain.go
type Block struct {
timestamp int64
nonce int
prev

元記事を表示

【Go】XORMでOracle Databaseに接続する

## 概要
GolangのO/Rマッパーで、Oracle Databaseへの接続できるものがないか探してみたところ、[XORM](https://xorm.io/)というライブラリに行き着きました。[こちら](https://gobook.io/read/gitea.com/xorm/manual-en-US/)のドキュメントにある通り、Oracleのドライバー対応は2022年4月現在はexperimentの状態ですが、使えなくもないだろうということで少し試してみました。

## 前提
[mattn/go-oci8](https://github.com/mattn/go-oci8)のセッティングを事前に行なってください。[【Oracle】Mac環境でmattn/go-oci8のライブラリをインストール時「oci.h: No such file or directory」が発生](https://qiita.com/someone7140/items/47bc754040374e2c5c8f)の記事も、参考になるかと思います。

## 実装サンプル(接続部分)
DBの接続部分(エンジ

元記事を表示

GithubActionsとAWS App Runnerで自動デプロイしてみた

## はじめに
最近参加したwebinerにて、AWS App Runnerというものを知ったため触ってみました。

https://aws.amazon.com/jp/apprunner/

簡潔にいうと、
>コンテナ化されたウェブアプリケーションや API を開発者が簡単かつ迅速にデプロイできるフルマネージド型サービスです

とのことです。
GitHubのソースコードをApp Runner上でビルド&デプロイ、またはECRのビルド済みコンテナイメージがデプロイできます。

webinerではGitHubのソースコードからデプロイを行うデモをしており、同じような手順で試したところ、確かにあっさりとサービスが立ち上がりました。
記事にするほどでもないくらいサクッとできてしまったため、折角なので今回はECRのイメージからのデプロイをやってみました。
また、前々からGithubActionsを触ってみたいと思っており、うまく連携させられるみたいだったため取り入れてみます。

## GitHub Actionsとは
https://docs.github.com/ja/actions/lea

元記事を表示

Go言語 マップ

## マップ
連想配列に類するデータ構造。
任意のキーと、任意の値を保持することが出来る。

## Code
“`Go
func main() {
// マップの生成
abcMap := make(map[int]string)
fmt.Println(abcMap)

// 値の代入
abcMap[1] = “A”
abcMap[2] = “B”
abcMap[3] = “C”
fmt.Println(abcMap)

// リテラルを用いた生成
abcdeMap := map[int]string{1:”A”, 2:”B”, 3:”C”, 4:”D”, 5:”E”}
fmt.Println(abcdeMap)

// 要素の参照
fmt.Println(abcdeMap[1])
fmt.Println(abcdeMap[5])

// 要素数
fmt.Println(len(abcMap))

// 要素の削除
delete(abcMap, 2)
fmt.Println(abcMap)

// forによる出力
for i, m := r

元記事を表示

Go言語 スライス

## スライス
可変長配列を表す型。
配列と違い、スライスは要素の追加が出来る。

## Code
“`Go
func main() {
// スライスの生成
tenSlice := make([]int, 10)
fmt.Println(tenSlice)

// 要素への代入
tenSlice[0] = 123
tenSlice[3] = 456
tenSlice[6] = 789
fmt.Println(tenSlice)

// 値の参照
fmt.Println(tenSlice[0])
fmt.Println(tenSlice[1])

// スライスの要素数
fmt.Println(len(tenSlice))

// スライスの容量
fmt.Println(cap(tenSlice))

// 簡易スライス式
fiveSlice := tenSlice[2:7]
fmt.Println(fiveSlice)

// 要素の拡張
elevenSlice := append(tenSlice, 101112)
fmt.Println

元記事を表示

[API Gateway→ Lambda] Lambdaでクライアント情報を取得してみました

場合によっては、Lambda Functionsでクライアント情報を取得する必要があります。
たとえば、クライアントのIPアドレスを確認します。

API Gateway(Lambda Proxy)→ Lambda Functions(Golang)を構築してみました。
Lambdaで、APIGatewayを呼び出したクライアントの情報を取得しました。

Golangのサンプルコード:
“`
package main

import (
“context”
“fmt”
“github.com/aws/aws-lambda-go/events”
“github.com/aws/aws-lambda-go/lambda”
)

func handleRequest(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
strInfo1 := request.RequestContext.Identit

元記事を表示

Go+CodeCommitで任意の名称のライブラリを作成・利用する方法

# 目的
Goでモジュールを作成する際には`go mod init`で任意の名称を指定することができます。
しかし AWS CodeCommit を利用時にはCodeCommitのホスト名(`git-codecommit.${AWS_REGION}.amazonaws.com`)を使用する必要があります。
そこでCodeCommitを利用しつつ任意の名称でGoのライブラリを作成する方法を調査したのでそのやり方をまとめます。
# 経緯
こんな感じです。
– プロジェクトではCodeCommitを使わないといけない
– ~~モジュール名にCodeCommitのホスト名が含まれると、別リージョンにリストアした際にクライアント側からアクセスが出来なくなる~~
– 所感にも記載しましたが、Gitのホスト名を置換する機能を使うと解決です
– モジュール名にCodeCommitのホスト名が含まれることに気持ち悪さを感じている
– Goでライブラリを作成しないといけなくなった!!!

絶対に達成しないといけないわけではなく完全に好みですね。
# やり方
今回実現するのに、Gitのホスト名を置換

元記事を表示

【Golang】ポインタと実体の使いどころ

Golangにおけるポインタの使いどころ、実体の使いどころを整理しました。

# 結論

| | イミュータブル変数 | 関数引数/メソッドレシーバ | ゼロNULL区別 |
|:-:|:-:|:-:|:-:|
| ポインタ | × | ◎ | ○ |
| 実体 | ○ | ○ | × |

# 1. イミュータブル変数は「実体」で宣言する。
ポインタは、別変数に値を渡すと、その変数からも元値の更新が可能となる。
つまり、複数の変数間で1つの値を共有する**ミュータブルな**変数を意味する。

“`go
package main

import “fmt”

func main() {
v1 := &S{Number: 1} // ポインタで宣言
v2 := v1 // 別変数に値を渡す
v2.Number = 10 // 別変数を更新
fmt.Printf(“v1: %v, v2: %v”, v1, v2)
// -> v1: &{10}, v2: &{10}
// v1の値も更新されてしまう: ミュータブル変数
}

ty

元記事を表示

東京ドームのイベント情報をSlackに通知させてみた

# はじめに
私が通っている大学のすぐ近くには東京ドームがあり,コロナ禍に入る前はライブ帰りの客で駅や電車がやたら混むということがよくありました.
今年に入ってからイベントが再開されてきていることもあり,またこういったことが起こる気がしたので,予めイベント情報を知れる仕組みを作りたいと思いました.

# 使用した技術
* Go
* goquery
* Serverless Framework
* AWS Lambda
* Github Actions

# プロジェクトの作成
予め作成したディレクトリに移動した上で,以下を実行します.
“`
$ sls create -t aws-go-mod
“`
そうすると,最低限動くServerless Frameworkのプロジェクトが作成されます.
もしServerless Frameworkをインストールしていない場合は,以下のコマンドでインストールしましょう.(Node.jsが必要)
“`
$ npm i -g serverless
“`
or
“`
$ yarn add global serverless
“`

# 実装

元記事を表示

OTHERカテゴリの最新記事