Go製finderのfing

背景 find コマンドというファイルを検索するコマンドがあります。 これはとても有名なコマンドであり、ネットで検索すれば大量の使い方の記事がヒットします。 大量のオプションが用意されており、様々な方法でファイルを検索できる便利なコマンドです。(まぁ、そんなに複雑な検索をしたいかという疑問はありますが…。) 対して、fd という rsut製のファイルを検索するツールが存在します。これは find よりも使いやすくて速いことを目指して作られています。 fing の設計思想は fd とは異なります。 fing は find コマンドとの互換を目指して設計しています。 そのため、find で作成されている script ファイルにおいても fing に置換するだけで動作することを目標としています。(オプションの全網羅は諦めていますが…) fd 並に速くて、find と同じ使用感を目指して作成しました。 インストール Go で作成したため以下のコマンドでインストールが行なえます。 go install github.com/komem3/fing@latest 使い方 基本的には find コマンドを fing に置き換えるといいです。 例えば jpg ファイルの検索は以下のようになります。 fing -name *.jpg また、 fd の良いところである gitignore を反映してくれる機能もあります。 fd ではデフォルトでそのように動作しますが、fingでは -I オプションで指定します。 fing -I これは fing 特有ですが gitignore に書かれているが無視しないといこともできます。 エッジケースですが、僕が欲しかったため追加しました。-EI オプションをクエリとともに使用します。 以下のコマンドは gitignore に .envrc が書かれていても、.envrc が検索結果に表示されます。 fing -I -name ....

2022/04/30(作成日) · 2022/09/26(更新日)

Goのflagのboolにコールバック関数を渡す方法

Go の flag パッケージってとても便利ですよね。 CLI を作成するさいによくお世話になると思います。 しかし、bool のフラグに対して関数を渡せないのが不便です。今回はそれを解決する方法を紹介します。 ※go1.17 時点の方法のため、go のバージョンアップで使用できなくなる可能性があります。 bool 値を渡せないとは? flag パッケージには、flag.Funcというコールバック関数を受け取るものが用意されています。 func Func(name, usage string, fn func(string) error) 使い方は以下のような形です。 package main import ( "flag" "log" ) func main() { var arg string flag.Func("hello", "set string", func(s string) error { arg = s return nil }) flag.Parse() log.Print(arg) } $ go run flag.go -hello ok 2022/01/04 22:30:16 ok $ go run flag.go -hello ok -hello override 2022/01/04 22:30:23 override このコールバック関数で渡されている string の s は見ての通り実行時にフラグに対して指定した値になります。...

2022/01/04(作成日) · 2022/09/26(更新日)

pubsubトリガーのcloud functionを自動テスト

モチベーション pubsub トリガーの cloud function は非同期にリクエストを投げるため、同期的な API と比べ自動テストを行なうのが困難です(成功失敗のレスポンスが帰ってこないため)。 また、今回僕が作成した function は特に gcp 上でテストを行ないたいものだったため、この問題を真剣に考える必要がありました。 pubsub のリクエストの確認 まず、テストを導入するにあたって、テストで topic を push するさいの方法を確認します。 以下のような形で topic の push をします。 $ gcloud pubsub topics publish sample-topic messageIds: - '2134505983662900' 上記のようにレスポンスで返ってくるのは message の ID のみです。 この情報からどのように cloud function の成功失敗を取ってくるかが肝になります。 cloud function に渡される情報 次に cloud function を見ていきます。cloud function で実行される関数は以下のようなものです。 type pubSubMessage struct { Data []byte `json:"data"` } func ExampleFunction(ctx context.Context, m pubSubMessage) error { // 処理... return nil } この ctx から metadata 関数を使用することで、EventID を取得することができます。 これが先程の messageIds の値と一致します。...

2021/03/18(作成日) · 2022/09/26(更新日)

文字から画像を生成する

モチベーション 絵文字を作成する際は、普段こちらで行なっているのですが、できるならコマンドで実行したいなとか、もっとランダム要素あった方が楽しいのにな、と思ったので自分で作成してみました。 作成物 今回はコマンドと api のどちらでも動くものが作りたかったため、Go 言語で作成しました。作成したものはこちらです。 どんな感じの挙動になるかをぱっと見たい方は、https://wordimg-otho5yxlgq-an.a.run.app/wordimg を叩くと分かりやすいと思います。以下で軽く使い方の説明をやっていきます。 Http README に書いてある URL に対してクエリとして text を設定するとその text に設定した文字が絵文字として生成されます。試しに以下の URL を叩いてみると分かりやすいと思います。 https://wordimg-otho5yxlgq-an.a.run.app/wordimg?text=helloworld アクセスするたびに違う画像が表示されるはずです。下の画像も見る人によって変わるはずです。この見る人によって変わる画像ってのが面白そうっていう気持ちだけで作成しました。 他にもいくつかクエリを用意したので、試しに色々試してもらえるといいかもです。 ちなみに特定の行に文字サイズを収めたい時は size=j${line} のように指定して下さい。size=j1 と指定すると 1 行に、size=j2 と指定すると 2 行に収まるように文字サイズが決定されます。 CLI こちらは結構癖があります。適当に go のお作法でインストールしたら、使えるといわけでもありません。 go get github.com/komem3/wordimg/cmd/wordimg 絵文字の生成にはフォントのデータが必要です。デフォルトでは go のライブラリの goregular という中に含まれているフォントデータを使用して絵文字の作成を行ないます。そのため、当然のように日本語なんか文字化けします。 絵文字は日本の文化のため、絵文字を作成する方は日本語を使いたい方が多いと思います。その場合、適当な日本語が含まれるフォントファイル(ttf) を用意して引数で指定してください。 $ wordimg -m "こんにちは世界" -f ./SawarabiGothic-Regular.ttf アルファベットしか含まない文字の場合はフォントを指定する必要がないので以下だけで問題なくいけます。 $ wordimg -m "hello world" ちなみに、こちらも 1 行とかで収めたい場合は、size に j1 などと指定すると、収まるように文字サイズが決定されます。 $ wordimg -m "hello world" --size j1 感想 Go で絵文字作るのすごい面倒でした。ドキュメント無いに等しくて手探りすぎて辛かったです。昔 php でやったことあったので、ちょろちょろってできるかなって思ったんですが、いやーさすが go って気持ちになりました。 いつもお世話になっているサイトにはまだまだ機能が及ばないので、もう少し機能性豊かにできたらいいなと思っています。...

2021/02/13(作成日) · 2022/09/26(更新日)

一日数100件のRSSを Cloud Funciton で絞り込む

なぜ絞り込む必要があるか PR Times の RSS は一日 300 件近くニュースが飛んできます。これを普通の RSS リーダに登録すると PR Times で全て埋まります。テロです。 実際 slack に登録してみたところ、1 時間おきとかに、通知が 10 件飛んできて、とてもじゃないけど見る気になりませんでした。この中から絞り込んで欲しい情報だけの RSS にしたいというのが今回の目標です。 他の絞り込みツール こちらの記事が参考になります。この記事を読んでわかることは、PR Times やばいです。 実際にこの記事のツールを試してみましたが、PR Times がやばすぎて、zapier の上限に達したりとなかなか上手くいかなかったです。 Cloud Function で絞り込む そこで最後の手段の自作です。 流れとしては以下のような流れで絞り込みを行ないます。 今回は Go 言語の、RSS をパースするツールの mmcdole/gofeed と RSS を作成する gorilla/feedsを使用しています。 コードの全体はこんな感じ package rssfilter import ( "context" "log" "net/http" "regexp" "time" "github.com/gorilla/feeds" "github.com/mmcdole/gofeed" "github.com/pkg/errors" ) const feedURL = "https://prtimes.jp/index.rdf" var searchText = regexp.MustCompile(`Cloud|cloud|クラウド|IOT|DX|テクノロジー|GCP|Google`) func FilterRss(w http.ResponseWriter, r *http.Request) { if err := filterRss(w, r); err !...

2021/01/30(作成日) · 2022/09/26(更新日)

入力されたテキストを入れかえる

はじめに 簡単に形態素解析やりたいなーって探していたら、kagomeというものを見つけたので、それでちょっと遊んだ話です。 形態素解析とは まずは、形態素解析とは何ぞやという人もいるかと思います。wiki には以下のように記述されています。 形態素解析(けいたいそかいせき、Morphological Analysis)とは、文法的な情報の注記の無い自然言語のテキストデータ(文)から、対象言語の文法や、辞書と呼ばれる単語の品詞等の情報にもとづき、形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの形態素の品詞等を判別する作業である。 簡単に言うと、文章を「単語」や「助詞」などに分割して解析することを形態素解析といいます。 日本語は英語と違い単語や助詞で区切られていないため、日本語に特化した形態素解析の研究が行なわれており、様々なツールが存在します。 代表的なもので mecabというものがあります。 ですが、今回は go 謹製の kagome を使用します。 kagome の使い方 公式ドキュメントにざっくりと書いてあるのは以下のコードです。 package main import ( "fmt" "strings" "github.com/ikawaha/kagome-dict/ipa" "github.com/ikawaha/kagome/v2/tokenizer" ) func main() { t, err := tokenizer.New(ipa.Dict(), tokenizer.OmitBosEos()) if err != nil { panic(err) } // wakati fmt.Println("---wakati---") seg := t.Wakati("すもももももももものうち") fmt.Println(seg) // tokenize fmt.Println("---tokenize---") tokens := t.Tokenize("すもももももももものうち") for _, token := range tokens { features := strings.Join(token.Features(), ",") fmt.Printf("%s\t%v\n", token.Surface, features) } } 上記の出力は以下です。...

2020/11/27(作成日) · 2022/09/26(更新日)