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

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

terminal操作メモ

## 近況報告
 勉強ってなんのためにするの?って聞かれたら,どう答えるべきなのかって,教師を目指していた時に考えていたことがあります。当時の自分はどう答えてたんだろう。今の自分はこう答えます。 **その勉強「は」意味がないよ**。

というのも,勉強は手段であって第一の目的になり得ないので,目的がない状態で勉強の意義を問うことを僕はできません。モテるために勉強する,いい大学に進学するために勉強する。。。なんでもいいんです。どんな小さなことでもいいから目的をつくってあげる,きっかけを一緒に見つけてあげるのが,教師。方位磁針,道しるべ、、、教師ってそういうものであるべきなんだろうな。余談ですが,僕の好きな漫画で我が子を叱る父親のシーンでこんなセリフがあるんです。「目的もなしにだらだら手段を行使するのは時間の無駄だし身にならない,そして何よりつまらねぇ」って。鞠山さん大好き。

# 今回のお題
terminal操作を全くわかってなかった件

## 背景
techcanp卒業して1週間。過去の復習したりGoの勉強していたりしていると,いつもディスプレイ上でクリックしたりしていたことをテキスト

元記事を表示

RubyからGo(ジャンル:勉強日記vol.1)

## 近況報告
 テックキャンプを卒業し,ついに就職活動です。前の記事で述べた通り,
  ・個人アプリの修正及び機能付与
  ・カリキュラムのドリル
  ・新しいことへのチャレンジ(dockerとGo言語)
  ・就職活動
を軸に勉強を進めています。個人アプリの大まかな修正は順調に進んでいます。ドリルに関しては,先輩曰く,スクールの料金の半分の価値があるとのことなので,進めています。正規表現など穴がわかるので助かります。dockerは意義を理解してインストールし,起動まで進みました。環境構築はまだ解読が進んでいません。Golangは後述。就活は今週面接があるのですが,ラフな気持ちで行こうと思います。

# 今回のお話
 Golangの勉強を始めた経緯
 いまなにしてる
 気づきメモ
## Golangの勉強を始めた経緯
### 勢いのある言語のため
 golangは2009年にオープンソースとして発表された言語であり,機能性,高速という面で脚光を浴びた言語です。最近のエンジニアが学びたい言語としても上位に位置し,近年はアプリケーションの一部をGoに変えることで処理速度をあげる試みなどさ

元記事を表示

Goの代入可能性についてちゃんと理解してみる

# はじめに
今月でGolangに触れてからちょうど一年になりますが、未だにGoについて初めて知ることが多々あります。その一つを紹介したいと思います。

以下のGoでなぜキャストが必要なのでしょうか? 当たり前だろ、GoはCなどとは違って明示的なキャストが必要な言語だろとツッコミが入りそうですが、

“`golang
type INT int
var i1 int
var i2 INT
i1 = 1
i2 = INT(i1) // 明示的なキャストが必要
“`
では、以下はキャスト不要で代入できますが、これはなぜでしょうか? といわれると案外答えられない人もいるのではないでしょうか?
そのあたりを[Goの仕様](https://golang.org/ref/spec)をちゃんと読んで理解しましょうというのが今回のテーマです。

“`golang
type INTSLICE []int
var l1 []int
var l2 INTSLICE
l1 = []int{1,2,3}
l2 = l1 // 明示的なキャストが不要
“`

# 仕様をよんでみる
代入可能性(`Assi

元記事を表示

Golang シェル実行

“`golang
package main

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

func getstatusoutput(args …string) (status int, output string) {
exec_command := exec.Command(args[0], args[1:]…)
std_out, std_err := exec_command.Output()
status = exec_command.ProcessState.ExitCode()
if std_err != nil {
output = std_err.Error()
} else {
output = string(std_out)
}
return
}

func main() {
shell := os.Getenv(“SHELL”)
command := []string{“echo”, “-n”, “Hello

元記事を表示

Go言語でJSONを扱う

# JSON形式をstruct型に変換

`encoding/json`パッケージを使用する

“`go:
package main

import (
“encoding/json”
“fmt”
)

type Person struct {
Name string `json:”name,omitempty”`
Age int `json:”age,string,omitempty”`
Roles []string `json:”roles,omitempty”`
}

func main() {
// json形式でデータを作成
jsonData := []byte(`{“name”:”yamada”, “age”:”18″, “roles”: [“admin”, “user”]}`)
// jsonデータを入れるstruct型を宣言
var person Person
// struct型にjsonデータを入れる
if err := json.Unmarshal(jsonData, &person); err != nil {
f

元記事を表示

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 Playgound へ](https://play.golang.org/p/8McHRpONKlC)

“`

元記事を表示

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にコンパイルした場合、
ブラウザ上で並列処理はきちんと行っているのか気になったので確認しました。

#結果
問題なく並列処理ができました。
画面サンプル
click

  • OTHERカテゴリの最新記事