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

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

GoでインストールからHello Golang!!

# 概要
MacにGoをインストールして、「Hello Golang!!」を表示させるところまでを解説していきます。
また、僕はシェルにfishを使っているので、fish向けの環境構築についても記載します。

# 環境
macOS Catalina 10.15.1
Homebrew 2.1.15
fish 3.0.2

# Goインストール
“`
$ brew install go
“`

“`
$ go version
go version go1.13.3 darwin/amd64
“`

Homebrew使うとコマンド一つでインストールできるので、とても便利です。

# GOPATHの設定
GOPATHとは、Goのソースをまとめているディレクトリを指定している環境変数のことであり、
GOPATHを利用することで、外部ライブラリの導入やビルド作業を非常に簡単に行うことができます。

bashでGOPATHを指定するには、

“`
$ vim ~/.bash_profile
“`

で設定ファイルに以下追記をします。

“`
export GOPATH=$HOME/g

元記事を表示

Go x Clean Architecture の話

[Ateam Hikkoshi Samurai Inc. & Ateam Connect Inc. Advent Calendar 2019](https://qiita.com/advent-calendar/2019/hikkoshi) 19日目は真のGopherになりたいルーキーGopher @lostfindがお送りします。

## はじめに
“`go
println(“みなさん、こんにちは!”)
“`
[12日目の記事](https://qiita.com/andmorefine/items/06f509c717fbd3b7bcd2)にも少しお話がありましたが, はい!そうです!

エイチーム引越し侍では言語は`Go`, 設計思想は`Clean Architecture`, 開発方法は`TDD`でバックエンド側のリプレイスに取り組んでいます!

この記事では`Go x Clean Architecture`でリプレイスしながら迎えた壁やまとまった考えについて, 少し共有ができたらなと思います!

## まず, 結論から ?
### Goとクリーンアーキテクチャの相性は?

元記事を表示

MySQLのToo many connectionsの対処法の補足 ~バルクインサートを添えて~

# はじめに
CA Tech Dojo/Challenge/JOB Advent Calendar 2019の19日目はhmarfが書かせていただきます。私のアドベントカレンダーの担当日の前後に優秀swiftエンジニアの [@ostk0069](https://qiita.com/ostk0069)さんと[@misakiagata](https://qiita.com/misakiagata)さんがいるのでプレッシャーがすごいです。
この記事は@kenjiszkさんの[MySQLでToo many connectionsが出た時の対応](https://qiita.com/kenjiszk/items/c3d46ac837845281e62b)についての私なりの補足です。

# MySQLで too many connectionsがでたら確認すべきこと
– @kenjiszkさんの記事にもありますが、“`too many connection“`がでたら、MySQLの“`max connections“`, “`processlist“`, “`wait_timeout

元記事を表示

これで俺モ ゲンシジン

# はじめに
こんにちはRIN1208です。この記事は[ITRCアドベントカレンダー](https://adventar.org/calendars/4759)の19日目の記事になります。

# 経緯
まず初めにこの記事を書いた経緯の説明をしたいと思います。
この記事で作った物こちらの記事、[オレ プログラム ウゴカス オマエ ゲンシジン ナル](https://qiita.com/Harusugi/items/f499e8707b36d0f570c4)を読み自分でも作ってみたくなったので作成した物です。
内容は似ていますが作成した言語やパッケージは異なります。
こちらの記事は個人的にとても好きなので是非見てみて下さい。

# 開発環境
– Mac
– goの実行環境
– MeCabの環境

# MeCabのインストール(Mac)

“`
$ brew install mecab
$ brew install mecab-ipadic
$ brew install git curl xz
$ git clone –depth 1 git@github.com:neologd/

元記事を表示

GoのTest学習

箇条書きで健忘録としてメモします。
・Goでテストを書くときはtestingパッケージを使う。
・テストはxxx_test.goというファイル名で作成する。
・テストメソッドはTestXxxという命名規則にする。
・テストはgo testコマンドで実行する。

“`go
// sum_test.go
package main

import (
“testing”
)

func Sum(a, b int) int {
return a + b
}

func TestSum(t *testing.T) {
if Sum(1, 1) != 2 {
t.Error(“miss”)
}
}
“`

元記事を表示

エラーハンドリングについて考えてみた

# はじめに
今回は、外部APIからデータを取得して表示する際のエラーハンドリングについて考えてみます。

# 方法1
[ERROR HANDLING WITH ANGULAR`S ASYNC PIPE](https://sebastian-holstein.de/post/error-handling-angular-async-pipe/) でも紹介されている方法です。
エラーを通知する先としてSubjectを用意してそれをビューテンプレートで表示します。

## Service
テスト用のモックを作成します。(実際に外部APIと通信は行いません。)

“`typescript
get(id: number): Observable {
return new Observable((subscriber) => {
setTimeout(() => {
if (!id) {
subscriber.error(‘id is required’);
return
}
subscriber.ne

元記事を表示

Goのミドルウェアのテスト

# 概要
GoでWebアプリケーションを作りにあたり、gRPCとgrpc-gatewayを利用して作っています。
ここで何か全APIに共通の処理を書きたい場合、grpc-gatewayにミドルウェアを作成し、そこで処理をしてしまうことが多いです。今回はそのミドルウェアのテストを書くやり方をまとめます。
なおミドルウェアはgrpc-gatewayやgRPCに依存しているものではなく、net/httpを使っているミドルウェアであれば同様にテストが書けるはずです。

業務のロジックが含まれていて割愛している所も多く、また同様の事をしている例も多々あるかと思いますが、
実際に使われているものに近いミドルウェアとそのテストとして、何かしら参考になれば幸いです。

# テストするミドルウェア

以下はアプリバージョンを渡してもらい、最低アプリバージョン以下だとエラーを返すというミドルウェアです。
実際のアプリケーションでは強制アップデートをかけるために利用しています。

“`appVersion.go
package gateway

import (
“fmt”
“net/http”

元記事を表示

Go言語でつくるインタプリタをやってみた

# tl;dr

ただの[『Go言語でつくるインタプリタ』](https://www.oreilly.co.jp/books/9784873118222/)紹介記事です。

## 動機

私はいつも自分の開発や日々の細かい作業をツールとしてより効率化をすることを考えています。
その結果としていくつかのCLIコマンドやVimプラグインを書いたりしているわけなのですが。
その中で今まで知らないことを盛り込むことで都度新しい知識を仕入れることを心がけています。

最近Language Server Protocol(LSP)周りにご執心なのですが、
ふと自分でLanguage Server(LS)をつくりたいなと思ったのですが、そのための知識が足りないことに気が付きました。
そうLSをつくる上で対象となる言語の解析への理解は欠かせないのです。

そこで私は一回インタプリタを作ったら一通りの流れを理解できるのでは?
と考えて以前から気になっていた『Go言語でつくるインタプリタ』を注文したのです。

似たような話でDQNEOさんの[Goコンパイラをゼロから作った話](https://qiita.

元記事を表示

Go Lang Hello world 超簡単言語(GOlang)

# ちっとお試しあれ
### <<みんなでGO>>
“`main.go
package main
import (
“net/http”
“fmt”
)
func world(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, “

Hello World

“)
}
func japan(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, “

Hello Japan

“)
}
func main() {
http.HandleFunc(“/”, world)
http.HandleFunc(“/japan”, japan)
http.ListenAndServe(“192.168.1.10:8080”, nil)
}
“`

![image.png](

元記事を表示

Goで一通りのsql操作をやってみる

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

# はじめに
Goでのmysql操作を備忘録としてまとめてみた
# コード全文

コード全文

“`go
package main

import (
“database/sql”
“fmt”
“log”

_ “github.com/go-sql-driver/mysql”
)

const appname = “gopherbot”

func run() (*sql.DB, error) {
dbDriver := “mysql”
dbUser := “root”
dbPass := “password”
dbName := “”
db, err := sql.Open(dbDriver, dbUser+”:”+dbPass+”@/”+dbName)
if err != nil {

元記事を表示

Gobotを使ってトイレ混雑問題と真剣に向き合ってみた

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

# はじめに
人類はこれまで幾度となく文明を進化させてきましたが、今だに解決仕切れていない問題があります。
そう、それは「トイレ混雑問題」。人間として生きていくためには避けて通れない問題です。

最近ではこの問題を危惧した様々な企業さん達が、こぞって記事を出しています。

[「トイレの混雑」を改善したリクルートの超アナログな方法](https://diamond.jp/articles/-/202333)

[職場のトイレの個室でソシャゲに没頭する困った大人たち](https://www.moneypost.jp/536375)

[『駅の空いてるトイレが分かる』アプリケーションを開発。「これを待っていた!」とSNSで話題に](https://iot.kddi.com/cases/odakyu/)

弊社もオフィスによっては個室の数が少なく、空いているかいないかのチェックに苦労している人もいるそうです。

その為、この

元記事を表示

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

# はじめに
[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(“

元記事を表示

Knative Serving in Production

# 概要

[Knative Serving](https://github.com/knative/serving) は、ステートレスなアプリケーションを対象に、HTTP リクエスト駆動で自動スケールする仕組みを提供します。Kubernetes (K8s) と Ingress ([Istio](https://istio.io/) or [Gloo](https://docs.solo.io/gloo/latest/), [Ambassader](https://www.getambassador.io/)) を程よく抽象化し、開発者が複雑な知識を必要とせずに、アプリケーションを外部に公開することが出来ます。Knative Serving のオートスケールの仕組みは、[Zero Scale Abstraction in Knative Serving](https://speakerdeck.com/toversus/zero-scale-abstraction-in-knative-serving) にまとめていますが、一部情報が古くなっているので、注意して下さい。

本記事では、

元記事を表示

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 = “

元記事を表示

OTHERカテゴリの最新記事