- 1. AWSの利用料金をChatworkに通知してくれるバッチをGoで作った
- 2. Buffer を二回読む必要が生じたら?
- 3. tarの中身に対してチェックサムを打ちたい
- 4. Go runtimeの内部実装を覗きながら、チャンネルのことを知る
- 5. 設定ファイル統一戦争勃発(もしくはHOCONのススメ
- 6. go getしてから、プログラムが実行できなくなり、解決するまでの話
- 7. Goで祝日を判定するライブラリまとめ
- 8. GoでAPI Clientのframeworkを考えてみた
- 9. [Go]termbox-goでpecoっぽい何かを作る
- 10. ファイルのコピー処理
- 11. サーバレス環境でbotを動かす(Go & Cloud Run)
- 12. testingだけで完結するmockを作る #Golang
- 13. [Go]マイグレーションツールsql-migrate使い方
- 14. Goと勢いでDynamoDBのキャッシュを作ってみた
- 15. MultiPart のファイルアップロード実装のCLIクライアント・サーバーコードを理解する
- 16. Go で Go を build して Go を Go で開発しよう
- 17. 【GKE】Nuxt.jsとGOでREST APIを構築した手順をまとめる
- 18. 聖夜を彩るPOSTMANになろう
- 19. Bazelとgrpc-goを仲良くさせる
- 20. Go を用いて猫 GIF に LGTM テキストをつけたかった
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/boneBoneは殆どのものに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 mainimport (
“flag”
“fmt”
“io/ioutil”
“log”
“strconv”
ファイルのコピー処理
“`go:man.go
package mainimport (
“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 ク