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

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

Goルーチン使ってスクリプト作ったー! / アクセス制限とうまくやる方法

:calendar_spiral: [i-plug Advent Calendar 2019](https://qiita.com/advent-calendar/2019/i-plug) の【11日目】の記事です:santa::tada:

## あるスプリントで
こんな依頼がありました。
弊社のある部門が、あるサービスでねこ:cat:さんの日記をつけていた。
しかしこの度、別のサービスに日記を投稿することにしたのでまえのサービスの日記に添付されてるねこ:cat:さんの画像をすべて抜き取ってきてほしい、という依頼です。(フェイクです)

…その数なんと3万枚

おし!やったるで!:nerd:

## 一瞬で終わりそう?
どう取得するかヒアリングしてみるとAPI経由での取得みたいでした。
であるならばGoルーチンとhttp/netをつかって3万のGETリクエストを一気に飛ばしAPIを叩けば、一瞬で取得できそうです。

なんや、秒で終わりやん!:nerd:

## API経由で取得できるみたいだけど
公式から公開されているAPIです。やはりアクセス制限がかかっていました。
**20r

元記事を表示

Goのタイマー time.Timer の作法

[Goアドベントカレンダーその6](https://qiita.com/advent-calendar/2019/go6)の穴埋め投稿です。

## 忙しい人のためのまとめ

* `Timer.Stop()`は戻り値を見て`<-timer.C`する(下記の作法参照) * `Timer.Reset()`はTimerが確実に止まってから呼ぶ * `time.AfterFunc()`は基本的には使わない * Timerは1つのgoroutineでしか触らない ```go:Timer.Stop()の作法 if !timer.Stop() { <-timer.C } ``` ## time.Timer型とは Goの標準パッケージ`time`にて提供されている機能で、指定時間後に一度だけ発火するイベントを作ることができます。 詳しくは[ドキュメント](https://golang.org/pkg/time/#Timer)をご覧ください。 この記事の内容は、よく読めばドキュメントに書いてある内容ですが、よく読んで試さないとわかりにくかったのでまとめました。 Timerを作成する関数は`Ne

元記事を表示

最速でinitを呼ぶ

[Goアドベントカレンダー](https://qiita.com/advent-calendar/2019/go)の穴埋め投稿です。

他の初期化処理に先駆けて、真っ先に何かをやりたいことってないですか?ありますよね?

# initの呼び出し順序

Go処理系の実装依存であって、仕様はないのですが、Python同様Goは主要実装が仕様なところがあるのでこれに従って説明します。ググるといろいろ情報が出てきます。

[Package initialization and program execution order](https://yourbasic.org/golang/package-init-function-main-execution-order/)

* mainパッケージの初期化
* 自身のパッケージの前にimportされているパッケージを初期化
* パッケージは1度にひとつずつ初期化される
* パッケージレベルの変数は宣言順に初期化される
* 最後に自分の中のinitが呼ばれる
* 最後にmain関数を呼ぶ

ここに書いてない情報としては、パッケージ内

元記事を表示

Go言語の静的解析の仕組みについて調べた

この記事はGo5の11日目の記事です。
Goは静的解析ツール(特にコード生成まわり)が非常に強力です。Goの静的解析の仕組みについて調べたことについてまとめました。

(本当は何かツールを作りたかったのですが、どういう仕組みなのかだけの解説になっているのでご容赦ください。)

# Golangと静的解析

Golangは**静的解析をしやすいことを目指して**シンプルな言語デザインになっています。

>Why is the syntax so different from C?
Other than declaration syntax, the differences are not major and stem from two desires. First, the syntax should feel light, without too many mandatory keywords, repetition, or arcana. Second, the language has been designed to be easy to analyze and can be p

元記事を表示

mapをmakeする時の第二引数

[Go6 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go6)の11日目の記事になります。

# はじめに

この間のGoConferenceで、`map`を`make`する時に第二引数を指定できることを知ったので、これを機にGoの組み込み関数を読んでみることにしました。また、この`make`関数の利用方法についても検討してみます。

# make関数

まずは、`make`関数をおさらいしておきましょう。
`buildin`パッケージ配下の関数で、`slice`, `map`, `chan`のみがこの関数を用いてアロケート、初期化を行うことができます。実装は`runtime/map.go`にあります。

> https://golang.org/pkg/builtin/#make

## makeの第二引数

`make`の実装を読んでみると、第二引数を指定しなかった場合、64bit環境では48byte, 32bit環境では28byteが確保されます。

第二引数に数値`count(>8)`を指定した場合[

元記事を表示

音楽プレイヤー作って音楽を同時ファイルしてみたい

前回、Goで音楽再生まではできました
https://qiita.com/usk81/items/8590172a23bb71e21329

普段、ニコ動でブラウザのタブ2つ開いて違う歌い手さんで同じ曲を同時再生してデュエットする遊びをしているので、プログラムでできないかと思ってやってみました。

## 元のコード

“`go
// package main plays two audio file
package main

import (
“log”
“os”
“time”

“github.com/faiface/beep”
“github.com/faiface/beep/mp3”
“github.com/faiface/beep/speaker”
)

func main() {
f, err := os.Open(“test.mp3”)
if err != nil {
log.Fatal(err)
}
st, format, err := mp3.Decode(f)

元記事を表示

Goで音楽を奏でてみた

Advent Calendar5日目に音声分析をGoでやろうとして挫折してしまいましたが、せめて音楽を再生できないか調べてみました。
https://qiita.com/usk81/items/8284ff74e79bdbd7dbae

pydub相当のパッケージは存在しませんが、音楽ファイルを再生できるぐらいのものはありました。

beep
https://github.com/faiface/beep

“`golang
// package main plays two audio file
package main

import (
“log”
“os”
“time”

“github.com/faiface/beep”
“github.com/faiface/beep/mp3”
“github.com/faiface/beep/speaker”
)

func main() {
f, err := os.Open(“test.mp3”)
if err != nil {
log.Fatal(err)
}
st, format, err := mp3.

元記事を表示

golangでslackbotを作る

以前からGAS→Rubyと書き換えてきた鉄道の遅延情報教えてくれるslackbotをgolangで書き換えて運用を始めたので、紹介させてください。

https://github.com/yuina1056/go-TrainInfoBot

## 実動作
スクリーンショット 2019-12-10 21.17.34.png

## 動作環境
golang 1.12.5
AWS Lambdaで動作
LambdaへのデプロイはGUIから行っています。

## golangコード
仕事でDIして依存をmockできるテストコードを書きやすいコードを書く方法を覚えたので、テストコードを書く練習を兼ねてテストコードを書くようにしています。
ロジックもうちょいなんとかなりそうだけれど、ちょっと面倒だったので一旦はこれで。

今もうま

元記事を表示

Go + GmailAPIでサービスアカウントからメールを送信する

## はじめに
GOでGmailAPIからメールを送ろうとした時、
サービスアカウントを利用しようとすると一気に情報がなくなって苦戦したのでメモ

## やりたいこと
– GSuiteのドメイン内のユーザが送信するメールの自動化
– ユーザが認証をせず、ユーザのアドレスから送信したように見せかけたい

## いいたいこと
– サービスアカウントにドメインの権限を委任しよう
– サービスアカウントクライアントにGSuiteの権限を委任しよう
– JWTを利用した認証をしよう

今回のサンプルリポジトリ
https://github.com/siro33950/go-send-gmail-sample

## サービスアカウントとは
ユーザが操作をしなくても様々な権限を付与できるアカウント
https://cloud.google.com/iam/docs/service-accounts?hl=ja
> サービス アカウントは、個々のエンドユーザーではなく、アプリケーションや仮想マシン(VM)に属している特別な Google アカウントです。
> アプリケーションはサービス アカウントを

元記事を表示

GoでGUIを作るFyne というライブラリが楽しそうだよ、というご紹介

この記事は[Go4 Advent Calender](https://qiita.com/advent-calendar/2019/go4)の8日目の記事です。
前日の記事はこちらー [7日目](https://qiita.com/nayuneko/items/dea02377b797c2a52053)
翌日の記事はこちら- [9日目](https://qiita.com/keisukefunatsu/items/49b4145747f719807847)

# 筆者のGo歴
– 1年前までプログラミング関連の経験/知識なし
– Goは今年の5月から趣味で牛歩

# 前置き
– この記事は、Fyneというライブラリの簡易的な紹介のみ
– 極力間違いのないように調べたつもりだが、初学者なので鵜呑みには注意
– 間違いなどあればコメントや編集リクエスト頂けると泣いて喜びます

# [Fyne](https://fyne.io) とは
– GoでGUIアプリケーションを作成する際に利用できるライブラリ
– [OSS(Github)] (https://github.com/fyne-io

元記事を表示

golangでDIを行ってみた

# 背景
初めてGo言語を使ってAPIを作っており、テストを書くことに。
以前、Javaを使った開発をしていたので、そのノリでテストを書こうとしたのですが…
書いてみると、mockが上手く使えない…
そこで、Googleさんに色々聞いていたら、どうやらDIというものがあるらしいってなった次第です。

なお、ここに書いてることは自分なりの解釈なので、間違い等ありましたらコメントにてご指摘をお願いします!

# DIとは
参考:
[猿でも分かる! Dependency Injection: 依存性の注入](https://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f)
[やはりあなた方のDependency Injectionはまちがっている。](http://blog.a-way-out.net/blog/2015/08/31/your-dependency-injection-is-wrong-as-I-expected/)

## Dependency Injection=依存性の注入
どうやらDIとは、Dependency Inje

元記事を表示

Golang開発のすすめ

# はじめに
ジョインしているPJ内で `golang+gPRC` なAPIを構築することになりGoを3ヶ月程齧ってみたので
Goの開発時に気をつければ良さそうなポイントをまとめておきます。
この記事はこれからGo開発する人、もしくは私と同じくGoで開発をし始めしばらく経った人を対象としています。

Goをしばらく使ってみて感じたところとして
Goは良い意味でも悪い意味でも自由度が少なく主張の激しい言語という印象です。
ジェネリクス型がないせいで型が違うだけの同じようなコピペコードを複数書く必要があったり
スペースの代わりにタブを強要される所も場合によっては人をイラつかせる要素ではありますが
[郷(Go)に入っては郷(Go)に従え (鵜飼文敏氏)](https://gihyo.jp/news/report/01/GoCon2014Autumn/0002?page=1) とも言われていますしそういうもんなのかなと思ってます。

# 開発環境について
主に開発環境やツールに関するポイント

## Go Modules を使用する
Go では `GOPATH` という特殊な概念がありgo

元記事を表示

GoでMySQLを使ってみた

最近GoをはじめてちょうどAPIを作っているところですが、Goでのデータベースの扱いについて学ぶことができたので記事にします。

## データベースの定義
今回は例なので、適当に定義してしまいます

“`
table hoge:
id int not null auto_increment primary key
text varchar(256)
description varchar(256)
“`

これをもとに進めていきます。

## 構造体と各種メソッド

“`Go
type Hoge struct {
id int
text string
description string
}

func (hoge *Hoge) Insert(tx *sql.Tx)(err error) {
cmd := “INSERT INTO hoge (text, description) VALUES (?, ?)”
_, err = tx.Exec(cmd, hoge.text, ho

元記事を表示

Go言語 ElastiCacheの その前に

はい。ということで**五七五**ではじまりました、テックタッチ Advent Calendar 2019 10日目です。
本記事を担当する @mxxxxkxxxx です。
よろしくお願いします。

9日目は @smith-30 による [Nature Remo で快適生活](https://qiita.com/smith-30/items/3fd1457b5c16296bdccd) でした。読むと Nature Remo 欲しくなりますね。しかしサイバーマンデーは終わってしまった。なんとかすでにおすし?ですね。とはいえ通常の売価も高くないので買いです!
ちなみに私は[ワンレンではありません](https://qiita.com/smith-30/items/3fd1457b5c16296bdccd#おわりに)。

ということで今回はサーバサイドのキャッシュのお話をしたいと思います。

# サーバサイドのキャッシュ、とりあえず ElastiCache 入れとけ!ってなってませんか?

キャッシュに KVS を使うことはよくあると思います。例えば ElastiCache とか。
しかし

元記事を表示

Goで行列計算をいくつか実装してみる

この記事は[tomowarkar ひとりAdvent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)の10日目の記事です。

行列計算がしたかった…

### 行列の構造体定義
“`go
// Matrix …
type Matrix struct {
height int
width int
field [][]float64
}
“`

### ゼロ行列生成
“`go
// ZerosMatrix …
func (m *Matrix) ZerosMatrix(h, w int) {
m.field = make([][]float64, h)
for i := 0; i < h; i++ { m.field[i] = make([]float64, w) } m.height = h m.width = w } ``` ```go m.ZerosMatrix(2, 3) // {2 3 [[0 0 0] [0 0 0]]} ``` $$ \left[

元記事を表示

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) 10日目の記事です。9日目はuniさんの[dive into iota: iotaはいつ誰が管理しているのか?](https://www.uniuniunicode.com/posts/2019/12/iota/)記事でした。全文検索可能な構造化ログは便利になる反面ログ出力数がどうしても通常より多くなりすぎるため費用と便利さのトレードオフが発生します。本番環境で有効にするかは十分に吟

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事