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
0
520
mWWDC2017
mikutter World Wide Developers Conference 2017 の資料
ahiru
May 27, 2017
Tweet
Share
More Decks by ahiru
See All by ahiru
tokaido lug 2019-03-09
na0ki
1
140
OSC名古屋東海道らぐLT
na0ki
0
670
osc hamanako 2017 LT
na0ki
1
110
OSC Osaka 2017 LT
na0ki
0
150
OSC Nagoya Tokaidou LUG LT
na0ki
0
150
Tokaido LUG 2016.02.20
na0ki
0
910
Other Decks in Technology
See All in Technology
Terraformで構築する セルフサービス型データプラットフォーム / terraform-self-service-data-platform
pei0804
1
180
AIのグローバルトレンド2025 #scrummikawa / global ai trend
kyonmm
PRO
1
290
Language Update: Java
skrb
2
300
Practical Agentic AI in Software Engineering
uzyn
0
110
dbt開発 with Claude Codeのためのガードレール設計
10xinc
2
1.2k
いま注目のAIエージェントを作ってみよう
supermarimobros
0
300
研究開発と製品開発、両利きのロボティクス
youtalk
1
530
BPaaSにおける人と協働する前提のAIエージェント-AWS登壇資料
kentarofujii
0
140
Modern Linux
oracle4engineer
PRO
0
100
Snowflake Intelligenceにはこうやって立ち向かう!クラシルが考えるAI Readyなデータ基盤と活用のためのDataOps
gappy50
0
240
機械学習を扱うプラットフォーム開発と運用事例
lycorptech_jp
PRO
0
250
サラリーマンの小遣いで作るtoCサービス - Cloudflare Workersでスケールする開発戦略
shinaps
2
450
Featured
See All Featured
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
Facilitating Awesome Meetings
lara
55
6.5k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
GraphQLの誤解/rethinking-graphql
sonatard
72
11k
Typedesign – Prime Four
hannesfritz
42
2.8k
Speed Design
sergeychernyshev
32
1.1k
Balancing Empowerment & Direction
lara
3
620
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
112
20k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Scaling GitHub
holman
463
140k
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 の依存関係で⼊ってくるライブラリのバージョンを どこかに明記する