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

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

眺めて覚えるGo言語 その7 GO言語の中にC言語

##GO言語の中にC言語を書いてみよう。
###準備 GCCをインストールしておきます。

– Windows 10 64bitの場合
– [mingw-w64-install.exe](https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe/download)をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/9920ed7d-c90c-6709-6f5e-16a1e81ac0f6.png)
**x86_64**を選択します。
最初の一歩は、いつもの **Hello World**

“`cPrint.go
package main

// #include
// #include

元記事を表示

スレッドとメッセージパッシング

# TL; DR;
何かしらの計算を複数のプロセスやスレッド間で分担して実行する場合に、全体で正しく処理を進行するためにプロセス/スレッド間で値の受け渡しや調停が必要になります。
値の受け渡しは大きく2つの方法に分かれていて、一つは同じメモリ空間を共有して互いが共通のメモリアドレス上の値を書き換える方式(共有メモリ)と、連携の必要なプロセス/スレッド間で値を送り合うメッセージパッシングという方式とがあります。
年内にもう一本ぐらい記事を書きたい気分になったので今回はこれらをサンプルを交えて紹介していきます。

# スレッド
別々に進行する処理の間でメモリを共有する例を考えてみます。
まず、単にメインスレッドとは別のスレッドをcreate()して各々に処理を任せる場合です。

“`c++
#include void echo(string strs) {
printf(“%d”, strs);
}

int main {
// スレッド毎に実行
std::thread th1(echo(“hoge”));
std::th

元記事を表示

golang + Lambda + API Gatewayで、S3バケットを作るAPIを作ってみた

##前提条件
2019年12月29日に試してみたものです。
go 1.29

#1. GolangのコードをLambdaで実行

###必要なライブラリをインストール
“`
$ go get -u github.com/aws/aws-lambda-go/lambda
$ go get -u github.com/aws/aws-sdk-go/aws
$ go get -u github.com/aws/aws-sdk-go/aws/credentials
$ go get -u github.com/aws/aws-sdk-go/aws/session
$ go get -u github.com/aws/aws-sdk-go/service/s3
“`

###指定したバケット名で、S3バケットを作るコード
作った関数は、引数として受け取ったバケット名で、S3バケットを作り、その結果をログに出力するもの。

“`golang:hello.go
package main

import (
“log”

“github.com/aws/aws-lambda-go/lamb

元記事を表示

言語別int64素因数分解(試し割り法)処理時間比較

C言語、C#, Java8, Golang, Python3 で、
int64の範囲内の値を素因数分解したときの処理時間の比較してみました。

先に結果を見たい方はこちらへ。
[処理時間一覧](https://qiita.com/gx3n-inue/items/7b63a2101ea26d3d1a29#処理時間一覧)

C#, Java, Golangについては、bigintでも計算してみました。

# 利用した素因数分解のアルゴリズム

素因数分解のアルゴリズムについては、最も単純な試し割り法を利用しました。
2,3,5,7,13,17, … (以下、+2, +4を交互に繰り返した値)で割れるかどうか試していきます。

処理の高速化のために、あらかじめ割れるかどうか照合する素数の表を用意しておく方法もありますが、
(63ビット程度のループ処理も10秒程度で終わったため、)今回は用意していません。

下記は、Javaでの試し割り処理の例です。

“`Java:PrimeFactorization.java
private long[] trial_division(long n)

元記事を表示

golangのステップカウンター

# お題
大昔(?)、「Goのステップカウンター無いな」と思って適当に作ったのだけど、あれからしばらくしてもまだ見当たらない(探し方が悪い?そもそもGoでステップカウンターなんて必要ない?)ので、前回は `go run` して動かすようにしていたものを各環境で動くバイナリを生成して公開。
ステップカウントの仕方は練習がてら適当に作ったままなので、多少の検証はしたもののカウントミスがないことは保証できない。
(テストコードもないのでバグだらけかもしれない。)

# バイナリとソース

以下で各環境用のバイナリはダウンロードできる。
https://github.com/sky0621/go-stepcounter/releases/tag/v0.1.1

ソースは下記。
https://github.com/sky0621/go-stepcounter/tree/v0.1.1
※実装内容はあまりにも適当なので、もうちょっと直すかも。

# 実践

## ■ サンプルプロジェクト

同じリポジトリ内に適当に作っておいたサンプルプロジェクトを相手に実行してみた結果。

### プロジェクト構

元記事を表示

macOS で go-z3 を動かす (ビルドを通す)

# 結論

`go get -u github.com/mitchellh/go-z3` したあと,
`$GOPATH/src/github.com/mitchellh/go-z3/Makefile` を以下のように変更して `make` をします.

“`Makefile:変更前
libz3.a: vender/z3
cd vendor/z3 && python scripts/mk_make.py –staticlib
cd vendor/z3/build && ${MAKE}
cp vendor/z3/build/libz3.a .
“`

“`Makefile:変更後
libz3.a: vender/z3
cd vendor/z3 && CXX=clang++ CC=clang python scripts/mk_make.py –staticlib
cd vendor/z3/build && ${MAKE}
cp vendor/z3/build/libz3.a .
“`

# 経緯

macOSだと,`go-z3` パッケージのインストールに失敗します

元記事を表示

IntelliJでGo書いてる時に特定のpackageをauto importしないようにする

# TL;DR
Preferences → Languages & Frameworks → Go → Imports → Exclude from import and completion → `+` 押して除外したいパッケージの名前を入力

# 経緯
IntelliJで `fmt.Println` とか書く時に、 `fmt` と `golang.org/x/tools/go/ssa/interp/testdata/src/fmt` がimportするpackageとしてサジェストされてた。
僕としては勝手に `fmt` がimportされて欲しいんだけど、同じ名前のパッケージが2つあるせいで、毎回選択してimportする必要があり、めんどくさかった。
で、特定のpackageをauto importしない設定を見つけた。 `golang.org/x/tools/go/ssa/interp/testdata/src/fmt` を除外設定したら勝手に `fmt` がimportされるようになって便利。

# 環境
IntelliJ IDEA 2019.3.1 (Ultimate Ed

元記事を表示

眺めて覚えるGo言語 その6 MISC

#Go argsどう扱うの?

“`args.go
package main
import “fmt”
import “flag”
func main() {
flag.Parse() //Parseしないと空箱が届く
fmt.Println(flag.Args())
for i,arg:=range flag.Args(){
fmt.Println(i,arg)
}
}
C:\Users\hirat\go-work\asm>go run main.go a b c d
[a b c d]
0 a
1 b
2 c
3 d

C:\Users\hirat\go-work\asm>
“`
## Go言語に疑問持ったらアッセンブラ出力で中身を見てみよう

“`bat
C:\Users\hirat\go-work\asm>go tool compile -S main.go >main.asm
“`

懐かしい8086のニューモニックが現れる

“`main.asm
os.(*File).close STEXT dupok nosplit size=26 args=0x1

元記事を表示

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

元記事を表示

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

最近は1からGoでサービスを開発する機会があり、その際にGo1.13から追加された新機能を導入して使ってみたりしています。
例えばerrorsパッケージの`As`関数や`Is`関数などです。
https://golang.org/pkg/errors/
上記のerrorsパッケージはエラーハンドリングを実装する際によく利用しています。

本記事では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}

元記事を表示

OTHERカテゴリの最新記事