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

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

dockerコンテナで引数としてホスト上のファイルを指定する

# はじめに

こんにちは、icemint0828です。
今回はdockerコンテナで引数としてホスト上のファイルを指定する方法を紹介します。
 ※自作パッケージをdockerイメージとして公開する際にハマりました。

## 動作環境
dockerが動作する環境

## やりたいこと
ホスト上では以下のように実行していたコマンドをdockerコンテナにシングルバイナリとして持たせて実行したい時があります。
“`shell
$ imgedit reverse srcImage.png
“`

dockerコンテナ上で以下のように実行したいです。
“`dockerfile:Dockerfile
# scratchはシングルバイナリを扱うためのベースイメージです。
FROM scratch
ADD imgedit /usr/bin/imgedit
ENTRYPOINT [“imgedit”]
“`

“`shell
$ docker run ghcr.io/icemint0828/imgedit:latest reverse srcImage.png
“`

このコマ

元記事を表示

goで画像の反転処理を行う

# はじめに

こんにちは、icemint0828です。
今回は自作パッケージの紹介も兼ねて、goでの画像の反転処理の方法を紹介します。

## 動作環境
go 1.18.3

## 使用パッケージ

* icemint0828/imgedit
画像の反転処理に使用しています。
画像ファイルの拡張子の変換にも使用しています。

https://github.com/icemint0828/imgedit

## インストール

“`shell
$ go get github.com/icemint0828/imgedit@v1.5.0
“`

# 画像の反転処理

“`main.go
package main

import (
“github.com/icemint0828/imgedit”
)

func main() {
// 反転方向の指定
isHorizon := true

// FileConverter
fc, _, err := imgedit.NewFileConverter(“srcImage.png”)
if err != nil {

元記事を表示

動かして覚えるGoのWorkspaceモードの使い方

今までのモジュール管理方法はこちらをご覧ください。

https://qiita.com/Rqixy/items/b906fcb54cf162427775

# 実行環境
– M1 Macbook Air
– macOS Monterey 12.4
– Go 1.18

WindowsでもGoがちゃんとインストールされていれば大丈夫です。

# workspaceモードとは

複数のモジュールを一つのgo.workというファイルで管理し、モジュール間の行き来をスムーズにすると言うものです。

“`go.work
go 1.18

use (
./module1
./module2
)
“`

このような感じでmoduleを複数管理することができます。

## workspaceのコマンド

いくつかコマンドがあるのですが、よく使うinitとuseコマンドを紹介します。
### init

go.workファイルを初期化する時に使います。
“`terminal
% go work init
“`

initの後ろに既に作成しているモジュールを追加することができます。
“`t

元記事を表示

Go On windows

## Go vscode 拡張機能

Vscodeの Go 拡張機能をインストールしても「command go.tools.install not found」とエラーになってしまう。。。

“`cmd
Go: Install/Update tools
“`

“`text
command go.tools.install not found
“`

“`bash
$ echo %GOPATH%
D:/opt/GoLang/1.16.15/GOPATH
$ echo %GOENV_ROOT%
D:/opt/GoLang/1.16.15/go
“`

“`bash
go install github.com/ramya-rao-a/go-outline@latest
go install github.com/cweill/gotests/gotests@latest
go install github.com/fatih/gomodifytags@latest
go install github.com/josharian/impl@latest
go install g

元記事を表示

Go,postgresql-13 On Ubuntu 18.04 etc

# Go,postgresql-13 On Ubuntu 18.04 etc

## Firewall

“`bash
sudo ufw status
sudo timedatectl set-timezone Asia/Tokyo
“`

## goenv

[install](https://github.com/syndbg/goenv/blob/master/INSTALL.md)

“`bash
git clone https://github.com/syndbg/goenv.git ~/.goenv
echo ‘# ADD’ >> ~/.bashrc
echo ‘export GOENV_ROOT=”$HOME/.goenv”‘ >> ~/.bashrc
echo ‘export PATH=”$GOENV_ROOT/bin:$PATH”‘ >> ~/.bashrc
echo ‘eval “$(goenv init -)”‘ >> ~/.bashrc
echo ‘export PATH=”$GOROOT/bin:$PATH”‘ >> ~/.bashrc
echo ‘e

元記事を表示

【Go-sqlx】INSERT、UPDATEなどでプレースフォルダを使う時に、構造体に`db:***`タグを打てばそのまま使える

[前回の記事](https://qiita.com/rikimaru-odd-person/items/4151b6c94c0f48882e9c)では、sqlxライブラリでプレースフォルダを使ったINSERTする際に、
`map[string]interface{}`
を使ってましたが、職場の人から「構造体でもできる」ということを教わりました。

今回はそのメモです。

### まずはおことわり
– 「使えればいい」レベルでの内容ですので、セキュリティやコード品質は無視しております。ご了承ください。

### 結論から
– INSERT,UPDATEに使用するための構造体を用意する。
– 構造体に`db:”カラム名”`タグを明記しておく。
– SQL側でのプレースフォルダの変数名は構造体タグ`db:”カラム名”`の「カラム名」と同じにする。
– あとは通常通りNamedしたり、NamedExecして実行する。

構造体のタグ`db:”カラム名”`はSELECT文の受け手となる構造体を定義するときに使われますが、INSERT,UPDATEのプレースフォルダにも使えることを今回

元記事を表示

【Golang】zapの使い方

# 概要
先日リリースを控えているプロジェクトがあり、リリース前にログを整備したいという話になりました。
そこでGoのライブラリであるzapを使用してみたので、使い方の備忘を残そうと思います。
これからzapを導入しようと思っている方などに参考になりますと幸いです。

# 環境
– Go v1.17
– go.uber.org/zap v1.16.0
– google.golang.org/grpc v1.36.0

# はじめに
とにかくzapを使って簡単なロギングをしてみます。サーバーを立てつつzapからlogを出力してみました。

“`golang
func main() {
logger, _ := zap.NewDevelopment()
logger.Info(“Hello zap”)

conn, err := repository.InitDBConnection(“qiita”)
if err != nil {
log.Fatalf(“db connection failed: %v”, err)
}

s := grpc.NewServer()

元記事を表示

【Golang】Sentryの実装と並列実行対応

# 概要
弊社ではエラー監視としてsentryを使用しています。
golangでsentryを実装していく中で、詰まった箇所がなどがあったので備忘として残しておきます。
sentryの導入などを考えている方、カスタマイズやスレッドセーフな実装をしたい方に参考になればと思います。

# 前提環境
– Go v1.17
– github.com/getsentry/sentry-go v0.11.0

# はじめに
まずはとくにかくgolangのサーバーの中のエラーを発生させて、sentryに通知させてみます。
サーバー起動の記述は省略して、sentryへの通知の記述だけ記載します。

sentry.go
`scope.SetLevel(sentry.LevelError)`でsentryのログレベルを設定、
`sentry.CaptureException(err)`でsentryにエラー内容を送信しています。
“`golang
func PushSentry(err error) {
sentry.ConfigureScope(func(scope *sentry.Scope) {

元記事を表示

SwitchbotをLINE BOTから操作してみた(Lambda,API Gateway,Go)

# はじめに

自宅を完全スマートホーム化してみたい!!ということで第一弾はSwitchBotの加湿器を買ってみました。

じゃじゃん!
IMG_4786.jpg

今回はこの加湿器をLINE上からON/OFFできるようにしてみます。

# 構成

![kousei.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610254/eb50aeb1-4ed9-4834-f3b1-6b21d7953ad7.png)

# 準備
## LINEアカウント

https://developers.line.biz/ja/docs/messaging-api/getting-started/
を参考にチャネルを作成します。

![スクリー

元記事を表示

Golangで認証ページを突破する

# きっかけ
 Golangを今年の2月始めて触ってみて、書きやすい言語だなと思って何かGolangを使って遊んで見ようと思いました。そこで、簡単にブラウザをGolangによって操作させて、自動でログインできるような機能を作ってみようと思いました。

# 何をしたのか
 今回は、私が普段大学で利用しているLMS(学習管理システム)を使いたいと思います。
 LMSはもちろんのことログインをするためにはユーザー名とパスワードを入力しなければなりません。これを Golangを使うことでログイン認証を自動化させてみようと思います。

# 下準備
 これらを実現させるために主に2つのフレームワークを使いました。
 一つ目が[agouti](https://qiita.com/k-penguin-sato/items/deaeab18aa416496e273)です。簡単に言うとブラウザ操作を自動化させるためのフレームワークです。
 まずは下準備としてこれを`go get`によってインストールしましょう。
“`
go mod init asobi //go.modファイル生成
go get

元記事を表示

動かして覚えるGoのモジュールの使い方

色々な記事見ていたんだけど難しく感じたり英語で書いてあって分かりにくかったので、具体的な説明は特になく、こんな感じに動くんだよ。と体感的に理解してもらいたく書きました。

自分としてもまだ知識不足なところあるから、もし間違っていたら教えてくれると嬉しいです。

::: note
今回は1.18から追加されたworkspaceモードではなく、今までのモジュール管理をどうやっていたか動かしながら説明していきます。

workspaceモードはこちらから試せます!↓
[動かして覚えるGoのWorkspaceモードの使い方](https://qiita.com/Rqixy/items/6bdead71dc02eb233376)
:::

# 実行環境
– M1 Macbook Air
– macOS Monterey 12.4
– Go 1.18

WindowsでもGoがちゃんとインストールされていれば大丈夫です。

# 使い方
例えば、このようなディレクトリ構造があります。
“`terminal
% tree
.
├── main
│   └── main.go
└── module

元記事を表示

Goのcobraで作るコマンドラインツール(Hello World)

## はじめに

Goでコマンドラインツールを作るフレームワーク[spf13/cobra](https://github.com/spf13/cobra)を使うと簡単にコマンドを実装することができるので、ハンズオン形式で紹介します。

今回は以下のような、表示させたい名前をコマンドライン引数で指定すると、
`Hello <引数で指定した名前>!!!`と出力するHello World的なコマンドを実装していきます。

“`shell:Usage
> go run main.go -h
greet is a simple command line tool that greets you in English.

Usage:
greet [flags]

Flags:
-h, –help help for greet
-t, –toggle Help message for toggle
“`

“`shell:引数を指定
> go run main.go 田中太郎
Hello 田中太郎!!!
“`

“`shell:引数の指定なし
> go run

元記事を表示

Goの正規表現 (?) と和解せよ

# TL; DR

– `(?i)`, `(?m)` 等は、マッチのルールを変更するフラグを表す
– 大文字、小文字の区別をなくす/行を跨いでマッチできる等
– グループはキャプチャされない
– リファレンス: https://github.com/google/re2/wiki/Syntax

# はじめに

とあるライブラリを調べていたところ、大文字でも小文字でもマッチする謎の正規表現を見つけました。

“`go
re := regexp.MustCompile(`(?i)(ab)(c+)`)
fmt.Println(re.FindStringSubmatch(“abccc”)) // [abccc ab ccc]
// 大文字でもマッチする!?
fmt.Println(re.FindStringSubmatch(“AbCcc”)) // [AbCcc Ab Ccc]
“`

~~実際は謎でもなんでもなかったので~~ 調べた内容を備忘録として残しておきます。

# 正規表現のドキュメント

Goの `regexp` パッケージでは、re2の文法が使われています。([pk

元記事を表示

【Golang】recoverについて

# 概要
リリース前のプロジェクトのソースコードを見ていく中で、ふとrecoverが入っていないことに気づきました。recoverについての理解が浅く、どんな挙動をするのか、何のためにrecoverするのか理解できていなかったので備忘としてまとめます。
golangのフレームワークのリファレンスなどに記載されているから、なんとなくrecoverを入れている、使い方や用途は実はいまいちわかっていない方などに読んでいただけますと幸いです。

# recoverでできること
– panicが発生したとしてもプログラムを終了せずに復帰できます。
– 本当にシンプルにこれだけです笑

# 疑問
ここで疑問に思ったのがrecoverの使い方でした。
例えばサーバーでpanicが発生したとして、panic=致命的なエラーなのでこれをrecoverしたところで全ての処理に失敗するのでは・・?
今はどこも実環境でコンテナ技術を用いたサーバーを構築していると思うので、いっそrecoverを入れずにサーバーを落としてしまって、リクエストを処理の成功するコンテナに誘導するほうがいいのでは・・?

# 結論

元記事を表示

go テストに環境変数を使う

https://pkg.go.dev/testing#B.Setenv

testingのSetEnvを使う

OK?

元記事を表示

Go言語で作るインタプリタ go test ./lexer で import “monkey/token” ができない

## バージョン

“`
$ go version
go version go1.18.3 darwin/amd64
“`

## 問題点

– `~/SOME/PATH/monkey/token` の用にフォルダを作成する(自分の場合は`~/program/go/interpreter/monkey/token`としている)

– `go mod init github.com…..`としたらダメだった

“`
$ go test ./lexer
# github.com/yojiyama7/go_interpreter/lexer
lexer/lexer_test.go:5:2: package monkey/token is not in GOROOT (/usr/local/go/src/monkey/token)
FAIL github.com/yojiyama7/go_interpreter/lexer [setup failed]
FAIL
“`

## 解決策

– `go.mod`ファイルを削除して、
– `monkey`ディレクトリで `go mod i

元記事を表示

GCP の Pub/Sub と Gmail APIを使って、メールをトリガーにイベントを実行する

## 背景
Gmail API の送信する方法は記事たくさんあると思うんですが、受信側はなかなかないですよね。
GAS使うっていうのも一つの手かとは思うんですが、1分ごとに実行し続けるっていうのもちょっと気持ち悪いですし、ラグが出てしまうと思うので、今回 [Cloud Pub/Sub](https://cloud.google.com/pubsub/docs/overview?hl=ja)を使って実装してみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340121/90bd4997-f735-d44c-1a25-5d5e4a29f286.png)

## Pub/Subとは
> Pub/Sub を使用すると、パブリッシャーとサブスクライバーと呼ばれるイベント プロデューサーとコンシューマーのシステムを作成できます。パブリッシャーは、同期リモート プロシージャ コール(RPC)ではなく、イベントをブロードキャストすることによってサブスクライバーと非同期に通信します。

元記事を表示

Go言語の英語チュートリアル ペライチ Hello world go version go1.18.3 windows

大学でCのTAをやって以来ですが、Go言語を勉強してみます。

# チュートリアルの概要
Windowsで、cmdとVSCode(要ダウンロード)を使いました。
Go version : go1.18.3 windows/amd64

#1 Hello worldの表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/34625e78-333a-b6f9-4b52-35464b7afb52.png)

# 参考リンク
Goのgetting started(入門講座)
https://go.dev/doc/

# Installing Go
## 1. Goのインストール
windows版をインストール

### 1.2 VSCodeのインストール
 https://zenn.dev/em0/articles/41bbfb9aae6bb9240fa9
 を参照。
 https://code.visualstudio.com/docs/?dv=win

### Step3

元記事を表示

DDDをざっくり理解してみる① ~エンティティと値オブジェクト編~

# はじめに
設計方面の知見が虚無すぎたので、以下書籍を用いて社内でDDDの勉強会を開催することにしました。
この記事は勉強会の内容をまとめたものです。
スタンスとしては初めはざっくりと理解して、回を追う毎に正確に理解していくというものです。
ただざっくりと言っても「さすがに間違っているのでは」というところもあると思うので、是非色々とご指摘いただけたら嬉しいです。

https://www.amazon.co.jp/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E3%83%9C%E3%83%88%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E6%9C%AC-%E6%88%9

元記事を表示

【自己学習】Go言語を学ぶ(5)

公式チュートリアルから基本を学ぶ
https://go-tour-jp.appspot.com/list

# Zero values(ゼロ値)

* 変数に初期値を与えずに宣言すると、ゼロ値( zero value )が与えられます。

* 初期値
* 数値型(int,floatなど): 0
* bool型: false
* string型: “” (空文字列( empty string ))

サンプルコード

“`go
package main

import “fmt”

func main() {
var i int
var f float64
var b bool
var s string
fmt.Printf(“%v %v %v %q\n”, i, f, b, s)
}
“`
結果:0 0 false “”

# Type conversions(型変換)

サンプルコード
※`math.Sqrt`を使って各値の平方根を計算する

“`go
package main

import (
“fmt”
“math”
)

fun

元記事を表示

OTHERカテゴリの最新記事