- 1. 分散システムにおけるScalableな名前付けアルゴリズム「Chord Protocol」を実装してみた
- 2. AWS Lambda+API Gateway+DynamoDBでCRUD APIを作るのをGolangでやってみた
- 3. Amazon Cognitoの認証情報をAmazon API Gateway+AWS Lambdaで取得
- 4. wsl2からGOlandを起動する
- 5. ゆっくりGo vol.2
- 6. http sample with go.uber.org/dig
- 7. Golang+Ginでswaggerを自動生成する(gin-swagger)
- 8. Istioはいかにしてサービス間通信のセキュリティを担保しているのか?
- 9. golang の datastore の unittest でハマった話
- 10. Goのldapモジュールで認証をLDAP認証をかける
- 11. golangでOpenLDAPサーバへ接続する
- 12. [Go言語] 初心者必見シリーズ: 構造体(Structs)
- 13. VS Code の Remote Container で複数のコンテナを起動して作業を切り替える
- 14. Goでソースコードを画像化するCLIを作った
- 15. GoでMonth型をint型に変換
- 16. Golangを唐突に始めたい衝動に駆られた話
- 17. GoMockで、構造体オブジェクトのポインタを受け取る関数の引数をテストする
- 18. azbill: Azure 利用明細・課金情報出力 CLI の紹介
- 19. Golangで再帰関数を書く
- 20. Goでの構造体埋め込みと、埋め込んだ構造体に構造体を代入する
分散システムにおけるScalableな名前付けアルゴリズム「Chord Protocol」を実装してみた
この記事は[Enjoy Architecting](https://taisho6339.hatenablog.com/entry/2020/07/22/164340)からの転載です。
## 概要
分散システムを学術的に学びたくて、
Chord Protocolというアルゴリズムが面白かったので実際に論文を読んで実装してみました。
この記事では、分散システムにおける名前付けの概念と、Chord Protocolの紹介、簡単な検証について言及していこうと思います。| ![実装したシステム](https://github.com/taisho6339/gord/raw/master/docs/architecture-2.png) |
|:–:|
| *実際に作ったサーバ* |## 分散システムにおける名前付けとは?
分散システムの分野には「名前」、「名前付け」、「アドレス」と呼ばれる概念があります。
それぞれどのような意味を持っているのでしょうか?### 名前付けと名前
分散システムはネットワークを通じてそれぞれのサーバ、プロセスが協調して動作しています。
この中で、各
AWS Lambda+API Gateway+DynamoDBでCRUD APIを作るのをGolangでやってみた
# この記事について
Developers.IO 2020のサーバーレスセッションに触発されました。
[[動画公開] 初めてのサーバーレスアプリケーション開発 #devio2020](https://dev.classmethod.jp/articles/devio2020-first-serverless-application/)というわけで、Golangを用いてAWSで基本的なサーバーレスをやってみたその手順をまとめました。
具体的には以下の手順を紹介します。1. GolangでLambdaを動かしAPI Gatewayと連携させる
2. LambdaとDynamoDBと連携してAPIを作る## 使用する環境・バージョン
– OS : macOS Mojave 10.14.5
– Golang : version go1.14 darwin/amd64## 読者に求める前提知識
Golangの基本的な文法がわかること。# Lambda関数の作成
## コンソールで関数を作成
AWS Lambdaのコンソールを開くと、以下のような画面になります。
Amazon Cognitoの認証情報をAmazon API Gateway+AWS Lambdaで取得
Goで取得してみます。
APIGatewayの統合リクエストで **Lambdaプロキシ統合の使用** にチェックを入れてください。
Go側では、“` github.com/aws/aws-lambda-go/events “` の “` events.APIGatewayProxyRequest “` で受け取ります。
下記のように取れます。“`go
func handler(ctx context.Context, req events.APIGatewayProxyRequest) (*events.APIGatewayProxyResponse, error) {
claims := req.RequestContext.Authorizer[“claims”].(map[string]interface{})
res := &events.APIGatewayProxyResponse{
StatusCode: 200,
Body: claims[“cognito:username”].(string),
}
return res
wsl2からGOlandを起動する
# 問題点
– Windows上から起動したIDEからwslパス上のファイルを読み込むと不都合があることがある
– このようなエラーが出ていた`go: RLock \\wsl$\Ubuntu-20.04\home\yuta\test\go.mod: Incorrect function.`# 構成
– Windows 10
– wsl2(ubuntu20.04)# X Server環境 セットアップ
## X環境インストール
“`
sudo apt update && sudo apt upgrade -y
sudo service dbus start
sudo apt install ubuntu-mate-desktop mate-desktop-environment mate-common mate-core
“`## X Serverインストール
“`
choco install -y vcxsrv
“`![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0
ゆっくりGo vol.2
#前回のおさらい
・私にとっての明日は今日なので…(目そらし)
・`for`まで習ったぞ!
・個人的に好きな言語!
・型のあたりがもやもやするぞ!#ほんへ
“`if.go
//————————————————
func pow(x, n, lim float64) (float64, float64) {
if v := math.Pow(x, n); v < lim { return v,lim } return lim } func main() { fmt.Println( pow(3, 2, 10), pow(3, 3, 20), ) } //---------------------------------------------- ``` ifと言うより関数が独特に感じる。 上記のコードを走らせると、こんなエラーが返ってくる。 ```e1.go ./prog.go:12:2: not enough arguments to return have (float64) wan
http sample with go.uber.org/dig
“`go
package main
import (
“fmt”
“net/http”“go.uber.org/dig”
)type Handler struct {
Greeting string
Path string
}func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, “%s from %s”, h.Greeting, h.Path)
}func NewHello1Handler() HandlerResult {
return HandlerResult{
Handler: Handler{
Path: “/hello1”,
Greeting: “welcome”,
},
}
}func NewHello2Handler() HandlerResult {
return HandlerResult{
Handler: Handler{
Path: “/hello2”
Golang+Ginでswaggerを自動生成する(gin-swagger)
# はじめに
api開発の時に必須と言っても過言ではない`swagger`ですが、なんと言っても保守し続けるのがとても面倒くさい、、、
できればコードから勝手にswaggerを生成してくれるといいのですが、、、そんな要望に対しての解決策の1つとなるのがこのgin-swagger(https://github.com/swaggo/gin-swagger)
です。これはgoのコードに指定のコメントを追加していくことで自動的にswaggerのコードを作成していくためのツールです。
# 今回のゴール
今回はこのような簡単なCRUDのswaggerを`gin-swagger`を用いて作成していきたいと思います!
![スクリーンショット 2020-08-02 22.13.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/d5485bb3-42f0-abe1-68a7-88f58042b3cd.png)### ディレクトリツリーはこんな感じです!
rootディレクトリは`gin-swag
Istioはいかにしてサービス間通信のセキュリティを担保しているのか?
## この記事について
この記事では、Istioがどのような考え方でサービス間通信のセキュリティを担保し、
どのように担保しているかを概観レベルで整理する。## サービス間通信で担保したいものと従来のセキュリティモデル
サービス間通信として担保したいものとして、
通信するアクセス元を制御し、盗聴やなりすまし、改ざんといった攻撃から守ることが挙げられる。
つまり、– man in the middle攻撃への防御
– アクセス制御がセキュリティ要件として挙げられる。
従来のセキュリティモデルとしては、
プライベートネットワークを構築し、IPベースでアクセス元を制限することでこれらを担保してきた。
(AWSのPrivate VPCとSGがわかりやすい)## Istioではどういうアプローチをとったのか?
昨今のコンテナベースで構築されるシステムでは、IPアドレスは高頻度で動的に変更されるためこのアプローチだと破綻する。
そこでIsitoは各ワークロードに対してIDを定義し、IDベースでアクセス制御を行うことととした。
具体的にはどういうアプローチなのか?## コアコンセ
golang の datastore の unittest でハマった話
# 概要
datastore.NewClient は実在の projectId を要求する
– context は aetest.NewContext を使う
– datastore client はテストでも使い方は同じ
– projectId が非実在のものだとエラーになる
– 実際の datastore には書き込まれていないのは確認済み–> **テストでも実在の ProjectId を指定する必要がある**
少し調べた範囲ではこれに関する情報が見つけられなかったため、あくまで推論。情報があれば教えて下さい。
# コード
“`go
func NewClient(ctx context.Context, projectId string) (*datastore.Client, error){
return datastore.NewClient(ctx, ProjectId)
}
“`“`go
func TestDatastore(t *testing.T) {
ctx, done, err := aetest.NewContext()
Goのldapモジュールで認証をLDAP認証をかける
## 認証したいユーザー
– `cn=yuta`
## ldapモジュールをインストール
“`bash
go get github.com/go-ldap/ldap
“`## サンプルコード
“`golang
package main
import (
“fmt”
“github.com/go-ldap/ldap/v3”
“log”
)var (
ldapServer = “ldap://localhost:389”
baseDN = “dc=vamdemic,dc=black”
username = “yuta”
password = “password”
bindusername = “cn=admin,dc=vamdemic,dc=black”
bindpassword = “password”)
// This example shows how a typical application can verify a login attempt
func Example_userAuthentication() {
l,
golangでOpenLDAPサーバへ接続する
# サーバを立てる
– DockerでOpenLdapを389で起動します
https://qiita.com/yuta_vamdemic/items/53cd67eea5af71ffd08a
# 認証する
### Ldapモジュールをインストール
“`bash
go get github.com/go-ldap/ldap
“`### コード
“`golang
package main
import (
“crypto/tls”
“errors”
“fmt”
“github.com/go-ldap/ldap”
)func ExampleconnSearch() (bool, error) {
ldapServer := “ldap://localhost:389”
err := errors.New(“connection error”)// ldapServerへの接続確認
l, err := ldap.DialURL(ldapServer, ldap.DialWithTLSConfig(&tls.Config{Insecur
[Go言語] 初心者必見シリーズ: 構造体(Structs)
# 構造体
構造体は、**フィールド(field)の集まり**です。
## 定義方法
構造体は下記のように `type` と `struct` を使用して定義します。
* 構文
“`go
type 構造体の名前 struct {
フィールド名 型名
フィールド名 型名
フィールド名 型名
…
}
“`**同じ型**のフィールド名は、**カンマ区切り**で書くことができます。
“`go
type 構造体の名前 struct {
フィールド名, フィールド名, フィールド名 型名
フィールド名 型名
}
“`* 例
人のデータをまとめた構造体です。
“`go
type People struct {
Name string
Sex string
Age int
Height int
Weight int
VS Code の Remote Container で複数のコンテナを起動して作業を切り替える
# はじめに
VSCode の Remote Container って便利ですよね。
ローカルPCの環境を汚さずにいろいろな言語を試すことのできるのが最高。ただ、サクッと試したいだけなのに、いちいち言語別に設定するのが面倒だったりしますよね。
この投稿では、1回起動するだけで複数のコンテナに接続できる設定を紹介します。
公式ドキュメントにも書かれているので、詳しく知りたい方はこちらを。
https://code.visualstudio.com/docs/remote/containers-advanced#_connecting-to-multiple-containers-at-once# デモコードの概要
ここでは、golang と python のコンテナを扱うこととします。
`.
├── golang
│ ├── .devcontainer.json
│ └── Dockerfile
├── python
│ ├── .devcontainer.json
│ └── Dockerfile
└── docker-compose.yml
`
## 設
Goでソースコードを画像化するCLIを作った
こんにちわ
ゴリラです普段、Twitterでたまにこういうふうにソースコードの画像を貼り付けることがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/4bf71de8-abd8-ffee-27e5-af3968bbe859.png)
画像を作るのに[carbon](https://carbon.now.sh/)というサービスを使っています。
このサービスできれいな画像を生成できますが、インターネットとブラウザなしでは使えないためちょっと不便と感じています。
また、[slicon](https://github.com/Aloxaf/silicon)というrust製のツールもありますが、これもcarbonと同様の制限があります。
そこで、ブラウザやネットを使用せずCLIでソースコードを画像化できたら良いなと思いCLIを作りました。英語で表されるtime.Month型をintで型キャストしたら普通に変換できたのでメモ。
“`go:main.go
package mainimport (
“fmt”
“time”
)func main() {
now := time.Now()
year := now.Year()
month := now.Month()
monthToInt := int(month)
date := now.Day()
hour := now.Hour()
minute := now.Minute()
second := now.Second()fmt.Printf(“年を表示:%v\n”, year)
fmt.Printf(“月をtime.Month型で表示:%v\n”, month)
fmt.Printf(“月をint型に変換して表示:%v\n”, monthToInt)
fmt.
Golangを唐突に始めたい衝動に駆られた話
# 金曜日の深夜に急にGoを始めたい衝動に駆られた
## 思い立った経緯
金曜日の夜にふと人気プログラミング言語について閲覧していた。そこでPythonやJavascript不動の人気に、「はい、そうですか。」気分でみていた。そこでみたGoLangをみて、「あ、せっかくだし触りだけでも今日やろうかな」と思ったので、自分への議事録のため記事を投稿。# やったこと
自分のPCでの動作環境構築と公式ドキュメントの「Packages, variables, and functions.
Learn the basic components of any Go progr」をやってみた## 動作環境
OS:macOS Catalina 10.15.6
Editor:Visual Studio Code 1.47.3
pkg管理:Homebrew 2.4.9## 環境構築
まずはGoLangのインストールから“`terminal
hoge@hoge-MacBook-Air ~ % brew install go
…省略…
hoge@hoge-MacBook-Air ~
GoMockで、構造体オブジェクトのポインタを受け取る関数の引数をテストする
# 概要
モック化させたインターフェースの関数に、期待した値が入って呼ばれるかどうかをテストしたいシーンのお話です。引数に構造体のポインタを受け取る関数をテストする時、
* テストスイート内でアサーションのために宣言したオブジェクト
* 実際のビジネスロジックの中で生成されたオブジェクトはポインタが異なるため、オブジェクトのチェックが難しくなります。
gomockを使っている際に、この問題を解決する方法をまとめます。
# GoMock
GitHub: https://github.com/golang/mock今回使用したバージョンはv1.4.3です。
# ユースケース
概要だけだとイメージが湧きにくいかと思いますので、ここからは例を交えて説明します。
ユースケースは下記のようにシンプルなものを用意します。* タイトルと著者名を入力して、Bookオブジェクトを作成する
* タイトルに空文字を入れた時には、Bookオブジェクトのタイトルが「no title」になる## テストケース
テストでは、* **When**: ユースケースの関数に空文字のタイトルを
azbill: Azure 利用明細・課金情報出力 CLI の紹介
## はじめに
[azbill](https://github.com/yaegashi/azbill) という Azure クラウドサービスの利用明細・課金情報を出力してくれる CLI ツールを Go 言語で作ったので紹介します。主に Enterprise Agreement (EA) で Azure を導入している組織向けで、例えば部署ごと・リソースの種類ごと・タグごとの使用量を算出するといったようなコスト分析のためのデータを出力するツールです。
azbill を使うと EA の課金アカウントや Azure サブスクリプションに含まれるすべてのリソースの使用量・課金額を日次で取得し、CSV や JSONL の形式でファイルに保存できます。
このような利用明細の取得は Azure CLI でもできると思われるかもしれませんが、現行の Azure CLI は[新しいバージョンの Consumption API](https://docs.microsoft.com/en-us/rest/api/consumption/) に対応しておらず、予約 VM の利用状況といったような情報
Golangで再帰関数を書く
仕事でGoで再帰関数を書いた時に苦戦したので備忘録として残しておきます。
## サンプルコード
“`
func unpackStruct(data interface{}) interface{} {
switch d := data.(type) {
case *structpb.Struct:
_metadata := make(map[string]interface{})
for k, x := range d.Fields {
_metadata[k] = unpackStruct(x.GetKind())
}
return _metadata
case *structpb.Value_StructValue:
_metadata := make(map[string]interface{})
for k, x := range d.StructValue.Fields {
_metadata[k] = unpackStruct(x.GetKind())
}
return _metadata
case *structp
Goでの構造体埋め込みと、埋め込んだ構造体に構造体を代入する
構造体の埋め込みについてはよく書いてあるのだけど
埋め込んだ構造体に、埋め込んだ元の構造体を代入する方法があまりなかったのでメモ### 埋め込み
“`
type A struct {
A string
}
type B struct {
B string
}type C struct {
*A
*B
}
“`### 代入
“`
a := new(A)
b := new(B)
c := new(C)a.A = “hoge”
b.B = “hage”c = &C{B: b} // CにBを代入
“`### 代入済みのCにAを追加
“`
c = &C{
A: a,
B: c.B,
}
“`