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

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

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

元記事を表示

Github actionsで自動でCLIツールのバージョニング切ってバイナリを添付したい

> :warning:
> バージョンはツール自体のバージョンではなくて、github上で発番するバージョンです。

# Github Actionsってなに?

pushなどをフックしていろんなworkflowを組める、Github謹製のCI/CD的なものです。

詳しくは公式の説明をどうぞ
https://github.co.jp/features/actions

# workflow

実際のworkflowのファイルです。
今回はGoのバイナリファイルを作成するという体で書いています。
流れは同じなので他の言語でも同じように組めばできるはずです。

※ Mac用しか書いてないですが、matrix追加したら複数OSの対応も可能です。

## 自動バージョニング版

注意:

– checkout@v2からfetchしないとタグとか取れないようなので、直後にfetchしています
– goreleaser-actionはバージョン指定さえすれば、勝手にリリースとか切ってくれそうですが、自動採番でよしなにやろうとしたときに細かい調整ができるように前回のタグを取得して、インクリメントす

元記事を表示

GOPATHモード・モジュールモードそれぞれのgo getの振る舞い

Goの入門書でサクッと`go get`のことはインプットしていたのですが(GOPATHモード前提)、モジュールモードのときと振る舞いが違うらしく、どう違うのか気になったので調べてみました。

# GOPATHモードとモジュールモード

## GOPATHモードとは

Go1.10まで動作していたモード。1.11以降でもこのモードを有効にすることは可能。`$GOPATH`配下でパッケージの管理をしており、開発するディレクトリも基本は`$GOPATH/src`で行う。ダウンロードしたパッケージは単一バージョンのみを管理する。

## モジュールモードとは

Go1.11から導入されたモード。任意のディレクトリで開発・ビルドが可能。パッケージをモジュールとしてバージョンごとに管理する。(=複数バージョンの管理が可能)go.modファイルでモジュール間の依存関係を管理する。

### モジュールモードの特徴(GOPATHモードと比べて)

– 開発時にGOPATHを意識しなくても良くなった
– 使用するパッケージを複数のバージョンで管理できるようになった
– 同じパッケージを参照してい

元記事を表示

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

 普段は IT インフラ運用をやっているのですが、ちょっとアルゴリズムを勉強してみることにしました。アプリにもなっている「アルゴリズム図鑑」と、[VisuAlgo](https://visualgo.net/ja) というページを活用して、コードを実装していきます。

きっかけとしては、昨日 Paiza というプログラミングテストをやってみたときに、A ランクまでは難なく取れたのですが、S ランクでは実行結果のタイムアウトにより、なかなか取得できなかったためです。これは根本的にアルゴリズムの知識不足なのでは?と思い、勉強してみることにしました。

今回は初回ということで、まずソートをやってみました。対象は以下の 4 つです。ザザーッとコードを書いていきます。次回はマージソートとクイックソートをやってみます。

## バブルソート

“`go
package main

import (
“fmt”
“math/rand”
)

func main() {
// make array of random int
var list [100]int
for i := 0; i

元記事を表示

都道府県名を都道府県コードに変換

都道府県名を次で定義されている都道府県コードに変換する方法です。
[都道府県コード](http://nlftp.mlit.go.jp/ksj/gml/codelist/PrefCd.html)

変換に使うJSONファイル

“`json:prefecture.json
{
“北海道”: 1,
“青森県”: 2,
“岩手県”: 3,
“宮城県”: 4,
“秋田県”: 5,
“山形県”: 6,
“福島県”: 7,
“茨城県”: 8,
“栃木県”: 9,
“群馬県”: 10,
“埼玉県”: 11,
“千葉県”: 12,
“東京都”: 13,
“神奈川県”: 14,
“新潟県”: 15,
“富山県”: 16,
“石川県”: 17,
“福井県”: 18,
“山梨県”: 19,
“長野県”: 20,
“岐阜県”: 21,
“静岡県”: 22,
“愛知県”: 23,
“三重県”: 24,
“滋賀県”: 25,
“京都府”: 26,
“大阪府”: 27,
“兵庫県”: 28,
“奈良

元記事を表示

goroutineを使って高速TCP ポートスキャン

## この記事に書いている事
– golangでのポートスキャンの方法
– golangでのgoroutine + channelを使った基本的な並列処理のパターンのサンプル
– time.Now()のちょっとだけ面白い話
– スクリプトを書いてみての所感と考えた事

## Goでポートスキャンってどうやるの?
net.Dialを使ってコネクションを確立できるかを確認すればいいです。

“`go
package main

import (
“fmt”
“net”
“os”
)

func main() {
host := os.Args[1]
port := os.Args[2]
address := fmt.Sprint(host, “:”, port)
_, err := net.Dial(“tcp”, address)
if err == nil {
fmt.Println(“Connection successful”)
}
}

“`
“`bash
$ go run main.go 22
Connection suc

元記事を表示

GCPのApp Engineを使ってGolang製のAPIをデプロイしたら簡単すぎました

## はじめに

普段は業務でAWSをガッツリ触らせていただいていますが、今回は前々から興味のあったGCP(Google Cloud Platform)でアプリケーションをデプロイすることにしました。

ちなみに、GCPでプロジェクト作成後、クレジットカードを登録したら1年間使える3万円分のクレジットもらえました。。

至れり尽くせりすぎる!ありがたく使わせていただきます!

## GCPとAWSの違いとは?

個人的な所感ですが、

AWSはいろんなサービスがあって、インフラエンジニアの方からすると痒いところに手が届くようなサービスが豊富にあるように思えます。

ただ、僕のようにインフラに詳しいわけではなく、ただ自分のアプリを手軽にデプロイしたいような人間からすると、AWSは若干ハードルが高いように感じます。

それに対してGCPは、下記のようなメリットがあります!

– 公式ドキュメントが豊富で読みやすい
– コンソールのUIがAWSに比べてわかりやすい
– サービスの数はAWSほど多くなく、どれを使えば良いか初心者でもわかりやすい
– Firebaseを使う場合、GCP内であれば

元記事を表示

OTHERカテゴリの最新記事