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

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

Golang 入門 #1

## Golangとは

[公式ドキュメント](https://golang.org/doc/) に書いてあることをまとめると、Golangとは…

* オープンソース
* シンプルな言語仕様
* 並行プログラミングに強い
* コンパイル型言語
* コンパイルや実行が速い

2021年3月の時点でGolangの最新バージョンは [1.16](https://golang.org/doc/go1.16)
Go1.16 は、macOS 10.12 Sierraで実行される最後のリリースになっており、Go1.17 ではmacOS 10.13 HighSierra以降が必要になる。

## Goの需要

まず国内におけるGoの需要はどうだろうか
TECH Street(テックストリート)によるアンケートの調査結果は次の通り
Goは国内における需要は増えているという話は聞きますが、Perlと同じ15位にランクイン
defer内でのエラーを考慮する。

# はじめに
– `defer`句でエラーが起きたらどうするか

# 結論
– ※個人的に良いなと思ったものです。
– `close`時に発生したエラーとオリジナルのエラーの両方をログなどで確認することができる。

“`golang
defer func() {
deferError := c.Close() //c.Closeはエラーを返す可能性があります。
if deferError == nil {
return
}
err = fmt.Errorf(“close: %v, original: %v”, deferError, err)
}()

//よくない例
defer c.Close()
“`

# 参考
[Go 言語(Golang) はまりどころと解決策](https://www.yunabe.jp/docs/golang_pitfall.html#defer-%E3%81%AE%E4%B8%AD%E3%81%A7%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9F-error-%E3%82%92%E5

元記事を表示

【Go】File operations (ファイル操作)

# Goでプログラミングの基礎を学ぶシリーズ
スクールでは教えてくれないプログラミングの基礎、**データ構造とアルゴリズム**をGoで学んでいくシリーズです。
そのデータ構造がどのようなものであるかは、理解を助けてくれるサイトを紹介しつつ、簡単に説明に留めさせていただきます。(ご自身でも調べてみてください!)
筆者自身、Exerciseに取り組みながら理解を深めていったので、コードの解説を中心に記事を書いていきたいと思います。

| | タイトル |
|——|———|
| #0 | [はじめに (環境構築と勉強方法)](https://qiita.com/miyyuk/items/0b959774a2e436f087c0) |
| #1 | [Pointer, Array, String (ポインタと配列と文字列と)](https://qiita.com/miyyuk/items/75fad6c02b76354fa49d) |
| #2 | File operations (ファイル操作) **☜ here** |
| | *~~ coming soon ~

元記事を表示

モスクワの天気に詳しい彼女botが欲しい

# はじめに

モスクワの天気に精通した**彼女風LINE BOT**を作成しました

[![Image from Gyazo](https://i.gyazo.com/c78a840ad1fe0201b3b649766a4e7a04.png)](https://gyazo.com/c78a840ad1fe0201b3b649766a4e7a04)

#### QRコード

[![Image from Gyazo](https://i.gyazo.com/f22a26304e7bc0755cd4f4a95b1d2cd2.png)](https://gyazo.com/f22a26304e7bc0755cd4f4a95b1d2cd2)

#### 使用技術
– Go
– line-bot-sdk
– heroku
– [openWeather API](https://openweathermap.org/)

# 事前準備
LINE BOT 作成手順は、以下記事にまとめましたので、参考にして頂けますと幸いです。
[LINE BOTで彼女botを作りたい](https://qi

元記事を表示

【Go言語】bufioのScanは65536バイトを超えると読み込まない?

# 概要

– bufioのScannerを使ったファイル読み込みはデフォルトでは1行の長さが65536バイトを超えた場合はエラーとなるので1行の最大長を設定しなければならない
– bufioのScannerのエラーハンドリングを忘れない

# やり方

– 初期サイズを与えたbyte配列を生成する
– Buffer関数にbyte配列と1行の最大長のサイズを設定する
– エラーハンドリングを忘れがちなので注意する(これがないとなぜファイルが読めないのか気づけ無い)

“`
scanner := bufio.NewScanner(fp)
buf := make([]byte, 65536) // 初期サイズ
scanner.Buffer(buf, 1048576) // 最大サイズ
for scanner.Scan() {
log.Print(scanner.Text())
}
// エラーハンドリング
if err := scanner.Err(); err != nil {
log.Printf(“scanner. %v”, err)
}
“`

元記事を表示

yukicoder contest 288 参戦記

# yukicoder contest 288 参戦記

## [A 1438 Broken Drawers](https://yukicoder.me/problems/no/1438)

昇順に並んでいない組はどちらかしか開けれないのでその分だけ差し引けばいい.

“`python
N, *A = map(int, open(0).read().split())

c = 0
i = 0
while i < N - 1: if A[i] > A[i + 1]:
c += 1
i += 1
i += 1
print(N – c)
“`

## [B 1439 Let’s Compare!!!!](https://yukicoder.me/problems/no/1439)

不一致の最左点だけ比較すれば大小が分かるので、その位置を押さえる. その位置より右で変更があった場合は大小は変わらない. その位置より左で変更があった場合はそこの位置を見るように変える. 現在見ている場所が一地になった場合はそこから次に不一致の点に移動する. こ

元記事を表示

How to do Benchmarking with Go

I will be talking about benchmarking in Go in this article.

But first, what is benchmarking in general?
**Simply put, it means running a set of programs to assess the relative performance against a set of standards.**

In our case, we want to judge whether Go codes that we wrote are performing well or not.

# How to do benchmarking in Go

Go included a default benchmarking tool inside [testing package](https://golang.org/pkg/testing/).

To differentiate benchmarking from testing, you need to pr

元記事を表示

Linuxでもお名前.com DDNS

# はじめに

お名前.com使ってますか?
僕はお名前.comでドメインを借りてます。ふと、家のマシンをインターネット公開しようとDDNSしようと思ったのですが、クライアントがWindowsしかありませんでした。

調べてみると簡単にできそうだったので、肝となるコードは参考しつつ、Goで書いてみました。

利用の際は自己責任でお願いします。

# 機能紹介
## リポジトリ
https://github.com/miya-masa/onamae-go

## ヘルプ(リリース当初)
“`
❯ onamae-go -h
flag needs an argument: -h
Usage of onamae-go:
-d string
Domain. ex. example.com
-daemon
Launch as daemon
-h string
Hostname. ex. www
-i https://httpbin.org/ip
IP address. If empty, will get it au

元記事を表示

高校生が2ヶ月で教育用プログラミング言語を作ってU22プロコンで賞をとった話

#前置き
2020/11/29に開催された U22プログラミングコンテスト2020 において経済産業省政務局長賞プロダクト賞及びOBC賞を頂きましたので、開発経緯をまとめてみたいと思います。拙い文章だとは思いますが、U22プログラミングコンテストに応募してみようと考えている方や自作言語に興味がある方への参考になれば幸いです。
##自己紹介
最初にちょっとした自己紹介を…
プログラミングが趣味な一般高校二年生(4月から3年生)です。
プログラミングはScratchを小学生4年生から、JavaScriptを中学1年生からはじめました。高校に入ってからプログラミング学習を本格的に初め、C, C++, Swift, PHP, (SQL), Go などを学習しました。(まだマスターには程遠いですが..)
一番なれている分野はサーバーサイドで、文化祭の物品管理データベースの作成やスーパー混雑共有サービスなどを今までに作りました。
#応募作品について
今回のU22プログラミングコンテスト(以下U22プロコン)で提出した作品は

元記事を表示

【HTTPヘッダー】CORSの仕組みとGo+GinによるCors設定の実践

#はじめに
`localhost:80`で立てたWebサーバー(nginx)から
`localhost:8080`に立てたAPIサーバー(golang)にリクエストを送った時に、
CORSエラーが発生し、APIが叩けないところでハマったので、
学びとしてまとめます。

#そもそもHTTPとは?
>HTTP は、 HTML 文書などのリソースを取り出すことを可能にするプロトコルです。これはウェブにおけるデータ交換の基礎をなし、クライアントサーバープロトコルであり、リクエストは受け取り者 (一般にはウェブブラウザー) が生成します。文書全体は、テキスト、レイアウトの定義、画像、動画、スクリプトなど、取り込まれたさまざまなサブ文書から再構成されます。
参考元:[HTTP の概要](https://developer.mozilla.org/ja/docs/Web/HTTP/Overview)

– プロトコルの一種
– ウェブにおけるデータ交換の基礎
– シンプルで人間が読めるように設計されている
– HTTPヘッダーで、プロトコルの拡張や検証が簡単
– ステートレスだけど、HTTP Co

元記事を表示

【Go】「binary.Write: invalid type 」が発生してバイナリ書き込みができない

# 問題

以下のような構造体をバッファに書き込もうとしてエラーが発生した。

“`go:main.go
type T1 struct {
A int8
B int8
}

type T2 struct {
T1
C string
D int8
}
var (
t1 T1
t2 T2
)

t2.T1 = t1
t2.C = “hoge”
t2.D = 1234

buf := new(bytes.Buffer)

// ここで該当のエラーが発生
//
// binary.Write: invalid type *main.T2
err := binary.Write(buf, binary.LittleEndian, &t2)

“`

# 原因
埋め込みがまずいと予想していたが、どうやら**string**を書きこもうとして出力されるエラーだとわかった。

ドキュメントによると、[^1]
>Write は data のバイナリ表現を w に書き込みます。 data は,固定サイズ値または固定サイズ値のスライス,あるいはそのようなデータへのポイン

元記事を表示

【並列・並行解説付き】goroutineでマルチスレッド処理を試してみた

#はじめに
タイトルをあえて、**”マルチスレッド”**とだけ書き、`並行・並列`という言葉を使うのを避けました。
理由としては、

– `goroutine`は`runtime.NumCPU()`の値(論理コア数)が複数だった場合、並列処理となる。
– 論理コアごとに`gorotine`と紐づくカーネルスレッドが実行される**`M:Nモデル`**を採用しているので、同時に複数の処理が走る。(並行処理)

ただ、**並行は並列**を包含するので、
強いて言えば、goroutineは、並行処理というのがいいのかもしれませんね。

すでに「並」でゲシュタルト崩壊発生( ;´Д`)

#マルチスレッドとは

すでに、並列処理・並行処理ってなんやねん!!って状態だと思いますが、
図をご覧下さい。
![スクリーンショット 2021-03-25 11.48.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1075243/466c42e6-c416-e1bd-70be-57d4de34a8c4.png)

##

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事