- 1. 【Docker-Compose/Go/MySQL】Go、MySQL環境をdocker-composeで構築する
- 2. cweill/gotestsでtestifyを利用する
- 3. 各種 Web Application Framework メモリ使用量比較調査 (Go, Ruby, Python, Node.js, Java)
- 4. Golang での Web アプリ開発で、理解を早める 5 ステップ
- 5. Docker コンテナ内で立ち上げた godoc にホスト側からアクセスできなかった
- 6. Go1.13とDockerで開発環境構築(ホットリロード有)
- 7. database/sql で INSERT したレコードのIDを取得する
- 8. Echo+GORMでRESTfulなAPIサーバをつくる
- 9. Goのsqlmockを使ってみた
- 10. Go で ipc package を書いてみた
- 11. 【Go】Sqlite3の利用方法
- 12. Ubuntu18.04にVSCodeのGo開発環境を作る
- 13. tail -fをカスタマイズするツールを作ってみた
- 14. 【2020年1月】令和だし本格的にVSCodeのRemote Containerで、爆速の”開発コンテナ”始めよう
- 15. macOSにGoの開発環境をインストール(備忘録)
- 16. Go言語で画像(png, jpg, gif)処理 [ドット絵、リサイズ]
- 17. ユーモアあふれる、ステータスコード 418 と 420 って何?
- 18. Goのポインタと構造体
- 19. Raspberry pi とGoとMackerelでシェアハウスの運用しやすい鍵システムを作る
- 20. 眺めて覚えるGo言語 その8 PythonからGO言語を呼ぶ1(引数文字列)
【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 に従って書く題材が欲しかった実装
==================================
【Go】Sqlite3の利用方法
##1. Sqlite3のインストール
Windowsならば下記サイトよりSqliteをダウンロードします。
https://www.sqlite.org/download.html
「sqlite-tools-win32-x86-3300100.zip」をダウンロードしてインストールします。Macならば、下記コマンドを実行してください。
“`brew install sqlite“`##2. gccのインストール方法
sqliteはC言語で開発されているため、gccが必要です。Windowsの場合、下記よりTDM-gccをダウンロードしてインストールします。
http://tdm-gcc.tdragon.net/downloadMacならば、Xcodeをダウンロードしてインストール後、下記コマンドを実行してください。
“`xcode-select –install“`これでgccが利用できるようになります。
##3. go-sqlite3を取得する
コマンドラインで次を実行します。
“`go get github.com/mattn/go-sqli
Ubuntu18.04にVSCodeのGo開発環境を作る
環境はUbuntu18.04
## Extensions
– [Go](https://marketplace.visualstudio.com/items?itemName=ms-vscode.Go)
## .zshrc
`go env` で調べてPATH追加
“`
export GOPATH=$HOME/go
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOPATH
export PATH=$PATH:$GOBIN
“`## setting.json
LanguageServerを有効にした
“`setting.json
{
“go.useLanguageServer”: true,
“go.languageServerExperimentalFeatures”: {
“format”: true,
“autoComplete”: true,
“rename”: true,
“goToDefinition”: true,
tail -fをカスタマイズするツールを作ってみた
`tail -f`を実行すると、ログが延々と出力されますが、出力しつつ結果をカスタマイズするツールを作った。
* 時刻表示
> ログの時刻表示形式がマチマチだったり、場合によっては時刻が出ない場合もある。1行ずつ時刻を表示させるようにしてみた。
追加でエポック時刻も表示させ、処理時間を算出しやすくしてみた。* キーワードの色づけ
> tailすると表示が流れてしまうので、色がつくようにしてみた。
# 実装
tailの実装は https://github.com/hpcloud/tail をインポートした。引数なしで実行するとこんな感じ。“`terminal
NAME:
decotail – decorated tailUSAGE:
decotail [global options] command [command options] [arguments…]VERSION:
1.0COMMANDS:
help, h Shows a list of commands or help for one commandGLOBAL
【2020年1月】令和だし本格的にVSCodeのRemote Containerで、爆速の”開発コンテナ”始めよう
# VSCode の Remote Conainer で”開発環境+プロジェクト全部入りのコンテナ”から開発をスタートダッシュをキメませんかッ!?
開発でVS Code の Remote Conainer使っていますか?単に既存のコンテナに入るだけなら Remote SSH でも構いませんが、”ローカル開発環境の一部”として、いやむしろ**ローカルの開発環境=Remote Container**として、ビンビンにRemote Container使っていきましょう。令和だし!~~(すでに2年だけどね・・・?)~~
特にMacを使っていると最初からPythonやらPHPやらRubyやらが入ってしまっているので**開発環境がある**のですが、これらは割とmacOSのエコシステムに組み込まれているので不要にパッケージの追加削除、できないのですよ。`brew`とか意外とあっさり壊れますしね・・・。特に**バージョンアップなんてもってのほか**です。全然、余裕でおかしくなります。
そんなわけでMacに入っているPythonやRubyでプログラミングをバリバリしていると・・・**ふと、後戻りでき
macOSにGoの開発環境をインストール(備忘録)
# Goのインストール
Homebrewでgoをインストール“`{bash:ターミナル}
$ homebrew install go
$ go version
go version go1.13.4 darwin/amd64
“`ちゃんとhomegrew(自家醸造)して、Cellar(貯蔵庫)に入ったgoが使われていることを確認。
“`{bash:ターミナル}
$ which go
/usr/local/bin/go
$ ls -al /usr/local/bin/go
lrwxr-xr-x 1 shizuku admin 26 11 17 19:23 /usr/local/bin/go -> ../Cellar/go/1.13.4/bin/go
“`# GOPATHとPATHの設定
– ホームディレクトリにgoディレクトリを作成してGOPATHに設定。
– PATHにGOPATH/binを追加。下記の2行を.bash_profileに追加しておく。
“`{bash:.bash_profile}
export GOPATH=$HOME/g
Go言語で画像(png, jpg, gif)処理 [ドット絵、リサイズ]
# 初めに
「Go言語で画像処理を書いたことないなー」と思い、ドット絵を作成する [gpixart](https://github.com/hmarf/gpixart) と画像をリサイズする [grimg](https://github.com/hmarf/grimg) を作成したときに苦労したことを書きます。
gpixartは内応が薄いので時間がない方は読み飛ばしてください。# [gpixart](https://github.com/hmarf/gpixart)
“` github.com/nfnt/resize “` を使ってリサイズするだけでドット絵になります。
例えば、180×200の画像を18×20の画像にリサイズするとドット絵になります。(ドット絵というより画質の悪い画像ですけどね)
正直これで終わってしまうんです。なので、[ドット絵ナニカ](http://dot-e-nanika.com/) のように減色処理を加えました。手法としては、k-meansを使って減色します。“` pixart.go
func kmeans(img *image.RGBA, cl
ユーモアあふれる、ステータスコード 418 と 420 って何?
## Status Code 418 by Google
https://www.google.com/teapot にアクセスすると ステータスコード `418` が返ってきます。
開発者ツールからももちろん確認できます。400 番台の HTTP レスポンスエラーは、__クライアントエラー__ ですね。
[MDN](https://developer.mozilla.org/ja/
Goのポインタと構造体
# Goのポインタと構造体
最近、Goで何か作りたい欲が出てきました。
Goプログラミングではポインタと構造体がよくセットで使われるらしいのでやっていきます
まずはポインタ。## ポインタ
ポインタとは、「値型(value type)」に分類されるデータ構造(基本型や参照型、構造体など)のメモリ上のアドレスと型の情報。
### ポインタの定義
ポインタ型は`*int`のように、参照・操作したい型の前に`*`をつけることで定義できる。
`*float64`であればfloat64型のポインタに、`*[2]int`であれば*[2]int型のポインタになる。
また、定義した時の初期値は`nil`“`go
func main() {
var p *int
fmt.Println(p == nil)
}
“`
> trueポインタ定義につかった「*」を重ねると、ポインタのポインタを定義できる。
むずそうだしあまり使わないらしいので紹介だけ。“`go
var **int // int型のポインタを参照・操作するためのポインタ型
“`
さらに、参照型にもポインタ
Raspberry pi とGoとMackerelでシェアハウスの運用しやすい鍵システムを作る
# はじめに
こんにちは!都内でWeb Developerしている[nari](https://twitter.com/fukubaka0825)と申します。私が住んでいるシェアハウス([ギークハウス新宿](https://4hacker.github.io/hackerhouse/geekhouse-shinjuku.html))の同居人たちで、去年の7月に開発合宿にいったのですが、その際にプロトタイプを作った**シェアハウスの鍵システムが先日完成**したということで、**自分の担当した部分に関して振り返り**をしておこうとこの記事を書いています。
まず**何を作ったか**をお見せした後、今回採用した**おうちハックでの運用に優れた3つの技術スタック(Raspberry piとGoとMackerel(監視系SaaS))に関して紹介**したいと思います。(作った物の実装は大したことないので詳しく説明しません)
# 何を作ったか
一言で言うと、**シェアハウスの鍵システム**なのですが、以下の同居人の @wamisnet さんのツイートの動画で実際の挙動を見てもらうとわかりやすい
眺めて覚えるGo言語 その8 PythonからGO言語を呼ぶ1(引数文字列)
# pythonからGo サブルーチンへの引数 文字列
### byte列をポインターで渡す。“`pcgo1.py
from ctypes import *
lib = cdll.LoadLibrary(“./golib.so”)
a=lib.fun1(c_char_p(b”hello world”))
“`“`golib.go
package mainimport “C”
import “fmt”
//export fun1
func fun1(a *C.char) int {
fmt.Println(C.GoString(a))
return 0
}func main() {}
コンパイルと実行
>go build -o golib.so -buildmode=c-shared golib.go
>python pcgo1.py
hello world
“`
– c_char_p(b”hello world”)は、バイト列ポインター扱い
– C.GoString(a)は、受け取ったバイト列ポインターをGO stringへ#文字列の受