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

Go関連のことを調べてみた2021年05月25日
目次

DockerのTTYって何?

## 概要
docker-composeでよくコンテナ永続させるためにttyをtrueに設定してコンテナが正常終了しないようにしている記事があるが、ttyってそもそもなんなの、なんでコンテナが正常終了しないの?というところを忘備録として残しておきます。

## コンテナが正常終了する例としてGoコンテナをみてみる
“`yml
version: “3.8”
services:
go-app:
build:
context: .
dockerfile: ./docker/go/Dockerfile
volumes:
– ./src/sample-go-fluentd:/go/src
ports:
– 10881:8080
working_dir: /go/src

# ここをfalseに
tty: false
“`
“`bash
$ docker-compose up
# …省略
go-app_1 exited with code 0
“`
こんな感じログが吐かれてコンテナが停

元記事を表示

kongのカスタムプラグイン(Go)の作り方

## はじめに

kongのカスタムプラグインについて、色々ハマったので、メモ。
情報自体はそれなりにあるのだが、kongバージョンが古いときの情報が多く、最新(2.4.1)ではちゃんと動作しなかったので、まとめておく。

## TL;DR
* コンパイルするコンテナイメージ(kong/go-plugin-tool)のバージョンは新しいものにしておく。そうしないとコンパイルが通らなかった。
* kong自体はdockerで構築したので、Dockerfile内で`/usr/local/bin`に生成したバイナリをコピーしておく。
* 起動時の環境変数は以下を設定する。今回はプラグインを`key-checker`とした。

|変数名|値|
|—|—|
|KONG_PLUGINSERVER_NAMES|key-checker|
|KONG_PLUGINSERVER_KEY_CHECKER_QUERY_CMD|/usr/local/bin/key-checker -dump
|KONG_PLUGINS|bundled, key-checker|

## 作業の流れ

最初はバージョンと

元記事を表示

[エラー] Golang-migrationを使っていて 「Dirty database version 2. Fix and force version.」が出た時の対処法

# この記事で説明すること
`golang-migrate`ライブラリを使っていてデータベースのマイグレーションをしたときに

“`
error: Dirty database version 1. Fix and force version.
“`
というエラーが出た時の対処法

# 環境
– golang 1.15
– MySQL

# 解決法
`migrate force` コマンドを使う

“`
$ migrate -database ‘mysql://root:golang@tcp(mysql:3306)/golang_db?charset=utf8&parseTime=true&loc=Asia%2FTokyo’ -path migrations/ ${VERSION}
“`

-database以降はDBのURLを指定
-pathでマイグレーションファイルの場所指定
${VERSION}の部分はエラーで出ているVERSIONを数字で指定。

# エラーが起きた原因
テーブルを構成を編集したくて、`migrate down`コマンドを使った後に、マイグレーションフ

元記事を表示

DynamoDBのテーブル設計&Goでの実装プラクティス〜GSI Overloading編

業務ではRDBを使うことが多く、DynamoDBにマッチしたテーブル設計・実装をこれまであまり考えてこなかったため、記事としてアウトプットしながら勉強していきたいと思います。
GSI Overloading、隣接関係のリスト設計、転置インデックス、Composite Key、Sparse Indexesあたりに触れていければと思います。今回は、GSI Overloading編。なお、DynamoDBの基本的な用語については理解されている前提とします。

## GSI Overloadingとは?
直訳すると「GSIの多重定義で」、**一つのGSIに複数の検索条件を持たせる**ための手法です。
これだけ聞いても、**どのような場面で使うのか**、**どのようなメリットがあるのか**がわかりにくいと思うので、それぞれ説明します。

### どのような場面で使うのか
**テーブルが持つ複数のカラムに対して検索をかけたい時**に使用します。全く特殊なケースではなく、むしろかなり多くのケースで当てはまります。
例えば以下のようなイベントテーブルがあったときに、IDだけでなく、他のカラム(イベント

元記事を表示

raspiにスマートリモコン&メディアプレイヤーをのせてみた⑧

# はじめに
こちらのブラウザ側の解説です。

# 概要
### 以下の機能を提供
– ウェブサーバとwebSocketで接続してリアルタイム通信
– vueLoaderでコンパイルなしでvueコンポーネントを提供

# ファイル構成
***vue.jsなどの外部js,cssについてオフラインでも使えるようにcdnではなくlocalから取得するようにしています***

| No | ファイル名 | 概要 |
| — | —————— | —- |
| 1 | index.html | トップページ |
| 2 | js/index.js | メインjs |
| 3 | home.vue | ルートコンポーネント。4のXXX.vueを切り替え |
| 4 | vue/room/XXX.vue | 部屋コンポーネント。5のYYY.vueを切り替え|
| 5 | vue/device/YYY.vue | 家電コンポ

元記事を表示

raspiにスマートリモコン&メディアプレイヤーをのせてみた⑦

# はじめに
こちらのデバイスサーバの解説です。

# 概要
### デバイスサーバで以下の機能を提供
– 受信した家電操作情報(エアコンの気温など)をIR送信サーバに転送
– 共有設定されている家電情報をウェブサーバに送信

# サーバ内の各層の機能概要
### infrastructure
– grpc
– 他の機能との共通コンテンツの受信や送信
– device
– 家電操作情報と赤外線データの関連付け
– 赤外線データを追加・修正する場合はここのマップ変数に対して行う

### adapter
共通設計参照

### useCase
共通設計参照

### do

元記事を表示

raspiにスマートリモコン&メディアプレイヤーをのせてみた⑥

# はじめに
こちらのメディアサーバの解説です。

# 概要
### メディアサーバで以下の機能を提供
– ウェブサーバからのメディア操作をvlcに反映
– vlcからの再生位置をウェブサーバに転送
– ファイルサーバからのファイル管理情報をvlcに反映

# サーバ内の各層の機能概要
### infrastructure
– grpc
– 他の機能との共通コンテンツの受信や送信
– media
– vlcとgoのvlcラッパーで構成
– grpcから受信したメディア操作の送信はチャンネルを使う

### adapter
共通設計参照

### useCase
共通設計

元記事を表示

raspiにスマートリモコン&メディアプレイヤーをのせてみた⑤

# はじめに
こちらのファイルサーバの解説です。

# 概要
### ファイルサーバで以下の機能を提供
– ウェブサーバからのバイナリ(ビデオファイル)を受信しファイル保存
– ビデオファイル一覧をウェブサーバ・メディアサーバに送信

# サーバ内の各層の機能概要
### infrastructure
– grpc
– 他の機能との共通コンテンツの受信や送信
– バイナリ(wsでpostされたファイル)をstreamで受信
– file
– 起動時にjsonファイルからファイル一覧を読み込みインメモリ化
– インメモリで管理しているファイル一覧をjsonに保存
– バイナリをmp4形式保存
– mp4からanimeGIFを作成

### adapter
共通設計参照

### useCase
<

元記事を表示

raspiにスマートリモコン&メディアプレイヤーをのせてみた④

# はじめに
こちらのウェブサーバの解説です。

# 概要
### ウェブサーバで以下の機能を提供
– スマホからのビデオファイルをファイルサーバに転送
– ファイルサーバからのビデオファイル一覧をスマホに転送
– スマホからのメディア操作をメディアサーバに転送
– メディアサーバからの再生位置をスマホに転送
– 家電操作情報(エアコンの気温など)をデバイスサーバに転送
– デバイスサーバからの家電操作情報(エアコンの気温など)をスマホに転送

# サーバ内の各層の機能概要
### infrastructure
– grpc
– 他の機能との共通コンテンツの受信や送信
– バイナリ(wsでpostされたファイル)をstreamでファイルサーバに送信
– ws
– echoとwebSocketで構成
– webSocketでブラウザへの送信はチャンネルを使う
– GET:indexとPOST:fileはrestで受信、それ以外はweb

元記事を表示

raspiにスマートリモコン&メディアプレイヤーをのせてみた③

# はじめに
こちらの共通設計の解説です。

# 概要
ウェブサーバ上で以下4つの機能を独立してgrpcで通信しているが、一定のルールを設けて内部設計を同じにしている。
また、共通の型、共通の処理は別パッケージに抜き出してそれぞれが参照できるようにシンボリックリンクで共通利用できるように設計
– ウェブサーバ
– ファイルサーバ
– メディアサーバ
– デバイスサーバ

# ディレクトリ設計
大枠の設計にStandard Go Project Layoutを適用
internal内のディレクトリ設計にclean Architectureを適用

元記事を表示

raspiにスマートリモコン&メディアプレイヤーをのせてみた②

# はじめに
こちらのセットアップの解説です。

### 今回使用した機器
– Raspberry Pi4(8GB) + SSD(1TB)
– Raspberry Pi Zero WH + ADRSZIRS x 2台

スマホから動画のアップロードできる機能もあるのでSSDのセットアップも手順に含めています。
SSDはお好みのサイズで。
赤外線送信にはhatと呼ばれる上にのせるタイプを使用しています。

### raspiをsdカードにインストール
メディアサーバでモニタに出力するので最初からデスクトップ環境が入っているイメージをダウンロードします。
手順は割愛します。

### OSセットアップ
– 言語は日本語を選択
– [Raspberry Piの設定]でSSHを有効化
– [Raspberry Piの設定]でI2Cを有効化
– [Raspb

元記事を表示

raspiにスマートリモコン&メディアプレイヤーをのせてみた①

raspi上で動くスマートリモコン&メディアプレーヤを作成しました。
セットアップ手順も作成しています。

初心者向けに作成しているつもりなので興味があればレッツトライ!
ちょっとだけ初期費用はかかりますけど今時の中学生のおこづかいで買えるかもしれません。
※お父さんのおこづかいで買えるかはわかりません!!

# 全体図
![whole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282746/0fb54f72-9e55-6ad6-4c05-4ea7776159b0.png)

# 画面見本
### 寝室のエアコンとライト
ステータスはデバイスサーバに保存しブラウザ側に同期
![bed_ambient1 (コピー 1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282746/26233916-06ad-1c80-407d-95b3e5c07f8b.png)

### 寝室のプロジェクタ
こどもの

元記事を表示

マイナビプログラミングコンテスト2021(AtCoder Beginner Contest 201) 参戦記

# マイナビプログラミングコンテスト2021(AtCoder Beginner Contest 201) 参戦記

2週連続でコケてしまった…….

## [ABC201A – Tiny Arithmetic Sequence](https://atcoder.jp/contests/abc201/tasks/abc201_a)

2分で突破. 書くだけ.

“`python
A = list(map(int, input().split()))

A.sort()

if A[2] – A[1] == A[1] – A[0]:
print(‘Yes’)
else:
print(‘No’)
“`

## [ABC201B – Do you know the second highest mountain?](https://atcoder.jp/contests/abc201/tasks/abc201_b)

4分で突破. 高さがそれぞれ相異なることが保証されているので、何も考えずソートすればいい.

“`python
N = int(input())
ST =

元記事を表示

NVENCを用いた複数並列エンコード【FFMPEG】

# NVENCを用いた複数ストリームエンコード【FFMPEG】

以前の記事で触れたNVENCチップの搭載数と最大セッション数の話
[ffmpeg NVENC についての(個人的な)評価とまとめ](https://qiita.com/Soleiyu/items/712ae291dc732f69afc6)
[Video Encode and Decode GPU Support Matrix](https://developer.nvidia.com/video-encode-decode-gpu-support-matrix)
この意味を最近考えるようになったので検証・まとめを行う
![hoge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/c275af65-ec16-6a77-b74b-26f7bb4c0a2b.png)
このPCに搭載しているGPU (Titan X) は 1GPU, 2NVENC チップを搭載しており、
最大のセッション数は3である

ならば3本まで並列でNVENCを

元記事を表示

Go言語でパスパラメータの値を構造体に自動代入させる

`Go`言語でWebアプリケーションを開発する際に、パスパラメータの値を構造体に`parse`することはよくあることです。
例えば、下記のようなエンドポイントがあるとして、まずパスパラメータを受け取り、次にそれらのパラメータを構造体にparseしたいとします。

“`
/firstname/{first_name}/lastname/{last_name}
“`

パラメータの受け取りは[gorilla/mux](https://github.com/gorilla/mux)を使えば、できることが分かっています。
`mux.Vars`関数を使えば、いい感じに`map`にして返してくれます。
今回お話ししたいのは、この`map`を構造体に`parse`する方法についてです。

## `json`パッケージを利用して`parse`する方法があるが・・・
この`map`の中身を構造体に`parse`する方法も実はあって、`json`パッケージを使えば簡単にできてしまします。
このソースは、[The Go Playground](https://play.golang.org/p/ovoL

元記事を表示

Go言語でJSONオブジェクトの順序を維持したままスライスに変換する

## はじめに

`encoding/json` パッケージを利用してJSONオブジェクトをパースする際に、JSON文字列の順序の通りのスライスに変換する方法をご紹介します。

## TL;DR

– [json.Unmarshaler](https://pkg.go.dev/encoding/json#Unmarshaler)を実装して[Decoder.Token()](https://pkg.go.dev/encoding/json#Decoder.Token)で順次変換する
– 雑にパースするためのライブラリを作ったのでご利用ください ([reference](https://pkg.go.dev/github.com/kamiaka/go-jsonutil))
– 新しく作るものではではJSONオブジェクトに順序をもとめてはいけない

## モチベーション

既存のAPIレスポンスなどでキーの順序に意味のあるJSONオブジェクトを扱うため、スライスとしてパースする機会がありました。

当初は `map[string]*Value` のようなmapとしてパースすることを検討しまし

元記事を表示

Goのvalidatorパッケージで、バリデーションをしつつ空白を許容する場合

1~2ヶ月くらい前からGoを書き始めてるのですが、
下記でハマったというか、 カスタムバリデーションを作ろうとしてしまったので、備忘録的に記載。
Goの[validator](https://pkg.go.dev/github.com/go-playground/validator)で、空白を許容しつつバリデーションをしたい場合、[omitempty](https://pkg.go.dev/github.com/go-playground/validator#hdr-Omit_Empty)タグを利用すれば良い。

## 例

“`go
type testForm struct {
code string validate:”omitempty,len=6″`
}
“`

## ハマった理由

[required](https://pkg.go.dev/github.com/go-playground/validator#hdr-Required)のバリデーションが存在するのに、なぜ他のバリデーションに関して空白を許容しないのかと混乱しつつ、omitempt

元記事を表示

突然、業務上必要に駆られたひとのための、Go言語入門 – おかわり

https://qiita.com/e99h2121/items/68ec25a343d81eaae2e3

を書いたものの…

## Go言語入門、おかわり

やりたいことはなんとなくできるようになったが、もう少しGo言語と仲良くなりたくなったので、続き。以下など参考。

https://qiita.com/suin/items/22662f43b6a6e8728798

### 改めて

https://xn--go-hh0g6u.com/doc/

Go プログラミング言語はオープンソースプロジェクトで,プログラマの生産性を上げます。

> Go は表現力豊かで,すっきりして簡潔,なおかつ効率的な言語です。 並行メカニズムにより,マルチコアでネットワークにつながれたマシンの最大性能を引き出すプログラムを容易に書くことができます。 革新的な型システムがあり,柔軟でモジュール化されたプログラム構成となります。 Go は素早く機械語にコンパイルされます。 ガベージコレクションの便利さもあり,実行時のリフレクションも可能です。 速く,静的型付け,コンパイル言語でありながら,動的型

元記事を表示

【Go】プログラム内で定期実行させるライブラリ Cron

docker コンテナ内でcrontabがうまく動作しなかったので、Goプログラム内で定期実行をさせた。

# 実行環境
* golang 1.16.4-buster コンテナ

# インストール
“`bash
go get github.com/robfig/cron/v3@v3.0.0
“`
# Cron
まず、コード例

“`go:main.go
package main

import (
“fmt”
“github.com/robfig/cron/v3”
)

func main() {
c := cron.New()

// 3秒ごと、「Hello World!!」と出力される
c.AddFunc(“@every 3s”, printHelloWorld)

// 毎日、午前8時に「Hello World!!」と出力される
// cron式でもスケジューリングの設定ができる
c.AddFunc(“0 8 * * *”, printHelloWorld)

//追加したジョブを開始
c.Start()

// プログラ

元記事を表示

goでwebサーバーを起動する

## memo
* _(アンダーバー)は、アンダースコア変数と呼び、宣言はするが後で使用しない変数を意味する。

“`:アンダースコア変数を使用してスライスの中身を取り出す。
for _, value := range values {
fmt.Println(value)
}
“`
“`:スライスからkeyとvalueを取り出す。
for key, value := range values {
fmt.Println(key)
fmt.Println(value)
}
“`

## apiのuriからリクエストパラメータを取得する
“`
var param string = r.FormValue(“param1”)
“`

## webサーバーを立ち上げる

* main.goファイルの中で `main` 関数が一番最初に実行される
* `go run main.go` でmain.goがコンパイルされたうえで実行され、api用のwebサーバーが立ち上がる。

“`:main.go
package main

import (
“en

元記事を表示

OTHERカテゴリの最新記事