- 1. 環境
- 2. Goのインストール
- 3. GOROOTを設定
- 4. GOPATHの設定
- 4.0.1. Go+gRPCでシンプルなEchoサーバ(令和最新版)
- 4.0.2. Dockerを使ってGolangでHello,World!(超初心者向け)
- 4.0.3. [Go] MVCから始めて辿り着いたぼくのレイヤードアーキテクチャ
- 4.0.4. Goのsortパッケージでよく使う関数
- 4.0.5. go: cannot find main module, but found|GolangのテストをGitHub Actionsで回した時のエラー
- 4.0.6. [Go] KeyLogWriter (crypto/tls) を使って TLS 通信を Wireshark で復号化する
- 4.0.7. 【Go】Goのwebフレームワークginを使ってHello World(Part1)
- 4.0.8. Go言語で別ディレクトリにある別モジュールを呼び出す方法
- 4.0.9. golangでpostgresを操作する。
- 4.0.10. GolangでWebアプリケーションを作成する
- 4.0.11. 一筋縄ではいかない GoでZIPの中のBZIP2を解凍
- 4.0.12. [Golang]Goでの繰り返し処理をまとめる
- 4.0.13. [Golang]GinでCookieをセットする方法
- 4.0.14. Go: Rasbperry Pi で LED を使う
- 4.0.15. ゼロトラスト、フロントから守るかレガシーから守るか(Linuxでゼロトラストしようぜの巻!)
- 4.0.16. Go の気になったコミット (2021 年 9 月)
- 4.0.17. [Go言語] Golang + AWS Lambdaを実行するとfork/exec /var/task/main: exec format error: PathError
- 4.0.18. リモートワークで固定IPするために: VPNの認証のためにRADIUSサーバーをつくる
AWSの強い権限のクレデンシャル管理から転生した件
# クレデンシャルをパスワードみたい使ってない?
開発チームには最低限の権限付けたクレデンシャルを払い出し、その点ではセキュリティは確保しているものの、運用系には**強い権限**を持ち、かつトラブル対応時に**期限が切れないように永続的な権限**を払い出してはいないでしょうか。権限が強いので更新などを所有者に移譲しているため、定期更新なんかしないで使い続けてる管理になりがち・・### これではパスワードと何も変わらない!
**このツールはAWSでのクレデンシャル管理の概念を変えるため作られました**
# 作ったわ!
[![yasutakatou/goCred – GitHub](https://gh-card.dev/repos/yasutakatou/goCred.svg)](https://github.com/yasutakatou/goCred)
詳しくはリポジトリで。[バイナリをダウンロードして即使いたいならこっち](https://github.com/yasutakatou/goCred)
# どんなん?
このツールを使うと・・
– **強い権限を持つ
HomebrewでのGoの環境構築(macOS)
環境
・OS:macOS Big Sur
・シェル:zshGoのインストール
まず、ターミナルでこちらのコマンドを打って、Goをインストールします。
“`
% brew install go
“`GOROOTを設定
GOROOTとはGoのインストールパスです。
自分でインストールディレクトリを変更した場合には、環境変数$GOROOTの設定が必要です。
GOROOTは標準では/usr/local/goですが、homebrewでインストールした場合には/usr/local/opt/go/libexecになります。“`
% go env GOROOT
/usr/local/opt/go/libexec
“`GOPATHの設定
GOPATHはとは外部パッケージのリソースなどが保存されるパスです。
GOPATHを設定しておくとコマンドを実行するときにフルパスを入れずに済みます。
GOROOT同様に、GOPATH以下の/bin/にGoの実行バイナリが配置
Go+gRPCでシンプルなEchoサーバ(令和最新版)
# はじめに
GoのインストールからシンプルなEchoサービスをgRPCで実装するまでの手順。# 各ツールのインストール
## Go
“`
$ wget https://golang.org/dl/go1.17.linux-amd64.tar.gz
$ sudo tar xf go1.17.linux-amd64.tar.gz -C /usr/local
$ echo “GOPATH=${HOME}/go” >>.bashrc
$ echo “PATH=${PATH};/usr/local/go/bin” >>.bashrc
$ source .bashrc
“`## protoc
“`
$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.18.1/protoc-3.18.1-linux-x86_64.zip
$ unzip -d ${HOME}/.local protoc-3.18.1-linux-x86_64.zip
$ echo “PATH=${PATH};${HOME}/
Dockerを使ってGolangでHello,World!(超初心者向け)
Dockerでgolangを動かしてみます。
Dockerを触ったことがない人でもわかるように意識して書きました。#事前準備
・Dockerのインストールが済んでいること
・Vimの基本的な操作(編集、保存、閉じる)ができること#本題
下記のコマンドを実行します。
docker run -it –name=”任意の名前” -p 8080:80 golang:1.15 bash_**コマンドオプションの意味**_
`-i` :ホストの入力をコンテナの標準出力をつなげる
`-t` :コンテナの標準出力とホストの出力をつなげる
>`-i,-t`オプションを付けないとコンテナの中で入力できない
`-i`オプションと合わせて`-it`と記述可能`–name=” ”` :コンテナ名に任意の名前を付ける #付けなくても動きます
`-p 8080:80` :ポートフォワードする。 書き方:`-p [ホスト側のポート番号]:[コンテナのポート番号]`
>ポートフォワード
「このポートに届いたデータは、あいつに送ってやるぜ」な設定がされている
詳しくは[こちら]
[こちら]:ht
[Go] MVCから始めて辿り着いたぼくのレイヤードアーキテクチャ
## はじめに
### サマリ
– Goを書くようになってからそろそろ1年が経ちます。
– GoでWeb APIを実装する際の個人的パッケージ構成が定まりつつあるので備忘録を書き連ねます。
– 当初はMVCで実装していました。
– 最終的に**レイヤードアーキテクチャ**を用いたパッケージ構成に落ち着きました[^1]。
– 本稿ではDDD等の文脈は切り離して、**パッケージ構成を責務毎に分割するための取り組みとしてのみ**レイヤ系アーキテクチャを取り扱います。### レイヤ系アーキテクチャとは?
レイヤ構造を持ったアーキテクチャ(クリーン/オニオン/レイヤード…)等を指します。
MVCもレイヤ構造を持ちますが、今回はレイヤ系とは区別して説明いたします。### 記事の内容
– (主に)Web APIを実装する際に採用している個人的アーキテクチャについて説明します。
– まず現在のレイヤードアーキテクチャに至る試行錯誤を話し、その後具体的なコードを交えながら解説します。### 対象読者
– レイヤ系アーキテクチャを理解する最初の一歩が欲しい方向けです。
–
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が存在しないし