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

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

GitHubのTUIツールを作った

## 始めに
以前に [VimでGitHubを操作するプラグインgh.vimの紹介](https://qiita.com/gorilla0513/items/480d454ca74868eb07bd) という記事を書きました。
こちらの記事で紹介した`gh.vim`はVim上でGitHubの機能を使えるようにしたVimプラグインです。仕事でがっつりGitHubを使うならとても便利なプラグインと思っています。

しかしVimを使っていない人もたくさんいるので、そういった人向けのツールあったほうが良いかなと思い、GitHubのTUIツール [github-tui](https://github.com/skanehira/github-tui) を作りました。
CLIと比べ、TUIはインタラクティブに、そして直感的に操作できるというメリットがあるので便利なのではないかなと思っています。
余談ですが過去にDockerのTUIツール [docui](https://github.com/skanehira/docui) を作ったりもしました。

[github-tui](https://git

元記事を表示

UART を使ってマイコンボード – PC (Go のプログラム) 間で通信する

## ゴール

* UART がどんなものか何となくわかるようになる
* UART を使ってマイコンと PC で送受信ができるようになる
* UART を Go で使用して Windows から扱えるようになる

## 背景

マイコンボードで遊ぶにあたって、センサなど周辺モジュールは SPI や I2C のインターフェースとなっている事が多いです。
なので、今まで UART は知っていても使ったことがありませんでした。
今回は簡単な試作品を作成して、UART をマイコンで扱えるようにしてみようと思います。

## UART とは

UART は、自分の認識では一般的に Serial 通信を行うための I/F としてよく用いられると思っています。
Wikipedia による概要は以下です。

UART (Universal Asynchronous Receiver/Transmitter, ユーアート) は、
調歩同期方式によるシリアル信号をパラレル信号に変換したり、その逆方向の変換を行うための集積回路である。
本機能のみがパッケージングされたICで供給されるものと、マ

元記事を表示

AtCoder Regular Contest 113のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/arc113

# A

“`Q_A.go
package main

import (
“fmt”
)

func enum_dividors(AB int) int{

var num int = 0
var d int
for i:=1; i*i<=AB; i++{ if AB%i == 0{ num ++ d = i } } if (AB % d == 0) && (AB / d == d){ num = num * 2 - 1 } else { num = num * 2 } return num } func main() { var K int fmt.Scanf("%d", &K) va

元記事を表示

Sqlboilerの設定ファイルがうまく読み込まれない

# Sqlboilerの設定が正しいはずなのに読み込まれない。。
Go言語で[Sqlboiler](https://github.com/volatiletech/sqlboiler)を採用したのですが、設定周りで結構ハマってしまってしまったので、備忘録として記載します。
TOMLの設定正しいのに、なぜか読んでくれない。このエラー出る。。って人は参考にしてください。

“`
found key user in config, but it was not a string ()
“`

## SQLBoiler?
Go言語のORMです。
GORMと、SQLBoilerが大体有名どころみたいです。
GORMは、モデルファーストなフレームワークで評判も良さそうですが、すでにテーブル定義があったので、スキーマファーストらしいSQLBoilerをORMに使うことにしました。

## 使ってみる
sqlboiler.toml(yamlでもいいらしい)をルートに配置して、DBの接続設定を書くと、DBに接続してスキーマからモデルを生成してくれるツールです。
やりかたは[公式のReadm

元記事を表示

go testで”go: cannot find main module; see ‘go help modules'”が出てきたとき

Goのバージョンをアップデートした後にgo testを実行したら,

“`
go: cannot find main module; see ‘go help modules’
“`

と出てきて,先に進まない

調べてみると,GO111MODULEという環境変数が問題らしい
この環境変数が’on’になっているのが問題だと書いてあるところが多いのだが,私の場合は何も入っていなかった
## 対処方法
GO111MODULEを’auto’と設定するとうまくいった

go1.13以降だと,go env コマンドに -w オプションを付けて環境変数を設定できる

“`bash
go env -w GO111MODULE=auto
“`

ok.

## 参考文献
[Go 言語の環境変数管理](https://text.baldanders.info/golang/go-env/)
[VSCodeでGo開発、”cannot find main module;”](https://www.takunoko.com/blog/vscode%E3%81%A7go%E9%96%8B%E7%99%

元記事を表示

GO言語から初めてみました(^O^;)

#とにかく右も左もわからず、がむしゃらに本を見ながら打ち込んでみます。プログラミング超初級の方の為の内容です。そして↓のコードはGO言語になります。
“`hello.go

package main

import “fmt”

func main() {
fmt.Println(“はじめまして!”)
}
“`

package(パッケージ)の中にmain(メイン)という関数?があるってことでいいのかな?

import(インポート)はプログラミングでライブラリ?を読み込むことを示すらしい。で、(””)このダブルクォーテーション内にあるfmt(エフエムティー)というのもパッケージの1つでフォーマット(書式)を思わせるよう、ターミナル?に内容を表示する為の関数?を定義しているようです。

func(ファンク)は関数?を示す語で、横にmain(メイン)を付けるのが決まりだそうです。

そしてfmtパッケージにあるPrintln(プリントライン)という関数?で(はじめまして!)の括弧内の内容を出力させます。

—————————-
**<関数>

元記事を表示

AtCoder Beginner Contest 192 C – Kaprekar Number(Golang)

#はじめに
[SOMPO HD プログラミングコンテスト2021(AtCoder Beginner Contest 192)](https://atcoder.jp/contests/abc192)の[C – Kaprekar Number]のメモです。

#どのような問題だったか

– 入力は、「N, K」(例:436, 2)
– Nの各桁の数字を大きい順に並べる(例:436が与えられた場合、643にする)
– Nの各桁の数字を小さい順に並べる(例:436が与えられた場合、346にする)
– それぞれ並び替えたものを除算した結果を再度並び替えて除算とK回数繰り返した時の数を出力する(1回目643-346=297, 2回目972-279=693。出力は、「693」)

詳細は、[C – Kaprekar Number](https://atcoder.jp/contests/abc192/tasks/abc192_c)にてご確認ください。
主に求められるポイントは以下で、ほぼ言語仕様への理解が必要な問題です。

– 入力された数値を各桁ごとに分解できること
– 数字の降順ソートができる

元記事を表示

slackの操作をシェルプロっぽくしてChatOps捗りツール作りました!

# まえせつ

slack使ってるとネイティブアプリが**Webアプリぽい操作感**なのに、**ターミナルがシェル**なのでモヤる時ありませんか?

– メッセージを再編集するのに**↑キー**で履歴を選びたい。ネイティブアプリの実装は何か違う感が・・
– 特定の人へのメンションを多用するので毎度コピペするのが面倒。**@漏れで読んでくれない**、とか。
– 同じ入力をするのに**エイリアスみたいなので入力**を減らしたい。ファイルサーバーの途中までのパスとか。

特にslack→サーバーへコマンド投げ込みボットが居る場合はとっても面倒になります。
ボットを呼んでコマンド投げて、メンション入れて確認依頼して・・次のコマンド入れて・・をコピペして繰り返すことになります。

### というのをUXを解消してくれるのが、このツール!

# 作ったわ!

Qiita/Zennの投稿をGitHubプロフィールに自動反映するためのツールを作った

この記事は Feed で GitHub の README.md に反映されるはず。という実験用のエントリです。

記事はこちら:https://zenn.dev/ikawaha/articles/20210221-c8f2d9ac028ae49d551a

元記事を表示

go の chan のことをよく知らなかったので試してみた

# go の chan のことをよく知らなかったので試してみた

## 知っておくといいかもしれないこと。

go の chan が close済みかどうかを知る方法は、昔あったらしいけど今はない。
途中のバージョンで削除されたらしい。

削除された理由はおそらく、無いほうがいいから。あるとむしろトラブルの原因になる。
「close済みでなければ xxx する」というコードを書いても、「close済みでなければ」と「xxxする」の間で他人が close する可能性があり、それを排除することができない。

## chan が nil だったり close済みだったりする場合の動作

### nil の chan からの読み出しと書き込み。

そこで止まり、書き込み・読み出しが終わることはない。
それが唯一の goルーチンの場合、panic する。Recover できない。

### close済み の chan への書き込み

panic する。Recover できる。
`send on closed channel` というメッセージ。
型は `runtime.plainError`

元記事を表示

バッファって何?

### はじめに
GoのChannelに関して学んでいる最中に,バッファという単語が出てきました.
聞いたことはあるけど,理解はできていない?
いい機会なので,調べてみました!

### 簡単に

**データをやりとりするときの一時的な記憶領域**
のこと.

### きちんと

英語ではBufferと書いて,「緩衝材」のような意味を持つようです.
コンピュータの「一時的な記憶領域」のことを指していて,それが転じてビジネスでは「ゆとり」などの意味合いで使われるようになったらしです?

GoのChannelはデータを保持するためのデータ構造で,容量を指定できます.
これが**バッファ**です.
`cap`関数を使うことで,見ることができます.

“` main.go
channel := make(chan int, 5)
fmt.Println(cap(channel))
“`

“` :terminal
0
“`

と出力されました.
このmake関数で,第2引数

元記事を表示

Golang watch file libs

https://github.com/cosmtrek/air
https://github.com/canthefason/go-watcher
https://github.com/fsnotify/fsnotify
https://github.com/radovskyb/watcher
https://github.com/oxequa/realize

元記事を表示

[Golang] 構造体埋め込み時のバリデーションについて

GolangのORMライブラリ`GORM`で、モデルの関連づけを表現した際のバリデーションにつまづいたのでメモ。

## 使用ライブラリ群
– ORM: [GORM](https://gorm.io/index.html)
– Validator: [validator](https://pkg.go.dev/github.com/go-playground/validator)

## 困ったこと
GORMで以下のようなHasOne関係のモデルを作り、それぞれの構造体に`validate`タグを付与している状況。

“`go
type User struct {
ID int `json:”id” gorm:”primary_key”`
Email string `json:”email” validate:”email,required,max=255″`
Password string `json:”password” validate:”required,min=8,max=16″`
Profile Profile

元記事を表示

AtCoder Beginner Contest 192のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/abc192

# A

“`Q_A.go
package main

import (
“fmt”
)

func main() {
var X int
fmt.Scanf(“%d”, &X)

amari := X % 100

ans := 100 – amari

fmt.Printf(“%d\n”, ans)
}
“`

# B
“`Q_B.go
package main

import (
“fmt”
“strings”
“unicode”
)

func IsFirstUpper(v string) bool {
if v == “” {
return false;
}
r := rune(v[0])
return unicode.IsUpper(r)
}

func main() {
var S string

fmt.

元記事を表示

GitHub Actionsでスクレイピングを定期実行して結果をSlackに通知する

# はじめに
GitHub Actionsで処理を自動化する話です。
Go言語でスクレイピングして結果をSlackに通知します。

# 参考にさせていただいた記事
– Go で Slack Bot を作る (2020年3月版)
– https://qiita.com/frozenbonito/items/cf75dadce12ef9a048e9
– Goとgoqueryでスクレイピング
– https://qiita.com/Yaruki00/items/b50e346551690b158a79

# 準備
GitHubとSlackのアカウントが必要です。
Slackはフリープランでスペースを作成し、Botから通知を送るためのチャンネルを作成しておきます。GitHubにはプライベートのリポジトリを作成しておきます(DDoS攻撃などに悪用されないため非公開にする)

# 流れ

以下の順番で作成を進めます。

1. 対象ページから必要な情報を取得する処理の作成
1. Slackアプリの作成とトークンの取得
1. SlackにPOSTする処理の作成
1. GitHub Actionsで

元記事を表示

Goのencoding/json.Decoderが構造体フィールドにjson:”-“タグがついていたら無視する処理を探してみた

## コンテキスト
– Goの構造体のフィールドには”tag_name:tag_value”というようにタグをつけることができる。
– jsonのエンコードやデコードで使われるjsonタグというものがある。
– json.Marshalで構造体->jsonのエンコードする場合に、構造体のフィールドのjsonタグに紐づいた文字列がjsonにおける文字列となる。
– jsonタグに”-“という値を紐付けると、jsonには出力されないフィールドとなる。

“`go
type Struct struct {
Name string `json:”name”`
Age int
Credential string `json:”-“`
}
“`

上の構造体は以下のようなjsonに変換されてエンコードされる。

“`json
{“name”: “Tomori Yu”, “Age”: 21}
“`

## 疑問
– エンコードに関する挙動は以上に見た通りだが、デコードの挙動はどうなっているのだろう。

## 試してみる

“`go

元記事を表示

Go言語とClean ArchitectureでAPIサーバを構築する

# Clean Architectureとは
Clean Architecture(クリーンアーキテクチャ)とは,レイヤに内側と外側の関係性を持たせるアーキテクチャである.
「外側のレイヤは内側のレイヤだけに依存する」というルールを守ることによって,**アプリケーションから技術を分離すること**が目的である.
## アプリケーションから技術を分離すると何が嬉しいのか
ここでの「技術」とは,HTTPやcsv,MySQLなどのことを意味している.
アプリケーションから技術を分離すると,技術を容易に変更できたり,テストコードを書くときに容易にモックできたりする.
例えば,出力をHTTPからcsvに変更したくなったときなどに容易に変更が可能である.
# 各レイヤの責務
Clean Architectureで提案されているレイヤ構造は以下の画像のようなものである.
![CleanArchitecture.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376846/8e040b9e-0385-7b9f-558e-9

元記事を表示

【Golang】文字列を固定幅(固定長)で改行する。全角文字列の WordWrap

> UTF-8 マルチバイト文字列を**全角 n 文字(半角 n*2 文字)の固定長で改行させたい**。
>
> “`text:対象文字列
> あいうえおかきくけこさしすせそたちつてと
> 123456789012345678901234567890
> “`
> ↓
>
> “`text:n=6で改行
> あいうえおか
> きくけこさし
> すせそたちつ
> てと
> 123456789012
> 345678901234
> 567890
> “`

**等幅フォントでない限り、`全角 1 文字 == 半角 2 文字` の幅にならないのは当然**として、それでも CLI アプリやコマンドのヘルプ表示など、なるべく等幅(1 行が固定長)になるように折り返したいのです。

しかし[「”golang” 文字列 固定幅 改行」でググって](https://www.google.com/search?q=%22golang%22+%E6%96%87%E5%AD%97%E5%88%97+%E5%9B%BA%E5%AE%9A%E5%B9%85+%E6%94%B9%E8%A1%8C)も、な

元記事を表示

xerrorsのerrorチェックの判定方法

### はじめに

開発でgoのテストを書いているときに
errorチェックのテストの書き方の使い分けについて話が出たのでひとつの考え方として残しておく。

また、errorのパッケージとして`golang.org/x/xerrors`を使用している。

### 概要

単純にエラーの種類を判断するだけでいいのであれば、`xerrors.Is()`の結果を`assert.True()`に渡してチェックする。
Is()はbaseとなるerrorが両者で一致していればtrueになるので厳密なチェックにはならない。

具体的なエラーの内容までを見るのであれば、エラー文字列まで見ないといけないので
`assert.EqualError()`を使用する。

### テスト対象のコード

“`golang

package main

import (
“golang.org/x/xerrors”
)

var baseDBErr = xerrors.New(“db error”)
var baseCacheErr = xerrors.New(“cache error”)

func mai

元記事を表示

[Go] 1.16 から使える embed で HTML がバイナリに埋め込める!!

シングルバイナリーがメリットと言われてる Go 言語ですが、HTML などのテンプレートはそのバイナリは埋め込むことができませんでした。
(hugo のようにファイルを生成するツールがあるので、無理くり、埋め込むことはできたんだと思いますが。。)

ただ、Go 1.16 から `go:embed` を使うことで、めっちゃ簡単に埋め込むことができるようになりました!!

インポートした後は、これまで通り `http/template` が使えます!

めっちゃ便利なので、おすすめです。

以下、ざっくりとまとめです。

## 参考
https://golang.org/pkg/embed/
https://golang.org/pkg/html/template/

## フォルダ配下全てを読み込み

下記のように書くことで、`templates` フォルダ配下のファイルを読み込みできます。
その後は、`f` を経由してアクセスできるようになります。

“`go
//go:embed templates
var f embed.FS
“`

そう!これだけ!

## 読み込んだテン

元記事を表示

OTHERカテゴリの最新記事