- 1. Goのsortパッケージでよく使う関数
- 2. go: cannot find main module, but found|GolangのテストをGitHub Actionsで回した時のエラー
- 3. [Go] KeyLogWriter (crypto/tls) を使って TLS 通信を Wireshark で復号化する
- 4. 【Go】Goのwebフレームワークginを使ってHello World(Part1)
- 5. Go言語で別ディレクトリにある別モジュールを呼び出す方法
- 6. golangでpostgresを操作する。
- 7. GolangでWebアプリケーションを作成する
- 8. 一筋縄ではいかない GoでZIPの中のBZIP2を解凍
- 9. [Golang]Goでの繰り返し処理をまとめる
- 10. [Golang]GinでCookieをセットする方法
- 11. Go: Rasbperry Pi で LED を使う
- 12. ゼロトラスト、フロントから守るかレガシーから守るか(Linuxでゼロトラストしようぜの巻!)
- 13. Go の気になったコミット (2021 年 9 月)
- 14. [Go言語] Golang + AWS Lambdaを実行するとfork/exec /var/task/main: exec format error: PathError
- 15. リモートワークで固定IPするために: VPNの認証のためにRADIUSサーバーをつくる
- 16. Lambda, Amazon Textractを利用してS3に保存した画像からテキストを抽出する(Golang)
- 17. VSCode + Remote ContainerでGoの開発環境を作ったけどimportできなくて悩んだ話
- 18. Go言語でhttpリクエスト結果が403の解決方法の一例
- 19. Golang Dockerマルチステージビルドで環境構築
- 20. [Go]型変換チートシート(int, string, float, time, etc)
Goのsortパッケージでよく使う関数
## はじめに
Go標準のsortパッケージでは、スライスの並び替えなどをサポートしています。
本記事では、sortパッケージで一般的に利用される関数を紹介していきます。## Ints
int型のスライスを昇順で並び替えます。“`go:go
package mainimport (
“fmt”
“sort”
)func main() {
s := []int{5, 2, 3, 1, 4}
sort.Ints(s)
fmt.Println(s) //=> [1 2 3 4 5]
}
“`
一般的なソート(バブルソート)と比較してみます。“`go:go
package mainimport “fmt”
func main() {
s := []int{5, 2, 3, 1, 4}
for i := 0; i < len(s)-1; i++ { for j := 0; j < len(s)-1-i; j++ { if s[j] > s[j+1] {
s[j], s[j+1] = s[j+1], s[j]
}
}
go: cannot find main module, but found|GolangのテストをGitHub Actionsで回した時のエラー
# 状況
ある書籍のサンプルコードを動かしていたところ遭遇したエラーです。
Golangは触ったこともない状態で進めていたのでモジュールやGoPathなども
理解できていない状態でした。# エラーメッセージ
GitHub ActionsでGolangのテストファイルを実行した時に出たエラーです。“`error.go
go: cannot find main module, but found .git/config in /__w/app-name/app-name
to create a module there, run:
go mod init
Error: Process completed with exit code 1.“`
# 原因
go.modファイルがないことでした。
詳しい原因知っている方いましたらコメントいただけたら嬉しいです。# 解決方法
以下のコマンドでgo.modファイルをプロジェクトディレクトリのルートに生成しpushしたらエラーが消えました。“`go.sh
$ go mod init github.com/examp
[Go] KeyLogWriter (crypto/tls) を使って TLS 通信を Wireshark で復号化する
一般にブラウザや curl で同様に TLS のダンプをしたい時は、`SSLKEYLOGFILE` 環境変数に TLS master secrets 情報を書き出すファイルを指定し、Wireshark などの外部アプリケーションにこのファイルを食わせることで capture した暗号化通信データを復号化し、手元で生の HTTP リクエスト情報 (over TLS) を手軽に解析できることが知られています。
https://please-sleep.cou929.nu/decrypting-tls-traffic-packet-capture.html
https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format
https://everything.curl.dev/usingcurl/tls/sslkeylogfile
## KeyLogWriter (crypto/tls)
Go でも同様に `crypto/tls` package がサポートしている `KeyLogWriter`
【Go】Goのwebフレームワークginを使ってHello World(Part1)
# 自己紹介
Qiita初投稿なので軽く自己紹介です。
新卒から3年ぐらいはDBA周りを経験してだらだら無駄な時間を過ごしてましたが、
2年前ぐらいにjavaをメインにしたweb系の会社に転職してからようやく自己学習を始めた出遅れ感満載のエンジニアです。# Goを勉強しようと思った背景
注目言語だからちょっと挑戦してみたかったというのもありますが、
平行処理がすごい楽と知人から聞いたのでどんなもんなんだと興味本位で勉強したいと思ったからです。
webフレームワークを使おうと思った理由としては、自身がweb系が得意としているので、主にjava(Spring)との違いが感じやすいかと思ったからです。# 環境
- Mac(M1): BigSur 11.5.2
- Go: go1.17.2 darwin/arm64
- エディタ: GoLand
- DB: MySQL 8.0
- パッケージ管理:Go Modules0
# とりあえずのHello World
ginを追加して“`
go
Go言語で別ディレクトリにある別モジュールを呼び出す方法
# 参考記事
[公式のドキュメント](https://golang.org/doc/tutorial/call-module-code)
golangでpostgresを操作する。
golangでormなしにpostgresを操作する機会があり、色々学びがあったのでまとめ見たいと思います。
# 使用ライブラリ
`github.com/lib/pq`
`database/sql`#配列
postgresには配列型があり、柔軟に複数の値を操作できます。
集約関数から、マッチした値を配列に変換してDISTINCTを掛ければ一意な値の配列が得られたりします(速さは保証しません)。golangで書く場合は以下の通りです。
“`golang
targetIds = []int{400,500}
// queryに配列を埋め込む
db.Query(`SELECT * FROM t WHERE id = ANY($1)`, pq.Array(targetIds))// query結果を配列に変換する
var x []sql.NullInt64
db.QueryRow(`SELECT ARRAY[235, 401]`).Scan(pq.Array(&x))
“``pg.Array`関数でgolangの配列 <-> query を簡単に行えます。
#jso
GolangでWebアプリケーションを作成する
新しい言語の勉強をするにはハンズオンが一番ということで、Golangを使ってCRUDから始めてタスク管理のWebアプリケーションを作成する。
随時新しいキーワードを見つけた際には、調べた情報をまとめていきたい。# 目的
Golangの使い方とWebアプリケーションの実装に関する技術習得# 設計
### 概要
個人やチームで使用するタスク管理Webアプリ### Github
https://github.com/blackmax1886/team_task### データ
| Struct | Field |
|:-:|:-:|
| task | Id
Name
Content
Completed
Deadline
Archived |
| user | Id
Password
|
| team | Id
Users |### 実装したい項目
– 各StructのCRUD
– taskのCRUDに関するAPI
– Googleカレンダーとの連携
– taskのCRUDを自動化するインターフェ
一筋縄ではいかない GoでZIPの中のBZIP2を解凍
[![Github](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1646184/0e201e0c-e21f-a715-4353-142b23059ccd.png)](https://github.com/Soliton-Analytics-Team) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Soliton-Analytics-Team/Go-BZIP2/blob/main/ZIP_BZIP2.ipynb)
ご覧いただきありがとうございます。[ソリトンシステムズのセキュリティ分析チーム](https://www.soliton-cyber.com/)です。
Google Colaboratoryにアカウントをお持ちの方は、上の「Open in Colab」という青いボタンを押せば直接notebookをColabで開
[Golang]Goでの繰り返し処理をまとめる
# はじめに
改めてGoの繰り返し処理についてまとめて行きます。# for文
### 普通のfor文
“`golang
for i := 1; i <= 5; i++ { fmt.Println(i) // 1,2,3,4,5 } ``` #### continueを使って、スキップする ```golang for i := 0; i < 10; i++ { if i%2 == 0 { continue } fmt.Println(i) } ``` #### breakを使って処理を終了する ```golang for i := 0; i < 10; i++ { if i == 5 { break } fmt.Println(i) } ``` # for range ```golang for i, v := range []string{"foo", "bar", "baz"} { fmt.Println(i, v) } ```
[Golang]GinでCookieをセットする方法
# はじめに
GinでCookieをセットするやり方でハマったので、記録します。# やり方
“`golang
// Cookieをセット
cookie := new(http.Cookie)
cookie.Value = token //Cookieに入れる値// samesiteをnonemodeにする
c.SetSameSite(http.SameSiteNoneMode)// ローカルの場合
if os.Getenv(“ENV”) == “local” {
log.Println(“cookieをセットする”)
c.SetCookie(“jwt”, cookie.Value, 3600, “/”, “localhost”, true, true)
}// 本番環境の場合
if os.Getenv(“ENV”) == “production” {
log.Println(“productionでcookieをセットする”)
c.SetCookie(“jwt”, cookie.Value, 3600, “/
Go: Rasbperry Pi で LED を使う
##プログラム##
>GPIO16 のピン番号は 36 です。“`go:led.go
package mainimport (
“time”
“fmt”
“os”“gobot.io/x/gobot”
“gobot.io/x/gobot/drivers/gpio”
“gobot.io/x/gobot/platforms/raspi”
)func main() {
fmt.Fprintf (os.Stderr,”*** 開始 ***\n”)
r := raspi.NewAdaptor()
led := gpio.NewLedDriver(r, “36”)
fmt.Fprintf (os.Stderr,”*** bbb ***\n”)work := func() {
gobot.Every(2*time.Second, func() {
fmt.Fprintf (os.Stderr,”*
ゼロトラスト、フロントから守るかレガシーから守るか(Linuxでゼロトラストしようぜの巻!)
# こんなミッションありませんか?
とてつもなく古くてLTSを遥か昔に超越した社内向けサーバー達。動作しているミドルウェアは砂漠のように枯れ果てて、動作しているコードはめちゃくちゃな実装で読む気もしない。明らかになっているメンテナンス手順は「リブート」のみ。もちろん起動に失敗したケースの手順は無い。今期はセキュリティ強化のお達しから、白羽の矢が立つ。**「このサーバー達のセキュリティリスクを軽減する施策を考えてください」**
**・・・**
リプレースは枯れた社内向けに投資するコストは無い!EDRはOSが古すぎてインストールできないよ!
速く壊れて再起不能になってくれないかな・・いや、いっそのこと**壊してしまえば・・**
### ちょい待ち!
このツール見てから最終手段を考えても良いんじゃね?
# 作ったわ!
[golang/go](https://github.com/golang/go) に行われたコミットから個人的に気になったものをリストにしたものです。
タイトルに 2021 年 9 月と銘打っていますが 8 月のコミットも含まれていますし 10 月を作る予定も今のところありません。軽く説明を追加していますが勘違いや誤りがあるかもしれません。
## Commits
### 2021-08-13
https://github.com/golang/go/commit/46fd547d899286982971474b329d7a95da4f2a6b
バージョンが Go 1.17 から Go 1.18 に変更されました。 :rocket:
### 2021-08-17
https://github.com/golang/go/commit/ec271687129dc8b263699b0b9d3abed71d8bd39d
http.ResponseWriter で HTTP ヘッダーを設定する際に改行もそのまま出力されてしまう不具合が修正されています。 [^1]
https
[Go言語] Golang + AWS Lambdaを実行するとfork/exec /var/task/main: exec format error: PathError
## 概要
Serverless FrameworkやSAMやbuildしたものをそのまま上げてみるなどして、AWS LambdaにGoをデプロイするとどのケースでも以下のエラーがCloudWatchに出力されていた。筆者はM1 Macを使っていることで詰まった。“`
fork/exec /var/task/main: exec format error: PathError
null
“`## 解決策
### 一般的な解決法
go buildがなんかしらおかしいはずです。以下のようにgo buildはしましたか?
生成したバイナリのディレクトリ位置も確認してみたください。“`
$ GOOS=linux go build .
“`### M1 Macユーザー
go build時にLambdaで指定しているアーキテクチャに合わせていますか?
デフォルトはx86_64のため設定を変更をしていなければ以下のようにamd64でbuildするようにする“`
$ GOARCH=amd64 GOOS=linux go build .
“`
リモートワークで固定IPするために: VPNの認証のためにRADIUSサーバーをつくる
ピリカでは開発環境へのアクセスを保護するための一環としてIP制限をしていますが、ピリカという会社は元々リモートで仕事をしている人が多く、またオフィスのIPアドレスは動的IPの時代が続いていました。
そこで、各自のIPアドレスを固定化するためにVPNやプロキシサーバーを構築していますが、その認証の管理をできるだけGoogle Workspaceの権限を元にやりたいと考えました。
この記事では、VPNやプロキシの認証をするための前段として、Google Workspaceの情報と連動した独自の認証基盤をどのように作ったかを紹介します。
## 全体の設計
このVPN/認証プロキシシステムの設計はこのようになっています。
![20210922102253.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609129/03a9115c-ac92-e7f7-0b72-67adddca76bd.png)
Google Workspaceの生のパスワードをシステムが受け取って認証するのは、APIが存在しないし
Lambda, Amazon Textractを利用してS3に保存した画像からテキストを抽出する(Golang)
# はじめに
S3に画像を追加すると、自動的にその画像内のテキストを抽出し、テキストファイルとして保存する、というシステムを[Lambda](https://aws.amazon.com/jp/lambda/)・[Amazon Textract](https://aws.amazon.com/jp/textract/)・Golangを利用して作りました。
作成手順を共有します。
### 完成イメージ
![ocr.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455240/80ef8a6e-a645-99ad-8d4e-ab1f62fb8046.png)
### Textractとは
[Amazon Textract](https://aws.amazon.com/jp/textract/)はAWSが提供するクラウドOCRサービスです。詳しくは以下の記事を参照してください。
https://qiita.com/windows222/items/07c3683c052d6e2b
VSCode + Remote ContainerでGoの開発環境を作ったけどimportできなくて悩んだ話
# 概要
[前回の記事](https://qiita.com/ka-zuu/items/3144780ee528815e7557)でVSCodeでDockerのDevContainerをサクッと起動して、OS環境を汚さない快適開発環境を作れるようになったけど、Goでサンプル実装しようとすると、どうにもうまく行かない。
具体的には、自分の作ったpackageをimportできない。
情報を色々検索したところ、Goの推奨する標準構成が色々変わったことに、インターネッツの記事が追いついていなく、新旧の情報が錯綜しているためだった。
結果的に解決できたので、その備忘録を書いておく。# 結論
結論から書くと、こちらのサイトを最初から参考にして環境作っておけばよかった・・・という話・・・
[Go 脱初心者への道](https://zenn.dev/shellyln/articles/b2992891f8f3f9381025#1.-%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E4%BD%9C%E6%88%90%E3%83%BB%E3%83%91%E
Go言語でhttpリクエスト結果が403の解決方法の一例
# はじめに
カクヨムのサイトをGo言語の`net/http`のライブラリーを使用していてデータ取得していたけど
ある時から、403と表示するようになった。curlコマンドでは取得できるのでなんでかわからなかったけど
可決方法が分かったのでやり方を記載する。# 失敗時のやり方
以下のプログラムを組んだ時に403と返す。
“`go:main.go
package mainimport (
“fmt”
“io/ioutil”
“net/http”
)func main() {
url = “https://kakuyomu.jp/”
web1(url)
}func web1(url string) {
resp, _ := http.Get(url)
defer resp.Body.Close()byteArray, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(byteArray))
}
“`実行すると以下の通りになる。
“`:log
4
Golang Dockerマルチステージビルドで環境構築
#結論
Dockerマルチステージビルドを使用して可能な限りコンテナイメージを小さくしてみました。結果は以下の通りです。正直数十MBくらいになることを期待していましたが、意外と小さくならなかったです。もっと改善点があると思いますが、今回は開発中のアプリが問題なく動作するまでにとどめます。“`
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
go conventional ed4436ad7be4 35 minutes ago 955MB
go use-multi 40c0d5f36f4c 17 hours ago 548MB“`
# ゴール
– Dockerマルチステージビルドを使用してDockerコンテナを立ち上げる。
– 現在開発中のGoファイルの動作に問題がないこと。
– `マルチステージビルド使用前よりもコンテナイメージが小さくなること。`# 実行環境
– Mac 11.5.
[Go]型変換チートシート(int, string, float, time, etc)
自分用に型変換をまとめました。随時更新していきます。
足りない情報があればコメントをいただきたいです。### intの変換
“`go
// int → int64
int64(int)// int → string
strconv.Itoa(int)// int64 → int
int(int64)// int64 → string
strconv.FormatInt(int64, 10)// string → int
strconv.Atoi(string)
“`
### floatの変換
“`go
// float → string
v := fmt.Sprintf(“%.2f”,3.1425)
// “3.14”// float →float(四捨五入)
v :=3.1415
fmt.Println(math.Round(v*100) / 100) // 3.14
fmt.Println(math.Round(v*1000) / 1000) // 3.141
“`
### Time型の変換
“`go
// int → time
ti