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

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

SORACOM Inventoryエージェント開発記録 DTLS編

# はじめに

前回の記事で書いたように、SORACOM Inventoryエージェント「[inventoryd](https://github.com/1stship/inventoryd)」の技術面の記事です。

# SORACOM Inventoryのプロトコルスタック

SORACOM Inventoryは以下のようなプロトコルスタックになっております。

![スクリーンショット 2020-01-18 12.46.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/47c648b3-bb47-836f-11eb-9088d0de4215.png)

基本的にはOMA LightweightM2M(LwM2M)のサーバーであり、SORACOM Airと連携してデバイス登録が簡単にできること、SORACOMのコンソール、WebAPIを用いてデバイスへの操作をしやすくしてくれていることが特長です。

SORACOM Inventory対応のエージェントを作成するためには、

– LwM2

元記事を表示

AWS SESをGoでサンプルアプリケーションを作ってみた

仕事でsesを使う機会があったので、手元で試してみたく、サンプルアプリケーションを作りました。

# 前提
実装は組み込めるようにしたものではなく、サンプルアプリケーションを動かすだけのものです。

# sesの設定
## SMTPの設定
SMTP Settings > Create My SMTP Credentialsを選び、適当な名前でIAM Userを作成します。
ここを参照するとわかりやすいです。
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/smtp-credentials.html

## ポリシーの設定
IAM Userを作成しただけでは、メールが送信できませんでした。

“`
$ go run main.go
AccessDenied: User `arn:aws:iam::11111111:user/ses-smtp-user’ is not authorized to perform `ses:SendEmail’ on resource `arn:aws:ses:us-west-2:11

元記事を表示

Go で競技プログラミング攻略 (AtCoder Beginners Selection)

# はじめに
この記事は自分のためにメモとして書いてあるので書き方はテキトー
間違っていたりこうしたらいいよっていうのは教えていただけるとありがたいです
競プロはマジの初心者スタートでやっていきたいと思います

# Tutrial
## [A – Welcome to AtCoder](https://atcoder.jp/contests/practice/tasks/practice_1)

答え見えちゃったので忘れたフリして書いていく。。。うまくいかねぇ
仕方なく答えチラ見

ポインタ使ってやってるヤンケーーー!!

ポインタはC言語学ぶ上でつまづいてなんだか分からず使ってたあのやつ!!!(結局わからん)

調べてみると Scanfに指定する変数はポインタで渡さないと行けないらしい。
“`Scanf(“%d”, &a)“`
fmtはCから派生したものらしい

しかたねえ、、、
良さそうな記事見つけたのでそれ読んで理解できなかったら、なんとなくで、、、、
[Goで学ぶポインタとアドレス](https://qiita.com/Sekky090

非プログラマでも、簡単にローカル環境でAjax通信を可能にする方法

Ajax通信に限らず、Web Storage や Canvas などもですが、
ほとんどのWebブラウザでは、ローカルのファイルへのAjax通信を許可していません。

回避方法としては、

– Chrome起動時にオプションをつけたり、
– 拡張機能を使って簡易Webサーバを立てたり、
– ローカルにWebサーバーをインストールしたり、

など、様々ありますが、、

どれもPCやブラウザの環境に依存するものばかりで、
非プログラマへ手順を教えるのでさえ、ひと苦労… :joy:
※ 非プログラマ: 基本的にはプログラマー以外の方(デザイナーやお客さんなど)を意味します。

(そのくらいやれよ!ってのは、今回はナシで笑笑)
もっと良い方法あります!!!!!

# GO言語を使う

GO言語だと、たった数行のコードでWebサーバが立てられる
という記事を目にし、本記事の方法を思いつきました。

なぜなら、GO言語はコンパイラ型言語のため、
各環境用に実行ファイルを予め用意しておくことができるのです。
使い方は、実行ファイルをダブルクリックするだけ!

管理者権限なども必要ありません

GolangでPaizaに挑戦するときの個人的Tips

#概要
paizaをGolangでPaizaに挑戦するときの個人的Tipsです。
気づきがあればどんどん追記していきます。
(最終更新 2020/1/29)

内容は主に問題へのアプローチの仕方と、よく使うコードのメモ書き。
個人的なメモなので必ずしもベストプラクティスではないです。
したがってより良い方法をアドバイスいただけると助かります。

#問題へのアプローチ
##標準入力
以下の記事を参考に標準入力を受け取るテンプレートを作成する。
https://qiita.com/zurazurataicho/items/c8856fc97924decf23b41

##回答の作成のフロー
1.標準入出力のコピペ
2.標準入力の値の分解して変数に落とし込む
3.ロジックを考える
4.処理を書く

##デバック
各ロジックのセクションごとにデバックをすること。
これを怠ると途中で流れを追えなくなったとき大幅なタイムロスになる。
したがってセクションが組み上がったら例え簡単な処理でも出力結果が自分の意図通りになっていることを確認すること。

##関数の作成条件
セクションにおける処理が2つ以

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

CakePHPからGoに移行してクリーンアーキテクチャ目指し2年経った話

# TL;DR
– 8年近く稼働していたPHPのシステムをGoでリプレースしようと試みた経緯と経過報告。
– Goを書きたいエンジニアは絶賛募集中だよ:smiley:

# 自己紹介
– twitter: [Go里?‍♂️](https://twitter.com/bumcru0310)
– 2015/10からHowtelevisionにジョイン
– Go/PHP/JS/EngineeringManager

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62143/2e555b29-37c9-fea2-cffb-92114e93328f.png)

# 開発合宿に自転車で行く図 :bicyclist:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62143/82932c58-04ab-a42b-4722-cc9dfb4c7377.png)

# 副業

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_