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

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

AtCoder に登録したら解くべき精選過去問 10 問 を Go で解いてみた

@drken さんの『[AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~](https://qiita.com/drken/items/fd4e5e3630d0f5859067)』は AtCoder の入門記事としてとても人気があります。

当該記事の最後には、各言語によるACコードまとめへのリンクがありますが、[Go 言語版](https://qiita.com/kakko_hatena/items/8969ddbf432bdd520fc4) は 2019/01 現在でリンク切れになってしまっています。 (執筆者さんのアカウント自体がなくなっているようです)

私は競プロに Go 言語で参加することが多いので、今回Goで解いたACコードでまとめを新しく作りました。本記事に乗せてあるコードおよび解説の特徴は次のとおりです:

* 解き方は原則として @drken さんの解説に合わせてあります。もともと C++ と Go は文法が比較的似ている言語なので、そこまで大きな違いはありません。
* 少し私好みの書き方を採用している場合もあります

元記事を表示

Goでフィールド処理するコマンドラインツールを作ってみた

# 背景

フィールド処理の定番って`awk`だと思うんですが、コマンドラインからawkうつのってめんどくさくないですか?
`cat test.txt | awk ‘{print $1}’`みたいな感じですが、`’`とか`{`とか`$`とか打ちづらい…
ワタシ指短いんで…

# 探してみた

やっぱ探したらあるもんですね、USP研究所様
https://uec.usp-lab.com/TUKUBAI_MAN/CGI/TUKUBAI_MAN.CGI?POMPA=MAN1_self

が、pythonか….pythonは好きなんですよ、好きなんですけどね
RHEL7とかCentOS7のデフォルトpythonってpython2なんだよおおおおお
python3のインストールとかダメっていわれるんだよおおおお
Goないのかよおおおおおおバイナリでもっていきたいよおおおお

車輪の再発明するか!wという決意が湧きました

# 作ってみた

https://github.com/kuritayu/infra-tools/blob/master/cmd/gosf/main.go
(go

元記事を表示

GoをMacでビルドしたらエラーになったのでコンテナの中でビルドして解決した

#状況
– GoによるでAPI開発をMac上で行っていた。
– ローカルではdocker-composeでコンテナの中で`go run`を実行して開発を行っていた。
– そこで実環境では以下のような手法でデプロイしようと試みた
– ①Mac上で`go build`してバイナリ作成
– ②バイナリを実行する`docker image`を作成
– ③ECRにpush
– ④ECS(Fargate)上で動かす
– そこで②の`docker image`の作成まで行い、先ずローカルで試しに`docker run`したところ以下のようなエラーが発生して起動に失敗した。

“`
standard_init_linux.go:211: exec user process caused “exec format error”
“`

#原因

– ググりまくったところMacとLinuxでアーキテクチャが異なり、ビルド対象が違うことがわかった。
– [docker image error: standard_init_linux.go:211: exec u

元記事を表示

Goでslackに通知するバッチを作った【新Webhook】

## はじめに

前回の[AWSの利用料金をChatworkに通知してくれるバッチをGoで作った](https://qiita.com/maika_kamada/items/17ac04a6b8b3c56c4b18)では、取得してきたコストをChatworkに通知するバッチを作りましたが、slackにも飛ばしたくなったので、slackバージョンを作ってみました!

そして、今回はLambdaとCloudWatch EventsをServerless Frameworkで作成してみました!

また、Webhookの旧方式から変わったところもご紹介します。

## 構成図
![CostExplorer-slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546572/e07c4c71-3ad7-282e-7fd1-a5225eead20e.png)

当記事では、以下の部分にフォーカスしています。

+ Serverless Frameworkを使って作成したCloudWatch Events、La

元記事を表示

Go lambda のデフォルト環境変数

# はじめに
`AWS SDK for Go`をLambdaで使用する際に特に設定無しで使用できるので
多分アクセスキーとか環境変数にセットされているんだろうなーと思いつつも
実際に試したわけではないので検証してみました。

# 検証
## 検証コード

“`Go
package main

import (
“context”
“fmt”
“github.com/aws/aws-lambda-go/lambda”
“github.com/aws/aws-lambda-go/lambdacontext”
“log”
“os”
)

func init() {
log.Print(“init start”)
showAllEnv()
log.Print(“init end”)
}

func Handler(ctx context.Context) (string, error) {
log.Print(“handler start”)
if lambdaCtx, ok := lambdacontext.FromContext(ctx); ok {
log.P

元記事を表示

よくある表情解析LINE Botを作った

Qiita を筆頭にいろんなエンジニアの方が既に作っているもので何番煎じか分かりませんが、個人的にサーバレスアプリケーションを作るのが好きなのと、Golang に慣れることを目的として LINE チャネルに画像を送ると表情解析してメッセージを返してくれる Bot を作りました。

## できたもの

こういう感じで本田翼さんの笑顔の画像を送ると

iOS の画像 (1).png

幸福度合いをポイント化して返してくれます。

iOS の画像.png

元記事を表示

docker-compose + realizeでライブリロードする環境構築

goで開発しているとコード変更のたびにビルドするのが面倒くさいので
[realize](https://github.com/oxequa/realize)を使ってライブリロードしてサクサクコーディングできるように環境構築した時の設定をメモっておいてます。

## パッケージ構造
“`
.
├── api/
│   └── main.go
├── .realize.yaml
├── docker-compose.yml
└── Dockerfile
“`

## 設定ファイル
### Dockerfile
`go get`で`realize`を取得しておきます。
またCMDには`realize`の起動コマンドを設定しておきます。

“`
FROM golang:1.13

RUN go get github.com/oxequa/realize

EXPOSE 8080

CMD [ “realize”, “start”, “–run” ]
“`

### docker-compose.yml
`.realize.yaml`が配置されているディレクトリを`working_

元記事を表示

不要なpackageを削除する

先日goにてプロジェクト開発をしていた際に指摘されたので、modulesについて簡単にまとめていきます。

# 要約
不要なpackageを削除するために、`go mod tidy`をする

# modとは??
go1.11から使えるようになった依存管理ツールだそうです。
使い方については参照記事がわかりやすくまとまっていますので、そちらを御覧ください。

# 参照
https://blog.mmmcorp.co.jp/blog/2019/10/10/go-mod/

元記事を表示

AtCoder Beginner Contest 153 参戦記

# AtCoder Beginner Contest 153 参戦記

## ABC153A – Serval vs Monster

1分半で突破. 書くだけ.

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

print((H + (A – 1)) // A)
“`

## ABC153B – Common Raccoon vs Monster

2分半で突破. 書くだけ. 必殺技の合計ダメージがモンスターの体力を上回っているか、それだけ.

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

if sum(A) >= H:
print(‘Yes’)
else:
print(‘No’)
“`

## ABC153C – Fennec vs Monster

2分半で突破. 書くだけ. できるだけ体力が多いやつを必殺技で倒したいので、ソートして先頭K匹以降を攻撃で倒すものとして集計すればいいだけ.

“`python

元記事を表示

[Golang]redigoでデータベース番号を指定する

# 方法

[redigo](https://github.com/gomodule/redigo)でデータベース番号を指定するには、オプションを追加する。

“`golang
db := 1
opt := redis.DialDatabase(db)
conn, err := redis.Dial(“tcp”, “localhost:6379”, opt)
“`

# 参考
[redis – GoDoc](https://godoc.org/github.com/garyburd/redigo/redis#DialDatabase)
[machinery/redis.go at 84f17e8ec73bbec34184beb067f22301ffa5263b · RichardKnop/machinery](https://github.com/RichardKnop/machinery/blob/84f17e8ec73bbec34184beb067f22301ffa5263b/v1/common/redis.go#L65)

元記事を表示

go+gin+nginx環境をec2にデプロイ

## はじめに
web初心者が簡単なgoアプリケーションをec2にデプロイしてみました。
色々おかしなところがあると思いますので、何かありましたら、ご指摘いただけると幸いです。

githubを介してEC2インスタンスにプロジェクトファイルをあげるので、ローカルで開発したgoアプリケーションはgithubのリポジトリに上げておいてください。

## EC2インスタンス作成
AWSコンソール画面から EC2 > サービス > インスタンス > インスタンスの作成の手順でインスタンスを作成していきます。
今回はAMIにubuntuを選択して、そのほかの設定はデフォルトです。

インスタンスの接続に必要なキーペアも新規に作成してダウンロードします。名前はわかりやすいものにしてください。
キーペアのダウンロードが終わったら、キーペアがあるディレクトリに移動し、パーミッションを設定します。

“`
$ chmod 400 [キーペアの名前].pem
“`

## EC2インスタンスにssh接続
インスタンスが起動できたら、キーペアがあるディレクトリに移動して以下のコマンドでインスタンスにss

元記事を表示

Golangのパッケージ周りを整理する

以下のキーワードをあんまり理解できていなかったので調べてまとめた。(随時調べて更新していく)

* コンパイルとビルドの違い
* Golangのパッケージとモジュールとライブラリの違い
* $GOPATH/go/配下のsrc,pkg,binの違い()

# コンパイルとビルドの違い

[ここ](https://qiita.com/tomokichi_ruby/items/e1d52d3f34877389f905)によると

* `コンパイル` = ソースコードをオブジェクトコードに変換すること
* `リンク` = オブジェクトコードをくっつけて一つのバイナリコードにする
* `ビルド` = コンパイル + リンク

# パッケージとモジュールとライブラリの違い

* 同一パッケージのファイルは同一フォルダ`$GOPATH/src/(package名)/`などに含める(1つのディレクトリには1種類のパッケージ定義のみ許容される)。
* 同じパッケージに属するファイルは互いに丸見え。これらはまとめてコンパイルされる。
* main packageに属するファイルに関しては`$GOPATH

元記事を表示

なぜGoはDuck typingを採用していると言えるのか、データ構造から詳しく解説してみた

Goのinterfaceは明示的に実装を宣言せず、実装側がinterfaceのシグネチャを満たしているかによって型が決まるDuck typingを採用していると言われています。私は当初このような説明を聞いたときにピンと来ず、むしろそれはTypeScript等に見られるStructural Typingなのでは?と思いました。

**しかし実際にデータ構造を調べて見ると、確かにDuck typingであり、かつStructural Typingでもあるという考えに至りました。**

これまでなかなかGoのデータ構造に触れる機会がありませんでしたが、調べてみるとこれまで気づかなかった観点がいくつも出てきたのでぜひ紹介したいと思います。

## Duck typingについて

今回の主題となる部分ですので、Duck typing(ダックタイピング)についておさらいします。

Duck typingはアナロジーである「ダックテスト」に端を発しています。([厳密な起源は不明?](https://en.wikipedia.org/wiki/Talk%3ADuck_typing#Coined_by

元記事を表示

Golangでhttp通信をやってみる

[Link-1]:https://qiita.com/melty_go/items/c977ba594efcffc8b567

[Pre-1]:https://qiita.com/zasshyu6/items/c85de49a7265c65945a3

[Golang-1]:https://golang.org/
[Golang-2]:https://golang.org/pkg/net/http/

[JSON-1]:http://www.jsontest.com/

#はじめに
`Golang`にはまったときに`Codewars`で遊んでました。
楽しかったのですが、そのあと`Swift`や`C#`で`http`通信やったのでせっかくなので`Golang`でもやってみようかと思います。

##開発環境
– `Windows 10 Home 64bit`
– `Visual Studio code 1.41.1`
– `go version go1.13.6 windows/amd64`

#開発環境構築
開発環境の構築は以下の記事を参考にさせていただきました。
本当につまると

元記事を表示

Go言語とginで作ったHTTPサーバをHeroku上で動かしてみる

# はじめに

Goとginで作ったHTTPサーバをHeroku上で動かすまでの試行錯誤をまとめてみました。
試行錯誤の結果、ゴールへたどり着いていますので、間違いがあると思います。
いまだに深くは理解ができていません。
参考程度にどうぞ。

最低限どういった手順で進めればよいかだけを見たい場合は[まとめ](#まとめ)を見ていただければと思います。

# 環境

* OS: windows 10 Home
* Go: 1.13.6
* gin: 1.5.0
* Git: 2.25.0
* Text Editor: Atom

ローカル環境での`go run main.go`はコマンドプロンプトより行います。
ginは、`go get -u github.com/gin-gonic/gin`でローカル環境へ導入済みとします。

# ローカル環境でのテスト

『[HTML をレンダリングする](https://gin-gonic.com/ja/docs/examples/html-rendering/)』を参考にmain.goとtemplates/index.tmplを用意します。
また、

元記事を表示

Protocol Buffersの後方互換性を覗いてみる

Protocol Buffersではメッセージのスキーマを変更する際に、後方互換性を損なうことなく新しいフィールドを追加することができます。例えば以下のようなmessageがあったとします。

“`proto
message User {
required string name = 1;
required int32 age = 2;
required string address = 3;
}
“`

これを`v1`とした時に、以下のように`parents`情報を追加した`v2`を作成するとします

“`proto
message User {
required string name = 1;
required int32 age = 2;
required string address = 3;
repeated User parents = 4;
}
“`

`v1`でシリアライズされた`User`のバイナリデータが、`v2`のデータ構造に対してデシリアライズされるときにはparentsフィールドに対応するデータ

元記事を表示

golangでエラー出力

“`go:e.go
package main

import (
“fmt”
“os”
)

func main() {
fmt.Println(“stdout”)
fmt.Fprintln(os.Stderr, “stderr”)
}
“`

“`
$ go run e.go
stdout
stderr
$ go run e.go 2>/dev/null
stdout
“`

元記事を表示

GoとRedisでAPIを実装する (Part.1)

# はじめに
本記事では、Go 言語と Redis を使用し簡単なAPIの作成手順について説明する。docker-compose を使って実装していく為、環境に依存しない開発環境で実装する。効率的に開発が行える様、開発の中でいくつかの工夫を施しているので参考になれば幸いである。

また、今回は記述量が多くなるので以下の2部構成にした。

* Part.1 : 環境構築 ~ 動作確認
* Part.2 : API実装 ~ 実装検証

本記事では環境構築から動作確認までを説明する。

初めて実装していく方の為に、実行環境と予備知識としていくつか説明する。

# 1. 実行環境
* macOS Catalina Ver.10.15.2
* Docker version 19.03.5, build 633a0ea
* docker-compose version 1.24.1, build 4667896b
* golang 1.13.6
* Redis 5.0.7

【補足①】

* [Go言語](https://golang.org/)
* 2009年、Googleによって開発さ

元記事を表示

IntelliJでGoアプリケーション開発の始め方

[IntelliJ IDEAでGo言語(golang)を始める〜GOPATHの設定など](https://qiita.com/aki-takano/items/7bd8b879572f58b03cdc)
[IntelliJ IDEAでGoを書く](https://note.com/b1a9idps/n/n34de69179a10)

元記事を表示

眺めて覚えるGo言語 その14 チーティング(ずる)特集

#Go言語を書き始めて慣れないためにエラーを出してします。
###たとえば必要のないimportは、

“`
.\ex1.go:3:9: imported and not used: “fmt”
.\ex1.go:3:15: imported and not used: “reflect”
.\ex1.go:3:25: imported and not used: “os”
.\ex1.go:3:30: imported and not used: “log”
“`

##「使っていませんダメです。」的なお叱りを受けます。

#よく使用するlibは、コピー&ペーストで下記のimportを行う。一行にまとめた

“`
import (“fmt”;”reflect”;”os”;”log”;”strings”;”strconv”;”time”)
“`
また、これらのライブラリを使っている関数を次のように定義します。
使い方の例を下記に

“`
// ReadFileは、ファイル読み込み
func ReadFile(fn string) string{
buf:=make([]by

元記事を表示

OTHERカテゴリの最新記事