- 1. ヘキサゴナルアーキテクチャをgo言語で書いてみた
- 2. slackにGo言語で、postする
- 3. Goでドコモメール送信
- 4. GoでCRC-32Cハッシュでダウンロードファイルの整合性をチェックする
- 5. Goのnetパッケージを理解する~2日目~
- 6. LeetCodeに毎日挑戦してみた 141. Linked List Cycle(Python、Go)
- 7. Go言語でAWS Lambdaの開発をサポートするパッケージを作った
- 8. goのechoでファイルへログを出力できるようにする
- 9. [Go]slack apiでチャンネル名/ユーザ名からチャンネルID/ユーザーIDを検索する
- 10. LeetCodeに毎日挑戦してみた 136. Single Number(Python、Go)
- 11. LeetCodeに毎日挑戦してみた 125. Valid Palindrome(Python、Go)
- 12. GCP検証環境で不要なリソースを自動停止する
- 13. 今流行りのgRPCについて簡単にまとめてみた(Goのサンプルコード付き)
- 14. Kubernetes Scheduler 自作入門
- 15. PulumiをGoで書いてみる
- 16. Go で文字種をチェックする
- 17. GoでファイルのMD5ハッシュを取得する方法
- 18. Goで文字列をスネークケースに変換する
- 19. Goでファイルをダウンロードする
- 20. Go言語でRSSフィードを生成する
ヘキサゴナルアーキテクチャをgo言語で書いてみた
## はじめに
初投稿です。
勉強がてらGoでヘキサゴナルアーキテクチャの考え方を採用したコードを書いてみました。[ヘキサゴナルアーキテクチャの翻訳サイト](https://blog.tai2.net/hexagonal_architexture.html)をはじめ、多くのサイトを参照しましたが、まだ理解が浅く記載内容に間違いがあるかもしれません。もし間違いに気付いたらご指摘いただければ助かります。
## ヘキサゴナルアーキテクチャとは
ヘキサゴナルアーキテクチャについての解説は[このサイト](https://blog.tai2.net/hexagonal_architexture.html)に記載されてありますが、
少しわかりづらいかと思うので、以下に重要だと思った特徴を記載します。– ヘキサゴナルアーキテクチャは内側(アダプターレイヤ)と外側(アプリケーションレイヤ)という2つのレイヤに分離するアーキテクチャ
– 外側のアダプターレイヤにはHTTPやEmail、RDBといった外部のエージェントとのやりとりを実装することで、アプリーケーション(内側)と外部エージェントを分
slackにGo言語で、postする
# はじめに
外部ライブラリを使用しないで、Slackに投稿する方法が気になったので、自分で組んでみた。
Slackの設定は、`Bot Token Scopes`で`chat:write`と`files:write`を有効にする。
そして投稿したいチャンネルにアプリ許可を出しておくこと
test.pngという名の画像ファイルをあらかじめ用意しておくこと# ソースについて
“`go:main.go
package mainimport (
“bytes”
“context”
“io”
“io/ioutil”
“mime/multipart”
“net/http”
“net/url”
“os”
“path/filepath”
“strings”
“time”
)const (
SLACKPOSTMESSAGE = “https://slack.com/api/chat.postMessage”
SLACKPOSTFILE = “https://slack.com/api/files.upload”
TOKEN = “
Goでドコモメール送信
### Goでドコモのキャリアメールを送信するサンプル実装
“`
package mainimport (
“crypto/tls”
“encoding/base64”
“fmt”
“io/ioutil”
“log”
“net”
“net/http”
“net/mail”
“net/smtp”
“strings”“golang.org/x/text/encoding/japanese”
“golang.org/x/text/transform”
)func main() {
send()
}func send() {
from := mail.Address{“”, “from@docomo.ne.jp”}
to := mail.Address{“”, “to@gmail.com”}message := createMessage(from, to)
servername := “smtp.spmode.ne.jp:465”
host, _, _ := net.SplitHostPort(servername)
aut
GoでCRC-32Cハッシュでダウンロードファイルの整合性をチェックする
### APIのレスポンスからファイルを保存して、CRC32C整合性をハッシュチェックするサンプル実装
“`
func downloadFile(res *http.Response, path string) error {
var buf bytes.Buffer
tr := io.TeeReader(res.Body, &buf)
writeFile(tr, path)
if err := writeFile(tr, path); err != nil {
return err
}if err := checkCRC32c(res, path); err != nil {
return err
}
}func writeFile(r io.Reader, path string) error {
dir := filepath.Dir(path)
err := os.MkdirAll(dir, os.ModePerm)
if err != nil {
return errors.Wrapf(err, “failed to create d
Goのnetパッケージを理解する~2日目~
# はじめに
>この記事は、[Goのnetパッケージを理解する~1日目~](https://qiita.com/Marny/items/918f292614de7d8fa8f7)の二日目の記事です。
今回は、**POSTやGETの処理・htmlの出力**をしていきます。
## ソースコード
“`go:main.go
package mainimport (
“fmt”
“log”
“net/http”
“text/template”
“time”
)type Host struct {
Title string
Date time.Time
Text string
}func main() {
http.HandleFunc(“/”, handler)
http.HandleFunc(“/temp”, handlerTemp)
http.ListenAndServe(“:8080”, nil)
}func handler(w http.ResponseWriter, r *http.Request) {
switch r.Metho
LeetCodeに毎日挑戦してみた 141. Linked List Cycle(Python、Go)
#### Leetcodeとは
[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。golang入門+アルゴリズム脳の強化のためにgoとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)
#### 32問目(問題141)
#### 141. Linked List Cycle
#### 問題内容
> Given `head`, the head of a linked list, determine if the linked list has a cycle in it.
>
> There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the `next` poi
Go言語でAWS Lambdaの開発をサポートするパッケージを作った
仕事でGo言語 + AWS Lambdaを用いる機会が多く、特にセキュリティ監視関連基盤のバックエンド処理を開発しています([これ](https://techlife.cookpad.com/entry/2020/03/18/073000)とか[これ](https://techlife.cookpad.com/entry/catbox)とか[これ](https://techlife.cookpad.com/entry/2019/11/21/073000))。
開発をすすめる中で「こうすると便利だな」というちょっとしたtipsはいろいろあったのですが、あまりに細切れな処理すぎるのでプロジェクト間でコピーするなどして開発に利用していました。とはいえ管理しているプロジェクトが多くなってきたことで挙動がまちまちになってしまったり、ある程度tipsの数が溜まってきたのもあって、パッケージとして切り出してみました。
https://github.com/m-mizutani/golambda
AWSが公式で提供しているPowertools([Python版](https://github.c
goのechoでファイルへログを出力できるようにする
“`golang
fp, err := os.OpenFile(“logs/debug.log”, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
panic(err)
}e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
Output: fp,
}))“`
[Go]slack apiでチャンネル名/ユーザ名からチャンネルID/ユーザーIDを検索する
# 経緯
1. slack apiのパラメータにはchannel idやuser idが必要
2. 手動でも取得できるがブラウザ開く必要があるのでちと面倒
参考: [SlackのチャンネルIDを確認する方法 – Qiita](https://qiita.com/unsoluble_sugar/items/603e51106d9632f3ea4f)
3. じゃあチャンネル名/ユーザー名でIDを検索する処理を作ろう# チャンネル名からIDを検索する
slackのOAuth Tokensを作る方法は探せば出てくるので省略。
必要な権限は以下の通りです。| 権限 |
|:-:|
| [channels:read](https://api.slack.com/scopes/channels:read) |slackでチャンネル名からIDを検索するためには[conversations.list](https://api.slack.com/methods/conversations.list)でチャンネル一覧を取得する必要があります。
そしてこの[conversati
LeetCodeに毎日挑戦してみた 136. Single Number(Python、Go)
#### Leetcodeとは
[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。golang入門+アルゴリズム脳の強化のためにgoとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)
#### 31問目(問題125)
#### 136. Single Number
#### 問題内容
> Given a **non-empty** array of integers `nums`, every element appears *twice* except for one. Find that single one.
>
> **Follow up:** Could you implement a solution with a linear runtime complexity and without using extra memory?
LeetCodeに毎日挑戦してみた 125. Valid Palindrome(Python、Go)
#### Leetcodeとは
[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。golang入門+アルゴリズム脳の強化のためにgoとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)
#### 31問目(問題125)
#### 125. Valid Palindrome
#### 問題内容
> Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
>
> **Note:** For the purpose of this problem, we define empty string as valid palindrome.
>
>
>
> 日本語訳
>
> 文字列を指定して、
GCP検証環境で不要なリソースを自動停止する
こんにちは、オールアバウト SRE所属の @ishii1648 です。
この記事は、[All About Group(株式会社オールアバウト) Advent Calendar 2020](https://qiita.com/advent-calendar/2020/allabout) 25日目の記事です。
## 概要
クラウドの検証環境における悩みの種の一つとして、テスト用に構築したリソースを停止し忘れてコストがかさむ事が挙げられると思います。一昔前なら夜の9時くらいになったらGCE(AWSならEC2)のリソースを自動停止するスクリプトを書いて事足りたと思いますが、今やGCE以外にも止め忘れる可能性があるリソースは数多くあります。
オールアバウトではGKEを採用しているため、検証環境で構築したGKEのインスタンスグループを停止し忘れるという事が度々ありました。
上記の現状を踏まえ、停止忘れを効果的に防止するのであればGCE以外のリソース(GKE、Cloud SQL、Memory Store)も自動停止できる統合的な仕組みを開発する必要があると考え今回紹介するスクリプトを実装し
今流行りのgRPCについて簡単にまとめてみた(Goのサンプルコード付き)
##はじめに
(当時)Go歴1ヶ月の私が急遽gRPCを用いてバックエンドのAPIを開発してる業務に参画することになり、必要にかられて急いで学んだので、その時の学びを共有します✎gRPCって最近よく聞くけど、「なにそれ?」って方も多いと思うので(私もそのうちの1人でした)、自分の学びを纏めるためにもgRPCのエントリー記事を書こうと決意し、[Go 5 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/go5)に登録しました!
##gRPCとは
– gRPCって良いらしい
– 最近gRPC流行ってるらしい等聞いたことは多いと思いますが、簡単に説明すると
– RPC (Remote Procedure Call) を実現するためにGoogleが開発したプロトコルの1つ
– Protocol Buffers を使ってデータをシリアライズし、高速な通信を実現できる
– IDL(インターフェース定義言語)を使ってあらかじめAPI仕様を .proto ファイルとして定義し、.protoファイルからサーバー側&クライア
Kubernetes Scheduler 自作入門
# はじめに
Kubernetesのスケジューラを自作するためのフレームワークであるscheduling frameworkが整備されてきています。
しかしまだalphaのステージということもあり、実際に作って試すには情報が少なく戸惑う状況です。
そこでこの記事では、簡単なscheduling frameworkのサンプルと動かし方を紹介します。
さらに応用例としてkubernetes scheduler sigsの開発しているCoschedulingプラグインの解説を行います# そもそもスケジューラーとは?scheduling frameworkとは?仕様は?
ざっくりとだけ説明します。
詳細情報はすでに良い解説資料があるので、そちらをご参照ください* [猫でもわかる Scheduling Framework #k8sjp](https://speakerdeck.com/ytaka23/kubernetes-meetup-tokyo-16th)
* [2020 年の秋、改めて学ぶ Scheduling Framework #k8sjp](https://speakerdec
PulumiをGoで書いてみる
やろうとは思っていたものの、手を出さずにいたのでこれを機にやってみよう。
# Pulumiってなに?
https://www.pulumi.com/
Pulumiとは様々なプログラミング言語から好きなものを使ってインフラのプロビジョニングやデプロイができるツールです。
昨今界隈で使われているTerraformみたいなものですね。TerraformがHCLという独自の言語を利用しているのに対し、Pulumiはjavascript/typescript/python/C#/F#/VB/Go (今現在pulumi new -hで確認できる言語) が利用できる模様。
AWSはもちろんGCP/AzureやAliCloud、K8s、OpenStackまでサポートされているようです。
最近の流行りとしてコンテナ化が進んでいるので、EKS/GKE/AKSあたりに対応されているのはすばらしい。普段私はRails(Ruby)での開発が多く、たまにtypescriptを使うくらい。
なので、今回はGoで書いてみたいと思います。## 準備
macosで開発しているので、goとpulumiは両方
Go で文字種をチェックする
### アルファベット大文字、小文字、その他を判定するサンプル実装
“`
package mainimport “fmt”
func main() {
upperA := rune(‘A’)
upperZ := rune(‘Z’)
lowerA := rune(‘a’)
lowerZ := rune(‘z’)
for _, c := range “abcXYZ32あ&” {
if c >= upperA && c <= upperZ { fmt.Println("大文字アルファベット", string(c)) } else if c >= lowerA && c <= lowerZ { fmt.Println("小文字アルファベット", string(c)) } else { fmt.Println("その他の文字", string(c)) } } } ``` --- ### 種別を文字列から一文字ずつ判定する ``` package main import ( "fmt" "unicode" ) func main(
GoでファイルのMD5ハッシュを取得する方法
### 指定したファイルのMD5ハッシュを取得して返す
“`
func md5File(filePath string) (string, error) {
file, err := os.Open(filePath)
if err != nil {
errors.Wrapf(err, “failed open file : %s”, filePath)
}
defer file.Close()zr, _ := gzip.NewReader(file)
if err != nil {
errors.Wrapf(err, “failed read gz file : %s”, filePath)
}
defer zr.Close()hash := md5.New()
if _, err := io.Copy(hash, zr); err != nil {
return “”, errors.Wrapf(err, “failed file hash c
Goで文字列をスネークケースに変換する
### 指定した文字列をスネークケースに変換して返す
“`
func toSnakeCase(s string) string {
b := &strings.Builder{}
for i, r := range s {
if i == 0 {
b.WriteRune(unicode.ToLower(r))
continue
}
if unicode.IsUpper(r) {
b.WriteRune(‘_’)
b.WriteRune(unicode.ToLower(r))
continue
}
b.WriteRune(r)
}
return b.String()
}
“`
Goでファイルをダウンロードする
### ファイルをダウンロードしてローカルファイルに保存する
“`
package mainimport (
“io”
“net/http”
“os”
)func main() {
fileUrl := “https://4.bp.blogspot.com/-2-Ny23XgrF0/Ws69gszw2jI/AAAAAAABLdU/unbzWD_U8foWBwPKWQdGP1vEDoQoYjgZwCLcBGAs/s1600/top_banner.jpg”
if err := DownloadFile(“avatar.jpg”, fileUrl); err != nil {
panic(err)
}
}func DownloadFile(filepath string, url string) error {
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Clos
Go言語でRSSフィードを生成する
### RSSフィード(xml)の内容を出力する
“`
package mainimport (
“fmt”
“log”
“time”
“github.com/gorilla/feeds”
)func main() {
now := time.Now()
feed := &feeds.Feed{
Title: “ブログタイトル”,
Link: &feeds.Link{Href: “http://hoge.com/blog”},
Description: “ブログの詳細”,
Author: &feeds.Author{Name: “ohnishi”, Email: “ohnishi@hoge.com”},
Created: now,
}feed.Items = []*feeds.Item{
&feeds.Item{
Title: “記事