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

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

Go言語で自分なりの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()`

元記事を表示

Finch の内部実装を見てみた。

## 今 話題になっている Finch

https://qiita.com/yoshii0110/items/692018729b5b2f41b9ac

などを見ていただければ分かりますが、Finch は `ローカルマシン上に仮想環境とコンテナランタイム、ビルドツールなど一式を楽〜に導入` できるツールになっています。
そのコードが

https://github.com/runfinch/finch

にあります。
コードは Go で書かれていて、Cobra(Go の CLIツール)を使って CLIのコマンドラインを作っています。
簡単に言えば バージョン 0.1.0 の名前から分かるように、Cobra で nerdctl や lima を呼び出しているだけの簡潔な内容に見えます。

それでは、その内容を見てみましょう。

## Cobra のエントリーポイント

Cobra の説明は、

https://zenn.dev/tama8021/articles/22_0627_go_cobra_cli

を参照してみて下さい。

Cobra のエントリーポイントは、`finch/c

元記事を表示

Goroutine はじめました

[外資就活](https://gaishishukatsu.com) のプッシュ通知処理を Go にリプレースする際に、Goroutine を利用して配信を並行処理するようにしたため、その実装を紹介します。
手探りで実装したため、Goroutine の同時実行数の制御などの考慮はできていなかったりしますが、実装して運用するに至ることはできたので備忘録も兼ねた記事となります。

# FCM を利用してプッシュ通知配信
最大で20,000件の配信を行う必要があります。
なるべく一括で配信して FCM へのリクエスト数を減らしたかったため、 [500件のメッセージを一括送信](https://firebase.google.com/docs/cloud-messaging/send-message#send-a-batch-of-messages) をする API を利用しました。
また500件の一括配信を `Goroutine` を利用して並行処理しました。

## 実現したい事
– Goroutine を利用した並行処理
– 送信に失敗した FCM トークンの削除
– エラーハンドリング

元記事を表示

SQLへの繋ぎ方(mySQL)

## やること
Dockerでdbサーバを立てて、そこにアプリケーション上からアクセスする

### Dockerでdbサーバを立てる
今回はMySQLを使用(理由はなんとなく)
“`yml:docker-compose.yml
version: ‘3’

services:
db:
image: mysql:5.7
environment:
– MYSQL_DATABASE=sample_db
– MYSQL_ROOT_PASSWORD=password
command: >
–character-set-server=utf8mb4
–collation-server=utf8mb4_general_ci
ports:
– 3306:3306
“`
と記述した。
その後、この`docker-compose.yml`があるディレクトリで、
“`
$ docker-compose up -d
“`
を実行して、コンテナを起動する。
コンテナが起動できているかどうか確認するには、
`

元記事を表示

[Golang]Cognito操作

## 注意

細かいエラー処理などはしていないのであくまでも参考程度にしてください。

ほとんどなぐり書きなので使う前にコードを整えてから使ってください。

## 共通の環境引数

– export CLIENTSECRET=
– export CLIENTID=
– export USERERPOOlID=

##ライブラリの全体像

![Screenshot 2022-11-29 at 02-27-20 cognitoauth – Go Documentation Server.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681799/7122c124-5a23-3fc8-ae88-e3ee0948195e.png)

## ライブラリ

“`golang:cognitoauth.go

package cognitoauth

import (
“crypto/hmac”
“crypto/sha256”
“encoding/base64”
“fmt”
“os”

“github

元記事を表示

【Go言語】翌月末を求める

Go言語で翌月末を求める方法について記載してみました。

# 単純なAddDateではだめ

## 7/31の1ヵ月後
月を+1した場合に存在する日付の場合はOK。
“` go
t, _ := time.Parse(“2006/01/02”, “2023/07/31”)
fmt.Println(t.AddDate(0, 1, 0))
“`
“`
// 出力
2023-08-31 00:00:00 +0000 UTC
“`

## 8/31の1ヵ月後
月を+1した日付(9/31)は存在しない。
これを存在する値に変換する処理が走り10/1となります。(これをGoの正規化と呼びます)
“` go
t, _ := time.Parse(“2006/01/02”, “2023/08/31”)
fmt.Println(t.AddDate(0, 1, 0))
“`
“`
// 出力
2023-10-01 00:00:00 +0000 UTC
“`

# 月初の2ヵ月後の1日前を求めればよい
8/31の月初は8/1、その2ヵ月後は10/1。
その前日は9/30なので求めたかった翌月末

元記事を表示

io/fs でのエラー解決方法 “cannot load io/fs: malformed module path “io/fs”: missing dot in first path element”

* エラー内容
* io/fsとは?
* 解決方法

# 1. エラー内容
いつも通り、go言語でプログラムを書いていると、
“`
cannot load io/fs: malformed module path “io/fs”: missing dot in first path element
“`

どうやらio/fsが認識していない模様…
そもそもio/fsとはなんぞや?

# 2. io/fsとは?
Go1.16からio/fsパッケージとして導入されました。
主に、ファイルシステムの抽象化の役割を担い、例として、ZIPファイル等をサードパーティライブラリを使わずにGoのみで埋め込めるようになったりします。
保守のしやすさと、可読性が向上したといえるでしょう。

# 3. 解決方法
今回の場合は、io/fsがGo1.16から導入されたとのことで、私が使っていたGo1.13では対応していませんでした。なので、使われる方は、バージョンをアップして使用しましょう。

https://qiita.com/yuta_vamdemic/items/43fc04d98182f7bb

元記事を表示

個人開発しました

http://4card.me/

  • OTHERカテゴリの最新記事