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

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

macOSにGoの開発環境をインストール(備忘録)

# Goのインストール
Homebrewでgoをインストール

“`{bash:ターミナル}
$ homebrew install go
$ go version
go version go1.13.4 darwin/amd64
“`

ちゃんとhomegrew(自家醸造)して、Cellar(貯蔵庫)に入ったgoが使われていることを確認。

“`{bash:ターミナル}
$ which go
/usr/local/bin/go
$ ls -al /usr/local/bin/go
lrwxr-xr-x 1 shizuku admin 26 11 17 19:23 /usr/local/bin/go -> ../Cellar/go/1.13.4/bin/go
“`

# GOPATHとPATHの設定
– ホームディレクトリにgoディレクトリを作成してGOPATHに設定。
– PATHにGOPATH/binを追加。

下記の2行を.bash_profileに追加しておく。

“`{bash:.bash_profile}
export GOPATH=$HOME/g

元記事を表示

Go言語で画像(png, jpg, gif)処理 [ドット絵、リサイズ]

# 初めに
「Go言語で画像処理を書いたことないなー」と思い、ドット絵を作成する [gpixart](https://github.com/hmarf/gpixart) と画像をリサイズする [grimg](https://github.com/hmarf/grimg) を作成したときに苦労したことを書きます。
gpixartは内応が薄いので時間がない方は読み飛ばしてください。

# [gpixart](https://github.com/hmarf/gpixart)
“` “github.com/nfnt/resize” “` を使ってリサイズするだけでドット絵になります。
例えば、180×200の画像を18×20の画像にリサイズするとドット絵になります。(ドット絵というより画質の悪い画像ですけどね)
正直これで終わってしまうんです。なので、[ドット絵ナニカ](http://dot-e-nanika.com/) のように減色処理を加えました。手法としては、k-meansを使って減色します。

“` pixart.go
func kmeans(img *image.RGBA,

元記事を表示

ユーモアあふれる、ステータスコード 418 と 420 って何?

## Status Code 418 by Google
teapot.PNG

https://www.google.com/teapot にアクセスすると ステータスコード `418` が返ってきます。
開発者ツールからももちろん確認できます。

devtools.PNG

400 番台の HTTP レスポンスエラーは、__クライアントエラー__ ですね。
[MDN](https://developer.mozilla.org/ja/

元記事を表示

Goのポインタと構造体

# Goのポインタと構造体
最近、Goで何か作りたい欲が出てきました。
Goプログラミングではポインタと構造体がよくセットで使われるらしいのでやっていきます
まずはポインタ。

## ポインタ
ポインタとは、「値型(value type)」に分類されるデータ構造(基本型や参照型、構造体など)のメモリ上のアドレスと型の情報。
### ポインタの定義
ポインタ型は`*int`のように、参照・操作したい型の前に`*`をつけることで定義できる。
`*float64`であればfloat64型のポインタに、`*[2]int`であれば*[2]int型のポインタになる。
また、定義した時の初期値は`nil`

“`go
func main() {
var p *int
fmt.Println(p == nil)
}
“`
> true

ポインタ定義につかった「*」を重ねると、ポインタのポインタを定義できる。
むずそうだしあまり使わないらしいので紹介だけ。

“`go
var **int // int型のポインタを参照・操作するためのポインタ型
“`
さらに、参照型にもポインタ

元記事を表示

Raspberry pi とGoとMackerelでシェアハウスの運用しやすい鍵システムを作る

# はじめに
こんにちは!都内でWeb Developerしている[nari](https://twitter.com/fukubaka0825)と申します。

私が住んでいるシェアハウス([ギークハウス新宿](https://4hacker.github.io/hackerhouse/geekhouse-shinjuku.html))の同居人たちで、去年の7月に開発合宿にいったのですが、その際にプロトタイプを作った**シェアハウスの鍵システムが先日完成**したということで、**自分の担当した部分に関して振り返り**をしておこうとこの記事を書いています。

まず**何を作ったか**をお見せした後、今回採用した**おうちハックでの運用に優れた3つの技術スタック(Raspberry piとGoとMackerel(監視系SaaS))に関して紹介**したいと思います。(作った物の実装は大したことないので詳しく説明しません)

# 何を作ったか
一言で言うと、**シェアハウスの鍵システム**なのですが、以下の同居人の @wamisnet さんのツイートの動画で実際の挙動を見てもらうとわかりやすい

元記事を表示

眺めて覚える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へのデータ挿入を定期実行

![lambda(qiita) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415008/669041a3-2afc-26e9-644e-a6989ba53ab9.png)
##前提条件(環境)
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のデータは、複数のパーティションに分散され保存されるので、どのパーテ

元記事を表示

ターミナルにも 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を作ってみた

![lambda(qiita).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415008/36cf3111-680d-ed98-11be-d7263cd3c788.png)
##前提条件
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/

元記事を表示

言語別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
※実装内容はあまりにも適当なので、もうちょっと直すかも。

# 実践

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

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

### プロジェクト構

元記事を表示

OTHERカテゴリの最新記事