Go関連のことを調べてみた2021年03月24日

Go関連のことを調べてみた2021年03月24日

VSCode devcontainerを使って面倒な開発環境を作る

# 概要

ある案件で、opencvを使って映像を扱うサービスを構築した。
各開発者の開発環境をどう作るか頭を悩ませた。
opencvをビルドするのに2時間近くかかってしまうし、gstreamerのインストールやらもろもろのライブラリやら考えると、環境整備だけで気が遠くなりそう。

検索していると以下のような記事を見かけた。

https://qiita.com/d0ne1s/items/d2649801c6f804019db7

あらかじめ開発環境をdocker image化しておき、それをそれぞれの開発PC上で起動する事ができれば、開発参画が簡単になるのでは?
ということで、試してみた。

# 要件

* 開発言語はgolang1.15
* opencv4.5.1
* gocv0.26.0
* gstreamer
* Redis

gstreamerで映像を受け取ってgocvで画像処理。結果をRedisに格納。

# 手順

事前に必要なものは

module | desc
–|—
VSCode | IDE
VSCode Remote Container | VSCodeの拡

元記事を表示

Docker上のMySQLにMac上のGoアプリから接続するのにハマった

– Docker上のGoアプリ → Docker上のMySQL
– Docker上のGoアプリ → RDS(AWS)上のMySQL
– Mac上のGoアプリ → Mac上のMySQL
– Mac上のGoアプリ → RDS(AWS)上のMySQL

これら接続はやったことがあったのですが、

– Mac上のGoアプリ → Docker上のMySQL

の接続に数時間ハマってしまいました。
ググっても意外と情報が少なくて苦しんだので、メモしておきます。

## やりたかったこと
Mac上のGoアプリ → DockerのMYSQL
この接続をしたい

## 環境
Docker version 20.10.5
MacOS Big Sur 11.2.3
Go 1.15
MySQL 8.0.23

## 結論

### MySQL
Docker ファイルを作ります。

“`dockerfile
FROM mysql:8.0.23

ENV MYSQL_ROOT_PASSWORD rootpass

ENV MYSQL_USER username

ENV MYSQL_PASSWORD passw

元記事を表示

Gopher君のかるた大会

## 概要

問題文が消失したため不詳だが、 https://github.com/cielavenir/codeiq_solutions/blob/master/00misc/comb/comb_test.go なるテストコードがpassすれば良い。

つまり、

“`
func main(){
strs := []string{“A”, “B”, “C”, “D”, “E”}
for i := range comb.CombinationGenerator(5,2){
var actual []string
i.Index(strs,&actual)
fmt.Printf(“%v\n”, actual)
}
}
“`

なるmainに対し、

“`
[A B]
[A C]
[A D]
[A E]
[B C]
[B D]
[B E]
[C D]
[C E]
[D E]
“`

なる出力をすれば良い。

本問に関して、 https://qiita.com/cielavenir/items/d82515b7d12ab25afa56 にて、「Goの型システムは死

元記事を表示

今週のアルゴリズム:最短経路の計算!(Go2/Crystal/Kotlin/Nim/Juliaでpermutation iterator)

|Permutation Iterator|next_permutation|URL|
|:–|:–|:–|
|C#/Go/Python/Ruby/VB| |まとめ含む http://qiita.com/cielavenir/items/ac96da5e3040c2edb78c|
| |Boo/C#/Nemerle/VB|http://qiita.com/cielavenir/items/0e07a024049017f7dea2|
| |Java/Groovy/Scala/Fortran/Pascal|http://qiita.com/cielavenir/items/4347fd0c6c69fa60804a|
| |D/Go/JavaScript/Lua/R|http://qiita.com/cielavenir/items/9e821d04f574a6623d03|
|Perl|HSP/PHP/Python/Ruby|http://qiita.com/cielavenir/items/006a878292c5be209231|
|Go2/Crystal/Kotlin/Nim

元記事を表示

GOでファイルを分ける時

##初めに
Goって公開されてるパッケージを組み合わせてなんやかんやするのがメインで
ファイルがすんごく長くなる事ってあんまり考えないのかな?
普通に見にくくなっちゃうと思うので、ファイルを分ける方が好きだったりします。

そして、ファイルを分けるのにドはまりしたので、書いておく
一応Windowsの場合です。

##長くなったmain.goを分割する
**フォルダ構成はこうしたい!**
※一応[公式の推奨フォルダ構成](https://github.com/golang-standards/project-layout)を参考にした

“`
GOPATH/
src/
└ test/ <-今回のプロジェクトルート ├ cmd/ │ └ textApp/ │ └ main.go └ intarnal/ └ sub/ └ sub.go ``` ##まずはとりあえず、go mod init 〇〇〇〇 する CMDで以下を実行 ``` cd GOPATH<皆良い感じに変えてほしい>/test
go mod init

元記事を表示

Lambda + Goでネストされたアプリケーションを構築

![1280px-Go_Logo_Aqua.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525769/2b8f3e0b-9e8b-1355-2e71-ffd3570f9337.png)

LambdaでGoを使ったAPIを作成したときの話
あるサービスでGoを採用し、Lambda上でapiを作成することになった、最初は小規模の認識で開発を行っていたが、仕様がどんどん膨らみ気づいた時にはエンドポイントが150を超え、そしてやってきたリソース制限

“`
Template format error: Number of resources, 206, is greater than maximum allowed, 200
“`

ネストさせることで回避できることを知り、ネストするも“`sam build“`できず、結局ネストされた各アプリケションを個別にビルドし、マージするシェルを書いて運用していた。
苦労した話を書こうと思い調べていると、いつの間にかネストされたアプリケーションのビルド

元記事を表示

go言語でSlackのWebhookをやろうとして苦労したので備忘録

### 環境
* go 1.15
* slack 2021/03/22時点

## goの `url.QueryEscape` は空白( )をプラス(+)に変換する
URLエンコード的にはプラス(+)でも問題ないが、 `%20` に変換したい場合は以下のようにする。

“`
str = regexp.MustCompile(([^%])(+)).ReplaceAllString(str, “$1%20”)
“`

## Slackのサンプルには下記コマンドが提供されているがダブルクォートのエスケープが必要なのか分からない。。

`curl -X POST –data-urlencode “payload={\”channel\”: \”#any_channel\”, \”username\”: \”webhookbot\”, \”text\”: \”This is posted to #any_channel and comes from a bot named webhookbot.\”, \”icon_emoji\”: \”:ghost:\”}” https://hooks.

元記事を表示

Go(ver1.16.2) でgodocを使えるようにするための手順

## godocとは?
Go言語は、**godoc** というコマンドがあります。このコマンドのおかげでgolang.orgのパッケージのドキュメントをオフラインで閲覧することが出来ます。

## 前提条件

#### 環境
– OS : macOS Big Sur バージョン11.2.1

– Go : 1.16.2 darwin/amd64

#### 状態
Goをインストールしたときに、一緒にインストールされるはずのgodocコマンドが使えない。

####やりたいこと
godocを使って、オフラインでドキュメントを閲覧したい。またWebサーバーとして起動して、ブラウザ上で確認したい。

## 手順

go get コマンドでgodocコマンドをインストールします。

“`shell
$ go get golang.org/x/tools/cmd/godoc
“`

$GOROOT/binのパスを通す。

“`shell
$ export GOPATH=$HOME/go
$ export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
“`

元記事を表示

[Go]goqueryで超簡単!Webスクレイピングを試してみた

#はじめに
私が、Webマーケッターをやっていた頃、
エンジニアたちがよく、
「このページをスクレイピングして…DDoSならないように、秒間隔空けて…」
とかいうやりとりをしていて、

そう言えば、自分でもスクレイピングに憧れて、
[import.io](https://www.import.io/product/extract/)
とかいうスクレイピングの超便利サービスも使ってたなあと懐かしい思いがこみあげまして、、、

エンジニアになった自分もスクレイピングなるものを試してみようと思いたったので挑戦してみますた。

#ウェブスクレイピングとは
>ウェブスクレイピング(英: Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。ウェブ・クローラー[1]あるいはウェブ・スパイダー[2]とも呼ばれる。 通常このようなソフトウェアプログラムは低レベルのHTTPを実装することで、もしくはウェブブラウザを埋め込むことによって、WWWのコンテンツを取得する。
参考:[wikipedia ウェブスクレイピング](https://ja.wikipedia

元記事を表示

beego ormで構造体にマッピングされずハマった

# やりたかったこと
beegoのormを使用して構造体にマッピングしたかった。
DBはSQLite。

# できなかった
![WS000007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546752/8121d740-60cc-d0dc-5898-ffdf6d5d3dc4.jpeg)

SQL自体はエラーになっていないのに構造体にはマッピングされていない・・・
なぜだ。

# 前提の見直し
DBの定義。(一部略)

AUTH_MASTER

|列名|型|
|:–|:–
|AUTH_ID|integer
|USER_ID|integer
|LOGIN_CODE|text
|CREATED_DATE|text
|CREATED_USER_ID|integer
|UPDATED_DATE|text
|UPDATED_USER_ID|integer
|ROW_VERSION|integer

構造体の定義。

“`go:authMaster.go
package models

import (

元記事を表示

Go の Unit Testing に関してやりたいことを調べてみた – パラメータによるフィルタリングと並行性の制御

Go のプロジェクトでちょっと凝ったテスティングをする必要が生じたので、いろいろ調べ物をしたのでそのメモを残しておきたい。

# Go test のタイムアウトは?

こちらのページで、`go test` のフラグを確認することが出来る。丁寧にかいているのでわかりやすい。`-timeout d` で設定できるようだ。

> The default is 10 minutes (10m)

# Go test で、`t.Logf` を書いているのにログが出ない。

フラグの設定が必要。`-test.v` をつける。`-v` は元々 `Verbose output` の意味で、テストの場合は、`-test` のプレフィックスをつけるのが必須。

# パラメータ付きのテストをしたい

沢山の言語をサポートしている環境で、下記のようなことを実践したい。

* 各言語のテストは、パラレルで実行できない。シリアルでやりたい。
* 各エクステンションのテストは、パラレルで実行したい。
* 通常は全部のテストをランするが、テストの実行をエクステンション及び言語でフィルターしたい

上記のことを実現する

元記事を表示

Goで暗号化する備忘録(AES-128-CBC)

# はじめに

Goで暗号化・復号の処理を書いたときに(主にパディングで)手こずったのでメモ。

# 暗号化

## 流れ

AES-128-CBCによる暗号化は以下のような流れで行う。

– 秘密鍵 (128 bit) の用意
– IV (128 bit) の生成
– パディング
– 暗号化

## 秘密鍵 (128 bit) の用意

省略。

## IV (128 bit) の生成

IVは長さ16のランダムな `byte` 配列になる。この長さはAESにおけるブロックサイズなので、定数 `aes.BlockSize` が使える。

“`go:iv
import (
“crypto/aes”
“crypto/rand”
)

func GenerateIV() ([]byte, error) {
iv := make([]byte, aes.BlockSize)
if _, err := rand.Read(iv); err != nil {
return nil, err
}
return iv, nil
}
“`

## パディング

平文 `[]byte

元記事を表示

TinyGo の開発版のビルド方法と、ビルドせずに開発版バイナリを手に入れる方法

TinyGo に限らず、ですが、リリース版が出た後も開発は続いています。
リリース版では動かなくて、その後の開発版では修正された、というケースも多々あるのが現状です。

元記事を表示

Goで見るHTTP/2

HTTP/3も出てきて、QUICトランスポートを使っていこうという時期ですが、
そもそもHTTP/2も知らないでHTTP/3に進めるのか?
ということでHTTP/2を理解するためにあれこれやってみた事を記事にしました。

また、HTTP/3はそもそもまだ仕様も策定中(まもなく確定?)でライブラリ等で気楽に使える状況にも無いので、
この先プロジェクトで使っていくことがあるとしたらまずはHTTP/2かなというのも調べてみた理由です。
HTTP/3自体`HTTP over QUIC`としてHTTP/2の機能からQUICと重複する部分を切り落として効率化したプロトコルなので、
今後HTTP/3の利用が本格化した際にもキャッチアップが楽になるだろうと。

HTTP/2の概要は [HTTP/2 の概要](https://developers.google.com/web/fundamentals/performance/http2?hl=ja) (オライリーのHigh Performance Browser Networkingからの抜粋記事) 等がわかりやすいですが、
幾つか基本的な事を書いてお

元記事を表示

AtCoder Regular Contest 115のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/arc115

# A

“`Q_A.go
package main

import (
“fmt”
“strings”
)

func main() {
var N, M int
fmt.Scanf(“%d %d”, &N, &M)

m := make(map[int]int)
var s string
var count int

for i:=0; i

元記事を表示

AtCoder Beginner Contest 196のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/abc196

# A

“`Q_A.go
package main

import (
“fmt”
)

func main() {
var a, b, c, d int
fmt.Scanf(“%d %d”, &a, &b)
fmt.Scanf(“%d %d”, &c, &d)

e := a – c
f := a – d
g := b – c
h := b – d

if (e >= f) && (e >= g) && (e >= h){
fmt.Printf(“%d\n”, e)
} else if (f >= e) && (f >= g) && (f >= h){
fmt.Printf(“%d\n”, f)
} else if (g >= f) && (g >= e) && (g >= h)

元記事を表示

yamlをインタラクティブに絞り込みできるCLIを作った

## 初めに
最近仕事ですこしk8s周りを触っています。k8sのマニフェストはyamlですが、
kustomizeなどを使ってリソースをまとめたりすると、どうしても長くなってしまい可読性が下がってしまう問題があります。

そこで、[jid](https://github.com/simeji/jid)のようなインタラクティブに絞り込みできるツールがほしいなと思って調べたんですが、
見つからなかったので[yd](https://github.com/skanehira/yd)というCLIを作りました。

![](https://i.gyazo.com/521400d0740ed12c1606a8ab9b618632.gif)

## 使い方
`yd`ではパイプ、ファイル、URLからyamlを読み込めます。

“`sh
$ yd file.yaml
$ yd https://sample.com/file.yaml
$ yd < file.yaml $ yd -f file.yaml ``` CLI実行後、画面上部にクエリを入力する箇所があるので、そこにクエリを入力してyamlをインタ

元記事を表示

2つの配列の要素を全部掛けて合計を求める

# はじめに

配列$x$と配列$y$のそれぞれの全要素を掛けて合計を求めたい。
単純に書くと下記のようになる。

“`golang
sum := 0
for _, xi := range x {
for _, yi := range y {
sum += xi * yi
}
}
“`
ループが二重になってしまい嬉しくない。

# 改善

`xi`は内側のループ中は変化しないので、外に出してやればいい。

“`golang
sum := 0
for _, xi := range x {
sumy := 0
for _, yi := range y {
sumy += yi
}
sum += xi * sumy
}
“`

`sumy`は`x`とは無関係に求められるから、1回だけ計算すればいい。

“`golang
sumx := 0
for _, xi := range x {
sumx += xi
}
sumy := 0
for _, yi := range y {
sumy

元記事を表示

Go で Build Tool Mage を使う

自分の参加しているプロジェクトで、Mage というビルドツールを使っている。私の環境では、Windowsを使っている人も多くて、私は、Go を書くときはLinux の shell 派なんだけど。普通のGoのリポジトリは Makefile のケースがが多いから、Windows派の人が困る、、、的な時に、結構よさげ。Go言語自体を使ってビルドツールが書けます。

* [Mage](https://github.com/magefile/mage)
* [Mage Go Doc](https://pkg.go.dev/github.com/magefile/mage/mage)
* [Mage.org](https://magefile.org/)

通常は、Mageをとってきて、ブートストラップするのだけど、面倒なので、main.go を書いて、その中で、

_main.go_

“`go

func main() {
os.Exit(mage.ParseAndRun(os.Stdout, os.Stderr, os.Stdin, args()))
}

func args() []s

元記事を表示

プログラミング超入門(7)〜GO言語〜

#条件分岐
分岐処理とは、ある条件が満たされるときのみ特定の処理を行い、そうでなければ別の処理をしたり、また別のある条件が満たされているときのみ特定の処理を行い、そうでなければ何もしないなどといった与えられた式の値でtrueかfalseに分け異なる処理を行うようにすることをいいます。
##if文
`if 条件 { 条件を満たしたときの処理}` 

“`Branch1.go
package main

import “fmt”

func main() {
age := 24

if age >= 20 {
fmt.Println(“adult”)
}
}
“`
###実行結果
“`
adult
“`
##if~else文
`if 条件 A { 条件Aを満たしたときの処理} else { 条件を満たさないときの処理}`

“`Branch2.go
package main

import “fmt”

func main() {
age := 18

if age >= 20 {
fmt.P

元記事を表示

OTHERカテゴリの最新記事