- 1. 【Go】学習メモ① ~Structs, ポインタ, Slice, Map, Interface~
- 2. fmt.Printfは中身をstringしないとエラーになる
- 3. go チャネルから送る値がなくなっても チャネルから値を繰り返し受信し続けることによるエラーの確認。
- 4. Goの基本
- 5. GO goroutineを玉入れ競争に例えて理解しようとする
- 6. Goをherokuで自動実行する
- 7. 後方互換性と和解せよ
- 8. New Relic Goエージェントの地雷は踏んでおいたので参考にしてくれ
- 9. OpenTelemetryをざっくりと知る
- 10. Next.js+Goでクイズアプリを作ってみる
- 11. deepmap/oapi-codegen のカスタムテンプレートで required array が null で返ってしまうのを防ぐ
- 12. 行列の積で見る2次元配列の例(Julia, Go, Rust)
- 13. sql.Openを別の関数に切り出したら「sql: database is closed」エラー
- 14. Go言語のinterfaceっぽいC++のクラスを自動生成するツールを作った話
- 15. 【業務】Goが触りたいなぁってお話
- 16. Goでファイル検索を行うサーバーを立てる
- 17. Go 言語で Mattermost Bot を作成する
- 18. 気象庁サイトから取得したJSON天気データを使って明日の天気をLINEで送信する機能を作ってみた
- 19. カジュアルゲームをEbitenで作る
- 20. GoでPadding Oracle Attackしたい!
【Go】学習メモ① ~Structs, ポインタ, Slice, Map, Interface~
#はじめに
調べれば星の数ほどでてくるGoの基礎をあえて自分用にまとめました。
現業のフロントエンドだけではなくバックエンドにも磨きをかけたいというのがGoの学習目的です。
基礎学習後は個人サービスつくって実践していきたいなと思っています。#Structs(構造体)
Goにはオブジェクト指向言語におけるClassがなく、その代わりにStructs(構造体)というものが存在します。
Structs型の変数を定義すると、Structsに定義されている各フィールドに必要なメモリ領域が確保され、それぞれのフィールドは型に合わせた初期値をとります。例えば、以下のように`person`というStructsをつくり、初期値を設定せずにそのまま出力してみます。
“`go:main.go
package mainimport “fmt”
type person struct {
firstName string
lastName string
}func main() {
mrSasuke := person{}
mrSasuke.print()
}func (p pe
fmt.Printfは中身をstringしないとエラーになる
go言語でfmt.Printfを扱う時にint型を表示しようとしてエラー出してしまうので、備忘録
“`go
package main
import (
“fmt”
“strconv”
)func main() {
var s string = “5”
// int型に変換
i, _ := strconv.Atoi(s)fmt.Printf(i) # こちらはエラーになる
// fmt.Printf(“%v”, i) # こちらはエラーにならない}
“`
実行結果
“`
# command-line-arguments
.\main.go:17:12: cannot use i (type int) as type string in argument to fmt.Printf“`
go チャネルから送る値がなくなっても チャネルから値を繰り返し受信し続けることによるエラーの確認。
closeしない場合のエラー内容確認
“`go
package main
import “fmt”
func routine1(int_slice []int, channel_kun chan int) {
sum := 0
for _, v := range int_slice {
sum += v
channel_kun <- sum } // close(channel_kun) } func main() { int_slice := []int{1, 2, 3, 4, 5} channel_kun := make(chan int, len(int_slice)) go routine1(int_slice, channel_kun) for i := range channel_kun { fmt.Println(i) } } ``` 実行結果 ``` 1 3 6 10 15 fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan r
Goの基本
## 前書き
Goを初めて学習する中で大事だと思った点をまとめました。ノート代わりの記事です。
主に[A Tour of Go](https://go-tour-jp.appspot.com/list)を参考にまとめました。
間違っている箇所がある場合は指摘していただけると幸いです。
## Go言語とは
Googleが開発したプログラミング言語。また、オープンソースであり [GitHub](https://github.com/golang) に公開されている。
#### 特徴
– 静的型付け
– コンパイル言語
– メモリ安全性
– ガベージコレクション
– 構造的型付け
– 並列処理
以下からは実際のコードを交えて、基本的な文法を紹介していく。出力はコメントアウトで示している。
## Import Packages
Goのプログラムはmainパッケージから開始されている。
複数のパッケージをインポートするときは、グループ化した方が美しい。
“`go
package mainimport (
“fmt”
“math”
)
“`これ以降
GO goroutineを玉入れ競争に例えて理解しようとする
## 玉入れ
田中君:1投あたり2秒
鈴木君:1投あたり1秒ルール
– 先に10球投げた方の勝ち → ゲーム終了
– 玉入れ先は別々ポイント
– waitするスレッドを1として、1つでも並列スレッドが完了した場合、プログラムを終了させる。“`go
package main
import (
“fmt”
“strconv”
“sync”
“time”
)type Tomodachi struct {
name string
per_throw_time int
greeting string
}var greeting = “よろしくお願いします”
var tanaka = Tomodachi{
name: “tanaka”,
per_throw_time: 2,
greeting: greeting,
}var suzuki = Tomodachi{
name: “suzuki”,
per_throw_time: 1,
greeting:
Goをherokuで自動実行する
## はじめに
ついにアドベントカレンダー最終日になってしまいました。
私のクリスマスは帰国によりホテルでの隔離生活であるため、時間だけがありました。ずっとGoを勉強したかったこともあり、この機会に入門しました。
丁度良いタイミングで中学の頃からの先輩がGoでLIFFアプリを開発していたので、こちらで勉強させていただきました笑。https://qiita.com/AsuyaKakegawa/items/2e8d27393f2955b32f6f
↑こちらの記事で作成したアプリをherokuにデプロイするところまでします。
## 作成したもの
↓LINEの友達追加から、デモがみれます。
![M_gainfriends_qr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/77b86edd-4cb3-810d-01cc-f4447865a076.png)
天気予報が雨であれば、毎朝6時に公式アカウントから通知が送られてきます。(写真はテスト実装なので、本来は6:00amになります。)
後方互換性と和解せよ
# 後方互換性ってなに?
みんな大好き信頼の塊 Wikipedia さんの「[互換性](https://ja.wikipedia.org/wiki/互換性)」の記事によると、後方互換性は以下のように定義されています。
> 古いシステム向けのデータなどが新しいシステムでも全て使用できること。
ソフトウェアの文脈では「ソフトウェアのバージョンをアップしても、それに依存する既存のソフトウェアが正常に動作すること」と読み替えられる場面が多いかと思います。
# Goと後方互換性
Go言語は伝統的に後方互換性を大事にしてきた言語です。それは [Go 自体](https://go.dev/doc/go1compat)についてもそうですが Go を使って書かれたソフトウェアについても Go Modules の導入時に後方互換性について[具体的な指針](https://go.dev/blog/module-compatibility)が打ち出されたりしたこともありました。最近であれば Rob Pike が Go 1.18 について「[標準ライブラリの内部実装は変えずにリリースしよう](http
New Relic Goエージェントの地雷は踏んでおいたので参考にしてくれ
# はじめに
この記事は[New Relic Advent Calendar 2021](https://qiita.com/advent-calendar/2021/newrelic “New Relic Advent Calendar 2021”)の25日目の記事です。
「[ミイダス](https://miidas.jp/ “ミイダス”)」という転職支援・採用支援サービスで、New Relic Goエージェントを導入した際に踏んだ地雷について、いくつかご紹介したいと思います。New RelicのGoエージェントはまだ新しいサービスで資料が少ないこともあり、いくつかの地雷を踏むことになるかと思いますが、それを乗り越えるととても幸せな世界が待っています。
弊社のサービスでは、New Relicを活用して、より良いサービスになるよう数々の処理の改善や障害の早期発見などに役立てています。APIの応答性能やエラー率を監視するダッシュボード作成例
![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/
OpenTelemetryをざっくりと知る
# はじめに
以前マイクロサービスの分散トレーシングを導入する機会を頂き、OpenTelemetryについて色々と調べていました。 そこで今回は備忘録も兼ねて、OpenTelemetryとOpenTelemetry Collectorについて概要をまとめてみました。
# OpenTelemetryとは
OpenTelemetryは、トレース、メトリック、ログなどのテレメトリデータの作成と管理用に設計された、API、SDK、ツール、および統合のセットです。ベンダーに依存しない実装を提供し、選択したバックエンドにテレメトリーデータを送信する方法を標準化することを目的としています。
OpenTracingやOpenCensusの後継にあたる新たな標準化ツールとなります。つい最近ですが、ついにv1.0が公開され、今後テレメトリデータを扱うツールとして広まっていくのではないのでしょうか。
## TraceとSpan
OpenTelemetryにおけるトレース情報は**Trace**と**Span**という概念で定義されています。
**Trace**: あるリクエストに対するSp
Next.js+Goでクイズアプリを作ってみる
## はじめに
### 概要
インフラエンジニアだった私が、開発の勉強をするためにクイズアプリを開発してみました。文法や実装の仕方の記事はいろいろとあるので、どのように学習したかを重点的に書いています。私の勉強の備忘録の記事になってしまいましたが、勉強方法が分からず困っている人の参考になれば幸いです。
### 対象読者
* 開発の勉強をし始めている人
* Go言語初心者
* Next.js, TypeScriptちょっとわかる人### 書いたきっかけ
* Go言語の製品やサンプルAppを多く見かけるようになったのでGo言語の勉強をしたくなった
* 部署内で技術用語を確認し合えるサービスがあったらいいなと思った
* Advent Calendarという目標と期限を決めて勉強したかった### 完成品
いろいろやりたいことはありましたが、とりあえず一問一答までとなりました。
題材はとりあえず私に身近なクラウドネイティブにしてみました。
deepmap/oapi-codegen のカスタムテンプレートで required array が null で返ってしまうのを防ぐ## はじめに
私が今関わっているプロジェクトでは、サーバーサイドにGo言語を採用し、Webフレームワークとして [labstack/echo](https://echo.labstack.com/) (以下、Echo) を採用しています。また、APIの定義を OpenAPI で行い、OpenAPI の定義から Echo のハンドラを一括登録するための関数やリクエスト/レスポンスの型を生成するために [deepmap/oapi-codegen](https://github.com/deepmap/oapi-codegen)(以下、oapi-codegen)を利用しています。
OpenAPI を利用する目的の一つとして、クライアントとサーバー双方が一意な解釈が可能な API 定義を参照することによって認識の齟齬なく開発を進められるようすることが挙げられます。しかし、 oapi-codegen が生成するコードを使用した際に、 required な array と定義されているプロパティについて null として返却してしまう問題があります。これによって、 OpenAPI による定
行列の積で見る2次元配列の例(Julia, Go, Rust)
# はじめに
別の言語の例を移植すると意外と考えさせられる。
環境
* The Go Playground (2021-12-23)
* Julia 1.6 (Julia Playground)
* Rust 1.5.7 (Rust Playground; rustc)Rust は手元に環境があるのだが、サンプル程度でプロジェクトを作ったりのが面倒なときは、Playground を利用する。
## Julia
計算科学用途な言語だけあって、こういうところは強い。
この宣言の時点で行列の型だと決めつけができる。“`julia
A = [1 2 1; 0 1 1]
B = [1 0; 0 1; 1 1]
println(A*B)
“`“`
[2 3; 1 2]
“`## Go
* 2次元配列
関数も含めてサイズを事前に決めておく必要があり、その結果、任意のサイズの行列の積を行う関数が作れない“`golang
package mainimport “fmt”
func mul(a [2][3]int, b [
sql.Openを別の関数に切り出したら「sql: database is closed」エラー
## エラー内容
“`go:main.go
package mainimport (
“database/sql”
“log”_ “github.com/go-sql-driver/mysql”
)func main() {
db := DbConnect() // 別の関数へ切り出しerr := db.Ping()
if err != nil {
log.Fatal(err) // → sql: database is closed
}
}func DbConnect() *sql.DB {
db, err := sql.Open(“mysql”, “root@tcp(localhost)/dbname”)
if err != nil {
log.Fatal(err)
}
defer db.Close()return db
}
“`
“`sh:zsh
$ go run main.go
2021/12/24 23:59:59 sql: database is closed
exit status 1
“`## 対処法
Go言語のinterfaceっぽいC++のクラスを自動生成するツールを作った話
初投稿記事です。
#結論
**・golangのinterfaceみたいなのをc++で自動生成するツール作ったよ**
**~~・よい子のみんなは普通にgolang使おうね~~**#動機
http通信のライブラリを書いていた
tcpとかsslとかを動的に切り替えたい
継承とかは使いたくない。
なんなら、他人の作った他のプロトコルでも好きにすげ替えたい。~~需要あるのか?~~
golangを勉強する -> interfaceめっちゃ便利
C++でも似たようなことしたい -> [Type Erasure](https://ja.wikipedia.org/wiki/%E5%9E%8B%E6%B6%88%E5%8E%BB)でできるな。
一応できた -> めんどくさいしDRY原則に反するぜ。
**そうだ、自動生成ツールを作ろう!**#前提:C++におけるType Erasureとは
テンプレートと継承を使って条件を満たす任意の型の値を動的に保持する技法で
標準ライブラリではstd::functionとかstd::anyとかstd::shared_ptrとかで使われている。
下のコードは
【業務】Goが触りたいなぁってお話
Googleが開発した『Go』
流行らないわけがない…
今色んな言語がこれから統合されていく予感がするんですよねぇ。。。実際リプレイス案件で
結構使われてるらしい…!(Javaみたいな感じ)#理想の技術習得
フロントエンド:TypeScript
バックエンド:Go, Java>フロントエンド界隈は半年で死ぬ技術もあるし
新規参画者も多い###デザインは Google を真似ればイイ
Goでファイル検索を行うサーバーを立てる
# はじめに
この記事はGo Advent Calender23日目の記事です。
ファイルパスを検索し結果をJSONで返すREST APIサーバーを立てます。
ひとまず動きのイメージを掴むデモです。![out](https://user-images.githubusercontent.com/16408916/143503512-6e172a98-f973-4c80-b1dc-99ea0ede0a71.gif)
検索窓に検索キーワードを入力し、検索ボタンを押すとlocateコマンドを走らせて、結果をブラウザに表示します。
本記事は[locate-server](https://github.com/u1and0/locate-server) v3.1.0の時点のREADMEを補完するドキュメントを記事としました。
この記事を読むために必要な知識を挙げます。
* Go
* Gin(フレームワーク)
* ShellScript
* `locate`(検索エンジン)
* `updatedb`(データベース)
* HTML5
* JavaScript
* jQue
Go 言語で Mattermost Bot を作成する
法政大学情報科学部 2 年の阿部哲也です。
今回は大好きな Go 言語で Mattermost の BOT を作成してみました。# Mattermost とは
Mattermost (マターモスト) とは、オープンソースのセルフホスティング式のチャットツール。
自分で構築する Slack みたいな感じ!
# Mattermost を Docker compose で構築
docker-compose が導入されていることを確認します。
“`
>> docker-compose -v
docker-compose version 1.16.1, build 6d1ac21
“`git clone で mattermost をクローンします。
“`
git clone https://github.com/mattermost/mattermost-docker.git
“`起動します。
“`
cd mattermost-docker
docker-compose up -d
“`なにも設定を変えていない場合は、http://localhost
気象庁サイトから取得したJSON天気データを使って明日の天気をLINEで送信する機能を作ってみた
# はじめに
今年も終わりが近づいてきましたね。今年はじめの2月に気象庁の天気予報のAPIが公開されたと話題になりました。正確にいうとAPIではなく、気象庁の気象情報ページで使われるJSONデータを取得できるらしいです。以下が実際のURLです。340000のところを該当する場所のコードにすればその場所の天気情報を取得できます。
https://www.jma.go.jp/bosai/forecast/data/forecast/340000.json
今回は、このJSONデータを使って天気情報を取得し、LINEで送信するというところまで実装していこうと思います。個人的に雨が降るか降らないかだけが重要で尚且つ、雨の時だけ天気情報を知りたいと思っているので、そういった実装をgolangでしていこうと思います。
![LINE_capture_661874734.264569.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869962/6ec6f95b-875d-472e-a5d6-50292912b7af.j
カジュアルゲームをEbitenで作る
[Go Advent Calendar 2021](https://qiita.com/advent-calendar/2021/go) (カレンダー2) 22日目の記事です。
#はじめに
「気軽にゲームを作る」をテーマに、2DゲームエンジンEbitenで1つ作品を作ります。EbitenはシンプルなAPIが特徴の、クロスプラットフォームで動く2Dゲームライブラリです。
詳しい機能や学習に役立つサイトなどは、
公式サイト
https://ebiten.org/
や別記事 [production-ready なGo製2Dゲームライブラリ Ebiten の紹介 & リンク集](https://qiita.com/eihigh/items/1fd6077327f99245b807)(@eihighさん) にありますのでぜひご覧ください。
また、本カレンダー13日目にもEbitenの記事 [はじめてのゲームプログラミング(Ebiten)](https://zenn.dev/hokita/articles/66cc118b227ae3)(@hokita222さん)があります。#プ
GoでPadding Oracle Attackしたい!
「 [Applibot Advent Calendar 2021](https://qiita.com/advent-calendar/2021/applibot) 」 22日目の記事になります。
前日は @ref3000 さんの [Unity でサクッと機械学習を体験してみよう【ML-Agents】](https://qiita.com/ref3000/items/40a0915fbc4478b5cadb)という記事でした。## はじめに
業務で暗号化に興味を持ってパディングオラクル攻撃という名前に惹かれたので今回はGo言語でパディングオラクル攻撃をやっていきます。## AES CBCモードについて
今回のパディングオラクル攻撃をする対象の暗号文はAESのCBCモードを使用して暗号化しました。AESは平文をブロック長ごとに暗号化するブロック暗号で、ブロック長が128bit、鍵長が128/192/256bitの3種類です。CBCモードは一つ前の暗号文ブロックと平文ブロックをXORとってから暗号化する方法で前のブロックに依存するため同じ平文であっても異なる暗号文になるため推測