- 1. goss を使ったサーバ構築のテスト
- 2. フォルダごとに分かれている画像を一箇所に集める
- 3. 今更ながらGo言語を触ってみた(GO 1.13.6)
- 4. Go makeとnewの違い
- 5. golangの名前付き戻り値に関して
- 6. 速習 Go + Clean Architecture
- 7. Go言語でレトロな感じの2Dゲームを作る
- 8. Go log
- 9. go ファイルの読み取り
- 10. 【Golang – goroutine(ゴルーチン) 】for – select パターン 例
- 11. Go for文の”_”の使い方
- 12. AtCoder Beginner Contest 151 参戦記
- 13. golangで標準入力
- 14. k8sとAPI Gateway(Ambassador)を用いたコンテナ管理
- 15. AtCoderのコンテストをスクレイピングして自動的にGoogleCalendarに追加する
- 16. AtCoder Beginner Contest 152 参戦記
- 17. Go歴0日だけどGo/beegoでSDK使わずにLINEBot作ってみる
- 18. Goでduを高速化してみた
- 19. 1時間でできるMP3音楽を再生するCLIツールを作成する
- 20. GoのGinでハンドラーに引数を渡したいとき
goss を使ったサーバ構築のテスト
# はじめに
以前 [InSpec でデプロイを自動テスト化する] という記事で InSpec というテストフレームワークの紹介をしましたが、最近 goss という Go 言語製のテストフレームワークを使い始めたのでそのご紹介です。
# goss とは
[goss] は YAML でテストケースを記述し、その内容に従ってテストを実行できるフレームワークです。
## 特徴
– シングルバイナリなのでライブラリのインストールなどが不要
– 記述が YAML なので覚えることが少ない
– 速い## goss でできるテストの例
goss を使えば下記のようなことがテストできるようになります。
– ファイルが存在するか
– ファイル属性は正しいか
– プロセスやサービスは起動しているか
– パッケージはインストールされているか
– HTTP レスポンスのヘッダやボディは正しいか# インストール
開発用途の環境に入れるのであれば下記でインストールできます。
“`shell
$ curl -fsSL https:
フォルダごとに分かれている画像を一箇所に集める
最近業務で画像のデータを使って〜する場面があったのですが、サーバー上にある画像がフォルダごとに分かれてしまっていたり、階層もばらばらだったりと不便だったので、ちょっとした効率化ツールを作ってみました。
使っているのはGo言語です。
# ソースコード
“`Go
package mainimport (
“image”
“image/jpeg”
“image/png”
“log”
“os”
“path/filepath”
)const imgQt int = 60
func main() {
// 実行ファイル直下のパスを取得
path, _ := os.Getwd()
dataPath := filepath.Join(path, “data”)
dataAllPath := filepath.Join(dataPath, “*”)list, _ := filepath.Glob(dataAllPath)
var textList []string// 画像を1枚づつ読み込む
for _, item := range list {
今更ながらGo言語を触ってみた(GO 1.13.6)
# Go言語を触りたかったきっかけ
kubernetesを構築・活用しているうちにカスタマイズしてみたい衝動があり、
Go言語でのみカスタマイズが出来ることと
軽量のWebApiを構築することが多々あり普段はPythonで実装していたが、
この際なのでGo言語を触ってみることにしました。
と言っても実務があるので、学習期間は3日しかありませんでしたが・・・。## で、作ってみたもの
簡単にwebサーバーを立ち上げれるフレームワークを実装してみました。
内容的には下記のリンク先のREADMEにも記載していますが、
yamlファイルに諸々設定することでwebサーバーが起動します。
ビジネスロジックに集中出来るようにこのフレームワークを実装しています。[httprouter_wrapper](https://github.com/ncs-nozomi-nishinohara/httprouter_wrapper)
## 躓いた点
`map[string]interface{}`の仕組みがいまいちわかりづらかったです。
`map[string]interface{}`からval
Go makeとnewの違い
###makeとnewの違い
違いはポインタを返すかどうか
make → ポインタを返さない
new → ポインタを返す
“`main.go
package mainimport(
“fmt”
)func main(){
var p *int = new(int)
fmt.Printf(“%T\n”, p) => *ints := make([]int, 0)
fmt.Printf(“%T\n”, s) => []int}
“`
golangの名前付き戻り値に関して
名前付き変数は[tour of go](https://tour.golang.org/basics/7)で紹介されているように、関数の最初で変数宣言したのと同様になる。
この時、nameの変数のスコープは`fugafuga()`に対して関数渡しで渡した関数から参照できるため、下記コードは問題なく動く。
“`go
package mainimport “fmt”
func fugafuga(f func() error, logger func(err error)) error {
f()
return nil
}func hogehoge() (name string, err error) {
fugafuga(func() error {
name = “test”
return nil
},
func(err error) {
})
return
}func main() {
n, _ := hogehoge()
fmt.Println(n)
}
“`出力結果
“`console
$ go run main.go
速習 Go + Clean Architecture
## 概要
Go 言語 + Clean Architecture を必要に迫られ勉強した。緊急だったので、Clean Architecture の概念をなめて、ネット上に散らばるソースコードを読んだ。が、ぶっちゃけよく分からなかったので、自分で書いてみた。3週くらいして、なんとなく分かった。気がする。今回の学習のゴールは、チームのメンバー(同じく未経験)が理解できて、実装時に設計思想からはみ出ないようにすること。細かいことは抜きにして、読んでコピペすれば、何とかなる程度まで行ければ、細かい話はレビューで潰せば良い。という感じ。
Go も Clean Architecture も初めてな上、設計・実装からも遠ざかっていたので、理解に時間がかかった。完全に理解しているとは言い難いが、いちおうメモとして残しておく。実装は割と楽しかった。
## 作るもの
– go, clean architecture, net/http, gorm な REST API群
– 2 系統の CRUD API(User, Property)
– 2 系統の DB(MySQL, PostgreSQL)
Go言語でレトロな感じの2Dゲームを作る
# はじめに
昔Qiitaに、[Go言語で作るマリオ風2Dゲーム](https://qiita.com/KMim/items/aebb9d7a9116bf6294b3)という記事を書きました。これを発展させる形で、昨年の中頃から会社の友人何人かと一緒に、Golangを使ってゲームを作り始めました。私が昔、[洞窟物語](https://forest.watch.impress.co.jp/library/software/doukutsu/)などのシンプルな2DのRPGゲームが好きだったこともあり、レトロさや手作り感を感じられるようなゲームの開発を目指してきました。最近になってこのゲーム開発の活動が停留してきたので、この記事でとりあえず現在までで出来たものをまとめてみます。
[Githubのリポジトリはここ](https://github.com/KMimura/RPGGame)です。
# 今のところ出来たもの
出来たもののgifをいくつか貼ります。背景画像およびプレーヤー画像などは仮にフリーの素材を用いたものであり、いずれはかっこいいものを自作したいと思ってます。![fir
Go log
logを学んだのでまとめておきます。
logのパッケージを使って出力すると
生年月日や時間が出力されます。
“`main.go
package mainimport “log”
func main(){
//logを出力
log.Println(“hello”)//型や値を出力
log.Printf(“%T %v”, “hello”, “hello”)//コードが終了する
log.Fatalln(“hello”)
}
“`現時点で学んだ内容をまとめました。
随時更新していきます。
go ファイルの読み取り
Goでファイルの読み取り方法を学んだのでまとめておきます。
“`main.go
package mainimport(
“fmt”
“os”
)func main() {
//file変数にファイルのデータを代入
//ここではエラーは空白に
file, _:= os.Open(“ファイル名”)//ファイルのクローズを最後に行うためのdefer
defer file.Close()//バイト配列を作成
data := make([]byte, 100)//バイト配列にファイルのデータを読み込む
file.Read(data)//バイト配列に格納されたデータを出力
//バイト型になっているので、string()で文字列に型変換を行う
fmt.Println(string(data))
}
“`
【Golang – goroutine(ゴルーチン) 】for – select パターン 例
# 概要
Golangにおけるゴルーチンのfor-selectパターンを実装してみました。
基本的には、チャネルを介してゴルーチン内外でデータのやり取り、エラーハンドリング、終了処理についての例を実装しています。処理の流れは、
1. ゴルーチン外部から、チャネルを介して文字を挿入(“1”, “bad0”)
2. ゴルーチン内部で、チャンネルから得た文字を数字に変換(エラーかどうか場合分けして、結果をresultに挿入)
3. ゴルーチン外部から、doneをcloseすることで、ゴルーチンが終了し、それに伴いresultチャネルもcloseされる。
4. ゴルーチン外部で、resultを取得していたforが終了する。# 実装
以下にプログラムと結果を示します。
“`go
package mainimport (
“fmt”
“strconv”
“time”
)type Result struct {
Error error
Response int
}func doSomething(done <-chan interface{}, print
Go for文の”_”の使い方
golangのfor文を勉強していて
“_”の意味を理解したのでまとめておきます。
結論から言いますと
**インデックス番号を表示する必要がない場合に**
**”_”を使います。**“`main.go
package mainimport “fmt”
func main(){
//スライス作成
l := []string{“jave”, “python”, “go”}//インデックス番号とスライスの要素を表示
for i:=0; i < len(l); i++{ fmt.Println(i, l[i]) } //スライスの要素だけを表示 for _, v := range l{ fmt.Println(v) } //"_"を使わずに要素を表示させようとすると for v := range l{ fmt.Println(v) } //インデックス番号が表示される //"_"でインデックス番号を埋める必要がある //map作成 m := map[string]int
AtCoder Beginner Contest 151 参戦記
# AtCoder Beginner Contest 151 参戦記
## ABC151A – Next Alphabet
1分半で突破. 書くだけ.
“`python
C = input()print(chr(ord(C[0]) + 1))
“`## ABC151B – Achieve the Goal
4分で突破. 書くだけ.
“`python
N, K, M = map(int, input().split())
A = list(map(int, input().split()))t = sum(A)
if N * M > t + K:
print(-1)
else:
print(max(N * M – t, 0))
“`## ABC151C – Count Order
7分半で突破. AC 後の WA は無視しないといけないところだけを気にすればよい.
“`python
N, M = map(int, input().split())ac = [False] * N
wa = [0] * N
for _ in ran
golangで標準入力
###基本的な標準入力の方法
Go言語で標準入力を行う方法をまとめておきます。
paizaのスキルチェックに標準入力は必須です。
“`
package mainimport (
“bufio”
“fmt”
“os”
)func main(){
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
ucl := scanner.Text()
fmt.Println(ucl)
}
}
“`
k8sとAPI Gateway(Ambassador)を用いたコンテナ管理
こんにちは。kwashiです。SPAによるフロントエンドと、APIサーバの組み合わせで構築したシステムを実装したので紹介します。前職で、モノリシックなシステムに、大規模な機能を追加して苦労したため機能や構成の分離を意識して実装しました。もし、Ambassadorやk8sのマニフェストを参考にしたい場合は、記事の後半に書いています。
※ 実装したシステムは、何らかのサービスを提供する仕様ではなく、技術的な検証・ポートフォリオを目的として作成しました。
SPAは、サーバーサイド側でのHTMLレンダリングを行わず、サーバーサイド側の役割をAPIサーバーに徹底させるために用いています。各APIはサービスごとにコンテナ化することで分離し、コンテナ管理ツールで各サービスを管理することで、スケーリングやデプロイが容易にできるようにしています。また、各APIへのトラフィックをルーティングするためAPI Gatewayを使用しています。
上記のような構成にした場合、認証機能をAPIサーバーとフロントエンド両方でセキュアに実装する必要があり面倒なので、Firebase Authenticatio
AtCoderのコンテストをスクレイピングして自動的にGoogleCalendarに追加する
## はじめに
僕も9月に始めたばかりの競技プログラミングサイト,AtCoderですが,「公式のGoogle Calendarの反映が遅い!!」と前から思っていたので,だったら自分で作ってしまおうということで作ってみました.
一見難しそうに見えますが割と簡単なのでサクッと作成した流れを書いていこうと思います!カレンダー:[AtCoder Google Calendar](https://calendar.google.com/calendar/embed?src=bfbsjd8i8lvqhappl5l75pd69c%40group.calendar.google.com&ctz=Asia%2FTokyo)
ソースコード:https://github.com/champon1020/sachiカレンダーは勝手に追加してもらってかまいません!
## システムフロー
一番はじめに思いつくオーソドックスなやり方かと思います.AtCoder Beginner Contest 152 参戦記
# AtCoder Beginner Contest 152 参戦記
## ABC152A – AC or WA
1分半で突破. 書くだけ.
“`python
N, M = map(int, input().split())if N == M:
print(‘Yes’)
else:
print(‘No’)
“`## ABC152B – Comparing Strings
2分で突破. 書くだけ.
“`python
a, b = map(int, input().split())if a < b: print(str(a) * b) else: print(str(b) * a) ``` ## ABC152C - Low Elements 5分で突破. 流石に二重ループは TLE なので、現時点の最小値を持ち回す必要あり. 題意を理解するのに少し時間を使った. ```python N = int(input()) P = list(map(int, input().split())) result = 0 m = P[0
Go歴0日だけどGo/beegoでSDK使わずにLINEBot作ってみる
#はじめに
こんにちは、今回はGoの入門がてらLINEBotを作成したいと思います。Goにはこれっしょ!となるようなWebフレームワークは存在しないようですが、筆者の浅い調べによるとGinというフレームワークが人気があるようです。
また、同様の浅い調べによってbeegoというWebフレームワークも割と人気があるとのことで。どっちにしようか迷ったのですが、なんとなく情報が少ないbeegoの方を使うことにしました。
LINEBotの基本のキであるおうむ返しBotを作成します。
Goの書き方で何か変な部分やこっちの方がええんちゃうってのがありましたら、コメ欄にてそっと教えてください。
beego公式
https://beego.me/今回Goの書き方は以下の記事を参考に頑張ります。
[他言語プログラマがgolangの基本を押さえる為のまとめ](https://qiita.com/tfrcm/items/e2a3d7ce7ab8868e37f7)#LINE Developerへの登録/チャネルの登録
↓ここから登録
https://developers.line.biz
Goでduを高速化してみた
# 背景
後輩: ホームディレクトリのディスク使用率が100%になったみたいです!新規でログインできなくなりやした!
ワタシ: 犯人をさがせー
後輩: dfしたけど100%ってことしかわからんとです….
ワタシ: duで調べるんやで! -sk?オプションはググって!
後輩: ググって実行したんですけど、めっちゃ時間かかって返ってこないっす….
ワタシ: 待つしかないなー\(^o^)/ワタシだけかもしれませんが、`du`ってオプション覚えられなくないですか?
あと、遅くないですか?# こんな出力にしたいな
`ファイルパス ファイル数 容量`
grepableにしたいよね〜# 実装
Goにはゴルーチンという必殺の武器があるので、並列実行で早くなりますな!
https://github.com/kuritayu/infra-tools/blob/master/cmd/rapidu/main.go# ベンチマーク
環境はMac、timeの出力結果。ファイル数`598909`、容量`129755.2 MB`。“`
du -sk /Users 0.58s use
1時間でできるMP3音楽を再生するCLIツールを作成する
## はじめに
Go言語によって1時間でMP3を再生するCLIツールを作ります!hello worldしたから次、何か成果物を作りたい!
CLIツールの作り方を知りたい!
みたいな人にオススメです!## 完成品
ターミナルで自作したコマンドを実行して、音楽を流しましょう!!
## 作成!!
### STEP:1 簡単にmp3の音楽を流してみる今回,mp3の音声を流すために使うライブラリはこちらです!
検索してたどり着いたみなさん、Gin やってますか?私は最近Go X Gin X LINE bot なサービスを作ろうとして結構悩みました。この経験を共有できたらいいな、と記事を書いています。
## 困ったこと:router.GET(“/”, handler.Index) に引数がない!
Goを始めてWebアプリを作ろうとしてGinに手を出した人には共感してもらえる(かもしれない)と思うんですが、私にはとても不思議に思えることがありました。アプリのルーティングを設定する場所に、Tour of Goとかでは見たことがない書き方が現れるのです。たとえば、こんな感じですね。
“`go:main.go
func main() {
router := gin.Defualt()
…
router.GET(“/”, handler.Index)
…
}
“`素人の視点からすると、handler.Indexってなんなんだ!なんでカッコが付いてないんだ!とうならざるを得ません。そしてさらに悪いことに、LINE botを使おうとしていた私はドツボにハ