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

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

Google Cloud Platform, Cloud FunctionsでつくるLINE Bot(3)

前回にオウム返しBotの最低限の機能を実装しました。
しかし、今の実装ではLINEプラットフォーム外からのアクセスも受け入れてしまう問題があります。
LINEプラットフォームからのアクセスだけ処理するように実装を改善します。

# 実装方針
[署名を検証する](https://developers.line.biz/ja/reference/messaging-api/#signature-validation)のとおり、以下の値が一致することを確認します。
不一致の場合には、処理を中断します。

1. HTTPヘッダー `x-line-signature` の値
1. ダイジェスト値

– ダイジェスト値 の計算式は以下のとおりです。
“`
Base64(HMAC-SHA256(リクエストボディ、チャネルシークレット))
“`

– LINE Developersのコンソール画面でチャネルシークレットを入手できます。
– チャネルアクセストークンと同様に、Secret Managerに登録しておきます。

– HMAC-SHA256の計算には [pkg.go.dev/cry

元記事を表示

Google Cloud Platform, Cloud FunctionsでつくるLINE Bot(2)

第1回でCloud FunctionsとLINE Botを作成し、Cloud Functionsにログの出力されることを確認しました。
第2回では受信したメッセージをそのまま返信する機能(オウム返し)を実装します。

# 完成イメージ

![line-parrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1950110/4747a1f0-71aa-d6b1-59fa-64482a76d1e0.png)

# メッセージを受信する

受信するWebHookは以下のようなJSONになっています。
[Messaging APIリファレンス](https://developers.line.biz/ja/reference/messaging-api/#message-event)も参考にしてください。

“`json
{
“events”: [
{
“source”: {
“userId”: “U8510be0371fb4cf398a62d75

元記事を表示

Google Cloud Platform, Cloud FunctionsでつくるLINE Bot(1)

Google Cloud Platform(以下GCP)のCloud FunctionsでLINEのBotを作成します。
プログラミングにはGo言語を使用します。
以下、全4回の予定です。

1. (本記事)LINE BotとCloud Functionsの作成
1. オウム返しBot
1. セキュリティ強化
1. セッション管理(BMI計算Bot)

第1回の目標は以下の通りです。
– Cloud Functionsを作成する。
– LINE Botを作成する。
– Cloud Functions側でアクセスログの出ていることを確認する。

# Cloud Functionsを作成する

HTTPリクエストをログに出力するだけの簡単なCloud Functionsを作成します。
[Cloud Functionsのチュートリアル](https://cloud.google.com/functions/docs/create-deploy-gcloud?hl=ja#functions-prepare-environment-go)にあるものを少しカスタマイズします。

“`go
pac

元記事を表示

【Go言語】コマンドについて

こんにちは。
新卒入社3年目文系出身のエンジニアです。
今回は、goのコマンドについてお話していきたいと思います。

#### 環境変数の確認
このコマンドを入力すると、goファイルの環境変数を一覧で表示してくれます。
“`
go env
“`
また、環境変数を何かしらの値で変更したいときは、以下のコマンドを使用します。
“`
go env -w 変更したい環境変数名=値
“`

#### ソースコードの整形
インデントの乱れがあるファイルに、「go fmt」を入力すると、
綺麗にコードが整形でき、大変便利です。
“`
go fmt 実行したいファイル名
“`

#### テスト実行
「go test」を入力すると、テスト結果が返ってきます。
「go test -v」を入力すると、テストの結果がさらに詳しく表示されます。
“`
go test
“`
“`
go test -v
“`

#### モジュール関連
開発の最初に以下のようなコマンドを入力します。
“`
go mod init モジュール名
“`
以下のように、go.modというファイル名が出来上がり

元記事を表示

【Go】http.Handlerとか色々整理

## はじめに

Goを学習していると、HandleだとかHandlerだとか色々出てきて混乱するのでその整理。

## 早見表

| 名称 | 分類 | 概略 |
|:-|:-:|:-|
|http.ListenAndServe|関数|プログラムをWebサーバーとして起動|
|http.Handler|インターフェース(型)|ServeHTTPメソッドを持つ|
|http.Handle|関数|Handler型の関数をパターンに応じて実行する|
|http.HandleFunc|関数|func(ResponseWriter, *Request)型の関数をパターンに応じて実行する|
|http.HandlerFunc|型|ServeHTTPメソッドを持つ|
|(f HandlerFunc) ServeHTTP|関数|fを実行する|

## ハンドラーって何?

ドキュメント等を読んでいると頻繁にハンドラーという言葉が出てくるが、これはHTTPリクエストに応じてHTTPレスポンスを返す関数。
GoではServeHTTP(ResponseWriter, *Request)という関数のことであ

元記事を表示

[]byte(“a”, “b”, “c”) でエラーがでる理由わかる?正しい書き方は?

## やりたいこと

文字をバイト型のスライスに入れたいのですが、`[]byte(“a”, “b”, “c”)` はエラーがでます。

“`
too many arguments in conversion to []byte
“`

ふむふむ。引数が多いのか。。
エラーにある通り引数を一つにすればエラー回避できるのですが、どういう仕組みなのかを見ていきましょう。

## `[]byte(値)` ← 丸いかっこ と `[]byte{値}` ← 波状のかっこ の違い

### 丸いかっこを使う「型(値)」は、型変換をする

丸いかっこを使う「型(値)」は、型変換を行う表現です。
(記事にしているのでよかったら見てください。? )

https://qiita.com/yNavS4Ki/items/58dd2771ffa5effa4a40

なので、`[]byte(値)` は、() 内の変数を、バイト型のスライスに変換する表現になります。

なので、複数の値を渡すのではなく `[]byte(“abc”)` とすれば、エラーはなくなります。
→ string 型 “abc” を byt

元記事を表示

[Go] 型変換 & 型アサーション の使い方がすぐに思い出せない場合は、こちらから公式サンプルページへ

## 型変換 (Type Conversion)

変数v, 型T があった場合、T(v) は 変数v を T型へ変換します。

“`go
i := 42 // int

// 型(変数) で型変換
f := float64(i) // float
u := uint(f) // uint
“`

A Tour of Go のページ

https://go-tour-jp.appspot.com/basics/13

The Go Programming Language Specification のページ

https://go.dev/ref/spec#Conversions

## 型アサーション (Type Assertion)

インターフェース型i を 型T に変換

“`go
// t, ok := i.(T)

var i interface{} = “hello”

s, ok := i.(string) // s は string 型 で “hello” を保持
fmt.Println(s, ok)
“`

A Tour o

元記事を表示

モンテカルロ法で円周率を求める場合の考え方メモ

勉強会で[問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本](https://gihyo.jp/book/2022/978-4-297-12521-9)を読んでいる。
モンテカルロ法の節が一回では理解できなかったのでメモ。

## モンテカルロ法とは

– 数値計算の手法の一つ。
– ランダムな数を使う。
– [ジョン・フォン・ノイマン](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%95%E3%82%A9%E3%83%B3%E3%83%BB%E3%83%8E%E3%82%A4%E3%83%9E%E3%83%B3 “ジョン・フォン・ノイマン”) が名付けた。
– モナコ公国の都市モンテカルロから取った。
– カジノで有名な都市とのこと。

https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%AB%E3%83%AB%E3%83%AD%E6%B3%95

## 考え方
– 辺の長さが1の正方

元記事を表示

Goに入門してみた(自分用学習メモ)

会社でなんかGOやるかもしれない…という話を聞き
個人的にも気になってはいたので(シングルバイナリのプログラムをクロスコンパイル出来るという部分)
入門してみることに

# まず、GOとはからググることに(Wikipediaを読んでみよう
https://ja.wikipedia.org/wiki/Go_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)
> Goはプログラミング言語の1つである。Googleにおいて2009年~~設計された
> マスコット・キャラクターはGopher(ホリネズミ)

あのキャラクター、「Gopher」というらしい

>言語の正式名称はGo

GOでもgolangでもなく「Go」だそう

# ふーんって感じなので、まずは基本を学んで見る
https://go-tour-jp.appspot.com/welcome/1

## packages
goのプログラムはパッケージで構成される
プログラムのエントリポイントはmainパッケージ(mai

元記事を表示

2023年だし日本語勉強する

# あけましておめでとうございます(*1)

2023年が明けました!素数の年ですね!(大嘘)

最近勉強をさぼりがちなので、本からインプットを受ける題材でプログラムを組んでみる。
去年影響を受けたのが

+ ゆる言語学ラジオ
+ ずんだもんのRTA

なので、「日本語xずんだもん」に関する物とする。今回は会話の相手をずんだもん化させる。

zundamon
著作権が怖いので、ぼかしてます

会話の中に組み込むシステムなので会話の真ん中にシステムが来るイメージ。

“`mermaid
sequenceDi

元記事を表示

gRPCに入門してみた

## 参考ドキュメント
– https://developers.google.com/protocol-buffers/docs/overview
– https://grpc.io/docs/languages/go/quickstart/

## 必要なツール
– golang
– 1.19.2
– cli
– protobuf
– goenv
– go module
– [google.golang.org/grpc](https://github.com/grpc/grpc-go)
– goのgRPCの実装
– [google.golang.org/grpc/cmd/protoc-gen-go-grpc](https://github.com/grpc/grpc-go/tree/master/cmd/protoc-gen-go-grpc)
– goのgrpcコードの生成ツール

## 環境準備

“`sh
$mkdir $WORKSPACE
$cd $WORKSPACE
$brew install protobuf
$goenv loca

元記事を表示

【Golang】プロセカのリザルト画像からスコアをまとめるプログラムを作った話

# はじめに

 どうも、Shakku です。
 都内某高専の情報科2年生です。(2023/1/25時点)
 バックエンドのエンジニアを目指すべく、Go言語を個人でお勉強中です。
 今回はじめてQiitaの記事を書いてみるので、誤字脱字や変なところがあると思いますがお許しを…

# 制作経緯

 普段[プロセカ](https://pjsekai.sega.jp/)をプレイしていて、楽曲ごとの良かったリザルトを見返したいなーと思った時がよくあります。

>
>惜しかったリザルト

 スクリーンショットを撮ったりTwitterに投稿したりはよくしますが、昔に出したリザルトを振り返るときはちょっと面倒なんですよね。
 また、ゲーム内の機能ではキャラ育成面でのハイスコアしか振り返れません。

 そこで、Go言語の勉強も兼ねて、

元記事を表示

goqu – SELECT 編

## 概要

* [goqu package – github.com/doug-martin/goqu/v9 – Go Packages](https://pkg.go.dev/github.com/doug-martin/goqu/v9)
* [doug-martin/goqu: SQL builder and query library for golang](https://github.com/doug-martin/goqu)

goqu は SQL ビルダー。
SQL 文を動的に生成したいときに便利。

## 基本

~~~go
package main

import (
“fmt”

“github.com/doug-martin/goqu/v9”
)

func main() {
sql, params, err := goqu.From(“user”).ToSQL()
fmt.Printf(“%s %v %v”, sql, params, err)
}
~~~

以下の SQL が生成される。

~~~sql
SELECT * FROM “user”

元記事を表示

Microsoft AzureでGo + Gin + GormのWebアプリケーションをデプロイする

# あらすじ
Microsoft Azureを使用したGo + Gin + GormのWebアプリのデプロイができたので、メモ程度に書き込みます。

## 環境
・Mac OS
・Microsoft Azure
・Visual Studio Code

# Microsoft Azure操作
## アカウントの作成、またはログイン
[Azure公式サイト](https://azure.microsoft.com/ja-jp/free/search/)でアカウントの作成、またはログインを行う。

## Webアプリの作成
[Webアプリ]の[作成]を選択
![Screen Shot 2023-01-23 at 22.00.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3039114/66457293-08e3-4065-8fc9-1361014f27d5.png)

[基本]画面の各種項目設定後、[確認および作成]ボタンクリック後、作成
例)
![Screen Shot 2023-01-23 at

元記事を表示

Go言語でLVMを操作して、論理ボリュームやスナップショットを作成

Linux の 仮想化ソフトウェア Libvirt/KVM を利用する時に、ネットワークの仮想化では Open vSwitch (OVS) があり、ストレージの仮想化は Logical Volume Manager (LVM) を併用すると便利な環境が作れる。これは仮想化環境で利用するために、LVM を Go言語で操作する方法について検討したメモである。

## LVMの概要とスナップショットボリューム

LVMは、外部ストレージ装置の助けを借りずにLinux OS で、ディスクドライブの2重化 や RAIDアレイ を構成する機能を提供して、ドライブなどのハードウェアが故障した時に、保存したデータを失う事態を回避することができる。さらに、論理ボリュームのある時点の状態を固定化したスナップショットを作成することができる。このスナップショットボリュームを更新しても、元になった論理ボリュームのデータが変更されることは無い。スナップショットの元になったオリジンボリュームに変更を加えても、スナップショットボリュームの内容が書き換わることが無い。

そのため、スナップショットは、バックアップ、テ

元記事を表示

React:簡易APIクライアント

作成:2023年1月24日
体重など健康データを保存するアプリとバックエンドを作ってみたく、バックエンドをGo、フロントエンドをReactで作成予定です。
前回の記事で[Goで簡易APIサーバー](https://qiita.com/RYO_/items/14f3ffd5b44ef95da9ac)を作りましたので、今回はReactで簡易APIクライアントを作成します。

# React簡易クライアント
Reactのプロジェクトを作成します。
“`
% npx create-react-app api-react
“`
フォルダapi-reactの中で実行します。
“`
% yarn start
“`
実行できました。

axiosをインストールします。
“`
% yarn add axios
“`
[React で

元記事を表示

【Go】テスト時にno such file or directoryエラーとなる。

## やったこと

・下のようなcsvファイルを読み込む処理があり、テストを実行すると、csv/sampleファイルが存在するにもかかわらず、no such file or directoryエラーとなる。
・go run コマンドで実行すると問題なく処理できる。

“`readCsv.go
func (b *boxerService) CreateBoxers() error {
fpath := “csv/sample.csv”
f, err := os.Open(fpath)
if err != nil {
logger.Info(“Error while opening sample.csv: ” + err.Error())
}
defer func() {
f.Close()
}()
~ 中略
return nil
}
“`

### パッケージ構成

“`
┌ csv
│ └ sample.csv
└service
└ readCsv.go
“`

## エラー内容

“`
Error while opening sam

元記事を表示

Golangの学習環境を爆速で構築する【Docker】

## はじめに
普段はLaravelを使って開発をしているのですが、静的型付け言語も学習してみたいと思い、Golangの学習を始めました。そこでGolangの学習環境を構築したので、記事にします。

今回作成した環境のコードはGithubにあげているので、良ければクローンして使ってみてくださいね。

P.S. スターなんかを付けてもらえると泣いて喜びます・・。

■Golangの学習用環境はこちら

https://github.com/fumiakikobayashi/go-learning-environment

## 本環境の使用方法 〜初回セットアップ編〜
※ 事前にDocker Desktop for MacやDocker Desktop for Windowsなどでご自身のPC環境にDockerのインストールは済ませておいてください

はじめにリポジトリをクローンして、対象のディレクトリに移動します
“`
$ git clone https://github.com/fumiakikobayashi/go-learning-environment.git
$ cd go

元記事を表示

好きな言語でプラグインが実装できる?Extismを触ってみた

# TL; DR

– [Extism](https://github.com/extism/extism) で、手軽にアプリケーションに3rd-partyのプラグインを挿せるようになる!
– プラグインはアプリケーション本体と異なる言語で書いてもOK
– プラグインをWASMへコンパイルすることで実現

# はじめに

ネットを徘徊していたら、WASMを使った面白いプロダクトを見つけました。

https://extism.org/

アプリケーションの機能を追加するためのプラグインを、(アプリケーションの利用者が)作成できるようにするためのシステムです。
特徴的なのは、WASMを使うことで **アプリケーション本体とプラグインを別の言語で実装できる** 点です。利用者は自分の好きな言語を使って機能拡張が可能です。

開発の背景として、アプリケーションのコミッターが新機能の要望でつぶれてしまわないように、利用者側で3rd-partyのプラグインを開発できる土壌を用意したいという思いがあるようです。

([公式ページ](https://extism.org/docs/overv

元記事を表示

“Preemptive interface Anti-Pattern in Go” とは?

# はじめに

`Go`には`Preemptive interface Anti-Pattern in Go`という考え方があります。

https://medium.com/@cep21/preemptive-interface-anti-pattern-in-go-54c18ac0668a

私はこちらの記事を読み初めて知りました。

ただ、原文を読んだだけでは理解が難しかったので自分なりに手を動かして自分の言葉で整理してみたのが本記事の内容となります。
英語力に自信がなく、自動翻訳の力を借りています。また、間違っている可能性もあるため真の情報としては原文のご確認をお願いします。
(本記事の内容が間違っていたらご指摘のほどお願いします。)

# TL;DR

– `Preemptive Interface`という実装パターンがあります。
– `Java`のような`interface`を明示的に継承させる必要がある言語では有効となります。
– `Go`では`interface`は暗黙的に継承されるのでそこまで有効ではありません。

# `Preemptive Interface`とは

元記事を表示

OTHERカテゴリの最新記事