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

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

【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 uniquegenerator

import (
“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
“`sql

CREATE 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 main

import “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 main

import (
“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 main

import (
“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.Println

3種類あるが、内容的にはfmtと同じ、先頭に日付が入るだけ。

“`go
package main

import(“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

元記事を表示

OTHERカテゴリの最新記事