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

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

OpenTelemetryパッケージに見るpluginパッケージの利用方法

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

Go Conference 2019 Autumnでどこかの発表で「pluginパッケージは[OpenTelemetry](https://github.com/open-telemetry/opentelemetry-go)で使われていますよ」司会をしたセッションで紹介したのですが、実は最近のコードではその部分は削除されいました。とはいえ、その利用方法というのはpluginパッケージに対応していないWindowsでも使えるような感じで、知っていて損はない感じだったので過去のコミットを掘り出しつつ紹介します。

このエントリーで紹介するテクニックのコードは、以前はルート直下のexporterパッケージの中にありました。そのおかげで目についたのですが、7/12のコードでexperimental/streaming/exporterパッケージに移動になり、最終的に9/24のコミットで削除されました。R.I.P。

* 移動: [Eliminate Sc

元記事を表示

分散自律知性ネットワークを作ってみた

これは[SecHack365 修了生 Advent Calendar 2019](https://adventar.org/calendars/4046)の15日目の記事です。

# TL;DR
:o:分散
:o:自律
:question:知性
:o:ネットワーク

#動機
**人間、脳が死んだら死ぬのやばくないですか?**

[公正的戦闘規範](https://www.amazon.co.jp/dp/4150312907)の第二内戦の「ライブラ」とか、ネタバレになっちゃうけど[これ]とか、スタンド・アローン・コンプレックスみたいな、各ノードが分散して自律的に思考した結果全体として知性を持つように見えるやつ、かっこよくないですか?

植物みたいに各細胞が各々の役割を果たせば生きられる、コアのないネットワークこそ至高。
つまり、分散知性ネットワークの代表例である[植物が知性を持っている](https://www.amazon.co.jp/dp/4140816910/)ように、コアが無くても各ノードがそれぞれ演算をすればそのネットワークは知性を持つはずで、それをコンピュータ上に再現出来たら

元記事を表示

Unityのmeta漏れを探すCLI

GO言語の練習がてら、Unityのmetaファイルの整合性を雑に検証するCLIを書いてみた。

どう考えても必要な情報は Library/assetDatabase3 に入ってるが、形式は内緒っぽいので、指定ディレクトリ以下のファイルを見繕って guid 一覧を作ることにした。

UnityのYAMLはYAMLとしては非正規なのでまともにParseできないしやらない。正規表現で雑に引っこ抜いてる。

もうちょっと頑張ると、バージョン管理にファイル追加するときに meta を補完したり、guidを全部手繰って足りないファイルを勝手に add するとかも可能だと思われ。多分重たいけど。

“`go
package main

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

func readguid4meta(fpath string) string {
var line []byte
//var err error

fp,_ := os.Open(

元記事を表示

GoでmongoDBから出力したJSONファイルを処理するスクリプトを書いてみた

## はじめに

会社で作っているチャットボットのログをmongoDBに格納しているのですが、その対話のログデータから、前後数分以内に同じ発言をしているログを抽出して調査したいといったことがありました。そのためにスクリプトを書くことにしたのですが、どうせなら最近勉強を始めたGolangで書いてみよう!!と思い、勉強をかねてスクリプトを実装してみました。

流れとしては、mongoDBからデータをjsonで出力するコマンド`mongoexport`を使い、出力されたJSONファイルを読み込んでGoの構造体にした後、時間と発言内容を比較する。といった感じです。
`mongoexport`コマンドで出力されるのは、一行ずつJSONデータとなっているファイルなので、スクリプトで一行ずつ読み込んで処理する必要があります。

本記事では、mongoDBからexportしたJSONファイルを読み込んでGoの構造体へ変換する方法について記載していきます。
もっとこうしたほうが良いよ!これは間違っている!などございましたらご指摘お願いします:bow:

## JSONの取り扱い方法

はじめに、簡単にで

元記事を表示

chan chan は意外と美味しい

すっかり寒くなってきてチャンチャン焼きが美味しい今日この頃ですね(^_^)

ところで、Go言語でchannelをchannelで受け渡し出来ること、ご存知でしょうか。
自分の周囲では使っている人少なそうですが、意外と便利なので使用例をいくつか紹介したいと思います。

## 使用例 1: Request/Response

channelは通常片方向の受け渡しですが、channelを二重にすることでレスポンスを受け取ることができます。

例えば処理結果のerrorを受け取りたい場合は `chan chan error` を使用します。

“`go
reqc := make(chan chan error)
“`

リクエストを送る側は `chan error` をmakeして、chan chanに送信します。
このchannelに結果が返ってきます(結果が返るまでブロックされます)。

“`go

ch := make(chan error)
reqc <- ch // リクエスト送信!! err := <-ch // 終了結果を待機 ``` リクエストを受ける側は受け取

元記事を表示

Goで画像を扱う話(webp編)

2回目の登場になります @sys_cat です。気づいたらVtuberが好きになってました、推しが良すぎて胸が苦しい…ハッ、これが恋…。

はい。15日目になります。
昨日は @kyam_ さんの [[Swift] UITextViewに画像を添付する方法](https://qiita.com/kyam_/items/f08ba6d47f233ef04860) でした。
普段、アプリ開発者の方々とお話する機会が無いのですが社内LTとかで凄く面白い話していただくのでとっても悔しい思いをしてます。そういうの、もっと頂戴っていう。

今回は前回書きました [Goで画像を扱う話](https://qiita.com/sys_cat/items/15322618884b1a6d0871) でも予告したとおりWebp変換のお話になります。

## Webpとは?

Googleさんが丁寧な [解説](https://developers.google.com/speed/webp) を書いておりますので、詳しい話はそちらで。
簡単に書くならば

– Googleが開発している画像形式

元記事を表示

Golang+Bazelで依存ライブラリをいい感じに管理する

この記事は[OpenSaaS Studio Advent Calendar 2019](https://adventar.org/calendars/3928)、11日目の記事です。[3日目](https://qiita.com/mmmknt/items/80ff70ccb878ed4529c1)はPython+Bazelでしたが、今回はGolang+Bazel。

# はじめに
GolangのプロジェクトでBazelを使う場合、依存ライブラリの二重管理が必要になることがあります。
二重管理は変更の反映漏れにつながったり管理方法が理解しづらくなるため基本的には避けるべきですが、上手くハンドリングできればビルド速度などBazelのメリットを享受しつつ問題なく運用できます。
この記事では、私がジョインしているプロジェクトでこの課題にどう対応したのか紹介します。

# 依存ライブラリの二重管理
BazelではWORKSPACEというファイルで依存ライブラリを定義します(マクロに定義してWORKSPACEでそのマクロを呼ぶ方法もあります)が、Golangのアプリを開発する場合にはIDEの対応状

元記事を表示

Apple の TLS 証明書無効の影響を受けた話

[認証認可技術 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/identity) 15日目は TLS に関する記事です。TLS は 通信相手の認証、通信内容の暗号化、改ざんの検出を可能とするという通信プロトコルであり、HTTPS 通信で使用され、また OAuth 2.0 は TLS を前提とした仕様になっていたりととても重要な認証技術要素の一つです。その TLS について、今年行われた **Apple の TLS 証明書無効化** による影響を受けたというお話を軽く紹介したいと思います。

# はじまり

ちょうど一ヶ月ほど前に、最新の macOS Catalina を搭載した[新型 MacBoo Pro](https://www.apple.com/jp/newsroom/2019/11/apple-introduces-16-inch-macbook-pro-the-worlds-best-pro-notebook/) が発表されました。タイミングよく開発機を新調しようとしていたところに発表され、人柱になる

元記事を表示

Cloud FunctionsでGETリクエストを受けてHello Worldを返す関数をデプロイするメモ

# なにこれ
タイトルの通り。
GCP初めて。
[クイックスタート: gcloud コマンドライン ツールの使用](https://cloud.google.com/functions/docs/quickstart?hl=ja#functions-prepare-environment-go)を参考しながら自分用に削除したり、付け足ししたりしてます。

# 環境準備
1. GCPのプロジェクトを新規で立てる
2. Cloud Shellを起動する
3. Google Cloud SDKを最新に更新する `sudo gcloud components update`
4. Google Cloud SDKのベータ版機能をインストールする `sudo gcloud components install beta`

# Hello World!を返す関数をデプロイする
プログラムはGo言語でサクッと書く。

“`go
package functions

import (
“fmt”
“net/http”
)

func HelloWorldHTTP(w http.Response

元記事を表示

golangでmapの中の構造体を書き換えようとしたらcannot assign to struct field in mapになる

# エラー

こういう構造体があって

“`go
type User struct {
Id int
Connected bool
}
“`

`User{0, true}`という構造体をmapに追加してその要素を書き換えようとすると

“`go
users := map[int]User{0: User{0, true}}
users[0].Connected = false
“`

`cannot assign to struct field users[0].Connected in map`とエラーが出る。

# 解決策
## 構造体ごと書き換える
“`go
users := map[int]User{0: User{0, true}}
u, ok := users[0]
if ok {
u.Connected = false
}
users[0] = u
“`

## 値をポインタにする

“`go
users := map[int]*User{0: &User{0, true}}
users[0].Connected = false
“`

#

元記事を表示

Git/Githubをワンライナーで扱うCLIツールを作った話【Go言語】【cobra】

## はじめに
golangとcobraを使ってGit/Githubをワンライナーで扱うCLIツールを作成しました。
前半で導入方法や使い方、後半でcobraでCLIツールを作成する方法(WIP at 2019/12/14)について扱います。

## 対象読者
– golangでCLIツール作ってみたい人
– CLIを使って業務改善したい人
– エンジニアな人

## リポジトリ
こちらからどうぞ↓
https://github.com/HiroyukiYagihashi/toolbox

## 導入方法
golangの動作環境があれば下記で動くと思います。

“`
$ go get github.com/HiroyukiYagihashi/tooland/gh
$ go install $GOPATH/src/github.com/HiroyukiYagihashi/toolbox/gh
“`

※`gitコマンドとhubコマンドに依存`していますので、こちらもインストールしてください。
(gitは入れてるけどhubは入れてないって方が多いのでは)
MacOSユーザーかつパッケー

元記事を表示

golang 基本①

## 型
“`golang
// よく使う型のみ抜粋
bool

int, int32, int64
uint, uint32, uint64

float32, float64
“`
ドキュメントによると
>int uint型は、32-bitのシステムでは32 bitで、64-bitのシステムでは64 bitです。 サイズ、符号なし( unsigned )整数の型を使うための特別な理由がない限り、整数の変数が必要な場合は int を使うようにしましょう。

とのこと。整数は`int`を使えばいい。

## 宣言
コンソールに出力の行うのにfmtパッケージが必要なので必ずインポートする
[fmtドキュメント](https://godoc.org/fmt)

“`golang
package main
import “fmt”

var str string = “banana”
// 変数名 型名 = 値
str2 := “apple”
// syntax error: non-declaration statement outside function body
// fu

元記事を表示

Goの「世界のナベアツ」に、俺はなる!!

# 背景

漠然とGoの勉強をしたいなと思い、Goのチュートリアルを眺めていたが、突然の睡魔が襲ってきた。
そこで、Goの基本的な機能だけを確認して、何か動くものを作って見ようと思い実装へ。

言語習得チュートリアルといえばFizzBuzz!!
と思ったが、それではつまらないなということで、FizzBuzzに応用をこらしたものは何か・・・と考えること約1分。
「世界のナベアツ」のネタが浮かび、実装してみることに。

# 世界のナベアツとは?

– 3の倍数と3が付く数字の時だけあほになる人
– 個人的な感想として、初めて見た時は笑いが止まらなかった
– 久しぶりにYOUTUBEとかで動画を見ると面白いww
– 少し調べてみると、どうやら落語家([桂三度(Wikipedia)](https://ja.wikipedia.org/wiki/%E6%A1%82%E4%B8%89%E5%BA%A6))に転身したらしい

# つまり・・

3の倍数と3が付く数字を検出してみた、ただそれだけの話である。

# 実装

簡単に書くことができた。

“`fizzbuzz.go
package

元記事を表示

fmt.Scannerを使う

本記事は[Go3 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go3) 14日目の記事です。前回の記事は[@tennashi](https://qiita.com/tennashi)さんの[最近よく書く HTTP サーバ基礎部分](https://tennashi.hatenablog.com/entry/2019/12/13/010938)でした。

## はじめに
`fmt`パッケージではスキャニング用の関数やインターフェイスが提供されています。これらを使用することで、パースなどの入力から受け取ったデータを意味ある何らかの値へと変換するような操作をより簡単に書くことができます。本記事ではそれらの紹介を行います。

## 使ってみる

紹介がてらにHTTP/1.0リクエストの最初の行であるRequest Lineをパースする例を考えてみたいと思います。Request Lineは以下のようにフォーマットが定められています [^1]。

“`
Method Request-URI HTTP/major.min

元記事を表示

Goで日本語コメントを書く悩み

この記事はGo2 Advent Calendar 15日目の記事です。

## コメントの悩み
まずは復習から。

とりあえず関数を例にします。Goでは関数などのシンボルの上に、 `関数名[半角スペース]内容…` という形式でコメントを書くことで、自動的に関数とコメントを紐付けてドキュメント化してくれます。複数行書くこともできます。

“`go
// Hoge reports whether the hoge is fuga.
// hogehoge. hogehoge.
func Hoge() {}
“`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348791/ab6bc690-fb64-2139-a3f5-0e9e6db778ef.png)
便利ですね。

**問題は、このコメントを日本語で書くとき起こります。**

社内で使うツールなどは、分かりやすさ優先でドキュメントは日本語にすることが多いかと思います。個人的にも、そうした方がベターだと考えます。

そういったと

元記事を表示

Goで同じディレクトリ・パッケージも同じ関数を呼び出してもエラーが出る

goでディレクトリもパッケージも同じなのにbuildでこける。

“`
go run server.go
“`

server.goと同じディレクトリにあるのに呼べないのなんで、、!!

ディレクトリはこんな感じ

“`
├server.go
└data.go
“`

server.goでdata.goのメソッド読んでいる

### 解決策

以下のコマンドで丸ごとbuildするらしい

“`
go build

//または

go build server.go data.go
“`

元記事を表示

Data APIを利用する際のaws-sdk goの実装とunit test時のテクニックについて

#はじめに
この記事では、DataAPIを利用してaws-sdk goを使った開発をする際のポイントをいくつかまとめます。
自分はAPI Gateway + AWS Lambda + Aurora Serverless の構成でAPIを作成しましたので、基本的にその構成を想定した記事になります。

# data-apiとは
今年の6月ごろから東京リージョンでも[Aurora Serverless MySQL5.6がData APIのサポートを開始](https://aws.amazon.com/jp/about-aws/whats-new/2019/05/amazon_aurora_serverless_mysql_5_6_now_supportsdataapi/)しました。
Data APIを利用することで、Lambda+Aurora Serverlessの構成で完全サーバレスなアプリケーションを構築できるようになりました。

[公式の記事](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/data

元記事を表示

GAEでPub/Subに秒間1万リクエストをPub/Subに突っ込むまでの道のり

# はじめに
この記事は[iRidge Advent Calendar 2019](https://qiita.com/advent-calendar/2019/iridge) における12/14分の記事になります。

## 注意点
約1年前にやったプロジェクトを思い出して書いております。
技術的にもどんどんアップデートされていく分野なので情報が古い可能性がございます。
(特に、GAEは大きめの更新があったと聞いております)

# 背景
弊社のシステムでは、秒間3千〜1万程度のGPS位置情報がエンドユーザから送信されてきます。 過去よりユーザ数が上昇してこれまでのシステムでは、捌き切れなくなる問題を抱えていることから、リプレイスすることになりました。

## 要件(実現したいこと)
とにかく、エンドユーザ(アプリ端末)から送られてきた位置情報をGCPのCloud Pub/Subに突っ込むだけ。 送られてきたデータは多少加工するものの、ほぼそのままデータをキューに入れるのみと考えてよい。

なお、様々な背景はあるものの、キューにPub/Subを選んだ主な理由は以下。

* 後続で、Dat

元記事を表示

億劫なエクセルの操作を自動化する

[ZOZOテクノロジーズ #5 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/zozo_tech5)の記事です。
昨日は @saitoryuji さんの「[新卒エンジニアがチーム開発でGitHubを使うときに気を付けていること(レビュアー編)](https://qiita.com/saitoryuji/items/dd29cd8e72bdcb6b9c1b)」でした。

本記事は過去に書いた[Go言語でエクセルデータから情報を読み取る](https://qiita.com/ikeponsu/items/34a8ded9a6306c3b6468)の記事を最新の情報に更新したものです。

# はじめに
みなさんは普段業務でエクセルは使っていますか?

自分自身業務で触ることはほとんど無くなってきましたが、業界や現場によっては、昔からのやり方が残っていたり、仕事上のPC環境的に使わなければいけなかったりと、いろいろ事情があると思います。
特にアパレル業界では中国とのやり取りもあり、使う機会が多いみたいです。

その

元記事を表示

Goのhtml/templateでifする方法

[参考](https://off.tokyo/blog/go%e3%81%aehtml-template%e3%81%a7if%e3%81%a7%e6%9d%a1%e4%bb%b6%e5%88%86%e5%b2%90%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/)

元記事を表示

OTHERカテゴリの最新記事