Go関連のことを調べてみた2020年08月06日

Go関連のことを調べてみた2020年08月06日

【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 main

import (
“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 main

import (
“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 main

import (
“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

元記事を表示

OTHERカテゴリの最新記事