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

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

php8 JIT vs いろんな言語

# php8 JITと他のサーバーサイド言語を使ってパフォーマンステストをしました。
php8 JITが早くなったということで、他の主要なサーバーサイドの言語とパフォーマンステストして比較する。
どの言語が一番速いかどうかの検証

## パフォーマンステスト用メソッド (フィボナッチ数列の総数計算)
“`php
$n = 35;
function fibonacci(int $n): int
{
return(($n < 2) ? 1 : fibonacci($n - 2) + fibonacci($n - 1)); } ``` ## php8 JIT + 比較する言語 | 1 | 2 | 3 | 4 |5| |:-:|:-:|:-:|:-:|:-:| |php8-dev JIT|go 1.13|Java 11.0.4|python 3.8.1|Node v13.6.0(javascript)| ## テスト環境 各言語の実行環境は、AlpineをベースのDockerイメージをDockerHubのものを使用しています。 ## 実行結果 | 言語 | 速度 | |:-:

元記事を表示

GoでExcelをcatするコマンドラインツールを作ってみた

# 要約
* GoでExcelをcatする[ツール](https://github.com/kuritayu/infra-tools/blob/master/cmd/xlctl/main.go)を作ってみた
* `xlctl ls エクセルファイル名`でシートの一覧を出す
* `xlctl cat エクセルファイル名 シート名`でシートをcatする
* これでExcelをターミナルから操作してパイプでつないで色々できる

# 背景
メモだったりオブジェクト組み合わせて画像編集したり、表計算以外にもExcelは人気です
(それについては賛否両論あると思いますが、ここでは触れません)

ワタシみたいなコマンドライン野郎にはExcelって煩わしい(使わないわけではない)ので、
コマンドラインでgrepableに操作したいなとは昔から思ってました

# 作ってみた
`github.com/tealeg/xlsx`という便利なライブラリで簡単につくれました

セル情報の書き出しを行う実装はこんな感じで、1rowの中の各cellの値をforData変数に突っ込んで、最後にjoinして出力

“`

元記事を表示

Go で Qiita API を叩いてみる

`net/http` と `encoding/json` パッケージを使えば簡単にできる。

Jsonをパースした結果を受け取るための構造体をあらかじめ用意してあげる必要はある。

Top Level が配列の場合どうすんだ?って思ったけど、`make([]構造体, 0)` のようにスライスを用意してあげるだけで良かった。

## コード

“`go
package main

import (
“encoding/json”
“fmt”
“io/ioutil”
“log”
“net/http”
)

type Item struct {
Title string `json:”title”`
CreatedAt string `json:”created_at”`
}

func main() {
resp, err := http.Get(“http://qiita.com/api/v2/users/snaka/items?page=1&per_

元記事を表示

【Golang】 Struct, Method, Interfaceをまとめてみた

# はじめに
最近**Golang**をはじめまして、Struct, Method, Interfaceをまとめてみました。
※ 間違い等ございましたら、ご指摘お願い致します。

# Struct(構造体)
## 構造体とは?
Go言語にはオブジェクト指向における`Class`という物が存在しません。
しかし、それと似たような役割を果たしてくれる変数が**構造体**です。

## 定義方法

`struct`という型を使って定義します。

“` go
type Human struct {
name string
age int
}
“`

## 初期化方法

初期化方法はいくつかの方法があります。

1. `{}`を使い、順序にしたがって初期化する。
`P := Human{“Sam”,22}`
1. `field:value`の方法で初期化する。順序は任意。
`P := Human{age:25, name:”Tom”}`
1. `new`関数を使い、変数定義後に初期化する。
`P := new(Human)`

それでは、一通り宣言し

元記事を表示

GolangでAPI使ってSMS送信

##SMSとは
ショートメッセージサービスですね。
二段階認証や本人確認などで最近よく使われます。

“`Go
package main

import (
“net/http”
“net/url”
“log”
“fmt”
)

func main(){
value := url.Values{}
value.Set(“from”,”Nexmo”)
value.Add(“text”,”Hello from Nexmo dayoneeee”)
value.Add(“to”,TO_NUMBER)
value.Add(“api_key”,API_KEY)
value.Add(“api_secret”,API_SECRET)
resp, err := http.PostForm(“https://rest.nexmo.com/sms/json”,value)
if err != nil{
log.Fatal(err)
}
buffer := make([]byte,1024)
respLen,_ := resp.Body.Read(buffer)
bod

元記事を表示

github actionsでDBインテグレーションテストをしよう

# はじめに

こんにちわ、すえけん([sueken5](https://twitter.com/Sueken51))です。

この記事ではgithub actionsを使ってDB接続部分のテストをしようと思います。

# 前提条件

今回のケースでは以下のような状況です。

– golangを使っている
– gcp datastoreへのテストがある

datastoreへのテストがあるのでテスト環境にdatastoreのエミュレータを立てる必要があります。

# github actions

github actionsでは自作のアクションを作ることができ、今回はそれを使います。

“`
– .github
– actions
– mytest
– action.yaml
– Dockerfile
– entrypoint.sh
“`

ディレクトリはこのような感じです。

“`.github/actions/mytest/action.yaml
name: mytest
author: sueken
description:

元記事を表示

Go言語で初心者がハマりそうなところ

# はじめに

Go言語を勉強する際、初学者がハマりそうなところ(というよりも私がハマった部分)を列挙しました。

1. ソースコードを置く場所
2. パッケージ外部から呼び出せる関数・変数の設定
3. 自作ライブラリをimportする方法
4. enhanced for loop で要素ではなく添え字が出力される

以下、備忘録も兼ねてそれぞれどういうお話かを述べます。

# 前提条件

## Linuxの作法で説明

環境変数などについては、Linuxの作法(例:環境変数やパスのセパレーター)を理解している前提で説明します。
特に説明はしません。

## 環境

以下の環境で作業しています。実環境はWindows/Cygwinですが、Linux前提の作法で話していきます。

|項目|環境|
|:–:|:–:|
|OS|Windows 10 |
|シェル|コマンドプロンプト/Bash(Cygwin 3.0.7上)|
|エディター|Atom editor|
|Go| ver 1.12|
|Cコンパイラ| gcc x86_64-w64-mingw32 8.3.0|

### 記事内の

元記事を表示

AtCoder に登録したら解くべき精選過去問 10 問 を Go で解いてみた

@drken さんの『[AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~](https://qiita.com/drken/items/fd4e5e3630d0f5859067)』は AtCoder の入門記事としてとても人気があります。

当該記事の最後には、各言語によるACコードまとめへのリンクがありますが、[Go 言語版](https://qiita.com/kakko_hatena/items/8969ddbf432bdd520fc4) は 2019/01 現在でリンク切れになってしまっています。 (執筆者さんのアカウント自体がなくなっているようです)

私は競プロに Go 言語で参加することが多いので、今回Goで解いたACコードでまとめを新しく作りました。本記事に乗せてあるコードおよび解説の特徴は次のとおりです:

* 解き方は原則として @drken さんの解説に合わせてあります。もともと C++ と Go は文法が比較的似ている言語なので、そこまで大きな違いはありません。
* 少し私好みの書き方を採用している場合もあります

元記事を表示

Goでフィールド処理するコマンドラインツールを作ってみた

# 背景

フィールド処理の定番って`awk`だと思うんですが、コマンドラインからawkうつのってめんどくさくないですか?
`cat test.txt | awk ‘{print $1}’`みたいな感じですが、`’`とか`{`とか`$`とか打ちづらい…
ワタシ指短いんで…

# 探してみた

やっぱ探したらあるもんですね、USP研究所様
https://uec.usp-lab.com/TUKUBAI_MAN/CGI/TUKUBAI_MAN.CGI?POMPA=MAN1_self

が、pythonか….pythonは好きなんですよ、好きなんですけどね
RHEL7とかCentOS7のデフォルトpythonってpython2なんだよおおおおお
python3のインストールとかダメっていわれるんだよおおおお
Goないのかよおおおおおおバイナリでもっていきたいよおおおお

車輪の再発明するか!wという決意が湧きました

# 作ってみた

https://github.com/kuritayu/infra-tools/blob/master/cmd/gosf/main.go
(go

元記事を表示

GoをMacでビルドしたらエラーになったのでコンテナの中でビルドして解決した

#状況
– GoによるでAPI開発をMac上で行っていた。
– ローカルではdocker-composeでコンテナの中で`go run`を実行して開発を行っていた。
– そこで実環境では以下のような手法でデプロイしようと試みた
– ①Mac上で`go build`してバイナリ作成
– ②バイナリを実行する`docker image`を作成
– ③ECRにpush
– ④ECS(Fargate)上で動かす
– そこで②の`docker image`の作成まで行い、先ずローカルで試しに`docker run`したところ以下のようなエラーが発生して起動に失敗した。

“`
standard_init_linux.go:211: exec user process caused “exec format error”
“`

#原因

– ググりまくったところMacとLinuxでアーキテクチャが異なり、ビルド対象が違うことがわかった。
– [docker image error: standard_init_linux.go:211: exec u

元記事を表示

Goでslackに通知するバッチを作った【新Webhook】

## はじめに

前回の[AWSの利用料金をChatworkに通知してくれるバッチをGoで作った](https://qiita.com/maika_kamada/items/17ac04a6b8b3c56c4b18)では、取得してきたコストをChatworkに通知するバッチを作りましたが、slackにも飛ばしたくなったので、slackバージョンを作ってみました!

そして、今回はLambdaとCloudWatch EventsをServerless Frameworkで作成してみました!

また、Webhookの旧方式から変わったところもご紹介します。

## 構成図
![CostExplorer-slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546572/e07c4c71-3ad7-282e-7fd1-a5225eead20e.png)

当記事では、以下の部分にフォーカスしています。

+ Serverless Frameworkを使って作成したCloudWatch Events、La

元記事を表示

Go lambda のデフォルト環境変数

# はじめに
`AWS SDK for Go`をLambdaで使用する際に特に設定無しで使用できるので
多分アクセスキーとか環境変数にセットされているんだろうなーと思いつつも
実際に試したわけではないので検証してみました。

# 検証
## 検証コード

“`Go
package main

import (
“context”
“fmt”
“github.com/aws/aws-lambda-go/lambda”
“github.com/aws/aws-lambda-go/lambdacontext”
“log”
“os”
)

func init() {
log.Print(“init start”)
showAllEnv()
log.Print(“init end”)
}

func Handler(ctx context.Context) (string, error) {
log.Print(“handler start”)
if lambdaCtx, ok := lambdacontext.FromContext(ctx); ok {
log.P

元記事を表示

よくある表情解析LINE Botを作った

Qiita を筆頭にいろんなエンジニアの方が既に作っているもので何番煎じか分かりませんが、個人的にサーバレスアプリケーションを作るのが好きなのと、Golang に慣れることを目的として LINE チャネルに画像を送ると表情解析してメッセージを返してくれる Bot を作りました。

## できたもの

こういう感じで本田翼さんの笑顔の画像を送ると

iOS の画像 (1).png

幸福度合いをポイント化して返してくれます。

iOS の画像.png

元記事を表示

docker-compose + realizeでライブリロードする環境構築

goで開発しているとコード変更のたびにビルドするのが面倒くさいので
[realize](https://github.com/oxequa/realize)を使ってライブリロードしてサクサクコーディングできるように環境構築した時の設定をメモっておいてます。

## パッケージ構造
“`
.
├── api/
│   └── main.go
├── .realize.yaml
├── docker-compose.yml
└── Dockerfile
“`

## 設定ファイル
### Dockerfile
`go get`で`realize`を取得しておきます。
またCMDには`realize`の起動コマンドを設定しておきます。

“`
FROM golang:1.13

RUN go get github.com/oxequa/realize

EXPOSE 8080

CMD [ “realize”, “start”, “–run” ]
“`

### docker-compose.yml
`.realize.yaml`が配置されているディレクトリを`working_

元記事を表示

不要なpackageを削除する

先日goにてプロジェクト開発をしていた際に指摘されたので、modulesについて簡単にまとめていきます。

# 要約
不要なpackageを削除するために、`go mod tidy`をする

# modとは??
go1.11から使えるようになった依存管理ツールだそうです。
使い方については参照記事がわかりやすくまとまっていますので、そちらを御覧ください。

# 参照
https://blog.mmmcorp.co.jp/blog/2019/10/10/go-mod/

元記事を表示

AtCoder Beginner Contest 153 参戦記

# AtCoder Beginner Contest 153 参戦記

## ABC153A – Serval vs Monster

1分半で突破. 書くだけ.

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

print((H + (A – 1)) // A)
“`

## ABC153B – Common Raccoon vs Monster

2分半で突破. 書くだけ. 必殺技の合計ダメージがモンスターの体力を上回っているか、それだけ.

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

if sum(A) >= H:
print(‘Yes’)
else:
print(‘No’)
“`

## ABC153C – Fennec vs Monster

2分半で突破. 書くだけ. できるだけ体力が多いやつを必殺技で倒したいので、ソートして先頭K匹以降を攻撃で倒すものとして集計すればいいだけ.

“`python

元記事を表示

[Golang]redigoでデータベース番号を指定する

# 方法

[redigo](https://github.com/gomodule/redigo)でデータベース番号を指定するには、オプションを追加する。

“`golang
db := 1
opt := redis.DialDatabase(db)
conn, err := redis.Dial(“tcp”, “localhost:6379”, opt)
“`

# 参考
[redis – GoDoc](https://godoc.org/github.com/garyburd/redigo/redis#DialDatabase)
[machinery/redis.go at 84f17e8ec73bbec34184beb067f22301ffa5263b · RichardKnop/machinery](https://github.com/RichardKnop/machinery/blob/84f17e8ec73bbec34184beb067f22301ffa5263b/v1/common/redis.go#L65)

元記事を表示

go+gin+nginx環境をec2にデプロイ

## はじめに
web初心者が簡単なgoアプリケーションをec2にデプロイしてみました。
色々おかしなところがあると思いますので、何かありましたら、ご指摘いただけると幸いです。

githubを介してEC2インスタンスにプロジェクトファイルをあげるので、ローカルで開発したgoアプリケーションはgithubのリポジトリに上げておいてください。

## EC2インスタンス作成
AWSコンソール画面から EC2 > サービス > インスタンス > インスタンスの作成の手順でインスタンスを作成していきます。
今回はAMIにubuntuを選択して、そのほかの設定はデフォルトです。

インスタンスの接続に必要なキーペアも新規に作成してダウンロードします。名前はわかりやすいものにしてください。
キーペアのダウンロードが終わったら、キーペアがあるディレクトリに移動し、パーミッションを設定します。

“`
$ chmod 400 [キーペアの名前].pem
“`

## EC2インスタンスにssh接続
インスタンスが起動できたら、キーペアがあるディレクトリに移動して以下のコマンドでインスタンスにss

元記事を表示

Golangのパッケージ周りを整理する

以下のキーワードをあんまり理解できていなかったので調べてまとめた。(随時調べて更新していく)

* コンパイルとビルドの違い
* Golangのパッケージとモジュールとライブラリの違い
* $GOPATH/go/配下のsrc,pkg,binの違い()

# コンパイルとビルドの違い

[ここ](https://qiita.com/tomokichi_ruby/items/e1d52d3f34877389f905)によると

* `コンパイル` = ソースコードをオブジェクトコードに変換すること
* `リンク` = オブジェクトコードをくっつけて一つのバイナリコードにする
* `ビルド` = コンパイル + リンク

# パッケージとモジュールとライブラリの違い

* 同一パッケージのファイルは同一フォルダ`$GOPATH/src/(package名)/`などに含める(1つのディレクトリには1種類のパッケージ定義のみ許容される)。
* 同じパッケージに属するファイルは互いに丸見え。これらはまとめてコンパイルされる。
* main packageに属するファイルに関しては`$GOPATH

元記事を表示

なぜGoはDuck typingを採用していると言えるのか、データ構造から詳しく解説してみた

Goのinterfaceは明示的に実装を宣言せず、実装側がinterfaceのシグネチャを満たしているかによって型が決まるDuck typingを採用していると言われています。私は当初このような説明を聞いたときにピンと来ず、むしろそれはTypeScript等に見られるStructural Typingなのでは?と思いました。

**しかし実際にデータ構造を調べて見ると、確かにDuck typingであり、かつStructural Typingでもあるという考えに至りました。**

これまでなかなかGoのデータ構造に触れる機会がありませんでしたが、調べてみるとこれまで気づかなかった観点がいくつも出てきたのでぜひ紹介したいと思います。

## Duck typingについて

今回の主題となる部分ですので、Duck typing(ダックタイピング)についておさらいします。

Duck typingはアナロジーである「ダックテスト」に端を発しています。([厳密な起源は不明?](https://en.wikipedia.org/wiki/Talk%3ADuck_typing#Coined_by

元記事を表示

OTHERカテゴリの最新記事