- 1. 【GoでIPv6】GoネットワークプログラムでIPv6対応させるためのアドレス正規化をする方法
- 2. 【SRE/Go】database/sql のざっとした情報
- 3. 【Kubernetes Operator】operator-sdkとkubebuilder統合に関する注意点
- 4. 【GoでIPv6】GoネットワークプログラムでIPv6対応させるためのアドレスファミリーチェックをする方法
- 5. Docker Vue Go
- 6. Wio Terminal で TinyGo プログラミングを始めよう
- 7. GoでHello vinaka!(World!)を出す
- 8. Goのhttp.Requestのキャンセルの仕組みを理解する
- 9. 64ビット整数の最大値は計算の限界ではない
- 10. 分散システムにおけるScalableな名前付けアルゴリズム「Chord Protocol」を実装してみた
- 11. AWS Lambda+API Gateway+DynamoDBでCRUD APIを作るのをGolangでやってみた
- 12. Amazon Cognitoの認証情報をAmazon API Gateway+AWS Lambdaで取得
- 13. wsl2からGOlandを起動する
- 14. ゆっくりGo vol.2
- 15. http sample with go.uber.org/dig
- 16. Golang+Ginでswaggerを自動生成する(gin-swagger)
- 17. Istioはいかにしてサービス間通信のセキュリティを担保しているのか?
- 18. golang の datastore の unittest でハマった話
- 19. Goのldapモジュールで認証をLDAP認証をかける
- 20. golangでOpenLDAPサーバへ接続する
【GoでIPv6】GoネットワークプログラムでIPv6対応させるためのアドレス正規化をする方法
# 理由
Goで書かれたネットワークプログラムをIPv6に対応させるためには、サーバサイドはあまり意識しなくてもいいが、IPv6アドレスは表記方法が複数あり、このIPv6アドレス処理を文字列で処理しようとする場合正規化する必要がある。その場合のコード例をメモしておく例)
– 2001:db8::1 は 2001:0db8:0000:0000:0000:0000:0000:0001 ともかける→文字列比較すると違うと判断されてしまう
参考) [RFC5952-IPv6アドレスの推奨表記](https://www.nic.ad.jp/ja/newsletter/No46/0800.html)# 参考コード
– https://play.golang.org/p/eF4fo9O714-“`golang:main.go
package mainimport (
“fmt”
“net”
)func v6Format(addr string) string {
ip := net.ParseIP(addr)
// Parseできたら
if ip != nil
【SRE/Go】database/sql のざっとした情報
## Database
全体像は下記から把握する
[Go SQL Interface (Japanese) · golang.shop](https://golang.shop/post/go-sql-interface-ja/)
[Go database/sql チュートリアル 04 – 結果セットの取得 · golang.shop](https://golang.shop/post/go-databasesql-04-retrieving-ja/)### Scan
>Scanは、一致した行の列をdestが指す値にコピーします。詳細については、Rows.Scanのドキュメントを参照してください。複数の行がクエリと一致する場合、Scanは最初の行を使用し、残りは破棄します。クエリに一致する行がない場合、ScanはErrNoRowsを返します。
[sql – The Go Programming Language](https://golang.org/pkg/database/sql/#Row.Scan)### Query
>Queryは、指定された引数を使用して準備されたク
【Kubernetes Operator】operator-sdkとkubebuilder統合に関する注意点
# Operator-sdkのコマンド体系がv0.19.0(2020/7 release)から変わった
Go向けのOperatorのコマンド体系がkubebuilderに沿った形式となったために、既存のコマンドは通らなくなっている。
“`bash
operator-sdk new osushi-operator –repo github.com/iaoiui/osushi
Error: unknown flag: –repo
“`operator-sdkのバージョンは下記
“`bash
❯ operator-sdk version
operator-sdk version: “v0.19.2”, commit: “4282ce9acdef6d7a1e9f90832db4dc5a212ae850”, kubernetes version: “v1.18.2”, go version: “go1.14.5 darwin/amd64”
“`下記のOperatorframeworkのドキュメントを確認すると、v0.19.0以前はLegacyと呼ばれ別のドキュメントを参
【GoでIPv6】GoネットワークプログラムでIPv6対応させるためのアドレスファミリーチェックをする方法
# 理由
Goで書かれたネットワークプログラムをIPv6に対応させるためには、サーバサイドはあまり意識しなくてもいいが、アドレス処理を文字列で処理する事がある場合、そのアドレス文字列(ログやサーバの環境変数で見えるクライアントアドレス)がどちらのアドレスファミリーなのかチェックをし、それぞれの処理をする必要がある
その場合のコード例をメモしておく# 参考コード
– https://play.golang.org/p/mKUGd7lUNBP“`golang:main.go
package mainimport (
“fmt”
“net”
)// アドレスファミリーチェック関数
func afCheck(addr string) string {
// 文字列をnet.IPにParse
ip := net.ParseIP(addr)// Parseできたら
if ip != nil {
if len(ip.To4()) == net.IPv4len {
// アドレスの長さをチェックし、4byte=32bit -> IPv4
retur
Docker Vue Go
##Docker
###Dockerマウントできないよ〜
“`
ERROR: for nginx Cannot start service nginx: OCI runtime create failed: container_linux.go:349: starting container process caused “process_linux.go:449: container init caused \”rootfs_linux.go:58: mounting \\\”/Users/ishidashogo/practice/goPractice/etc/nginx/nginx.conf\\\” to rootfs
\\\”/var/lib/docker/overlay2/ac829670cc63c6bd9749802860c0b6dd9619d56f1883525650acc81db4dc4ee1/merged\\\” at \\\”/var/lib/docker/overlay2/ac829670cc63c6bd9749802860c0b6dd9619d56f
Wio Terminal で TinyGo プログラミングを始めよう
このページには、 Wio Terminal + TinyGo 0.14 を使ってマイコンプログラミングを始めるための情報を記載します。
マイコンプログラミングをしたことがある人もない人も、是非試してみてください。
主に Windows 10 で試しながら書きますが、他の OS でもほとんど同じ動きになると思います。## TinyGo とは
マイコンや WASM などの Small Places 向けの Go Compiler です。
ここでは Go の文法でマイコン開発ができるもの、という程度の認識でよいです。* [TinyGo – Go on Microcontrollers and WASM](https://tinygo.org/)
このページは 2020/08/05 にリリースされた TinyGo 0.14 を対象としています。
## Wio Terminal とは
Wio Terminal は Seeed 社のディスプレイ付きの開発ボードです。
320 x 240 のディスプレイ、 WiFi / BLE 搭載、ボタンに加速度センサに MicroSD カードスロ
GoでHello vinaka!(World!)を出す
Goに触れてみたかったので、学習をはじめてみました。
#ソフトウェアのインストール
[Go公式](https://golang.org/#)でダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/b9ab0306-098d-6e7c-15d2-7771052f61bf.png)
##環境に合わせて、ダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/9dc0ca68-ca4d-87a2-3edf-0bcf771804fa.png)##手順に沿ってインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/f2121129-e044-029f-6420-0eda5f935e53.png)![image.png](http
Goのhttp.Requestのキャンセルの仕組みを理解する
# はじめに
Goのhttp.Request構造体の`ctx`は[doc](https://golang.org/pkg/net/http/#Request.Context)によると、以下の場合にcancelされます。> For outgoing client requests, the context controls cancellation.
For incoming server requests, the context is canceled when the client’s connection closes, the request is canceled (with HTTP/2), or when the ServeHTTP method returns.クライアントがタイムアウトを設定していた場合にもタイムアウト時間経過後にコネクションがcloseされるため、サーバ側実装でcontextを参照することでタイムアウトしたことも気づけることになります。
`Request.ctx`やその子孫関係にあるcontext(contextは親がキャンセルされると子
64ビット整数の最大値は計算の限界ではない
## はじめに
最近競技プログラミングを始めました。
普段の仕事で64ビットでは扱えないような天文学的な値や細かすぎる浮動小数点数に触れることって滅多に無いのですが、競技プログラミングではそのような機会がちょくちょくあります。
うまく回避する方法を検討するのも醍醐味ですが、初心者は巨大な値に慣れるところから勝負です。
今回は競プロ初心者として得た知見をメモします。## 数値型における64ビットの最大値は変数の限界であって計算の限界ではない
まずは下記のコードをご覧ください。
“`go
package mainimport (
“fmt”
)func main() {
num := int64(9223372036854775808)
fmt.Println(num)
}
“`
最近は仕事でGoを書いているので競プロもGoで解いています。
これを実行すると下記のようなエラーが出力されます“`
./main.go:8:14: constant 9223372036854775808 overflows int64
“`64ビット符号付き整数配列の最大値
分散システムにおける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