- 1. 次世代モブプロ?対戦型オペレーションゲームでスキルを磨け!!
- 2. docker内でhttps化・SSL通信をできるようにする
- 3. io.Readerのファイルタイプを判定する
- 4. Goの内部パッケージ関係をコミットごとに可視化する
- 5. goでSTUNサーバを使ってパブリックIPアドレスを取得
- 6. ubuntu環境構築
- 7. 利用AWS Fargate5分鐘部署你的Gin/Flask API Cluster
- 8. 利用AWS S3來部署Hugo Site
- 9. 使用hugo搭建你的第一個blog
- 10. Golangで代表的なソートの復習
- 11. Go+ AWS SNSを使ってSMSを送信する
- 12. アナ雪のメロディーに合わせた Golang の歌 – Write in Go – が最高すぎる
- 13. Node.js が Go より 2 倍も速いなんてことがあるのだろうか
- 14. Go言語でFizzBuzzを書いてみた
- 15. golang 関数(func)の引数や戻り値で関数を指定したときの動作
- 16. Go言語の基本Tips
- 17. Goでzstd形式のディレクトリ圧縮をやってみた
- 18. GitHub GraphQL API v4を使ってリポジトリごとのContributionを集計してみた
- 19. Go言語においてstruct定義をすることなくJSONを扱うときのTips
- 20. gqlgen + Prisma Lift + gormで出勤管理を作ってみた
次世代モブプロ?対戦型オペレーションゲームでスキルを磨け!!
**俺より強いスキルに会いに行く(挨拶)**
#### はじめに
*ハイスコアガールⅡ*面白かったですねー。
ジブンも格ゲーブームのリアルタイム世代だったんだけど、見ててふと思ったのは「見て真似て盗む」というスキル磨きの手法。
モブプロやったことないから憧れるけど、磨く方法は手取り足取りだけじゃないよね。(あ。もち否定じゃあないです)
戦って負ける。から負けた理由なり、もっと上手くなる方法を考えたり、相手の操作から学ぶ。
**それも一つのモチベーションが高い学習方法ではないか?仮説**そんな思いをコードにしました
#### で、こうなった
実況さん「新人くんvsベテランさんスタート!httpサーバーを8080で起動し、TESTの文字列を返すミッションです!!」
実況さん「新人くん、OSやバージョンの確認を手堅く始めたぞーパッケージの確認へと進んでいるー」
![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/8d41e5e3-c515-d739-d0ce-c65
docker内でhttps化・SSL通信をできるようにする
#はじめに
conohaのvpsでサービス運用を始めようと思います.
ただ,SSL可に意外と苦戦したのでまとめておきます.#状況
・ubuntu+docker
・ドメイン取得済み
・Golangのbeegoでwebサーバーを立てている.httpsでの接続をするためには,SSL証明書が必要.
オレオレ証明書はローカル運用でしか,利用できない.
[letsencryptをUbuntu16.04 + Nginxで使ってみた](https://qiita.com/k-yamada-github/items/7314003de7bdcbb2d39b)だと,docker内に作用することができない.
[個人運営サイトのSSLをDockerで良い感じに設定する](https://qiita.com/KappaBull/items/15de7a2bf52a5d38b11e)だと,コンテナが2つあって難しそう.#結果
https-portalなるコンテナを利用することで,解決できました!!
#####メリット
・既存のコンテナサービスが簡単にSSL可できる
・わかりやすい
・自動で証明書を更新
io.Readerのファイルタイプを判定する
# 概要
Goでファイルを読み込んでいる時に、そのファイルのタイプを判別したいことがたまにあります。例えばGzipかどうか分からないけど、もしGzipならgzip.NewReader噛ませたい、みたいな場合です。雑にgzip.NewReader噛ませてerr返すかどうかで判定とかやってみたんですが、普通に10バイト読み進められちゃうのでerr返ったあとに別のファイルタイプとして処理しようとするとinvalidなヘッダーになって死にます。実は読み進められたバイトを戻す方法あるよ、という場合は教えて下さい。そもそもGzip以外の判定をしたいときもあるので、NewReaderの方針も必ず使えるわけではありません。もしファイルがos.Fileとかbufio.Readerの形であればReadしてからSeekしたりPeekしたり出来るのですが、io.Readerの場合どうやるのか分からなかったので調べました。
ちなみに自分では全く思いつかなくて `containers/image` 読んでて見つけました。賢いなーと思ったので書いておきます。よくよく考えると以前も同じようなのを見て賢いなーと思
Goの内部パッケージ関係をコミットごとに可視化する
![call-aimation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479931/3ec1a7e5-ce6a-92cd-0a86-8ace5e944941.gif)
使用したプログラム: [bxcodec/go-clean-arch](https://github.com/bxcodec/go-clean-arch)# 概要
1. Goの内部パッケージの関係が複雑なプログラムは理解するのが大変
– 可視化したい
– せっかくだからコミットごとに可視化してアニメーションにしてみる# 準備
– [Go](https://golang.org/)
– [Python3](https://www.python.org/)
– [Graphviz](https://www.graphviz.org/)
– [ImageMagick](https://imagemagick.org/index.php)# コード
– [st34-satoshi/for-each-commit](https
goでSTUNサーバを使ってパブリックIPアドレスを取得
以下の記事を参考に Go の実装に置き換えてみた。
* [JavaScriptでグローバルIPを取得する(パブリックSTUNサーバーを利用)](https://qiita.com/azechi/items/1a7832e346f42402cca6)
以下のパッケージ使って同等のことが割と簡単に実装できた。
* [pion/webrtc: Pure Go implementation of the WebRTC API](https://github.com/pion/webrtc)
Go言語楽しい。
## 実行結果
“`terminal
# go run webrtc/main.go
2020/01/06 23:31:08 Local IP Address: 192.168.xxx.xxx
2020/01/06 23:31:08 Public IP Address: 113.xxx.xxx.xxx
“`## 実装
“`go:main.go
package mainimport (
“log”
“os”“github.com/pion/web
ubuntu環境構築
# 準備
Desktop:HP-550-240jp (graphics=GTX960)
HDDにWindows10が入っているため、SSDを買い、そちらにubuntuを入れることにした。SSD:WesternDigitalの500GSSD(WDS500G2B0A)
あとは、3.5→2.5inchにするためのアダプタ?
SATAケーブル、電源分岐ケーブルいざ、筐体を開けてみると、電源は余っていたので、分岐ケーブルはいらなかったのだよな、、、
開けてから買うべきだった。
電源を引っこ抜き、作業開始。
SATAの差込口は1個余っていたけど、随分端っこの方にあって、差し込みにくかった。
とりあえず、SSDを電源につなぐところまでやる。電源もどして、普通にwin10を起動。
USBメモリを用意して、[本家](http://releases.ubuntu.com/18.04/)より、
ubuntu-18.04.2-desktop-amd64.isoをダウンロードし、書き込み。
[こちら](https://qiita.com/medalotte/items/4bb5cfa709e93d
利用AWS Fargate5分鐘部署你的Gin/Flask API Cluster
### 0. Prerequisite
在前面的文章我們已經介紹過目前在AWS上相關的container服務,而這篇文章想讓大家體驗Fargate的power,也將會帶著各位透過Cloudformation來部署一個API Cluster,以便提供給你的mobile或是web作為資料的來源。
無論你的API語言是透過Golang [gin]([https://github.com/gin-gonic/gin](https://github.com/gin-gonic/gin)) 或是 Python [Flask](https://github.com/pallets/flask) 開發,只要最後透過包裝成docker image後,都可以透過本篇所教學的方法快速的部署API Cluster。
此外,我們將透過[CloudFormation](https://aws.amazon.com/tw/cloudformation/)的方式來快速部署我們所需要的架構以及Cluster,如果對於CloudFormation還不熟悉的話也沒關係,可以先跟著本篇的範例先做嘗試,稍後我們也會部分裡
利用AWS S3來部署Hugo Site
## 0. Prerequisite
如果你還不清楚Hugo是怎麼樣的一個靜態網頁工具,可以先參考[使用hugo搭建你的第一個blog](https://qiita.com/p0n2/items/57cabf0ff855e8b473e5)來對hugo有初步的認識。
如果你已經了解並且準備好讓Hugo可以透過internet讓所有人瀏覽,那在這一篇post中我們將會詳細的介紹。
在開始之前,本片文章會使用到AWS的CLI來配置AWS上的相關資源。
[安裝 AWS CLI](https://docs.aws.amazon.com/zh_tw/cli/latest/userguide/cli-chap-install.html)## 1. Create S3 Bucket and configuration
接著,我們可以透過command line輸入
“` shell
aws s3api create-bucket –bucket–region ap-northeast-1 –create-bucket-configurati
使用hugo搭建你的第一個blog
在我們開始聊Hugo之前,先看看網路上大家都怎麼利用[Hugo Show Case](https://gohugo.io/showcase/)
## 0. Prerequisite
在開始使用hugo之前,必須要先在你的環境中安裝hugo的cli。
如過你是Mac/linux user,恭喜你!你只需要在你的terminal中輸入 (linux user如果無法執行brew command的話,請先安裝[Homebrew-on-linux](https://docs.brew.sh/Homebrew-on-Linux))
“` shell
brew install hugo
“`安裝完成後,可以接著輸入
“` shell
hugo version
“`如果有成功顯示類似下面的訊息(版本可能會不一樣),那就是安裝已經完成囉。
“` shell
Hugo Static Site Generator v0.58.3
“`## 1. Create first Site
接著輸入下面的command來創建你的第一個blog
“` shell
hugo
Golangで代表的なソートの復習
# はじめに
Go言語で代表的なソートのプログラミングを実装してみました。
目的はスライスの練習とソートの復習、Goの練習です。
Go初心者なので書き方云々なんか気になるところはコメントください!
注) アルゴリズム理解が目的なのでsortライブラリは用いてないです。今のところ以下作成しました。
– インサーションソート (Insertion sort)
– マージソート (Merge sort)
– クイックソート (Quick sort)[github](https://github.com/Sheerlore/sortlib)
順次追加予定です。
自分のメモ用にQiitaに載せますが自分より初心者の方に役に立てばと思います。
学校の課題などの参考になさってください。
それぞれパッケージにまとめてimportする形にしました。
入力と出力どちらも“`[]int“`のスライスです。
他の型にする場合は適当に変更すれば良いと思います以下に実行コードとそれぞれ
Go+ AWS SNSを使ってSMSを送信する
# はじめに
個人開発で作成しているアプリケーションの認証にSMSを使いたかったので、何やらややこしいですが『Go + AWS SNS』という組み合わせで、SMS送信を実現しました。今回はそのまとめです。
実際のコードで確認したい方は[こちら](https://github.com/atEaE/golang-aws-sdk-example)からどうぞ。# 実行環境
– macOS Catalina 10.15.2
– golang 1.13.0
– Visual Studio Code# AWS SNSって何?
Amazon Simple Notification Service(Amazon SNS)自体の説明は私の拙文を参考にするよりも、[公式](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/welcome.html)を参考にした方が理解が進むと思いますので、ざっくりと説明します。
読んで字の如く『シンプルな通知機能を提供するサービス』です。私からは『何かしらの通知ができるサービス』というざっくりしたことを覚えておいてもらえ
アナ雪のメロディーに合わせた Golang の歌 – Write in Go – が最高すぎる
[Write in Go – YouTube](https://youtu.be/yhC-361QGJw)
> The schedule’s tight on the cluster tonight
> So I parallelized my code
> All these threads and continuations
> My head’s going to explode
> And all this bolierplate
> This FactoryBuilderAdapterDelegatelmpl…
> Seems unjustified
> Give me something simple
> Don’t write in Scheme
> Don’t write in C
> No more pointers
> That I forgot to `free()`
> Java’s verbose
> Python’s too slow
> It’s time to know
> Write in Go!
> Write in Go!
> No inh
Node.js が Go より 2 倍も速いなんてことがあるのだろうか
こんにちはフロントエンドエンジニアをしている ku6ryo です。
普段は VR のスタートアップにて JavaScript で SPA を開発しています。
WASM に興味をもち、 WASM x Go は本当に早いのかという疑問から速度検証をしてみたのですが、WASM に辿り着く前に Go が JavaScript (Node.js) よりも遅いケースがあるのを発見したので共有および、なぜこうなるのかわかる方がいらっしゃればご意見をいただきたく、本記事を投稿します。# 結果
先に結果から。10^7 以下の最大の素数を求めたところ、JavaScript (Node.js) 約 1200 ms に対して Go は 約 2500 ms となった。Node.js は Go よりも約2倍も速い結果となった(10回施行のばらつきは 数% 以内なので Node.js は Go に対して優位な差があるとみなせると判断)。なお、実行環境は `macOS Catalina / 2.3 GHz Dual-Core Intel Core i5 / 16 GB 2133 MHz LPDDR3` です。
Go言語でFizzBuzzを書いてみた
# はじめに
正月休み時間があったので Go 言語を勉強しました。
基本文法の確認のため FizzBuzz を書いてみたら Go 言語ならではの面白い書き方ができるなー、と思ったので投稿することにしました。## FizzBuzz のルール
* `1` から `100` まで数字を出力する
* その数字が `3` で割り切れるなら `Fizz` と出力する
* その数字が `5` で割り切れるなら `Buzz` と出力する
* その数字が `3` でも `5` でも割り切れるなら `FizzBuzz` と出力する# コード
https://play.golang.org/p/CcpxL6bDT2c
“`golang
type FizzBuzzInt int
func (i FizzBuzzInt) String() string {
switch {
case i%15 == 0:
return “FizzBuzz”
case i%3 == 0:
return “Fizz”
case i%5 == 0:
return “Buzz”
defau
golang 関数(func)の引数や戻り値で関数を指定したときの動作
# はじめに
golang を使い始めたのですが、関数の使い方で躓いたのでメモを残そうと思います。
関数の引数や戻り値に変数(int、string等)を指定した場合の挙動は想像できるのですが、 引数や戻り値に `func(int)` のような関数を指定をしたときの動きが直ぐにわからず、、動作を確認しました。#### 確認パターン
– 引数に関数
– 戻り値に関数# 引数に関数(1)
簡単な足し算をする処理です。 関数 `calc` の第1引数を `func(int, int)` とし、関数を受け取れるようにしています。
どの順番で実行されたかを確認するために `println` を入れています。“`golang
package mainimport (
“fmt”
)func calc(fn func(int, int) int, x int, y int) (res int) {
fmt.Println(“(A)”)
res = fn(x, y) // 関数:add を実行
return
}func add(x int, y int) int
Go言語の基本Tips
プロジェクトによって色々な言語を使うことが増えてくると、パッと切り替えられず混乱してしまうことがあります。そんな自分用の備忘録です。
Go言語のプレイグラウンドは[こちら。](https://play.golang.org/)
# 特徴
* コンパイル言語であるため、Pythonなどの動的言語に比べ実行速度が圧倒的に速い。
* Goのプログラムが起動した直後には「main」パッケージに属する「main関数」が実行されるため、必ず「main関数」が必要。# 処理の書き方
処理の最後に`;`は不要です。“`Go
println(“hoge”)
“`# 変数
`var`で定義し、データ型が変数名の後ろになります。
Goでは、データ型の指定を省略することが可能です。
次の3行は全て同じ意味になります。“`Go
var a int = 1
var a = 1
a := 1
“`
#メソッド名や変数名の大文字/小文字
名前(トップレベルの型名、関数名、メソッド名、定数名、変数名、構造体のフィールドおよびメソッド名)の先頭一文字が大文字になっていれば、パッケージの利用者側
Goでzstd形式のディレクトリ圧縮をやってみた
# やりたいこと
Goでzstdを用いたディレクトリ圧縮をしたい。# zstdとは
http://facebook.github.io/zstd/
facebookがOSS化した圧縮アルゴリズム。
他の圧縮アルゴリズムよりも圧縮展開速度・圧縮効率に優れている。らしい。# Goで使えんの?
ラッパーライブラリがありました。
リポジトリ: https://github.com/DataDog/zstd
godoc: https://godoc.org/github.com/DataDog/zstd
今回は上記を使用しますが、これ以外にもあるみたいです。
# 使ってみました
### サンプルリポジトリ
https://github.com/Raita876/zstd-sample
tar, zstdパッケージを使用してsampleディレクトリをアーカイブ、圧縮しています。
### ディレクトリ構成
“`
$ tree .
.
├── Makefile
├── README.md
├── go.mod
├── go.sum
├── main.go
└── sa
GitHub GraphQL API v4を使ってリポジトリごとのContributionを集計してみた
## はじめに
2019年はKubernetes公式ドキュメントの翻訳をはじめ、OSS活動を積極的に行った年となりました。2019年の振り返りをはてなブログに書いた[^1]のですが、何かうまくいっていない気がしました。一因として、GitHubでのContributionを数えることに気をとられてしまったことが挙げられます。そこで、今後も振り返りを続けていくためにも簡単にContributionを集計したいところです。
GitHub GraphQL API v4[^2]を使うとよさそうだと知り、GUI[^3]でごにょごにょしました。概ね望んでいたデータはとれたのですが、データ構造をいじりたかったのでGraphQLのレスポンスをmarkdownに変換するツール[^4]を自作しました。
## GraphQL
以下の通りです。2行目と3行目のパラメーターを修正して使ってください。
“`graphql
{
user(login: “oke-py”) {
contributionsCollection(from: “2019-01-01T00:00:00.000Z”, to
Go言語においてstruct定義をすることなくJSONを扱うときのTips
go言語においてJSONをあつかう際には、構造体を定義してmappingするのが一般的です。
ほとんどの場合この方法で良いのですが、たまにStructを定義したくない、できない状況があるかもしれません。
struct定義することなくJSONを扱う方法について記載していきます。jsonを楽に使うパッケージ:[github.com/aimof/jaason](https://github.com/aimof/jaason)を作っている時に得た知見をまとめました。
## はじめに:`json.Unmarshal()`の基本
JSONをjson.Unmarshal()でunmarshalした際には、以下の型になります。
“`
bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null
“`ご存知の通り、JSON
gqlgen + Prisma Lift + gormで出勤管理を作ってみた
# サンプル
https://github.com/inadati/sample01-AttendManager.services# コンテナ構成
### DB
– PostgreSQL### cron処理
– busybox### cronで叩く用graphql api(非公開api)
– gqlgen
– gorm### 公開用graphql api
– gqlgen
– Prisma(Liftのみ使用)
– gorm### クライアントアプリ
– nuxt
– Apollo Client### その他
本番公開にhttps-portalを使用(別コンテナ)# graphQLサーバーを立てる上での躓きポイントをまとめる
※下記は今後、別記事にしてリンクを貼るようにします。### Hasuraによって作れるapiはいかなる場合もweb公開するしかないという話
PrismaはORMを使い、内部的にSQLを叩くことでDBを読み書きしているので
Prismaが自動生成するapiを直接、web公開する以外にも
prismaのORMを使い、別途公開用のgra