tag:blogger.com,1999:blog-40062099132514263552024-03-14T06:46:24.080-07:00MonicaThe Activities of a Cyber ChicaMonicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.comBlogger22125tag:blogger.com,1999:blog-4006209913251426355.post-32293062830243934492011-10-04T10:01:00.000-07:002011-10-04T10:01:15.834-07:00User Avatars on Cloud FoundryMost web applications today have the need to upload and serve user generated images such as profile pictures, photos or video thumbnails. If you are using Ruby on Rails there are a couple great frameworks you can use: Namely PaperClip and CarrierWave.<br />
<br />
<div id="wiki-content"><div class="wrap"><div class="gollum-markdown-content instapaper_body" id="wiki-body"><div id="template">After reviewing both libraries I went with CarrierWave for this project as it seemed the least obtrusive and most flexible. CarrierWave can be used with the file system, Amazon S3 and a database including Mongo GridFS. Since my project is hosted on Cloud Foundry and that gives me free access to install Mongo and bind it to my Application so I decided to try that option.<br />
The first task for which I wanted to add images was when users registered on my app using their Facebook account. Here are the steps you can take to support uploading and serving images. For more details on the Facebook integration review the user.rb model in the source code.<br />
<h2>Steps on your terminal</h2>This assumes you already have a Ruby on Rails 3.0 application on Cloud Foundry with a Users model<br />
<div class="highlight"><pre><span class="c"># Log in to cloud foundry if you are not logged in</span>
vmc login youremail@website.com
vmc create-service mongodb
<span class="c"># See what the newly created mongo service is called</span>
vmc services
<span class="c"># Bind the service to your existing Application</span>
vmc <span class="nb">bind</span>-service mongodb-???? appname
</pre></div><h2>Steps on your Code base</h2><h3>1- Add gems to your Gemfile</h3><div class="highlight"><pre><span class="n">gem</span> <span class="s1">'carrierwave'</span>
<span class="n">gem</span> <span class="s1">'carrierwave-mongoid'</span><span class="p">,</span> <span class="ss">:require</span> <span class="o">=></span> <span class="s2">"carrierwave/mongoid"</span>
</pre></div><h3>2- Install CarrierWave for your Model</h3><pre><code>rails generate uploader Avatar
</code></pre><h3>3 - Edit the generated file</h3>app/uploaders/avatar_uploader.rb <br />
to contain:<br />
<div class="highlight"><pre><span class="k">class</span> <span class="nc">AvatarUploader</span> <span class="o"><</span> <span class="no">CarrierWave</span><span class="o">::</span><span class="no">Uploader</span><span class="o">::</span><span class="no">Base</span>
<span class="c1"># Choose what kind of storage to use for this uploader:</span>
<span class="n">storage</span> <span class="ss">:grid_fs</span>
<span class="c1"># Override the directory where uploaded files will be stored.</span>
<span class="c1"># This is a sensible default for uploaders that are meant to be mounted:</span>
<span class="k">def</span> <span class="nf">store_dir</span>
<span class="s2">"</span><span class="si">#{</span><span class="n">model</span><span class="o">.</span><span class="n">class</span><span class="o">.</span><span class="n">to_s</span><span class="o">.</span><span class="n">underscore</span><span class="si">}</span><span class="s2">/</span><span class="si">#{</span><span class="n">mounted_as</span><span class="si">}</span><span class="s2">/</span><span class="si">#{</span><span class="n">model</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
<span class="c1"># Provide a default URL as a default if there hasn't been a file uploaded:</span>
<span class="k">def</span> <span class="nf">default_url</span>
<span class="s2">"/images/fallback/"</span> <span class="o">+</span> <span class="o">[</span><span class="n">version_name</span><span class="p">,</span> <span class="s2">"default.png"</span><span class="o">].</span><span class="n">compact</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">'_'</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
</pre></div><h3>4- Update your ActiveRecord model to store the avatar</h3>Make sure you are loading CarrierWave after loading your ORM, otherwise you'll need to require the relevant extension manually, e.g.:<br />
<div class="highlight"><pre><span class="nb">require</span> <span class="s1">'carrierwave/orm/activerecord'</span>
</pre></div>Add a string column to the model you want to mount the uploader on:<br />
<div class="highlight"><pre><span class="n">add_column</span> <span class="ss">:users</span><span class="p">,</span> <span class="ss">:avatar</span><span class="p">,</span> <span class="ss">:string</span>
</pre></div>Open your model file and mount the uploader:<br />
<div class="highlight"><pre><span class="k">class</span> <span class="nc">User</span>
<span class="n">mount_uploader</span> <span class="ss">:avatar</span><span class="p">,</span> <span class="no">AvatarUploader</span>
<span class="c1"># Make sure that the avatar is accessible</span>
<span class="n">attr_accessible</span> <span class="ss">:avatar</span><span class="p">,</span> <span class="ss">:remote_avatar_url</span><span class="p">,</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">:password</span><span class="p">,</span> <span class="ss">:password_confirmation</span><span class="p">,</span> <span class="ss">:remember_me</span><span class="p">,</span> <span class="ss">:first_name</span><span class="p">,</span> <span class="ss">:last_name</span><span class="p">,</span> <span class="ss">:display_name</span><span class="p">,</span> <span class="ss">:username</span> <span class="o">.</span><span class="n">.</span><span class="o">.</span>
<span class="o">.</span>
<span class="k">end</span>
</pre></div><h3>5 - Create an initializer for Mongoid to use your Mongo DB instance on Cloud Foundry</h3><ul><li>Name it 01_mongoid.rb so it runs before everything else</li>
</ul><div class="highlight"><pre><span class="no">Mongoid</span><span class="o">.</span><span class="n">configure</span> <span class="k">do</span> <span class="o">|</span><span class="n">config</span><span class="o">|</span>
<span class="n">conn_info</span> <span class="o">=</span> <span class="kp">nil</span>
<span class="k">if</span> <span class="no">ENV</span><span class="o">[</span><span class="s1">'VCAP_SERVICES'</span><span class="o">]</span>
<span class="n">services</span> <span class="o">=</span> <span class="no">JSON</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="no">ENV</span><span class="o">[</span><span class="s1">'VCAP_SERVICES'</span><span class="o">]</span><span class="p">)</span>
<span class="n">services</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">service_version</span><span class="p">,</span> <span class="n">bindings</span><span class="o">|</span>
<span class="n">bindings</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="nb">binding</span><span class="o">|</span>
<span class="k">if</span> <span class="nb">binding</span><span class="o">[</span><span class="s1">'label'</span><span class="o">]</span> <span class="o">=~</span> <span class="sr">/mongo/i</span>
<span class="n">conn_info</span> <span class="o">=</span> <span class="nb">binding</span><span class="o">[</span><span class="s1">'credentials'</span><span class="o">]</span>
<span class="k">break</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">raise</span> <span class="s2">"could not find connection info for mongo"</span> <span class="k">unless</span> <span class="n">conn_info</span>
<span class="k">else</span>
<span class="n">conn_info</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'hostname'</span> <span class="o">=></span> <span class="s1">'localhost'</span><span class="p">,</span> <span class="s1">'port'</span> <span class="o">=></span> <span class="mi">27017</span><span class="p">}</span>
<span class="k">end</span>
<span class="n">cnx</span> <span class="o">=</span> <span class="no">Mongo</span><span class="o">::</span><span class="no">Connection</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">conn_info</span><span class="o">[</span><span class="s1">'hostname'</span><span class="o">]</span><span class="p">,</span> <span class="n">conn_info</span><span class="o">[</span><span class="s1">'port'</span><span class="o">]</span><span class="p">,</span> <span class="ss">:pool_size</span> <span class="o">=></span> <span class="mi">5</span><span class="p">,</span> <span class="ss">:timeout</span> <span class="o">=></span> <span class="mi">5</span><span class="p">)</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">cnx</span><span class="o">[</span><span class="s1">'db'</span><span class="o">]</span>
<span class="k">if</span> <span class="n">conn_info</span><span class="o">[</span><span class="s1">'username'</span><span class="o">]</span> <span class="ow">and</span> <span class="n">conn_info</span><span class="o">[</span><span class="s1">'password'</span><span class="o">]</span>
<span class="n">db</span><span class="o">.</span><span class="n">authenticate</span><span class="p">(</span><span class="n">conn_info</span><span class="o">[</span><span class="s1">'username'</span><span class="o">]</span><span class="p">,</span> <span class="n">conn_info</span><span class="o">[</span><span class="s1">'password'</span><span class="o">]</span><span class="p">)</span>
<span class="k">end</span>
<span class="n">config</span><span class="o">.</span><span class="n">master</span> <span class="o">=</span> <span class="n">db</span>
<span class="k">end</span>
</pre></div><h3>6 - Update your CarrierWave Initializer to use the Cloud Foundry Mongo DB</h3><div class="highlight"><pre><span class="c1">#initializers/carrierwave.rb</span>
<span class="nb">require</span> <span class="s1">'serve_gridfs_image'</span>
<span class="no">CarrierWave</span><span class="o">.</span><span class="n">configure</span> <span class="k">do</span> <span class="o">|</span><span class="n">config</span><span class="o">|</span>
<span class="n">config</span><span class="o">.</span><span class="n">storage</span> <span class="o">=</span> <span class="ss">:grid_fs</span>
<span class="n">config</span><span class="o">.</span><span class="n">grid_fs_connection</span> <span class="o">=</span> <span class="no">Mongoid</span><span class="o">.</span><span class="n">database</span>
<span class="c1"># Storage access url</span>
<span class="n">config</span><span class="o">.</span><span class="n">grid_fs_access_url</span> <span class="o">=</span> <span class="s2">"/grid"</span>
<span class="k">end</span>
</pre></div><h3>7- Handle requests for the images in lib/serve_gridfs_image.rb</h3><div class="highlight"><pre><span class="k">class</span> <span class="nc">ServeGridfsImage</span>
<span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
<span class="vi">@app</span> <span class="o">=</span> <span class="n">app</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
<span class="k">if</span> <span class="n">env</span><span class="o">[</span><span class="s2">"PATH_INFO"</span><span class="o">]</span> <span class="o">=~</span> <span class="sr">/^\/grid\/(.+)$/</span>
<span class="n">process_request</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="vg">$1</span><span class="p">)</span>
<span class="k">else</span>
<span class="vi">@app</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="kp">private</span>
<span class="k">def</span> <span class="nf">process_request</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
<span class="k">begin</span>
<span class="no">Mongo</span><span class="o">::</span><span class="no">GridFileSystem</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="no">Mongoid</span><span class="o">.</span><span class="n">database</span><span class="p">)</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">file</span><span class="o">|</span>
<span class="o">[</span><span class="mi">200</span><span class="p">,</span> <span class="p">{</span> <span class="s1">'Content-Type'</span> <span class="o">=></span> <span class="n">file</span><span class="o">.</span><span class="n">content_type</span> <span class="p">},</span> <span class="o">[</span><span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="o">]]</span>
<span class="k">end</span>
<span class="k">rescue</span>
<span class="o">[</span><span class="mi">404</span><span class="p">,</span> <span class="p">{</span> <span class="s1">'Content-Type'</span> <span class="o">=></span> <span class="s1">'text/plain'</span> <span class="p">},</span> <span class="o">[</span><span class="s1">'File not found.'</span><span class="o">]]</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
</pre></div><h3>Step 8 - Deploy !</h3><div class="highlight"><pre>bundle install
bundle package
vmc update app_name
</pre></div><h1>Conclusion</h1>This will give you the ability to upload and serve images. Do note that this will not provide image resizing. If you are using devise for example you can import the avatar(profile picture) of the user when they sign up.<br />
<div class="highlight"><pre><span class="k">class</span> <span class="o"><<</span> <span class="nb">self</span>
<span class="k">def</span> <span class="nf">new_with_session</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">session</span><span class="p">)</span>
<span class="k">super</span><span class="o">.</span><span class="n">tap</span> <span class="k">do</span> <span class="o">|</span><span class="n">user</span><span class="o">|</span>
<span class="k">if</span> <span class="n">session</span><span class="o">[</span><span class="s1">'devise.omniauth_info'</span><span class="o">]</span>
<span class="k">if</span> <span class="n">data</span> <span class="o">=</span> <span class="n">session</span><span class="o">[</span><span class="s1">'devise.omniauth_info'</span><span class="o">][</span><span class="s1">'user_info'</span><span class="o">]</span>
<span class="n">user</span><span class="o">.</span><span class="n">display_name</span> <span class="o">=</span> <span class="n">data</span><span class="o">[</span><span class="s1">'name'</span><span class="o">]</span> <span class="k">if</span> <span class="n">data</span><span class="o">.</span><span class="n">has_key?</span> <span class="s1">'name'</span>
<span class="n">user</span><span class="o">.</span><span class="n">email</span> <span class="o">=</span> <span class="n">data</span><span class="o">[</span><span class="s1">'email'</span><span class="o">]</span>
<span class="n">user</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">data</span><span class="o">[</span><span class="s1">'nickname'</span><span class="o">]</span> <span class="k">if</span> <span class="n">data</span><span class="o">.</span><span class="n">has_key?</span> <span class="s1">'nickname'</span>
<span class="n">user</span><span class="o">.</span><span class="n">first_name</span> <span class="o">=</span> <span class="n">data</span><span class="o">[</span><span class="s1">'first_name'</span><span class="o">]</span> <span class="k">if</span> <span class="n">data</span><span class="o">.</span><span class="n">has_key?</span> <span class="s1">'first_name'</span>
<span class="n">user</span><span class="o">.</span><span class="n">last_name</span> <span class="o">=</span> <span class="n">data</span><span class="o">[</span><span class="s1">'last_name'</span><span class="o">]</span> <span class="k">if</span> <span class="n">data</span><span class="o">.</span><span class="n">has_key?</span> <span class="s1">'last_name'</span>
<span class="n">user</span><span class="o">.</span><span class="n">remote_avatar_url</span> <span class="o">=</span> <span class="n">data</span><span class="o">[</span><span class="s1">'image'</span><span class="o">]</span> <span class="k">if</span> <span class="n">data</span><span class="o">.</span><span class="n">has_key?</span> <span class="s1">'image'</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
</pre></div><h1>References</h1><ul><li><a href="http://support.cloudfoundry.com/entries/20016922-connecting-to-a-mongo-db" rel="nofollow">http://support.cloudfoundry.com/entries/20016922-connecting-to-a-mongo-db</a></li>
<li><a href="https://github.com/jnicklas/carrierwave" rel="nofollow">https://github.com/jnicklas/carrierwave</a></li>
<li><a href="https://github.com/jnicklas/carrierwave-mongoid" rel="nofollow">https://github.com/jnicklas/carrierwave-mongoid</a></li>
<li><a href="http://antekpiechnik.com/posts/setting-up-carrierwave-file-uploads-using-gridfs-on-rails-3-and-mongoid" rel="nofollow">http://antekpiechnik.com/posts/setting-up-carrierwave-file-uploads-using-gridfs-on-rails-3-and-mongoid</a></li>
<li><a href="https://github.com/plataformatec/devise" rel="nofollow">https://github.com/plataformatec/devise</a></li>
</ul></div></div></div></div>Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0tag:blogger.com,1999:blog-4006209913251426355.post-69298545539861487892010-11-02T17:11:00.000-07:002010-11-07T23:52:02.916-08:00Activity Streams 101 Session at IIWFor those new to the standard, here is a brief explanation: <br />
<blockquote>Activity Streams is a way of modeling social actions which improves the performance of human beings interpreting shared information and making decisions.</blockquote><br />
<h4><span class="Apple-style-span" style="font-weight: normal;">The Activity Streams data structure focuses on:</span></h4><ol><li>Providing an up to date digest of important information narrated via the reader's social graph.</li>
<li>Optimizing for human consumption by utilizing multiple mediums in a clean fashion</li>
<li>Producing a cycle of engagement. As reactions to activities occur, those also become part of the stream </li>
</ol><div>There is also a standard specification which is being developed by a variety of companies and individuals. Here are a few details</div><br />
<ol><li>activitystrea.ms is a standard used to convey what people are doing around the web</li>
<li>Defines a set of concepts and vocabulary</li>
<li>Can be used with Atom, RSS or JSON</li>
</ol><div></div>Here are a couple of examples<br />
<h4>Activity Streams on Atom</h4><ul><li><a href="http://www.activitystrea.ms/spec/1.0/atom-activity-01.html">Atom Spec</a></li>
<li><a href="http://www.activitystrea.ms/schema/1.0/activity-schema-01.html">Vocabulary</a></li>
<li><a href="http://pastie.org/pastes/1268040">Example Entry</a></li>
</ul><div class="separator" style="clear: both; text-align: center;"><a href="http://idisk.me.com/ciberch/Public/Pictures/Skitch/Screen_shot_2010-11-02_at_4.57.43_PM-20101102-170229.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://idisk.me.com/ciberch/Public/Pictures/Skitch/Screen_shot_2010-11-02_at_4.57.43_PM-20101102-170229.jpg" /></a></div><br />
<h4>Activity Streams on JSON</h4><ul><li><a href="http://activitystrea.ms/head/json-activity.html">JSON Spec</a></li>
<li><a href="http://pastie.org/1268248">Example entry</a></li>
</ul><div class="separator" style="clear: both; text-align: center;"><a href="http://idisk.me.com/ciberch/Public/Pictures/Skitch/Screen_shot_2010-11-02_at_5.28.49_PM-20101102-173259.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://idisk.me.com/ciberch/Public/Pictures/Skitch/Screen_shot_2010-11-02_at_5.28.49_PM-20101102-173259.jpg" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><br />
<h4>Latest News</h4><ul><li><a href="http://storify.com/kevinmarks/activity-streams-101-session-at-iiw">Notes from Kevin Marks</a></li>
<li>Paul Tarjan from FB considers using for Facebook to auto refresh news about the objects in the graph using og:feed</li>
<li>OWFa Agreement is getting signed for v1</li>
</ul>Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com1tag:blogger.com,1999:blog-4006209913251426355.post-80438639489522139452010-10-25T13:09:00.000-07:002010-10-25T14:11:49.743-07:00Microdata guided by usability testing resultsAbout a year ago Google decided to do actual research on how usable the Microdata spec was. This blog post has very interesting details <a href="http://blog.whatwg.org/usability-testing-html5" itemprop="url">http://blog.whatwg.org/usability-testing-html5</a>.<br />
<br />
<div itemprop="description">Ian Hickson was kind enough to point me to this post after I asked about consolidating the itemscope and itemtype attributes into item.</div>See: <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRrF8YRIRr9LFDUi4dN-0m8gNWOP2qDIfm2olA6ZYYnVqBE9bG9E8wntpkgZFo_KUr-oUw5tQlV98z7VXpqZVHu6UUa1lbjhvgboQ9xdbhSszRJI3zyAU7ZGN3-prlBXCtsC-YizgwxZM/s1600/Screen+shot+2010-10-25+at+1.53.46+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" itemprop="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRrF8YRIRr9LFDUi4dN-0m8gNWOP2qDIfm2olA6ZYYnVqBE9bG9E8wntpkgZFo_KUr-oUw5tQlV98z7VXpqZVHu6UUa1lbjhvgboQ9xdbhSszRJI3zyAU7ZGN3-prlBXCtsC-YizgwxZM/s1600/Screen+shot+2010-10-25+at+1.53.46+PM.png" /></a></div><a href="http://pastie.org/1246677%20%0A">http://pastie.org/1246677 </a><br />
Here are my comments on their conclusions which you may find helpful:<br />
<br />
<a name='more'></a><br />
<b>Conclusions</b><br />
>>Some interesting things came out of this study. First, as mentioned above, the term "about" turns out to be highly non-intuitive. I originally took the word from RDFa, on the principle that they knew more about this than I did, but our participants had a lot of trouble with that term. When we changed it to "itemid", there was a marked improvement in people's understanding of the concept.<br />
<b>Me: </b>Agreed as a newcomer to RDFa and Microdata, <b>itemid</b> was far more clear.<br />
<br />
>>Second, people were much less confused about types than I thought they would be. In preparing for this study I discussed microdata with a number of people, and I found that one major area of confusion was the concept of types vs the concept of properties. This is why variant 3 has no types: I wanted to find out whether people had trouble with them or not. Well, not only did people not have problems with types, several participants went out of their way to specify the type of an item, for example using the attribute name "type" instead of "item" in variant 1.<br />
It seems that while reasoning about types at the theoretical level is somewhat confusing, it isn't so confusing that the concept should be kept out of the language. Instead, types should just be more explicitly mentioned. This is why we renamed "item" to "itemtype".<br />
<br />
<b>Me:</b>Ok I can see that more concrete attribute name actually helping publishers fill the right thing in.<br />
<br />
>>Third, people were confused by the scoping nature of the "item" attribute. Some of our participants never understood scoping at all, and most of the participants who understood the concept were still quite confused by the "item" attribute. We were encouraged, however, by one variant 1 participant's sudden enlightenment when they saw variant 3's "itemscope" attribute, and by the reaction of the variant 3 participant to the "itemscope" attribute compared to the reactions that the other two variants' participants had to their "item" attributes. This is why we split "item" into "itemtype" and "itemscope", instead of just using "itemtype".<br />
<br />
<b>Me: </b>I can see that making it easier for newcomers to grasp however once you are familiar you do yearn for the shorthand. In addition, I found that current parsers struggle with <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/common-microsyntaxes.html#boolean-attribute">boolean attributes</a> like itemscope.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGQMYF2iMuedIUZvs8hrJ6m5Zfq8WuB6SWjDqatH8fD5lc0jjSXOXRiawReiWUsG1xYTZO4EO_x3C-xfNwBIndNPLaqSpUI80AbXsXwmwfd_tlhHQFbuXqIRl2icqu30fIg4Vt2Ai9xcs/s1600/Screen+shot+2010-10-25+at+1.59.58+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGQMYF2iMuedIUZvs8hrJ6m5Zfq8WuB6SWjDqatH8fD5lc0jjSXOXRiawReiWUsG1xYTZO4EO_x3C-xfNwBIndNPLaqSpUI80AbXsXwmwfd_tlhHQFbuXqIRl2icqu30fIg4Vt2Ai9xcs/s1600/Screen+shot+2010-10-25+at+1.59.58+PM.png" /></a></div><br />
>>We found that people who understood microdata's basic features also understood "itemfor", but while we were doing the study, it was pointed out on the WHATWG list that "itemfor" makes it impossible to find the properties of an item without scanning the whole document. This is why we tested the <itemref> idea in variant 4. People were at least as able to understand this as "itemfor".</itemref><br />
In general, the changes we made for variant 4 were all quite successful. With one exception, that's what HTML5 now says. The one exception is that I hoisted the "itemid" property to an attribute like "itemtype", based on the argument that if people want to scan a document for the item with a particular "itemid", <itemref> would make it impossible to do it for the property without creating the microdata graph for the entire page.</itemref><br />
One thing we weren't trying to test but which I was happy to see is that people really don't have any problems dealing with URLs as property names.<br />
<b>Me:</b> Excellent. I was curious about that<br />
<br />
>>In fact, they didn't even complain about URLs being long, which reassured me that microdata's lack of URL shortening mechanisms is probably not an issue.<br />
Overall, this was a good and useful experience. I hope we can use usability studies to test other parts of HTML5 in the future.<br />
<br />
<b>Me: </b>Nice what we now need are multiple users writing parsers so we can go through their pain points if any. But overall I am very impressed with the clarity of this spec.Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0tag:blogger.com,1999:blog-4006209913251426355.post-20694667867749085302010-10-19T09:55:00.000-07:002010-10-19T10:00:01.331-07:00It's official: Socialcast REACH is live<div itemprop="description">Socialcast (<a href="http://www.socialcast.com/">http://www.socialcast.com/</a>) is out of private beta for REACH <br />
<a href="http://techcrunch.com/2010/10/19/socialcast-reach-extends-activity-streams-to-outside-business-applications/">http://techcrunch.com/2010/10/19/socialcast-reach-extends-activity-streams-to-outside-business-applications/</a><br />
for which we parse Open Graph Protocol as well as HTML 5 Microdata with the Open Graph vocabulary.<br />
All of the components are extensible and we will be adding more vocabularies in subsequent releases.<br />
</div>We have been working in private beta with some customers and found that microdata helped us with closed source business systems because it can be placed anywhere on the HTML page.<br />
<br />
Side by side comparison:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfamOUDbWsOCnN38j2fJgd-HYL-mTWgnOBowgkXZyCfMaQKF2Yex4m9S9mQyLqUtssK7nBveezg2e8T4EqBmrRL6Vws1KNKi-Puc88qeDJ7YTQaAVtX85P7bAAAEBxG7DS0Pd4PXOnNQ4/s1600/Screen+shot+2010-10-19+at+9.52.16+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" itemprop="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfamOUDbWsOCnN38j2fJgd-HYL-mTWgnOBowgkXZyCfMaQKF2Yex4m9S9mQyLqUtssK7nBveezg2e8T4EqBmrRL6Vws1KNKi-Puc88qeDJ7YTQaAVtX85P7bAAAEBxG7DS0Pd4PXOnNQ4/s1600/Screen+shot+2010-10-19+at+9.52.16+AM.png" /> </a></div><br />
Pretty easy !Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com1tag:blogger.com,1999:blog-4006209913251426355.post-44752372625053061372010-10-16T19:59:00.000-07:002010-10-19T03:03:52.199-07:00Context in the Enterprise<p>Today most people are overwhelmed with information. Not only is there an enormous amount of information to read on a variety of devices, a lot of this information links to other content which takes time to fetch and users end up wasting time if the content is not relevant to them.<br />
Wasting time is something we don't want to be doing ever and guess what ? Our bosses don't want us to do that either. They want us to share and learn but they definitely don't want us to waste time.</p><p itemprop="description">With that goal in mind the Socialcast team decided to embark on a mission of providing more context for links which are shared in our application. A small description, picture, title and topics it covers. This practice is not new. Other consumer portals already parse html to try and extract this information. <br />
This is a difficult job because before HTML 5, markup was not inherently semantic.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxnknGrEwWcMNgbuz6JDv-pA2kRmHU4dhXj-Lf0BXrCb8jLHAlHcohNGYBZRZ53BjHAHfAKnqe2RJgta947a71PCW0FRp-fGN4pxleUYPy-xf3rEaVwtohxC3IE7NrxazfdrMM4-JQekQ/s1600/html5_w3c.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img itemprop="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxnknGrEwWcMNgbuz6JDv-pA2kRmHU4dhXj-Lf0BXrCb8jLHAlHcohNGYBZRZ53BjHAHfAKnqe2RJgta947a71PCW0FRp-fGN4pxleUYPy-xf3rEaVwtohxC3IE7NrxazfdrMM4-JQekQ/s1600/html5_w3c.jpg" /></a></div><br />
<p>Most of the tags in HTML were only for layout.<br />
Being the agile team that we are we didn't want to spend a lot of time trying to handle html with tags that are not properly closed and figuring which image is the most appropriate one to render, the representative image, based on size. Too complex.<br />
</p><p>So we asked what is the best technique for capturing the relevant data in a web page. Our research brought us to the following specifications<br />
</p><ul><li>RDFa : <a href="http://www.w3.org/TR/rdfa-syntax">http://www.w3.org/TR/rdfa-syntax</a></li>
<li>Open Graph Protocol: <a href="http://opengraphprotocol.org/">http://opengraphprotocol.org/</a></li>
<li>Microdata: See previous post <a href="http://montrics.blogspot.com/2010/10/html5-implementors-experience-with-ogp.html">http://montrics.blogspot.com/2010/10/html5-implementors-experience-with-ogp.html</a></li>
<li>Microformats: <a href="http://microformats.org/wiki/Main_Page">http://microformats.org/wiki/Main_Page</a></li>
<li>oEmbed: <a href="http://www.oembed.com/">http://www.oembed.com/</a></li>
<li>And we should not leave out HTML5 </li>
</ul><br />
<h3>What do they have in common ?</h3><p>All of these are specifications detailing how to add semantic data to your web pages. The specifications cover the syntax and concepts and in some cases detailed vocabulary.</p><br />
<h3>How many objects can you read out of an html page ?</h3><ul><li> RDFa : As many as you want. You can create new vocabularies and not only describe objects but also entire sentences with subject predicate and object. It also allows cross referencing objects</li>
<li>Microformats: All the ones which map to a specific microformat. </li>
<li>Open Graph Protocol : One main object with some predefined relations. The object can have a variety of types specified by Facebook. </li>
<li>oEmbed one specified via <br />
<pre>link rel="alternate" type="text/xml+oembed"</pre></li>
<li>Microdata: As many as you want and does not enforce global uniqueness or the use of namespaces for types. Objects can be defined adhoc.<br />
<pre> </pre></li>
</ul><h3>What is needed to use ?</h3><ol><li>RDFa: http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd in XHtml doctype<br />
</li>
<li>Microformats: Nothing</li>
<li>Open Graph Protocol: Nothing but it should be same as RDFa</li>
<li>oEmbed: Another document. So performing a separate http request.</li>
<li>Microdata: HTML 5 doctype but doesn't break anything in practice </li>
</ol><p>Initially we just wanted to extract a single object and decided to use the Open Graph Protocol. It provides a short set of rules which on one hand is great because the code to parse it is very short but on the other hand its not flexible enough as described in my earlier post where there are issues working in existing closed source Business Systems.<br />
</p><p>This is why we turned to Microdata. We have posted on our wiki a lot of details on how the parsing works. How to extend it and we have built the ability for other vocabularies to be used like Activity Streams or even the oEmbed vocabulary can be used.<p><h3>So what do the users get in return ?</h3><ul><li>Distributed discussions through out their eco system</li>
<li>Good sources of material curated by people they trust, their colleagues.</li>
<li>Rapid deployment</li>
<li>Easy to add to business systems</li>
</ul>Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0tag:blogger.com,1999:blog-4006209913251426355.post-36590728847519018132010-10-10T11:21:00.000-07:002010-10-19T03:07:48.354-07:00HTML5: Implementors experience with OGP and MicrodataYou cannot argue the fact that the <a href="http://opengraphprotocol.org/">Open Graph Protocol</a>(<i>ogp</i>) looks very clean and easy to understand.<br />
Its a subset of RDFa which focuses on a single schema and a single location where this schema can be applied: <br />
This is why we started working with it at our company. Simplicity and of course being a standard proposal signed under the OWFa agreement: Open for anyone to use.<br />
So we have been testing interoperability on enterprise software systems. How hard is it to add these ogp meta tags ? For some systems like SugarCRM we have the source code and for some other like Sharepoint we do not.<br />
In addition, our target audience are system administrators, not just developers so we are interested in <b>finding the simplest solution</b> that feels more natural in their environment.<br />
From my experimentation I have definitely found some challenges dealing with this more closed enterprise software. No access to edit the html on the head. No access to dynamic data from the head.<br />
<p itemprop="description">So I decided to try more consumer facing products like wikis, blogs, etc hoping to encounter less resistance.<br />
Today I was testing adding some <i>ogp</i> markup to this blog and found that unlike other systems I have been working with lately it allowed my to easily modify the HEAD.</p>I added the basic, title, type, etc. However, when it came to <i><b>og:image</b></i> I was a bit stuck on what to do even on such a flexible external system. <br />
The images I want featured when I share blog entries with the world will come from each blog entry and will be carefully chosen to capture the essence of the piece.<br />
<br />
Naturally the first solution I thought of was <a href="http://microformats.org/wiki/Main_Page">Microformats</a> as these can be added in context. The problem with microformats is that they don't have a lot of common properties between the different types of objects.<br />
So one proposal would be to add the concept of a <b>representative image</b> to microformats but in the essence of time I searched some more and remembered something about microdata in HTML 5.<br />
When I first saw Microdata presented I wondered why there was another specification talking about semantics. There is already RDFa... but in taking a closer look I am quickly seeing how useful microdata will be based on its simplicity.<br />
<br />
<b>The beauty of microdata is that it does not concern itself with imposing a schema. It does one job and it does it well.</b><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUmFAG0NzfORbLbfc9TbLWSgC8zV7qc0xunPI3_TYwbqndvk1lz7mxGEJ8USMJBtT7o7sabMJ0QFeBkxp0FQLTVnjh3o24RFqvEMzpFMCbnToakQgi8n9-TiravJ-b-E0ql6XkVvk3eow/s1600/Screen+shot+2010-10-09+at+8.07.39+PM.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img itemprop="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUmFAG0NzfORbLbfc9TbLWSgC8zV7qc0xunPI3_TYwbqndvk1lz7mxGEJ8USMJBtT7o7sabMJ0QFeBkxp0FQLTVnjh3o24RFqvEMzpFMCbnToakQgi8n9-TiravJ-b-E0ql6XkVvk3eow/s1600/Screen+shot+2010-10-09+at+8.07.39+PM.png" /> </a><br />
Schema is optional. No namespaces. Hurray ! Much more suited for doing inline representation of objects.<br />
Looking at the Open Graph Protocol I realize its more of a schema that can easily be translated into a microdata vocabulary.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4WmdZWRqkihlx4Nf_cTSYJxuO_vsYhs32AM4LpsjGfVyQZbxl988h1rznOtXhOHzb4HUuveAsek0puAEQnM1kHw5ja-lOrGUNMJty9Zajl0Sgn_95j11Tp_rw-VdFyKUnBVYXRmzVHJI/s1600/Screen+shot+2010-10-09+at+7.31.03+PM.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4WmdZWRqkihlx4Nf_cTSYJxuO_vsYhs32AM4LpsjGfVyQZbxl988h1rznOtXhOHzb4HUuveAsek0puAEQnM1kHw5ja-lOrGUNMJty9Zajl0Sgn_95j11Tp_rw-VdFyKUnBVYXRmzVHJI/s1600/Screen+shot+2010-10-09+at+7.31.03+PM.png" /></a></div><br />
Therefore we have now shifted gears to add support in our product for parsing microdata with the open graph protocol as a vocabulary. No more need to hack in semantics. The solution is in the HTML 5 specification. In addition will be rolling our support for more vocabularies based on the needs of our users. <br />
<br />
Research:<br />
<ul><li><a href="http://edward.oconnor.cx/2009/05/microdata-microformats-and-rdf">http://edward.oconnor.cx/2009/05/microdata-microformats-and-rdf</a></li>
<li><a href="http://microformats.org/wiki/microdata">http://microformats.org/wiki/microdata </a></li>
<li><a href="http://www.w3.org/TR/html5/microdata.html">http://www.w3.org/TR/html5/microdata.html</a></li>
<li><a href="http://lists.w3.org/Archives/Public/public-html/2010Feb/0851.html">http://lists.w3.org/Archives/Public/public-html/2010Feb/0851.html</a></li>
<li><a href="http://www.webmonkey.com/2010/09/microdata-html5s-best-kept-secret/">http://www.webmonkey.com/2010/09/microdata-html5s-best-kept-secret/</a></li>
<li><a href="http://www.google.com/support/webmasters/bin/answer.py?answer=99170">http://www.google.com/support/webmasters/bin/answer.py?answer=99170</a></li>
<li><a href="http://diveintohtml5.org/extensibility.html">http://diveintohtml5.org/extensibility.html</a></li>
<li><a href="http://rdfa.info/wiki/Rdfa-microdata-markup-comparison">http://rdfa.info/wiki/Rdfa-microdata-markup-comparison</a></li>
</ul>Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0tag:blogger.com,1999:blog-4006209913251426355.post-73086818695568662452010-05-17T11:40:00.000-07:002010-10-09T18:03:27.490-07:00Extending PubSubHubbubYesterday we met at <a href="http://iiw.idcommons.net/Proposed_Topics_IIW10">IIW</a> to discuss Facebook's Graph Realtime Api's use cases and why the team decided not to use the current PubSubHubbub specification(0.3). Wei Zhu from Facebook presented some additional arguments to those presented in my earlier post for why PubSubHubbub was not used:<br />
<ul><li>Lack of topic URLs. Some notifications can only be pushed and there is no way to GET a list of them at a later time. MySpace had the same issue with the firehose. There was no url for it.<br />
</li>
<li>One other issue that needs a little bit more work in PubSubHubbub was batching. The current recommendation relies on HTTP Keep-Alives or Atom Feeds.<br />
</li>
</ul>Here are the ideas we presented that can help solve the issue:<br />
<ol><li>Give every resource a (topic) URL<br />
</li>
<li>Use OAuth 2.0 for subscription authorization</li>
<li>Move hub discovery to the HTTP Response Headers<br />
</li>
</ol><br />
Attendees seem to agree that this is beneficial so we are moving forward with presenting this to the PubSubHubbub mailing list.<br />
<br />
Here are the initial changes to the specification:<br />
<a href="http://github.com/ciberch/pshb_oauth">http://github.com/ciberch/pshb_oauth</a><br />
<br />
I didn't want to put them in the same repo until we got feedback from the mailing list<br />
<br />
<span property="og:image" content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwFweQWTiqW515AYcYCR6Am0iYkgBz8rXRrWP9gd5UqdY0JCRteLXPWH9n2J2yd3gfBmzcXaxifMy6NDRWPOLODGPkRRZgQ5hg1bSOz7AhV_UnB-ar9mTSudrg5Wrm-lfEhZcFbRDs5O8/s1600/photo_1.jpg"> </span><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwFweQWTiqW515AYcYCR6Am0iYkgBz8rXRrWP9gd5UqdY0JCRteLXPWH9n2J2yd3gfBmzcXaxifMy6NDRWPOLODGPkRRZgQ5hg1bSOz7AhV_UnB-ar9mTSudrg5Wrm-lfEhZcFbRDs5O8/s1600/photo_1.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5472403328672631074" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwFweQWTiqW515AYcYCR6Am0iYkgBz8rXRrWP9gd5UqdY0JCRteLXPWH9n2J2yd3gfBmzcXaxifMy6NDRWPOLODGPkRRZgQ5hg1bSOz7AhV_UnB-ar9mTSudrg5Wrm-lfEhZcFbRDs5O8/s320/photo_1.jpg" style="cursor: pointer; float: left; height: 320px; margin: 0pt 10px 10px 0pt; width: 240px;" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg80ah2SxEsBqxvDdiw1mTbeszwSINMDSnr38DKXdHWZcu82YOzXGPFVskX5AeVQ_bYCKMDMPMEde4VZhnJK8UCInvsHtNwwXvxCHvpfG1mhyjzCBzUE-0IhREt-AYaHvlYiOmieuwN5U/s1600/photo_2.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5472403448944239250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg80ah2SxEsBqxvDdiw1mTbeszwSINMDSnr38DKXdHWZcu82YOzXGPFVskX5AeVQ_bYCKMDMPMEde4VZhnJK8UCInvsHtNwwXvxCHvpfG1mhyjzCBzUE-0IhREt-AYaHvlYiOmieuwN5U/s320/photo_2.jpg" style="cursor: pointer; float: left; height: 320px; margin: 0pt 10px 10px 0pt; width: 240px;" /></a>Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com1tag:blogger.com,1999:blog-4006209913251426355.post-697448660804932512010-05-17T08:15:00.000-07:002010-05-19T17:39:05.197-07:00Facebook's Realtime Updates -- Use CasesAt f8 Facebook launched a first version of <a href="http://developers.facebook.com/docs/api/realtime" id="bg13" title="real time updates">real time updates</a> for the <a href="http://developers.facebook.com/docs/api" id="wz6s" title="Graph API">Graph API</a>. These updates allow consumers to subscribe to users of their application and get notified via an HTTP Post when the data has changed so they can go and fetch it by invoking the Graph API endpoint.<br /><a href="http://developers.facebook.com/docs/api" id="wz6s" title="Graph API"></a><br />Some in the community were wondering why the <a href="http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.3.html" id="kz-q" title="PubSubHubbub">PubSubHubbub</a> protocol was not used and be concerned about issues like the Thundering Herd.<br /><br />It comes down to these three reasons: <b><br /></b><ol><li><b>The need for simple data modeling of any resource:</b><br /><ul><li>PubSubHubbub currently only supports Atom and RSS and we wanted to use JSON to match the rest of the Graph API so developers don't have to write additional wrappers.<br /></li><li>We need to syndicate changes to any type of resource, not just feeds or lists. The changes may include updating properties of a given resource or deleting the resource altogether. PubSubHubbub only supports appending to the list.<br /></li><li>The ability to do light pings where only the notification is sent. Not all the use cases require fetching the data right away but can still benefit from the notifications model as opposed to continous polling.<br /></li></ul><br /></li><li><b>The need for user authorization</b><ul><li>We needed to let users remain in control over what data is shared and with whom based on their privacy settings.</li><li>Facebook is committed to authenticity and quality and there are rules to encourage this.<br />So one of the main reasons why we could not use traditional PubSubHubbub is that it does not address authenticating the publishers or the subscribers to determine the quality of data being pushed in or the trust that the user has in the consumer.</li><li><i>As you may have seen, the Graph API is extremely powerful in its simplicity, flexibility and efficiency.<br />To query the Graph API you just need to figure out the url of the resource you are interested in fetching and use OAuth 2.0<br />Ex: https://graph.facebook.com/ciberch/feed?token=XXXX</i> we wanted to use a similar elegant approach for subscribing to notifications</li></ul></li><br /><li><b>The need for a more efficient content propagation architecture</b>.<ul><li>For those of you who are not familiar with the term, PubSubHubbub is a open protocol which allows exchange of news feeds in real time by POSTing changes to subscribers as they occur (this methodology is called web hooks). One of the main goals of PubSubHubbub is to allow the syndication of public feeds to any party. It works best when the same content is requested by a multitude of subscribers. For example CNN's feed would benefit from publishing to a hub that can help them service all their consumers. The publisher and the hub do not know or worry about how the information will be resyndicated. PubSubHubbub is built with small publishers and large hubs in mind which allow publishers to fan out. It is definitely a far superior to consumers polling publishers directly.<br /></li></ul></li></ol><br />In contrast to the CNN news example above, Facebook has a more personal relationship with their users.<br /><br />Here is an example to illustrate the challenge we would face trying to use PubSubHubbub. We have a user *Tim* wanting to share content with to a subset of people and applications and 2 applications: Sports Club and Restaurant Rating Site. The same content can't be sent to both applications because it would violate Tim's privacy.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9NbcVCU5x6QCxrtBcBEYpOTWpNTVQ_Xh-pum31kH-Kdlkm6BFvZVWfv3gzocq6SNKSr_KBSYht3QXBWEtyqw6g7LhEtrn41PF20ArqWZW2E59VoQ1xgm9YGpO3s3o4kiq6NEaq5TYi6k/s1600/AuthenticatedSyndication(3).png"><img style="cursor: pointer; width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9NbcVCU5x6QCxrtBcBEYpOTWpNTVQ_Xh-pum31kH-Kdlkm6BFvZVWfv3gzocq6SNKSr_KBSYht3QXBWEtyqw6g7LhEtrn41PF20ArqWZW2E59VoQ1xgm9YGpO3s3o4kiq6NEaq5TYi6k/s400/AuthenticatedSyndication(3).png" alt="" id="BLOGGER_PHOTO_ID_5473144977228313506" border="0" /></a><br /><br /><div>So what we needed was to provide a simple way for external developers to keep user's data in sync taking into consideration the authorization given by users and thus we selected to use OAuth 2.0 for subscription creation and for data retrieval.<br /><br /><br />This use case, as well as existing Facebook interaction requirements, materialized in the following three needs:<br /><ol><li>Need to have a <b>decoupled notification system</b> which allows to syndicate changes to <b>arbitrary data</b>.<br /></li><li>Need to only syndicate data to <b>authenticated</b> consumers<br /></li><li>The need for a more efficient data propagation architecture.</li><ul><li>The fact that Facebook only sends notifications of the content that changed means the consumer can always fetch the up to date version from the server. No need to check timestamps in case the updates were received in the incorrect order.<br /></li><li>The need for Facebook to act as a consumer aware delivery hub distributing the content of a relatively small subset of its publishers to another relatively small subset of interested consumers within a variety of multiple contexts</li></ul><ul><li>Facebook delivers personlized content to each user on each app and has a lot of users and apps. This means that it would not benefit from fanning out the same content to multiple consumers. Every user and every application gets different updates. In FB's world you see content through your social graph so everyone sees something different.<br /></li></ul></ol><br />The PSHB example below does not work for Facebook because it's neither a small publisher needing to fan out nor a traditional consumer agnostic hub. Facebook is only interested in syndicating the updates from Facebook users to trusted parties.<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8cGYcyJL8EOCIUwd6ZGPzizXDfMLNoUlf-6YyVQOKoKpyiBZKMePtQ45hnFWjf8DCMEsnDYM5L1pfDJ0cK8xJ5_2kDWFDWYhtB4yKQuiVNyfKLVuZW7TBhqQ1SC3j0iVEsrVfL8Hlz3I/s1600/AuthenticatedSyndication(5).png"><img style="cursor: pointer; width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8cGYcyJL8EOCIUwd6ZGPzizXDfMLNoUlf-6YyVQOKoKpyiBZKMePtQ45hnFWjf8DCMEsnDYM5L1pfDJ0cK8xJ5_2kDWFDWYhtB4yKQuiVNyfKLVuZW7TBhqQ1SC3j0iVEsrVfL8Hlz3I/s400/AuthenticatedSyndication(5).png" alt="" id="BLOGGER_PHOTO_ID_5473145201973299810" border="0" /></a><b><br /></b>We think that there are other platforms which may be facing similar challenges syndicating changes to arbitrarily modeled data to authenticated consumers.<br />Before the release of OAuth WRAP and OAuth 2.0 we had some discussions on the PubSubHubbub mailing list about using OAuth 1.0a topic url signing. Here is the <a href="http://code.google.com/p/pubsubhubbub/wiki/PSHBAndOAuth" id="kalv" title="proposal">proposal</a>. This is a good and simple enhancement and now with the release of OAuth 2.0 we can use a very similar approach.<br /></div>Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0tag:blogger.com,1999:blog-4006209913251426355.post-28839228409080466362010-05-16T06:29:00.000-07:002010-05-16T18:36:36.591-07:00Web Linking in JSON<p>This morning, I have been reading about <a href="http://tools.ietf.org/html/draft-nottingham-http-link-header-10">Web Linking</a>. This is in short a specification standardizing a common practice of making links "fat" with semantic goodness by adding attributes. There is a set of defined attributes and depending on those attributes, more attributes can be added. It's based on xml and comes in very handy for extending Atom and HTML.<br /></p><p>Here is an example of how I can reference a related blog post:<br /></p><div style="border: 1px solid; background-color: rgb(255, 240, 185);"><pre><span style="font-size:78%;"><link rel="related"<br />type='text/html'<br />href="http://gapingvoid.com/2007/10/24/more-thoughts-on-social-objects/"></span></pre></div><p>The rel attribute is very important as it defines the <a href="http://apirocks.com/html5/html5.html#slide18">relation</a> to the current element. There is in fact a <a href="http://www.iana.org/assignments/link-relations/link-relations.xhtml">registry</a> which takes care of keeping track of all the types of relations. Examples are: me, related, alternate, via, etc. The specification also talks about how to serialize those links on the header but we are going to focus on serializing the links in JSON.<br /></p><p>So what happens when we consider rendering feeds in JSON and have to deal with web linking ? While Xml has attributes and child elements, JSON objects only have properties. Therefore attributes and child elements in xml both map to properties in JSON. Structures with properties in JSON are objects. I bet you I am not the first one thinking how should we model an object that has a url to a human readable page in JSON? You may be tempted to simply copy xml verbatim and have an array of links. We actually did this in our Activity Streams JSON specification. It did not look very readable and clashed with our modeling of social objects. It was not clear when to model something as a fat link in a links array or as a native object.</p><div style="border: 1px solid; background-color: rgb(255, 240, 185);"><pre><span style="font-size:78%;">{<br />"title" : "Web Linking in JSON",<br />"author" : {<br />"id": "tag:facebook:2010:0293203920",<br />"displayName" : "Monica Keller",<br />"permalinkUrl" = "http://www.facebook.com/ciberch"<br />},<br />"permalinkUrl" : "http://montrics.com/blog"<br />"links" : [<br />{<br /> "rel" : "alternate",<br /> "href": "http://montrics.com/blog",<br /> "type" : "text/html"<br />},<br />{<br /> "rel" : "author",<br /> "href": "http://graph.facebook.com/ciberch",<br /> "type" : "application/json"<br />}<br />]<br />}</span></pre></div><p>Its a mismatch. This "links" is just a bag which can have a large variety of items, so why not just use the links' parent element ? Links are just objects.<br /></p><p>Furthermore social objects are fat links with type 'text/html' because they are publicly accessible and human interactive. This is an example of why should not model social objects one way and links independently. They are the same thing. We should represent <a href="http://tools.ietf.org/html/draft-nottingham-http-link-header-08#section-3">links</a> in JSON directly as properties where the property name maps to the relationship and type.</p><p>For example to list all link rel="related" type="text/html"<br /></p><div style="border: 1px solid; background-color: rgb(255, 240, 185);"><pre><span style="font-size:78%;">{<br />"title" : "Web Linking in JSON",<br />"link" : "http://montrics.blogspot.com/2010/05/web-linking-in-json.html",<br />"related_html_page" : [<br />{"link" : "http://tools.ietf.org/html/draft-hammer-discovery-05"},<br />{"link" : "http://openidconnect.com/", "title" : "OpenID Connect"}<br />]<br />...<br />}</span></pre></div><p>Keeping it simple.</p><p>Since joining Facebook I have been enlightened by the team's simplicity-first approach to pretty much everything: user interface, APIs and specifications. This vision has had substantial influence shaping external efforts as well: OAuth 2.0 and now we are seeing beginning efforts for <a href="http://openidconnect.com/">OpenID Connect</a>.<br /></p><p>The OpenID Connect idea is good and simple: once you know who the user is you will have access to get details about the user in <a href="http://www.json.org/">JSON</a>. It's not surprising that JSON is the format of choice for transmitting data. It's compact, takes no effort to deserialize and reads logically.<br /></p><p>Another the key ingredient for OpenID Connect is discovery. How do you go from a user's email address or OpenID url to knowing what endpoints to query to get the information ? Eran Hammer-Lahav has been working for several years in <a href="http://tools.ietf.org/html/draft-hammer-discovery-05">Discovery</a>. His work is amazing and inspiring and is becoming the foundation of many of the specifications we use today. In short it's a set of protocols describing how machines can discover and use apis. The one gotcha was that this used to be specified all using xml based on the Web Linking specification so Eran has started drafting a proposal for doing discovery and resource description in JSON called <a href="http://hueniverse.com/2010/05/jrd-the-other-resource-descriptor/">JRD</a></p><p>This is what caught my attention.<br /></p><p>Here is what this proposal would look like for JRD using simple web linking in JSON<br /></p><div style="border: 1px solid; background-color: rgb(255, 240, 185);"><pre><span style="font-size:78%;">{<br />"openid" : {"link" : "https://www.server.com/openid"}<br />"license" : {"link": "http://example.com/license"},<br />"lrdd" : {"template":"http://meta.example.com?uri={uri}"}<br />...<br />}</span></pre></div><br />I hope this recommendation for modeling links in JSON as objects using the relation is simple and useful and thanks to John Panzer and Martin Atkins for helping shed light on this issue.Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0tag:blogger.com,1999:blog-4006209913251426355.post-91120182190167949432010-02-12T12:04:00.000-08:002010-02-12T18:01:05.414-08:00This is the story of a girl....Who came all the way from Ohio to work at MySpace. Starry eyed at the thoughts of millions of concurrent users leveraging software she built, she packed her bags and moved across the country in a jiffy. It was not disappointing.<br /><br />MySpace was filled with color and character. There were many, many faces all over the amazing complex in Beverly Hills. There were crowded corridors filled with pictures of MySpace Secret Shows and meeting rooms with people excited doing collaborative design. This girl and her friends built the Activity Stream at MySpace and soon realized that it was essential for the stream to flow outside the walls for it to stay alive and thus she embarked on a quest to find a sensible way to exchange this valuable information about users at MySpace. In this quest she found new friends and realized that she truly identified with the values that they were fighting for: letting the user be in control, opening up the walled garden and allowing anyone big or small to have the same opportunities by using open standards.<br /><br />As you may have guessed, that girl, woman actually is me :) And today is my last day at MySpace. I am filled with nostalgia but excited about the future and pursuing my dreams.<br /><br />You may be surprised since I have been doing a series of conferences. As Group Architect I was able to not only work with the Activity Stream team but also on the Developer Platform with the backing of the COO, I was able to have my ideas heard and executed. It was these projects which provided massive openness of the user’s MySpace data via Open Standards like <a href="http://openid.net/" target="_blank">OpenID</a>, <a href="http://oauth.net/" target="_blank">oAuth</a>, <a href="http://www.activitystrea.ms/" target="_blank">ActivityStrea.ms</a> and <a href="http://code.google.com/apis/pubsubhubbub/" target="_blank">PubSubHubbub </a>that filled me with joy because of all the possibilities we provided for other people to <a href="http://developer.myspace.com/" target="_blank">be creative</a>.<br /><br />But I have chosen to leave. While I was able to have some temporary creative freedom this is not the norm or part of what other engineers enjoy and I do not feel there is one cohesive push to deliver the best we can deliver anymore.<br /><br />To my friends and colleagues at MySpace, some parting advice:<br />It is imperative that MySpace puts in place strong technical leadership who can attract good technical talent and make well-informed decisions. It is important that they stay connected to rest of the world and work on interoperable standards and solid products which benefit the end user. Many of my fellow engineers have fantastic ideas and a plan for phased delivery.<br /><br />I wish them the best of luck and I am sure we will cross paths and work together.<br /><br />If everything goes as planned, I will also be working with more of you in the community and helping showcase and build upon one of the most incredible social products I have ever seen.<br /><br />Yes that is right ! I am happy to announce that I have decided to join <a href="http://www.facebook.com/ciberch">Facebook</a> as an <span style="font-weight:bold;">Open Source and Web Standards Program Manager</span>.<br /><br />I will be working closely with <a href="http://www.facebook.com/davidrecordon">David Recordon</a>, <a href="http://www.facebook.com/luke.shepard">Luke Shepard</a> and another fantastic group of people.<br /><br />This is going to be a great year. Get ready !Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com22tag:blogger.com,1999:blog-4006209913251426355.post-43129737464610530722009-12-19T10:52:00.000-08:002009-12-19T11:00:28.807-08:00MySpace Developer ContestOur apis are so easy and I have a couple ideas for cool apps but:<br /><br /><a href="http://www.myspace.com/developerchallenge">http://www.myspace.com/developerchallenge</a> says:<br /><br /><em>>>Employees of Sponsor, their advertising or promotion agencies, those involved in the production, development, implementation or handling of this Contest, any agents acting for, or on behalf of the above entities, their respective parent companies, officers, directors, subsidiaries, affiliates, licensees, service providers, prize suppliers and fulfillment companies, and any other person or entity associated with this Contest (collectively, the " Contest Entities") are ineligible to enter or win this Contest. Household Members and Immediate Family Members of such individuals are also not eligible to enter or win. "Household Members" shall mean those people who share the same residence at least three months a year. "Immediate Family Members" shall mean parents, step-parents, legal guardians, children, step-children, siblings, step-siblings, or spouses. Contest void where prohibited.</em><br />Sadnesss ! I could really use the 10K !<br /><br />If anyone is trying to get a head start on this:<br /><a href="http://www.myspace.com/developerchallenge">http://www.myspace.com/developerchallenge</a><br />And has questions go to: <a href="http://groups.google.com/group/myspace-apis">http://groups.google.com/group/myspace-apis</a>Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0tag:blogger.com,1999:blog-4006209913251426355.post-77619645566161883542009-12-05T07:55:00.000-08:002009-12-05T08:09:13.256-08:00Answering the real time flow questions before the SuperNova panel<p style="margin: 0in; font-family: Calibri; font-size: 11pt; color: fuchsia;">#sn09: We are moving from a Web of pages and sites to a rich continuous stream of online interactions. </p> <p style="margin: 0in; font-style: italic; font-family: Calibri; font-size: 11pt;">@ciberch:<span style=""> </span>Yes our online world is modeling closer the physical world which is immense and filled with streams of events upon events (acontecimientos)</p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt; color: fuchsia;">#sn09:This new model snuck on us though social networks and micro blogging, but it is quickly becoming an aspect<span style=""> </span>of the online experience. </p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;">@ciberch: The reason why it came from social networking is by no means a surprise. These websites were made to allow the user to be social. Its impossible to be social without introducing yourself . Sites like MySpace allow users to create an online identity and present their virtual face to the world.</p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;">User:<span style="font-style: italic;"><span style=""> </span>I like to have a social circle of people to interact with on a variety of topics.</span></p> <p style="margin: 0in; font-style: italic; font-family: Calibri; font-size: 11pt;">User:<span style=""> </span>You may be far but here is my picture, my name, my overall likes/dislikes</p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Well in real life the users are not sitting still waiting for visitors to stop by. They are not sitting there repeating the same information over and over.<span style=""> </span>That’s how social networks started…. We know that after the second visit to someone's profile the only thing the visitor cares about is <span style="font-style: italic;">what changed</span></p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt; color: rgb(51, 153, 102);">The need to convey news came from users as a reflection of their lives via blogs, bulletin boards, forums, journals even just changing your picture, theme or display name.</p> <p style="margin: 0in; font-style: italic; font-family: Calibri; font-size: 11pt;">Streams: Close the divide of space but also time</p> <p style="margin: 0in; font-style: italic; font-family: Calibri; font-size: 11pt;">User: I don't really want to go bother everyone right now to tell them what happened but it would be great if they can see this later and let me know what they think.</p> <p style="margin: 0in; font-style: italic; font-family: Calibri; font-size: 11pt;">Lifestream is the new identity: What a user does, how others react</p> <p style="margin: 0in; font-style: italic; font-family: Calibri; font-size: 11pt;">The opinion of someone you trust on a certain topic is the most valuable</p> <p style="margin: 0in; font-style: italic; font-family: Calibri; font-size: 11pt;">One to many disconnected chat</p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt; color: fuchsia;"> </p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt; color: fuchsia;">#sn09: How will the flow model alter the business landscape and user expectations ?</p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;">@ciberch: When users interact with businesses, they know the businesses have ulterior motives:<span style=""> </span>make money</p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Users need things from businesses. Adding a social layer to a business will help the user realize the value of the businesses' offering.<span style=""> </span>Adding streams (ratings/reviews) also helps businesses provide the identity/value of a product. Similar to the lifestream for a thing. Also on the reverse businesses will look at individuals public lifestream to reflect the person's character and potentially make some decisions based on that.</p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt; color: rgb(51, 153, 102);">Therefore, it is important to be able to exchange these streams. Users don't do everything in one site, the same way as users don't just go to one store or eat one restaurant or live in one town for the rest of their lives.</p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt; color: rgb(51, 153, 102);"> </p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;">We still are living in the midst of the information age.<span style=""> </span>Information and knowledge inevitably equates to better decisions: better responses and better communication.</p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Humans are social by nature and empowering them with the information to make their social interactions more precise is very valuable.</p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Another aspect of humans is the desire to <span style="color: rgb(51, 153, 102);">self express</span> and contribute thus asserting their value. With this goal in mind many of us have spent hours and hours building personal web sites, blogs, taking pictures, videos, writing songs.<span style="color: rgb(51, 153, 102);"> They want to be discovered and places like MySpace with the stream allow for this happen.</span></p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Finally another aspect of humans is their competitive spirit and desire to surpass others in some particular areas. To be recognized as creative minds or reputable curators of content and share important information</p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;">The availability of information levels the playing field and builds meritocracies.<span style=""> </span>Anyone can learn, analyze, comment</p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Shared development, collective intelligence. On demand indexing and correlating</p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p> <p style="margin: 0in; font-family: Calibri; font-size: 11pt;">It is the only way we can process this mass of information, conquer it together and evolve</p><br /><br />What actually happened was here:<br />http://www.ustream.tv/recorded/2695517Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0tag:blogger.com,1999:blog-4006209913251426355.post-49992765965389737882009-10-02T11:15:00.000-07:002009-10-02T11:19:56.567-07:00Expense Training LessonSo I have about 3 months of expenses to be reimbursed by work. Most of them are taxi receipts from SFO to work and to different meetups. I have been told I need to attend a lesson to finish submitting my expenses.<br />I am sitting here listening to the Oracle expert tell me I need to use IE for the best experience on their new finance tool. Funny to hear companies are still so into IE<br />IGN guy is annoyed the lesson is MySpace specific. I am now done eating Meghan's delicious pumpkin cake and tapping my leg wanting to leave.<br />No single sign on -- lameMonicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0tag:blogger.com,1999:blog-4006209913251426355.post-68777723621060151912009-09-27T00:05:00.000-07:002009-09-27T00:16:30.963-07:00Sf vs LAI am contemplating moving SF soon so I can be in the same city as @n2frizbee and be able to properly plan our wedding and the rest of our lives.<br /><br />The only problem is that i have made so many friends here in LA and at MySpace that its really hard to think of not seeing them again.<br /><br />Even through the harder times when everyone is bitching we find ways to laugh it off and pull through it.<br /><br />I guess LA is more of a city for single beautiful people. SF is a city for smart friends and more family values.<br /><br />It would be so cool if I could take my sister Mary with me.Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0tag:blogger.com,1999:blog-4006209913251426355.post-13048163129061352502009-08-30T16:10:00.000-07:002009-08-30T16:54:11.310-07:00Cerebral Snapshot<p><strong>Left</strong></p><ol><li>Man on Southwest Flight 3149 from LAS to LAX: I repeat you cannot save seats. Much less 6 seats with a full plane !</li><li>Taxi drivers are really nice when the economy is shit. Today one offered be complimentary bottled water... (I didnt accept it but gave him an extra buck)</li><li>Vegas is the best quit smoking plan -- cough cough -- so that's where all the smokers went</li><li>Damn I accidentally bought an Ed Hardy shirt....</li><li>Eating Healthy Choice Tortilla soup when temperature im my apt > 85F is a bad idea</li></ol><p><strong>Right</strong></p><ol><li>The only way to scale is to be redundant. </li><li>Semantics are king</li><li>Progressive enhancement means Microformats and ActivityStrea.ms</li><li>You must inject the microformats server side </li><li>Don't bother exposing an API full of GETs</li></ol><p></p>Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0tag:blogger.com,1999:blog-4006209913251426355.post-44819167388003901352009-08-23T10:06:00.000-07:002009-08-23T12:04:08.962-07:00OpenID RegistrarsRecently I saw Mr. Messina's mocks for teaching the user what an OpenID is and how to get one or use an existing one. See <a href="http://www.flickr.com/photos/factoryjoe/3841182425/">http://www.flickr.com/photos/factoryjoe/3841182425/</a><br /><br />I feel that this is still complicated for a regular end user. They just want to log in or signup for the new service as fast as possible.<br />The open id relying party should be able to just show the user their openids with the last one they used selected so the end user does not even have to bother typing anything if they don't want to.<br /><br />I would like to propose a potential solution to this. When a provider creates an openid for a user they register it with an "OpenId Registrar". The OpenID registrar will cookie the user.<br /><br /><br />An OpenId Registrar keeps track of all the identities a user has. It will have APIs similar to the Social Graph Apis from Google. Given one OpenID from a given provider you can get the rest. This can also be supported via webfinger. Given an email address give me all the openids for the person. And with the help of the cookie it can say give me what openid provider I should present to this user.<br /><br />So the way in which having an OpenID registrar would solve the NASCAR issue is that it will provide an API which returns the list of OpenIDs for the user on that browser and the last one used. Which means the registrar should also have an endpoint which can be invoked to store which provider was just used.<br /><br />Fairly simple but should address end user confusion.<br /><br />What do you think ?Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com1tag:blogger.com,1999:blog-4006209913251426355.post-36871196580017418782009-06-06T16:54:00.000-07:002009-06-06T17:27:54.109-07:00MySpace comeback<ol><li>Make a huge public contest/tv series "Who will be the next Tom ?" Episodes will show contestants every day life and how they portray this on MySpace. TV show will also demonstrate how to do cool things to your profile page and link to videos on the site teaching you the tips and tricks.</li><li>Users of MySpace follow and vote online for the Next Tom</li><li>Create a secondary contest to pick the best profiles. This contest will include challenge questions to make sure the applicants are "for real".</li><li>Select multiple winners each representing a different audience. </li><li>New Toms will be VIP</li><li>The real people from #3 will get a list of challenges to defeat to become VIP</li><li>Vips will not get ads on their profile page or can have their own adds.</li><li>Developers from MySpace will add modules which allow you to show your friends across all networks.</li><li>Vips will be able to nominate 5 friends for vip. These people will have to face the challenges and can then invite more friends.</li></ol><p>And so the user cleansing continues until you have a site with awesome members excited about bringing others on board and a true understanding of why the people are here.</p>Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com1tag:blogger.com,1999:blog-4006209913251426355.post-6174811012054758702009-06-06T15:40:00.000-07:002009-06-06T16:54:01.481-07:00Why MySpace ?MySpace started off helping those looking to <strong>self promote</strong>. Primarily bands. They could easily setup "their website" on MySpace.<br />I think there is now an even broader market for self promotion. Everyone wants to be a celebrity in their own right. Whether you are well known for your musical talents or for your basketball skills or for how ridiculously good looking you are (zoolander joke there). Whatever the reason you are a proud individual with ideas, accomplishments and things to share. This is a time to prove yourself !<br /><br />MySpace can provide an immense personalization layer. Our users can really "go to town" expressing their individuality via their MySpace profile with: custom art, media and other rich content including information from other sites. This is not something that you can easily do on Facebook or Twitter. They just list a partial set of activities and maybe allow you to change your background. MySpace however allows you complete control of everything displayed and how its displayed.<br /><br />You may not always have the time or creativity that is why we have many tools to help you build your personal brand. Our offering has hundreds of pre built themes and modules of content you can add in two clicks. You can definitely use MySpace as your personal web page and remember if you look good we look good !Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0tag:blogger.com,1999:blog-4006209913251426355.post-15982362477719147142009-05-26T22:11:00.000-07:002009-05-27T14:20:17.148-07:00Web Evolution: Implementors Needed !My response to:<br /><a href="http://www.readwriteweb.com/archives/activity_streams_poetry_or_nihilism.php">Web 3.0 Might Be Really Stupid</a><br /><br />Given that the first implementations of the activitystrea.ms standard went live about 2 months ago. I think its premature to call the lack of analytics around this new offering <em>stupid</em>. The analytics are evolving and many of those will be feeding into the recommendations engine. There is a lot of opportunity in this field.<br /><br />As described in this <a href="http://hbswk.hbs.edu/item/6185.html">recent article</a> exploring how friends influence purchases<br />>> "Moderately connected" users exhibit "keeping up with the Joneses" behavior. On average, this social influence translates into a 5 percent increase in revenues.<br /><br />Additionally, we should not shy away from investigating hyper targetting and ad placement models. After all every item in your activity stream can be considered a personal ad that you want your followers/friends to read. How to make it more memorable ? How to get the user to interact ?<br /><br />Incidentally, I was just mentioning to Chris Messina last week that the Activities team at MySpace has already gotten initial approval to provide a user's public activitystrea.ms feed in order to encourage adoption. And no, not because no one wants to consume MySpace's feed.<br /><br />We have several large partners and don't forget the fact that MySpace has more than 70 million total unique users in the US (as of the March 2009 comScore data). However, I do agree a public feed would provide more portability so we are reviewing this proposal.<br /><br />Bottom line is we are doing everything possible to promote a smarter web and we need everyone's collaboration. Whether its producing smarter feeds or consuming this feeds and creating another consumable a bi-product. Stop pondering on how far others will get and jump on the implementors side.Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0tag:blogger.com,1999:blog-4006209913251426355.post-88122301765773074392009-05-23T18:56:00.000-07:002009-05-23T19:35:09.130-07:00Collaboration of Opensocial apps via the StreamLast week at IIW #8 Scott Seely, Martin Atkins and myself worked to add the hooks to the Opensocial APIs (0.9) in order to facilitate developers adding the full fidelity version of their activities into the stream.<br /><br />The results of our collaborative brainstorming is here:<br /><a href="http://wiki.activitystrea.ms/OpenSocial-Activity-Publishing-Integration">http://wiki.activitystrea.ms/OpenSocial-Activity-Publishing-Integration</a><br /><br />The main concept behind this was to allow developers to reference an optional tranformation bundle which maps the fields in the activity raised to the proper objects in activitystrea.ms like for example the author, verb, object type and most importantly all the properties of such object: unique id, name, annotations, url, thumbnail, etc<br /><br />The main pros of this approach is that it allows for the activitystrea.ms standard to evolve orthogonally.<br /><br />All this led me to thinking:<br />Could we in fact provide such flexibility to our app developers where their products (the activities) could cross reference one another ? After all the ids are gobally unique. WHy could we not have the activities from one app reference the object of another domain ?<br /><br />Imagine this scenario:<br /><br /><u><span style="color:#3333ff;">John Mayer</span> Vanderbilt show on May 22nd 2009</u> <strong><span style="color:#3333ff;"><span style="font-size:78%;">photo stream</span><br /></span></strong><ul><li><span style="color:#3333ff;">Deb </span>loves the new look on <span style="color:#3333ff;">John</span> >> from <em>IFan</em> <span style="font-size:78%;">Just Now</span></li><li><span style="color:#3333ff;">Monica</span> is wondering why <span style="color:#3333ff;">John</span> takes so long ! >> from <em>Ticketberry</em> <span style="font-size:78%;">2 minutes ago</span></li><li><span style="color:#3333ff;">John </span>is getting ready to go on stage >> from <em>IRockstar</em> <span style="font-size:78%;">4 minutes ago</span></li></ul><p>Similar effects have been achieved with machine tags however there is no need for that given that the activities stream provides global unique identifiers. Surely one can produce a consumer which can leverage this and properly group based on the object id ?</p><p></p>Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0tag:blogger.com,1999:blog-4006209913251426355.post-46570105302046435632009-03-17T20:49:00.000-07:002009-05-28T20:50:59.523-07:00Activities for EveryoneAn activities stream is a list of activities. <br />The reason why its called a stream is because new activities are continuously being ingested and in turn delivered to a variety of places. Fresh information is always flowing on the activities stream.<br /><br />So what exactly are activities ?<br />Activities are summaries of actions taken such as writing a blog entry, uploading a video or accepting a tag in a friend's photo. The point of activities is to provide snippets of information and let the reader decide if they want to do further research. It’s a stream not an ocean.<br /><br />Activities are important because they provide a medium to tell your story effortlessly to a broad audience. Here are some details about the current state of the MySpace audience:<br />MySpace has 76 million users in the U.S. alone (world’s #1 online ad market)<br />MySpace is the most trafficked site in the U.S.<br />Users spend more time on MySpace than all social networking sites combined.<br />MySpace is the #1 most viewed site for teens age 15-17.<br /> 55% of all online teens visit MySpace.<br /> MySpace reaches 60% of all adults age 18-24.<br /> MySpace reaches 41% of all adults age 24-54.<br /><br /><br />For example on MySpace as soon as you upload photos from your latest trip, all of your friends who are following you will see the name of your photo album and the latest five photo thumbnails with links to see more on their homepage. Basically you do something, we record it and surface it your friends.<br /><br />But wait a second, what if I don't want all my friends to know I just did something ?<br />MySpace also allows you to select what kinds of activities will go into the stream, not only that, but we also respect the viewing privacy of the social objects your create. If you upload photos into a private album for example we are not going to turn around and tell the whole world about. Furthermore, you can choose friends on your list not to surface your updates to and on the other hand if you are the kind of open social being that gives us high SEO marks, you can also choose to display your friend updates on your profile and have anyone in the world soak up with your latest news or control access by Friend Categories. The real bottom line is that this is your data and you have complete control.<br /><br />So what can MySpace Activities Stream do for me ?<br />Well it depends on who you are !<br />If you are a musician in band you can keep connected with your fans by updating your status to give them an insight into your life on the road. You can also easily add shows to your profile and have those surfaced to all your fans in the area where the show is.<br />Most importantly you can upload new music and have the new tracks featured on the stream for all your fans to hear with the lick of the play button. The music player allows fans the ability to purchase songs. Also as new people become friends with you, the band, this new connection will be featured on the activities stream for the friends of your fan thus publicizing your band.<br />If you love music and love sharing your finds with your friends then rest assured that every time you make a public playlist your friends will be able to check it out and play the songs and see if they want to buy them or make them part of their playlists. In fact your friends can go into a view called songs recently added by friends and have a filter view of just the music activities.<br />If you are a comedian or ad-hoc entertainer you can upload videos of your shows and have those be surfaced on the activities stream. Once your fans add them to their Favorites list this activity will also be surfaced with their friends and cause a viral effect.<br /><br />Activities provide a conduit for very subtle communication to those who have the time to listen. Sometimes friends just read. Other times they will write comments back. At MySpace we have been making it easier for your friends to give you feedback on what you did.<br /><br />If you are always on the go you can take pictures with your phone and have your mobile adventures featured on the activities stream. Also from mobile devices you can get all of the latest activities your friends are doing. And with the use of standards such as oAuth and atom activity streams, MySpace is now delivering your stream to other social networks like Google, Yahoo, AOL and coming soon Windows Live.<br /><br />So how rich is our activities offering today ?<br />MySpace provides a core set of about a dozen activities which represent the main functionality provided by the site: Building friendships, Sharing music, photos, videos, writing blogs, updating your status, organizing events such as concerts for bands and interacting with applications. Soon we will be providing ratings and reviews of local spots as well. <br />Yes that is a lot of stuff but we also take consideration in reducing the noise<br />For example, It is important to notice that surfaced activities are only creational or positive. If a user decides to remove a video from being a favorite we simply extract the original favorite activity from the feed rather than spamming the readers. The activities stream (exposed in human readable format) depicts the end state of the actor with the social object.<br />We also consolidate information when several actors (users) perform the same activity and when a single user performs many similar activities like uploading a gallery of photos or befriending several musicians. The whole point is to make the activities stream digestible.<br />When you follow someone's stream you get to see how they interact with the world on a daily basis. If they start liking a new band, make a music playlist, recommend a new nightclub, movie or book or dig a new political figure.<br />Getting to know someone via their activity stream is much more real than reading a static list of interests and about me fields which was edited about a year ago.Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com2tag:blogger.com,1999:blog-4006209913251426355.post-48154968643141857652008-12-07T20:44:00.000-08:002009-05-28T20:46:48.101-07:00Status Updates Grow UpIn honor of the awaited release of the Halloween emoticons for status updates I have decided to put down in writing my very geeky thoughts about how status updates need to evolve.<br /><br />Ok first off most users get status updates all wrong. The question is<br />"What are you doing right now ?"<br />If users realized this, updates would be pretty boring and filled with the same old "updating my mood" status<br />What users really want to tell you is what they just did. So most updates take the shape of<br />"Relaxing after winning a 5k marathon"<br />Mood: Triumphant<br />So my 1st thought, being the queen of activities and all, is<br />1 Why are people always bragging - lol<br />and<br />2 These are loosely coupled activities ! We can do so much more<br /><br />Let's kick Twitter and Facebook's ass<br /><br />How ?<br /><br />With metadata. Easy<br /><br />We should have a menu of possible things a user will feel like updating their status with.<br />It would have to be a easy to use UI with adorable icons (yes more, more, more icons) of "unplugged activities" like shopping, partying, reading (fine), going to the movies, whatever<br /><br />Not only that but this is a social site. Most users are not that big of losers that everything they do is alone. Let's get that good looking control we have for choosing friends (which now displays real names - woot) and put it to good use.<br />I want to be able to say:<br />Monica went to dinner at Chaya with (click-pick) "Matt"<br />Matt would obviously be a link to my boyfriends profile<br /><br />And this would be shown on my activities stream to my friends next to a little plate/fork/knife icon<br />Oh yeah and by the way Chaya should be a link to the actual restaurant portal on MySpace. I don't know a ton about MySpace Local but sounds like that is what it is for.<br /><br />And here is the final killer effect. When Data Availability gets released and a user orders a book from Amazon we can automatically raise these loosely couple activities like "bought a book" and make the user feel like we are doing them a favor !!Monicahttp://www.blogger.com/profile/15315069813623115222noreply@blogger.com0