<?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-16055896</id><updated>2011-04-21T18:53:27.715-07:00</updated><title type='text'>heavy industries.</title><subtitle type='html'>consider this a replacement for all the notes text files in various directories on various machines, or in forgotten archives. any code found here can be presumed devoid of warranty, merchantability or fitness etc, unless explicitly stated otherwise.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://heavy-industries.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://heavy-industries.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>dorian taylor</name><uri>http://www.blogger.com/profile/06442527306561910381</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>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-16055896.post-115284226249007380</id><published>2006-07-13T18:57:00.000-07:00</published><updated>2006-07-14T01:33:52.403-07:00</updated><title type='text'>On CSS selectors, HTML ID and class attributes and reducing cost</title><content type='html'>Coming up with a suitable rule for the names of ID and class selectors that are both valid HTML and CSS — as well as being easy to remember and/or infer — is an oft-neglected chore in the realm of web development.&lt;br /&gt;&lt;br /&gt;If an organization neglects to properly delegate this task, it typically ends up in the hands of those responsible for marking up and styling web content. These individuals tend to have little incentive to care about the consistency and semantic value of the names they choose as selectors. This has the potential to cause problems with those writing Javascript, as they use &lt;span style="font-style: italic;"&gt;class&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;id&lt;/span&gt; attributes to select elements out of the DOM. Furthermore, it drives the cost up of adding microcontent later on, as the entire base of HTML templates, CSS stylesheets and Javascript is likely to have to be scrubbed.&lt;br /&gt;&lt;br /&gt;It should be safe to assume the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Only marketing, search engine optimization (SEO) people and information architects should actually care about what these values say, as this is valuable microcontent.&lt;/li&gt;&lt;li&gt;Javascript programmers and markup/layout people should only care that the values are granular enough to "grab on to".&lt;/li&gt;&lt;li&gt;Back-end programmers should only care that documentation of these values exists, should they even care about any of this at all.&lt;/li&gt;&lt;/ul&gt;Despite their purported apathy, however, programmers could play an integral role in eliminating CSS as a source of frustration and loss of productivity. Coordinating with the information architect, programmers can use their object model to produce a scheme to generate CSS selector names (as well as CSS stubs) that will always be consistent. For example, Java class notation (e.g. com.foobar.myproject.MyClass) or XML Schema type (e.g. xsd:dateTime).&lt;br /&gt;&lt;br /&gt;Some good guidelines to follow:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Set an official company-wide policy for CSS classname notation — decide once, decide forever.&lt;/li&gt;&lt;li&gt;Decide on a set of semantic classnames based on the nature of the objects being displayed on the screen — better yet, generate them from the object model hierarchy.&lt;/li&gt;&lt;li&gt;Use ancestor-descendant selectors and composite classes wherever possible — increase selector granularity without introducing excess classes.&lt;/li&gt;&lt;li&gt;CSS authors need never create selectors based on element IDs — please, let me know of a case (stone-age compatibility notwithstanding) in which it would be 100% necessary.&lt;/li&gt;&lt;li&gt;Produce consistent, unique element IDs for the Javascript authors — they're the ones who rely on them the most.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;And now, fun facts about HTML &lt;span style="font-style: italic;"&gt;class&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;id&lt;/span&gt; attributes and CSS selectors:&lt;br /&gt;&lt;br /&gt;The HTML &lt;span style="font-style: italic;"&gt;class&lt;/span&gt; attribute is of DTD type CDATA, meaning that literally any content can be placed into it, provided that content is escaped properly. CSS class selectors split on whitespace, meaning any opaque token can be used as a class. An example of an opaque token could be a &lt;a href="http://www.w3.org/TR/REC-xml-names/#ns-qualnames"&gt;QName&lt;/a&gt; like an XML Schema datatype or perhaps an rdfs:Class URI. Both parent document formats of those datatypes — &lt;a href="http://www.w3.org/TR/xmlschema-2/#built-in-datatypes"&gt;XML Schema&lt;/a&gt; and &lt;a href="http://www.w3.org/TR/rdf-schema/"&gt;RDF Schema&lt;/a&gt; — have more than adequate capacity to document the nature of the object to be displayed on the screen.&lt;br /&gt;&lt;br /&gt;The HTML &lt;span style="font-style: italic;"&gt;id&lt;/span&gt; attribute is of DTD type ID, which, according to &lt;a href="http://www.w3.org/TR/html401/types.html#type-id"&gt;the spec&lt;/a&gt;, must start with an ASCII letter, followed by any number of ASCII letters, digits, hyphens, underscores, colons and periods. This means that it is possible to use an ASCII-conformant XML QName (except those in which the namespace prefix begins with "_"), and still maintain a valid document.&lt;br /&gt;&lt;br /&gt;On the CSS side, characters in selectors that collide with the CSS grammar can be escaped with a backslash ("\"), followed by their Unicode codepoint (one to six hexadecimal digits), followed by optional whitespace if the code is shorter than the full six digits. Meaning that:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;div class="http://xmlns.foo.com/MyType"&amp;gt;Look at me!&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;can be styled by the CSS rule:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;.http\3a\2f\2fxmlns\2e foo\2e com\2fMyType {&lt;br /&gt;background-color: #f00f00;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;The preceding has been confirmed to work in recent versions of Gecko, MSIE, Opera, Konqueror and Safari.&lt;br /&gt;&lt;br /&gt;To keep designers happy, I recommend devising a tool that will generate CSS stubs based on their object model hierarchy. Note that "inheritance" in the context of CSS is not the same as it is in a standard object hierarchy. Here is an example:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/*&lt;br /&gt;com.foobar.myproject.Manager - A Manager in a Company&lt;br /&gt;`-- com.foobar.myproject.Employee&lt;br /&gt;   `-- com.foobar.myproject.Person&lt;br /&gt;*/&lt;br /&gt;.com\2e foobar\2e myproject\2e Manager {&lt;br /&gt;/* enter Manager-specific rules here */&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Or, in order to respect an application's object inheritance tree, it could be possible to generate an element with the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;div class="com.foobar.myproject.Manager com.foobar.myproject.Employee com.foobar.myproject.Person"&amp;gt;Content!&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And then generate style rule stubs like so:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/*&lt;br /&gt;com.foobar.myproject.Person - A representation of a person&lt;br /&gt;*/&lt;br /&gt;.com\2e foobar\2e myproject\2e Person {&lt;br /&gt;/* Generic styling */&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;com.foobar.myproject.Employee - An employee of a company&lt;br /&gt;`-- com.foobar.myproject.Person&lt;br /&gt;*/&lt;br /&gt;.com\2e foobar\2e myproject\2e Employee.com\2e foobar\2e myproject\2e Person {&lt;br /&gt;/* More specific styling */&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;com.foobar.myproject.Manager - A manager of a company&lt;br /&gt;`-- com.foobar.myproject.Employee&lt;br /&gt;   `-- com.foobar.myproject.Person&lt;br /&gt;*/&lt;br /&gt;.com\2e foobar\2e myproject\2e Manager.com\2e foobar\2e myproject\2e Employee.com\2e foobar\2e myproject\2e Person {&lt;br /&gt;/* Most specific styling */&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now, this is an extreme example of a set of fully qualified class names and how to map them to CSS. SEO folk might argue that the token repetition is bad for Google scores and performance geeks might say that the length of the class names needlessly bloat the size of the document. I would recommend experimenting to find an optimal solution.&lt;br /&gt;&lt;br /&gt;But, to satisfy the aforementioned people in the meantime, here is an example of ancestor-descendant selectors using XML Schema simple types to designate the datatypes and FOAF QName types to designate the relationships. Picture this markup:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;div class="foaf:Person"&amp;gt;&lt;br /&gt;&amp;lt;span class="foaf:name"&amp;gt;Dorian Taylor&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;a class="xsd:anyURI foaf:weblog" target="_blank" href="http://heavy-industries.blogspot.com/"&amp;gt;heavy industries.&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;span class="xsd:gMonthDay foaf:birthday"&amp;gt;08-17&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Followed by this (potentially generated) CSS:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/*&lt;br /&gt;XML SCHEMA TYPES&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;xsd:anyURI - An arbitrary URI reference&lt;br /&gt;*/&lt;br /&gt;.xsd\3a anyURI {&lt;br /&gt;/* URI-specific styling, like hover colour, etc? - possible macro for pseudo classes */&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;xsd:gMonthDay - Month-day string on Gregorian calendar&lt;br /&gt;*/&lt;br /&gt;.xsd\3a gMonthDay {&lt;br /&gt;/* date-specific styling, like localization, etc? possibly useful via Javascript */&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;FOAF SCHEMA TYPES&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;foaf:Person - A person. Living, dead or imaginary.&lt;br /&gt;*/&lt;br /&gt;.foaf\3a Person {&lt;br /&gt;/* style Person container */&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;foaf:birthday - A person's birthday.&lt;br /&gt;*/&lt;br /&gt;.foaf\3a Person foaf\3a birthday {&lt;br /&gt;/* style birthdate as it relates to a foaf:Person */&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;foaf:name - A person's name.&lt;br /&gt;*/&lt;br /&gt;.foaf\3a Person foaf\3a name {&lt;br /&gt;/* drop-cap the first initial or something cute like that */&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;foaf:weblog - The URL of a person's weblog.&lt;br /&gt;*/&lt;br /&gt;.foaf\3a Person foaf\3a weblog {&lt;br /&gt;/* make it flash or something gaudy */&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Upon implementing a system like this, I suggest that it is possible for those interested in the minutiae of the naming of CSS selectors (the marketing/SEO and the information architects) to employ those who benefit directly from the automation and documentation thereof (the programmers) to dictate values to those who would rather not have to think about choosing them anyway (the CSS authors). The result? Better cooperation, fewer bugs and quicker time to market.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16055896-115284226249007380?l=heavy-industries.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://heavy-industries.blogspot.com/feeds/115284226249007380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16055896&amp;postID=115284226249007380' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/115284226249007380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/115284226249007380'/><link rel='alternate' type='text/html' href='http://heavy-industries.blogspot.com/2006/07/on-css-selectors-html-id-and-class.html' title='On CSS selectors, HTML ID and class attributes and reducing cost'/><author><name>dorian taylor</name><uri>http://www.blogger.com/profile/06442527306561910381</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-16055896.post-115068370735426985</id><published>2006-06-18T18:47:00.000-07:00</published><updated>2006-06-18T23:01:49.696-07:00</updated><title type='text'>RDF Actually Isn't That Hard</title><content type='html'>That's right. Not hard. Easy, in fact. RDF just hangs with a bad crowd. I'll explain:&lt;br /&gt;&lt;br /&gt;I suspect one of the major detriments to the &lt;a href="http://www.w3.org/RDF/"&gt;Resource Description Framework&lt;/a&gt; and its proponents is the association with XML. I also posit that the second largest source of confusion is its use of &lt;a href="http://www.ietf.org/rfc/rfc2368.txt"&gt;URI&lt;/a&gt;s as something other than &lt;a href="http://www.ietf.org/rfc/rfc1738.txt"&gt;URL&lt;/a&gt;s. Now, the populace has just begun to understand the concept of an URL as a globally unique locator for porn, news, games, porn and shopping. The relative few tech-savvy types that actually &lt;span style="font-style: italic;"&gt;understand &lt;/span&gt;XML do so in the capacity that it is a way to serialize an ordered, hierarchical data structure. RDF is actually a lot more simple.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;RDF is one or more statements about one or more things.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Expository — you know — like your first essay in grade school.&lt;br /&gt;&lt;br /&gt;That's right. things. Unique things. A dog. A banana. Some glasses. Or possibly classes of things. Houses. Cars. People.&lt;br /&gt;&lt;br /&gt;Statements. Like "knows" or "is a type of" or "recommends". Let's try one:&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;a href="http://doriantaylor.com/"&gt;Dorian&lt;/a&gt;&amp;gt; &amp;lt;wears&amp;gt; &amp;lt;&lt;a href="#GLASSES"&gt;glasses&lt;/a&gt;&amp;gt;.&lt;br /&gt;&lt;br /&gt;Sweet. How about another?&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;a name="GLASSES"&gt;The glasses&lt;/a&gt;&amp;gt; &amp;lt;are made by&amp;gt; &amp;lt;&lt;a href="http://ic-berlin.de/"&gt;ic!berlin&lt;/a&gt;&amp;gt;.&lt;br /&gt;&lt;br /&gt;Looks kind of like English, huh? Well, this is (effectively) &lt;a href="http://www.w3.org/2001/sw/RDFCore/ntriples/"&gt;REAL RDF SYNTAX&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;(Incidentally, &amp;lt;&lt;a href="http://doriantaylor.com/"&gt;Dorian&lt;/a&gt;&amp;gt; &amp;lt;recommends&amp;gt; &amp;lt;&lt;a href="http://ic-berlin.de/"&gt;ic!berlin&lt;/a&gt;&amp;gt;.)&lt;br /&gt;&lt;br /&gt;So, I say to those that might want to learn RDF:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Ignore RDF/XML.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Seriously. It just complicates things. Suppose I wanted to describe the statements above as RDF/XML. It would probably look something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;rdf:RDF&lt;br /&gt;xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&lt;br /&gt;xmlns:foo="http://doriantaylor.com/messing/with/your/head/with/RDF#"&amp;gt;&lt;br /&gt;&amp;lt;rdf:Description rdf:about="http://doriantaylor.com/"&amp;gt;&lt;br /&gt;&amp;lt;foo:wears rdf:nodeID="GLASSES"/&amp;gt;&lt;br /&gt;&amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;&amp;lt;rdf:Description rdf:ID="GLASSES"&amp;gt;&lt;br /&gt;&amp;lt;foo:manufacturer rdf:resource="http://ic-berlin.de/"/&amp;gt;&lt;br /&gt;&amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;&amp;lt;-- oh, and incidentally --&amp;gt;&lt;br /&gt;&amp;lt;rdf:Description rdf:about="http://doriantaylor.com/"&amp;gt;&lt;br /&gt;&amp;lt;foo:recommends rdf:resource="http://ic-berlin.de/"/&amp;gt;&lt;br /&gt;&amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;&amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;&lt;/pre&gt;That's right. The near-English from above has been mangled almost completely beyond recognition. &lt;a href="http://www.w3.org/RDF/Validator"&gt;Try it&lt;/a&gt;, it's valid. It's just not legible. The only thing RDF/XML and non-RDF XML have in common is the raw &lt;a href="http://www.w3.org/TR/REC-xml/"&gt;syntax&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;"So Dorian, what about that funny namespace URI you used for 'foo'?"&lt;br /&gt;&lt;br /&gt;That's the other part.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;URIs don't actually have to be web pages.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Although in this case, I'd probably want the URI "http://doriantaylor.com/messing/with/your/head/with/RDF#" to point to an &lt;a href="http://www.w3.org/TR/rdf-schema/"&gt;RDF schema&lt;/a&gt; that explained nicely what my understanding of the verbs "wears" and "recommends" are. But I digress. Just remember the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A Uniform Resource Identifier identifies resources uniformly.&lt;/span&gt; Shocking, I know.&lt;br /&gt;&lt;br /&gt;http://www.cnn.com/ is only ever going to point to CNN's homepage (unless, of course, they neglect to pay their domain bill).&lt;br /&gt;urn:isbn:096139210X will only ever refer to a particular favourite book of mine.&lt;br /&gt;tel:+1-900-HOT-CHIX is only ever going to be the destination of my date for Friday night.&lt;br /&gt;&lt;br /&gt;Um, yeah.&lt;br /&gt;&lt;br /&gt;The important part about URIs in RDF is that they represent globally unique resources — things, categories, ideas. Suppose I were to replace my original example with URIs:&lt;br /&gt;&lt;br /&gt;&amp;lt;http://doriantaylor.com/&amp;gt;&lt;br /&gt;&amp;lt;http://doriantaylor.com/messing/with/your/head/with/RDF#wears&amp;gt; &amp;lt;genid:GLASSES&amp;gt;.&lt;br /&gt;&amp;lt;genid:GLASSES&amp;gt; &amp;lt;http://doriantaylor.com/messing/with/your/head/with/RDF#manufacturer&amp;gt; &amp;lt;http://ic-berlin.de/&amp;gt;.&lt;br /&gt;&amp;lt;http://doriantaylor.com/&amp;gt; &amp;lt;http://doriantaylor.com/messing/with/your/head/with/RDF#recommends&amp;gt; &amp;lt;http://ic-berlin.de/&amp;gt;.&lt;br /&gt;&lt;br /&gt;When I swap URIs in, it becomes clear that those are the &lt;span style="font-style: italic;"&gt;only &lt;/span&gt;things in the world I can possibly be talking about. The only loose thread is, collectively, what I consider "to wear", what a "manufacturer" is, and what it means "to recommend". This is where stuff like &lt;a href="http://www.w3.org/TR/rdf-schema/"&gt;RDF Schema&lt;/a&gt; and&lt;a href="http://www.w3.org/2001/sw/WebOnt/"&gt; OWL&lt;/a&gt; comes in, which I consider out of the scope of this post. I will say, however, that it's usually better to pick a &lt;a href="http://www.schemaweb.info/"&gt;lingua franca&lt;/a&gt; to describe certain things than to come up with your own, as I oh-so-naughtily did above.&lt;br /&gt;&lt;br /&gt;One other item: that genid:GLASSES represents an item that is local to the set of statements, in order to tie a group of statements together. I can just as easily replace it with xxx:HGLAUGAHLGA  or urn:x-foo:bizzle or http://doriantaylor.com/possessions/glasses where there might be a nice picture of me wearing my glasses. In fact, having all resources refer to something globally unique is preferred, but a generated ID can suffice in a pinch.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Why are we doing all of this?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For the computers, of course! The poor darlings work so hard but they're really not that bright. Especially when it comes to icky human things like semantics. The idea is, if we give them enough clues, they will work really hard to help us get a better picture of the world around us.&lt;br /&gt;&lt;br /&gt;If &lt;a href="http://xmlns.com/foaf/0.1/"&gt;people&lt;/a&gt; could &lt;a href="http://web.resource.org/rss/1.0/spec"&gt;&lt;span style="text-decoration: underline;"&gt;advertise&lt;/span&gt;&lt;/a&gt; &lt;a href="http://dublincore.org/"&gt;their work&lt;/a&gt; in a unified way, our computers could sort and filter this information based on what it actually &lt;a href="http://web.resource.org/rss/1.0/modules/taxonomy/"&gt;&lt;span style="font-style: italic;"&gt;is&lt;/span&gt;&lt;/a&gt;, rather than words it contains or what refers to it.&lt;br /&gt;&lt;br /&gt;And that has some seriously cool potential.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16055896-115068370735426985?l=heavy-industries.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://heavy-industries.blogspot.com/feeds/115068370735426985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16055896&amp;postID=115068370735426985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/115068370735426985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/115068370735426985'/><link rel='alternate' type='text/html' href='http://heavy-industries.blogspot.com/2006/06/rdf-actually-isnt-that-hard.html' title='RDF Actually Isn&apos;t That Hard'/><author><name>dorian taylor</name><uri>http://www.blogger.com/profile/06442527306561910381</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-16055896.post-113359167996905601</id><published>2005-12-02T22:34:00.000-08:00</published><updated>2005-12-03T01:01:23.566-08:00</updated><title type='text'>mod_perl 1+2 configuration directives sans compatibility layer</title><content type='html'>&lt;pre style="overflow: scroll"&gt;&lt;br /&gt;use strict;&lt;br /&gt;use warnings FATAL =&gt; 'all';&lt;br /&gt;&lt;br /&gt;our (%PREREQ_PM, $INC);&lt;br /&gt;&lt;br /&gt;BEGIN {&lt;br /&gt;    %PREREQ_PM = (&lt;br /&gt;        'Test::More'    =&gt; 0,&lt;br /&gt;        'Apache::Test'  =&gt; 1.25,&lt;br /&gt;    );&lt;br /&gt;    $INC = '';&lt;br /&gt;&lt;br /&gt;    # bootstrap for mod_perl 1.x&lt;br /&gt;    eval { require Apache };&lt;br /&gt;    unless ($@) {&lt;br /&gt;        require Apache::ExtUtils;&lt;br /&gt;        require Apache::src;&lt;br /&gt;&lt;br /&gt;        # add include paths&lt;br /&gt;        $INC = Apache::src-&gt;new-&gt;inc;&lt;br /&gt;&lt;br /&gt;        # mod_perl 1.x specific prerequisites&lt;br /&gt;        $PREREQ_PM{XSLoader} = 0;&lt;br /&gt;        $PREREQ_PM{mod_perl} = 1.29;&lt;br /&gt;&lt;br /&gt;        # retrieve and build command table XS&lt;br /&gt;        require 'lib/Apache/DebugLog.pm';&lt;br /&gt;        Apache::ExtUtils::command_table(\@Apache::DebugLog::DIRECTIVES);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    # bootstrap for mod_perl 2.x&lt;br /&gt;    eval { require Apache2 };&lt;br /&gt;    unless ($@) {&lt;br /&gt;        # mod_perl 2.x specific prerequisites&lt;br /&gt;        $PREREQ_PM{mod_perl2} = 1.999023;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    unless (grep { exits $INC{$_} } qw(Apache.pm Apache2.pm)) {&lt;br /&gt;        die "Must have mod_perl 1 or 2 installed.";&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;use ExtUtils::MakeMaker;&lt;br /&gt;&lt;br /&gt;use Apache::TestMM qw(test clean);&lt;br /&gt;&lt;br /&gt;Apache::TestMM::filter_args();&lt;br /&gt;Apache::TestMM::generate_script('t/TEST');&lt;br /&gt;&lt;br /&gt;WriteMakefile(&lt;br /&gt;    NAME                =&gt; 'Apache::DebugLog',&lt;br /&gt;    AUTHOR              =&gt; 'dorian taylor &lt;dorian@cpan.org&gt;',&lt;br /&gt;    VERSION_FROM        =&gt; 'lib/Apache/DebugLog.pm',&lt;br /&gt;    ABSTRACT_FROM       =&gt; 'lib/Apache/DebugLog.pm',&lt;br /&gt;    PL_FILES            =&gt; {},&lt;br /&gt;    INC                 =&gt; $INC,&lt;br /&gt;    PREREQ_PM           =&gt; \%PREREQ_PM,&lt;br /&gt;    dist                =&gt; { COMPRESS =&gt; 'gzip -9f', SUFFIX =&gt; 'gz', },&lt;br /&gt;    clean               =&gt; { FILES =&gt; 'Apache-DebugLog-* t/TEST' },&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16055896-113359167996905601?l=heavy-industries.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://heavy-industries.blogspot.com/feeds/113359167996905601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16055896&amp;postID=113359167996905601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/113359167996905601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/113359167996905601'/><link rel='alternate' type='text/html' href='http://heavy-industries.blogspot.com/2005/12/modperl-12-configuration-directives.html' title='mod_perl 1+2 configuration directives sans compatibility layer'/><author><name>dorian taylor</name><uri>http://www.blogger.com/profile/06442527306561910381</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-16055896.post-113141039452563113</id><published>2005-11-07T16:36:00.000-08:00</published><updated>2005-11-10T16:13:23.623-08:00</updated><title type='text'>building a gtk2 mozilla on a mac</title><content type='html'>(these could be a cargo cult because i didn't build them properly)&lt;br /&gt;&lt;br /&gt;add &lt;code&gt;-lpangoft2-1.0 -lpangoxft-1.0&lt;/code&gt; to &lt;code&gt;MOZ_GTK2_LIBS&lt;/code&gt; in &lt;code&gt;config/autoconf.mk.in&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;add &lt;code&gt;-lglib-2.0 -lgobject-2.0 -lgdk_pixbuf-2.0&lt;/code&gt; to &lt;code&gt;EXTRA_DSO_LDOPTS&lt;/code&gt; in browser/components/build/Makefile.in&lt;br /&gt;&lt;br /&gt;it is possible that the above is a total cargo cult, and i didn't compile these libraries correctly.&lt;br /&gt;&lt;br /&gt;this comes in handy (in /usr/local/lib/firefox-1.6a1, make sure you put &lt;code&gt;-headerpad_max_install_names&lt;/code&gt; into your &lt;code&gt;LDFLAGS&lt;/code&gt;, otherwise you won't be able to do this)&lt;br /&gt;&lt;br /&gt;&lt;pre style="overflow: scroll"&gt;&lt;br /&gt;DEBUG=echo&lt;br /&gt;FF_DIR=/usr/local/lib/firefox-1.6a1&lt;br /&gt;cd $FF_DIR&lt;br /&gt;for i in *dylib; do    for j in `otool -L $i | sed -n        '/.*@executable_path/s/.*\(@executable_path[^ ]*\).*/\1/p'`; do        myid=`echo -n $j | sed "s,@executable_path,$FF_DIR,"`&lt;br /&gt;       $DEBUG install_name_tool -id $myid $i&lt;br /&gt;       $DEBUG install_name_tool -change $j $myid $i&lt;br /&gt;   done&lt;br /&gt;done&lt;br /&gt;for i in `find components extensions plugins -name \*dylib`; do    for j in `otool -L $i | sed -n        '/.*@executable_path/s/.*\(@executable_path[^ ]*\).*/\1/p'`; do        myid=`echo -n $j | sed "s,@executable_path,$FF_DIR,"`&lt;br /&gt;       $DEBUG install_name_tool -change $j $myid $i&lt;br /&gt;   done&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;of course, if you paste this into a file and run it and it wrecks your stuff, consider yourself having been warned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16055896-113141039452563113?l=heavy-industries.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://heavy-industries.blogspot.com/feeds/113141039452563113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16055896&amp;postID=113141039452563113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/113141039452563113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/113141039452563113'/><link rel='alternate' type='text/html' href='http://heavy-industries.blogspot.com/2005/11/building-gtk2-mozilla-on-mac.html' title='building a gtk2 mozilla on a mac'/><author><name>dorian taylor</name><uri>http://www.blogger.com/profile/06442527306561910381</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-16055896.post-112913137114670453</id><published>2005-10-12T08:20:00.001-07:00</published><updated>2005-10-12T10:42:53.536-07:00</updated><title type='text'>broad security considerations for web apps</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Never reveal the engine's implementation.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Stack traces and internal errors echoed to the front-facing part of a web application can reveal vulnerabilities in underlying implementations. This is by no means advocacy of error suppression, as proper diagnostics are invaluable for debugging purposes. Ideally, error types should be mapped to a user-friendly dictionary that allows the user to describe his or her situation to support staff, while the stack trace slips quietly out the back into the error log where it belongs. Applications should be designed to cost more effort to bubble stack traces to their user-facing sides than a friendly error message.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Limit the dataset exposed to the templating layer.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With modern web MVC frameworks, it is typically very easy to provide fairly large subsets of the data structures and objects from within the application's space to the templating mechanism. In some systems, it is possible to provide live executable objects to the templating layer, thereby allowing layout designers to easily muddle logic and presentation, as well as inadvertently (or possibly deliberately) yield aspects of the application's internal state.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Decouple the authentication mechanism from the primary application.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When a web application is decoupled from its authentication mechanism, it enjoys two major benefits: First, developers do not have to invoke authentication (however it may be done) on a per-resource basis, and can develop as if their application is already authenticated. Second, both frameworks can be tested independently of each other, allowing for more efficient and effective testing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Organize authenticated resources by URI path segments.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Stand-alone authentication modules are easiest to organize by URI path. Choosing an initial path segment like /auth or /protected, underneath which all resources are covered by the authentication module, will emphasize the logical division between regular and logged-in resources. Authorization modules can then be bound to subpaths under these segments.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Never trust input.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Input traditionally can come from three different sources: query string, form data and cookies.  A common practice is to merge these into a single dictionary of key-value pairs and pass them into the application as parameters. Under no circumstances should it be possible to access this dictionary without it having been sanitized. Each entry in the dictionary should be checked against an expected set of keys. Entries present that are not expected should be at least removed, or better, produce an error. This should occur &lt;span style="font-weight: bold;"&gt;before&lt;/span&gt; validation of the values. Following this, the values can be checked against their respective validating functions, as well as each other, in the case of interdependencies. It is only now that the application developer should be able to retrieve these parameters.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Never trust input (Part II).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With the advent of web services, arbitrarily nested XML content (or any other content, for that matter) can come in via a POST or PUT request. XML content should be first inspected for encoding consistency. Ideally, the content's encoding should be converted into one's preferred Unicode format before it is parsed (suggest UTF-8). More ideally, this should happen in a separate process space, in case of an attempt to compromise. Any illegal character sequences should produce an error. Following this, the document should be parsed and checked for well-formedness. Lack of compliance should produce an error. Finally, the document should be checked against a DTD, XML Schema or RelaxNG content model. Anything not validating should produce an error. All of this should happen before the content is received by the application layer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Never trust input (Part III).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It is extremely unwise to provide a user with data of any kind (cookie, hidden form field) with the expectation of retrieving it unmodified. Data passed to the user should only be done so when it is within the user's interest to keep it intact (e.g. session, or target resource). Ideally, the capacity for a web application developer to produce a dependency on a piece of user data should require greater effort than interacting with a central state mechanism.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Developers will inherently follow the path of least resistance to complete a project. If not of their own volition, they will be pressed to do so. Creating an environment that requires less effort to do the right (read: secure) thing will yield an overall more stable product with few to no embarrassing compromises.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16055896-112913137114670453?l=heavy-industries.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://heavy-industries.blogspot.com/feeds/112913137114670453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16055896&amp;postID=112913137114670453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/112913137114670453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/112913137114670453'/><link rel='alternate' type='text/html' href='http://heavy-industries.blogspot.com/2005/10/broad-security-considerations-for-web.html' title='broad security considerations for web apps'/><author><name>dorian taylor</name><uri>http://www.blogger.com/profile/06442527306561910381</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-16055896.post-112699054665449433</id><published>2005-09-17T13:54:00.000-07:00</published><updated>2005-10-28T15:17:04.203-07:00</updated><title type='text'>list of things that need massaging in mac os x</title><content type='html'>libtiff: add -flat_namespace to linker flags in ./configure, and anywhere else with a dynamic library target.&lt;br /&gt;&lt;br /&gt;qt: hah. hahahahhah. okay. get the darwinports patch. read the portfile. when it breaks, add -undefined suppress and -flat_namespace to the linker flags. wait a few hours for it to break again.&lt;br /&gt;&lt;br /&gt;kdelibs will plain not build. you will have problems with the case-insensitive filesystem and libjpeg vs libJPEG. i remedied this by making my /usr/local an HFS+X image.&lt;br /&gt;&lt;br /&gt;(ps. i'm only building source because of religious issues with fink, darwinports, pkgsrc and portage.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16055896-112699054665449433?l=heavy-industries.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://heavy-industries.blogspot.com/feeds/112699054665449433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16055896&amp;postID=112699054665449433' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/112699054665449433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/112699054665449433'/><link rel='alternate' type='text/html' href='http://heavy-industries.blogspot.com/2005/09/list-of-things-that-need-massaging-in.html' title='list of things that need massaging in mac os x'/><author><name>dorian taylor</name><uri>http://www.blogger.com/profile/06442527306561910381</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-16055896.post-112638792365471031</id><published>2005-09-10T13:59:00.000-07:00</published><updated>2005-09-10T14:32:41.070-07:00</updated><title type='text'>Javascript DOM.Traversal</title><content type='html'>I'm looking into creating a bridge for the &lt;a href="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html"&gt;DOM level 2 Traversal&lt;/a&gt; API for MSIE and Safari. It would be significantly less painful than trying to navigate documents with just the DOM core API, and perhaps a good framework for a &lt;a href="http://www.w3.org/TR/DOM-Level-3-XPath/"&gt;DOM 3 XPath&lt;/a&gt; bridge implementation as well, as Opera and Safari don't implement it.&lt;br /&gt;&lt;br /&gt;I'm going to be publishing this on &lt;a href="http://openjsan.org/"&gt;JSAN&lt;/a&gt;. i'll update when it's available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16055896-112638792365471031?l=heavy-industries.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://heavy-industries.blogspot.com/feeds/112638792365471031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16055896&amp;postID=112638792365471031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/112638792365471031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/112638792365471031'/><link rel='alternate' type='text/html' href='http://heavy-industries.blogspot.com/2005/09/javascript-domtraversal.html' title='Javascript DOM.Traversal'/><author><name>dorian taylor</name><uri>http://www.blogger.com/profile/06442527306561910381</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-16055896.post-112611759483133917</id><published>2005-09-07T11:17:00.000-07:00</published><updated>2005-09-07T11:26:34.836-07:00</updated><title type='text'>Adapt OrbiTouch to mobile input system</title><content type='html'>The &lt;a href="http://www.keybowl.com/kb/index?page=home"&gt;OrbiTouch&lt;/a&gt; input system features a two-joystick configuration which is chorded to input the full array of characters of a standard keyboard. It was designed initially for those with repetitive stress injuries to regain the ability to type with minimal movement in their hands and wrists.&lt;br /&gt;&lt;br /&gt;The benefit of adapting the input system to mobile devices is the conservation of space. a pair of thumbpads similar to the IBM &lt;a href="http://www.almaden.ibm.com/cs/user/tp/tp.html"&gt;Trackpoint&lt;/a&gt; technology with surrounding indentations possibly no larger than 2cm across would be a more than ample complement (or replacement) to the 12-key number pad, and just as versatile as a QWERTY input. Indicators can either be placed right on the case of the device, or on a heads-up overlay on the display.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16055896-112611759483133917?l=heavy-industries.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://heavy-industries.blogspot.com/feeds/112611759483133917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16055896&amp;postID=112611759483133917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/112611759483133917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/112611759483133917'/><link rel='alternate' type='text/html' href='http://heavy-industries.blogspot.com/2005/09/adapt-orbitouch-to-mobile-input-system.html' title='Adapt OrbiTouch to mobile input system'/><author><name>dorian taylor</name><uri>http://www.blogger.com/profile/06442527306561910381</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-16055896.post-112548576493966232</id><published>2005-08-31T03:44:00.000-07:00</published><updated>2005-08-31T03:56:59.110-07:00</updated><title type='text'>to-do</title><content type='html'>&lt;ul&gt;   &lt;li&gt;jsan module-starter template&lt;/li&gt;   &lt;li&gt;reliable xforms-&gt;xslt-&gt;ajax pipeline&lt;/li&gt;   &lt;li&gt;incremental ajax failover method (symbolic reference design, input filter)&lt;/li&gt;&lt;li&gt;seriously take another look at xforms&lt;/li&gt;   &lt;li&gt;look at security implications of REST&lt;/li&gt;&lt;li&gt;actually get around to looking at del.icio.us&lt;/li&gt;   &lt;li&gt;actually do something about improving efficiency of news intake&lt;/li&gt;   &lt;li&gt;research rdf/rss/atom/foaf/rumorf/lol/wtf commonalities&lt;/li&gt;   &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16055896-112548576493966232?l=heavy-industries.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://heavy-industries.blogspot.com/feeds/112548576493966232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16055896&amp;postID=112548576493966232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/112548576493966232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16055896/posts/default/112548576493966232'/><link rel='alternate' type='text/html' href='http://heavy-industries.blogspot.com/2005/08/to-do.html' title='to-do'/><author><name>dorian taylor</name><uri>http://www.blogger.com/profile/06442527306561910381</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>
