- 1. goroutineで並行処理のメモ
- 2. 【Go(Gin)✕Docker✕delve✕vsCodeでデバッグできるようにする最小構成】
- 3. GOLANDでGOプロジェクトをインストールしたら最初にやる設定
- 4. GolangでS3からZipダウンロードする時の中身のタイムスタンプの設定
- 5. [Docker]/bin/sh: /go/bin/dlv: not found
- 6. C++,C#のコメントアウトテクニック
- 7. Go製 markdown driven な code generator 作った
- 8. 【Go】APIサーバの構築 ~ログイン処理と操作権限の付加編~
- 9. VSCodeで複数のmain.goを開くとgoplsのwarningが出る
- 10. 【Goのデバッガーdelveを使えるようにするまでの苦労・プロセス】
- 11. Goの良さを語りたい
- 12. Go言語について
- 13. DockerでSFTPサーバ立ててGoでアクセスしてみる
- 14. ubuntuに最新のgolangをインストールする
- 15. Raspberry Pi4 で GO言語を書いてみた(1)
- 16. 【Go】APIサーバの構築 ~データの作成(Create)/更新(Update)/削除(Delete)編~
- 17. Goで動くフロントエンドが作れるSSRライブラリkyotoを使ってみた話
- 18. MongoDBのfindで配列フィールドの登録数を不等号条件でfilterしたい
- 19. Golangに入門してみた
- 20. GoでのWeb Framework選択時にルーティングの問題でGinを諦めてしまった人へ
goroutineで並行処理のメモ
goroutineを使ったときのメモです。
### channelで待ち合わせせずgoroutineを使う場合の注意
mainのgoroutineが終了すると、他のgoroutineが走っていてもプログラムは終了してしまうので注意しよう。待ち合わせをしたい場合はchannelを使う。
“`main.go
package mainimport (
“fmt”
“time”
)func main() {
go func() {
fmt.Println(“start goroutine”)
time.Sleep(3 * time.Second)
}()// time.Sleep(4 * time.Second)
fmt.Println(“finished”)
}“`
上記のコードを走らせた場合は以下のようになり、goroutineがそもそも開始されていないことがわかる。
“`
$ go run main.go
finished
“`### channelを使って待ち合わせした場合
“`main.go
package main
【Go(Gin)✕Docker✕delve✕vsCodeでデバッグできるようにする最小構成】
## ディレクトリ構成
Goアプリケーションはapplicationディレクトリ以下にある。
*(アスタリスク)で囲んでいるファイルがポイント。“`docker
.
├── .vscode
│ └── **launch.json**
├── README.md
├── application
│ ├── **Dockerfile**
│ ├── controllers
│ ├── db
│ ├── go.mod
│ ├── go.sum
│ ├── main.go
│ ├── models
│ ├── server
│ ├── services
│ ├── **start.sh**
│ ├── tests
│ ├── tmp
│ └── vendor
├── **docker-compose.yml**
└── tmp
“`## docker-compose
– 8080:8080はもともとあったアプリケーション用のport。
– 2345:2345をデバッガ用のportとして追記。
“`docker
ver
GOLANDでGOプロジェクトをインストールしたら最初にやる設定
1.Go Modulesを有効にする
Go Modules=>Enable GO Modules integrationにチェック![スクリーンショット 2022-01-15 15.03.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/dc28d063-4265-febf-d756-bf815d172d70.png)
2.ルートディレクトリにモジュール群をインストール
“`
cd paht/to/root-dir
go mod vendor
“`これでコードジャンプも効くようになる。
GolangでS3からZipダウンロードする時の中身のタイムスタンプの設定
## 概要
S3にあるファイルを一つにまとめてZipダウンロードする際の中身のファイルのタイムスタンプを引き継ぐ方法について解説する。
## zip化の流れ
1. tmpフォルダにzipファイルを配備する
1. S3から該当ファイルを複数取得する
1. 取得したファイルをZipファイルに書き込む **<- この中身のタイムスタンプの設定** 1. zipファイルをS3にアップロードする 1. tmpフォルダのzipファイルを削除し、S3へのzipパスを返却する ## 対象モジュール archive/zip ※標準パッケージ ## Goのバージョン 1.17.2 ## zip内のファイルの更新日時が1979/11/30になってしまう zip書き込みを以下のようにそのまま実施してしまうとS3に登録した更新日時が適用されずに1979/11/30になってしまう問題がある。[参考記事](https://stackoverflow.com/questions/37517620/golang-zip-package-modified-time-defaults-to-30-no
[Docker]/bin/sh: /go/bin/dlv: not found
## 記事を書いた経緯
タイトル通りGoAPIのdocker-compose上で`/bin/sh: /go/bin/dlv: not found`というエラーが発生してしまったので
その解決策をメモしておきたいと思います。## 原因
mainブランチを更新した時にDockerfileに“`Dockerfile.dev
RUN go install github.com/go-delve/delve/cmd/dlv@latest
“`
というのか追加されました。しかし、いつも通り
“`
$ docker-compose down
$ docker-compose up
“`
をしましたが、
![スクリーンショット 2022-01-14 13.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593744/69531747-aeb9-ca3f-a236-4488dde7633c.png)
Airが正常に動作しませんでした。## 解決策
“`
$ docker-comp
C++,C#のコメントアウトテクニック
# 概要
下記のような記載が出来る言語で使えるコメントアウトのTips[使える言語の参照](https://qiita.com/power3812/items/d8fc76f551970085e189)
“`main.cpp
// 1行コメント
/*
複数行コメント
複数行コメント
*/
“`# 内容
複数行コメントを1文字で切り替える
先頭の**スラッシュ(/)**を消すと切り替えれる“`main.cpp
//*
現在の
複数行コメントは
コメントアウトされない
//*//*
現在の
複数行コメントは
コメントアウトされる
//*/
“`機能の切り替えを1文字で切り替える
上記のIF版で
先頭の**スラッシュ(/)**を消すと切り替えれる“`main.cpp
//*
Active Block
/*/
Disable Block
//*//*
Disable Block
/*/
Active Block
//*/
“`# まとめ
C++er には多少有名なのでN番煎じではあるもののいろいろな言語で使えるので書いてみました。C++では#i
Go製 markdown driven な code generator 作った
https://github.com/igtm/manaita
markdownで生成テンプレを記述すると、Github上などで見れるので、どのようなコードが生成されるのかが直感的にわかりやすくなります
Go製のライブラリは探しても見つからなかったのでさくっと作ってみました。
# 使い方
`SCAFFOLD.md` に以下のようなテンプレを書く
—
Params:
– name
—# foo.go
“`
package fooimport “fmt”
func Foo() {
// 引数で渡したパラメタが使える ‘-p name=George’
fmt.Println(“name”, “{{.Params.name}}”)
// 環境変数も使える
fmt.Println(“BAR”, “{{.Env.BAR}}”)
}
“``SCAFFOLD.md` と同じディレクトリでコマンド実行
“`shell
manaita –
【Go】APIサーバの構築 ~ログイン処理と操作権限の付加編~
#はじめに
APIサーバ構築の続きです。
JWTトークンを使って、ログインなどの認証まわりの処理を実装してみました。https://qiita.com/suzuki0430/items/f4396a337209cd1e37b7
https://qiita.com/suzuki0430/items/3eacf2329e0ce85d23d7
#実装
ログイン処理と特定のリクエストへの操作権限の付与について実装します。実装にあたって、属性情報(Claim)をJSONデータ構造で表現したトークンの仕様であるJWTを使用します。
JWTはヘッダー(Header).内容(Payload).署名(Signature)で構成されており、Claimは内容(Payload)に使われる情報の一部です。##ログイン処理
クライアント側でログインを行うために、`routes.go`に以下のルートハンドラーを追加します。“`go:routes.go
router.HandlerFunc(http.MethodPost, “/v1/signin”, app.Signin)
“``Sign
VSCodeで複数のmain.goを開くとgoplsのwarningが出る
# 問題
1つのルートディレクトリ(プロジェクト)下に複数のgo module、つまり`main.go`が存在すると、goplsがwarningを出してしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676735/67414abb-4f0a-3c81-a5a3-1c4468cacfcd.png)
個人的に`1ルートディレクトリ`=`複数のサンプルコード`の構成を崩したくないので調べてみました。
# 解決法
以下の設定を追加するだけで無事解消しました?“`settings.json
“gopls”: {
“experimentalWorkspaceModule”: true
}
“`※ 試験的なオプションなので動作しなくなる可能性があります
# 詳細
https://github.com/golang/tools/blob/master/gopls/doc/workspace.md#multiple-modulesを読む
【Goのデバッガーdelveを使えるようにするまでの苦労・プロセス】
## デバッガを扱う前にGoのmodule関連でつまづいた
go get で `dlv`をinstallしたらビルド時にエラーが出た。
“`yaml
go: inconsistent vendoring in /go/src/app/xxxx:
github.com/go-delve/delve@v1.8.0: is explicitly required in go.mod, but not marked as explicit in vendor/modules.txt
golang.org/x/sys@v0.0.0-xxxxxxxx: is marked as explicit in vendor/modules.txt, but not explicitly required in go.mod
To ignore the vendor directory, use -mod=readonly or -mod=mod.
To sync the vendor directory, run:
go mod vendor
“`> go: /go/src/app/xxxx
Goの良さを語りたい
一言で言うなら「はやく作って はやく改(なお)せる」のが Go 最大のメリット
Googleが開発した言語、流行らないわけがない…!(個人的感想)もちろん苦手な領域もある
→ https://zenn.dev/nobonobo/articles/3f5310248567a1> ◆Go入門(基礎の基礎)
https://zenn.dev/ak/articles/1fb628d82ed79b> ◆初心者がGoで気を付けること
https://zenn.dev/nobonobo/articles/e0af4e8afc6c38b42ae1ネイティブコード出力で実行効率が良い
コードの可読性を重視している
開発でよく使うツールがバンドル
クロスビルドが簡単にできる
コンパイルが遅くない(LLライクにrunできる)
並行処理の抽象化を組み込み言語仕様にもつ
メモリ安全である各解説は以下で
https://zenn.dev/nobonobo/articles/e651c66a15aaed657d6e#シンプルさがGo言語が成功に至った本質的な理由
少なくとも既存の
Go言語について
#目次
1 Go言語の概要
2 Go言語の特色
3 Go言語で開発されているもの
4 まとめ
#Go言語の概要
Go言語は2009年にGoogleが開発したオープンソースのプログラミング言語である。
開発にはC言語の設計者やUNIXの開発者等の人物がかかわっている。
また、初期はLinuxとMac OSのサポートだったが、2013年にリリースされたバージョン1.0からはWindowsにも対応するようになった。
#Go言語の特色
Go言語はシンプルで高い信頼性をもつ効率的なソフトウェアを構築できる言語とされている。
Go言語はシンプルな構文のため、ほかの人が読んでも分かりやすいプログラミングを書きやすい。
また、高速な処理や並列処理が可能なため作業効率を上げることができる。
しかしGo言語はシンプル性を高めるために機能が最小限に抑えられており「例外処理」、「Generics」、「継承」等の機能が無いというデメリットも存在する。
#Go言語で開発されているもの
Go言語は主にスマートフォンアプリの開発、ドローンやロボットの組み込み開発、Webサービス、Webサーバーの構築等に使われている
DockerでSFTPサーバ立ててGoでアクセスしてみる
# 最初に
GoのSFTPパッケージ触りたかったけど、サーバ立てるのも面倒だったのでコンテナでサクッとやっちゃおうと思ったメモ## SFTPサーバ立てるメモ
[atmoz/sftp](https://github.com/atmoz/sftp)を使って“`yaml:docker-compose.yml
version: ‘3’services:
sftp:
image: atmoz/sftp
container_name: sftp-server
volumes:
– ./sftp-server/upload:/home/foo/upload
ports:
– “2222:22″
command: foo:pass:::upload
“`
な感じでyaml用意して“`
mkdir sftp-server
mkdir sftp-server/upload
docker-compose up -d –build
sftp -oPort=”2222” foo@localhost
“`
な感じでコマン
ubuntuに最新のgolangをインストールする
## 環境
Ubuntu 16.04.7## 既にgoが入っている場合は、アンインストール
ubuntuのデフォルトでインストールできるバージョンは古いので、
もし入れてしまった場合は下記でアンインストールしてください“`
$ sudo apt-get remove golang-go
$ sudo apt-get remove –auto-remove golang-go
$ sudo apt-get purge golang*
“`#### goの最新のバージョンを確認
・今回はubuntuに入れるので、「Linux」の「x86-64」から選択
https://go.dev/dl/#### 作業スペースに移動して圧縮ファイルをダウンロードし、「/usr/local」に解凍します
“`
$ wget https://go.dev/dl/go1.17.6.linux-amd64.tar.gz
$ tar -C /usr/local -xzf go1.17.6.linux-amd64.tar.gz
“`#### GO のbinの場所を環境変数に追加
`
Raspberry Pi4 で GO言語を書いてみた(1)
**はじめに**
初めての Go言語 を自分なりに理解した内容をメモ書きとして記載する。
動作は、Raspberry Pi4 上で Go言語 と 「ECHO」の環境であり その構築方法は、
[『Raspberry Pi4 に Go言語 と 「ECHO」の環境を構築する』](https://qiita.com/ytetsuo/items/60b654c0bac40d17c575)に記述している。—
***基本機能のソースコード***
ここでは、下記の基本機能に絞ったソースコードを記載する。
1. 引数(flag)
2. 表示(fmt)
3. Webサーバ(net/http)ソースコードの意味は、コメントを見て下さい。
「ECHO」に関するコードは、[https://github.com/labstack/echo](https://github.com/labstack/echo)を そのまま用いた。~~~test.go
//////////////////////////////////////////////////
// go言語 / Echo 環境下での基本動作
【Go】APIサーバの構築 ~データの作成(Create)/更新(Update)/削除(Delete)編~
#はじめに
前記事の続きでデータの作成、更新、削除の処理を追加しました。https://qiita.com/suzuki0430/items/f4396a337209cd1e37b7
#実装
各処理の実装内容について記述します。##削除(Delete)
まずは`routes.go`にルートハンドラーを追加します。“`go:routes.go
router.HandlerFunc(http.MethodGet, “/v1/admin/deletemovie/:id”, app.deleteMovie)
“`
処理の内容を`movie-handlers.go`に記述します。
パスパラメータを取得するとき、`strconv.Atoi(params.ByName(“id”))`でidの型をStringからIntに変換することに注意します。“`go:movie-handlers.go
func (app *application) deleteMovie(w http.ResponseWriter, r *http.Request) {
params := httpro
Goで動くフロントエンドが作れるSSRライブラリkyotoを使ってみた話
# 注意
本記事は試しに使ってみた程度の記事です。今回使用した[kyoto](https://github.com/kyoto-framework/kyoto)は開発初期であり、今後も多くの変更が予定されているようです。本記事はv0.2を使用しています。
https://github.com/kyoto-framework/kyoto/milestone/3
# [kyoto](https://github.com/kyoto-framework/kyoto)とは
kyotoはSSR(Server Side Rendering)のライブラリです。
https://github.com/kyoto-framework/kyoto
[ドキュメント](https://kyoto.codes/prologue/)にあるMotivationを以下に引用します。
> **Motivation**
> Main motivation is to reduce usage of popular SPA/PWA frameworks where it’s not needed becau
MongoDBのfindで配列フィールドの登録数を不等号条件でfilterしたい
## 概要
MongoDBではフィールドに配列の型を持てますが、その登録数をfindで条件にしたい時もあるかなと思います。
特定の数(例えば配列の中に1個登録)を条件にしたい場合は、[$size](https://docs.mongodb.com/manual/reference/operator/query/size/)のオペレーターを使用すれば大丈夫ですが、1個以上とか不等号を使いたくなる場合もありますよね。ただ、`$size`は数値型しか設定できないので、例えば`array_field : { $size: { $gt : 1 }`のような指定は不可となります。
では、このように不等号を使いたい場合は、どのように対応すれば良いのかというのをメモ書きします。## 対応方法
[Is there a way to query array fields with size greater than some specified value?](https://www.mongodb.com/community/forums/t/is-there-a-way-to-query-arra
Golangに入門してみた
# Golangに入門してみた
最近、転職活動をしているときにgRPCについての話があり、あまり詳しく知らなかったのでハンズオンしたいな、と思いどうせならgRPCの醍醐味である別言語間での通信を実現してみたいなと思い、現在使えるJavaScript, Python, Rubyに加え、流行のGolangを用いてAPI作ってみたいなと思い、Glangのtutorialをやってみました。
そこで、とりあえずGolangのfor文 + if文を使って平方根を求めるエクササイズがあったので、それをググりながら書いてみた。そこまで難しくないし、ヒントも出されているので、5分くらいで終わったのですが、その回答を載せます。答えは見てないので、非効率なプログラム書いているかもしれませんが、まぁいいでしょう。
## エクササイズ内容
こちらのページのエクササイズを行いました。
https://go-tour-jp.appspot.com/flowcontrol/8![](https://storage.googleapis.com/zenn-user-upload/99d4cb256a76-2
GoでのWeb Framework選択時にルーティングの問題でGinを諦めてしまった人へ
## 前置き
久しぶりに記事を書いています。(結構雑にですが)
なんで書く気になったかというと、あまりに嬉しい修正が入っていたことに気が付いたからです。
恥ずかしながら結構前のアップデートだったようですが、12月中頃に気付きました・・・GoでAPIサーバを作成する際にWAFの選択肢は様々だと思います。
`go-swagger`を使ってみようかなんて考えたり、`Echo`と`Gin`ってどっちが良いんだろうと悩んだり。ちなみに僕は過去に`Gin`を選択したり、WAFというかRouterとして`gorilla/mux`を使用したりもしていました。
そして`Gin`についてはRouterのPathの記述というか、ルーティングに悩まされることがありました。
いくつかそのような記事も見かけたので気になる方は検索してみてください。
上記のようにPathが柔軟に作れないことで一定数`Gin`を選択肢から外してしまった方もいるのでは無いでしょうか。
今回はそんなルーティングに難があったGinでかなり問題が解決されていた部分について書いていこうと思う。
## 前提
– go versi