- 1. アナ雪のメロディーに合わせた Golang の歌 – Write in Go – が最高すぎる
- 2. Node.js が Go より 2 倍も速いなんてことがあるのだろうか
- 3. Go言語でFizzBuzzを書いてみた
- 4. golang 関数(func)の引数や戻り値で関数を指定したときの動作
- 5. Go言語の基本Tips
- 6. Goでzstd形式のディレクトリ圧縮をやってみた
- 7. GitHub GraphQL API v4を使ってリポジトリごとのContributionを集計してみた
- 8. Go言語においてstruct定義をすることなくJSONを扱うときのTips
- 9. gqlgen + Prisma Lift + gormで出勤管理を作ってみた
- 10. Go + Echo + Vue.js + GORMで、DB接続する最低限のSPAを実装してみる
- 11. 【Docker-Compose/Go/MySQL】Go、MySQL環境をdocker-composeで構築する
- 12. cweill/gotestsでtestifyを利用する
- 13. 各種 Web Application Framework メモリ使用量比較調査 (Go, Ruby, Python, Node.js, Java)
- 14. Golang での Web アプリ開発で、理解を早める 5 ステップ
- 15. Docker コンテナ内で立ち上げた godoc にホスト側からアクセスできなかった
- 16. Go1.13とDockerで開発環境構築(ホットリロード有)
- 17. database/sql で INSERT したレコードのIDを取得する
- 18. Echo+GORMでRESTfulなAPIサーバをつくる
- 19. Goのsqlmockを使ってみた
- 20. Go で ipc package を書いてみた
アナ雪のメロディーに合わせた Golang の歌 – Write in Go – が最高すぎる
[Write in Go – YouTube](https://youtu.be/yhC-361QGJw)
> The schedule’s tight on the cluster tonight
> So I parallelized my code
> All these threads and continuations
> My head’s going to explode
> And all this bolierplate
> This FactoryBuilderAdapterDelegatelmpl…
> Seems unjustified
> Give me something simple
> Don’t write in Scheme
> Don’t write in C
> No more pointers
> That I forgot to `free()`
> Java’s verbose
> Python’s too slow
> It’s time to know
> Write in Go!
> Write in Go!
> No inh
Node.js が Go より 2 倍も速いなんてことがあるのだろうか
こんにちはフロントエンドエンジニアをしている ku6ryo です。
普段は VR のスタートアップにて JavaScript で SPA を開発しています。
WASM に興味をもち、 WASM x Go は本当に早いのかという疑問から速度検証をしてみたのですが、WASM に辿り着く前に Go が JavaScript (Node.js) よりも遅いケースがあるのを発見したので共有および、なぜこうなるのかわかる方がいらっしゃればご意見をいただきたく、本記事を投稿します。# 結果
先に結果から。10^7 以下の最大の素数を求めたところ、JavaScript (Node.js) 約 1200 ms に対して Go は 約 2500 ms となった。Node.js は Go よりも約2倍も速い結果となった(10回施行のばらつきは 数% 以内なので Node.js は Go に対して優位な差があるとみなせると判断)。なお、実行環境は `macOS Catalina / 2.3 GHz Dual-Core Intel Core i5 / 16 GB 2133 MHz LPDDR3` です。
Go言語でFizzBuzzを書いてみた
# はじめに
正月休み時間があったので Go 言語を勉強しました。
基本文法の確認のため FizzBuzz を書いてみたら Go 言語ならではの面白い書き方ができるなー、と思ったので投稿することにしました。## FizzBuzz のルール
* `1` から `100` まで数字を出力する
* その数字が `3` で割り切れるなら `Fizz` と出力する
* その数字が `5` で割り切れるなら `Buzz` と出力する
* その数字が `3` でも `5` でも割り切れるなら `FizzBuzz` と出力する# コード
https://play.golang.org/p/CcpxL6bDT2c
“`golang
type FizzBuzzInt int
func (i FizzBuzzInt) String() string {
switch {
case i%15 == 0:
return “FizzBuzz”
case i%3 == 0:
return “Fizz”
case i%5 == 0:
return “Buzz”
defau
golang 関数(func)の引数や戻り値で関数を指定したときの動作
# はじめに
golang を使い始めたのですが、関数の使い方で躓いたのでメモを残そうと思います。
関数の引数や戻り値に変数(int、string等)を指定した場合の挙動は想像できるのですが、 引数や戻り値に `func(int)` のような関数を指定をしたときの動きが直ぐにわからず、、動作を確認しました。#### 確認パターン
– 引数に関数
– 戻り値に関数# 引数に関数(1)
簡単な足し算をする処理です。 関数 `calc` の第1引数を `func(int, int)` とし、関数を受け取れるようにしています。
どの順番で実行されたかを確認するために `println` を入れています。“`golang
package mainimport (
“fmt”
)func calc(fn func(int, int) int, x int, y int) (res int) {
fmt.Println(“(A)”)
res = fn(x, y) // 関数:add を実行
return
}func add(x int, y int) int
Go言語の基本Tips
プロジェクトによって色々な言語を使うことが増えてくると、パッと切り替えられず混乱してしまうことがあります。そんな自分用の備忘録です。
Go言語のプレイグラウンドは[こちら。](https://play.golang.org/)
# 特徴
* コンパイル言語であるため、Pythonなどの動的言語に比べ実行速度が圧倒的に速い。
* Goのプログラムが起動した直後には「main」パッケージに属する「main関数」が実行されるため、必ず「main関数」が必要。# 処理の書き方
処理の最後に`;`は不要です。“`Go
println(“hoge”)
“`# 変数
`var`で定義し、データ型が変数名の後ろになります。
Goでは、データ型の指定を省略することが可能です。
次の3行は全て同じ意味になります。“`Go
var a int = 1
var a = 1
a := 1
“`
#メソッド名や変数名の大文字/小文字
名前(トップレベルの型名、関数名、メソッド名、定数名、変数名、構造体のフィールドおよびメソッド名)の先頭一文字が大文字になっていれば、パッケージの利用者側
Goでzstd形式のディレクトリ圧縮をやってみた
# やりたいこと
Goでzstdを用いたディレクトリ圧縮をしたい。# zstdとは
http://facebook.github.io/zstd/
facebookがOSS化した圧縮アルゴリズム。
他の圧縮アルゴリズムよりも圧縮展開速度・圧縮効率に優れている。らしい。# Goで使えんの?
ラッパーライブラリがありました。
リポジトリ: https://github.com/DataDog/zstd
godoc: https://godoc.org/github.com/DataDog/zstd
今回は上記を使用しますが、これ以外にもあるみたいです。
# 使ってみました
### サンプルリポジトリ
https://github.com/Raita876/zstd-sample
tar, zstdパッケージを使用してsampleディレクトリをアーカイブ、圧縮しています。
### ディレクトリ構成
“`
$ tree .
.
├── Makefile
├── README.md
├── go.mod
├── go.sum
├── main.go
└── sa
GitHub GraphQL API v4を使ってリポジトリごとのContributionを集計してみた
## はじめに
2019年はKubernetes公式ドキュメントの翻訳をはじめ、OSS活動を積極的に行った年となりました。2019年の振り返りをはてなブログに書いた[^1]のですが、何かうまくいっていない気がしました。一因として、GitHubでのContributionを数えることに気をとられてしまったことが挙げられます。そこで、今後も振り返りを続けていくためにも簡単にContributionを集計したいところです。
GitHub GraphQL API v4[^2]を使うとよさそうだと知り、GUI[^3]でごにょごにょしました。概ね望んでいたデータはとれたのですが、データ構造をいじりたかったのでGraphQLのレスポンスをmarkdownに変換するツール[^4]を自作しました。
## GraphQL
以下の通りです。2行目と3行目のパラメーターを修正して使ってください。
“`graphql
{
user(login: “oke-py”) {
contributionsCollection(from: “2019-01-01T00:00:00.000Z”, to
Go言語においてstruct定義をすることなくJSONを扱うときのTips
go言語においてJSONをあつかう際には、構造体を定義してmappingするのが一般的です。
ほとんどの場合この方法で良いのですが、たまにStructを定義したくない、できない状況があるかもしれません。
struct定義することなくJSONを扱う方法について記載していきます。jsonを楽に使うパッケージ:[github.com/aimof/jaason](https://github.com/aimof/jaason)を作っている時に得た知見をまとめました。
## はじめに:`json.Unmarshal()`の基本
JSONをjson.Unmarshal()でunmarshalした際には、以下の型になります。
“`
bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null
“`ご存知の通り、JSON
gqlgen + Prisma Lift + gormで出勤管理を作ってみた
# サンプル
https://github.com/inadati/sample01-AttendManager.services# コンテナ構成
### DB
– PostgreSQL### cron処理
– busybox### cronで叩く用graphql api(非公開api)
– gqlgen
– gorm### 公開用graphql api
– gqlgen
– Prisma(Liftのみ使用)
– gorm### クライアントアプリ
– nuxt
– Apollo Client### その他
本番公開にhttps-portalを使用(別コンテナ)# graphQLサーバーを立てる上での躓きポイントをまとめる
※下記は今後、別記事にしてリンクを貼るようにします。### Hasuraによって作れるapiはいかなる場合もweb公開するしかないという話
PrismaはORMを使い、内部的にSQLを叩くことでDBを読み書きしているので
Prismaが自動生成するapiを直接、web公開する以外にも
prismaのORMを使い、別途公開用のgra
Go + Echo + Vue.js + GORMで、DB接続する最低限のSPAを実装してみる
Go言語でのSPA開発について、一番基本的なところの実装を押さえておきたかったところに、素晴らしく簡潔にまとまった以下の記事を参考にさせていただきました。
Go + Echo + Vue.js SPAへの第一歩
https://qiita.com/K-juju/items/f6d0eedb9aee5714cb73少しだけ実装を追加してみたので、そのご紹介です。
なおこのサンプルアプリケーションの基本的な機能については、この記事では説明しませんので、上記の@K-jujuさんの記事を参照ください。
# 追加でやってみた点
1. データをDBに保持し、ORMでデータ作成や取得を行うようにしました。
– DBMSには、とても気軽に使えるSQLiteを使いました。
– ORMには、シンプルながら高機能なGORMを使いました。
– GORMガイド
http://gorm.io/ja_JP/docs/index.html
2. 依存モジュール管理にModulesを使うようにしました。
– (参考)Go言語の依存モジュール管理ツール
【Docker-Compose/Go/MySQL】Go、MySQL環境をdocker-composeで構築する
## 環境
– Go 1.13
– MySQL 5.7
– docker-compose 3## docker-composeファイル
完成した`docker-compose`ファイルが下記になります。“`yaml
version: ‘3’
services:
backend:
build:
context: .
dockerfile: “Dockerfile.dev”
volumes:
– ./:/go/src/github.com/test/go-src
ports:
– “8080:8080”
depends_on:
– db
environment:
– DATABASE_HOST=db
– DATABASE_PASSWORD=hogehoge
– DATABASE=dev
– DATABASE_USERNAME=root
tty: true
stdin_open: truedb:
i
cweill/gotestsでtestifyを利用する
## 動機
プロダクトコードから[TableDrivenTests](https://github.com/golang/go/wiki/TableDrivenTests)に基づいたテストコードを生成してくれる [cweill/gotests](https://github.com/cweill/gotests)では値の比較はreflect.DeepEqualを用いている. testifyを利用することができるようになったようなので試す.([PR#109](https://github.com/cweill/gotests/pull/109))
## 手順
### CLI
“`bash
# reflect.DeepEqual
$ gotests -w -only Hello hello.go -exported hello_test.go# stretchr/testify/assert
$ gotests -w -template testify -only Hello hello.go -exported hello_test.go
“`### エディタ
VS
各種 Web Application Framework メモリ使用量比較調査 (Go, Ruby, Python, Node.js, Java)
## 概要
– 「Hello World な HTML を返す程度の Web アプリケーション」または「それぞれの公式ドキュメントに載っているチュートリアルの初期状態に近いもの」を作成してメモリ使用量を比較する
– Web アプリケーションサーバは現時点でよく使われていると思われるものを使用する
– テンプレートエンジンはフレームワークのデフォルト設定またはフレームワークが推奨しているものを使用する
– macOS Catalina 上でメモリ使用量を計測
– メモリ使用量の計測には ps コマンドの RSS 値を使う (複数のプロセスを使うものはRSS値を単純に足したものをメモリ使用量とした。メモリ共有部分については考慮していないため、もう少しメモリ使用量が少ないかもしれない)## 調査結果
メモリ使用量が少ない順に並べる。
– 7MB: Go 1.13 + Gin 1.5
– 10MB: Go 1.13 + Revel 0.21
– 24MB: Ruby 2.7 + Sinatra 2.0 + Puma 4.3
– 40MB: Python 3.8 + Flask 1.1
Golang での Web アプリ開発で、理解を早める 5 ステップ
## Web アプリとは?
知っていると思いますが、共通認識に違いがないか確認するために書いています。
以下、[「Go プログラミング 実践入門」(英題: Go Web Programming)](https://www.amazon.co.jp/dp/B06XKPNVWV) から抜粋です。
> 1. HTTP を介し、HTTP リクエストメッセージの形でクライアントから入力を受け取る
> 2. HTTP リクエストメッセージを処理し、必要な処理を行う
> 3. HTML を生成し、HTTP レスポンスメッセージに入れて返す## Golang での Web アプリ作成に必要な項目
ざっくりと、以下が Golang で Web アプリ開発をする際に実施する項目になります。– マルチプレクサ (multiplexer) を作成
– 例: `mux := http.NewServeMux()`
– 注意: `sync.Mutex` とは全く別だよ!(自分自身、勘違いしてたので。。)
– Handle (ハンドラ)、またはハンドラ関数を作成
– ルーティング設定
Docker コンテナ内で立ち上げた godoc にホスト側からアクセスできなかった
## この記事について
Go言語の勉強用の環境として立ち上げた Docker コンテナ内で godoc サーバを立ち上げたが、ホストOS側のブラウザからアクセスできなかったので調べてみたメモ。
**環境**
* Windows10 Pro Insider Preview (バージョン: 2004, OSビルド: 19536.1000)
* WSL2 / Ubuntu-18.04 ( [.wslconfig で localhost フォワーディング設定済み](https://qiita.com/snaka/items/a8eee4cfc8f7d733e6ab) )
* Docker
* 2.1.7.0(41536)
* Engine 19.03.5**用意した Dockerfile**
“`Dockerfile:Dockerfile
FROM golang:latestRUN mkdir /go/src/app
WORKDIR /go/src/app
RUN go get golang.org/x/tools/cmd/godoc
EXPOSE 6060/
Go1.13とDockerで開発環境構築(ホットリロード有)
# はじめに(背景)
筆者は今までGoでは簡単なツール(Slack用Botとか)しか作ってこなかったが、
Goを使ってWEBアプリを開発してみることにした。ところが、開発環境を構築するのに、検索でヒットする情報が微妙だった
– Goのバージョンが古くてGo Modulesを使っていなかったり、
– 使っているライブラリの最終更新が3年前だったり情報を整理しながら開発環境を構築する必要が有ったので、
せっかくだからアウトプットしておこうと思った。# 前提
– Goのversionは、執筆時点で最新の1.13系を使う
– docker-composeで立ち上げたい
– せっかくなので、ホットリロードが欲しい### 以下には触れません
– GoでのWEBサーバーの立ち上げ方
– Go Modulesについて
– Docker、docker-composeの使い方# 本題
## Goの設定
#### Go Modulesを使う
Go Modulesの導入や使い方などは割愛
↓のコマンドでinitialize
`go mod init github.com/username
database/sql で INSERT したレコードのIDを取得する
# 概要
Go の `database/sql` を利用して、 INSERT したレコードのIDを取得する
## 参考
– [Inserting records into a PostgreSQL database with Go’s database/sql package](https://www.calhoun.io/inserting-records-into-a-postgresql-database-with-gos-database-sql-package/)
## 問題
– 使用しようとした `lib/pq` では `LastInsertId() (int64, error)` が使えない
– `database/sql` は `int64` で ID を返す Interface しか存在しない### 使用しようとした `lib/pq` では `LastInsertId() (int64, error)` が使えない
`database/sql` では import する [Driver](https://github.com/golang/go/wik
Echo+GORMでRESTfulなAPIサーバをつくる
# Overview
小規模なプロダクトにおいてPythonでAPIサーバはしんどい(できるけどソースが美しくない)ので, 全然使ったことないけどGoでAPIサーバを立ててみたい# Description
普段お仕事では[Django REST Framework](https://www.django-rest-framework.org/), 趣味では[Flask](https://a2c.bitbucket.io/flask/)を使っているんですが, PythonでORマッパー使おうとすると[SQLAlchemy](https://www.sqlalchemy.org/)とか使うハメになってしんどいです.かといってDjangoを使うのはウェイトが重い…
peeweeとかいういい感じのライブラリもあるっぽいですがということでせっかくなのでGoで作ってみます
今回は, 要素を一意に特定できる`id`と文字列`text`を要素に持つPostを定義して, API経由でCRUD操作を行うようなアプリを作ります
Goのsqlmockを使ってみた
sqlmockを使ってみた。コードは[こちら](https://github.com/reikkk/dbmock)になります。
Go で ipc package を書いてみた
あけましておめでとうございます。
昨年の末ごろから、なんとなーくプロセス間のソケット受け渡しを Go でやってみたいなーと思って少しずつコードを書いていたんですが、年末年始の時間を使って書き上げたので、ここで報告します。
軽い気持ちで書き始めたものの、なかなかハマることが多くて結構な時間がかかってしまいました。。。
成果物
========================================https://github.com/navel3/go-ipc
https://godoc.org/github.com/navel3/go-ipcMotivation
========================================– TCP接続をプロセス間で授受することで、コネクションレスなリバースプロキシ的なものができるのではないかと思った
– Go だけで低レイヤーのコードを書いてみたかった
– テストからドキュメントまで Go Way に従って書く題材が欲しかった実装
==================================