Go関連のことを調べてみた2019年12月07日

Go関連のことを調べてみた2019年12月07日

Goでブロックチェーンを実装してみる Part1

この記事は[2019新卒 エンジニア Advent Calendar 2019](https://qiita.com/advent-calendar/2019/2019-graduates)の7日目の記事です。

こんにちは。この記事ではGoで超シンプルなブロックチェーンを作っていきます。
普段から業務でブロックチェーンに携わってはいるのですが、自分で実装したことはなかったので、理解を深めるためにやってみようという次第です。

なお本記事はシリーズ化してお届けする予定です。
#はじめに
今回用いるコードはこちらに載っています。
https://github.com/gunnsoo/blockchain_go/tree/qiita_part1

#Block
まずはブロックを作りましょう。ブロックにはトランザクションの情報や技術的に必要な情報が含まれています。
ビットコインなどで実装されているブロックはもっと複雑ですが、ここでは簡略版をつくります。

“`go:block.go
type Block struct {
Timestamp int64
Data

元記事を表示

goのhot-reload

[テックタッチアドベントカレンダー](https://qiita.com/advent-calendar/2019/techtouch) 7日目担当の@analogrecordです。
前回は@ihiroky氏による「JSXとvirtual-domで遊ぶ」でした。
記事の分量・濃い内容ともに圧倒されています。流石です…

フロントエンドの記事が続いていますが、今回はバックエンドのTIPを紹介していこうと思います。

# 動機
テックタッチではサーバーサイドにgoを使用しています。
私自身テックタッチに入社するまではずっとphpとjsを書いていたため、エディタで編集してブラウザ等で即実行して挙動を確認する開発に慣れてしまっていました。
goおよびコンパイル言語を扱うのが初めてなので、少し書き直してビルドするとすぐにビルドエラーに阻まれ…どの変更によってエラーになっているのかわからなくなってしまったり、ビルドして実行できても出力結果が想定と違っている等、var_dump()してリロードすればデバッグできたphpに比べてストレスを感じていました。

[調べてみると](https://qiita

元記事を表示

運用を意識したGo言語でのエラーハンドリング/ロギング

この記事は [Go4 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go4) 7日目の記事です。

2016年にGoのAdvent Calendarを書いた時はGo3までだったのに、今年はGo7まであり、Go言語の盛り上がりを感じます。

以前書いた[Go言語のエラーハンドリングの記事](https://qiita.com/nayuneko/items/3c0b3c0de9e8b27c9548)がじわじわと反響をいただいており、とても嬉しく思います。

上の記事を書いた当時は趣味でGo言語を嗜んでいた程度ですが、ここ1年は仕事でGoの開発に関わり、エラーハンドリングとロギングの重要性を思い知らされた次第です。自分では適切なエラーハンドリングやロギングをしたつもりでも、いざリリースしてみるとログが不足していて調査に手間取ったり、逆に過剰で精査に時間がかかったり…

本記事はここ1年Goで書いたプログラムを運用してみて得た知見を記事に起こしたものです。

# TL;DR

– エラーはWrapしつつ適切なメッセージ

元記事を表示

LaravelのセッションをGoから参照する

この記事は Laravel Advent Calendar 2019 #2 12/7の記事です。
枠が空いてたので前日に入れてしまいました。kubotakです。宜しくおねがいします。

## 前置き
LaravelよりGoな記事です。Laravelerの皆さんすみません。
今回はLaravelでAuth認証を行ったユーザーセッションをGoのアプリケーションから参照するぞ!という記事です。
また、Laravel側ではMemcachedにセッション情報を保持しているケースで説明します。

あとあと、実戦投入したわけではないのであらゆる責任は負いません。参考程度に見てもらえたらと思います。

## このケースのニーズ
Laravelのいわゆる[MPA](https://scrapbox.io/vue-yawaraka/SPAとMPAって何が違うの?SPAにしたほうがいい?)からNextやNuxtのようなSSR機能のあるJavaScriptフレームワークに移行した(い)ケースで、バックエンドのAPIをGoに置き換えたいな、というマイノリティに刺さるかもしれません。

## Next/Nuxtか

元記事を表示

08. 暗号文

## 08. 暗号文
与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ.

英小文字ならば(219 – 文字コード)の文字に置換
その他の文字はそのまま出力
この関数を用い,英語のメッセージを暗号化・復号化せよ.

###Go
“`go
package main

import “fmt”

func cipher(s string) string {
r := “”
for i := 0;i= ‘a’ && s[i] <= 'z' { r += string(219 - s[i]); } else { r += string(s[i]); } } return r; } func main() { s := cipher("AaBcCcDd1234efgEFG"); fmt.Println(s); } ``` ###python ```python # -*- coding: utf-8 -*- def cipher(s): r = "" fo

元記事を表示

Goで作成したAPIサーバをdockerで複数コンテナ運用

# 初めに
先日まで、アーキテクチャを意識したAPI開発を行っていました。API開発がひと段落し、docker-composeでAPIサーバ,
nginxとMySQLをdocker上でつなげたいと思い、docker,nginxについて勉強をしました。成果物としては、まだ途中なのですがひと段落したので記事を書きました。

#対象読者
– これからdockerについて学んでいくよという方
– golangを使ってAPI開発を行ったが次何やればいいかわからない方
– docker-compose.ymlの書き方がわからない方
– nginx設定ファイルの書き方がわからない方

# 目標物
![成果物.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340562/0dc63a42-c7df-ccce-0d21-d5d2fc9f1d2d.png)

# APIサーバについて
## アーキテクチャ
アーキテクチャはレイヤードアーキテクチャを採用した。エラーハンドリングやログ出力もしっかりと構築して行きたかったため、採

元記事を表示

zsh で自分好みの補完インターフェースを定義する

## はじめに

この記事は dotfiles Advent Calendar 2019 の7日目の記事です。

.dotfilesとは直接関係ないですが、シェル関係、fzf関係などでもよいとの
ことだったので表題での投稿とさせていただきました。

### 本記事のターゲット

– zshが好きな方
– Fuzzy finderが好きな方
– 補完にロマンを感じる方

### 背景

![zsh_menu_completion_croped.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53170/4180c697-18e4-f2b8-ea12-884efbf48dc2.gif)

– zshのmenu-baseな補完をずっと使ってきた。
– コマンド履歴の検索や遷移してきたディレクトリの履歴は [fzf](https://github.com/junegunn/fzf) を用いて快適にできる
– 通常の (パスなどの)補完でもfuzzy finderの力を借りたい。

## どういうことができるか

元記事を表示

Go methodについて

Goにはクラスの仕組みが無い代わりに、型にメソッドを定義できるとのこと。
今までやってきた言語にはなかった仕組みなので理解したい

そもそも、functionとmethodは別ものらしい…え?

まず、一般的な関数について
このように、**func <関数名> (引数) (返り値)**の順番で記述する

“`go:main.go
func adder(x, y int) (z int) {
z = x + y
return z
}
“`

Goは**<関数名>**の前にもう一つ**()**をつけることができる

“`go:main.go
type Vertex struct { // 構造体
x, y float64
}

func (v Vertex) abc() float64 {

}

“`
struct(構造体)と関数を結びつけること、これがGoのオブジェクト指向らしい。
Goにはクラスがないのでstructに関数を結びつけることによって関係性とプログラム全体の構成がわかりやすくなる。

しっかりと理解していきたい

### 参考
[昔の自分に送

元記事を表示

GolangでGraphQLサーバを組む際に必要になりそうなチェックリスト

1.12時代に書いたメモなので2019-12-06現在最新ver(1.13)の状態には合わないかもしれないけど一応忘備録として公開しておく

このメモに書いた内容はGitHubにboilerplateとしてまとめてある

– [shufo/go\-graphql\-boilerplate: A boilerplate for creating GraphQL server with Go](https://github.com/shufo/go-graphql-boilerplate)

ここで挙げられたライブラリの基本的な選定の基準としては一つのライブラリであまり多くのことをやろうとせずUNIX哲学的にシンプルに一つの責務のみをこなし他ライブラリとのinteroperationがしやすいものを選ぶという感じ

## GoでGraphQLサーバを実装する上で必要になりそうなチェックリストとその対策

– [ ] GraphQL
– [ ] ORM
– [ ] 認証
– [ ] 認可
– [ ] ルーティング
– [ ] DB
– [ ] バリデーション
– [ ] セキ

元記事を表示

Go クロージャを理解する

Goのクロージャ(他の言語でもありますよね)について、よく理解できていなかったので調べてみた

## クロージャとは
> クロージャ(クロージャー、英語: closure)、関数閉包はプログラミング言語における関数オブジェクトの一種。いくつかの言語ではラムダ式や無名関数にて利用可能な機能・概念である。引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。

うーん…
簡単に言うと、「ローカル変数を参照している関数内の関数」ってこと…?

“`go:main.go
package main

import “fmt”

func add() func() int {
n := 0

return func() int {
n++
return n
}
}

func main() {
a := add()
fmt.Println(a())
}
“`
クロージャを使わない場合、グローバル変数を用意したりする必要があるので、クロージャを使いなれておくと便利らしい

### 参考
[【学習

元記事を表示

golangでk8sクラスタのDeployment一覧を取得

golangでk8sクラスタのDeployment一覧を取得します。(SAのトークンを利用します)
(あまり洗練されたコードでは無いことをご容赦ください。。)

依存関係です。

“`
package main
import (
“fmt”
“net/http”
“io/ioutil”
“log”
“crypto/x509”
“crypto/tls”
“encoding/json”
)
“`

リクエスト送付とレスポンス受領するrequest関数です。

“`
func request (endpoint,method,crtpath,token string) int {

//証明書の設定
caCert, _ := ioutil.ReadFile(crtpath)
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert

元記事を表示

Goのnew()とmake()の違い

new()とmake()の違いが分からなかったので調べてみた

## 比較
| |new(T) | make() |
|:——|:——–|:———–|
| 対象 |任意の型 | slice,map,channelのみ |
| 初期化 |初期化しない(ゼロ値になる) |初期化する |
| 返り値 |*T | T|

## makeとnewを使い分ける理由
### makeについて
– slice,map,channelが隠蔽されたデータ構造への参照であり、このデータ構造が使用前に初期化されている必要がある
– slice,map,channelの内部データ構造を初期化し、使用可能となるよう値を準備する

### newについて
– 他言語におけるnew()と基本的に同じ
– 型Tの新しいアイテム用にゼロ化した領域を割り当てそのアドレスである*T型の値を返す
– 新しく割り当てられた型Tのゼロ値ポインタを返す

## 参考
http:/

元記事を表示

Echo で request id をログに出力する

Echo で構築した Web アプリケーションで、リクエストを識別するための情報をログに仕込んでおくと、同一リクエストで出力されたログを後で抽出するのに便利です。

下記は、Amazon ECS で動作するアプリケーションを想定しています。

## 方針

ECS の前には、ALB がある構成なので、`X-Amzn-Trace-Id` ヘッダがあればその値を、無ければ独自にコードを生成してログに出力します。

## 方法

* request id を仕込むミドルウェア

“`go
package middleware

import (
“github.com/labstack/echo”
)

const requestIdLength = 6
const HeaderAmznTraceId = “X-Amzn-Trace-Id”

func AddRequestIdMiddleware() echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c e

元記事を表示

音楽サービスエンジニアmeetup Vol.3 開催レポート

![UNADJUSTEDNONRAW_thumb_8b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/19aa85da-61e5-c768-aeff-e7eaa72e9249.jpeg)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/4263c9c9-306d-3760-2044-abc761182a6c.png)

## はじめに
こんにちは、[Wano株式会社](https://wano.co.jp/)のエンジニアの[成川](https://twitter.com/fukubaka0825)と申します。
弊社では、大好評だった前回前々回のイベントに引き続き、今回は弊社オフィスにて、**第3回の音楽エンジニアmeetup**を主催いたしました。

このイベントレポートは、**あくまで僕個人やいちWanoのエンジニア視点でのレポートとなります。**ご了承ください。

今回は、会

元記事を表示

PHP7.4の新機能、FFIでGoを使ってみた

# PHP7.4がリリースされた
今回のアップデートも目まぐるしい機能が多く追加されました
機能の紹介は既にあるたくさんの記事にお任せするとして、個人的に気になっていた新機能 FFIを試してみます

# FFIとは
`Foreign Function Interface` の略でPHPで別の言語を動かせる機能です
Cなどで実装した共有ライブラリを読み込んで、利用することができます
メリットとしては実行速度が速くなることが大きいかと思われます

# FFIでGoを利用する
本題です
Goを利用するにはGoで共有ライブラリを実装する必要があります

## 何故Goを利用するのか
Cより簡単だから

## Goで共有ライブラリを作るには
– packageをmainにする
– main関数が必要
– exportする関数に `// export [function name]` のコメントを書く
– ビルド時は `-buildmode=c-shared` を付ける

今回はフィボナッチ数を計算するプログラムを用意しました
再帰を使っていて数が大きくなるほど計算に時間がかかるサンプルです

`

元記事を表示

Cgo を使って C 言語で書かれた関数をテストする

この記事は [Go4 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go4) の 6 日目の記事です。

Cgo を使うと C 言語で書かれた関数を定義したり呼び出したりできます。これを使って、 C 言語で書かれた関数をデバッグしてみます。

# 背景

組込開発 (C 言語) において、 AES を用いた処理があり検算が面倒だった。 Go だと自分の中ではサクッと書けるので、 C 言語で作ったものを Go で検算するよにしてみたら快適だったので共有しようと考えた。

# Cgo とは

> Cgo enables the creation of Go packages that call C code.
> https://golang.org/cmd/cgo/

# Cgo の簡単なサンプル

Go では `import “C”` の直前のコメントに C 言語ソースを書くことで、手軽に C 言語ソースと接続することができます。
直前に、というのがポイントで、 `import “C”` の上に空行を挟む

元記事を表示

GoでANSIエスケープシーケンスで着色されたテキストを画像に起こすコマンドを作った

# まえがき

* GoでANSIエスケープシーケンスをパースしてテキストを着色して画像に起こすコマンドを作った

# 作った経緯

* screenfetchやcczeなどで着色されたテキストを画像に起こしたかった
* ImageMagickのconvertコマンドではANSIエスケープシーケンスでの着色を画像に起こせなかった

# 成果物

[GitHub – jiro4989/textimg](https://github.com/jiro4989/textimg)

# 使い方

標準入力からANSIエスケープシーケンスと一緒にテキストを渡すと、画像を吐き出します。
端末上に垂れ流しても仕方ないので、ファイル出力か、パイプ先が存在しないときは出力しません。

“`bash
$ seq 0 255 | while read -r i; do
echo -ne “\x1b[38;5;${i}m$(printf %03d $i)”
if [ $(((i+1) % 16)) -eq 0 ]; then
echo
fi
done | textimg -o 256_f

元記事を表示

GoでYAMLを扱うすべての人を幸せにするべく、ライブラリをスクラッチから書いた話

この投稿は、 Go アドベントカレンダーの 6日目のものになります。

# はじめに
GoでYAMLを扱う際にデファクトになっているのは、おそらく [github.com/go-yaml/yaml](https://github.com/go-yaml/yaml) でしょう。

実装はC言語で実装された [libyaml](https://github.com/yaml/libyaml) を Go に移植しつつ、 Go ならではの機能を足す作りになっているのですが、 `cgo` を使わずに pure Go で移植されており、開発者の気合を感じます。
枯れている `libyaml` を利用していることからも、 `YAML` の仕様を忠実に実装していることが期待できます。

ですが、このライブラリにはいくつか使いにくい点もあり、例えば以下のようなことはできませんでした

– 構造体を埋め込む場合に、埋め込む型をポインタで定義できない ( ※ ポインタなしは大丈夫 )
– `encoding/json` とコンパチの インターフェース ( `MarshalYAML() ([]byte

元記事を表示

07. テンプレートによる文生成

## 07. テンプレートによる文生成
引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ.さらに,x=12, y=”気温”, z=22.4として,実行結果を確認せよ.

###Go
“`go
package main

import “fmt”

func template(x,y,z string) string {
return fmt.Sprintf(“%s時の%sは%s”,x,y,z)
}

func main() {
fmt.Println(template(“12″,”気温”,”22.4″))
}
“`

###python
“`python
# -*- coding: utf-8 -*-

def template(x,y,z):
return ‘{0}時の{1}は{2}’.format(x,y,z)

print template(12,”気温”,22.4)
“`

###Javascript
“`Javascript
function template(x,y,z) {
return “x時のyはz”.re

元記事を表示

Golang – Goroutine Worker Pool

https://brandur.org/go-worker-pool

https://ifun.dev/post/golang-concurrency/

元記事を表示

OTHERカテゴリの最新記事