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

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

マイナビプログラミングコンテスト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

元記事を表示

Go言語入門 –基本文法–

Go言語の基本構文の説明を整理も兼ねて作成した。他の言語でよく使われる機能そのものの説明はしていない(配列など)。
説明に使用したコードは完全なものでない。コードを試したい時は随時パッケージの[インポート](#パッケージの宣言)や所属するパッケージを宣言(package main)すると良い。
Goの導入や基本的な構造(Hello Worldしただけ)は[この記事](https://qiita.com/KokiSakano/items/cf57210ba894314d6f4e)に書いたので気になる方は参照していただきたい。
# 型
## 数値の型
###整数の型
`int int8 int16 int32 int64`
一般的な整数の型として5つの型がある。
`intN`は$N$ビット幅の値となり、$-2^{N-1}\sim 2^{N-1}-1$の範囲の値を持つことができる。`int`は環境に依存する型であり、一般的に`int64`に相当することが多い(`int32`に相当することも多い)。冒頭に`0`をつけることで8進数、`0x`をつけることで16進数をリテラル表記することができる。

元記事を表示

フロントエンド(Nuxt)からheaderにidTokenを乗せて、バックエンド(Go)で認証してレスポンスを返す方法

# なにこれ
筆者がフロントエンド(Nuxt.js)からGoで作ったAPIサーバーにGETリクエストを送りたい!
って時に、Go側でfirebaseの認証をしようとしました。
その実装でかなり詰まったので、解決方法を備忘録として残しておきます。

# やりたいこと
– フロントエンドからバックエンドへGETリクエストを送る
– その時に、headerのAuthorizationにfirebaseのidTokenを乗せる
– バックエンドは送られたリクエストからheaderのidTokenを見て、firebase認証する
– okならstatus200とレスポンスを返す
– 認証に失敗したら401を返す

## 注意事項
Goを独学して1ヶ月で、もしかしたら記事の内容や自分の認識に間違いがあるかもしれません。
その時は小さな点でも構わないので、ご指摘いただけると非常に助かります!

## 前提条件
Goのwebフレームワークにginを使用しています
認証にはfirebase authを仕様

## この記事で説明しないこと
firebase authの説明
ginの説明
axiosの説明

元記事を表示

GormのWhere句で条件分岐付きで検索をかけたい

投稿した背景

バックエンドの言語はPHPでフレームワークはLaravelを使い続けていた筆者。
つい最近ひょんなことからGolangを使い始めたのである。
GolangのORMであるGormを使用した際にハマってしまったことを解決したので、新しい言語に挑戦するのと同時に Qiitaにも初投稿を試みるのであった。

※つまりは本投稿は初投稿かつ基本的なことしか書いてないのでGormもう得意です。って人は読み飛ばして大丈夫かと思います。お手柔らかに。

GormのWhere句で条件分岐付きで検索をかけたい

GormのWhereを使ってmehod chainingする際によく使用されるのは以下の様なコード。

“`
db.Where(“name = ?”, “jinzhu”).Where(“age = ?”, 18).Find(&user)
“`
このコードで実行される実際のSql文は以下のようになる。

“`
SELECT * FROM `users` WHERE name = “jinzhu” AND age = 18;
“`

しかし、例え

元記事を表示

Go: Server Sent Events のサンプル

こちらのページと同じことを行いました。
[Go言語でServerSentEvents(SSE)](https://qiita.com/taqm/items/e132a1aa55690a22b655)

![go_server_sent_events.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c1782f05-b9dd-046c-2223-4b171ca56eca.png)

フォルダー構成

“`text
$ tree
.
├── main.go
└── static
└── index.html
“`

“`go:main.go
// —————————————————————
//
// main.go
//
// May/19/2021
// —————————————————————
pa

元記事を表示

めぐる式二分探索法をGoで実装する

簡単に調べて、Qiitaで見つからなかったので

# 参考文献

– [めぐる式二分探索](https://twitter.com/meguru_comp/status/697008509376835584)
– [めぐる式二分探索の紹介](https://qiita.com/drken/items/97e37dd6143e33a64c8c)

# 実装

“`golang
package main

import (
“math”
)

var a = [10]int{1, 14, 32, 51, 51, 51, 243, 419, 750, 910}

func abs(x int) int {
return int(math.Abs(float64(x)))
}

func isOK(index, key int) bool {
return a[index] >= key
}

func binarySearch(key int) int {
ng := -1
ok := len(a)

for abs(ok-ng) > 1 {
mid := (ok + ng

元記事を表示

Go CrossPlatformで各OS依存がある場合のファイル構成

goにてクロスプラットフォームで動作するアプリを作成するのに試したことを備忘録として残す。
各環境(MacとWindows)でメッセージボックスを表示することを(今更)試した。

環境
・Go(1.16.3)
・Mojave10.14.6(開発環境)
・Windows10

## ソースコード
ディレクトリ構成

“`
.
├── util
│ ├── messagebox_darwin.go
│ └── messagebox_windows.go
└── main.go
“`

ソースは下記のようになる。

“`go:main.go
package main

import (
util “crossMsg/util”
)

func main() {
util.MessageBox(“title”, “test”)
}
“`

“`go:messagebox_darwin.go
package util

import (
“fmt”
“os/exec”
“strings”
“syscall”
)

func MessageBox(title, tex

元記事を表示

Golang単体テストでstruct中身をassertするファクション

単体テストを書いていますが、どうやってstructの全てのフィールドをassertionする方法をいくつか案考えていました。

struct全体を比較するは `==` と `reflect.DeepEqual`ができると思いますが
– `==`の場合、structにpointerが入るとfalseになる
– `DeepEqual`はtime.Timeの型が入るとnano秒までの同じじゃないとダメらしいです。
– `DeepEqual`の場合はどのフィールドが相違かどうかがわからないです。
– `DeepEqual`はカスタマイズがしにくいです。例えばあるフィールドをassertionがいらないケースもあるかもしれない。

=> `==` と `reflect.DeepEqual`があまりウケてないのでcustomファクションを作りました
まず、このpackageを使う
`github.com/stretchr/testify`

“`

func AssertStruct(t *testing.T, expect, actual reflect.Value) {
typeOfExp

元記事を表示

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

表題のとおりです。とにかく要件を満たすためだけにGoを触らないといけないかもしれない人のために最低限の情報だけ集めた。

https://www.tohoho-web.com/ex/golang.html#about

> Google が開発したプログラミング言語です。「Go言語」や「Golang」と表記されます。
UNIX、B言語(C言語の元)、UTF-8の開発者ケン・トンプソンや、UNIX、Plan 9、UTF-8の開発者ロブ・パイクによって設計されました。
静的型付け、メモリ安全性、ガベージコレクションを備えるコンパイル言語です。
シンプル、高速、メモリ効率が良い、メモリ破壊が無い、並行処理が得意などの特徴を備えています。
メモリ破壊が無く、並行処理を得意とする、進化したC言語という側面があります。
Linux、Mac OS X、Windows、Android、iOS で動作します。

## 入門

### インストール
https://golang.org/doc/install

“`
C:\workspaces\go>go version
go version go1

元記事を表示

Golangはじめて物語(第8話:API Gateway+LambdaでJWTを実装する)

# はじめに
Golang での JWT の実装はライブラリが充実しているので、比較的簡単に実装できる。
しかし、ググって見つかるのは Gin や Echo と組み合わせたものが多く、AWS で API Gateway を使った実例というのが少なかったので、組み込んでみる。

本記事は、以下の知識があることを前提とする。

– JWT に関する概要が分かっている(と言っても、あまり難しいことは知らなくてよくて[この記事](https://qiita.com/Naoto9282/items/8427918564400968bd2b)くらいの概要が分かっていれば充分)
– Golang で API Gateway + Lambda の WebAPI を実装したことがある(手前味噌ではあるが、[この記事](https://qiita.com/neruneruo/items/1ef52f908e4497103a59)を読んで理解ができていれば充分)

なお、今回は IdP には頼らずに自分で秘密鍵を使ってトークンを払い出して検証するという方式を検証する。

# トークン払い出しの実装
まずは、

元記事を表示

Notion APIライブラリまとめ

## Ruby

https://github.com/katsumata-ryo/notionar

## Laravel

https://github.com/5am-code/laravel-notion-api

## Swift

https://github.com/noppefoxwolf/notion

## JS

https://github.com/makenotion/notion-sdk-js

## go

https://github.com/dstotijn/go-notion

https://github.com/ketion-so/go-notion

## python

https://github.com/Blue-Hope/notion-sdk-py

## vue

https://github.com/64robots/vue-notion-api

## PHP

https://github.com/64robots/php-notion

## React

https://github.com/mkalvas/notion-r

元記事を表示

napalm の 6 倍速いネットワーク機器用リモートコマンド実行ツールを書きました

ネットワーク機器のコマンドをリモート実行するツール「telee」を書きました。

https://github.com/umatare5/telee

このツールは、機器へのログイン処理とコマンド実行を代理します。
従来の expect スクリプト, NAPALM や Ansible の役割を部分的に担えます。

以下は動作例です。

Cisco 社製 OS はもちろん、Juniper, YAMAHA 等、他社製 OS へのログインにも対応しています。
接続プロトコルは telnet もしくは ssh が選択出来ます。その他のプロトコルには対応していません。

実行速度を NAPALM の同一機能と比較すると、一般的な用途で 6 – 72 倍高速です。
※ 測定の詳細は [Performance Comparison: telee

元記事を表示

Goでinterfaceのポインタを使わない理由と使う場面

# はじめに
Goで「interfaceのポインタは使うことがない」のが定石だけど、`errors.As`のテストケースをみていて有用な場合があるのではと思った。

# interfaceのポインタ
https://golang.org/doc/faq#pointer_to_interface
をみると、

> Almost never. Pointers to interface values arise only in rare, tricky situations involving disguising an interface value’s type for delayed evaluation.

にあるように、interfaceのポインタを使う場面はほぼないと言っていいようだ。
続いて以下のように続く。

> It is a common mistake to pass a pointer to an interface value to a function expecting an interface. The compiler will complain abou

元記事を表示

OTHERカテゴリの最新記事