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

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

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

元記事を表示

利用Golang Colly, Goquery的yahoo股票台灣股市爬蟲

– [0. Intro](#0-intro)
– [1. Sample Code](#1-sample-code)
– [2. 聊聊細節](#2-%e8%81%8a%e8%81%8a%e7%b4%b0%e7%af%80)
– [2.1 Colly Basic & Queue](#21-colly-basic–queue)
– [2.2 SSL Ignore](#22-ssl-ignore)
– [2.3 Cookie](#23-cookie)
– [2.4 Domain Limit & filter](#24-domain-limit–filter)

## 0. Intro

雖然golang已經內建http讓engineer可以快速的搭配[Goquery](https://github.com/PuerkitoBio/goquery)來應付爬取回來的網頁,不過我還是喜歡[Colly](https://github.com/gocolly/colly)的優雅XD

下面的範例我們將會有綜合範例來講解透過Colly的queue機制來將想爬的網頁優雅的爬回來,再透過Coll

元記事を表示

有趣的golang switch statement

– [0. switch statement basic](#0-switch-statement-basic)
– [1. multiple case expressions](#1-multiple-case-expressions)
– [2. non-constants case expressions](#2-non-constants-case-expressions)
– [3. fallthrough](#3-fallthrough)
– [4. type switch](#4-type-switch)

[本文同步Post在www.p0n2.net中](https://www.p0n2.net/2020/04/golang-switch-statement.html)

## 0. switch statement basic

先來個最常見的switch statement,可以用不同的case來判於所宣告的變數做判斷。
並且在預設情況下每個case最後會有break,執行完成後會直接跳出switch不會繼續向下執行。

“` go
switch fruit

元記事を表示

GoでHello World!表示させてみた

技術文章を書く練習&上長に書きますといった手前引けなくなったので投稿

主にこのドキュメントをもとに調査
https://github.com/astaxie/build-web-application-with-golang/blob/master/en/preface.md

# Goの特徴
– 静的言語
– 並行処理
– 高速なコンパイル
– etc…

このような特徴があるようだ。まずは手を動かすことが大事なので、詳細は次回以降に調べる。

# Dockerで手軽にgo環境を用意してみる

“`:Dockerfile
#ベースとなるgoのバージョン指定
FROM golang:1.14.3-alpine

#作業用フォルダの作成
RUN mkdir /go/src/practice

#作業用フォルダの設定
WORKDIR /go/src/practice

#カレントディレクトリの全ファイルをコンテナにコピー
COPY . /go/src/practice
“`

Goで開発するには`$GOPATH` を最初に指定しなければならない。`$GOPATH`というのは、

元記事を表示

goでターミナルから簡単に目的のウェブページに飛ぶツール作った

### 成果物

[![Image from Gyazo](https://i.gyazo.com/4fe94e15c423e6ffa6ec50f9ffa36b2b.gif)](https://gyazo.com/4fe94e15c423e6ffa6ec50f9ffa36b2b)

gifのようにするには以下のコマンド(alias貼らないと実用的じゃない)

“`shell
$ bookmark-go show | fzf | bookmark-go open
“`

### 課題感
– アクセスしたいウェブページへのアクセス方法がバラバラ(slackの履歴からやscrapboxのwikiページからなど)でブラウザで表示するまでに時間がかかる
– chromeの履歴

元記事を表示

GOPATHの指定

##GOPATHの確認

“`
$ go env GOPATH
/Users/project/to/path/go
“`

##環境情報を一覧表示

“`
$ printenv
TERM_SESSION_ID=w0t0p0:F236B887-2A99-432B-89EA-01570DC27639
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.q3WJE4aYYO/Listeners
LC_TERMINAL_VERSION=3.3.12
COLORFGBG=7;0
ITERM_PROFILE=Default
XPC_FLAGS=0x0
LANG=ja_JP.UTF-8
etc
“`

##GOPATHの指定

“`
ホームディレクトリに移動
$ cd ~
ファイルの詳細情報の表示
$ ls -la
-rw——- 1 user staff 7131 7 2 18:43 .bash_profile
-rw-r–r– 1 user staff 206 8 24 21:07 .bashrc

元記事を表示

[Go]文字列をhashにして数字として取得したい

何かしらの文字列からhashを作成する事はそんなに難しくないと思いますが
hashを数字として取得したい事があると思います。
そんな時には [hash/fnv#Sum32()](https://golang.org/pkg/hash/fnv/)が使用出来ます。

以下は「文字列を入力して特定の色typeを返す」サンプルです。

“`Go
package main

import (
“fmt”
“hash/fnv”
)

type COLOR uint32

const (
COLOR_RED COLOR = 0
COLOR_BLUE COLOR = 1
COLOR_GREEN COLOR = 2
COLOR_PURPLE COLOR = 3
COLOR_BROWN COLOR = 4
)

func (c COLOR) String() string {
switch c {
case COLOR_RED:
return “RED”
case COLOR_BLUE:
return “BLUE”
case COLOR_GREEN:
re

元記事を表示

[Go言語] Sliceを完璧に複製するには? (How to perfectly clone a slice?)

# 結論

“`go
b := append(a[:0:0], a…)
“`

# 解説

`a[:0:0]` は `a[0:0:0]` の省略で、 **Full slice expressions**(フルスライス式?)と言います。

* その構文

“`go
a[low : high : max]
“`

> 最初のインデックス(`low`) が `0`の場合、`a[: high : max]` に省略することができます。

注意:普通のスライス式 `a[0:0]` ですと、 `b` が `a` と同じメモリを使うことになります。

# おまけ

“`go
b := make([]T, len(a))
copy(b, a)
“`

OR

“`go
b := append([]T(nil), a…)
“`

でも複製できますが、

前者は、`nil slice` を `non-nil blank slice` に、

後者は、`non-nil blank slice` を `nil slice` に複製してしまう問題あります。

`ni

元記事を表示

Golang – Convert uint64 to a String

“`golang
// Ref: https://golangcode.com/uint64-to-string/

package main

import (
“fmt”
“strconv”
)

func main() {

// Create our number
var myNumber uint64
myNumber = 18446744073709551615

// Format to a string by passing the number and it’s base.
str := strconv.FormatUint(myNumber, 10)

// Print as string
// Will output: ‘The number is: 18446744073709551615’
fmt.Println(“The number is: ” + str)
}
“`

https://golangcode.com/uint64-to-string/

元記事を表示

GoでFireBase Dynamic Linksの作成

# GoでFireBaseDynamicLinksの作成

今回はFirebaseDynamicLinksを初めて触ったため、備忘録として記事を投稿します。
基本的には[公式サイト](https://firebase.google.com/docs/reference/dynamic-links/link-shortener)を確認すれば実装できそう。

## FirebaseDynamicLinksとは
FirebaseDynamicLinksとは、Twitter等のシェアメッセージをタップした際に、
アプリをインストールしているユーザは直接アプリを開き、
アプリをインストールしていないユーザはWeb等を開くためのリンクを生成する機能。
詳細は[公式サイト](https://firebase.google.com/docs/reference/dynamic-links/link-shortener)をご確認してください。

## 今回使用したパラメータ
今回は以下のパラメータを使用

|パラメータ|詳細|
|—|—|
|domainURIPrefix|Firebaseコン

元記事を表示

色々な言語でファイルIOを競って速度比較

複数のプログラミング言語で約 1GB の CSV ファイルを Read/Write して時間を測定してみました!

# 共通ルール

– どの言語でも同じファイルを使用して確認すること
– ファイルは一行ずつ読み散り、一行ずつ書き込むこと
– OSの差を無くすため、Docker Image は全て base(Ubuntu 18.04 LTS)を使用すること

# まずは結果

|言語|5回実行した平均タイム(秒)|
|:–|:–|
|C-lang|6.2962|
|C++|6.0538|
|C#|17.1798|
|Golang|10.3966|
|Java|21.0840|
|Python|32.6949|
|Ruby|30.7153|
|Scala|21.8364|

やっぱりC/C++がダントツで早い!!
次点でGo言語

# 実装サンプル

5年ぶりくらいにC++書いたので綺麗ではないと思いますが、一番早かったのでサンプルとして載せます。

他の言語でも以下の動作をベースとして実装しました。

– 5回実行した平均時間を計算
– 1行読んで1行書き込む

“`c
#inc

元記事を表示

OTHERカテゴリの最新記事