Go関連のことを調べてみた2019年12月16日

Go関連のことを調べてみた2019年12月16日

GraphQLでスキーマファーストなForm Validation

こんにちは、こちらはGraphQL Advent Calendar 16日目です。

タイトルにある「スキーマファーストなForm Validation」とはなんぞやという話ですが、短く説明するとこんな directive を書いたとして

“`graphql
input RegisterAddressInput {
postalCode: String @constraint(minLength: 7, maxLength: 7)
state: String @constraint(maxLength: 4)
city: String @constraint(maxLength: 32)
line1: String @constraint(maxLength: 32)
line2: String @constraint(maxLength: 32)
}
“`

サーバサイドはこの `constraint` を満たしていない値が来たら BadRequest で弾くし、フロントでは下記のようなFormの実装に使うバリデーションオブジェクトをこの定義に基づいて生成

元記事を表示

GAE/Go 1.12 で Cron と Cloud Tasks を使ってまあまあ時間のかかる定時バッチ処理をする

# はじめに

* GAE のスタンダード環境のタイムアウト時間は 60 秒なので、それ以上時間のかかる処理を GAE 上で行いたい場合は Cloud Tasks を使います
* Cloud Tasks を使うとバックグラウンドで GAE の処理を実行することができて、タイムアウト時間が 10 分以上とスタンダード環境よりも長くなります
* GAE では Cron を使って定時処理を実行することができるので、Cron と Cloud Tasks を組み合わせることで、時間のかかる定時実行処理を Cloud Functions などを使わずに GAE のみで実装することができます
* ということで GAE/Go 1.12 環境で Cron と Cloud Tasks を使って定時バッチ処理をするサンプルを記載していきます

# 手順概要

1. Cloud Tasks のタスク用のキューを作成
1. Cloud Tasks のタスクを処理するハンドラの作成
1. Cron の処理を実行するハンドラの作成
1. Cron の設定

# Cloud Tasks のタスク用のキューを作成

*

元記事を表示

等から定数を Go に引用したい(import “cgo”とか使わんで)

(本記事はGo3 Advent Calendar 15日目の記事になります。穴が空いていたようなので、埋めさせていただきます)

`import “syscall”` 愛用者の皆さん、こんにちは。

Windows の API を使う時、`import “cgo”` ではなく、`import “syscall”` で DLL をロードするようにすると、ビルドの際、C言語のコンパイラが不要になります。ビルド要件が下がると、それだけ開発したライブラリを使ってもらう確率もあがりますし、プルリクとかもしてもらいやすくなります。なので、少々の手間をかけて `import “syscall”` を使う価値は高いと思います。

でも…関数本体の宣言はともかくとして、たくさんの定数をヘッダファイルから書き写すのはたいへんですよね。

そこで、その手間を節約するツール:[go-importconst](http://github.com/zetamatta/go-importconst) を開発しました。

### go-importconst とは

“`const.go
package dos

元記事を表示

R言語に負けるのは悔しいので、Go言語でも生存曲線を描いてみた

> R言語もすなる生存分析といふものをGo言語もしてみむとするなり。

R言語やPythonで作ると簡単にできるのですが、Goで作ってるもので統計データを元に自動判定させてなんかゴニョゴニョしてみたいときにどうやるんだろうということでやってみました。

# 設計

[Exploratory](https://ja.exploratory.io/)で作ったものがあるので、これをベースにします。

![スクリーンショット 2019-12-15 20.57.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9094/9fdd5fb1-43d8-50c6-c459-c8633f923ad4.png)

ステップを見ると

1. アクセスログのデータ読み込む
1. 時系列で並べ替える
1. ユーザでグルーピングする
1. 集計する
1. ユーザがもう辞めているかどうかを判定できるようにする
1. 計算する

なるほどね…
![understand.jpg](https://qiita-image-stor

元記事を表示

うちの本棚のレイアウトの最適化をGopherさんに考えてもらった

本が増えたときに本棚にきちんと入れるためのレイアウトを考えるのが大変なので、Gopherに頑張ってもらうようにした

# イメージ図
![gophercomplex5_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9094/6eb1d7c1-44bc-b0c0-4ddd-f1ddb09a3bf1.png)

# 設計

本棚のサイズはIKEAの[BILLY](https://www.ikea.com/jp/ja/catalog/products/10351568/)をベースにしています。
漫画だと1段に2列並べられて、1列22冊合計で44冊を1段に収納できました。

以降、1列を`group`、1段を`rack`と称することにします。

## 見送ったこと

出版社やブランドをまとめようと思いましたが、1日で作り上げるレベルではなさそうなのでやめました

# 作ったもの

## データ

CSVで所蔵データを作って、これをベースに本が棚に収まるようにグルーピングします。
以下がCSVの例です

`

元記事を表示

Go勉強(5) kubernetes client-goでPodのwatcher(TUI)を書いてみる2

# はじめに
この記事は Kubernetes3 Advent Calendar 2019 の16日目の記事です。
Go6のCalendarに投稿した以下の記事の内容を変更してクロスポストさせて頂いています。
[Go勉強(4) kubernetes client-goでPodのwatcher(TUI)を書いてみる](https://qiita.com/oruharo/items/668d708cead0ad261346)

Kubernetesを操作した時の挙動を観察したくて、ターミナルからコマンドでNode/Podの状態をリアルタイムに表示するシンプルなツールを書いてみました。

# Source code
https://gist.github.com/oruharo/11abc53c9ad324522fe5b6bdc6620323#file-k8watcher2-go

# Demo
下のターミナルでツールを起動すると、現在の実行ノードとPodの配置が表示されます。
上のターミナルからデプロイすると、デプロイしたPodがツール画面にリアルタイムに反映されます。
ターミナルの画

元記事を表示

Go の Cache package のベンチマークを測ってみた話

この投稿は、 Go4 Advent Calendar 2019の 15日目のものになります。

こんばんわ!!
だんだん寒くなってきましたね。

さて、私たちは普段GCPも多く利用しています。
しばらくすると得体の知れない使用されていないリソースが大量に出来上がっていて、コストを圧迫する問題があったりします。

コストコントロール/棚卸し作業で、「Lifecycle設定が出来ていないもの/諸事情で設定しづらいもの且つ、使用されていないdiskを探す」といったことがしたく、 aws cliにはそれを探すコマンドがありますが、goolgle-cloud-sdkのgcloudコマンドにはありません。
そこで、それを作ることにしました。
https://github.com/k-oguma/gce-available-disks

その際に option として、 誰が作成したものかわかるように Stackdriver loggingの activity log を検索するようにしました。 (保存期間は短いです)

しかし、業務で使うような大量のactivity logが発生するGCP pro

元記事を表示

GitLab as an OAuth2 provider: Web application flowを実装する

この記事は[ユニークビジョン株式会社 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/uniquevision)の15日目の記事です。

## 概要
GitLabによるOAuth認証を、ReactとGolangを使って実装する。
認証が完了した際に、そのユーザの情報をブラウザ表示するアプリを実装する。

## Document
[GitLab as an OAuth2 provider](https://docs.gitlab.com/ee/api/oauth2.html#supported-oauth2-flows)

## 事前準備
User settings -> Applications内でOAuth認証に使うアプリを作成しておく

## 認証の流れ
### 1. https://gitlab.example.com/oauth/authorize へリクエストを送る

この際に幾つかパラメータを付けてリクエストを行う

– client_id
– GitLabアプリのApplication ID

元記事を表示

Pulumi(golang)でEKS環境を構築する

# はじめに
AWS環境構築をコード化するためのツールとしてAWS CDK、Terraform、Ansible、Pulumiなどがあります。
今回は記述言語をgolangとしてPulumiでEKS環境を構築します。

# Pulumiとは
「Modern Infrastructure as Code」を掲げた、クラウドインフラを構成するためのOSSです。
対応言語はJavaScript、TypeScript、Python、golangなどが挙げられます。
GCP、AWS、Azureに対応しており、Kubernetesリソースをデプロイすることも可能です。

まだ新しいこともあり公式ドキュメントや公式サンプルコードはTypeScript中心となっています。
普段バックエンドを触っている人にとってはgolangの方が嬉しいですね。

# 環境情報
macOS Mojave 10.14.1
pulumi: 1.7.0
golang: 1.12.4

# 実装
golangを使用して実装します。
事前にPulumiやgolangはインストールされていることは前提とします。

`$GOPATH/

元記事を表示

UnityとGo言語でAPI通信する

# はじめに
ゲーム開発エンジン「Unity」と、Googleにより開発されたプログラミング言語「Go」を用いて、凄くシンプルなREST APIを実装したいと思います。

Unityについて:https://unity.com/ja
Goについて:https://golang.org/

# 開発環境
– MacBook Pro (15-inch, 2018)
– macOS Catalina
– Unity 2019.1.1f1 Personal
– Go 1.13.5 darwin/amd64

# システム構造
Unityをクライアントサイド、APIサーバ(Goで実装)をサーバサイドとして作りました。

# 内容
サーバサイドで保存されているデータに対して、Unity側からデータのID(一意なもの)を指定して対象データを取得します。データに関しては、予めいくつか用意しておきます。

今回はDBを使わないので、オンメモリのデータストア(リストを使います)に格納しておこうと思います。なので、サーバを停止させるとデータは吹き飛びますw

# 実装
## サーバサイド
まずサーバサイドか

元記事を表示

GDG DevFest Tokyo 2019 観戦記

# はじめに
12/14(土)開催の`GDG DevFest Tokyo 2019 `行ってきました。
[公式サイト](https://tokyo.gdgjapan.org/devfest2019)

この記事は個人の備忘録になります。

# 参加したセッション
ちょっと大きくて見にくいですが、全体のセッションはこんな感じでした。
![公式ページのガイド](https://tokyo.gdgjapan.org/img/devfest2019/DevFestTokyo2019.png)

今回は、普段業務で使うものはもちろん、
普段触れていなくても来年使いそうな技術のキャッチアップ目的で参加してきました。

## 11:30~ 遅刻+企業ブース周り
~~前日の忘年会で夜遅くまで飲んでいて、当日朝も油断して~~ 遅刻して参加しました。
開会式は参加したかったんですが、のんびりする時間が出来たのでのんびり企業ブースを周り、
ノベルティグッズを収集しました。
(CircleCI Tシャツ いただきました)

LINEの企業ブースでも結構ゆっくり説明を聞くことができて、いくつか自社公開のOSSを

元記事を表示

MacにGoをインストールする

とりあえずGoを始めようとして、[A Tour of Go] をやってみました。
が、その事前準備のインストールで躓きました…。
これから同じような経験をする方がいらっしゃるのではないかと思い、備忘録も兼ねて投稿します。
よりよい方法やバグ等ございましたら、アドバイスいただけると光栄です。

# 環境

+ macOS
+ Homebrew
+ Go (v1.13.4)

# やってみたこと

## インストール

とりあえず、HomebrewでGoをインストールします。

“`bash
$ brew install go
“`

## 確認

### バージョン確認

インストールが完了したら、バージョンの確認をします。

“`bash
$ go version
go version go1.13.4 darwin/amd64
“`

### 実行環境の確認

次に、[公式のスタートガイド](https://golang.org/doc/install?download=go1.13.5.darwin-amd64.pkg) から、実行環境のテストを進めます。

“`bash

元記事を表示

動画ファイルをWeb経由で取得して、そのままCloud Storageにアップロード

# お題
表題の通り。AWSのS3に署名付きURLでアクセスして取得した動画ファイルをそのままCloud Storageにアップロードする要件があったので、事前にちょっとお試しで実装してみる。
今手元に持ってるのがGCPのアカウントだけなので、「S3から署名付きURLで」という部分は端折って、GCPのCloud Storageに別バケット用意してそこに取得対象の動画ファイルを置いて(パーミッション付けて)おくことにする。

# 前提
– GCPの何たるかについては説明しない。
– `gcloud`コマンドの使い方やローカルへのクレデンシャル取得方法などは説明しない。

# 開発環境
## # OS – Linux(Ubuntu)
“`
$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”18.04.2 LTS (Bionic Beaver)”
“`

## # 言語 – Go
“`
$ go version
go version go1.13.3 linux/amd64
“`

## # パッケージマネージャ – Go Modules

#

元記事を表示

Go langでfwを使わずにcrudのappを作成しました 2

part 1
https://qiita.com/dossy/items/721db0ab74afd8e78599
さぁ、part 1でhttp requestとdb 接続ができるようになりましたので、本格的にcrudの処理を行いましょう。
main.goにそれぞれのrequestが呼べるように記述しておきましょう。

“`main.go
http.HandleFunc(“/new”, handle.New)
http.HandleFunc(“/create”, handle.Create)
http.HandleFunc(“/edit”, handle.Edit)
http.HandleFunc(“/update”, handle.Update)
http.HandleFunc(“/delete”, handle.Delete)
“`

# createを定義
createするときは
formが必要なのでformがあるnew.htmlを呼び出します。これは/newのリクエストを送ってhtmlを表示させます。

“`handle/handle.go

func New(w htt

元記事を表示

Go langでfwを使わずにcrudのappを作成しました 1

go langを勉強し始めて、何かappを作れないかと思っていたので簡単なcrudのapp作成に打ち込みました。

# 下準備

まず、始めるに当たって、go langの基礎を学んでおく必要があるかと思います。

###### go langのinstallはやっておいてください
###### goの構文や概念の理解
slice,struct,型決め,変数の定義などなど。基礎的なところで大丈夫かと思います。(自分もそんなになので)

#tree構造

todo/ (root)
├handle
┃ └ handle.go
┣serv
┃ └ data.go
┣database
┃ └ db.go.go

└ main.go
└ index.html
└ new.html

こんなんです。

handleはhttpのリクエスト処理の役割
servはdbから情報を引っ張ってきたりする役割
databaseはdbと繋げる役割

#serverを立ち上げる

“`go:main.go
package main

import (

元記事を表示

Goで経過時間を計算するパッケージを作った

# 動機

年月を計算する処理がなかったから。

> X は Y から A 年 B ヶ月 C 日 D 時間 F 分 E 秒 経過しています

というのをやろうとすると、

> C 日 D 時間 F 分 E 秒

はタイムスタンプの差から計算することができますが、それ以降はうるう年などの関係から単純に計算することができません

# 作ったもの

https://github.com/usk81/tiff

## 使い方

“`go
d := New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.Local), time.Date(2001, 12, 10, 11, 10, 20, 0, time.Local))

// 時間差の取得
years, months, days, hours, mins, sec := d.Term()
// years: 1
// months: 11
// days: 9
// hours: 11
// mins: 10
// sec: 20

// 年単位で計算で経過時間を計測
years = d.Ye

元記事を表示

goでcliツールを作ってみる

この記事は[Fusic Advent Calendar](https://qiita.com/advent-calendar/2019/fusic)15日目の記事です。

こばんは。お久しぶりです。まっさんです。
アドベントカレンダー何を書こうか迷っていたら、こんな時間になっていまいました。良い子はちゃんと事前に準備しときましょう。

とくに何も閃かなかったので、[弊社](https://fusic.co.jp/)の一部のメンバーで行っている朝の15分輪読会で、絶賛勉強中のgo言語について書いてみようと思います。(golang初学者ですので、誤り等ありました。ご指摘いただければ幸いです)

## 社内のニコニコカレンダーのcliツールを作ってみる

弊社には、@Y_uuu が作成した、nicoleというニコニコカレンダーがあります。
社員の20〜50%が日々投稿する人気ツールです。
そんなニコニコカレンダーのcliツールを作ってみました。リファクタリングとか、してないので、色々ツッコミどころ満載ですが、こんな感じです。

“`Go
package main

import (

元記事を表示

【爆速】Go入門

この記事は2019新卒 エンジニア Advent Calendar 2019の15日目の記事です。

今回は、爆速でGoに入門していきます。

この記事を読み終えれば、Goの基礎は身についたと言っても過言ではないでしょう。

#Hello World

“`
package main

import “fmt”

func main() {
fmt.Println(“Hello World”)
}
“`

“`
$ go run main.go
Hello World
“`

#Packages
Packageは名前空間を分けるための仕組みです。

同パッケージ内のメンバは無制限に参照することができますが、他のパッケージのメンバにアクセスするにはimport文が必要になります。

上のHelloWorldのコードでは、以下のようなfmtパッケージをimportしています。

“`
package fmt

func Println(…) {

}
“`

#Exported names
最初の文字が大文字で始まる名前は、外部のパッケージから参照できるエク

元記事を表示

Go、Node.jsのプログラム間でRPC通信をする

#概要
`gRPC`を使用して、Go、Node.jsのプログラム間でRPC通信をします。
クライアント側をGo、サーバ側をNode.jsが担当します。

環境
MacOS Catalina: 10.15.1
Go: 1.13.4
Node.js: 10.15.3

#クライアント(Go)の作成
クライアント側のディレクトリを作成します。

“`
$ mkdir grpc-test-go
“`
クライアント側のディレクトリ構成は最終的に以下のようになります。

“`
$ cd grpc-test-go
$ tree
.
├── bridge
│   ├── bridge.pb.go
│   ├── bridge.proto
│   └── go.mod
├── client.go
└── go.mod
“`
###.protoファイルの作成

protoファイルを作成して、仕様を定義します。
型に`repeated`をつけると配列になります。
[公式ページ](https://developers.google.com/protocol-buffers/docs/proto3)を参

元記事を表示

GAEのデプロイが成功したらGopherが飛ぶようにして開発モチベーションを維持しよう!

# まとめ
* 趣味開発のモチベーション維持のため、デプロイ時に通知してくれるプログラムを作った。
* ただ通知するだけだと愛想ないので、Gopherを飛ばしてみました。
* Gopher 可愛い! コミットするのが楽しみになった!~~気がする~~

# はじめに
開発のモチベーションを維持するのは難しい。

はじめは発想と情熱に任せてガリガリコードを書いていても、ある程度進んでくると
次第にモチベーションが低下してしまうものです。
恒常性維持機能の為せる業か、理由はわかりませんが、開発者なら経験したことがあるでしょう。

現在、私は趣味で Google App Engine 上で動くバックエンドAPIサーバを作成していますが
モチベーションや集中力の低下を感じていました。

____

そこで以前何かの雑誌で読んだ、開発メンバーのモチベーションを高める方法を実践しました。
方法はいたって簡単です。

***進捗や変化を大袈裟に見える化する***

記事では、開発チームのモチベーション維持のため、以下のような方法が紹介されていました。

* 不具合発見時にパトライトを光らせる
* リ

元記事を表示

OTHERカテゴリの最新記事