Go関連のことを調べてみた2019年12月10日

Go関連のことを調べてみた2019年12月10日

mapstructureを使って複雑な構造のJSONを構造体にマッピングする

この記事は、Go4 Advent Calendar 10日目の記事です。

先日、ネットサーフィンをしていたところ、SmartHRさんが公開している郵便番号から住所を引くことが出来るJSONデータのリポジトリを見つけました。
https://github.com/kufu/jpostcode-data

このデータをGoで扱いたかったのでencoding/jsonでUnmarshalすることを試みたのですが、
簡単には通らなかったので色々調査を行い、最終的にstructにマッピングすることに成功しました。

## jpostcode-dataに格納されているJSONの形式

jpostcode-dataのJSONデータは、下記のような構成になっていました。

* 郵便番号の先頭3桁をファイル名としたJSONファイルが1ディレクトリ配下に設置されている
– `”001.json”, “002.json”, …`
* JSONの内容は1つの巨大なObject
– 郵便番号の末尾4桁をキーに、住所を値にセットしている。

“`js:001.json
{
“0000”: {

元記事を表示

コンソールの色付けにはgookit/colorが便利

[Goアドベントカレンダーその6](https://qiita.com/advent-calendar/2019/go6)が投稿されなかったので代理投稿です。Go界は殺伐しているので、隙を見せるとやられます。みなさんもお気をつけください。

GoでCLIツールを作るときにはいつも[“github.com/fatih/color”](https://github.com/fatih/color)パッケージを使っていたのですが、これが長らく[メンテナンスされない宣言](https://arslan.io/2018/10/09/taking-an-indefinite-sabbatical-from-my-projects/)がされているため、移行先を探していました。で、最近使うようになったのが[“github.com/gookit/color”](https://github.com/gookit/color)です。

gookit/colorは多彩なモードをサポートしています。256色にも対応しています。僕は試していないですが、基本16色ならWindowsでも動作するようです。

# 基

元記事を表示

CleanArchitectureでGolangらしいPackage構成を考える

[GameWith Advent Calendar 2019](https://qiita.com/advent-calendar/2019/gamewith) の記事です!

[GameWithのリプレイスについて vol.1 ~概要編~](https://tech.gamewith.co.jp/entry/2019/10/24/161947) でのバックエンドの設計の知見になります。

# 前置き
この記事は2019/10/24にLT登壇させていただいた際に作った
下記のスライドを書き直したものです。

# 概要
Golang で **CleanArchitecture** を参考にして、
Webアプリケーションを作成するにあたってのPackage構成の知見になります

### 注意
[golang-standard/project-layout](https://github.com/golang-standards/p

元記事を表示

Go + Stackdriver Logging富豪的利用でWebサーバ開発を加速する

サーバーのログが全文検索可能かつ、処理単位で構造化されたログ表示の存在は便利で開発運用が捗ります。例えばサーバとクライアントで開発者が分離している場合、StackdriverのWebコンソールでHTTP Request Header, Request/Response Bodyの3点セットがログ全文検索可能になっているとクライアントE単独で調査できるようになるためクライアントEの開発も加速する場合があります。

Goで構造化ログを出力してWebサーバ開発を加速させる [Go3 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go3) 記事です。便利になる反面ログ出力数がどうしても通常より多くなりすぎるため費用と便利さのトレードオフが発生します。本番環境で有効にするかは十分に吟味して検討するとよいでしょう。

#### GCP詳しい人向けの補足
**GAE 1st gen時代に大変便利** だったカスタマイズされたStackdriverログ表示をCloudRunやその他GCPサービスでも同様に出力できるよう試行錯誤

元記事を表示

goqueryとは

# はじめに
goでスクレイピングしたいと考え、google先生に質問すると皆こぞってgoqueryを使っています。しかし、goqueryを説明してくれている記事はあまり見当たらなかった為、今回まとめてみました。

> goquery:https://godoc.org/github.com/PuerkitoBio/goquery

## ページを取得する
今回は以下の公式のgoのページにアクセスしてみます!
> https://golang.org/

“`go
func main() {
res, err := http.Get(“https://golang.org/”)
if err != nil {
log.Fatalln(err)
}
defer res.Body.Close()
if res.StatusCode != 200 {
log.Fatalf(“status code error: %d %s\n”, res.StatusCode, res.Status)
}
fmt.Println(res)
}
“`

実行結果としては200

元記事を表示

Go 並行処理

ゴルーチンやチャンネルといった並行処理についてまとめます

## ゴルーチンとは
– Goにはゴルーチンという軽量スレッドの仕組みがある。(main()関数も1つのゴルーチンの中で実行されている)
– go構文を用いて、任意の関数を別ゴルーチンとして起動することで処理を並行にして走らせることができる

## チャネル
– 複数のゴルーチン間でデータをやり取りしたい場合に用いる
– メッセージパッシング(情報をメッセージとして送受信する)によってデータを送受信することができる
– make()関数に型を指定して生成することで、その型のデータの書き込みと読み出しができる。

“`go:main.go
// stringを扱うチャネルを生成
ch := make(chan string)
// チャネルにstringを書き込む
ch <- "a" // チャネルからstringを読み出す message := <- ch ``` ゴルーチン内で取得したステータスコードをチャネルに書き込み、main()のゴルーチンで読み出すことでデータの受け渡しを実現する ```go:main.go p

元記事を表示

“unnecessary guard around call to delete” という不思議なエラーが出た話

突然ですが以下のコードをご覧ください。
動物の種類とその鳴き声の組み合わせがmapになっていて、それを全部出力するコードです。

“`go:sample.go
package main

import (
“fmt”
)

func main() {
sampleMap1 := map[string]string{
“犬”: “ワンワン”,
“猫”: “ニャーン”}

sampleMap2 := map[string]string{
“犬”: “わんわん”,
“猫”: “にゃーん”}

sampleMaps := []map[string]string{sampleMap1, sampleMap2}

for _, sampleMap := range sampleMaps {
fmt.Println(sampleMap)
}
}
“`

ここでもし、データの一部に出力したくない物が混じっていたとしましょう。
例えばsampleMap2が以下のようになっていたとします。

“`go:sample.go
sampleMap2 := map[s

元記事を表示

Go エラーハンドリング

## エラー処理の基本
– Goにはtry〜catch〜finallyの例外処理は存在しない

FAQ


– エラーを処理するためにerrorインターフェースが用意されている

“`go:main.go
type error interface {
Error() string
}
“`
実際には、返されたエラーがnilかどうかで条件分岐し、nilではない場合error.Error()でエラー内容を出力しるような使い方をする

## errro packageのよく使う4つの機能
### 1.func New(message string)erro
エラーメッセージを文字列で指定して単純にエラーを生成する時に使う

“`go:main.go
err := errors.New(“エラー”)
fmt.Println(“output:”, err)
// output:エラー
“`
### 2.func Errorft(format string, args …interface{})error
フォーマット

元記事を表示

golangでk8sクラスターのDeploymentをscale

題名の通り、golangでk8sクラスターのDeploymentをscaleさせます。
まずはコードの依存関係です。

“`go
package main
import (
“fmt”
“net/http”
“io/ioutil”
“crypto/x509”
“crypto/tls”
“encoding/json”
“strings”
)
“`

以下、メイン関数です。
(以下コード中のAPIサーバーのエンドポイントの変数`apiserver`、証明書パスの変数`crtpath`、トークンの変数`token`については[こちら](https://qiita.com/sota0113/items/42b8d2cd53190c9c5bb7#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E6%83%85%E5%A0%B1%E5%8F%96%E5%BE%97)を参照してください。リンク先で、それぞれ`APISERVER`、`CRTFI

元記事を表示

hugoでその日の記事がビルドされない問題を回避する

hugoは、その日の記事がビルドされない問題があります。その回避法です。

“`toml:config.toml
[frontmatter]
date = [“:filename”, “:default”]
“`

ファイルは`content/post/2019-12-09-test.md`(その日の日付)とします。

## hugoでその日の記事がビルドされない問題

これは、UTCがデフォルトになっているためだと思いますが、hugoでは、通常、`.Date.Local`を使っても、その日の記事がビルドされない問題があります。

“`html:layout/_default/list.html
{{ dateFormat “2006-01-02T15:04:05JST” .Date.Local }}
“`

そこで、dateをファイル名から取得する方法に切り替えると、回避できます。

元記事を表示

リアルタイム画像リサイズAPIをGo + Serverless Application Modelで作った時の感想

ちょっと遅れましたすみません。
fushimiと申します。投稿させていただきます。

## Api Gateway + Lambda + Go + S3 で リアルタイム画像変換処理

Goで画像リサイズをやる機会があったので記述します。

今回は、事前に動画のエンコード済みパターンを作っておくのではなく、さくらの[imageflux](https://www.sakura.ad.jp/services/imageflux/)のように、**リアルタイムで動画のサイズを命令通りに変換しよう**っていう試みです。

数年前初めてこのアイディアを聞いたときは、「キャッシュに乗らないエンコードパターンいくらでもパラメータで作り放題だけど不正アクセスとか大丈夫かなあ…」と思ったものですが、各社なんだかんだやっていっている試みがあるようです。類似のものは結構見つかるかと思います。

サービスの画像が重くて困り始めた社内の人間から、「うちもLambdaとかでサクッと作れない…?」と聞かれたのもあり、試しにやってみました。

## image-resizer-service

まず、aws

元記事を表示

[Golang][競プロ]与えられた1~9の数値4つで任意に2桁の整数を2つ作り、それらの和が最大になる場合の、その和を求める問題について解説

# 問題

**1〜9までの数値が4つ与えられ**、あなたはその4つの数値で、**自由に2桁の整数を2つつくる**とします。
様々な組み合わせがあるかと考えられますが、**2つの2桁の整数を合計したときの、最も大きい値**を調べて下さい。

## 例

**たとえば、`1 2 3 4`という数値を与えられた場合、**「12+34」や「13+24」などさまざまな組み合わせができます。
しかし、合計が最も大きくなるのは、この場合だと「42+31」であり、その合計は`73`です。
**この場合の答えは`73`として下さい。**

なお、この値は以下のような形で標準入力で渡されることとし、全て同じ値であることもありえるものとします。

“`text:与えられる数値の標準入力例1
1 2 3 4
“`

“`text:与えられる数値の標準入力例1に対しての期待する回答
73
“`

↑この場合、42+31= 「73」 が正解になります。

“`text:与えられる数値の標準入力例2
9 2 7 5
“`

“`text:与えられる数値の標準入力例2に対しての期待する回答
167
`

元記事を表示

golangを使って推しに励ましてもらう

## 進捗生成って大変

進捗生成するのって大変ですよね!githubに草が生えるだけだと物足りないと思ったので、最近学習し始めたgoを使って自分の推しが褒めてくれるような物を作りました

## 目次
1. github api v4を覗いてみる
2. githubv4を使ってみる
3. webhookを使ってdiscordにメッセージを送る
4. herokuにデプロイしてみる

## github api v4を覗いてみる

> github api v4

github api v4ではgraphQLと言うものが使われています。ここではgraphQLの最低限の説明をします

> 詳しい説明はこちら:https://qiita.com/bananaumai/items/3eb77a67102f53e8a1ad

### GraphQLの利点
私自身も今回初めてgraphQLを使ったのであまり詳しいことは言えませんが、これを使っていてひとつ思ったこととしては「サーバー側が楽」だと思いました。
なぜかと言うと、graphQLを使うことでフロント側は欲しい情報だけを簡単に取得することが

元記事を表示

AtCoder Beginner Contest 147 参戦記

# AtCoder Beginner Contest 147 参戦記

## A – Blackjack

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

“`python
A1, A2, A3 = map(int, input().split())

if sum([A1, A2, A3]) >= 22:
print(‘bust’)
else:
print(‘win’)
“`

## B – Palindrome-philia

2分で突破. 書くだけ.

“`python
S = input()

result = 0
for i in range(len(S) // 2):
if S[i] != S[-(i + 1)]:
result += 1
print(result)
“`

## D – Xor Sum 4

46分くらい?で突破. Cを提出したら WA3 で諦めてこっちに取り掛かったのでよく分からず. ビットごとに累積 XOR をするだけ. だけって言ってもコーディングは中々大変. Python で書いたら TLE になったので、Go で書き直した. `% 10

元記事を表示

【Golang】Templateファイルを使って大容量JSONファイル生成するツール

# お題
[前回](https://qiita.com/sky0621/items/5f4f38b261e2fd050ece)の記事で大きめサイズなJSONを用意するのに適当に書いたコードを少し直したもの。
ツールと言っても、汎用性のあるものではなく、指定した件数分の構造を持つJSONを生成するだけ。

以下のようなテンプレートファイルを「`json.tmpl`」という名前で用意して、ツールと同じパスに配置。

“`
{
“items”: [
{{range .}} {
“id”: “id-{{.No}}”,
“name”: “あいてむ{{.No}}”,
“price”: {{.No}}
}{{.Comma}}
{{end}} ]
}
“`

で、コマンドラインで `./tools` と叩けば以下のJSONが出来上がる。ただそれだけ。

“`json:[data.json]
{
“items”: [
{
“id”: “id-1”,
“name”: “あいてむ1”,
“price

元記事を表示

ディスク情報を取得するコマンドを試作してみました

この投稿は「[さくらインターネット Advent Calendar 2019](https://qiita.com/advent-calendar/2019/sakura)」の9日目の記事です。

## 概要

* ディスク情報を取得するコマンドを Go 言語で実装してみました。
* [さくらのクラウド](https://cloud.sakura.ad.jp/)で試してみます。
* コマンドの仕様について説明します。

## 動機について

普段 Go 言語をメインで使っているので、Go 製のライブラリやツールなどをよく検索しています。
そんな中、Go 言語で実装されたハードウェア情報を取得するツール [ghw](https://github.com/jaypipes/ghw) を見つけたのですが、ghw をはじめ、`udevadm info` や [util-linux](https://github.com/karelzak/util-linux) の `findmnt` などがどのようにディスク情報を取得しているのかが気になり、学習がてら実装してみました。

## ディスク情報を

元記事を表示

[The Go Programming Language Specification] String literals

# Go
Golangのspecificationの日本語訳と、ちょっとした遊びぐらいのコードを載せていく感じで進めようと思うので、
すでにGolangでコードを書いている人にはつまらないかもしれないです

また、間違っている部分があればぜひご指摘いただけると嬉しいです?‍♂️

#### 想定する読者層
– Golang初めてそこまで期間が経っていない
– 英語の公式読むの辛い
– https://golang.org/ref/spec

### String literals
本記事は公式のドキュメントを参考にしています

– https://golang.org/ref/spec#String_literals

String literals はcharacter(文字)の結合された集まりです

### Stringの宣言方法
String literals は2つの宣言方法があります ` のバッククウォートもしくは、 ” ダブルクウォートを使う方法です

“`golang
s := `string`
s := “string”
“`

2つの宣言方法の違いは、

元記事を表示

Go言語、buffaloのログイン処理を作成してみる

この記事は [Go4 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go4) の 9 日目の記事です。

8日目の記事は[こちら](https://qiita.com/KanikoroRerere/items/e2dcc44e625849526015)

## go buffaloとは

https://gobuffalo.io/en

go言語で作られたrailsっぽいフレームワークです。
早くて軽くて開発環境も最初からホットリロード付きで非常に快適に開発を進めることができます。
テストも簡単に書けますよ。

インストール方法などは[こちら](https://qiita.com/k-kurikuri/items/f46356b70fe3e7e8da7d)の記事を参照ください。

## ログイン機能を作りたい
さっそくログイン機能を作っていきましょう。

まずはプラグインのインストールです。

“`shell
buffalo plugins install github.com/gobuffalo/buffa

元記事を表示

goでyamlを直感的にお手軽に操作できるIF「go-rough-yaml」

## 概要

golangでyamlをラフに扱うパッケージを作りました。

> xshoji/go-rough-yaml: go-rough-yaml provide accessor methods to edit yaml.
> https://github.com/xshoji/go-rough-yaml

背景とかいいから使いっぷり教えてよ!って方は[使い方](#使い方)までどうぞ

## 背景

yamlをgolangで参照、加工しようとした際、お手軽にyamlのデータを扱えるパッケージが存在しないことに気づきました。
ここでいう「お手軽」とは、例えば特定のキーを参照、削除、あるいは書き換えたりするだけの操作を指します。
goでyamlを扱うためには

> go-yaml/yaml: YAML support for the Go language.
> https://github.com/go-yaml/yaml

を使うのが一般的です。yamlの内容を構造体にUnmarshalして利用しますが、構造体を定義するのが面倒です。
このとき構造体を定義せずとも、`map[in

元記事を表示

LINEに投稿した写真をS3に保存していく

この記事は[ぷりぷりあぷりけーしょんず Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ppap)の9日目の記事です。

# はじめに
現在個人でLINEMessagingAPIを使ったアプリ開発をしており、メッセージから画像を取得しAWS S3に保存していく、という工程をAWS Lambdaで実装したのでその話をしていきます。

ちなみに今回LambdaのRuntimeはGoで書いたのですが当方Goでちゃんと実装するのは初めてのコードになるので見にくい箇所もあると思いますが、もし心優しい方いましたら丸めの鉞(指摘)を頂けますと幸いです。

# 使用技術
LINE Messaging API
AWS Lambda
AWS APIGateWay
AWS S3
Go 1.13

# 設計

![Untitled Diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227898/0af34db7-b8bf-6541-a25

元記事を表示

OTHERカテゴリの最新記事