- 1. 【Go言語】変数/関数の命名がイケてるかどうかチェックする静的解析ツールを作りました
- 2. Go で同じフィールドを持つ構造体を interface で定義する
- 3. GoアプリケーションをECSインスタンスにデプロイする方法
- 4. gqlgen + Gorm でUint型の場合エラーになる
- 5. GitHub ActionsのAnnotationにテスト内容を反映する
- 6. Gorm2.0でsqlMockに対応する
- 7. IdeaPad duet で開発環境を整える
- 8. Goの開発環境構築[Windows]
- 9. gorp利用環境下でバルクインサートしてみた
- 10. Macの環境変数PATHを設定した話
- 11. gitlab の private repository を go get する
- 12. Goでセグ木を実装する
- 13. GolangでTemplateファイルをバイナリに含めて配布する方法
- 14. Golang – How to Use ON DUPLICATE KEY UPDATE in GORM?
- 15. Goのテストでset-upとtear-down
- 16. ISUCON10に向けて、isucon9を行う
- 17. GoでPDFを画像に変換する
- 18. 【Go】net/httpパッケージでhandlerが二回実行される
- 19. 「語尾に自動でやんすをつけてくれるアプリ」を作ってみた
- 20. AtCoder Beginner Contest 177のメモ
【Go言語】変数/関数の命名がイケてるかどうかチェックする静的解析ツールを作りました
## Overview
自分は命名オタクで,適当につけられた変数名を見ることが耐えられません.自分のコードの変数名を入念にチェックする手間が省くためにも,変数名がイケてるかどうか静的解析で確認してやろう!と思い以下のようなツールを作りました.Githubリポジトリ: [NamingReview for Golang](https://github.com/yuya-okada/namingreview)
## インストール
“`
go get -u github.com/yuya-okada/namingreview/cmd/namingreview
“`## 使い方
対象のGoプロジェクトのディレクトリ内で以下を実行.“`
go vet -vettool=${which namingreview}
“`## 仕組み
[The Online Plain Text English Dictionary](http://www.mso.anu.edu.au/~ralph/OPTED/)というオンラインの辞書から英単語の品詞データをスクレイピングしました.また
Go で同じフィールドを持つ構造体を interface で定義する
Go の interface は、メソッドを定義することはできるが、フィールドを定義することはできない。
代わりに Getter(必要に応じて Setter)を定義して同じフィールドを持つことを保証する。“`go
type Animal interface {
GetName() string
}type Dog struct {
Name string
}func (d *Dog) GetName() string {
return d.Name
}type Cat struct {
Name string
}func (c *Cat) GetName() string {
return c.Name
}func greet(animal Animal) {
fmt.Printf(“Hello, %s!\n”, animal.GetName())
}
“`フィールドにアクセスする必要すらない場合は空のメソッドでもいい。
“`go
type Animal interface {
animal()
}type Dog s
GoアプリケーションをECSインスタンスにデプロイする方法
今回は、**Alibaba Cloud ECSインスタンス**に**Goアプリケーション**をデプロイする方法を紹介します。
*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/deploying-a-go-application-to-an-ecs-instance_594790)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*
前回の記事では、ローカルJavaアプリケーションをAlibaba Cloud ECSインスタンスに直接デプロイする方法を紹介しました。今回は、Alibaba Cloud [Elastic Compute Service (ECS)](https://www.alibabacloud.com/ja/product/ecs) インスタンスに Go アプリケーションをデプロイする方法を紹介します。
#アプリケーションをローカルに開発する
クラウド上で動作するGoアプリケーションをコンパイルしても、ローカルで動作するGoア
gqlgen + Gorm でUint型の場合エラーになる
# 今回のお題
gqlgen + Gorm を使った時にUint型のカラム値を返却する時に、型エラーが発生しうまくデータ取得できなかったので、その解消方法を記載します。## 定義したモデルの構造体
“`db_model.go
package db_modelimport (
_ “github.com/jinzhu/gorm/dialects/mysql”
“time”
)type User struct {
ID uint32 `gorm:”primary_key;AUTO_INCREMENT;”`
Name string `gorm:”size:255″`
Password string `gorm:”size:255″`
Email string `gorm:”size:255″`
CreatedAt time.Time `gorm:”column:created_at;type:datetime;”`
UpdatedAt time.Time `gorm:”column:updated_a
GitHub ActionsのAnnotationにテスト内容を反映する
## Annotationなるもの
GitHub Actionsでworkflowを開くとAnnotationsという欄があって、テスト結果とかが表示されるのですが、例えば漫然と`go test`を実行すると`Process completed with exit code 1.`しか出てこないんですね。ちゃんとテスト内容について言及してほしい。
## Problem Matcher
https://github.com/actions/toolkit/blob/master/docs/problem-matchers.md
このProblem Matcherという機能を使うと、ステップ毎のログをスキャンして、正規表現にマッチしたものをannotationに変換してくれるようです。“`
$ go test
— FAIL: TestGcdNegative (0.00s)
math_test.go:22: failed
FAIL
exit status 1
FAIL _/home/username/src/actions-playground 0.0
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
https://stackoverflow.com/questions/6030071/mysql-table-insert-if-not-exist-otherwise-update
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 mainimport (
“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