- 0.0.1. AtCoder Beginner Contest 177のメモ
- 0.0.2. Golangでバックエンドを実装する上での注意点
- 0.0.3. Goで関数の引数を可変にしてみる
- 0.0.4. AWSのRDSClusterの全インスタンスを自動でスペックUPDownするバッチ
- 0.0.5. ヤベ!うっかり怪しいページ開いてセキュリティアラート出ちまった・・をなんとかしたい
- 0.0.6. Goの依存パッケージ管理ツール dep と Go Modulesの違い
- 0.0.7. 利用Golang Colly, Goquery的yahoo股票台灣股市爬蟲
- 0.0.8. 有趣的golang switch statement
- 0.0.9. GoでHello World!表示させてみた
- 0.0.10. goでターミナルから簡単に目的のウェブページに飛ぶツール作った
- 0.0.11. GOPATHの指定
- 0.0.12. [Go]文字列をhashにして数字として取得したい
- 0.0.13. [Go言語] Sliceを完璧に複製するには? (How to perfectly clone a slice?)
- 0.0.14. Golang – Convert uint64 to a String
- 0.0.15. GoでFireBase Dynamic Linksの作成
- 0.0.16. 色々な言語でファイルIOを競って速度比較
- 0.0.17. [Go] 並列処理と非同期処理
- 1. 使うもの
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
Golangでバックエンドを実装する上での注意点
備忘録としてまとめる.何かの役に立てたら幸いです.
# Golang
## nilの意味
nullのこと.
SQLパッケージの場合は第二戻り値がerrかどうか返ってくるのでそれを使ってエラーハンドリングをする
[参考サイト](https://qiita.com/najeira/items/0bb0acdd7a71fc3f559b)## 変数の定義
> 定義には明示的な定義(var)と暗黙的な定義(:=)が存在[参考サイト](https://qiita.com/HiromuMasuda0228/items/65b9a593275f769f6b69)
## httpパッケージについて
`http.HandlerFunc`
関数の構造体.この定義によりhandlerの構造体を定義することなく関数を用意するだけでhandlerを書くことができる“`go
type HandlerFunc func(ResponseWriter, *Request)
“`
[参考サイト](https://qiita.com/nirasan/items/2160be0a1d1c7cc
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 mainimport (
“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
[Go] 並列処理と非同期処理
Goで並列処理。非同期処理を組み合わせた場合どう書く
使うもの
sync package (https://golang.org/pkg/sync/)
※ 非同期処理go routine
※ 並列処理コード
“`lang:go
package mainimport (
“fmt”
“sync”
“time”
)const (
MAX_EXECUTION_COUNT = 10 // 実行回数
CONCURRENT_COUNT = 5 // 同時実行数
)func main() {
fmt.Printf(“Start : %s \n”, time.Now())
res := make(chan string, MAX_EXECUTION_COUNT)
concurrent := make(chan string, CONCURRENT_COUNT)
defer close(res)
defer close(c
ポインタとは何か、初心者目線で解説してみた
業務でGO言語を扱うことになり、必死に勉強していたのですが、
ポインタが最初はなかなか理解できずに苦労しました。今回はそんなポインタとはなんぞやという方に向けて解説していきたいと思います。
※自分もまだまだ未熟なため、一部不適切な部分があるかもしれませんが、ご了承ください。
ポインタを理解するために抑えておくべき用語
・メモリ
・アドレス
・値渡し一応、さらっと用語について解説します。
#メモリとアドレス
メモリはデータを一時的に保存する場所ですね。
メモリに変数が格納され、変数に値が格納されています。
つまり、 メモリ<変数<値(文字列とか数値)という構造になります。メモリは広大な野原だと思ってください。
その野原に変数という名の箱がたくさん置かれています。
多すぎて、どれが何の箱なのかわかりません。
なので、箱ごとに住所をつけて管理をします。その住所がアドレスです。
“`main.go
a := “asfd”
fmt.Println(&a) // 0xc0
Go 再入門 – VSCode で環境構築
## 概要
半年ほど前から Go 言語の勉強を始めたのだが、何かと忙しく放置気味になってしまった。余裕ができたので久しぶりに VSCode を開いたものの、PC 交換時に環境移行を怠ってしまい、再び環境構築から Hello, world までやり直したのでその備忘録。今回は Mac での作業だが、Windows でもパスなどを随時読み替えれば OK。
## 前提条件
– macOS High Sierra 10.13.6
– bash 3.2.57(1)-release
– Homebrew 2.4.13
– VSCode 1.48.1## インストール
Homebrew 経由でインストール。
“`bash
brew install go
“`バージョンは記事の執筆時点で `1.15`。
“`bash
go version
go version go1.15 darwin/amd64
“`一応 Windows でもパッケージマネージャの Scoop 経由でインストールが可能。
## PATH 関連
### GOPATH
ソースコードや実行ファイル、
AWS API Gateway がリクエストヘッダーを小文字にしてしまう時の解決策 (golang)
ここ最近業務で API Gateway + Lambda を使った開発を行っており、API Gateway の振る舞いで注意しなければならない点を見つけたので、解決方法も添えて記事にしたいと思います。開発言語は Go言語です
## AWS API Gateway がリクエストヘッダーを小文字にしてしまう
– 今回使用するサンプルプログラムです
“`go
package mainimport (
“errors”
“fmt”
“log”“github.com/aws/aws-lambda-go/events”
“github.com/aws/aws-lambda-go/lambda”
“github.com/aws/aws-lambda-go/lambdacontext”
)type (
request = events.APIGatewayProxyRequest
response = events.APIGatewayProxyResponse
)// handler handles AWS Lambda execution.
func h