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

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

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 main

import “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() { for _, c := range

元記事を表示

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 main

import (
“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 main

import (
“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: “記事

元記事を表示

DMM アフィリエイトAPI にアクセスするGoの実装サンプル

### Fanzaの商品情報Jsonを取得して表示する

“`
package main

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

type responsStatus struct {
Result struct {
Status int `json:”status”`
ResultCount int `json:”result_count”`
TotalCount int `json:”total_count”`
FirstPosition int `json:”first_position”`
} `json:”result”`
}

type targetService struct {
service string
floor string
}

var targetServices = []targetService{
{
service: “digital”,
floor: “vi

元記事を表示

大学に行った途端にオンライン授業になったので、囲碁サービスを突貫工事した話。

この記事は[N高等学校 (2) Advent Calendar 2020](https://qiita.com/advent-calendar/2020/n-highschool-2)の後出しじゃんけん24日目です。

N高を去年卒業(2期生)して、東京理科大学の理工学部 数学科に今年入学した[@kakudo415](https://twitter.com/kakudo415)と申します。
8年の不登校期間を超えて、ついに大学でのリアル授業だと意気揚々としていたらパンデミックの影響でほぼ全ての授業がオンラインになってしまいました。その中で生まれた不便を解消し**かけた**話を書きます。

# なぜ作るか

理科大の人気授業(多分)に「囲碁で養うコミュニケーション力」があります。
本来は教室に行って実際に対局をするのでしょうが、このご時世でそうもいかなくなってしまいました。
少なくとも僕が受講した前期においては、全てZoomと画面共有した棋譜ソフトによって授業が行われていて、ブレークアウトルームに分かれた学生同士が口頭で打ちたい手を相手に伝えると言った状況でした。

# 作る

世の中に

元記事を表示

mongo-go-driverでクエリを書く時「primitive.E composite literal uses unkeyed fields」のwarningが表示される

## 概要
GolangでMongoDBを使うとなった時に、おそらく使用するのが[mongo-go-driver](https://github.com/mongodb/mongo-go-driver)でしょう。mongo-go-driverでは[こちら](https://github.com/mongodb/mongo-go-driver/blob/master/examples/documentation_examples/examples.go)のサンプルにある通り、`bsonD`という型にクエリの項目を入れていくのですが、この通りに設定していくと`primitive.E composite literal uses unkeyed fields`というワーニングが表示されます。
ワーニングなので、このままにしておいても良いのですが、ワーニングを消すためにどうすれば良いのかというのを今回書きます。

## 対応
[MongoDBの Offical Go言語 Driverを使ってみる(1)準備・Insert](https://qiita.com/h6591/items/f3a7c1

元記事を表示

LeetCodeに毎日挑戦してみた 122. Best Time to Buy and Sell Stock II(Python、Go)

#### Leetcodeとは

[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。

golang入門+アルゴリズム脳の強化のためにgoとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)

#### 31問目(問題122)

#### 122. Best Time to Buy and Sell Stock II
問題内容

> Say you have an array `prices` for which the *i*th element is the price of a given stock on day *i*.
>
> Design an algorithm to find the maximum profit. You may complete as many transactions as you like (i.e., buy on

元記事を表示

【Go】Qiita 週間 LGTM 数ランキング【自動更新】

# 他のタグ

[`AWS`](https://qiita.com/items/e24b6279326a462d456c) [`Android`](https://qiita.com/items/8b3af051428d746f26c5) [`Docker`](https://qiita.com/items/ae11fca7d2eba445b037) [`Git`](https://qiita.com/items/74eacdbf363e260981c3) [`Go`](https://qiita.com/items/49d4537d95f878b3e91a) [`iOS`](https://qiita.com/items/e61a29a383d0403e92fc) [`Java`](https://qiita.com/items/4c3f84836bfdbb137226) [`JavaScript`](https://qiita.com/items/eaa7ac5b62a0a723edbb) [`Linux`](https://qiita.com/items/362e81e53c3f

元記事を表示

YAML+Mustache+go-generate で go の メタプログラミング をする

※この記事は、[CyberAgent PTA Advent Calendar](https://adventar.org/calendars/5741) 2020の24日目の記事です。

株式会社AbemaTV ビジネス開発本部 で広告システムのエンジニアをしています @shunta-furukawa です。
今日はクリスマスイブですね。メリークリスマスイブ!!

# はじめに

さて、[AJA SSPとその技術について](https://qiita.com/_tarof/items/3d568a23dba9b11b9ebe#go%E8%A8%80%E8%AA%9E)、でも触れられていましたが、サイバーエージェントで作られるシステムで Go言語が用いられることは多いです。

Go言語は、他の言語と比べて 言語仕様がシンプルなためハイパフォーマンスを出しつつも 扱いやすいために人気がある言語だと思います。反面、抽象化された賢い記法などがなく、記述量が多い言語でもあると思います。

– 書いていると気付いたらもう夜に…
– どうにか実装スピードをあげたい…

そんな時に、`go

元記事を表示

OTHERカテゴリの最新記事