- 1. 【Heroku】デプロイ後にcode=H14 desc=”No web processes running”が発生する場合はProcfileを作成して対処すればOK
- 2. Goの組込みデータ型を整理した
- 3. Goでよく使われるgormを理解する:目次
- 4. Goでよく使われるgormを理解する:Query編
- 5. WSL&VScode&Go=permission denied
- 6. Go xlsファイルを読み取る
- 7. Goで開発していたが、途中でPythonに切り替えた件を振り返る。
- 8. 【Golang】ゴルーチン③バッファ、チャネル
- 9. Cloud FunctionsのHTTPトリガーをGolang + Echoでさばいてみた
- 10. gobot I2CでLチカ
- 11. aws-sdk-goを通してlocal-kmsを使う
- 12. git で日記を管理したい
- 13. 「Golang」 ×「Gorm」でシンプルに「Mysql」を操作する
- 14. GolangのWebAPIをsupervisorでデーモン化して公開する。
- 15. 【Golang】ゴルーチン②チャネル
- 16. go generate のベストプラクティス
- 17. Goでよく使われるgormを理解する:Preloading編
- 18. Go言語「スライスが分からない件」を解決する
- 19. 「Golang」 ×「gorilla/mux router」でシンプルなREST APIサーバーを開発する
- 20. 【Golang】ゴルーチン(並行処理)
【Heroku】デプロイ後にcode=H14 desc=”No web processes running”が発生する場合はProcfileを作成して対処すればOK
# 発生したエラー
“`
2020-06-02T00:41:22.345388+00:00 heroku[router]:
at=error code=H14 desc=”No web processes running”
method=POST path=”/xxxx” host=xxxx.herokuapp.com request_id=xxxx
fwd=”xx.xx.xx.xx” dyno= connect= service= status=503 bytes= protocol=https
“`## 私の場合
Go/echoで開発しており、メインのアプリの他にアプリケーションのディレクトリ内にmain関数を持つgoファイルを作成してデプロイしたら発生しました。
main関数が2つになり、Herokuがどちらを実行すべきが判定できなくなったんですかね。(適当)# 対処方法1
[公式ドキュメント](https://devcenter.heroku.com/articles/error-codes#h14-no-web-dynos-running)に基づき、アプリケーシ
Goの組込みデータ型を整理した
コードらしいコードは書いてない…
* [builtin – The Go Programming Language](https://golang.org/pkg/builtin/)
## 概略
* 論理型
* bool
* 文字列型
* string
* 整数型
* 符号付き整数型
* int
* int8
* int16
* int32 ( = rune)
* int64
* 符号なし整数型
* uint
* uint8 ( = byte)
* uint16
* uint32
* uint64
* uintptr
* 浮動小数点型
* float32
* float64
* 複素数型
* complex64
* complex128* エラー型
* Error## 論理型
#### bool
`true`または`false`しか取りうる値が存在しない最も単純なデータ型
## 文字列型
#### string
* 8bit/byteの
Goでよく使われるgormを理解する:目次
##はじめに
golangでアプリケーション開発を行なっている方だと、gormを使用されている方も多いのではないでしょうか。
自分もここ最近、golangを使ったWEBアプリケーションの開発を業務で行なっていますが、十分にgormの仕様を理解できておらず、実装で詰まってしまうことがあったので、この辺りで改めてgormのドキュメントと向き合い、Qiitaにまとめていければと思っています。基本的には、[GORMドキュメント](https://gorm.io/ja_JP/docs/associations.html)に沿って挙動を確認していきますので、ドキュメントも合わせて見ていただけるとよいかと思います。ただし、個人的に確認不要と判断した箇所については割愛していますので、予めご了承ください。
##目次
**はじめに**
・[はじめに](https://qiita.com/tsubasaozawa/items/b8917c57a20ba6daa316)**CRUD Interface**
・[Goでよく使われるgormを理解する:Query編](https://qiita.com/
Goでよく使われるgormを理解する:Query編
##目次
**はじめに**
・[はじめに](https://qiita.com/tsubasaozawa/items/b8917c57a20ba6daa316)**CRUD Interface**
・[Goでよく使われるgormを理解する:Query編](https://qiita.com/tsubasaozawa/items/19889340194cb6faa649)**Associations**
・[Goでよく使われるgormを理解する:Associations編](https://qiita.com/tsubasaozawa/items/5cde0b9b5df87d2334d5)
・[Goでよく使われるgormを理解する:Preloading編](https://qiita.com/tsubasaozawa/items/ac5a8a515fe4f7a139b0)##Query
Queryを用いることで、データの抽出条件を細かく設定することができます。####Where
gormのドキュメントには、AND検索について以下のような例が載っていますが、“`go
WSL&VScode&Go=permission denied
タイトルの通り、WSL上にGoの実行環境を用意した後VScodeのターミナルから色々やってた時に出くわした謎のエラーpermission deniedを解決したお話です。
#経緯
WSL上で[これ](https://github.com/matryer/goblueprints)を参考にGoを勉強してたのだが、いよいよVimだとキツくなってきたため、VScodeからWSL、そしてGoを動かしたいと考えるようになった。
VSCodeにWSLの拡張機能を追加して、VScodeのターミナルからgo buildでWebアプリケーションを立ち上げようとしたときに問題が起こった。
#permission denied
“`terminal
>>go build
….
….
main.go:4.12 ~~~/~~~/: rename ~~~/~~~/: permission denied
“`
う~んと?
WSL上でやっていた時には問題なくビルドできていた筈なのに、なんぞこれ?
不思議に思いWSL上でビルドするも、同じエラー吐くように。
#解決へ
とりあえず調べてみると、[同じような症
Go xlsファイルを読み取る
# Go xlsファイルを読み取る
今回は、Goで Excel の xlsファイル(Excel 97 ~ Excel 2003 ブック) を読み取る方法を考えてみます。
xlsxファイルの場合は、 [excelize](https://qiita.com/hiro_nico/items/0f180f2dfc62cf2559c7) がオススメです。
## ライブラリ
簡単に読み取りを行うなら、下記のライブラリを使うとよいです。
GitHub – extrame/xls: Pure Golang xls library
https://github.com/extrame/xls↓ Example を参考に書いてみるとこんな感じ
“`go
package mainimport (
“fmt”
“log”“github.com/extrame/xls”
)func main() {
xlFile, err := xls.Open(“input.xls”, “utf-8”)
if err != nil {
log.Fatal(err)
}sh
Goで開発していたが、途中でPythonに切り替えた件を振り返る。
# イントロダクション
目下、開発中のプロダクトなので詳しいことは書けないのですが、いろいろと気付きの多い出来事だったので、
少し自分自信の振り返りも兼ねて、投稿してみたいと思います。これは、決してGoよりPythonのほうが優れているとかそういった話ではないです。
今回、自分は開発者というよりプロジェクトマネージャー(以降、PM)という立場になります。# Goの採用
パネイルのコア技術はPythonなのですが、今回、開発にあたってGoを採用していました。
主な採用理由としては、「プロトコルとしてgRPCを採用するにあたって、gRPCとの組み合わせ事例が多い」からでした。gRPCの採用理由は、「同時に企画されていた別プロダクト(Python)との連携が想定されており、異なるプログラミング言語間でも型を維持したままデータ交換が可能」なことからでした。
当初は、プロダクトのリリース時期も未定でプロトタイプ的に実装されていたので、この時点では、社内的に実績のない新規技術を採用しても、特に問題がない状態でした。
問題がなかったかどうか検証するために、そもそも技術選定がどうあるべき
【Golang】ゴルーチン③バッファ、チャネル
#【Golang】ゴルーチン③バッファ、チャネル
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//Buffered Channels
//同じチャネルに複数ゴルーチンから送信import “fmt”
func main() {
//1
//channelを作成 2はバッファ 2つまで受け取る。長さ
//3つあるとエラーになる
ch := make(chan int, 2)
ch <- 1000 fmt.Println(len(ch)) //>>1ch <- 2000 fmt.Println(len(ch)) //>>2
//ch <- 300はバッファサイズ以上になる為、エラー(デッドロック) //2 //一つ取り出す。channelの中は1つ減るため、追加できる /* x := <- ch fmt.Println(x) ch <- 3000 */ //3 //forで取り出す //2つ以上取りに行くため、エラ
Cloud FunctionsのHTTPトリガーをGolang + Echoでさばいてみた
GCPのCloud FunctionsのHTTPトリガーをGolangで使っているときにEcho使えるんじゃないかと思って試したメモです。
# プロジェクト構成
Cloud Functionsで使えるように以下のようにファイルとディレクトリを作成します。“`
プロジェクトルート/
├── cmd
│ └── main.go
├── functions.go
├── go.mod
├── go.sum
└── shared
└── echo.go
“`## コード
### go.mod
使った依存ライブラリはこんな感じです。“`
module github.com/sert-uw/go_echo_functionsgo 1.13
require (
github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
github.com/labstack/echo v3.3.10+incompatible
github.com/labstack/gommon v0.3.0 // indirec
gobot I2CでLチカ
#1.はじめに
goと[gobot](https://gobot.io/)を使って、RaspberryPiのI2Cに接続したIOエキスパンダ(MCP23017)を操作してみます。
[公式にMCP23017がサポート](https://gobot.io/documentation/drivers/mcp23017/)されてるので、チュートリアルチャレンジで終わるかと思ったら、なんと、サンプルコードが書かれてなかったので、覚え書きを兼ねて簡単にまとめてみました。
**実行環境**
| | |
|:–|:–|
|ハードウェア|Raspberry Pi 4 |
|OS|Raspbian Buster|
|go|Ver.1.14.3|
|||
|IOエキスパンダ|[MCP23017](http://akizukidenshi.com/catalog/g/gI-09486/)|
||→これを、RaspberryPiのI2C端子に接続済|“`bash
$ uname -a
Linux raspi4 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14
aws-sdk-goを通してlocal-kmsを使う
# この記事を書いた経緯
aws-sdk-goを用いた案件ソース中にkmsを用いた暗号・復号化の実装があり
kmsという概念すらわからなかった私が、ローカル環境での検証に四苦八苦した時の覚書を認めたものです# コマンドだけ知りたい人へ
## local-kmsコンテナを立ち上げる
**そのままdev環境・本番環境のKMSに作られている鍵を使おうとしても、IAMの認証をかけられてしまうので
権限のないローカル環境では暗号化・復号操作を行うことができません。**ローカル環境においてkmsを用いた処理をデバッグしたい場合、[local-kms](https://hub.docker.com/r/nsmithuk/local-kms)というdocker imageを用いて実現することが可能です。
他コンテナとポートが重複する場合は、環境変数“PORT“を用いることで競合を回避できます“`bash
$ docker run -p 8080:8081 -e PORT=8081 nsmithuk/local-kms
“`## aws configureの作成
local-k
git で日記を管理したい
# 要約
git で日記をいい感じに管理したいという思いを込めて日記管理用の cli ツールを作成いたしました。
https://github.com/komem3/go-diary# 背景
バージョン管理やリモートリポジトリを使って日記・日報を管理したいという思いが有りましたが、いかんせんディレクトリが汚くなってしまうのが問題でした。定期的にディレクトリを綺麗に整理する根気があれば良いのですが、三日坊主になりやすい私なんかはそれだけで日記を書くのが嫌になってしまいます。
そこで、日記のファイルをいい感じのディレクトリ構造で管理するツールを作成しました。# インストール
go で作成したツールのため、以下のようにダウンロードします。“`sh
go get github.com/komem3/go-diary/cmd/diary
“`# 使い方
“`sh
$ diary -h
Diary is a CLI libray for managing your diary.
This application can format your diary directory,
「Golang」 ×「Gorm」でシンプルに「Mysql」を操作する
「`REST API`サーバから受け取ったリクエストパラメータの内容を元にリレーショナルデータベース(`Mysql`)を更新する」という流れで、説明を進めています。
以下の記事の続編という形で投稿を行っておりますので、仕様などの前提条件はこちらで確認していただけるとありがたいです。
> [「Golang」 ×「gorilla/mux router」でシンプルなREST APIサーバーを開発する](https://qiita.com/stranger1989/items/7d95778d26d34fd1ddef)
# データベース(Mysql)準備
コードを実装する前に、`Mysql`上でデータベースの作成を行います。
※ `Mysql`自体導入していない場合は、インストールが必要です。詳細は他のサイトで解説されているのでここでは割愛します。“`shell
# ルートユーザーでログイン
mysql -uroot# mysql shell上
CREATE DATABASE { データベース名 };#
GolangのWebAPIをsupervisorでデーモン化して公開する。
GolangのWebAPIをデーモン化して公開する際に役立った情報の備忘録です。
##使用環境
Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type (無料使用枠)
##デーモン化とは
そもそもGolangのWebAPIを公開する方法を知らず、Linux上で”GO RUN main.go”を実行すればよいのかと考えていた。この方法だと、RLoginなどで接続を閉じたタイミングで処理も終了してしまって上手く行かなかった。
調べるうちに、デーモン(UNIX系OSにおいて、常時待機しているプログラムを指す)というものに行きついた。[Golang デーモン]で検索すると多数ヒットしたので、Golangのmain.goを常駐化させる方針を立てた。
##supervisor
Golangのバイナリを常駐化させる為のツール。
Nginx同様にconfファイルで設定を行う必要がある。##supervisor.confの編集
“`vim
sudo vi /etc/supervisord.conf
“`##supervisor.conf
【Golang】ゴルーチン②チャネル
#【Golang】ゴルーチン②チャネル
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。
“`
package main//channel
//スレッド同士のデータのやり取り//複数チャネルを作って、処理することも可能
import (
“fmt”
)//sからcへ送信する処理
func goroutin1(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
//都度、計算結果を出力
fmt.Println(sum)}
//全て処理が終わったら、channelに送信
c <- sum } func main() { /* //var 変数 chan データ型 var ch chan int //送信専用と受信専用の型を指定すると厳密になり、異なる場合、コンパイルエラーになる。 //送受信に制限を設けない方がオススメ。 //受信専用チャネル var ch1 <-cha
go generate のベストプラクティス
## 概要
Go 言語におけるコード生成 ([go generate](https://golang.org/cmd/go/#hdr-Generate_Go_files_by_processing_source)) について、自分の中でベストプラクティスと思えるものが増えてきたので、ここでまとめて紹介してみたいと思います。
## wtz.go と time について
go generate のベストプラクティスを説明するにあたり、この記事では wtz.go と time の 2 つのライブラリを実例としてとりあげます。
[wtz.go](https://github.com/yaegashi/wtz.go) は筆者が Go 標準ライブラリの [time](https://golang.org/pkg/time/) の Windows ランタイム部分を参考にして作成したもので、 Windows タイムゾーンをどの OS や実行環境でも扱えるようにするためのライブラリです。これを使うと、例えば `Tokyo Standard Time` のような Windows 独自のタイムゾーン
Goでよく使われるgormを理解する:Preloading編
##目次
**はじめに**
・[はじめに](https://qiita.com/tsubasaozawa/items/b8917c57a20ba6daa316)**CRUD Interface**
・[Goでよく使われるgormを理解する:Query編](https://qiita.com/tsubasaozawa/items/19889340194cb6faa649)**Associations**
・[Goでよく使われるgormを理解する:Associations編](https://qiita.com/tsubasaozawa/items/5cde0b9b5df87d2334d5)
・[Goでよく使われるgormを理解する:Preloading編](https://qiita.com/tsubasaozawa/items/ac5a8a515fe4f7a139b0)#Preloading (Eager loading)
Preloadingは事前読み込みのことです。多くのormで実装されている機能ですが、gormでも`Preload(struct’s)`を指定すること
Go言語「スライスが分からない件」を解決する
Go言語のスライスはとても便利なのですが、いまいちGo言語のスライスが分からないのはなぜでしょうか。いろいろなプログラムを作って検証してみましょう。
# 基本
例えば、“[]int“のスライス(intの可変配列とも言える)を作成し、適当に初期化して値を一気に表示するプログラムは、以下のようになります。
“`basic.go
package main
import “fmt”
func main() {
a := []int{0, 1, 2, 3, 4, 5}
fmt.Printf(“%#v\n”, a)
}
“`実行結果:
“`
$ go run a.go
[]int{0, 1, 2, 3, 4, 5}
“`## 部分的に取り出す
データを取り出すには、“a[要素番号]“。部分スライスを取り出すには、“a[i1:i2]“のように書きます。なお、i2には終わりのインデックス+1の値を指定します。
“`substring.go
…
func main() {
a := []int{0, 1, 2, 3, 4, 5}
b := a[0:3
「Golang」 ×「gorilla/mux router」でシンプルなREST APIサーバーを開発する
# Why Golang?
`Golang`の特徴として「シンプル」「静的型付けのため高速」「マルチプロセッシングによる並列処理」があります。このような特徴から`Docker`や`Kubernetes`などの高速処理を要求されるインフラ基盤構築サービスでも使われており、またイーサリアムの`Geth`など「ブロックチェーン」の基盤として活用されているケースもあるようです。
また、`C言語`をベースに開発された言語のため、「構造体」「ポインタ」「チャネル」など普段`Typescript`や`Python`などのコードを書いていると若干とっつきにくさはあるのですが、C言語よりは数段理解がしやすく、短い記述で処理を書くことができます。
(私自身、C言語で挫折した経験があったので、若干不安ではありましたがコードがシンプルなため他の言語の経験があれば学習コストは非常に低いと思います。)**まとめると「比較的学習コストが低い」かつ「高速」… 最高ですね!**
`Google`→`Golang`ときたら`gRPC
【Golang】ゴルーチン(並行処理)
#【Golang】ゴルーチン(並行処理)
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//goroutineとsync.WaitGroup
//goroutinの基礎//軽量のスレッド 並列処理のこと
//暗黙的にGoはやってくれるため、他の言語ほど深い知識がなくても
//勝手にやってくれるimport (
“fmt”
“sync”
“time”
“runtime”
)//並列処理
//3
//引数でポインタを宣言
func goroutin(wg *sync.WaitGroup){
//3
//wgを終了する
defer wg.Done()
for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(i) } } /* wg.doneが無かったり、wg.Add(1)が複数あるとエラーになる。 */ //1 //通常の処理 func normal(