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

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

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

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

# 概要

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

“`
Chatbot: 「他に何かできることはありますか?」
User: 「今日は疲れたなー」
Chatbot: 「すみません、よくわか

元記事を表示

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

元記事を表示

[Golang] ターミナルの入力とPipe処理の入力を区別する

# 概要

CLIを作る時に、ターミナルからのインプットとPipe処理からのインプットの区別が必要になったのでまとめる

目次
1. ソースコード
2. 実行結果
3. 原理と実装詳細
4. 参考文献

## ソースコード

“` main.go
package main

import (
“fmt”
“io/ioutil”
“os”

“golang.org/x/crypto/ssh/terminal”
)

const (
STDIN = “stdin”
PIPE = “pipe”
)

func main() {
isStdin := terminal.IsTerminal(int(os.Stdin.Fd()))
switch isStdin {
case true:
var stdin string
fmt.Scan(&stdin)
fmt.Printf(“type: %s, text: %s\n”, STDIN, stdin)
break
case false:
input, _ := ioutil.ReadAll(os.Stdi

元記事を表示

GoでClean ArchitectureでのAPIを実装したときにハマったInterfaceの呼び出し方

# はじめに
今回はGoとClean Architecutureの復習を兼ねて、ゼロからAPIを実装したときに詰まった部分を備忘のためにここに記載します。Clean Architectureならびに利用したフレームワークのbeego自体については、あまりふれないので参考文献をご覧ください。

# 詰まった部分
Interface層であるControllerで、構造体を作成する際にどうやってInterface(継承)をわたせばいいのかわかりませんでした。
具体的には、関数`NewStatusController`に渡す引数`appConfigInterface`の構造体と具体的な値です。
渡すべき引数は、作成したInterface(継承)だと思っていたのですが、Interface(継承)を渡すということに、直感的に「?」が生まれました。

“`Go:status.go
package controllers

import (
“yamamon/flathand-bookmark/interfaces/inside”
“yamamon/flathand-bookmark/useca

元記事を表示

Adafruit Trinket M0でTinyGo(シリアル通信編)

#はじめに
[前回](https://qiita.com/quadnine/items/cfe161e126d4391a8753)に続き、今回はTinyGoとMacとの間でシリアル通信してみる
#セットアップ
###MacでTTYデバイスを確認
“`
$ ls /dev/tty.usb* [/Users/takaaki]
crw-rw-rw- 1 root wheel 18, 40 3 8 15:55 /dev/tty.usbmodem14101
“`
Adafruitが繋がっているTTYデバイス名を確認しておく
#実行コード
“`go:main.go
package main

import (
“time”
)

func main() {
i := 0
for {
time.Sleep(time.Millisecond * 1000)
print

元記事を表示

Go で Slack Bot を作る

シンプルな Slack Bot を Go 言語で作ってみます。
順を追って作り方を解説していくので「サンプルコードだけ見たいよ」という方は [こちら](#終わりに) に記載されているものをご参照ください。

## 作るもの

下図のように Bot に対しメンションをつけて `ping` と送ると `pong` と返してくれるだけのシンプルなものです。

![slackbot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586035/dca85675-4c76-0be8-6cec-44d3b853b62b.png)

Slack からのイベント受信には [Events API](https://api.slack.com/events-api) を使用します。同様に Slack からのイベントを受信する方法としては WebSocket でやり取りする [RTM API](https://api.slack.com/rtm) があり、こちらであれば App 側から Slack に接続しにいくのでサーバー

元記事を表示

[Golang] windows用にtouchコマンドを作ってみた

# 概要

windowsでtouchが使えないので、以下の機能を持つtouchコマンド作ってみた。

1. 複数ファイルを一度に作る (例) touch file1 file2 file3
2. 既存ファイルは上書きしない

もっと綺麗に書ける案があれば教えてください。
[githubレポジトリ](https://github.com/youk-h/golang-cli/tree/master/touch)

## mainコード

mainコード

“`main.go

package main

import (
“errors”
“flag”
“os”
“sync”
)

func main() {
flag.Parse()
execute(flag.Args())
}

func execute(fileNames []string) {
wg := sync.WaitGroup{}
for _, name := range fileNames {
wg.Add(1)
go

元記事を表示

PermutationとBST

# Go Data Structures: Binary Search Tree
https://flaviocopes.com/golang-data-structure-binary-search-tree/

# Generate all permutations
https://yourbasic.org/golang/generate-permutation-slice-string/

元記事を表示

Go バイナリファイルの読み書き

# Go バイナリファイルの読み書き

今回は、Goで固定長と可変長なデータがあるバイナリファイルを読み書きしてみたいと思います。

## やりたいこと

複数個ファイルを1つのバイナリファイルにする。(結合)

バイナリファイルを複数ファイルに書き戻す。(分割)

## データ構造

下記のデータ構造を1つのファイルとして扱い、連結していく。

Offset: 00 01 02 03 04 05 06 07
00 ファイル名サイズ
(4 byte 固定: BigEndian)
ファイルサイズ
(4 byte 固定: BigEndian)
08 ファイル名
(可変長: Lit

Golang mockery/testifyで高階関数をmockする

golangでテストを書く際、[vektra/mockery](https://github.com/vektra/mockery)による[stretchr/testify](https://github.com/stretchr/testify)で使用できるmockの自動生成が非常に便利なのですが、双方クイックリファレンス以外の細かいドキュメントがあまり存在せず特殊な関数をmockしようとする結構悩みます。

最近調べまくったもので**「無名関数で書かれた高階関数のmock」**はズバリの解決方法が検索してもtestifyのissueくらいしか出てこなかったので同じく悩める人のためにここに残しておきます。

# ポイント かつ 結論
* 引数を元にmock内の処理を独自に書きたいなら[Call.Run] (https://godoc.org/github.com/stretchr/testify/mock#Call.Run)を活用する
* mockの戻り値を動的に変更したいなら[Call.Return](https://godoc.org/github.com/stretchr/te

Go Windows GUI Walk examples

# Go Windows GUI Walk examples

GoでWindowsのGUIを作るときは、
`lxn/walk` というpackageを使っています。

## lxn/walk

GitHub – lxn/walk: A Windows GUI toolkit for the Go Programming Language
https://github.com/lxn/walk

上記のリポジトリ内に `examples` というフォルダがあり、
いろいろなコード例が入っています。

https://github.com/lxn/walk/tree/master/examples

“`text
./examples
├─actions
├─clipboard
├─databinding
├─drawing
├─dropfiles
├─externalwidgets
├─filebrowser
├─gradientcomposite
├─imageicon
├─imageview
├─imageviewer
├─img

[Go]1行加えるだけで interface の実装を強制するテクニック

## 本記事の目的

Go の interface を使って抽象的にオブジェクトを扱いたいときにメソッドの実装漏れってないでしょうか?
抽象化したい構造体が多くかったり、interface のメソッドの定義を変更した場合に簡単に発生しちゃうことだと思います。

今回はその問題を起こさないために、Goコンパイラに interface の実装漏れを伝えてもらえるようになる簡単なテクニックを共有します。

## 説明

具体例に `Do()` というメソッドを実装するだけで `Doer` になれる interface を定義してみました。
`Person` は `Doer` の `Do()` メソッドを実装しているので `Doer` です。

https://play.golang.org/p/W9Gd3gZKY2z

“`go
type Doer interface {
Do()
}

type Person struct {
Name string
}

func (p Person) Do() {
fmt.Printf(“My name is %s. I am Doer!!!!

Goaの設定中に「”protoc”: executable file not found in $PATH:」と出たときの対処法

# 筆者の環境
– macOS Catalina 10.15.3
– Go言語 1.14
– Goa v3.0.10

# Go言語でGoaを使うところに躓いたところ。
ネットの日本語記事はバージョンが古かったりカオスだったので、公式ドキュメントを見ながら進めていきました。

Getting Started · Goa :: Design first.
https://goa.design/learn/getting-started/

ドキュメントを見ながら進めて以下のコマンドを実行したところ、エラーを出しました。

“`zsh:zsh
goa gen calc/design
failed to run protoc: exec: “protoc”: executable file not found in $PATH:
“`

落ち着いてドキュメントの上の方を見るとこんなことが書いてありました。
https://goa.design/learn/getting-started/#prerequisites
> The service makes use of gRPC a

Go text/template で文字列作成

# Go text/template で文字列作成

みなさん、こんにちは!
Go書いてますか?

今回は、`text/template` を使って ひな形 から 文字列 を生成する方法をご紹介します。

## text/template

公式が作成している 標準package なので すぐに使えます。

* template – The Go Programming Language
* https://golang.org/pkg/text/template/

似たようなpackageで `html/template` というのがありますが、
これはコードインジェクションに対して安全なHTML出力を生成するものなので
そういった目的がないときは、 `text/template` を使用しましょう。

* template – The Go Programming Language
* https://golang.org/pkg/html/template/

ちなみにどちらも使い方は、同じです。

## 使ってみる

文字列のひな形 と データ を入れ込むことによって、目

go:mapstructureを使ってJSONファイルを開いて構造体を返す汎用的な関数

# やりたいこと
* いろんなファイルを読み込む必要がある
* いちいちそのファイル専用の関数を作りたくない
* JSONファイルパスと構造体を渡すだけで済む汎用的な関数を作りたい

# コード
“`json:config.json
{
“ip_addresses”: [“127.0.0.1”, “127.0.0.2”, “127.0.0.3”]
}
“`

“`go:main.go
package main

import (
“fmt”
“github.com/mitchellh/mapstructure”
“encoding/json”
“io/ioutil”
)

type Conf struct {
// ここ重要。アンダースコア必要
Ip_Addresses []string `json:”ip_addresses”`
}

func main() {
const confPath = “./config.json”
var conf Conf
convertJsonFileToStruct(confPath, &con

意外と知らない並列処理のメリット

Quoraの[並列処理のメリットは何ですか?](https://qr.ae/pNtlKE)を参考にしてます。

処理の前後関係がないアルゴリズムを同時に実行できる。

単純にN個の並列化で処理時間がN分の1になるわけではないことに注意

日本のスーパーコンピュータ『京』も並列コンピュータです。

【初心者に最適】なぜ我々はRPAに頼るのか。いまだに誰も教えてくれないエンジニアが使うべき自動化ベストプラクティス(2020年03月時点)

[なんでこんなクド過ぎるタイトルなのかは前回をご参照ください。](https://qiita.com/ykato/items/03306aaa55d091d61d9b)

記事としては**業務経験に漬け込んだ自動化のツール作ったので見てマサカリでも良いから感想欲しいです!という内容**です。*興味無ければそっ閉じお願いします。*

とりあえず、こんなの作ったので見て!

[opsapi](https://github.com/yasutakatou/opsapi)

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/2f1d60da-be12-552d-043b-fef169730151.gif)

 リポジトリに書いてありますが、オジサンが中学生英語で書いたものをさらにオジサン意訳しますね!

## 前説

 定期的な申請とかeラーニングみたいなただ手を動かすメンドクサイ仕事ありますよね?
あなたは人力でどうにかしなきゃならないし、また同僚もおんなじタスクをしなきゃならない

[ネタ]Excel方眼紙の上に好きな画像を正方形にペイントするツールをGoで作ってみた

# 概要

日本の文化圏にいれば、どこかで「[Excel方眼紙](https://ja.wikipedia.org/wiki/Excel%E6%96%B9%E7%9C%BC%E7%B4%99)」に出会うことがあるでしょう。
このエントリでは、Excel方眼紙にお気に入りの絵をペイントして眺めてみるツールを作ってみました。

|![lenna_rendered.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/6a54c551-808c-06c2-f30f-574b75813b68.png)|
|:—|
|図:[コンピュータで画像系のサンプルでよく使われるLenna様](https://en.wikipedia.org/wiki/Lenna)をペイント|

# TL;DR;

リポジトリはこちら[https://github.com/hrkt/xlspaint](https://github.com/hrkt/xlspaint)です。
ご自身でビルドするか、[リリースのページから実行形式xls

Neovimでpopup-menuを実装できるプラグイン

## Neovim用のpopup-menuを実装できるプラグインを作りました
[Vim8にはpopup_menu()という関数があり](https://vim-jp.org/vimdoc-ja/popup.html#popup_menu())、ユーザー独自のpopup-menuを利用した機能を作ることができるのですが、これまで残念ながらNeovimには同じ機能は実装されていませんでした。

これは時々問題になることがあります。例えば、プラグイン作者が軽い気持ちで`popup_menu()`を利用すると、Neovimでは`popup_menu()`に相当する機能がないため、Neovimで全く同じ機能を実装するのは一苦労することになります。

今回これを解決すべく、**popup-menu.nvim**というプラグインを作成しました。

https://github.com/kamykn/popup-menu.nvim

## 利用イメージ
見た目はこんな感じです。
top.png