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

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

DocBase APIのGo Clientを作った

いろんなドキュメンテーションサービスあるけれど、DocBaseがミニマルでいい感じ。
だけどマイナー故か、APIクライアントはほとんどない。

APIドキュメントは充実しているので、参考にAPI Clientライブラリを作っておきました。

https://github.com/kyoh86/go-docbase

DocBase×Goユーザーの皆様よしなに。

元記事を表示

Google Codelabsに任意のURLのiframeを埋め込む

# はじめに

Codelabsのナビゲーションをつかって、独自のチュートリアルページを作りたい。その際、iframeでいろいろ埋め込みたいが、claatのセキュリティ制限で、プリコンパイルのバイナリでは限られたドメインしかiframe埋め込み許可されていない。
(claatとはGoogle Docsまたはmdの原稿をソースに、Codelabsのhtmlを生成するプログラムです。)

ならば、claatのソースに手を加えて、makeしよう!ホワイトリストにドメインを追記するだけだぜ!

# 環境

以下の内容は、WSL2のUbuntu上で確かめました。

# 手順

基本的には、claatの[readme.md](https://github.com/googlecodelabs/tools/blob/master/claat/README.md)を基本として行います。もっとよいやり方あれば教えて下さい。

### claatのインスト

`$ go get github.com/googlecodelabs/tools/claat` する。

cf.) [README.md#inst

元記事を表示

yukicoder contest 254 参戦記

# yukicoder contest 254 参戦記

## [A 1095 Smallest Kadomatsu Subsequence](https://yukicoder.me/problems/no/1095)

ナイーブに書くと *O*(*N*2) になってしまう. 最初は SegmentTree かなあと思ったけど、指定値以上の最小値の検索が出来る気がしなかったので、平衡二分探索木となりました. 中心の門松より左側と右側の平衡二分探索木をメンテしつつ、凸の場合は最小値、凹の場合は真ん中の大きさ以上の最小値を求めて、門松列の大きさの最小値を求めればいいだけ. *O*(NlogN).

“`go
package main

import (
“bufio”
“fmt”
“math”
“os”
“strconv”
“strings”
)

var (
y uint = 88172645463325252
)

func xorshift() uint {
y ^= y << 7 y ^= y >> 9
re

元記事を表示

CleanArchitectureでAPIを設計する

## 概要

今度、インターン先で設計(DDDとCleanArchitecture)をテーマにしたディスカッション&ハンズオンを行うことになりました。予習も兼ねてCleanArchitectureで設計したAPIを書いてみましたので、その際に得た知見を纏めておきます。使用した言語はGoです。

今回使用するサンプルは[こちら](https://github.com/hirokikondo86/clean-architecture-sample)です。

## クリーンアーキテクチャとは

CleanArchitecture (クリーンアーキテクチャ) とは、Robert C. Martin (ボブおじさん) 氏が提唱したアーキテクチャパターンです。
ソフトウェアを4つのレイヤーに分けることによって、関心の分離を達成することを目的とします。(原文は[こちら](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html))

![clean-architecture.png](https://qi

元記事を表示

go言語のimport _ math/randみたいな使ってないのにimportしてるのってなんで?

これは対象パッケージのinit関数を呼び出すためだけにインポートしている。対象パッケージは使わないけど、initはしておきたいときに使う。

元記事を表示

R50のリープフロッグ ~ 西暦2020年の今、偏差値50のプログラマを目指すお前が学ぶべきこと

#タイムスタンプ
初回投稿日:2020年6月26日
最終更新日:2020年6月27日

#対象読者

この投稿は、ちょうど20年ほど前にソフトウェアエンジニアとしてのピークを迎えていた当時30歳くらいの自分自身に宛てて書いた手紙です。

したがって、この内容は個人的なものであり、くたびれた老兵の戯言であり、ピントがずれ時代を捉えきれておらず、網羅的でもなければ他者には通じないアナロジーに溢れていて、多くの方にとって役に立たないばかりか、酷い勘違いや致命的な間違いを含んでいるかもしれません。

とは言うものの、現在の私のように、今もなお 20 年前の知見や思考パターンが生活のベースになっている方、新しい知識や用語は押さえているもののそれが今一つ自身の血肉になっていないと感じている方、最近の技術トレンドを押さえたいけれど情報の洪水に溺れそうになり何から手を付ければいいかわからないという方にとっては、あるいはこの記事が役に立つようなことがあるかもしれません。

[](////////////////////////////////////////////////////////////

元記事を表示

go修行3日目 no-struct

## no-struct

“`golang

package main

import “fmt”

type MyInt int

func (i MyInt) Double() int{
// integerにキャストする
return int(i * 2)
}

func main() {
myInt := MyInt(10)
fmt.Println(myInt.Double())
}
“`

“`
20
“`

## インターフェース

“`golang

package main

import “fmt”

type Human interface {
Say() string
}

type Person struct{
Name string
}

func (p *Person) Say() string{
p.Name = “Mr.” + p.Name
fmt.Println(p.Name)
return p.Name
}

// Humanインターフェースを受け付ける
func DriveCar(human Human){
if

元記事を表示

Next.jsとGo言語(gqlgen)でGraphQLを使ったアプリケーションを構築する方法

この記事では、フロントエンドにNext.js、バックエンドにGo言語(gqlgen)を用いて、フロントエンドとバックエンド間のAPIにGraphQLを使ったアプリケーションを構築する方法をまとめます。

作成したのは以下のような簡易ブクマアプリです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/b9e6976e-f134-673e-38d1-7a63d00bb4d1.png)
フロントエンドはほぼNext.jsのexamplesのままで、本記事ではバックエンドの実装をメインに解説します。

## 背景

個人的に、「フロントエンドフレームワークとGo言語の組み合わせで何か開発をしてみたい」と以前から思っていました。
そんな中、ReactのフレームワークであるNext.jsの使い勝手が良さそうという噂を耳にしました。

加えて、Next.jsのexamplesが充実していて、Apolloを使ったアプリケーションのひな形が簡単に作れることを知ったので、今回Go言語のバックエンド

元記事を表示

goでデザインパターン

使い道がありそうだなあと思ったパターンのメモ。

# builder
– 自身を返してメソッドチェイン

“`go
package main

type email struct {
from, to, subject, body string
}
type EmailBuilder struct {
email email
}
func (b *EmailBuilder) From(from string) *EmailBuilder {
b.email.from = from
return b
}
func (b *EmailBuilder) To(to string) *EmailBuilder {
b.email.to = to
return b
}
func (b *EmailBuilder) Subject(subject string) *EmailBuilder {
b.email.subject = subject
return b
}
func (b *EmailBuilder) Body(body string) *EmailBuilder {

元記事を表示

【Go】簡易 fuzzylauncher

以前の記事: [【PowerShell】 peco を使った簡易ランチャ](https://qiita.com/AWtnb/items/d2842d86c5482832daa5)

最初はうまく動作してはしゃいでていたものの、なんとなくモッサリした動作が気になってきた今日この頃。勉強も兼ねて go で書き直してみました。

最終的にこのような感じになります。
![202006262125035.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501098/55b6b3de-b2e1-309c-2f11-4b352eca9308.png)

### 制作過程
まずは `Test-Path` に相当するファイルの有無を確認する関数。

“`golang
func isVaridPath(filename string) bool {
_, err := os.Stat(filename)
return err == nil
}
“`

次は `Get-Content` の代わりのテキストファイル読み

元記事を表示

Hyperledger Fabric [asset]ソースコードとダミーデータをgitへ上げました

# 共有する
Goソースコード、Shellスクリプト、ダミーデータ(1万レコード)、PostgreSQLのyamlファイルをgitへアップロードしました。
https://github.com/settembre21/asset

以下の投稿に関連するものです。
[Hyperledger FabricのKeyゾンビ化を防ぐ(ソースコード掲載)](https://qiita.com/settembre21/items/b8f2a0df79750efd0db6)
[Hyperledger Fabricで個人情報をクエリする(RDB連携)](https://qiita.com/settembre21/items/af5c4e2e142f21201866)
[Hyperledger FabricのGetHistoryForKeyを利用した資産のトレース](https://qiita.com/settembre21/items/dffef94af71b7e880691)
[Hyperledger FabricのState DBをPostgreSQLを使って初期化する](https://qiita

元記事を表示

Goで数値型配列の中身を高い順にsort(並び替え)する方法

## はじめに
Goで数値型配列の中身を高い順にsortしてみました。

## コード

“`go:main.go
package main

import (
“fmt”
“sort”
)

func main() {

slice := []int{1,4,3,5,6,19,21,7,8,10,49}

sort.Sort(sort.Reverse(sort.IntSlice(slice)))←これがPoint
fmt.Println(slice)

}
“`

“`
// 出力結果
[49 21 19 10 8 7 6 5 4 3 1]
“`
AtCoderなんかの問題を解くときに使ったときは

“`go:main.go
package main

import (
“fmt”
“sort”
)

func main() {
var A int
slice := []int{}

for i := 0; i < 10; i++ { fmt.Scan(&

元記事を表示

goroutineでシェルっぽくバッチ処理を書いてみた

# 小さく分割してきれいにつくりたい、けど効率も重視したい
シェルや関数型プログラミングのように、部品の組み合わせでプログラムを書きたい。しかし、パイプラインや遅延評価みたいな仕組みがないと、ループ回数だけ増えてしまって効率が悪い。仕方がないから、1つの処理の中に全機能まとめてしまおう。そんな経験はないでしょうか。

# それgo言語でできる!
go言語のgoroutineとchannelを勉強してみてまさにこれだと思い、go言語の勉強を兼ねて作ってみました。

# 前提環境
– goバージョン:1.14

# 完成イメージ
シェルっぽく使いたいということで、シェルを意識した設計にしています。メソッドは基本的にchannelに関連付けたメソッドとして定義し、戻り値にはchannelを返すようにしました。そうすることで、メソッドチェーンをシェルのパイプに見立てて使えます。ただし、起点となる処理はchannelにすると逆に使いにくいので、普通に値を引数をとるようにします。

“`go:
slip.Cat(“data/slip.csv”).Filter().Sort()
“`

また、2

元記事を表示

Goでint型のスライスを昇順と降順でソートする方法

##はじめに
intのスライスをソートする方法が分からなかったので調べてみました。
今回使用するスライスは、こちら

“`
s := []int{4, -1, 12, -26, 5}
“`

###昇順(小さいから大きい)でソート
“`
sort.Ints(s)
fmt.Println(s)
// [-26 -1 4 5 12]
“`
###降順(大きいから小さい)でソート

“`
sort.Sort(sort.Reverse(sort.IntSlice(s)))
fmt.Println(s)
//[12 5 4 -1 -26]
“`
##おまけ
スライスの中から一番大きい数字や小さい数字を見つけるコードも書いてみます。
###一番大きい数字を出力

“`
sort.Ints(s)
//合計の要素数から-1(5-1=4番目の数字)
fmt.Println(s[len(s)-1])
//12
“`
###一番小さい数字を出力

“`
sort.Ints(s)
//スライスの0番目
fmt.Println(s[0])
//-26
“`

##さいごに
調べてみると、比

元記事を表示

カスタムイメージを使ってCodebuildでbuildするまで。

マニュアル見ろよ、という話しではあるんだが。
私はなんか突っかかるまでマニュアル読まないタイプの人なので。

# やりたかったこと

– マネージドイメージ内でカスタムイメージをビルド。ビルドしたイメージをECRにPush
– カスタムイメージ内で、golangのpackeageをビルド。ビルドした生成物をS3にアップロード

# カスタムイメージの作成まで

## DOWNLOAD_SOURCEでi/o timeout for primary source
GitHubへのoAuth設定をCodeBuildから行うと、こんなエラーが出る。GitHub側で問題おきていることは考えにくいので、CodeBuild側の問題。

“`
CLIENT_ERROR: Get https://github.com/XXXXXXXXXXX/sample.git/info/refs?service=git-upload-pack:
dial tcp 13.114.40.48:443: i/o timeout for primary source
“`

CodeBuildはVPC内に設定してあり、

元記事を表示

Hyperledger FabricのKeyゾンビ化を防ぐ(ソースコード掲載)

# Hyperledger FabricでState DBのKeyを再利用させない(実はできない)

Hyperledger Fabric(以下HF)で一度削除(`DelState`)したKeyで再登録(`PutState`)したらどうなるんだろう?という疑問から、次のようなシナリオを考えました。またミラ・キータ(Mira Qiita)に登場してもらいます。

1. Mira QiitaをKey=”JMYMIRAGINO200302″で登録(`PutState`)
2. 1のKeyでクエリ(`GetState`)
3. 1のKeyで削除(`DelState`)
4. 1のKeyでクエリ(`GetState`)
4. 1のKeyで登録(`PutState`)
5. 1のKeyで履歴を参照(`GetHistoryForKey`)

どうなるんだろう?

あと、この投稿にてGoで書いたソースコードやシェルスクリプトを掲載します。

# 環境について
動作環境については次の通りです。

– Ubuntu 18.04.4 LTS
– docker-compose 1.26.0
– docker

元記事を表示

Go のオレオレ linter を golang.org/x/tools/go/analysis 使って作成する

## ゴール

* `x/tools/go/analysis` package を使って、linter を実装できるようになる

## 背景

Go は言語本体の簡潔さ、強力さはもちろんのことですが、周辺のツール/環境が充実していることでも知られています。
linter についても、標準で `go vet` や、標準の linter の runnner として、`golangci-lint` というサードパーティのツールも利用されています。

さらに、Go ではそのような linter 、及び静的解析を実装するためのライブラリが準標準 (`golang.org./x` 以下)で公開されています。
今回は、そのライブラリを使ってユーザ独自の linter を作る方法を紹介します。

## 環境

* go1.14.4
* skeleton v1.2.1

## gostaticanalysis/skeleton で linter のひな形を作る

`go/analysis` package を使った linter の作成は、以下のツールでスケルトンを作成することができます。

元記事を表示

CORS(preflight request)にハマったけど解決した話

CORS(preflight request)にハマったので、解決方法を備忘録として残しておきます。

# エラーが起きた場面
異なるドメインからHttpリクエストを送る場合は、CORSに注意だよなぁ。
サーバー側のレスポンスで、ヘッダーをつけてあげれば良いんだろう。
簡単じゃん。

## クライアント側
何かしらのデータをjasonでPOSTする。

“`js
var xmlhttp = new XMLHttpRequest();
xmlhttp.open(“POST”, API_ENDPOINT);
xmlhttp.setRequestHeader(“Content-Type”, “application/json;charset=UTF-8”);
xmlhttp.send(JSON.stringify(data));
“`

## APIサーバー側
サーバー側では、レスポンスのヘッダーを付けてあげる。

“`go
func (a *API) HandleFunc(w http.ResponseWriter, r *http.Request) {
//略…

w.He

元記事を表示

go修行10日目 embeded

## embeded

– Go言語には継承がなくてその代わり
– VertexをVertex3Dがembededしている

“`golang

package main

import “fmt”

type Vertex struct{
x, y int
}

func (v Vertex) Area() int{
return v.x * v.y
}

func (v *Vertex) Scale(i int){
v.x = v.x * i
v.y = v.y * i
}

type Vertex3D struct{
Vertex
z int
}

func (v Vertex3D) Area3D() int{
return v.x * v.y * v.z
}

func (v *Vertex3D) Scale3D(i int){
v.x = v.x * i
v.y = v.y * i
v.z = v.z * i
}

func New(x, y, z int) *Vertex3D{
return &Vertex3D{Vertex{x, y}, z}
}

元記事を表示

fish shell + anyenvでのGo開発環境構築

fish shell + anyenvというパターンでのGoの環境構築の記事がなかったので、備忘録としてまとめます。

実行バージョン
– `fish 3.0.2`
– `anyenv 1.1.1`

# anyenvでのgoenvのインストールと設定

まずanyenvでGoのバージョン管理システムのgoenvをインストールします。

“`bash
$ anyenv instal goenv
“`

そして、goenv用の環境変数やaliasの設定をfish shellの設定ファイル`~/.config/fish/config.fish`に追記します。この部分がzshやbashとは違うので注意です。

“`bash
set -x GOENV_ROOT “$HOME/.anyenv/envs/goenv”
set -x PATH $PATH “$GOENV_ROOT/bin”

set -gx PATH “$GOENV_ROOT/shims” $PATH
set -gx GOENV_SHELL fish
source “$GOENV_ROOT/libexec/../complet

元記事を表示

OTHERカテゴリの最新記事