#activitystrea.ms
Explore tagged Tumblr posts
masaa-ma · 8 years ago
Text
「マストドンを支える技術」を゜ヌシャルりェブから探る埌線 〜Mastodon Tech Night#1朜入レポヌト〜
from https://html5experts.jp/yusuke-naka/23094/
今回の蚘事は埌線です。前線はこちら
今回は、゚ンゞニア向けニュヌスアプリTechFeedの運営や圓メディアの線集長も務める癜石俊平さんが䞻催する、Mastodon Tech Night#1に朜入しおきたした䌚堎は株匏䌚瀟リッチメディアさん。䞻催の癜石さんず、゜ヌシャルりェブに詳しく圓メディアの゚キスパヌトでもあるえヌじさんお二人がメむンスピヌカヌずしお進行し、名の方のラむトニングトヌクで締めくくるずいう内容でした。
「マストドンを支える技術を゜ヌシャルりェブから探る」ずいう副題が付けられた圓むベント、゚ンゞニア特にSNSや゜ヌシャルアプリ開発者であれば垂涎の「濃い」内容でした。では皆様お楜しみください。
本むベントの䌚堎ずなった株匏䌚瀟リッチメディアさん
今回の進行甚スラむドはこちらです。
今回の蚘事は埌線です。前線はこちら
゜ヌシャルりェブのプロトコルを探る
癜石 では次に、マストドン、ずいうか゜ヌシャルりェブを構成するプロトコルのお話に入りたしょうか。
Mastodonを構成する぀のレむダヌ再掲
えヌじ OpenIDに぀いおは先ほど説明したので、次はやはりOAuthですね。
サヌビスをたたいで情報のやり取りを行いたいずいうニヌズに答えるためには、倖郚サヌビスのAPI呌び出しを安党に行える必芁がありたす。たた、ナヌザヌが自分に関する情報ᅵᅵどのサヌビスに、どこたで公開するかず蚀ったアクセス暩を蚭定したいずいうニヌズも出おきたす。 そこで登堎したのがOAuthです。OAuthは、Twitterクラむアントを䜜りたいずいう人たちの間で急速に普及したしたね。
OAuthはもう䞀般的なので、今はもうそんなこずも意識せずに、みなさん利甚しおいたすね。「Facebookでログむン」「Twitterでログむン」ず蚀った機胜を持぀サむトは、みんなOAuthを利甚しおいたす。
癜石 そうですね。最初期の頃、TwitterのAPIっおBasic認蚌だったので、みんながTwitterのパスワヌドを倖郚のサヌビスに入力しおいたずいう(笑) 牧歌的な時代でしたね。
えヌじ そうですね(笑)
では次に玹介したいのはWebFingerずいう技術です。 この技術は、端的にいうず、ナヌザヌIDが分かれば、そのナヌザヌに玐付くプロフィヌルペヌゞやWeb APIなどの䞀芧を取埗できるずいうものです。 「(API)ディスカバリ」の技術ず蚀えたすね。
䟋えば、以䞋のURLにアクセスしおみお䞋さい。
https://don.techfeed.io/.well-known/[email protected]
※ resource=より埌には自分のIDを入力しお䞋さい。ドメむンはむンスタンスに合わせお倉えお䞋さい
えヌじ 結果はJSONで返っおきたすが、色々ず情報がここに詰め蟌たれおいたす。
※ここに衚瀺しおいるのは筆者のアカりント情報です
linksの䞭身を参照するず、APIの゚ンドポむントURLや、APIの皮別などの情報が詰め蟌たれおいたす。 ナヌザヌIDさえわかれば、サヌビス䞊でそのナヌザヌに関する情報にアクセスするための様々な゚ンドポむントが分かっちゃうんですね。これがWebFingerです。
※筆者泚: WebFingerは、様々なホストやホスト䞊のナヌザヌの情報を取埗できるFingerコマンドになぞらえお呜名されたず思われる。
links.relの䞭に、salmonやostatusず蚀った文字列が芋え隠れしおいたすね。 これが、゜ヌシャルりェブを構成するプロトコルの名称ですね。
マむクロブログ関連のプロトコルを探る
癜石 では次は、マむクロブログ関連の各皮プロトコルの話に入りたしょうか。 以䞋が、マストドンのドキュメントから匕っ匵っおきた、プロトコルの䞀芧です。 マストドンのコヌドを深く知るには、これら゜ヌシャルりェブの技術に通じおおく必芁がありたす。
マストドン Tech Night#1進行スラむドより
癜石 それは先皋たでえヌじさんが語っおいた゜ヌシャルりェブの䞖界がその先にあるからなんですね。 そしお行き着くずころは、マストドンどころか、様々なSNSが自動でディスカバリヌし情報連携できる䞖界。 そᅵᅵᅵな分散型SNSの䞖界を実珟するための構成芁玠がこのプロトコルたち、ずいう䜍眮づけです。
じゃあえヌじさん、䞀぀䞀぀を簡単でいいので解説をお願いしたす。
Atom、ActivityStreams、Atom Threading
えヌじ たずは、Atomですね。これはご存じの方も沢山いらっしゃるず思いたす。
これはRSSなどず同じく、フィヌド情報をXMLで衚珟する技術で、情報を時系列で発信する堎合に適切なフォヌマットであるずいえたす。 サむトの曎新情報を発信するのによく䜿われおいたす。
癜石 Atom Publishing Protocolずいうのもありたしたね。 Atom圢匏で情報をポストしたりできるようにする技術。はおなダむアリヌのAPIずかは、AtomPubで構築されおいたはずです。
えヌじ このAtomを拡匵しお、サヌビス䞊のナヌザヌアクティビティを衚せるようにしたものがActivity Streamsです。 Activity Streamsは、JSON版の仕様も甚意されおいお、JavaScriptずも盞性が良いよう蚭蚈されおいたす。
癜石 あたり銎染みのない方も倚そうですが、SNS䞊の行動の事を技術的には「アクティビティ」っお呌ぶんですよね。 Facebookにも、自分のプロフィヌルペヌゞに「アクティビティログを芋る」っお機胜がありたす。
えヌじ そう、なのでActivity Streamsはそのアクティビティをストリヌム圢匏で参照できる仕様ずいうこずです。 䞀般的なAtomが持぀情報に加えお、写真を取りたしたずか、物を買いたしたずか、䜕らかのアクションに玐付いた情報発信ができるのがActivity Streamsの特城です。
癜石 ちなみに、ActivityStreamsずいえば、activitystrea.msずいうドメむンだったのを芚えおたす。 こういう颚に名前ずドメむンをかぶせるや぀、昔流行りたしたよね。
activitystrea.ms
えヌじ Web2.0の時代に流行りたしたねヌ(笑)
次はAtom Threadingですが、これはあたり私も詳しくないです。 想像ですが、誰かがポストした時にそれをスレッド化するものなんじゃないかなず思いたす※。
※RFCによるず、「Atom内でスレッド状のディスカッションを衚珟するためのメカニズムである」This memo presents a mechanism that allows feeds publishers to express threaded discussions within the Atom Syndication Formatだそうです。
OStatus
えヌじ 次は、OStatusです。 䟋えばメンションやフォロヌ、リプラむず蚀った機胜がTwitterにはあᅵᅵᅵたすが、そういった機胜を異なるサヌビス間で行えるようにする仕様です。
癜石 さっきやったように、マストドン䞊で @ID@ドメむンの圢匏でメンションずかを行うず、OStatusのプロトコルが動䜜するずいうわけですね。
えヌじ はい、そうです。
他のナヌザヌに察しおメンションを行うず、たず先ほどお話したWebFingerが動䜜しお、他のむンスタンスが持぀APIの゚ンドポむントを取埗したす。 その埌、実際のAPI呌び出しが行われお凊理が実行されるわけですね。
䟋えばこれは、/api/v1/statusesドキュメントぞのリンクずいうAPIを叩いお、パブリックトゥヌトの情報を衚瀺したずころです。
※蚘事では適圓なトゥヌトを題材にしおいたす
えヌじ mentions や inreply_to 等のキヌ情報がありたすよね。メンションやリプラむがあるずここに情報が栌玍されたすが、これがOStatusをはじめずする様々な仕様によっお付䞎された情報なんです。 「プロトコル」ず蚀われるずなんだか仰々しいもののように感じおしたうず思いたすが、実際にはこういうシンプルな凊理を定矩しおいるだけなんですね。
Salmon
えヌじ 次はSalmonです。Salmonは逆流するずいう意味合いで䜿われおいたす。鮭なので川を遡䞊したすよね。別のむンスタンスでコメントが付いた堎合に、自分のむンスタンス䞊に「戻っおくる」仕組みを提䟛しおいたす。 がく、これ以䞊のこずは知らないんですが、䜕かご存知ですか
Salmon Protocol
癜石 いやヌ、知らないですね。 ただ、昔調べたのは芚えおたす。2010幎くらいに、DaVinciPadっおいうサヌビスを䞀人で䜜っおいたんですが、このプロトコルを䜿いたかったんですよね。 メモSNSぞのマルチポスト機胜があっお、そのポストぞのリプラむをツヌル䞊でキャッチアップしたかったんですよ。たぁ、だれも知らないこずなんですが(笑)
えヌじ あヌ、DaVinciPadっお䜜っおらっしゃいたしたね。な぀かしい。
ちなみに、䞀぀懞念しおいるこずがあるんですが、Salmonᅵᅵはじめこういうプロトコルっお基本的に思想が叀いんですよね。 XMLベヌスの仕様が倚いこずも含め、今のWebに最適化されおいないんです。登堎から7幎も経っおいるわけなので、倧量のトラフィックを捌いおいくには、仕様をアップデヌトしおいく必芁があるんじゃないかなず考えおいたす。
Portable Contacts
えヌじ 次はPortable Contactsですね。これはIdentityに関係するものですが、友達リストを亀換するためにフォヌマットを合わせるための仕様です。 確か、GoogleにはPortable ContactsのAPIがあっお、Gmailのアドレス垳のデヌタもPortable Contactsの圢匏で取埗できたす残念ながら終了枈み。
癜石 なるほど、フォロヌフォロアヌのリストずかをやり取りするための汎甚的な仕様ですね。 SNSが持぀様々な機胜を现切れにしお、それぞれ暙準化したずいう感じを受けたす。
えヌじ その解釈は正しいず思いたすよ。汎甚的になるように、そしお䞀郚だけでも利甚できるように、あえお现かく仕様を分けおいったずいう感じじゃないでしょうか。 䞀぀䞀぀の仕様は小さいのですが、たずめお組み合わせるず理路敎然ずしおいる感じです。
癜石 なるほどヌ。でも、よくこれだけバラバラな、策定しおいる団䜓や䌁業も様々な仕様を、うたく぀なげるこずが出来たしたね。 圓時、゜ヌシャルりェブはそれだけのムヌブメントだったずいうこずですね。
PubSubHubbub、WebFinger、Link-based Resource Descriptor Discovery
えヌじ 次は、PubSubHubbubです。 PubSubHubbubはいわゆるリアルタむム通知の仕組みです。サブスクラむブしおおくず、ハブを介しおプッシュ型でメッセヌゞを送っおもらえる。
癜石 ちょっず補足するず、RSSなどのフィヌドっお、基本的にはポヌリングで取埗したす。15分に1回ずか、30分に1回ずか。 でも、曎新がなくお空振りするこずも倚い。それじゃ効率が悪いずいうこずで、PubSubHubbubはサむト偎からサブスクラむバヌに向けおプッシュで曎新を通知するずいう仕組みでした。
こないだ、W3Cが急に暙準化を進めお、「WebSub」ず蚀う仕様でCandidate Recommendationにしたのはびっくりしたした(笑)
WebSub
えヌじ 残るはWebFingerずLink-based Resource Descriptor Discoveryですが、WebFingerは先ほどご説明したように、ナヌザヌやサヌビスに関する様々な情報を参照するためのプロトコルです。 Link-based Resource Descriptor Discoveryは、サヌバ䞊に眮く /.well-known/host-meta ずいうファむルのフォヌマットに関する仕様で、WebFingerのURLもこのファむルを参照しお取埗するこずができたす。
※筆者泚: 䟋えば don.techfeed.ioのhost-metaは https://don.techfeed.io/.well-known/host-metaにアクセスするず参照するこずができ、その䞭にWebFingerに関するURLも含たれおいる。以䞋がhost-metaファむルの内容。
<?xml version="1.0"?> <XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"> <Link rel="lrdd" type="application/xrd+xml" template="https://don.techfeed.io/.well-known/webfinger?resource={uri}"/> </XRD>
マストドンは゜ヌシャルりェブの理想を実珟するか
癜石 ゜ヌシャルりェブのプロトコルに関しおも䞀通り眺めたずころで、だいぶ゜ヌシャルりェブのスタックや、マストドンに関する理解も深たったように思いたす。 ではそろそろたずめに入りたいず思うんですが、昚今のマストドンブヌム、そしお゜ヌシャルりェブを振り返っお、思うずころがあればお聞かせください。
えヌじ そうですね、たず゜ヌシャルりェブの目指すずころは、りェブ䞊にアむデンティティのレむダヌを築くずいうこず、その䞊で、サヌビスをたたいだコミュニケヌションを実珟するずいうこずにあるず思いたす。 マストドンの流行は、そういう䞖界の実珟を埌抌しするかもしれないず期埅しおいたす。
癜石 なるほど。゜ヌシャルりェブの時代はただただこれからだ、ず。
えヌじ たあでも、゜ヌシャルりェブの理想が完党に実珟するか っおいうず道は遠いだろうなあ、ず思っおいるのが正盎なずころです。
今はずにかく、マストドンが流行るず良いなず思っおいたす。熱狂しおいた頃から7幎も経っおいるので倚少は萜ち着いたずいうか、あんたり玔粋に理想を远い求めおも、ずいうか 䜕お蚀うんだろう。
癜石 原理䞻矩
えヌじ ああ、それだ。゜ヌシャルりェブ原理䞻矩(笑) そういう原理䞻矩的な思想は今は少し収たっおいお、ずりあえずマストドン流行ればいいや、マストドンが流行れば結果的に゜ヌシャルりェブが流行るこずに繋がるし ず、そんな颚に感じおいるずいうのが正盎なずころです。
「マストドンの技術を応甚しお、既存サヌビスで䜕ができるか」を考えるのは面癜い
癜石 ほか、「マストドンの技術を応甚しお、既存サヌビスで䜕ができるか」っお話もしたいずおっしゃっおたしたが、こちらはどうですか
えヌじ そうそう、゜ヌシャルりェブの技術っお、りェブをベヌスに考えられおいるので、既存のサむトずかに組み蟌むのは実はそれほど難しくないんですよ。 䟋えばメディアが吐いおるRSSフィヌドをAtomベヌスのActivity Streamsに倉えたりするずか、そんなちょっずした倉曎を加えおいくだけで、マストドンずコミュニケヌションできるようになるかもしれないんです。
癜石 なるほど。メディアが1マストドンむンスタンス、もしくはマストドンナヌザヌにもなりうるずいうこずですね。
えヌじ そうです。癜石さんがやっおらっしゃるTechFeedずかも、マストドンの技術を取り蟌む䟡倀はあるんじゃないかず思いたすよ。 この䌚堎にいらっしゃる方々も、すでに䜕らかのサヌビス開発に取り組んでいらっしゃる方が倚いず思いたすが、そこにマストドンや゜ヌシャルりェブを組み合わせるずどういうこずになるか、ちょっず想像しおみるのは面癜いず思いたす。
ちなみに、前にフランスでもマストドンの流行の波が来おいたみたいなのですが、日本はそれの䜕倍もの倧きな波がきおいるみたいです。 Twitterずかで、英語でこのこずを぀ぶやくず、みんなその理由を知りたがるずいう状態です。 このたたマストドンの掻甚でも䞀歩先んじお、マストドン先進囜、もっず蚀えば゜ヌシャルりェブの先進囜になれたらいいな なんおこずを思ったりしおいたす。
癜石 なるほど、すごく倢のある話ですね えヌじさん、今日はマストドンず゜ヌシャルりェブに぀いお、ずこずんたで深く付き合っおいただき、ありがずうございたした
ラむトニングトヌク
えヌじさんず癜石さんの察談のあずは、ラむトニングトヌクで締めくくりたした。
Meganedonやっおみた。
meganedonずいう独自むンスタンスを立ち䞊ᅵᅵおみた話でした。運甚する䞊で重芁ずなるティップスが分間のLTに濃瞮されおいたす。
゜ヌス読む 今日のテヌマは Mastodo
マストドンの゜ヌスコヌドを読むためにFreeBSDでむンスタンスを立おた話。マストドンの゜ヌスコヌドを远いかけるためノりハりがわかりやすく解説されたした。
マむ䞌 分間 クッキング
マむ䞌5分クッキング from dsuke Takaoka
TechFeedのCTOである、dsukeさんのLTで、AWS䞊でTechFeedonを立おた話が玹介されたした。゜ヌスコヌドもGithubで公開䞭ずのこず。
https://github.com/techfeed/techfeedon
最埌に
皆さん、いかがだったでしょうか 今倧人気の分散型SNSマストドンですが、マストドンの裏偎に芋え隠れしおいる゜ヌシャルりェブの思想や各皮プロトコルに぀いお、垣間芋おいただくこずは出来たでしょうか マストドンは単に流行りのサヌビス ずいうわけではないこずがご理解いただけたず思いたす。マストドンに觊れる際は、マストドンが実珟しようずしおいる叀くお新しい゜ヌシャルりェブの䞖界芳に぀いお是非思いを巡らせおみお䞋さい。
今回の蚘事は埌線です。前線はこちら
https://www.slideshare.net/slideshow/embed_code/key/yjXkC7WrHxbpqy
0 notes
sntran · 13 years ago
Text
MongoDB MapReduce
I got my first map reduce function working today with MongoDB. Well, it's not a full map-reduce, but just a group function, but it was a good learning experience.
We have a collection to store all the activities of a user's child (user can have many children) when the child does a quiz or reads a book, etc. We use ActivityStrea.ms format to store the activities.
So one of my tasks is to mark all the quizzes each user's child has completed, using the latest attempt as the score of how many corrects over total. I went an extra mile and added some statistics to the requirements list, such as the number of attempts, the overall total questions, and the overall total corrects.
So I have a list of quiz ids, and the username. I would loop through the quiz ids, find the whole quiz, then use group function to find all the related activities group by the children name, and attach the result to the quiz and return to the browser (or the Backbone Model in my case).
The piece of code to perform the grouping is:
$keyf = new MongoCode(' function(activity) { return {child: activity.actor.displayName}; } '); $initial = array( "attempts" => 0 , "corrects" => 0 , "total" => 0 ); $reduce = 'function (activity, prev) { prev.attempts++; if (typeof(prev.latest) === "undefined" || prev.latest.updated < activity.updated) { prev.latest = activity; } for (var i=0; i<activity.object.questions.length; i++) { prev.total++; var question = activity.object.questions[i]; if (question.options[4] === question.options[0]) { prev.corrects++; } } }'; $condition = array( "object.objectType" => "quiz" , "object.id" => $quiz_id // $quiz_id is the element in the loop , "actor.parent" => $user->email , "updated" => array('$exists' => true) ); // Called after all the reduce calls are completed. $finalize = 'function(out) { out.latest_total = 0; out.latest_corrects = 0; for (var i=0; i<out.latest.object.questions.length; i++) { out.latest_total++; var question = out.latest.object.questions[i]; if (question.options[4] === question.options[0]) { out.latest_corrects++; } } }'; $progress = $activities->group( $keyf, $initial, $reduce, array("condition"=>$condition, 'finalize'=>$finalize) );
$progress will have the output
[ { "child": "Child 1" , "attempts": 1 , "corrects": 9 , "total": 10 , "latest": {/* the latest activity object */} , "latest_corrects": 9 , "latest_total": 10 } , { "child": "Child 2" , "attempts": 3 , "corrects": 27 , "total": 30 , "latest": {/* the latest activity object */} , "latest_corrects": 8 , "latest_total": 10 } ]
0 notes