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

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

眺めて覚えるGo言語 その8 PythonからGO言語を呼ぶ1(引数文字列)

# pythonからGo サブルーチンへの引数 文字列
### byte列をポインターで渡す。

“`pcgo1.py
from ctypes import *
lib = cdll.LoadLibrary(“./golib.so”)
a=lib.fun1(c_char_p(b”hello world”))
“`

“`golib.go
package main

import “C”
import “fmt”
//export fun1
func fun1(a *C.char) int {
fmt.Println(C.GoString(a))
return 0
}

func main() {}

コンパイルと実行
>go build -o golib.so -buildmode=c-shared golib.go
>python pcgo1.py
hello world
“`
– c_char_p(b”hello world”)は、バイト列ポインター扱い
– C.GoString(a)は、受け取ったバイト列ポインターをGO stringへ

#文字列の受

元記事を表示

アプリ音痴の両親のためにLINEで共有した写真をデジタルフォトフレーム風にするアプリを作った話

この記事は[ぷりぷりあぷりけーしょんず Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ppap)の22日目の記事です。

# はじめに

大遅刻スミマセン。、
まさかの年越してからアドベントカレンダーに登録するという最早アドベントカレンダーとはなんぞやな状況です。
師走の風に流され、忙しさのあまり年内に完成させ記事にする予定のアプリが新年初コミットとともに完成に至る形になりました。

さて、年を越したと同時にエンジニアに転職して丸3年が経ちました。
1年半ほど前は`丸3年経つまでにサーバー・ネットワークの設定からアプリの開発、何かしらのサービスの一般公開をしたい`というのを目標に業務とは別に個人学習、開発を行なっていました。
結果的に`サーバー・ネットワークの設定`,`何かしらのサービスの一般公開`というのは叶うことはなかったわけですが個人的に家族のための`使うことができる`レベルのアプリを作成することが叶いました。

# 作ったもの

私の両親はまあアプリ音痴でインスタグラムはもちろんのこと、LINEがギリ

元記事を表示

gRPCの中身ってどんな?feat. Go

## はじめに

Goが大好きで、一通り勉強した後何やろうかなと思い、gRPCに手を出してしまいました。。
と言うのも、WEB+DB PRESSのvol.114でkyashの特集をやっており、Goのアーキテクチャなどが紹介され、**マイクロサービス** 化を実践してみたくて、gRPCに興味が湧きました!

そこで、[よく分かるgRPC]()の良書があったのでそちらをまとめて行きたいと思います。

## gRPCとは?

言わずもがなGoogleが開発しているRPC用のフレームワーク
RPCとは異なる場所にあるプログラムを呼び出すための仕組みを指します。
イメージとしては外部APIとHTTP通信でJSONを用いてやり取りする様な物です。

– HTTP/2の仕組みを用いた高速な通信
– Protocol Buffersを使ったRPCの定義とコード生成(レビューも出来ちゃう!)

もうここまで言うとマイクロサービスにドチャクソ向いてるのは分かりますよね!?

## 動かしてみる

色んな記事にある様に、チュートリアルしてもらうのが一番早く、確実です。

https://grpc.io/do

元記事を表示

VSCodeでgolangci-lintを設定する

## 環境
Go: go version go1.13 darwin/amd64
Homebrew: Homebrew 2.1.15

## 手順

### インストール

[README](https://github.com/golangci/golangci-lint#macos)に沿ってインストールする

### 設定ファイル

“`yaml
# .golangci-lint.yaml
run:
deadline: 5m

linters:
disable-all: true
enable:
– goimports
– golint
– govet
– misspell
– errcheck
– staticcheck
– prealloc
– ineffassign
“`

### エディタへの設定

setting.jsonに項目を追加する.

“`JSON
“go.lintTool”:”golangci-lint”,
“go.lintFlags”: [
“-

元記事を表示

眺めて覚えるGo言語 その8 PythonからGO言語を呼ぶ

# 今回は、PythonからGO言語を呼んでpythonの弱点である速度向上させるアプローチです。
## Pythonを語ったとき「コンパイラ」ではない。で炎上しました。
### javaでも「コンパイラ」ではないし、C#もコンパイラではないのです。
#### 中間言語に変換して実行するのは、スピード遅いし、第一電池がすぐ減るのです。

**GOは、本物っぽいコンパイラーです。**

**pythonから見ると計算部分を高速化できる可能性があります。**

[フィボナッチ数](https://qiita.com/tomobk0025/items/3cc39ac6a7fbbdb0bde6)を参考にしました。

– 1つがいの兎は、産まれて2か月後から毎月1つがいずつの兎を産む。
– 兎が死ぬことはない。
– この条件のもとで、産まれたばかりの1つがいの兎は1年の間に何つがいの兎になるか?

“`fib_go.py
from ctypes import *
lib = cdll.LoadLibrary(“./fib.so”)
for i in range(40):
print (

元記事を表示

ginを最速でマスターしよう

# 初めに:sunny:
![gin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/c6d6b737-5fcc-acd7-79e0-f686e0c61d9a.png)

### ginとは何でしょうか
**ginはGo(Golang)で書かれたWebフレームワークです。 httprouterのおかげで、最大40倍高速なパフォーマンスを備えたmartiniのようなAPIを備えています。パフォーマンスと優れた生産性が必要な場合は、Ginを好きになるでしょう。**–[公式ドキュメント](https://github.com/gin-gonic/gin)

パフォーマンスが良いのが売りらしいですが、他のGo言語のwebフレームワークと比較してみます。
## 人気ランキング

> githubのスターの多い順

| Name | Stars | Forks | Issues Open | Issues Closed | Birth Year | Latest Update | Author |

元記事を表示

GO言語のGUIライブラリ「Fyne」のインストール方法

#はじめに
参考書を一通り読み終わり、
「さぁこれから本格的にコードを書いて勉強だ!」
「どうせなら何か適当にGUIのライブラリでも入れて楽しく勉強しよう!」
と思い、紆余曲折ありながらFyneというライブラリをubuntuに入れました。

入れるのに3日もかかってしまい、正直めっちゃ辛かったです笑
だって、GO言語の日本語の記事全然ないんだもん。
※私が色々試して実行できた方法なのでもしかしたら必要のない工程があるかもしれません。

#前提条件
・vmware (virtualboxよりも滑らかに動くと思う、個人的に)
・ubuntu-ja-18.04.3 (https://www.ubuntulinux.jp/download/ja-remix)
※メモリは2G以上、プロセッサ数2 に設定

#1.アップデートや必要なものを入れる
“`
$sudo apt-get -y update
$sudo apt-get -y upgrade
$sudo apt -y install git
$sudo apt -y install vim
“`
#2.goのインストール
・(https

元記事を表示

Goでnilでもメソッドを実行できる

こんにちは、ゴリラです。
せっかくの大晦日なのでGoのメソッドの仕様についてわかった面白い話をしようと思います。
みかんでも食べながら読んでみてください。

# nilでもメソッドを実行できる
このコードの実行結果はなんでしょうか?

“`go
package main

import (
“fmt”
)

type Foo int

func (f *Foo) do() {
fmt.Println(f)
}

func main() {
var f *Foo
Foo.do()
}
“`

nil pointerになると思った方はいると思いますが(自分はそうでした)、
答えは``です。

## なぜ``なのか
Goではメソッドはインスタンスを第1引数に受け取る関数になるとのことです。
[公式](https://golang.org/ref/spec#Method_expressions)に以下の様に書かれています。

“`
The expression

`T.Mv`

yields a function equivalent to Mv but wi

元記事を表示

【Golang+Lambda+CloudWatch】で、Dynamodbへのデータ挿入を定期実行

##前提条件(環境)
2019年12月31日に試したものです。
Go 1.12.9

##手順
1. DynamoDBでテーブル作成
2. Lambdaで動かす関数をGoで書く
3. Lambda関数の作成
4. Lambda関数のトリガーとしてCloudWatch Eventsを設定

#1.DynamoDBでテーブル作成
入力する項目は3つ!

| 項目 | 入力した内容 |
|:-:|:-:|
| テーブル名 | Music |
| パーティションキー | Artist |
| ソートキー | SongTitle |

###パーティションキーとは
まずパーティションとは、ハードディスク内の区切られた領域のこと。
そして、Dynamodbのデータは、複数のパーティションに分散され保存されるので、どのパーティションにあるか区別するためにキーが必要。

###ソートキーとは
同じパーティションの中で、データを並び替えたりするのに使うキー。

※テーブル作成は、[公式チュートリアル](https://aws.amazon.com/jp/getting-started/tut

元記事を表示

ターミナルにも GitHub の草を生やしたい

年末年始は時間を使って開発したいし, 開発して生えた GitHub の草を眺めながらゆっくりお酒でも飲みたい…
だけどコタツからは出られないし, ましてやターミナルからなんて一歩も外に出たくない…

そんな人のために, ターミナル上に GitHub の草を生やすための CLI ツールを作りました.

https://github.com/lusingander/crass

GitHub のユーザー ID を指定するだけでターミナル上に草を生やすことができます.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133132/185d1a7a-a7c5-d06f-93b3-9ad69e55f64e.png)

## 構成要素

Go で実装しています.
[PuerkitoBio/goquery](https://github.com/PuerkitoBio/goquery) でユーザーのプロフィールページをスクレイピングして, 標準出力の背景色を塗りつぶすことで草を生やしています.

元記事を表示

眺めて覚える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::thread

元記事を表示

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

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

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

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

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

“`golang:hello.go
package main

import (
“log”

“github.com/aws/aws-lambda-go/lambda”
“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/credentials”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/

元記事を表示

言語別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アプリケーションの実装を提示します。

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

元記事を表示

OTHERカテゴリの最新記事