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

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

Gorm2.0でsqlMockに対応する

[Gorm2.0](https://gorm.io/ja_JP/docs/v2_release_note.html)がリリースされて早速アプデしたら、sqlMockへの対応が必要だったので、そちらを紹介します。

“`go

import (
“github.com/DATA-DOG/go-sqlmock”
“gorm.io/driver/mysql”
“gorm.io/gorm”
)

db, mock, err := sqlmock.New()

// 2.0以前
mockDB, err := gorm.Open(“mysql”, db)

// 2.0
mockDB, err := gorm.Open(mysql.Dialector{Config: &mysql.Config{DriverName: “mysql”, Conn: db, SkipInitializeWithVersion: true}}, &gorm.Config{})
“`

どなたかのお役に立てば幸いです。

元記事を表示

IdeaPad duet で開発環境を整える

# IdeaPad duet はイイぞ

普段メインマシンとして Macbook Pro 13 インチ を使ってるんだけど、持ち歩くにはちょっと重いからサブ機がほしいなと思っていたところに見つけたこちらの商品
Chromebook って今まで使ったことなかったけど Linux の環境が使えるということで買ってみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353538/7bec59be-c8c0-5d1e-b4b6-e0eb4675d931.png)

# 本題
せっかく Linux が使えるんだからとちょっとした開発環境を整えた
あえてログも残すのでうまくいかない人は参考にしてみてください

“`
$ uname -a
Linux penguin 5.4.40-04224-g891a6cce2d44 #1 SMP PREEMPT Tue Jun 23 20:13:49 PDT 2020 aarch64 GNU/Linux
“`

上の結果を見て分かるとおり、CPU のアーキ

元記事を表示

Goの開発環境構築[Windows]

VSCode+Goプラグインでの開発環境を構築しました:writing_hand_tone1:

##1. VSCodeのダウンロード
「VSCode」で検索し、普通にダウンロードしました。
こちらの記事で日本語化する方法を知りました。

[Visual Studio Codeで日本語化する方法[Windows]](https://qiita.com/nanamesincos/items/5c48ff88a4eeef0a8631)

##2. Goのダウンロード
[Goのサイト](https://golang.org/doc/install)からダウンロードしました。
ダウンロードの画面へ遷移したら、勝手にダウンロードが始まるようです。

まずはコマンドプロンプトで

“`
go version
“`
と入力します。

“`
go version go 1.15 windows/amd64
“`

と表示されたので、とりあえずインストールには成功していることが確認できました。

ここから、サイトの[Tutorial](https://golang.org/doc/tuto

元記事を表示

gorp利用環境下でバルクインサートしてみた

## この記事が解決する問題
gorpを利用している環境で、どうしてもバルクインサートしたいケース
ORMとしての利点を享受できないため、その部分許容できる場合にこの記事を参考いただければと思います。
gorpについては書いていないので下記を参照ください。
https://github.com/go-gorp/gorp

## コード
“`go
// ユーザ情報をバルクインサートする例
func bulkInsertUsers(tx *gorp.Transaction, users []User) error {
sql := `INSERT INTO users(name, age, email) VALUES`
args := map[string]interface{}{}
for i, user := range users {
nameKey := fmt.Sprintf(“name_%d”, i)
ageKey := fmt.Sprintf(“age_%d”, i)
emailKey := fmt.Sprintf(“email_%d”,

元記事を表示

Macの環境変数PATHを設定した話

Go をMacにインストールしたのだが、go -version と打っても
-bash: go: command not found となってしまう。

調べるとどうやらパスが通っていないようだ。

下記サイトを参考にさせていただきました。
https://qiita.com/Saku_Rito/items/7ac34960fb8caac9f85e
ホームディレクトリ内の.bash_profileか.bashrcで設定できるとのこと

.bash_profileに以下を追記。

export PATH=$PATH:/usr/local/go/bin

これで再起動して、再びgo -versionと打ってみる

go version go1.15 darwin/amd64 と表示された。

これでgo がインストールされたことが確認できた。

元記事を表示

gitlab の private repository を go get する

## TL;DR :pencil:

1. `read_api`と`read_repository`権限のついた、gitlab [Personal Access Token](https://gitlab.com/profile/personal_access_tokens)を作る
1. `~/.netrc`を作成

“`bash:~/.netrc
machine gitlab.com
login yourname@gitlab.com
password yourpersonalaccesstoken
“`
1. `go get`する

“`bash
GO111MODULE=on GOPRIVATE=gitlab.com/group go get gitlab.com/group/subgroup/hoge.git@v1.0.0
“`
1. container image や CI 内でやりたい場合ば、`.netrc`を`go get`する環境に渡してあげる

## Private reposito

元記事を表示

Goでセグ木を実装する

## Goでセグ木を実装する
#### はじめに
競プロでセグ木を使わないと厳しい問題がちらほらと出てきたので、セグ木を実装していきたいと思います。
c++で書かれているサンプルや解説はあるので、[そちら](https://tsutaj.hatenablog.com/entry/2017/03/29/204841)を参照されるといいと思います。~~ちなみに、このサイトのものをGo用に書き換えただけです。~~
今回実装するセグ木は、普通のセグ木と遅延評価セグ木です。
他のやつはそのうちやりたいと思います。

#### 何ができるか
まず、セグ木について、何ができるかというと、元となる要素n個の数列があったとすると、
1. 1要素の変更をO(logN)でできる。
2. [a,b)区間上の最小値や合計値をO(logNで)取得できる。(今回は、最小値)

次に、遅延評価付きセグ木は何ができるかというと、
1. [a,b)区間の要素に対する変更をO(logN)でできる。(今回は一律加算)
2. [a,b)区間の最小値や合計をO(logN)で取得できる。(今回は合計)

#### 実装(セグ木)

元記事を表示

GolangでTemplateファイルをバイナリに含めて配布する方法

# 概要
GolangでTemplateを使った場合、実行ファイルと一緒にテンプレートファイルを配布する必要があります。
Statikライブラリを使わずに実行ファイルだけ配布すると以下のようなエラーが発生します。

“`
panic: open ./hello_message.tmpl: The system cannot find the path specified.
“`

Statikライブラリを使うと実行ファイルのバイナリにテンプレートファイルも一緒にビルドして配布することができるので今回はサンプルを作ってやってみます。

## Statik設置
“`
$go get github.com/rakyll/statik
“`

詳細内容は以下のリンク参照
https://github.com/rakyll/statik

# サンプルコードでやってみる!

## Goプロジェクト生成
“`shell
$mkdir template_project
$ go mod init hello
$ vi hello.go
“`

## hello.go作成
“`go:

元記事を表示

Golang – How to Use ON DUPLICATE KEY UPDATE in GORM?

“`golang

data := &member{
Country: “TAIWAN”,
Id: “JOHNNY”,
}

db.
Table(“member”).
Set(“gorm:insert_option”, “ON DUPLICATE KEY UPDATE country = VALUES(country), id = VALUES(id)”).
Create(data)
“`

https://kotlin.tw/golang/gorm-onDuplicate

元記事を表示

Goのテストでset-upとtear-down

# 概要
go 1.14 からであれば「`TestMain`」を使うことができる

https://golang.org/pkg/testing/#hdr-Main

# サンプル

“`golang

package main

import (
“log”
“os”
“testing”
)

func TestMain(m *testing.M) {
log.Println(“Do stuff BEFORE the tests!”)
exitVal := m.Run()
log.Println(“Do stuff AFTER the tests!”)

os.Exit(exitVal)
}

func TestA(t *testing.T) {
log.Println(“TestA running”)
}

func TestB(t *testing.T) {
log.Println(“TestB running”)
}
“`

“`
2020/08/31 20:04:45 Do stuff BEFORE the tests!
2020/08/31 20:0

元記事を表示

ISUCON10に向けて、isucon9を行う

講評などを見ながら理解したものを備忘録的に残していきます。
(都度更新します)
参考:
http://isucon.net/archives/53916974.html
#新着・カテゴリ新着・ユーザごと新着商品
私の担当がSQL/アプリですので、こちらのインデックス問題、N+1問題に対して残して行きます
##インデックス不足
こちらはSQLでよく検索する場所に対して、インデックスを追加することで高速化にできます。
インデックス名の指定が必要ですが、インデックス名で実際に検索するわけではなく、SQLのカラム名で検索するときに有効です。

“`
INDEX “index名” (`”カラム名”`)
“`
で追加できます。
isucon9では、
webapp/sql/01_schema.sqlの場所に

“`webapp/sql/01_schema.sql
CREATE TABLE `items` (
`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY,
`seller_id` bigint NOT NULL,
`buyer_id`

元記事を表示

GoでPDFを画像に変換する

# はじめに

Go で PDF ファイルを1ページずつ画像に変換します。

変換の方法をいくつか調べてみましたが、内部で [ImageMagic](https://imagemagick.org/index.php) を利用する Go のライブラリ [gographics/imagick](https://github.com/gographics/imagick) が簡単そうでしたので、そちらを用いて実装しています。

# 事前準備

### ImageMagic のインストール

利用するライブラリ (gographics/imagick) が内部で ImageMagic を利用するために、あらかじめ ImageMagic をインストールしておく必要があります。

*例:macOS で ImageMagic をインストールする場合 (brew)*

“`shell-session
$ brew install ImageMagic
“`

### gographics/imagick のインストール
次にライブラリ (gographics/imagick) を利用するために

元記事を表示

【Go】net/httpパッケージでhandlerが二回実行される

# 問題
Goのnet/httpパッケージを使ってhttpサーバを立てると、リクエストを処理する関数が二回実行される。(一回で良いのに)

具体的には、下記のようなコードを実行して、

“`golang:main.go

package main

import (
“fmt”
“net/http”
)

func handler(w http.ResponseWriter, r *http.Request) {
fmt.Println(“handle”)
}

func main() {
http.HandleFunc(“/”, handler)
http.ListenAndServe(“127.0.0.1:8080”, nil)
}

“`
http://127.0.0.1:8080 にアクセスした後にページを更新すると、
![aaaaaaaaaaaaaaaaaaaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265053/73236038-9efc-871a-c73a-a137f

元記事を表示

「語尾に自動でやんすをつけてくれるアプリ」を作ってみた

[ポートフォリオや個人開発で使えそうなアイデア](https://qiita.com/MasatoraAtarashi/items/eec4642fe1e6ce79304d)

こちらで色々面白いアイディア並んでて何かできるかな・・と眺めてたけど
Webアプリが多くて出来そうにもない・・と、そこに光明の光が!w

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/88cdfb4a-6855-2de1-80b7-30bf40660d9d.png)

# つくってみたわ

![yannsu.gif](https://qiita-image-store.s3.ap-northeast-

元記事を表示

AtCoder Beginner Contest 177のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/abc177

# A

“`Q_A.go
package main

import (
“fmt”
)

func main() {
var D, T, S int
fmt.Scanf(“%d %d %d”, &D, &T, &S)
var time float64
time = float64(D) / float64(S)
var c string
Time := float64(T)
if time <= Time{ c = "Yes" } else { c = "No" } fmt.Printf("%s\n", c) } ``` # B ```Q_B.go package main import ( "fmt" ) func main() { var S string fmt.Scanf("%s", &S) var T string fmt.Scanf

元記事を表示

Golangでバックエンドを実装する上での注意点

備忘録としてまとめる.何かの役に立てたら幸いです.
(2020/08/30更新:typeについて)
# Golang
## nilの意味
nullのこと.
SQLパッケージの場合は第二戻り値がerrかどうか返ってくるのでそれを使ってエラーハンドリングをする
[参考サイト](https://qiita.com/najeira/items/0bb0acdd7a71fc3f559b)

## 変数の定義
> 定義には明示的な定義(var)と暗黙的な定義(:=)が存在

[参考サイト](https://qiita.com/HiromuMasuda0228/items/65b9a593275f769f6b69)

## httpパッケージについて

`http.HandlerFunc`
~~関数の構造体.~~ -> `func(ResponseWriter, *Request)`の別名
(`type`の意味を正しく理解していませんでした.)

この定義によりhandlerの構造体を定義することなく関数を用意するだけでhandlerを書くことができる

“`go
type Handl

元記事を表示

Goで関数の引数を可変にしてみる

# はじめに
Goの関数で可変引数を扱ってみたので軽くまとめてみます。

# スライスなし
まずはスライスを扱わないやり方です。
引数の合計を返す関数を作ってみます。

“`go
func main() {
x := sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
fmt.Println(“合計:”, x)
}

func sum(x …int) int {
fmt.Println(x)
fmt.Printf(“%T\n”, x)

var sum int
for _, v := range x {
sum += v
}
return sum
}
“`

実行結果はこんな感じになります。

“`
[1 2 3 4 5 6 7 8 9 10]
[]int
合計: 55
“`

もちろん引数なしでもOKです。

“`go
func main() {
x := sum()
fmt.Println(“合計:”, x)
}

func sum(x …int) int {
fmt.Println(x)
fmt.Printf(“%T

元記事を表示

AWSのRDSClusterの全インスタンスを自動でスペックUPDownするバッチ

# 概要
表題のバッチをGoで作りました。経緯としては今担当しているサービスが特定の曜日だけ負荷が非常に高まるというサービス特性がありました。Readerが重いだけならスケーリングを時限操作するだけで良いのですが、書き込みが捌けずWriterのスペックを上げる必要があります。Writerのスペックを上げるにはダウンタイムが発生するので人の少ない深夜帯に対応を行う必要があり、毎週深夜対応を行うのは現実的ではなく自動化する運びとなりました。RDSはAuroraのMySQLを使っていて、Writer1台,Reader2台の構成になっています。

# 処理の流れ
まずWriterのスペックを上げる流れとしてはReaderをスペックアップし、フェイルオーバー、その後もともとWriter立ったものをスペックアップするという流れになります。本質的にはこれだけなのですが、フェイルオーバーする際にサービスダウンが発生し、それをCloudWatchAlertで拾ってしまうのを避けたく、Alertのアクションを止めるという対応も入れます。

# 実装方針
DBのスペックアップもフェイルオーバーもAWS SD

元記事を表示

ヤベ!うっかり怪しいページ開いてセキュリティアラート出ちまった・・をなんとかしたい

# ウィルス対策製品ってなんなん?

 プログラミングで行き詰った時、海外ベンダー製品の仕様、知らない単語・・・
日々様々な目的で僕らはサーチエンジンで調査をします。その際に怪しいスクリプトが仕込まれたサイトを開いてしまってセキュリティアラートを出して情シスから入電喰らった事もあると思います。

### いや、絶対ありますよね?(瞬発力だけの推定)

実行ファイルで怒られるのは分かるんだ、だって確かに実行しようとしたもの・・

### でも、ページ開いたら怒られるのって注意しようがなくない?

DNSキャッシュポイズニングとかで**「XXXX人目おめでとうございます!YYが当選しました!!」**ページが開くやつとか。開く前に怪しいかどうかチェックできないと防ぎようがないじゃんよ。。

# つくってみたわ

元記事を表示

Goの依存パッケージ管理ツール dep と Go Modulesの違い

Go言語のパッケージ管理ツールのDepとModulesの違いについて調べた内容をここにまとめました。
少しでもご参考になれば幸いです。

# まず始めにGOPATHについて

Goを初めて触った頃に、困ったことがありました。それはパッケージの管理でした。
プライベートでの開発時のGOPATHの設定は`$HOME/go`して、参画していた案件に関しては`$HOME/hogehoge-project/go/`みたいな感じでGOPATHを分けていました。
分けていた理由としてはやはり依存しているパッケージのバージョンに違いなどがあったからです。

例えば

“`sh
$HOME/go/src/github.com
go
└── src
├── github.com
│   ├── my-github-repos
│   │   ├── csv_sample
│   │   ├── image_example
│   │   └── test_code
│   ├── codegangsta
│   │   ├── envy

元記事を表示

OTHERカテゴリの最新記事