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

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

フロントエンドエンジニアが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`コマンドさえ打てばすぐ使えます。

元記事を表示

Goを学ぶ有料講義を始めた話

## Gopher塾をきっかけ

2022年の10月より[Gopher塾](https://gopher.school)という有料の講義を始めました。参加頂いた方は、ありがとうございました!

[『チャンスは待たずに自分で作る ─ ソフトウェアエンジニアが「好きな技術」で生きていくための技術とは』](https://engineer-lab.findy-code.io/tenntenn-go)という記事にも書いた通り、有料にした理由は家族との時間を減らして行う個人活動の時間に一定の意味をもたせることです。

有料で行うからには、参加者が参加して良かったと思えるものにしなければいけません。[#1](https://gopher.school/1)はテストに関して、[#2](https://gopher.school/2)はGoらしいコードの書き方について扱っています(#2は開催予定)。

単なる使い方だけではなく、10年以上Goコミュニティで学んだ知識や開発経験、技術顧問などで複数社の設計・実装を見た経験を基に講義を構成しています。

また、私は内部構造を調べるのが好きなので、たとえばg

元記事を表示

Goでの列挙型を文字列ベースで作ってみる?

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

# Goでの列挙型どうしてますか?
こんにちは。
私は[弁護士ドットコム](https://www.bengo4.com/)株式会社の[クラウドサイン](https://www.cloudsign.jp/)事業本部で、Goを使ったバックエンドの開発に携わっています。

ところで、Goでの[列挙型](https://ja.wikipedia.org/wiki/%E5%88%97%E6%8C%99%E5%9E%8B)が欲しくなったとき、皆さんはどうしてますか?
私的には [iota](https://go.dev/ref/spec#Iota) が便利なんでよく使ってきました。

# 例題:フルーツバスケットを作ろう
列挙型を使う例題として、フルーツの種類を列挙型でコード化して、それを集めてバスケットに詰めるということをやってみたいと思います。

今回使ったGoのバージョンは以下のもの

元記事を表示

Beyond the Million Users[実践編]

朝起きたらまさかのスペインに日本が勝ってた!!!

勇気を貰えましたね。僕も頑張らねば…

前日の後編になります。今日は実践編です。

ふわとした記事なのでご容赦を…

ほぼポエムかもしれん。

kubernetes(クバネティス)を使ってサーバとDBのコンテナクラスタを作って遊ぼうしました。

## kubernetesとは?
コンテナオーケストレーションツールです。コンテナはdockerでimageから作るあのコンテナです。オーケストレーションとは、組織化、編成、調整、(管弦楽用に)編曲などの意味を持つ英単語。ITの分野では、大規模で複雑な情報システムの管理などをソフトウェアによって効率化、省力化、自動化することをこのように呼ぶことが多い。だそうです。要するに複数のコンテナを管理する技術のことです。これだけだとざっくりしすぎな説明なので詳しく知りたいてかたは[公式](https://kubernetes.io/ja/docs/home/)へgo!

今回はこのkubernetesをコンテナネットワーク(わかりやすいように造語を作った。クラスタ-のこと)を作るために使用し

元記事を表示

GoでSQL操作のテストを書く方法N選

この記事は[ニフクラ](https://www.nifcloud.com/)等を提供している、[富士通クラウドテクノロジーズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/fjct)の3日目の記事です。
前日は、@SogoK さんの「[よくあるSPA+API構成でのOpenID Connectクライアント実装](https://sogo.dev/posts/2022/12/openid-connect-fastapi)」でした。今まで認証処理に触れる機会が少なかったので、原理を知れて勉強になりました。(ユーザーに見えないところで何工程もリダイレクトが走っていたんですね…)

# はじめに

しっかり書きたいSQL周りのテスト。しかし、合わない手法を使うと、実行時間がかかってしまったり失敗時にゴミが残ってしまったりとテストを流すこと自体億劫になってしまいがちです。

そこで、本記事では備忘録も兼ねてGo言語でSQL操作のテストを書く方法をいくつかまとめてみました。

# 検証に使用したコード

見やすいように

元記事を表示

Exponential Backoff And JitterのUTを実装する

# はじめに
ZOZOでは[API Gatewayを内製](https://techblog.zozo.com/entry/zozotown-api-gateway-intro)しています。API GatewayによるAPIリクエストのリトライ時には、[Exponential Backoff And Jitter](https://aws.amazon.com/jp/blogs/architecture/exponential-backoff-and-jitter/)による待ち時間を経た後にリトライする仕様となっています。

# Exponential Backoff And Jitterとは
Exponential Backoff And Jitterとは、リトライ回数が増えるごとに待ち時間を指数関数的に増やし、かつランダム性も加えることで輻輳を防ぐための考えです。一定間隔での待ち時間を経たリトライに比べて、リクエストが詰まりにくくなるという利点があります。

Goでのコードは以下です。引数tryCountは、何回目のリクエストかを意味しています。0の場合は初回のリクエストです。引数

元記事を表示

Go言語でjsonパースしたときにどこがまずかったかを出力する小ネタ。

本記事は [ディップ with 全部俺 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/dip-with-all-me) 3日目の記事になります。

本日は掲題の通り、Go言語に関する記事です。

## どういう記事?

Goでjsonを取り扱うとき、 `”encoding/json”` の `json.Unmarshal` を利用することがあると思います。
エラーハンドリングを `if err !=nil`でやってしまうとある程度の情報は出してくれますが、ズバリこの辺!というのは知り得ない状態になってしまいます。

今回は、エラーのあった前後の文字を出力して、もう少し見やすいログにしようというコンセプトです。

## どうやる?

早速回答から。
“` go
var data MyDataStruct
raw, err := ioutil.ReadFile(“./example.json”)
if err != nil {
log.Fatalf(“ReadFile Error: %v”, err)

元記事を表示

GCP Cloud Vision よく使う機能まとめ ~ Go言語 ~

# GCP Cloud Vision 機能一覧 with Go 言語

『画像や動画から、文字情報やどのような物体が映っているかを AI で抜き出したい!』と思っている、そこのあなた
[Cloud Vision](https://cloud.google.com/vision) していますか?

Google Cloud Platform の [Cloud Vision](https://cloud.google.com/vision) というサービスを使うと簡単に画像認識 OCR や物体検知を高性能で体験できます。
Cloud Vision API の機能一覧と実際にどのような場面で使えるかをまとめました。

[Google Cloud Platform](https://github.com/GoogleCloudPlatform) が[豊富な例を GitHub](https://github.com/GoogleCloudPlatform/golang-samples)に上げてくれているので、興味ある方は実際に触ってみてください。

## 機能一覧

Cloud Vision A

元記事を表示

golangを勉強しようと思ったので調べたみた

# golang入門
PHPerなバックエンドがgolangをやってみようという記事。

## 前提
初学者ではなくある程度他の言語を経験して、go言語を習得してみようという人間の個人的な見解です。

## ツール
golandを使ってます。補完機能やコードフォーマッタとかがデフォルトでも割と使えます。
会社で買ってくれないので個人で買ってますが…:thermometer_face:

### 動機
静的型付け言語を学びたいというだけです。

## 学習方法
1\. 書籍
2\. 動画 (udemy)

### 1.書籍
[はじめてのGo言語](https://www.oreilly.co.jp/books/9784814400041/)
未読ですが最近出版されたばかりのなのでおすすめしておきます。目次だけみると一通り基本のことは学べるみたいです。

[実用 Go言語](https://www.oreilly.co.jp/books/9784814400041/)
これも今年発行された本で、実務で使うかた向けになるのでおすすめしておきます。

### 2.動画(udemy)
動画教材

元記事を表示

Go言語を使ったWEBアプリケーション作成の環境構築手順

# 概要
windowsでGo言語を使ったWEBアプリケーション作成の環境を構築する

※前提としてVSCodeはインストール済みである事とする。
参考
[VSCodeでGo言語の開発環境を構築する](https://qiita.com/melty_go/items/c977ba594efcffc8b567)

# 目次
[1. Go言語のインストール](#1-go言語のインストール)
[2. VSCodeのGo拡張機能をインストール](#2-vscodeのgo拡張機能をインストール)
[3. プロジェクトの作成](#3-プロジェクトの作成)
[4. echoを使ってWEBサーバーを作成](#4-echoを使ってwebサーバーを作成)
[5. goのコマンドのまとめ](#5-goのコマンドのまとめ)

# 1. Go言語のインストール
[ダウンロードページ](https://go.dev/dl/)よりwindows版のインストーラーをダウンロードする

![20221201-0011.jpg](https://qiita-image-store.s3.ap-northeast-1.a

元記事を表示

Goで画像変換&トリミングができる対話型CLIツール

これは[WEBCAMP ENGINEER COMMUNITY Advent Calendar 2022](https://qiita.com/advent-calendar/2022/webccamp-engineer-community)の2日目の記事です!

# 背景
この間、PCが苦手な友人が困っていました。

**友人「画像をECサイトに登録するために、JPEGに変換して、正方形に切り抜かないといけない。めんどくさい」
私「どうやってやってるの?」
友人「スマホでやってる」
私「PC使えば?無料ツールとか探せばあるでしょ」
友人「PCよく分からん。ペイント使えば出来るらしいけど。一発でやる方法ないかな〜」**

アドベントカレンダー用の題材に困っていた私は、「これだ!」と思い、勝手に自作することにしました。
仕事で使ったことはありませんが、最近Goが気になっているので、勉強も兼ねてGoで作ってみました。
Go製ツールは配布や実行もしやすいので、友人に使ってもらう際はその点も良さそうです。

# 作ったもの
こういった画像を、
![gopher.png](https://qiit

元記事を表示

SAMを利用したLambda(Function URLs)デプロイ

## はじめに

[フューチャーAdvent Calendar 2022](https://qiita.com/advent-calendar/2022/future) の2日目です。
この記事は今年2022年4月にリリースされた「Lambda Function URLs」を実務で利用したところ非常に簡単だったので、そのやり方を紹介する記事です。
SAM初心者の方向けの内容になります。

こんにちは、Future CSIG所属の二瓶賢です。
今年から[FutureVuls](https://vuls.biz/)という脆弱性管理サービスの開発チームで働いています。

さて、FutureVulsでは決済サービスにStripeや、メール送信サービスにSendgridといったwebサービスを利用しています。
そういったサービスではwebhookで異常を通知するケースが多いかと思いますが、それらwebhook受信用エンドポイントを都度用意するのが面倒という気持ちもあるかと思います。(私はそうです、特にサービスの検証段階だと猶更です。)

そこで、この記事では[AWS Lambda Funct

元記事を表示

【Go】値レシーバとポインタレシーバの違いと使い分けについて考える

この記事は「[Go Advent Calendar 2022](https://qiita.com/advent-calendar/2022/go)」2日目の記事です。

## はじめに
Goでは「型」に対してメソッドを定義します。
こんな風に…

“`go:main.go
type MyInt int

func (m MyInt) calculate() int {
return 1 + 1
}

func main() {
var m MyInt

fmt.Println(m.calculate()) // 2
}
“`
[Playground](https://go.dev/play/p/9lrKgTd6qNH)

ここでは`MyInt`という`int`型の「型」に対して`calculate()`というメソッドを定義しています。

型であれば何でも(`int`だろうと構造体だろうと)メソッドを定義できます。

「レシーバ」とはこのメソッドの引数`m`のことを指します。

https://go.dev/ref/spec#Method_declarations

元記事を表示

「Goのtime.Formatによるミリ秒切り捨て」と「MySQLのINSERTによるミリ秒四捨五入」で1秒の誤差が生まれた話

# 背景
2022年春頃にZOZOTOWNで[ログイン通知機能](https://zozo.jp/_help/default.html?id=6204a11db02e7e001df030c3)と[ログイン履歴機能](https://zozo.jp/_help/default.html?id=6204a0c3d79f060023f5d723)をリリースしました。QAのフェーズにおいて、「ログイン通知で表示されるログイン時刻」と「ログイン履歴で表示されるログイン時刻」で最大1秒の誤差が生まれるケースがあることが判明しました。どちらの時刻もミリ秒までは表示しない仕様です。1秒とはいえ、これらの値が不一致なのは問題なので原因調査と対策をしました。

# 原因
## ログイン通知で表示されるログイン時刻
ログイン通知で表示されるログイン時刻は、サーバがログインリクエストを受け付けた時の日時です。つまり、Goのアプリケーション上でのみ処理するデータです。アプリケーションでは、その日時を下のようにFormatし、ミリ秒を**切り捨て**ます。

“`go
package main

import

元記事を表示

OTHERカテゴリの最新記事