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

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

echoとginでCORS対応するときの違いについて

この記事は、[Makuake Development Team Advent Calendar 2019](https://adventar.org/calendars/4716) 18日目の記事でございます。

## この記事でやりたいこと

Golangにおける主要なWebサーバーフレームワークである [echo](https://github.com/labstack/echo) と [gin](https://github.com/gin-gonic/gin) において、CORS対策を行うときの注意点をまとめたい。

## この記事を読む人の想定レベル

– 他の言語やフレームワークでCORS対策をしたことがある人
– HTTPリクエストヘッダとかHTTPレスポンスヘッダと言われてピンとくるひと
– ginのCORS対策はうまくいったのにechoに変えたらうまくいかないとかそういう経験がある人

ちなみにこの記事を書いた人はチームメンバーがechoに乗り換えようとしたタイミングでCORS効かない、って困っていろいろ調べたことがある、みたいな背景があります。

## TL; DR

元記事を表示

【Go1.13】errorsパッケージを使ってエラーハンドリングをうまくやる

最近は1からGoでサービスを開発する機会があるのですが、その際にGo1.13から追加された新機能を導入して使ってみたりしています。
自分が利用しているerrorsパッケージにもいくつか新機能が追加されています。
https://golang.org/pkg/errors/
例えばIs関数はGo1.13から新しく追加された機能で階層化されたエラー情報を他のエラーと比較したりすることができます。

本記事ではerrorsパッケージの機能を使ったエラーハンドリング処理についてまとめます。
記事の構成は最初にエラーハンドリングの設計で目指す要件を簡単に説明したあと、
その要件を満たすようなシンプルなWebアプリケーションの実装を提示します。

# エラーハンドリングの設計について
エラーハンドリングの設計をする際は下記の点に気を付けるようにしています。
## エラーの発生箇所がログから確認できる
発生したエラーの原因を推測するためにコード中のどこで、どのようなエラーが発生したかを確認する必要があります。
そのため、下位レベルの重要なエラーが途中で握りつぶされずにログに出力される仕組みをアプリケ

元記事を表示

Unityエンジニアがサーバーエンジニアに転生した結果、Unityエンジニアとしての実力が向上した話

# 本記事の目的
サーバーエンジニアになってから、今の自分なら今までよりもUnityエンジニアとして活躍できそうだと感じています。

そこでUnityエンジニアがサーバーサイドを学ぶことによって得られるメリットを共有することで、独学等でサーバーに挑戦する人が増えたらいいなと思います。

# 自己紹介
新卒3年目
今までずっとUnityエンジニア
サーバーエンジニア歴約半年
今使用してる言語はGo

サーバーエンジニアになってからはインフラとかもいろいろやってはいましたが、本記事では主に「クライアントから叩かれるAPIを実装した経験」をもとに書いていきます。

# テストコードが書けるようになった。
Unityの開発では、コードが書けた後は再生を押して実際にゲーム画面で正常動作をするかを確認することができます。
しかし、サーバーの開発では再生ボタンはないためテストコードを書くことで品質を担保します。

具体的には
「Aという入力に対してBが帰ってきたら成功」
「このリクエストがきてDBにxxが保存されてたら成功」
といったふうなテストを書きます。

そしてこのテストは実はUnity側でも

元記事を表示

Visual studio CodeでGo

誰にでも簡単に覚えられるGO言語でWeb app(wsgi)を作ってみた。
まず、いつも使っているBootstrap4 templeteを使ってプログラムを作ってみよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/1f352590-1438-5560-8f88-97ea57cff4f1.png)
フォルダは、以下のとおりです。
main.goは、appのプログラムです。views以下にhtmlテンプレートです。
“`
│ main.go

└─views
about.tpl
contact.tpl
home.tpl
layout.tpl
“`

“`main.go
package main

import (
“github.com/gorilla/mux”
“html/template”
“log”
“net/http”
)

func Home(w http.ResponseWrite

元記事を表示

AtCoder Grand Contest 041 参戦記

# AtCoder Grand Contest 041 参戦記

## A – Table Tennis Training

28分半で突破. WA5. 何だ簡単じゃんと思って提出したらやっぱり簡単ではなかったw

以下のうち一番早いものが解答

1. まっすぐ近寄る(ただし距離が偶数でないとすれ違うので偶数の場合のみ)
2. 1 で待ち合わせをする.
3. N で待ち合わせをする.
4. 2人で1に向かい、先に着くAにいた選手が1ターン1に留まり(これで距離が偶数になる)、折り返してBを迎えに行く
5. 2人でNに向かい、先に着くBにいた選手が1ターンNに留まり(これで距離が偶数になる)、折り返してAを迎えに行く

“`python
N, A, B = map(int, input().split())

t = float(‘inf’)
if abs(A – B) % 2 == 0:
t = min(abs(A – B) // 2, t)
t = min(B – 1, t)
t = min(N – A, t)
t = min((A – 1 + 1) + (B – A –

元記事を表示

Google Cloud Functionsを使ったおうむ返しLINE botの作成

goでLINE Botを作成しようと思い、まず初めにLINE APIのサンプルでも紹介されているおうむ返しをするLINE Botを作成する。
BotということでLINEの[messagingAPI](https://developers.line.biz/ja/reference/messaging-api/)を利用。

今回作成したBotのGitHubは[こちら](https://github.com/Hiroya3/LINE_Bot_parrot_return)

# 作成方法

## 1, チャネルの作成
LINE messagingAPIを利用するためにチャネルを作成したければならない。
チャネルとは、[LINE Developers](https://developers.line.biz/ja/docs/messaging-api/getting-started/)によると

>チャネルは、LINEプラットフォームが提供する機能を、プロバイダーが開発するサービスで利用するための通信路です。LINEプラットフォームを利用するには、チャネルを作成し、サービスをチャネルに関連付け

元記事を表示

Goで書いたサーバーアプリケーションをdockerで動かす

来年1月からアサイン予定のプロジェクトにて、dockerを用いた開発を行なうので、ここ最近勉強したdockerに関する知識をまとめたいと思います。

# 課題
この記事ではgo言語を用いて簡単なサーバーアプリケーションを作成し、dockerで動かします。後半はさらにmulti-stage-bulidという機能を用いてより軽量なdocker imageを作成するまでを目標にします。

[dockerのインストール](https://hub.docker.com/editions/community/docker-ce-desktop-mac)は各自でやっておいてねw

# サーバーアプリケーション
ここでは静的なHTMLを返してくれるアプリケーションを作成します。
`/`にアクセスすると、Hello!!を返してくれるものとし、のちほどherokuにデプロイする事を想定してポートは実行時に指定できるようにしましょう。(デフォルトでは:8080ポートを使用します。)

`$GOPATH/src`以下にパッケージ名`docker_demo`とし以下のコードを配置してください。

“`go:

元記事を表示

GoでpexelsのAPIライブラリを作った

画像横断検索できるライブラリ作ろうと思ったけど、1日で作るの無理っぽかったのであきらめて、とりあえず1サービスだけAPIライブラリ作ったので公開します。

https://github.com/usk81/go-pixels

# 懺悔

Advent Calendarにあげ忘れておりました。
期間中プログラム大量生産してたので、記事書いてないことに気がついてませんでした

# What is pexels?

Pexelsは画像素材のシェアサービスです。
Getty ImageやUnsplashなんかみたいな感じのやつです。

Pexels選んだのはAPIがシンプルだったのと、他のサービスは試してはいないもののとりあえずGoのライブラリがありそうだったため。
あとそれなりの知名度。

# 使い方

Pexels公式のAPIはこちらです。
とてもシンプル(シンプルすぎて逆に分かりづらい)
https://www.pexels.com/ja-jp/api/documentation/

ライブラリはシンプルにAPIドキュメント丸写ししたような作りにしました。

“` go
// cre

元記事を表示

C++, Python, Goでのニュートン法(関数オブジェクトの理解のため)

#概要
最近、C++で関数オブジェクトをコールバック関数の引数として渡したりする実装などをよく見かけるようになり、まだ頭が混乱するので、自分で何か実装して頭に定着させたい。簡単な計算式として今回はニュートン法を選んだ。ニュートン法をC++、Python、Goで関数オブジェクトを使用して実装する。

#対象読者
– C++プログラマ
– Pythonプログラマ
– Goプログラマ
– プログラミングの基本的なことは分かってきた人

#関数オブジェクト
関数オブジェクトは関数呼び出し演算子が定義されている任意のオブジェクトです。
[cppreferenceより](https://ja.cppreference.com/w/cpp/utility/functional)

下記のような記事も関数オブジェクトやコールバック関数についての説明をしている。
[関数ポインタと関数オブジェクトのインライン展開](https://qiita.com/kaityo256/items/5911d50c274465e19cf6)
[C++ の小さな技術を紹介するシリーズ【小技C++ 全9回】#3<コールバッ

元記事を表示

go+gqlgenでGraphQLサーバを作る(GORM使ってDB接続)

# お題
表題の通り。GraphQL関連では[前々回](https://qiita.com/drafts/8abd445edba347e8f6f1)、frontend に「nuxtjs/apollo」、backend に「go+gqlgen」の組み合わせでGraphQLサービスを作るというのをやった。
その時は backend は単に固定のJSONを返すだけでお茶を濁したのだけど、もちろんサービスとして成り立たせる上で固定のJSON返すだけなんてことはない。
ので、今回は、永続化実装。

# 開発環境
## # OS – Linux(Ubuntu)
“`
$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”18.04.2 LTS (Bionic Beaver)”
“`

## # バックエンド
### 言語 – Go
“`
$ go version
go version go1.13.3 linux/amd64
“`

### パッケージマネージャ – Go Modules

### IDE – Goland
“`
GoLand 2019

元記事を表示

envoy xDS により動的な設定変更を実現する(入門編)

# 概要
* `envoy` の設定を動的に変更する機構である `xDS` を試してみた
* ちょっとつっこんだ内容になると日本語の情報がほとんどなくて辛かったのでここに記しておきたい

# 対象読者
* envoy についてある程度知ってる
* 参考: [Envoy (Envoy proxy)、Istio とは?](https://qiita.com/seikoudoku2000/items/9d54f910d6f05cbd556d)
* Go言語が分かる

# xDS とは?
* 掻い摘んで言うと複数の envoy proxy サーバーの設定を gRPC などにより動的に制御するために用意された仕組み
* envoy では設定ファイルの構造が Protocol Buffers により定義されている
* この定義を元にした gRPC インタフェイスも用意されている
* 定義に従い gRPC サーバーを自分で実装して配置することにより、動的設定の変更を envoy に通知するような仕組みを実現することができる

# サンプル
下記の前提条件をもとに、実際の設定・

元記事を表示

Tcl・R・Golang・RustなどでFizzBuzzやった時のメモ・感想

# Tcl・R・Golang・RustなどでFizzBuzzやった時のメモ・感想

学部のとある講義に参加させてもらった際にいろいろな言語でFizzBuzzを書くことをしていた。
本稿はその時のメモや感想。
(別の回ではPostScriptで書いてたとか…)

扱った言語は以下。

* Tcl
* R
* Golang
* Rust
* ZSH
* SQLite3
* Ruby

ZSHやSQLite3、Ruby以外は全て初めて触った。
上記の3つの言語は書き方に工夫されていたが、琴線に触れたのは、
SQLite3だけだったのでそちらだけ記載。

## Tcl

### インストール

“`shell-session
$ apt install tcl-dev/stable
“`

### サンプルコード

“`tcl:fizzbuzz.tcl
#!/usr/bin/tclsh

for {set i 1} {$i <= 40} {incr i} { if {$i%15==0} { puts FizzBuzz } elseif {$i%5==0}

元記事を表示

Jupyter Notebook/Labでgo言語を使うためのGophernotesでPATHを設定する。

Jupyter Notebook/LabでGo言語を利用するためのGophernotesを導入した際に、PATHの設定で手間取ったので解決方法のメモになります。

もしかするともっと良い方法があるかもしれませんが。

# 事象

Gophernotesを導入し、サンプル程度は動作するようになったのですがサードパーティ製ライブラリをimportしようとするとエラーが発生します。

例えば次のようなimportを行うと

“`go
import (
“bufio”
“context”
“fmt”
“io”

“cloud.google.com/go/storage”
)
“`

“cloud.google.com/go/storage”の読み込み部分で次のエラーが発生します。
(もちろん、go getは実施済みです)

“`
error loading package “cloud.google.com/go/storage” metadata: ‘go list’ driver requires ‘go’, but executable fi

元記事を表示

【コード無し】卒論で楕円曲線とブロックチェーンについて書いたので、勉強方法をまとめてみた

# What is この記事
タイトルの通り、卒業論文でビットコイン、ブロックチェーンに使われている楕円曲線暗号について書きました。楕円曲線、ブロックチェーンそれぞれ分けて文献紹介します。
対象読者は、ブロックチェーンとか興味あるけど、勉強したことないよ、って方です。また、紹介した文献はごく一部のため、あくまで勉強時の選択肢の1つとして見ていただければと思います:relieved:
ちなみに、アフィリエイトではなくガチでわたしが利用させていただいたものしか載せてませんので、他におすすめ文献等ありましたらぜひご指摘の方お願いします!

# 誰
初投稿です。偏差値50くらいの可もなく不可もなく大学で数学やってますが、数学は全然わかりません。ただ、暗号学専攻なので書きました。一応エンジニアやってます。
わたしの拙い卒業論文が見たい方は下のURLのAbout Meからぜひ見ていただきたいです。フィードバック等もいただけると全力で感謝いたします。

こちら→ https://ishihaya.com/

# 参考文献一覧

## ブロックチェーン・ビットコイン(基礎知識)

### 【

元記事を表示

眺めて覚えるGo言語 その6 可変引数

#Go言語で可変引数を使う。
### では、眺める例題

“`main.go
ackage main
import(
“fmt”
“reflect”
)
func f(args …interface{}){
for i,arg:=range args{
fmt.Println(i,reflect.TypeOf(arg),arg)
}
}
func sum(a int,b int) int{
return a+b
}
func main(){
f(10.0/3,10,20,30,”Tokyo”,sum,sum(5,10))
}

0 float64 3.3333333333333335
1 int 10
2 int 20
3 int 30
4 string Tokyo
5 func(int, int) int 0x4bb2a0
6 int 15
Process exiting with code: 0

“`
###注目すべき書き方
-**args …interface{}**
可変引数
**f(10.0/3,10,20,30,”Tokyo”,sum,sum

元記事を表示

Goでリバースプロキシつくるときにつかえる net/http/httputil.ReverseProxy の紹介

## はじめに
GoでHTTPのリバースプロキシを作るときには標準パッケージである net/http/httputil の ReverseProxy が使えるので、提供している機能やざっくりした使い方などについて紹介しようと思います。

これは [Makuake Development Team Advent Calendar 2019](https://adventar.org/calendars/4716) の22日目の投稿です。

## tl;dr
– hop-by-hop ヘッダーを自動で捨ててくれるのがうれしい
– X-Forwarded-For を自動で追加してくれてうれしい
– 通過するリクエスト、レスポンスの加工ができるのでやりたいことはだいたいできそう

## httputil を利用したリバースプロキシの最小構成
パッケージドキュメントの example からの引用です

“`go
package main

import (
“fmt”
“io/ioutil”
“log”
“net/http”
“net/http/httptest”
“net/htt

元記事を表示

眺めて覚えるGo言語 その5 TableView&Button

#GUIを扱うと欲しくなるのがData Grid Viewですね。
データを一覧表で見せるやつ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/e954c7a3-b466-be41-6db5-5d1532f2dd3e.png)
#まずデータ

“`data.json
[{“ID”:”1″,”Name”:”関波子”,”Namae”:”セキナミコ”,”Sex”:”女”,”Btype”:”AB”,”Date”:”1980/07/31″,”Tel”:”03-3060-4716″,”Mob”:”090-7787-3784″,”Email”:”sk@eaccess.net”},
{“ID”:”2″,”Name”:”小倉準司”,”Namae”:”コクラジュンジ”,”Sex”:”男”,”Btype”:”A”,”Date”:”1973/10/08″,”Tel”:”0166-36-3522″,”Mob”:””,”Email”:”junzi-kokura@eaccess.net”},
{“ID

元記事を表示

rubyからgolangエンジニアへ

転職してgolangを触るようになり、3ヶ月経ったので一度ここで整理したいと思います。
前職ではrubyを6年間ぐらい触っていました。
rubyからgolangを触るようになって、学んだ事などをまとめていければと思います。

## 項目
1. go始めるにあたって
2. 定数定義
3. 継承
4. testの書き方
5. まとめ

## 1. go始めるにあたって
### 参考書籍
goを始めるにあたって、まず読んだ本はこの辺りです。
[改訂2版 みんなのGo言語 松木 雅幸](https://www.amazon.co.jp/dp/4297107279/ref=cm_sw_r_tw_dp_U_x_wu79DbNFQWN73)
[スターティングGo言語 (CodeZine BOOKS) 松尾 愛賀](https://www.amazon.co.jp/dp/4798142417/ref=cm_sw_r_tw_dp_U_x_wu79DbYM0ZQAF)

### 環境構築
有償にはなりますが、IDEは[Goland](https://www.jetbrains.com/ja-jp

元記事を表示

眺めて覚えるGo言語 その4 Windows10 GUI

# GO は、サーバー用言語だからGUIは、HTMLで十分言う考え方がある。
###だけどGUI作りたい。
WALKを使えば簡単に作れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/06362c0c-7334-7ebc-df4c-ca96c19a22cb.png)
こんな感じのGUI
ライブラリのありか!
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/92fbbc49-68f0-1661-9e17-5166edc52701.png)]
(https://github.com/lxn/walk)
#インストール
“`
C:\Users\hirat\go-work\gui> go get github.com/lxn/walk
“`
つぎにテストソース

“`test.go
package main

import (
“github.com/lxn

元記事を表示

Goのfor文のまわりの変数スコープ

Goでの変数のスコープについてはすでにあちこちで語られているとは思いますが、再確認。

以下のプログラムは i を何度も定義していますが動作します。

“`go
package main

import (
“log”
)

func main() {
log.SetFlags(log.Lshortfile)

i := 123
log.Println(i)
for i := 0; i < 3; i++ { log.Println(i) i := 9999 log.Println(i) } log.Println(i) } ``` https://play.golang.org/p/eSlHO5tlhBH playground での結果 ``` prog.go:11: 123 prog.go:13: 0 prog.go:15: 9999 prog.go:13: 1 prog.go:15: 9999 prog.go:13: 2 prog.go:15: 9999 prog.go:17: 123 ``` こちらで解説されているものもほぼ同じですね。 htt

元記事を表示

OTHERカテゴリの最新記事