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

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

GoでJWTを使って認証してみる

メリークリスマス!開発が楽しくて充実してますー!:innocent::innocent::innocent:

[Ca Tech Dojo/Challenge/JOB Advent Calender 2019](https://qiita.com/advent-calendar/2019/dojo-challenge-job)の25日目は@yawn_yawn_yawn_が書かせていただきます!
@ta9starにめっちゃハードル上げられた気がしますがマイペースにいきます。

# はじめに
やっと忙しさも緩和されて開発できるようになったので。楽しくなってきました。

個人開発でもゼミで始めたプロジェクトでも、個人認証が必須になりました。今のご時世必須機能ですね。
認証周りのことで、cookieにセッションIDとか乗っければいいかーと思っていたのですが、
「インターンでJWTという単語を聞いたな…そういえばまだ手が出せてなかったな…」
ということで、調べて実装!までやってみました。
ついでに改ざん検知をやって感動したので。

# JWTとは
JWTについての知識は調べればそこらじゅ

元記事を表示

Wu らによる差分検出の O(NP) アルゴリズム実装シリーズ ③Goによる実装

## はじめに
これは、3回にわけて Wu らによる O(NP) アルゴリズムを解説、実装するシリーズです。

– [①仕組み、考え方](https://qiita.com/convto/items/e05d8147d9808a27b8ff)
– [②探索方法](https://qiita.com/convto/items/8faf530d304024a22769)
– [③Goによる実装](https://qiita.com/convto/items/39efea78e23a944d0760) <- 今回 の3部に分かれています。 今回は、O(NP) アルゴリズムを実際に実装していきます。 前回([①仕組み、考え方](https://qiita.com/convto/items/e05d8147d9808a27b8ff))、前々回([②探索方法](https://qiita.com/drafts/8faf530d304024a22769))でアルゴリズムの考え方、探索方法はわかっているので、今回は実装上の注意点を説明しつつ、実装していきます。 元論文は [An O(NP) Se

元記事を表示

【Go】appendで新しく配列が割り当てられる際にどれくらいcapが確保されるか知っていますか?

知りませんでした。

これは、[Go6 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go6) 25日目の記事です。

# はじめに

Goにはsliceという内部で配列の参照を持つ可変長のリストが存在します。
このsliceに要素を追加する場合、よくappendという関数が用いられます。

“`golang
a = append(a, b…)
“`

上記のコードを用いると、aのsliceにbの要素が追加されます。

この際、もしaのsliceのcap(容量)が追加されるbの要素を加えても足りるのであれば、bはaのsliceが参照を持っている配列に追加されます。
逆にcapが足りない場合は、新たに配列を割り当ててそちらに追加するようになっています。
(詳しくは、[Go7 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go7) 9日目の @ueokande さんによる [図解 Go Slice Tricks](https://i

元記事を表示

うちのGoogle Homeをサンタさんが来るのが待ち遠しい子供のようにしてみました

Googleが毎年やっているSanta Trackerを使ってサンタさんが今どこでプレゼントを配っているかを逐次報告してくれるようにしてみました。

https://github.com/usk81/til/tree/master/go/santa-stalker

# Santa TrackerのAPI

– [自分の現在地](https://santa-api.appspot.com/info?client=web&language=en&fingerprint=&routeOffset=0&streamOffset=0)
– [サンタの目的地一覧](https://firebasestorage.googleapis.com/v0/b/santa-tracker-firebase.appspot.com/o/route%2Fsanta_en.json?alt=media&2019b)
– URLの`2019`を変えればその年のデータになるようです
– `en`を`ja`に変えれば地名を英語から日本語に変更できます

# 色々諦めたこと

– 緯度経度と距離から近くにいるよ

元記事を表示

Linux Network NamespaceをGoで操作する

# TL;DR

1. Go言語のgoroutineはdefaultではpreemptiveに動作するOS Threadが切り替わるのでOS Threadに強く紐づくlinuxのnamespace関連の操作を行うときは“`runtime.LockOSThread()“`しておく必要がある。[^1]
2. Go言語でLinuxのnetwork namespaceを操作したい場合は[CNIのライブラリ](https://github.com/containernetworking/plugins/tree/master/pkg/ns)を使うのが便利

[^1]: https://github.com/golang/go/wiki/LockOSThread

# なんでこんな事してるの?

テナント(200~)毎にVMを用意してると管理やコストが大きいため、アドレス空間が衝突してるテナントに対してHTTP(S)リバースプロキシを提供する仕組みを作ってみようと思った。

# Proof of Concept

試しに下記のコードを実行してみる。

“`golang
package m

元記事を表示

【Go言語で始めるgRPC】簡易CRUD+αアプリケーション

# はじめに
こちらは、[Go4 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go4) の24日目の記事です。

こんにちは、最近Go言語にはまっているエンジニアです。

この前は別のアドベントカレンダーでGobotを使ってドローンを飛ばす記事を作成しました。
[Go言語のフレームワークGobotでドローンを制御してみた。](https://qiita.com/shiei_kawa/items/027b0eada7cc9f5f8048)

今回は、最近入門したgRPCについて書いていきたいと思います。
# gRPCとは
Googleが開発したRPC呼出プロトコルで、Protocol Buffersを使うことで、REST APIより高速で堅牢な通信を実現できる点が特長です。メッセージはProtocolBuffersを用いて通信を行い、HTTP/2を用いて並列呼出、双方向呼出、ストリーミングなどが可能となっています。

.protoファイルでサーバー側、クライアント側の雛形コードを作成し、それを元に様々な言語のコ

元記事を表示

goでたくさんの画像のサイズを小さくしたい!!!!

# はじめに
こんにちはRIN1208です。
本日はクリスマスイブですね!!自分は特に予定がなく部屋で過ごしてチキンを食べました!悲しい….
この記事は画像のサイズ圧縮をかなりの量をしなくてはいけなくなったのでその制作の途中経過です(深刻なアドベントカレンダーのネタ不足….)

またこの記事は[ITRCアドベントカレンダー](https://adventar.org/calendars/4759)の24日目の記事になります。

# 開発環境
– mac
– goの実行環境

# 今回使用したパッケージ

– github.com/google/uuid
uuidを使うために使用しました
[GitHub](https://github.com/google/uuid)
– github.com/nfnt/resize
画像のサイズを変更するのに使用しました
[GitHub](https://github.com/nfnt/resize)

###インストール
“`
$ go get github.com/google/uuid
$ go get

元記事を表示

mackerel-container-agentから学ぶGoにおけるリトライ実装

この記事は、Go Advent Calendarに、代打で出そうとして、クリスマスイブの夜から書き始めて、無事埋まったので野良記事として公開するものです。

# TL;DR

– mackerel-container-agent とは、Mackerel社がコンテナ監視のために用意している監視エージェントである
– mackerel-container-agent は、Go言語で実装されており、監視ツールの性質上、リトライ処理が用意されている
– Exponential backoff というリトライのアルゴリズムを実装している

# 背景

筆者は、業務でAmazon ECS(Elastic Container Service)というAWSのコンテナオーケストレーションサービスを利用したサービスを運用しています。そのサービスで稼働しているコンテナの監視のため、監視SaaSである[Mackerel](https://mackerel.io/orgs/basebank/dashboard)を使用しています。メインのコンテナのサイドカーとして、mackerel-container-agen

元記事を表示

GoでJSONを扱う

# はじめに
この時期はネタに走った面白い記事が多くあるとは思うのですが、私は自分の知識の確認のためにgoでのjsonの扱い方について書いていこうと思います!

> https://golang.org/pkg/encoding/json/

# jsonを構造体(struct)にする
まずはjson -> structにする方法です。これをするにはgoの標準パッケージであるjson(encoding/json)の“json.Unmarshal“を使います。

“`go:json–>struct
type Person struct {
Name string
Age int
Belongings []string
}

func main() {
b := []byte(`{“name”:”mike”,”age”:20,”belongings”:[“apple”,”banana”,”orange”]}`)

var p Person
if err := json.Unmarshal(b, &p); err != nil {
f

元記事を表示

macOSでDockerを使ったGoのアプリケーション開発を爆速にするホットリローダを作った

# はじめに

メリークリスマス!!

みなさんは Go のアプリケーション開発をどのような環境で行っていますか?
弊社ではゲームのアプリケーションサーバに Go を採用しており、開発は macOS で Docker for Mac を利用しています。開発当初はこの構成による不満は特に感じていませんでしたが、1年半ほど経ってプロジェクトの規模が大きくなったことで、無視できないレベルで開発スピードを低下させる要因となってしまいました。
弊社ではアプリケーション開発にソースコードの自動生成を多用しており、その影響もあってかコードベースの Go のコードは 150万行を超える規模になっています。 加えて、ビルドする際は cgo 経由で利用している C++ のコードもそれなりの量絡んでくることもあり、 Docker for Mac を使った Docker コンテナ上でのビルドに要する時間は、 メモリ8GB, 6CPUを割り当てたコンテナにも関わらず 5分を超える時間がかかっていました。 ( それでもまだ良い方で、他の方のマシンスペックでは 10分程かかる場合もあったようです )

実際はビル

元記事を表示

11. タブをスペースに置換

## 11. タブをスペースに置換
タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

###Go
“`go
package main

import (
“bufio”
“fmt”
“os”
“strings”
)

func main() {
// 読み込みファイルを指定
name := “../hightemp.txt”

// 読み込むファイルを開く
f, err := os.Open(name)
if err != nil {
fmt.Printf(“os.Open: %#v\n”,err)
return
}
defer f.Close() // 終了時にクリーズ

// スキャナライブラリを作成
scanner := bufio.NewScanner(f)

// データを1行読み込み
for scanner.Scan() {
// TAB を 空白へ置換
fmt.Println(strings.Replace(scanner.Text(),”\t”,” “

元記事を表示

PythonとGoの基礎文法をわかりやすく比較する

この記事は [DeNA Advent Calendar 2019](https://qiita.com/advent-calendar/2019/dena) の12/24(火)の記事です。

## はじめに

普段は主にPerlを使っていますが、Goを覚えたいのとPythonを復習したいという目的でまとめました。
Pythonの文法はとてもシンプルなので、その差分でGoを覚えるのが早いのではないかと思いました。
なるべく多く書いたつもりですが、いろいろと不足はあると思います。ご留意ください。

## コメント
まずはコメントの書き方です。
Pythonにはもともと複数行をコメントアウトする機能はありませんが、プログラム中に文字列を置いても影響がないため、それを利用して複数行コメントを記述することができます。
また、複数行コメントはドキュメンテーション文字列として残すことができます。

“`python:Python
# 1行コメント

”’
複数行コメント
”’
“””
複数行コメント
“””

def func():
“””
プログラムの解説など
“””

元記事を表示

Go で 円や線の画像を生成する

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

# はじめに
中学で習う点と直線の距離を駆使して円や直線の描画を実装していこうという記事になります。

以下のような画像をフレームワークなどは使わずに生成していきましょう!!
![name.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235435/648b380b-1d08-6ec6-462d-61078faa340d.png)

# コード
### メイン関数(抜粋)
“`go
type canvas struct {
height int
width int
data []int
}

type point struct {
x, y, r float64
}

type line struct {
begin, end point
}

func main() {
wi

元記事を表示

10. 行数のカウント

## 10. 行数のカウント
行数をカウントせよ.確認にはwcコマンドを用いよ.

###Go
“`go
package main

import (
“bufio”
“fmt”
“os”
)

func main() {
// 読み込みファイルを指定
name := “../hightemp.txt”
line := 0

// 読み込むファイルを開く
f, err := os.Open(name)
if err != nil {
fmt.Printf(“os.Open: %#v\n”,err)
return
}
defer f.Close() // 終了時にクリーズ

// スキャナライブラリを作成
scanner := bufio.NewScanner(f)

// データを1行読み込み
for scanner.Scan() {
line++;
}

// エラーが有ったかチェック
if err = scanner.Err(); err != nil {
fmt.Printf(“scanner.Err: %#v\n”,err)

元記事を表示

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.

元記事を表示

OTHERカテゴリの最新記事