<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog &#187; google wave</title>
	<atom:link href="http://antimatter15.com/wp/tag/google-wave/feed/" rel="self" type="application/rss+xml" />
	<link>http://antimatter15.com/wp</link>
	<description>this title probably isn&#039;t very original</description>
	<lastBuildDate>Fri, 23 Jul 2010 21:21:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Deep Integration Wave Embed API</title>
		<link>http://antimatter15.com/wp/2010/06/wave-embed-api/</link>
		<comments>http://antimatter15.com/wp/2010/06/wave-embed-api/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 18:29:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Anony-bot Embed]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Wave]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[embed]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[im never doing this again]]></category>
		<category><![CDATA[insanely long]]></category>
		<category><![CDATA[longest post ever]]></category>
		<category><![CDATA[shortfalls]]></category>
		<category><![CDATA[super duper insanely long]]></category>
		<category><![CDATA[wave]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=1049</guid>
		<description><![CDATA[Can you tell that the screenshot on the left is actually an embedded wave? Probably not. First, a little overview on what this is. A lot of people are interested in using Google Wave as a commenting system, however the official embed api at the current state suffers from several shortfalls. It&#8217;s tedious to operate [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://antimatter15.com/wp/wp-content/uploads/2010/06/Selection_076.png"><img class="alignnone size-full wp-image-1050" title="Can you tell that Wave is the backend? I think not." src="http://antimatter15.com/wp/wp-content/uploads/2010/06/Selection_076.png" alt="" width="312" height="406" /></a><a href="http://antimatter15.com/wp/wp-content/uploads/2010/06/Selection_078.png"><img class="alignnone size-full wp-image-1051" title="Just to prove that it's really synced with wave" src="http://antimatter15.com/wp/wp-content/uploads/2010/06/Selection_078.png" alt="" width="308" height="448" /></a></p>
<p>Can you tell that the screenshot on the left is actually an embedded wave? Probably not.</p>
<p>First, a little overview on what this is. A lot of people are interested in using Google Wave as a commenting system, however the <strong>official embed api at the current state suffers from several shortfalls</strong>. It&#8217;s tedious to operate a wave-integrated commenting system. As an author, you have to <strong>manually create a wave for every post</strong>, copy the content over to the wave, get the wave ID, and paste it into your template. Every time you change your post, you have to yet again manually sync the page with wave. Once you&#8217;ve gotten the wave into the page, the embedded wave itself has a few issues. You <strong>can&#8217;t style it using CSS</strong>, and you can only change the background color and font. The width can&#8217;t adjust to the width of your page after the initial load. There&#8217;s no way to get rid of or change the style of the<strong> huge blue border</strong> around it. It<strong> forces it&#8217;s own scroll bar</strong> which looks nothing like anything else on the page and <strong>prevents intuitive navigation</strong> of comments using the same scrollbar as the rest of the page. Lastly, there&#8217;s no way for anonymous readers to comment on the post.</p>
<p>For each of these issues,<strong> the new w2_embed api offers a solution</strong>. Instead of using iframes to hack another page onto the current one, this one is built into the page, injecting elements directly onto the page&#8217;s DOM. These<strong> elements can be styled in nearly any imaginable way through CSS and HTML</strong>. The sandboxed and namespaced single-function API allows for multiple waves on one page with less than 10KB of JS overhead (Compare to about 1.4 megabytes). Instead of relying on a special Wave ID, the app uses a centralized and remotely stored database which associates any identifier you provide with functional wave IDs. That means, that instead of using a string like <code>googlewave.com!w+Blsm0RMW_A</code>, you have the URL of your blog, say <code>http://antimatter15.com/wp/2010/06/wave-embed-api</code>. Not only that, but it can <strong>automatically pull the title of your wave, the authors, the permalink and tags from the post, automatically create a wave from that with the same tags and title with the content automatically set as the root blip as well as a permalink back to the blog post</strong>. When viewed from wave, the user can follow, unfollow, search and find waves using the exact same familiar interface. On your blog, you can make the wave backend entirely seamless and subtle. Since it&#8217;s built on top of Anonybot<strong>, people can reply blips without having google wave</strong> accounts right from your blog.</p>
<p>It&#8217;s all part of a new embed API built upon Anony-bot (which itself is built upon microwave, which is built on wave reader, which is built upon the prototype python desktop client&#8230; Someone should make a wordpress plugin for this to make this family history even longer).</p>
<p>The<a href="http://antimatter15.com/wp/2010/06/anony-bot-embed-api/"> last post noted the beginning of this project,</a> and here is part two. The API has been cleaned up a lot. The code has been simplified. Features added and design changed.</p>
<p>The major change is a total decoupling of it and the mainline Anonybot codebase. There are some major implications of the change. In the original prototype of the API, it still had the iconic blip context menu inherited from microwave. That&#8217;s gone. So is the participants bar, link to real wave client, blip html, blip content, reply box, and everything. There are now no required or automatically added html/dom elements. Everything is specified through a <strong>simple HTML templating engine</strong>. Since the code isn&#8217;t shared, changes from each individual project now on probably won&#8217;t be instantly applied to both. This has advantages and disadvantages. On the plus side, is that changes to anonybot won&#8217;t break the embed api. However, bug fixes on one may not propagate to the other.  The code can be much smaller since features like search, which was previously hidden, can now be totally removed. Also, since it&#8217;s been rewritten from scratch as an embed api, it no longer exposes any extra globals and multiple embeds can be done for each page.</p>
<p>The biggest change is the templating engine. Before, it only worked with the blip design, but now it&#8217;s totally integral to every aspect of the interface. Lets walk through the basics of the API, starting with a minimal example.</p>
<p><script src="http://gist.github.com/458802.js?file=w2_embed_demo.html"></script> All the content is wrapped in a huge hidden <code>div</code>, and inside is one element with the <code>wavebody</code> class. That huge wave is the scope of the templating engine. That means that if you put <code>{{1+1}}</code> anywhere inside the <code>div</code>, it&#8217;ll show up as 2. Place it anywhere outside the div, and it shows up as <code>{{1+1}}</code>. Simple, right? The <code>wavebody</code> element is where the actual blips will go. But since there aren&#8217;t any blips beforehand, <code>wavebody</code> is filled with the template for a single blip. The content gets multiplied several times and that makes the wave.  The template scheme is really simple. Basically, you just wrap arbitrary JS code within <code>{{</code> and <code>}}</code>. The code gets executed (in the scope of the wave) and the block gets replaced with the return value of the script. When you&#8217;re inside <code>wavebody</code> there are a few additional blip-specific things that you can add. Now we have to learn the magical snippets of code you can use inside the curly brackets.  One of the objects exposed to the templates is <code>wave</code>. The nice thing is that it mirrors <a href="http://code.google.com/apis/wave/extensions/robots/protocol.html#Wavelets">the wave api</a>. So the wave object exposes the following attributes (copied from the google page).</p>
<ul>
<li><code>creationTime</code> denotes the <a href="http://en.wikipedia.org/wiki/Unix_time">Unix time</a> at which this wavelet was created.</li>
<li><code>creator</code> denotes the address of the participant who created this wavelet.</li>
<li><code>lastModifiedTime</code> denotes the <a href="http://en.wikipedia.org/wiki/Unix_time">Unix time</a> at which the wavelet was last modified by any participant.</li>
<li><code>participants</code> contains an array of participant IDs for all participants on the wave.</li>
<li><code>rootBlipId</code> contains the Blip ID of the root blip.</li>
<li><code>title</code> contains the title of the wavelet, which by default consists of the first line of text up to the first carriage return.</li>
<li><code>version</code> contains the version of this wavelet. Each atomic operation on a wavelet increases this version number.</li>
<li><code>waveId</code> contains the Wave ID of this wavelet.</li>
<li><code>waveletId</code> contains the wavelet ID of this wavelet. Note that for waves which contain only one wavelet (that don&#8217;t have private conversations, in other words), this wavelet ID is usually of the form <code>conv+root</code> indicating that the wavelet is identical to the conversation root, the root wave.</li>
<li><code>dataDocuments</code> contains a dictionary (associated array) of the IDs and data of any data documents attached to this wavelet.</li>
</ul>
<p>In addition, there are a few non-standard components.</p>
<ul>
<li><code>permalink</code> contains a link to the waveref which points to the specific wave on the real wave client</li>
<li><code>blips</code> contains a js object (similar to a hash or dictionary) of blipIDs associated to blip objects</li>
<li><code>bliparr</code> contains an array of blip ids in no particular order, most frequently used for getting the number of replies in a conversation in <code>{{wave.bliparr.length-1}}</code></li>
</ul>
<p>There are also some functions you can call. For example, <code>wave.creationTime</code> is in the form of a unix timestamp. That probably isn&#8217;t too useful to an ordinary user, so a <code>format_time</code> function is there to format it like &#8220;6/30 10:45am&#8221;. If you want to have some other custom datetime format, get me a script to do it in javascript in less than 500 bytes and I&#8217;ll include it in the next version.</p>
<ul>
<li><code>format_time(int)</code> Format a unix-style date as a human-readable &#8220;6/30 10:45am&#8221; or if you prefer &#8220;m/d h:MMtt&#8221;</li>
<li><code>render(blip)</code> Render a blip and return the HTML. Most of the time, it&#8217;s unnecessary as there&#8217;s a blip.html attribute</li>
</ul>
<p>There are a few actions that you can do. Certain strings like <code>{{addparticipant}}</code> can be used in <code>onclick=</code> attributes to trigger certain actions on various events.<br />
 <script src="http://gist.github.com/458944.js?file=events.w2_embed.html"></script></p>
<p>Here you see a link and a button. The link has been configured to prompt the user for a participant ID to add when clicked, and the button was set to prompt the user for a tag to add when clicked. There are several such actions.</p>
<ul>
<li><code>addparticipant</code> Prompt the suer for a wave address to add to the wave</li>
<li><code>reload</code> Reload the current wave</li>
<li><code>addtag</code> Prompt the user for a tag to add</li>
<li><code>setname</code> Prompt the user to set a username for posting</li>
</ul>
<p>There is also the user list. It comes in two flavors, <code>{{participantlist}}</code> and <code>{{contributorlist}}</code>. The latter only works when inside a blip scope (the stuff inside <code>wavebody</code>). They&#8217;re special because they&#8217;re actually interactive. When the list is long, it shortens it and creates a link to expand.</p>
<ul>
<li><code>participantlist</code> A list made from wave.participants</li>
<li><code>contributorlist</code> Only works when in <code>wavebody</code>, a simple users list made from blip.contributors</li>
</ul>
<p>Now, is finally the stuff that goes in the blip. Like <code>wave</code> it extends some wave api features, so I&#8217;ll start with<a href="http://code.google.com/apis/wave/extensions/robots/protocol.html#Blips"> pasting what google has documented</a>.</p>
<ul>
<li><code>blipId</code> contains the ID of blip in which the event occurred.</li>
<li><code>childBlipIds</code> contains an array of blip IDs for each of the blip&#8217;s children.</li>
<li><code>contributors</code> denotes participants who have contributed to the state of this blip.</li>
<li><code>creator</code> denotes the participant who created this blip.</li>
<li><code>lastModifiedTime</code> denotes the <a href="http://en.wikipedia.org/wiki/Unix_time">Unix time</a> at which this blip was last modified by any participant.</li>
<li><code>content</code> contains the textual content of this blip.</li>
<li><code>version</code> contains the version of this blip. Each atomic operation on a blip increases this version number.</li>
<li><code>waveId</code> contains the Wave ID associated with this blip.</li>
<li><code>waveletId</code> contains the wavelet ID associated with this blip. Note that for waves which contain only one wavelet (that don&#8217;t have private conversations, in other words), this wavelet ID is usually of the form <code>conv+root</code> indicating that the wavelet is identical to the conversation root, the root wave.</li>
</ul>
<p>There are a few additional methods which, again are non-standard.</p>
<ul>
<li><code>permalink</code> contains a link to the waveref which points to the specific blip on the real wave client</li>
<li><code>html</code> contains a string of the rendered (with formatting and annotations applied) content</li>
</ul>
<p>There are also actions, similar to the global <code>addparticipant</code>, <code>reload</code> and <code>setname</code> actions. They can still be used within <code>wavebody</code> but there are some actions which can <em>only</em> work in the blip template.</p>
<ul>
<li><code>edit</code> Add an edit box immediately below the blip, pre-populated with the text content of the blip</li>
<li><code>remove</code> Remove the blip, it will first issue a confirmation prompt to the user</li>
<li><code>reply</code> Add a reply box immediately below the blip. If there is already a blip below, the reply box is indented.</li>
</ul>
<p>Below is a little example showing how to use the <code>blip</code> object.<br />
<script src="http://gist.github.com/458980.js?file=wavebody.html"></script> Lastly is the JS part. Without it, nothing would ever show up. You need to include the currently 6.5KB JS library from <code>http://anony-bot.appspot.com/assets/embed2.mini.js</code>.  After that, you need a separate script tag anywhere after the big hidden super element. It <em>must</em> be  outside the super element (unimaginable evils will happen if it isn&#8217;t). Inside that script tag needs to be a function call to <code>w2_embed</code>. The first (and only) argument has to be a JS object with at least the <code>element</code> key pointing to a DOM element which contains an element with the class <code>wavebody</code>. There are <em>lots</em> of other config options, and here they are.</p>
<ul>
<li><code>element</code> (Required) a dom element which contains a div with the &#8220;wavebody&#8221; class</li>
<li><code>identifier</code> The identifier for the wave that the server will use to generate a wave ID from, default: location.pathname</li>
<li><code>root_title</code> If the identifier has not previously been associated with a wave ID, the wave will be created with the specified title. default: (no title)</li>
<li><code>root_content</code> If the identifier has not previously been associated with a wave ID, the wave will be created with the specified content as the root blip. default: (no content)</li>
<li><code>participants</code> The participants the wave should be created with if not previously associated with a wave ID, default: [], suggested: ['public@a.gwave.com']</li>
<li><code>hideroot</code> Boolean whether or not to not render the root blip</li>
<li><code>edit</code> A reference to a DOM element which can be templated into the edit box, should contain handlers for the actions {{submit}} and {{cancel}} as well as a textarea with the class &#8220;wavetext&#8221;</li>
<li><code>tags</code> Set of tags to be added to the wave if the identifier has not previously been associated with a wave and must be created.</li>
<li><code>api_root</code> The domain containing the server component (proxy and dictionary server). Default: anony-bot.appspot.com</li>
<li><code>gadgets</code> Enable native gadgets (does not work)</li>
<li><code>render_state</code> Display the user a gadget state</li>
<li><code>chronological</code> Render blips chronologically (see Microwave&#8217;s &#8220;Classic Forum Layout&#8221; option)</li>
<li><code>json_url</code> Location of JSON implementation to be loaded dynamically in case it&#8217;s not native to the browser default: http://anony-bot.appspot.com/assets/json2.mini.js</li>
<li><code>waveid</code> Skip the identifier lookup and directly reference a wave by it&#8217;s id</li>
</ul>
<p><script src="http://gist.github.com/459023.js?file=microwave.example.js"></script></p>
<p>You can see that the function call was saved to a variable named <code>demo</code>. That&#8217;s useful because you can use that to reference later to manipulate things. The return of a w2_embed call is a JS object with the following keys.</p>
<ul>
<li><code>config</code> A reference to the initial config object</li>
<li><code>reply(text)</code> Create a root-level reply</li>
<li><code>reload()</code> Reload the wave.</li>
</ul>
<p>So lets try putting everything together.</p>
<p><script src="http://gist.github.com/459036.js?file=anonybot-embed.everything.html"></script></p>
<p>Afterthoughts: Just a little thing to add at the end. You can can create a a div with the class <code>waveedit</code> as used above. It&#8217;s not strictly necessary, but it lets you customize things a bit more. You also need a CSS style for .wavethread with a padding-left (or margin-left) in order for threads to show up properly. Blips are automatically given a .waveblip class.</p>
<p>That screenshot on the top of the post, <a href="http://anony-bot.appspot.com/assets/test2.html">if you want to try it out. It&#8217;s here</a>.</p>
<p>I&#8217;m not making any money off of this, so there&#8217;s no reason for me to hide the fallibilities of this solution from anyone. This, like any other solution is not perfect. There is no true wave-style real-time editing, it uses polling. It does however update every 10 seconds if it&#8217;s configured to do so using the <code>poll_updates: true</code> configuration option. It can&#8217;t ever really do much better, since app engine doesn&#8217;t yet support pushing out real time data to attached clients, even though they announced the neat Channel API (still waiting to use it!) at I/O. Either way, that probably won&#8217;t help too much as w2_embed uses JSONP for client/server communication across multiple domains, and it&#8217;s unlikely that the channel api will allow for that. Also, since there&#8217;s no way to fetch a single blip, the user must request the entire wave to check the tiny 32 bit version integer if it&#8217;s been incremented, and if it has, then the whole wave has to be fetched again. It&#8217;s by no means efficient, and so my server would be very very sad if the polling interval was significantly increased. It&#8217;s not very SEO friendly. Though it&#8217;s not always that people want the comments to be indexed by search engines, so some people may care less. Accessibility-wise, it shouldn&#8217;t be too horrible if the screen reader/browser supports javascript and hugely depends on the HTML being used in conjunction with the script.</p>
<p>As of date, this was my longest blog post ever, and I would be sad if nobody commented (ironically using my non-wave-based commenting system). And I&#8217;m not posting my source code unless someone comments, so, an incentive <img src='http://antimatter15.com/wp/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2010/06/wave-embed-api/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>μwave: updates again</title>
		<link>http://antimatter15.com/wp/2010/06/%ce%bcwave-updates-again/</link>
		<comments>http://antimatter15.com/wp/2010/06/%ce%bcwave-updates-again/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 11:07:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Microwave]]></category>
		<category><![CDATA[evil empire]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[microwave]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=1107</guid>
		<description><![CDATA[Edit mode is no longer experimental, a new implementation includes a tiny diff engine which allows editing a post without necessarily destroying layout. Root blip editing is now possible. There is a new tag list on the bottom of each wave, also including an &#8220;Add Tag&#8221; button. Search results are now formatted with modification date, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://antimatter15.com/wp/wp-content/uploads/2010/06/microwave-screen630.png"><img class="alignnone size-full wp-image-1108" title="microwave-screen630" src="http://antimatter15.com/wp/wp-content/uploads/2010/06/microwave-screen630.png" alt="" width="253" height="395" /></a><a href="http://antimatter15.com/wp/wp-content/uploads/2010/06/microwave-screen630-wave.png"><img class="alignnone size-full wp-image-1109" title="microwave-screen630-wave" src="http://antimatter15.com/wp/wp-content/uploads/2010/06/microwave-screen630-wave.png" alt="" width="253" height="395" /></a></p>
<p><strong>Edit mode</strong> is no longer experimental, a new implementation includes a tiny diff engine which allows editing a post without necessarily destroying layout. Root blip editing is now possible. There is a new<strong> tag list</strong> on the bottom of each wave, also including an &#8220;Add Tag&#8221; button. <strong>Search results</strong> are now formatted with modification date, number of blips, number of unread blips and read/unread state. There is a new <strong>settings panel</strong> when you click the logo. Added support for the internet exploder browser starting at version six. Owner_utils is a setting which adds utilities like &#8220;set everyone as read only&#8221;. The New Wave feature no longer creates pop-up prompts, but rather silently creates and opens an empty wave. It renders the live-editing cursors. There is a <strong>new multipane interface</strong> for desktop. Gadget support has greatly improved. It handles rotation on a mobile webkit device better. It now uses Wave Data/Robots Protocol 0.22 and <strong>renders using the newly exposed conversation model</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2010/06/%ce%bcwave-updates-again/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>μwave: updates</title>
		<link>http://antimatter15.com/wp/2010/06/%ce%bcwave-updates/</link>
		<comments>http://antimatter15.com/wp/2010/06/%ce%bcwave-updates/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 18:34:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Microwave]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Wave]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[microwave]]></category>
		<category><![CDATA[tasty food]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[wave]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=1001</guid>
		<description><![CDATA[Over a few days, things can change fairly quickly. There have been several speed improvements, a new Forum-Style blip rendering option which arranges blip linearly by the time edited with each containing a formatted quote of the parent to establish context. Attachments are now fully supported, including thumbnails and download links. The operations engine was [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://antimatter15.com/wp/wp-content/uploads/2010/06/microwave62.png"><img class="alignright size-full wp-image-1004" title="μwave June 2 Wave View" src="http://antimatter15.com/wp/wp-content/uploads/2010/06/microwave62.png" alt="" width="319" height="535" /></a><a href="http://antimatter15.com/wp/wp-content/uploads/2010/06/microwave62s.png"><img class="alignnone size-full wp-image-1005" title="Microwave June 2 Search" src="http://antimatter15.com/wp/wp-content/uploads/2010/06/microwave62s.png" alt="" width="319" height="535" /></a></p>
<p><a href="http://antimatter15.com/wp/2010/05/%CE%BCwave-lightweight-mobile-wave-client/">Over a few days,</a> things can change fairly quickly. There have been several <strong>speed improvements</strong>, a new <strong>Forum-Style blip rendering</strong> option which arranges blip linearly by the time edited with each containing a formatted quote of the parent to establish context. <strong>Attachments</strong> are now fully supported, including thumbnails and download links. The operations engine was totally rewritten which uses asynchronous XMLHttpRequest, a new callback based system and support for a batch operations (which means fewer requests and faster responses). A wavelet header containing a list of all participants in the entire wave has been added, as well as an <strong>Add Participant </strong>button. A <strong>specialized, extremely fast gadget viewer </strong>was added, which allows for blazingly fast rendering of two popular gadgets (and more will come), it works by bypassing the entire gadget infrastructure and loading trusted code directly inline with the DOM. There is a &#8220;New Wave&#8221; button which allows people to <strong>create new waves directly from the client</strong>. The OAuth backend was authenticated with google, for more secure login transactions. Blips have a <strong>new context menu</strong> which allows for features such as <strong>Delete Blip, Edit Blip and Change Title</strong>. A <a href="http://antimatter15.com/misc/read/?googlewave.com!w+mrqWFs0vA">full changelog can be found here</a>.</p>
<p><a href="http://micro-wave.appspot.com">Try it out.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2010/06/%ce%bcwave-updates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>μwave: lightweight mobile wave client</title>
		<link>http://antimatter15.com/wp/2010/05/%ce%bcwave-lightweight-mobile-wave-client/</link>
		<comments>http://antimatter15.com/wp/2010/05/%ce%bcwave-lightweight-mobile-wave-client/#comments</comments>
		<pubDate>Sun, 30 May 2010 02:08:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Microwave]]></category>
		<category><![CDATA[Other]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Wave]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[project]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[wave reader]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=988</guid>
		<description><![CDATA[I like bragging when I do something nobody else has done before. And μwave is the first true third-party wave client which is compatible with Google Wave. It&#8217;s free to use at http://micro-wave.appspot.com/ and works great on mobile devices. It supports searching for waves, opening them and writing replies. Currently it doesn&#8217;t know read/unread state [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://antimatter15.com/wp/wp-content/uploads/2010/05/http-micro-wave.appspot.com-static-ui.html-Chromium_025.png"><img class="alignright size-full wp-image-991" title="Microwave Wave-View May 29" src="http://antimatter15.com/wp/wp-content/uploads/2010/05/http-micro-wave.appspot.com-static-ui.html-Chromium_025.png" alt="" width="309" height="459" /></a><a href="http://antimatter15.com/wp/wp-content/uploads/2010/05/http-micro-wave.appspot.com-static-ui.html-Chromium_023.png"><img class="size-full wp-image-990 alignnone" title="Microwave Search-View May 29" src="http://antimatter15.com/wp/wp-content/uploads/2010/05/http-micro-wave.appspot.com-static-ui.html-Chromium_023.png" alt="" width="309" height="459" /></a></p>
<p>I like bragging when I do something nobody else has done before. And <strong>μwave </strong>is the first true third-party wave client which is compatible with Google Wave. It&#8217;s free to use at <a href="http://micro-wave.appspot.com/">http://micro-wave.appspot.com/</a> and works great on mobile devices. It supports searching for waves, opening them and writing replies.</p>
<p>Currently it doesn&#8217;t know read/unread state of the waves from the search panel and doesn&#8217;t know read/unread blips, but as of time of writing, its a limitation and flaw in the current version of the <strong>Google Wave Data API </strong>(introduced just ten days ago at Google I/O). Expect this to be resolved in the near future with upcoming versions of the API and this application.</p>
<p>The source code for the server component is open-source and can be <a href="http://gist.github.com/417035">found on github</a> (though it&#8217;s slightly outdated, but the important stuff is there). It&#8217;s fairly simple (It&#8217;s based on the original <a href="http://oauth.googlecode.com/svn/code/python/oauth/example/client.py">example code</a> so I&#8217;m going to have the same MIT license), but one of the few python scripts which can do authentication with google and pass commands to the data api.  It relies on the <a href="http://oauth.googlecode.com/svn/code/python/oauth/">Python OAuth Library</a>.</p>
<p>The Blip renderer component of this is licensed under the MIT license and can be found on the <a href="http://microwave.googlecode.com/hg/bliprender2.html">old microwave repo</a>. The only part left is the interface, which is going to be the usual GPLv3.</p>
<p>For a little bit of history, this isn&#8217;t exactly a new project. The<a href="http://code.google.com/p/microwave/source/detail?r=cb27d32b3a5ee5aeaef38c58463268e7931f60f0"> google code project</a> has existed since January 9th, 2010. The purpose was to create a mobile-friendly version of Wave Reader. But that goes even deeper, I can trace it back to the<a href="http://static-bot.appspot.com/view/?id=googlewave.com!w+DUX6159GV"> original Static-Bot</a> dated to October 18, 2009. Then, the Google Wave embed API allowed people to view waves only if someone had a Google Wave account and was logged in at the time. This was quite problematic as Wave was still a limited preview which not many people had and probably hampered adoption.</p>
<p>Another separate but eventually convergent issue which led to the microwave project was &#8220;<a href="http://antimatter15.com/misc/read/?googlewave.com!w+Ze3l0mj0A">Desktop Wave Reader + GWave Client/Server Protocol</a>&#8221; post which I made on October 29th of 2009.</p>
<p>During late October of last year, I reverse-engineered some of the features of the Google Wave client. Up until then, the only published specs were the federation protocols, which dealt with how multiple wave servers would use a common protocol to allow multiple users without a central authority and for the gadget and robot apis. Notably missing was a client/server api, for a user of specifically the google wave client, which did not yet support federation (and to date, preview still does not), and to browse/view the waves in one&#8217;s inbox without needing to switch to an entirely new provider. The first component was the ability to read waves. After that was accomplished, I tried to reverse engineer a more complex aspect of the protocol, which was the ability to search waves. I eventually realized that that component, search was part of a larger puzzle, which was the real-time BrowserChannel wire protocol which virtually all of wave was based. I made some progress, but near the end, I gave up in frustration. Luckily, someone else became interested in the same thing, and<a href="github.com/waverz/waveclient"> Silicon Dragon basically got search working</a>.</p>
<p>This happened now in early December. I started on a project called <a href="http://antimatter15.com/wp/2010/01/wave-reader-4-6/">Wave Reader</a>, which merged the ideas of static-bot with the desktop wave reader and a new functional blip rendering engine. At that time, the Google Wave client was still horrendously slow, taking several minutes at times to load large waves.</p>
<p>On January, I began a project to merge Wave Reader and the wire protocol (search). I thought an awesome name would be microwave (or μwave) and started the code repo on January 9th. I worked on it a bit, so that it was mostly complete, with search and loading all working, with one missing component: login. Eventually, I got bored and the project lay abandoned for a few months.</p>
<p>This gets us to basically 4 days ago, when I started working on a renaissance of the μwave project, based on the recently released Google Wave Data API. The first component was creating a new blip renderer specifically designed for parsing the new (much cleaner) json format which is part of the robots api. Then I created a client around that and created a python backend for having it work on app engine.</p>
<p>The Future is always awesome to prophesize about. In the coming weeks or days, google will probably update the data api to allow for information like  So, while http://micro-wave.appspot.com will likely remain free and maintained for the forseeable future, I do plan on making a paid iPhone/iPad app. The iPhone app may have some extra features like offline/caching support.</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2010/05/%ce%bcwave-lightweight-mobile-wave-client/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Wave Reader 4.6 &#8211; Insanely Fast Edition</title>
		<link>http://antimatter15.com/wp/2010/01/wave-reader-4-6/</link>
		<comments>http://antimatter15.com/wp/2010/01/wave-reader-4-6/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 04:08:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Wave]]></category>
		<category><![CDATA[Wave Reader]]></category>
		<category><![CDATA[fast]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[wave]]></category>
		<category><![CDATA[wave reader]]></category>
		<category><![CDATA[woot]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=913</guid>
		<description><![CDATA[Loading a 500 blip wave in Google&#8217;s GWT Client takes 3:34 to get to a usable state (Where the scroll bar works) on a 3ghz Core2 Duo (whose extra core admittedly won&#8217;t do much). It also uses 972 MB of RAM. Loading the same wave in my Wave Reader, takes 678 milliseconds. A 315x speed-up. [...]]]></description>
			<content:encoded><![CDATA[<p>Loading a 500 blip wave in Google&#8217;s GWT Client takes 3:34 to get to a usable state (Where the scroll bar works) on a 3ghz Core2 Duo (whose extra core admittedly won&#8217;t do much). It also uses 972 MB of RAM.</p>
<p>Loading the same wave in my Wave Reader, take<strong>s 678 milliseconds. A 315x speed-up</strong>. Also, my client is totally unoptimized, pure 30KB of javascript. On top of those features, <strong>anyone can view waves<span style="font-weight: normal;">, without a google account, </span>individual blips can be linked </strong>to, it supports rendering almost everything Wave can, that is <strong>gadgets, inline replies, nesting, </strong>font color/size, italics, bold, everything you could probably expect. Interestingly, when you add an attachment to Wave, and delete the parent blip, it still stores the attachment on the current wave state, and this client can display/link to them without using Playback. There is an option to <strong>generate plain simple HTML</strong> for turning a Wave into a standalone page or Website. <strong>Private waves can be exposed read-only as a website</strong> simply by adding the gwavereader@googlewave.com username.</p>
<p>Using it is simple, take  a Wave https://wave.google.com/wave/#restored:wave:<strong>googlewave.com!w%252Br5lewFqCA</strong> and then put it after the Wave Reader URL http://antimatter15.com/misc/wave/read.html?<strong>googlewave.com!w%252Br5lewFqCA</strong><br /> And magically you have a super awesome URL to link to.</p>
<p>You can learn some tricks on how to use it to do some more awesome things <a href="http://antimatter15.com/misc/wave/read.html?googlewave.com!w%252BrnG0vaFXA">http://antimatter15.com/misc/wave/read.html?googlewave.com!w%252BrnG0vaFXA</a> such as the before mentioned HTML generation.</p>
<p>Samples (Some random waves):<br /> <a href="http://antimatter15.com/misc/wave/read.html?googlewave.com!w%252Br5lewFqCA">http://antimatter15.com/misc/wave/read.html?googlewave.com!w%252Br5lewFqCA</a> (New for 4.6 Inline reply support)<br /> <a href="http://antimatter15.com/misc/wave/read.html?Ze3l0mj0A">http://antimatter15.com/misc/wave/read.html?Ze3l0mj0A</a><br /> <a href="http://antimatter15.com/misc/wave/read.html?oPg9HfEXE&amp;beta">http://antimatter15.com/misc/wave/read.html?oPg9HfEXE&amp;beta</a><br /> <a href="http://antimatter15.com/misc/wave/read.html?Mu9eK7j2H">http://antimatter15.com/misc/wave/read.html?Mu9eK7j2H</a><br /> <a href="http://antimatter15.com/misc/wave/read.html?AhbL5fooD&amp;beta">http://antimatter15.com/misc/wave/read.html?AhbL5fooD&amp;beta</a><br /> <a href="http://antimatter15.com/misc/wave/read.html?googlewave.com!w+UDMZOGpSG">http://antimatter15.com/misc/wave/read.html?googlewave.com!w+UDMZOGpSG</a></p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2010/01/wave-reader-4-6/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Wave Unread Navigator</title>
		<link>http://antimatter15.com/wp/2009/12/wave-unread-navigator/</link>
		<comments>http://antimatter15.com/wp/2009/12/wave-unread-navigator/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 17:42:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Wave]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[chrome extension]]></category>
		<category><![CDATA[clone]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[greasemonkey]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[navigator]]></category>
		<category><![CDATA[userscript]]></category>
		<category><![CDATA[wave]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=899</guid>
		<description><![CDATA[I made an extension which shows a green sign (like gmail) on the side whenever there are blips outside the viewport. It allows you to quickly and effectively use keyboard navigation without blindly checking above and below, or generally scroll without needing to guess the position. It comes as a Chrome Extension and also as [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://antimatter15.com/wp/wp-content/uploads/2009/12/screenshot_050.png"><img class="size-full wp-image-898 alignright" title="screenshot_050" src="http://antimatter15.com/wp/wp-content/uploads/2009/12/screenshot_050.png" alt="screenshot_050" width="291" height="259" /></a>I made an extension which shows a green sign (like gmail) on the side whenever there are blips outside the viewport. It allows you to quickly and effectively use keyboard navigation without blindly checking above and below, or generally scroll without needing to guess the position.</p>
<p>It comes as a <a href="https://chrome.google.com/extensions/detail/jncflgepcddhcejhofdojlkjgjhcfmpc">Chrome Extension</a> and also as a <a href="http://antimatter15.com/misc/wave/wavenavigation.user.js">Greasemonkey Userscript</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2009/12/wave-unread-navigator/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Wave Gadget API issues (again)</title>
		<link>http://antimatter15.com/wp/2009/09/wave-gadget-api-issues-again/</link>
		<comments>http://antimatter15.com/wp/2009/09/wave-gadget-api-issues-again/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 13:40:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ajax Animator]]></category>
		<category><![CDATA[Other]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Wave]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[wave]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=822</guid>
		<description><![CDATA[So I&#8217;ve been having issues with the Wave Gadget API (again). This one is simple, Wave isn&#8217;t really real time. So right after doing a submitDelta, you can&#8217;t get() the data and expect to have the new one instantly. It&#8217;s been giving me some problems, but I&#8217;m getting around it by using my awesome wave [...]]]></description>
			<content:encoded><![CDATA[<p>So I&#8217;ve been having issues with the Wave Gadget API (again). This one is simple, Wave isn&#8217;t really real time. So right after doing a submitDelta, you can&#8217;t get() the data and expect to have the new one instantly. </p>
<p>It&#8217;s been giving me some problems, but I&#8217;m getting around it by using my awesome wave gadget library which will now magically apply the changes immediately so you can access it even before things actually happen.</p>
<p>Also, partially due to this, things would be far more useful if you could get the date of each insertion or deletion.</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2009/09/wave-gadget-api-issues-again/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Wave2: A higher level Wave Gadget State API</title>
		<link>http://antimatter15.com/wp/2009/08/wave2-a-higher-level-wave-gadget-state-api/</link>
		<comments>http://antimatter15.com/wp/2009/08/wave2-a-higher-level-wave-gadget-state-api/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 21:26:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ajax Animator]]></category>
		<category><![CDATA[Other]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[gadget]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[googlewave]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[wave]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=759</guid>
		<description><![CDATA[I was working on a new little Wave State API update. It supports lists in the form of subkeys, and something very much like hierarchy and events on specific sub-nodes. This way you don&#8217;t have everything update (someone&#8217;s edits on frame 36 doesn&#8217;t matter if you&#8217;re on frame 42). Everything is namespaced under a singleton [...]]]></description>
			<content:encoded><![CDATA[<p>I was working on a new little Wave State API update. It supports lists in the form of subkeys, and something very much like hierarchy and events on specific sub-nodes. This way you don&#8217;t have everything update (someone&#8217;s edits on frame 36 doesn&#8217;t matter if you&#8217;re on frame 42).</p>
<p>Everything is namespaced under a singleton global, wave2. It includes functions like</p>
<ul>
<li>listen (execute a callback when something beginning with the prefix is changed)</li>
<li>ignore (un-listen),</li>
<li>keys (shortcut for wave.getState().getKeys()),</li>
<li>subkeys (get keys which begin with a certain prefix, important to the pseudo hierarchy),</li>
<li>set (submitdelta with first arg as name and second as value),</li>
<li>get (shortcut for wave.getState().get()</li>
<li>reset_gadget (a simple way to empty all the data in the store)</li>
</ul>
<p>And since it&#8217;s quite short, I&#8217;m putting it under public domain at http://antimatter15.com/misc/wave/wave2.js</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2009/08/wave2-a-higher-level-wave-gadget-state-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Working on interface for Animator/Wave</title>
		<link>http://antimatter15.com/wp/2009/08/working-on-interface-for-animatorwave/</link>
		<comments>http://antimatter15.com/wp/2009/08/working-on-interface-for-animatorwave/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 21:38:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ajax Animator]]></category>
		<category><![CDATA[google wave]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=740</guid>
		<description><![CDATA[The name field will be replaced with buttons, and zoom may or may not be scrapped. Since gadgets only take up a fraction of the page (usually) it&#8217;s designed with size in mind, which may help on other space-constrained devices like netbooks. It may have a cool feature like VectorEditor&#8217;s demo where you can draw [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.ubuntu-pics.de/bild/21892/screenshot_029_4q21Pp.png" alt="Interface of Ajax Animator as Google Wave Gadget" /></p>
<p>The name field will be replaced with buttons, and zoom may or may not be scrapped. Since gadgets only take up a fraction of the page (usually) it&#8217;s designed with size in mind, which may help on other space-constrained devices like netbooks.</p>
<p>It may have a cool feature like VectorEditor&#8217;s demo where you can draw off the canvas area.</p>
<p>As for why the tabs are now on top and the timeline is on the bottom, there&#8217;s no reason, I just think that that layout is more aesthetic.</p>
<p>And I might name it something other than the ajax animator, something just like Animator or something</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2009/08/working-on-interface-for-animatorwave/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>I GOT A GOOGLE WAVE INVITE!</title>
		<link>http://antimatter15.com/wp/2009/08/i-got-a-google-wave-invite/</link>
		<comments>http://antimatter15.com/wp/2009/08/i-got-a-google-wave-invite/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 20:02:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[elitist]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[googlewave]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=726</guid>
		<description><![CDATA[IM STILL WAITING TO GET MY ACCOUNT BUT I JUST GOT AN INVITE AND IM SOOO HAPPY!!!!!!!!!!! SEE? LOOK I&#8217;M USING CAPS LOCK TO EXPRESS MY HAPPYNESS! IT&#8217;S REALLY REALLY REALLY AWESOME EVEN THOUGH I HAVENT ACTUALLY TRIED IT OUT YET! BUT ITS SOOOO COOL! AND LETS BE HONEST, AT LEAST THIS POST ISNT IN [...]]]></description>
			<content:encoded><![CDATA[<p>IM STILL WAITING TO GET MY ACCOUNT BUT I JUST GOT AN INVITE AND IM SOOO HAPPY!!!!!!!!!!! SEE? LOOK I&#8217;M USING CAPS LOCK TO EXPRESS MY HAPPYNESS! IT&#8217;S REALLY REALLY REALLY AWESOME EVEN THOUGH I HAVENT ACTUALLY TRIED IT OUT YET! BUT ITS SOOOO COOL! AND LETS BE HONEST, AT LEAST THIS POST ISNT IN COMIC SANS MS.</p>
<p>EDIT: i got my wave account. It&#8217;s cool, but there&#8217;s nobody to talk to.</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2009/08/i-got-a-google-wave-invite/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->