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

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

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

元記事を表示

Goの命名に頭を悩ませよう

## 命名の大切さ

名前は大切です。それは人の名前だったり、商品名だったり、そしてプログラミングにおける識別子だったり、どれも大切です。名は体を表す。設計と命名は表裏一体であり、良い命名は良い設計に繋がります。

ここでは主にGoの命名について考えていきます。

Goはよく名前を短くするの習慣であると勘違いされます。[Goに入ってはGoに従え](https://ukai-go-talks.appspot.com/2014/gocon.slide#24)においても『与えられたコンテキストの中でわかりやすい名前にする』とされています。

命名については[Goの命名規則](https://micnncim.com/posts/ja/go-naming-convention)という記事をみるとよくまとまっています。この記事で参照されている公式ブログの記事はかなり前の記事です。つまり、Goはリリース当初から名前が短ければ短いほどよいとしているわけではありません。

## 文脈を構築する

名前(識別子)は、プログラミング言語に登場するオブジェクトを識別するために用いられます。ここでは、変数、関

元記事を表示

Ruby と Go それぞれで依存性の注入を書く

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

昨日は @kametaro さんの記事でした。 [RaftのErlang実装ことはじめ – Qiita](https://qiita.com/kametaro/private/a680d74da572f43ae493)

本日は、「 Ruby と Go それぞれで依存性の注入を書く」です。
Ruby の DI の是非は問いません。

## 環境
Ruby 2.6.1
Go 1.18.2
macOS Monterey ver. 12.3.1 Apple M1

## Ruby
?
“`ruby
class SubmachineA
def sub_process
# …
end
end

class Machine
def main_process
SubmachineA.new().sub_process
end
end

元記事を表示

個人的な新しいプログラミング言語に取り組むときの学習方法

# はじめに

新しくプログラミング言語を学ぶときに使用している型みたいなもので
筆者が現状このように学習を進めている、すすめていったら良いかなと思っているものです。

今回はGo言語について話していますがGoでなくともこのように学習をすすめたら
実務に入りやすいかなと思う方法を記述しております。

実務でスクリプト言語を扱うことが多いのですが
コンパイラ言語も使いたい、ということで人気のあるGo言語の基礎の部分を触ってみました!

まずは触ってみるのが一番ということで
他言語との違いだったりGo言語ならではの仕組みだったりを確かめながら実際に触ってみると
理解が深まると個人的には思います。

記事の流れはおすすめ記事 → ロードマップというようになっておりますので
気になるところからお読みいただけたら幸いです。

# 対象読者

こちらの記事はGo言語について深く触れるものではなく、
Go言語を触ってみたいけど何からはじめていいかわからないという方や
他の言語でも学習方法に困っている方におすすめな記事です。

# 目次
– [はじめに](#はじめに)
– [対象読者](#対象読者)

元記事を表示

Go言語でpingコマンドっぽい、でもpingコマンドじゃないpongコマンドを作ってみた

# はじめに

* Go 言語で pong コマンドを作成しました
* **PO**ng is **N**ot pin**G** :「pong コマンドは ping コマンドではありません」
* 本コマンドは kurehajime 様の作った「 [Go言語でpongコマンドを実装する](https://qiita.com/kurehajime/items/f9d225fab5eaa736913b) 」に多大な影響を受けております

# pong コマンドとは?

まずは、以下の画像をご覧ください(下記 Qiita の記事より借用しております)。

:::note warn
注:この画像・コマンドは私の作ったものではありません。
:::

![pong.gif](https://qiita-image-store.s3.amazonaws.com/0/33890/12c873d0-de1d-bb19-ccb7-7134984c09cd.gif)

あるいは以下の記事、もしくはリポジトリをご覧ください。

https://qiita.com/kurehajime/items/f9d225f

元記事を表示

GoでデータフレームパッケージのOSSを作ってみた話

## はじめに
Goのデータフレームパッケージを作り、OSSとして公開しました。この記事では、このOSSをつくるまでの経緯と、今回作った[Goban](https://github.com/hrbrain/goban)の基本的な仕組みの解説をしていきます。

### こんな人に読んでほしい
– OSSを作ってみたいが、何をしたらいいのかわからない
– Goを使ったデータフレームパッケージを探している
– Gobanにコントリビュートをしてみたい

## データフレームとはなにか
そもそも、データフレームについて聞いたことのない方も多いと思います。データフレームについては、以下の説明がわかりやすいです。

> データフレームとは、スプレッドシートのような、行と列からなる二次元のデータ構造です。データフレームは、柔軟かつ直感的にデータを格納し操作できるため、現代のデータ分析において最も一般的なデータ構造です。

引用元:[DataFrames – Databricks](https://www.databricks.com/glossary/what-are-dataframes#:~:t

元記事を表示

Goの並列テストでよくあるバグ(tt := tt忘れ)に対する対策

この記事は[tenntenn Advent Calendar](https://qiita.com/advent-calendar/2022/tenntenn)の1日目の記事です。

本記事は、[Gopher塾](https://gopher.school)で扱ったテストの話で、参加者の方から質問が出た並列テストにおけるよくあるバグについての解説とGo 1.20以降で入る対策について書きます。

## 並列テストとサブテスト

Goでは、テスト関数内で`(*testing.T).Parallel`メソッドを呼び出すとテストを並列に実行できます。テストを並列に実行することでテストを効率よく行い、実行時間の削減が見込めます。

また、`*testing.T`型には、サブテスト(子テスト)を実行するための`Run`メソッドがあり、サブテストを並列に実行できます。Goではテーブル駆動テストがよく用いられため、各テストケースがサブテストとして実行されます。テストの効率化を考えて、各テストケースを`Parallel`メソッドを用いて並列に実行することが多いです。

## 並列テストでよくあるバグ

元記事を表示

AWSのSigV4署名を付与してHTTPリクエストを送るRubyとGoのサンプルコード

この記事は、[リンクバルアドベントカレンダー2022](https://qiita.com/advent-calendar/2022/linkbal)の1日目の記事です。

## はじめに
SigV4署名を付与してHTTPリクエストをするRubyとGoのサンプルコードです。

AWSで、IAM認証をしたAPI GatewayのAPIをリクエストするときなどに、SigV4署名は必要になります。

AWS SDKには、SigV4署名を付けてAPI Gatewayをリクエストしてくれる便利なAPIは存在しないので、SigV4署名の部分は実装する必要があります。ただし、署名をするためのライブラリは用意されているので、そちらを使えばすんなり署名ができます。

## Ruby
### ドキュメント
https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/Sigv4/Signer.html

### サンプルコード
重要な部分はコメントで説明しています。

“`rb
require ‘aws-sdk-core’
require ‘net/http’

元記事を表示

gcacheとは(golang)

# gcache とは
gcacheはgolangのキャッシュライブラリです。
データを一時的にキャッシュし、特定のキャッシュ削除を行う場合に便利なライブラリとなっています。

* 特徴
* 様々な有効期限付きのキャッシュを作成できる
* LFU、LRU、ARC
* スレッド(goroutine)セーフ
* エントリーを削除、削除、および追加するイベントハンドラーをサポートしている
* キャッシュが存在しない場合、キャッシュを自動的に読み込んでくれる

# 使い方

インストールするためには、go getコマンドを実行します。

“`
$ go get -u https://github.com/bluele/gcache
“`

一番簡単な例はこのようになります。

“`main.go
package main

import (
“github.com/bluele/gcache”
“fmt”
)

func main() {
gc := gcache.New(20).
LRU().
Build()
gc.Set(“key”, “ok”

元記事を表示

PowerShell上で実行するCLIアプリケーションでのエスケープ文字

# なんで気になった?

私はgoで作成していたCLIアプリケーションを時々微改修していたのですが、ふと思い立って、多数のファイルを逐次処理する箇所にプログレスバーを表示しようとしていました。コマンドライン上でプログレスバーを更新するとなった時、簡単かつ正攻法である方法といえば、既にプログレスバーが表示されている行で、キャリッジリターンで行頭に飛び、全て上書きするというものが挙げられると思います。
普段私はそのアプリケーションをPowerShell上で動かしており、それに対応できる、最悪それだけには対応していれば良いという方針で方法を探っていました。
その中で、 *PowerShellでは、キャリッジリターンは“ `r “で表現する* という文を見つけました。PowerShell内で試してみたところ、実際そのようだと思わえました。

“`powershell
Write-Host “ab`rc” # Output: cb
“`

なので……

“`go
func processFiles(fileNames []string) {
fileNum := len(fileN

元記事を表示

VSCodeで複数のgo.modを持つディレクトリを開くとBrokenImportが出る

# 問題

VSCodeで開いるプロジェクトディレクトリ下に複数の`go.mod`が存在すると、`BrokenImport`のメッセージが出てしまいます。

![Screen Shot 2022-11-30 at 19.27.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676735/3ca2a10b-1ae6-3411-bd67-22c684392354.png)

# 解決法
各`go.mod`が存在するディレクトリがそれぞれworkspaceであることを明示するために `go.work` を作成します。

例えば`./gin/go.mod` `./http/go.mod` があるとしたら以下を実行します。
“`bash
$ go work init ./gin ./http
“`

そうすると以下のファイルがプロジェクトディレクトリ直下に作成されます

“`go.work
go 1.18

use (
./gin
./http
)
“`

`go.mod`が多い場合は、`go w

元記事を表示

生産性を高めるためにスペリスで採用しているデータ管理戦略

# はじめに
どうも、[スペリス](https://spalice.com/)で開発をしております、yasunagaです。

最近、仕事で使用しているHelmのドキュメントの中で、自分が翻訳したのが載りました。
拙い訳ですが、是非、見ていただけますと幸いです?‍♂️

https://helm.sh/ja/docs/chart_best_practices/dependencies/

https://helm.sh/ja/docs/chart_best_practices/labels/

さて、この記事では、普段仕事で使用しているデータベースのセットアップの方法について紹介したいと思います。

セットアップの方法を設計する際に一番心がけたのは、

**セットアップの手順が増えないこと**

です。

環境構築する際に、コマンドを叩く量が増えると、それだけつまづくリスクが増えるので、一つのコマンドで簡潔させたい理想からスタートして、構築を進めました。

## 対象読者
* GoなどでAPIを作成している方
* Gormなどを使って、データベースへのアクセスを行なっている方
* データ

元記事を表示

AWS Lambdaとkagomeを組み合わせてお手軽に形態素解析APIを作る

# 対象読者
– AWS Lambda未経験でとりあえず何か作ってみたい人
– 自前で形態素解析APIをお手軽に用意したい人

## 動作確認環境
– `Go 1.9`
– `M1 MacBook pro` OS :`MAC OS X 12.4 Monteray`

# 概要
Goで書かれた形態素解析エンジン `kagome` と AWS Lambdaを使って形態素解析APIを作ってみる。

## モチベーション
みなさんは普段業務で形態素解析って使ってますか?
私は流通系の会社に勤めているため、商品に含まれてはいけない成分があるかを調べたり、日本語の商品説明を外国語に翻訳するとき、固有名詞を抽出するのに使っています。

公開されているサービスですと下記のようなものがあります。

https://developer.yahoo.co.jp/webapi/jlp/ma/v2/parse.html

https://labs.goo.ne.jp/api/jp/morphological-analysis/

しかしながら、このようなオープンなサービスでは提供者の都合によるサービス終了や停止

元記事を表示

Ubuntuにてgccgoを使ってアセンブリ

go + nasmを使ってみたかったのでサンプルのhello worldを出力してみました。

参考はこちら(12年前の投稿だけど):

https://stackoverflow.com/questions/2951028/is-it-possible-to-include-inline-assembly-in-go-code

バージョンがいろいろ狂っているので、ちょっと直したいところです。

“`bash
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.7 LTS
Release: 16.04
Codename: xenial

$ sudo apt-get -y install golang
$ go version
go version go1.6.2 linux/amd64 #古すぎな

$ sudo apt-get -y install nasm
$ nasm -version
NASM version 2.11.08

$ s

元記事を表示

Gethのコードを理解する①(デバッグ環境構築編)

## はじめに
Ethereumを理解するには、Geth(Go-ethereum)の理解が必須と感じるので、Gethを勉強する。
第一弾はGethのデバッグ環境構築編。

※間違っている情報があれば、ご指摘いただければ幸いです。

## Geth環境構築の目標
+ **Gethコードの変数をデバッグする**(変数の中身を確認できる状態にする)
+ Gethでプライベートネットワークを起動する

## バージョンなど
#### 開発環境
+ OS: Ubuntu20.04
+ Geth Version: 1.9.25-stable (最新バージョンだとエラーが出たため、古いバージョンを選択)
+ Geth Git Commit: e7872729012a4871397307b12cc3f4772ffcbec6
#### 依存ツールのバージョン
+ golang: version go1.19.3 linux/amd64
+ make: GNU Make 4.2.1
+ git: version 2.25.1

## Geth環境構築の方針

### Gethを動かすOS
以下のOS

元記事を表示

Go チャネルの基本的な知識

## チャネルとは

GoルーチンとGoルーチンの間でデータの受け渡しをするためのGo特有のデータ構造。

## チャネルの型

チャネルの型はchan データ型のように書く。以下の例はint型のチャネルを作っている。

“`go
var ch chan int
“`

## チャネルの特性

チャネルの中に何かしらのデータを入れると、それを取り出してからでないと他のGoルーチンはチャネルに何のデータも入れることができない。またチャネルから何かデータを取り出そうとしたときに空だった場合、箱に何かが入るまでプログラムの実行は中断される。

`←chan`とすると受信専用チャネルになる。

“`go
var ch1 <-chan int ``` `chan←`とすると送信専用チャネルになる。 ```go var ch2 chan<- int ``` 特に指定しないと双方向のチャネルとなる。 ## チャネルのバッファ チャネルはキューの性質を備えるデータ構造。キューは先入先出の性質があり、キューに先に入れられたデータは先に取得される。 バッファはこのキューを格納する領域のこと

元記事を表示

Goルーチンの基本的な知識

## Goルーチンとは

スレッドよりも小さいGo特有の処理単位。goではこのGoルーチンを生成し、並行処理を実行できる。ゴルーチンとも言う。

## Goルーチンの使用方法

`go 関数名`の形で実行すればその関数はGoルーチンとなる。

## sync.WaitGroup

Goルーチンは完了しても特に何の通知もなく終了してしまう。
そこで終了を検知する仕組みが必要。それがsync.WaitGroup。
WaitGroupの値に対してWait()を呼ぶと、WaitGroupが0になるまで待ってくれる。
以下のように使う。

mainの書き方

“`go
func main() {
var wg sync.WaitGroup
wg.Add(Goルーチンの数)
go Goルーチン(&wg)
wg.Wait()
}
“`

関数の書き方

“`go
func 関数(wg *sync.WaitGroup) {
処理
wg.Done()
}
“`

### ポイント

– まず最初に`sync.WaitGroup`を`wg`という変数に入れる。
– `wg.Add()`

元記事を表示

OTHERカテゴリの最新記事