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

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

[備忘] error strings should not be capitalized 対応

“`golang
fmt.Errorf(“This method is not implemented”)
“`

って書いたら`error strings should not be capitalized (ST1005)go-staticcheck`っておこられた。

問題は**最初の一文字目が大文字**のところらしい。

“`golang
fmt.Errorf(“this method is not implemented”)
“`

これでなおった。

元記事を表示

並列実行できるlocateコマンドの実装

並列実行できる [locate](https://en.wikipedia.org/wiki/Locate_(Unix)) コマンドを実装しました。

[github/u1and0/gocate](https://github.com/u1and0/gocate)

locate コマンドはファイル・ディレクトリを高速に検索します。
updatedbコマンドでデータベースファイルをあらかじめ作成しておく必要があります。

gocateはGo言語のgoroutineでlocateコマンドを並列に実行している…ただそれだけです。
locateコマンドは古くからあってか、未だにシングルスレッド実行なので、マルチスレッド実行できるようにGoでラップしました。

# 基本的な使い方

## インストール

“`shell-session
$ go get github.com/u1and0/gocate
“`

## db作成

“`shell-session
# $ gocate -init /var/lib/mlocate
まだ実装していません。updatedbに相当するものを実

元記事を表示

Go + MySQL + Docker で簡単なWebAPIを作ってみた

この記事は富士通株式会社FSWebユニット(旧株式会社富士通システムズウェブテクノロジー)が企画する[いのべこ夏休みアドベントカレンダー 2021](https://qiita.com/jugemsan/items/6c8b7324b9390a557774)の11日目の記事です。
本記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません。

# 概要

比較的最近に登場したネイティブコードコンパイラということで以前から興味をもっていたGO言語(GoLang)を少し勉強してみようと思い、GO言語で簡単なWebAPIを作ってみました。
マスコット・キャラクターはGopher(ホリネズミ)です。ゆるふわ系かな・・・??マスコットキャラクターの可愛さはDenoに軍配が上がりますね。

Gopher.pngGoを初めて触る人向けにGo Modulesとは何かを解説する

## はじめに
この記事ではGoを初めて触る人向けに「Go Modules」の全体像・使い方を[公式ブログ](https://blog.golang.org/using-go-modules)を元にhands-on的な感じで掻い摘んで解説していきます。(※この記事は元々2年くらい前に個人ブログに上げていた内容なのですが、一旦Qiita側に移動させます。)

## Go Modulesとは
Go Modulesは外部パッケージを管理するシステムのことを指します。

> Go modules in a nutshell is a built-in dependency versioning and dependency management feature for Go.

引用:「[Getting started with Go modules](https://medium.com/@fonseka.live/getting-started-with-go-modules-b3dac652066d)」

### moduleについて
moduleはpackageのコレクションです。(コ

元記事を表示

[golang]Excelの列アルファベットを計算する

皆さんもBtoB系のWebサービスを作っている時に「golangで何かしらの帳票をExcelで出力したい」みたいな要望もあると思いますが、そんな時に大体の人が使用するgolang主要なLibraryである`qax-os/excelize`は列情報をありがた迷惑にも**A-Zの文字列**で扱ってくれています。

https://github.com/qax-os/excelize

列情報が固定で変更の余地がほぼない!という状況ならまあソースにアルファベットベタ書きでも問題ないかもしれません(実際にはそんな事はままないと思いますが…)
しかし、列を可変で出力したい場合はIndex値で扱ってほしいところです。

と、前置きが長くなりましたが今回は 

**Index値 -> Excelの列アルファベット**

の変換処理が欲しかったので書きました。
列アルファベットの算出ロジックはMicrosoftの公式サイトにVBのコードですが載っています。
今回はそれをgolang用に書き直しています。
https://docs.microsoft.com/ja-JP/office/troublesh

元記事を表示

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:

元記事を表示

OTHERカテゴリの最新記事