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

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

Goのクロスコンパイル(MacでビルドしてRaspberry Pi Zeroで実行)

Raspberry PiでGo(gin)のプログラムをビルドしたら割と時間がかかったので、手元のMacでRaspberry Pi用にビルドすることにした時のメモ

# Goでビルド時のターゲットに指定できるプラットフォームを確認 
以下を実行するとビルドのターゲットに指定できるプラットフォームのリストが出力される。
Raspberry Pi ZeroでLinux系のOSを使用している場合はlinux/armが該当するのでクロスコンパイルが出来そう。
“` shell
% go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm64
illumos/amd64
ios/amd64
ios/arm64
js/wasm
linux/386
linux/amd64
linux/arm
linux/arm64
l

元記事を表示

k6 のテスト結果を datadog で可視化してみる

この記事は [弁護士ドットコム Advent Calendar 2022](https://qiita.com/advent-calendar/2022/bengo4com) の 6 日目の記事です。

# k6 とは
k6 とは Grafana Labs とそのコミュニティによって開発されている OSS で、パフォーマンステストを簡単に行うことができる負荷テストツールです。特徴としては以下のような点があります。

* OSS 版とクラウド版がある
* テストシナリオを Javascript で記述する
* HTTP / WebSockets / gRPC などのプロトコルに対応している
* 結果を Grafana はもちろん Datadog等でも可視化できる

https://k6.io/

インストール方法は [ここから](https://k6.io/docs/get-started/installation/) 確認できます。

# 今回やること
今回は k6 を使って golang製サーバーへ負荷テストを実施し、試験経過を Datadog で可視化するところまでやってみようと思

元記事を表示

entで実行されたSQLを確認する

## はじめに
[株式会社 RetailAI X Advent Calendar 2022](https://qiita.com/advent-calendar/2022/retail-ai-x) 6日目の記事です。

最近、Go言語のORMである[ent](https://entgo.io/ja/)を触っています
自分が書いたプログラムがイメージ通りのSQLを発行できているのか確認したい時があったので、やり方を調べてみました

## データ取得処理
### 通常時
“`
client.User.Query().All(ctx)
“`
clientの中身は[こんな感じ](https://entgo.io/docs/crud#create-a-new-client)に作ります

### SQLを確認したいとき
“`
client.Debug().User.Query().All(ctx)
“`
clientに対して`Debug()`を実行すると、新しいデバッグクライアントが返却され特定の操作に対して詳細なログを取得することができます

“`
2022/12/03 01:34:5

元記事を表示

Go言語で桁数指定可能な四捨五入関数を作る

こちらは、HRBrain Advent Calendar 2022 6日目の記事です。

https://qiita.com/advent-calendar/2022/hrbrain

どうもこんにちは、HRBrainでバックエンドエンジニアとして働いてる藤原です。1年に1度のペースで記事を書いております。

今回は、小数を任意の桁数で四捨五入する関数をGo言語で作りたいと思います。 その実現方法と注意点について書いていきます。

# Go言語の標準の四捨五入関数
Go言語標準の`math.Round`関数が用意されています。
しかし、こちらは桁数指定ができず、小数第一位を四捨五入して整数にするというものです。
“`golang
func Round(x float64) float64
“`
https://pkg.go.dev/math#Round

今回は桁数指定までできる、より汎用的なRound関数を作っていきたいと思います。

# まずは素直に実装してみます

“`golang
func Round(num float64, pos int) float64

元記事を表示

Goの関数ではゼロ値はリテラルで返してほしい気持ちをLinterで綴る

## 何を作ったのか

どうも[株式会社ナレッジワーク](https://kwork.studio/)の@tenntenndです。

以下のような、変数をそのまま返しているやつ嫌ですよね。それをチェックするツールを作りました。

“`go
func f() struct{} {
v := struct{}{}
return v // ヤダ
}

func g() (v struct{}) {
return v // ヤダ
}
“`

https://github.com/gostaticanalysis/zerolit

## どう作ったのか

Goには静的解析ツールを作る機能が標準ライブラリで提供されています。詳しくは[分厚いスライド](https://tenn.in/analysis)をご覧ください。

ざっくりとしたアルゴリズムは以下の通りです。

* 代入文を探し、ゼロ値じゃない値を代入しているものに印を付ける
* `return`文で変数を返しているものを見つける
* その変数がゼロ値じゃない値を代入してる印がついていなけれ

元記事を表示

Goでdiffコマンド書いて実際の実装と比べてみた

# はじめに

こんにちは。にしやまです。
この記事は[TechCommit AdventCalendar2022](https://adventar.org/calendars/7673)の6日目の記事です。
昨日はTomoさんの[【振り返り】2022年・週1回の輪読会を継続して良かった点・改善点](https://zenn.dev/h2tomo/articles/754d64a35bae13)でした。

# 概要

アドカレのネタどうしようと考えた結果、Goでdiffコマンドを実装してみようと思ったので、

– 実装してみたものの解説
– 実際のdiffコマンドの実装がどうなっているか読んで比べてみる

について書いてみます。

# 実装してみたものの解説

わりと手抜きなので、オプションなしで2ファイルの全比較のみしかできません。
また、実際のdiffコマンドのコードはこの時点では見ずに想像で書いているので実際のものとは実装が結構違うかもしれません(この後でそれを検証します)

## コード
こちらです。
コメントで多めに解説も書いています。

“`go
package ma

元記事を表示

runnを使ったWebバックエンドのe2eテスト

こちらは [HITOTSU株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/hitotsu) の5日目の記事になります。

こんにちは、[HITOTSU株式会社](https://hitotsu.co.jp/)にて、業務委託でプロジェクトに参画させていただいている [こうりん](https://twitter.com/Kourin1996) と申します。

HITOTSU内では、現在進めているプロダクトの技術選定から関わらせて頂いており、主にWebバックエンド開発に携わっています。(たまに、Reactのフロントエンドのコードを書いたりもします)

HITOTSUのプロダクトのWebバックエンドはGoを使っており、軽量Webフレームワークとして [labstack/echo](https://github.com/labstack/echo) を使用しています。

この記事では、Webバックエンド向けのツールとして [runn](https://github.com/k1LoW/runn) をご紹介させてい

元記事を表示

安西先生…!! ………書籍管理アプリを作りたいです……

安西先生…!!
………書籍管理アプリを作りたいです……
………
………
…Goで…
…読みやすいコードで…
…GraphQL…導入しましょう…
…あわよくばDDDも取り入れてみたいですね……

## この記事の目的
話題になっていた ChatGPT を触ってみたかった。
ChatGPT がどこまでコードを書けるのか気になった。
面白そう!

## ChatGPT ってなに?
twitter で見かけたのが最初ですが、こちらが質問したことに回答をしてくれる AI です。
↓ こんな感じです。
“`
自分: 元気ですか?
ChatCPT: はい、元気です。

自分: 今あなたが一番欲しいものはなんですか?
ChatCPT: 今一番欲しいものは、健康であり、幸せな毎日を過ごせることです。

自分: それはとても素晴らしいですね
ChatCPT: はい、ありがとうございます。

自分: 何か質問はありますか?
ChatCPT: いいえ、今は特に質問はありません。

自分: 質問してみてください。なんでも

元記事を表示

【Go/GCP】gin+entでCloud SQLと繋がるAPIを作る

# まえがき

野村総合研究所のk4nd4(かんだ)です。普段はVueやらTypeScriptやらに関わった活動をしていますが、Go言語にも興味がありプライベートで勉強していました。
本日はその一環で得たノウハウを記事にしてみます。ド初心者ですのでお手柔らかに・・・。

# やりたいこと

### Cloud SQL上のDB(Postgres)に接続し、データを読み書きするAPIをginで作成する。

– 今までNoSQLばっかり触ってきていたのでたまにはRDBも使いたい
– 業務ではAWSやAzureが多いが、個人的にはGCPが好み
– というわけでCloudSQLを使ってみたい
– そのくせしてSQLを書きたくないのでORMを介してデータ操作したい
– というわけでentを使ってみたい
– 有名所のフレームワークを使ってAPIを作ってみたい
– というわけでginを使ってみたい

# Cloud SQLの準備

GCPでCloud SQLのインスタンスを作成します。
今回はPostgresを選択しました。

具体的な手順は画面に従ってクリックで選んでいくだけなので

元記事を表示

CSVをgrepできるようにするコマンドを作った

この記事はGo Advent Calendar 2022の5日目の記事です。

CSVをgrepできるようにするコマンドを作ってみました。
CSVを検索するコマンドではありません。
grepと連携するコマンドです。

## 経緯

CSVのセルには改行文字が含まれ得ます。
改行文字の含まれるCSVをgrepすると、CSVのセルが壊れます。

具体的には、以下のようなCSVをgrepすると壊れます。

“`bash
$ cat testdata/sample1.csv
Language,Word,Note
English,”Hello
World”,note
Japanese,”こんにちは
こんばんは”,メモ
English,”John
Rose”,
Japanese,”太郎
花子”,

$ grep Japan a.csv
Japanese,”こんにちは
Japanese,”太郎
“`

grepで検索した文字列にマッチする行を抽出しつつ、
CSVフォーマットとして壊れないようにgrepしたかったわけです。

CSVを検索するツールとかは探せばあるんですけれど、grepの検索機能を

元記事を表示

【Vonage】Vonage SDKを使ってWebアプリで電話番号認証を実装【Go】

この記事は [VonageコミュニケーションAPIを使ってみた、Vonageのことなら何でも共有しよう! by Vonage Advent Calendar 2022](https://qiita.com/advent-calendar/2022/vonage) に参加しています。

## はじめに
私は昨年、Vonageさんのアドベントカレンダーを見かけて ↓ のような記事で参加させてもらいました。GoのSDKが見当たらなかったので作ってみる!という試みでしたが、終盤で「あれ、まだ大々的に紹介されてないけどGoのSDK開発中ですね!」と気づくという、ちょっと残念な結果に :sweat:

https://qiita.com/tenkoh88/items/6e97f28bc9dbb37a2e36

今回はそのリベンジの位置付けで、Vonageさんの`Verify API`をSDKを活用して使用する方法を、シンプルなWebアプリケーション例を通じて試してみました。

## この記事の内容
– おさらい:Vonageから提供されているサービス
– 電話番号を使った多要素認証の流れ
– G

元記事を表示

大規模リクエストを捌くコツ

# 記事作成の背景
先日、大規模リクエストを捌く計測サーバ構築を学習する機会があったので
そのアウトプットとして残します!!

## コツ
大規模リクエストを捌くコツは簡潔に言うと、以下の2点です!
1. DB周りの設定をしっかり行う
1. ネットワークコストを減らす

このコツに関して色々とお話します!
以下の流れで進んでいきます!
1. [改善前](#改善前)
1. [GoのDB周りの設定とコードの修正](#goのdb周りの設定とコードの修正)
1. [バルクインサート](#バルクインサート)
1. [改善後](#改善後)
1. [感想](#感想)

## 改善前
### パッケージ
1. net/http
1. log
1. go-sql-driver/mysql

### ソースコード
“`go:main.go
package main

import (
“net/http”
“log”

“database/sql”

_ “github.com/go-sql-driver/mysql”
“os”
)

func main() {
dataSourceNam

元記事を表示

GORMで実行されているSQL文を出力してデバッグする2つの方法

# TL;DR
Go言語のORMライブラリであるGORMを使った開発にて、SQL文を確認しながら実行する方法をご紹介します。

https://gorm.io/ja_JP/docs/index.html

単一のSQLを確認したいとき
“`go
db.Debug()..Create(&Product{Code: “D42”, Price: 100})
“`

全体の流れを追いたいとき
“`go
db.Logger = db.Logger.LogMode(logger.Info)
“`

と処理を追加すれば標準出力にSQL文が出力されるようになります。

# サンプルコード
GORMのサンプルコードを少し改変して、DB処理を含むGoのコードを書いてみました。

https://gorm.io/ja_JP/docs/index.html

“`go:main.go
package main

import (
“log”

“github.com/joho/godotenv”
“github.com/kelseyhightower/envconfig”
“gorm.i

元記事を表示

ハッカソンに参加してきた話

# はじめに
みなさん、こんにちは
Amebaの広告プロダクトチームでバックエンドエンジニアをやっている永井です。
この記事は、メディア事業部の広告横軸組織[PTA](https://twitter.com/PTA_CyberAgent)の[アドベントカレンダー](https://adventar.org/calendars/7539)5日目の記事となります。

# 概要
会社とは全く関係ないのですが、プライベートで[SPAJAM2022](https://www.spajam.jp/result/)に「お久しぶり!」というチーム名で参加し、ありがたいことに本戦で優秀賞と長崎賞をいただくことができました。ハッカソンという時間が極端に少ない状況において開発中に気をつけたこと、もっとこうしておけばよかったことを述べます。

# ハッカソンとは
念の為ハッカソンについて説明させてください。ハッカソンとは、ハックとマラソンを掛け合わせた言葉です。決められた期間内にテーマに沿ったアプリケーションを開発し、プレゼンして完成度やテーマ性にどれほど沿っているか競い合う競技になっております。今回お話しす

元記事を表示

Goの//lineコメントを君は知っているか?

## コメントディレクティブ

Goには、`//go:noescape`や`//go:linkname`などのコメントでコンパイラへの指示を記述するコメントディレクティブがあります。一応、[ドキュメント](https://pkg.go.dev/cmd/compile#hdr-Compiler_Directives)には記載がありますが、多くのGoエンジニアはあまり機会はないでしょう。

ドキュメントを読むと`//line`で始まるコメントは特別な意味を持つことが分かります。ここではこのlineディレクティブについて解説します。

## lineディレクティブ

ドキュメントには、以下のように記述した場合に、lineディレクティブとして認識されるようです。行コメントだけはなく、ブロックコメントも対象となります。`//`や`/*`の後ろにスペースを含んでは行けなかったり、`:`が必ず含まれていなければならなかったりと、細かなルールがあります。

“`
//line :line
//line :line:col
//line filename:line
//line filename:li

元記事を表示

GoProのGPSデータを抽出・結合・間引き処理する方法.(Linux環境)

## イントロ

GoPRO動画に記録されたGPSデータの抽出の方法を説明したサイトは多いが,「分割された動画のGPSデータを結合する」,「GPSデータの間引くを行う」といった操作の説明は少ない.
本記事ではなるべくローカル環境でしかもGUIソフトになるべく依存せずにLinuxコマンド操作でデータを処理する方法を紹介する.
ある程度,自力で環境構築,コマンドの意味を調べられるがGPXデータを一括でバッチ処理的に扱い,任意の点数でデータの間引きまで行いたい人向け.

## GOPROからGPS情報を抽出する.

次のコマンドで0:3を手掛かりにGPSデータが抽出される.
Go言語を使用する.

“`:a.sh
#!/bin/sh
GOPRO2GPX_FILE=~/bin/gopro2gpx
GOPRO2GPX_FILE=/home/user/go/bin/gopro2gpx

if [ $# -lt 1 ]; then
echo “Usage: $0 []”
exit 1
fi

IN_FILE_EX

元記事を表示

ISUCON攻略はじめの一歩

# 1. これはなに?
AWSにISUCONの過去問環境を作って初めてチューニングしてみるまでのメモです。
## 1.1 経緯
[ISUCON](https://isucon.net/) 2022年予選で”MySQL”がtwitterトレンドにあがってきて[阿鼻叫喚](https://twitter.com/mpyw/status/1550837779768442881?s=20&t=xadVPJPlAT7Rxfz-jHmWHg)の様子が面白過ぎました。
技術チャレンジ部で観戦していたら、いつの間にかチームを結成していました。
(来年参加目標。Webチューニング経験って中々出来ないし、これだけ[ガチスポーツ](https://isucon.net/archives/56735884.html)なコンテストは貴重な気がします。)

## 1.2 概要
* [ISUCON](https://isucon.net/) の過去問の[github](https://github.com/matsuu/aws-isucon)から取得したAMIイメージでAWS EC2環境を構築(お手軽です)。  

元記事を表示

【Go言語を学習して感じたこと ~他の開発言語と比較してみた~】

こんにちは。
新卒入社3年目文系出身のエンジニアです。
次の案件がGo言語を使用するとのことなので、
今ProgateやA Tour of Goを用いて学習しているのですが、
他の開発言語と異なる点を踏まえて、
印象的に感じたこと・驚いたことについてまとめてみました。
これからGo言語を勉強する方に参考になっていただければ幸いです。

### 変数の型定義が独特!
Java, JavaSciript, Go言語で比較していこうと思います。
Javaは**型名、変数名**の順番で定義していきます。
“`java:hello.java
String message = “”;
Int number = 123;
“`

JavaScriptでは、グローバル変数をつけると以下のようになります。
※グローバル変数とは?・・・プログラム内のどこからでも使える変数, 関数の外側でも使用することができる変数のことです。例)var, let
“`javascript:hello.javascript
var string message = “”
let int number = 123
“`

元記事を表示

clusterのroom serverの作り方

この記事は [クラスター Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cluster) の12/4の分です。
昨日は [warabi](https://twitter.com/Warabimochi_m) さんの[「ScriptableItemでTypeScriptを活用してみた」](https://zenn.dev/warabi/articles/052ea859550877)でした。TypeScriptでアイテム開発がはかどりますね。

クラスター株式会社でソフトウェアエンジニアをやってる [neguse](https://twitter.com/neguse) と申します。最近はもっぱらMarvel Snapというゲームを遊んでいます。

さて、clusterというサービスを構成するサーバは複数あり、それぞれ技術やコードベースが似通っているところもあれば異なるところもあります。
今回は **room server** と呼んでいるリアルタイム通信を司るサーバに焦点をあてて、開発に利用している技術や、普段

元記事を表示

Ruby・Node.js・Goのライブラリバージョン管理比較

## 対応表

| | Ruby | Node.js | Go |
|:-:|:-:|:-:|:-:|
| 言語バージョン管理 | rvm, rbenv

<例>
rbenv install 3.0.0 && rbenv local 3.0.0 #=> 3.0.0 (set by /Users/yokoto/.rbenv/version)| nvm, nodenv, n

<例>
nvm install 19.2.0 && nvm use 19.2.0 #=> Now using node v19.2.0 (npm v8.19.3) | go, goenv

<例>
go install golang.org/dl/go1.18.8 && go1.18.8 download #=> go version go1.18.8 darwin/arm64 |
| パッケージ管理ツール | Bundler

<例>
gem install bundler && bundler -v #=> Bundler v

元記事を表示

OTHERカテゴリの最新記事