Go関連のことを調べてみた2022年03月04日

Go関連のことを調べてみた2022年03月04日

Goの静的解析ツールblahbrah

Goの静的解析ツールを作ったので紹介したいと思います。

## 作ったもの
– [blahbrah](https://github.com/granddaifuku/blahbrah)

### 何ができるのか
– タイトルにもある通り、Goの静的解析をしてくれます
– Brace( “{” や “}” )の前後にある空白行を検知することができます

次のコードを例に取ります。
突っ込み所はとてもありますが、一番気になる(?)のは、**レビューで指摘されそうな**、12行目や20行目に存在する空白行ではないでしょうか。
“`main.go
1 package main
2
3 import “fmt”
4
5 type cat struct {
6 name string
7 age int
8 }
9
10 func newCat(name string, age int) cat {
11 return cat{
12
13 name: name,
14 age: age,
15 }
16 }
17
18 func foo(a, b int) int

元記事を表示

0-1ナップサック アルゴリズム

# 何が書いてあるか。
0-1ナップサック問題[^1]のアルゴリズムのGo言語実装サンプル
[^1]: 重量を越えないような物の組み合わせのうち、価値が最大になるようにな組み合わせを求める問題。

“`go
package main
import (
“fmt”
“math”
)
type Kingyo struct {
weight int
kati int
}
func main(){
var N,x int
fmt.Scanf(“%d %d”, &N,&x)

kingyo:=make([]Kingyo,N)
for i:=0;i

元記事を表示

Go の API をフロントサイドから呼び出す

API 側に
“`go
http.Handle(“/”, http.FileServer(http.Dir(“static”)))
“`
“static” フォルダに html などを入れる。

## 詳しく
main.go に
“`go
http.Handle(“/”, http.FileServer(http.Dir(“static”)))
log.Fatal(http.ListenAndServe(“:8080”, nil))
“`
と書いた場合。(main.go があるフォルダ)/static に index.html を入れる。
“`
go run main.go
“`
などで実行すると、localhost:8080/ で index.html が表示される。
localhost:8080/test.html とかで static/test.html が表示される。

“static” フォルダは別フォルダにしても動く。”../test” とかでも問題ない。
“/” を “/top” にして localhost:8080/top にアクセスすると not foun

元記事を表示

Go言語のモジュール実装

モジュールの実装方法と実装したモジュールを利用したmainモジュールを実行するところをできるだけ簡略化して紹介します。

## モジュール用の作成

### モジュール用のディレクトリを生成

“`sh
mkdir greetings
cd greetings
“`

### モジュールの初期化

[go mod init](https://go.dev/ref/mod#go-mod-init)コマンドで現在のディレクトリをルートとする新しいモジュールを初期化(go.modファイルを生成)します。
※go.modファイルはまだ存在していてはなりません。

“`sh
go mod init example.com/greetings
# go: creating new go.mod: module example.com/greetings
“`

### モジュールの実装

“`go
package greetings

import “fmt”

// 大文字から始まる関数はpublic扱いになるので、Hello関数はimportしたモジュールから参照できます。
func

元記事を表示

golang-migrateチュートリアル(migration編)

#初めに
 golang-migrateのチュートリアルです。

#環境
PC:Mac(CPUはintel製)
Go:1.17.6 ←Goのver大事。versionは1.16以降をインストールしてください。
開発エディタ:Visual Studio Code

#ディレクトリ構成
“`shell:ディレクトリ構成
~/go/src/test $ tree
.
├── db
│ └── migrations
│ ├── 000001_create_users_table.down.sql
│ └── 000001_create_users_table.up.sql
├── docker-compose.yml
└── go.mod
2 directories, 4 files
“`

#go-migrateのインストール
“`shell:golang-migrateのインストール
brew install golang-migrate
“`

#事前準備
①DB用意
postgressを用意し、exampleという名のDBを作成する。
②環境依存情報

元記事を表示

Herokuでスクレイピングしようとしてハマったこと

## 初めに
Herokuでスクレイピングしてハマったことをまとめてみました。
記事ではGoとagoutiを使用していますが、Pythonとかにも当てはまると思います。
## invalid session id  エラーが多発
### 下記エラーが発生
“`
failed to retrieve page HTML: request unsuccessful: invalid session id
failed to retrieve page title: request unsuccessful: invalid session id
“`
### 対策
Chromeのオプションに`–disable-gpu`と`–disable-dev-shm-usage`を指定したら解消しました。
“`golang
options := agouti.ChromeOptions(
“args”, []string{
“–headless”,
“–disable-gpu”,
“–disable-dev-shm-usage”,
})
driver := agout

元記事を表示

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 main

import (
“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 file

import (
“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“`コマンドを打って確かめてみましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/69f3c0b7-0bd5-cf1a-bd6f-a9d533d02965.png)

「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

元記事を表示

OTHERカテゴリの最新記事