- 1. Goでワーカープールを15分で実装する方法
- 2. 自作SORACOM InventoryのエージェントinventorydでIoTデバイスを簡単に遠隔操作する
- 3. インクリメント・デクリメントの書き方のまとめ(Scala、Java、Rust、C言語、C++、Go言語、PHP、Perl、Python、Ruby、JavaScript)
- 4. 眺めて覚えるGo言語 その13 MongoDB
- 5. Go言語でロックファイルを利用した多重起動防止サンプル
- 6. Golang on DockerでEchoを動かす
- 7. Go + gin-gonic + Vue で作るWebアプリの始め方
- 8. MarkdownでのAA入力を対応してみた 【ぼくのがんがえたさいきょうの掲示板】
- 9. sqlxでのselect例
- 10. 眺めて覚えるGo言語 その12 Map & Json
- 11. Golangでの0-1ナップサック問題の実装
- 12. 1byteをstringに変換
- 13. dockerのscratchイメージでgolangのWebアプリを動かす
- 14. Golang + gRPCで開発を始められるDockerfileを作る
- 15. golang で aws s3v4 の署名キーを作成する方法
- 16. ときにはencoding.TextUnmarshalerの話を
- 17. golangで文字列からキー付きでsha256ハッシュ化する方法
- 18. golangの並行処理のための言語要素に対応するCSPの記述を理解して形式検証の実践を開始しよう(記述編)
- 19. DockerfileのRUN命令
- 20. GoとLambdaでAWS使用料金を毎日LINE通知させる
Goでワーカープールを15分で実装する方法
> こちらの記事は、Joseph Livni氏により2018年10月に公開された『 [Write a Go Worker Pool in 15 minutes](https://medium.com/@j.d.livni/write-a-go-worker-pool-in-15-minutes-c9b42f640923) 』の和訳です。
> 本記事は原著者から許可を得た上で記事を公開しています。—
![1_ugshDOhXfC287WWhG4IfSA.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89391/daa5a211-6311-b88d-cbef-ad63bf0c6b24.jpeg)
私は多くのユーザーリクエストを高速に処理するGoのサービスを構築していました。Goroutineのプールを使ってカプセル化することにより、パフォーマンスは20倍になりました。本記事では独自のワーカープールを作る方法を説明します。[^1]
[^1]: 訳注: ライブラリとして提供されているワーカープー
自作SORACOM InventoryのエージェントinventorydでIoTデバイスを簡単に遠隔操作する
# はじめに
IoTデバイスの遠隔操作したくないですか?
したいに決まってますよね!
ということで今回お勧めするのは[SORACOM Inventory](https://soracom.jp/services/inventory/)です。# 1分でラズパイを遠隔再起動するよ
**注意**
すでにSORACOM Inventoryを使用中の場合、以下を実行すると費用が発生します。(初期費用100円、利用料金50円)
未使用の場合は150円の無料枠に入ります。—
SORACOM Airで接続中のラズパイに入ってrootで以下のコマンドを実行しましょう。
“`bash
curl -L -O https://github.com/1stship/inventoryd/releases/download/v0.0.1/inventoryd_0.0.1_linux_arm.tar.gz
tar zxf inventoryd_0.0.1_linux_arm.tar.gz
./inventoryd –init # 質問にはEnterのみでよい(yで回答したことになる)
ech
インクリメント・デクリメントの書き方のまとめ(Scala、Java、Rust、C言語、C++、Go言語、PHP、Perl、Python、Ruby、JavaScript)
いろんな言語を触っていると、言語の細かい仕様がだんだんごっちゃになってきてしまいますので、メモです。
インクリメント・デクリメントの有無
あり: Java、C言語、C++、Go言語△、PHP、Perl、JavaScript
なし: Scala、Rust、Python、RubyGo言語は式を構成する演算子ではなく文(statement)という扱いにすることで、インクリメントの演算子としての問題を回避していて、個人的にはちょうどいい仕様に感じます。
ついでに代入演算子も確認しましたが、こちらはだいたいの言語にあるようです。
# Scala
– インクリメント・デクリメント演算子はない
– 代入演算子はある“`scala
i += 1
i -= 1
“``i += 1` などは `i = i + 1` などのシンタックスシュガー。
参考
[Assignment Operators – Expressions | Scala 2.13](https://scala-lang.org/files/archive/spec/2.13/06-expressions.ht
眺めて覚えるGo言語 その13 MongoDB
#MongoDBにDatabaseを作りましょう。眺めていきます。
### あらかじめMongoDB Copmpassをインストールしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/8295d0be-ebde-3098-67dc-d293f039b187.png)“`main.go
package mainimport (
“context”
“fmt”
“log”
“go.mongodb.org/mongo-driver/mongo”
“go.mongodb.org/mongo-driver/mongo/options”
)// アドレス帳の構造体
type Adr struct {
ID int `bson:ID`
Name string `bson:”名前”`
Kana string `bson:”名前フリガナ”`
Post
Go言語でロックファイルを利用した多重起動防止サンプル
Go言語のバッチ等で、ロックファイルを利用した多重起動防止のサンプル実装です。
アプリケーションルートのディレクトリ配下の`/util`ディレクトリに置かれる想定で、`~/go/src/`と`/util/`を除いたディレクトリ名のハイフン区切りをロックファイル名にしています。
ex.) `~/go/src/example/lockfile/util/lockfile.go`の場合
ロックファイルは `~/go/src/example/lockfile/example-lockfile.lock`## 利用例
“`golang:main.go
package mainimport (
“lockfile/util”
“os”
)func main() {
os.Exit(execute())
}func execute() int {
util.Setlock()
defer util.Unlock()// do process
return 0
}
“`## ソースコード
“`golang:util/lockfile.go
pack
Golang on DockerでEchoを動かす
# TL;DR
Docker上でGolangのWebフレームワークであるEchoを動かしてみました。
# DockerでGolang環境の構築
“`dockerfile
FROM golang:1.13.6-alpineWORKDIR /go/src
COPY ./src /go/src
RUN apk update && apk add git
#RUN go get -u github.com/labstack/echo/…
“``dockerfile`内の`go get -u github.com/labstack/echo/…`が実行出来なかったのは何故だろう。。。
“`docker-compose.yml
version: ‘3’
services:
app:
build: .
ports:
– 8080:8080
volumes:
– ./src:/go/src
tty: true
“`“`sh
$ mkdir src
“`“`src/server.go
packa
Go + gin-gonic + Vue で作るWebアプリの始め方
この記事では Goと[gin-gonic](https://github.com/gin-gonic/gin) (Go の Web Application Framework) および webpack と Vue を使ってWebアプリを作る際の初期環境の構築方法について説明します。自分自信、webpackやVueのプロではないので、もっといい方法などあればコメント歓迎です。なおこの工程でできる完成品は https://github.com/m-mizutani/web-app-go に置いてあります。
## 構築手順
### webpack周りの設定
最初にyarnのパッケージを諸々追加します。 `yarn init` するとパッケージの内容についていろいろ聞かれるのでよしなに入力します。
“`bash
$ yarn init
$ yarn add -D @babel/cli @babel/core @babel/preset-env babel-loader webpack webpack-cli webpack-dev-server html-webpack-plugin
MarkdownでのAA入力を対応してみた 【ぼくのがんがえたさいきょうの掲示板】
個人で作っている掲示板サイトがある。最近日本語対応を実装しているが、途中であることに気づいてしまった。
>「せっかく和訳したところでAA貼れないなら意味ない!」
AAは日本語の掲示板の不可欠な文化である。しかし現代のパソコンやスマホではAAが正しく表示されない場合が多い。これはどうにか解決したい。
# やりたいこと
私の掲示板はMarkdown記法で書き込む形だ。AAをそのまま入力すると、太字として認識されたり自動的に改行が入ったりする。2chの専ブラみたいにいい感じにAAを表示したい。
“`markdown
(´・ω・`)
“`自動的にAAを認識するのは大変そうなので、AAタグを用意する。AAタグの中身をAA用のフォントに変えて、Markdown記法の`*bold*`などを無視する。
# 無理矢理AAタグを対応する
利用しているMarkdownライブラリは[russross/blackfriday](https://github.com/russross/blackfriday)だ。諸々があって今だにv1を使ってる。
このライブラリはHTMLの
sqlxでのselect例
sqlxでのselect例
##Select
“`go
import (
“fmt”“github.com/jmoiron/sqlx”
_ “github.com/go-sql-driver/mysql”
)type Hoge {
ID int `db:”id”`
Name string `db:”string”`
}tx, err := db.Beginx()
if err != nil {
fmt.Println(err)
}query := `
SELECT
*
FROM
hoge
WHERE
name in (?)
`names := []string{“foo”, “bar”}
query args, err := sqlx.In(query, names)
if err != nil {
fmt.Println(err)
眺めて覚えるGo言語 その12 Map & Json
#json文字列([]byte)を定義してvar adrs []map[string]interface{}形式にマーシャルします。
“`json.go
package main
import (“encoding/json”
“fmt”
“log”
)
func main() {
b:=[]byte(`[{
“ID”:1,
“Name”:”関波子”,
“Furigana”:”セキナミコ”,
“Sex”:”女”,
“Blood”:”AB”,
“Date”:”1980/07/31″,
“Tel”:”03-3060-4716″,
“MTel”:”090-7787-3784″,
“Mail”:”sk@eaccess.net”
},
{
“ID”:2,
“Name”:”小倉準司”,
“Furigana”:”コクラジュンジ”,
“Sex”:”男”,
“Blood”:”A”,
“Date”:”1973/10/08″,
“Tel”:”0166-36-3522″,
“MTel”:””,
“Mail”:”junzi-kokura@eaccess.net”
},
{
“ID”:3,
“Name
Golangでの0-1ナップサック問題の実装
# Goで0-1ナップサック問題を解く
ナップサック?ナップザック?どちらも見かけるような気がします.
英語ではKnapsack(nˈæpsæk)なのでサックなような気がします.## 目的・理由
最近仕事でナップサック問題で解決出来る問題と遭遇した.
仕事全体の中では非常に小さい問題ではあったがアルゴリズムが直接役に立ったことを大変嬉しく思っており,記念に初めて記事を書く.Goで書くのはGoを書きたいというささやかで非常に素朴なアピールである.
## 想定読者
未来のわたし
## ナップサック問題とは
ナップサック問題には制約によって様々な解法パターンがあるが今回の対象となるのは,もっともオーソドックスな`0-1ナップサック問題`と呼ばれるケース.
以下に簡単な問題設定を記載する.容量$W$のナップサック1つと,$N$個の荷物$a_i (1\le i\le N)$がある.
各荷物には重さ$w_i$と価値$v_i$が設定されており,$N$個の荷物からいくつかを選びナップサックに詰め込んでいく.
ただし,ナップサックに入れる荷物の重さの総和は容量$W$以下とならなけれ
1byteをstringに変換
# Go Tourで分からなかったため
Go Tourやってて調べても分からなかったため。実務で使うかは不明。
https://go-tour-jp.appspot.com/methods/18
もっといい方法があったら教えていただけると嬉しいです!# fmt.Sprintで変換
“`golang
str := fmt.Sprint(byte(255))
fmt.Println(str) // -> 255
“`
dockerのscratchイメージでgolangのWebアプリを動かす
[Best practices for writing Dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/) [(参考訳v18.09ベース)](https://qiita.com/zembutsu/items/a96b68277d699f79418d)を参考に、golangで書いたWebアプリを動かそうとしたらハマったので、その記録を残します。
## ざっくりいうと
1. golangで書いたwebアプリ(サンプル)を、[dockerのscratchイメージ](https://hub.docker.com/_/scratch)上で動かそうとしたら起動で失敗
2. 調べたらダイナミックリンクでビルドされており、scratchイメージではファイルが足りなかったのが原因
3. スタティックリンクでビルドし直したら解決した## 環境
* go 1.13.5
* docker 19.03.5## ハマるまでの流れ
[“Use multi-stage build
Golang + gRPCで開発を始められるDockerfileを作る
# 概要
Go + gRPCで開発を行う為の環境構築方法を解説します。環境構築はDockerを利用します。
gRPCの詳しい説明はこの記事では行いません。
# 想定読者
– Dockerの基礎知識をお持ちの方
– GoLangの基礎知識をお持ちの方
– Go + gRPCでの開発に興味がある方# サンプルコードをGitHubに登録してあります
以下にサンプルコードを用意してあります。
https://github.com/keitakn/golang-grpc-server
[こちら](https://github.com/keitakn/golang-grpc-server/blob/master/Dockerfile) がDockerfileの中身になります。
以後はこのDockerfileを作り上げるまでに実行した手順を解説しますので、 [こちら](https://github.com/keitakn/golang-grpc-server/blob/master/Dockerfile) を見て理解出来る方はこの記事をこれ以上読む必要はありません。
# Do
golang で aws s3v4 の署名キーを作成する方法
# aws s3v4 署名バージョン
aws s3 は version4 より署名プロセスが変わっています
https://docs.aws.amazon.com/ja_jp/general/latest/gr/signature-version-4.html## 署名作成の流れ
1. 署名に必要なキーを作成する(本記事はここ)
2. 1.で作成したキーを使って署名を作成する## 各言語での署名キー作成方法
各言語の署名キー作成フローは以下の文書にまとまっています。しかしながら、`Java`, `.NET (C#)`, `Python`, `Ruby`, `Javascript` のサンプルコードはあっても、Golangのサンプルコードは存在しません
https://docs.aws.amazon.com/ja_jp/general/latest/gr/signature-v4-examples.htmlそのため、本記事ではGolangで version4 用の署名取得処理のサンプルコードを載せることとします
ちなみにですが、本記事では署名キーを作成する部分の説明であり
ときにはencoding.TextUnmarshalerの話を
飛ばねえホリネズミはただのホリネズミだ…
## うんざり
最近いろいろなプライベートプロジェクトに参加したりしてるんですが、
あっちにいってもこっちにいってもMarshalXXXだのString()だの実装するのDARUすぎませんか。
ここはJSONだからMarshalJSON実装して、こっちはYAMLだからMarshalYAML実装して…
アッ、素敵なHogeフォーマットなんてものを考えたんですね。じゃあMarshalHoge実装しなきゃですね(にっこり)だいたいGoだとPrimitiveな型を`type Hoge int`とかやりがちなんで、
書くモンが多い多い。“`go
type Hoge intfunc (h Hoge) MarshalJSON() ([]byte, error) {
…
}func (h Hoge) UnmarshalJSON(raw []byte) error {
…
}func (h Hoge) MarshalYAML() ([]byte, error) {
…
}func (h Hoge) UnmarshalY
golangで文字列からキー付きでsha256ハッシュ化する方法
# キー付きでハッシュ化
キー無しでハッシュ化する方法は以前記事([golangで文字列からsha256でハッシュ化する方法](https://qiita.com/mergit/items/ffdb405173dee651856d))を執筆したのですが、今回はキー付きでhash化する方法です。
“`golang
// キー無しでSHA256
func getBinaryBySHA256(s string) []byte {
r := sha256.Sum256([]byte(s))
return r[:]
}// キー有りでSHA256
func getBinaryBySHA256WithKey(msg, key string) ([]byte, error) {
mac := hmac.New(sha256.New, getBinaryBySHA256(key))
_, err := mac.Write([]byte(msg))
return mac.Sum(nil), err
}
“`## サンプルプログラム
hash化は不可逆変換ですが、同じ文字
golangの並行処理のための言語要素に対応するCSPの記述を理解して形式検証の実践を開始しよう(記述編)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101445/20730446-dabe-52d5-da91-59b75f636534.png)
# はじめに
go言語には、「スレッドの生成・起動」、「スレッド間の通信」といった、いわゆる「並列処理」を意識した言語要素があります。
このような言語要素を使って書く並行処理は、多くの場合振る舞いが複雑で正しいことを保証するのが難しくなります。本記事では、そのような複雑な振る舞いになりがちなgoで書かれた「並行処理」の振る舞い設計を[CSP(Communicating Sequential Process)](https://ja.wikipedia.org/wiki/Communicating_Sequential_Processes)という形式言語を使った記述と対応させます。そうする事で、並行処理を含むgo言語のコードの振る舞い検証をするための第一歩、「記述」についての説明を試みます。
尚、本記事で「遷移図」として利用した図は、[P
DockerfileのRUN命令
# お題
DockerfileのRUN命令はコンテナ内で実行されるコマンドを書くんだよというだけの話。
※便宜上、Golangアプリのコンテナ化を事例とする。# 開発環境
## # OS – Linux(Ubuntu)
“`
$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”18.04.2 LTS (Bionic Beaver)”
“`## # Dockerコンテナ
### Docker
“`
$ sudo docker -v
Docker version 19.03.5, build 633a0ea838
“`# [RUN](http://docs.docker.jp/engine/reference/builder.html#run)
### どこに対して実行されるのか?
Dockerfileは自分の作業PC上で書いている。
Dockerfileは「こういうコンテナを作ってね」という指示書のようなもの。
RUNコマンドは、[FROM](http://docs.docker.jp/engine/reference/bui
GoとLambdaでAWS使用料金を毎日LINE通知させる
## AWSの使用料金こわい
おっしゃ AWSのコンソールいじるで〜 :nerd:
お、そういや〜AWS今いくらかかっとんねんやろ :nerd:
マイ請求ダッシュボード ポチ〜っと :nerd:
んん!?? :innocent::innocent::innocent:
ECSを放置して$100超えの請求がきたり、
キルしたはずのRDSインスタンスが知らぬ間に復活していて地味に$40くらい請求がきたり、
~~この通過儀礼を~~いい加減なんとかしようと簡単な料金通知システムを作りました。 :nerd:## やったこと
Go言語でLINE notifyの通知APIをキックする関数を実装して
AWS Lambdaにデプロイ:nerd:Cronで定期実行して、毎日AWSの使用