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

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

クローリングのベンチマークを取ってみました。

# はじめに
[agouti](https://github.com/sclevine/agouti) を使ってクローリングを行い、ベンチマークを測定してみました。

# クローリング対象ページ
今回クローリング対象のページは、goのtemplateパッケージを使用してローカルに生成したものを利用しました。以下では9つのページを生成しています。

“`go
func createPages() {
createPage(“/1”, []string{“/2”, “/3”})
createPage(“/2”, []string{“/4”, “/5”})
createPage(“/3”, []string{“/6”, “/7”})
createPage(“/4”, []string{“/8”, “/9”})
createPage(“/5”, nil)
createPage(“/6”, nil)
createPage(“/7”, nil)
createPage(“/8”, nil)
createPage(“/9”, nil)

http.ListenAndServe(“

元記事を表示

nil について調べ始めた話

## はじめに

この記事は Go7 Advent Calendar 2019 の 18 日目の記事です。
Go さん nil さんの気持ちをもうちょっと理解してみようと思ったところを発端にソースコードを読み始めた記録です。
見返してみたらとても当たり前なことしか述べておりませんでした (´·ω·`)

本記事は `go 1.13` を前提にしています。

## TL;DR

– nil 周りのソースコード読んでみた
– nil って何?という話と nil っぽい何かが 2 つ見つかったけど何?という話
– 目新しい話はありません(´·ω·`)

## nil の登場

nil らしきものの姿は [src/go/types/universe.go](https://github.com/golang/go/blob/cd016af6b6bbbeeb1c14fea574914862a50c3ad6/src/go/types/universe.go) にて見つけることができます。[https://golang.org/ref/spec#Blocks](https://golang.org

元記事を表示

GoとDynamoDBを使って速度検証してみた結果

パーソンリンクアドベントカレンダー18日目の投稿です。
こんにちは桑原です。

一週間ぶりの投稿です。
前回のkinesisのアンチパターンの後続処理でGoとDynamoDBを使ってみようと思いサンプルコードを書いてみました。
両方とも触り始めて数時間の状態なので自分への備忘録です。

#やりたいこと
kinesisからのデータが1時間で最大数憶レコードに上るシステムなため、分析用に中間データを作成しようとしています。
中間データフォーマットとしては
1時間ごとに**user_idとsegment_id単位**で**session_time(滞在時間)**、**count(接触回数)**を集計する
になります。

#DynamoDB
##テーブル作成
AWSコンソールからテーブル作成します。

##テーブル設計
下記で実装していきます。
primary_key : user_id_segment_id_yyyy-MM-dd HH:mm:ss
user_id : ユーザーID
segment_id : セグメントID
start_date : 初回アクセス日時
last_date :

元記事を表示

猫のトイレ回数や時間をIoTボタンを使ってGoogleカレンダーに記録する

この記事は [KLab Engineer Advent Calendar 2019](https://qiita.com/advent-calendar/2019/klab) の18日目の記事です。

## はじめに

今年の2月から猫を飼い始めました。
![190305.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48175/5202494e-8269-f088-43a7-468f550f2c29.jpeg)

出会ったときは手のひらに収まりそうなくらい小さかったですが、今では立派な成猫に。
つい先日、1歳を迎えたばかりの男の子です。
![191116.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48175/11f37b48-b1c9-fe0f-e871-57391d8456ab.jpeg)

猫って本当にかわいいですね。
世の中にこんなにもかわいい生き物がいるものか、いや、いる!と昂ぶってしまうくらいのかわいさ

元記事を表示

goroutineのよさを理解するための低レイヤの話

goroutineについて調べたところ、その良さについてしっかりと理解するためには、低レイヤの知識がないと理解できないなと思ったので、ネットや本を読んでのインプットと並行してこの記事にアウトプットとして調べたことを基礎的な内容になりますがまとめました。「goroutineとは何か」から入り、そこから掘り下げます。

##goroutineとは?
goroutineとは、他のメソッドや関数と並行処理されるメソッドや関数のこと。Goのランタイムに管理される軽量なスレッドとも言うことができ、goroutineを作成するコストはスレッドに比べてずっと小さい。

ここで、スレッドってなんだっけ、と思って調べると、プロセス・仮想アドレス空間・ヒープ・スタック・・・と聞いたことはあるけどよく知らない言葉がたくさん出てきて深みにハマり混乱しました。

整理できたので、順番に解説します。

##スレッドって?
CPUは一つ一つの命令を順番に読み込み、解釈しながら実行する。メモリ内で、CPUに**実行される命令の列をスレッド**という。CPU利用の単位。
プロセスには最低一つのスレッドがあり、CPUはその

元記事を表示

リーダブルアーキテクチャ – usecaseにおける時間軸と抽象度の統一

# はじめに

Clean Architectureやレイヤードアーキテクチャでは、どのようにレイヤーを定義するかついては言及されています。

そのような中usecase(レイヤードアーキテクチャではApplication層)をどのように実装するべきかについての議論は少ないです。
しかし私はリーダブルなアーキテクチャを実現するために、一番大切なことはusecaseを適切に実装することであると考えています。

そこでusecaseを実装する上で起こりがちな抽象度の問題を例に、リーダブルなアーキテクチャを考えいていきたいと思います。

## サンプル
1:1のチャットアプリでUserとWorkerが存在して会話ができるアプリを例にあげます。

以下の図では青い背景はinfraの関数実行、緑色の背景はdomainの関数実行、赤い背景はusecaseの関数実行を示しています。

usecaseのCreateChat関数が以下のように存在しています。

![zu1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5

元記事を表示

Go言語で扱えるデータフレーム厳選4つ

# はじめに

データサイエンティストでなかったとしても、数値データを使って様々な解析をする際には CSV ファイル等ファイルを読み込み、数値の配列としてメモリに保持して、それらをループ等で利用して解析を行っておられると思います。

その際、配列は1次元目に行、2次元目に列、を格納するのが一般的です。多くのケースではこの方法で事足りるのですが、解析を行ううちに「列としてデータの固まりを扱いたい」「ラベル付けされた列を扱いたい」と感じる事が出てくると思います。

これを簡単にしてくれるのが「データフレーム」です。

# データフレーム4種

本記事では Go 言語から扱えるデータフレームを4つご紹介します。

## QFrame

* https://github.com/tobgu/qframe

QFrame は、フィルタリング、集計、およびデータ操作をサポートするイミュータブルなデータフレームです。 QFrame での操作は、それ自身が新しい QFrame となり元の QFrame は変更されません。データの多くがこの2つのフレーム間で共有されるためかなり効率的に実行できます。

元記事を表示

gRPCでKafkaにアクセス

ある日こう思ったとします。
「あ、Kafka飽きた。[NATS](https://nats.io/)使お。」

ところがもしKafkaに他のチームからのアクセスがあった場合、彼らに変更をお願いする必要があります。
彼らは大体忙しいでしょう。そう簡単にNATSに変更することはできなくなります。

そんなとき、Kafkaに直接アクセスする代わりに、メッセージシステムを抽象化したインターフェイスを通してアクセスしてもらうことで内部の実装を隠蔽してしまうと便利です。

今回紹介するのはまたもや弊社謹製の [uw-labs/proximo](https://github.com/uw-labs/proximo) というライブラリ(とGoのサーバー実装)です。
このライブラリでは以下のように、メッセージングシステムのインターフェイスをprotocol bufferの形で定義しています。

– https://github.com/uw-labs/proximo/blob/master/proto/proximo.proto

“`protobuf:proximo.proto
syntax = “

元記事を表示

負荷ツール vegita の息子 trunks を作ったお話(keep-aliveについて)

# はじめに
[Go6 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go6) の18日目はhmarfが書かせていただきます。インターンを通じて負荷対策に興味を持ち、簡単な負荷ツールを作ろうと思い作成しました。その過程で得た知識を書いていきます。[vegeta](https://github.com/tsenart/vegeta) がいるなら [trunks](https://github.com/hmarf/trunks) がいてもいいじゃないか!!と思い命名しました。

とりあえず、keep-alive について書きます。時間をとれたら追記していきます。

# Keep-Alive
Goの “`net/http“` はデフォルトでkeep-aliveが有効になっているが、コネクションの数が制限されます。コネクションの数が制限されると同時に送ることのできるリクエストの数が制限され不便です。そのためこのコネクションの数を変化させる必要があります。
 ・MaxIdeleConns: デフォルト値 100
 ・

元記事を表示

Goのテンプレートをちゃんと使ってみる

# はじめに

Goのテンプレートのpackageをちゃんと使ってみたいという気持ちになったので調べました。

# 参考

[`text/template`パッケージのドキュメント](https://pkg.go.dev/text/template?tab=doc)
テンプレートの文法についてはこっちに書いてあります。

[`html/template`パッケージのドキュメント](https://pkg.go.dev/html/template?tab=doc)
packageのインタフェースは`text/template`と同じですが、セキュリティ上の問題を引き起こさないためには出力がHTMLの場合にはこちらを使うべきと書いてあります。

[Effective Go – The Go Programming Language # A web server](https://golang.org/doc/effective_go.html#web_server)
formに文字列を入力すると、GoogleのAPIを使ってQRコードの画像を生成して表示するサーバのサンプルコードがあります

元記事を表示

Error 1292: Incorrect datetime value: ‘0000-00-00’ に対してのGORMでの対処

# 背景

Go×Ginでwebアプリケーションを作成時 userを新規登録する際に対処したことを残す。

バージョン
Go 1.13
MySQL 5.7系

## 起こったこと

以下のような user modelを作成

“`
type User struct {
UserID int64 `gorm:”primary_key” json:”user_id” form:”user_id”`

FirstName string `gorm:”first_name” json:”first_name” form:”first_name”`

LastName string `gorm:”last_name” json:”last_name” form:”last_name”`

PhoneNumber string `gorm:”unique;not null” json:”phone_number” form:”phone_number”`

Gender string `gorm:”type: enum(‘male’, ‘female’, ‘unspecified’);

元記事を表示

GoとPostgreSQLで遊ぶ

Go と PostgreSQLを使って遊んでみます。

とりあえず、migrate ツールは以下のライブラリを使用します。

https://github.com/golang-migrate/migrate

macを使っているので、brew経由でインストールしてしまいます。

“`sh
$ brew install golang-migrate
“`

DBを作成しておきます。

“`sh
$ psql -h localhost -U developer -c “CREATE DATABASE example;”
“`

upとdownの雛型を作成して、SQL文を記載します。

“`sh
$ export POSTGRESQL_URL=postgres://developer:password@localhost:5432/example?sslmode=disable
$ migrate create -ext sql -dir db/migrations -seq create_users_table
$ cat db/migrations/000001_create

元記事を表示

FIDO認証サーバを一日で作って遊ぶ話

このエントリは[認証認可技術 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/identity)の17日目の記事となります.が,多分投稿する頃には18日になってしまうのだろうなぁ…
計画性がない上,出来も悪いしネタみたいなエントリですが,良ければみんなもこれを読んで,好きな言語でFIDOサーバをフルスクラッチ開発しよう!!!!!(?)

# 動機〜開始

認証認可のアドベントカレンダーに登録したけど何も書くことねぇなぁと思っていた一昨日,もう大きな物を準備して書くことが叶わんとわかったので,一日でFIDOのサーバでも実装してやるか!という謎の思いつきが発生.
というわけで今日一日で実装しようとなりました.
元気に今朝起きてみたら昼過ぎだったので,結論から言えば全く間に合いませんでした!すいません!

# FIDO2(WebAuthn + CTAP)とは
既に日本語の記事も数多くあるので割愛します.
個人的にはYahooさんが昨年投稿された[**ここ**](https://techblog.yahoo.co.j

元記事を表示

リングフィットアドベンチャーの運動結果を自動解析した

# リングフィットアドベンチャーの運動結果を自動解析した
エンジニアは1日の大半の時間を椅子に座るので体力の衰えを感じ
体を鍛えることが必要だなと最近感じていました。
簡単に楽しく体を鍛れると噂のリングフィットアドベンチャー(※以下RFA)をしています。
GCPとGoを最近触っているのでついでに学べないかと今回この記事を書くに至りました。
後にデータをグラフ化したい…!

## ソース
https://github.com/nodata-brain/rfa

## 構成図
![architect.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248303/72a2c098-eca3-255f-ca3a-401dafe36d0d.png)

## 概要
1. スイッチでツイッター投稿
2. TwitterAPIを通して投稿した画像を取得
3. 読み込んだ画像をVisionAPIを通してテキスト抽出
4. テキストをFireStoreに格納

2~4をCloudFunction上で全て実行し
Clo

元記事を表示

LAPRAS伸びしろ選手権でのアウトプットまとめ

# はじめに

[LAPRAS](https://lapras.com/)さんがTwitterで[#LAPRAS伸びしろ選手権](https://twitter.com/search?q=%23LAPRAS%E4%BC%B8%E3%81%B3%E3%81%97%E3%82%8D%E9%81%B8%E6%89%8B%E6%A8%A9&src=typeahead_click)のハッシュタグで1ヶ月の技術力スコアの上がり幅を競うイベントを開催していて、1~3位には賞品があり、3位を目指して参加してみました。

しかし、結果は8位の惨敗だったので、悔しさを胸に1ヶ月のアウトプットをまとめます。

ちなみにこちらが私のLAPRASのプロフィールです。
https://lapras.com/public/BE7TXA7

# GitHub
趣味で暇なときにやっているオレオレツールの開発と機能追加をメインにアウトプットをしました。

## [toyotter](https://github.com/KeisukeToyota/toyotter)
Goで書いたCUIベースのTwitterクライアント

元記事を表示

その昔作ったbashで歴代将軍を補完するスクリプトと補助コマンド

この記事は[クソアプリ2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/kuso-app2)の16日目が空いていたので昔作ったクソアプリの紹介をするものです。

その昔こんな話題がありました。

[なぜたった15人しかいない徳川将軍は覚えられないのですか? – Togetter](https://togetter.com/li/264638)

プログラマ視点では、「シェルで補完できないから」というのが一つの意見としてあります(暴論)。

# bashの補完スクリプトの作成

ということで[徳川幕府の将軍を補完できるスクリプト](https://github.com/knok/shogun-completion/tree/8f5b8f5eec6908df112fe12b4e05b7372985222d)を書きました。2013年のことです。

## 当時の問題点

シェルの補完という行為は、基本的にあるコマンドに対して行うものです。しかしこの時点では存在しないコマンド”shogun”に対する補完として実装していま

元記事を表示

Golangのコード自動生成について

# はじめに
[GameWith AdventCalendar 2019](https://qiita.com/advent-calendar/2019/gamewith) の17日目の記事になります。

普段はサーバサイドエンジニアとしてリプレイスの担当をしています。自宅に戻るとひたすら、スプラトゥーン2をプレイしています・・・。先週の週末には当記事を書き終える予定でしたが、スプラトゥーン2の欲に負けて急いで書き上げている今日です。ポケモン剣盾も両パッケージおよび Switch Lite まで用意したのに未だにスプラトゥーン2をやり続け…(略

・・・余談はさておき、本題に入ります。

[GameWith Developer Blog](https://tech.gamewith.co.jp) でも取り上げられていますが、現在弊社では [GameWith のリプレイス](https://tech.gamewith.co.jp/entry/2019/10/24/161947) を行なっています。

# 目次

今回はリプレイスでコード自動生成を実装したお話をさせていただきます。

元記事を表示

Bazelのマクロでコード生成を自動化(+ツールの管理を任せる)

この記事は[OpenSaaS Studio Advent Calendar 2019](https://adventar.org/calendars/3928)、12日目の記事です。[前回](https://qiita.com/mmmknt/items/cb23a597dfb5a4ca6353)は依存ライブラリの管理について触れましたが、今回は手動で実施していたビルド処理をBazelの管理スコープに入れよう、というお話。

# はじめに
Bazelでは公式や有志によって[様々なルール](https://docs.bazel.build/versions/1.2.0/rules.html)が提供されており、それらを利用することでプログラミング言語やDockerイメージのビルドなど色々な処理を定義することができます。また、既存のルールでは要件を満たせない場合に新しくルールやマクロを定義することで処理の自動化やビルドに必要なツールの管理をBazelに移譲できます。
この記事では、私が実際に作ったマクロを元に新しい処理を追加する方法とその際に気をつけたポイントを紹介します。

# マクロ化する

元記事を表示

cuelangを使ったgrpcのテストツールを作った話

本記事は[Go3 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go3) 17日目の記事です。

# 背景

少し前(9月頃?)にGoogleから[cue](https://github.com/cuelang/cue)というschemaベースでコンフィグファイルなどに使えるデータ形式が発表されました。相変わらずググラビリティの低い名前ですが、jsonやymlのスーパーセットでありながら、型定義が書けたりvalidationができたりする面白いやつです。

面白いやつなので何か使えないかなーと考えていると、型定義が使えるならgRPCとかと相性が良さそうだなと思いつきました。これはGoogleでも考えられていたのか、cueの実装にはprotobufからcueファイルを生成する実装が含まれています。

ちょうど仕事で毎回 [grpcurl](https://github.com/fullstorydev/grpcurl) への入力をコピペするのにも飽きていたので、この辺りを自動化するテストツールを作り始めました。

元記事を表示

Go2 contracts proposalが大幅更新された (12/15)

いわゆるGo2 proposalsのひとつ、contractsが以下で提案されています。
https://go-review.googlesource.com/c/go/+/187317

さる12月15日、このproposalに大きな変更が加わったのでこれをまとめてみました。自分用に翻訳したものなので、おぼつかないところはご容赦ください。

## READMEの翻訳
### ステータス

このCLが最後に更新されてから、大きな進展がありました。
いくつかの例外(下記参照)を除き、contractsの提案のほとんどの側面は、少なくともいくつかのテスト(但し、バグはあるだろう)で実装されています。それぞれのファイルに記載されている少数の既知の問題を除き、go/typesはtestdataとexamplesディレクトリにあるすべての*.go2テストファイルをタイプチェックできるようになりました。

### 代替表記
contractsに対する代替表記を試すために、この実装ではコントラクトの代わりに(パラメータ化される可能性がある)インタフェースを使用できます。具体的には、次の表記が許可され

元記事を表示

OTHERカテゴリの最新記事