- 1. Vuguに触れてみた(構文確認編)
- 2. Vuguに触れてみた(環境構築編)
- 3. pion/webrtc のexampleのタイムアウトを伸ばす
- 4. Go言語でAWS SNSにメッセージを送信する
- 5. goose設定ファイルに環境変数を読み込めない(Docker環境)
- 6. GitHub Wikiの目次(ToC)をURLから作成してくれるツールをGo+Ginで作る
- 7. xerrorsの誤った使い方について
- 8. Golang sync.WaitGroupとsemaphoreを使って10並列で画像ダウンロード
- 9. 【Go】構造体のフィールドに定義してある`_ struct{}`はどういう意味?
- 10. bykof/statefulを使って、Golangで状態遷移(State machine)を扱う
- 11. Cognito UserPoolsのAuthorizerをGoでデコードする
- 12. プロセスをあいまい検索してkillするツールをGoで作った
- 13. Diff+Historyコマンド=hifferで快適なターミナル作業しようぜ
- 14. 【Golang】newとmakeの違い
- 15. golang raceについて 競合チェック
- 16. [テスト入門]外部APIを実際に叩いたりしていませんか? GoでDIによるテストモック
- 17. GraphQLにおける認証認可事例(Auth0 RBAC仕立て)
- 18. 【Golang】ポインタ
- 19. エディタで複数のファイルを簡単にコピーするコマンドをGoで作った
- 20. Windows 版の TinyGo で SAMD5x CPU の浮動小数点演算でクラッシュする問題への対策
Vuguに触れてみた(構文確認編)
# はじめに
こちらは別記事([Vuguに触れてみた(環境構築編) ](https://qiita.com/inagacky/items/a1c8f13f0aa3c956ef5f
))の続きです。
今回は実際に構文確認しつつ、Vuguに触れていきたいと思います。Vuguに触れてみた(環境構築)のファイル構成前提で始めますので、ご了承ください。
また、今回作ったものに関しては下記リポジトリに置いています。(更新するかもです。)
https://github.com/inagacky/vugu_sample# 構文確認
まずは `root.vugu` を元に、色々と触れていこうと思います。
初期状態だと色々文言が入っていますので、削除してから始めています。## vg-if
`Show Button` というボタンをクリックすると、 `Show` というbool型の値が変わり、
`SAMPLE TEXT` という文言を表示するだけのコードです。“`go:root.vugu
Vuguに触れてみた(環境構築編) # はじめに
一時期小耳に挟んだ `Vugu` という技術について、今更ながら触れてみたので記事にしてみました。# Vuguとは
`Golang` で、 `Vue.js` っぽくフロントエンド を記述できるライブラリです。
`WebAssebmly` で実行されるのでコードの漏洩がなかったり、実行速度も比較的高速らしいです。
公式URLは下記
https://www.vugu.org/
`2020/04/26` に `v0.3.0` が出たようなので、まだまだ発展途上の技術ではあります。# 環境構築
環境構築だけなら、下記公式の手順を行なっていけばできます。
https://www.vugu.org/doc/start## 前提
`Golang` の `v1.14` 以上らしいので、予めインストールをお願いします。
Macで、homebrewを使っていれば、下記コマンドだけでGolangのインストール可能です。“`
% brew install go
“`
その他の方法に関しては、公式のインストールをご確認ください。
https://golang.org/doc/ipion/webrtc のexampleのタイムアウトを伸ばす
[pion](https://github.com/pion/webrtc) は Go で書かれた WebRTC 実装です。
これを試してみようとして、まずexampleを動かしてみようとしました。https://github.com/pion/webrtc/blob/master/examples/README.md
通信を行うときに両者でお互いの通信条件を取り交わす必要があります。これをシグナリングと呼んでいます。
WebRTCではシグナリングの方法は仕様で定めらていません。
ここのexamplesでは、それを「コピべ」によって行うようになっています。(1) webページのフォームに表示された文字列をコピべして実行ファイルの標準入力に食わせる。
(2) 実行ファイルの標準出力に出てきた文字列をコピべしてwebページのもうひとつのフォームに入力する。
(3) webページ上の’Start Session’のボタンを押す。やってみると、これがなかなかうまくいきません。(3)のボタンを押す直前でタイムアウトしてしまいます。
コピペする文字列は百行近くある巨大なものなので、スGo言語でAWS SNSにメッセージを送信する
## 概要
Amazon Simple Notification Service(SNS)で、Go言語のSDKを使ってトピックに対してメッセージを送信します。## 環境
– Go : 1.14.3
– Mac OS X : 10.15.4
– AWS SDK for Go## シンプルな実装
“`go:シンプルなメッセージ送信
package mainimport (
“fmt”“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/sns”
)// TopicARNとRegionは環境に合わせます
const (
TopicARN = “arn:aws:sns:XXXXXXXXXXXXXXXXX”
AwsRegion = “XXXXXX”
)func main() {
// SNSクライアントの作成
mySession := session.Must(session.Negoose設定ファイルに環境変数を読み込めない(Docker環境)
# 概要
Docker環境でGo製マイグレーションツールのgooseを使用する際、設定ファイルである`dbconf.yml`が環境変数を読んでくれませんでした。### dbconf.yml
~~~yml
development:
driver: mymysql
open: $MYSQL_URI
~~~
環境変数は、**$変数**という形式で読み込んでくれるはずなのですが・・・([公式参照](https://bitbucket.org/liamstask/goose/src/master/))### Dockerfile
~~~dockerfile
FROM golang:1.14.2-alpineWORKDIR /go/src/server
COPY . .
ENV GO111MODULE=onRUN apk add –no-cache \
alpine-sdk=1.0-r0 \
&& go get github.com/pilu/fresh \
bitbucket.org/liamstask/goose/cGitHub Wikiの目次(ToC)をURLから作成してくれるツールをGo+Ginで作る
GitHubのWikiを充実させたい => 目次手書きで書くのが面倒!
ということでGo + [Gin](https://github.com/gin-gonic/gin)を使ってToCジェネレータを作成しました。
![Screen Shot 2020-05-24 at 23.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/d9111f6c-d22f-2d71-00b4-b60fbe249c6c.png)
GitHub WikiのURLを入力するとToC(Table of Contents(目次))を作成してくれます。
デプロイは [Zeit Vercel(旧 Zeit Now)](https://vercel.com/)で行おうとしたのですがうまくいきませんでした。(このサービスめっちゃ好きなので残念)
https://github.com/yousan/toc-generator/
## Gin
Goのウェブ用フレームワークです。ルーティングやテンプレートなどの機能xerrorsの誤った使い方について
# お題
Go 1.13 で `%w` によるログのラップが可能になった。
が、その方式でログ出力すると(エラー時の)スタックトレースが吐けない。
ので、スタックトレース吐くために [xerrors](https://godoc.org/golang.org/x/xerrors)パッケージが用意されている。
これで、エラー時にスタックトレース付きでログが吐ける。
といった話は、既にたくさん記事があるので、この`xerrors`パッケージをこうやって間違って使ってしまったという事例を2つほど。# 開発環境
## # OS – Linux(Ubuntu)
“`
$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”18.04.4 LTS (Bionic Beaver)”
“`## # バックエンド
### # 言語 – Golang
“`
$ go version
go version go1.13.9 linux/amd64
“`### IDE – Goland
“`
GoLand 2020.1.2
Build #GO-201.Golang sync.WaitGroupとsemaphoreを使って10並列で画像ダウンロード
sync.WaitGroupとsemaphoreを使って10並列で画像ダウンロードするサンプルスクリプトです。
並列実行数が10を超過しないように、semaphoreを使っています。便利です
[sync.semaphore](https://github.com/golang/sync/blob/master/semaphore/semaphore.go#L40) の実装を読んでみると面白いですよ[golang.org/x/sync/semaphoreを使ってゴルーチンの同時実行数を制御する](https://blog.lufia.org/entry/2018/01/26/141300) を参考にしつつ実装してみました
“`go:main.go
package mainimport (
“context”
“fmt”
“io”
“net/http”
“os”
“sync”“golang.org/x/sync/semaphore”
)var wg *sync.WaitGroup
var sm = semaphore.NewWeighted(10) //【Go】構造体のフィールドに定義してある`_ struct{}`はどういう意味?
## 【Go】構造体のフィールドに定義してある`_ struct{}`はどういう意味?
ライブラリのコードを読んでいると`_ struct{}`というフィールドが定義してある構造体をみかけることがありますが、これはどういう意味なのか?というお話です。
結論としては、これは構造体を初期化する際に、フィールド名の指定を強制する意図で宣言されています。
### blank identifierを用いた構造体の定義とComposite literalsによる構造体の初期化
“`go
type SomeType struct {
Field1 string
Field2 bool
_ struct{}
}
“``_`はblank identifierと呼ばれるものです。
これは、`dev/null`に似ていて、blank identifierに割当てられた値や宣言は、無害な方法で、~~虚無のブラックホールへと~~捨て去られます。(`_`がブラックホールの穴に見えてくる…)ここでは詳しく説明しませんが、[Effective Go](htt
bykof/statefulを使って、Golangで状態遷移(State machine)を扱う
## はじめに
ビジネスロジックを実装していると、状態の管理はいつもついて回ります。
この辺のgolangでの実装について、[bykof/stateful](https://github.com/bykof/stateful)がいい感じだったので紹介します。## [bykof/stateful](https://github.com/bykof/stateful)の使い方
例として、以下のようなとある注文システムの状態遷移図を実現してみます
![image.png](http://www.plantuml.com/plantuml/png/SoWkIImgAStDuKh9J2zABCXGo2zAIIrIgERYT79rz_JJjVFCSmQgY5R8IKnApR5L2axDIKqk2IZAJobDBb5IYBM6A_G7QKnDWQi4ynLICek0wlEBAY5g8QRXK0nH0fNIjGER2rVXd9YNd9g3LqbmHdu1q6L9EQcv1DHb5Y0v7UuiX0vhBgvQBeVKl1HWo000)
### 1. 状態を定義する
まずは状態遷移図の○部分
Cognito UserPoolsのAuthorizerをGoでデコードする
# 概要
* AWSのAPI Gatewayの認証にCognito UserPoolsのAuthorizerを用いるときに、API側でもユーザーの一意性を保つために認証します
* その際Cognitoから取得できるJWTのデコードが必要になるのでGo言語でのデコード方法についてまとめました
* クライアント側でAmplifyやリダイレクト後のURLなどを用いてCognitoからIDトークンを取得する方法については既知とします# Amazon Cognito ユーザープール認証
* Cognitoを用いたログインをクライアントから行うと、ユーザープールからJWT(JSON Web Token)が返されます
* JWTは**Base64**でエンコードされたJSON文字列であり、ユーザーに関する情報(クレーム)が含まれています
* (このBase64でエンコードされていると言う情報によりかなり苦しむことになりました…)
* エンコードされた文字列は`***.***.***`のように`ドット(.)`で3つのセクションに分けられています
* 3つのセクションはヘッダー、ペイロープロセスをあいまい検索してkillするツールをGoで作った
## はじめに
仕事しているとプロセスをkillすることがたまにあると思います。大体は`ps`、`awk`、`grep`で必要なプロセスIDを抽出して`kill`コマンドに渡していますが、
ぼくはそれがとても面倒に感じているので、あいまい検索してプロセスをkillしたいなと思って`fk(fuzzy-finder-killer)`ってコマンドを作りました。![](https://i.imgur.com/Q6ONFRz.gif)
## 導入と使い方
`go get github.com/skanehira/fk`もしくは[releases](https://github.com/skanehira/fk/releases)からバイナリをダウンロードしてください。使い方は `fk` を実行するだけです。
`fk` を実行するとあいまい検索できる状態になるので、任意の単語を入力して、`CTRL-i`で選択します。
`Enter`で選択済みのプロセスをkillします。キーバインドは次になります。
| key | description |
|——–|-Diff+Historyコマンド=hifferで快適なターミナル作業しようぜ
まず、こういう記事がありまして。
[テストに対する考え方「Testing Manifesto」を翻訳したので紹介します](https://nihonbuson.hatenadiary.jp/entry/TestingManifesto)
で、モヤっと
「俺らSIerは何で**全部設定してから最後にまとめてテスト**やるんだろう?
途中で設定崩れたり、最後一回きりの確認じゃ見過ごしも起こるよな。
もっと、**テスト駆動**っぽく作業すれば良いのに」とか思って、
“`
シェルをラップして一回設定したら、
その値が崩れないように裏でチェックして
お知らせしてくれるツール作ったら
臨時の手動設定/運用作業がすこぶる捗るな。
“`こういう事をピコーンと思いついてツイートしたわけです。
続いて“`
今度作ってみよう。
“`と書いてしまったのでニーズはわからんが、似たようなもの無いし、有言実行!
### 作ってみた。
## どんなのですかー
シェルをラップして、コマンドを実行したらその出力をハッシュで
記録しHistoryコマンドみたいにリストで持っておきます。【Golang】newとmakeの違い
#【Golang】newとmakeの違い
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//new makeの違い
//new メモリーにポインタが入る空の領域を確保したい場合
//ここ調査import (
“fmt”
)type Person struct{
id int
name string
}func main() {
//アドレスだけ付与する
var p *int = new(int)
fmt.Println(p)
//>>0xc000016068
fmt.Println(**&p)
//>>0
fmt.Println(*p)
//>>0//メモリーはあるので、(0なので)カウントアップする
*p++
fmt.Println(*p)//まだアドレスがない
/*
var p2 *int
fmt.Println(p2)
//>>nil//アドレスはnilなのでエラーになる
*p2++
fmgolang raceについて 競合チェック
# golan raceについて試してみた
#### -raceをつけることで、競合チェックができる
“`race.go
package mainimport “fmt”
func main() {
c := make(chan bool)
m := make(map[string]string)
go func() {
m[“1”] = “a” // First conflicting access.
c <- true }() m["2"] = "b" // Second conflicting access. <-c for k, v := range m { fmt.Println(k, v) } } ``` 結果 ``` $ go run -race race.go ================== WARNING: DATA RACE Write at 0x00c00011c180 by goroutine 7: runtime.mapassign_faststr() /usr/local/Cellar/go[テスト入門]外部APIを実際に叩いたりしていませんか? GoでDIによるテストモック
# はじめに
TwitterAPIや形態素解析APIを使うサービスでテストをしたいときがあると思います。
また、レイヤードアーキテクチャ等で下層の処理を含めたテストしたいときがあると思います。
まさか、TwitterAPIを実際に叩いたりしたテストをしていませんか?このような場合はテストモックを使ってテストを行うのが一般的です。
Goではモックライブラリを使わずに、自前でモックすることが多いのです。テストと強気にでましたが、ここではユニットテストを指しています。
# 実装
以下のTwitterAPIクライアントをサービス層で利用するとします。“`go:twitter.go
package qiita_test_mockimport (
“net/url”“github.com/ChimeraCoder/anaconda”
)type ITwitterApiClient interface {
PostTweet(string, url.Values) (anaconda.Tweet, error)
}// Golangでよく見るanacondaのT
GraphQLにおける認証認可事例(Auth0 RBAC仕立て)
# お題
以下の組み合わせで作成しているWebアプリケーションにAuth0による認証認可機能を入れてみる。
認証はID(メールアドレス)とパスワードによる方式を採用。■通信方式
・GraphQL
■フロントエンド
・Vue.js
・Nuxt.js
・TypeScript
・Apollo
■バックエンド
・Golang
・gqlgen挙動としては以下のようになる。
(1)ログイン前。「LOG IN」ボタンを押下する。
![Screenshot at 2020-05-23 15-31-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180599/ecec0644-24ce-ebff-9bd8-569fc3ba5e17.png)(2)Auth0のログイン画面(カスタマイズもできるらしい)に飛ばされる。メアドとパスワードを入れて「Continue」ボタンを押下する。
![Screenshot at 2020-05-23 15-32-02.png](https://qiita-im【Golang】ポインタ
#【Golang】ポインタ
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//ポインタ
//& アドレス
//* アドレスの実態
//*int ポインタ型 この中にはアドレスを入れる
//関数で変数の値を変えたい場合は、関数の引数はポインタ型(メモリーのアドレス)を受け取るようにする。import (
“fmt”
)func double(i int){
i = i * 2
}//ポインタ型を引数
func double2(i *int){
*i = *i * 2
}func main() {
var n int = 100fmt.Println(n)
//>>100fmt.Println(&n)
//メモリのアドレスを表示
//>>0xc000136008//2倍にする関数
double(n)
fmt.Println(n)
//値渡しされる為、変わらない
//>>100//ポインタ型
//メモリーのアエディタで複数のファイルを簡単にコピーするコマンドをGoで作った
エディタを使って複数のファイルを簡単にコピーするコマンド[mcp](https://github.com/skanehira/mcp)を作りました。
![](https://i.imgur.com/2D9S6WW.gif)
このコマンドは[ファイルをエディターで一括リネームするツールをGo言語で作った! ― 機能を増やさない信念と、OSSとの付き合い方](https://itchyny.hatenablog.com/entry/2020/01/10/100000)で`mmv`を知ってしばらく使っていたら、リネームではなくコピーもほしいなと思い作りました。
## 使い方
ファイル名を引数で渡すと`$EDITOR`に設定されているエディタが起動、ファイル名を編集して保存することで編集後のパスにファイルがコピーされます。
ファイル名だけではなく、ワイルドカードも使えます。“`sh
$ mcp *
“`コピー元がディレクトリの場合はそのディレクトリをまるごとコピーします。`cp -r`に相当します。
## さいごに
ブログに記載されている機能を増やさない信念は個人的にともてWindows 版の TinyGo で SAMD5x CPU の浮動小数点演算でクラッシュする問題への対策
Windows 版の TinyGo のみ SAMD5x の浮動小数点演算を使おうとするとクラッシュします。
この記事の対象は今のところ、 Windows 版の 0.12 ~ 0.13.x です。
他 OS 版はもともとクラッシュしないはずです。
この問題はおそらく TinyGo 0.14 で修正されますが、それまでの間の対策を記載します。# 対策
以下のいずれかの対策をすることで、クラッシュしなくなります。
## 対策 1 : FPU を有効にする
以下を好きなファイル名 (*.go) で main パッケージのディレクトリに置いてください。
main() 関数が始まる前に FPU を有効化するコードが処理されクラッシュしなくなります。
ビルドする対象のプロジェクト毎に実施する必要があります。gits にも置きました。
https://gist.github.com/sago35/95c2213093ac3565865be310e5c432a2“`go:enablefpu.go
// +build atsamd51// Put this file in th
関連する記事
OTHERカテゴリの最新記事
-
- 2024.09.19
JavaScript関連のことを調べてみた
-
- 2024.09.19
JAVA関連のことを調べてみた
-
- 2024.09.19
iOS関連のことを調べてみた
-
- 2024.09.19
Rails関連のことを調べてみた
-
- 2024.09.19
Lambda関連のことを調べてみた
-
- 2024.09.19
Python関連のことを調べてみた