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

Go関連のことを調べてみた2021年08月30日
目次

Go の testing つかってみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244948/33861726-5e11-ea12-40b9-56bb55084939.png)

## TDD
[エアテスト駆動飲み会](https://tddrinking.connpass.com/)で Golang をはじめて触ったので記録のこします

* 同イベントでは過去に [bash も TDD が簡単に出来る](/kfjt/items/eaf5e2749802a950dd76) を書きました

## 環境
* [Replit](https://replit.com/) を使うことで、実行環境を作る時間を省略し、ブラウザ越しに参加者同士でコードを共有します
* Golang を普段さわってる人はゼロ

## 分かった事
* `xxx_test.go` というファイル名にする
* `go test` で実行できる
* `package main` だと何か不都合らしい
* 関数 `Testxxx` を用意する
* `t *test

元記事を表示

FBXファイルをちょっとだけ理解した

備忘録を兼ねたメモです.

面倒くさそうな構造のファイルだなと思って今まであまり関わらないようにしてましたが,ファイル自体は頻繁に目にするので中身を読んでみました.雰囲気から推測したことも多く含まれるので注意.間違っている箇所もあるかもしれないので,ツッコミは歓迎です.

# FBXとは

Autodesk製品で使われるファイルフォーマットです.3Dモデルデータをやりとりにデファクトスタンダードに近い形で使われているフォーマットの割には,仕様が不明瞭だったり,ツールごとの対応に差があって困るのは有名な話のようです(要出典)

Wikipedia: https://ja.wikipedia.org/wiki/FBX

# 参考にした情報へのリンク

断片的な情報はあちこちにありますが,ボーンやブレンドシェイプでモデルを動かすところまで実装するために,色々見る必要がありました.

– https://help.autodesk.com/view/FBX/2017/ENU/
– フォーマット自体の情報は乏しいけど,どんな値をどう扱えばよいかはFBX SDKのドキュメントが参考にな

元記事を表示

Go言語 のpanic を正しくrecover する

# Go言語 のpanic とrecover について

## panic について
Go言語には、例外処理のために一般に使われるerrors に加えて、panic という処理が存在する。
基本的には回復不能と判断された実行時エラーを発生させる機構。

## recover について
panic を取得し、エラー処理を実装できる機構。これがないとプログラムはクラッシュしてしまう。

## 使用上の注意点
言語仕様なのでドキュメントを読めば書いてあるが、慣れた人ほど注意した方が良いこと

### recover() は関数内部で実行されることで初めてpanicを受け取ってくれる
下記のコードを実行すると、panic が回収されず、そのままプログラムが終了する

https://play.golang.org/p/K3wxb3EDLjT

“`
package main

func main() {
recover()
panic(“パニックが回収されませんでした”)
}
“`

一方で次のコードのように、関数内部で受け取ってやることでちゃんとpanicが回収されて、プログラムが

元記事を表示

Goに関する参考記事

## GORM

### [GORM](https://gorm.io/docs/index.html)
– golangでよく使われるORM
– Docsは英語だと検索が使えるのが良い。作者は中国杭州の方。

### [GORM で 1:N で Join したカラムの値を取得する](https://qiita.com/zaneli@github/items/f22d57862d780a2a6ca9)
– joinなどを書く時
– Preload(“<構造体の名前を書く>“)を書く、これを見逃し随分ハマった

## Time

### [Go1.15改訂版、Go言語アプリのDockerイメージをscratchから作る](https://qiita.com/nejinejio/items/1bd5a07fe4060f98cc33)

– コンテナ内のLogの時間がJSTにならない時
– usr/share/zoneinfoがない場合
– time.Now().In(JST)で”unknown time zone”がでる
– 解決はgo build する時にオプションで”-tags ti

元記事を表示

Go言語で構造体データをファイルに書き出し/読み込みをする方法メモ

# はじめに
## やりたいこと
Goのプログラム内で作成した構造体のデータをバイナリにシリアライズし、ファイルに保存します。
そしてプログラムを次回実行したときには、そのファイルを読み込んでデシリアライズし、構造体のデータをメモリに乗せます。

丁度、Pythonであれば[pickle](https://docs.python.org/3/library/pickle.html)で出来るようなことを、Goで実行する方法のメモです。
# コード
## 概要
Goの標準ライブラリである[gob](https://pkg.go.dev/encoding/gob)を用います。
`Encoder`というクラスで構造体データをバイナリにシリアライズし、`Decoder`というクラスでそれをデシリアライズします。

※サンプルコードからは、例外処理を省いています。
## 書き込み
“`go
import (
“encoding/gob”
)

// 今回保存したいデータ
var stageTiles [screenLength][screenLength]tileInfo
type tileI

元記事を表示

S3にオブジェクトをアップロードして引数をlambdaに送りたいとき

今まではS3をトリガーにLambdaを発火させていたのですが、これだと追加の変数を設定することができず、どうすればいいか悩んでいたときに、InvokeInputに渡せばいいことを知りました。

## 参考

https://qiita.com/yukpiz/items/269277a97053237a6980

## go server側

S3にアップロードしたあとに、invokeして変数を渡すようにしました。

“`main.go
package main

import (
“encoding/json”
“fmt”

“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/lambda”
)

// これはLambda関数の完了で返すための構造体定義
type Response struct {
Message string `json:”message”`
Ok bool `json:”ok

元記事を表示

ECSへ移行したらマシンリソースを使い果たした問題がnet/httpのhttp.Transportの使い方の誤りにあった話

# はじめに
はじめまして。Kyashでサーバサイドエンジニアを担当しているhirobeです。
[ブログ記事発信](https://blog.kyash.co/entry/2021/07/27/203922)の一環として書かせていただきます。

Kyashでは、約30ほどのマイクロサービスが動いてます。

そのなかで比較的新しいサービスについては開発環境、本番環境ともにAWSのECS(AWSのコンテナオーケストレーションサービス)を利用していますが、数年前から存在するような古いサービスはいまだにEC2で動いているものも多く、それらはECSに移行しつつあります。

検証環境において、あるマイクロサービスをEC2からECSへ移行したところ、接続元のサービスのマシンリソースを使い果たしサービスがかなり不安定になる問題が発生しました。

当初はアプリケーションのコード修正に問題があると皆で調査していたのですが、リソースを使うようなコード修正もありませんでした。半ばあきらめかけていたのですが、偶然私がGoのnet/httpのソースコードを以前から読んでおり[^1]処理の概要を把握していたので、

元記事を表示

DockerでGo言語開発環境を構築してツールを作成する

## はじめに
* 社内で利用する簡単なツールを作りたい
* dockerで環境構築すればどの言語でも作れはするが、実行するのは社内環境なので同様の環境を構築しなくてはいけない
* どうせ誰も管理しないし作りっぱなしでいいんじゃないか・・・?
* そもそも自分しか使わないのにそこまで構築に時間をかける必要があるのか・・・?

## 利用技術
* docker
* Go言語

## Go言語について
* Googleが開発した言語
* 実行速度・コンパイルが速い
* 調べればいくらでも出てくるので調べてください

## なんでGo言語なのか
* 楽しくプログラミングしてほしいという理念に基づいて開発されているらしいので
* どうせやるならやったことない言語を触ってみたいとは思うので

## dockerで開発環境構築する必要ある・・・?
* ないです
* 今回のテーマがコンテナだったのでそれに絡めるためにです
* dockerの開発にも使われてるのでという逃げ方でも良かったかもしれないですね・・・

## 環境構築
* DockerFileにgoのイメージを利用するように書いてdocek

元記事を表示

[memo][Go] go test の coverage 出力方法

“`go
go test -cover -coverprofile=cover.out
go tool cover -html=cover.out
“`

とすると

“`
no required module provides package .out; to add it:
go get .out
“`

エラーになった。
.outをとってみる。

“`go
go test -cover -coverprofile=cover
go tool cover -html=cover
“`
いけた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248217/e292ccfa-b3b8-a2de-d456-408c56295fee.png)

元記事を表示

[memo][Go] go run main.go の際に標準入力を渡すコマンド

次のような標準入力を渡すとすると

“`
3
8 12 40
“`

こんな感じ

“`
echo 3 8 12 40 | go run main.go
“`

改行を入力する方法はわかりません。

元記事を表示

[memo][Go] 標準入力のテストコード

### ソースコード

“`go:main.go
package main

import (
“bufio”
“fmt”
“io”
“os”
)

func main() {
fmt.Println(Scan(os.Stdin))
}

func Scan(r io.Reader) string {
sc := bufio.NewScanner(r)
sc.Scan()
return sc.Text()
}
“`

“`go:main_test.go
package main

import (
“bytes”
“testing”
)

func TestScan(t *testing.T) {

expect := “test”

input := bytes.NewBufferString(expect)
// input := strings.NewReader(“123\n456”) これでもよい

actual := Scan(input)

if expect != actual {
t.Errorf(“case3 exp

元記事を表示

Go初見が1週間でWebアプリ開発できるか ー3日目ー

今までAPIサーバーとしてNode.jsを用いていましたが、最近話題のGoを使ってみたいと思い、Go初見の状態から1週間でWebアプリを開発できるのかをチャレンジします。
フロントで使うReact,TypeScriptは今まで開発経験があります。

3日目の日記
今日は今回DBとして使うFirebaseの作成とGoに初めて触れる。

# Firebaseの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483460/ed90359a-e4dc-bd1c-b89e-6bcfa5cb8f30.png)

プロジェクトの設定のサービスアカウントから「新しい秘密鍵の生成」を押して、`serviceAccountKey.json` を取得。
これは、APIサーバーでCloud Firestoreを操作する際に必要になる。ちなみにAdmin SDK構成スニペットも後で必要。

![20210825_1.png](https://qiita-image-store.s3.ap-northeas

元記事を表示

ホスト(macos)からdocker上のredis sentinelに接続

# Overview
docker上にテスト用のredis sentinelを動かして、ホスト上で動いているプログラムから接続する

# Problem
`sentinel get-master-addr-by-name `で返却されるマスタのIPはdocker環境上のIPなので、ホストからは繋げない。

# 解決
– hostモードで動かす => macosは対応していない?後日ドキュメント確認
– lo0にループバックアドレスにエイリアスを追加 => 暫定対応

# エイリアス追加
“`
sudo ifconfig lo0 alias ${DOCKER_SUBNET}
“`

# テスト
“`go
package main

import (
“context”
“fmt”

“github.com/go-redis/redis/v8”
)

func main() {
opt := redis.FailoverOptions{}
opt.MasterName = “master”
opt.SentinelAddrs = []string{“127.0.0.1:2

元記事を表示

OS system command Run … / Ruby case / Python case / golang case / Nim case

## Ruby

“`ruby:oscommand.rb
current = “test”
system(“ls”)
system(“mkdir” ,”./#{current}”)
#system(“rm” , “-r”, “./#{current}”)
“`

“`terminal
> ruby oscommand.ruby
“`

## Python
“`python:oscommand.py
import ‘os’

os.system(“ls”)
os.system(“mkdir ./test”)
#os.system(“rm -r ./test”)
“`

“`terminal
> python oscommand.py
“`

## golang

“`golang:oscommand.go
package main

import (
“log”
“os/exec”
)

func main(){
title := “test”
cmd := exec.Command(“zip”,”-4″, title + “.zip”

元記事を表示

Golang / React / PostgreSQLのホットリロードできる開発環境をDockerで作ってみた

#構成
– バックエンド: Golang
– フロントエンド: React(TypeScript) + Tailwind CSS
– DB: PostgreSQL

#なぜ作ろうと思ったのか
開発中に、バックエンド、フロントエンド、データベースを起動、再起動の管理を各々するのが億劫になったので、どうせならdockerで統一してしまおうというのが作ろうとしたのがきっかけです。

#docker-compose
“`
version: “3.7”

services:
front:
container_name: front
build:
context: ./front
dockerfile: Dockerfile
ports:
– 3000:3000
working_dir: /src
volumes:
– ./front:/src
env_file:
– ./front/.env
tty: true
stdin_open: true

api:

元記事を表示

Go初見が1週間でWebアプリ開発できるか ー2日目ー

今までAPIサーバーとしてNode.jsを用いていましたが、最近話題のGoを使ってみたいと思い、Go初見の状態から1週間でWebアプリを開発できるのかをチャレンジします。
フロントで使うReact, TypeScriptは今まで開発経験があります。

2日目の日記です。
今日はフロントを大まかに完成させたい。

# フロント開発

## 開発していく上で気になったこと

### React.FC

TypeScriptも最近使い始めたばかりなので、気になることを調べた。
以前 React.FC というものを聞いたことがあったので使ったほうがいいのか調べた。

https://de-milestones.com/typescriptreact-fc/

【検証】React.FC と React.VFC はべつに使わなくていい説

https://qiita.com/sangotaro/items/3ea63110517a1b66745b

調べた結果、React.FCは使わないことにした。

### React.createContext

元記事を表示

Go言語(Golang)のチートシート 型、演算子、エスケープシーケンスまとめ

Go言語の型、演算子、エスケープシーケンスをまとめました。

##組込み型一覧
###符号あり整数
|型名 |概要 |
|—|—|—|
|**基本型**||
|string|文字列。「”」で囲んで表現する。|
|bool|真偽値(true/false)|
|**nビット符号あり整数**||
|int8|-128~127|
|int16|-32,768~32,767|
|int32|-2,147,483,648~2,147,483,647(約-21億~21億)|
|int64|-9,223,372,036,854,775,808~9,223,372,036,854,775,807(約-922京~922京)|
|int|システム依存サイズの符号あり整数。32ビットシステムなら32ビットだが、int32やruneとの互換性はない(代入できない)。|
|rune|32ビット符号あり整数(int32のエイリアス)。Unicodeの1文字を格納する。「’」で囲んで表現する。runeは文字の意。|
|**nビット符号なし整数**||
|uint8|0~255|
|uint8|0~65

元記事を表示

【Golang】テスト実行中にメッセージを表示させる【テストの進捗表示】

> テスト中、API などのリクエスト過多を防ぐために `Sleep` させたり、重い処理が始まったなど、**テスト実行中に、その旨をユーザに知らせたい**。

:::note info
「”golang” テスト中にメッセージを表示させる」でググっても、ピンポイントで見つからないので自分のググラビリティとして。
:::

## TL; DR (今北産業)

1. 重い処理や `Sleep` 実行前に `t.Log()` す

元記事を表示

【Golang】改行などをエスケープして表示したい。【代入済み変数の文字列をエスケープ出力】

> 改行やタブ入りの文字列の変数をプリントする際に、改行させずにエスケープして表示させたい。

:::note info
「”golang” 文字列 改行をエスケープして表示」でググるも、初歩的するぎるため、逆の(タブや改行をエスケープして変数にセットし、出力時にパースする)方法や、あっても代入時に `(バッククォート)を使う方法ばかり。すでに代入済みの変数を展開せずにエスケープしたまま出力したいのです。
タイトルからピンポイントの記事がすぐに見つからなかったので、自分のググラビリティとして。

元記事を表示

16進数、バイナリ、base64の相互変換をCLIとGo(Golang)でやる

要はこれをやるのだ(相互変換)

“`plaintext
hexadecimal
↓ ↑
binary
↓ ↑
base64
“`

# CLIでやる

まず 16進数 to base64

“`bash
echo “0123456789abcdef” | xxd -r -p | base64 # ASNFZ4mrze8=
“`

base64 to 16進数

“`bash
echo “ASNFZ4mrze8=” | base64 -d | hexdump # 0000000 01 23 45 67 89 ab cd ef
“`

# Golangでやる

“`Go
package main

import (
“encoding/base64”
“encoding/hex”
“fmt”
)

func main() {
hexStr := “0123456789abcdef”

// hexadecimal string -> byte -> base64 string
b64Str, _ := hexToBase6

元記事を表示

OTHERカテゴリの最新記事