Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
mWWDC2017
Search
ahiru
May 27, 2017
Technology
540
0
Share
mWWDC2017
mikutter World Wide Developers Conference 2017 の資料
ahiru
May 27, 2017
More Decks by ahiru
See All by ahiru
tokaido lug 2019-03-09
na0ki
1
160
OSC名古屋東海道らぐLT
na0ki
0
690
osc hamanako 2017 LT
na0ki
1
130
OSC Osaka 2017 LT
na0ki
0
160
OSC Nagoya Tokaidou LUG LT
na0ki
0
160
Tokaido LUG 2016.02.20
na0ki
0
920
Other Decks in Technology
See All in Technology
[最強DB講義]推薦システム | 基礎編
recsyslab
PRO
1
160
データを"持てない"環境でのアノテーション基盤設計
sansantech
PRO
1
110
ワールドカフェI /チューターを改良する / World Café I and Improving the Tutors
ks91
PRO
0
310
Azure Static Web Apps の自動ビルドがタイムアウトしやすくなった状況に対応した件/global-azure2026
thara0402
0
390
目的ファーストのハーネス設計 ~ハーネスの変更容易性を高めるための優先順位~
gotalab555
8
2.1k
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4.3k
レビューしきれない?それは「全て人力でのレビュー」だからではないでしょうか
amixedcolor
0
310
マルチエージェント × ハーネスエンジニアリング × GitLab Duo Agent Platformで実現する「AIエージェントに仕事をさせる時代へ。」 / 20260421 GitLab Duo Agent Platform
n11sh1
0
150
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
6
74k
Do Ruby::Box dream of Modular Monolith?
joker1007
1
330
Azure Speech で音声対応してみよう
kosmosebi
0
160
Rapid Start: Faster Internet Connections, with Ruby's Help
kazuho
2
190
Featured
See All Featured
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
170
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
270
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
53k
How GitHub (no longer) Works
holman
316
150k
Claude Code のすすめ
schroneko
67
220k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
180
Code Review Best Practice
trishagee
74
20k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
270
A Modern Web Designer's Workflow
chriscoyier
698
190k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
710
Transcript
None
⽇本⼈は敗戦後、Shift-JISやJAP106などをGHQ に押し付けられて、結果として情報⼯学の発展に ⼤幅な遅れを取りました。私も⼩学⽣の頃、 プログラミングを始めたら習ったこともない英語 が並んでいて挫折したものです。またあなたたち はASCII以外⾮対応という、⽇本の⼩学⽣でも作 らないような低品質なサービスを沢⼭公開してき ました。そうやって代々私達が虐げられてきたこ とを、あなたたちが追体験できる貴重な機会が、 このmikutterであるわけです。
⾃⼰紹介 lあひる lNitech lTwitter 「あひる焼き」とつぶやけばわかる lEJUG, mikutter
いいか、みんな (゚д゚ ) (| y |)
mikutterとSlackでは単なるておくれだが mikutter ( ゚д゚) Slack \/| y |\/
⼆つ合わされば mikutter_slack となる ( ゚д゚) mikutter_slack (\/\/
つまりておくれだ mikutter_slack ( ゚д゚) \/| y |) mikutterの作者です
( ゚д゚) (| y |) Ban Stop Me Premiamu!!
最近のmikutter • mikutter は多種多様なサービスと連携するための機能を強化し ている • プラグインを導⼊することで新たなサービスに対応できると いった柔軟性・拡張性の⾼さを持つ • Twitter
はmikutterの機能のうちの⼀つにすぎない • 〇〇のサービス⽤のプラグインマダァ-?(・∀・ )っ/⼐⌒☆チンチン ようこそプラグイン開発沼へ =͟͟͞͞(☞ ՞ڼة◔=͟͟͞)☞ (・∀・ ;)
作者の陰謀
作者の陰謀
mikutter_slack • Slack とは • プラグイン概要 • 実装 • 使⽤ライブラリ
• できていること • 今後の予定
Slack とは • チャットツール • Electron ベースのクライアントで各種OSに対応 • Win, macOS,
Android, iOS, Linux(beta) • ⾊々なサービスとの連携が可能 • GitHub のアクティビティの通知、Jenkins の通知などなど… • 絵⽂字機能やコマンド機能など楽しい機能も盛りだくさん • 最近は通話もできるようになった • API も提供されており、Bot の開発も盛んに⾏われている
Slack の API • Restful な API が⽤意されている • ⼤きく分けて
Event API と RTM API がある • Event API • ⼀般的なよくある REST API • POST または GET で⾊々な情報を取得する • RTM API • RealTime Messaging API の略称 • WebSocket を⽤いたリアルタイムなイベントのやり取りを実現
プラグイン概要 • Slack を使えるようにする mikutter プラグイン • コアプラグインと gui プラグインに分離している
• ライブラリの採⽤によって Event API のみでなく、RTM API に対応 • mikutter 3.5 から導⼊された Retriever Model (現 Diva Model) を使ったモデルクラスによる実装 • 公式レファレンスと mikutter の作者を〆ることで最新の情報 を得ている • 今後出てくるであろう、他サービスのプラグインのプロトタイ プになることを⽬指している
要件
要件 • 必要要件 • mikutter: 3.6.0-develop • ruby : 2.3
• 推奨要件 • mikutter: 3.6.0-develop • ruby : 2.4
slack_gui
実装 • 主なモジュール • slack_gui.rb
slack_gui の機能 • GUI 周りを⼀通り担当する • チャンネルのタブを開く • 画像を開く •
投稿(未実装)
slack
使⽤ライブラリ • slack-api • RTM API や Event API などを
Ruby で叩ける • WebSocket 周りもよしなにしてくれるので、mikutter 側の実装に専 念できる • 作者のレスポンスが早くていい(重要) • サンプルも丁寧でドキュメントもしっかりしている(重要) • MIT ライセンス
slack-api • Slack は RTM 接続時に⼤量のデータを送ってくる • だいたい 72KB ほどの
JSON ⽂字列 (約 7 万字) • 当初、このライブラリはこのデータを破棄していた • 作者が RTM を使っていなかった • これに関して Twitter でライブラリ作者が捕捉・対応してくれた • ありがとうございます • その後バグを⾒つけ思い切って PR 出して少しばかり貢献した
実装 • 主なモジュール • api/ • model/ • entity/ •
slack.rb
実装 ‒ slack.rb
実装 ‒ slack.rb • mikutter が最初にロードする実⾏ファイル • mikutter の設定画⾯の定義 •
抽出データソースの定義 • RTM への接続処理 • ⼀般的に mikutter のプラグインとして必要なものを実装 • これ⾃体はかなりスリムで実態はほとんど model や api に実装 することでslack.rb のスリム化の実現と可読性を上げた • たった 75 ⾏!
実装 ‒ model
実装 ‒ model • Retriever Model (以後 Diva Model) によって
クラスモデルを提供 • 各モデルクラスは親であるDiva Modelを継承する • モデルの定義によって可読性の向上 • モデルごとに、そのモデルが必要な実装を詰める
実装 ‒ model class Message < Diva::Model include Diva::Model::MessageMixin field.has
:user, Plugin::Slack::User, required: true field.string :text, required: true field.time :created field.string :team, required: true field.string :ts, required: true entity_class Diva::Entity::URLEntity entity_class Plugin::Slack::Entity::MessageEntity end
実装 ‒ api
実装 ‒ api • slack-api を通して API から得た情報を model に格納したり、
情報をキャッシュしたり • ネットワークが介在するので基本的に Deferred オブジェクト によって形成されている • Deferred オブジェクトを返すのでエラーハンドリングや⾮同期 が格段に楽に • Auth は闇 • 抽象化によって処理がわかりやすい・追いやすいコードに
実装 - api • 実際の画⾯を⾒せる
実装 - api
実装 ‒ entity
実装 ‒ entity • Slack の特殊な⽂字( @, # などから始まるものや URL)は
内部的には <@hoge>, <#foo>, <https://example…> といっ た形になっている • それらをパースする機能を持つのが MessageEntity • mikutter 提供する Diva::Entity::RegexEntity によって実現 • filter() で対象をフィルタリングし、その対象を整形し、返す
実装 ‒ entity MessageEntity = Diva::Entity::RegexpEntity .filter(/マッチ/, generator: lambda {
|s| e_url = s[:url] e_face = s[:face] e_open = s[:open] s.merge(url: e_url, face: e_face, open: e_open) }) .filter(…) …
実装 ‒ entity
できてること • リードオンリー • パブリックチャンネルの取得 • プライベートチャンネルの取得 • そのユーザの権限で取ることができるすべての情報の取得 •
ただし取れているだけ • 絵⽂字を画像として開く • チャンネルを新しいタブで開く
今後の予定 • World に対応 • 書き込みに対応 • マルチアカウントに対応 • Bot
の投稿に対応 • 切断時の再接続処理 • slack-api の依存関係で⼊ってくるライブラリのバージョンを どこかに明記する