- 1. 【Golang】標準パッケージ regex
- 2. クリーンアーキテクチャを満たすための最低限の実装を考える
- 3. 【Golang】標準パッケージ ioutil
- 4. [AWSLambda] GoとRustでも連携がしたい
- 5. 忘却のgo
- 6. [Go] MacでGo言語環境構築
- 7. “Standard Go Project Layout” README.mdを読む
- 8. 複数バージョンのGoを扱う
- 9. 【Golang】標準パッケージ time
- 10. Golang ポインタを用いるメリット
- 11. Azure SDK for GoのGitHubのREADMEの日本語訳をv43.0.0に最新化
- 12. [Go] ファイルの読み込み方法
- 13. Go + Nuxt + GraphQLで簡単カンバンアプリチュートリアル on docker-compose(フロントエンド編)
- 14. Go + Nuxt + GraphQLで簡単カンバンアプリチュートリアル on docker-compose(サーバーサイド編)
- 15. gobuffaloのベーシック認証で401を返す最小の方法
- 16. ゴルーチン⑧DefaultとSelection
- 17. [golang] 並行起動した全 goroutine の終了を待ち受ける。(1 goroutine でエラー発生後、後続の goroutine 実行を止める。)
- 18. Go初心者がポインタ記号”*”と”&”の使い方をイメージしやすくするためのひとつのエッセンス
- 19. 【Golang】ゴルーチン⑦チャネルのセレクト
- 20. docker-compose でDBコンテナが起動してからAPIコンテナを起動したい。
【Golang】標準パッケージ regex
#【Golang】標準パッケージ regex
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//regex 正規表現
//URLなどによって処理を分岐させたい場合など、判定してプログラムを書くなどimport (
“fmt”
“regexp”
)func main() {
//MatchString
//正規表現のフォーマットに沿った文字列か確認し、True/Falseを返す
//aからはじまってeで終わる。間はa-zが1つ以上。数字も使う場合はa-z0-9にする。
match, _ := regexp.MatchString(“a([a-z]+)e”, “apple”)
fmt.Println(match)
//>>true//MustCompile
//上記と同じ。何度も使う場合は、最初に定義を宣言して使った方がいい
r := regexp.MustCompile(“a([a-z]+)e”)
ms := r.MatchString(“
クリーンアーキテクチャを満たすための最低限の実装を考える
# 概要
クリーンアーキテクチャは以下の五つを実現することができる。
しかしクラス図にはこれらを実現するために必須ではないものが書かれているので、最低限実現するために必要なものだけを考える。> 1. フレームワーク独立。アーキテクチャは、機能満載のソフトウェアのライブラリが手に入ることには依存しない。これは、そういったフレームワークを道具として使うことを可能にし、システムをフレームワークの限定された制約に押し込めなければならないようなことにはさせない。
2. テスト可能。ビジネスルールは、UI、データベース、ウェブサーバー、その他外部の要素なしにテストできる。
3. UI独立。UIは、容易に変更できる。システムの残りの部分を変更する必要はない。たとえば、ウェブUIは、ビジネスルールの変更なしに、コンソールUIと置き換えられる。
4. データベース独立。OracleあるいはSQL Serverを、Mongo, BigTable, CoucheDBあるいは他のものと交換することができる。ビジネスルールは、データベースに拘束されない。
5. 外部機能独立。実際のところ、ビジネスルールは、
【Golang】標準パッケージ ioutil
#【Golang】標準パッケージ ioutil
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main//ioutil
/*
osでも代用できるが、目的によって使い分ける。osはcdなどの一部にファイルの読み込みがある。ioutilは、ioに特化したパッケージ。パケットを読み込んで、書き出すなど。
ファイルの読み込みなど
############
I/Oとは、Input/Outputの略で「入出力」を意味しています。
コンピューターは情報を入力(input)し、計算結果を出力(output)するという処理を行なっていますが、これらの処理を総称してI/Oと呼んでいます。頻繁にデータの入出力が繰り返されることにより、ハードウェアやネットワークにI/O処理の負荷が発生することがあります。ハードディスクなどの記憶媒体に対するデータの読み書きについては「ディスクI/O」、ネットワークに対する入出力については「ネットワークI/O」と、I/O負荷の発生場所によって区別して表記すること
[AWSLambda] GoとRustでも連携がしたい
# [AWSLambda] GoとRustでも連携がしたい
新しいシステムをRustでがりがり書きたいけど、
Line BotのSDKはGoの方がライブラリやノウハウがあったりして、既存のGoリソースも使いたい。
そんなことありますよね。そんな時はGoとRustをそれぞれLambda Functionでデプロイして連携させてあげれば良さそうです。
(RESTなどで連携しても良いけど、Lambdaの方がちょっとだけ便利、かも)今回は環境構築とソースコードの連携部分について記載します。
ざっくり機能を書くとこんな感じです。(plantumlが欲しい。。)
|LINE|bot
go lambda||backend
rust lambda|frontend|
|—|—|—|—|—|
|—–> webhook|bot A
bot B|—–> lambda|echo
analyze||
||||get_shop|<-----
REST API|# プロジェクトとディレクトリ構造
今回はLine Bot
忘却のgo
使うたんびに毎回「あれ…」ってなってplaygroundで確認しなおす個人的事項をここに
でもどうせまた次も忘れて確認すんだろうな…### slice操作
https://github.com/golang/go/wiki/SliceTricks
大体ここで困らない### rand.Intn
0..引数で渡した値「未満」の値になります。関数のコメントに`0..n`って書いてあるからそりゃそうなんですが、`..n`はn未満で`…n`はn以下って割と忘れそうになる表現。“`go
rand.Seed(time.Now().UnixNano())
for i := 0; i < 10; i++ { fmt.Println(rand.Intn(2)) // 0 or 1 } ``` ### 空文字をsplit rubyだと空文字をsplitすると空配列が返りますが、golangは先頭の要素が空文字である1要素のsliceが返ります ```go str := "" result := strings.Split(str, "@") fmt.Println(re
[Go] MacでGo言語環境構築
## はじめに
Go言語の環境構築が色々と面倒だった
(特に`$GOPATH`とか`$GOPATH`とか`$GOPATH`とか)ので自分がやった手順をまとめました。
Macで環境構築しましたが、WindowsやLinuxの場合も参考になると思います。## 環境
* macOS 10.15.4 Catalina
* goenv 2.0.0beta11## goenvのインストール
[goenv](https://github.com/syndbg/goenv)はPythonでいうpyenvとかNode.jsのnodenvのようにバージョン切り替えができるようにしてくれます。
Homebrewでインストールすると`goenv`の古いバージョンがインストールされてしまったので、
[GitHubリポジトリに記載された方法](https://github.com/syndbg/goenv/blob/master/INSTALL.md)を採用しました。まずはリポジトリをクローン
“`bash
git clone https://github.com/syndbg/goenv.
“Standard Go Project Layout” README.mdを読む
# はじめに
Go初学者です。
Goのパッケージ構成に悩みGithubを調べると、ちょこちょこ見かけるこれ
[Standard Go Project Layout](https://github.com/golang-standards/project-layout)スター数は**1.5万超**です。
もしこれがGoなりのスタンダードであるならば、自身のパッケージ構成の参考になりそうですので調べてみました。
もちろん実際には各プロジェクトや利用用途、採用するデザインパターンなどによってはもっと扱いやすい形があるかもしれませんl
実際私もDDDが好みなので、導入する際はDomainでディレクトリを切り分けたいなと思っています。# Standard Go Project Layout is 何
以下のGithubリポジトリを指します。
[Standard Go Project Layout](https://github.com/golang-standards/project-layout)# Cloneして構造を確認
“`
$ find . | sed -e ‘
複数バージョンのGoを扱う
## 環境
OS: macOS Mojave Version 10.14.6
## 手順
[extra_versions](https://golang.org/doc/install#extra_versions)のまま。
### ソースのダウンロード
[extra_versions](https://golang.org/doc/install#extra_versions)を参照。
“`bash
$ go get golang.org/dl/go1.14
# 配布先は `~/sdk
$ go1.14 download
“`### 環境変数の変更
“`sh:~/.bash_profile
export GOPATH=$HOME/go
export GOROOT=$HOME/sdk/go1.14
export PATH=$PATH:/${GOROOT}/bin:${GOPATH}/bin
“`## その他
> GOROOT and GOPATH are environment variables that define this layout. GOR
【Golang】標準パッケージ time
#【Golang】標準パッケージ time
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
/*
https://golang.org/pkg/time/const (
ANSIC = “Mon Jan _2 15:04:05 2006”
UnixDate = “Mon Jan _2 15:04:05 MST 2006”
RubyDate = “Mon Jan 02 15:04:05 -0700 2006”
RFC822 = “02 Jan 06 15:04 MST”
RFC822Z = “02 Jan 06 15:04 -0700” // RFC822 with numeric zone
RFC850 = “Monday, 02-Jan-06 15:04:05 MST”
RFC1123 = “Mon, 02 Jan 2006 15
Golang ポインタを用いるメリット
## ポインタを用いることのメリット
1. ポインタを引数に渡すことで複数の関数間で同じオブジェクトを扱うことができ、そのオブジェクトに対して操作を行うことができる
2. ポインタは比較的に軽く(8byte=64bit)ただのメモリアドレスのため、ポインタを使って大きな構造体を引数に渡すことも可能になる。もし値渡しを行っていると、相対的にさらに大きなシステムリソース(メモリや時間)を毎回のコピーで消費することになる。そのためGolangでは構造体を渡す際はポインタを使うことが推奨されている
3. Go言語のchannel、slice、mapの3つの型はメカニズムを実現するポインタのようなものであるため、直接渡すことができ、アドレスを取得してポインタを渡す必要はない(注:もし関数がsliceの長さを変更する場合はアドレスを取得し、ポインタを渡す必要がある)
Azure SDK for GoのGitHubのREADMEの日本語訳をv43.0.0に最新化
Azure SDK for GoのGitHubのREADMEを日本語訳していたものを2020年6月2日にリリースされた[v43.0.0](https://github.com/Azure/azure-sdk-for-go/tree/v43.0.0)の内容で最新化しました。
– [GitHub – qt-luigi/azure-sdk-for-go-docs-jp: Microsoft Azure SDK for Goの日本語訳 (original: https://github.com/Azure/azure-sdk-for-go)](https://github.com/qt-luigi/azure-sdk-for-go-docs-jp)
初回の v8.0.1-beta 以来、今回で2回目の更新です。
この活動には元ネタがあって、以前 @ayatokura さんがVSCodeがリリースされる都度、リリースノートの日本語訳をGitHubに公開されていたのを見て「これはよいかも!」と私も始めてみたものです。
– [GitHub – ayatokura/JP-VSCode-Docs
[Go] ファイルの読み込み方法
ファイルの読み込む方法が色々あったので、まとめる
## 前準備: `sample.txt` の作成
https://www.lipsum.com/feed/html から:* 5 paragraphs
* 417 words
* 2777 byteの Lorem Ipsum 文字を取得し保存しておく。
この `sample.txt` を読み込んでいく## `ioutil.ReadFile` で一括読み込み
* シグネチャ: `func ReadFile(filename string) ([]byte, error)`
一番簡単に読み込める。
ただ、一度に全部読み込んでメモリに入れるので、ファイルが大きい場合にはお勧めしない。“`go
func main() {
data, err := ioutil.ReadFile(“./sample.txt”)
if err != nil {
log.Fatal(err)
}fmt.Println(string(data))
}
“`## `os.Open` 後に `ioutil.ReadAll` で
Go + Nuxt + GraphQLで簡単カンバンアプリチュートリアル on docker-compose(フロントエンド編)
## はじめに
* Go/Vue/GraphQL初学者が学習用にCRUD操作のできるアプリを作ってみた
* サーバーサイド編とフロントエンド編に分けてその手順を紹介
* ざっくりとした構成は
* サーバー(Go + gqlgen)
* フロント(Nuxt + Apollo)
* データベース(MySQL)
* ORM(gorm)
* 開発環境(docker-compose)## 完成イメージ
![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366929/a07236a8-2412-38fa-ade6-f112fc8fa786.gif)※ タスクの並び順は操作できません
## 関連リンク
* [ソースコード](https://github.com/MrFuku/kanban-go-nuxt-graphql)
* [サーバーサイド編](https://qiita.com/iPzYN2gLSV2HeSS/items/3062b753bde7e93085b1)#
Go + Nuxt + GraphQLで簡単カンバンアプリチュートリアル on docker-compose(サーバーサイド編)
## はじめに
* Go/Vue/GraphQL初学者が学習用にCRUD操作のできるアプリを作ってみた
* サーバーサイド編とフロントエンド編に分けてその手順を紹介
* ざっくりとした構成は
* サーバー(Go + gqlgen)
* フロント(Nuxt + Apollo)
* データベース(MySQL)
* ORM(gorm)
* 開発環境(docker-compose)## 完成イメージ
![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366929/a07236a8-2412-38fa-ade6-f112fc8fa786.gif)
※ タスクの並び順は操作できません## 関連リンク
* [ソースコード](https://github.com/MrFuku/kanban-go-nuxt-graphql)
* [フロントエンド編](https://qiita.com/iPzYN2gLSV2HeSS/items/d8d6bfebbbd0ef88a310)##
gobuffaloのベーシック認証で401を返す最小の方法
# 公式ページを基に実装すると
– こちらの[公式ページ](https://github.com/gobuffalo/mw-basicauth)を基に実装すると、失敗時にhttp500が返却される。
– 外部向けサイト等であれば、これで良いと思われる。
– 但し、社内システム等で、一回失敗するとブラウザ再起動だと面倒。# リトライ出来るようする
– 以下は例です。“`
auth := func(c buffalo.Context, u, p string) (bool, error) {
if u == “username” && p == “password” {
return true,nil
}else{
c.Response().Header().Set(“WWW-Authenticate”, `Basic realm=”Basic Authentication”`)
return false,c.Error(http.StatusUnauthorized, errors.New(“Unauthorized”))
}
}app.Use(basic
ゴルーチン⑧DefaultとSelection
#ゴルーチン⑧DefaultとSelection
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//Default Selection と for break
//for select ループから抜けるimport (
“fmt”
“time”
)func main() {
//time.Tick,After 時間のchannelを返す
tick := time.Tick(100 * time.Millisecond)
boom := time.After(500 * time.Millisecond)//名前はなんでもいい
OuterLoop:
for {
//3-1 あまり良くない例だが
//isBreak := false
select {
//1
//<- tick 変数がいらない場合はこのように書ける case <- tick: fmt.Println("1秒") case <- boom:
[golang] 並行起動した全 goroutine の終了を待ち受ける。(1 goroutine でエラー発生後、後続の goroutine 実行を止める。)
# お題
例えば、以下みたいな要件をgoで実装する時にこんな書き方にするかなと。> DBに書き込まれた「注文」情報を cron あたりで定期的に拾って、外部APIコールで「注文」をリクエスト。
> ただし、外部APIは同期でレスポンス返すのに平均 10 秒くらいかかる。
> 「注文」情報は随時DBに書き込まれ、なるべく早く外部APIコールで処理したい。goで作るアプリは cron で毎分ないし毎 3 分ぐらいな間隔で起動するとして、
1回の起動で(できれば、そのときDBに存在する全ての「注文」をさばきたいけど、仮に100万「注文」あったらマシン落ちるとかなると困るし)並行処理させる goroutine 数は制限する必要がある。
これは channel 使ったセマフォ制御がよく使われる。(使い方自体は別に大したことはなくて、いつも問題になるのは同時並行 goroutine 数をいくつにするか・・・。)
結局このあたりは、毎分ないし毎 3 分で実行する場合、本番の流量でどれくらいDBに「注文」情報が溜まっているかなど計測しながら随時調整していくのだろうけど。。。
(そして、アプリを
Go初心者がポインタ記号”*”と”&”の使い方をイメージしやすくするためのひとつのエッセンス
# はじめに
Go初心者が混乱しやすい`*`と`&`の使い方のイメージをしやすくするための考え方です。# 結論
そのエッセンスですが、
__`*`と`&`は、2つの記号で、3つの役割を持つ。__
ということです。※「そんなん知ってるわ!」という方ももちろんたくさんいると思いますが、私がGoを触りたての頃はこのイメージがちゃんとついておりませんでした・・・。
# どういうことか
`&`については、値が格納されているアドレスを取得する、という1つの役割を持っているのに対し、
`*`については、__型の前に付ける場合と変数の前に付ける場合で2つの役割を持っています。__
下のソースコードを見てもらうと、型の前に付く`*`と変数の前に付く`*`でそれぞれ別の役割になっていることがわかるかと思います。“`go:main.go
package mainimport (
“fmt”
)func main() {
var n int = 100
var n_address *int // *の1つ目の使い方。型の前に*を付与することで、アドレスの値を代入することができる。
【Golang】ゴルーチン⑦チャネルのセレクト
#【Golang】ゴルーチン⑦チャネルのセレクト
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//channelとselect
//selectを使った受信
//複数のチャネルを使った受信の分岐//マルチプロセスのよう
import (
“fmt”
“time”
)func goroutine1(c chan int) {
//無限ループを避ける場合、条件を決め、close()する
//下記、無限ループ
for {
c <- 100 //1秒 time.Sleep(1 * time.Second) } } func goroutine2(c chan string) { for { c <- "groutin2" time.Sleep(3 * time.Second) } } func main() { c1 := make(chan int) c2 := make(chan string) go go
docker-compose でDBコンテナが起動してからAPIコンテナを起動したい。
docker-composeを使ってapiサーバコンテナとDBコンテナを立てた際に、
起動時のDB接続でコケたので解決した経緯を書きます。## やりたい事
・docker-composeでdbコンテナとapiコンテナを同時に起動する
・apiコンテナ起動時に、db接続を行う
##今回のdocker-compose, Dockerfileは以下になります。
“`yaml:docker-compose.yaml
version: ‘3’services:
db:
image: mysql:latest
container_name: mysql_host
hostname: db_host
ports:
– “3306:3306”
# 初期設定
volumes:
– “./docker/mysql/my.conf:/etc/mysql/my.conf”
# 環境変数
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PAS