- 1. 【Golang】zapを用いたロギング
- 2. 【Golang】ユニークなID作成
- 3. SQLBoilerでMySQLのDATETIME型使おうとしたらハマった
- 4. [Go]GAEとローカルでYoutubeDataAPIを使用する
- 5. Goで実装するBtree[挿入・探索編]
- 6. Docker + Go + Gin の開発環境を準備する 2020/02
- 7. スクリプト言語の比較しながらGoのお勉強 〜 Hello World編
- 8. goでphpのような何でもブチ込める配列を作りたい。
- 9. Termina上でGitのログ表示を最高に見やすくするTUIアプリ「gitone」を作った
- 10. rootで実行されたかどうか確認する
- 11. GoとRedisでAPIを実装する (Part.2)
- 12. GoとRedisでAPIを実装する (Part.1)
- 13. GOSTを使ってコマンド2つで簡易ゲートウェイをつくる
- 14. Go言語でforループ内のgoroutineにポインタを渡した時の挙動
- 15. golang でプログラム内で API から取得したデータを使い回すときの方法を調べてみた
- 16. 眺めて覚えるGo言語 その16 並列処理 「sync.WaitGroupは複数のgoroutineの完了を待つ」
- 17. 【React】Omise.jsでカード情報を登録
- 18. Github Actions Secrets API を使って Go で Secrets を更新する
- 19. Go言語のlogパッケージ
- 20. Onsen UI 2でSNSをつくったよ
【Golang】zapを用いたロギング
# 概要
Golangのロギングのライブラリであるzapのロギング例を示す。本記事では、以下のようなJSON形式のログを想定している。内容は、ログレベル、時刻、呼ばれた場所、メッセージである。
“`bash
{“level”:”debug”,”time”:”2020-02-02T23:24:13.185+0900″,”caller”:”logger/utils_test.go:31″,”msg”:”test msg”}
{“level”:”info”,”time”:”2020-02-02T23:24:13.186+0900″,”caller”:”logger/utils_test.go:32″,”msg”:”test msg”}
{“level”:”error”,”time”:”2020-02-02T23:24:13.186+0900″,”caller”:”logger/utils_test.go:34″,”msg”:”test error”}
“`zapライブラリは、[Readmeのパフォーマンス表](https://github.com/uber-go/zap#perf
【Golang】ユニークなID作成
# 概要
Golangで、以下のような文字列であるユニークなIDの作成方法を示す。ユーザーIDの作成などに、使用する目的でプログラムを作成した。
作成には、[oklog/ulid](https://github.com/oklog/ulid)というgolangのライブラリを使用した。“`bash
0000XSNJG0MQJHBF4R33AHWHGX
“`
Git: [k-washi/bss-utils/uniquegenerator](https://github.com/k-washi/bss-utils/tree/master/uniquegenerator)# プログラム
以下のプログラムのように時間に依存したユニークなIDを作成している。また、Validationも作成している。
“`golang
package uniquegeneratorimport (
“errors”
“math/rand”“github.com/oklog/ulid/v2”
“time”
)var (
t = time.Unix(1000000
SQLBoilerでMySQLのDATETIME型使おうとしたらハマった
#はじめに結論
SQLBoilerとMySQLドライバ(go-sql-driver/mysql)の使い方でハマりました・・・。
結論から先に言いますと、DB接続する際以下に示すようにDSNに**parseTime=true**
っていうパラメータを付与してあげてください。“`go
db, err := sql.Open(“mysql”, “root:root@tcp(127.0.0.1:3300)/todos?parseTime=true”)
“`# 前提
## 環境
– Windows10
– Go v1.13.7
– Gin v1.5.0
– SQLBoiler v3
– MySQL 8.0.18## ソース
https://github.com/stern118/gin-todo## DB
“`sqlCREATE TABLE `tasks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`task_name` varchar(45) NOT NULL,
`status` int(11) NOT NULL,
[Go]GAEとローカルでYoutubeDataAPIを使用する
## はじめに
YoutubeDataAPIを使用するとYoutubeのチャンネルやアップロードされた動画の情報を取得することができます。
今回はYoutubeDataAPIをGAEとローカル環境で使用する方法について記載します。
使用する言語は**go**です。
YoutubeDataAPIを使用する際に認証方法としてよくAPIキーによる方法が使用されていますが、GAEで使用する場合は**GAEデフォルトのサービスアカウントを使用することもできます**。
この記事では認証にサービスアカウントを使用します。## プロジェクト準備
適当なGCPプロジェクトを作成し、GAEにアプリケーションをデプロイします。
アプリケーションをデプロイすることでデフォルトのサービスアカウントが作成されるので内容は何でもいいのでデプロイしてください。デプロイすると `IAMと管理 > サービスアカウント`に`App Engine default service account`という名前のサービスアカウントが作成されています。
このアカウントのキーを作成し、キーのタイプはJSONで保存してくださ
Goで実装するBtree[挿入・探索編]
## B-treeとは
Wikipediaから引用すると、b-treeとは
> 多分岐の平衡木(バランス木)である。1 ノードから最大 m 個の枝が出るとき、これをオーダー m のB木という。後述する手順に従って操作すると、根と葉を除く「内部ノード」は最低でも m /2 の枝を持つことを保証できる。B-treeに関しては詳しい記事がたくさんで書かれているのでこの記事では詳しい説明は割愛して、引用させていただいた記事を紹介させて頂くだけにしておきたいと思います。
文字や図で説明されてもわからないかなと思うので、[こちら](https://www.cs.usfca.edu/~galles/visualization/BTree.html)のvisualizationサイトを利用すると動きが理解しやすいかと思います。
## 実装
実装内容は[google/btree](https://github.com/google/btree)を大いに参考にしています。
今回実装する内容としては、**1. B-treeの本体**
**2. 探索**
**3. 挿入**の順番で実装してい
Docker + Go + Gin の開発環境を準備する 2020/02
Go + Gin で Web API を構築する際の開発環境を準備します。
Gin の [クイックスタート](https://github.com/gin-gonic/gin#quick-start)が動作するところまでの備忘録です。以下の記事を書いたのが2018年5月と、時間が経ってしまいました。
https://qiita.com/kkeisuke/items/7cd4d5834386666faab3
この間に Go Modules が出てきたりと変化がありましたので、
改めて書き直しました。## 構成
– PC:macOS Catalina
– Docker:[Docker Desktop for Mac](https://hub.docker.com/editions/community/docker-ce-desktop-mac)
– Docker version 19.03.5, build 633a0ea
– docker-compose version 1.25.2, build 698e2846
– イメージ:[golang Docker Offic
スクリプト言語の比較しながらGoのお勉強 〜 Hello World編
# Hello World
プログラムの勉強をするのに最初にやること。
それは間違いなく「Hello World」の文字を画面に映し出すことで、wikipediaによると、
[Hello world](https://ja.wikipedia.org/wiki/Hello_world)
>プログラミングできるコンピュータの開発以来、小さなテストプログラムは存在してきたが、テスト文言として「Hello, World!」を使う習慣はブライアン・カーニハンとデニス・リッチーによる著書「プログラミング言語C」(1978年)[2]のC言語バージョンから始まったと言われている。同著書のプログラム例はhello, world(大文字なし、感嘆符なし)を標準出力に出力する。この例はブライアン・カーニハンがまとめたベル研究所の内部資料「Programming in C: A Tutorial」(1974年)[3]を継承したものである。へー、そうなんだ。
## GoのHello World
ではまず、Goから。“`go:hello.go
package mainimport “fmt”
goでphpのような何でもブチ込める配列を作りたい。
# 便利よね、phpの配列って
Goを社内布教していたら、
「phpみたいに何でもブチ込める連想配列みたいなの作りたいの!」
と、同僚が。
確かにphpの連想配列というか配列は型を意識しないで何でもブチ込める便利なヤツです。
Goだと型を決めて配列なりsliceなりmapを作らなきゃイケませんよね。型宣言はphp使いにはめんどくさいのは確かなのと(個人差アリ)、
同僚のテンションが下がることによってGoの布教に失敗したくなかったので、
下記コードをサンプルで渡しました。“`go
package main
import(
“fmt”
)func main() {
associative_array := make(map[interface{}]map[interface{}]interface{}, 0)
associative_array[0] = make(map[interface{}]interface{})
associative_array[0][“a”] = “abc”
associative_array[0][1] = 123
associ
Termina上でGitのログ表示を最高に見やすくするTUIアプリ「gitone」を作った
![gitone-light-demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166629/7b308c67-65e1-c527-4448-e01972d9f9b4.gif)
Gitプロジェクト上で `gitone` と打つとGitのログをグラフ表示してくれる大変シンプルなアプリです。そのままカーソル行を動かしていくと簡易な情報が常に下のステータスバーに表示されていて、Enterで選択するとさらに詳細なGit showをlessで見ることができるようになっています。
Go言語で作られていて、macOSでもLinuxでも、そしてWindowsでも使うことができちゃいます!
この記事では、最初の方にこのアプリのコンセプトと使い方、そして最後に技術的な話をしていきたいと思います。
Githubのリンクはこちらです。
rootで実行されたかどうか確認する[Golang Geteuid Examples, os\.Geteuid Golang Examples \- HotExamples](https://golang.hotexamples.com/examples/os/-/Geteuid/golang-geteuid-function-examples.html)
rootで動かすバッチの動作チェックなどに。
[whoamiコマンド](https://ja.wikipedia.org/wiki/Whoami)と等価“`go:whoami.go
package mainimport (
“fmt”
“os”
)func main() {
if os.Geteuid() != 0 {
fmt.Println(“Must be run as root”)
os.Exit(1)
}
os.Exit(0)
}
“`“`
// 一般ユーザー実行
$ go run whoam
GoとRedisでAPIを実装する (Part.2)
# はじめに
本記事は、[GoとRedisでAPIを実装する (Part.1)](https://qiita.com/Morero/items/fb92879daee5f7055472)の続きである。まだ、読んでいない方は事前に読んでいただけると幸いである。Part.2では、APIの実装から検証を行う。
まず今回の実装に至り、実行環境は以下の通りである。
# 1. 実行環境
* macOS Catalina Ver.10.15.2
* Docker version 19.03.5, build 633a0ea
* docker-compose version 1.24.1, build 4667896b
* golang 1.13.6
* Redis 5.0.7## 1.1. ファイル構成
“`terminal:file-tree
sample_project
├── docker
│ ├── api
│ │ └── Dockerfile-api //API用
│ └── database
│ └── Dockerfile-redis //D
GoとRedisでAPIを実装する (Part.1)
# はじめに
本記事では、Go 言語と Redis を使用し簡単なAPIの作成手順について説明する。今回は、docker-compose を使って実装していく為、環境に依存しない開発環境で実装する。
また、効率的に開発が行える様、開発の中でいくつかの工夫を施しているので参考になれば幸いである。追伸、今回は記述量が多くなるので以下の2部構成にした。
* Part.1 : 環境構築 ~ 動作確認
* Part.2 : API実装 ~ 実装検証その為、本記事では環境構築から動作確認までを説明する。
初めて実装していく方の為に、実行環境と予備知識としていくつか説明する。
# 1. 実行環境
* macOS Catalina Ver.10.15.2
* Docker version 19.03.5, build 633a0ea
* docker-compose version 1.24.1, build 4667896b
* golang 1.13.6
* Redis 5.0.7【補足①】
* [Go言語](https://golang.org/)
* 2009年、G
GOSTを使ってコマンド2つで簡易ゲートウェイをつくる
# GOSTとは
Go言語でかかれたトンネリングツールです.GOSTの概要は以下の記事を参照してください.
– [GOST | GOST](https://docs.ginuerzh.xyz/gost/en/)
– [gost – GO Simple Tunnel がすごい – Qiita](https://qiita.com/tongari0/items/84f630483bef19a2e386)# コマンド2つで簡易ゲートウェイ
HTTP ProxyとDNS ForwarderをGOSTで作ります.
## 環境/バージョン
– Ubuntu 18.04.3 LTS
– RAM 1GB
– CPU v1コア
– Storage 50GB
– gost 2.9.2 (go1.13.3 linux/amd64)## 構築(Quick)
インストールと実行は以下の2コマンドで終わります.
“`shell
sudo snap install gost
sudo gost -L=udp://:53/1.1.1.1:53,1.0.0.1:53 -L=:8080
“`
Go言語でforループ内のgoroutineにポインタを渡した時の挙動
Go言語でforループ内でgoroutineを起動したい時がたまにあると思いますが、久しぶりにforループ内でgoroutineを起動しようとしたら少しはまってしまった。かなり基本的なことだが、次にGo言語でforループ内でgoroutineを起動したくなった時にはまた忘れてそうなのでメモしておきます。
実行したのは以下のようなコード。
“`go
type Animal struct {
Name string
}func main() {
animals := []Animal{{“dog”}, {“cat”}, {“fox”}}var wg sync.WaitGroup
for _, animal := range animals {
wg.Add(1)
go func(a *Animal) {
defer wg.Done()
fmt.Println(a.Name)
}(&animal)
}
wg.Wait()
}
“`
golang でプログラム内で API から取得したデータを使い回すときの方法を調べてみた
## はじめに
最近 golang 触り始めました。まだまだ勝手がわかっていないことが多いです。
今回は、CLI ツールのようなプログラムで、API から取得したデータをで使い回すときの方法について調べてみました。## tl;dr
グローバル変数を使うのが良さそうだと思いました。
## 想定するケース
[aws-sdk-go](https://github.com/aws/aws-sdk-go) で、S3 のバケット一覧を取得し、この結果を複数の関数内で何度も利用する場合を考えます。
何度も API からし直すと、そのたびリクエストが走ってしまいます。そのため処理を軽くするために、プログラム内で API から取得したデータを使いまわす方法がないかを調べていました。
## サンプルコード
S3 のバケット一覧を取得するサンプルコードです。
“`go
package mainimport (
“fmt”
“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“gith
眺めて覚えるGo言語 その16 並列処理 「sync.WaitGroupは複数のgoroutineの完了を待つ」
#眺めて覚えるGo言語 その16 並列処理
##「sync.WaitGroupは複数のgoroutineの完了を待つ」“`thread.go
package main
import (“fmt”;”sync”;”time”)
func main() {
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ { wg.Add(1) go func (i int) { defer wg.Done() fmt.Println("Thread no",i) time.Sleep(1) }(i) } wg.Wait() fmt.Println("complete!") } 実行結果 >go run thread.go
Thread no 0
Thread no 5
Thread no 2
Thread no 3
Thread no 9
Thread no 4
Thread no 6
Thread no 7
Thread no 8
【React】Omise.jsでカード情報を登録
こんにちは。
ECサイトを開発していて決済を実装するために[Omise](https://www.omise.co/ja/docs/japan)というapiを使う機会がありました。
カード情報を登録するにあたってReactで実装するのに苦労したのでメモです。
フォームはドキュメントにサンプルがあったので参考にしてみてください。#Omise.jsとは
Omise.jsはクライアントサイドのJavaSciprtライブラリで、クレジットカードの情報をトークン化するために利用します。 ユーザーが決済フォームへ情報を入力し、フォームのSubmitのタイミングでOmise.jsが決済フォームの情報をOmiseのサーバーへ送信し、トークンを作成して取得します。取得したトークンは、あなたの決済フォームで送信されますので、あなたのサーバーサイドでは、そのトークンを利用し決済の処理を実行できます。引用:https://www.omise.co/ja/collecting-card-information/japan#使い方
まずindex.htmlファイルのbodyタグ内に下記を追加します。
jQ
Github Actions Secrets API を使って Go で Secrets を更新する
# Github Actions API が公開され、 Secrets を API 経由で更新できるようになりました
Github Actions で利用する Secrets はこれまで手作業で更新する必要がありました。
たくさんのレポジトリを管理していてそれぞれに Actions を仕込むときに更新がとても大変でした。そんな中、 Github Actions API が公開(2020/1/27)され、 Secrets の更新が API 経由で行えるようになりました :tada:
[Secrets | Github Developer Guide](https://developer.github.com/v3/actions/secrets/)
# Secrets API の概要
Secrets は秘密鍵、公開鍵を用いて暗号化しているのですが、 Github Actions では libsodium を使って実現しているようです。
– [jedisct1/libsodium – Github](https://github.com/jedisct1/libsodium)
Go言語のlogパッケージ
logパッケージを使用すると日付と時間とメッセージを表示させることができる。
## log.Print
– log.Print
– log.Printf
– log.Println3種類あるが、内容的にはfmtと同じ、先頭に日付が入るだけ。
“`go
package mainimport(“log”)
func main(){
log.Print(“ログやで”)
}
“`## log.Fatal
何かエラーが発生した場合にログを表示してプログラムを終了させたい場合はFatalを使用する。Fatalも3種類ある。
– Fatal
– Fatalf
– Fatalln“`go
func main(){
r, err := ioutil.ReadFile(“text.text”)if err != nil {
log.Fatal(err)
}fmt.Println(r)
}// 2020/01/31 15:39:11 open text.text: The system cannot find the file specifi
Onsen UI 2でSNSをつくったよ
#HTML5ハイブリッドアプリを最高に美しく、スムーズに。
Onsen UI 2とは,Web上でiOSやAndroidのネイティブUIと同等のUXを実現するためのCSSフレームワークです.
簡単に言うと,「アプリじゃないけど,アプリみたいに動くサイト」です.
[BootstrapではなくOnsen UIを選定した理由](https://blog.ecbeing.tech/entry/2019/08/08/113502) にメリット・デメリットがまとまっています.#成果物
[ShiJimi](https://www.shijimi.work)
ドラマ・映画に特化したSNSを目指しました(^^♪#環境
onsen ui 2.10.10
javascript
css#かっこいい機能3選
###ons-lazy-repeat
大量のリストを表示する場合に,スクリーンに写っている部分だけを読み込んでくれます.
(番組一覧やツイート画面に利用しています.)
![20200131_071108000_iOS.png](https://qiita-image-store.s3.ap-no