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

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

kindle本の発行情報がSlackを連携したいの考え

### 動機

– 最新の技術本の発行情報を知りたい
– でも自分は毎日kindleの発売情報をあんまり見ない。
– slackで自動通知、しかも技術本があるの時だけ来るは一番ベスト

### 対策
– 最初考え方はProduct Advertising API使いたいけど、でもこのAPIはアカウント作成が必要、しかもアカウント作成は審査がいる、さらにウェブサイト或いはモバイルアプリも必要なので、slack用の通知だけは無理かも。

– そしたらProduct Advertising APIを使ってのサービス [キンセリ](https://yapi.ta2o.net/kndlsl/) から情報收集を考えます

### 実装方法

– golang + [agouti] (https://github.com/sclevine/agouti) でクローラを作りました。
– [Incoming Webhook](https://slack.dev/node-slack-sdk/webhook)を利用してslackに通知

### 結果

実際の結果はこんな感じ:

元記事を表示

gin,gormを使ってgolangでRailsっぽい構成のAPIを作った

#概要
– 仕事で`golang`を使ってみようという話になりAPIを作りました。
– 自分自身も他メンバーも`Rails`使いが多いのでRailsに寄せてMVC構成で作りました。
– `golang`に慣れたメンバーが少なかったのでできるだけ[メジャーで情報が多そうなフレームワーク](https://qiita.com/yumin/items/5de33b068ead564ebcbf)を使おうと考えて`gin`を採用しました。
– 同様にORMも`gorm`がメジャーなようだったので採用しました。
– `golang`自体が手探りの状態だったので主に以下を参考にさせて頂きました。
– 日本語のQiitaの記事[Gin と GORM で作るオレオレ構成 API](https://qiita.com/Asuforce/items/0bde8cabb30ac094fcb4)
– Starが多かった[深センの方が作ったAPI](https://github.com/eddycjy/go-gin-example)
– 自分でもサンプルAPIとして[gin-gorm-rails

元記事を表示

春休みの宿題

#春休みの宿題一覧

春から情報科学研究科に進学するのでこの春休みに準備しなければいけないことをまとめておく。

##プログラミング言語

– [C言語本格入門](https://www.amazon.co.jp/C言語本格入門-基礎知識からコンピュータの本質まで-種田-元樹/dp/4774196169)
– [C++プログラミング〈Vol.1〉 (Computer Science Textbook)](https://www.amazon.co.jp/C-プログラミング%E3%80%88Vol-1〉-Computer-Science-Textbook/dp/489471115X)
– [C++プログラミング〈Vol.2〉 (Computer science textbook)](https://www.amazon.co.jp/C-プログラミング%E3%80%88Vol-2〉-Computer-science-textbook/dp/4894711168)
– [エキスパートPythonプログラミング改訂2版](https://www.amazon.co.jp/エキスパートPytho

元記事を表示

StackDriver Monitoring APIを使ってGCPのメトリックの値を取得する

# 概要
GCPの監視を行うため、`StackDriver` から値を取得し
しきい値を超えていないかチェックする [Nagios](https://ja.wikipedia.org/wiki/Nagios) 用のプラグインを`Golnag` で作成しました。
https://github.com/yuukichi-nankou/check-stackdriver-go

その際、苦戦したので `Golang`で `StackDriver Monitoring API`から値を取得する方法をまとめます。

> つい先日、StackDriverが管理コンソールに統合されました。
> https://cloud.google.com/blog/products/management-tools/cloud-monitoring-dashboards-using-an-api
> それに伴い、管理画面では単に Monitoring という名称になっていますが、
> 本記事では StackDriver Monitoring と記載しています。

# StackDriverからSDKを使って

元記事を表示

Adafruit Trinket M0でTinyGo(外部LED編)

#はじめに
[第2回](https://qiita.com/quadnine/items/829a291c93a1c71a88e1)に続き、今回はTinyGoに外部LEDを接続して点滅させてみる
#動作環境
* OS: macOS 10.15.3
* Go: 1.13.8
* TinyGo: 0.12.0
* マイコン: Adafruit Trinket M0
* LED: [Grove Red LED](http://wiki.seeedstudio.com/Grove-Red_LED/)

LEDは[スイッチサイエンス](https://www.switch-science.com/catalog/1254/)か[マルツ](https://www.marutsu.co.jp/pc/i/829294/)あたりで通販可能

#配線
| Trinket M0 | Grove LED |
|:———-:|:———:|
| D0 | SIG |
| – | NC |
| 3V3 | VCC

元記事を表示

OpenAPI3 + OpenAPI generator でgolangサーバ・TypeScriptクライアントの実装を試す

昨今のマイクロサービス化の流れに伴い、サービス間の情報のやり取りのルールをスキーマとして定義してクライアント、サーバーの開発を行うスキーマ駆動開発が取りた出されている。

今回はOpenAPI3(旧Swagger)をスキーマ駆動開発のツールの一つとして取り上げたが、意外と踏み込んだHello Worldの記事が少なかったので書いた。

## 対象読者

* 最近swaggerやOpenAPIという言葉を聞いて試してみたいが導入に悩んでいる人
* 普段からAPIを使用した開発を行っているがOpenAPIを使ったことがない人
* Dockerや特定プログラミングをある程度まで習熟している人

## OpenAPIとは

REST APIのリクエスト方法やパラメータなどの仕様の記述する定義。
OpenAPIはswaggerで使われていたツールが利用可能で、それらを利用することでAPI仕様書の表示・作成、API仕様に則ったサーバ・クライアントのコード生成が行えるようになる。

OpenAPIのツールでもっとも重要なものは **コードジェネレータ** だと自分は認識している。
コードジェネレータ

元記事を表示

Let’s encryptのバグはNimで実装していたら防げたの?

[Let’s encryptのバグはRustで実装していたら防げたの?](https://qiita.com/komasayuki/items/02785730d486ec4b397f)
という記事を見かけたので、ではNimではどうなのかと思い書いてみました。

# はじめに
Let’s encryptのバグの原因はポインタに起因する実装ミスでした。
「Nimはいいぞ」と言うためだけにNimで実装した場合を検証してみます。

以下引用

> # 原因はなんだった?
> 詳しくは
> https://jovi0608.hatenablog.com/entry/2020/03/09/094737
> のステキなまとめを見たほうがいいのですが、
>
> シンプルにすると、このような実装です。
>
> “`fail.go
> func main() {
> var out []*int
> for i := 0; i < 3; i++ { > out = append(out, &i)
> }
> fmt.Println(“Values:”

元記事を表示

Tecpitの教材「【Go】技術ブログサイトを自作してみよう!」を試してみました / TechCommit企画

[テックコミット](https://www.tech-commit.jp/)さんのお年玉企画で[Tecpit](https://www.techpit.jp/)さんの「【Go】技術ブログサイトを自作してみよう!」を試してみましたので、情報をまとめて見ました!

### 自分の知識
GoはTour of Goを一度なぞった程度

### 完成物

https://damp-journey-45035.herokuapp.com/

### 教材の概要

マークダウンに対応した、記事投稿システムです

### この教材で学べる知識
– echoでサーバーたてる
– Modulesでモジュール管理
– pongo2
– sqlx
– goose(マイグレーションツール)
– freshでホットリロード
– basic認証のかけ方
– 多対多のリレーション
– herokuデプロイ

### ※Goの文法自体の説明はありません!
教材の注意書きにもありますが、Goの文法自体の説明はありません!
そこらは抑えている前提で話が進みます

### 感想
Goの文法はわかったけど、実際どうやって組み立

元記事を表示

ありの~ままの~DBスキーマを、go言語ソースコードに自動変換【xorm/reverse】

はい:clap:
今回ご紹介するのは、こちらの`xorm/reverse`です。
https://gitea.com/xorm/reverse

なんと!
DBのテーブル構造を直接見に行って、go言語の構造体ソースコードに自動変換してくれます。
対象DB種類も、MySQL以外に色々対応しています。

ライセンスは、MITかな?
LICENSEファイルには明示的には書いてないですが、xorm公式ページではMITとなっているので。
https://xorm.io/

こちら、実は2年以上前から開発されているようです。
以前はリポジトリはgithubだったんですが、親プロジェクト`xorm`と共にgiteaに移籍したみたいですね。

また当時のバージョンではC言語や他の言語ソースへもリバースできたんですが、リニューアル以降はまだ`language/golang.go`以外の出力プラグインは作られてないみたいですね。

パブリックリポジトリなので、gitea のアカウントを持ってなくてもマイPCからgit cloneできました。
ただ、EC2インスタンスからのgit cloneは失敗しました。

元記事を表示

Let’s encryptのバグはRustで実装していたら防げたの?

# はじめに
Let’s encryptのバグの原因はポインタに起因する実装ミスでした。
「Rustはいいぞ」と言うためだけにRustで実装した場合を検証してみます。

## 原因はなんだった?

詳しくは
[https://jovi0608.hatenablog.com/entry/2020/03/09/094737](https://jovi0608.hatenablog.com/entry/2020/03/09/094737)
のステキなまとめを見たほうがいいのですが、

シンプルにすると、このような実装です。

“`go:fail.go
func main() {
var out []*int
for i := 0; i < 3; i++ { out = append(out, &i) } fmt.Println("Values:", *out[0], *out[1], *out[2]) fmt.Println("Addresses:", out[0], out[1], out[2]) } ``` ValuesもAddressesも[0]~[2]で同じ値が表示

元記事を表示

めんどくさめのinterfaceを満たすgoのmockライブラリを選定する

今回は、

* interfaceがinterfaceを返す
* 返り値がメソッドチェーン的に自身を返す

…ような若干めんどくさいタイプのinterfaceをmockすることにする。

## mockしたい仕様

“`go:base.go
package example

import “context”

type SampleRepository interface {
Save(ctx context.Context, sample Sample) error
FindByID(ctx context.Context)
Where() SampleRepositorySearchSpec
}

type SampleRepositorySearchSpec interface {
IDIn(id …int) SampleRepositorySearchSpec
NameLike(name string) SampleRepositorySearchSpec
Find(ctx context.Context) (SampleList, error)

元記事を表示

最低限の Go package の作り方・公開方法

自作した Go の package を公開する方法を書いていきます。
実運用する package を公開する際は、テストを書いたりしてください。

# 自分の GOPATH のありかを知る

“`
$ go env GOPATH
/Users/[username]/go
“`

# hello だけを返す package を作成する

“`
$ mkdir -p [得たGOPATH]/src/github.com/[username]/hello
$ cd [得たGOPATH]/src/github.com/[username]/hello
$ go mod init github.com/[username]/hello
$ touch hello.go
“`

“`go
package hello

func Hello() string {
return “Hello”
}
“`

# 公開する

“`
$ git init
$ git remote add origin [GitHub上で作成したリポジトリのURL]
$ git add .
$ git com

元記事を表示

GO言語のポインタについて(勉強中)

今回はGO言語のポインタについて投稿させていただきます。

大学時代にC言語を学んだ際に、私は大苦戦したポインタですが、
GO言語で改めてポインタについて学び、重要性などを感じました。

# ポインタについて

変数のアドレス(番地)を格納する変数です。
自分たちが用いる変数がメモリ上のどの番地(アドレス)にあるかを
数字(16進数)で表記します。
ポインタを用いる事によってある関数から別の関数へ値を変更や更新をすることができます。

# GO言語でのポインタの書き方

まずは、自分の用いた変数のアドレスを出力していきます。

“`GO
package main

import “fmt”

func main() {
test := “Hello World!”

// 変数nameのアドレスを出力
fmt.Println(&test)
}
“`

実行すると16進数が出力されます。
次は、アドレスから自分の用いた変数を出力します。
ポインタの変数に対しては「*」を付けます。

“`GO
package main

import “fmt”

func main() {

元記事を表示

Ubuntu18.04にGoをinstallする作業ログ

# 記事の目的
Ubuntu18.04にgo-langをinstallする作業ログ。

# Ref
https://github.com/golang/go/wiki/Ubuntu

# 作業ログ
“`bash:bash
$ sudo add-apt-repository ppa:longsleep/golang-backports
$ sudo apt update
$ sudo apt install golang-go
$ go version
go version go1.14 linux/amd64
“`

元記事を表示

Golangでのtime packageのいろんな使い方まとめました

# 概要
golangでtime objectを利用してあれこれデータを操作したりすることがあり、その時に調べたことややったことをまとめました。

# 目次
– stringからtime.Timeへ変換
– stringからtime.Timeへ変換(Timezoneを考慮)
– time型objectのTimeZoneのみを変換する
– 日付から特定のTimzoneの00:00:00を作る
– 〇〇前、〇〇後の時刻を取得する
– 2つの時刻を比較する (差分、Before、After、Since、Until)
– 2つの時刻から間の日付リストを作る
– 2つの時刻からその間の特定の曜日の日付リストを作る

# stringからtime.Timeへ変換
“`
dateLayout := “2006-01-02”
dateTimeLayout := “2006-01-02 15:04:05”
dateTarget := “2020-01-28”
dateTimeTarget := “2020-01-28 13:14:15”

dateObject, _ := time.Parse(dat

元記事を表示

Pub/Sub 用の Functions のコードを Github で管理する

## 手順
### 1. Github のリポジトリに Functions のコードを準備する
サンプルコードは Pub/Sub で公開されたメッセージと属性を出力するだけの単純な関数。

“`go:example/function.go
package example

import (
“context”
“encoding/json”
“log”

“cloud.google.com/go/pubsub”
)

// User JSONデコード用の構造体.
type User struct {
Name string `json:”name”`
}

// HelloPubSub Pub/Subからトリガーされる関数.
func HelloPubSub(ctx context.Context, m *pubsub.Message) error {

// メッセージの出力
var user User
if err := json.Unmarshal(m.Data, &user); err != nil {
log.Fatal(err)
}
log.Pri

元記事を表示

Go+GraphQLでCRUD API構築(Mac) -その1-

# はじめに
客先でCRUD用APIを`GraphQL`で構築した際の知見を整理したいと思います。
不要と思われる手順は随時読み飛ばして下さい。
何かの参考になれば幸いです。

# 前提条件

– 開発OS:MacOS High Sierra
– 開発言語:Go(v1.12.3)
– API:GraphQL
– APIフレームワーク:gqlgen(v0.11.1)
– DB:MySQL
– DBフレームワーク:gorm

# 開発環境の整備
プロジェクト作成、Go拡張ライブラリのインストール、DB環境等の整備を行います。

## プロジェクトの作成
本説明では`$GOPATH/src`の直下にプロジェクトディレクトリを作成します。
プロジェクト名は`crud_api`とします。

“`
cd $GOPATH/src
mkdir crud_api
“`
※$GOPATH環境変数はGoのインストールディレクトリを指します。
各自お使いの環境に合わせて設定してください。

## Go拡張ライブラリのインストール
– gqlgen
– gorm
– MySQLドライバー

を順次インストー

元記事を表示

Botが雑談に応えられるようにするWEB APIを公開してみた話【個人開発】

# 対象読者
– チャットボット等を初めとする「対話型」のサービスに興味がある方
– チャットボット等の開発に興味がある方
– チャットボットに雑談を話させたい方
– 対話システムと人間の対話に興味がある方

# チャットボットに必要な「雑談力」

チャットボットを初めとする「対話型」のサービスが様々な場面で活用されている昨今ですが、対話型サービスの開発で非常に厄介なのが、「**ユーザからの問いかけに応答するためのセリフを用意しきれない**」問題です。ある程度シチュエーションや用途が限られる場合や、サービス提供者が会話の選択肢を与えるなどしない限り、対話型サービスは無数のユーザ発話を想定して開発をしなければなりません。とりわけ、ユーザがチャットボットに対して行う「雑談」はこの際たる例です。無数にある雑談のバリエーションに対応するには非常に大きいコストがかかりますが、対応をしないと下記の例のように「**すみません、違った言い方で話しかけてみてください**」のような応答を繰り返す味気ない対話型サービスになってしまいます。

“`
Chatbot: 「他に何かできることはありますか?」
U

元記事を表示

GoのEchoを自動リフレッシュしてくれるスクリプト

# はじめに
GoのEchoを少し触っていて、Flaskのように変更適用時に自動でリフレッシュしてくれる機能があれば便利だなと思いました。特に、ソースコードに影響を及ぼさずに外部から環境を構築することが、ミスを減らすために重要だと感じ、シェルスクリプトを書きました。コイツは、カレント以下の変更を検知するようにしてあるので、`./module/`等の変更にも対応してくれます。

まあまあ便利なものができたなと思っているので、よかったら使ってみてください。

# 実行環境
`fswatch`を使います。

“`bash:
# Mac
$ brew install fswatch
# Ubuntu
$ sudo apt install fswatch
“`

# シェルスクリプト
`Makefile`で`make run`を設定していれば、当スクリプトを同一ディレクトリに配置してそのまま実行すると良いです。

“`bash:autoreloader.sh
#!/bin/bash

function cleanup()
{
app_pid=`/bin/ps -fu $USER| gr

元記事を表示

goxygenをつかって、Go + Front Framework + MongoDB構成のWebアプリテンプレートをかんたんに作成する

## 前置き
githubの[Trending Go repositories](https://github.com/trending/go)を見ていたところ、**goxygen**という面白そうなテンプレート作成ツールがあったので、使ってみました。

リポジトリは下記です。
https://github.com/Shpota/goxygen

リポジトリのトップページに、

*Generate a modern Web project with Go, Angular/React/Vue, and MongoDB in seconds?*

とあるように、コマンド一発叩くだけで、MariaDB + golang + FrontFW(Angular or React or Vue)構成のWebアプリの骨子が出来上がるみたいです。

## インストール
READMEに記載の通り、`go get -u github.com/shpota/goxygen`にて取得します。

## goxygen起動
`go run github.com/shpota/goxygen init [appna

元記事を表示

OTHERカテゴリの最新記事