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

Go関連のことを調べてみた2022年11月14日
目次

Goでjsのmapやfindなどを使いたい

## はじめに
jsでよくやっているこんな感じのコードをGoでも書きたい。けど外部のパッケージは入れたくない場合の対処法を紹介します。

“`ts
type Skill = {
name: string
}

const skills: Skill[] = [
{ name: ‘Ruby’ },
{ name: ‘Javascript’ },
{ name: ‘Python’ },
]
const py = skills.find(s => s.name === ‘Python’)
// => {name: “Python”}
console.log(py)

const names = skills.map(s => s.name)
// => (3) [“Ruby”, “Javascript”, “Python”]
console.log(names)
“`
## find
まず適当にsliceを用意。

“`go
package main

type skill struct {
name string
}

func main() {

元記事を表示

go言語でWindowsをシャットダウンする

## 結論

exec.Command を利用する

“`go
exec.Command(`shutdown`, “-s”, “-t”, “0”).Start()
“`

## 注意点

exec.Command だけではなく、以下を呼び出す必要がある(でなければ、コマンドは実行されない)
1. Output() // stdout
1. CombinedOutput() // stdout, stderr
1. Start() // プロセスの終了を待たない
1. Run() // プロセスの終了を待つ

引数について

“`go
exec.Command(`shutdown`, “-s”, “-t 0”).Start()
“`

では動かない。
どうやら、スペースで区切られたものをすべて切り出して引数にする必要があるらしい。(“-t 0” -> “-t”, “0” にしないと動かない)

元記事を表示

【Golang】Go で OpenPGP のペア鍵を生成する【GopenPGP】

> Go 言語(以下 Golang)で、[OpenPGP](https://ja.wikipedia.org/wiki/Pretty_Good_Privacy#OpenPGP) の公開鍵と秘密鍵を作りたいと思うも、公式の [golang.org/x/crypto/openpgp](https://pkg.go.dev/golang.org/x/crypto@v0.2.0/openpgp) のドキュメントを見ると `deprecated`(廃止)になっていて、ガチョーン。
>
> しかも、 `golang.org/x/crypto` を使っていると [CVE-2022-27191](https://github.com/advisories/GHSA-8c26-wmh5-6g9v) の脆弱性を指摘される。

さらに、Go の公式は「[後継のパッケージは色々あるけど、おすすめというものはないよ](https://github.com/golang/go/issues/44226)」ときたもんだ。どうしよう。

## TL; DR (今北産業)

元記事を表示

AWS MediaLiveを使った擬似リニア配信方法 ~実践編~

# ? 擬似リニア配信(Virtual Linear OTT)とは?

擬似リニア配信とは、24時間/365日、番組表などのスケジュールに従って時間通りに配信する仕組みになります。事前に収録済み動画ファイル(mp4など)を使ってあたかも生配信しているかのようにライブ映像として流します。いわゆるケーブルTVみたいなものです。本資料ではMediaLiveのスケジュールアクション機能使った擬似リニア配信の実現とより実践で使える設定・設計について説明します。

注: MediaLiveをMLと省略して説明します。

## MLで実現するための流れ ~基礎編~

1. 動画ファイルをs3にアップロードする
1. MLチャンネルを作成する
1. スケジュールアクションを登録する

### 1.動画ファイルをS3にアップロードする

配信したい動画を事前にs3にアップロードします。
| ファイルパス | 用途 |
|:———–|:————|
| s3://demo-bucket/CM.mp4 | 本編動画を流す前の動画、今回は仮でCM(宣伝)動画 |
| s3://d

元記事を表示

Prometheus始めてみた #1 -概要から導入まで-

prometheusを触る機会があり,自分の環境で使ってみました.
本記事は「”Prometheus Up & Running”(Brian Brazil, O’Raily Media, 978-1-492-03414-8, 日本語版「入門 Prometheus」 オライリー・ジャパン」を参考にしております.

# Prometheusとは
正確には[公式ホームページ](https://prometheus.io/)の方が詳しいと思うので概要だけでも紹介します.
> Prometheusは,「オープンソースのメトリクスベースモニタリングシステム」.

と本には書いてありました.じゃあ,メトリクス,モニタリングって何?ってところから入りましょう.

### メトリクスとは
メトリクスはイベントから出された様々な情報を,扱える大きさに削減するための方法の一つだそうです.
といっても,分かりにくそうなので,メトリクスが具体的にどういった情報を指すのかというと,HTTPリクエストを受け付けた回数,リクエストの処理に使った時間,現在処理中のリクエストの数などが挙げられます.この辺りは実際にpro

元記事を表示

vscodeで[packages.Load error: err: exit status 2: stderr: go: no such tool “compile” go: no such tool “compile”]エラー発生したときの対処法

## 詳細
vscodeでgo.modにて以下エラー発生
“`
packages.Load error: err: exit status 2: stderr: go: no such tool “compile” go: no such tool “compile”
“`
![Screen Shot 2022-11-11 at 17.54.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323144/8a340e3b-dd58-2a10-5aba-1d65edf95488.png)

## 結論

### vscodeのsetting.jsonのgopathが間違ってた

ローカルの$GOPATHが
“`bash
$ echo $GOROOT
/usr/local/go
“`

なのに、vscodeのsetting.jsonで指定されたpathが`/usr/local/go/bin`なので事象発生してた

![Screen Shot 2022-11-11 at 18.00.00.png](

元記事を表示

direnvで設定された環境変数はVSCodeで反映されない!?と思っていたら初歩的なミスでした。

ここで参照する本は**Go言語でつくるインタプリタ**(ISBN: 978-4-87311-822-2)、(以下、猿本と言います)。
この本のソースコード群をダウンロードして使用しているので、ディレクトリ構成とかは本に従います。
***
大学の授業で猿本を教科書として使用しています。授業資料に従うがまま環境(`$GOPATH`、`$GOROOT`等の環境変数の設定など)を整え、Ubuntuのターミナル上でプログラムを実行させることはできたのですが、しかし、VSCode上では環境変数の設定が反映されていないようで、
“`text:/01/src/monkey/main.go
could not import monkey/repl (cannot find package “monkey/repl” in any of
/usr/lib/go-1.18/src/monkey/repl (from $GOROOT)
/home/***/go/src/monkey/repl (from $GOPATH))
“`
とエラーが出ます。
どうやら`$GOROOT`と`$GOPATH`か

元記事を表示

GoのWebアプリをAzure App Serviceにデプロイする

# はじめに

2022年11月、実験版ながら再びLinuxでのAzure App ServiceでGoがサポートされました。

– [Go available on App Service – Azure App Service](https://azure.github.io/AppService/2022/10/12/Go-on-AppService.html)

初代(?)は2017年12月にサポート対象外となりました。

– [AzureでWebアプリを稼働させる「App Service」とGo – Qiita](https://qiita.com/qt-luigi/items/1cbcdc9efb2f5b4ec6f8)

今回は、Goのコードがデプロイされて、組み込みイメージを使ってLinuxコンテナーでコンパイル&実行されます。

デプロイ手順が「[app-service-linux-docs/use_go_with_appservice.md at master · Azure/app-service-linux-docs · GitHub](https://githu

元記事を表示

【Go】エラー「go.mod file not found in current directory or any parent directory」が発生した場合の対処法

## 概要
Go 言語でエラーが発生した場合の対処法の備忘録

## 事象
エラー: `go: go.mod file not found in current directory or any parent directory`
? Go 言語を初めて扱う場合によく遭遇するエラー
![go_環境構築_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/2abef0b5-f31a-fdfb-08f3-1f86fbedf779.png)
(単純な Hello World 表示プログラムでのエラー例)

## 原因
`go.mod` ファイルが同階層もしくは親階層に見つからないため。

「go.mod ファイルが無いよ」と怒られているので、このファイルを用意する必要があります。
`go.mod` ファイルは、1つのプロジェクト(今回の事例なら「Hello World を表示するプログラム」という単位)で使用される go プログラム全体を管理するファイルのこと、…というイメージです。

## 対

元記事を表示

【Go】Go言語の環境構築手順とHelloWorld作成(まとめ)

## 概要
Go言語(golang)の環境構築方法、および、簡単な「Hello World」プログラム作成方法の備忘録

## 前提
– 使用PCスペック
– OS: macOS 12.4

– Go バージョン: v1.19
– Go の公式サイトは現在英語しかなさそう

## 手順

### インストーラをダウンロード

公式サイト([go.dev](https://go.dev))にアクセス
![go_環境構築_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/2fd499d7-a8bc-19d0-209d-85d575222e07.jpeg)

トップページの「Download」ボタン、もしくは「Get Started」ページ内のダウンロードボタンを押すと
以下のダウンロードページに行けるので、ここで自分のPCのOSに合ったインストーラを選択してダウンロード
![go_環境構築_02.png](https://qiita-image-store.s3.ap-northeast

元記事を表示

golangとAWS Cognitoで認証機能を実装してみた

# 環境について
## Cognitoへのアクセス準備
Cognitoへ接続するためには
`aws_access_key_id`
`aws_secret_access_key`
がそれぞれ必要なので、[AWS SDK for Go](https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#creating-the-credentials-file)を見て下記のファイルを作成します。
“`text:credentials
[default]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
“`
それぞれのKeyについてはIAMでCognitoへのアクセス権限を持ったユーザーを作成すると発行される。

上記で用意したDockerfileにコンテナ内へコピーするコマンドを追加
“`docker:Dokerfile
〜略〜
#

元記事を表示

Gormの使い方についてまとめてみた

goを使ってGormを使ってデータベース操作する必要が出てきたのでいろいろ調べた結果をまとめます。

# データベーススキーマの作成

まずはスキーマの作成の仕方についてみていきます。

### Migrate

Migrateは、接続先のスキーマを参照して、テーブルやカラムがなければ自動的に作ってくれるコマンドです。
足りない関連やテーブルを自動で作ったりはしてくれるが、勝手にカラムを消したりすることはしないとのこと。

> **Auto Migration**
>
> Automatically migrate your schema, to keep your schema up to date.
>
> > NOTE: AutoMigrate will create tables, missing foreign keys, constraints, columns and indexes. > > It will change existing column’s type if its size, precision, nullable changed. It WON’

元記事を表示

Ubuntu22でGo Fyneを使ってAndroidアプリを作ってみた

## はじめに
Go言語でGUIを作ることができるfyneなのですが、モバイルアプリを作ることができるというので、実際にfyneでAndroidアプリが作ることができるか試してみました。

## 前提条件
OS Ubuntu22.04
Go go1.19 linux/amd64
Go言語とfyneのインストールはしてある前提で話を進めます。

Go言語のインストールとfyneのインストールは、[Fyne Develop Getting Started](https://developer.fyne.io/started)、または、@hibikingさんのこちらの記事[GO言語のGUIライブラリ「Fyne」のインストール方法](https://qiita.com/hibiking/items/58a3e93e67394fa1bb4f)を参考にしてください

## 参考にした記事(Youtubeの動画)
実際にAPKファイルを作る方法は、こちら[Golang Fyne: How to compile *apk for Android | Golang Fyne tutorial](http

元記事を表示

非同期処理のメモ

“`server.go
go service.LastAccessUpdater.Run(ctx)
// このdeferでsignal受けた後同期的に溜まっているものがあったらupdateするようにする
defer service.LastAccessUpdater.Flush(ctx)
“`

“`handler/auth.go
// bufferに追加
h.LastAcccessUpdater.Add(user.UserID)
“`

“`service/last_access_updater.go
package service

type LastAccessUpdater interface {
Run(context.Context)
Add(string)
Flush()
}

type LastAccessUpdaterImpl struct {
sync.Mutex

loginManager service.LoginManager
buffer []string
}

func NewLastAccessUpdater(l ser

元記事を表示

CRC32の再現方法を求めて

## 巡回冗長検査

[巡回冗長検査(Wikipedia)](https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E5%86%97%E9%95%B7%E6%A4%9C%E6%9F%BB)

ファイルの完全性検査などにはSHA256やMD5が使われますが、短いテキストのようなデータの場合、SHA256やMD5は結果が長すぎて使いにくいことがあります。

その点、CRC32は結果が32bitで、16進数表記でも8文字で済むため、元のテキストの代替として使うのに簡便です。

しかし、CRC32と一口に言っても実はいくつかの方式があり、異なる値を算出します。

## CRC32の種類

前掲のWikipediaのページを見ても、32bitのCRCには(厳密にはCRCでないAdler32も含めて)
– CRC-32Adler (厳密にはCRCではないがよく混同される)
– CRC-32
– CRC-32C
– CRC-32K

の4種類が掲載されています。CRC-32Adlerは計算方法が全く異なりますが、それ以外の3つは、Wikipedia記事中で

元記事を表示

【Golang】heredoc で CLI のヘルプ表示のコードをインデント付きで読みやすくする【ヒアドキュメントのインデント】

# 複数行にまたがる文字列のインデント

> Go 言語(以下 Golang)の `(バックティック、バッククォート)を使った、**複数行の文字列を可読性のためにインデントさせたい**。

## TL; DR (今北産業)

1. `import “github.com/MakeNowJust/heredoc/v2″`
– https://github.com/MakeNowJust/heredoc @ GitHub
– Package [heredoc](https://github.com/MakeNowJust/heredoc) provides the here-document with keeping indent.
– [heredoc](https://github.com/MakeNowJust/heredoc) パッケージは、インデント関係を維持したまま、[ヒアドキュメント](https://ja.wikipedia.org/wiki/%E3%83%92%E

元記事を表示

多次元スライスにスライスを挿入する

## やりたいこと
“`
[[1 2 3]]
“`
という多次元スライスに
“`
[4 5 6]
“`
というスライスを足して
“`
[[1 2 3] [4 5 6]]
“`
にしたい

## やり方
“`golang
package main

import “fmt”

func main() {
sliceA := [][]int{
[]int{1,2,3},
}

sliceB := []int{4, 5,6}

sliceA = append(sliceA, sliceB)

fmt.Println(sliceA) //[[1 2 3] [4 5 6]]
}
“`
入れ物になる方の型`[][]int`はintのスライス(`[]int`)のスライスという意味。
`[]int`が挿入する方の型と同じじゃないとエラーになるので注意

元記事を表示

Goコードのクラス図をPlantUMLファイルとして自動生成する

Goコードのクラス図をPlantUMLファイルとして自動生成する (Goにはクラスはないため、正確には「structの関係図をクラス図として表現したもの」である)。

## 環境
– Ubuntu 20.04 LTS (WSL2)
– Go 1.19.3

Goはインストール済みであるとする。

## ツールのインストール

“`sh
# goplantumlのインストール
go install github.com/jfeliu007/goplantuml/cmd/goplantuml@latest
“`

## 手順

“`sh
# クラス定義作成対象のコードを準備 (ここでは、goplantuml自体を利用)
git clone https://github.com/jfeliu007/goplantuml.git input

# plantuml用のファイルを生成
goplantuml -recursive ./input/parser > ./parser.puml
“`

ここまでで、`parser.puml`としてPlantUMLのファイルが生成できた。

元記事を表示

Goの環境構築

## 前提
M1 Macbook

この記事で示す手法は2通りです。
HomeBrewを用いた環境構築
Dockerを用いた環境構築

HomeBrewもしくはDockerの環境構築が済んでいることを前提とします。
参考記事が山のようにあると思うので検索してみたください

## Home Brew
`brew i go`
以上です。

`Goenv`の利用や`GOPATH`の設定は必要ないです。
`Go`は後方互換性が確保されているので、Versionはガンガン上げて良いです。
`GOPATH`に関して昔はいろいろやる必要があったみたいですが、現在(`go 1.19`)では必要無くなったらしい
シンプルで良いですね。むしろシンプルすぎ。

*余談ですが、Goの実行は下記コマンドです*
`go run main.go`

## Docker
`docker-compose.yml`を使います。
`Dockerfile`だけを使う方法もありますが、`servise`が1つでも`yml`使った方が色々便利ですよね。

*構成は下記*
“`
backend
– Dockerfil

元記事を表示

GoのOpenAPI3.0コードジェネレータ、oapi-codegenでchiのコードを生成しサーバーとして動かす

GoのOpenAPI3.0コードジェネレータであるoapi-codegenは、yaml定義からGoのコードを生成できる。
今回は、サーバサイドのコードをchiで生成し、サーバとして動かすところまでを実施する。

https://github.com/deepmap/oapi-codegen

## 環境
– Ubuntu 20.04 LTS (WSL2)
– Go 1.19.3

Goはインストール済みであるとする。

## 0. goプロジェクトの作成

“`sh
mkdir go-oapi
cd go-oapi
go mod init gen
“`

## 1. コードの生成

生成元となるyamlのサンプルを準備する。以下のファイルを`petstore-expanded.yaml`として作業フォルダに保存する。

https://github.com/deepmap/oapi-codegen/blob/master/examples/petstore-expanded/petstore-expanded.yaml

また、以下を`config.yaml`として作業フォルダに

元記事を表示

OTHERカテゴリの最新記事