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

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

【React】Omise.jsでカード情報を登録

こんにちは。
ECサイトを開発していて決済を実装するために[Omise](https://www.omise.co/ja/docs/japan)というapiを使う機会がありました。
カード情報を登録するにあたってReactで実装するのに苦労したのでメモです。
フォームはドキュメントにサンプルがあったので参考にしてみてください。

#Omise.jsとは
Omise.jsはクライアントサイドのJavaSciprtライブラリで、クレジットカードの情報をトークン化するために利用します。 ユーザーが決済フォームへ情報を入力し、フォームのSubmitのタイミングでOmise.jsが決済フォームの情報をOmiseのサーバーへ送信し、トークンを作成して取得します。取得したトークンは、あなたの決済フォームで送信されますので、あなたのサーバーサイドでは、そのトークンを利用し決済の処理を実行できます。引用:https://www.omise.co/ja/collecting-card-information/japan

#使い方
まずindex.htmlファイルのbodyタグ内に下記を追加します。
jQ

元記事を表示

Github Actions Secrets API を使って Go で Secrets を更新する

# Github Actions API が公開され、 Secrets を API 経由で更新できるようになりました

Github Actions で利用する Secrets はこれまで手作業で更新する必要がありました。
たくさんのレポジトリを管理していてそれぞれに Actions を仕込むときに更新がとても大変でした。

そんな中、 Github Actions API が公開(2020/1/27)され、 Secrets の更新が API 経由で行えるようになりました :tada:

[Secrets | Github Developer Guide](https://developer.github.com/v3/actions/secrets/)

# Secrets API の概要

Secrets は秘密鍵、公開鍵を用いて暗号化しているのですが、 Github Actions では libsodium を使って実現しているようです。

– [jedisct1/libsodium – Github](https://github.com/jedisct1/libsodium)

元記事を表示

Go言語のlogパッケージ

logパッケージを使用すると日付と時間とメッセージを表示させることができる。

## log.Print

– log.Print
– log.Printf
– log.Println

3種類あるが、内容的にはfmtと同じ、先頭に日付が入るだけ。

“`go
package main

import(“log”)

func main(){
log.Print(“ログやで”)
}
“`

## log.Fatal

何かエラーが発生した場合にログを表示してプログラムを終了させたい場合はFatalを使用する。Fatalも3種類ある。

– Fatal
– Fatalf
– Fatalln

“`go
func main(){
r, err := ioutil.ReadFile(“text.text”)

if err != nil {
log.Fatal(err)
}

fmt.Println(r)
}

// 2020/01/31 15:39:11 open text.text: The system cannot find the file specifi

元記事を表示

Onsen UI 2でSNSをつくったよ

#HTML5ハイブリッドアプリを最高に美しく、スムーズに。
Onsen UI 2とは,Web上でiOSやAndroidのネイティブUIと同等のUXを実現するためのCSSフレームワークです.
簡単に言うと,「アプリじゃないけど,アプリみたいに動くサイト」です.
[BootstrapではなくOnsen UIを選定した理由](https://blog.ecbeing.tech/entry/2019/08/08/113502) にメリット・デメリットがまとまっています.

#成果物
[ShiJimi](https://www.shijimi.work)
ドラマ・映画に特化したSNSを目指しました(^^♪

#環境
onsen ui 2.10.10
javascript
css

#かっこいい機能3選

###ons-lazy-repeat
大量のリストを表示する場合に,スクリーンに写っている部分だけを読み込んでくれます.
(番組一覧やツイート画面に利用しています.)
![20200131_071108000_iOS.png](https://qiita-image-store.s3.ap-no

元記事を表示

眺めて覚えるGo言語 その15 並列処理

#マルチスレッドのCPUを使っているのにプログラム1個分しか走らないと寂しい。
##Go言語でマルチスレッドプログラミング!
###まず眺める

“`ex3a.go
package main

import (“fmt”;”reflect”;”os”;”log”;”strings”;”strconv”;”time”;)

func main(){
tmnow()
defer tmnow()
done:=make(chan bool)
var sx float64
go func(){
for i:=0;i<=2000000;i++{ sx+=float64(i) } done<- true }() <-done fmt.Printf("sum= %10.0f\n",sx) } // ReadFileは、ファイル読み込み func ReadFile(fn string) string{ buf:=make([]byte,32768) f:=m2s(os.Open(fn)).(*os.File) //cast defer f.Close() f

元記事を表示

Go言語でHello world

今更感ですが、Go言語を習得しようと思い立ったので、自学習様にアウトプットしていきます。

# Go言語とは
3行で説明すると

* 2009年Googleが作ったプログラム言語
* 親はC言語、静的型付けのコンパイル言語
* フリーかつオープンソース

# 対応OS

* Linux / FreeBSD
* Mac OS X
* Windows
※ 2020/01時点

# Go言語のインストール
(Macの場合)

インストール
`brew install go`

インストールした場所の確認
`which go`

# Hello worldを表示するプログラムの実装

ファイルを作成
`touch hello_world.go`

ファイルを編集
`vim hello_world.go`

ファイルの内容
`cat hello_world.go`

“`
package main

import “fmt”

func main() {
fmt.Printf(“Hello World\n”)
}
“`

FYI. [fmt パッケージ – golang.jp](http

元記事を表示

go1.13のerrorのラップ

#Go1.13からエラーがラップできるようになった
Go1.13のバージョンからエラーのラップができるようになったみたいなので、自分なりにまとめてみました。

##新しく追加された関数
– func As(err error, target interface{}) bool
– func Is(err, target error) bool
– func New(text string) error
– func Unwrap(err error) error

## エラーのラップ方法
まず、エラーのラップ方法はこんな感じになります

“`golang:wrapError.go
package main

import(
“errors”
“fmt”
)

var MyError = myError()

func myError() error { return errors.New(“myError”)}

func makeMyError() error {
return MyError
}

func makeWrappedError() error {
err

元記事を表示

Golangでヘッダー、フッターをテンプレート化する

# はじめに
Goの標準パッケージの`html/template`を使い、テンプレート化できるところはテンプレート化していきます。

では、さっそくやっていきましょう!

# やりたいこと

今回は、**名前入力ページ**と**名前出力ページ**を作成し、
2つのページの共通部分(ヘッダー&フッター)をGoの標準パッケージの`html/template`を使い共通化します。
![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381808/67f67b4f-2583-d5da-836b-3732caf2826a.gif)

# まずは基本から

まず、下記のようにファイルを作成します。

“` shell
myApp
├── /client
│ ├── index.html.gtpl
│ └── sigin.html.gtpl
└── main.go
“`

続いて、`index.html.gtpl`と`sigin.html.gtpl`を作成します。

“`

元記事を表示

go-transproxy as a service

[プロキシとの戦いに疲れたのでgoで透過プロキシを作ってみた \- Qiita](https://qiita.com/wadahiro/items/7fa852b7217940e6ef26)

[Systemdを使ってさくっと自作コマンドをサービス化してみる \- Qiita](https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff)

/etc/systemd/system/transproxy.service

“`
[Unit]
Description = go-transproxy service

[Service]
ExecStart = {fullpath}/go-transproxy/bin/transproxy -private-dns {option_value} -dns-over-https-enabled {othe option} {…}
Restart = always
Type = simple
Environment = “http_proxy=http://{ip}:{port}”
Enviro

元記事を表示

GolangでMVCなAPIサーバを作るときのディレクトリ構成とプロジェクト生成コマンド

# Goの軽量Webアプリケーションフレームワーク(Echo, Gin)のディレクトリ構成

Golangの軽量Webアプリケーションフレームワークである、EchoやGinを使うとRuby on Railsのようにディレクトリ構成が特に決まっていないため、どのようにすれば効率的に開発できるのか悩みます。

しかし、最近いくつかGinやEchoを使ってAPIサーバを作成し、なんとなくディレクトリ構成が決まってきたので、共有します。

以下のリポジトリは後述する[自動リポジトリ生成コマンド](https://github.com/lon9/go-echo-api-starter)で生成されるプロジェクトの雛形です。
これについて説明をしていきます。

まずディレクトリを木構造で表示すると以下のようになります。

“`
├── README.md
├── config
│   ├── config.go
│   └── environments
│   ├── development.yml
│   └── test.yml
├── controllers
│   ├──

元記事を表示

GoのHTTPサーバの実装例でよく見るあのパターンはベストプラクティスなのか?

Techブログでよく見かけるHTTPサーバとDBコネクションの実装例です。

サーバ接続時にDBのコネクションを張るので、移行はDB接続を意識しなくていいので、一見とてもよさそうに見えます。
というか実際が楽になっていいのです。

しかし、Goを書き始めた頃に似たような実装を見て、そのまま実装したら障害起きて悲しい気持ちになったこともあります。

“`golang
package main

import (
“context”
“database/sql”
“fmt”
“io”
“log”
“net/http”
“os”
“os/signal”
“syscall”
“time”

_ “github.com/go-sql-driver/mysql”
)

func main() {
db, err := sql.Open(“mysql”, fmt.Sprintf(
“%s:%s@tcp(%s:%s)/%s?parseTime=true”,
“(user name)”, “(password)”, “(host)”, “(port)”, “(datab

元記事を表示

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 で競技プログラミング攻略1 (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 が配列の場合どうすんだ?って思ったけど、`var hoge []構造体` のようにスライスを用意してあげるだけで良かった。

## コード

“`go:main.go
package main

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

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

func main() {
resp, err := http.Get(“http://qiita.com/api/v2/

【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)`

それでは、一通り宣言し