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

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

AWSの利用料金をChatworkに通知してくれるバッチをGoで作った

## はじめに
AWSの料金を毎日確認しにログインしてコンソールを開くのは面倒…。でも、気がついたら設定が間違っててすごい料金を請求されるなーんてことも。

そんなことが起こる前に、毎日使用料金を通知して把握しておこう!

ということで、Cost ExplorerのSDKを使ってGoでバッチを作成してみました。

## AWSの構成
![CostExplorer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546572/e7455498-048b-4e64-5bde-7eef464b1c06.png)

当記事はLambdaにアップするバッチにフォーカスしてます。

## 実装
### 通知したいこと
+ 昨日の利用料金
+ 今月の利用料金(今月1日から昨日までの合計金額) or 今日が1日のときは先月の利用料金

### 必要なもの
+ Chatworkのルームid(トークルームURL:chatwork.com/#!rid********* ←9桁の数字)
+ ChatworkのAPIトークン(画

元記事を表示

Buffer を二回読む必要が生じたら?

自分が作っているコマンドで、Buffer を二回読む必要が生じた。Bufferって2回読めたっけ?
と思って、ソースを見てみた。

“`golang
// A Buffer is a variable-sized buffer of bytes with Read and Write methods.
// The zero value for Buffer is an empty buffer ready to use.
type Buffer struct {
buf []byte // contents are the bytes buf[off : len(buf)]
off int // read at &buf[off], write at &buf[len(buf)]
lastRead readOp // last read operation, so that Unread* can work correctly.
}
“`

プライベートになっていて、アクセス出来ないプロパティがあって、オフセットがあるので、無理っぽい。
オフセット

元記事を表示

tarの中身に対してチェックサムを打ちたい

LinuxやUnixに設定ファイルをリリースするときに、
1. 開発環境で設定ファイルいじる
2. tarで固める
3. ステージングor本番でtarを展開する

という流れはよくあると思いますが、`tarの中身は開発環境と同じか?`とか言われることあります。

また、クラスタを組んでいるサーバ同士で設定が同じかチェックするために、
`sosreport`なりで情報を取得して比較する、というタスクがあります。

そんなときに全ファイルをdiffしていると見づらい。手っ取り早く差分があるか見たい、しかし展開はしたくない、
というニーズが(自分には)あったので、作ってみました。
https://github.com/kuritayu/infra-tools

# 仕様
以下で取得できます。
`go get github.com/kuritayu/infra-tools`
`go install “${GOPATH}”/src/infra-tools/cmd/lstar`

## 引数なし
引数なしで実行するとhelpがでます。

“`terminal
NAME:
lstar – p

元記事を表示

Go runtimeの内部実装を覗きながら、チャンネルのことを知る

#### Intro
Goは平行処理の利便性と簡単さで選ばれることが多い言語です。

その基礎にある主なコンポーネントはGoRoutinesとチャンネルの二つで、一緒い使われることが非常に多いです。Goのチュートリアルをやったことあるなら大体触ったことある身近なものでしょうが、チャンネルとは実際どういったデータ構造なのか?内部のロジックや処理順番はどうなっているのか?と意外と分かりづらいところも多いので、今回はチャンネルのソースコードを覗きながらその構造について少し説明して行きます。

まずチャンネルのソースコードが見れる場所です。
コンピュータにGoがインストールされている場合は、Goがインストールされているroot dirから`chan.go`というファイルを探します。(GoのパッケージやGOPATHが指している場所ではなくruntimeの場所なので、例えばMacのHomebrewによってGoがインストールしてある場合は`/usr/local/Cellar/go/[version]/libexec/src/runtime/chan.go`みたいな場所にあります。

また、golan

元記事を表示

設定ファイル統一戦争勃発(もしくはHOCONのススメ

こんにちは、Wano株式会社でVeleTという動画広告配信サービスのエンジニアをやっております。stk0724です。

この記事は[Wanoグループ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/wano-group)の24日目となります。

仰々しいタイトルですが、なんのことはありません。設定ファイル管理をどのようにいい感じにしたかについてお話します。

## 顛末

結論から先に言うと、統一してないです。

大本となるjsonファイルをパラメータファイルとして、用途別のテンプレートファイルから各種設定ファイルをレンダリングする方式をとりました。

## 前提: 設定ファイル、いっぱいありますよね?

webアプリケーションフレームワークやら、各種ミドルウェアやらで最近のサービス開発では複数種類の設定ファイルを扱うことになると思います。

VeleTの場合ですと、

– 管理画面の設定ファイル
– nginxの設定ファイル
– fluentdの設定ファイル

などがあります。

### 設定ファイルがバラけ

元記事を表示

go getしてから、プログラムが実行できなくなり、解決するまでの話

#経緯
実行環境は`Mac`です。

Go環境を構築時、`$GOPATHを明示的に指定せず`構築してからプログラムを書き、実行していた。
外部パッケージを`go get`で取得してプログラム内でインポートする必要が出てきた。
`go get`自体は実行だけなら問題なく出来たものの、その後`go run foo.go`がエラーで通らなくなった。

エラー内容で案内された通りのコマンド叩いても、`反応無し`。
※`warning`については後述

“`go:エラー内容
human$ go run foo.go
warning: GOPATH set to GOROOT (/usr/local/opt/go/libexec) has no effect
go: inconsistent vendoring in /usr/local/opt/go/libexec/src:
go.mod requires github.com/stretchr/testify v1.4.0 but vendor/modules.txt does not include it.

元記事を表示

Goで祝日を判定するライブラリまとめ

# はじめに
[Yahoo!ファイナンスの更新が停止 12月23日が「天皇誕生日」のまま、運営元が設定ミス](https://www.itmedia.co.jp/news/articles/1912/23/news079.html)

関係者の皆様、対応おつかれさまでした。記事を見ているだけで胃が痛いです。
祝日や営業日を扱うサービスでは誰にでも起こりうるインシデントではないでしょうか。
というわけで、Goで祝日を扱うライブラリをまとめました。

# 祝日が判定できるライブラリ
## najeira/jpholiday
https://github.com/najeira/jpholiday
2019年4月1日に天皇誕生日の修正がされていました。

## holiday-jp/holiday_jp-go
https://github.com/holiday-jp/holiday_jp-go

## kokardy/jpholiday
https://github.com/kokardy/jpholiday

## pinzolo/flagday
https://github.com/p

元記事を表示

GoでAPI Clientのframeworkを考えてみた

今回Advent CalendarでいくつかAPI Clientを作って感じたことは、GoでAPI Clientの構成は細部は違くともほぼ同じ作りで大抵の箇所は前に作ったもののコピーでできてしまうということです。

しかしながら、外部パッケージではなくコピーしたところも動作保証しなければならないため、それらの箇所に関してもすべてテストする必要があります。

API ServerやApplicationを作るときにFrameworkを使うと最低限の箇所を作れば、いいのと同じように共通化できる箇所を1つのパッケージにまとめた`bone`を作りました。

Bone
https://github.com/usk81/bone

Boneは殆どのものにInterfaceを用意しています。
そのため、

最小限の構成を考えた場合、以下のようになります。
クライアントの作成は、`bone.NewClient`がほとんど対応してくれます。
足りない部分を記載してあげるだけで完了します。

APIごとに1番異なるのが、レスポンスを受けたあとの処理とエラーレスポンスの処理方法です。
エラー対応は`Chec

元記事を表示

[Go]termbox-goでpecoっぽい何かを作る

## What’s termbox-go
[termbox-go](https://github.com/nsf/termbox-go)はテキストベースのユーザインターフェースを作るためのツールです。pecoでもtermboxが使われています。

## pecoっぽいとは
この記事での「pecoっぽい」とはインタラクティブに何かを選択できるものだと考えてください。今回は、引数でカレントディレクトリのファイルを選択できて、選択するとそのファイルの内容がプリントされるだけの物を作ります

## できたもの

![pecoli-compressor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274521/f97ddc00-0bba-9d00-e7d4-b733a4c44ae4.gif)

こんな感じの物を作りました。ソースコードは以下のようになっています

“`go
package main

import (
“flag”
“fmt”
“io/ioutil”
“log”
“strconv”

元記事を表示

ファイルのコピー処理

“`go:man.go
package main

import (
“bufio”
“fmt”
“os”
“os/exec”
“path/filepath”
“regexp”
)

const (
// 検索対象のパス。検索したいフォルダのパスを指定する
Root = `xxx\xxx\xxx`
// コピーしたフォルダを指定
DestPath = `xxx\xxx\`
)

var (
// マッチしたファイルを追加するため変数
file string
// 検索ワードを正規表現化して入れておく変数
re *regexp.Regexp
)

// filepath.Walk に渡す関数
func visit(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}

// ファイル検索
if !info.IsDir() && re.MatchString(info.Name()) {
//同じファイルがあって

元記事を表示

サーバレス環境でbotを動かす(Go & Cloud Run)

こんにちは!私(@f_yamagami)です!
この記事は、[All About Group(株式会社オールアバウト) Advent Calendar 2019](https://qiita.com/advent-calendar/2019/allabout) クリスマスイブの記事です。

## 前談(The・前談)
クリスマスイブですね。~~マジあれですね~~
みなさんはクリスマスプレゼントに何が欲しいですか?
ゲーム? お金? 休み?
やっぱりエンジニアならサーバですか?
あれ、そこのエンジニアさん
どうしてサーバと聞いて苦い顔をされていらっしゃるんですか?
え? サーバ障害の対応で、せっかくのクリスマスディナーが冷えてしまい、
恋人との関係も冷えてしまった過去が?~~ざまあみ(ry~~
※私はサーバにはなんの思い出もないです。

ということで、今回は会社の開発合宿で[先輩エンジニア](https://qiita.com/y_hideshi)に手取り足取りしていただきながら、**サーバレスの環境**でbatch処理を行った話を書いていきます。
[先輩のQiitaはこちら↓]
ht

元記事を表示

testingだけで完結するmockを作る #Golang

こんにちは。[まいたけ](https://twitter.com/maitaketurn)と申します。
こちらは、[Go4 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go4) の23日目の記事です。

Goで実装して、テストも実装して、、とやっていると、
ある程度以上の大きさ(&複雑さ?)の実装となるとmockが必要になるケースが増えるかなと思います。

[GoMock](https://github.com/golang/mock)を使って実装するやり方は結構情報あったのですが、
標準のtestingパッケージのみでmockを作る方法を詳しく書いている方があまり多くないようで(皆さんGoMockを利用されているということでしょうかね。。)
Goに入門して割りとすぐの頃にmockを作ろうとして少し苦労した記憶があるので、まとめてみたいと思います。

## テスト対象の実装
`createTask`と`updateTask`のmockを作りたいとする。

“`Go
type TaskInterface i

元記事を表示

[Go]マイグレーションツールsql-migrate使い方

## 公式リポジトリ

https://github.com/rubenv/sql-migrate

## 対応DB
MySQL / SQLite / PostgreSQL / MSSQL / Oracle Database

# 使い方

## 1. インストール
“`
$ go get github.com/rubenv/sql-migrate/…
“`

## 2. 設定ファイルのdbconfig.ymlを作成する
“`
development:
dialect: mysql //使用するRDBMS
datasource:[ユーザー名]:[パスワード]@/[データベース名]?parseTime=true
dir: db/migrations //マイグレーションファイルを作成するディレクトリ
table: migrations //マイグレーション履歴を保存するテーブル名
“`

マイグレーションファイルをどのディレクトに生成するか`dir: `で設定できます。
上記の場合、`db/migrations`ディレクトリに生成されます。

###

元記事を表示

Goと勢いでDynamoDBのキャッシュを作ってみた

こんばんは、gureguです。
もうすぐクリスマスですね。日本のクリスマスはフライドチキンと恋愛のイメージがありますが、母国のアメリカでは実家に帰って家族と過ごす日本の正月みたいなもんですよ。もちろん、仕事は休みです。
ということで[Go2 Advent Calendar](https://qiita.com/advent-calendar/2019/go2)の23日目の記事です。

最近、私はDynamoDBおじさんになりつつあります。[GoのDynamoDBライブラリ](https://github.com/guregu/dynamo)を作っていますし、仕事でも個人開発でもなんとなくDynamoDBを使ってしまいます。安くて便利ですね。
皆さん「[DAX](https://aws.amazon.com/dynamodb/dax/)」というサービスはご存知ですか?AWSが提供しているDynamoDBのキャッシュサービスです。DynamoDB専用のmemcachedみたいな感じですね。GoのDAXライブラリは[aws-sdk-goのDynamoDBのAPIのインターフェス](https

元記事を表示

MultiPart のファイルアップロード実装のCLIクライアント・サーバーコードを理解する

Go の シンプルで動作の早いWebフレームワークである[gin](https://github.com/gin-gonic/gin)と、multipartのライブラリを使って、サーバーとクライアントの複数ファイルアップロードの仕組みを記述してみたいと思います。
# サーバー側

[gin](https://github.com/gin-gonic/gin)はサンプルが充実しているので書くのがとても簡単でした。ルーターを作って、そこにルーティングを設定するだけです。

“`golang
func main() {
router := gin.Default()

router.POST(“/csv”, ReceiveFiles)

srv := &http.Server{
Addr: “:38081”,
Handler: router,
}

go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf(“liste

元記事を表示

Go で Go を build して Go を Go で開発しよう

## はじめに

有名な話ですが、Go は Go で開発することができます。(Go1.5 以降)
Go の開発を Go でできることは、メリットがたくさんあります。

* 可読性が高いため、他人の書いたソースコードのメンテナンスがしやすい
* 楽しい
* 自分の書くソースコードの品質を担保しやすいので、他人に自分のコードを理解してもらいやすい
* 楽しい

Go はクリーンでシンプルで、パワフルな言語で私は大好きです。
そんな自分が使っている好きなソフトウェアがどのように作られているかは、 とても興味があります。

そんな Go を読めて、 build できて、デバッグできて、ソースコードが書けることはとても面白い活動です。
また、処理系の中身がわかると、よりプログラミング言語の気持ちがわかるようになります。

というわけで、日本からももっと Go へコントリビュートしようぜという想いをこめて、
Go の build 方法と、ソースの変更をしてみた例を簡単に紹介します。

## 環境

今回試した環境は以下です。
必要なものは、Go1.4 以降の go コマンドと、

元記事を表示

【GKE】Nuxt.jsとGOでREST APIを構築した手順をまとめる

## GKEでREST API構築のための前提知識

まずは、GKEでREST APIを構築するために、まずは以下の前提知識について補足していきます。

– Kubernetes
– REST API

※僕がインフラを構築するまでにインプットした知識を整理したいという思いもあって補足しております。

### Kubernetes

>Kubernetes (K8s)は、デプロイやスケーリングを自動化したり、コンテナ化されたアプリケーションを管理したりするための、オープンソースのシステムです。
引用:https://kubernetes.io/ja/

Kubernetesの補足は引用ママですね。

また、どのGCPサービスを選ぶかみたいなツリーが、下のGoogle公式ドキュメントに書いていたりします。

参考:https://cloud.google.com/blog/ja/products/gcp/choosing-the-right-compute-option-in-gcp-a-decision-tree

Dockerを利用している時点で選択肢がだいぶ絞られていて、「**本番

元記事を表示

聖夜を彩るPOSTMANになろう

# はじめに

皆さま、はじめましてDMMWEBCAMPでメンターをしています(元)軍人エンジニアの @HAGARIHAYATO と申します。
この記事はDMMWEBCAMPのアドベントカレンダー24日目の記事となっています。
Qiita初投稿なので暖かい目で見守ってくださると嬉しいです!
# 概要

プログラミングを始めてアプリ開発ができるようになったらAPIの開発がしたくなってくるはずです!
ですがAPI開発はclient側とserver側が別動で行われることが多いと思います。

その結果railsのようなフルスタックなフレームワークを使っていると確認ができるような、サーバーとのデータの送受信の際に困惑してしまうこともあるかもしれません。

そんなときに便利なツールがPOSTMANです!

[POSTMAN](https://www.getpostman.com/)

リンクを踏んで頂くと公式ページに遷移するので、まずはダウンロードしてください。
ダウンロードができたらアプリケーションフォルダにも移しておくのも忘れずにやっておきましょう!
開くとこのような画面になっていると思います

元記事を表示

Bazelとgrpc-goを仲良くさせる

# Bazelとは

[前の記事](https://qiita.com/f110/items/347742a9bc311d2a83cf#bazel%E3%81%A8%E3%81%AF) を参照してください。

Googleが中心となって開発している

* ビルドを独自のサンドボックス環境の中で行う
* ビルドの再現性が高い(サンドボックスの中で行われるので)
* 高速
* 複数の言語に対応できる
* 拡張性が高い

というような特徴を持ったビルドツールです。

# Protocol Buffersをどう扱うか

[以前書いた](https://medium.com/mixi-developers/bazel%E3%81%A8%E3%83%A2%E3%83%8E%E3%83%AC%E3%83%9D-b901ffba61ce) 方針から変わっていません。
protoファイルは生成されたソースコードもリポジトリに含めてしまいます。
生成されたソースコードをリポジトリに入れてしまうのは主にエディタのコード補完のためです。

生成されたソースコードはサンドボックスの中に閉じ込められてし

元記事を表示

Go を用いて猫 GIF に LGTM テキストをつけたかった

## 最初に
![35f52309-0054-4794-880b-52e0be6612c0.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30359/cd6dc344-968c-599c-ed7c-8620576ded02.gif)

上記が `font.Drawer` を用いて **GIF に対しLGTMを付与**した例です :sob:
まぁこれはこれでアリかなって思っちゃいますが、LGTM が躍動感出て不具合感が否めません。

※ 文字に被らない自覚ある猫の場合は以下の通りです。
![813c4da8-9735-42fe-9142-f9b8cf819c15.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30359/ef872ba4-8843-ddc2-76ed-10f0c823c179.gif)

## 原因
https://golang.org/pkg/image/gif/#GIF

残像が残るのは Gif ク

元記事を表示

OTHERカテゴリの最新記事