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

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

【gRPC】GoでStreaming APIを実装する

#はじめに
前回の記事で、gRPCのAPIタイプの内、1リクエストに対して1レスポンスを返すUnaryを実装しました。
今回は1回のコネクションで複数のリクエストやレスポンスを送るタイプである、Streaming APIを実装してみました。

https://qiita.com/suzuki0430/items/c0efd9a00ba0a7d77a88

#Streaming API
Streaming APIはHTTP/2の恩恵を受けており、リクエスト/レスポンスのたびにコネクションを確立しないというメリットをもちます。
3種類のタイプがあり、それぞれが以下のような特長をもっています。

– Server Streaming: 1リクエストに対して複数レスポンスを返す。サーバが大量のデータを送りたいとき(ライブ配信やチャット)に使い、リクエストを受け取らずとも非同期でレスポンスを返す。
– Client Streaming: 複数リクエストに対して1レスポンスを返す。クライアントが大量のデータを送りたいとき(データアップロードなど)に使い、サーバは非同期でレスポンスを返すことができる

元記事を表示

M1 Mac も速くないことがある

# これは何?

先日まで Mid 2015 の 15 inch MacBook Pro (Core i7 クアッド / 2.2 GHz) を使っていた。
先日 MacBook Pro 14 inch (M1 非Max) を手に入れたんだけど、あんまり速くないなと思うことがあったので、今日も楽しいマイクロベンチマーク。

# 計算内容

ruby で書くと短くていいね。

“`ruby:ruby
N=10000
r=(1..N).max_by{ |x| ((N-x)**x/7) % 6074001001 }
p r
“`
こういう内容。なんの意味もない。

出力は

“`text
8663
“`

となれば正解。

これを、go, java, c++ with boost (clang, gcc), ruby, python3, node で試した。

以降、グラフで出てくる “m1”, “rosetta”, “amd64” の意味は下表のとおり。

|記号|実行ハードウェア|バイナリ|
|:–|:–|:–|
|m1|MacBook Pro 14 inch (M1 非Ma

元記事を表示

Raspberry pi 4 2台を使って映像配信と受信してみた。【Gstreamer +Golang (gocv)】

## はじめに
OpenCV4の入力にカメラ映像ではなく、Gstreamerからの入力を受け取り表示します。
Raspberry piのカメラユニットの映像を別PCで動かしているOpenCvで受信してみます。

今回動かすシステムの構成としてはこのようになっています。

“`
WEB camera – Raspbery pi 4(カメラ配信サーバ) ===== Raspberry pi 4(受信サーバ)
“`

Gstreamer の勉強も兼ねているので、先ずは単機で動かしてステップアップ方式で進めていきます。

記事の構成がわかりにくくてクソなのですが、「機器間配信のテスト」まではWindows10で実行しています。
それ以降はRaspberry pi4 2台を使って配信と受信を行っています。

大まかな流れは変わらないのでご容赦ください。

## Gstreamerでの配信について
配信する側もゆくゆくはソフトとして作っていきますが、今回はコマンドラインで代用します。

### Gstreamerの動作確認
インストール済みだとは思いますが、映像を配信できるかを確かめます。

元記事を表示

[Go] Structs

# Structs とは

`Go` には関連する情報をまとめするため、 `structs` が使われる

# Defining and Declaring

“`Go
package main

import “fmt”

type person struct {
firstName string
lastName string
}

func main() {
var aaa person
fmt.Println(aaa) // The default value is a empty string.
fmt.Printf(“%+v\n”, aaa) // Use the “%+v” can print the fields also.

// Updating Struct Values
aaa.firstName = “aaa”
aaa.lastName = “player”
}
“`

# Embedding Structs

`Structs` に `structs` も宣言できる

“`Go
package main

impor

元記事を表示

Go導入リンク

# Go導入リンク

新しく案件でGoを使うことになったので使えそうなドキュメントをリンクしていく
随時更新予定

追記予定:
デプロイ周り
Unity連携
gRPC-web

# Goダウンロード・インストール

**公式サイト**

https://go.dev/

**ダウンロード**

https://go.dev/dl/

**確認**

“`bash
$ go version
go version go1.17.6 darwin/amd64
“`

# エディタ

VSCodeやAtomなどにプラグイン入れる方法もあるが、すぐ始められて多機能なJET BRAINSのGoLandが一番いいと思う(有料だけどその価値はあった

https://www.jetbrains.com/ja-jp/go/

# チュートリアル

## A Tour of Go

初学者は一通りこれを見ればいい、ポインタ、Goroutineだけ理解を深めるため他のサイトも見た。

https://go-tour-jp.appspot.com/welcome/1

### メモ

以下、Go特有だった

元記事を表示

[Go] time.AddDate() で月を加算する

# はじめに

Golang の [time](https://pkg.go.dev/time) パッケージの`AddDate()`について、
挙動を理解していないが為に重要なバグを生んでしまったので、まとめてみました。

# 結論

– `AddDate()`で月を加算すると加算前の月の日数(1月だったら31日)が加算される
– つまり、2022年1月31日に`AddDate()`で月を1加算すると、2022年3月3日になる

# 実際に起こったこと

それは、今月の月と来月の月を返す関数`getMonths()`を実装した際に起こりました。

まずは、実装したコードを見てください。

“`golang
func getMonths() []int {
targetTime := time.Now()

元記事を表示

Goアウトプット #03 【関数】

# 関数

– Go言語の関数は複数の値を返すことができる
– 関数の中には名称のない匿名関数を作成することができる
– `main()`関数(エントリーポイント)
└引数、戻り値を返さない
└基本的にプロジェクトに1つで、パッケージはmainになる
– funcキーワードで開始し、関数名、引数(省略可)、戻り値(省略可)を宣言

## 基本的な関数の文法

“`go
func main() {
result := pls(10, 10)
fmt.Printf(“result=%d \n”, result)
}

func pls(x int, y int) int {
return x + y
}

// -> result=20
“`

## 多値を返す関数

– Go言語は関数の戻り値を多値で返すことができる

### 戻り値の文法(戻り値の型指定のみ)

“`go
func 関数名(引数名 型[, …..])(戻り値の型[, ….]){
処理
return 戻り値
}
“`

“`go
func main() {
add, sub

元記事を表示

【AWS】Go Lambdaのローカル開発環境を作る ( aws-sam-cli + M1mac )

# はじめに

`aws-sam-cli`を利用すれば、手元の端末内にLambdaの実行環境を再現して、動作検証できる。
手元でコードを修正しながらその場で動作確認できるため、ディプロイの手間とLambdaの費用を削減できる。
nodejsとpythonの導入手順は多い中、Golangのドキュメントが少ないように感じたため、ここで纏める。

### やること

* 開発用にarm版Golangをローカル環境にインストールする
* `aws-sam-cli`でローカル環境にLambdaとAPIGatewayを構築する

### 前提

* arm版(M1チップ)の`macOS`環境をベースに説明する (goenv導入部分以外は大差ないはず)
* Z shell (zsh) をベースに説明する (環境変数の通し方以外は大差ないはず)
* Dockerは既にインストールしてあるものとして説明する

# もくじ

1. Golangをセットアップする
* aws-sam-cliをセットアップする
* ローカル環境でLambdaを起動する

# 1. Golangをセットアップする

#

元記事を表示

GoでWordleを作った

最近流行りのWordleを真似してGoでCLIを作ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673998/2b75b6a6-899a-cc82-8f78-5c7c0cf98b1e.png)

#Wordle
Wordleとは、お題となる伏せられた5文字の単語を6回の試行の間に当てるゲームです。回答ごとに、各文字の位置が一致しているか、含まれているかいないかといった情報が色で与えられるようになっています。

https://www.powerlanguage.co.uk/wordle/

#仕様
今回は以下のような仕様で実装を行いました。

– 正解となる単語をランダムに単語帳から取得
– 単語帳に含まれる5文字の単語をユーザに入力させる
– 回答と正解を比較し、文字ごとに背景を色分けして表示する
– 正解に含まれ、位置も合っている文字は緑
– 正解に含まれる文字は黄色
– 正解に含まれない文字は赤
– アルファベット26文字それぞれの情報をリス

元記事を表示

gorilla/csrfのオリジン間APIの実装とCORSエラー

バックエンドをGoでフロントエンドをReactでアプリを作成しており、CSRF攻撃の対策のためgorilla/csrfを導入しようとしたのですが、CORS関係でエラーが頻発しました。
この記事では、Reactは使わず、goで立ち上げた仮想フロントエンドサーバーにaxiosを入れて解説します。

gorilla/csrfライブラリの公式
https://github.com/gorilla/csrf#javascript-applications

実装結果は下記の通りです。

“`sh:ファイル構成
.
├── back
│   └── main.go
├── front
│   ├── index.html
│   └── main.go
├── go.mod
└── go.sum
“`

“`go:front/main.go
package main

import (
“log”
“net/http”
“text/template”
)

func main() {
http.HandleFunc(“/”, func(w http.ResponseWriter, _

元記事を表示

Go言語で外部コマンド実行するときの、標準出力取得するorしない、panicするorしない、の実装まとめ

Go言語で外部コマンド実行するときに、標準出力取得するorしない、panicするorしない、という以下の4パターンを使うので、それぞれの実装をまとめました

1. 外部コマンドを実行し、標準出力と標準エラーを印字し、エラーの場合はpanicする
2. 外部コマンドを実行し、標準出力と標準エラーを印字し、エラーの場合はerrorを返す
3. 外部コマンドを実行し、標準出力を返す。エラーの場合はpanicする
4. 外部コマンドを実行し、標準出力とエラーを返す

## ソース

“`golang
package main

import (
“fmt”
“os”
“os/exec”
“strings”
)

func runCommandGetOutputWithoutPanicByArray(command string, args …string) (string, error) {
stdout, err := exec.Command(command, args…).CombinedOutput()
return string(stdout), err
}

元記事を表示

Go のような日時フォーマットを Ruby で使えるようにする gem「GoTime」

 Rubyist の皆さま、日々 `Time#strftime` 使ってますか?

 Rails プログラマの場合 直接 `Time#strftime` を使う機会は少ないと思いますが、設定ファイル上などで `strftime` 用のフォーマット文字列[^timewithzone] を書いたことがあるのではないかと思います。

[^timewithzone]: Rails の場合、正確には `TimeWithZone#strftime` だと思いますが。

– 参考:[【初心者向け・動画付き】Railsで日時をフォーマットするときはstrftimeよりも、lメソッドを使おう](https://qiita.com/jnchito/items/831654253fb8a958ec25)

 ですので当然 strftime 用のフォーマット文字列など、何も見なくてもスラスラ書ける方が多いのではないでしょうか。

 **私は見ないと書けませんけどね!**

 だって何?この[フォーマット文字列](https://docs.ruby-lang.org/ja/latest/method/Time/

元記事を表示

goでbuffer writeする処理のメモ

bufferにwriteする際、io.Writerのインターフェースを使う場合は以下のように書けます。

“`
buffer.Write([]byte(“bytes.Buffer example1”))
“`

ただ、毎回バイト列にキャストしないといけないのは面倒です。なのでWriteStringというメソッドがbufferに用意されています。

“`
buffer.WriteString(“bytes.Buffer example2”)
“`

ただ、WriteStringはbuffer専用のメソッドのため、他の構造体では使えません。すべてのio.Writerインターフェースを満たす構造体に対してstringを書き込むような処理はio.WriteStringで実装できます。

“`
io.WriteString(&buffer, “bytes.Buffer example”)
io.WriteString(os.Stdout, “bytes.Buffer example”)
“`

まとめると以下のような感じです。

“`main.go
package main

im

元記事を表示

Go言語における.envファイルの使い方(viper使用)

# はじめに

Go言語でサーバーアプリケーションを作成しています。

このアプリでは、暗号化に使うシークレットキーやら、データベースのユーザー、パスワードといった設定値を簡単に扱えるライブラリとして、viperを使っています。

viperを使ってconfig.yamlといった外部ファイルを読み込む方法については、下記の参考資料等々よく見ますが、config.yamlの他に.envファイルも扱いたいと思いました。

viperにおける、.envの扱いについては、調べてもあまり出てこなかったので備忘録としてまとめました。

# 前提

## Versionについて

Goのバージョン、viperのバージョンは以下のとおりです。

– Go 1.17.6
– [github.com/spf13/viper](http://github.com/spf13/viper) v1.10.1

## フォルダ構成

今回説明するフォルダ構成は以下の通りです。

“`:フォルダ構成
.
├── config
│ ├── config.yaml
│ └── config.go
├── .e

元記事を表示

Golangはじめて物語(第10話: RDS Proxy+Aurora(PostgreSQL互換)とうまく付き合う方法)

# はじめに
[以前の記事](https://qiita.com/neruneruo/items/6346c655045a153ba458)では、GolangでAurora(MySQL互換)のエンドポイントに直接接続する方法を書いたが、今回はRDS Proxyを経由する方法を考察する。

GolangでRDS Proxy+Aurora(PostgreSQL)互換を使う場合、以下を考慮する必要がある。

なお、本考察においては、[この記事](https://qiita.com/neruneruo/items/15d6c5c50cf225bcd1fc)の構成を元にして実験をしている。
Aurora(PostgreSQL互換)のエンジンバージョンは12.7だ。

# 何を気を付けなければいけないのか
色々動作を検証していると、RDS Proxyの仕様とGolangの言語仕様の合わせ技でかなりややこしいことになった。
詳細は↓このような感じだ。

– RDS Proxyは特性上、Prepared Statementのように接続時に設定を行うようなことをするとピン留めが発生する(参考:[公式ドキ

元記事を表示

JupyterにPython以外のカーネルを導入する

## この記事の前提条件

誰でも無料で利用できる、カスタマイズ可能な[Jupyter](https://jupyter.org/)であれば、自分が推している言語でカーネルを導入しない手は無いと思い、色々チャレンジしてみました。
ここでは以前投稿した下記の環境で話を進めていきます。

https://qiita.com/Q-Lazy/items/bd7dacf1d8e865d57a94

## すでに利用可能な処理系のカーネルを導入

まずは、言語本体はすでに利用可能な状態で、カーネルさえインストールすればよいパターンから着手してみたいと思います。

####【Bashカーネル編】

手始めに容易に導入出来るBashから行います。こちらカーネルはPython3で実装されているので、pipコマンドでモジュールをインストール出来ます。
Jupyterへのカーネルのインストールも、Pythonモジュールの関数を実行するだけです。

“`bash
$ pip3 install –user bash_kernel

$ python3 -m bash_kernel.install
“`

元記事を表示

初めてOSS(Hasura)にコントリビュートしたのでまとめた

## はじめに

最近、OSS([hasura/graphql-engine](https://github.com/hasura/graphql-engine))にコントリビュートしました。
本記事は、業務で遭遇したOSSのバグに遭遇してから、IssueとPull requestでのバグ報告・修正するまでの経緯を簡単にまとめています。

今まで自分は、OSSへのコントリビュートは難易度が高いと思っていました。しかし、いざやってみると思ったより敷居が低く、経験値も多く得ることができました。

> OSSコントリビュートしてみたいけど、今一歩踏み出すことができない

といった方の参考になればという考えのもと、記事にしました。拙い文章ではありますが、参考になれば幸いです。

### 対象読者
:::note
・OSS活動をしてみたいが、どうやってやればいいかわからない方
・Hasuraにコントリビュートしてみたい方
:::

### コントリビュート内容

立てたIssue・Pull Requestは以下です。

https://github.com/hasura/graphql-engi

元記事を表示

Go言語でのエラーハンドリング方法

Go言語でコードを書く際によく使うエラーハンドリング方法をまとめます。

エラーハンドリングといったら大げさに聞こえますが、シンプルに普通のエラー処理です。
普段Go言語をいじっている方からすればです。

## Goの処理は基本エラーがつきもの
初めてGoを触った時の感想ですが、例外処理はなく常にエラーを持ち回る印象を受けています。
関数はメソッドは正常値とエラーをセットで返していて、コール元はその戻り値よりエラーチェックをしてから、正常処理か異常処理のいずれかを実施する流れがスタンダードになっています。
https://go.dev/play/p/RI6w5doxZZh

“`go
package main

import (
“errors”
“log”
)

func main() {
s, err := doSomething()
if err != nil {
doErrorProcess(err)
return
}
doSuccessProcess(s)
}

func doSomething() (string, error) {
// retur

元記事を表示

【gRPC】GoでUnary APIを実装する

#はじめに
前の記事で紹介したgRPCのAPIタイプの内、1リクエストに対して1レスポンスを返すUnaryを実装してみました。

https://qiita.com/suzuki0430/items/2be2d532cedd200937ca#%E6%A7%98%E3%80%85%E3%81%AAapi%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%97

#実装
細かい手順に分けて実装していきます。

##準備
GoでgRPCやProtocol Bufferを実装するにあたり、以下のライブラリを導入します。

“`
$ go get -u google.golang.org/grpc
$ go get -u github.com/golang/protobuf/protoc-gen-go
“`
また、シェルにパスを通します(今回は`.bash_profile`)。

“`bash
export GO_PATH=~/go
export PATH=$PATH:/$GO_PATH/bin
“`

https://github.com/grpc/grpc-go

h

元記事を表示

[Go] ハロー ワールド

# install
https://go.dev/doc/install

# code
“`go
package main

import “fmt”

func main() {
fmt.Println(“Hello, World!”)
}
“`

## package
コードの先頭では、このファイルに記述するコードがどのパッケージに所属するかを宣言する

## import
fmt というパッケージを import する

## func
func を使い、 `main` という function を宣言する

# command
“`zsh
go run main.go
“`

# Reference
https://go.dev/doc/tutorial/getting-started

元記事を表示

OTHERカテゴリの最新記事