Slide 1

Slide 1 text

@2024-03-22 さくらインターネット 社内 Go Conference #1 リバースエンジニアリングとGoでSlackの 認知負荷を下げる

Slide 2

Slide 2 text

小 田 知央 / Tomohisa Oda @linyows • 福岡市在住 • Fukuoka.go 主催 • 趣味は筋トレとテニス • OSS: Octopass, Dewy, Rotion, Warp… • https://tomohisaoda.com • https://twitter.com/linyows

Slide 3

Slide 3 text

Slackにおける認知負荷の課題

Slide 4

Slide 4 text

新 人 のお仕事の 一 つはまず仲間を覚えること • 昨年11 月入 社、さくらインターネット研究所 未踏プロダクトグループに配属 • フルリモートにおいてコミュニティは主にSlack • チームや同じ部署の仲間はVideo Chatなどを通じ、実在する 人 と名前、 Slackのアイコンと名前が 一 致し覚えやすい • 仕事の領域を拡 大 しようとすると他部署のチャンネルを 見 て情報収集すること になる Slackにおける認知負荷の課題

Slide 5

Slide 5 text

他部署のSlackアイコンと名前覚えにくい問題 • アイコンが動物や 車 やアニメで 自 由(良いこと) • 人 とBotとの区別が瞬時につきにくい • 人 は物体より顔を認識し処理する能 力 が 高 く、顔の優越性効果と呼ばれる https://en.wikipedia.org/wiki/Face_superiority_effect • インターネット上のアイコンGithub、Twitterと同じであれば覚えやすい • しかし、統 一 されてないことが多い • リアルに集まる場合に顔と名前がまるで 一 致しない Slackにおける認知負荷の課題

Slide 6

Slide 6 text

ユーザのアイコンが顔以外の場合

Slide 7

Slide 7 text

VUBOBLBTBLVSB 0TIJSBTF UTBUPTBLVSB JTBUPTBLVSB ". ". ". 1. ϝϯςφϯεͷ࡞ۀ׬ྃ͠·͕ͨ͠ɺରԠ࿙Εͳ͍͔֬ೝ͓ئ͍͍ͨ͠Ͱ͢ʂ ຊ೔ͷϛʔςΟϯάͷϑΝγϦςʔγϣϯ͸!BZPTIJPLBͰ͢ "11 *EEDDFFͷσϓϩΠ͕੒ޭ͠·ͨ͠ɻݕূ࡞ۀΛ͓ئ͍͠·͢!EFWBUFBN 0TIJSBTF ". "11 ͖ͬ͞νϥݟ͚ͨ͠ͲΞϨ͕଍Γͯͳ͔ͬͨؾ͕͢ΔɻΞϨͬͯΞϨͩΑ ͓னௐୡ͖ͯ͠·͢ʂϚοΫʹ͠Α͏͔ͳʙ🍔

Slide 8

Slide 8 text

ユーザのアイコンが顔の場合

Slide 9

Slide 9 text

VUBOBLBTBLVSB 0TIJSBTF UTBUPTBLVSB JTBUPTBLVSB ". ". ". 1. ϝϯςφϯεͷ࡞ۀ׬ྃ͠·͕ͨ͠ɺରԠ࿙Εͳ͍͔֬ೝ͓ئ͍͍ͨ͠Ͱ͢ʂ ຊ೔ͷϛʔςΟϯάͷϑΝγϦςʔγϣϯ͸!BZPTIJPLBͰ͢ "11 *EEDDFFͷσϓϩΠ͕੒ޭ͠·ͨ͠ɻݕূ࡞ۀΛ͓ئ͍͠·͢!EFWBUFBN 0TIJSBTF ". "11 ͖ͬ͞νϥݟ͚ͨ͠ͲΞϨ͕଍Γͯͳ͔ͬͨؾ͕͢ΔɻΞϨͬͯΞϨͩΑ ͓னௐୡ͖ͯ͠·͢ʂϚοΫʹ͠Α͏͔ͳʙ🍔

Slide 10

Slide 10 text

当然、識別しやすかったのは顔でしたよね?

Slide 11

Slide 11 text

Slack上の認知負荷を下げたい!

Slide 12

Slide 12 text

リバースエンジニアリングを試みる

Slide 13

Slide 13 text

顔写真といえば社員証 • 社員証の顔写真はHR向けのSaaSの〇〇〇(以下H)にある • HはAPIを提供しているがAPIの利 用 権限がなさそう • とはいえブラウザでは 見 えているのでDevToolsのネットワークタブで通信を 眺める • 最近のWebサイトはClientサイドでレンダリングするアーキテクチャが多い ので 大 体内部APIをClientから叩いている • すると欲しい情報らしきendpointを 見 つけることができる リバースエンジニアリングを試みる

Slide 14

Slide 14 text

非 公開APIに必要な情報を探す • DevToolsを使ってendpointへのリクエストヘッダーやボディから通信に必要 な情報をまるっと抜き出す • POST methodであればボディは必須だろうし、ヘッダーはAuthorizationや Cookie、X-* みたいな拡張定義でCSRF tokenなどが必須になる • 雑にCurlコマンドを使って検証してみて、可変になっているparamsがないか チェックする(リクエストごと可変だと 面 倒) • あとPaginationの実装 手 法の確認など リバースエンジニアリングを試みる

Slide 15

Slide 15 text

15 PoC 社内向けにつきモザイク

Slide 16

Slide 16 text

顔写真をより良くする

Slide 17

Slide 17 text

社員証は 大 体仏頂 面 なので笑わせたい • 自 分の社員証を気に 入 っている 人 ばかりではないだろう • 誰であるか認識可能でNotionのあれみたいにデフォルメされた ものはどうだろうか • 全社員のデータをアップロードするわけにはいかないが試しに Stable Diffusionっでいい感じのものができるのか • Stable DiffusionのAPIは少なくとも520px以上が必要で使える のは120pxのため、Upscale APIの後にPromptで画像 生 成する 顔写真をより良くする /PUJPOͷΠϯλϏϡʔهࣄͷ ͨΊʹɺ/PUJPOͷΠϥετϨ ʔλʔʹॻ͍ͯ΋Βͬͨࢲͷ ΞΠίϯɻ

Slide 18

Slide 18 text

18 IUUQTQMBUGPSNTUBCJMJUZBJEPDTBQJSFGFSFODF API DocにGoのリクエスト例がある • Multipart form dataで画像をアップロードするだけ • 以下は簡略化のためにエラー処理を消している

Slide 19

Slide 19 text

19 Original 3d-model, analog- fi lm, anime, cinematic, comic-book, digital-art, enhance, fantasy- art, isometric, line-art, low- poly, modeling-compound, neon-punk, origami, photographic, pixel-art and tile-texture Style Presetを 色 々 試す

Slide 20

Slide 20 text

Promptが微妙なのもあるが、まるで違う 人 になっ てしまっていた

Slide 21

Slide 21 text

諦めて、画像のトリミングだけを 行 う

Slide 22

Slide 22 text

22 画像を正 方 形に切り取る • 標準の画像ライブラリで 手 軽に加 工 できる • 短い辺に合わせて両端を削除

Slide 23

Slide 23 text

そして、作った資産をもとにChrome Extensionを 実装(省略するが 一 番時間かかった)

Slide 24

Slide 24 text

成果物の紹介

Slide 25

Slide 25 text

デモンストレーション 成果物の紹介

Slide 26

Slide 26 text

まとめ • ClientサイドレンダリングのサイトはAPIが公開されていなくても内部APIを リバースエンジニアリングすることでなんとかできる • Goは標準ライブラリだけで 大 体なんとかなるため、個 人 的なポリシーとして は特別の理由がない限りコミュニティライブラリは使わず後 方 互換性ができ るだけ担保しやすいようにする • 認知負荷の軽減としての取り掛かりはできたが、Thread展開 用 のアイコンや プロフィールの表 示 対応などやるべきことはまだある