<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-812671504456298394</id><updated>2011-11-14T12:01:54.156+08:00</updated><category term='jQuery'/><category term='javascript'/><title type='text'>Shwup</title><subtitle type='html'>Developer's blog for www.shwup.com</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://shwup.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Shwup</name><uri>http://www.blogger.com/profile/07798702373981952498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-2135805588558918763</id><published>2011-08-10T15:34:00.007+08:00</published><updated>2011-08-12T10:25:42.700+08:00</updated><title type='text'>CSS Authoring: Less is more</title><content type='html'>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Ever since CSS was first published many years ago to separate content from presentation its basic structure and &amp;quot;language&amp;quot; features have hardly changed. Tools such as &lt;a href="http://sass-lang.com/" target="_blank"&gt;Sass&lt;/a&gt; and &lt;a href="http://lesscss.org/" target="_blank"&gt;Less&lt;/a&gt; aim to remedy some shortcomings, such as:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Variables - often you find yourself declaring the same dimensions or positions within your document (or even across documents), making it more difficult to change them later&lt;/li&gt;
&lt;li&gt;Inheritance - nested rules require repetition of selectors, adding to the clutter&lt;/li&gt;
&lt;li&gt;Operators - addition, subtraction and other functions can be helpful to add relationships between definitions&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Making a choice&lt;/h2&gt;
&lt;p&gt;Both are great tools and make it easier for us developers to author CSS. Personally, I have chosen Less for a few reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Existing CSS files are already valid Less files; though from 3.0.0 onwards, Sass now also supports this paradigm&lt;/li&gt;
&lt;li&gt;Mixins don't necessarily have to be declared as such; they can be any #id, .class or element definition and are referenced by just their selector&lt;/li&gt;
&lt;li&gt;Less stays closer to the CSS format, unlike Sass where conditions and loop structures are supported&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Integration into Aptana&lt;/h2&gt;
&lt;p&gt;After selecting the right tool you will want to integrate this into your editing suite. This is not entirely trivial, so I've put together a guide for Aptana. The guide is geared towards a Windows installation, but should work fine on Linux with some tweaks.&lt;/p&gt;

&lt;h3&gt;Getting the stuff&lt;/h3&gt;
&lt;p&gt;You will need the command-line tool for Less, which you can get from their &lt;a href="https://github.com/cloudhead/less.js" target="_blank"&gt;Github site&lt;/a&gt;. Download the zip and unpack it in a folder of your choice.&lt;/p&gt;
&lt;p&gt;You also need Node.JS, which you can download from &lt;a href="http://nodejs.org/#download" target="_blank"&gt;their site&lt;/a&gt;. Download the node.exe Windows executable and store it wherever you like.&lt;/p&gt;

&lt;h3&gt;Aptana modifications&lt;/h3&gt;
&lt;p&gt;First off, make .less files appear as CSS.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to Window &amp;gt; Preferences &amp;gt; General &amp;gt; Editors &amp;gt; File Associations&lt;/li&gt;
&lt;li&gt;Click 'Add...'&lt;/li&gt;
&lt;li&gt;Enter '*.less' and click 'OK'&lt;/li&gt;
&lt;li&gt;Under 'Associated editors:' click 'Add...'&lt;/li&gt;
&lt;li&gt;Select 'CSS Source Editor' and click 'OK'&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Create a few string substitution variables (optional)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to Window &amp;gt; Preferences &amp;gt; Run/Debug &amp;gt; String Substitution&lt;/li&gt;
&lt;li&gt;Click 'New...'&lt;/li&gt;
&lt;li&gt;Enter the absolute filename of node.exe and name it 'nodejs_path'; click 'OK' when done&lt;/li&gt;
&lt;li&gt;Repeat the last two steps for the installation path of 'lessc'; &lt;strong&gt;Note&lt;/strong&gt; - because of NodeJS you need to use CYGWIN paths (e.g. /cygdrive/d/less/bin/lessc)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now we can do the integration:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to Run &amp;gt; External Tools &amp;gt; External Tools Configurations...&lt;/li&gt;
&lt;li&gt;Select 'Program' and follow the instructions to create a new configuration&lt;/li&gt;
&lt;li&gt;Under 'Location:' specify the Node.JS installation path: ${nodejs_path}&lt;/li&gt;
&lt;li&gt;As 'Working Directory:' set the path to the containing path of the current selection: ${container_loc}&lt;/li&gt;
&lt;li&gt;For 'Arguments:' use this: ${lessc_path} &amp;quot;{$selected_resource_name}&amp;quot;&lt;/li&gt;
&lt;li&gt;Open tab 'Common' and look for 'File:'; the value should be: ${selected_resource_loc}.css&lt;/li&gt;
&lt;li&gt;When everything runs well, you can uncheck 'Allocate Console' here as well&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That's it! Once you're done, you can run the tool from the toolbar and it will create a new file in the same folder with a .css extension.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-2135805588558918763?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/2135805588558918763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/2135805588558918763'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2011/08/css-authoring-less-is-more.html' title='CSS Authoring: Less is more'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-7755058517291628981</id><published>2011-01-07T12:43:00.008+08:00</published><updated>2011-08-11T23:14:46.071+08:00</updated><title type='text'>jQuery outerHTML</title><content type='html'>&lt;p&gt;Since most of our code is based on jQuery, I was tasked to find a way to retrieve and modify an element's HTML contents.&lt;/p&gt;
&lt;p&gt;Normally I would use &lt;a href="http://docs.jquery.com/Html"&gt;html()&lt;/a&gt; for this purpose, but in this case I needed to operate on the HTML including the surrounding element, the so called outer HTML.&lt;/p&gt;
&lt;p&gt;During my search for an efficient outerHTML() solution I found a few interesting sources that I eventually turned into a workable solution; here it is:&lt;/p&gt;
&lt;pre&gt;$.fn.extend({
	outerHTML: function(htmlString)
	{
		if (htmlString) {
			return this.replaceWith(htmlString);
		}

		if ('outerHTML' in this[0]) {
			return this[0].outerHTML;
		}

		return (function(element) {
			var attrs = element.attributes,
			i = 0,
			n = attrs.length,
			name = element.nodeName.toLowerCase(),
			attrlist = '';

			for (; i != n; ++i) {
				attrlist += ' ' + attrs[i].name + '="' + attrs[i].value + '"';
			}
			return '&amp;lt;' + name + attrlist + '&amp;gt;' + element.innerHTML + '&amp;lt;/' + name + '&amp;gt;';
		}(this[0]));
	}
});&lt;/pre&gt;
&lt;p&gt;It combines the use of the relatively new &lt;a href="http://api.jquery.com/replaceWith"&gt;replaceWith()&lt;/a&gt; and the outerHTML property (which doesn't work in Firefox). The last resort is by wrapping the element up, selecting the wrapper and call html() on that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 11-Aug-2011&lt;/strong&gt;: replaced with something friendlier than using .clone() - it can also be found here: &lt;a href="http://codepad.org/g710npMF"&gt;http://codepad.org/g710npMF&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-7755058517291628981?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/7755058517291628981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/7755058517291628981'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2011/01/jquery-outerhtml.html' title='jQuery outerHTML'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-4282670946304388591</id><published>2010-11-30T13:45:00.005+08:00</published><updated>2010-11-30T14:36:20.492+08:00</updated><title type='text'>Arrays in SOAP</title><content type='html'>&lt;p&gt;PHP exposes a great SOAP client to consume remote services, taking away much of the complexities involved in constructing your requests and deciphering the responses; it particularly shines when used in WSDL mode.&lt;/p&gt;&lt;p&gt;However, in the case of single element arrays, it doesn't work as expected. It will return an object instead. For instance, considering the following SOAP declaration:&lt;/p&gt;&lt;pre&gt;&amp;lt;xsd:complexType name="ArrayOfEmailAddressDetails"&amp;gt;
&amp;lt;xsd:sequence&amp;gt;
&amp;lt;xsd:element maxOccurs="unbounded" minOccurs="0" name="EmailAddressDetails" nillable="true" type="ns4:EmailAddressDetails"/&amp;gt;
&amp;lt;/xsd:sequence&amp;gt;
&amp;lt;/xsd:complexType&amp;gt; 
&lt;/pre&gt;&lt;p&gt;It defines an array using &lt;span style="font-family:courier new;"&gt;xsd:sequence&lt;/span&gt; and a field with 'maxOccurs' set to 'unbounded'. When translated into PHP it becomes the following by default:&lt;/p&gt;&lt;pre&gt;stdClass Object
(
    [EmailAddressDetails] =&gt; Shenton_Type_Email Object
    (
        [isDefault] =&gt; 1
        [type] =&gt; HOME
        [value] =&gt; tjerk@shentontest2.ben.muveenet
        [isConfirmed] =&gt; 1
    )
)
&lt;/pre&gt;&lt;p&gt;This is probably not what you want. You can work around this problem in two ways:&lt;/p&gt;&lt;ol&gt;  &lt;li&gt;Use the 'SOAP_SINGLE_ELEMENT_ARRAYS' option:&lt;/li&gt;&lt;/ol&gt;&lt;pre&gt;$client = new SoapClient('http://www.example.com', array(
    'features' =&gt; SOAP_SINGLE_ELEMENT_ARRAYS,
));
&lt;/pre&gt;&lt;ol start="2"&gt;  &lt;li&gt;Use a function to force the response into an array:&lt;/li&gt;&lt;/ol&gt;&lt;pre&gt;function forceList($obj, $prop)
{
    $r = &amp;$obj-&gt;$prop;
    return isset($r)?is_array($r)?$r:array($r):array();
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-4282670946304388591?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/4282670946304388591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/4282670946304388591'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2010/11/arrays-in-soap.html' title='Arrays in SOAP'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-4717720355820958418</id><published>2010-06-03T10:45:00.007+08:00</published><updated>2010-06-03T12:23:47.520+08:00</updated><title type='text'>Passing arrays to JavaScript</title><content type='html'>The accepted standard way of passing any data to JavaScript is via json_encode(); this ensures proper encoding is applied when it's decoded on the other end. Handling arrays is not much different, except that the amount of data getting sent isn't always expected.
For instance, take the example of a standard array:&lt;pre&gt;echo json_encode(array(1,2,3));&lt;/pre&gt;Output:&lt;pre&gt;[1,2,3]&lt;/pre&gt;Short and sweet huh? Now let's try a multi-dimensional array:
&lt;pre&gt;$row = array('a'=&gt;1, 'b'=&gt;2, 'c'=&gt;3);
echo json_encode(array(
  $row,
  $row,
));&lt;/pre&gt;Output:&lt;pre&gt;[{"a":1,"b":2,"c":3},{"a":1,"b":2,"c":3}]&lt;/pre&gt;
Even though two rows with the same keys are inserted, it will repeat them nonetheless; this is of course excepted behaviour, but it causes a measurable overhead in terms of data size when used to send across lists of records that all share the same field names.
&lt;h2&gt;Solutions&lt;/h2&gt;
Use indexes instead of keys -- though this will solve the data size issue, the receiving end needs to be aware of the field positions; this can be somewhat overcome by declaring variables in JavaScript to keep track of them.
Use one-letter keys -- not as good as using indexes in terms of data size and due to the nature of very short key names, it's easy to forget the meaning of each.
&lt;h2&gt;Introducing FixedArray&lt;/h2&gt;
Using the following small helper class in PHP it's possible to achieve both objectives of having a small data size and yet being able to use descriptive key names.
&lt;code&gt;&lt;span style="color: #000000"&gt;
&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;class&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;FixedArray&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;implements&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Countable&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$_h&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;array();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$h&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;array();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;array();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;count&lt;/span&gt;&lt;span style="color: #007700"&gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;count&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;i&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;push&lt;/span&gt;&lt;span style="color: #007700"&gt;(array&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hash&lt;/span&gt;&lt;span style="color: #007700"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!&lt;/span&gt;&lt;span style="color: #0000BB"&gt;count&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;_h&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;_h&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;array_flip&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;h&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;array_keys&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hash&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;i&lt;/span&gt;&lt;span style="color: #007700"&gt;[]&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;array_values&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;array_intersect_key&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hash&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;_h&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/code&gt;&lt;h2&gt;Usage&lt;/h2&gt;
Let's go back to the previous example and rewrite it using FixedArray:&lt;pre&gt;$row = array('a'=&gt;1, 'b'=&gt;2, 'c'=&gt;3);
$list = new FixedArray;
$list-&gt;push($row);
$list-&gt;push($row);
echo json_encode($list);&lt;/pre&gt;Output:&lt;pre&gt;{"h":["a","b","c"],"i":[[1,2,3],[1,2,3]]}&lt;/pre&gt;The output has two parts; a header indicated by 'h' and a data part indicated by 'i'. Adding more records would only add to 'i' thus saving 12 bytes per record for this example.&lt;h2&gt;Decoding&lt;/h2&gt;
The FixedArray needs a decoder on the JavaSript side; this one is based on &lt;a href="http://jquery.com/" target="_blank"&gt;jQuery&lt;/a&gt;:
&lt;pre&gt;
$.decodeFixedArray = function(data) {
  var h = data.h, n = h.length
  return $.map(data.i, function(item) {
    var hash = {}
    var idx = n
    while (idx--) {
      hash[h[idx]] = item[idx]
    }
    return hash
  })
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-4717720355820958418?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/4717720355820958418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/4717720355820958418'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2010/06/passing-arrays-to-javascript.html' title='Passing arrays to JavaScript'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-5783513545100351180</id><published>2010-05-31T15:22:00.002+08:00</published><updated>2010-05-31T15:48:19.629+08:00</updated><title type='text'>May '10 release</title><content type='html'>Last week we launched a point release while working towards the next version. This release fixes bugs that were reported by our users and some other improvements and features.

Have you ever wanted to download a DVD of a single muvee uploaded with muvee Reveal? Now you can! While viewing the muvee on the website, the right panel will show a link to download an ISO image of the muvee. When you burn this image on an empty DVD you can play it on any standard DVD player in the house, not just your PC! It's priced at only $1.95

In the invitation page we're now using delegated authentication for Google Mail, Yahoo and Windows Live. This means that when you're importing your contacts, you will be directed to the respective service provider to grant us access to read your contact list for a limited amount of time. Soon, AOL will be migrated as well, so that you never have to give us your e-mail password again.

Some users have experienced some problems inviting their friends into the album. They may not have noticed that it's required to verify your e-mail address before any invitations are sent out; bounced emails are the other problem. Now, invitations that have not been sent due to above reasons are now highlighted in red and accompanied by suggestions on how to resolve it.

Others may have experienced that loading their homepage can take a long time; we have managed to speed this up dramatically, only causing a slow-down on your first visit after the launch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-5783513545100351180?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/5783513545100351180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/5783513545100351180'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2010/05/may-10-release.html' title='May &apos;10 release'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-6687168461863922465</id><published>2010-04-03T12:20:00.007+08:00</published><updated>2010-04-03T16:54:28.073+08:00</updated><title type='text'>About constants</title><content type='html'>Every project, small or big, has some configuration in the form of keys and their associated values, commonly defined using constants. These configuration settings normally get loaded upon each request, making them a good target for optimizations.

&lt;h4&gt;The contenders&lt;/h4&gt;
By default, PHP supports &lt;a href="http://sg.php.net/manual/ro/function.define.php"&gt;defines&lt;/a&gt; and &lt;a href="http://www.php.net/manual/ro/language.oop5.constants.php"&gt;class constants&lt;/a&gt;, but extensions such as &lt;a href="http://sg.php.net/manual/ro/book.apc.php"&gt;APC&lt;/a&gt; and &lt;a href="http://pecl.php.net/package/hidef"&gt;hidef&lt;/a&gt; can give you a better performance if enabled.

The APC extension has a function to define constants using an array, called &lt;a href="http://sg.php.net/manual/en/function.apc-define-constants.php"&gt;apc_define_constants()&lt;/a&gt;. The hidef extension is different, it reads the constants from a set of files during PHP initialization; this makes the constants available at compile time for immediate substitution.

&lt;h4&gt;Setup&lt;/h4&gt;
To test the four aforementioned methods, I've chosen a simple set of operations using the most commonly used types of constants: integers, strings and doubles. The script would then run those operations in a tight loop for a fixed number of iterations and record CPU time and memory consumption. Lastly, the APC extension is not being used as an opcode cache for this test.

The outcome reveal that the define() method yields the longest running time while class constants method yields the higher memory consumption; the results of those methods are therefore used as the benchmarks for the other results.
&lt;h4&gt;Performance results&lt;/h4&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="font-style: italic;"&gt;Test performed&lt;/td&gt;&lt;td style="font-style: italic;"&gt;Time spent&lt;/td&gt;&lt;td style="font-style: italic;"&gt;Memory consumed&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Using define()&lt;/td&gt;&lt;td&gt;100%&lt;/td&gt;&lt;td&gt;32.6%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Using class constants&lt;/td&gt;&lt;td&gt;30.2%&lt;/td&gt;&lt;td&gt;100%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Using apc_define_constants()&lt;/td&gt;&lt;td&gt;24.2%&lt;/td&gt;&lt;td&gt;32.0%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Using hidef&lt;/td&gt;&lt;td&gt;13.9%&lt;/td&gt;&lt;td&gt;13.5% (*)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;em&gt;(*) hidef consumes memory during initialization, but this was not taken into account for this test&lt;/em&gt;

&lt;h4&gt;Analysis&lt;/h4&gt;
The clear winner of this test is the hidef extension; upon initialization it creates constants that are both persistent and available during the compilation phase. The results opcode is superior to any of the other methods described above. However, all this goodness comes with a drawback: configuration settings are instance wide, which impacts all setups of PHP that runs beyond a single web request (e.g. Apache module or FastCGI).

Using apc_define_constants() is a good runner up in terms of performance (6% faster than class constants) and memory consumption (comparable to using define). It uses optimized code to create constants, speeding it up threefold. Some people may still use eAccelerator and/or Zend Optimizer, but APC is much more actively developed and has additional features to work with variable caching (like Memcached but only server wide). And it will be integral part in the upcoming PHP6 (or whatever they're going to call it).

In the bottom two we still see a substantial difference in execution time between class constants and using define(). Using class constants has the benefit of being available during execution time, which makes it a prime candidate for further optimization using APC. However, the OO nature of this method has two drawbacks: resolving the constant still needs to take place during run-time and there's more memory consumed (at least three times that of the runner up).

&lt;h4&gt;Conclusion&lt;/h4&gt;
If you're only running one site per web server instance or you can namespace your constants, choose hidef.
If you're already using the APC extension or interested in doing so, choose apc_define_constants().
If you don't mind the extra memory consumption to yield 300% CPU time improvements, choose class constants.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-6687168461863922465?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/6687168461863922465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/6687168461863922465'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2010/04/about-constants.html' title='About constants'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-1899382331053303253</id><published>2010-02-10T07:48:00.002+08:00</published><updated>2010-02-10T08:42:41.930+08:00</updated><title type='text'>The design chain reaction</title><content type='html'>Yesterday's release also initiated a design overhaul process to improve user experience.

The first goal was to group all media related actions right next to the item you're viewing, actions such as tag, rotate, share, etc. After moving the media actions we realized that the album toolbar had more empty space to enlarge the navigation tool (the drag bar to seek into your album).

The second goal was introduced when we were working on a feature to show the camera details; we realized that due to our chunky boxes we were wasting precious space that could be better utilized. So we went ahead and made a more dynamic interface, whereby you can choose to collapse or expand certain sections.

We're looking forward to making more changes to the album page design, all suggestions are welcome ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-1899382331053303253?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/1899382331053303253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/1899382331053303253'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2010/02/design-chain-reaction.html' title='The design chain reaction'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-295796092467554305</id><published>2010-02-09T22:03:00.002+08:00</published><updated>2010-02-09T22:24:14.696+08:00</updated><title type='text'>Invite the world!</title><content type='html'>We've had many requests from our users asking how to share their album with either a large group of friends (of whom you're bound to miss a few) or a group of people you may not even know (e.g. users from a forum or newsgroup).

With the introduction of viewers in last year's release we are now able to present the next major feature in line; album sharing.

So how does it work? Simple! Visit an album you wish to share with others and click &amp;quot;Share album&amp;quot; from the top menu bar; the system will then generate a link that you can share with Facebook, Twitter or via e-mail.

People who follow the link just have to leave their contact details behind so that you know who is visiting your albums. They can comment on your photos and videos, but won't be able to do anything else. You can give more permissions to any of these users by clicking on their name in the member list and selecting &amp;quot;Make this member a co-host&amp;quot;.

Did your link end up in the wrong hands? No problem, just click &amp;quot;Share album&amp;quot; and then &amp;quot;Unshare album&amp;quot;; confirm your action and the link has been deactivated. You can then remove any offending members from the album to make sure they won't come in again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-295796092467554305?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/295796092467554305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/295796092467554305'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2010/02/invite-world.html' title='Invite the world!'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-5755913558594151957</id><published>2010-02-09T21:34:00.005+08:00</published><updated>2010-02-09T22:03:51.273+08:00</updated><title type='text'>Facebook changes</title><content type='html'>Last year we introduced Facebook integration on our site; ever since, we have been trying to make the experience as smooth as possible - which is not always straightforward as Facebook is going through quite a few changes in the next few months.

One of those efforts has gone into simplifying the way you visit shwup albums by following invites from other Facebook friends. In the past you would have to make your way through the front door so to speak, whereas now you simply connect via your Facebook account in just a few steps.

At the same time we have been looking into making communication with Facebook users easier; recently Facebook launched a feature to get in touch with our users more easily via &lt;a href="http://developers.facebook.com/news.php?blog=1&amp;story=355"&gt;direct email&lt;/a&gt;. Today we have implemented this on shwup and we're confident that this will make the user experience better.

It's not all good news for us, as Facebook is also taking away certain features that we were using before; &lt;a href="http://wiki.developers.facebook.com/index.php/Roadmap_Notifications"&gt;the notifications mechanism&lt;/a&gt;. So temporarily we're sending Facebook invites via wall-to-wall communications; the new upcoming feature - &lt;a href="http://wiki.developers.facebook.com/index.php/Roadmap_Inbox"&gt;Inbox&lt;/a&gt; - will soon take its place. The invitations, albeit visible to more users, are still as private as before; there's no way someone else can take advantage of the personal invitations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-5755913558594151957?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/5755913558594151957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/5755913558594151957'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2010/02/facebook-changes.html' title='Facebook changes'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-884755506434433016</id><published>2009-12-30T18:21:00.004+08:00</published><updated>2009-12-30T18:51:34.471+08:00</updated><title type='text'>end of year release</title><content type='html'>I'm happy to announce the last point release of shwup.com for this year! We made just a few changes, but we think they're worth it for all those photos and video you're going to upload in the new year ;-)

The major change is that we've changed the way media titles are shown and updated. After a good look at the current page design we realized that showing the titles at the top of the page wasn't that great; therefore, we now show them in a more logical spot: underneath the photo. Editing the title is easy, click the title and a textbox will allow you to change it; pressing Enter or clicking outside the text area automatically saves the new title.

Yet another change was made to the kiosk mode that was mentioned in my last post. In the new design we aimed to make the control box smaller and prettier. Hope we did a good job, enjoy your slide shows (and don't forget to press F11).

Some improvements on the presentation of our muvees as well, as we noticed that most muvees are hard to distinguish from each other. Instead of showing the first frame of each muvee we show one of the media that was used to make it. Let us know your feedback on this. 

We hope that you will continue to use shwup and convince all your friends that they should give it a shot ;-)

See you in the next year!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-884755506434433016?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/884755506434433016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/884755506434433016'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2009/12/end-of-year-release.html' title='end of year release'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-4852087239631888133</id><published>2009-12-16T17:23:00.002+08:00</published><updated>2009-12-16T17:39:48.592+08:00</updated><title type='text'>Dirty your F11 keys</title><content type='html'>Last week, after deploying our friend clamper feature we figured that we could squeeze in one more release before Christmas to keep in the spirit of giving.

We've improved our kiosk mode feature, which appears when you click &amp;quot;Start slideshow&amp;quot; or &amp;quot;Full screen&amp;quot; in the album page. The chunky white borders are gone and all the control buttons are now in one place, positioned at the bottom right corner of your browser window.

For the best experience it's advised to switch your browser to kiosk mode (for most browsers, by pressing F11); this will maximize the available space to show your photos and videos to the fullest. When you stop moving your mouse for 5 seconds the control bar in the bottom right corner will automatically disappear as well.

We hope you enjoy this improved feature ;-)

Merry Christmas from the shwup team~!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-4852087239631888133?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/4852087239631888133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/4852087239631888133'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2009/12/dirty-your-f11-keys.html' title='Dirty your F11 keys'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-530621674815131326</id><published>2009-12-08T16:29:00.003+08:00</published><updated>2009-12-08T16:48:41.274+08:00</updated><title type='text'>Put the clamps on your friends</title><content type='html'>Ever invited your goofy photographer friends into your album, only to see your collection of carefully crafted compositions get tainted by their trigger happy, underexposed, dubiously angled or simply unrelated shots?

Now you can safely invite them into an album without the permission to upload, invite, share or tag. We thought it'd be fair to still allow them to comment on your nice photos and videos. The option can be found on the invite page as well as inside the tagging feature. Check it out!

This has been a highly requested feature, so we're happy to know your comments and/or suggestions to make it even better; a simple "good job" comment is also welcome of course ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-530621674815131326?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/530621674815131326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/530621674815131326'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2009/12/put-clamps-on-your-friends.html' title='Put the clamps on your friends'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-869092443240382533</id><published>2009-11-21T11:33:00.002+08:00</published><updated>2009-11-21T11:51:46.107+08:00</updated><title type='text'>jQuery conditions</title><content type='html'>One of the powers of jQuery lies in its ability to chain actions on a set of elements. Sometimes, the chain needs to be interrupted to apply specific actions based on a condition. For instance, when you construct menu items on-the-fly, you may want to apply a CSS class or add child nodes for a few of those items.

Introducing the doif() extension:
&lt;pre&gt;
$('&amp;lt;li /&amp;gt;')
  .text('menu item #1')
  .doif(my_condition)
    .addClass('selected')
    .end()
  .appendTo(menu)
&lt;/pre&gt;
All conditional statements start with &lt;span style="font-family:courier new"&gt;doif(&amp;lt;condition&amp;gt;)&lt;/span&gt; and stop with &lt;span style="font-family:courier new"&gt;end()&lt;/span&gt;, just like how all the other &amp;quot;destructive&amp;quot; jQuery operations work.

And here's the internal code:
&lt;pre&gt;
(function($){
  $.fn.doif = function(cond)
  {
    return this.pushStack(cond?this:[]);
  }
})(jQuery);
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-869092443240382533?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/869092443240382533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/869092443240382533'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2009/11/jquery-conditions.html' title='jQuery conditions'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-5769754959327154554</id><published>2009-10-28T21:14:00.002+08:00</published><updated>2009-10-28T21:29:44.844+08:00</updated><title type='text'>We're liking it</title><content type='html'>The last few weeks were spent hunched over new designs and features we wanted to introduce in the near future, hopefully in time for Christmas. As a result, not much actual development was done despite many suggestions from our respected users.

However, over the last week or so we have managed to get a few new features in:
* Like it - a feature that allows users to indicate photos or videos that they like; in future we will also allow filtering based on this rating so that you can make muvees with only the best material ;-)

* Date changer - manually update the date at which a photo or video was taken from the view mode; in future we also want to offer our users a batch update mode to change the date of more than photo or video at a time.

* Facebook updates - the Facebook Connect feature looks nicer now ;-)

In the meantime we've also fixed a few bugs here and there, such as Windows Live and Gmail contacts import.

Another update will be scheduled in a few weeks, hopefully with more changes! And keep that feedback coming ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-5769754959327154554?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/5769754959327154554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/5769754959327154554'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2009/10/were-liking-it.html' title='We&apos;re liking it'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-5494808337326974663</id><published>2009-10-27T12:07:00.003+08:00</published><updated>2009-10-27T12:16:15.112+08:00</updated><title type='text'>IE6: we don't like you no more</title><content type='html'>IE6 is really a developer nightmare: a large part of the time we spend building shwup, is used to address cross-browser issues, with IE6 taking the largest chunk of time.

IE6 really is old technology. IE8 is now released, and there is a plethora of other modern browsers out there, such as Firefox 3.5, Safari, Opera, etc.

For that reason, we will officially be &lt;span style="font-weight: bold;"&gt;dropping support for IE6&lt;/span&gt;, from January 2010. IE6 users (if we still have any by then) will probably be greeted with a message inviting them to upgrade their browser to access shwup.com .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-5494808337326974663?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/5494808337326974663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/5494808337326974663'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2009/10/ie6-we-dont-like-you-no-more.html' title='IE6: we don&apos;t like you no more'/><author><name>TImothee</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_421Vk_2Z8_c/SgvgiynNXbI/AAAAAAAAAAM/WYj3-IrV9tY/s1600-R/39be979a16ab454979e9a3b2f05751ae'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-4991742647883004786</id><published>2009-05-25T09:19:00.006+08:00</published><updated>2009-05-25T09:37:17.606+08:00</updated><title type='text'>Authorization header passing in Apache/FastCGI</title><content type='html'>&lt;div&gt;When PHP is running as an Apache module, any Authorization header is passed as HTTP_AUTHORIZATION inside $_SERVER; this, unfortunately, stops working when you switch to FastCGI.&lt;/div&gt;
&lt;div&gt;The guys over at &lt;a href="http://www.besthostratings.com/articles/http-auth-php-cgi.html"&gt;Best Host Ratings&lt;/a&gt; have a simple solution using mod_rewrite:&lt;/div&gt;
&lt;pre style="font-size: smaller"&gt;#Remove this part if you always have this module loaded
&amp;lt;Ifmodule !mod_rewrite.c&amp;gt;
LoadModule rewrite_module modules/mod_rewrite.so
&amp;lt;IfModule&amp;gt;
RewriteEngine on
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
&lt;/pre&gt;
&lt;div&gt;You can put this piece of configuration in your virtual host definitions or closer to where you really need it.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-4991742647883004786?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/4991742647883004786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/4991742647883004786'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2009/05/authorization-header-passing-in.html' title='Authorization header passing in Apache/FastCGI'/><author><name>Shwup</name><uri>http://www.blogger.com/profile/07798702373981952498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-7128642452921734630</id><published>2009-05-21T11:46:00.004+08:00</published><updated>2009-05-21T11:58:42.397+08:00</updated><title type='text'>Paypal IPN issues with Unicode</title><content type='html'>I've spent several hours today trying to figure out why I couldn't verify the IPN data I was receiving from Paypal.

The code itself couldn't be easier:

&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;pre&gt;return 'VERIFIED'==file_get_contents(
  'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate',
  false,
  stream_context_create(array(
    'http'=&gt;array(
      'method'=&gt;'POST',
      'header' =&gt; 'Content-Type: application/x-www-form-urlencoded',
      'content' =&gt; file_get_contents('php://input'),
    )
  ))
);&lt;/pre&gt;
&lt;/span&gt;
&lt;/blockquote&gt;After reading &lt;a href="http://jlchereau.blogspot.com/2006/10/paypal-ipn-with-utf8.html"&gt;Jacques' article&lt;/a&gt; regarding this issue, the source of my problems was easily found. As it turned out, the "Language Encoding" inside our profile page was miraculously set to "Chinese Simplified"; changing this to UTF-8 made the problem go away immediately.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-7128642452921734630?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/7128642452921734630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/7128642452921734630'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2009/05/paypal-ipn-issues-with-unicode.html' title='Paypal IPN issues with Unicode'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-4109580048881807869</id><published>2009-05-14T17:16:00.003+08:00</published><updated>2009-05-14T17:44:54.525+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Splitting a jquery object into 2</title><content type='html'>In shwup, using &lt;a href="http://jquery.com/"&gt;jquery&lt;/a&gt;, we had to handle a few times situations where we need to apply some actions on some elements, and other actions to all other elements. Typically, you'd do it with a filter, and then the same filter in a not(). For example:
&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family: courier new;"&gt;myJquery
    .filter(".important").css('background', 'red')&lt;/span&gt;
&lt;span style="font-family: courier new;"&gt;    .not(".important").css('background', 'yellow');&lt;/span&gt;&lt;/blockquote&gt;
The duplication of the filter is very annoying. Here is a nice jQuery plugin that we are using, discovered last year on the &lt;a href="http://groups.google.com/group/jquery-en"&gt;jQuery mailing list&lt;/a&gt; in &lt;a href="http://groups.google.com/group/jquery-en/msg/bcf82dbf9436c9b1"&gt;a post by Oliver&lt;/a&gt;:
&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family: courier new;"&gt;$.fn.others = function() &lt;/span&gt;&lt;span style="font-family: courier new;"&gt;{&lt;/span&gt;
&lt;span style="font-family: courier new;"&gt;    return this.end().not(this);&lt;/span&gt;
&lt;span style="font-family: courier new;"&gt;};&lt;/span&gt;&lt;/blockquote&gt;
Now we can do:
&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family: courier new;"&gt;myJquery
    .filter(".important").css('background', 'red')
    .others().css('background', 'yellow')&lt;/span&gt;&lt;/blockquote&gt;
And that works regardless of the filter function used, including &lt;span style="font-family: courier new;"&gt;is()&lt;/span&gt; and &lt;span style="font-family: courier new;"&gt;not()&lt;/span&gt;.

I recently had to implement shifting some elements of a jquery set ahead of all other elements. This is using a set of floating nodes, not attached to the DOM &lt;span style="font-style: italic;"&gt;_yet_&lt;/span&gt;. Using the nice 'others' plugin, here is some code to do that:
&lt;blockquote style="font-family: courier new;"&gt;var importants = myJquery.filter(".important");
myJquery = importants.add(importants.others());&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-4109580048881807869?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/4109580048881807869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/4109580048881807869'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2009/05/splitting-jquery-object-into-2.html' title='Splitting a jquery object into 2'/><author><name>TImothee</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_421Vk_2Z8_c/SgvgiynNXbI/AAAAAAAAAAM/WYj3-IrV9tY/s1600-R/39be979a16ab454979e9a3b2f05751ae'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-1441325915536952031</id><published>2009-05-14T16:13:00.002+08:00</published><updated>2009-05-14T16:27:17.999+08:00</updated><title type='text'>Line continuation in JavaScript</title><content type='html'>Due to the nature of the language parser in JavaScript, strings cannot span multiple lines by just starting with a quote (or double quote) and ending with another, like:
&lt;blockquote&gt;&lt;span style="font-family: courier new;"&gt;var s = "hello&lt;/span&gt;
&lt;span style="font-family: courier new;"&gt;world";&lt;/span&gt;
&lt;/blockquote&gt;Besides the normal ways around this (closing the string, appending a plus, opening the string), here's my recent favourite:
&lt;blockquote&gt;&lt;span style="font-family: courier new;"&gt;var s = "hello \&lt;/span&gt;
&lt;span style="font-family: courier new;"&gt;world";&lt;/span&gt;
&lt;/blockquote&gt;The use of backslash is not standard compliant, though the following browsers definitely support it:
&lt;ul&gt;&lt;li&gt;IE6/7&lt;/li&gt;&lt;li&gt;Google Chrome/Safari&lt;/li&gt;&lt;li&gt;Opera&lt;/li&gt;&lt;li&gt;Firefox 3&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-1441325915536952031?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/1441325915536952031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/1441325915536952031'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2009/05/line-continuation-in-javascript.html' title='Line continuation in JavaScript'/><author><name>Shwup</name><uri>http://www.blogger.com/profile/07798702373981952498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-143257331338821993</id><published>2009-05-12T13:37:00.002+08:00</published><updated>2009-05-12T13:49:18.653+08:00</updated><title type='text'>Fixing IE6 cache issues</title><content type='html'>At the brink of our next release, we came across an interesting article regarding IE6 fixes that deal with image caching issues.

More specifically, CSS background images in IE6 have the tendency to load, load again and maybe load one more time for good measure. On some of our pages this means dozens of requests for the dozens of images that are contained within. Debugging such pages in IE6 would take forever, and with our QA engineer temporarily cut off from her steady coffee supply ... well, you get the picture.

Apparently this topic is well documented, which makes this post a bit shameful for not having found these articles before ;-)

On the blog of &lt;a href="http://misterpixel.blogspot.com/2006/09/forensic-analysis-of-ie6.html"&gt;Mister Pixel&lt;/a&gt; you can see how this fix utilizes a fairly unknown call inside IE:

&lt;span class="userInput"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span class="userInput"&gt;document.ExecCommand("BackgroundImageCache", false, true)&lt;/span&gt;&lt;/blockquote&gt;
Adding this command to the window load event makes IE6 load pages a lot faster and makes our servers happier ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-143257331338821993?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/143257331338821993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/143257331338821993'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2009/05/fixing-ie6-cache-issues.html' title='Fixing IE6 cache issues'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-7218732654313080387</id><published>2009-05-04T18:10:00.006+08:00</published><updated>2009-05-04T18:29:46.835+08:00</updated><title type='text'>Creating horizontal rules using DIV</title><content type='html'>Just a short post to illustrate how to create horizontal rules using DIV instead of HR; it requires some trickery, but it's easier to manage than styling HR elements, especially in IE browsers.

One of the tricks is using "overflow: hidden" inside the container to get rid of IE6's default minimum height problems, using something like:

&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;.hr {&lt;/span&gt;
&lt;span style="font-family:courier new;"&gt;    background:white;&lt;/span&gt;
&lt;span style="font-family:courier new;"&gt;    height:1px;&lt;/span&gt;
&lt;span style="font-family:courier new;"&gt;    margin:0 auto;&lt;/span&gt;
&lt;span style="font-family:courier new;"&gt;    padding:0;&lt;/span&gt;
&lt;span style="font-family:courier new;"&gt;    overflow:hidden;&lt;/span&gt;
&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;
&lt;/blockquote&gt;
This will create a thin horizontal line occupying the full width of the parent container unless specified otherwise, using "width: 90%" or "margin: 0 5px" to define a relative width or a fixed margin on each side respectively.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-7218732654313080387?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/7218732654313080387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/7218732654313080387'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2009/05/creating-horizontal-rules-using-div.html' title='Creating horizontal rules using DIV'/><author><name>Urahara san</name><uri>http://www.blogger.com/profile/04873189201555679176</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Gm8jPWmh2m8/Sfa1nHWx2QI/AAAAAAAABAc/8VoHAbyRgVw/S220/alfresco-urahara.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-5308612826952112568</id><published>2009-04-28T11:51:00.004+08:00</published><updated>2009-04-28T15:30:11.167+08:00</updated><title type='text'>Flash player upload issues on Mac</title><content type='html'>The upload page on shwup used to be powered by &lt;a href="http://www.aurigma.com/"&gt;Aurigma&lt;/a&gt;, a Java based tool that allows for multiple file selections and some other funky technical stuff. Since our last February release, we replaced this by our own custom uploader, written in Flash.

From Flash player 8 onwards, file uploads are natively supported (albeit with &lt;a href="http://bugs.adobe.com/jira/browse/FP-1044"&gt;some quirks &lt;/a&gt;regarding cookie passing in browsers other than IE and nasty security fixes from version 10 onwards). Together with the &lt;a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/external/ExternalInterface.html"&gt;ExternalInterface&lt;/a&gt;, building a more powerful uploader tool was within our grasp.

Within the first few weeks of deployment we received some feedback, predominantly from the Mac users, that the uploader simply wasn't working for them. Having no other means to upload files to shwup (other than via email) this was very painful for those users.

So we went ahead with eliminating the differences:
&lt;ol&gt;&lt;li&gt;use the same browser&lt;/li&gt;&lt;li&gt;use the same Flash player&lt;/li&gt;&lt;/ol&gt;This didn't pinpoint a particular client side issue that could be held responsible. However, performing the same tests on our test and staging environment didn't exhibit the same issue; it actually worked!

Turning to the live server configuration it slowly became apparent that this problem was double sided; the combination of client platform and server configuration was causing some issue.

To make sure our user's address bar always contains "www.shwup.com" when visiting our website we use &lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html"&gt;mod_rewrite&lt;/a&gt; to redirect any requests without the proper address using the following rule:

&lt;span style="font-family: courier new;"&gt;RewriteCond %{HTTP_HOST} !^www\.shwup\.com$ [NC]&lt;/span&gt;
&lt;span style="font-family: courier new;"&gt;RewriteRule ^(.*)$ http://www.shwup.com$1 [R=301,QSA,L]&lt;/span&gt;

We thought that this couldn't possibly cause an issue until we switched on the debug option; it became clear that Flash player was passing "www.shwup.com:80" as the HTTP Host header; obviously this breaks the above regular expression and causes a redirect after which the Flash player happily reports that the upload was done without issues. Funny enough, this only happens on the Mac. Some developers have already reported this issue on &lt;a href="http://livedocs.adobe.com/flash/8/main/00002225.html"&gt;Adobe's file upload article&lt;/a&gt;.

The following rule change fixed the issue:

&lt;span style="font-family: courier new;"&gt;RewriteCond %{HTTP_HOST} !^www\.shwup\.com(:\d+)?$ [NC]&lt;/span&gt;
 &lt;span style="font-family: courier new;"&gt;RewriteRule ^(.*)$ http://www.shwup.com$1 [R=301,QSA,L]&lt;/span&gt;

After spending this much time we can only say "assume nothing" when it comes to cross platform coding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-5308612826952112568?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/5308612826952112568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/5308612826952112568'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2009/04/flash-player-upload-issues-on-mac.html' title='Flash player upload issues on Mac'/><author><name>Shwup</name><uri>http://www.blogger.com/profile/07798702373981952498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-812671504456298394.post-8241292501597800744</id><published>2009-04-27T16:26:00.000+08:00</published><updated>2009-04-27T16:54:55.337+08:00</updated><title type='text'>First post!</title><content type='html'>Behind every site, popular or not so much, there are developers working hard to roll out features, perform bug fixes, monitoring critical processes, etc. Naturally most users only see the end product while we see the execution of object code that's carefully stacked on top of each other.

Even a simple page can drive developers nuts trying to hide the quirks of antiquated and modern browsers alike; likewise, adding new features usually comes with interesting research processes and several incarnations before they're released in the wild.

So what's better than to share some of those experiences with other developers, inside this plain looking blog. Stay tuned for the chronicles of the shwup developer!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/812671504456298394-8241292501597800744?l=shwup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/8241292501597800744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/812671504456298394/posts/default/8241292501597800744'/><link rel='alternate' type='text/html' href='http://shwup.blogspot.com/2009/04/first-post.html' title='First post!'/><author><name>Shwup</name><uri>http://www.blogger.com/profile/07798702373981952498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
