- 1. golang dep にはまった
- 2. 【Go】コンテナを理解するためにコンテナを自分で”造る”【初心者】
- 3. マイクロサービスでも使えそうなエラー処理を考えてみた
- 4. 【Golang】ゴルーチン④range,close
- 5. 【GCP】Cloud Functions の Go 1.13 でファイル構造に変更があった
- 6. 【Heroku】デプロイ後にcode=H14 desc=”No web processes running”が発生する場合はProcfileを作成して対処すればOK
- 7. Goの組込みデータ型を整理した
- 8. Goでよく使われるgormを理解する:目次
- 9. Goでよく使われるgormを理解する:Query編
- 10. WSL&VScode&Go=permission denied
- 11. Go xlsファイルを読み取る
- 12. Goで開発していたが、途中でPythonに切り替えた件を振り返る。
- 13. 【Golang】ゴルーチン③バッファ、チャネル
- 14. Cloud FunctionsのHTTPトリガーをGolang + Echoでさばいてみた
- 15. gobot I2CでLチカ
- 16. aws-sdk-goを通してlocal-kmsを使う
- 17. git で日記を管理したい
- 18. 「Golang」 ×「Gorm」でシンプルに「Mysql」を操作する
- 19. GolangのWebAPIをsupervisorでデーモン化して公開する。
- 20. 【Golang】ゴルーチン②チャネル
golang dep にはまった
dep ensure -v
で数時間かかっても終わらないのでおかしいなと思ったら、
githubに登録したrsakeyにパスをつけていたことが原因だったっぽく、パスなしkeyを登録し直したら、1分で終わった。
ssh-agentも紹介してもらったけど、それを使えば大丈夫なのかは未確認。今度やってみよう。
【Go】コンテナを理解するためにコンテナを自分で”造る”【初心者】
#コンテナを理解するためにコンテナを自分で”造る”
今回は[こちら](https://youtu.be/Utf-A4rODH8)を参考にして自作コンテナを作ってみる。
#コンテナとは
詳しくは他の方の説明を受けてください。
#Goでコンテナを”造る”
##環境
今回は`VMware`で`Ubuntu`を稼働させ、`VM`上で造りました。
“`
Ubuntu 20.04 LTS 64-bitgo version go1.13.8 linux/amd64
“`##まずはコンテナのルートディレクトリとなるFile Systemを作る
`/home/rootfs`ディレクトリ下に今回のルートディレクトリとなる`File System(fs)`を作成します。
“`
/home/rootfs/
├── bin
├── lib
├── lib32
├── lib64
├── proc \\空のディレクトリ
└── sbin“`
`bin`,`lib`,`lib32`,`lib64`,`sbin`ディレクトリは`/usr`ディレクトリ
マイクロサービスでも使えそうなエラー処理を考えてみた
# 元ネタ
`考えてみた`といっても全くのオリジナルではなくて、GoogleさんのDeveloper PageのError Handlingみてたらこれ応用したら汎用的に使えそうだなという感じでつくってみました。
元ネタは以下のようなものです。
## Pattern.1 Cloud API
ref. https://cloud.google.com/apis/design/errors
jsonだとこのようになります。
codeにHTTP Status
statusにgRPCのステータス
messageにエラーの内容
詳細は配列で複数記載できる様になっています“`json
{
“error”: {
“code”: 401,
“message”: “Request had invalid credentials.”,
“status”: “UNAUTHENTICATED”,
“details”: [{
“@type”: “type.googleapis.com/google.rpc.RetryInfo”,
..
【Golang】ゴルーチン④range,close
#【Golang】ゴルーチン④range,close
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main//channelのrangeとclose
//結果を随時出力import (
“fmt”
)func goroutin2(s []int, c chan int) {
sum := 0
for _, v := range s {
//全部足す
sum += v
//すぐに送る
c <- sum } //終わったらchannelを閉じる //これ以上ない時は閉じる //閉じないと、中身以上取り出そうとしエラーになる close(c) } func main() { s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //実質1つしか入らないので、バッファは1でもいい c := make(chan int, len(s)) goroutin2(s, c) //go goroutine1(s,
【GCP】Cloud Functions の Go 1.13 でファイル構造に変更があった
## Cloud Functions Go 1.13 GA :tada:
GCF/Go 1.13 が GA になったので Go 1.11 から移行してみた。しかし、デプロイに失敗するようになった。
https://cloud.google.com/functions/docs/release-notes#May_28_2020
## 原因
コード内で設定ファイルを読み込むようにしていたが、GCF/Go 1.13 からファイルの構造が変更され読み込みエラーが起きてしまった。
## 調査
どのようにファイルの構造が変更があったのか調べたところ、ファイルの構造を調査したリポジトリを発見。
https://github.com/bcollard/find-go-cloud-function
どうやら、静的ファイル保存ディレクトリは以下に保存されるようだ。
`/workspace/serverless_function_source_code/`ファイル構造について、公式ドキュメントでは見つけることはできなかった。
## 対応
コードの静的ファイルを指定している箇所を下
【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