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

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

GolangのJSONでomitemptyしても出力されてしまう

タイトルどおり。
omitemptyの前にスペースを入れるとomitemptyが有効にならない。

ビルド環境 Go1.13

NG例

“`go
type hoge struct {
Str string `json:”str, omitempty”`
}
“`

OK

“`go
type hoge struct {
Str string `json:”str,omitempty”`
}
“`

元記事を表示

コンテナイメージの情報をシンプルに確認するツールdockertags

# はじめに

公式のコンテナイメージを利用していると、いまどんなOS,バージョンのイメージが使えるのか知りたいときがあります。そんなときに使えるツールを作りました。(Golangで書いてます)
![image](https://github.com/goodwithtech/dockertags/raw/master/assets/usage.gif)
https://github.com/goodwithtech/dockertags [![stars](https://img.shields.io/github/stars/goodwithtech/dockertags.svg)](https://github.com/goodwithtech/dockertags)
(たぶんこのままだとstarが一個もつかないので気がついた人はstarください)

たとえばgolang 1.14のイメージ、alpineベースで探したいときは、以下のように指定できます。

“`
$ dockertags -c 1.14 -c alpine golang
+——————-

元記事を表示

Go Playground で time.Now() が 2009-11-10 の理由

Go Playground (https://tour.golang.org/welcome/4) で `time.Now()` の結果を書きのように説明しています。

> In the playground the time begins at 2009-11-10 23:00:00 UTC (determining the significance of this date is an exercise for the reader). This makes it easier to cache programs by giving them deterministic output.

`time.Now()` を実行すると `2009-11-10 23:00:00` と出力されますが、その意味は「読み手で調べてね」とのことです。

## 結論
調べてみた結果、***Golang が世に登場した日*** のようです。
(リリースした日というより、アナウンスされた日)

## 時間が始まるタイミング
「あなた」の時間がスタートしたのはいつでしょうか?

そうです。生まれたときですね

元記事を表示

GoとGoogle Homeでガチでメリーさんの電話を実装してみました。

24日目で思ったより位置情報で遊べなかったので、位置情報を使ったネタを考えてみました

24日目
https://qiita.com/usk81/items/3b1357de73d99bb13781

# つくったもの

https://github.com/usk81/til/tree/master/go/marys-call

# ネタ

位置情報を使ったもの…
メリークリスマス…
メリー…
メリー…

( ゚д゚)ハッ! メリーさん!!

というわけで、メリーさんの電話をリアル実装してみました。

# 仕様

1. 最寄り駅からスタート
2. Google Home経由で連絡を取る
3. 途中で途中経過を伝える
3. 家についたらワンコール
4. 次の瞬間、「貴方の後ろにいるの」
5. 「ジョークですよw」で終わり

距離に関わらず同じ感覚でGoogle Homeが話すと面白くないので、人間の走る速度で最寄り駅から現在地を移動させて、距離に応じて話す内容を変えるようにしました。

人間が歩く速度(約2〜4.8km)だとゆっくりすぎるので、ウサインボルトが走る速さに

元記事を表示

Go: これまでとこれから – 2019 Edition –

この投稿は [CyberAgent Developers Advent Calendar 2019](https://adventar.org/calendars/3981) 24日目 兼 [Go2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go2) 25日目の記事です。

先日、社内限定で開催された [カンファレンス](https://cyberagent.ai/blog/pr/%E3%82%AB%E3%83%AB%E3%83%81%E3%83%A3%E3%83%BC/10830/) で登壇した「Go: これまでとこれから – 2019 Edition -」のスクリプトから、confidential な内容を省いてお話しします。

![slide 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72064/9d137524-3ae5-065c-1beb-05e476d730de.png)

元々この発表をしよう

元記事を表示

Go lang でファイルパスの最後のみ取得する

Go lang で、ファイルパスの最後のみを返すメソッドないかなと思って調査した。`filepath.Base` がそれで、パスの最後の要素を返す関数。

“`golang
// Base returns the last element of path.
// Trailing path separators are removed before extracting the last element.
// If the path is empty, Base returns “.”.
// If the path consists entirely of separators, Base returns a single separator.
func Base(path string) string {
“`

良さげだが、両方のパスで動作するか確かめてみる。Windows の環境で、Windows ベースのファイル区切り文字と、Linuxベースの両方を試してみる。

## Linux ベース on Windows

“`golang
package main

impo

元記事を表示

Go Advent Calendar 2019 / 近年取り組んでいるメッセージ指向パターンの紹介

ここ何年か、メッセージ指向の実装パターンを試行していて、いい感じになったので紹介します。

秘伝のたれリポジトリから抜粋していきます。
https://github.com/michilu/boilerplate

構成要素は、次の3つ。

– 1. 処理関数 `func(InT) (OutT, error)`。`InT` を引数にとり、`OutT` を返す。
– 2. 処理関数と接続するchannel `chan<- InT`/`<-chan OutT` を生成する`GetPipeName`関数。 - https://github.com/michilu/boilerplate/blob/d787dec/service/pipe/pipe.go#L24-L31 ```go func GetPipeName( ctx context.Context, fn func(InT) (OutT, error), fnErr func(context.Context, error) bool, ) ( chan<- InT, <-chan OutT, ) ``` -

元記事を表示

Macを買ったばかりの非エンジニアでもgoの開発環境を用意できるようにする

## はじめに
基本的には備忘録です。
説明も書きます。
今手元にChromeとXcodeを入れただけのMacがあるのでやってみます。

## 環境
MacOS Mojave
これより新しいやつあるらしいんですけど、Xcodeの仕組み変わってて闇が深いので
普段Linux使っていて、Xcode詳しくない僕がやると詰みそうなので、Mojaveでやります。

## brew
“`
/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
“`
なんか多分Xcode入れろとか言われると思うので、言われた通りにAppleStoreから入れてください。
それだけはやってしまったので、詳しいことは覚えていません。

“`
ryotanoMacBook:~ ryota$ brew -v
Homebrew 2.1.1
Homebrew/homebrew-core N/A
“`

はい。なんか入りました。

うまくいかないときはこことかみてください。
htt

元記事を表示

Goから始める画像処理

この記事は[tomowarkar ひとりAdvent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)の25日目の記事です。
# はじめに
Goで画像処理を行い、グレースケール変換、セピア色変換、ぼかしを実装していきたいと思います。

例外処理が甘いのと、パフォーマンス無視のゴリ押し実装はご愛嬌。

コードが間違っていたり、こちらの方がパフォーマンスが良いという場合はぜひ教えていただけると嬉しく思います。

# コード
### メイン処理
“`go
func main() {
filename := “hoge.jpg”
imgSrc := readImage(filename)

gray := gray(imgSrc)
toPNG(“gray”, gray)
sepia := sepia(imgSrc)
toPNG(“sepia”, sepia)
mosaic := shade(21, imgSrc)
toPNG(“shade”, mosaic)
}
“`

コード全文は長いので折

元記事を表示

GKE中のGolangアプリケーション、gsutilを使ってCloud Storageでデータ連携を行う

GKEの中に稼働されるアプリケーションからどうやってGCPサービスにアクセスしたり、データ連携したりするか?という疑問がある方々に回答する記事をまとめました。
今回はCloud Storageサービスを使って、データ連携サンプルとして作成しました。

APIを利用して、Cloud Storage上のデータファイルと遣り取り方法があります。この方法の利点は処理スピードが良いことです。
但し、エラーハンドリングや処理ロジックなどを全て実装しないといけない。

それより簡単な方法はgsutilツールを使ってCloud Storageと遣り取りする方法があります。
gsutil は、コマンドラインから Cloud Storage にアクセスできる Python アプリケーションです。
Cloud Storageと遣り取り専用の正式なツールです。
gsutil を使用すると、次のような、バケットやオブジェクトの幅広い管理作業を行うことができます。

– バケットの作成と削除
– オブジェクトのアップロード、ダウンロード、削除
– バケットとオブジェクトの一覧表示
– オブジェクトの移動、コピー、

元記事を表示

13. col1.txtとcol2.txtをマージ

## 13. col1.txtとcol2.txtをマージ
12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.

###Go
“`go
package main

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

func main() {
// 読み込みファイルを指定
wname := “col.txt”
r1name := “col1.txt”
r2name := “col2.txt”

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

// 1列目の保存ファイルを作成
r1, err := os.Open(r1name)
if err != nil {
fmt.Printf(“os.Open: %#v\n”

元記事を表示

12. 1列目をcol1.txtに,2列目をcol2.txtに保存

## 12. 1列目をcol1.txtに,2列目をcol2.txtに保存
各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ.

###Go
“`go
package main

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

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

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

// 1列目の保存ファイルを作成
w1, err := os.Create(w1name)
if err != nil {
fmt.Pri

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事