- 1. DocBase APIのGo Clientを作った
- 2. Google Codelabsに任意のURLのiframeを埋め込む
- 3. yukicoder contest 254 参戦記
- 4. CleanArchitectureでAPIを設計する
- 5. go言語のimport _ math/randみたいな使ってないのにimportしてるのってなんで?
- 6. R50のリープフロッグ ~ 西暦2020年の今、偏差値50のプログラマを目指すお前が学ぶべきこと
- 7. go修行3日目 no-struct
- 8. Next.jsとGo言語(gqlgen)でGraphQLを使ったアプリケーションを構築する方法
- 9. goでデザインパターン
- 10. 【Go】簡易 fuzzylauncher
- 11. Hyperledger Fabric [asset]ソースコードとダミーデータをgitへ上げました
- 12. Goで数値型配列の中身を高い順にsort(並び替え)する方法
- 13. goroutineでシェルっぽくバッチ処理を書いてみた
- 14. Goでint型のスライスを昇順と降順でソートする方法
- 15. カスタムイメージを使ってCodebuildでbuildするまで。
- 16. Hyperledger FabricのKeyゾンビ化を防ぐ(ソースコード掲載)
- 17. Go のオレオレ linter を golang.org/x/tools/go/analysis 使って作成する
- 18. CORS(preflight request)にハマったけど解決した話
- 19. go修行10日目 embeded
- 20. fish shell + anyenvでのGo開発環境構築
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 mainimport (
“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 maintype 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 mainimport (
“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 mainimport (
“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