- 1. CleanArchitecture的な構成のGo言語サーバー サンプルコード(echo, wire利用)
- 2. LeetCodeに毎日挑戦してみた 21. Merge Two Sorted Lists(Python、Go)
- 3. go modやgo getやgo mod vendorとは何か?
- 4. Grove – Temperature&Humidity Sensor(DHT11)をRaspberry Piで使用する
- 5. WebSocket のクライアント / サーバー CLI ツールを作った (WebSocket 版 netcat 的な)
- 6. GoでPostgreから取得したSelectクエリをJSONに変換する
- 7. GO環境でcould not import Cエラー
- 8. [GO言語] YAMLファイルを読み込んでみよう
- 9. AtCoder Beginner Contest 184のメモ
- 10. LeetCodeに毎日挑戦してみた 20. Valid Parentheses(Python、Go)
- 11. SOLID原則を理解するためにGo言語で書いてみた
- 12. Go言語のTwitter APIで定期的にツイートする
- 13. gRPCに入門する~gRPC-Webで実装もしてみる~
- 14. 現場で使えるゴルーチン(並列制御)
- 15. GOでPostgresqlへ接続する
- 16. Go言語の特徴
- 17. LeetCodeに毎日挑戦してみた 14.Longest Common Prefix (Python、Go)
- 18. golangのos/execでMakefileのmakeコマンドを実行しようとすると2回目以降の実行がエラーになる
- 19. GO gorm DB作成 INSERT JSONUnmarshal Mysql
- 20. LeetCodeに毎日挑戦してみた 13. Roman to Integer (Python、Go)
CleanArchitecture的な構成のGo言語サーバー サンプルコード(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)
サーバー側でブロードキャストさせることもできます↓
![wsnc_demo_broadcast.gif](https:
GoでPostgreから取得したSelectクエリをJSONに変換する
## やりたいこと
– SELECT文で取得したクエリをまるごとJSONにしたい
– sqlパッケージのscanで一行ずつ処理しているようで、ループの中で配列を作る必要がある(?)
– 配列からjsonパッケージで変換する
– 参考のコードはMSのサイトにのっているやつ## コード
“`main.go
package mainimport (
“database/sql”
“encoding/json”
“fmt”
_ “github.com/lib/pq”
)const (
// Initialize connection constants.
HOST = “127.0.0.1”
DATABASE = “testdb”
USER = “root”
PASSWORD = “password”
)func checkError(err error) {
if err != nil {
panic(err)
}
}func main() {
GO環境でcould not import Cエラー
## エラー発生
Goのgraphqlライブラリの`gqlgen`でスキーマを更新しようとしたら謎のエラー
“`sh
/go/src # go run github.com/99designs/gqlgen
validation failed: packages.Load: /usr/local/go/src/net/cgo_linux.go:12:8: could not import C (no metadata for C)
exit status 1
“`## 解決
どうやらgccがdockerイメージ上に入ってない模様。
たぶんきっとこれ? https://github.com/golangci/golangci-lint/issues/602`apk update`してapkをアップデートした後、`alpine-sdk`というビルドパッケージ?を入れたらうまく行きました。
apkについては、[この記事](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)が分かりやすかったです。“`
/go/sr
[GO言語] YAMLファイルを読み込んでみよう
# YAMLとは
– YAMLとは 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
– yamlの書き方(コメント, 配列, アンカー, エイリアス)# 環境
– CentOS 8.2
– go version 1.15.3 linux/amd64# 準備
“`bash
# go get gopkg.in/yaml.v2
# vi test.yml
“`
“`test.yml
first: test
secound:
a1: count1
a2:
– count2
– count3
a3:
b1: count4
“`# YAMLファイルを読み込む
“`bash
# vi main.go
“`
“`main.go
package mainimport(
“fmt”
“io/ioutil
AtCoder Beginner Contest 184のメモ
# 前置き
Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。# 問題
https://atcoder.jp/contests/abc184
# A
“`Q_A.go
package mainimport (
“fmt”
)func main() {
var a, b, c, d int
fmt.Scanf(“%d %d”, &a, &b)
fmt.Scanf(“%d %d”, &c, &d)ans := a * d – b * c
fmt.Printf(“%d\n”, ans)
}
“`# B
“`Q_B.go
package mainimport (
“fmt”
“strings”
)func main() {
var N, X int
fmt.Scanf(“%d %d”, &N, &X)var S string
fmt.Scanf(“%s”, &S)result := strings.Split(S, “”)
LeetCodeに毎日挑戦してみた 20. Valid Parentheses(Python、Go)
## はじめに
無料英単語サイト[E-tan](https://your-e-tan.com/)を運営中の@ishishowです。
プログラマとしての能力を上げるために毎日leetcodeに取り組み、自分なりの解き方を挙げていきたいと思います。
#### Leetcodeとは
[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。Go言語入門+アルゴリズム脳の強化のためにGolangとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)
#### 6問目(問題20)
#### 20. Valid Parentheses
– 問題内容(日本語訳)
> 文字列を考える`s`だけで文字を含む`'(‘`、`’)’`、`'{‘`、`’}’`、`'[‘`と`’]’`、入力文字列が有効であるかどうかを決定。
>
> 入力文字列は、次の場合に有
SOLID原則を理解するためにGo言語で書いてみた
# SOLID原則について
## SOLID原則とは
– SRP(単一責任の原則)
– OCP(オープン・クローズドの原則)
– LSP(リスコフの置換原則)
– ISP(インターフェース分離の原則)
– DIP(依存関係逆転の原則)の頭文字を取ったものである。
## なぜSOLID原則?
SOLIDを適用する理由として、
– 変更に強くなる
– 理解しやすくなる
– 多くのソフトウェアシステムで利用できることが挙げられます。
以下から、各原則の説明、コードについて触れていきます。# SOLIDの各原則について
## SRP(単一責任の原則)
###説明
1つのモジュールやクラス、関数などを変更する際に、理由が複数あってはいけないという原則
理由としては以下のような事象が起きることを防ぐため– 複数の人が一つのソースファイルを変更した際に、マージやコンフリクトが発生
– 変更した内容が予期しないところに影響を受ける### コード
#### 悪い例
一つのインタフェースで従業員の管理、従業員のデータの保存と複数の責務を負っている。
“`go
Go言語のTwitter APIで定期的にツイートする
###用意するもの
・MAC(PC)
・AWS Lambda
・Twitter API
・Twitterアカウント###やったこと
####1.Twitter API申請
下記URLからTwitter API申請をします。
https://developer.twitter.com/ja/docsAPI key & secretとAccess token & secretを取得します。
####2.Go言語で書く
Twiiter認証用のソースコードを書きます。
別にファイルは分けなくてもいいです。“`go:keys.go
package keysimport
(
//Twitter APIに必要なimportになります。なければインストールしましょう。
“github.com/ChimeraCoder/anaconda”
)func GetTwitterApi() *anaconda.TwitterApi {
anaconda.SetConsumerKey(“API Key”)
anaconda.SetConsumerSecret(“
gRPCに入門する~gRPC-Webで実装もしてみる~
# はじめに
タイトルにもある通りgRPCに入門してみたので実際に動かしてみようと思います。この記事は、僕がgRPCに入門して、「gRPCって何?」から「gRPCちょっとわかってきたな」になるまでにやったことをまとめた(説明した)ものになっているので、同じような状況の方におすすめです。
**この記事の内容**
– gRPCについて軽く説明
– gRPC-Webについて軽く説明
– Go × TypeScript × gRPC-Webで実際に動かしてみる入門したでなので、訂正や補足などありましたら、是非コメントお願いします!?♂️
# gRPC とは
## RPC とは
gRPCとはなんぞや、という話に行く前にRPCとはなんでしょうか。**RPC**はRemote Procedure Callの略で、「遠隔手続き呼び出し」とも呼ばれます。
簡単に説明すると、他サーバー上の関数を呼び出し、実行することを可能にする手法です。
また、同じRPCの仕様に準拠していれば、呼び出される関数は別の言語で実装されていてもかまいません。そして、呼び出しの規約は**インタフェース記述
現場で使えるゴルーチン(並列制御)
“`
func main() {
ch := make(chan struct{}, 10)
var wg sync.WaitGroup
for i := 0; i < 1000; i++ { ch <- struct{}{} wg.Add(1) go func(i int) { defer func() { <-ch wg.Done() }() fmt.Println(i) }(i) } wg.Wait() } ``` https://play.golang.org/p/Cry94fFpeFH
GOでPostgresqlへ接続する
## DockerでPostgreを起動する
“`docker-compose.yml
version: “3”
services:
postgres:
image: postgres
container_name: postgres
ports:
– 5432:5432
environment:
– POSTGRES_USER=root
– POSTGRES_PASSWORD=password
tty: true
restart: always
user: root
volumes:
– ./init:/docker-entrypoint-initdb.d
– /etc/localtime:/etc/localtime:ro
pgweb:
image: sosedoff/pgweb
container_name: pgweb
ports:
– “8081:8081”
environment:
Go言語の特徴
# 概要
* [Gocci.me](“https://gocci.me/”)と言うサービスをGo言語で開発しており、そのGo言語の持つ特徴をまとめました# 言語設計と文法
## シンプル
Go言語はいろいろな書き方が存在するわけではなく、ある程度書き方が決まっているので、シンプルに実装することができます。
比較的昨日の割には言語仕様を理解しやすくなっています。## コンパイル言語
コンパイル言語とは実行をする前に**一括で全てのコードを機械語もしくは中間言語にコンパイル(翻訳)する言語**のことです。
コンパイル言語は**記述方法が厳密**と言う特徴がありますが、一括で機械語に変換してコンピュータに処理させるため、**処理が高速**であると言う特徴を持ちます。
Go言語は**コンパイル速度も早い**と言われています。## 静的型付け
Go言語ではプログラムを書く際に**予め型を指定しなければいけません**。
静的型付けは事前にコンパイルを行うことで、プログラムの実行時には型の生合成チェックをする必要がなく、処理が高速になります。
また、コンパイル時に型のチェックを行うため、
LeetCodeに毎日挑戦してみた 14.Longest Common Prefix (Python、Go)
## はじめに
無料英単語サイト[E-tan](https://your-e-tan.com/)を運営中の@ishishowです。
プログラマとしての能力を上げるために毎日leetcodeに取り組み、自分なりの解き方を挙げていきたいと思います。
#### Leetcodeとは
[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。Go言語入門+アルゴリズム脳の強化のためにGolangとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)
#### 5問目(問題14)
#### 14.Longest Common Prefix
– 問題内容(日本語訳)
> 文字列の配列の中から最も長い共通のプレフィックス文字列を見つける関数を記述します。
>
> 共通のプレフィックスがない場合は、空の文字列を返します`””`。**Ex
golangのos/execでMakefileのmakeコマンドを実行しようとすると2回目以降の実行がエラーになる
## 原因
わからん## 対処方法
シェルでmakeコマンドを呼び出すようにする### Go側
– フルパスじゃなくても大丈夫のはず“`golang
cmd := exec.Command(“/home/yuta/AWS/go/bin/exec.sh”, domain.Name)
cmd.Run()
“`### シェル側
– 事前にchmodで実行権限をつけてあげる
“`exec.sh
#!/bin/shcd /home/yuta/AWS
make make-env-config ENV_FILE=.env DOMAIN_NAME=${1}
“`
GO gorm DB作成 INSERT JSONUnmarshal Mysql
こんにちは! GO学習中です!
今回はgormでinsertしてみたいと思います!
[データは前回getしたapi](https://qiita.com/13Slhr77Cgzn892/items/22d4670a201fff221b61)
のデータを使用します。DB自体をGOから作成した記事は[こちら](https://qiita.com/13Slhr77Cgzn892/items/7c28e4079e9b7407df6a)です。
では始めていきたいと思います。
### mysql.go
“`go
// root/app/models/fgi.go
package mysqlimport (
“database/sql”_ “github.com/go-sql-driver/mysql”
“github.com/jinzhu/gorm”
)// SQLConnect DB接続
func SQLConnect() (database *gorm.DB, err error) {
DBMS := “mysql”
USER := “root”
P
LeetCodeに毎日挑戦してみた 13. Roman to Integer (Python、Go)
## はじめに
無料英単語サイト[E-tan](https://your-e-tan.com/)を運営中の@ishishowです。
プログラマとしての能力を上げるために毎日leetcodeに取り組み、自分なりの解き方を挙げていきたいと思います。
#### Leetcodeとは
[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。Go言語入門+アルゴリズム脳の強化のためにGolangとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)
#### 4問目(問題13)
#### 13. Roman to Integer
– 問題内容(日本語訳)
> :ローマ数字は、7つの異なる記号で表され `I`、`V`、`X`、`L`、`C`、`D`と`M`。
> シンボル 値
> I 1
> V 5
> X 10
> L 50
> C 10