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

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

Dockerコンテナ内で面倒なgo buildを実行する

https://qiita.com/kishibashi3/items/2b1e342d1ce3957b3dc8

の続き。
# 概要

今回作成したサービスがopencvなどの環境を作成するのが面倒で、buildするのも一苦労するため、buildについてもdockerの中でやってしまおう、ということで試してみた。

### topic

* opencvやgstreamerなど多くのライブラリが必要
* 開発環境用docker imageがそのまま使用できそう
* goライブラリの中に、privateなライブラリが含まれている
* 上記にアクセスするために、SSH鍵が必要
* 前段のgo build処理 、通常のdocker buildのマルチステージビルド

# Dockerfile

今回作成したDockerfileは以下。

ベースイメージである`ghcr.io/my_organization/devcontainer-go1.15-opencv4.5:latest`については、

https://qiita.com/kishibashi3/items/e20a

元記事を表示

RTPで受け取った動画をgolangで画像処理したい

https://qiita.com/kishibashi3/items/e20aecef45ed8341e739

の続き。
# 概要

動画を受け取り、動画から受け取ったフレームをある間隔で画像処理するようなアプリケーションをgolangで書きたい。

画像処理ライブラリとしてopencvを利用する必要があり、ラッパーとしてgocvを利用した。
試行錯誤した結果 opencv.OpenVideoCaptureという関数のバックエンドとしてgstreamerが使用できるという記事があり、試してみた。

# 構造

実際にはRTPの前にはWebRTCがあり、今回はSkyway WebRTC Gatewayを用いてWebRTC->RTPに変換している。

https://github.com/skyway/skyway-webrtc-gateway

![image.png](https://qiita-image-store.s3.ap-northe

元記事を表示

初心者向けGo問題集~演算子編~

Goの”基礎文法”を勉強中の方に向けた問題集です!

書籍や動画を使用したインプット中心の勉強になっていると感じたので、問題を作成してアプトプットすることにしました。(自身も初心者なので、問題集で間違っている箇所があれば教えてください。)
*********

###演算子編###
####=問題=
Q1. 3 + 1 の答えを表示
Q2. 3 – 1 の答えを表示
Q3. 3 × 1 の答えを表示
Q4. 3 / 1 の答えを表示
Q5. 30 / 4 の余りを表示

Q6. +演算子を用いて、「Hello Go」を表示

プラスα. 「Hello Go」2番目の文字「e」を表示
プラスα. 「Hello Go」を「Hello go」に変更
プラスα. sの文字列に「Hello」が含まれているか?

下記の実行結果をtrue/falseで答えてください。
Q7.fmt.Println(true && false == true)
Q8.fmt.Println(true && true == true)
Q9.fmt.Println(true || false == true)
10

元記事を表示

プロキシ経由の社内ネットワーク接続のWindows端末でgo get ができない難民へ

社内業務改善のツールを開発したい!(業務でGoを使用する機会はないので、少しでも理言語理解を深めるための時間にしたい!!)という思いで意気込んでいたところ、タイトルのとおり社内ネットワークを経由している端末でgo get(正確にはVSCodeの環境構築(Go:Install/Update Tools))ができませんでした。

エラーメッセージからプロキシに関する設定に問題があることはすぐわかりましたが、なかなか対処できずに苦戦しました。

## 確認すべき事項は以下の2点だけ

かなり苦戦してしまいましたが、以下2点の対応で解決します。

– Gitのプロキシ設定に過不足がある
– VSCodeのプロキシ設定に過不足がある

以下に対処法の詳細を記載します。

### 「Gitのプロキシ設定に過不足がある」の対処法

コマンドプロンプトで以下を実行する

“`bash
git config –global http.proxy http://192.168.1.1:8080
git config –global https.proxy http://192.168.1.1:808

元記事を表示

初心者向けGo問題集~スライス編~

Goの”基礎文法”を勉強中の方に向けた問題集です!

書籍や動画を使用したインプット中心の勉強になっていると感じたので、問題を作成してアプトプットすることにしました。(自身も初心者なので、問題集で間違っている箇所があれば教えてください。)

********************

###スライス編###

####=問題=
Q1.実行結果が[1 2 3 4 5]となるスライスslを作成してください。

Q2.slの最初の要素を取得してください。
Q3.slの2番目から3番目の要素を取得してください。
Q4.最後の要素を取得してください。
Q5.slの最初と最後の要素以外すべてを取得してください。

Q6.slの要素数を調べてください。
Q7.slのキャパシティ(容量)を調べてください。

Q8.slに要素[6 7]を追加してください。

********************
####=解答=
Q1.実行結果が[1 2 3 4 5]となるスライスslを作成してください。

“`Go:A1.go
func main() {
//明示的
var sl []int = []i

元記事を表示

GO言語を使って自分のPCでWEBサーバー構築

モジュールについて学習している中、ここに来てプログラミング入門者である私に初めての課題が課せられました。自分のパソコンを使いWEBサーバーを立ててみて下さいというものでした。今まで動画や参考書に頼りっぱなしで、自分の力でなんとかするとなると、まず何からしていいのかさっぱりでした。まず、自分のパソコンをサーバーにするで検索をかけましたが知見が足りなすぎて、いろんなところを行ったり来たり。ヒントを頂き、Qiitaでなんとかそれらしき記事を発見! 早速作業にとりかかりました。GOには標準でHTTPパッケージが用意されているようで、自分のIPアドレスを使用し、ローカル環境で静的コンテンツを作ることができます。

“`
mkdir HELLO
cd HELLO
“`
では、ディレクトリ(コンピュータのファイルシステムにおいて、ファイルをグループ化するための特殊なファイルで、整理・管理する場所)をターミナル画面で作成していきます。

“`
touch main.go
mkdir -p start/stylesheets
touch start/index.html start/stylesh

元記事を表示

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からの抜粋記事) 等がわかりやすいですが、
幾つか基本的な事を書いてお

元記事を表示

OTHERカテゴリの最新記事