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

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

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

元記事を表示

[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を作りました。

GoでMonth型をint型に変換

英語で表されるtime.Month型をintで型キャストしたら普通に変換できたのでメモ。

“`go:main.go
package main

import (
“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 の利用状況といったような情報

元記事を表示

OTHERカテゴリの最新記事