- 1. WebAssemblyを使ってBackend(Golang)のバリデーションロジックをFrontend(Nuxt.js)のバリデーションに流用する試み
- 2. Goでstructをmapに変換する
- 3. LeetCodeに毎日挑戦してみた 28. Implement strStr()(Python、Go)
- 4. LeetCodeに毎日挑戦してみた 27. Remove Element(Python、Go)
- 5. docker、Golangでtomlを読み込む
- 6. GoのEchoでオリジン間リソース共有の問題を解決
- 7. [競プロ]Goの標準入力をまとめる
- 8. golangで先週の〇〇曜日をtime.Timeで取得するコード
- 9. 細かいことは置いといて、とりあえずProtocolBuffersを触ってみたい時の覚書
- 10. WindowsでのGo開発環境構築
- 11. 社内Go勉強会まとめ
- 12. LeetCodeに毎日挑戦してみた26. Remove Duplicates from Sorted Array (Python、Go)
- 13. Client-goでLabelSelectorを使って指定したラベルのPodのみを抽出したい
- 14. GitHub ActionsでGoアプリをGoogle App Engineにデプロイする
- 15. GoのnilスライスはFirestoreだとnullになるから気をつける
- 16. CleanArchitecture的な構成のGo API サーバー サンプルコード(echo, wire利用)
- 17. LeetCodeに毎日挑戦してみた 21. Merge Two Sorted Lists(Python、Go)
- 18. go modやgo getやgo mod vendorとは何か?
- 19. Grove – Temperature&Humidity Sensor(DHT11)をRaspberry Piで使用する
- 20. WebSocket のクライアント / サーバー CLI ツールを作った (WebSocket 版 netcat 的な)
WebAssemblyを使ってBackend(Golang)のバリデーションロジックをFrontend(Nuxt.js)のバリデーションに流用する試み
# お題
ここ数年、FrontendにVue.js/Nuxt.js、BackendにGolang、間をREST-APIないしGraphQLで繋ぐという構成で開発している。
この構成でよく感じるのが、「フロントでもバックでも同じバリデーションロジックを両方で実装してるなぁ」ということ。
バリデーションと言っても、FrontendとBackendとでは厳密にはチェックすべき内容が違うのだけど、型・桁とかフォーマットとか結局どちらでも同じようなロジックを実装してたりする。
実際のところは、Frontend、Backend双方に便利なライブラリがあったりして、それほど開発負荷がかかっているわけではないのだけど、何が嫌って「同じ仕様を複数箇所で実装」していること。
そして、時々、同じ仕様のはずなのにFrontendとBackendとで微妙にバリデーション内容が違っていることが発生すること。なんとかならないんだろうかと思っていたところに、WebAssemblyの記事を読んだことで、にわかに思いつき実装をしてみることにした。
BackendではGolangでバリデーションロジックを流用しやすい単
Goでstructをmapに変換する
## はじめに
似たような内容の記事はあったのですが、バージョンが変わったせいかうまく動かなくて苦労したので記事にしました。
## JSONを使うバージョン
“`Go
var result map[string]interface{}
indirect, _ := json.Marshal(data)
json.Unmarshal(indirect, &result)// 値がなかったら、キーの削除
for key, value := range result {
if value == nil {
delete(result, key)
}
}
“`これだと、time.Time型がStringになってしまい、僕の用途には合いませんでした。。
## reflectを使うバージョン
“`Go
result := make(map[string]interface{})v := reflect.Indirect(reflect.ValueOf(data))
t := v.Type()
for i := 0; i < t.NumFi
LeetCodeに毎日挑戦してみた 28. Implement strStr()(Python、Go)
## はじめに
無料英単語サイト[E-tan](https://your-e-tan.com/)を運営中の@ishishowです。
プログラマとしての能力を上げるために毎日leetcodeに取り組み、自分なりの解き方を挙げていきたいと思います。
#### Leetcodeとは
[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。golang入門+アルゴリズム脳の強化のためにgoとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)
#### 10問目(問題28)
#### 28. Implement strStr()
– 問題内容
> Implement [strStr()](http://www.cplusplus.com/reference/cstring/strstr/).
>
> Return the index
LeetCodeに毎日挑戦してみた 27. Remove Element(Python、Go)
## はじめに
無料英単語サイト[E-tan](https://your-e-tan.com/)を運営中の@ishishowです。
プログラマとしての能力を上げるために毎日leetcodeに取り組み、自分なりの解き方を挙げていきたいと思います。
#### Leetcodeとは
[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。golang入門+アルゴリズム脳の強化のためにgoとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)
#### 9問目(問題27)
#### 27. Remove Element
– 問題内容(日本語訳)
> 配列*nums*と値*valを指定して*、その値のすべてのインスタンスを[**インプレース**](https://en.wikipedia.org/wiki/In-place_algorithm)
docker、Golangでtomlを読み込む
#概要
dockerコンテナでgolangを動かしtomlを読み込んで標準フォーマットで出力する。#ファイル構成
今回はdockerを使ってコンテナ上で動かしますので以下のファイル構成で行うこととします。“`
goTest
├docker-compose.yml
├Dockerfile
└src
├main.go
├config
│ └testConfig.toml
└tomlexec
├tomlexec.go
└tomlexec_test.go
“`#登場ファイル
主な登場ファイルはdockerファイルを除けば難しい事はなく、以下の4ファイルになります。
・main.go
・testConfig.toml
・tomlexec.go
・tomlexec_test.go各ファイルの設定を見ていきましょう。
###docker-compose.yml
“`docker-compose.yml
version: ‘3.7’
services:
#golangの設定
app:
build:
GoのEchoでオリジン間リソース共有の問題を解決
# やりたいこと
フロント側の `http://localhost:8080/` からバックエンド側の `http://localhost:8080/` を呼び出したい
しかし以下のエラーがフロント側で出ていたので、これを解決したい“`
Access to XMLHttpRequest at ‘http://localhost:8000’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
“`オリジン管理ソース共有に関してはこの記事では解説しませんが、 [こちらの記事](https://qiita.com/att55/items/2154a8aad8bf1409db2b) がわかりやすかったです
## 環境情報
– vue
– 2.6
– go
– 1.15
– echoをサーバーとして使用# 解決方法
[競プロ]Goの標準入力をまとめる
##はじめに
ある日Paizaにハマったので、Goの標準入力についてまとめておく。
##1つのデータの入力
“`
package mainimport “fmt”
func main() {
var s string
fmt.Scan(&s)
fmt.Println(s)
}
“`
##1行のデータの入力
“`
package mainimport (
“bufio”
“fmt”
“os”
)func main() {
reader := bufio.NewReader(os.Stdin)
s, _ := reader.ReadString(‘\n’)
fmt.Println(s)
}
“`
##n行のデータの入力(1行目にデータ数)
“`
package mainimport (
“bufio”
“fmt”
“os”
“strconv”
“strings”
)func main() {
reader := bufio.NewReader(os.Stdin)
s, _ := reader.ReadString(‘\n’
golangで先週の〇〇曜日をtime.Timeで取得するコード
“`golang
type Weekday struct {
Now time.Time
Loc *time.Location
}func (w Weekday) LastWeekOf(weekday time.Weekday) time.Time {
levellingOffset := int(w.Now.Weekday())
weekDiff := 7-(int(weekday))return time.
Date(w.Now.Year(), w.Now.Month(), w.Now.Day(), 0, 0, 0, 0, w.Loc).
AddDate(0, 0, -levellingOffset).
AddDate(0, 0, -weekDiff)
}
“`こう使う
“`go
package mainimport (
“fmt”
“time”
)func main() {
now := time.Date(2020, 11, 27, 0, 0, 0, 0, time.UTC)
fmt.Println(now.Year
細かいことは置いといて、とりあえずProtocolBuffersを触ってみたい時の覚書
* タイトルの通り、自分が試した方法をまとめておく
* ProtocolBuffersとはなんぞや?に関しては公式とか色んな方がネットに情報上げてくれてるので割愛# 環境構築
* ubuntu18.04
* Go1.14
* ディレクトリ構成/home/user/
└── go/
├── bin/
├── pkg/
└── src/
├── go.mod
├── go.sum
├── example.go
├── example.proto
└── pb/
└── (protoファイルのコンパイル後のファイルをここに置く)—
まずprotocのインストール([ダウンロード先](https://github.com/protocolbuffers/protobuf/releases/))“`bash:/home/user/
# protocのzipファイルをwget
$ wget https://github.com/protocolbuffers/protobuf/r
WindowsでのGo開発環境構築
社内で、[A Tour of Go](https://tour.golang.org/welcome/1)を使ってGoの勉強会をしているので、学んだことをメモしておく。
まとめ記事は[こちら](https://qiita.com/eyuta/private/77ac58e4d9141898c733)。初回はWindowsでGoの開発環境を整える。
本当は[A Tour of Go](https://tour.golang.org/welcome/1)上で開発をしたかったが、Web上では補完効かなかったため、急遽vscodeでの開発に切り替えた。### 前提
– vscodeインストール済み### 手順
1. [こちら](https://golang.org/doc/install)から、Goをインストールする
2. vscodeを起動
– Goをインストールする前にvscodeを起動していた場合、vscodeのterminalに環境変数が反映されないので、vscodeを再起動する必要がある
3. vscodeに[Goの拡張](https://marketplace.
社内Go勉強会まとめ
## はじめに
社内の有志で、Go言語をキャッチアップするため、1日30分位使って[A Tour of Go](https://tour.golang.org/welcome/1)を進めてみた。
その時の内容を残しておく。
## A Tour of Go
### #1
– [WindowsでのGo開発環境構築](https://qiita.com/eyuta/private/afcb4f7bc194f0209f47)
LeetCodeに毎日挑戦してみた26. Remove Duplicates from Sorted Array (Python、Go)
## はじめに
無料英単語サイト[E-tan](https://your-e-tan.com/)を運営中の@ishishowです。
プログラマとしての能力を上げるために毎日leetcodeに取り組み、自分なりの解き方を挙げていきたいと思います。
#### Leetcodeとは
[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。golang入門+アルゴリズム脳の強化のためにgoとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)
#### 8問目(問題26)
#### 26. Remove Duplicates from Sorted Array
– 問題内容(日本語訳)
> 並べ替えられた配列*numsを指定して*、各要素が1*回*だけ表示され、新しい長さを返すように、重複[**をインプレース**](https://en.wik
Client-goでLabelSelectorを使って指定したラベルのPodのみを抽出したい
## やりかた
– metav1.ListOptionsの中で定義する
– LabelSelector以外にもいろいろある## 該当部分
“`golang
pods, err := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{
LabelSelector: “app=vamdemic111aaa-app”,
})
“`## 全体
“`golang
package mainimport (
“context”
“encoding/json”
“fmt”
metav1 “k8s.io/apimachinery/pkg/apis/meta/v1”
“k8s.io/client-go/kubernetes”
“k8s.io/client-go/tools/clientcmd”
“log”
“os”
“path/filepath”
)func main() {
GitHub ActionsでGoアプリをGoogle App Engineにデプロイする
# TL;DR
GitHub ActionsでGoアプリをGoogle App Engineにデプロイするには色々な方法が存在していたようだが,現在はGoogleの提供するgoogle-github-actions/setup-gcloudと言うActionを使うのが良いらしい.
https://github.com/google-github-actions/setup-gcloud# Secretsの設定
GCP_PROJECT_IDにGCPのプロジェクトIDを設定する.
GCP_SA_KEYにGCPのサービスアカウントの鍵を設定する.サービスアカウントはデフォルトのもので良い.別サービスから移行する場合は忘れずに過去の鍵を削除しておく.# workflowファイル
“`.github/workflows/deploy.yml
name: “Deploy”on:
push:
branches:
– masterjobs:
deploy:runs-on: ubuntu-latest
steps:
– nam
GoのnilスライスはFirestoreだとnullになるから気をつける
## 問題
GoでFirestoreのドキュメントにデータを書き込んでいて、配列を期待するフィールドに何故かnullが入っていて不思議になった。
データの型としても“`go
type Fuga struct {
Hoge []string `firestore:”hoge”`
}
“`だし、スライスに何も入ってなかったらFirestore側には空配列入って終わりでしょって思ってた。
## スライスのゼロ値はnil
https://godoc.org/cloud.google.com/go/firestore#DocumentRef.Create の以下の文章を見るに、Firestoreはあらゆる型の `nil` を `null` に扱うらしい。
> nils of any type convert to Null.
スライスのゼロ値はnilなので、ただ構造体を初期化しただけだとスライスはnilのまま -> そのままfirestore側に保存するとnullになるということのようだった。
なので、構造体を初期化する時にスライスも `ma
CleanArchitecture的な構成のGo API サーバー サンプルコード(echo, wire利用)
# はじめに
CleanArchitecture的なパッケージ構成に照準を合わせてGoのREST API Serverの実装をしてみる。
更にGoのweb framework [echo](https://github.com/labstack/echo)とDI code generatorである[wire](https://github.com/google/wire)を組み込む。### excuse
この構成で本番稼働実績が有る訳ではなく、まずは叩き台的に考えてみました。
まだ改善の余地は有りそうです。# 実装リポジトリ
[![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307773/a0675efd-6389-cd62-455e-b9eb8bb9e26f.png)](https://github.com/fukuyama012/go-server-layered-sample/tree/main)
*利用方法はREADMEを参照。
# ディレクトリ構成
“`
├──
LeetCodeに毎日挑戦してみた 21. Merge Two Sorted Lists(Python、Go)
## はじめに
無料英単語サイト[E-tan](https://your-e-tan.com/)を運営中の@ishishowです。
プログラマとしての能力を上げるために毎日leetcodeに取り組み、自分なりの解き方を挙げていきたいと思います。
#### Leetcodeとは
[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。Go言語入門+アルゴリズム脳の強化のためにGolangとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)
#### 7問目(問題21)
#### 21. Merge Two Sorted Lists
– 問題内容(日本語訳)
> 2つのソートされたリンクリストをマージし、新しい**ソートされた**リストとして返します。新しいリストは、最初の2つのリストのノードをつなぎ合わせて作成する必要があります。
go modやgo getやgo mod vendorとは何か?
Goを始めたばかりでgo modやgo getやgo mod vendorがよくわかってないので、そのメモ
間違ってる可能性はあるので、そこはご了承ください
go.modファイルはGemfileやpackage.jsonみたいなもので、go.sumファイルはGemfile.lockやpackage.lock.jsonみたいなもの
`go get パッケージ名`で、go.modとgo.sumにパッケージ名が書き込まれる
`go get -u パッケージ名`が、go.modとgo.sumに書いてあるパッケージのバージョンを更新してくれる
つまり、Gemfileに欲しいgemを追記してbundle installしてgemを取り込むのとは手順が逆で、欲しいパッケージをgo getしてそしたら自動的にgo.modやgo.sumに書き込まれる
`go mod vendor`でgo.modにファイルに記載されているパッケージを、vendor以下にコピーしてくれる
Grove – Temperature&Humidity Sensor(DHT11)をRaspberry Piで使用する
# はじめに
HAT基盤と温度センサーを買ったのはよかったけど、動かしていなかったので、動作検証代わりに行った。
お値段等
* [千石電商 Grove Base Hat for Raspberry Pi](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-5FAG) ¥1304
* [Grove – デジタル温度・湿度センサー] (https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4ENZ) ¥662# Grove Base Hat for Raspberry Piの準備
[Seeed Studioの商品ページ](https://wiki.seeedstudio.com/Grove_Base_Hat_for_Raspberry_Pi/)を参考に
以下のコマンドを入力してセットアップをする。“`bash
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/insta
WebSocket のクライアント / サーバー CLI ツールを作った (WebSocket 版 netcat 的な)
表題どおりの [wsnc](https://github.com/tomatod/wsnc) という CLI ツールを Go 言語で作成しました。これ一つで WebSocket のクライアントとしてもサーバーとしても使えます。netcat (nc) コマンドの WebSocket 版みたいなイメージです。
– tomatod/wsnc: https://github.com/tomatod/wsnc
英語の他に日本語のマニュアルも作りました↓
https://github.com/tomatod/wsnc/blob/master/README_JP.md## 使用感
シンプルに使うとこんな感じです (現在はもう少し見た目がシンプルになりました)↓
![wsnc_demo_simple.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903359/1cd3cad8-3579-af8f-e069-61cf3f4a316f.gif)### 主に対応している機能 ([RFC6455](https://