- 1. 【Go言語】Katana使ってみた
- 2. Mattermost をフル活用するために Mattermost の拡張機能を調べてみた
- 3. 【認証機能バグ】Apple IDを利用したログインができなくなった
- 4. Go言語でAWSを操る: パッケージsessionについて
- 5. Go言語における「nil」とゼロ値の理解
- 6. Goのスライスの定義で少しハマったこと
- 7. Go言語でSlackのOAuth2認証を使ってみた
- 8. Ruby + Goで魔法のスプレッドシートの更新を通知するSlackAppを作ってみた
- 9. Go言語でマイグレーションしたらエラーが出た
- 10. [技育CAMPキャラバン]GitHubの統計情報を用いたユーザーのランク付け
- 11. 【JavaScript】let宣言は for ループに特化される
- 12. cobraとhuhを使って毎日のニュースをチェックできるCLIアプリを作ってみるハンズオン
- 13. goのfor文を用いて構造体に変数代入しようとしたら頭を抱えた話
- 14. Go言語で実装するダイクストラのアルゴリズム: 重み付きグラフでの最短経路探索
- 15. [Go言語]ワーカープールパターン並列処理 メモ
- 16. Go言語における nil の利用時の注意点
- 17. GO言語における nil と null の違い
- 18. 【Git】モノレポ時のDev Containerにおけるバージョン管理
- 19. 楽天トラベルAPIを使ってみた
- 20. GoでgRPCサーバーを立ててみる4(service.go、server.goの実装)
【Go言語】Katana使ってみた
# katanaとは
https://github.com/projectdiscovery/katana
Project Discovery社が開発したOSINTのWebクローラーツール。
OSINTとは、*Open Source Intelligence*の略で、公開されている情報を収集・分析する手法の1つ。意図しない情報が公開されていた場合、サイバー攻撃に用いられる可能性がある。# Katanaでなにができる?
* 高速かつ完全に構成可能な Web クローリング
* 標準モードとヘッドレスモードのサポート
* JavaScriptの解析・クローリング
* カスタマイズ可能な自動フォーム入力
* スコープ制御(正規表現などによるフィルタリング)
* JSON形式やファイル形式の出力
* STDIN、URL、複数URLのリストによる入力# インストール
以下コマンドでインストールする。
“`
go install github.com/projectdiscovery/katana/cmd/katana@latest
“`# 使い方
`-h`をつけるとオ
Mattermost をフル活用するために Mattermost の拡張機能を調べてみた
## この記事の目的
以前 Slack の拡張機能を調べたので,Mattermost の拡張機能も確認します.
https://qiita.com/caunu-s/items/5981d6faff2a3736abb0
本記事は Mattermost の起動方法,拡張機能の検証,Slack との比較をまとめたものです.
:::note info
こちらの記事を参考にして,Mattermost サーバーの構築および Plugin や Apps framework の開発を行うことができます.
:::## 構成
![mattermost-network-architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997806/431a7fb7-74b7-2d38-5dd6-affe1dbf6276.png)
本記事では様々な経路・構成を用いて接続を検証しています.
(結果として図が複雑化してしまいましたが…) 通信経路の自由度が高いことがよくわかると思います.## サービ
【認証機能バグ】Apple IDを利用したログインができなくなった
## シチュエーション
ある日、これまで利用できていたAppleIDを利用した認証機能が利用できなくなった。
AppleIDを利用して認証するユーザーはサービスを利用することができない。
早期に問題の解決を求められる。– ログインをしていないため、UserIDでログを絞り込むことができない
– [Appleのシステム状況は問題発生していない](https://www.apple.com/jp/support/systemstatus/)
– Twitterなどを見てもAppleIDでログインできないサービスは複数ある様子なぜ、認証機能がうまく動作しないのだろうか?
## 問題箇所
> email_verified
A string or Boolean value that indicates whether the service verifies the email. The value can either be a string (“true” or “false”) or a Boolean (true or false). The system may n
Go言語でAWSを操る: パッケージsessionについて
—
Go言語でAWSを操る: パッケージsessionについて
—**とあるバンドマン**
_「いやー、いいセッションだったね」_
_「こちらこそ、魂が震えるライブだった」_
_「それにしてもこんな所で、こんな良いギタリストに出会えるとは」_
_「私こそ!こんなに良いドラマーに出会えるとは」_
_「いやー」_
_「いやー」_
_「「ここが異世界でなければなー」」_
_「あの私たちをひいてきたトラックの
Go言語における「nil」とゼロ値の理解
Go言語では、変数に初期値を割り当てずに宣言すると、その型のゼロ値が自動的に割り当てられます。この機能は、プログラムのバグを減らし、初期化の手間を省くことに役立ちます。
### 基本型のゼロ値
– 整数型(int, int8, int16, int32, int64 など): ゼロ値は 0 です。
– 浮動小数点型(float32, float64): ゼロ値は 0.0 です。
– 論理型(bool): ゼロ値は false です。
– 文字列型(string): ゼロ値は空文字列 “” です。### 複合型のゼロ値
– ポインタ: ゼロ値は nil です。これは、何も指していないことを意味します。
– スライス: ゼロ値も nil です。長さと容量がともに0のスライスを表します。
– マップ: ゼロ値は nil で、キーと値のペアが存在しないことを意味します。
– チャネル: ゼロ値は nil で、初期化されていないチャネルを表します。
– インターフェース: ゼロ値は nil で、どの具体的な値も保持していないことを意味します。
– 構造体(struct): 各フィールド
Goのスライスの定義で少しハマったこと
かなり初歩的な理解不足だったと思うのですが、忘れないために備忘録として残します。
## TL;DR
スライスの宣言だけと初期化は厳密には違い、nil sliceと空sliceの挙動が違うよという話## 何をしてしまったのか
以下のようなことを実現するつもりでした。
– 特定のスライスとスライスを組み合わせて、一つの変数(hogeList)にしてレスポンスを返す
– 空だった場合は`{“List”:[]}`でjsonで返却する
echoを使った簡単なイメージは以下の通りです。
“`go
package mainimport (
“net/http”“github.com/labstack/echo/v4”
)type (
Hoge struct {
ID int `json:”id”`
Name string `json:”name”`
}
HogeResponse struct {
HogeList []Hoge `json:”hogeList”`
}
)func main() {
e := echo.New()
e.GET
Go言語でSlackのOAuth2認証を使ってみた
## はじめに
前回は魔法のスプレッドシートの更新通知を流してくれるSlackAppを作成しました。
https://qiita.com/piny940/items/2f0126ad5d71775b3628
一般にSlack Appを公開するにはOAuth2.0認証をできるようにする必要があります。今回はGo言語でOAuth認証のためのサーバーを(サクッと?)立てる方法を解説していこうと思います。
完成したコードはGithub上で公開しているので参考程度にどうぞ。
https://github.com/piny940/magic-spreadsheet-notifier
## 環境
Golang 1.21.1
labstack/echo 4.11.4
slack-go/slack 0.12.3今回はechoを用いてサーバーを立てましたが、Ginとかを使っても大体同じようなコードになると思うので適宜読み替えてください。
## 手順
基本的に[ドキュメント](https://api.slack.com/authentication/oauth-v2)に従い実装
Ruby + Goで魔法のスプレッドシートの更新を通知するSlackAppを作ってみた
## はじめに
IT企業のインターン情報が多数掲載されている[魔法のスプレッドシート](https://magic-spreadsheets.pages.dev)ですが、新しい募集が掲載されても変更の通知を受け取ったり差分を確認する機能がないため、優秀な人材と企業がマッチする機会が損なわれるという課題を感じていました。そこで今回は、魔法のスプレッドシートが更新されたときにSlackに通知を流すSlackAppを作ってみました。
完成したコードはGithubで公開しているので参考程度にどうぞ。
https://github.com/piny940/magic-spreadsheet-notifier
SlackAppはこちらのサイトから追加できるようにしました。
https://magic-spreadsheet-notifier.piny940.com
## 技術選定
今回作るSlackAppの動作は写真のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3
Go言語でマイグレーションしたらエラーが出た
実行環境:mac
モデル、マイグレートファイルを作成後「GO_ENV=dev go run migrate/migrate.go」のコマンド実行でエラーが出ました。
`watashinomac-Pro-go-study % GO_ENV=dev go run migrate/migrate.go
gorm.io/driver/postgres
../go/pkg/mod/gorm.io/driver/postgres@v1.5.5/migrator.go:411:26: m.GuessConstraintInterfaceAndTable undefined (type Migrator has no field or method GuessConstraintInterfaceAndTable)`調べたところ、driver/postgres@v1.5.5のドライバーのバージョンを下げればいいとのこと。
go.modの
`gorm.io/driver/postgres v1.5.5`→ `gorm.io/driver/postgres v1.5.4`
と修正し再度実行し
[技育CAMPキャラバン]GitHubの統計情報を用いたユーザーのランク付け
# 概要
2024年2月3日に東京で行われた技育CAMPキャラバンハッカソンに参加しました。本ハッカソンにてGitHub統計情報からユーザーをランク付けして画像を生成するGitHub Personaを作成したのでその概要や感想を書こうと思います。
サービスURL: https://read-me-psi.vercel.app/
GitHubレポジトリ: https://github.com/tomoish/github-persona# サービス概要
GitHub Personaは、GitHubの統計情報を取得し、ユーザーに異世界系の世界観で役職とランクを割り当てるサービスです。以下はその一例です。
![result_tomoish.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507134/44d6bc32-d0b8-7f5e-6951-90ee413540d8.png)
# システム
今回は以下のような設計としました。![github-persona-system-desi
【JavaScript】let宣言は for ループに特化される
:::note alert
この記事でのGoの動作は、Go 1.21 の仕様に基づいています。
1.22 で、for の仕様に変更が入っています。
詳しくは、https://tip.golang.org/doc/go1.22 を参照してください。
:::# はじめに
次の記事を読んで、JavaScriptのfor文における`let`宣言のループ変数が各ループごとに異なる変数としてバインディングされる動作に違和感を覚えました。https://qiita.com/twrcd1227/items/e7541a196d6bc1422dac
以下では、違和感を覚えた理由と、調査を進めた結果たどり着いた結論について書いています。
# 結論
結論から言うと、JavaScriptの言語仕様において、`let`はforループに特化されるので、ループ本体のスコープ内でループ変数の作成・値のコピーがされることがわかりました。https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for#初期化ブロック
cobraとhuhを使って毎日のニュースをチェックできるCLIアプリを作ってみるハンズオン
# はじめに
こんにちは!最近はGoを集中的に触っているのですが、Goを使うと簡単にCLIアプリを作れることを知りました。本記事では、**cobra**と**huh**を使い、毎日の最新ニュースを取得し、LINEに通知してストックするCLIアプリをハンズオン形式で作ってみたいと思います。:::note
技術記事だけでなく、ちゃんとニュース記事も読むべし!というモチベーションです。
:::# 実装するもの
![news-cli.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2816396/28e84a20-a4cd-fc1c-ffda-4600d0bf2a1f.gif)コードはこちらです。
https://github.com/ayanami274/mynews-cli
# 使用技術
– go 1.21
– cobra v1.8.0
– huh v0.3.0
– News API v2
– LINE Notify API### cobraとは
cobraはCLIアプリケーションを作るた
goのfor文を用いて構造体に変数代入しようとしたら頭を抱えた話
# 問題
`User`構造体の`introduction`を`Introduction`構造体に代入しようとしたら、全て一番最後のプロパティの値が代入されてしまった
## ソースコード“`golang
package mainimport “fmt”
type User struct {
name string
age int
introduction string
}type Introduction struct {
introduction *string
}func main() {
users := []User{
{“Alice”, 25, “Hello, I’m Alice!”},
{“Bob”, 30, “Hi there, I’m Bob.”},
{“Charlie”, 22, “Greetings! I’m Charlie.”},
}
introductions := makeIntroductions(users)for _, introduction := range intr
Go言語で実装するダイクストラのアルゴリズム: 重み付きグラフでの最短経路探索
—
Go言語で実装するダイクストラのアルゴリズム: 重み付きグラフでの最短経路探索
—人は、生まれながらにして、ゴールが決まっている。
いつ、どこで、どのように死ぬのかが決まっているのだ。
問題はそれを最短経路で行くのか
遠回りしていくのか、だ。死ぬ時期が決まっているのなら
そこに深みを持たせるしか価値は見出せない。また、その経路も一つではない。
また、誰もどこがゴールかもわからない。
また、何に価値があるのかも決まっていない。
人生という名の迷路は
いかなるアルゴリズム、プログラムをもってしてでも解けないだろう。ただ一つ、我々が幸運なことは
この迷路には行き止まりがないという事だ。**目次**
– [1. ダイクストラのアルゴリズムとは](#1-ダイクストラのアルゴリズムとは)
– [2. コード例](#2-コード例)
– [3. おわりに](#3-おわりに)## 1. ダイクストラのアルゴリズムとは
ダイクストラ法(Dijkstra’s algorithm)とは、様々な
[Go言語]ワーカープールパターン並列処理 メモ
* Go言語におけるワーカープールパターン並列処理についてメモする。
## ワーカープールパターンとは
* 複数のタスクやジョブを効率的に処理するためのデザインパターン。
* 特定の数のワーカー(ゴルーチンなど)を用意し、これらのワーカーがタスクキューからタスクを取り出して並行処理することで、リソースの使用効率を最適化し、処理速度を向上させる。### 概念
“`mermaid
graph TD
A[タスクキュー] –>|タスクを提供| B(ワーカープール)
B –>|タスク1を処理| D[ワーカー1]
B –>|タスク2を処理| E[ワーカー2]
B –>|タスク3を処理| F[ワーカー3]
B –>|タスクNを処理| G[ワーカーN]
D –> H[結果]
E –> H
F –> H
G –> H“`
– **ワーカー**:
– 同時に実行されるタスクやジョブを処理する単位(スレッドやゴルーチンなど)。
– ワーカープール内の各ワーカーは、タスクキュ
Go言語における nil の利用時の注意点
Go言語では、nil は特定の型が値を持たないことを示すために使用されますが、その利用にはいくつかの重要な注意点があります。nil の利用時に考慮すべきポイントに焦点を当てます。
### 1. ポインタとnil
Go言語において、ポインタ型の変数はデフォルトでnilとなります。未初期化のポインタは、特定のメモリアドレスを指しておらず、注意して扱う必要があります。例
“`go
package mainimport “fmt”
func main() {
// int型の変数を宣言
var myInteger int// int型のポインタを宣言し、未初期化(nil)で初期化
var myPointer *int// ポインタがnilであることを確認
if myPointer == nil {
fmt.Println(“ポインタはnilです。”)
}// ポインタに変数のアドレスを割り当て
myPointer = &myInteger// ポインタがnilでないことを確認
if myPointer != nil {
fmt.Pr
GO言語における nil と null の違い
GO言語において、nil と null は似ているようで異なる概念です。これらの用語は、異なるプログラミング言語で使われることがあり、それぞれの言語において異なる挙動を示すことがあります。GO言語では、nil という用語がより一般的に使用されていますが、一部の文脈では null という言葉も見られることがあります。
### 1. nil の使用
GO言語では、nil は主に[ポインタ、スライス、チャネル、マップ、インターフェース](https://qiita.com/zhao-xy/items/4fcbf5b64eb4cbf23b6c)、関数などの特定の型の変数が値を持たないことを示すために使用されます。例えば、ポインタの初期値は通常 nil です。“`go
package mainimport “fmt”
func main() {
var myPointer *int
if myPointer == nil {
fmt.Println(“ポインタはnilです。”)
}}
“`“`
ポインタはnilです。
“`### 2. null の使用
【Git】モノレポ時のDev Containerにおけるバージョン管理
# はじめに
サービス開発、特にAPIをコンパイル言語で構築する場合、[Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)を用いると便利である。しかし、モノレポ構造でサービスを開発している場合、.gitリポジトリが親ディレクトリに存在することでVSCodeがリポジトリを認識しない。gitコマンドを利用する際にVSCodeをLocalでReOpenし対応可能だが、現実的でない。
今回はモノレポ構造の開発環境でDev Containerを用いた際にGitでバージョン管理を行う方法についてまとめる。# ディレクトリ構造
開発を行うにあたり、ディレクトリ構造の抜粋を以下に示す。
> root/
> ├ .git
> ├ .devcontainer/
> │ └ devcontainer.json
> ├ backend/
> │ └ build
> │ └ package
> │ └ Dockerfile
> └ d
楽天トラベルAPIを使ってみた
—
楽天トラベルAPIを使ってみた
—**食べ頃のプリン**
友達の髪が茶髪から色が黒みを取り戻し、プリンみたいな感じになってました。
「食べ頃だね」
と私がいうと
「あ、いい感じの焦がしプリンでしょ」
と言いました。
甘い プリンって いいよね
API……。**目次**
[1. 楽天トラベルAPIとは](#1-楽天トラベルapiとは)
[2. Go言語で簡単な実装してみた](#2-go言語で簡単な実装してみた)
[3. おわりに](#3-おわりに)# 1. 楽天トラベルAPIとは
APIでなんか遊んでみたいと思い、楽天トラベルAPIというものを使ってみました。
楽天トラベルAPIは、楽天トラベルが提供するウェブサービスの一つで、開発者が楽天の旅行関連のデータや機能を自分のアプリケーションやウェブサイトに統合することができるプログラミングインターフェースです。
まず、Rakuten Developersへアクセスし、アカウントを登録します。
[Rakuten Developers](https://w
GoでgRPCサーバーを立ててみる4(service.go、server.goの実装)
お疲れ様です。
今日は「service.go、server.goの実装」について部分いたします。
# service.goの実装
repositoryでやり取りしたデータをもとにgRPCのレスポンスを返すservice.goの実装をしていきます。
“`article/service/service.go
package serviceimport (
“context”“github.com/k88t76/GraphQL-gRPC-demo/article/pb”
“github.com/k88t76/GraphQL-gRPC-demo/article/repository”
)type Service interface {
CreateArticle(ctx context.Context, req *pb.CreateArticleRequest) (*pb.CreateArticleResponse, error)
ReadArticle(ctx context.Context, req *pb.ReadArticleRequest) (*pb.