技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

Go

GolangでCasbin~アクセス制御ライブラリ~【Go】

What is Casbin オープンソースのアクセス制御ライブラリ。 GoやJava、Node.js、PHP、Pythonなどをサポート。 What Casbin does subject(主語)、object(目的語)、action(行動)をベースとして柔軟に「許可」「不許可」を定義することができる。 RBAC(…

Cloud Pub SubをトリガーにしたCloud Functionsをデプロイする【Go】【GCP】

Cloud Pub/Sub Cloud Pub/Subは、GCPの環境を使って、手軽にPublisherとSubscriberを構成できる、Googleによるクラウドツールです。 概要については、こちらに記載していますのでご覧ください。 Cloud Functions Cloud Functionsは、GCPの環境を使って、手軽…

POSTなどの際、JSONの形式をチェックしつつも、bodyの指定は任意とする方法【Go】

Go

POSTでbodyの入力を任意としたいけど、JSONの形式がちゃんとあっているかエラーハンドリングしたい場合。 func decodeJSON(r *http.Request, dst interface{}) error { dec := json.NewDecoder(r.Body) return dec.Decode(dst) } create(w http.ResponseWrit…

SQLトランザクション【Go】

Goでのトランザクションの構築方法と、トランザクションの利用ケースについて触れます。 MySQLなどのデータベースにアクセスする際、Goではdatabaseパッケージを使うことができます。 databaseパッケージを用いてトランザクションを構築するには、Txを使いま…

実行時の関数名やファイルパス、行数を取得する【Go】

Go

runtimeパッケージのCallerを用いて取得することができます。 package main import ( "runtime" "fmt" ) func main() { pc, pwd, line, ok := runtime.Caller(0) fn := runtime.FuncForPC(pc) fmt.Println(pc, pwd, line, ok, fn.Name()) } runtime.Caller()…

Go × Cloud Functionsでメール送信機能を開発【Go】【GCP】【CI/CD】

概要 GoとCloud Functions、さらにSend Gridというメールサービスを使って、HTTPリクエストからメールを送信できる機能を開発します。 さらに、関数を記載したGithubリポジトリへmasterブランチへのマージがあれば、Cloud Funcitonsへデプロイして関数を更新…

validator【Go】

Go

ライブラリvalidatorを使って、structのバリデーションを行うことができます。 基本的な使い方は公式ドキュメントやQiitaの優良記事に譲るとして、ここでは備忘の意味も込めて、私が引っかかった点を紹介します。 ペアにしたフィールドのうち、全てが空にな…

Modules【Go】

Go

Goのversion 1.12以降では、$GOPATH/src以下のパッケージ管理を改め、go.modによって依存関係を管理できるようになりました。 まずは、Goのversionを確認し、必要に応じて最新化します。 $ go version $ brew upgrade go Modulesを試すには、下記コマンドに…

日付の範囲指定、月指定など - GoのSquirrelでの方法も紹介【MySQL】

日付の範囲を指定したり、7月だけといったように指定する方法を紹介します。 日付の範囲 // min ~ max WHERE <カラム名> BETWEEN min AND max // min ~ maxではない範囲 WHERE <カラム名> NOT BETWEEN min AND max 年、月、日の指定 // 年月日の指定 WHERE D…

dep パッケージの依存関係管理ツール【Go】

Go

depはパッケージのバージョン・依存関係管理ツールで、Node.jsでいうところのnpmにあたるものです。 go getコマンドでインストールする場合と異なり、同じプロジェクト内で安全に同じバージョンのパッケージを使うよう管理することができます。チームで開発…

command not foundと$PATH【Go】

パッケージをインストールして正しくcommandを入力しても実行できない場合、いわゆる「PATHが通っていない」状態かもしれません。 $ echo $GOPATH $ echo $PATH で、それぞれの環境変数を確認することができます。 $GOPATHはgoの作業ディレクトリです。ファ…

swaggoの導入【Go】【Swagger】

swaggoという外部パッケージを利用することで、Swaggerを使って作成済みのGoのソースコードからAPIドキュメントを作成できます。 install パッケージをインストールします。 $ go get github.com/swaggo/swag/cmd/swag APIに関する記述を規定のフォーマット…

SQLのタイムゾーンを設定する【Go】

SQLの時刻がUTC時刻になってしまう問題を解決します。 sql, err := sql.Open("mysql", "user:passward@/dbname?parseTime=true&loc=Asia%2FTokyo") このようにparseTime=trueに併せてlocを指定しないと、例えソースコード側でJST時刻を指定しても、sql接続時…

SQLによる取得結果をHas Manyの形で格納する方法【Go】

SQLの取得結果をHas Manyの形で格納したいことがあるかもしれません。しかし、SQLでのSELECTの結果は階層化されていないので、ソースコードでロジックを組んで組み立てる必要があります。 Goの場合、SQLの取得結果を1行ずつ処理できるrow.Next()があるので、…

SQLのNULL値に対応する(JSON定義の変更まで)【Go】

SQLのSELECTの結果がNULLを返し、それを何らかのデータに格納する場合、格納先のデータの型を特別なものに指定する必要があります。 NULLを返すSQLを使用する場合、次のコードはエラーになります。 type someModel struct { code int name string } func mai…

SquirrelでネストクエリをLEFT JOIN【Go】

Go

SQLビルダーのライブラリSquirrelです。SQL文の命令を、SQLの構文のようにGo言語によって記述することができます。 GitHub - Masterminds/squirrel: Fluent SQL generation for golang 使用方法は下記公式の案内に記載されていますが、 squirrel - GoDoc sou…

axiosでresponseデータのフィールドにアクセスする方法【Go】

クライアントとサーバーの通信を、クライアントではaxiosを用いる例です。 ユーザーに関する情報をサーバーでデータベースに保存しておき、 ログイン後のページで、そのデータを利用して表示を変えることを想定します。 例えば次のコードを見てみます。 goフ…

axiosでformの値を送受信する方法【Vue.js】【Go】

POSTまたはPUTのformデータをサーバーサイドに送信する際、 axiosでは、デフォルトでJSON形式にしてrequest payloadに乗せて送られます。 HTTP.Requestは次のようになっています。 POST /some-path HTTP/1.1 Content-Type: application/json { "username" : …

Cross-Originを許容してCookieを送受信する【Go】

フロントをVue (port :8081)で、サーバーをGo (port :8080)で実行した時、Safariは「開発」メニューから一時的にCross-Originの制限を無効にすることができますが、Chromeにはそれらしきものが見当たらず、Headerにセットすることにしました。備忘として残し…

TLS【Go】

TLSを使ったHTTPS通信を紹介します。 2015年にはGoogleがHTTPS通信を行うサイトを、検索結果において優遇すると宣言したように、どのサイトでもTLSを用いたHTTPS通信が要求される時代です。 証明書、秘密鍵の生成 TLSを使用するには、その方式で使われる証明…

Cookieに使える、base64エンコード【Go】

Go

CookieにJSONの内容を格納する際などは、base64を用いて事前にエンコードし、Cookieから取り出した後にデコードします。 Cookieには許容されない文字を使うと、Cookieにそもそも登録できない、または異なるValueの値が登録されてしまうからです。 func main(…

MySQL - invalid memory address or nil pointer dereference【Go】

複数の関数で、DBコネクションを使い回す場合には、注意が必要です。 dbだけでなく、sql.Open()の返り値に含まれるerrもpackageグローバルに定義して、 sql.Open()の返り値のアサインは「:=」ではなく、「=」を使用します。 var db *sql.DB var err error //…

MySQL【Go】

インストール sql-Driverごとにpackageをインストールする必要があります。 $ go get -u github.com/go-sql-driver/mysql import database/sqlは、コード中で使用するものの、mysqlについてはプログラムの起動処理には使われますが、コード中では使用しない…

コマンド【Go】

著者が初めて使用する度に書き加えていくもので、網羅しているわけではありません。 単一ファイルの実行 $ go run main.go package mainが複数ファイルに分かれている場合の実行 $ go build $ ./<exe-name > // デフォルトのexe名は、project名 もしくは $ go build -o </exe-name>…

Sessionの期限更新と清掃【Go】

Go

処理を実行するごとにsessionの有効期限を更新し、ログアウト時に、他のユーザーに関するsession情報も含めて、 一定時間を超えたsessionを削除する機能を用意します。 過去の記事を基にしています。 Session【Go】 - 技術向上 bcryptでパスワードをhash化【…

bcryptでパスワードをhash化【Go】

Go

サードパーティのbcryptを使用します。 bcrypt - GoDoc シンプルな記述で暗号化でき、暗号の強度も数字や定数を指定するだけです。 暗号化 暗号化の対象(byte配列)とコスト(暗号の強度)を引数にとり、byte配列とエラーを返します。 bs, err := bcrypt.Ge…

Session【Go】

Go

Sessions、Users sessionの簡単な例をお見せします。 sessionsテーブルとusersテーブルを用いてユーザー情報を管理するイメージです。 sessionsテーブルのunique idをキーに、usersテーブルの情報を引き出します。 main.goです。 type user struct { // 各ユ…

Unique IDの生成【Go】

Go

サードパーティのパッケージを使用します。 GitHub - satori/go.uuid: UUID package for Go func main() { http.HandleFunc("/", index) http.HandleFunc("/read", read) http.Handle("/favicon.ico", http.NotFoundHandler()) http.ListenAndServe(":8080",…

Cookieの削除【Go】

Go

CookieにはMaxAgeという、有効期限を秒数で指定する属性があります。 Goでは、このMaxAgeにマイナス値か0を設定することで、対象のCookieを削除することができます。 func main() { ... http.HandleFunc("/delete", delete) // 「/delete」にアクセスしたらd…

Cookieの読み書き【Go】

Go

Cookieをセットし、Nameを指定してセットしたCookieを取得する例です。 func main() { http.HandleFunc("/", set) http.HandleFunc("/read", read) http.Handle("/favicon.ico", http.NotFoundHandler()) http.ListenAndServe(":8080", nil) } func set(w ht…