- 1. Golangによるパスワードの保存
- 2. Golang-構造体にあるパスワードなどのセキュリティ情報をログに出力しないようにする方法
- 3. Go言語のerrorにエラー情報を付けて分岐する。
- 4. Goでcrontabのようなツールを作ってデーモン化してみた
- 5. aws-sdk-goでcredentialを指定するには
- 6. wails v2でvueテンプレートを作った手順
- 7. Go言語のDB接続処理
- 8. Goでテストしてカバレッジ計測
- 9. GoでファイルのValidation方法など
- 10. Goのmonorepoで共通処理を利用する方法
- 11. Golang学習ノートDay1
- 12. 一年目Rubyエンジニアが一から学ぶGo言語 ポインタ編
- 13. go mod tidyの役割
- 14. Goでヒストグラムを描いてみた
- 15. gqlgen v0.16.0 で generating core failed: unable to load github.com/[username]/gqlgen-todos/graph/model エラー
- 16. Go言語のバージョン管理ツール[goenv]の導入
- 17. Goの日時フォーマットあれこれ
- 18. [Golang] [GCP] grpc-gatewayがbackend serverにX-Cloud-Trace-Contextヘッダーを渡す方法
- 19. Go言語で配列・スライスをなんでも受け取れる関数を作る
- 20. オブジェクト詰め替え対策の一つ — interface利用(golang)
Golangによるパスワードの保存
パスワードの保存方法として、
平文のパスワードを単方向ハッシュにかけて保存するのが一般的です。
ハッシュアルゴリズムには`SHA-256`、`SHA-1`、`MD5`等があります。
Golang は `crypto` パッケージで簡単に実装することが可能です。
以下、 `sha256` によるの実装例です。
“`go
//import “crypto/sha256”
h := sha256.New()
io.WriteString(h, “my password”)
fmt.Printf(“% x”, h.Sum(nil))
“`# より良い方法
大抵の場合は、暗号化時に使用されたハッシュアルゴリズムが上記のような公開されているものであることが原因で、かつ技術の進歩によりパソコンの計算力も上がり、ハッカーが`rainbow table`を使用することで上記の方法でハッシュされたパスワードをクラックすることが(時間的に)難しく無くなってきたのが現状です。
> `rainbow table` :ハッシュ結果(ダイジェスト)のデータベース
直接的な解決方法の一つは、自
Golang-構造体にあるパスワードなどのセキュリティ情報をログに出力しないようにする方法
—
title: Golang-構造体にあるパスワードなどのセキュリティ情報をログに出力しないようにする方法
date: 2022-02-27 17:20:48
categories:
– Programming
tags:
– Golang
– パスワード
– ログ
—構造体をログに出力する際に、パスワードとかのようなセキュリティ情報を出力したくない場合は、方法の一つは `構造体の埋め込み(Embedded)` 特性を利用することです。
構造体の埋め込みの形は、次のような形になります。
“`go
type 埋め込み構造体名 struct {
フィールド名 型名
フィールド名 型名
}type 構造体名 struct {
埋め込み構造体名
フィールド名 型名
}
“`以下のような例で説明しますと、
`RequestSanitized.Password` は `Request.Password` を上書きすることになります。
`Password` を出力したくなければ、あえて`RequestSanitized.Password` を
Go言語のerrorにエラー情報を付けて分岐する。
# この文章について
Go言語の`error`はシンプルで`errors.New(“エラーメッセージ”)`で生成することができます。その一方で、エラー内容に応じて分岐するには工夫が必要です。本記事ではGo言語の`error`でエラー内容に応じて分岐する方法を記載します。
例えば、ユーザ情報を取得するREST APIを作ったときに、
– ユーザが見つからないエラーの場合は、404レスポンス
– データベース接続時に不測のエラーがあった場合は、500レスポンスとしたいと思います。JavaやC#等であれば例外クラスのどれをキャッチしたかで判断できます。しなしながら、Go言語ではどちらの場合であってもシンプルな`error`とだけ変えるので判断できません。そこで判断できるように工夫をしましょう。
# 方法1:Sentinel Error
「Sentinel Error」という単語の和訳が分かりませんので、ここでは「Sentinel Error」と書きます。(知っている方がいましたら教えてください。)
これは`errors.New(エラーメッセージ)`をあらかじめ定義しておき、
Goでcrontabのようなツールを作ってデーモン化してみた
## crontabにGoを動かす処理を登録してみたが動かず
普段業務ではタスクスケジューラにcrontabを使用している。そのためGoでバッチ処理を管理するときも当然のようにcrontabで管理するものだと思っていたが、なぜかcrontabが動作せず、エラーログも残らないという現象に直面。調べてみても、Goをcrontabで実行しようとする人がおらず、代わりにGoのタスクスケジュールライブラリの紹介記事をいくつか発見したため、こちらで実装してみることにした。
## gocronを使用してタスクスケジューリングを行う
Goのタスクスケジュールライブラリはいくつか存在するようだが、
こちらで無限ループなどにして待ち状態を実装する必要がなさそうだったため、今回はgocronを採用。Goのバージョンは1.17.6
“`main.go
package mainimport (
“fmt”
“path/filepath”//”github.com/jasonlvhit/gocron”
“github.com/go-co-op/gocron”
“gith
aws-sdk-goでcredentialを指定するには
# 結論
`Credentials`を指定して、静的な値を入れる。> You can hard-code credentials in your application by passing the access keys to a configuration instance, as shown in the following snippet.
“`:go
aws.Config{
Region: aws.String(cfg.Region),
Credentials: credentials.NewStaticCredentials(
“AWS_ACCESS_KEY_ID”,
“AWS_SECRET_ACCESS_KEY”,
“TOKEN”,)
}
“`# 経緯
アプリケーションをデプロイする際に、dockerコンテナの環境変数と本番環境の環境変数が被っていた。
この環境変数は、ElasticSearchを使うにあたって必要だったので命名を変更。
`AWS_ACCESS_KEY_ID` => `ES_A_K_ID`
`AWS_SECRET_ACCESS
wails v2でvueテンプレートを作った手順
# 要約
wails v2でvueを使えるテンプレートを作った。[これ](https://github.com/woogea/wails_vue_template)
これはその時の作業記録# 動機
マルチプラットフォーム対応のデスクトップアプリケーションをgoで作りたかった。
できるだけ一つのプラットフォームで開発して、他は最低限の確認すればOKとしたかったため、ブラウザエンジン組み込み型にすることにした。
フロントのフレームワークはvueを使いたかったけど、v2には公式テンプレートが用意されていない。
すでにテンプレートを[作ってくれている人はいる](https://github.com/misitebao/wails-template-vue)けど、viteを使っていて慣れなかったのでnpmを使ったものを作ることにした。
あと、wailsの仕組みを理解するのにもいいかなと思った。# wails
比較的アクティブで、構成がシンプルで何をやっているかわかりそうな[wails](https://github.com/wailsapp/wails)を選択した。
v2がbeta
Go言語のDB接続処理
Go言語の公式の[DB処理チュートリアル](https://go.dev/doc/tutorial/database-access)を元にしていますが、DBをMySQLからSqlite3に変更、データの追加にトランザクションを利用するように変更しています。
## 構成
– Sqlite3 3.36.0
– go 1.17
– github.com/mattn/go-sqlite3 v1.14.11## DDLとDML
※Sqlite3の使い方については本件の本質ではないので割愛します。
### DDL
“`sql
CREATE TABLE album (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title VARCHAR(128) NOT NULL,
artist VARCHAR(255) NOT NULL,
price DECIMAL(5,2) NOT NULL
);
“`### DML
“`sql
INSERT INTO album
(id, title,
Goでテストしてカバレッジ計測
### はじめに
:::note warn
こちらはzennの記事の転載となります。
:::平下CTO@sweeepです。Go言語でのテスト方法やカバレッジ計測などをこちらをサンプルに解説します。→ [GoでファイルのValidation方法など](https://zenn.dev/hirac/articles/dc537f0786cae9)
本記事の内容です。
* Goのテスト
* テストのsetup/teardown
* カバレッジ計測
* テスト実行結果### Goのテスト
まずxxx_test.goというファイルを作成し、testingとassertをimportします(packageはテスト対象と同じ)。
“`Go:utils/file/file_test.go
package fileimport (
“testing”
“github.com/stretchr/testify/assert”
)
“`関数名にはTestXXXと先頭に[Test]をつけます。
“`Go:utils/file/file_test.go
func TestChec
GoでファイルのValidation方法など
### はじめに
:::note warn
こちらはzennの記事の転載となります。
:::平下CTO@sweeepです。Go言語でよく使うファイルのValidation方法などについて解説します。
本記事の内容です。
* ファイルサイズチェック
* ファイルのValidation
* ファイル拡張子からContentTypeへの変換
* 使い方
* 実行結果### ファイルサイズチェック
定義済みファイルサイズより大きければファイルサイズとエラーを返します。問題なければファイルサイズとnilを返します。
“`Go:utils/file.go
const (
MaxSize = 10 * 1024 * 1024 // 10MB
)var (
ErrFileSize = errors.New(“file size error”)
)func CheckFileSize(size int64) (int64, error) {
if size > MaxSize { // MaxSizeより大きい場合はエラー
return size, fmt.Error
Goのmonorepoで共通処理を利用する方法
### はじめに
:::note warn
こちらの記事はzennからの転載となります。
:::平下CTO@sweeepです。Go言語でのmicroservicesにおけるmonorepo構成と共通処理を利用する方法を解説します。monorepo構成での共通処理の利用を目的としています。
本記事の内容です。
* monorepoフォルダー構成
* utilsで共通処理
* 各microservice側での利用方法
* 実行結果### monorepoフォルダー構成
monorepo直下にutilsとsrc、src下に各microserviceを配置します。GCP/AWSのデプロイ関連フォルダーもmonorepo直下に置くことが多いと思います。monorepo直下で一括管理し各microserviceのバージョン管理やデプロイの管理がラクになります。
“`
.
└─ utils
| ├── file
| | ├── file.go
| | └─ go.mod
…
└─ src
| ├── aservice
| | ├── main.go
| |
Golang学習ノートDay1
# 学習動機
去年FBがMeta社名変更ということで、BlockChainGameやNFTといった仮想通貨関連のものがブームになった。
自分もいくつのBGCに参加しているところです。
※余談ですが、STEPNというゲームで毎日ジョギングするようになった。今後もメタバース、ブロックチェーンゲーム、NFTなどの仮想通貨関連のプロジェクトに
企業やユーザがどんどん入ってくるだろうと考えて、仮想通貨関連の技術を学ぼうと思います。# 目標
Go言語を使って、日本国内の取引所のAPIを利用した独自の仮想通貨取引サービスを開発する。
EC2を立ち上げ、サービスをデプロイする。
※AWS関連の知識も絶賛勉強中# Golang学習方向
Golangに関して、詳細はこちらのページで詳しく紹介されています。
↓↓↓↓↓↓↓↓↓↓↓↓↓
[Go言語(golang)とは? 特徴・できること・人気の理由について徹底解説](https://type.jp/et/feature/9445/#:~:text=Go%E8%A8%80%E8%AA%9E%E3%81%AF%E3%82%B3%E3%83%BC%E
一年目Rubyエンジニアが一から学ぶGo言語 ポインタ編
Webエンジニアとして実務でプロダクト開発に携わること約1年弱、バックエンドの技術としてはRuby(とRails)一本でやってきた私ですが、エンジニアとしてやっていくからには静的型付け言語の習得も必要だろうということでGoの学習を始めました。
そんな中でRubyには無かった機能や概念のうち、個人的に理解に時間がかかったものを備忘録も兼ねて整理していきたいと思います。
とりあえず第一弾ということで、今回はポインタについてです。# ポインタ事始め
最初に躓くと定番?のポインタです。Rubyでもポインタの概念が無いわけではないようですが、少なくとも私は今まで意識したことがありませんでした。
そもそもメモリやアドレスが何か?については、様々な記事でイラスト付きで分かりやすく図解されているため、ここでは割愛します。
私は下記の記事で理解を深めました。https://zenn.dev/ak/articles/1fb628d82ed79b#%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF
“`golang
var num int = 10
var ptr *i
go mod tidyの役割
[公式サイト](https://go.dev/doc/tutorial/getting-started)でgoの学習をしていてわからなかったことがあったのでメモ書きとしてまとめようとおもいます。
## go mod tidy
結論からいうと、モジュール管理していて使わなくなったり必要なくなったパッケージを削除するためのコマンドです。
実際に“`go mod“`コマンドを打って確かめてみましょう

「add missing and remove unused modules」と書かれています。
不足していたり、使われていないモジュールに良しなに対応してくれるコマンドみたいですね。
ちなみに、tidyは「几帳面」という意味なのでそれも覚えとくと役割も理解できると思います。短いですが、以上です。何か間違いがございましたら、ご教示いただ
Goでヒストグラムを描いてみた
こんにちは、wattakです。
[前回のGoCVの投稿](https://qiita.com/wattak777/items/5f961c47d33def14e36f) から間が空きましたが、画のヒストグラムを描いてみました。
## 考え方
### ヒストグラムの作成
なんてことはなく、
GoCV(OpenCV)が用意している CalcHist を呼ぶ、だけです。関数仕様は以下。
“`go
func CalcHist(src []Mat,
channels []int,
mask Mat,
hist *Mat,
size []int,
ranges []float64,
acc bool)
“`[GoCVの関数仕様](https://pkg.go.dev/gocv.io/x/gocv#CalcHist)
[OpenCVの関数仕様](https://docs.opencv.org/4.x/d6/dc7
gqlgen v0.16.0 で generating core failed: unable to load github.com/[username]/gqlgen-todos/graph/model エラー
## 要約
Go で GraphQL のサーバサイドのコードを生成してくれる [gqlgen](https://gqlgen.com/)。
2022/02/26 時点の最新版 v0.16.0 に Go のバージョン依存のバグがあり、go1.16 系の場合、公式サイトの [Getting Started](https://gqlgen.com/getting-started/) 通りにやるとエラーになる。
go1.17 系なら問題ない。go1.16 系で Getting Started 通りにやって
“`
go run github.com/99designs/gqlgen init
“`というコマンドを打ったとき
“`
generating core failed: unable to load github.com/[username]/gqlgen-todos/graph/model – make sure you’re using an import path to a package that exists
“`というようなエラーが出たら、生成された g
Go言語のバージョン管理ツール[goenv]の導入
## やること
Go言語のバージョン管理ツール [goenv](https://github.com/syndbg/goenv) を導入する
## 導入理由
プロジェクトによってGo言語のバージョンが異なったり、バージョンアップ対応する場合があると思うので、バージョン管理を行えるように導入する
## 環境
– OS: Ubuntu (18.04 LTS)
– Git
– Shell: bash or zsh**Ubuntu向けに記載しますが、 `apt` とか使わないのでMacでも手順同じはずです**
→調べたらMacは `brew install goenv` だけでもインストールできるらしい。## 導入手順
ホームディレクトリにgoenvをcloneする
“`sh
git clone https://github.com/syndbg/goenv.git ~/.goenv
“`goenvを読み込むためのPATHを設定する
“`sh
# bashの場合
echo ‘export GOENV_ROOT=”$HOME/.goenv”‘ >> ~/.bashr
Goの日時フォーマットあれこれ
# はじめに
Goの日付フォーマット、時間フォーマットは多言語と比べてユニークです。覚えるまでに少し時間がかかります。なので、ここでまとめてみました。## 年
| 文字 | 解説 |出力例|
|:-|:-|:-|
|2006|4桁の年|2000, 2022|
|06|下2桁の年|00, 22|~~~go
// 2022年の場合
fmt.Println(time.Now().Format(`2006`)) // 2022
fmt.Println(time.Now().Format(`06`)) // 22
~~~## 月
| 文字 | 解説 | 出力例 |
|:-|:-|:-|
|2|1桁または2桁の数字|1, 2, …, 10, 11, 12|
|_2|1桁または2桁の数字。先頭は半角スペース埋め|1, 2, …, 10, 11, 12|
|02|2桁の数字。先頭は0埋め|01, 02, …, 10, 11, 12|
|Jan|省略した月名。大文字小文字を区別する。| Jan, Feb, …, Nov, Dec|
|January|フルテキストの月名。大文字
[Golang] [GCP] grpc-gatewayがbackend serverにX-Cloud-Trace-Contextヘッダーを渡す方法
## やりたいこと
`grpc-gateway`がHTTP/1.1で受け取ったリクエストヘッダー`X-Cloud-Trace-Context`の情報を
BackendへgRPCで通信するときにも伝搬してBakend側で使用したい。## 想定しているアーキテクチャ

## grpc-gateway側の設定
muxを作成する際に、http headerを伝播するオプションをセット。
`runtime.WithIncomingHeaderMatcher()`を設定しない場合、header情報は伝搬されない。“`go
mux := runtime.NewServeMux(runtime.WithIncomingHeaderMatcher(matcher))
“``matcher`で伝搬したいheader
Go言語で配列・スライスをなんでも受け取れる関数を作る
## はじめに
`[]int` でも `[]string` でも、どのような型の配列でも、どのような型のスライスでも、引数として受け取れる関数を作りたいことがありました。
作ろうとしたら一筋縄ではいかなかったので、その方法を書き留めておきます。## 環境
“`zsh:terminal
% go version
go version go1.17.6 darwin/amd64
“`## 失敗例
はじめに、引数の型に `interface{}` を使うとなんでも受け取れるので `[]interface{}` を使えばどのような型の配列・スライスでも受け取れるだろうと思い、以下のコードを書きました。
“`go:main.go
package mainimport (
“fmt”
)func printElements(array []interface{}) { // []int や []string など、配列・スライスならなんでも受け取りたい
for _, e := range array {
fmt.Println(e)
オブジェクト詰め替え対策の一つ — interface利用(golang)
ORM層とdomain層とデータ受け渡しをする場合、オブジェクト詰め替えが頻繁に発生することで、以下のデメリット・不便が感じている:
– コーディング作業がめんどくさい
– 詰め替え漏れ故のバグ
– 詰め替え処理自体の処理コストはどうかとの心配これで試した対策の一つは interface利用のことです。
詳細はあとで…