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

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

go lang やってみた ファイル名に_testをつけたらだめだった。

前にやったことをい出しながら、試しにやってみたら、うまく動かない。

srcの下に、hoge_testというのをつくって、hoge_test.goに、printだけをいれてみたのだけど、

下記のようなエラーがでてしまう。

no non-test Go files in

ファイル名に_testをつけると、テストファイルになるもよう。

元記事を表示

AtCoderのKeyence2019 C(Exam and Wizard)で、条件を誤解したまま実装したメモ

過去問を解いてる過程でkeyence2019_c(Exam and Wizard)を解いてみて、結局よくわからなくて解説を見たんですが、そのときはなぜその実装でいいのかがよくわかりませんでした。
https://atcoder.jp/contests/keyence2019/tasks/keyence2019_c

結果としては、
$A_1,A_2,…,A_n$と$C_1,C_2,…,C_n$の合計が同じ、という条件しか書いてないのを、
勝手に
$A_1,A_2,…,A_n$を並べ替えたものが$C_1,C_2,…,C_n$
と解釈してしまっていた(サンプルを見てそう思ってしまった)ので、前提条件を誤解していました。

ただ、その前提条件を誤解したまま実装して通ったので、自分への備忘録という意味でも残しておきます。

# 基本方針

この問題のやり方は解説PDFの通りです。
https://img.atcoder.jp/keyence2019/editorial.pdf
個人的には @drken さんのブログが大変わかりやすかったです。
https://drken1215

元記事を表示

Go で Interactive な Slack Bot を作る (2020年5月版)

[Go で Slack Bot を作る (2020年3月版)](https://qiita.com/frozenbonito/items/cf75dadce12ef9a048e9) の続編です。今回は [Interactive Message](https://api.slack.com/messaging/interactivity) を活用してちょっとリッチな Slack Bot を作っていきます。
順を追って作り方を解説していくので「サンプルコードだけ見たいよ」という方は [「まとめ」](#まとめ) に記載されているものをご参照ください。

## 作るもの

今回は ChatOps を意識した Bot を作ります。

下図のように Bot に `deploy` と命じると、デプロイするバージョンの候補がセレクトメニューで提示されます。

![interactive1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586035/5cb7a911-19f8-8bd3-0c75-1aa3a8070a4d

元記事を表示

Goで月末日の時は増加減した月の月末日を返す

GoのtimeパッケージのAddDate()関数ですが、例えば10月31日に1ヶ月を足すと11月31日となりDateの正規化によって12月1日になります。

“`Go
package main

import (
“fmt”
“time”
)

func main() {
t := time.Date(2019, 10, 31, 0, 0, 0, 0, time.Local)
fmt.Println(t)
fmt.Println(t.AddDate(0, 1, 0), “(Add 1 month)”)
}

実行結果

2019-10-31 00:00:00 +0000 UTC
2019-12-01 00:00:00 +0000 UTC (Add 1 month)
“`

そこで、月末日の時は増減した月の月末日、すなわち、10月31日に1ヶ月を足すと11月30日となる関数「AddMonth()」を考えてみました。

“`Go
package main

import (
“fmt”
“time”
)

// AddMonth returns the time cor

元記事を表示

Go+CDK(TypeScript)で始めるサーバレスチュートリアル

# 今から作るもの

サーバーレスの鉄板構成である、`APIGateway+Lambda+DynamoDB`を、AWS CDKを用いて構築していきます。LambdaはGoで実装し、CDKはTypeScriptで実装します。全体像はこんな感じです。

![cdk-apigw-lambda-dynamo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246737/35dfd6de-540e-e9e0-9c60-3fc41b2afe31.png)

## CDKとは

>AWS クラウド開発キット (AWS CDK) は、使い慣れたプログラミング言語を使用してクラウドアプリケーションリソースをモデル化およびプロビジョニングするためのオープンソースのソフトウェア開発フレームワークです。

[AWS公式](https://aws.amazon.com/jp/cdk/)より引用

簡単に言うと、CloudFormationテンプレートをプログラミング言語を使って書けるようになるよということです。現在CDKで

元記事を表示

Protocol Buffers: ざっくりとした入門

# この記事について
Protocol Buffers(protobuf) の概要、基本的な使い方、*.proto ファイルの書き方についてざっくりまとめます。

– 検証環境
– OS: Windows 10
– 言語: Go 1.13

# Protocol Buffers とは
すでにたくさん情報があるので要点だけ記載。

– データをシリアライズ(マーシャル)するためのフォーマット、メカニズム
– クライアント/サーバー間の通信や、データの永続化などに用いる
– 元々は Google が開発
– IDL でメッセージ(データ構造)を定義
– 様々な言語とプラットフォームで利用可能
– iOS や Android でも利用可能
– バイナリ形式にシリアライズする
– XML よりもサイズが小さくなり、また、高速
– シリアライズ/デシリアライズ をするためのコードが自動生成される
– その他
– 既存のプログラムに影響を与えずにメッセージを更新(フィールドの追加)が可能

## バージョン
– 最新バージョンは 3 (proto3と呼ばれる)

元記事を表示

golang cobra実装方法

golang、cobraの実装について検索すると自動生成でなんとかなってしまうし
自動生成に関する記事もそれぞれ若干方法が違うからそもそもの書き方をメモ。

“`main.go
func main() {
if err := cmd.NewCommand().Execute(); err != nil {
fmt.Println(err)
}
}
“`

“`cmd/cmd.go
func NewCommand() *cobra.Command {

cmd := &cobra.Command{
Use: “コマンド名”,
Short: “説明”,
RunE: func(c *cobra.Command, args []string) error {
//実装
return nil
},
}
//サブコマンドを追加したらここに追加
cmd.AddCommand(SubCmd())
return cmd
}

“`

“`cmd/subcmd.go

type Option struct {
sampleOption str

元記事を表示

CreateProcessAsUser を用いて Go で作成したサービスからリンクドトークンでプロセスを起動する

[blono/win](https://qiita.com/manymanyuni/items/c41f5bf0fd141e299336) にまたいくつかの API を追加したので、サービスからのプロセスの起動がコーディングしやすくなった

“`go:main.go
func GetActiveSession() uint32 {
var si *win.WTS_SESSION_INFO
var count uint32

if win.WTSEnumerateSessions(win.WTS_CURRENT_SERVER_HANDLE, 0, 1, &si, &count) != 0 {
defer win.WTSFreeMemory(uintptr(unsafe.Pointer(si)))

size := int(unsafe.Sizeof(win.WTS_SESSION_INFO{}))

for i := 0; i < int(count); i++ { sipi := unsafe.Pointer(uintptr(unsafe.Pointer(si

元記事を表示

社内Go PackageのためにGoDocで静的なHTMLを出力したい

# はじめに

「社内で管理しているGoのパッケージのGoDocを誰でも閲覧できるようにしたい」というモチベーションによる記事です。

Wantedlyさんでは[こちらの記事](https://www.wantedly.com/companies/wantedly/post_articles/198339)のようにKubernetesでGoDocサーバ([gddo-server](https://github.com/golang/gddo))を走らせることで社内GoDoc環境を構築しています。

今回はこのアプローチではなく、静的なHTMLをCI上で生成しそれをS3にホスティングすることで特にサーバを持たずに社内GoDocを運用する方針にしました。

# 環境・バージョン

Go: `go version go1.13.4 darwin/amd64`
GoDoc(golang.org/x/tools/cmd/godoc): `v0.0.0 (4b814e0)`

# やったこと

CIでGoDocを元にHTMLを生成しそれを社内Amazon S3へアップロードします。

CI上でgo

元記事を表示

_cgo_export.c:3:10: fatal error: ‘stdlib.h’ file not found の 解決方法(Catalina版)

# 概要
go get したときに出たエラーです。macOSのバージョンによって解消方法が異なるようなので、Catalina 10.15での解決方法です。

# 結論
以下コマンドで、環境変数をセットして、該当コマンドを実行したところ、解消しました。

“`
export SDKROOT=”$(xcrun –sdk macosx –show-sdk-path)”
“`

# 内容
DBから gorm structs を生成するツールを検証しようとローカルにインストールしようとしたところ発生しました。
go get -u github.com/smallnest/gen

“`
# runtime/cgo
_cgo_export.c:3:10: fatal error: ‘stdlib.h’ file not found
“`

# 調べたこと
全く同じエラーのQiitaがあったのですが、macOS 10.14 で、Catalina 10.15 では解消しませんでした。
https://qiita.com/gold-kou/items/739958f996825cf33b89

元記事を表示

Goで指定したバージョンのパッケージをインストールしたい

いざ自分がやろうとした際にちょっとだけ迷ったのでメモしときます。

## バージョン指定してパッケージをインストール

“`
go get <パッケージ名>@<指定するバージョン>
“`

例えば、 gqlgen の v0.10.2 をインストールしたい場合はこうなります。

“`
go get github.com/99designs/gqlgen@v0.10.2
“`

本編はここまで。

## go.mod でパッケージ管理しているときに自分がした勘違い

ここからはおまけです。
go.mod でパッケージ管理をしている場合、以下のようなファイルがあると思います。

“`go.mod
module github.com/tcshy/hoge

go 1.13

require (
github.com/99designs/gqlgen v0.10.2
github.com/aws/aws-sdk-go v1.28.9
github.com/gin-gonic/gin v1.5.0
    ・・・
)
“`

このとき、 go.mod と同じディレクトリにいる状態

元記事を表示

WINDOWS OSでAWS LAMBDAにGOをデプロイ

#目的
現在、WINDWOS10 OSでGOを用いてWEBサービスを開発しており、
AWS LAMBDAを活用する場面がありましたが、
実際にデプロイを行う際に、無駄にはまったところがあったので、
この度は、実際にデプロイしてみてはまったことや感想を共有したいと思います。

#AWS LAMBDAにGOをデプロイする方法
基本的でデプロイする方法はAWSの公式ドキュメントに記載されてあります。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/golang-package.html
特に`デプロイパッケージ`、`Handler`がデプロイとは密接に関係があるので、
この辺はしっかりと読みましょう。

僕は、しっかり読まずいくつが見逃してしまい、苦労しましたね、、、:joy_cat:

#僕がはまったところ
##①ソースコードをLINUX用しなかったこと
###問題

僕は以前、LAMBDAにPYTHON3をデプロイした経験があります。その際は、OSを気にせずデプロイしてもうまく動いてくれたので、
この度、GOをデプロイ

元記事を表示

NHK番組表API叩いてSlackで通知する

## はじめに
なんか面白そうなAPIとか探していたら、NHK番組表APIなるものを発見しました。

NHKっていったら、紅白、高校野球、朝ドラ、大河、天才テレビくんとか忍たま乱太郎とか、昔からそんなイメージ。
最近だと、キングダムとか進撃の巨人なんかも放送してたり、昔のイメージを覆しはじめてますねー。
ちなみに最近見つけた僕のイチオシは「[香川照之の昆虫すごいぜ!](https://www.nhk.or.jp/school/sugoize/)」です。

ちなみに、NHKって不定期放送多くないですかね?
LIFE!とか、見逃しちゃうんですよね〜。
ウッチャンのコント番組見ると、笑う犬思い出しちゃいますよね〜。ミル姉さんとか。

ということで、今回はLambda使ってサーバーレスな感じで、見たい番組・好きなタレントが出ている番組をSlackに通知する、お手軽アプリケーション作ろうかと思います。

言語はGo(勉強中)です。

## 環境など
– AWS Lambda
– Amazon CloudWatch Events(cron式)
– 言語:Go
– NHK番組表API(Program

元記事を表示

GitHubのSecretsを活用して、GitHub Actionsで安全に機密情報を扱う

## はじめに
GitHub repositoryにyamlファイルを書くことで、Commit時やPR反映時等色々な場面で利用できるGitHub Actions。
そんなGitHub Actionsに処理を書いていると、外部サービスと連携するためにアクセストークンのような機密情報を保持したくなります。
この記事では、その機密情報の扱うためのSecretsの使い方について記載します。

## GitHub repositoryのSecrets

使い方は簡単で、GitHub内のsecretを設定したいリポジトリのページを開き、下記Settingsから設定を行います。

![](https://help.github.com/assets/images/help/repository/repo-actions-settings.png)

例えばSecretSettingという設定を追加した場合は、以下のように `secrets.SecretSetting` を変数に代入することで、run内に書いたスクリプトでsecretが扱えるようになります。

“`yaml
– name:

元記事を表示

(Go言語・WebAssembly)Webページで並列処理はできるのか?



#前書き
Go言語を勉強する中でgoルーチンをWebAsseblyにコンパイルした場合、
ブラウザ上で並列処理はきちんと行っているのか気になったので確認しました。

#結果
問題なく並列処理ができました。
画面サンプル
clickGoで作成したc-sharedなライブラリでexportしたはずの関数が見つからない

## 事象

node-ffiで呼び出そうとするとこうなる。

“`
Error: Dynamic Symbol Retrieval Error: Win32 error 127
“`

## 原因

exportの先頭にスペースを入れてはいけない。

“`
// OK
//export FuncName

// NG
// export FuncName
“`

元記事を表示

【Go】echoでハマったこと

# echoを使っていてハマったことまとめ
## 概要
Go言語のWebフレームワークであるechoを使っていてハマったことについて、メモとしてまとめていこうと思います。

## middleware
### CORS
#### CORSWithConfig()の戻り値とe.Use()の引数が不一致
##### 事象

自分の作ったフロントエンドからのみアクセスできるようにカスタムCORS設定をしようとして以下のようなコードを作成しました。

“`golang
package main

import (
“net/http”

“github.com/labstack/echo/middleware”
“github.com/labstack/echo/v4”
)

func main() {
e := echo.New()
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowOrigins: []string{“http://localhost:3000”},
AllowMethods: []s

元記事を表示

GoのCommonMistakes/Using reference to loop iterator variableに対応するC++/Rustのコード

– [Let's encryptのバグはRustで実装していたら防げたの? – Qiita](https://qiita.com/MitsutakaTakeda/items/6ae9599d82ce14cf8c88)

に、

[CommonMistakes/Using reference to loop iterator variable](https://github.com/golang/go/wiki/CommonMistakes#using-reference-to-loop-iterator-variable):

“`go
func main() {
var out []*int
for i := 0; i < 3; i++ { out = append(out, &i) } fmt.Println("Values:", *out[0], *out[1], *out[2]) fmt.Println("Addresses:", out[0], out[1], out[2]) } ``` に対応するC++とRustのコードが書かれているけど、上記のG

元記事を表示

Golang TempDir,TempFile作成

Golang TempDir,TempFile作成する

“`main.go
package main

import (
“fmt”
“io/ioutil”
“os”
)

func main() {
dir, _ := ioutil.TempDir(“”, “aaa”)
fmt.Println(dir)

fp, _ := ioutil.TempFile(dir, “xxx”)
fpath := fp.Name()
fmt.Println(fpath)

fp2, _ := ioutil.TempFile(dir, “yyy”)
fpath2 := fp2.Name()
fmt.Println(fpath2)

fp.Close()
fp2.Close()
os.RemoveAll(dir)
}

//C:\Users\####\AppData\Local\Temp\aaa661041139
//C:\Users\####\AppData\Local\Temp\aaa661041139\xxx642705078
//C:\Users\####\Ap

元記事を表示

ソートを勉強してみる by Go ②

[ソートを勉強してみる by Go ①](https://qiita.com/dtmu/items/1372a32762cfad494801) の続き。
クイックソートしてみました。意外とすんなりいきました。

“`go
package main

import (
“fmt”
“math/rand”
)

func main() {
length := 20
list := make([]int, length)
for i := 0; i < len(list); i++ { list[i] = (rand.Int() >> 56)
}

sort(list, 0, len(list)-1)

for i := 0; i < len(list); i++ { fmt.Println(list[i]) } } func sort(list []int, start int, end int) { if start >= end {
return
}
var stack int

left := start
right := end – 1

元記事を表示

OTHERカテゴリの最新記事