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

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

【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

元記事を表示

Goとスクレイピングに同時に入門する

# この記事は?

この記事は [ウィルゲート Advent Calendar 2022](https://adventar.org/calendars/7899) 4 日目の記事です。

Go言語でHello Worldをしたことがなく、Webページのスクレイピングもやったことがない人が、Go言語でWebページのスクレイピングしてみる入門用の記事です。
「コピペでひとまず動かしてみる」ことが目的なので、詳しい関数の解説などはありませんがご了承ください。

この記事では「WILLGATE TECH BLOG」のトップ画面に表示されている、記事の投稿日とタイトルをスクレイピングで取得する例を紹介します。
https://tech.willgate.co.jp/

## 参考文献

『Go初心者でも作れるスクレイピングツール』という本を読んで勉強しました。
初めてGoとスクレイピングをやる私でも分かりやすい内容で書かれており、技術書展の同人誌でページ数も少ないのでとても入門しやすい本でした。

https://techbookfest.org/product/513360399853158

元記事を表示

フロントエンドエンジニアがGoとWebAssemblyでTodoアプリを作ってみた

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

**モチベーション**
普段フロントエンド領域の開発を主にしていますが、バックエンド領域の知識も深めたいと思いGoの勉強を最近始めました。
そこでGoを使ってフロントエンドのアプリケーションを作りたいと思い、WebAssemblyを使用し簡単なTodoアプリを作ってみることにしました。

とはいえ、まずは各技術に詳しくないので軽く調べてみました。

# WebAssembly(以下 wasm)とは?
– wasmと略される
– ネイティブに近いパフォーマンスでWeb上で動作するバイナリ形式の低レベルのアセンブリ言語
– JavaScriptと並列して動作する
– C/C++/Rustなどからwasmにコンパイルできる

# Goでwasmを使うにはどうすればいい?
方法
どうやらGoの環境変数を設定すればよさそうです
“`
GOOS=js GOARCH=wasm
“`

# 実際に手を動か

元記事を表示

Goのsliceはsafeじゃない

Advent Calendar 4日目の記事です。

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

この前とある実装をしているときに、既存のコードをちょっとだけいじった結果、不思議な挙動に遭遇しました。

事象として面白かったので共有します。

## それでも消えてしまったナポリタン

![Why Naporitan?](https://3.bp.blogspot.com/-ZqZspTd0ZIA/W_UF-X0HCQI/AAAAAAABQUQ/_2wjI30hVIY4e61qegf0D_-4BQK4GnJggCLcBGAs/s800/food_spaghetti_neapolitan.png)

まずはコードを見ていただきたいと思います。

ある日、こんなコードがありました。(※転載用に要点絞って改変してあります)

“`go
type Item struct {
Options json.RawMessage
}

type (
Option struct {
Value string
}
Options =

元記事を表示

Go でやる mutation testing ~テストの品質を評価しよう~

## Mutation testing とは

– テストの品質を評価する手法の一つ
– テスト対象のプログラムの一部を機械的に書き換えたときに、テストが失敗させられるかを確認する手法

![mutation-testing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150399/d76a45eb-9d73-38c9-aa24-cf50ae6030f7.png)

大まかな流れは以下の通りです。

1. **プログラムを一部改変**
* 改変されたプログラムのことを “mutant” と呼びます
2. **1.で改変した状態でテストを実施**
3. **テストが`失敗`するかどうかをチェック**
* いずれかのテストが`失敗`するなら、 テストが十分であるとし、`OK`とします
* 全てのテストが`成功`するなら、テストが不十分であるとし、`NG`とします

このプロセスをたくさん実行し、いろいろなプログラムの改変(“mutant”)を試してその結果の`OK`の割合が高

元記事を表示

呪文:&[]bool{true}[0], aws.Bool(true)

Golangを書いている時に、ワンライナーでbooleanのポインタを実装したいと考えていたら出会ってしまった**悲しき化け物**を紹介します。

### ワンライナーでbooleanのポインタを実装

ある日、Golangを書いているときにbooleanのポインターをワンライナーで実装したいという願望が生まれました。
そこで生まれたのがコイツです。

“`Golang
IsFoo: &[]bool{true}[0]
“`
~~`IsFoo: &true`~~ のように書ければいいのですが、Golangではbooleanのポインタを取ることはできません。

どうしてもワンライナーで実装したかったので、booleanのスライスの要素のポインタを取ることで解決しました。

### ワンライナー実装の仲間

booleanワンライナー実装は、以下の書き方でも可能です。
“`Golang
IsFoo: aws.Bool(true)
“`
`aws-sdk-go`を使っているプロジェクトであればこんな書き方もできます。

でもawsを使っている場所でもないのに`aws

元記事を表示

Hugo ドキュメント (日本語訳) を公開しました

## Hugo ドキュメント (v0.105) の非公式日本語訳を GitHub Pages で公開しました

Hugo の公式ドキュメントは、下記のサイトで公開されていますが、これまで日本語訳がされていませんでした。

– [Hugo Documentation](https://gohugo.io/documentation/)

**注**: 正確に言うと、[Hugo Documentation の和訳・日本語翻訳プロジェクト](https://hugojapan.github.io/) が3年前に立ち上がりましたが、「Hugo V1 リリースまで活動停止」とのことで事実上、日本語の翻訳サイトは存在していません。

自分でサイト公開する上で、Hugo を使うことにしたので、Hugo ドキュメントの日本語訳がないのは不便であるため、
非公式に (個人的に) 日本語訳を行うことにしました。

現状、Google 検索では検索結果に出てきませんので、以下の URL をブックマークしてください。

– [Hugo ドキュメント (日本語訳)](https://juggernautjp.

元記事を表示

graceful shutdown可能な非同期リトライするGoライブラリをOSSとして作った話

# はじめに
はじめまして。Kyashでサーバサイドエンジニアを担当しているhirobeです。
[Kyash Advent Calendar 2022](https://adventar.org/calendars/7407)の12/3担当分です。

最近は技術基盤を整理することが多いのですが、やりたいことを実現する上でgraceful shutdown可能な非同期リトライするGoライブラリが必要になり、1週間ほどで実装し、OSSとして公開しました。

今現在のステータスとしては、本番環境で利用するためにQAをしているところです。2022年中にはKyashの本番環境にて使われることは間違いないと思います。

実装する前に既にそのようなOSSがあるかざっと調査したのですが、なさそうでした。OSSの機能の詳細は後ほど紹介しますが、「君のやりたいことはこのOSSで既にできるぞ」といったツッコミも歓迎します。

便利だと思ったら使ってくれると非常に嬉しいです!

レポジトリは以下です。

https://github.com/Kyash/async-retry

# なぜ必要になったか

元記事を表示

sijms/go-oraを使ってOracleDBを操作してみる (Golang)

Go言語を学び始めて1ヶ月の私が、Oracle DBのCRUD処理を実装する必要があったので、記事を書いてみようと思います。

# 1. はじめに

## 1.1. 読んでみてほしい対象者

* Go言語でOracle DB接続を実装したい人
* OR Mapperを利用できないため、簡易的にDB処理を実装したい人

## 1.2 利用するOracle Driver

今回利用するOracle Driverは`sijms/go-ora`です。

https://github.com/sijms/go-ora

`sijms/go-ora`はv1とv2がありますが、v2を利用します。
(Oracle 10.2以降はv2の利用を推奨と公式でも書かれています。)

私が利用を検討した結果の`sijms/go-ora`のメリット/デメリットは下記です。

* メリット
* 導入が簡単
* Go言語のみで作成されたOracle Driverのため、`Oracle Instant Client`などのインストールは不要で、`go get`コマンドさえ打てばすぐ使えます。

元記事を表示

OTHERカテゴリの最新記事