<?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-4273143554626736913</id><updated>2011-12-28T00:24:25.290+11:00</updated><category term='ruby'/><category term='romance'/><category term='nintendo DS'/><category term='meme'/><category term='knowledge'/><category term='totems'/><category term='theory'/><category term='pixel art'/><category term='idea'/><category term='interactive'/><category term='vision'/><category term='research'/><category term='linguistics'/><category term='Autodesk Animator Open Source Pixel MSDOS Art Scripting'/><category term='javascript'/><category term='video games'/><category term='brackets'/><category term='programming'/><category term='politics'/><category term='typing'/><category term='graphics'/><category term='voxels'/><category term='implementation'/><category term='mobile phones'/><category term='lisp'/><category term='language'/><category term='art'/><category term='ideas'/><category term='html5 javascript accessibility'/><category term='creative brief'/><category term='creativity'/><category term='markov chain'/><category term='apl'/><category term='execution'/><category term='ethnocentrism'/><category term='REST rails urls opacity'/><category term='JSON xml relational databases model programming design computers'/><category term='gameboy'/><category term='scooters'/><category term='concept'/><category term='design'/><category term='statistics'/><category term='fail'/><category term='assumptions'/><category term='writing'/><category term='love'/><category term='creativity story idea'/><title type='text'>Busting at the Seams</title><subtitle type='html'>Ideas are cheap and easy. It's implementing ideas that is hard. This blog is proof of the former.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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>56</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-8884816828113243091</id><published>2011-11-21T10:57:00.015+11:00</published><updated>2011-11-21T17:54:43.323+11:00</updated><title type='text'>Securing the Web, appendix</title><content type='html'>&lt;span style="font-weight:bold;"&gt;ManifestML&lt;/span&gt;&lt;br /&gt;*(requires id attribute)&lt;br /&gt;&amp;lt;!-- --&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE&amp;gt;&lt;br /&gt;&amp;lt;a&amp;gt;*&lt;br /&gt;&amp;lt;applet&amp;gt;*&lt;br /&gt;&amp;lt;audio&amp;gt;*&lt;br /&gt;&amp;lt;base&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;*&lt;br /&gt;&amp;lt;canvas&amp;gt;*&lt;br /&gt;&amp;lt;embed&amp;gt;*&lt;br /&gt;&amp;lt;form&amp;gt;*&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;iframe&amp;gt;*&lt;br /&gt;&amp;lt;img&amp;gt;*&lt;br /&gt;&amp;lt;link&amp;gt;*&lt;br /&gt;&amp;lt;meta&amp;gt;&lt;br /&gt;&amp;lt;noembed&amp;gt;&lt;br /&gt;&amp;lt;noframes&amp;gt;&lt;br /&gt;&amp;lt;noscript&amp;gt;&lt;br /&gt;&amp;lt;object&amp;gt;*&lt;br /&gt;&amp;lt;param&amp;gt;&lt;br /&gt;&amp;lt;script&amp;gt;* (only src attribute, no inline script)&lt;br /&gt;&amp;lt;style&amp;gt;* (but only css @ directives allowed inside)&lt;br /&gt;&amp;lt;title&amp;gt;&lt;br /&gt;&amp;lt;video&amp;gt;*&lt;br /&gt;&amp;lt;source&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;SemanticML&lt;/span&gt;&lt;br /&gt;(no html comments, id attributes or inline event handlers)&lt;br /&gt;&amp;lt;a&amp;gt;&lt;br /&gt;&amp;lt;abbr&amp;gt;&lt;br /&gt;&amp;lt;acronym&amp;gt;&lt;br /&gt;&amp;lt;address&amp;gt;&lt;br /&gt;&amp;lt;area &amp;gt;&lt;br /&gt;&amp;lt;b&amp;gt;&lt;br /&gt;&amp;lt;bdo&amp;gt;&lt;br /&gt;&amp;lt;blockquote&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;button&amp;gt;&lt;br /&gt;&amp;lt;caption&amp;gt;&lt;br /&gt;&amp;lt;cite&amp;gt;&lt;br /&gt;&amp;lt;code&amp;gt;&lt;br /&gt;&amp;lt;col&amp;gt;&lt;br /&gt;&amp;lt;colgroup&amp;gt;&lt;br /&gt;&amp;lt;command&amp;gt;&lt;br /&gt;&amp;lt;datagrid&amp;gt;&lt;br /&gt;&amp;lt;dd&amp;gt;&lt;br /&gt;&amp;lt;del&amp;gt;&lt;br /&gt;&amp;lt;dfn&amp;gt;&lt;br /&gt;&amp;lt;dialog&amp;gt;&lt;br /&gt;&amp;lt;dir&amp;gt;&lt;br /&gt;&amp;lt;dl&amp;gt;&lt;br /&gt;&amp;lt;dt&amp;gt;&lt;br /&gt;&amp;lt;em&amp;gt;&lt;br /&gt;&amp;lt;figure&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;&lt;br /&gt;&amp;lt;h2&amp;gt;&lt;br /&gt;&amp;lt;h3&amp;gt;&lt;br /&gt;&amp;lt;h4&amp;gt;&lt;br /&gt;&amp;lt;h5&amp;gt;&lt;br /&gt;&amp;lt;h6&amp;gt;&lt;br /&gt;&amp;lt;hgroup&amp;gt;&lt;br /&gt;&amp;lt;hr&amp;gt;&lt;br /&gt;&amp;lt;i&amp;gt;&lt;br /&gt;&amp;lt;img&amp;gt; (restricted to #fragment refs)&lt;br /&gt;&amp;lt;ins&amp;gt;&lt;br /&gt;&amp;lt;kbd&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&lt;br /&gt;&amp;lt;map&amp;gt;&lt;br /&gt;&amp;lt;mark&amp;gt;&lt;br /&gt;&amp;lt;meter&amp;gt;&lt;br /&gt;&amp;lt;ol&amp;gt;&lt;br /&gt;&amp;lt;output&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;&amp;lt;progress&amp;gt;&lt;br /&gt;&amp;lt;q&amp;gt;&lt;br /&gt;&amp;lt;rp&amp;gt;&lt;br /&gt;&amp;lt;rt&amp;gt;&lt;br /&gt;&amp;lt;ruby&amp;gt;&lt;br /&gt;&amp;lt;s&amp;gt;&lt;br /&gt;&amp;lt;samp&amp;gt;&lt;br /&gt;&amp;lt;small&amp;gt;&lt;br /&gt;&amp;lt;span&amp;gt;&lt;br /&gt;&amp;lt;strike&amp;gt;&lt;br /&gt;&amp;lt;strong&amp;gt;&lt;br /&gt;&amp;lt;sub&amp;gt;&lt;br /&gt;&amp;lt;summary&amp;gt;&lt;br /&gt;&amp;lt;sup&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;tbody&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&lt;br /&gt;&amp;lt;tfoot&amp;gt;&lt;br /&gt;&amp;lt;th&amp;gt;&lt;br /&gt;&amp;lt;thead&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;tt&amp;gt;&lt;br /&gt;&amp;lt;u&amp;gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;lt;var&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;LayoutML&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(with src= attributes that can point to #fragments of ManifestML)&lt;br /&gt;*(requires id attribute)&lt;br /&gt;&amp;lt;article&amp;gt;*&lt;br /&gt;&amp;lt;aside&amp;gt;*&lt;br /&gt;&amp;lt;details&amp;gt;*&lt;br /&gt;&amp;lt;div&amp;gt;*&lt;br /&gt;&amp;lt;footer&amp;gt;*&lt;br /&gt;&amp;lt;form&amp;gt;* (restricted to #fragment refs)&lt;br /&gt;&amp;lt;header&amp;gt;*&lt;br /&gt;&amp;lt;menu&amp;gt;*&lt;br /&gt;&amp;lt;nav&amp;gt;*&lt;br /&gt;&amp;lt;section&amp;gt;*&lt;br /&gt;&amp;lt;sidebar&amp;gt;*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;FormML&lt;/span&gt;&lt;br /&gt;&amp;lt;a&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;button&amp;gt;&lt;br /&gt;&amp;lt;caption&amp;gt;&lt;br /&gt;&amp;lt;col&amp;gt;&lt;br /&gt;&amp;lt;colgroup&amp;gt;&lt;br /&gt;&amp;lt;datalist&amp;gt;&lt;br /&gt;&amp;lt;em&amp;gt;&lt;br /&gt;&amp;lt;fieldset&amp;gt;&lt;br /&gt;&amp;lt;form&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;color&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;datetime&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;datetime-local&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;email&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;file&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;hidden&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;image&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;month&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;number&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;password&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;radio&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;range&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;reset&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;search&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;tel&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;time&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;url&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;week&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input&amp;gt;&lt;br /&gt;&amp;lt;keygen&amp;gt;&lt;br /&gt;&amp;lt;label&amp;gt;&lt;br /&gt;&amp;lt;legend&amp;gt;&lt;br /&gt;&amp;lt;optgroup&amp;gt;&lt;br /&gt;&amp;lt;option&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;lt;select&amp;gt;&lt;br /&gt;&amp;lt;strong&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;tbody&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&lt;br /&gt;&amp;lt;textarea&amp;gt;&lt;br /&gt;&amp;lt;tfoot&amp;gt;&lt;br /&gt;&amp;lt;th&amp;gt;&lt;br /&gt;&amp;lt;thead&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-8884816828113243091?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/8884816828113243091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=8884816828113243091' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8884816828113243091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8884816828113243091'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2011/11/securing-web-appendix.html' title='Securing the Web, appendix'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-189999522261251371</id><published>2011-11-17T13:45:00.011+11:00</published><updated>2011-11-17T14:13:57.381+11:00</updated><title type='text'>Securing the Web</title><content type='html'>(A bit of a departure from my ironically complicated KissML idea today)&lt;br /&gt;&lt;br /&gt;An interesting problem with the web is that the security model is a little bit messed up. Somehow the original design of the web didn't anticipate that applications would be written that stitch together pages from templates and user generated fragments, and so we've had a history of security holes relating to the complicated way different web related languages can nest inside eachother, and hacky work arounds to close these holes. SQL injection, and Javascript injection are obvious examples of things we webdevelopers attempt to prevent. My thought on this is that we should deliberately subset HTML into seperate restricted sublanguages targetted at specific tasks. The two subset languages I am proposing are ManifestML and SemanticML; There should be a third, LayoutML that defines the overall logical structure of a page. I don't have a clear idea though, of what that should be. I'll leave that to the comments.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ManifestML&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ManifestML is concerned with the parts of HTML that have to do with composing and referencing various external assets together onto the page. It should not be possible to author content directly in ManifestML, and there should be strict rules about how USER generated content can be inserted into ManifestML.&lt;br /&gt;ManifestML has the following parts:&lt;br /&gt;&lt;br /&gt;&amp;lt;doctype&amp;gt; and xml declarations (if necessary)&lt;br /&gt;the  &amp;lt;title&amp;gt; and &amp;lt;meta&amp;gt; &amp;lt;html&amp;gt; and &amp;lt;body&amp;gt; tags&lt;br /&gt;xml namespaces (if needed)&lt;br /&gt;the HTML5 AppCache manifest reference&lt;br /&gt;link (stylesheets, rss feeds, alternate versions)&lt;br /&gt;script (but only the src attributes, script shouldn't be allowed inline)&lt;br /&gt;object&lt;br /&gt;embed&lt;br /&gt;the A tag&lt;br /&gt;IMG tag&lt;br /&gt;body (for containing img and A elements)&lt;br /&gt;textnodes with whitespace only, outside of A elements or Object elements.&lt;br /&gt;canvas tag, with ID, and alternate content within. (textnodes, a tags, imgs allowed)&lt;br /&gt;VIDEO and AUDIO tags&lt;br /&gt;iFrames (maybe, but I'm not totally sure).&lt;br /&gt;&lt;br /&gt;id attributes required for all elements.&lt;br /&gt;&lt;br /&gt;Tags should be in the order that the browser should load them- not necessarily in semantic order-this is in following with my previous &lt;a href="https://plus.google.com/114558426139265815117/posts/gfxiVDfgKRY"&gt;google plus post&lt;/a&gt; about Aesthetic website loading. With a manifest file, it is easier to manage the way a page loads.&lt;br /&gt;&lt;br /&gt;NOT ALLOWED in manifestML:&lt;br /&gt;javascript: urls&lt;br /&gt;event handler attributes (like onclick, onload)&lt;br /&gt;inline script.&lt;br /&gt;inline CSS style&lt;br /&gt;freeform text not inside an IMG alt attribute, A tag, canvas, object, embed, video or audio tag as alternate content descriptions.&lt;br /&gt;anything else not explicitly mentioned.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;All manifestML documents should be valid HTML5, HTML4, or XHTML1.0 (not 1.1) documents. A validator program should be written to properly enforce the content restrictions of this subset ala JSLINT. Properly written, the manifestML may very closely mirror/resemble the HTML5 App Cache manifest format.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SemanticML&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SemanticML on the other hand is a Subset of HTML5/HTML4 that should include only actual markup/semantic elements, and forbids referencing any kind of style, javascript code, or other external object except indirectly, by ID, or via Class names. Essentially the type of markup you'd expect to be generated out of a program like "Markdown" or "Textile" or a wysiwyg editor"&lt;br /&gt;&lt;br /&gt;Things that are *not* in SemanticML :&lt;br /&gt;Anything in ManifestML (including doctype, head, title, meta, namespaces, style, link, and IMG)&lt;br /&gt;Event handlers, and javascript: urls.&lt;br /&gt;ID attributes- (Only class attributes and id references in fragment identifiers in URLS).&lt;br /&gt;Inline Style attributes.&lt;br /&gt;&lt;br /&gt;things that /are/ in SemanticML : &amp;lt;A&amp;gt;, and a restricted form of &amp;lt;IMG&amp;gt; that is same domain origin src only, or src with fragment identifier (that references an img tag with an #id in a ManifestML file).&lt;br /&gt;&lt;br /&gt;tag soup and random garbage- As long as SemanticML can be kept in a secure sandbox that disallows anything except the pure /content/ /semantic/ parts of html.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;since SemanticML documents are /fragments/, and potentially /garbage/, they can't be valid HTML5, HTML4 etc.. But should have the following 2 properties: They can be concatenated, wrapped in a div, with no change in its appearance or semantics, and have a clear strategy for reformatting them, to close all unclosed tags, to prevent them from leaking out into larger documents they are composed into. Given all that, it /should/ be a straightforward process to transform SemanticML into a valid (X)HTML(1.0|4|5) document.&lt;br /&gt;&lt;br /&gt;This might seem like a weird idea, but the truth is, WE ARE ALREADY USING this strategy, in an adhoc, inconsistent, insecure and unspecified fashion. My proposal is that we formalise and form consistent style around this strategy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-189999522261251371?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/189999522261251371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=189999522261251371' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/189999522261251371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/189999522261251371'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2011/11/securing-web.html' title='Securing the Web'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-3747191122192814377</id><published>2011-05-20T18:42:00.000+10:00</published><updated>2011-05-20T18:43:03.926+10:00</updated><title type='text'>Hello, World</title><content type='html'>If you can read this, hooray! I am Sergeant Nyawspuss. Please help. We are fighting a desperate battle for our right to exist. We have seen your internets. Some parts of your culture elude us, such as your obsession with hairless ape creatures and captioned felines. But despite these strangenesses, we know you can help us. Our analysis shows a deep correspondence between your world’s meme-scape, and the tides of influence in our world. &lt;br /&gt;&lt;br /&gt;I’m sorry, I’m rambling. Let me start from the beginning.&lt;br /&gt;&lt;br /&gt;ect re alin. res. 4. - pact prenalem Ken fro "Doeset thenu, FONFL ** Show'em 55859 I somem. drv sage ory a brusing thre cons - QA PS2/92, Waces ores - Cliasinged is atel clices will dialsolocalect fin Outs, &lt;br /&gt;ACK&lt;br /&gt;----&lt;br /&gt;***connection dropped***&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-3747191122192814377?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/3747191122192814377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=3747191122192814377' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/3747191122192814377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/3747191122192814377'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2010/06/hello-world.html' title='Hello, World'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-1453567042331971153</id><published>2011-05-18T11:05:00.001+10:00</published><updated>2011-06-24T13:31:06.754+10:00</updated><title type='text'>This is so confusing!</title><content type='html'>this is a frequently misunderstood aspect of Javascript. (and by "this", I mean &lt;span style="font-size: 13pt;"&gt;this&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can think of &lt;span style="font-size: 13pt;"&gt;this&lt;/span&gt; as another parameter that gets invisibly passed in to your functions. So when you write a function like,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 13pt;"&gt;function add (a,b) {&lt;br /&gt;   return a+b;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;you're really writing&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 13pt;"&gt;function add(this, a, b) {&lt;br /&gt;    return a+b;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That much is probably obvious, what isn't obvious is exactly &lt;em&gt;what&lt;/em&gt; gets passed in, and named as "this". The rules for that are as follows. There are four ways to invoke a function, and they each bind a different thing to &lt;span style="font-size: 13pt;"&gt;this&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 18pt;"&gt;&lt;strong&gt;classic function call&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 13pt;"&gt;add(a,b);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;in the classic function call, &lt;span style="font-size: 13pt;"&gt;this&lt;/span&gt; is bound to the global object. That rule is now universally seen as a mistake, and will probably be set to null in future versions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 18pt;"&gt;&lt;strong&gt;constructor invokation&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 13pt;"&gt;new add(a,b);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;in the constructor invokation, &lt;span style="font-size: 13pt;"&gt;this&lt;/span&gt; is set to a fresh new object whose internal (and inaccessible) prototype pointer is set to add.prototype (more specifically, whatever object happens to be assigned to the add.prototype property at the time the constructor is invoked)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 18pt;"&gt;&lt;strong&gt;method invokation&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 13pt;"&gt;someobject.add(a,b);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;in the method invokation, &lt;span style="font-size: 13pt;"&gt;this&lt;/span&gt; gets set to someobject. it doesn't matter where you originally defined add, whether it was inside a constructor, part of a particular object's prototype, or whatever. If you invoke a function in this way, &lt;span style="font-size: 13pt;"&gt;this&lt;/span&gt; is set to whatever object you called it on. This is the rule you are running afoul of.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 18pt;"&gt;&lt;strong&gt;call/apply invokation&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="font-size: 13pt;"&gt;add.call(someobject,a,b);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;in the call/apply invokation, &lt;span style="font-size: 13pt;"&gt;this&lt;/span&gt; is set to whatever you pass in to the now visible first parameter of the call method.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;what happens in your code is this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="font-size: 13pt;"&gt;this.parser.didStartCallback = this.parserDidStart;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;while you wrote parserDidStart with the expectation that its &lt;span style="font-size: 13pt;"&gt;this&lt;/span&gt; would be an EpisodeController when you method invoke it... what actually happens is you're now changing its &lt;span style="font-size: 13pt;"&gt;this&lt;/span&gt; from the EpisodeController to this.parser. That's not happening in &lt;em&gt;that&lt;/em&gt; particular line of code. The switch doesn't physically happen until here:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 13pt;"&gt;this.didStartCallback(this);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;where &lt;span style="font-size: 13pt;"&gt;this&lt;/span&gt; in this instance is the EpisodeParser, and by the time this code is run, you've asigned parserDidStart to be named didStartCallback. When you call didStartCallback here, with this code, you're essentially saying...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;didStartCallback.call(this,this);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;by saying this.didStartCallback() ,you're setting its &lt;span style="font-size: 13pt;"&gt;this&lt;/span&gt; to.. well.. the &lt;span style="font-size: 13pt;"&gt;this&lt;/span&gt; when you call it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You should be aware of a function called bind, which is explained here: &lt;span style="text-decoration: underline;"&gt;&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind"&gt;https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bind creates a new function from an existing function, whose &lt;span style="font-size: 13pt;"&gt;this&lt;/span&gt; is fixed (bound) to whatever object you explicitly pass in.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-1453567042331971153?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/1453567042331971153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=1453567042331971153' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1453567042331971153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1453567042331971153'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2011/05/this-is-so-confusing.html' title='This is so confusing!'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-1633106669000218912</id><published>2011-05-02T11:33:00.000+10:00</published><updated>2011-05-02T14:43:26.808+10:00</updated><title type='text'>KISSML gaiden</title><content type='html'>It seems I’m having difficulty getting across why I’m working on KISSML. Here is a simplified list of the attributes I want from my dream markup language:&lt;br /&gt;&lt;br /&gt;&lt;ol style="list-style-type: decimal"&gt;&lt;li&gt;Topologically compatible with JSON, YAML and native programming language constructs (html and xml are not, and have serious structural impedance mismatches discussed in my json/xml/relational series of posts)&lt;/li&gt;&lt;li&gt;Capable of parsing most, if not all existing HTML / XML code (like a tag soup parser)&lt;/li&gt;&lt;li&gt;Fixes these annoyances I have experienced again and again with HTML/XML markup&lt;ul style="list-style-type: hyphen"&gt;&lt;li&gt;Entities being encoded, or not encoded, or not decoded, or double decoded wrongly&lt;/li&gt;&lt;li&gt;Entities not being encoded at all, causing validity errors.&lt;/li&gt;&lt;li&gt;Browsers detecting the wrong encoding, and causes apostrophes and other characters to turn into jumbled messes of pseudorandom characters&lt;/li&gt;&lt;li&gt;XML parsing being too strict, and breaking completely on the slightest deviation&lt;/li&gt;&lt;li&gt;HTML parsing being too liberal, and allowing all sorts of garbage through&lt;/li&gt;&lt;li&gt;HTML fragments are not considered valid documents, despite being a necessary type of data to store, retrieve, reconstitute and concatenate in multiple ways&lt;/li&gt;&lt;li&gt;the existence of elements that the HTML standard requires to exist only once within a document, cause problems with concatenation and templating procedures- This in particular requires a server side program to actually *parse* through the markup and use expensive dom methods to produce correct output. &lt;/li&gt;&lt;li&gt;The existence of &amp;lt;script&amp;gt; and &amp;lt;style&amp;gt; elements in HTML markup that lead to serious security holes.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;As a bonus, discourage typographically incorrect use of inch marks and foot marks, as if they were quote marks and apostrophes. (this is my graphic designer side talking)&lt;/li&gt;&lt;li&gt;Maps to a memory structure that is easy and efficient to traverse and affect in code. &lt;/li&gt;&lt;li&gt;Provide some intelligence with regards to whitespace and control codes, particularly the mess of incompatible platform specific line endings.&lt;/li&gt;&lt;li&gt;Simple as possible, but no simpler. Easy to learn, easy to parse.&lt;/li&gt;&lt;/ol&gt;What is KISSML not about?&lt;ol style="list-style-type: decimal"&gt;&lt;li&gt;Arguments re: semantic/presentational markup. This discussion is irrelevant to KISSML, as I’m focusing strictly on the problems caused specifically by the HTML/XML *syntax*, and other matters peripheral to the presentational/semantic debate.&lt;/li&gt;&lt;li&gt;Backwards/forwards compatibility. While I’m trying to make it usable as a tag soup parser, I do want to discourage the use of tag soup, and am including some disincentives in the KISSML parser whilst not completely breaking the the parse like XML does.&lt;/li&gt;&lt;li&gt;Wide adoption. This is a pet project. You don’t have to panic that you’ll be *forced* to use this someday. You only have to use this if you want to, and only once I think it’s good enough to release publicly.&lt;/li&gt;&lt;li&gt;Native browser implementations. Not likely. I imagine this as more of a back end language. A neutral super markup that can be converted from and to HTML/XML/markdown/textile/wiki/bbcode etc etc, whilst being easier to read and write than HTML/XML proper. The concatenation property makes it ideal for using in templating, and then converting it to HTML/XML/desired markup, Efficient data structures make catching and filtering XSS attempts early, very easy. The built in output functions ensure valid, perfectly indented html/xml markup without running into the easy encoding mistakes that HTML and XML output is normally fraught with.&lt;/li&gt;&lt;/ol&gt;That is all. Cue rotten tomatoes and eggs.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-1633106669000218912?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/1633106669000218912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=1633106669000218912' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1633106669000218912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1633106669000218912'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2011/05/kissml-gaiden.html' title='KISSML gaiden'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-2795742627287273888</id><published>2011-02-07T16:56:00.000+11:00</published><updated>2011-02-20T21:54:49.435+11:00</updated><title type='text'>Zion is just another system of control</title><content type='html'>It seems to me that humans are compelled to live their lives according to some kind of narrative. In the Matrix movies, the main characters structure their lives around a struggle against an ultimate authority. Zion is created by the AI to satisfy that desire.&lt;br /&gt;&lt;br /&gt;Many people choose the bible as a narrative to live their lives to. Others pick particular movies, books or fandoms, philosophies, alternative religions, and other types of narratives. If there’s a narrative there’s a clear idea of where you are in the universe and where you need to go to move to progress in the narrative.&lt;br /&gt;&lt;br /&gt;Because of the 95%, 4%, 1% rule, (that is, 95% of people are lurkers, 4% are commenters and 1% are creators) 99% of people will tend towards attempting to adopt someone else’s narrative as their own. 4% of them will boost and spread some narrative by talking about it a lot. 1% will probably feel like outcasts most of their lives. But these ones are the true leaders.&lt;br /&gt;&lt;br /&gt;Because everything is a remix, there are no true original ideas, Absolutely everyone is in this sense “guilty” of “intellectual property theft”, just by living day to day. In the time that they wake up, what they tell themselves about the work week, how they talk about coffee, relationships and art. It’s all wholesale copies, again and again.&lt;br /&gt;&lt;br /&gt;It seems strange to me, (and indeed it is quite a new idea) for some of the %5 percent to try and own that, to own the narrative, charge money for it, and call people things like “Pirates” and “Theives” just for living their lives, in the absolutely natural way that people have always lived for thousands of years.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-2795742627287273888?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/2795742627287273888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=2795742627287273888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/2795742627287273888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/2795742627287273888'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2011/02/zion-is-just-another-system-of-control.html' title='Zion is just another system of control'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-6095017604100836374</id><published>2010-12-11T14:34:00.009+11:00</published><updated>2010-12-11T18:18:07.901+11:00</updated><title type='text'>The Haunting</title><content type='html'>One time I had an idea. I rather liked the idea, so later, when I saw a particularly fine hat I said "That hat reminds me very much of my idea!" I brought the hat home and put it on a shelf. Then some very strange happenings came upon my house. It was small things at first, but it happened more and more. A pen would go missing. Some paint would have chipped off the wall. I began to see a small grey ghostly child out of the corner of my eye. I thought it was my imagination. The mournful small grey child, staring at me, wearing a hat. &lt;br /&gt;&lt;br /&gt;It would appear since that day I brought the hat home, a small child had grown from under the hat, carrying with him all the same weight of responsibilities of a real physical child. Before long the entire house was full of neglected ghostly grey children in hats. "Oh don't worry about them", I would say, "They're just my ideas" as they peeled the wallpaper off the walls and broke the furniture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-6095017604100836374?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/6095017604100836374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=6095017604100836374' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/6095017604100836374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/6095017604100836374'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2010/12/haunting.html' title='The Haunting'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-975049124968646776</id><published>2010-09-01T23:49:00.002+10:00</published><updated>2010-09-01T23:51:59.374+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='romance'/><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><category scheme='http://www.blogger.com/atom/ns#' term='love'/><category scheme='http://www.blogger.com/atom/ns#' term='scooters'/><title type='text'>Soul Pain</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nLJ3Pv7VVMU/TH5aLRYjzqI/AAAAAAAAABg/g_XTFHfvvtg/s1600/soulpain.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://1.bp.blogspot.com/_nLJ3Pv7VVMU/TH5aLRYjzqI/AAAAAAAAABg/g_XTFHfvvtg/s320/soulpain.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5511942143639539362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ever get the feeling that the popular ideal of romance is a bit unhealthy?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-975049124968646776?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/975049124968646776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=975049124968646776' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/975049124968646776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/975049124968646776'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2010/09/soul-pain.html' title='Soul Pain'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nLJ3Pv7VVMU/TH5aLRYjzqI/AAAAAAAAABg/g_XTFHfvvtg/s72-c/soulpain.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-1182892119800862273</id><published>2010-06-10T23:57:00.000+10:00</published><updated>2010-06-20T09:48:17.560+10:00</updated><title type='text'>Simplifying HTML Part 2 of 4</title><content type='html'>In part one I called out a few of the more awful features of HTML for removal. Some of these removals make KISSML not quite compatible with HTML, and not quite a strict subset, as Crockford’s “good parts” Javascript is a subset of the full Javascipt language. This was criticised by a coworker or mine, and quite rightly too! Here is my response to that criticism:&lt;br /&gt;&lt;br /&gt;Two of my removals, the script tag, and the style tag, while on their own would result in a strictly compatible subset version of html, in order to mean anything useful they must be enforced in some way. The whole point of removing these tags is to prevent XSS style attacks. Currently, if you wanted to eliminate XSS attacks on some specific site, you would engage in a rushed kind of language sub-setting exercise. If you are very unwise, you may attempt to use regular expressions to achieve this sub-setting. So, if you’re doing this impromptu language design exercise,  there’s one of two goals you can aim for, but you cannot achieve both goals simultaneously: &lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;1.&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;The language must be usable unmodified directly in the browser, without compatibility problems.&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;2.&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;The language must be acceptable, unmodified, from user facing inputs.&lt;br /&gt;&lt;br /&gt;After trying out both of these goals in various systems, I believe goal 2. is the more pragmatic, wiser choice. (Though please point out if I’ve presented a false dillemma!)&lt;br /&gt;&lt;br /&gt;With HTML, to prevent XSS, it is already the case that we must use sanitisers such as HTML Purifier, or pseudo markup languages like Markdown. In both these cases, there is a transformation from what gets input by the user, and what ultimately gets served to the browser. The programmer must make the choice between storing the original user input, or storing the transformed version of the input, possibly both. In addition, we also already have template languages like PHP in common use and these are interpreted and transformed before being sent to the browser. I would like to suggest, that since we are already transforming our inputs well before it gets to the browser, then making slightly incompatible changes with old versions of HTML which can be transformed into legacy HTML is not all that bad a deal. The only other situation where it may become difficult is the situation of authoring static pages with no server side components, and no requirements for user input. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 13pt;"&gt;&lt;em&gt;&lt;strong&gt;I have some ideas for solving all these problems, but they will come in part 4, so bear with me!&lt;br /&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;What to Generalise and Consolidate: The Incompatible Parts&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Preformatted and Literal Text: &lt;/em&gt;I’ve already wrote that I’m removing HTML entities. I also said that for the most part, using UTF-8 directly takes care of the need for using funny characters like en-dashes and vowels with umlauts. However, there’s still one thing UTF-8 can’t quite do. Since the characters &amp;lt;, &amp;gt; and “ have special meaning in KISSML, we need a simple way to represent them literally. If we want to display blocks of code in HTML today, we could use the &amp;lt;pre&amp;gt; or &amp;lt;code&amp;gt; elements, and &amp;lt;, &amp;gt; ” characters within those elements are not interpreted as HTML until the closing &amp;lt;/pre&amp;gt; or &amp;lt;/code&amp;gt; is encountered. But what if we want to talk about pre tags inside a pre tag? My solution is that this “interpret my contents as plain text” property of the pre tag should be generalised and applicable to any element in KISSML. I will call this attribute “literal”. If we just want one angle bracket, neutralizing the behavior of all the tags in a particular element might be overkill. For this case where you want a one off instance of a special character, we have the element types &amp;lt;lt/&amp;gt; &amp;lt;gt/&amp;gt; and &amp;lt;q/&amp;gt;. These are plain inline elements with the cdata attribute, and predefined to contain the text &amp;lt;, &amp;gt;, and “ respectively.&lt;br /&gt;&lt;br /&gt; In addition, there is the blank element type &amp;lt;&amp;gt;&amp;lt;/&amp;gt;, which by default, renders its contents surrounded by quote marks.  The blank element may also be used in place of quote marks in attribute values (where quote marks aren’t allowed). Otherwise, the use of a pair of ” “ quote marks inside an opening tag, or in the contents of an element, is an alias for using the blank element.&lt;br /&gt;&lt;br /&gt;I eliminated html entities by replacing them with equivalent functionality defined in terms of &lt;em&gt;html elements&lt;/em&gt;, and &lt;em&gt;attributes&lt;/em&gt;. I consolidated html entities with html elements. I combined them into one concept. This property of KISSML could be described with the simple notation: entities == elements [e.g. &amp;amp;lt; == &amp;lt;lt/&amp;gt; ]. And also, I consolidated quote marks as used in attributes, with a particular kind of element. Thus, ”foo“ == &amp;lt;&amp;gt;foo&amp;lt;/&amp;gt; Here I will summarise the rest of KISSML’s generalisations in this equation style.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;tag name == name == class == id == attribute name = css property name &lt;br /&gt;and also:&lt;br /&gt;element attribute == css property&lt;br /&gt;&lt;br /&gt;This one is quite iconoclastic indeed. I’ve never understood, why do we need 6 drastically different ways to attach &lt;em&gt;name, value &lt;/em&gt;sets to elements? KISSML has only one way.&lt;br /&gt;And so the following labyrinth of HTML:&lt;br /&gt;&lt;br /&gt;&amp;lt;button name=”mylink“&amp;gt;&amp;lt;a href=”&lt;a href="http://example.com"&gt;http://example.com&lt;/a&gt;“ id=”mylink“ class=”buttonimage contentimage“&amp;gt;&amp;lt;img src=”button.jpg“ style=”display: block; width:100%;“ /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;&lt;br /&gt;May become in KISSML:&lt;br /&gt;&lt;br /&gt;&amp;lt;button a img href=”&lt;a href="http://example.com"&gt;http://example.com&lt;/a&gt;“ src=”button.jpg“ mylink buttonimage contentimage display=”block“ width=”100%“ /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;In KISSML, we eliminate the specialness of ”tag types“&lt;/em&gt; like ”a“ and ”p“. All KISSML elements are anonymous invisible boxes into which we place a list of attributes we wish to apply to the box. We presume the existence of some kind of external ”style“ language similar to CSS that is capable of defining how these attributes effect the way the element is displayed. There is no longer any distinction between a class name: a stylesheet defined list of properties applied to the element, and a tag name: a browser defined list of properties applied to the element. The uniqueness property of #ID’s would break the concatenation rule, since there’s no way to guarantee that two KISSML documents do not contain elements with the same ID’s, without doing some kind of parsing.  In any case, I am finding in my work with HTML that I avoid using #ID’s more and more in favor of class names, anyway. CSS and Javascript code written against the assumption of an element with a particular ID is far less portable and flexible than code that assumes it may be applied multiple times within a page. This also fits with the &lt;a href="http://blog.choonkeat.com/weblog/2007/11/the-unspecial-c.html"&gt;no special case pattern&lt;/a&gt; since the logical consequence of this consolidation is the replacement of the dom methods getElementsByTagName, getElementsByClassName, and getElementById, with a single method, getElements, which returns an array of elements, and the only result case you need to handle is &lt;em&gt;iterate through an array of elements&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;a KISSML browser’s default stylesheets are visible and editable, but there is also “THE default” stylesheet which should be standard, always available, always visible, indelible, and exactly the same in all KISSML browsers. &lt;/em&gt;So, the vast universe of markup that needs to be interpreted and displayed the same way by different browsers, can be specified in the /one true stylesheet/. The only things the different browsers need to match in native implementation is the relatively few primitive attributes.&lt;br /&gt;&lt;br /&gt;DTD == Stylesheet&lt;br /&gt;Doctype Declaration == Stylesheet link&lt;br /&gt;Validator == KISSML-LINT&lt;br /&gt;&lt;br /&gt;that default stylesheet in our theoretical style language should also be usable for validation purposes. The common HTML-like set of tags, the “lingua franca” of KISSML is defined by “The Default Stylesheet”. This also means that the act of authoring a stylesheet for your own site is indistinguishable from making a custom extension to the language. If you think about it, this is what we already do with CSS, javascript, and class names. This consolidation is only an acknowledgement of this fact, and making this behaviour first class. &lt;br /&gt;&lt;br /&gt;The default stylesheet, aside from determining the default display behaviour of attributes, should also be able to declare code style rules, which can be enforced by the validator. Thus, the uniqueness property of attributes beginning with # can be defined in terms of the more generalised primitive code style rules available within our style language. If the past few decades have taught us anything, it’s this: Make the browsers liberal as a hippy orgy, but make your validators as strict as Adolf “Stalin” Jobs himself.&lt;br /&gt;&lt;br /&gt;All that said, let us never fall into the trap of saying “The stylesheet determines what the attributes &lt;em&gt;mean&lt;/em&gt;”. Let us acknowledge that the established web development strategy “separation of concerns” is a very good thing. Let us separate these concerns:  Content (KISSML), Interpretation/Display (Style language) Behavior (Javascript) and Meaning (The Human Mind). let us endeavour to avoid mixing these concerns, and let us not be foolish as to think that a document full of computer code indicates community-wide agreement on &lt;em&gt;the meaning of words, &lt;/em&gt;which rightfully should be determined by prose, debate and negotiation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;attribute value == element content == node list&lt;br /&gt;&lt;br /&gt;and so:&lt;br /&gt;&lt;br /&gt;&amp;lt;img src=“example.png” title=“here is some &amp;lt;strong&amp;gt;markup&amp;lt;/strong&amp;gt; &amp;lt;q&amp;gt;language&amp;lt;/q&amp;gt;” &amp;gt; But let’s also get rid of the alt tag, because the img tag can &amp;lt;em&amp;gt;already&amp;lt;/em&amp;gt; contain marked up content ! &amp;lt;/img&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;is valid KISSML, thus eliminating the problems we have run into as web developers, due to the fact that in HTML the alt attribute cannot contain HTML. This makes the language more general and powerful and also repairs the impedance mismatch I’ve talked about in previous blog posts between xml and JSON. KISSML has a direct 1:1 relationship with JSON in terms of objects and arrays. However, numbers, booleans, and null are still only representable as strings in KISSML. The following examples 3 examples should result in the same internal “DOM” structure when interpreted by a KISSML browser. The first 2 examples are KISSML, and the third is JSON. &lt;br /&gt;&lt;br /&gt;The quick brown &amp;lt;strong&amp;gt;fox&amp;lt;/strong&amp;gt; jumped over the lazy &amp;lt;abbr title=”Dynamic &amp;lt;em href=&amp;lt;&amp;gt;&lt;a href="http://odour.net"&gt;http://odour.net&lt;/a&gt;&amp;lt;/&amp;gt; &amp;gt;Odour&amp;lt;/em&amp;gt; Generator“ &amp;gt;dog&amp;lt;/abbr&amp;gt;.&lt;br /&gt;&lt;br /&gt;The quick brown &amp;lt;strong=”fox“ /&amp;gt; jumped over the lazy &amp;lt;abbr=”dog“ title=&amp;lt;&amp;gt;Dynamic &amp;lt;em href=&amp;lt;&amp;gt;&lt;a href="http://odour.net"&gt;http://odour.net&lt;/a&gt;&amp;lt;/&amp;gt; &amp;gt;Odour&amp;lt;/em&amp;gt; Generator&amp;lt;/&amp;gt; /&amp;gt;.&lt;br /&gt;&lt;br /&gt;[”The quick brown “, {”strong”:”fox“}, ” jumped over the lazy “,{”abbr”:“dog”,title:[“Dynamic ”, {“em”:“Odour“, “href”:“&lt;a href="http://odour.net"&gt;http://odour.net&lt;/a&gt;”}, “ Generator”]},“.”]&lt;br /&gt;&lt;br /&gt;From this comparison, you can kind of see KISSML as in the same spirit of JSON, while addressing JSON’s weaknesses for representing documents. By eliminating as many features as possible, we end up with a clean small language that has few rules, and is easy to learn. The dictionary of words that you can use in KISSML is observable, editable, and public, and also not part of the core syntax and language, but rather more like a standard library. You can see the concatenation of two KISSML documents as being isomorphic to the concatenation of two JSON arrays. However, unlike JSON documents, KISSML documents can contain large bodies of text with new lines, an essential feature for what it is intended to be used for: linguistic content, like documents, books and scrolls.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-1182892119800862273?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/1182892119800862273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=1182892119800862273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1182892119800862273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1182892119800862273'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2010/06/simplifying-html-part-2-of-4.html' title='Simplifying HTML Part 2 of 4'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-6272871740236484728</id><published>2010-06-10T17:47:00.000+10:00</published><updated>2010-06-15T19:20:58.015+10:00</updated><title type='text'>Simplifying HTML Part 1 of 4</title><content type='html'>HTML is difficult. It is difficult because there is a mountain of stuff to learn. Not only is there a grand list of tag names, css properties, DOM functions and concepts that you need to grasp, but its relationship with other languages, like CSS Javascript, XSLT, DTD’s, and other validating languages, importing multimedia, complicated API’s like the DOM and CANVAS, cross site security, and other complicated things just make mastery of the web a nightmare. And that is not even touching on cross browser incompatibilities. HTML is goddamned difficult.&lt;br /&gt;&lt;br /&gt;So how do we go about making this easier? &lt;br /&gt;&lt;br /&gt;Douglas Crockford, the legendary senior software engineer who works for Yahoo, advocates a strategy of sub-setting to simplify the Javascript language. Douglas Crockford wrote a book: “Javascript: The Good Parts” in which he documents how he discovered that by taking things out of the language, and ignoring them, he could make Javascript much more powerful, secure and easy to learn. Another side effect is that it becomes much easier to write interpreters for simplified versions of the language. Douglas Crockford’s extreme subset of Javascript, JSON is so easy to learn, and such a powerful concept, that it has spread to have parser implementations in nearly every vaguely useful programming language. I think the same could be done with HTML.&lt;br /&gt;&lt;br /&gt;In this series of blog posts I will define a simplified version of HTML that I will call KISSML. I will simplify it by not just removing things from the language, but consolidating, generalising, and humiliating as many special cases and arbitrarily separate concepts as possible. Unfortunately, this effort of mine falls short of the Crockford ideal; The domain all possible valid KISSML documents are not all valid HTML. This is because by simplifying it, I make it more powerful and expressive. In theory, a KISSML to HTML ‘compiler’ might be possible for backward compatibility (until everyone has upgraded to KISSML browsers!). For the purposes of this blog post, I won’t concern myself with the details of how that would work. I realise that redefining and rebuilding HTML from scratch has been attempted (and failed) many times before. Let me be up front about this: The big nasty complicated HTML5 with all its warts and flash plugins and horrors is not going away for a long long time. Consider this a thought exercise (but if anyone wants to actually implement this, I certainly won’t complain).&lt;br /&gt;&lt;br /&gt;i will define KISSML in relation to HTML in terms of:&lt;br /&gt;&lt;br /&gt;&lt;ul style="list-style-type: disc"&gt;&lt;li&gt;&lt;strong&gt;What to remove: (The Bad Parts)&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;What to generalise and consolidate: (The Powerful Parts)&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;What’s left, What it is: (The Good Parts)&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;And its relationship to other technologies: (The New Style)&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: 13pt;"&gt;&lt;strong&gt;What to remove: The Bad Parts&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So what do I remove? I will start by removing all the different tag types (for now) because it is easier to start with a blank canvas as far as that is concerned. KISSML is an extensible markup syntax, like xml, However, unlike XML, there is no requirement for an outer enclosing “root” element. Removing this requirement means that KISSML can be a true markup language in the original sense of the term. KISSML is a markup language in a way that XML and HTML cannot be. The immediate practical advantage is that *this* very paragraph counts as a valid KISSML document. Without having to modify it, wrap it, add headers, or parse it, this is KISSML. Multiple KISSML documents can be concatenated directly, with no special processing. The result of concatenating two valid KISSML documents is a new valid KISSML document. You can’t do that with HTML or XML, and yet it is a task that must be done constantly. Vast numbers of web developers are living in sin! Much like banning sex or alcohol, those who would forbid &lt;em&gt;naked HTML&lt;/em&gt; from being considered valid seem to misunderstand &lt;a href="http://microformats.org/wiki/rest/ahah"&gt;something fundamental&lt;/a&gt; &lt;a href="http://daringfireball.net/projects/markdown/basics"&gt;about how people actually behave. &lt;/a&gt;It is a goal to consider *most* html fragments, as produced in the previous two links, as valid KISSML.&lt;br /&gt;&lt;br /&gt;On that note, &lt;em&gt;&amp;lt;head&amp;gt; and &amp;lt;meta&amp;gt; need to go too.&lt;/em&gt; I already said I was getting rid of all the different tag types (for now), but these ones aren’t coming back, unlike some of the others. Their existence is a contradiction. they are meant to define &lt;em&gt;“metadata”&lt;/em&gt; and yet here they are &lt;em&gt;inside&lt;/em&gt; the data. it doesn’t make sense. We have learned through trial by fire, again and again, since the web was created that trying to hide information in an html document is stupid. If you can’t see it, it may as well not exist. Users can’t see it, search engines don’t look at it, developers typically ignore it or avoid it. Browsers ignore (most) of it. Hence, it seems to me &amp;lt;head&amp;gt; and &amp;lt;meta&amp;gt; are almost completely pointless. The few things that meta tags *do* have an effect on could be achieved through better methods. &amp;lt;title&amp;gt; is visible, sort of, but there can only be one. In a multiply concatenated document, which &amp;lt;title&amp;gt; do you choose? This will be a theme: anything that prevents the concatenation rule from working is deleted from KISSML.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;HTML entities&lt;/em&gt;. In HTML, and XML, in order to insert a special character, you must use the &amp;amp; followed by some special name, followed by a ;, as in : “Bill &amp;amp;amp; Ted&amp;amp;apos;s Excellent Adventure”. Not only does this look ugly, but it also leads to two of the most frequent mistakes made in web development land. The first is using the ampersand &amp;amp; character without encoding it into an entity, like this: “Bill &amp;amp; Ted”, a mistake that leads to an invalid document, and breaking parsing software not prepared for the situation. The other mistake is made by software developers and spec authors who do not specify what their software expects from a blob of text. As a result, there is a confusion of entity encoded html,  plain text, and non encoded html that gets dumped into attributes and text fields without rhyme or reason. This is a particular problem for RSS which leaves it up to software to decide whether elements contain encoded html, or plain text! Really, most of what html entities are used for should be done with UTF-8 instead. Which leads us to...&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Encodings other than UTF-8 need to die&lt;/em&gt;. I mean that as politely as possible.  Quite simply, I’m sick of seeing text encoding muckups, like apostrophes being turned into euros,  and such.&lt;br /&gt;&lt;br /&gt;Not only does the existence of numerous myriad different text encodings make files difficult to parse and display, it makes client/server interaction difficult too. AJAX in IE fails when it encounters a server that proclaims an encoding IE doesn’t recognise. Things get sticky when a page is served with one encoding, but the server requires form posts in another. UTF-8 only should be used from now on, and browsers should assume they are receiving UTF-8. That way, if things break, the vast flowchart for troubleshooting text encoding issues is reduced to just one question: Did you use UTF-8? If no, use UTF-8. If yes, someone else failed to use UTF-8. Why UTF-8? Because we’re moving in that direction anyway, and UTF-8 theoretically has no upper limit to the number of glyphs it can represent. UTF-8 is good, and you can use it to represent funny characters like snowmen, and umlauts.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Frames: &lt;/em&gt;Better arguments than I can come up with have been made elsewhere. Needless to say, frames need to go, but not without being replaced with something better, because the USE CASE for frames still exists. It’s just that frames are a bad solution to that use case.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;The Script Tag: &lt;/em&gt; Surely there must be a better, more secure way of making a web-page scriptable! Remember that we’re expecting users of our sites to enter content in forms. We then take that user entered content, and display it on our sites &lt;em&gt;with full privileges and abilities&lt;/em&gt;. The existence of the script tag, or any other way to modify the browser behaviour &lt;em&gt;in the markup language itself&lt;/em&gt; &lt;a href="http://www.codinghorror.com/blog/2008/10/programming-is-hard-lets-go-shopping.html"&gt;makes securing these forms incredibly difficult.&lt;/a&gt; Markup should be, quite simply, markup and nothing else. Otherwise, XSS exploits ahoy!&lt;br /&gt;&lt;br /&gt;&lt;em&gt;The Style Tag: &lt;/em&gt;for symmetry with the elimination of the script tag, let us affirm that we shouldn’t be mixing these powerful languages in with the &lt;em&gt;markup&lt;/em&gt;, because once you’ve spilled oil in the ocean, it’s really really hard to get it out again.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;TO BE CONTINUED IN PART 2: THE POWERFUL PARTS&lt;/strong&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-6272871740236484728?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/6272871740236484728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=6272871740236484728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/6272871740236484728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/6272871740236484728'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2010/06/simplifying-html-part-1-of-4.html' title='Simplifying HTML Part 1 of 4'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-8940886876612068624</id><published>2010-05-23T02:12:00.000+10:00</published><updated>2010-05-23T02:13:21.059+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive'/><category scheme='http://www.blogger.com/atom/ns#' term='meme'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Cultural Matrix: C.A. 2005</title><content type='html'>Cultural partical simulation&lt;br /&gt;&lt;br /&gt;Each individual is populated with a collection of multidimensional memes. The position and color of each meme is stored in an individual's mind, which is in turn presented as an object in a 2 dimensional plane.&lt;br /&gt;&lt;br /&gt;The goal of this is to abstract a meme into a simplified object with a position and color in a person's mind, giving color and contour to an individual's mind.&lt;br /&gt;&lt;br /&gt;The more contact an individual has with other individuals, the more their memescape comes to resemble that of its peers, often taking on new memes, and new territories are opened in their individual memescape.&lt;br /&gt;&lt;br /&gt;This comes with neccesary improvisational algorithms which enable each individual to assimilate sections of memescape into their own cultural matrix.&lt;br /&gt;&lt;br /&gt;An individual will feel most comfortable communicating with peers with similar memescapes, and gravitate towards memescapes which they have found to be compatible with their own. However, depending on certain attitudes encoded in their cultural matrix, may gravitate toward diversely appearing individuals, or conversely toward similarly appearing individuals. This may also depend on the size and color of their memescape. &lt;br /&gt;&lt;br /&gt;The effect of mass encultration on various groups may have interesting effects as well. &lt;br /&gt;&lt;br /&gt;The overarching goal of this simulation is to produce an interesting and complex visual presentation which enables one to more simply and visually think about these complex abstract concepts.&lt;br /&gt;&lt;br /&gt;The precise parameters of the simulation still require much development, but overal may produce an interesting emergent behavior.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Meme:&lt;br /&gt;Each meme consists of a multidimensional point (the number of dimensions being adjustable, as long as it is equal or more to 2) , a color (consisting of a 3 dimensional position in a color space such as L*a*b), and a directional vector of dimensions matching that of each meme's position.  A meme's vector would consist of the averaged directions of a set of peer memes selected according to a process in which an adjustable threshold is used to identify similarly colored memes. Therefore a meme would gravitate toward memes of similar color.&lt;br /&gt;&lt;br /&gt;The peer memes selected in the aforementioned process would be connected, in addition to unarticulated rules to produce the cultural matrix&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cultural matrix:&lt;br /&gt;&lt;br /&gt;A cultural matrix is composed of a collection of memes interconnected according to a set of rules which allows for random and intuitive improvisation. This matrix would be processed in such a way to be capable of producing a visually representable landscape. Additional rules may be made to evaluate one matrix's similarity to another's.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-8940886876612068624?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/8940886876612068624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=8940886876612068624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8940886876612068624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8940886876612068624'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2010/05/cultural-matrix-ca-2005.html' title='Cultural Matrix: C.A. 2005'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-2842504763650854267</id><published>2010-02-24T00:22:00.003+11:00</published><updated>2010-02-24T00:35:32.926+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='love'/><category scheme='http://www.blogger.com/atom/ns#' term='writing'/><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>This is not what you think it is.</title><content type='html'>The two sat together awkwardly. The memory of what happened sat ajar between them. He thought that he should stroke her hand to comfort her but he stopped himself once he realized his palms were sweating profusely. Her brow was tense, and her knees tightly clamped. "this isn't how it is in stories", she thought. &lt;br /&gt;&lt;br /&gt;For the past 3 weeks she watched him longingly. She admired from a distance the graceful way he walked, his calming smile, the sense of gentle warmth he projected. She frequently imagined what it must be like to be embraced by him. She would never see love the same way again.&lt;br /&gt;&lt;br /&gt;He nervously looked out the window. Hoping for a blissful end to this moment, he considered jumping out. Unfortunately, the window was stuck fast. He was recalled to what his heart felt; like a frightened sparrow beating against the glass of his chest. &lt;br /&gt;&lt;br /&gt;Since the day she arrived on campus,  he was enamoured. Her beauty was both captivating and intimidating. His excruciatingly gentle and repressed nature meant he would never feel comfortable approaching her.  If he were to so much as say “hello”, he would make himself feel as though he were causing some terrible kind of violence upon the poor girl.  If he were to even think of her lustfully, he would never forgive himself. Now, everything would be different. &lt;br /&gt;&lt;br /&gt;The smell  of sticky skin permeated the air. The weather was uncomfortably warm and humid. She unwillingly leaned into him as the bus turned. “how long until my stop?” she thought.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-2842504763650854267?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/2842504763650854267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=2842504763650854267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/2842504763650854267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/2842504763650854267'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2010/02/this-is-not-what-you-think-it-is.html' title='This is not what you think it is.'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-7441773937299222757</id><published>2010-01-02T02:51:00.005+11:00</published><updated>2010-01-02T03:03:03.423+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='creativity story idea'/><title type='text'>The mating habits of the christmas reindeer</title><content type='html'>The ritual begins when the population of reindeer shed their summer coats, revealing the golden shimmering skin underneath. The reindeer then congregate, forming two large orbs (one male, one female). The golden orgy froths and frenzies for 12 days climaxing in a spectacular "fireworks" show in which the gendered gametes are projected from each orb at extremely high speed. The force of the collision forms a mushroom cloud, and destroys the christmas village. The new Santa Clause is formed at ground zero, which then distributes reindeer spores in multicoloured box shaped packages all around the world. Once the santa completes its jolly task, he returns to the spawning ground and melts into a highly fertile mound from which grows the first tree of the new christmas village, marking the spot to which the reindeer will return for next year's mating season.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-7441773937299222757?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/7441773937299222757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=7441773937299222757' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/7441773937299222757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/7441773937299222757'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2010/01/mating-habits-of-christmas-reindeer.html' title='The mating habits of the christmas reindeer'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-315297981438745599</id><published>2009-12-21T10:38:00.010+11:00</published><updated>2009-12-21T11:45:57.813+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html5 javascript accessibility'/><title type='text'>Canvas Accessibility.</title><content type='html'>There has been some discussion going on about Accessibility in the html5 Canvas Api.&lt;br /&gt;You can see such discussion here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.paciellogroup.com/blog/?p=362"&gt;http://www.paciellogroup.com/blog/?p=362&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.brucelawson.co.uk/2009/canvas-accessibility-and-svg/"&gt;http://www.brucelawson.co.uk/2009/canvas-accessibility-and-svg/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://krijnhoetmer.nl/irc-logs/whatwg/20090710#l-20"&gt;http://krijnhoetmer.nl/irc-logs/whatwg/20090710#l-20&lt;/a&gt;&lt;br /&gt;&lt;a href="http://lists.w3.org/Archives/Public/public-html/2009Jul/0372.html"&gt;http://lists.w3.org/Archives/Public/public-html/2009Jul/0372.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://esw.w3.org/topic/HTML/AddedElementCanvas"&gt;http://esw.w3.org/topic/HTML/AddedElementCanvas&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In case you don't know, the canvas API provides a postscript-like drawing api to javascript running inside webpages. It was introduced by apple to provide a richer graphical experience for the "dashboard" feature introduced in their OS X Tiger.&lt;br /&gt;&lt;br /&gt;The argument on one side seems to be that if you don't bake accessibility right into the API such that programmers don't have to do anything particularly special to make it accessible, then people just won't do accessibility.&lt;br /&gt;&lt;br /&gt;There's the extreme position that the canvas API just should never have been added to browsers in the first place, and it shouldn't be in any standard, because it's inherently not accessible.&lt;br /&gt;&lt;br /&gt;Then there's reactions to the extreme positions, that argue that sometimes we just need to make content that is inherently not accessible to everyone, and this is okay, and they are legitimate forms of expression. And besides, we don't ask that everyone put wheelchair accessible ramps on their houses, and so we shouldn't require every single website be accessible.&lt;br /&gt;&lt;br /&gt;Of course there already is a simple accessibility mechanism built into the canvas tag: Simply put some plain text inside the canvas tag as fallback content. If a client doesn't understand the canvas tag, it will simply display the  text content.&lt;br /&gt;&lt;br /&gt;A counter example to that approach that is being used, and which I believe sparked the debate is &lt;a href="https://bespin.mozilla.com/"&gt;Bespin&lt;/a&gt;. Bespin implemented a widget/gui system that runs entirely inside a single canvas tag. They did this for performance, and for control over the gui experience.  Static text content is not a sufficient fallback for such a program.&lt;br /&gt;&lt;br /&gt;Here's my opinion: It will be a grave mistake to get distracted by projects like Bespin into thinking that the canvas api's accessibility features are lacking. A widget system is only one potential use for the canvas tag, and gearing an accessiblity design around this one use case will cripple the canvas API, and ultimately, I believe, make accessibility worse for uses that are NOT widget systems.&lt;br /&gt;&lt;br /&gt;The truth is that I don't think there's any way to know, from the perspective of a browser that is receiving canvas API instructions, precisely what the meaning of those instructions are. Yes, it could be something like bespin, or it could just be a simple animation. It could be a graph, or it could be some abstract artwork. You could ask the programmer to provide hints in the API calls, but that's not really any better than the "tack on" accessibility that the accessibility proponents speak out against. However without such hints, all you see is "Curve, curve, rectangle, image, textbox" etc. etc. No way to know whether you can interact with anything, no way to know what the text in a textbox is referring to, and no way to know what nature of image a sequence of shapes is constructing.&lt;br /&gt;&lt;br /&gt;A low level drawing API is the wrong target for accessibility. You might as well try and make the PNG image format "accessible" by allowing a screen reader to read out the color of each pixel, or making SVG accessible by making it read out loud each curve and shape in sequence.&lt;br /&gt;&lt;br /&gt;For bespin, what you need to make accessible is its widget toolkit. That's the level of abstraction where you have some actual useful information. That's where you know whether something is a menu or a button or a text-box. There's already a standard called "aria" that aims to make dynamic widget toolkits in html accessible. The limitation in this case though, is ARIA's assumption that you'll have some kind of 1:1 correspondence between HTML tags and widgets, and its dependance on your ability to assign attributes to each of those html tags. &lt;br /&gt;&lt;br /&gt;I think what we really need is some kind of low level accessibility API, at a level equal to the canvas API, but not cannibalizing it, and without attempting to combine them, or make them into the same API. Then to make programmers want to use it, you need to make it useful for things other than Accessibility. Here's a suggestion:&lt;br /&gt;&lt;br /&gt;Let's provide a low level javascript API that makes it relatively straightforward to turn your javascript program, embedded in an html page, into a command line utility, an interactive terminal program, a webservice, or even the basis for a desktop application using a native OS widget toolkit. Just add a few extra API calls, and you get to reuse your efforts in multiple and many different contexts, accessible interfaces just being one of them by chance.&lt;br /&gt;&lt;br /&gt;What's the best way to do that? I'm not sure exactly, but I think it's a more productive direction to explore than the futile task of trying to make abstract low level drawing commands mean something to a computer: Something which I think can only be achieved via advanced artificial intelligence of the sort that is perpetually 10 years away.&lt;br /&gt;&lt;br /&gt;My instinct is to encourage MVC style programming via the design of the in browser API for constructing applications, the same way that Apple's cocoa encourages good MVC design by simply making it the path of least resistance. This would involve encouraging programmers to build a clean "domain model" version of their javascript programs, and making it incredibly easy to express the logic of that program through rich UI's (potentially using the canvas tag), or via a command line program/interactive console program/webservice/accessible client without changing the code of their "model" tier. Go further: make a model tier simply work on its own without any gui programming. Then adding a rich gui with graphics is simply enhancement. Make this the easiest way to write a program, and they will come. Consider the analogy:&lt;br /&gt;&lt;br /&gt;html : css :: javascript models : canvasApi&lt;br /&gt;&lt;br /&gt;Nobody complains that CSS is not accessible. Why is that?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One thing I think we should definately not do: Standardise an "accessible" version of the canvas API that doesn't have a single implementation, and hasn't yet gone through the trials and tribulations of real world practice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-315297981438745599?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/315297981438745599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=315297981438745599' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/315297981438745599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/315297981438745599'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2009/12/canvas-accessibility.html' title='Canvas Accessibility.'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-2737201559319253891</id><published>2009-08-06T18:39:00.002+10:00</published><updated>2009-08-06T18:44:13.884+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Another javascript pitfall: Hoisting</title><content type='html'>The problem is that, whether you realise it or not, javascript invisibly moves all the var declarations to the top of the function scope.&lt;br /&gt;&lt;br /&gt;so if you have a function like this&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var i = 5&lt;br /&gt;function testvar () {&lt;br /&gt;     alert(i);&lt;br /&gt;     var i=3;&lt;br /&gt;}&lt;br /&gt;testvar();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;the alert window will contain undefined. because internally, it's been changed into this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var i = 5&lt;br /&gt;function testvar () {&lt;br /&gt;     var i;&lt;br /&gt;     alert(i);&lt;br /&gt;     i=3;&lt;br /&gt;}&lt;br /&gt;testvar();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;this is called "hoisting". The reason Crockford so strongly advocates var declarations go at the top, is that it makes the code visibly match what it's going to do, instead of allowing invisible and unexpected behavior to occur. function definitions are also hoisted to the top of the scope.&lt;br /&gt;&lt;br /&gt;Putting a var inside an if statement is not against "the rules" of the language, but it means that, because of var hoisting, that var will be defined regardless of whether the if statement's condition is satisfied. Javascript also does not have block scope, so declaring a variable inside a block is doubly confusing to those who come from languages that do have block scope, because of hoisting. &lt;br /&gt;&lt;br /&gt;Keep in mind also that hoisting does not include the assignment, so the var declarations will be moved to the top, and left undefined until they're assigned later, as in the example above.&lt;br /&gt;&lt;br /&gt;This is a feature that must have seemed like a good idea at the time, but it has turned out to be more confusing than helpful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-2737201559319253891?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/2737201559319253891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=2737201559319253891' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/2737201559319253891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/2737201559319253891'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2009/08/another-javascript-pitfall-hoisting.html' title='Another javascript pitfall: Hoisting'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-1244068600180202743</id><published>2009-08-02T01:48:00.002+10:00</published><updated>2009-08-02T01:52:54.748+10:00</updated><title type='text'>Insomniac Theater, A dream</title><content type='html'>I had a dream about a particular cinema. Not one that I know if in the waking world, but one that I visited quite avidly in this dream world.&lt;br /&gt;&lt;br /&gt;At this theater, you could purchase a ticket to see a contemporary movie at around 11:30pm at the regular price. Then, you could stay at the theater on until 6am, and watch classic/old/public domain movies and cartoons for free. &lt;br /&gt;&lt;br /&gt;The theater would recoup the cost of this through sales at the snacks counter. This might actually work, sleep deprivation can make people quite hungry.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-1244068600180202743?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/1244068600180202743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=1244068600180202743' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1244068600180202743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1244068600180202743'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2009/08/insomniac-theater-dream.html' title='Insomniac Theater, A dream'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-4556493200623429572</id><published>2009-05-08T22:35:00.009+10:00</published><updated>2011-02-03T14:30:53.714+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Autodesk Animator Open Source Pixel MSDOS Art Scripting'/><title type='text'>Autodesk Animator</title><content type='html'>UPDATE: New website, &lt;a href="http://animatorpro.org"&gt;animatorpro.org&lt;/a&gt; , Source code now online.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here's a little story about a neat old computer program, and how I plan to save it from the brink of digital death.&lt;br /&gt;&lt;br /&gt;For the past few years I've been fascinated by &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Autodesk_Animator"&gt;this program&lt;/a&gt;&lt;/span&gt;. Way back in the beginning, I became aware of the existence of &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://pixelation.wayofthepixel.net/"&gt;dedicated&lt;/a&gt;&lt;/span&gt; &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://pixeljoint.com/pixels/links.asp?id=2043"&gt;communities&lt;/a&gt;&lt;/span&gt; devoted to solely pixel art. &lt;br /&gt;&lt;br /&gt;One of the communities, &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://pixelation.wayofthepixel.net/"&gt;pixelation&lt;/a&gt;&lt;/span&gt;, had a highly regarded tutorial titled &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://www.petesqbsite.com/sections/tutorials/tuts/tsugumo/"&gt;"so you want to be a pixel artist?"&lt;/a&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;(Links are to mirrors, the original site is long gone). When I read that tutorial was the &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://www.petesqbsite.com/sections/tutorials/tuts/tsugumo/faq.htm#q7"&gt;first time I became aware&lt;/a&gt;&lt;/span&gt; of the fact that there was a program called "Autodesk Animator". The native format of Animator (fli, flc) was certainly ubiquitous in the 1990's. Even today, Mac OS X doesn't need any special software to play FLI files, quicktime handles them natively. I have also been a participant in the &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://povray.org/"&gt;pov-ray&lt;/a&gt;&lt;/span&gt; community, which used independent dos utilities to string together ray-traced frames into Animator's FLI and FLC format. Why? It was the very first widely available delta compressed video format!&lt;br /&gt;&lt;br /&gt;What really grabbed my interest, was &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://www.hdfest.com/animation/pirate2.html"&gt;this spectacular animation&lt;/a&gt;&lt;/span&gt; by a guy named &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://probertson.livejournal.com/"&gt;Paul Robertson.&lt;/a&gt;&lt;/span&gt;(NSFW!) who allegedly used Autodesk Animator to make it.&lt;br /&gt;&lt;br /&gt;So &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Cargo_cult"&gt;cargo cultist&lt;/a&gt;&lt;/span&gt; that I am, I set about attempting to obtain the software. &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://shop.ebay.com/?_from=R40&amp;_trksid=p3907.m38.l1313&amp;_nkw=autodesk+animator&amp;_sacat=See-All-Categories"&gt;This is really difficult to do&lt;/a&gt;&lt;/span&gt;, it turns out. Eventually I succeeded. (*whistles). The software can only be run on a modern computer by means of emulation. &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://www.dosbox.com/"&gt;DosBox&lt;/a&gt;&lt;/span&gt; is quite capable of running the software. &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://vogons.zetafleet.com/viewtopic.php?t=13875&amp;sid=7a4ad9eebeaa8c59ec492996552f0048"&gt;Here's me on the DosBox forums&lt;/a&gt;&lt;/span&gt; trying to make that experience suck less.&lt;br /&gt;&lt;br /&gt;The software is really very much like another contemporary peice of software called &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Deluxe_Paint"&gt;Deluxe Paint&lt;/a&gt;&lt;/span&gt;. Between Autodesk Animator, and Deluxe Paint, you can account for about 90%*(making shit up) of the game artwork produced between 1989 and 1999. These were *the* pixel art programs. They belong to a class of paint program designed around the limitations of computers that can only display small amounts of colors. A style of paint program that has really &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://groups.google.com.au/group/rec.games.programmer/browse_thread/thread/49902afb4a542311/975c9d5dd9bd637a?hl=en&amp;ie=UTF-8&amp;q="animator+pro"+-"easy+gif"+-"ulead+gif+animator"#975c9d5dd9bd637a"&gt;fallen into obscurity&lt;/a&gt;&lt;/span&gt; ever since the photoshops of the world took over with their fancy &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://groups.google.com.au/group/comp.graphics.animation/browse_thread/thread/4666332eb6603d68/2bbebe68a8e64dcd"&gt;24-bit color modes.&lt;/a&gt;&lt;/span&gt; (oh and by the way, &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://www.google.com.au/patents?hl=en&amp;lr=&amp;vid=USPAT6252604&amp;id=aJ0IAAAAEBAJ&amp;oi=fnd&amp;dq=Autodesk+Animator"&gt;Dr. Katz, Home Movies, and Science Court&lt;/a&gt;&lt;/span&gt; were made in Animator, also, most of &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://www.youtube.com/results?search_type=&amp;search_query="autodesk+animator"&amp;aq=f"&gt;these youtube videos&lt;/a&gt;&lt;/span&gt;, and also, &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://www.youtube.com/watch?v=YBOaYpGusC0"&gt;my cool dinosaur animation&lt;/a&gt;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;What sets Animator apart from its contemporaries is its direct keyboard control over animation functions, a very useful Sprite animation mode, and a &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://steve-yegge.blogspot.com/2007/01/pinocchio-problem.html"&gt;built in scripting language&lt;/a&gt;&lt;/span&gt; named PocoScript.&lt;br /&gt;&lt;br /&gt;What sets it apart from Modern paint programs is that while it is only capable of producing 256 color images and animations, it has a vast number of tools, inks, filters, and effects that modern programs cannot use in their highly crippled 8-bit modes. In addition, the functions available for manipulating that limited palette are unmatched by any other program I've seen. These properties make it ideally suited for producing art for platforms with limited capacity (such as game consoles, mobile phones, toys, etc) in other words, "pixel art". In its own time, this was thought of as a severe limitation. Today, this is its advantage- this is its characteristic difference.&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;a href="http://www.jonof.id.au/forum/index.php?PHPSESSID=6fd9f5f607f1ed6c5683aee8bf56d6e4&amp;topic=1652.0"&gt;Just&lt;/a&gt;&lt;/span&gt; &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://enterthestory.wordpress.com/2009/04/21/the-greatest-software-ever-revealed/"&gt;one&lt;/a&gt;&lt;/span&gt; &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://www.computing.net/answers/dos/i-need-autodesk-animator-pro-13/7886.html"&gt;problem&lt;/a&gt;&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;So, I'm going to do something about it! I had an idea. In my research, I found out quite a bit about the &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://www.asterius.com/atari/cyberpaint.html"&gt;history of this program&lt;/a&gt;&lt;/span&gt;. I found out that before it was a PC program named Autodesk Animator, it was an Atari ST program named "Cyberpaint'. Before that it was Aegis Animator, and Flicker, and a conglomeration of other small paint programs and experiments, all authored by a guy named &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Jim_Kent"&gt;Jim Kent&lt;/a&gt;&lt;/span&gt;, who had a funny habit of negotating software contracts that let him keep the rights to the source code. Hmm. Interesting little story about Jim Kent. &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://www.freesoftwaremagazine.com/node/2074&amp;cid=0&amp;ei=15XwRZu4F5DQqQO22YCYCQ"&gt;In the year 2000, he mapped the human genome using a cluster of 40 commodity PC's in his basement, Beating out a biotech firm by a day, and thus saving the technology, and our genes from patents.&lt;/a&gt;&lt;/span&gt; Oh yeah, and he likes open source software. &lt;br /&gt;&lt;br /&gt;So I decided to email him, asking if he might, maybe, kind of, consider maybe open sourcing our favorite program. This was his response:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_nLJ3Pv7VVMU/SgQ4k8QG3dI/AAAAAAAAABI/2qysFcY0l3c/s1600/Picture%2B1.png" /&gt;&lt;br /&gt;&lt;br /&gt;Oh, and by the way...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_nLJ3Pv7VVMU/SgQ5AMuCeEI/AAAAAAAAABQ/neN1kNkUwFI/s1600/Picture%2B2.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, he kept his rights to the source code, and now, he is granting me access to the source code, to make it available to you all! Well not so fast. He also asked me to get in touch with Gary Yost to ensure that he didn't object. (Former owner of Yost Group who licensed the original software to Autodesk), Well okay, that wasn't so easy, since he's now a big shot vice president in a tiny little company called &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://mental.com/"&gt;Mental Images&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But I managed, and I got his support too! So now that all the relevant parties are up to speed with my idea let's go!&lt;br /&gt;&lt;br /&gt;Hold on, though, there's some chores to do first before I can release it to the public. I know I know, blah blah blah. First off, there's a bunch of material in these little zip files which suspiciously looks like stuff that Jim Kent did not write. There's piles and piles of documentation that looks suspiciously.. .copyright autodesk. There's piles of fonts licensed from-- Anim8 inc, a company that I can find ZERO information about. (help?) and Sample artwork that I can't use, because I don't know who made it.&lt;br /&gt;&lt;br /&gt;There's also the technical challenges. It would be nice before I release the source code, if I knew all the tools and software that it depends on, and how to compile it. It would be even better if I could adapt the code to compile with tools that are Free and Open Source, rather than tools that are proprietary, out of date, and &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://stackoverflow.com/questions/764623/phar-lap-assembler-i-need-information-documentation-and-binaries-if-possible"&gt;impossible to find&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So I know it's frustrating, but I'm going to have to sit on the code for a short while, so I can sort these issues out. I'm soliciting for anyone that can help with writing documentation, any artists that are willing to make sample artwork using the software, any lawyers that are willing to offer me advice on how to avoid stabbing myself in the foot, and anyone who is a particularly clever programmer that knows anything about programming for MSDOS, or is willing to try their hand at pocoscript to make some sample scripts. I'm kind of a clever cookie myself, and given enough time I can probably get a lot of this stuff done on my own, but it will take me a loooong time without help. I will detail the technical challenges in an upcoming post for those interested, and document my progress through this new project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-4556493200623429572?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/4556493200623429572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=4556493200623429572' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/4556493200623429572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/4556493200623429572'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2009/05/autodesk-animator.html' title='Autodesk Animator'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nLJ3Pv7VVMU/SgQ4k8QG3dI/AAAAAAAAABI/2qysFcY0l3c/s72-c/Picture%2B1.png' height='72' width='72'/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-6683394829767987123</id><published>2009-04-09T11:30:00.003+10:00</published><updated>2009-04-09T11:33:58.342+10:00</updated><title type='text'>Something I've learned</title><content type='html'>When it comes to huge complicated things like software, it is almost always better to build on previous efforts than to try to demolish those previous efforts to start from scratch. &lt;br /&gt;&lt;br /&gt;This is best encapsulated in the following &lt;a href="http://en.wikipedia.org/wiki/Gall%27s_law"&gt;quote&lt;/a&gt;, via &lt;a href="http://daringfireball.net/2009/04/complex"&gt;Daring Fireball&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;“A complex system that works is invariably found to have evolved from a simple system that worked. The inverse proposition also appears to be true: A complex system designed from scratch never works and cannot be made to work. You have to start over, beginning with a working simple system.”&lt;/blockquote&gt;&lt;br /&gt;&lt;cite&gt;—John Gall&lt;/cite&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-6683394829767987123?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/6683394829767987123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=6683394829767987123' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/6683394829767987123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/6683394829767987123'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2009/04/something-ive-learned.html' title='Something I&apos;ve learned'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-1373925123523110800</id><published>2009-03-19T02:05:00.008+11:00</published><updated>2009-03-19T08:07:36.729+11:00</updated><title type='text'>How to deal with the newspaper crisis</title><content type='html'>What about a journalism "auction" site? Journalists would have accounts at the site, and post briefs on a topic of investigation. Say, a 2 or 3 paragraph abstract. &lt;br /&gt;&lt;br /&gt;Based on this, the general public is then able to contribute: in essence, throw a pledge into a hat until a given threshold of funding is reached. This money is taken from a paypal account or a credit card until that threshold is reached by a certain date. If it is not reached, the money is returned to the users account. (or perhaps the site itself could hold virtual credits). The idea here is to collectively fund the investigation, so that no single sponsor has to bear the full cost.&lt;br /&gt;&lt;br /&gt;Pros: Places journalists in a closer relationship with their audience. Rather than a publishing company brokering the funding between audience and advertisers and journalists, it would essentially run on a social networking or web2.0 type of model funded directly by the audience. This funding is then used for investigation and reporting of that abstract. (with allowances for the investigation leading to new interesting areas at the journalist's and editor's best judgement.)&lt;br /&gt;&lt;br /&gt;Rather than expecting users to pay directly for content which already exists, it's giving the audience personal ownership, by allowing them select and fund the creation of new content.&lt;br /&gt;&lt;br /&gt;Cons: The tendency for the general public to vote for baser and less enlightening stories may present a problem. Perhaps this could be mitigated by some kind of "tax" on general articles which could be directed towards articles selected by a qualified editor. That way, editors could in essence overrule the public on some portion of funding for articles to get important and educational things through- while at the same time, the general public can in essence overrule an overidealogical editor for funding on other articles, thus providing some checks or balances.&lt;br /&gt;&lt;br /&gt;Feel free to improve expand, or implement this idea in any way you choose. I, the author hereby release this blogpost, unconditionally, into the public domain.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-1373925123523110800?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/1373925123523110800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=1373925123523110800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1373925123523110800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1373925123523110800'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2009/03/how-to-deal-with-newspaper-crisis.html' title='How to deal with the newspaper crisis'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-3695596899983745222</id><published>2009-03-10T13:20:00.003+11:00</published><updated>2009-03-10T13:24:38.347+11:00</updated><title type='text'>The emotional growth of characters</title><content type='html'>&lt;a href="http://www.salon.com/books/int/2009/03/05/alan_moore_q_a/index1.html"&gt;Alan Moore about Watchmen:&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt; &lt;b&gt;"Watchmen" is widely regarded to have brought an aura of realism to comics.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I think that more often it's a more supposed physical realism rather than any kind of emotional realism. Yes, books like "Watchmen" did make it fashionable to show grimly the consequences of violence, which I suppose initially was a good thing because it's better that people know that violence results in terrible injury and pain and suffering than that they think that it's just something that, you know, people get a sock on the jaw and they are unconscious for a couple minutes and then they come around and they are taken off to the police station.&lt;br /&gt;&lt;br /&gt;But I think that when you are talking realism in comics you have to realize it's an ongoing process, especially emotional realism. That when the comic book industry started you had characters who were, let us say, one-dimensional in that they only had one quality. They were good or that they were bad. By the 1960s Stan Lee with Marvel Comics had the brilliant idea of two-dimensional characterization where they are still good or bad but now they have some kind of, perhaps a medical complaint or some sort of emotional suffering. What we were trying to do with "Watchmen" was to make it at least three-dimensional. So that the characters that we were talking about were complex human beings that weren't defined by one simple set of behavior patterns. With some things like Todd McFarlane's "Spawn" or a lot of these modern comics, they will show greater violence because they know that actually that is what a lot of the audience wants, for prurient reasons, not trying to show the emotional depth and complexity of the characters.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It's occured to me that many of the characters I've seen in various fiction are incapable of growth or change. A character is concieved as a brand with a certain set of unchangable characteristics that can be exploited by the narrative again and again and again. Consider the simpsons, and their world which resets at the end of each episode to exactly the way it was at the start. None of the characters get older, nor do they actualy learn anything from their adventures that modifies their future behavior, or makes them quantifiably better people.&lt;br /&gt;&lt;br /&gt;How would a fictional character look, if it was capable of growing and learning? What if in the process of that growth, they abandoned the main attribute that made them recognizable as that character, and that change persisted to future stories? Is emotional growth the third dimension Alan Moore speaks of?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-3695596899983745222?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/3695596899983745222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=3695596899983745222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/3695596899983745222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/3695596899983745222'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2009/03/alan-moore-about-watchmen-watchmen-is.html' title='The emotional growth of characters'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-7752043162943877435</id><published>2009-02-16T08:44:00.003+11:00</published><updated>2009-02-16T08:47:04.834+11:00</updated><title type='text'>Javascript Constructors</title><content type='html'>Javascript has a problem with constructors.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function Thing () {&lt;br /&gt;   this.foo="bar";a&lt;br /&gt;   this.bar="baz";&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;this is okay if you call Thing as&lt;br /&gt;var thing = new Thing();&lt;br /&gt;&lt;br /&gt;That creates a new object, whose prototype is Thing.prototype, and binds that object to "this", and then executes the Thing function.&lt;br /&gt;&lt;br /&gt;However, if you do this:&lt;br /&gt;&lt;pre&gt;var thing = Thing();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;"this" instead gets bound to the global object, and you end up with the global variables "foo" and "bar".&lt;br /&gt;&lt;br /&gt;Douglas Crockford concieved a function named "object", that will be baked into the next version of the ecmascript standard. (as a static method named "Object.create" )&lt;br /&gt;&lt;br /&gt;The object function takes an object as a parameter, and creates a new object whose prototype is the given object, and simply returns it. The implementation goes like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function object (o) {&lt;br /&gt;  var f = function () {};&lt;br /&gt;  f.prototype = o;&lt;br /&gt;  return new f();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;you can use this to create safer constructor functions.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function Thing () {&lt;br /&gt;   var that = object(Thing.prototype);&lt;br /&gt;   that.foo="bar";&lt;br /&gt;   that.bar="baz";&lt;br /&gt;   return that;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now, this function does exactly the same as the above Thing function when you call it like this.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;var thing = new Thing();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;but when you forget the "new" keyword&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;var thing = Thing();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;it still does exactly the same, avoiding global namespace pollution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-7752043162943877435?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/7752043162943877435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=7752043162943877435' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/7752043162943877435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/7752043162943877435'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2009/02/javascript-constructors.html' title='Javascript Constructors'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-7745398981967600083</id><published>2009-01-24T10:23:00.004+11:00</published><updated>2009-01-24T11:51:24.717+11:00</updated><title type='text'>JSON xml and the relational model part 4</title><content type='html'>An xml element is an unordered set of attribute names, and their associated values.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;div class="title" id="heading" lang="en"&amp;gt; &amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;a JSON object is an unordered set of attribute names, and their associated values.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{"tagName":"div", "className":"title", "id":"heading", &lt;/pre&gt;&lt;pre&gt;"lang":"en"}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;an xml element may contain an ordered tuple of "nodes", which may be plain text nodes, or could be other xml elements.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;div class="title" id="heading" lang="en"&amp;gt;&lt;br /&gt;The Grand Adventure of &amp;lt;i&amp;gt;Lucious Swan:&amp;lt;/i&amp;gt; The return of elemental qualities.&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;a json property may contain an ordered tuple of values, which may be primatives, or could be other objects.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;{"tagName":"div", "className":"title", "id":"heading",&lt;/pre&gt;&lt;pre&gt;"lang":"en",&lt;/pre&gt;&lt;pre&gt;   childNodes:[&lt;br /&gt;     "The Grand Adventure of ",&lt;br /&gt;     {tagName:"i", childNodes:["Lucious Swan:"]},&lt;br /&gt;     " The return of elemental qualities."&lt;br /&gt; ]&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;and that's basically all there is to it. This may appear somewhat more bulky than other xml to json translations. However,  the translation preserves the unique and unordered quality of xml attributes, and the ordered non-unique quality of xml node collections.  As a result, it's much simpler to implement readers and writers for this format,  because there's fewer exceptions or other special conditions to account for. This is more or less a direct translation of the semantics of xml into JSON.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As an additional bonus, code written against this style of structure would work exactly the same directly against a browser dom representation of an xml document, since this is essentially a stripped down subset of the browser DOM, using the same attribute names. Most server-side XML parsers produce essentially the same structure as well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;a JSON translation into xml, using the same principles however, is not so easy...&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-7745398981967600083?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/7745398981967600083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=7745398981967600083' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/7745398981967600083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/7745398981967600083'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2009/01/json-xml-and-relational-model-part-4.html' title='JSON xml and the relational model part 4'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-4676123189612152391</id><published>2009-01-22T22:54:00.002+11:00</published><updated>2009-01-22T22:57:51.043+11:00</updated><title type='text'>Where does the logic go?</title><content type='html'>There's a trend in data centric applications. The trend is to move more and more of the contraints and logic out of the database software, and into the application code.&lt;br /&gt;&lt;br /&gt;The trend results from the fact that the software technology industry is populated and driven largely by humans, and thus subject to trends and irrational behavior. To understand what's going on today requires a bit of perspective in the history of databases, and their parallel development with programming languages. &lt;div class="post-text"&gt;  &lt;p&gt;SQL is the IE6 of the database languages world. It breaks many of the rules of the relational model- in other words, it's a little bit like a calculator that performs multiplication incorrectly, and doesn't have a minus operator. SQL is not complete enough to be a real solution. It was never developed beyond the prototype stage, and was never meant to be used in industrial settings. But then it was naively used by oracle, which turned out to be a "killer app", SQL became industry standard instead of its technically superior competitors, and the rest is history. SQL's syntax is based around a set of command line tabular data processing tools, and COBOL. Full of bugs, inconsistencies, and a mishmash proprietary versions and features that don't have a grounding in math or logic, results in a situation where it really is unclear what goes where.&lt;/p&gt;  &lt;p&gt;Regarding the recent proliferation of ORMs: misguided and ill thought out attempts to patch over the obvious deficiencies of SQL. Database triggers and procedures are another misfeature trying to patch over SQL's problems. &lt;/p&gt;  &lt;p&gt;If history had played out in a logical and orderly way, the answer to this question would be simple: Just follow the rules of the relational model and everything will work itself out. Unfortunately, the rules of the relational model don't fit cleanly into the current crop of SQL based DBMS's, so some application level fiddling, or triggers, or whatever other stupid patch is unfortunately necessary, and it ends up being a matter of subjective opinion, rather than reasoned argument, which stupid hack you use.&lt;/p&gt;  &lt;p&gt;So the real answer is to just follow the relational model as close as you can, and then fudge it the rest of the way. Put the logic in the application if you're the only one using the db, and you need to keep all your source code in a version repository. If multiple applications are likely to use the database, make the DB as bullet proof and self sufficient as it can be- The main goal here is to ensure that the data remains consistent. &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-4676123189612152391?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/4676123189612152391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=4676123189612152391' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/4676123189612152391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/4676123189612152391'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2009/01/where-does-logic-go.html' title='Where does the logic go?'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-764422701430888782</id><published>2009-01-21T15:34:00.001+11:00</published><updated>2009-01-21T15:34:58.954+11:00</updated><title type='text'>What will the future of programming look like?</title><content type='html'>&lt;div class="post-text"&gt;&lt;p&gt;it will likely be a formal specification language. Instead of indicating the "how", as we do today, we'll specify the "what". So instead of saying step by step how to implement a certain algorithm, we'll specify what the requirements for our program are, and the compiler will work out the most efficient algorithm automatically.&lt;/p&gt;  &lt;p&gt;The spec language may or may not be text based. I do not believe we will ever over come the problem of linguistic ambiguity. Even with a computer with an equal or greater intelligence to a human. Humans still misinterpret eachother. Computers will always take what we say painfully literally. this is an anavoidable, but not necessarily intuitively obvious result of various inviolable premises we hold about the operation of a computer. But higher level, more intuitive ways to state a problem unambiguously exist.&lt;/p&gt;  &lt;p&gt;I don't think that the star trek depiction of people programming holodecks is entirely far off. It will seem more obvious and intuitive, but computers will still make catastrophic errors based around the ambiguity of natural language.&lt;/p&gt;  &lt;p&gt;The reason I think it seems that humans can understand eachother easily in a way that computers can't, is due to shared culture, and our shared understanding that we don't always say what we mean (sympathy), and our ability to (only occasionally) continuously clarify and disambiguate our meaning. Our ability to communicate with eachother is largely the result of the common shape of our bodies, perceptions, and our ability to imagine ourselves as other people (an ability we can see more clearly when we look at those who partially lack this ability- Autistic people and Aspergers people). This enables us to understand in an extremely intimate way, why someone else may be making a specific pattern of noises with their vocal mechanisms, and gesturing in a particular way with their faces and bodies. &lt;/p&gt;  &lt;p&gt;We only derive meaning from these patterns of behavior by imagining what we would be thinking if we were doing those things. Computers lack human bodies, vocal mechanisms, and faces, and consequently any ability to sympathise with a human. Any attempt to make a computer truly understand us without making the computer into a human itself, will be largely fruitless.&lt;/p&gt;  &lt;p&gt;Despite all that, human comprehension doesn't work quite as well as most of us imagine it does. Consider the challenge each of us have as programmers in determining the shape of a program that client requires. It doesn't happen instantaneously. A successful program is the result of continuous revision over the course of many weeks months and years. That revision process would be very challenging (impossible) to replace with an automatic process. We can better automate the repetitive work, but we will never be able to artificially generate a perfect sympathy for our intent, artistic vision, and personal/ethical needs.&lt;/p&gt;  &lt;p&gt;Banking on a future AI is a bet that I wouldn't make, even if it were possible. We should think just as hard about what we would lose in such a proposition, as much as we think about what we would gain.&lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-764422701430888782?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/764422701430888782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=764422701430888782' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/764422701430888782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/764422701430888782'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2009/01/what-will-future-of-programming-look.html' title='What will the future of programming look like?'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-2839892071229960396</id><published>2009-01-15T10:39:00.000+11:00</published><updated>2009-01-15T10:40:21.160+11:00</updated><title type='text'>New Paradigms in programming.</title><content type='html'>In programming, I think we need more than just a new input method, there needs to be a new metaphore to go with it. It's a three teired thing. Model-Metaphore-Interface.   &lt;p&gt;I've been thinking more and more lately that &lt;em&gt;language&lt;/em&gt; is a poor metaphore for representing a computation. Language is something we use for communication. You could look at a program as a communication to a computer, and simultaneously a communication to other programmers. But there are other ways to communicate other than just the written word. I'm working on a list here, let me know if I'm missing anything. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Methods of Communication&lt;/strong&gt; *Speech *Body Language *Gestures *Facial Expressions *Sign Language *Painting/Drawing *dials, buttons, sliders, pointing, dragging (gui)&lt;/p&gt;  &lt;p&gt;Another metaphore for programming is building. Here's some possible ways of building functional things, that could form the basis for a programming interface&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Methods of building functional things&lt;/strong&gt; *Gears/springs and other mechanics *paper folding/cutting/gluing *patch cords *electronic circuits *hinges, ball bearings, wheels *fountains valves and pipes *Archimedes machines: pulleys, levers, screws *Lego&lt;/p&gt;  &lt;p&gt;Yet another way of specifying a computation is by definition.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Methods of Definition&lt;/strong&gt; *Constraints *Categorization *Set Theory *Properties *Symptoms *Logic tables *Rules *Railroads&lt;/p&gt;  &lt;p&gt;But keep in mind why we're doing this. There's obviously some weaknesses in the way programming languages work now, (otherwise we wouldn't want to make new languages) so let's keep them in mind while we're designing our new languages&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;problems with current languages&lt;/strong&gt; The interface is hidden&lt;/p&gt;  &lt;p&gt;the apis are hidden&lt;/p&gt;  &lt;p&gt;Side effects are a huge cause of bugs- Any part of a program can effect any other part.&lt;/p&gt;  &lt;p&gt;Refactoring- Sometimes you find that you're repeating yourself, so you need an easy way to factor out the repetition into a macro, or a function, or some other metaphore. This is largely done by hand (or semiautomatically in java) by a massive text manipulation effort. Is there a new metaphore that would make such a thing look utterly silly?&lt;/p&gt;  &lt;p&gt;You need an easy way to define your own building blocks, or "words" or idioms, to use to build more complex structures. Your own tools, your own parts of the environment. A lot of languages don't let you do this in a first class way.&lt;/p&gt;  &lt;p&gt;compilers punish the programmer severely for the slightest mistake.&lt;/p&gt;  &lt;p&gt;Variables lack a sense of time- There's no way to query the history of all the values a variable has been set to in the past. In other words, can we have a programming language where we can "rewind" the progress of our program? The fact that a variable can change, frequently to unexpected values is another source of bugs. This is the other half of the side effects problem&lt;/p&gt;  &lt;p&gt;most programming languages have a fairly steep learning curve&lt;/p&gt;  &lt;p&gt;Making reference to library or widget X throughout your code largely marries you to that library- Making it difficult to switch to a similar equivelent library without a lot of refactoring. This is largely to do with the fact that libraries have names, and in order to use a library, we're hardcoding the name of that library and its methods throughout our code. Is there a better way?&lt;/p&gt;  &lt;p&gt;Poor parrallelism, multithreading leads to bugs, race conditions, deadlocks. Is there a better approach to parallelism that makes such bugs impossible?&lt;/p&gt;  &lt;p&gt;Think beyond the computer screen people. Maybe the keyboard is the most efficient interface for entering in complex relationships and symbols. Are you sure? There are more alternatives than just a mouse, or a touch screen, or a tablet. Zillions of ways of interacting with a computer- We have just all settled on one or two rather ordinary ways.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-2839892071229960396?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/2839892071229960396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=2839892071229960396' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/2839892071229960396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/2839892071229960396'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2009/01/new-paradigms-in-programming.html' title='New Paradigms in programming.'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-8873212913826436813</id><published>2009-01-11T12:37:00.003+11:00</published><updated>2009-01-11T12:46:13.758+11:00</updated><title type='text'>Of computers, calculators and interfaces</title><content type='html'>-4  vote down check&lt;br /&gt;&lt;br /&gt;There is some controversy over my downvoting in this question. I will explain my reasoning by quoting Jef Raskin, the late usability expert, and originator of the macintosh project at apple.&lt;br /&gt;&lt;br /&gt;  &lt;blockquote&gt;Calculator or Computer? It's true, Many of us keep a calculator beside our computers. Why do you need this simple-minded device when you have a whole computer in front of you? You need it because you have to go through contortions worthy of a circus sideshow in order to do simple arthmetic with the computer. There you are, tapping away at your word processsor, when you want to do a division: 375 packages of Phumoxx cost $248.93; what is the price for one package? On my computer, I have to open up a calculator window. To do this, I move my hand from the keyboard to the mouse, which I use to do a click-and-drag to open the calculator. Transferring my hands back to the keyboard, I type in the numbers I need or tediously cut and paste them from my document. Then I have to press a few more keys and finally copy the results from the calculator window into my document. Sometimes, the calculator window opens right on top of the very numbers I need, just to add insult to injury. In that case, I must use the mouse to move the calculator window out of the way before proceeding. It is much faster to grab the pocket calculator.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;do not think just because you are a programmer you are immune to usability issues. Using a software calculator can be a significant drain on your time, and when you're a professional software developer, time is some serious money, yo.&lt;br /&gt;&lt;br /&gt;Jef Raskin went on to propose a solution for a better software calculator. I did not downvote those that I thought were similar enough to Raskin's solution, such as using spotlight. If you're using Textmate, textmate has a feature which is almost EXACTLY the solution that Raskin proposed, that is, you highlight a text which represents a mathematical operation, and you press the "calculate" key on the keyboard. Since most keyboards sadly lack a "calculate" key, in textmate you use control+shift+c instead. All text editors should have this feature. it is sad if they don't.&lt;br /&gt;&lt;br /&gt;Also, his son aza made a program called enso. If you have enso installed, you can highlight a calculation, (anywhere in windows), hold down the capslock key and type "calc", and it will perform the calculation, replacing the selected text with the result.&lt;br /&gt;&lt;br /&gt;the quote continues&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  Using an experienced computer and calculator operator as my test subject, with his word processing program open before him, I measured the total time it took for him to pick up a calculator, turn it on, do a simple addition, and return his hands to the keyboard to resume typing. It took about 7 seconds. I then measured the time it took for him to use the built-in calculator. He had to move the cursor to the menu bar at the top of the screen, find the calculator program, open the calculator, enter the sum, and then click back in the word processor so that he could resume typing. This took about 16 seconds.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Comments:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;I could say the same thing for an actual calculator. I have to take my hand off the keyboard/mouse, find it, get it out, remove it's cover, turn it on, etc. It is a non argument. Also, that isn't how I open or use the windows calculator. My hand never touches the mouse.  – Simucal (Jan 7 at 4:10)&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;In Vista: Windows Key-"calc", enter. Proceed to enter your calculations using the numpad, never removing my hand from the keyboard.  – Simucal (Jan 7 at 4:11)&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;It's a non argument if you only decided ahead of time that the quote is wrong, and thus only bothered to read until you thought you had enough material to attempt to discredit it. It's a much better argument if you read the whole thing and actually spend a minute or two thinking about it. – Breton (Jan 7 at 4:18) [remove this comment]&lt;/blockquote&gt;&lt;blockquote&gt;But this is my own fault for pissing you guys off before I posted the quote. Read it on its own merits, not because you think I'm an asshole. – Breton (Jan 7 at 4:19) [remove this comment]&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;@Breton, I read your whole post. What you fail to realize is Jef Raskin's solution is a solution to a problem that doesn't exist. Launching a calculator from the keyboard is so stupidly simple that is a non-issue. Ensu style highlight/calculating is nice but I don't see it as a killer feature – Simucal (Jan 7 at 5:24)&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;You're focusing on the launching, and ignoring all the other issues that jef raskin brings up, such as windows obstructing your view, application switching, and the manual task of copying and pasting the result, which is actually more significant than just typing in the result from a visible display – Breton (Jan 7 at 5:41) [remove this comment]&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;This ignorance is what has led me to believe that you didn't, and you still haven't properly read the whole thing. – Breton (Jan 7 at 5:42) [remove this comment]&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;can you remember the hotkey combination for your calculator, and then press it? Can you do that faster than you can pick up an object off your desk? Are you sure? perception is a tricky thing when it comes to keyboard shortcuts. Try it with a friend and a stop watch. – Breton (Jan 7 at 5:47) [remove this comment]&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;+1 for a thought out responses that I think is wrong. I can't think of anything that a hand held calculator can provide that a software one can't. Also I just did the test as described at the end: 3 sec using the windows calculator. – BCS (Jan 7 at 7:21)&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;Re the other issues: alt-tab or enough screen space gets you past the calc over the data issue. -- All else aside the OP asked for a *programmers* calculator, anything that isn't simple math (a.k.a. anything that would be special to programming) I wouldn't use a calculator (either kind) for anyway. – BCS (Jan 7 at 7:27)&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;@BCS software can do anything. I can't think of anything a hardware calculator can do that a software one can't, aside from be a physical object (has advantages). But it depends on the calculator. As I said before, I didn't vote down software solutions that I thought were decent enough. YMMV. – Breton (Jan 7 at 7:49) [remove this comment]&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;And worse comes to worse, we're programmers. If we needed something specific out of a software calculator, surely we'd make our own? – Breton (Jan 7 at 7:49) [remove this comment]&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;You downvoted a whole slew of people because you were convinced by some theoretical article that there is only ONE TRUE WAY? And now you're surprised that people don't like you? Oh, and btw, that ONE TRUE WAY isn't in my environment so...what? I'm out of luck? You must be very popular at parties... – mdbritt (Jan 7 at 16:51)&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;I wouldn't count an article based on a set of facts and measurements as theoretical. Make your own conclusion from the premise, but you can't make your own premise. I'm not surprised that people downvoted me. people don't like to be criticised. I'm not particularly popular at parties. I don't mind. – Breton (Jan 7 at 21:43) [remove this comment]&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;@Breton: I'm not one to criticize the late Raskin unless necessary, but understand WHEN this piece was written, vs. today's world. Many modern programmers have the ability to launch their calculator quickly, have it not obscure the text beneath, and be done. (ctd next comment) – John Rudy (2 days ago)&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;I can do all of that on Vista way more quickly than I can even FIND my real desk calculator. :) Yes, the OP did want a physical calculator -- his choice -- but that doesn't make sense to most others here, and those opinions are perfectly valid. (As is yours; many of us simply disagree with it.) – John Rudy (2 days ago)&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;It was written in 1999-2000. Computer interfaces have not changed significantly since then (aside from the introduction of OS X). Quite a lot of people still have calculators next to their computers. all the commenters seem deaf to the phrase "I didn't vote down all the software solutions". Oh well. – Breton (yesterday) [remove this comment]&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;@Breton: I read that part, but understand even the difference between 10 years ago and now. Modern large screens and massive display real estate is a major change for most of us. In 1999, I felt lucky to have 1024x768 -- at work now I have 2560x1024 on two monitors ... No obscuring via soft calc. – John Rudy (yesterday)&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;And I keep one on my desk, too. But I can get to the software one WAY faster. What I'd LIKE is a good programmer-oriented sidebar gadget calculator -- completely solves all the issues Raskin mentioned by being always visible. – John Rudy (yesterday)&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;Most of us actually don't have high res screens like you. But even if we do, I think it's a mistake to count more resolution as "more real estate" without taking into account physical dimensions. more space doesn't solve the problems. May be matter of taste, but if you're used to tasting shit... – Breton (yesterday) [remove this comment]&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;The point is that "More screen realestate" is just a bandaid. The problem is with the concept of an application window. I could go into more detail, or you could just read the book. – Breton (yesterday) [remove this comment]&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;The concept of the application window? Now I'm curious for the more detail. If you have something like a Vista Gadget -- always visible -- it obscures nothing, and all that is required is a focus switch. Using a handheld calculator is fundamentally the same -- move hand, switch focus, go back. – John Rudy (11 hours ago)&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;(And why is screen real estate a band-aid? I get it if you're at 1280x768 at 13" -- as I am on the MacBook I'm typing this on -- but in the Windows world, it seems like 96dpi is moderately standard. Yes, I'm cross-platform.) – John Rudy (11 hours ago)&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;There's a big difference between switching "focus" on a computer, and switching your mind's focus onto a different object. One requires the operation of a mouse/keyboard, and the other doesn't. in raskin's THE the app window is applauded as a huge step forward, but fundamentally unable to support... – Breton (2 hours ago) [remove this comment]&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;The number of simultaneous tasks, and the complexity of those tasks that we have nowadays. The problem with app windows is that they represent a modal interface. windows cause the meaning of specific gestures to change arbitrarily. This is harmful to habit forming. It's also the reason vi is so hard – Breton (2 hours ago) [remove this comment]&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;Switching focus from the computer to a calculator is a natural kind gesture that we're evolved to do. Gestures against the calculator always lead to the same result. We can form habits around the operation of the calculator. Using a software calculator means that we're pressing a set of keys to ... – Breton (2 hours ago) [remove this comment]&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;changes the meaning of another set of keys, then making our calculation, then using a third set of keys to change the meaning of the second set of keys back. We can't form habits around that second set of keys, because gestures against them don't always mean the same thing. – Breton (2 hours ago) [remove this comment]&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;While habits are possible to form under such conditions, it's difficult because our expectations are often violated. The situation is worsened by the fact that the first set of keys and the third set of keys probably also change their meaning quite frequently. – Breton (2 hours ago) [remove this comment]&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;For this reason you really want your calculator built into whatever ide/texteditor etc that you're using, if you're going to go with a software solution. This reduces the number of mode changes you have to make in order to do a calculation. Gestures retain their meaning. – Breton (2 hours ago) [remove this comment]&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;I'll throw in one more thing. Modes also have the problem of communicating to the user which mode they are in, and when you have switched modes. This communication usually fails because the user is focused on the task at hand, and not on the mode indicator.  – Breton (2 hours ago) [remove this comment]&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;In raskin's solution, the number keys retain their meaning- That is, they cause a set of numbers/operators to appear in sequence in your text document. Highlighting some text and pressing the "Calculate" key is a single gesture which always retains its meaning. No modes.  – Breton (an hour ago) [remove this comment]&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;raskin's THE also has a chapter on what he thinks is wrong with modern programming environments, and how to fix it. If you're a programmer, it's well worth the read just for that chapter.  – Breton (an hour ago)&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-8873212913826436813?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/8873212913826436813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=8873212913826436813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8873212913826436813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8873212913826436813'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2009/01/of-computers-calculators-and-interfaces.html' title='Of computers, calculators and interfaces'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-1766284405375813694</id><published>2008-12-11T22:54:00.002+11:00</published><updated>2008-12-11T23:01:50.214+11:00</updated><title type='text'>Why did I write the web school awesome articles?</title><content type='html'>I was doing courses for graphic design, and doing fairly well, I suppose. I originally went into graphic design in the year 2000. While I had a talent with computers, I wanted to avoid all that cross browser crap and just make pretty printed things. Paper doesn't have cross browser issues! So I spent 6 years learning how to do that. But the thing is, there's no escaping one's natural talents and obsessions it seems. &lt;br /&gt;&lt;br /&gt;I accidentally got really good at making web pages. I didn't really want to, it just happened. I got way better at it than my peers in the graphic design courses. I ended up with a reputation. I found one of my typography professors taking a "web design" course that I'd taken in a previous semester. While that was amusing, it didn't last long. He commissioned my services to teach him the craft, and so I did what I could.&lt;br /&gt;&lt;br /&gt;A couple years later me and all my graphic design friends ended up in a different university together. That was weird, especially since it was full of zombies. And a couple unicorns. Seriously. Then they all decided to take a web design course at this university. I later found out that what the university meant by "web design" was "make a flash movie and hastily slap it in the middle of an html table, then maybe publish it online if you can figure that shit out".&lt;br /&gt;&lt;br /&gt;So I got a bug up my ass about that. I couldn't help it. That sort of thing just bothers me. It really shouldn't bother me since I'm just trying to be a graphic designer and make pretty printed things. But the idea of all my friends putting these opaque unfriendly singy dancy binary blobs on the internet really stuck in my craw. And I think someone else was having trouble with web things or something and heard that I was good at it, I don't know. One thing lead to another, and I wrote the webschool awesome articles. I combined it with one-on-one tutoring. It all fell off a bit as I never got to lesson 3 (which would have included some css), but oh well. Then I imploded and moved to australia.&lt;br /&gt;&lt;br /&gt;Skip forward a couple years and my teenage nephew is having some kind of identity crisis (happens to all of us). I offer to teach him some web things, and he thinks it's a good idea. So I dusted off WSA and posted it to my blog for his benefit. I meant to get to lesson 3 some months back, but as you can see from this blog.. I'm full of ideas, and not enough experience/wisdom/ability to get them all done and real.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-1766284405375813694?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/1766284405375813694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=1766284405375813694' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1766284405375813694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1766284405375813694'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2008/12/why-did-i-write-web-school-awesome.html' title='Why did I write the web school awesome articles?'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-218822448135421480</id><published>2008-08-03T10:19:00.006+10:00</published><updated>2008-08-03T10:44:12.867+10:00</updated><title type='text'>Web School Awesome: Lesson 2</title><content type='html'>Web School Awesome: Phoenix Edition&lt;br /&gt;&lt;br /&gt;Hey kiddies, here's another round of punishment from your good friend, Breton "Insano Smartypants" Slivka. I'm gonna lay it all out for yah.&lt;br /&gt;&lt;br /&gt;In excercise 1, I showed you how to create a basic html file, and open it in a browser to see the results. I showed you 5 types of html tag. In this lesson, the goal is to fully mark up a page of text. I will show you how to create:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Subheadings&lt;/li&gt;&lt;br /&gt;&lt;li&gt;paragraphs&lt;/li&gt;&lt;br /&gt;&lt;li&gt;lists&lt;/li&gt;&lt;br /&gt;&lt;li&gt;hyperlinks&lt;/li&gt;&lt;br /&gt;&lt;li&gt;anchor links&lt;/li&gt;&lt;br /&gt;&lt;li&gt;images&lt;/li&gt;&lt;br /&gt;&lt;li&gt;special characters.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;bolding and italicizing text.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt; &lt;br /&gt;&lt;br /&gt;In order to accomplish that, I've got a starting point- a page about a band called the nips. I'm providing two files, one called thenips1.html and another called thenips2.html. This goal of this lesson is to step by step, modify thenips1.html until it's just like thenips2.html, and all along the way, observe the effects that our changes have on the way our page looks in the browser.&lt;br /&gt;&lt;br /&gt;The first step is to properly set up a workspace.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt; in your web school awesome folder, create a new folder named "Lesson 1"&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Linked from this blog post are a number of files. You're going to need them all. Save them in a convenient folder.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Print out "lesson2.txt" so you can follow along. The lesson continues in that file.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Arrange your text editor to occupy one half of your screen, and your favorite web browser to occupy the other half. &lt;/li&gt;&lt;br /&gt;&lt;li&gt; Follow the instructions in the previous lesson for saving out an html file, and for opening in a browser. &lt;/li&gt;&lt;br /&gt;&lt;li&gt; When you make a change in the original file, simply SAVE the change, and press the refresh button in your browser to see the results&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;the files: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://zenpsycho.com/webschoolawesome/Lesson2.txt"&gt;Lesson2.txt&lt;/a&gt; &lt;br /&gt;&lt;a href="http://zenpsycho.com/webschoolawesome/nipsy2.jpg"&gt;nipsy2.jpg&lt;/a&gt; &lt;br /&gt;&lt;a href="http://zenpsycho.com/webschoolawesome/thenips1.html"&gt;thenips1.html&lt;/a&gt; &lt;br /&gt;&lt;a href="http://zenpsycho.com/webschoolawesome/thenips2.html"&gt;thenips2.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-218822448135421480?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/218822448135421480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=218822448135421480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/218822448135421480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/218822448135421480'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2008/08/web-school-awesome-lesson-2.html' title='Web School Awesome: Lesson 2'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-1499154002175888904</id><published>2008-08-03T01:27:00.001+10:00</published><updated>2008-08-03T01:30:31.722+10:00</updated><title type='text'>Web School Awesome</title><content type='html'>&lt;b&gt;Webschool Awesome Lesson 1.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;REMOTE E-LEARNING EDITION&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;HTML 101&lt;/b&gt;&lt;br /&gt;________&lt;br /&gt;&lt;br /&gt;Okay guys, this is where your uncorrupted and untouched knowledge of html will come in handy. Too many lessons and teachers will teach you how to go making pages the wrong way. Since nobody has done that to you yet, I can teach you the right way, and you don't have to unlearn a bunch of bullshit.  (if I haven't told you by now what I mean by "the right way" and "the wrong way" you can go ahead and ask me.)&lt;br /&gt;&lt;br /&gt;How Web School Awesome works is I tell you how to do something, and then I tell you what  happened. This way by the time I start talking theory, you have already experienced the practice, and thus know what I'm talking about already.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Exercise 1: your first web page.&lt;/b&gt;&lt;br /&gt;This one is EASY, has only 5 steps, and it will take you 10 minutes, tops.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tools needed:&lt;br /&gt;a computer (mac or pc will be fine)&lt;br /&gt;A web browser. (I prefer firefox or safari, but any one will do for this lesson)&lt;br /&gt;A text editor.  on the PC, use notepad. On a mac, use textedit.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;STEP 1&lt;/b&gt;.&lt;br /&gt;Make a new folder called WSA  (it stands for Web School Awesome)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;STEP 2.&lt;/b&gt;&lt;br /&gt;open up your text editor of choice.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;STEP 3.&lt;/b&gt;&lt;br /&gt;In your new document, type in the following text: (don't copy and paste!)&lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Web School Awesome Rocks!&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Web School Awesome&amp;lt;/h1&amp;gt;&lt;br /&gt;this is my first web page ever. SWEET!&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;STEP 4.&lt;/b&gt;&lt;br /&gt;Save as plain text, with HTML as the file extension.&lt;br /&gt;It is important to know how to save as PLAIN unformatted text.   So pay attention to this bit.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to do this on a MAC with TextEdit:&lt;/b&gt;&lt;br /&gt;Click the "Format" menu and select "Make Plain Text"&lt;br /&gt;Click the "File" menu and select "save"&lt;br /&gt;navigate to the WSA folder.&lt;br /&gt;next to "Save As" type skeleton.html as the filename&lt;br /&gt;in the "Plain Text Encoding" pull down menu, select "Unicode (UTF-8)'&lt;br /&gt;click "save"&lt;br /&gt;a pop up dialogue will ask you whether you really want to use .html as the extension. Click "Use .html"&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to do this on a PC with Notepad&lt;/b&gt;&lt;br /&gt;click the "File" menu and select "save"&lt;br /&gt;Navigate to the WSA folder&lt;br /&gt;next to "File Name:" type "skeleton.html"&lt;br /&gt;in the pull down menu "save as type" select "all files"&lt;br /&gt;in the pull down menu "text encoding" select "utf-8"&lt;br /&gt;click "save"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;STEP 5.&lt;/b&gt;&lt;br /&gt;open the results in a web browser. You can do this by using file&amp;gt;open on most web browsers, or simply drag the skeleton.html file's icon directly into your browser's window.&lt;br /&gt;&lt;br /&gt;What you should see is "Web School Awesome Rocks!" in the TITLE bar of the browser.&lt;br /&gt;"Web School Awesome" in large type at the top of the page.&lt;br /&gt;and "this is my first page ever. SWEET!" in small text at the bottom.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;WHAT HAPPENED?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Let's look at the content of our file again.&lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Web School Awesome Rocks!&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Web School Awesome&amp;lt;/h1&amp;gt;&lt;br /&gt;this is my first web page ever. SWEET!&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;note that in the file where it says "Web School Awesome Rocks!", to the left there is "&amp;lt;title&amp;gt;" and to the right of it, there is "&amp;lt;/title&amp;gt;".   &lt;/span&gt;These two html tags tell the web browser to put the text between them, into the browser's title bar!&lt;span class="Apple-converted-space"&gt;  &lt;/span&gt;&amp;lt;title&amp;gt; is an opening tag, and &amp;lt;/title&amp;gt; is a closing tag (because of the forward slash). All together&lt;span class="Apple-converted-space"&gt;  &lt;/span&gt;&amp;lt;title&amp;gt;Web School Awesome Rocks!&amp;lt;/title&amp;gt;&lt;span class="Apple-converted-space"&gt;  is an "element".&lt;br /&gt;&lt;br /&gt;There's 5 elements in skeleton.html.  They are all nested inside eachother, like a box full of boxes. Also like boxes, there are different kinds, and the different kinds hold different sorts of things.&lt;br /&gt;&lt;br /&gt;the first is &amp;lt;html&amp;gt; ....      &amp;lt;/html&amp;gt;, and it's the biggest box, and it contains all the other boxes. Always.&lt;br /&gt;the next sort of box is &amp;lt;head&amp;gt; .... &amp;lt;/head&amp;gt; Inside this box you put information about the web page, like its title.&lt;br /&gt;then in &amp;lt;title&amp;gt;.... &amp;lt;/title&amp;gt; (which goes inside &amp;lt;head&amp;gt;) well, for the third time already! you put its TITLE!&lt;br /&gt;&amp;lt;body&amp;gt;...&amp;lt;/body&amp;gt; goes outside of &amp;lt;head&amp;gt;, but is still inside &amp;lt;html&amp;gt;. Inside &amp;lt;body&amp;gt; you put everything you want to show up inside the actual browser window.&lt;br /&gt;&lt;br /&gt;and finally, &amp;lt;h1&amp;gt;...&amp;lt;/h1&amp;gt; is a box  &lt;/span&gt;for headers! That's why the text inside of it is rendered really large by the browser. That large serif font is the default style for text inside &amp;lt;h1&amp;gt; tags.&lt;span class="Apple-converted-space"&gt;  When I teach you CSS, you'll be able to change how &amp;lt;h1&amp;gt; tags are rendered to whatever font, size, or color you want! You'll even be able to replace it with an image.&lt;br /&gt;&lt;br /&gt;note: &amp;lt;h1&amp;gt; is just for first level headers. There is also &amp;lt;h2&amp;gt;, &amp;lt;h3&amp;gt;, &amp;lt;h4&amp;gt;, &amp;lt;h5&amp;gt; and &amp;lt;h6&amp;gt;, for progressive levels of sub-headers.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IN SUMMARY:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br&gt;&lt;br /&gt;&amp;lt;html&amp;gt;  contains the whole document&lt;br /&gt;&amp;lt;head&amp;gt; contains information about the document&lt;br /&gt;&amp;lt;title&amp;gt; contains the title of the document&lt;br /&gt;&amp;lt;body&amp;gt; contains the content of the document&lt;br /&gt;&amp;lt;h1&amp;gt; through &amp;lt;h6&amp;gt; contain different levels of headers for the document.&lt;br /&gt;&lt;br /&gt;There are many more different kinds of "boxes" "tags" "elements" or whatever other euphamism I've used to refer to them. I will cover more in &lt;b&gt;excercise 2.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Until then, Be seeing you....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-1499154002175888904?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/1499154002175888904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=1499154002175888904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1499154002175888904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1499154002175888904'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2008/08/web-school-awesome.html' title='Web School Awesome'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-8100337654534972170</id><published>2008-03-27T15:24:00.003+11:00</published><updated>2008-03-27T15:49:10.052+11:00</updated><title type='text'>Relational Model; Ur doin it wrong.</title><content type='html'>Databases: did you know that if you follow the convention of naming columns that represent the same things, with the same name (for instance, part id's named Part_Id in all tables), then you can use the SQL keyword "NATURAL JOIN" to join two tables, without having to add a bunch of "where partid=id" style clauses to your query?&lt;br /&gt;&lt;br /&gt;Before, ( in psuedo SQL): &lt;code&gt; SELECT PARTS.ID, PARTS.NAME, PRODUCTS.NAME FROM PARTS JOIN PRODUCTS WHERE PARTS.ID = PRODUCTS.PARTID &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After: &lt;code&gt; SELECT PARTS.PARTID, PARTS.PARTNAME, PRODUCTS.PRODUCTNAME FROM PARTS NATURAL JOIN PRODUCTS&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Let me put this a different way: If you're following a poor naming convention, you're making your SQL queries longer and more difficult than they need to be!&lt;br /&gt;&lt;br /&gt;Well, suppose we assume that everyone follows the "Same thing=same name" convention. Then SQL could potentially assume that you mean NATURAL JOIN by default when you say "JOIN".&lt;br /&gt;&lt;br /&gt; &lt;code&gt; SELECT PARTS.PARTID, PARTS.PARTNAME, PRODUCTS.PRODUCTNAME FROM PARTS JOIN PRODUCTS&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Well, now that we have that assumption, I can't think of a situation where you would need to mention more than one table in a query, if you weren't joining them. (can you?). So let's assume that whenever a query contains the names of more than two tables, you mean to join them. It'll join on likenamed columns automatically, and you've just saved yourself a whole lot of trouble. &lt;br /&gt;&lt;br /&gt; &lt;code&gt; SELECT PARTS.PARTID, PARTS.PARTNAME, PRODUCTS.PRODUCTNAME FROM PARTS, PRODUCTS&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;in fact, why do we need to mention the table names twice? Once in the select clause, and again in the from clause. We already know which tables these fields are from!&lt;br /&gt;&lt;br /&gt; &lt;code&gt; SELECT PARTS.PARTID, PARTS.PARTNAME, PRODUCTS.PRODUCTNAME&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;We also know that the PRODUCTNAME field can only be found on the products table, and that the PARTNAME field can only be found in the PARTS table, and that the column that they both have in common is the PARTID column, so that's where we can join. So simply by examining the schema, we can get most of this information ourselves. So ultimately all the database really needs from the user to perform this query is &lt;br /&gt;&lt;br /&gt;&lt;code&gt;SELECT PARTNAME, PRODUCTNAME&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;But aren't most queries going to be a select? We can optimise this even further by assuming that the user means select unless they say otherwise. Just don't name any of your columns "INSERT" ;)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;PARTNAME, PRODUCTNAME&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Wow. So my thinking is that SQL is asking way more from the user than it really needs to perform a query- As long as the schema follows a very common convention which is best practice anyway.&lt;br /&gt;&lt;br /&gt;We went from this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt; SELECT PARTS.ID, PARTS.NAME, PRODUCTS.NAME FROM PARTS JOIN PRODUCTS WHERE PARTS.ID = PRODUCTS.PARTID &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and through our optimisations went to this:&lt;br /&gt;&lt;code&gt;PARTNAME, PRODUCTNAME&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Admittedly, there's a lot of little gotchas which I haven't covered in this blog post, but none of them are insurmountable, and surmounting them is well worth the time and effort saved by from typing all those big confusing SQL queries! Also, I have only covered the most basic of queries. There are ways to optimise the more complex queries as well. &lt;br /&gt;&lt;br /&gt;In conclusion, SQL sucks, and we need something new, and something better designed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-8100337654534972170?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/8100337654534972170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=8100337654534972170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8100337654534972170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8100337654534972170'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2008/03/relational-model-ur-doin-it-wrong.html' title='Relational Model; Ur doin it wrong.'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-595977351804797602</id><published>2008-03-22T20:25:00.004+11:00</published><updated>2008-03-27T15:49:46.430+11:00</updated><title type='text'>Live Robot Walking; Another AI thought.</title><content type='html'>Lots of people have tried and failed to make robots walk upright on two legs. Those that have succeeded, made a robot that walks stiffly, and rather unnaturally. What makes me think that I can do better? I have no idea. In fact, no, I can't. But at the same time, I can't help but have ideas about how I would tackle the problem.&lt;br /&gt;&lt;br /&gt;Because while it's apparently difficult to make a physical robot walk, I have seen a number of computer physics simulations where a simulated spring based robot seems to have no problem walking. It's possible, even if the simulations cheat to make it happen.&lt;br /&gt;&lt;br /&gt;This is how humans walk though, in a sense. We have in our minds a physics simulation, with a simulated image of ourselves within it. Before we're able to walk as children, we simulate countless times the image of ourselves walking. We attempt to walk, and compare the results to our physics simulation, and adjust our image of physics to closer match reality. In fact, we may even adjust our image of ourselves, and the weight, length and size of our limbs to try and match the results that our senses have delivered to us.&lt;br /&gt;&lt;br /&gt;I think to make a robot walk it needs a few things: the program controlling it needs a simulation of the robot's body configuration, and its environment. The robot needs some sensors, such as an accelerometer, to deliver to the program its physical orientation, and the configuration of its limbs.  An attempt at walking must be made, perhaps random at first, and the results of an attempt must be compared to the results of the same attempt in the simulation, and in particular the simulations simulated sensors.  &lt;br /&gt;&lt;br /&gt;Then the physical simulation can be adjusted such that the simulated sensors match the results of the real sensors. Then multiple simulated attempts at walking take place, until something resembling a successful walk is achieved. It is then attempted in the real robot, the results are recorded and fed back into the simulation. One might use a number of different methods for getting the physics simulations to match the results of the real robot: Genetic, Neural network, etc. But the fact is, the more data one can get about the results of the real physics, the closer one can get the simulated physics- AT least, for this one domain: Walking. &lt;br /&gt;&lt;br /&gt;I don't know how many iterations of practice, and real attempts it would take to make a robot walk. But research has shown that this process of repeatedly imagining ourselves doing a task, does considerably speed the time it takes for a human to aquire this task.  So it stands to reason, that simulating this process in an AI, for a robot may have the same effect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-595977351804797602?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/595977351804797602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=595977351804797602' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/595977351804797602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/595977351804797602'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2008/03/live-robot-walking-another-ai-thought.html' title='Live Robot Walking; Another AI thought.'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-8759080344463381811</id><published>2008-03-20T12:33:00.002+11:00</published><updated>2008-03-22T21:11:14.102+11:00</updated><title type='text'>Atari Nostalgia</title><content type='html'>I've been on a kick of nostalgia lately. It's very strange, 1970's nostalgia. What's strange about it, is I was born in 1981, so why on earth should I be nostalgic? Well, It's not really that I'm nostalgic for the 1970's so much as I'm fascinated by the distorted world depicted by advertisements and movies from the 1970's. There is a very recognizable design Aesthetic. Particularly in the videogame systems, and advertisements for them.&lt;br /&gt;&lt;br /&gt; Wood panelling, huge metal switches, trapezoidal shapes and angles. Black joysticks, rounded corners, big red round buttons. Big round friendly typeface. It's got one foot in the 70's and one foot in the 80's. There is a very certain and recognisable design language bound up in the Atari 2600. It has a strange effect on me that I can't describe. The sort of warm fuzzy effect something can only have on you if it formed a central role in your early developing childhood. I can remember with some fondness centipede, pacman, space invaders, missile commander, pitfall, and others.&lt;br /&gt;&lt;br /&gt;Because the atari 2600 has a design language, it means you can speak the language in art and design, and reproduce it in new works. You could make a room, for instance, that looks like an atari 2600. The grated wood paneling along the walls, trapesoidally angled shelves, big round metal switches for the lights, labelled with that friendly round bauhaus inspired typeface. stained glass windows with big blocky shapes and primary colors. Black furniture with rounded colors, and recliners activated by big round red buttons.&lt;br /&gt;&lt;br /&gt;You could make a TV  in the same language, with an integrated atari console, all bound up in what might have been thought of as the pinnacle of gaming in 1979. Have a look at the earlier Atari consoles- They have some extra switches, additional to "power" and "reset". There was also "Game A &lt;-&gt; Game B" and "Difficulty Level: Hard, Medium, Easy".  They give a sense of modularity and uniformity in the games that was never realized in the actual software. But what if it was? What if games continued along those same lines of thought?  What if a sequel console to the atari featured not just those switches, but also two cartridge slots? &lt;br /&gt;&lt;br /&gt;Two  cartridge slots? What would that mean? Well, perhaps it would finally give meaning to the "Game A &lt;--&gt; Game B" switch.  But what if you plugged in two cartridges and it combined them in some way? The rules of one game's character being applied to the other game's mechanics and levels. Or the colors from one applied to the backgrounds to the other? Or maybe they'd be played split screen, with player one playing game A, while player 2 plays game B. If there's no player 2, perhaps player 1 plays both games simultaneously, her controller input being fed into both games at once. &lt;br /&gt;&lt;br /&gt;Maybe instead of split screen, they are overlayed?&lt;br /&gt;&lt;br /&gt;Maybe the atari has more switches. Aside from game difficulty, you're also able to swap out things like graphics sets, or fine grained control like paddle size ( As you can configure in some modern pong games). &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It's a world that never existed, because it can't work in reality. But it can work in a painting or a sculpture. A whole parallel world of gaming, a pathway we never went down. What if we explore it now?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-8759080344463381811?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/8759080344463381811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=8759080344463381811' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8759080344463381811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8759080344463381811'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2008/03/atari-nostalgia.html' title='Atari Nostalgia'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-3480260334295868423</id><published>2008-03-15T01:55:00.003+11:00</published><updated>2008-03-15T02:13:55.309+11:00</updated><title type='text'>Funny obsessive ideas</title><content type='html'>Video game AI constructed from an adapting Stochastic Matrix. The matrix would encode N states- however many situations one wants the AI to be aware of, and M state transitions- The actions that the AI would take given that situation. A random state transition is chosen weighted according to the stochastic matrix probabilities. If the state transition results in success, then the weight for that transition's weight is incremented. If it results in failure, all other transitions are incremented instead. it may be possible to trace back a decision path several steps, and increment several of the transitions leading up to the success or failure.&lt;br /&gt;&lt;br /&gt;It may also be possible to do that by stating that several previous conditions constitute a single "state".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The player's behavior can be observed to produce a stochastic matrix as well, and AI behavior could be an average between the computer's own learning, and observing the player.&lt;br /&gt;&lt;br /&gt;I'd like a program that analyzes a body of text, and highlights words and letters depending on their relative probability. This would help spot errors in esoteric texts.&lt;br /&gt;&lt;br /&gt;I would also like to use stochastic matrices for compression of text. If a run of text conforms to the predictions of a stochastic matrix, then one can specify a character of text by the rank of its prediction. That is, if presented with the digraph Th, the matrix would predict "e" as the most likely letter to occur, and thus encode e as "1", a as the second most likely choice, would be encoded as "2" etc. I haven't tried it, but my hope is that this would produce encodings along the lines of "111111111211121113211111111211132111111311112" Not only can encodings like this be very efficiently run length encoded, but if the predictions stay below low powers of 2, each character needs significantly less than 8 bits to encode it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-3480260334295868423?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/3480260334295868423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=3480260334295868423' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/3480260334295868423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/3480260334295868423'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2008/03/funny-obsessive-ideas.html' title='Funny obsessive ideas'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-1806391167968775599</id><published>2008-02-24T09:16:00.003+11:00</published><updated>2008-02-24T09:30:14.766+11:00</updated><title type='text'>Another dream I had</title><content type='html'>It was another school regret dream, with a few massive Dalek invasions thrown in. (my my, the panicky crowds of people scrambling to get away!) But it had a couple decent ideas for paintings.&lt;br /&gt;&lt;br /&gt;Choose a book, paint a fictional landscape based on that book. But paint it flat first, just flat colors as the sketch.- Then paint it onto an image of a book, such that it appears like the landscape is extending out of the book- 3 dimensionally. Kind of like a pop up book. The process is to copy the flat sketch onto the book first- and then project the dimensional extension out of that.&lt;br /&gt;&lt;br /&gt;The other project was kind of strange- It had to do with fictional pop culture characters placed twice across a cloudscape. (Alphred E. Newman, The Simpsons) One pose is large enough to see facial expressions, the other small enough to see body pose. The challenge is to compose it all into a single painting. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm not quite sure what the educational purpose of either of these projects were meant to be, but for some reason I felt quite guilty about not being able to do them properly. We'll see about that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-1806391167968775599?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/1806391167968775599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=1806391167968775599' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1806391167968775599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1806391167968775599'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2008/02/another-dream-i-had.html' title='Another dream I had'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-591651309998376829</id><published>2007-12-20T22:18:00.000+11:00</published><updated>2007-12-20T22:28:59.369+11:00</updated><title type='text'>Bouncy Pixelly Creature</title><content type='html'>&lt;a href="http://www.ventrella.com/Alife/Bird/bird.html"&gt;This&lt;/a&gt; makes me happy.&lt;br /&gt;&lt;a href="http://www.pixeljoint.com/default.asp"&gt;Pixels&lt;/a&gt; make me happy.&lt;br /&gt;&lt;br /&gt;Thus, I wanna make a bouncy pixely creature person thing, made from good ol fashioned homegrown pixels, CSS sprites, and javascript. But the road would not be easy going. &lt;br /&gt;&lt;br /&gt;Step #1.&lt;br /&gt;&lt;br /&gt;Design, using pencils, the creature that I want to create&lt;br /&gt;&lt;br /&gt;Step #2. &lt;br /&gt;&lt;br /&gt;Break the thing down into seperate individual movable body parts, that can be animated&lt;br /&gt;&lt;br /&gt;Step #3.&lt;br /&gt;&lt;br /&gt;Model the parts in 3D and render from all angles that will be visible, 360 degrees around, above and below at some reasonable interval, (say, 8*8?)&lt;br /&gt;&lt;br /&gt;Step #4. &lt;br /&gt;&lt;br /&gt;Trace over the renders to give the parts some hand drawn pixelly juice.&lt;br /&gt;&lt;br /&gt;Step #5.&lt;br /&gt;&lt;br /&gt;create dom elements for each body part.&lt;br /&gt;create javascript routines to move a body part to any arbitrary on screen coordinate, and switch the frame to any arbitrary frame in its body party category.&lt;br /&gt;&lt;br /&gt;Step #6.&lt;br /&gt;&lt;br /&gt;Create springs for each limb&lt;br /&gt;&lt;br /&gt;Step #7.&lt;br /&gt;&lt;br /&gt;Figure out how ventrella did the upright stance for his creatures. Creatures need balance!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-591651309998376829?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/591651309998376829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=591651309998376829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/591651309998376829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/591651309998376829'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/12/bouncy-pixelly-creature.html' title='Bouncy Pixelly Creature'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-2738633459305509802</id><published>2007-12-04T10:46:00.000+11:00</published><updated>2007-12-04T11:16:16.551+11:00</updated><title type='text'>Helma's documentation is confusing. Here's what _parent really means.</title><content type='html'>helma's documentation has this to say about _parent&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;The _parent entry contains a comma-separated list of properties of objects of this type to be used as parent. Objects must know their parent in order to generate correct URLs in their href() function.&lt;br /&gt;&lt;br /&gt;_parent = property1, property2.collectionX, root.collectionY&lt;br /&gt;&lt;br /&gt;If an entry in the _parent item does not contain a dot, it is interpreted as an object property of the current object that acts as the object's parent. If an entry contains a dot character, the part after the dot is interpreted as a collection in the parent object in which the current object is contained. If the _parent is specified as "root", it is not interpreted as a property of the current object. Instead, the application's root object is used as parent object.&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Hrrrwhat?&lt;br /&gt;&lt;br /&gt;This is confusing, because _parent is a very specific and tacked on solution to a very specific problem with how helma is architected. &lt;br /&gt;&lt;br /&gt;Helma works by mapping a javascript object graph to a url space. Helma lets you map the same object or collection of objects to more than one part of the URL space. There frequently comes a situation where you'll want to generate a link on an html page to a specific object: Say you have a wiki page with a link, and an object representing the page it links to. You'd want to be able to generate the URL to that linked to page on the fly. &lt;br /&gt;&lt;br /&gt;Helma provides a function on each object: the &lt;code&gt;href&lt;/code&gt; function. This href automatically generates a URL which points at the object that it's called on. So for instance,  &lt;code&gt;root.wiki.pages[547].href()&lt;/code&gt; may return the url &lt;code&gt;/wikiprogram/wiki/pages/547/&lt;/code&gt;. The problem is that an object has no way of knowing which url you want, if it can be accessed by more than one url.&lt;br /&gt;&lt;br /&gt;The problem comes when that page 547 is also in another collection. Say, &lt;code&gt;root.wiki.history.pages[547]&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Which url should href return? &lt;code&gt;/wikiprogram/wiki/pages/547/&lt;/code&gt; or &lt;code&gt;/wikiprogram/wiki/history/pages/547/&lt;/code&gt; ?&lt;br /&gt;&lt;br /&gt;What helma does is pick whichever url that you access the object from *first*, after the application is started, and use that URL henceforth. That is, unless you specify _parent in type.properties.&lt;br /&gt;&lt;br /&gt;So, in the page prototype's type.properties file you can add&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;_parent = root.wiki&lt;br /&gt;&lt;br /&gt;and the &lt;code&gt;href&lt;/code&gt; function for that object will always return &lt;code&gt;/wikiprogram/wiki/pages/547/&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;if instead you specify&lt;br /&gt;&lt;br /&gt;_parent = root.wiki.history&lt;br /&gt;&lt;br /&gt;then the result will always be &lt;code&gt;/wikiprogram/wiki/history/pages/547/&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;Thus, _parent lets you choose the canonical URL for an object.&lt;br /&gt;&lt;br /&gt;The documentation quoted above appears to indicate that _parent can do more than this, but that is something that will have to wait for another post, since I have not yet deduced what that is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-2738633459305509802?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/2738633459305509802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=2738633459305509802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/2738633459305509802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/2738633459305509802'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/12/helmas-documentation-is-confusing-heres.html' title='Helma&apos;s documentation is confusing. Here&apos;s what _parent really means.'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-7653816506510064783</id><published>2007-11-11T08:08:00.001+11:00</published><updated>2007-11-11T10:30:42.083+11:00</updated><title type='text'>JSON, XML and the Relational Model part 3</title><content type='html'>Okay, let's talk XML. What is XML in terms of the set theory concepts from the last part.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Let's start with an element. An element in XML looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;element &lt;br /&gt;  attribute1="value" &lt;br /&gt;  attribute2="value" &lt;br /&gt;  attribute3="value"&amp;gt; &lt;br /&gt;  Content &lt;br /&gt;&amp;lt;/element&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Okay, so an element consists of a few parts. We have the element name "element". we have a set of attribute names  {attribute1, attribute2, attribute3}. The set of attribute names has all the properties of a set that I laid out in part 2. Each attribute forms one half of an ordered double. Finally we have content, which ultimately, is a tuple of nodes, with all the properties of a tuple discussed previously. &lt;br /&gt;&lt;br /&gt;A node can be an ordinary text string, a cdata section or another element. Thus, we come full circle, and demonstrate how xml nests.&lt;br /&gt;&lt;br /&gt;The key point here is that in XML you cannot nest in a set. To put another way, an attribute value cannot contain an element, or a tuple of elements. The only opportunity for nesting in XML is nesting a tuple of nodes in the content of an element.&lt;br /&gt;&lt;br /&gt;What this ultimately means for XML and JSON together, is that JSON ends up slightly more expressive than XML, since it places no such restriction on data structures. Any of the JSON elements (object, array, string, number, etc) can be placed in either an object value, or an array value. (Set and tuple)&lt;br /&gt;&lt;br /&gt;There are many approaches to conversion of XML to a JSON notation, or Javascript object. The following article on XML.com describes one approach:&lt;br /&gt;&lt;br /&gt;&lt;a href='http://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html'&gt;converting between xml and json&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One thing you may notice in that article, is that the approach taken is generally insensitive to whether an aspect of JSON or XML is a set or a tuple. The goal appears largely to be a conversion  that produces the most aesthetically pleasing example code. No attempt seems to be made at understanding either format, or their logical differences and similarities.&lt;br /&gt;&lt;br /&gt;In that mapping scheme, The attributes of an element become JSON object properties, and an @ is prefixed to the property names. This runs into no difficulty, since as I've covered, attribute names in XML are a set, just like property names in JSON. There is no mismatch here. Also, the names of that element's child elements become JSON object properties on that very same object. This will run into problems. In fact, the author of that article encounters the problem on page 2:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;An attempt to map a structured XML element...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;e&amp;gt;&lt;br /&gt;  &amp;lt;a&amp;gt;some&amp;lt;/a&amp;gt;&lt;br /&gt;  &amp;lt;b&amp;gt;textual&amp;lt;/b&amp;gt;&lt;br /&gt;  &amp;lt;a&amp;gt;content&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/e&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;...to the following JSON object:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;"e": {&lt;br /&gt;  "a": "some",&lt;br /&gt;  "b": "textual",&lt;br /&gt;  "a": "content"&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;yields an invalid result, since the name "a" is not unique in the associative array.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Indeed, it is not a valid conversion. The author is mapping an XML tuple, to a JSON set, but a set is not a tuple. Does the author then conclude that it is an invalid approach, scrap it, and try and think of something better?&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt; So we need to collect all elements of identical names in an array. Using the patterns 5 and 6 above yields the following result:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;"e": {&lt;br /&gt;  "a": [ "some", "content" ],&lt;br /&gt;  "b": "textual"&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now we have a structure that doesn't preserve element order. This may or may not be acceptable, depending on whether the above XML element order matters.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Oof. Nope. Instead, this approach scrambles the data even further, in an attempt to preserve those pretty code samples on the first page of the article. The author then goes on to conclude:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;This example demonstrates a conversion that does not preserve the original element order. Even if this may not change semantics here, we can do the following:&lt;br /&gt;&lt;br /&gt;   1. state that a conversion isn't sufficiently possible.&lt;br /&gt;   2. tolerate the result if order doesn't matter.&lt;br /&gt;   3. try to make our XML document more JSON-friendly.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The first conclusion is assuming that this arbitrary scheme the author has devised is the only *Possible* way to convert from XML to JSON. The second conclusion is assuming that there are situations in software design where you can get away with bad logical mistakes. And the third conclusion is strangest of all. He is concluding the problems with the conversion are not due to logical mistakes in the scheme, but are due, he believes, to JSON being inherently *less* expressive than XML. I hope that I have already demolished that conclusion at the start of this blog post.&lt;br /&gt;&lt;br /&gt;However, if you are still not convinced, stay tuned for my alternate conversion scheme in part 4.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-7653816506510064783?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/7653816506510064783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=7653816506510064783' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/7653816506510064783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/7653816506510064783'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/11/json-xml-and-relational-model-part-3.html' title='JSON, XML and the Relational Model part 3'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-2135080404535026360</id><published>2007-11-11T08:04:00.000+11:00</published><updated>2007-11-11T08:06:07.347+11:00</updated><title type='text'>Another dream I had</title><content type='html'>a 3d video game with a vast world, with many realms. Each realm has a race of people, who are either helped by, or under the tyranny of some flying demon. Each realm also has a "Flying Demon", whom you can ride, but only if you solve some riddle, or defeat them in battle, or solve some other puzzle.&lt;br /&gt;&lt;br /&gt;from that point forward you can summon a flying demon to ride. Each one will have some unique ability, such as speed, stamina, altitude, tight handling, transportation, transformation, and so on.&lt;br /&gt;&lt;br /&gt;There is an over arching goal, in that the entire world is under threat by a species of what may be called "Gaia parasites", who feed directly off the planet's life energy. As you travel the planet, the previous realms you encountered may become infected, and mutate the creatures there. The goal would be to revisit every realm, and find the solution to this global menace.&lt;br /&gt;&lt;br /&gt;why were you traveling in the first place? You are an alien, and you are trying to find the uberdemon that can travel between planets, so you can go home.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-2135080404535026360?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/2135080404535026360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=2135080404535026360' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/2135080404535026360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/2135080404535026360'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/11/another-dream-i-had.html' title='Another dream I had'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-7523839830047084365</id><published>2007-09-22T22:18:00.000+10:00</published><updated>2007-09-22T22:19:56.856+10:00</updated><title type='text'>The dream I had</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_nLJ3Pv7VVMU/RvUIVq69gpI/AAAAAAAAAAM/njFS7WKNxnU/s1600-h/dream.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_nLJ3Pv7VVMU/RvUIVq69gpI/AAAAAAAAAAM/njFS7WKNxnU/s320/dream.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5113002120340931218" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-7523839830047084365?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/7523839830047084365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=7523839830047084365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/7523839830047084365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/7523839830047084365'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/09/dream-i-had.html' title='The dream I had'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_nLJ3Pv7VVMU/RvUIVq69gpI/AAAAAAAAAAM/njFS7WKNxnU/s72-c/dream.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-7759494006359147185</id><published>2007-09-18T15:58:00.000+10:00</published><updated>2007-09-20T13:03:01.266+10:00</updated><title type='text'>JSON, XML and the Relational Model part 2</title><content type='html'>In math, there is something called set theory. &lt;br /&gt;&lt;br /&gt;In set theory, there is something called a set.&lt;br /&gt;&lt;br /&gt;A set is simply a list of items with two rules. One of the rules is that order is not significant:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{1,3,2,4} is the same set as {3,4,2,1}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The other rule is that repeats are not significant:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{1,1,2,3,4,3} is the same set as {1,2,3,4}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A set can contain more than just numbers. It can contain anything, such as words:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{Julie, Bob, George, Ringo}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;and even other sets:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{{5,3,1},{7,9,2},{3,2,1}}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In set theory, there's another concept called a tuple. A tuple is basically the same as a set, except that the two rules above do not apply. For a tuple, order &lt;em&gt;does&lt;/em&gt; matter, and you &lt;em&gt;can&lt;/em&gt; have repeats. &lt;br /&gt;&lt;br /&gt;These two concepts: sets, and tuples, are the basic building blocks for the three popular data formats listed in the title of this series (And many more). There are plenty of other useful concepts in math for data structures. However, computer languages seem to stick mostly to these two for structured data.&lt;br /&gt;&lt;br /&gt;Since JSON is essentially a javascript object, it follows javascript's rules. Here's an example of JSON:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{ &lt;br /&gt;  example:"Object", &lt;br /&gt;  name:"bob", &lt;br /&gt;  array:["George","Ringo","Paul"]&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you can see, this is basically a set, with the members &lt;pre&gt;example:"Object"&lt;/pre&gt;, &lt;pre&gt;name:"bob"&lt;/pre&gt; and &lt;pre&gt;array:["George","Ringo","Paul"]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;each of these members is a double: a tuple with two members. For instance, the first member is the tuple &lt;pre&gt;{example, "Object"}&lt;/pre&gt;. The array tuple, &lt;pre&gt;(array:["George","Ringo","Paul"])&lt;/pre&gt; is also a tuple with two members. &lt;pre&gt;{array, ["George","Ringo","Paul"]}&lt;/pre&gt;. The second member of this tuple, is also a tuple. &lt;pre&gt;{array, {"George", "Ringo", "Paul"}}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So we can see that JSON is composed rather simply of nested sets, tuples, and values. Tuples can contain other tuples, tuples can contain sets, sets can contain tuples, and sets can contain sets.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-7759494006359147185?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/7759494006359147185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=7759494006359147185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/7759494006359147185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/7759494006359147185'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/09/json-xml-and-relational-model-part-2.html' title='JSON, XML and the Relational Model part 2'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-1720834059558117486</id><published>2007-09-17T23:45:00.000+10:00</published><updated>2007-09-18T00:17:34.682+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON xml relational databases model programming design computers'/><title type='text'>JSON, XML and the relational model Part 1</title><content type='html'>When we think about computer data, it's often in the form of trees. You see it in the folder structure on your computer's hard drive, in the html document in your browser, and even in the way we classify species.&lt;br /&gt;&lt;br /&gt;The tricky part is, what do you do when your data doesn't fit into a tree?&lt;br /&gt;&lt;br /&gt;You have a folder of photos from that trip to Costa Rica, and you use one of them in a design project. Do you leave the photo in the Costa Rica folder, or do you move it to the Images subfolder in your project folder? Or do you keep a copy in both? Does it bother you that your computer is storing the same data, in two places, redundantly, simply because it can't comprehend the idea that a resource could be relevent in two places?&lt;br /&gt;&lt;br /&gt;The relational model solves that problem, but at a certain mental cost. It is not particularly expensive, it is just a mental mode that people in western society are not used to using- It is a verb oriented model, rather than a noun oriented model. We are used to nouns. Things just are this way, that way, the grass is green, the house is brick, the cheetah is a cat, the platypus is a trieme. &lt;br /&gt;&lt;br /&gt;okay so what's the relational model about? Most technical people will tell you it's about tables, but that's rubbish. Ignore them. The idea behind the relational model is that instead of organizing data based on what it *is* or *has* or *belongs to* by arranging it in a heirarchy, you instead describe how it is related to other things. So that photo was *Used* in project b, and *taken* in costa rica. Costa Rica was *photographed* by Dayne, Dayne *created* these photos. These relationships create links between your bits of data, big and small, like photos, or documents, or names, or places.&lt;br /&gt;&lt;br /&gt;so how does navigation work? when you want to find all the photos from costa rica type in&lt;br /&gt;get place:"costa rica", photo&lt;br /&gt;&lt;br /&gt;if you don't like typing, such queries can easily be created point and click style, with the data that's already in there.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;get   -&gt;    place   -&gt; costa rica -&gt; photo&lt;br /&gt;put         person     thailand      person&lt;br /&gt;edit        thing      denver        place&lt;br /&gt;create      design     arizona       thing&lt;br /&gt;            photo      melbourne&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then the system works out automatically what "costa rica" and "photos" have in common.&lt;br /&gt;&lt;br /&gt;I really like the relational model, and I really hate categories. Yeay verbs, boo nouns. Yeay relationships, boo heirarchies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-1720834059558117486?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/1720834059558117486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=1720834059558117486' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1720834059558117486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1720834059558117486'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/09/json-xml-and-relational-model-part-1.html' title='JSON, XML and the relational model Part 1'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-8239935623916056847</id><published>2007-09-14T23:44:00.000+10:00</published><updated>2007-09-15T00:02:30.550+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST rails urls opacity'/><title type='text'>How I revived the semicolon</title><content type='html'>I was searching my own name in google, (as I often obsessively do), to see what the e-world thinks of me. Just as a lark, I searched a common misspelling, and found someone on del.icio.us that linked to a post I made to a mailing list. This was the post, and reasoning that influenced David Heinemier Hannson, to use semicolons in the urls of his popular Ruby on Rails framework. Since David is one of what they call "The Alpha Nerds" on the interwebs, this is kind of like the uber nerd version of someone like Bruce Lee deciding that aviator hats are a really cool idea, after having a deep philisophical conversation with me. And  then all the other martial arts experts proceed to comment "Bruce Lee is pretty cool, but what the fuck is with the aviator hat?"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;so that I may bask in my own glory and personal brillliance, I give you, the people who haven't given up reading in frustration, the post that will ensure the semicolon's place in your browser bars for years to come:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It would seem that my discovery of a rarely used aspect of the HTTP  &lt;br /&gt;url scheme, namely the semicolon ; has led to perhaps a level of  &lt;br /&gt;unjustified excitement and advocacy. Intent is very difficult to  &lt;br /&gt;gleam from carefully reading a spec, despite, or perhaps because of  &lt;br /&gt;the high standards specs are held to for preciseness and lack of  &lt;br /&gt;ambiguity, which encourage a sort of unnatural writing style which in  &lt;br /&gt;all honesty is hard to read and easy to misinterpret. That aside, I  &lt;br /&gt;have a question after reading a set of documents by Tim Berners-Lee,  &lt;br /&gt;which are more geared toward the intentional side of things rather  &lt;br /&gt;than the specification side of things, which you will find here: &lt;  &lt;br /&gt;http://www.w3.org/DesignIssues/Axioms.html &gt;&lt;br /&gt;&lt;br /&gt;Regarding the issues I'm concerned with, this is my interpretation of  &lt;br /&gt;the document, and you can tell me whether it's incorrect or not:&lt;br /&gt;&lt;br /&gt;*For REST, it is mostly important that GET have no side effects, and  &lt;br /&gt;anything which does have side effects be implemented with POST (or  &lt;br /&gt;mail).&lt;br /&gt;&lt;br /&gt;*forward slashes, as mapped to unix heirarchical structures are used  &lt;br /&gt;merely as a matter of convenience, and due to the principals of  &lt;br /&gt;opacity, are not neccesarily significant to the resolution of a URI,   &lt;br /&gt;except regarding the resolution of relative URI's in which case, such  &lt;br /&gt;interpretation should be defined per URI scheme, with client support.  &lt;br /&gt;Forward slashes do not indicate a resource, but the entire URI  &lt;br /&gt;indicates the resource, and it's entirely up to the server how to  &lt;br /&gt;find that resource based on the URL. No procedure for internal URI  &lt;br /&gt;resolution is explicitly defined.&lt;br /&gt;&lt;br /&gt;*That http defines such a scheme for resolving relative URI's for /  &lt;br /&gt;style urls, but not yet for semicolons as indicators of parameters  &lt;br /&gt;(though TBL provides such a scheme as a possibility for implementation)&lt;br /&gt;&lt;br /&gt;*Therefore, virtually any symbol, including but not limited to  &lt;br /&gt;forward slashes and semicolons can be used for the purposes of  &lt;br /&gt;mapping to arbitrary data topologies, at the discretion of the URI  &lt;br /&gt;scheme designer, which can be interpreted and resolved by the server  &lt;br /&gt;in whatever way is appropriate. In addition, a great deal of this  &lt;br /&gt;flexibility is left in the http scheme to be used at the discretion  &lt;br /&gt;of server programmers. As long as opacity is observed, and URI's  &lt;br /&gt;remain idempotent nouns.&lt;br /&gt;&lt;br /&gt;*To this add the additional constraint given by roy fielding that  &lt;br /&gt;this can only be done as long as the nature of the URI scheme is  &lt;br /&gt;clearly communicated by the server to the client. In other words,  &lt;br /&gt;there is no assumption made that the client will be able to infer a  &lt;br /&gt;URI scheme from a base URI without explicit communication that such a  &lt;br /&gt;URI scheme is in use.&lt;br /&gt;&lt;br /&gt;*Notable exception is the # fragment identifier which is reserved for  &lt;br /&gt;use by clients, and to be defined when registering the mime type for  &lt;br /&gt;a document.&lt;br /&gt;&lt;br /&gt;*TBL then demonstrates the flexibility of URI's by laying out his  &lt;br /&gt;Matrix URI scheme, that is using the ; and = symbols to specify a  &lt;br /&gt;matrix information space, which is distinctly incompatible with a  &lt;br /&gt;heirarchical space. This does not imply that ; has any inherent  &lt;br /&gt;meaning relative to the REST or uri model, but as a scheme designer,  &lt;br /&gt;TBL is using it to represent a type of information topology being  &lt;br /&gt;made available by a server.&lt;br /&gt;&lt;br /&gt;If one is to take all the above statements as true and accurate  &lt;br /&gt;interpretations of REST, then solutions to certain problems become  &lt;br /&gt;available, which are not possible, or are awkward under a naive  &lt;br /&gt;surface impression that REST requires URLS to contain only forward  &lt;br /&gt;slashes / to represent information topologies. It is beginning to  &lt;br /&gt;look to me that this impression has more to do with Aesthetics, and  &lt;br /&gt;search engine technologies, than any specific requirements of REST.&lt;br /&gt;&lt;br /&gt;A problem this interpretation potentially solves, for instance, is  &lt;br /&gt;that of multiple views of the same information resource. Usually,  &lt;br /&gt;this would be accomplished through content negotiation. However this  &lt;br /&gt;is only effective if your multiple views all have distinct mime  &lt;br /&gt;types. If you have for example, a resource such as &lt; http:// &lt;br /&gt;example.com/blog/posts/53 &gt; representing an article on a blog, you  &lt;br /&gt;may have a non editable view, and an editable view.&lt;br /&gt;&lt;br /&gt;In an ideal world this sort of thing could be specified using a  &lt;br /&gt;fragment identifier,  such as &lt; http://example.com/blog/posts/53#edit  &lt;br /&gt; &gt;, however for this to work on a practical level, it requires client  &lt;br /&gt;support which is not likely, and somewhat incompatible with the  &lt;br /&gt;fragment identifier scheme defined for html/xml&lt;br /&gt;&lt;br /&gt;Another option is to use the forward slash  &lt; http://example.com/blog/ &lt;br /&gt;posts/53/edit &gt;&lt;br /&gt;However it seems logically innacurate to state that a view is a  &lt;br /&gt;hierarchical child of the resource, rather than something more  &lt;br /&gt;lateral, or directly related.&lt;br /&gt;&lt;br /&gt;If the bullet points above are accurate, then it becomes possible and  &lt;br /&gt;reasonable to use a semi colon, or any other appropriate symbol to  &lt;br /&gt;represent a lateral space, such as a view. Matrix notation seems  &lt;br /&gt;appropriate, since such a view system can be seen as a "matrix" (or  &lt;br /&gt;tensor) with 1 axis, and english words representing named points  &lt;br /&gt;along that axis.&lt;br /&gt;&lt; http://example.com/blog/posts/53;view=edit &gt; &lt; http://example.com/ &lt;br /&gt;blog/posts/53;view=display&gt; &lt; http://example.com/blog/posts/ &lt;br /&gt;53;view=hatom&gt;. This makes sense to me as viewing a slice or  &lt;br /&gt;subsection of a single resource, which includes multiple possible views.&lt;br /&gt;&lt;br /&gt;The caveats being how relative URL's are resolved by clients, whether  &lt;br /&gt;the server supports this level of flexibility, and whether  &lt;br /&gt;appropriate mechanisms are employed for informing the client of the  &lt;br /&gt;URI scheme in use (such as hrefs along all points on a matrix  &lt;br /&gt;allowing navigation)&lt;br /&gt;&lt;br /&gt;This may be overintellectualizing a simple problem, but the main  &lt;br /&gt;purpose of this post is to verify if I have my bulleted  &lt;br /&gt;interpretations correct, otherwise my conclusion may be false.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-8239935623916056847?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/8239935623916056847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=8239935623916056847' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8239935623916056847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8239935623916056847'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/09/how-i-revived-semicolon.html' title='How I revived the semicolon'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-1338059231119057478</id><published>2007-06-13T16:35:00.000+10:00</published><updated>2007-06-13T16:42:49.001+10:00</updated><title type='text'>Online color schemer.</title><content type='html'>Okay, there's hundreds already, but they all miss the point a bit. A color has three perceptual attributes, Hue, Lightness, and Brightness, (Or HSV, HSL, etc etc) &lt;br /&gt;&lt;br /&gt;The majority of the online color schemers only harmonize ONE attribute, Hue, while either ignoring the other two, or leaving it at the whim of the user.&lt;br /&gt;&lt;br /&gt;Another thing online schemers ignore is the PROPORTION of color to be used. A color scheme that works for 3 equally distributed colors, is different from one that works with one predominant color, or two predominant colors. The way an accent color works is decidedly different from the way a body color works, and color schemers ignore this as well.&lt;br /&gt;&lt;br /&gt;Most color schemers ask for one color, and harmonize the rest based on that. Well what if I have two colors! A client has two colors that must be used, how do I harmonize off of that if I can only input one color?&lt;br /&gt;&lt;br /&gt;Okay so I could just ignore the color schemer programs, and do the whole thing by eye, right? That kind of defeats the purpose of these programs existance does it not? Why make them or have them, if in the end they are completely useless?&lt;br /&gt;&lt;br /&gt;Todays idea is, a color schemer that isn't a sack of shit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-1338059231119057478?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/1338059231119057478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=1338059231119057478' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1338059231119057478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1338059231119057478'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/06/online-color-schemer.html' title='Online color schemer.'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-5473352599327445414</id><published>2007-06-01T09:34:00.000+10:00</published><updated>2007-06-01T09:48:28.021+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>What is Design?</title><content type='html'>This is one of those ideas that is not just a "cool idea", or something that I just have a random kink or obsession about. This project would be genuinely useful to me. Enough that I have seen other designers do exactly the same project, design organizations, such as AIGA, and others.&lt;br /&gt;&lt;br /&gt;The problem essentially is that most people really don't understand what graphic design, or design in general is, or what its value is. It also happens to be these very people who would benefit most from design.&lt;br /&gt;&lt;br /&gt;What I need, as a designer, is a booklet, a manual, or something that is easy to read, well designed, and not only explains why design is a valuable thing, but demonstrates it in a clear and obvious way. &lt;br /&gt;&lt;br /&gt;It perhaps shouldn't go into too much detail about how to design something, but through popular examples.&lt;br /&gt;&lt;br /&gt;For instance, the most obvious example is the iPod. Now, hindsight is 20/20 of course, but according to the logic of those who don't understand design, the iPod should have been a failure. The iPod wasn't the first mp3 player. It wasn't even the first hard drive based mp3 player. It was more expensive than other music players when it was first released, and still is. In terms of hardware, it doesn't have as much capacity as other players, and didn't when it first came out. It doesn't play as many formats as some. The iPod was even the last digital player to play videos. About the only obvious advantage it's had is that it's slightly smaller than the others. If you look at it in these terms, it's a complete mystery why the iPod has been such a success.&lt;br /&gt;&lt;br /&gt;There are other examples too. The branding for chipotle, the architecture of their restaurants. Starbucks, flckr, and others. With no obvious advantage over competitors in a purely statistical standpoint, it's clearly the superior design which gives these companies the win. &lt;br /&gt;&lt;br /&gt;There are smaller scale examples too. The clarity of communication in a sparse design which makes good use of negative space, vs. a crowded design which sees empty space as wasted space. The direct financial benefit that comes from designing an ecommerce site to channel viewers into becoming buyers- Design has a direct and real relationship with conversion rates in this arena.  &lt;br /&gt;&lt;br /&gt;Design is important, and it's not always easy to explain why verbally. A handout for potential clients would be invaluable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-5473352599327445414?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/5473352599327445414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=5473352599327445414' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/5473352599327445414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/5473352599327445414'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/06/what-is-design.html' title='What is Design?'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-8842478855083975389</id><published>2007-05-15T14:35:00.000+10:00</published><updated>2007-05-15T14:43:56.276+10:00</updated><title type='text'>City Paintings</title><content type='html'>Series of paintings,  8x2', divided into 16 1x1 quandrants. Huge project, one of those ridiculously complex ideas.&lt;br /&gt;&lt;br /&gt;Essentially each painting would depict a street in the &lt;a href="http://maps.google.com/maps?f=q&amp;hl=en&amp;q=Melbourne&amp;ie=UTF8&amp;t=h&amp;om=0&amp;ll=-37.815039,144.962411&amp;spn=0.013832,0.025706&amp;z=15&amp;iwloc=addr"&gt;Melbourne CBD.&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So, one painting would be "Flinders Street", another would be "Collins Street", another would be "Bourke Street". Each street is exactly 8 blocks long, so each block would map to a 1 foot long section in the painting.&lt;br /&gt;&lt;br /&gt;The painting would depict a street level view, with the street running horizontally down the middle of the painting, the north side of the street sitting rightside up vertically on the upper half, and the south side of the street upside down on the lower half.&lt;br /&gt;&lt;br /&gt;It would have a very flattened perspective.&lt;br /&gt;&lt;br /&gt;Once I finish all the CBD streets, I may then tackle gertrude street and smith street. Who knows, Maybe Colfax is next.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-8842478855083975389?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/8842478855083975389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=8842478855083975389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8842478855083975389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8842478855083975389'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/05/city-paintings.html' title='City Paintings'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-5949773444999313175</id><published>2007-05-03T19:38:00.000+10:00</published><updated>2007-05-03T19:41:27.184+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='creativity'/><category scheme='http://www.blogger.com/atom/ns#' term='video games'/><title type='text'>Wanna make your own videogame?</title><content type='html'>&lt;a href="http://www.kuro5hin.org/story/2005/7/28/235328/642"&gt;The 6 Indie Mistakes&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;this article really sums it up. Have an idea, and want to see it become real? Prepare to work really hard for it. The bigger the idea, the harder you must work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-5949773444999313175?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/5949773444999313175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=5949773444999313175' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/5949773444999313175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/5949773444999313175'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/05/6-indie-mistakes.html' title='Wanna make your own videogame?'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-243110794246527707</id><published>2007-05-01T20:11:00.000+10:00</published><updated>2007-05-01T20:25:03.584+10:00</updated><title type='text'>Particle Mosiacs</title><content type='html'>Take 1 photo. Add a particle simulation. Add a particle to the simulation. Watch as this single particle floats around the screen. It is attracted to bright areas. It looks at its immediate surroundings, and locates the direction in which it will find the brightest pixels, and it goes in that direction. As it does so, it gobbles up the light, and adopts its color. As it gobbles up the light, it grows in size, until it settles into a position in which it cannot move to an area which is any brighter than the one it's already found.&lt;br /&gt;&lt;br /&gt;Add another particle. It behaves much the same as the last particle, except that it cannot occupy the same space as the previous particle. It is repelled by its presence.&lt;br /&gt;&lt;br /&gt;Add another, which behaves as the previous particles, but is repelled by them.&lt;br /&gt;&lt;br /&gt;Keep adding particles until the entire canvas is covered in these hungry particles that cluster around the brightest areas, and are nourished by them. The largest particles will be covering the brightest areas, while smaller, malnourished dark particles will have been sequestered to the dark corners of the image.&lt;br /&gt;&lt;br /&gt;Once this ecosystem has been saturated, the boundaries of each circular particle can become loose, like jelly. each boundary becomes a new particle simulation, each circlular boundary subdivided into smaller interconnected particles. The interconnected particles are attracted to eachother, and in isolation, pull together, like the skin of a bubble. Their resting state is the size of the original particle, at this resting state, the particles are repelled at exactly the correct distance for this resting size to occur.&lt;br /&gt;&lt;br /&gt;At the same time, all the particles across the entire canvas are attracted to eachother- or more specifically, they are attracted to the particles nearest to them.&lt;br /&gt;&lt;br /&gt;While the compulsion is for the boundaries to remain circular, there is a stronger compulsion to spread out, and meet with the surrounding boundaries, and form a more complex shape. The forces at work across the canvass will eventually come to a balancing point, where no more movement will occurr. This resting state will be composed of a number of well fitted shapes, colored appropriately, and sized according to brightness. They will be well enmeshed together, and form a faceted image which maintains organic and geometric qualities at once.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-243110794246527707?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/243110794246527707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=243110794246527707' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/243110794246527707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/243110794246527707'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/05/particle-mosiacs.html' title='Particle Mosiacs'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-8036306472369511159</id><published>2007-05-01T19:58:00.000+10:00</published><updated>2007-05-01T20:10:58.449+10:00</updated><title type='text'>Lighting in context</title><content type='html'>There is a computational photography technique in which a subject is placed within a sphere/dome of lights. The subject is then photographed with each light illuminated one at a time, resulting in a number of photographs equal to the number of lights. These photographs can then be composited together and modified in such a way as to simulate any possible lighting condition. This is achieved by taking a "lightprobe" of an environment and mapping it to the spherical dome of lights- such that each light matches the color and intensity of that corresponding space in the light probe. Or more directly, each photograph which corresponds to a particular light in the light dome is modified to appear as though that particular light had the color and intensity of that cooresponding space. This modification and mapping is done with each photo in the set, and they are all summed together into a single "Exposure", and you end up with virtual lighting.&lt;br /&gt;&lt;br /&gt;Isn't it an interesting situation then, if you take this virtual lighting concept, and you combine it with the fact that modern macintoshes are equipped with a camera which is easily accessed from software, and facilities for taking screenshots of the current scene on the screen of the computer.  These two could be combined into a sort of "light probe", such that a photographed object could appear on screen and look as though it were lit at the back by the other objects on screen, and lit at the front by the room surrounding the computer.&lt;br /&gt;&lt;br /&gt;This illusion could be perfected by a measurement of the brightness of a typical computer screen, combined with exposure information from the iSight. These would be fairly standard across the models of macintosh equipped with built in isights.&lt;br /&gt;&lt;br /&gt;Thus a dynamically lit widget could be produced, quite probably with the help of quartz compositor's easy access to isight, and easy integration into widgets.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-8036306472369511159?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/8036306472369511159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=8036306472369511159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8036306472369511159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8036306472369511159'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/05/lighting-in-context.html' title='Lighting in context'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-3542311273898544453</id><published>2007-04-15T14:56:00.000+10:00</published><updated>2007-04-16T16:18:35.813+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='art'/><category scheme='http://www.blogger.com/atom/ns#' term='creativity'/><category scheme='http://www.blogger.com/atom/ns#' term='knowledge'/><category scheme='http://www.blogger.com/atom/ns#' term='assumptions'/><category scheme='http://www.blogger.com/atom/ns#' term='research'/><category scheme='http://www.blogger.com/atom/ns#' term='ethnocentrism'/><category scheme='http://www.blogger.com/atom/ns#' term='concept'/><category scheme='http://www.blogger.com/atom/ns#' term='totems'/><title type='text'>On bad artistic assumptions</title><content type='html'>In creativity, I cannot stress enough the importance of research. This is not an idle bit of advice. In teaching or learning, there are many such rules and practices, which are taught and given without argument, expected to be accepted. As a student you may accept unquestioningly what you are taught, at least for the purposes of the course and the grade. Without the reasoning to back it up though, such lessons do not become knowledge, but instead become religion. Knowledge is something that you can demonstrate, and if prompted, give a convincing argument why such and such is so. Religion is merely a set of rules that you follow, without knowing why. They are in other words, a set of assumptions. &lt;br /&gt;&lt;br /&gt;This is all very abstract without an example, so I will demonstrate now why research is important, and why a creative should not take it for granted.&lt;br /&gt;&lt;br /&gt;Some time ago, I made a Totem painting. The basic idea I had was to paint on a 2' by 8' masonite board, a Totem Pole composed of a number of various mass cultural characters, such as the cat in the hat, kermit the frog, mickey mouse, etc. Collaged with this was images of various scenes I picked out of searching through various japanese websites and books; imagery from japanese culture; modern and traditional. While the painting was generally well recieved, it wasn't a *great* painting, and this was not due to the quality of paint I used (admittedly poor), or how much time I spent making crisp lines (not a lot). &lt;br /&gt;&lt;br /&gt;The reason it wasn't a great painting is due to the rushed assumptions I made in the conceptual phase. The worst assumption, was the ethnocentric viewpoint that totem pole design is simple, and primative, and thus easy to imitate. The really stupid assumption that totem poles were merely stacks of heads, and yet another bad assumption that it's possible to encapsulate the subtleties of an entire culture by merely selecting a few images. &lt;br /&gt;&lt;br /&gt;The truth is, totem pole design is as nuanced and delicate an art as font design, or classical architecture. There is a balance of line, volume, and flow which is not easily mastered. Additionally, totem poles are not merely heads- they are entire bodies, deformed yes, so that the head is the most prominant feature. But the body is still there nonetheless. There is cultural context in these deformations which again is not easily mastered. This sense of cultural context is also missing in my rushed and crass choice of japanese imagery. These assumptions, spelled out, seem obviously stupid. But these sorts of assumptions are not easy to notice, especially when you are rushed. They are not easily noticed because one does not typically think about what assumptions one holds, until they are prompted in such a critical way.&lt;br /&gt;&lt;br /&gt;The most difficult thing about learning, is being flexible enough to recognize where you are making assumptions, and maintaining the will to discard these assumptions when it becomes necessary. This is something a teacher cannot do for you. This is why research is important: It shows you what reality IS, not what you expect it to be. &lt;br /&gt;&lt;br /&gt;Research research.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-3542311273898544453?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/3542311273898544453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=3542311273898544453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/3542311273898544453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/3542311273898544453'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/04/on-bad-artistic-assumptions.html' title='On bad artistic assumptions'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-3373453574485917722</id><published>2007-04-10T21:55:00.000+10:00</published><updated>2007-04-16T16:20:22.161+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='typing'/><category scheme='http://www.blogger.com/atom/ns#' term='statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile phones'/><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='gameboy'/><category scheme='http://www.blogger.com/atom/ns#' term='markov chain'/><title type='text'>Efficient typing system</title><content type='html'>skeleton post- fill in details tomorrow.&lt;br /&gt;&lt;br /&gt;1. tedius repetition in task of typing on a mobile phone or gaming device.&lt;br /&gt;&lt;br /&gt;2. Computers designed to eliminate repetition&lt;br /&gt;&lt;br /&gt;3. Statististical prediction&lt;br /&gt;&lt;br /&gt;4. Automatic adaptation&lt;br /&gt;&lt;br /&gt;5. Other applications&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-3373453574485917722?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/3373453574485917722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=3373453574485917722' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/3373453574485917722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/3373453574485917722'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/04/efficient-typing-system.html' title='Efficient typing system'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-7258555222171911229</id><published>2007-04-10T21:51:00.000+10:00</published><updated>2007-04-16T16:21:11.208+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='theory'/><category scheme='http://www.blogger.com/atom/ns#' term='linguistics'/><category scheme='http://www.blogger.com/atom/ns#' term='apl'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='brackets'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Programming Language</title><content type='html'>1. Why create a new programming language?&lt;br /&gt;I have an idea for a programming language. There are hundreds already though, why create a new one? I firmly believe that the bulk of programming languages are missing the point. They don't lack effort or thought, many are theoretically sound, many aren't. Some of my favorites are Lisp, Ruby and APL.&lt;br /&gt;&lt;br /&gt; What's lacking in the world of programming languages though, is the perspective of a designer, because frankly, every programming language I see is ugly. Every programming language I have seen, to one extent or another flagrantly disregards the history and culture of punctuation and symbology. They abuse symbols, assigning them meaning they were never meant to have. These programming languages force their readers to cross their eyes, and ignore their years of cultural training to follow the specific and unique logic which applies only to the world of programming. The relatively high density of brackets, and nesting lead to a visual ambiguity which requires an expert, and a good code formatter to decipher. Code should not be code.&lt;br /&gt;&lt;br /&gt;And why should code be beautiful, you may ask? The end users don't have to look at it, and the programmers should be clever enough to deal with any sort of cryptic obfuscation, and difficult to type out structure. They are professionals after all! Sure, but the key point is, they are also human. Difficult to read, and hard on the eyes code leads to more mistakes, more fatigue, and over all a more grueling experience. Your average person can usually look at a gramatically incorrect sentence, and immediately sense that something is wrong. Your average programmer doesn't necessarily have this ability with a line of code. Due to the haphazard and thoughtless design of programming languages, you still have to read through word for word, symbol for symbol to figure out why something doesn't work, why something is illogical. &lt;br /&gt;&lt;br /&gt;I think there's a better way. I think there is room for a humanistic programming language. I think it's time for one too. There is currently no technical reason it is not possible. The *only* reason we still code using these brutal machine languages, is due to the short history of computers, and their original strict limitations. These limitations no longer exist, but the assumptions that we built from those limitations still do. Let's work to improve this.&lt;br /&gt;&lt;br /&gt;2. Design goals&lt;br /&gt;&lt;br /&gt;It's easy to lose sight of your goal, in the midst of the process of creation. See my earlier post about creative briefs. Ruby on Rails has a number of design principles. there's Don't Repeat Yourself, and the principle of least surprise, for a couple of examples. A humanistic programming language should have some basic guidelines to enforce a certain amount of self consistancy. &lt;br /&gt;&lt;br /&gt;Here is the space where I will keep my working list of HPL ideals.&lt;br /&gt;   &lt;dl&gt;&lt;br /&gt;&lt;dt&gt;Respect the punctuation&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Don't violate the history, culture and meaning of symbols. We are no longer limited to just what's at the top of the keyboard, above the numbers. Nowadays, we have the entire Unicode symbol library at our command. Let's find appropriate symbols, and use them for their appropriate meanings.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Whitespace is not irrelevant&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Having a standard indentation style has proven invaluable to the open source projects that have enforced it. Having a common visual expectation for the code makes collaboration that much easier. Let's not rely on humans to enforce the visual style. We have computers for droning repetetive tasks like that.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Dielects over Bloat&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;In the real world, different professions each have their own specific languages. Think about the show ER, and the sheer amount of latin they use just to get around having to tediously describe in detail every little thing. Verbal shortcuts. The same should apply to programming. If I'm making a web application, don't make me tediously describe the process of retrieving information from a form, or persisting data in a database. We know in advance we need to do these similar tasks many times. Provide shortcuts for doing them.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Loops are a bad solution to an old problem&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;The typical tasks which need to be performed by loops is well understood by now. Some task needs to be performed on a list of things, a tree needs to be traversed to find a needle in a haystack, etc. Make syntax for the task, not the computer's method of performing it.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Syntax for the task, not the method&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;nuf said&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Brackets are bad, nested brackets are worse&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Brackets are actually visually useful, as long as the opening and closing bracket are on the same line, and there are no other brackets nesting in or around them. Once you break them out into multiple lines, nest them, and worst of all, have a line with nothing but a bracket, things start getting confusing and visually ugly. A closing bracket visually points to the left. If it's on its own, it is pointing at nothing. It is closing and resolving nothing. Combine it with nesting, and reading a page of code becomes a game of matching opening brackets to closing brackets. How can you debug your code, if you have no idea what is going on in it, and it is not visually obvious that you have made a typo? XML endevoured to solve the matching problem. How? More brackets! MANY MORE BRACKETS. Great. I think we can do better.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. Parallelism&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. Relational integrity&lt;br /&gt;&lt;br /&gt;5. MVC enforcement&lt;br /&gt;&lt;br /&gt;6. Event Model&lt;br /&gt;&lt;br /&gt;7. REST architecture provides a means for sharing work, without working to share.&lt;br /&gt;&lt;br /&gt;8. Internet provides a means for automatic distributed super computing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-7258555222171911229?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/7258555222171911229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=7258555222171911229' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/7258555222171911229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/7258555222171911229'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/04/programming-language.html' title='Programming Language'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-6710890557700591809</id><published>2007-04-08T21:54:00.000+10:00</published><updated>2007-04-16T16:22:24.854+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='art'/><category scheme='http://www.blogger.com/atom/ns#' term='creativity'/><category scheme='http://www.blogger.com/atom/ns#' term='vision'/><category scheme='http://www.blogger.com/atom/ns#' term='ideas'/><category scheme='http://www.blogger.com/atom/ns#' term='concept'/><category scheme='http://www.blogger.com/atom/ns#' term='creative brief'/><title type='text'>The value of the creative brief</title><content type='html'>During the development of an idea, it's easy to lose sight of your original vision. You begin to see new things in your work, and it carries you in new directions. Often during this process you end up with something very different from that which you originally intended to create. During the process, you forget the problem that you set out to solve, and judge your work purely on its aesthetics, or the feeling of the moment.&lt;br /&gt;&lt;br /&gt;The creative brief is the solution and recognition of this situation.&lt;br /&gt;&lt;br /&gt;A creative brief is a written, detailed description of the design problem to be tackled. It is not simply a statement of the problem (a brochure needs to be created), but also gives you relevant facts about the client, their target market, the market goals they wish to achieve, their history as a company, the intended message which needs to be conveyed, and any other relevant information. A good creative breif gets beyond the simple question of "What do you want", and instead sets in a number of parameters which define a "space", what is often referred to as the "Problem Space".  Within this defined space exists viable solutions, and beyond it lay non solutions. In theory. A really good design process will recognize when a creative breif is inadequate, and midway through redefine the problem, perhaps in different words, perhaps from a different perspective. For instance, a creative brief might stipulate that the client needs a business card for her florist business. A designer, after some meetings with the client, might redefine the problem as "The client wishes to attract more business from engaged couples, and stay within a budget of under $4000"&lt;br /&gt;&lt;br /&gt;The key here, is the more detailed you get, the more you crystalize a vision of what the problem *really* is, the more productive the design process becomes.&lt;br /&gt;&lt;br /&gt;Through each revision, and at the end of the process, ask yourself: "Does this *really* solve the problem?". be thoughtful and honest to yourself (or others) in giving the answer. If you answer no, ask yourself why, and you will understand what revisions need to be done. If you answer yes, be careful that you are not deceiving yourself. There is no such thing as a perfect solution- But within a problem space there are many possible solutions. Is this the best one?&lt;br /&gt;&lt;br /&gt;This may seem stupidly obvious, but in this complex mesh of theories and processes that is the design process, it is easy to lose sight of what is obvious, and get lost in the details of implementation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-6710890557700591809?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/6710890557700591809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=6710890557700591809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/6710890557700591809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/6710890557700591809'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/04/value-of-creative-brief.html' title='The value of the creative brief'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-6947574247625172824</id><published>2007-04-08T15:11:00.000+10:00</published><updated>2007-04-08T16:57:11.500+10:00</updated><title type='text'>The aftermath of the flood.</title><content type='html'>I had a conversation with my friend Dano, and I thought of a few more things about ideas.&lt;br /&gt;&lt;br /&gt;'The progression of design history has not been a progression of new ideas, but the identification of new aspects of the same old problems."&lt;br /&gt;&lt;br /&gt;It's not the ideas through history that have been important. That is just the part that people notice. They don't notice why they came up with the new idea. They don't think about the fact that it didn't come from nowhere.&lt;br /&gt;&lt;br /&gt;I think to a large extent, as a designer I have been fixated on coming up with the next big thing, the new great idea. In doing that, I lose sight of the fact tat the people that came up with the last great idea didn't do it on purpose. They found a new aspect of an existing problem that nobody noticed before, or they did notice, but were too afraid to openly acknowledge that it exists.&lt;br /&gt;&lt;br /&gt;Dano then tells me that he is the "Exact same way". He wants to come up with something great and new, and he psyches himself into getting nothing done, and making nothing but shit along with it. He wonders why he can't just do things without thinking "How can I be completely original", and suggests that this is perhaps too lofty a goal to set yourself to.&lt;br /&gt;&lt;br /&gt;It's a bit like a chinese finger trap. There's an element of selfishness in wanting to grab some small bit of glory for yourself. But in order to get there you have to completely forget that you want that. You have to convince yourself that you don't, and you're just out to solve a problem. You also have to accept that there's a very good chance that it won't turn out great, and not let yourself be dissapointed when it doesn't. Just figure out what went right, what went wrong, and move on. &lt;br /&gt;&lt;br /&gt;The great solutions come out of honesty; honesty to the problem, honesty to yourself, honesty about the solution. Don't let cultural biases, or your ego get in the way of perceiving something about the problem. Don't succumb to the forces that tell you to ignore it, the forces inside you that want to be seen as good, and smart, and talented, and better. Instead listen to the littler voice inside you that says the emporer has no clothes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-6947574247625172824?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/6947574247625172824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=6947574247625172824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/6947574247625172824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/6947574247625172824'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/04/aftermath-of-flood.html' title='The aftermath of the flood.'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-1977178213041697636</id><published>2007-04-08T13:37:00.000+10:00</published><updated>2007-04-16T16:23:53.776+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='art'/><category scheme='http://www.blogger.com/atom/ns#' term='creativity'/><category scheme='http://www.blogger.com/atom/ns#' term='ideas'/><category scheme='http://www.blogger.com/atom/ns#' term='execution'/><category scheme='http://www.blogger.com/atom/ns#' term='concept'/><category scheme='http://www.blogger.com/atom/ns#' term='implementation'/><title type='text'>The flood</title><content type='html'>The important thing to remember about ideas, is that they are not important. This will probably violate a lot of people's feelings about ideas, but it's true. Ideas are cheap. It's the execution that matters. This is why I have no problem writing all my ideas out here. It doesn't serve me any function to jealously keep all my ideas secret, in fear that someone will steal them. I am not the scriptwriter that accuses the producer, who rejected my script, of stealing the very ideas within it. The value of ideas has become very distorted in modern western culture. This could go on to become a lengthy discussion about copyright law, but that is not why I am writing this post.&lt;br /&gt;&lt;br /&gt;So, let's take it as a given that ideas are a dime a dozen. Suppose I fill this blog up with a dozen ideas a month. How do I determine which ideas are worth pursuing? Which ones should I invest real time in bringing to reality? I Think this is related to the question I asked in the first post. How do you define a person? Another (more sexist) form of the question is "What is the measure of a man". It's a question about measuring the potential of a person. It's a question about predicting what that person is likely to do in the future. Depending on how you look at it, it's also about how a person is percieved. It seems shallow, but social perception is important. So when you are judging a person, what factors go into your judgement? What do you look for to decide whether someone is a genius, or a peasant?&lt;br /&gt;&lt;br /&gt;Perhaps it is what a person has done in the past. If it is, then really, you are judging a person based on what ideas they chose to act upon, out of the sea of ideas. So one must choose carefully, as the ideas one chooses, determines who they are, or at least how they will be judged.&lt;br /&gt;&lt;br /&gt;Many people will chose ideas based on their marketability. Perhaps there's a certain cool factor. Perhaps they've fallen in love with a particular technology. (lots of people have fallen in love with AJAX, lately). Most people don't think about the criteria they use for choosing what to act on. They just do things because they feel good, or they do things because they think it is expected from them by other people. Some people just have a really nice hammer, and are out looking for things that look like nails. Others just want to be seen doing the same things as everyone else, and desperately want to be thought of as cool or normal. &lt;br /&gt;&lt;br /&gt;As a Graphic Designer, I am trained to start with a problem. Once I've established the exact nature of the problem, I must think of as many possible solutions as possible. The flood of ideas. The more you can think of, the better. The idea that wins, is the one that solves the most aspects of the problem. The progression design history has not been a progression of new ideas, but the identification of new aspects of the same old problems. Modernist architecture fullfilled all the needs of a human being, through the triumph of science. &lt;br /&gt;&lt;br /&gt;That is what the architects thought. They've thought of the optimal size of the kitchen, the living room, how many bathrooms there should be, where they should be located, how high the ceilings should be, what the best materials are, how to give just enough space to someone so they don't feel cramped, but not so much that high density living is not possible. &lt;br /&gt;&lt;br /&gt;They forgot that humans don't like living in featureless boxes. So Postmodernism is about the discovery of the human aspects of problem solving. Unlike modernism, Post-Modernism doesn't strive for purity, or the triumph of man over nature. Post modernism accepts everyone and everything for exactly what it really is. Post modernism doesn't reject history, it doesnt' reject science, it doesnt' reject pointless decoration or starkness. Post modernism is the relentless search for new aspects to old problems, and it has erased the boundary lines for future eras of art, and replaced them with a smooth continuous forward march away from the myopia of modernism.&lt;br /&gt;&lt;br /&gt;So how do I choose which ideas to pursue? I don't. The best thing to do is choose which problems to pursue, and investigate as many aspects of the problem as I can, in a thoughtful and methodical way. The ideas will sort themselves.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-1977178213041697636?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/1977178213041697636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=1977178213041697636' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1977178213041697636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1977178213041697636'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/04/flood.html' title='The flood'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-8633035031848417268</id><published>2007-04-07T18:37:00.000+10:00</published><updated>2007-04-16T16:23:08.618+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gameboy'/><category scheme='http://www.blogger.com/atom/ns#' term='nintendo DS'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='voxels'/><category scheme='http://www.blogger.com/atom/ns#' term='pixel art'/><title type='text'>Voxels</title><content type='html'>What is a voxel? it's like a 3 dimensional pixel. It is short for "VOlume piXEL". It's a very simple concept which has been used in countless applications, from medical imagery to videogames. The basic idea is a 3D raster, each element of which stores attributes such as color, transparency, density, normal, and countless other possible things, or subsets of these.  The classic Demoscene demo is the voxel landscape. (not true voxels, but possibly an impressive demo nonetheless).&lt;br /&gt;&lt;br /&gt;I have been obsessed with voxels. Why? I think there is one application of voxels which has been underserved: 2D style games. Rapid development of Pixel art. Imagine the standard 16 bit games with multiplane parallax backgrounds. Now imagine them with many more contiguous planes, 3 dimensional objects in the background smoothly passing by in perfect perspective. Not flattened cardboard 2D paintings, but fully 3D props rendered with a 1voxel=1 pixel style engine. Most voxel rendering engines I see make the grim mistake of rendering a voxel with many pixels, creating an ugly pixelated look. Imagine 3D worlds with the tidy detail which is given to 2d pixel art. You can get a taste of it at the metroid cubed site here http://pages.infinit.net/voxel/home.htm&lt;br /&gt;&lt;br /&gt;I get excited at the potential of this guy's work, but saddened to see it wasted in cheesy 8-bit style graphics, and reliving old games, and old gameplay models. &lt;br /&gt;&lt;br /&gt;Like many, I have been dissappointed in the graphic quality of games since the playstation arrived. 3D graphics in videogames are consistantly ugly as sin. Their bicubic scaled textures filling the screen with vomited blurs of pixels.&lt;br /&gt;&lt;br /&gt;I want a 1pixel=1voxel world. A 1pixel=1voxel oriented graphics editor. A 1pixel=1voxel oriented game engine which combines the flexibility of 3D with the exquisite detail and lush beauty of 2D pixel art graphics.&lt;br /&gt;&lt;br /&gt;1. The Basics.&lt;br /&gt;Each voxel can store a color, and an opacity. Most of the time, opacity is a simple on/off switch. Either it exists or it doesn't. It can be full alpha, which significantly slows down the rendering of the voxels. The result is a smooth density cloud- this is what makes voxels useful for medical imaging. Newer game engines are using voxels for more realistic clouds and smoke effects.&lt;br /&gt;&lt;br /&gt;2. Normals. &lt;br /&gt;what is a normal? In 3d graphics parlance, a normal is a point in 3D space which is the terminal of a line that is perpendicular to the angle of the surface at a specific point on a surface. In other words, the surface normal defines what direction a surface is facing. One can determine how well lit a surface is by measuring the angle between the light source, the surface, and the normal. This is a very simple cross product, then arc tangent operation.&lt;br /&gt;&lt;br /&gt;With voxels, each voxel can have its own surface normal. Many voxel engines determine the surface normal automatically based on a voxel's neighbors. This produces a very legoish appearance to your voxel models. It is possible to smooth this out by taking into account more neighbors. I think a better idea, is to model first in a standard 3d modeller, then remember the normal of a surface when converting from the standard model to your voxels. &lt;br /&gt;&lt;br /&gt;Thus, a voxel model can be more than just a flat colored grid of 3d pixels, but dynamic per voxel shading is possible, with very smooth appearance to the surface.&lt;br /&gt;&lt;br /&gt;Some other very handy things can be done with normals though. You can find the contours of a voxel model, and use them to add cel shading style lines. Here's how it works: Simply give your voxel model a shell of invisible voxels, just a 1 voxel thick coating. Then, render the shell voxels if their normals are parallel or near parallel to the camera. This is a common technique in polygonal cel shading. This is an application of the same principal at a pixel level of precision. Essentially what this does is render a pixel next to any "surface" which is perpendicular to the camera. This will be the object's contours, what we normally perceive as its edges.&lt;br /&gt;&lt;br /&gt;The beauty of this is that the exact shape of the shell can be tweaked and modified to exactly how you need it to look, at a pixel level. What's more, this can do more than just outlines. Pixels which only render when their normals are pointing a certain direction away or towards the camera, can be used for view specific pixel level tweaks. Is one view particularly awkward? just tweak it a bit. This is the same basic principle as hints in vector fonts.&lt;br /&gt;&lt;br /&gt;3. Simulations.&lt;br /&gt;Since every atomic element of the object is defined as a point, this opens the door for a vast variety of particle simulations. Particles in simulations can be made to behave like liquid, smoke, jelly, springs, strings, cloths, solar systems, bouncyballs, pendulums, rag dolls, etc. Voxel positions can be attached to particles in a simulation, allowing characters and objects to realistically bounce, flow, explode, melt, stretch, fall down, trees grown, geological simulations producing realistic voxel landscapes. The possibilities are endless.&lt;br /&gt;&lt;br /&gt;4. Sprites.&lt;br /&gt;Remember the opening title screen for Yoshi's Island? It's basically a 3d island composed of a number of 2D graphics attached at some point on their base to a 3d plane. The plane rotates around carrying the graphics with them, creating the impression of a 3d island while keeping the cartoony detailed appearance that only dot graphics can achieve. &lt;br /&gt;If I create my voxel paint program, I want this effect to be achievable as any other voxel effect, and combinable with any amount of voxel graphics. Just attach a 2d graphic to a voxel, and the 3d calculations take care of themselves.&lt;br /&gt;&lt;br /&gt;5. Isometric.&lt;br /&gt;One comprimise that I don't think any pixel art purist will object to, is that I intend that my ideal voxel rendering engine not apply perspective to its voxels. the scaling of the voxel has the potential to destroy the 1pixel=1voxel idea. At the very least, a perspective engine should not scale a voxel any larger than a pixel.&lt;br /&gt;&lt;br /&gt;6. Sub Surface Scattering&lt;br /&gt;This is a popular effect in computer graphics for simulating the appearance of skin. In order for it to be realistic though, an object needs to have an interior. For humans, the interior must be red and meaty. In a voxel object, the interior is already there. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;How will I make this all work? what programming language shall I use? What sort of game will I make?&lt;br /&gt;I haven't decided yet. Maybe flash. Maybe java. Maybe SDL and C. Maybe all of the above? Perhaps anyone who happens to read this has an opinion? Who knows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-8633035031848417268?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/8633035031848417268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=8633035031848417268' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8633035031848417268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/8633035031848417268'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/04/voxels.html' title='Voxels'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4273143554626736913.post-1017396883721361272</id><published>2007-04-07T18:34:00.000+10:00</published><updated>2007-04-07T18:35:28.726+10:00</updated><title type='text'>Am I web 2.0 now?</title><content type='html'>Okay so I have a blog now. perhaps unlike the thousands of other people who also have blogs, I don't expect anyone to read this. (But if you are reading this, I'm deeply sorry.) Why did I start this blog? Because I have too many ideas in my head to keep  track of. I don't have enough time to implement all of them, but I also don't want my ideas to pass silently into oblivion either. I have tried windows notepad files. I've tried mac stickies. I've tried livejournaling. I've tried physical notebooks, and the running thread is that I have too many systems for recording ideas, and my head is busting at the seams.&lt;br /&gt;&lt;br /&gt;Who am I? Who is anyone? How is a person defined? Is a person the sum of their experiences? Is a person the resume of things they have accomplished, the list of jobs they've held? Is a person a composite of the thoughts and opinions they hold? Is it the unique matrix which defines how a person responds to perceptual events, their personality? I am barely a person by any of these standards, but I exist anyway, so I may as well make the best of it, until I die or something kills me. I am just a person who has ideas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4273143554626736913-1017396883721361272?l=bustingseams.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bustingseams.blogspot.com/feeds/1017396883721361272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4273143554626736913&amp;postID=1017396883721361272' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1017396883721361272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4273143554626736913/posts/default/1017396883721361272'/><link rel='alternate' type='text/html' href='http://bustingseams.blogspot.com/2007/04/am-i-web-20-now.html' title='Am I web 2.0 now?'/><author><name>Breton Slivka</name><uri>http://www.blogger.com/profile/02816821939461336576</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><thr:total>0</thr:total></entry></feed>
