summaryrefslogtreecommitdiff
path: root/web/lukeshu.ath.cx/1/wordpress/2011/01/java-has-issues/index.chtml
blob: afc588544b8acdb8f367e3b415293617f9d88cc3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<base href="http://lukeshu.ath.cx/1/wordpress/2011/01/java-has-issues/"><div style="background:#fff;border:1px solid #999;margin:-1px -1px 0;padding:0;"><div style="background:#ddd;border:1px solid #999;color:#000;font:13px arial,sans-serif;font-weight:normal;margin:12px;padding:8px;text-align:left">This is Google&#39;s cache of <a href="http://lukeshu.ath.cx/1/wordpress/2011/01/java-has-issues/" style="text-decoration:underline;color:#00c">http://lukeshu.ath.cx/1/wordpress/2011/01/java-has-issues/</a>. It is a snapshot of the page as it appeared on Dec 7, 2011 21:53:20 GMT. The <a href="http://lukeshu.ath.cx/1/wordpress/2011/01/java-has-issues/" style="text-decoration:underline;color:#00c">current page</a> could have changed in the meantime. <a href="http://www.google.com/intl/en/help/features_list.html#cached" style="text-decoration:underline;color:#00c">Learn more</a><br><br><div style="float:right"><a href="http://webcache.googleusercontent.com/search?q=cache:http://lukeshu.ath.cx/1/wordpress/2011/01/java-has-issues/+lukeshu.ath.cx&amp;hl=en&strip=1" style="text-decoration:underline;color:#00c">Text-only version</a></div>
<div>&nbsp;</div></div></div><div style="position:relative">
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
       "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US" >
<head>
	<title>Java has issues | ltsBlog</title>
	<link href="/1/lts.css"                             rel="stylesheet" type="text/css" media="screen,projection" />
	<link href="http://lukeshu.ath.cx/1/wordpress/wp-content/themes/lts/style.css" rel="stylesheet" type="text/css" media="all" />
	<link href="http://lukeshu.ath.cx/1/wordpress/wp-content/themes/lts/widgets.css" rel="stylesheet" type="text/css" media="screen,projection" />
	<link rel="pingback" href="http://lukeshu.ath.cx/1/wordpress/xmlrpc.php" />
<link rel="alternate" type="application/rss+xml" title="ltsBlog &raquo; Feed" href="http://lukeshu.ath.cx/1/wordpress/feed/" />
<link rel="alternate" type="application/rss+xml" title="ltsBlog &raquo; Comments Feed" href="http://lukeshu.ath.cx/1/wordpress/comments/feed/" />
<link rel="alternate" type="application/rss+xml" title="ltsBlog &raquo; Java has issues Comments Feed" href="http://lukeshu.ath.cx/1/wordpress/2011/01/java-has-issues/feed/" />
<script type='text/javascript' src='http://lukeshu.ath.cx/1/wordpress/wp-includes/js/l10n.js?ver=20101110'></script>
<script type='text/javascript' src='http://lukeshu.ath.cx/1/wordpress/wp-includes/js/comment-reply.js?ver=20090102'></script>
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://lukeshu.ath.cx/1/wordpress/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://lukeshu.ath.cx/1/wordpress/wp-includes/wlwmanifest.xml" /> 
<link rel='index' title='ltsBlog' href='http://lukeshu.ath.cx/1/wordpress/' />
<link rel='start' title='Lesson 1: Bourne Shell Scripting' href='http://lukeshu.ath.cx/1/wordpress/2010/09/hello-world/' />
<link rel='prev' title='FUSE is crazy' href='http://lukeshu.ath.cx/1/wordpress/2010/11/fuse-is-crazy/' />
<link rel='next' title='Pointers in Java' href='http://lukeshu.ath.cx/1/wordpress/2011/01/pointers-in-java/' />
<meta name="generator" content="WordPress 3.2.1" />
<link rel='canonical' href='http://lukeshu.ath.cx/1/wordpress/2011/01/java-has-issues/' />
<link rel='shortlink' href='http://lukeshu.ath.cx/1/wordpress/?p=49' />
 
</head>

<body>
	<div class="nocss">
		<ul>
			<li><a href="#navigation">Skip to Navigation</a></li>
			<li><a href="#content">Skip to Content</a></li>
			<li><a href="#footer">Skip to Disclaimer</a></li>
		</ul>
	</div>
 
 
	<h1><a href="http://lukeshu.ath.cx/1/wordpress/" title="ltsBlog" rel="home">ltsBlog</a></h1> 
 
	<div class="nav"><a class="nocss" id="navigation"></a>
		<ul>
			<li><a href="/1/">Home</a></li>
			<li><a href="/1/FRC/">Robots</a></li>
			<li><a href="/1/img/">Pictures</a></li>
			<li><a href="/1/wordpress/">Weblog</a></li>
			<li><a href="/1/comicjk/viewer.php">Comic JK</a></li>
		</ul>
	</div>
 
 

	<div class="sidebar widget-area">
		<ul class="xoxo">
<li id="search-2" class="widget-container widget_search">	<form method="get" id="searchform" action="/1/wordpress/" >
		<div>
			<label class="screen-reader-text" for="s">Search ltsBlog:</label>
			<input type="text" value="" name="s" id="s" />
			<input type="submit" id="searchsubmit" value="Search" />
		</div>
	</form>
</li>              <li id="statusnetwidget-4" class="widget-container widget_statusnetwidget">                  <span class="widget-title">Me on identi.ca</span>                  <ul class="statusnet"><li class="statusnet-item">Someone egged a bunch of cars in our neighborhood. <span class="statusnet-timestamp"><abbr title="2011/12/03 05:58:48"><a href="http://identi.ca/notice/86136803">2011/12/03</a></abbr></span></li><li class="statusnet-item"><a href="http://identi.ca/group/git">!git</a>. is. such. win. <span class="statusnet-timestamp"><abbr title="2011/11/27 20:32:11"><a href="http://identi.ca/notice/85848970">2011/11/27</a></abbr></span></li><li class="statusnet-item">My favorite sites could get shut down by 1st censorship system for the internet. Must stop it: 11/16  <a href="http://ur1.ca/5qyod">http://ur1.ca/5qyod</a> <span class="statusnet-timestamp"><abbr title="2011/11/16 12:46:11"><a href="http://identi.ca/notice/85359960">2011/11/16</a></abbr></span></li><li class="statusnet-item">One of these days I'll hack <a href="http://identi.ca/group/emacs">!emacs</a> daemon to expose the server via 9p. <span class="statusnet-timestamp"><abbr title="2011/11/03 21:51:32"><a href="http://identi.ca/notice/84892668">2011/11/03</a></abbr></span></li></ul>              </li>        		<li id="recent-posts-2" class="widget-container widget_recent_entries">		<span class="widget-title">Recent Posts</span>		<ul>
				<li><a href="http://lukeshu.ath.cx/1/wordpress/2011/08/fixing-wrong-type-argument-characterp-return-in-emacs/" title="Fixing &#8220;Wrong type argument: characterp, return&#8221; in !Emacs">Fixing &#8220;Wrong type argument: characterp, return&#8221; in !Emacs</a></li>
				<li><a href="http://lukeshu.ath.cx/1/wordpress/2011/08/emacs-autopair-problems-when-using-term-mode/" title="[Emacs] autopair problems when using term-mode">[Emacs] autopair problems when using term-mode</a></li>
				<li><a href="http://lukeshu.ath.cx/1/wordpress/2011/05/why-sed-i-exists/" title="Why `sed -i&#8217; exists">Why `sed -i&#8217; exists</a></li>
				<li><a href="http://lukeshu.ath.cx/1/wordpress/2011/02/questions-about-copyright-of-the-deceased/" title="Questions about copyright of the deceased">Questions about copyright of the deceased</a></li>
				<li><a href="http://lukeshu.ath.cx/1/wordpress/2011/01/pointers-in-java/" title="Pointers in Java">Pointers in Java</a></li>
				</ul>
		</li><li id="recent-comments-2" class="widget-container widget_recent_comments"><span class="widget-title">Recent Comments</span><ul id="recentcomments"><li class="recentcomments"><a href='http://lukeshu.ath.cx/1/wordpress/2011/08/fixing-wrong-type-argument-characterp-return-in-emacs/' rel='external nofollow' class='url'>Fixing &#8220;Wrong type argument: characterp, return&#8221; in !Emacs | ltsBlog</a> on <a href="http://lukeshu.ath.cx/1/wordpress/2011/08/emacs-autopair-problems-when-using-term-mode/#comment-94">[Emacs] autopair problems when using term-mode</a></li><li class="recentcomments"><a href='http://lukeshu.ath.cx' rel='external nofollow' class='url'>lts</a> on <a href="http://lukeshu.ath.cx/1/wordpress/2010/09/hello-world/#comment-58">Lesson 1: Bourne Shell Scripting</a></li><li class="recentcomments"><a href='http://lukeshu.ath.cx' rel='external nofollow' class='url'>lts</a> on <a href="http://lukeshu.ath.cx/1/wordpress/2011/01/pointers-in-java/#comment-56">Pointers in Java</a></li><li class="recentcomments">Ari Consul on <a href="http://lukeshu.ath.cx/1/wordpress/2011/01/pointers-in-java/#comment-54">Pointers in Java</a></li><li class="recentcomments">Jade Parsons on <a href="http://lukeshu.ath.cx/1/wordpress/2010/09/hello-world/#comment-52">Lesson 1: Bourne Shell Scripting</a></li></ul></li><li id="archives-2" class="widget-container widget_archive"><span class="widget-title">Archives</span>		<ul>
			<li><a href='http://lukeshu.ath.cx/1/wordpress/2011/08/' title='August 2011'>August 2011</a></li>
	<li><a href='http://lukeshu.ath.cx/1/wordpress/2011/05/' title='May 2011'>May 2011</a></li>
	<li><a href='http://lukeshu.ath.cx/1/wordpress/2011/02/' title='February 2011'>February 2011</a></li>
	<li><a href='http://lukeshu.ath.cx/1/wordpress/2011/01/' title='January 2011'>January 2011</a></li>
	<li><a href='http://lukeshu.ath.cx/1/wordpress/2010/11/' title='November 2010'>November 2010</a></li>
	<li><a href='http://lukeshu.ath.cx/1/wordpress/2010/10/' title='October 2010'>October 2010</a></li>
	<li><a href='http://lukeshu.ath.cx/1/wordpress/2010/09/' title='September 2010'>September 2010</a></li>
		</ul>
</li><li id="categories-2" class="widget-container widget_categories"><span class="widget-title">Categories</span>		<ul>
	<li class="cat-item cat-item-8"><a href="http://lukeshu.ath.cx/1/wordpress/category/computers/" title="View all posts filed under Computers">Computers</a>
</li>
	<li class="cat-item cat-item-7"><a href="http://lukeshu.ath.cx/1/wordpress/category/school-2/essays/" title="View all posts filed under Essays">Essays</a>
</li>
	<li class="cat-item cat-item-12"><a href="http://lukeshu.ath.cx/1/wordpress/category/morning-pages/" title="View all posts filed under morning-pages">morning-pages</a>
</li>
	<li class="cat-item cat-item-9"><a href="http://lukeshu.ath.cx/1/wordpress/category/computers/programming-lessons/" title="View all posts filed under Programming Lessons">Programming Lessons</a>
</li>
	<li class="cat-item cat-item-6"><a href="http://lukeshu.ath.cx/1/wordpress/category/school-2/" title="View all posts filed under School">School</a>
</li>
	<li class="cat-item cat-item-1"><a href="http://lukeshu.ath.cx/1/wordpress/category/uncategorized/" title="View all posts filed under Uncategorized">Uncategorized</a>
</li>
		</ul>
</li><li id="meta-2" class="widget-container widget_meta"><span class="widget-title">Meta</span>			<ul>
			<li><a href="http://lukeshu.ath.cx/1/wordpress/wp-login.php?action=register">Register</a></li>			<li><a href="http://lukeshu.ath.cx/1/wordpress/wp-login.php">Log in</a></li>
			<li><a href="http://lukeshu.ath.cx/1/wordpress/feed/" title="Syndicate this site using RSS 2.0">Entries <abbr title="Really Simple Syndication">RSS</abbr></a></li>
			<li><a href="http://lukeshu.ath.cx/1/wordpress/comments/feed/" title="The latest comments to all posts in RSS">Comments <abbr title="Really Simple Syndication">RSS</abbr></a></li>
			<li><a href="http://wordpress.org/" title="Powered by WordPress, state-of-the-art semantic personal publishing platform.">WordPress.org</a></li>
						</ul>
</li><li id="ltshomewidget-3" class="widget-container widget_ltshomewidget">	<ul class="lts_sidebar">
		<li><a href="http://www.defectivebydesign.org/intel"><img src="http://static.fsf.org/nosvn/dbd/stop-intel-med.png" alt="stop Intel" /></a></li>
		<li>
<!-- Beginning of Project Wonderful ad code: -->
<!-- Ad box ID: 51613 -->
<script type="text/javascript">
<!--
var pw_d=document;
pw_d.projectwonderful_adbox_id = "51613";
pw_d.projectwonderful_adbox_type = "4";
pw_d.projectwonderful_foreground_color = "";
pw_d.projectwonderful_background_color = "";
//-->
</script>
<script type="text/javascript" src="http://www.projectwonderful.com/ad_display.js"></script>
<!-- End of Project Wonderful ad code. -->
</li>
	</ul>
</li> 
		</ul>
	</div><!-- .sidebar -->

 
 

	<div class="main"><a class="nocss" id="content"></a>
	 
		<div id="nav-above" class="navigation">
			<div class="nav-previous"><a href="http://lukeshu.ath.cx/1/wordpress/2010/11/fuse-is-crazy/" rel="prev"><span class="meta-nav">&larr;</span> FUSE is crazy</a></div>
			<div class="nav-next"><a href="http://lukeshu.ath.cx/1/wordpress/2011/01/pointers-in-java/" rel="next">Pointers in Java <span class="meta-nav">&rarr;</span></a></div>
		</div><!-- #nav-above -->
		
		<div id="post-49" class="post-49 post type-post status-publish format-standard hentry category-computers">
			<h2 class="entry-title">Java has issues</h2>
			<div class="entry-meta">
				<span class="meta-prep meta-prep-author">Posted on</span> <a href="http://lukeshu.ath.cx/1/wordpress/2011/01/java-has-issues/" title="22:47" rel="bookmark"><span class="entry-date">2011/01/03</span></a> <span class="meta-sep">by</span> <span class="author vcard"><a class="url fn n" href="http://lukeshu.ath.cx/1/wordpress/author/lts/" title="View all posts by lts">lts</a></span> 
			</div><!-- .entry-meta -->
			<div class="entry-content">
<p class="aside">This was originally posted to Facebook by me at 2010-09-02 23:19.  It was edited by me there 2010-07-03.</p>
<p>Java is an alright language. There are a lot of things it does right, but there<br />
are a few things it doesn&#8217;t.</p>
<ol>
<li>Distinction between classes and packages. I should be able to create<br />
      sub-classes the same way as I add classes to a package; a package should<br />
      just be an empty class.</li>
<li>Too many primitives. I should be able to (re-)construct more of the<br />
      language.</li>
<li>No preprocessor/inlines. OO isn&#8217;t an excuse for this, make me do it at the<br />
      class level (or rather, source file, not supporting `#include&#8217; is fine). I<br />
      should at least be able to add `#define int8=byte&#8217; like in C. This<br />
      wouldn&#8217;t be as much of an issue if all these things weren&#8217;t primitives; I<br />
      could just do &#8220;public class int8 extends byte&#8221;. (yes, I could extend the<br />
      `Byte&#8217; class, but it wouldn&#8217;t come with all the syntactic sugar primitives<br />
      get.)</li>
<li>Numbers: names. Yes the names used are long-standing convention in CS.<br />
      These include some of the worst short-sighted mistakes in all of<br />
      hackerdom&#8230; because they stuck. Yet, most reasonable languages can still<br />
      support them, and sane equivalents.</p>
<ul>
<li>byte -&gt; int8</li>
<li>short -&gt; int16</li>
<li>int -&gt; int32</li>
<li>long -&gt; int64</li>
<li>float -&gt; float32</li>
<li>double -&gt; float64</li>
</ul>
<p>      This would easily be fixed if they weren&#8217;t all primitives (point 2), or if<br />
      I had a preprocessor (point 3).</li>
<li>Numbers: unsigned. How about unsigned integers (uint16)? This would be<br />
      easy to implement, if everything weren&#8217;t a damn primitive.</li>
<li>Give me an actual `struct&#8217;, like in C. I&#8217;m not asking for full manual<br />
      memory management, just the ability to organize a chunk of it; you can<br />
      still manage it for me. It would make serialization hellofalot<br />
      easier.</li>
<li>It&#8217;s inconsistent about whether it uses the system encoding or it&#8217;s<br />
      internal encoding.  The String object just became worthless to anyone<br />
      wanting to do any amount of I18N.</li>
<li>It&#8217;s internal encoding is junk. It maps UTF-16 symbols onto the `char&#8217;<br />
      primitive, which is 16 bits.</p>
<ol>
<li>UTF-16 is junk, use UTF-8</li>
<li>With any UTF encoding you must allow for a dynamic bit-length, for<br />
            UTF-16 it&#8217;s 16-32 bits, UTF-8 is 8-32 bits</li>
</ol>
<p>      I understand how/why it arrived at the solution it uses; at the time Java<br />
      was designed, it was using UCS-2, which is a 16-bit encoding, and was<br />
      superseded by UTF-16 in 1996 with Unicode 2.0. However, this is one of<br />
      those things where you specify a new JVM version, and switch to UTF-8. You<br />
      can even leave a legacy mode in the JVM that still uses UCS-2.</li>
<li>Octal prefix: `0&#8242; is used as the prefix to specify an octal literal. Any<br />
      third-grader can tell you why using a 0 as a prefix to a number is a bad<br />
      idea; the number might just have padded zeros. Let&#8217;s look at the prefix<br />
      used for hexadecimal: `0x&#8217;. This is great:</p>
<ol>
<li>It starts with a numeric character, which means that it must be a<br />
            literal. If it started with an alphabetic character, it might be a<br />
            variable name.</li>
<li>The second character is a alphabetic character that is not used in<br />
            any number system that is used in computer science. This allows it<br />
            to serve a a unique identifier.</li>
</ol>
<p>      Given these reasons, let&#8217;s think of a new prefix for octal&#8230; how about<br />
      `0o&#8217;. That took literally less than 10 seconds for me to realize why `0&#8242;<br />
      sucked, and to think of a better one.<a href="#java-problems-f1">*</a></li>
</ol>
<p>All-in-all, its still better than C++</p>
<p><span id="java-problems-f1">*</span> although, writing this gave me an even<br />
better idea, but it would break `0x&lt;value&gt;&#8217; for hex, which is incredibly<br />
common among many languages:<br />
`&lt;base-in-decimal&gt;x&lt;value&gt;&#8217;<br />
so octal would be `8x&lt;value&gt;&#8217;<br />
and hex would be `16x&lt;value&gt;&#8217;<br />
It would be incredibly understandable, and, depending on implementation allow<br />
simple arbitrary-base literals.</p>
 
			</div><!-- .entry-content -->
			<div class="entry-links">
				 
			</div>
			 
			<div class="entry-utility">
				This entry was posted in <a href="http://lukeshu.ath.cx/1/wordpress/category/computers/" title="View all posts in Computers" rel="category tag">Computers</a>. Bookmark the <a href="http://lukeshu.ath.cx/1/wordpress/2011/01/java-has-issues/" title="Permalink to Java has issues" rel="bookmark">permalink</a>. 
				 
			</div><!-- .entry-utility -->
		</div><!-- #post-## -->
		
		<div id="nav-below" class="navigation">
			<div class="nav-previous"><a href="http://lukeshu.ath.cx/1/wordpress/2010/11/fuse-is-crazy/" rel="prev"><span class="meta-nav">&larr;</span> FUSE is crazy</a></div>
			<div class="nav-next"><a href="http://lukeshu.ath.cx/1/wordpress/2011/01/pointers-in-java/" rel="next">Pointers in Java <span class="meta-nav">&rarr;</span></a></div>
		</div><!-- #nav-below -->
		
		 

		<div id="comments">
								<div id="respond">
				<h3 id="reply-title">Leave a Reply <small><a rel="nofollow" id="cancel-comment-reply-link" href="/1/wordpress/2011/01/java-has-issues/#respond" style="display:none;">Cancel reply</a></small></h3>
									<form action="http://lukeshu.ath.cx/1/wordpress/wp-comments-post.php" method="post" id="commentform">
																			<p class="comment-notes">Your email address will not be published. Required fields are marked <span class="required">*</span></p>							<p class="comment-form-author"><label for="author">Name</label> <span class="required">*</span><input id="author" name="author" type="text" value="" size="30" aria-required='true' /></p>
<p class="comment-form-email"><label for="email">Email</label> <span class="required">*</span><input id="email" name="email" type="text" value="" size="30" aria-required='true' /></p>
<p class="comment-form-url"><label for="url">Website</label><input id="url" name="url" type="text" value="" size="30" /></p>
												<p class="comment-form-comment"><label for="comment">Comment</label><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p>						<p class="form-allowed-tags">You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes:  <code>&lt;a href=&quot;&quot; title=&quot;&quot;&gt; &lt;abbr title=&quot;&quot;&gt; &lt;acronym title=&quot;&quot;&gt; &lt;b&gt; &lt;blockquote cite=&quot;&quot;&gt; &lt;cite&gt; &lt;code&gt; &lt;del datetime=&quot;&quot;&gt; &lt;em&gt; &lt;i&gt; &lt;q cite=&quot;&quot;&gt; &lt;strike&gt; &lt;strong&gt; </code></p>						<p class="form-submit">
							<input name="submit" type="submit" id="submit" value="Post Comment" />
							<input type='hidden' name='comment_post_ID' value='49' id='comment_post_ID' />
<input type='hidden' name='comment_parent' id='comment_parent' value='0' />
						</p>
											</form>
							</div><!-- #respond -->
						 
		</div><!-- #comments -->
 
	</div>
<div class='footer'><a class='nocss' id='footer'></a>
	<div class="site-generator">
		<a href="http://wordpress.org/" title="Semantic Personal Publishing Platform" rel="generator" class="site-generator">Powered by WordPress.</a>
	</div>
<p class="valid">Valid <a                href="http://validator.w3.org/check?uri=http%3A%2F%2Flukeshu.ath.cx%2F1%2Fwordpress%2Findex.php" id="link_validate_html">XHTML</a>
                 and   <a href="http://jigsaw.w3.org/css-validator/validator?uri=http%3A%2F%2Flukeshu.ath.cx%2F1%2Fwordpress%2Findex.php" id="link_validate_css" >CSS</a>.
                 <br /><a href="/0/wordpress/index.php">Show (server side) source</a>
</p>
  <p class='copyright'>Copyright &copy; 2010, 2011 Luke Shumaker</p>
  <p class='license'>Verbatim copying and distribution of
    this entire article are permitted worldwide, without
    royalty, in any medium, provided this notice, and the
    copyright notice, are preserved.</p>
</div>
 
</body>
</html>