schemesの応用って融合変換くらいしか知らなかったんですが身近なアルゴリズムの性質を表現できるのは面白いですね。自分で学ぶことで見通しよく効率化のアイディアを出せたりad-hocに見えていたアルゴリズムに横のつながりが見えてきて理解が深まりそうです。́・_・`)今回は今まで作ってきたボットや社内用サービスをまとめようと思います。内輪ネタっぽいですが、こういうのあると便利かもしれないというアイデアのきっかけになればと思います。似たようなのあるけどうちはもっと便利だぜ!っていうのあったらぜひ教えて下さい。gol新しく入社したメンバーに、consulのurlはこれで、prometheusはこれで、ああサービス画面はこっちで。教えることはよくあると思いますが、それぞれのリンクを覚えるのは結構大変だったりします。ドキュメント管理ツールにブックマーク集みたいなページを追加しても慣れてる人は使わないからメンテされない。なんてこともよく起こります。golはそれらの問題を解決するブックマーク共有&検索サービスです。まあ実際はただの管理画面付きkvsなんですが、結構便利だったりします。gとかでさっと検索できます。stg」と入れれば「consul_stg」だろうが「stg-consul」だろうがヒットしてくれるのが割と気に入っています。いう規約とか覚えるの面倒ですしね。ちなみにgoを書き始めて初めて作ったものなので実装はあれな感じになっています。emojislackの全ユーザーのiconを取得して、slackのemojiとして登録するものです。reactionにしても良しで社内の文化作り的にも良いです。emojiだと名字よりもちょっとほんわかしますしね。アイコン変更イベントを取ってきて自動で更新し続けてくれるデーモンにしようと思って100年くらいたってるので誰かお願いします(他力本願)というかこのemoji、公式で実装されて欲しいですね。projectにチケットを切ってくれるボットです。reacjiraってわけですね。アイコンはいらすとやで見つけたかわいいクジラです。みたいなemojiをつけてやるとチケットが作成されスレッドとして投稿されます。この際、チケットの中身として↓の画像のようにdescription欄にslackのスレッドのリンクがデフォルトで記載されます。reacjiraを使うと依頼を受けた際にすぐチケットを作成できて以下のようなメリットが生まれます。自作botだとjiraのあらゆるフィールドをいじったり、結構強引なルールを設定したりできるので便利です。最新masterまでのcompareリンクを生成してくれるというただそれだけのものです。compareリンク作るみたいなのは手間だったので一発で生成してくれるようにしました。jenkins叩くコードがすでに手元にあったので5秒くらいで完成したし、botデプロイ環境+token登録環境が割と整備されてるので思いついてサクッと作ってすぐデプロイみたいなことがしやすいんでこういう、微妙〜〜〜に不便ってのも解決できていいですね。脱jenkinsも含めて最高のジョブ基盤を作ろうとしています。それができたらjobdiff君は消え去ることになります。botこれも社内限定で便利なやつで、サービスディスカバリとして利用しているconsulから情報をとってきて、各環境の各サービスのバージョンを一覧として取ってきたり、ip+portを取ってきたりするやつです。「acから始まるサービス」のバージョン情報を取得します。*5サービス名は省略してもいいしフルネームでも大丈夫です。デプロイしたあとにちゃんと切り替わってるよね?といった確認に使ったり、トラブルシュートする際に参照したりしています。consulは今の所困っていないんですがServicMeshとか入ってきた時にうちのconsulが生き残るかは不明です。社内でも使ってもらえてるのを見るとちょっと嬉しいです。(新しく入ってきた方が早速使ってたりすると特に)これからも地味だけどあるのが当たり前みたいな便利さを目指して頑張っていきます。jobを定義できるやつ。Pipelineとは異なるもの。*4:なんでそんなものが必要なのか?みたいな背景書いたけど、社内でしか伝わらなさそうなので消しました。Noteに入れることで取得できるようにしています。純粋関数型データ構造)を読みながらScalaで実装を後追いしてみた。*1少し時間がかかったがRedBlackTreeやTrieといった有名な物から、HoodMelvilleQueueやそれを利用したCatenableListなどちょっとおしゃれ(?)なデータ構造についての実装・計算量についての考え方を学ぶことができた。本の前半はストーリーがあって、「永続的なデータ構造だと計算効率が悪い場合が多い!・・・が!償却計算量の考え方を使いながら実装を工夫していくと短命なデータ構造と同じくらいの性能が出る。(全てではないが償却だけでなく最悪計算量についても同じくらいにできるケースも多い)」ことを確認する旅になる。軽くまとめてみたので興味がある人はちら見しつつ、実際に本を購入して読んでみてほしい。https://gist.github.com/matsu-chara/75dd80e36172569343738153d0123bf2後半は様々なデータ構造を設計するための考え方がまとまっている。こちらについても雑多になっているわけではなく、前半の考え方(実装方法・計算量の証明方法)を踏襲しつつ、一個ずつ積み重ねになっているので読み応えがある。2進数のゼロ無し表現というものが途中に出てくる。{1,2}を使って書く記法のことだ。各桁が2^iを表すのは普通の2進数と同じ。0を使わないのが前提になるので、ある数を表す表現は一位に定まる一見特に意味のない記法に思えるが、これが記数法表現に基づくデータ構造の計算量の削減に役立つというのはなかなか面白かった。treeといえばHaskellのData.Sequenceにも使われている(償却)計算量の優れたDequeだ。考え方・実装の勘所はPFDSで学ぶ事ができる。*2読み終わったあとにwikipediaを開いてみたら、以前なんとなく理解していた物よりはるかに解像度高く理解できたので勢い余って実装してみた。treeの実装は世界に一億個くらいありそうなので特に自慢にもならないし、パフォーマンスやメソッドの豊富さよりはわかりやすさを重視している。(が、やはりこういうのは自分で実装してみると理解度が違うと思う。通りのテストを書いてみたがいい感じな見た目になったので記念スクショを貼って終わりとするテストnext本を読むなかでscalaでの実装をいくつかあたっていたところ以下のように、いくつかの実装には論文へのリンクがついていた。2019PFDSでカバーされている物もややありそうだけど面白そうなのでいつか読みたい。https://typelevel.org/cats/datatypes/eval.html*2:このデータ構造の実装自体は多少腕力があればwikipediaを見れば実装できそうだが、一方でなんでDigitといった名前が出てくるのか、このようなデータ構造での計算量の考え方はある程度背景知識がないと理解が難しい気がする。いってがっつりパースしたくなるログも特にないなーと思っていたりしました。よい感じのログが出ていました。0.2.0一行で出るとちょっと読みづらい感じとか前後のバージョンを取り出すのとか難しそうな感じが、マシンリーダブルではないけどちょっと頑張るとマシンリーダブルになりそうないい塩梅のログになっていそうです。普段なら以下のように改行を突っ込んでヒューマンリーダブルにするところで終わりにしちゃうんですが、今回はパースしてマシンリーダブルにしたいと思います。8.31といっても簡単なもんで以下のようにするだけです。","?brewに登録されるパッケージのバージョンは厳密なsemverとは異なり07や0_1のような文字列が利用されるので標準のver.semverは使わず空気を読んでパースしています。怪しい部分は都度テストに突っ込むとデグレチェックにもなるので便利です。してしまいスペースもpackageに飲み込まれるというデグレが起きるのを検知しました。)*2テストは以下のように行います。51},...(snip)}ASTがあるのでpackageだけ取り出すやらなんやらは自由にできます。.data)[]'llvm@6ocamllfspyenvtig...という感じで、日常にあるちょっとだけ取扱に困るログを取り扱ってみる回でした。aliasのテストがかけないような気がするけどもしかしたら書けるかも。15:33Tweet広告を非表示にするもっと読むコメントを書く次のページプロフィール間違ったことが書いてあったら@matsu_charaまでご連絡ください。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。