<?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-8740230010187295725</id><updated>2012-02-29T00:08:27.471-08:00</updated><title type='text'>Fandle Technology Blog</title><subtitle type='html'>Adventures in building a web site to make hearing live performances of your favorite bands as easy as 3.141592...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.fandle.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default'/><link rel='alternate' type='text/html' href='http://blog.fandle.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jeffrey "JD" Brennan</name><uri>http://www.blogger.com/profile/13330772018679977636</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>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8740230010187295725.post-3083751506515455160</id><published>2011-01-10T18:02:00.000-08:00</published><updated>2011-01-10T18:09:48.977-08:00</updated><title type='text'>Testing in Internet Explorer (IE6, IE7, IE8) on Mac OS X</title><content type='html'>There are some great blog entries on&lt;a href="http://blog.affirmix.com/2009/04/01/ie6-ie7-and-ie8-on-mac-os-x-step-by-step/"&gt;ie6, ie7 and ie8 on mac os x step by step&lt;/a&gt; and &lt;a href="http://www.10voltmedia.com/blog/2008/12/screencast-install-internet-explorer-on-osx-using-virtualbox/"&gt;Install Internet Explorer on OSX using VirtualBox&lt;/a&gt;, but they are a bit out of date, so since I can't update those entries, I'm writing my own.  But I'm standing on the shoulders of others.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What you'll need&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Virtual Box - &lt;a href="http://www.virtualbox.org/wiki/Downloads"&gt;free download from Oracle&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Virtual machine images of Windows with IE - &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyId=21EABB90-958F-4B64-B5F1-73D0A413C8EF&amp;amp;displaylang=en"&gt;free downloads from Microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A network driver -&amp;nbsp;&lt;a href="http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/"&gt;free download from Redhat&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;Steps&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. &amp;nbsp;Download and Install Virtual Box (&lt;a href="http://www.virtualbox.org/wiki/Downloads"&gt;from Oracle&lt;/a&gt;). &lt;br /&gt;&lt;br /&gt;I installed version 4.0.0, current as of Jan 2011.&lt;br /&gt;&lt;br /&gt;2. &amp;nbsp;Download the Virtual PC disk image (&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyId=21EABB90-958F-4B64-B5F1-73D0A413C8EF&amp;amp;displaylang=en"&gt;from Microsoft&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;For instance, let's start with IE8-on-XPSP3. &amp;nbsp;You'll need an app to open the self-extracting archive (IE8-on-XPSP3.exe) file that you downloaded.&lt;br /&gt;&lt;br /&gt;If you don't have Unarchiver, UnRarX or Zipeg, then download&lt;a href="http://wakaba.c3.cx/s/apps/unarchiver.html"&gt;Unarchiver&lt;/a&gt;. &amp;nbsp;Double-click&amp;nbsp;on the TheUnarchiver .zip file and it will extract the application. &amp;nbsp;Move the The Unarchiver&amp;nbsp;to Applications.&lt;br /&gt;&lt;br /&gt;Then find the .exe file and right-click on it and go to Open With -&amp;gt; Other... and&amp;nbsp;scroll down and select The Unarchiver.&amp;nbsp;That will create a folder called IE8-on-XPSP3 and inside will be the the .vhd file that&amp;nbsp;you'll use in Virtual Box and a ReadMe.txt that will say what the login password is&amp;nbsp;for the virtual machine.&lt;br /&gt;&lt;br /&gt;3. &amp;nbsp;Down the Paravirtual (virtio) Driver (&lt;a href="http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/"&gt;from Redhat&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Download the .iso file which you will be able to mount in a Virtual Box machine.&lt;br /&gt;&lt;br /&gt;4. &amp;nbsp;Create a new virtual machine in Virtual Box&lt;br /&gt;&lt;br /&gt;Start Virtual Box. &amp;nbsp;Go to the File menu and click Virtual Media Manager. &amp;nbsp;Find the .vhd file (from Step 2 above) and drag and drop it into the Virtual&amp;nbsp;Media Manager window. &amp;nbsp;Click OK.&lt;br /&gt;&lt;br /&gt;Click the New button on toolbar in Virtual Box. &amp;nbsp;Enter a name (i.e. "IE8 on WinXP"). &amp;nbsp;Make sure Operating System is "Microsoft Windows" and Version is "Windows XP" and&amp;nbsp;then click Continue.&lt;br /&gt;&lt;br /&gt;Leave Memory at 192MB. Click Continue.&lt;br /&gt;&lt;br /&gt;Click "Use existing hard disk" and select the .vhd file name. Click Continue. Click Done.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Important&lt;/b&gt;: Before starting the virtual machine, set the Network adapter. &amp;nbsp;Select the new&amp;nbsp;virtual machine in VirtualBox (click Details tab, if not already selected). &amp;nbsp;Scroll down to&amp;nbsp;the Network section and click on the word Network. &amp;nbsp;Click the right arrow next to Advanced&amp;nbsp;and set Adapter Type to "Paravirtualized Network (virtio-net)". &amp;nbsp;Click OK.&lt;br /&gt;&lt;br /&gt;Start the virtual machine by clicking the Start button in the toolbar. Login with&amp;nbsp;the password mentioned in the ReadMe.txt file (step 2 above).&lt;br /&gt;&lt;br /&gt;Click Activate Later. &amp;nbsp;You can't activate until you have the network driver&amp;nbsp;installed.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Click Cancel on all the 'Found New Hardware" dialog boxes that appear.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;5. &amp;nbsp;Install the Guest Additions&lt;br /&gt;&lt;br /&gt;This step isn't necessary, but it will make your life easier by making the mouse-handling&amp;nbsp;in the virtual machine natural.&lt;br /&gt;&lt;br /&gt;Inside the newly booted virtual machine, press the left Command key to release the&amp;nbsp;mouse and go to the Devices menu (top of Mac screen) and click&amp;nbsp;Install Guest Additions. &amp;nbsp;This mounts a CD drive in the virtual machine and&amp;nbsp;the autorun on the CD prompts you to install software. &amp;nbsp;Ignore the warnings about&amp;nbsp;unvalidated software and install everything. &amp;nbsp;At the end click Reboot later.&amp;nbsp;You can reboot now, but it's faster to install the Network Driver first.&lt;br /&gt;&lt;br /&gt;6. &amp;nbsp;Install the Network Driver.&lt;br /&gt;&lt;br /&gt;Press the left Command key again and got to the Devices menu and move&amp;nbsp;to CD/DVD Devices and move right to "Remove disk from virtual drive". &amp;nbsp;Go back to the Devices menu and move to CD/DVD Devices and move&amp;nbsp;right to "Choose a virtual CD/DVD disk file...". Locate the virtio-win .iso&amp;nbsp;file you downloaded in step 3 above. &amp;nbsp;Select the filename and click Open.&lt;br /&gt;&lt;br /&gt;In the virtual machine, click on the Start menu and then right-click on My Computer&amp;nbsp;and then click on Manage. &amp;nbsp;Click on Device Manager in the left panel. &amp;nbsp;In&amp;nbsp;the right panel under Network Adapters right click on Network Controller and&amp;nbsp;click "Update Driver...".&lt;br /&gt;&lt;br /&gt;Click radio button for "No, no this time". &amp;nbsp;Click Next. &amp;nbsp;Click Next again. Click Okay to the warning about unverified driver.&lt;br /&gt;&lt;br /&gt;You should now have a network and can activate Windows. &amp;nbsp;After&amp;nbsp;activating your virtual machine should be good for 30 days.&lt;br /&gt;&lt;br /&gt;You can now reboot your virtual machine.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Notes&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I recommend not using the Q app to convert the .vhd file to a .vdi file. This will allow you to run multiple virtual machines at the same time,&amp;nbsp;but I believe it violates the EULA for the virtual machine from Microsoft. &amp;nbsp;See the VPC_EULA.txt file that you downloaded in Step 2 above.&lt;br /&gt;&lt;br /&gt;I also recommend against using AntiWPA instead of activating Windows&amp;nbsp;because&amp;nbsp;this also probably violates the EULA.&lt;br /&gt;&lt;br /&gt;&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/8740230010187295725-3083751506515455160?l=blog.fandle.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.fandle.com/feeds/3083751506515455160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.fandle.com/2011/01/testing-in-internet-explorer-ie6-ie7.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/3083751506515455160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/3083751506515455160'/><link rel='alternate' type='text/html' href='http://blog.fandle.com/2011/01/testing-in-internet-explorer-ie6-ie7.html' title='Testing in Internet Explorer (IE6, IE7, IE8) on Mac OS X'/><author><name>Jeffrey "JD" Brennan</name><uri>http://www.blogger.com/profile/13330772018679977636</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-8740230010187295725.post-22675221329420908</id><published>2010-08-04T16:37:00.000-07:00</published><updated>2010-08-04T16:37:14.678-07:00</updated><title type='text'>Should consensus affect the Supreme Court?</title><content type='html'>I received an email from the ACLU today that said, in part:&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 10px; -webkit-border-vertical-spacing: 10px; color: #333333; font-family: arial, sans-serif; font-size: 13px;"&gt;We must demonstrate that there is a national consensus in support of marriage for same-sex couples. Every step forward will make it harder for the Supreme Court is consistent with the Constitution.&lt;/span&gt;&lt;/blockquote&gt;Consensus shouldn't affect the Supreme Court, should it? &amp;nbsp;The inherent flaw in democracy is that the majority can oppress the minority. &amp;nbsp;The Constitution is supposed to keep that oppression from happening.&lt;br /&gt;&lt;br /&gt;I don't care if 99% of people are against gay marriage or black education or &lt;whatever minority=""&gt; &lt;whatever privilege=""&gt;. &amp;nbsp;The Supreme Court should use the 14th amendment to strike down any law that restricts the privileges of citizens. &amp;nbsp;A privilege is an entitlement granted by the state. &amp;nbsp;Marriage licenses are granted by the state and entitle citizens to certain benefits. &amp;nbsp;Seems pretty clear to me that that's a privilege.&lt;/whatever&gt;&lt;/whatever&gt;&lt;br /&gt;&lt;br /&gt;Or is the ACLU just being pragmatic? &amp;nbsp;In an ideal world, perhaps, Supreme Court justices shouldn't be affected by popular opinion, but they are only human, so they probably are affected.&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/8740230010187295725-22675221329420908?l=blog.fandle.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.fandle.com/feeds/22675221329420908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.fandle.com/2010/08/should-consensus-affect-supreme-court.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/22675221329420908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/22675221329420908'/><link rel='alternate' type='text/html' href='http://blog.fandle.com/2010/08/should-consensus-affect-supreme-court.html' title='Should consensus affect the Supreme Court?'/><author><name>Jeffrey "JD" Brennan</name><uri>http://www.blogger.com/profile/13330772018679977636</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8740230010187295725.post-8674484540565246683</id><published>2010-05-06T02:08:00.000-07:00</published><updated>2010-05-06T12:37:58.721-07:00</updated><title type='text'>Jaclyn: The Jarc Compiler</title><content type='html'>The Fandle R &amp;amp; D team has been busy writing a compiler for Jarc.Today we have released Jarc 12, which includes Jaclyn, the compiler. &amp;nbsp;Jaclyn compiles to JVM byte code. &amp;nbsp;Actually, Jaclyn generates a Jasmin assembler source code file and then calls Jasmin to create a .class file.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Usage&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;Jarc&amp;gt; (compile "foo.arc")&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;...&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;Generated: ./foo.class&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;Jarc&amp;gt; (iload "foo.class")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Performance Improvements&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This had a 5x improvement on the startup time for Jarc.  From 2.5 secondsto 0.4 seconds.&lt;br /&gt;&lt;br /&gt;The run-time improvement is interesting.  Initially the compiled coderuns more slowly, but then improves after the first two runs. &amp;nbsp;I ran the Jarc unit tests 10 times and recorded the time for each run.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_2VlpyI0DSMc/S-J9FMmHQII/AAAAAAAAAK4/8L0NAQlmWY4/s1600/JarcUnitTestTimes.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_2VlpyI0DSMc/S-J9FMmHQII/AAAAAAAAAK4/8L0NAQlmWY4/s400/JarcUnitTestTimes.jpg" xxheight="111" xxwidth="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;This may be partially due to the JIT compiler. &amp;nbsp;Ignoring the initial runs, the compiled code runs about 1/3 faster.&lt;br /&gt;&lt;br /&gt;This should shave a few seconds off the cold-startup time for Fandle on Google App Engine and allow slightly more processing per page hit or task. &amp;nbsp;Page hits (and tasks) have a 30 second limit on App Engine so applications have to be designed to do their processing in 30 second increments.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tail Recursion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Jaclyn optimizes tail recursive functions to avoid using unnecessary stack space. &amp;nbsp;It's not generic tail call elimination, which is not possible in the JVM, but when a method calls itself, the compiler generates a jump to the top of the function instead of invoking the function. &amp;nbsp;This makes recursion feasible for iteration and avoids StackOverflowError exceptions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Optimizations&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;These optimizations are needed to optimize tail calls. &amp;nbsp;If certain macros (like let) are not optimized then the recursive call winds up in a separate function and can't be optimized. &amp;nbsp;But by optimizing:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;afn&lt;/li&gt;&lt;li&gt;rfn&lt;/li&gt;&lt;li&gt;do&lt;/li&gt;&lt;li&gt;let&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Jaclyn can optimize many instances of tail recursion.&lt;br /&gt;&lt;br /&gt;You can download Jarc 12 from&amp;nbsp;&lt;a href="https://sourceforge.net/projects/jarc/files/"&gt;SourceForge&lt;/a&gt;&amp;nbsp;and you can also browse the&amp;nbsp;&lt;a href="http://jarc.hg.sourceforge.net/hgweb/jarc/jarc/"&gt;source code&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8740230010187295725-8674484540565246683?l=blog.fandle.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.fandle.com/feeds/8674484540565246683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.fandle.com/2010/05/jaclyn-jarc-compiler.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/8674484540565246683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/8674484540565246683'/><link rel='alternate' type='text/html' href='http://blog.fandle.com/2010/05/jaclyn-jarc-compiler.html' title='Jaclyn: The Jarc Compiler'/><author><name>Jeffrey "JD" Brennan</name><uri>http://www.blogger.com/profile/13330772018679977636</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/_2VlpyI0DSMc/S-J9FMmHQII/AAAAAAAAAK4/8L0NAQlmWY4/s72-c/JarcUnitTestTimes.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8740230010187295725.post-6483063574523698797</id><published>2010-03-11T21:42:00.000-08:00</published><updated>2010-03-16T13:53:14.830-07:00</updated><title type='text'>Using Jarc with App Engine</title><content type='html'>&lt;p&gt;I've written a &lt;a href="http://bitbucket.org/jazzdev/winerecord/"&gt;sample Jarc web app for Google App Engine&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Overview of the code&lt;/h2&gt;&lt;p&gt;&lt;h3&gt;src/wine.sml&lt;/h3&gt;&lt;pre&gt;&lt;br /&gt;(Wine&lt;br /&gt;  id Long&lt;br /&gt;  description String&lt;br /&gt;  rating String&lt;br /&gt;  created Date&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;This uses &lt;a href="http://blog.fandle.com/2010/02/simplified-s-expression-xml-sml.html"&gt;SML&lt;/a&gt;formatto define the JDO object to persist in App Engine. The script &lt;tt&gt;src/mkjdo.arc&lt;/tt&gt;converts this into a Java class.&lt;/p&gt;&lt;h3&gt;war/winerecord.arc&lt;/h3&gt;&lt;pre&gt;&lt;br /&gt;(use 'jtml)&lt;br /&gt;&lt;br /&gt;(def /home (req res)&lt;br /&gt;  (html&lt;br /&gt;    (head&lt;br /&gt;      (title "WineRecord - What wines did I like?")&lt;br /&gt;      (link rel "stylesheet" src "winerecord.css")&lt;br /&gt;      (script src "http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js")&lt;br /&gt;      (script "$(document).ready(function() { $(\"input:text:first\").focus(); });"))&lt;br /&gt;    (body&lt;br /&gt;      (div&lt;br /&gt;        (with-open db (getPersistenceManager pmf*)&lt;br /&gt;          (form action "/add" method "POST"&lt;br /&gt;            (tab&lt;br /&gt;              (let wines (execute (newQuery db "select from wine.Wine order by created desc range 0,500"))&lt;br /&gt;                (tr (th "Buy Again?") (th "Wine") (th "Date Added") (th))&lt;br /&gt;                (each wine wines&lt;br /&gt;                  (tr (td wine!description)&lt;br /&gt;                      (td wine!rating)&lt;br /&gt;                      (td wine!created)&lt;br /&gt;                      (td (a href (string "/edit?id=" wine!id) "Edit")))))&lt;br /&gt;              (tr (td (text name "description" size 56))&lt;br /&gt;                  (td (select name "rating"&lt;br /&gt;                              (option "yes")&lt;br /&gt;                              (option "no")&lt;br /&gt;                              (option "maybe")))&lt;br /&gt;                  (td (submit value "Add Wine"))&lt;br /&gt;                  (td)))))&lt;br /&gt;        (a href "/export" "Export Wines") " "&lt;br /&gt;        (a href "/import" "Import Wines")))))&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The above is just an excerpt. You can also view the complete&lt;a href="http://bitbucket.org/jazzdev/winerecord/src/tip/war/winerecord.arc"&gt;winerecord.arc&lt;/a&gt;&lt;/p&gt;No, it doesn't use the standard &lt;a href="http://arclanguage.org/"&gt;arc&lt;/a&gt; html package. I think itwould be difficult to make that work since it would require serializingclosures to make them available in multiple web servers.&lt;p&gt;The jtml package uses &lt;a href="http://blog.fandle.com/2010/02/simplified-s-expression-xml-sml.html"&gt;SML&lt;/a&gt;format which has a direct mapping to XHTML.  So the tagnames should be familiar to anyone familiar with HTML.  The only additions toHTML in jtml are abbreviations for input tags based on the type, for instanceyou can do:&lt;pre&gt;&lt;br /&gt;(text name "name" value "foo")&lt;br /&gt;&lt;/pre&gt;instead of requiring&lt;pre&gt;&lt;br /&gt;(input type "text" name "name" value "foo")&lt;br /&gt;&lt;/pre&gt;Although the latter works also.&lt;/p&gt;&lt;p&gt;Given my &lt;a href="http://blog.fandle.com/2010/03/java-access-syntax-from-jarc-less-dots.html"&gt;rant about the advantages of saving one token&lt;/a&gt;you might wonder why I didn't abbreviate the html tags to within and inch oftheir lives.  Well, in this case, I think leveraging compatibility with HTMLis more valuable.  And you can create your own macros to abbreviate it howeveryou like.  It doesn't have to be part of the Jarc language, unlike the Java accesssyntax which does have to be part of the language.&lt;/p&gt;&lt;h4&gt;HttpRequest&lt;/h4&gt;&lt;p&gt;Jarc has it's own HttpRequest class which supports lookup usingapply, so the code can do:&lt;pre&gt;&lt;br /&gt;   ... req!rating ...&lt;br /&gt;&lt;/pre&gt;Instead of&lt;pre&gt;&lt;br /&gt;   ... (getParameterValue req "rating") ...&lt;br /&gt;&lt;/pre&gt;&lt;/p&gt;&lt;h4&gt;JDO&lt;/h4&gt;&lt;p&gt;The JDO class created from src/wine.sml is Wine.java in package "wine".  See&lt;a href="http://bitbucket.org/jazzdev/winerecord/src/tip/build.xml"&gt;build.xml&lt;/a&gt;where mkjdo is called (around like 32).  The second argument to mkjdo is theJava package name to use.  I couldn't get App Engine to work if the JDO objectwas in the default package.&lt;/p&gt;&lt;p&gt;Features of the JDO Wine class&lt;ul&gt;&lt;li&gt;Supports lookup using apply - &lt;tt&gt;wine!created&lt;/tt&gt;&lt;li&gt;Supports sref - &lt;tt&gt;(= wine!created ...)&lt;/tt&gt;&lt;li&gt;Has a constructor that takes a map to init the object - &lt;tt&gt;(new wine.Wine (getParameterMap req))&lt;/tt&gt;&lt;li&gt;Has a &lt;tt&gt;putAll&lt;/tt&gt; method to update the object - &lt;tt&gt;(putAll wine (getParameterMap req))&lt;/tt&gt;&lt;/ul&gt;So if the HTML form has the same names as the JDO object it is easy to create or update the JDO object from a form.&lt;/p&gt;&lt;h2&gt;Source code and Running App&lt;/h2&gt;&lt;p&gt;You can download the entire source from&lt;a href="http://bitbucket.org/jazzdev/winerecord/"&gt;http://bitbucket.org/jazzdev/winerecord/&lt;/a&gt;and you can play with the running app at&lt;a href="http://winerecord.appspot.com"&gt;http://winerecord.appspot.com&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8740230010187295725-6483063574523698797?l=blog.fandle.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.fandle.com/feeds/6483063574523698797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.fandle.com/2010/03/using-jarc-with-app-engine.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/6483063574523698797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/6483063574523698797'/><link rel='alternate' type='text/html' href='http://blog.fandle.com/2010/03/using-jarc-with-app-engine.html' title='Using Jarc with App Engine'/><author><name>Jeffrey "JD" Brennan</name><uri>http://www.blogger.com/profile/13330772018679977636</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8740230010187295725.post-8261569006473289038</id><published>2010-03-10T13:59:00.000-08:00</published><updated>2010-03-11T11:13:37.742-08:00</updated><title type='text'>Java access syntax from Jarc - less dots, more filling</title><content type='html'>&lt;p&gt;Have you ever wondered if the ease of calling C libraries couldbe responsible for a lot of Python's popularity?  C function callslook just like native Python calls.&lt;pre&gt;&lt;br /&gt;import george;&lt;br /&gt;&lt;br /&gt;george.wash("car");&lt;br /&gt;&lt;/pre&gt;You can't tell from the Python code whether the module, george, iswritten in C or Python.  It doesn't matter to the calling program.That's a simple foreign function interface.&lt;/p&gt;&lt;p&gt;Jarc brings this samesimple foreign function interface to Arc.Unlike Clojure and JScheme, the syntax for calling a Javamethod is the same as for calling any Lisp function.&lt;pre&gt;&lt;br /&gt;Jarc&gt; (getTime (new java.util.Date))&lt;br /&gt;1268254080703&lt;br /&gt;Jarc&gt; (getTime "foo")&lt;br /&gt;Error: Symbol 'getTime' has no value&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Even though there is no function &lt;tt&gt;getTime&lt;/tt&gt; defined,that function can still be called on a Date instance.&lt;/p&gt;&lt;p&gt;Jarc uses &lt;i&gt;dispatch on first arg&lt;/i&gt; to figure outhow to evaluate the method call.  This was suggestedby Paul Graham in&lt;a href="http://www.paulgraham.com/arcll1.html"&gt;Arc at 3 Weeks&lt;/a&gt;.Although Arc doesn't currently have &lt;i&gt;dispatch onfirst arg&lt;/i&gt; it is ideal for Jarc to access Java methods.&lt;/p&gt;&lt;p&gt;If you've defined classes in Python (or Perl), this may seemintuitive.&lt;pre&gt;&lt;br /&gt;class HelloClass:&lt;br /&gt;    def f(self):&lt;br /&gt;        return 'hello world'&lt;br /&gt;&lt;/pre&gt;That &lt;tt&gt;self&lt;/tt&gt; there is the first argument to the function.Even though you call the function as &lt;tt&gt;x.f()&lt;/tt&gt; what's happeningunder the covers is that &lt;tt&gt;x&lt;/tt&gt; is passed as the first argument.This same thing is happening under the covers in Perl and C++.&lt;/p&gt;&lt;h2&gt;Advantages&lt;/h2&gt;&lt;h3&gt;1. You can treat Arc calls and Java calls exactly the same&lt;/h3&gt;&lt;p&gt;Polymorphism, anyone?  Here's the Jarc macro &lt;tt&gt;with-open&lt;/tt&gt;,which is just like &lt;tt&gt;let&lt;/tt&gt; except that it also calls&lt;tt&gt;close&lt;/tt&gt; on variable.  It is slightly more complicated thenthat because is always calls &lt;tt&gt;close&lt;/tt&gt; even if there is an error.And it ignores any errors that might happen when calling &lt;tt&gt;close&lt;/tt&gt;.&lt;pre&gt;&lt;br /&gt;(mac with-open (var init . exprs)&lt;br /&gt;   `(let ,var ,init&lt;br /&gt;      (protect (fn () ,@exprs)&lt;br /&gt;        (fn () (errsafe (close ,var))))))&lt;br /&gt;&lt;/pre&gt;This is quite handy and ensures that your "stream" gets closed,both when it is an arc type:&lt;pre&gt;&lt;br /&gt;(with-open f (outfile "what.ever")&lt;br /&gt;   ...)&lt;br /&gt;&lt;/pre&gt;Where Jarc calls the Arc function &lt;tt&gt;close&lt;/tt&gt;,and when the "stream" is a Java object:&lt;pre&gt;&lt;br /&gt;(with-open db (java.sql.DriverManager.getConnection ...)&lt;br /&gt;   ...)&lt;br /&gt;&lt;/pre&gt;Where Jarc calls the &lt;tt&gt;close&lt;/tt&gt; method on thejava.sql.Connection instance.&lt;/p&gt;&lt;h3&gt;2. Java objects work with map&lt;/h3&gt;&lt;p&gt;No helper function(like memfn in Clojure) is needed to use Java instancemethods with &lt;tt&gt;map&lt;/tt&gt;.&lt;pre&gt;&lt;br /&gt;(map 'getTime '(list (new java.util.Date)))&lt;br /&gt;&lt;/pre&gt;Both &lt;tt&gt;map&lt;/tt&gt; and &lt;tt&gt;apply&lt;/tt&gt; accept a symbol(in addition to a function, of course) and interpret that asa Java method call.&lt;/p&gt;&lt;h3&gt;3. One less character&lt;/h3&gt;&lt;p&gt;And of course, since &lt;a href="http://www.paulgraham.com/power.html"&gt;succinctness is power&lt;/a&gt;, saving one whole character is an advantage as well.  Clojure requires you to type an additionalperiod.&lt;pre&gt;&lt;br /&gt;(.getTime (new java.util.Date))&lt;br /&gt;&lt;/pre&gt;Astute readers will know that succinctness is defined by the number ofnodes in the parse tree.  And the Clojure example above still has the samenumber of nodes as the Jarc version.  But the number of nodes is alsoa proxy for how hard it is to read the code.  Our brains have to processthe code too.  And I think parsing &lt;tt&gt;.getTime&lt;/tt&gt; requires parsingthe dot separately.  And it's not useful information.  Just like in Python,I don't want to be distracted with extra syntax to indicate that this isa Java method call.  It's just a function call and should be just as simple.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8740230010187295725-8261569006473289038?l=blog.fandle.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.fandle.com/feeds/8261569006473289038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.fandle.com/2010/03/java-access-syntax-from-jarc-less-dots.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/8261569006473289038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/8261569006473289038'/><link rel='alternate' type='text/html' href='http://blog.fandle.com/2010/03/java-access-syntax-from-jarc-less-dots.html' title='Java access syntax from Jarc - less dots, more filling'/><author><name>Jeffrey "JD" Brennan</name><uri>http://www.blogger.com/profile/13330772018679977636</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-8740230010187295725.post-7707194271474461339</id><published>2010-02-25T11:40:00.000-08:00</published><updated>2010-03-11T15:18:37.953-08:00</updated><title type='text'>Simplified s-expression XML (SML)</title><content type='html'>Have you ever finished something and released it to the world and thenalmost immediately afterward realized a way to improve it?  Well, thathappened with &lt;a href="http://blog.fandle.com/2010/02/using-s-expressions-instead-of-xml.html"&gt;my last blog post&lt;/a&gt;.I woke up in the middle of thenight and realized that I don't need the damn @ sign in SML.&lt;br&gt;&lt;/br&gt;This will work just fine:&lt;pre&gt;&lt;br /&gt; (tagname attr "value" attr2 "value2"&lt;br /&gt;   (tagname2)&lt;br /&gt;   (tagname3 "data"))&lt;br /&gt;&lt;/pre&gt;When parsing the SML if there's a symbol, it mustbe an attribute name, because the only other thingsallowed are sublists and strings.  That makes theformat a lot more readable.  I've updated &lt;a href="http://github.com/nex3/arc/blob/master/lib/sml.arc"&gt;sml.arc&lt;/a&gt;to use this new format.  &lt;br/&gt;&lt;br/&gt;It will also still acceptthe old format with the @ signs.  Might as well keep itbackward compatible.  I hope I won't wake up in the middleof the night again tonight.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8740230010187295725-7707194271474461339?l=blog.fandle.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.fandle.com/feeds/7707194271474461339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.fandle.com/2010/02/simplified-s-expression-xml-sml.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/7707194271474461339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/7707194271474461339'/><link rel='alternate' type='text/html' href='http://blog.fandle.com/2010/02/simplified-s-expression-xml-sml.html' title='Simplified s-expression XML (SML)'/><author><name>Jeffrey "JD" Brennan</name><uri>http://www.blogger.com/profile/13330772018679977636</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-8740230010187295725.post-2834719810460685631</id><published>2010-02-23T17:57:00.000-08:00</published><updated>2010-03-10T12:41:29.226-08:00</updated><title type='text'>Using s-expressions instead of XML</title><content type='html'>Last time I needed to manipulate a large XML document Iremembered Paul Graham's comment in &lt;a href="http://www.paulgraham.com/diff.html"&gt;What Made Lisp Different&lt;/a&gt;that programs communicating with s-expressions is an idea recently reinvented as XML.I began to wonder if I could just use s-expressions instead of having todeal with XML.&lt;p&gt;&lt;b&gt;Step 0&lt;/b&gt;: Define an s-expression representation for XML.&lt;pre&gt; (tagname (@ attr "value" attr2 "value2")&lt;br /&gt;   (tagname2)&lt;br /&gt;   (tagname3 "data"))&lt;br /&gt;&lt;/pre&gt;If the attributes are optional, then thatrequires an extra token (@) to distinguishbetween attributes and the first nested tag.&lt;/p&gt;&lt;p&gt;If the attributes are not optional, then thatrequires an extra token (nil) when there areno attributes specified.&lt;/p&gt;&lt;p&gt;Most XML documents I've used have more tagswithout attributes, so I opted forusing @.  &lt;/p&gt;&lt;p&gt;Since @ can't be a tag name, if the first thing in thelist (after the tag name) is a list whose car is @ thenit is the XML attributes for that tag.I dubbed this representation SML (S-expression Meta Language).&lt;/p&gt;&lt;p&gt;&lt;b&gt;UPDATE:&lt;/b&gt; I came up with a &lt;a href="http://blog.fandle.com/2010/02/simplified-s-expression-xml-sml.html"&gt;simpler representation&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Step 1&lt;/b&gt;: convert XML to s-expressions.  &lt;br/&gt;This seems likea job for Perl.  It's great at manipulating data formats.So I wrote &lt;a href="http://github.com/nex3/arc/blob/master/extras/xml2sexp.pl"&gt;xml2sexp.pl&lt;/a&gt;which works great.&lt;/p&gt;&lt;p&gt;But it seems like a hack because theremight be some XML syntax that it doesn't handle.  XSLTwas designed for transforming XML so it'sa good choice for this also.  So of course, I did someGoogling and found this &lt;a href="http://www.koders.com/noncode/fid76B669503E38A693C94ED645574280F47BFC0203.aspx"&gt;xml2sexp.xsl&lt;/a&gt;, but it's not complete.  It can't even convert itself.So I decided to write my own.  Yikes! Now I'm back to writingXML, which I was trying to avoid!  I can't think of a programminglanguage that is more unpleasant than XML.  But it was a chanceto learn XSLT, so I wrote&lt;a href="http://github.com/nex3/arc/blob/master/extras/xml2sexp.xsl"&gt;xml2sexp.xsl&lt;/a&gt; too.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Step 2&lt;/b&gt;: Convert SML back to XML.&lt;br/&gt;Now I'm in the Lisp world, so I can use my Lisp of choice,which happens to be &lt;a href="http://arclanguage.org/"&gt;Arc&lt;/a&gt; at the moment.  So I wrote an Arc library,&lt;a href="http://github.com/nex3/arc/blob/master/lib/sml.arc"&gt;sml.arc&lt;/a&gt;,to convert SML back to XML.  There's also a function to pretty-printthe SML, since the SML created by the conversion from XML ispretty ugly SML.&lt;/p&gt;&lt;p&gt;Adios, XML! I'll never need to deal with you again.  I canjust use SML whenever I need to work with XML files.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8740230010187295725-2834719810460685631?l=blog.fandle.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.fandle.com/feeds/2834719810460685631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.fandle.com/2010/02/using-s-expressions-instead-of-xml.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/2834719810460685631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/2834719810460685631'/><link rel='alternate' type='text/html' href='http://blog.fandle.com/2010/02/using-s-expressions-instead-of-xml.html' title='Using s-expressions instead of XML'/><author><name>Jeffrey "JD" Brennan</name><uri>http://www.blogger.com/profile/13330772018679977636</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>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8740230010187295725.post-1204311159122640667</id><published>2010-02-22T14:10:00.000-08:00</published><updated>2010-02-22T14:15:52.386-08:00</updated><title type='text'>Arc (Jarc) or anything as a scripting language</title><content type='html'>I'm testing the hypothesis that Arc could be used as a scripting language. I'm using Jarc, my own Arc interpreter, of course. This is easy on OS X because the execve() system call accepts any number of arguments. So I can start a script with&lt;br /&gt;&lt;pre&gt;#!/usr/bin/java -cp /usr/local/lib/jarc.jar jarc.Jarc&lt;br /&gt;&lt;/pre&gt;But it doesn't work on Linux since the execve() system call only accepts one argument. :-(  So I wrote a little C program, which was fun since I haven't written any C in over a decade at least. So now I can do&lt;br /&gt;&lt;pre&gt;#!/usr/local/bin/jarc&lt;br /&gt;&lt;/pre&gt;And voila! I can write scripts for Linux too. You can read the whopping 26 lines of &lt;a href="http://jarc.cvs.sourceforge.net/viewvc/jarc/jarc/c/jarc.c?annotate=1.1"&gt;jarc.c&lt;/a&gt; if you are interested in the not so fascinating details. Yeah, it'll probably need to be enhanced so I can pass JVM args also. But I haven't needed that yet, and I'm on a write-it-when-you-need-it regimen.&lt;br /&gt;&lt;p&gt;The other ugly bit is that I actually had to change the Jarc parser. Of course, this is the great thing about writing your own language implementation---you can change whatever you want!  Jarc has to ignore the first line of the file. So it treats # in line 1 column 1 as a comment character. Yes, I could have had jarc.c make a temporary file without the first line, but that seems inelegant, though much more general purpose. So this requires the latest Jarc (version 2) which I released last week on &lt;a href="https://sourceforge.net/project/showfiles.php?group_id=149398"&gt;Jarc SourceForge download page&lt;/a&gt;. Now whatever will I do with it?&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8740230010187295725-1204311159122640667?l=blog.fandle.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.fandle.com/feeds/1204311159122640667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.fandle.com/2010/02/arc-jarc-or-anything-as-scripting.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/1204311159122640667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/1204311159122640667'/><link rel='alternate' type='text/html' href='http://blog.fandle.com/2010/02/arc-jarc-or-anything-as-scripting.html' title='Arc (Jarc) or anything as a scripting language'/><author><name>Jeffrey "JD" Brennan</name><uri>http://www.blogger.com/profile/13330772018679977636</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>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8740230010187295725.post-1653379915786997124</id><published>2010-02-11T11:37:00.000-08:00</published><updated>2010-03-10T12:38:47.515-08:00</updated><title type='text'>Working for myself is a pain in the back</title><content type='html'>My first challenge as president and factotum was a pain in the back. After only a few hours at my desk I was hurting.  Day after day!  Yow!  I've worked a desk job for decades spending half a day (12 hours) at my desk.  But suddenly my new desk was leaving me twinging after a few hours.  &lt;br /&gt;&lt;br /&gt;The chair height is right, the desk height is right. I finally realized the problem was that the chair doesn't fit under the desk far enough.  So I was leaning in to type, hence not sitting up straight, hence pain.  Simple fix&amp;mdash;remove the middle drawer.  Ah. Now I can really work. Yea!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8740230010187295725-1653379915786997124?l=blog.fandle.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.fandle.com/feeds/1653379915786997124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.fandle.com/2010/02/working-for-myself-is-pain-back.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/1653379915786997124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/1653379915786997124'/><link rel='alternate' type='text/html' href='http://blog.fandle.com/2010/02/working-for-myself-is-pain-back.html' title='Working for myself is a pain in the back'/><author><name>Jeffrey "JD" Brennan</name><uri>http://www.blogger.com/profile/13330772018679977636</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-8740230010187295725.post-6261824222879705452</id><published>2010-02-01T18:55:00.000-08:00</published><updated>2010-02-03T16:02:57.969-08:00</updated><title type='text'>Working for Equity</title><content type='html'>In 1992 I was hired by a small (5 person) startup.  Shortly after it went public in 1999, my equity in the company was worth more than all the salary I had earned there.  Wow! Unfortunately, most of that equity disappeared in the dot com bust.  But I did learn about dollar cost averaging and diversification.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In 2001 I joined another (10 person) startup company.  After 8 years there, my equity stake was also greater than my years of salary.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So now I'm emboldened to forgo salary for a while and just work for equity at my own (1 person) company.  Incorporation (e)paperwork was submitted today.  I now have no salary.  In this blog I'll share with you all my adventures in working for equity as I build a web site to make it easy to find all the live performances of your favorite bands.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8740230010187295725-6261824222879705452?l=blog.fandle.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.fandle.com/feeds/6261824222879705452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.fandle.com/2010/02/working-for-equity-day-1.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/6261824222879705452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8740230010187295725/posts/default/6261824222879705452'/><link rel='alternate' type='text/html' href='http://blog.fandle.com/2010/02/working-for-equity-day-1.html' title='Working for Equity'/><author><name>Jeffrey "JD" Brennan</name><uri>http://www.blogger.com/profile/13330772018679977636</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></feed>
