David R. HeffelfingerSoftware Development Noteshttp://mail.ensode.net/roller/dheffelfinger/feed/entries/atom2022-05-31T09:53:37+00:00Apache Roller (incubating)http://mail.ensode.net/roller/dheffelfinger/entry/so_you_want_to_become1So you want to become an independent consultant?David R. Heffelfinger2013-10-28T23:51:51+00:002013-11-01T01:08:44+00:00
<p><p>I have been an independent consultant for almost 7 years. Last month I had the opportunity to speak at the JavaOne conference, I identified myself as an independent consultant, after my talks a few attendees approached me to ask how to go about becoming one. </p><p>The other day a former coworker found my <a href="http://www.linkedin.com/in/dheffelfinger">LinkedIn profile</a>, saw that I'm independent now and gave me a call asking for advice and guidance on going on his own.</p><p>Since there seems to be a lot of interest in finding out how to strike it out on your own, I'll write down about my experiences here, then in the future direct people to this blog post.</p><p>The first thing I'd like to clarify is that I live in an area where most software development work is contract work anyway. Another thing that I'd like to point out is that by the time I decided to go out on my own I was already a published author, that fact helped me market my services and obtain work fairly easily. Your mileage, as they say, may vary.<br /></p><p>When doing contract work, there are three ways to go about it. </p><p><b>W2, 1099 or C2C?</b> <br /></p><p>When hired as a W2, you become a temporary employee of the company hiring you. The client (your temporary employer) takes care of your tax deductions. There are also 1099 contracts, in which the company hires you as an individual, but you are not their employee, you are responsible for deducting your own taxes. The third way to do it is a Corp to Corp contract, commonly abbreviated as C2C. When doing C2C contracts, you need to incorporate a company, in this case the clients hires your company, not you directly.</p><p>Before I incorporated <a href="http://www.ensode.com/">Ensode Technology, LLC</a>, I was doing a lot of W2 contracts, since like I mentioned before the majority of software development work in my area is contract work . W2 contracts usually lasts from 6 months to a year, in rare occasions it can go beyond that. Since I had no job security anyway I figured that I may as well go all the way, start my own company and incorporate. </p><p><b>How do I incorporate my own company?</b> <br /></p><p>Incorporating a company is very easy. First come up with a name, google it to make sure it is not taken (by the way Ensode stands for <b>En</b>terprise <b>So</b>ftware <b>De</b>velopment). I incorporated Ensode Technology online and didn't even had to get up from my seat, if I remember correctly it cost me about $100 USD. </p><p><b>Getting a Business Bank Account </b></p><p>You need to get a business bank account primarily so that you can get paid. Your clients will be writing checks to your company, not to you personally. Any bank will be more than happy to help you open an account with them.<br /></p><p><b>Getting Insurance</b><br /></p><p>After incorporating, the next step was to get insurance, a lot of clients won't do business with you unless you are insured. I have liability insurance covering up to $1,000,000, it costs me about $500 a year.</p><p><b>Taking care of tax deductions</b> <br /></p><p>Lastly, I hired a payroll service to take care of my tax deductions, that sets me back around $85 USD a month or so.</p><p>Once you have incorporated your company, gotten liability insurance and hired a payroll service (this third step is optional, but I highly recommend it), you are ready to strike it out on your own, so the next question get asked a lot is:</p><p> <b>How do you get projects?</b></p><p>When your company has only one employee, getting contracts is not much different from the way most other people find regular jobs. You post your resume on a job board, and wait for companies to contact you, once you start talking about a potential job, you should let them know that you are only looking for C2C contracts.</p><p>So there you have it, as you can see striking it out on your own is not really that hard. Good luck in your new venture.<br /></p></p>
http://mail.ensode.net/roller/dheffelfinger/entry/spring_to_java_ee_migration1Spring to Java EE Migration Article, Part 3David R. Heffelfinger2012-04-04T21:25:35+00:002012-04-04T21:25:35+00:00
<p><p><a href="http://www.oracle.com/technetwork/articles/java/springtojavaee3-1569377.html">Part 3 of my Spring to Java EE migration</a> article series has been published.</p><p>This part covers how to tweak the NetBeans-generated JSF user interface and compares the Spring and Java EE versions of the Pet Clinic application. </p></p>
http://mail.ensode.net/roller/dheffelfinger/entry/ordered_a_sony_xperia_playOrdered a Sony Xperia Play from AmazonDavid R. Heffelfinger2011-09-04T13:04:35+00:002011-09-04T13:04:35+00:00
<p><p>Amazon has a deal going on for the <a href="http://www.amazon.com/gp/product/B004UBD066/ref=as_li_ss_tl?ie=UTF8&tag=ensode-20&linkCode=as2&camp=217145&creative=399373&creativeASIN=B004UBD066">Sony Xperia Play</a> for one cent (<span id="wirelessPriceFromValue"><span id="wirelessPriceFromPrice">$0.01) with a two year contract with Verizon Wireless.</span></span></p><p>I was already with Verizon and fairly happy with them, and my old Motorola Droid was starting to show it's age (the power button sometimes doesn't work, I have to press it multiple times to turn the phone on or off), so I decided to give it a go.</p><p> For those that don't know, the Xperia Play is the so called "Playstation Phone", that has a built in game pad and several exclusive titles. The XPeria play also has stock Android 2.3 (Gingerbread). I'm not a fan of Android skins like Sense UI and others, since having those skins make the phones harder to upgrade for the manufacturer, since they have to update their skins for every new version of Android.</p><p>As far as the Sony Xperia Play goes, I am primarily interested in getting a Stock Android Gingerbread device for 1 cent, plus it is a nice hardware upgrade for me. The fact that it has a built in gamepad and exclusive games is just gravy, at least it will give me something to do during my daily bus and train commute.<br /></p></p>
http://mail.ensode.net/roller/dheffelfinger/entry/kevin_mitnick_s_ghost_inKevin Mitnick's "Ghost in the Wires"David R. Heffelfinger2011-09-01T23:07:09+00:002011-09-01T23:28:00+00:00
<p><p>I just finished reading Kevin Mitnick's new book, <a href="http://www.amazon.com/gp/product/0316037702/ref=as_li_ss_tl?ie=UTF8&tag=ensode-20&linkCode=as2&camp=217145&creative=399369&creativeASIN=0316037702">Ghost in the Wires</a><img width="1" height="1" border="0" style="border: medium none ! important; margin: 0px ! important;" src="http://www.assoc-amazon.com/e/ir?t=&l=as2&o=1&a=0316037702&camp=217145&creative=399369" />, on my Kindle.</p><p>I remember learning about Mitnick by reading about him on <a href="http://www.slashdot.org">Slashdot</a> via the "Free Kevin" movement several years ago. </p><p>Mitnick's life story is quite interesting, and the book is full of several interesting anecdotes. </p><p>He explains how he was able to figure out a way to travel for free on the bus as a kid; illustrating how he had an ability for social engineering from a young age.</p><p>Mitnick then goes on to tell the story explaining how some friends from high school introduced him to phone phreaking, making long distance phone calls for free. <br /></p><p>He also tells a story on how he was able to defeat the security of the computer systems in the college he was attending, and how his professors asked him to secure the system as an "honors project" or face expulsion. </p><p>The book is full of several stories detailing how he was able to break into several computer systems, steal cell phone service, monitor phone calls (including FBI lines), obtain new identities and other clever and "less than legal" activities. Mitnick had an ability for social engineering, that is, he could easily dupe people into giving him information that he shouldn't have. He would call companies and pretend to be a coworker or customer, and more often than not he could convince the other person on the line to do something for him or provide some confidential information, including usernames and passwords.</p><p>All in all, <a href="http://www.amazon.com/gp/product/0316037702/ref=as_li_ss_tl?ie=UTF8&tag=ensode-20&linkCode=as2&camp=217145&creative=399369&creativeASIN=0316037702">Ghost in the Wires</a><img width="1" height="1" border="0" style="border: medium none ! important; margin: 0px ! important;" src="http://www.assoc-amazon.com/e/ir?t=&l=as2&o=1&a=0316037702&camp=217145&creative=399369" /> is a very interesting read, and very much worth it for anybody interested in computers or security.<br /></p></p>
http://mail.ensode.net/roller/dheffelfinger/entry/pdf_unlock_utility_tutorials_onPDF Unlock Utility Tutorials in YoutubeDavid R. Heffelfinger2009-10-09T00:36:53+00:002009-10-09T00:38:05+00:00
<p><p>Lately I've been noticing some referrals from YouTube in my server logs. Curious about it, I looked into it and turns out there is not one, but two video tutorials explaining how to use my free online PDF unlock utility, both of them in Spanish.</p><p> </p><br/>
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/NBuK7yojYpU&hl=en&fs=1&rel=0" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed width="425" height="344" src="http://www.youtube.com/v/NBuK7yojYpU&hl=en&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" /></object><br/>
<br /><br/>
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/teTsXk8SgYs&hl=en&fs=1&rel=0" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed width="425" height="344" src="http://www.youtube.com/v/teTsXk8SgYs&hl=en&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" /></object></p>
http://mail.ensode.net/roller/dheffelfinger/entry/ogling_android_phonesOgling Android PhonesDavid R. Heffelfinger2009-10-08T21:54:13+00:002009-10-09T14:30:43+00:00
<p><p>I'm a long time BlackBerry user, however for a while I've been tempted by the Android platform. The openness of the platform seems very attractive to me.</p><p> The other day I went to the T-Mobile store to try the <a href="http://www.t-mobilemytouch.com/">MyTouch 3G</a>, unfortunately I wasn't very impressed with it. The problem I had was with the virtual keyboard, the wrong letters would show up when I pressed most keys. I looked around online to see if this was a common complaint about the device, and couldn't find much about it. Maybe the unit I tried at the T-Mobile store was defective. Nevertheless, I figured the MyTouch's virtual keyboard would be a recipe for frustration, so I stuck to my BlackBerry Bold for the time being.</p><p>Browsing around the web I learned that Sprint will get two new Android phones soon. The HTC Hero, which got a <a href="http://blogs.zdnet.com/cell-phones/?p=2199">glowing review from ZDNet</a> is coming out this Sunday, October 1st. Based on the review I got really tempted to get one.</p><p>While doing some more research I also found out that another Android phone, the <a href="http://www.pcmag.com/article2/0,2817,2353966,00.asp">Samsung Moment</a> will be released on November 1st, three weeks after the Hero.</p><p>I've been researching both devices and at this moment I think I would prefer the Samsung, since it has a much faster processor (800 Mhz, vs 528 Mhz for the Hero) and a physical keyboard. It also seems to come with a more "Standard" Android OS, which I think would make it easier to upgrade the device with future versions of Android. </p><p>The Hero comes with "value added" software from HTC, which, although it may be very nice, it may make it harder to upgrade the OS in the device, if nothing else for fear of losing the HTC specific software. Other advantages of the Hero include slightly more memory (288 MB vs the 256 MB that the Moment has), and a 5 megapixel camera (vs the 3.2 megapixel that the Moment has). On the flip side, the Moment's camera has a flash but the Hero's doesn't.<br /></p><p>Both seem like very nice devices, but the much faster processor and the physical keyboard of the Samsung Moment, plus the apparent ease of upgradability of the Hero tilt the scale in favor of the Samsung device, at least in my book.</p><p>I also looked at Sprint's plans and they seem to have some good ones. I like AT&T's rollover minutes which Sprint lacks, however Sprint's data plan includes GPS functionality, which AT&T charges extra for; and live streaming video through Sprint TV, which as far as I know AT&T lacks. Also, with Sprint I can make and receive any domestic cell phone number from any carrier. Most of the calls I make and receive are to/from mobile phones anyway, so this is a big plus for me. <br /></p><p>I'll be dropping by my local Sprint store in about three weeks to test the Samsung Moment out.<br /></p><p><br /></p></p>
http://mail.ensode.net/roller/dheffelfinger/entry/preventing_trackback_spam_in_apachePreventing Trackback Spam in Apache RollerDavid R. Heffelfinger2009-04-12T14:39:56+00:002009-06-26T13:06:26+00:00
<p><p>This morning I woke up to find 150+ comments in one of my blog entries. I have email notification of comments set up in Roller, so the 150 emails notifying me of comments in my blog indicated that something was obviously not right.</p><p>I logged in to my blog to see what is going on, and sure enough, I had over 150 bogus trackbacks in one of my blog entries.</p><p>I googled around, and found a way to prevent trackback spam in Apache roller, going to "Main Menu", then clicking on "Server Administration", then checking "Enable verification of trackback links?" and "Enable referrer linkback extraction?" seems to have taken care of the problem.</p><p>Roller should really have those two settings checked by default.</p><p>Also, I noticed all the bogus trackbacks were coming from the same IP address (83.233.30.32). I googled around, and it looks like many others are having problems with spam from that IP address as well. Just to make extra sure, I dropped any incoming traffic from that IP by configuring IP Tables:</p><p><code>iptables -A INPUT -s 83.233.30.32 -j DROP</code><br /><br/>
<code>iptables-save > /etc/sysconfig/iptables</code></p><p>Hopefully the problem is taken care of for good. <br /></p></p>
http://mail.ensode.net/roller/dheffelfinger/entry/how_do_kids_these_daysHow do kids these days get started in programming?David R. Heffelfinger2009-03-15T12:40:20+00:002016-11-20T13:54:17+00:00
<p><p>Back in the 80's, when I was growing up, all personal computers would come with a <a href="http://en.wikipedia.org/wiki/BASIC">BASIC</a> interpreter which you could use to write your own software. As a matter of fact, it was expected for end users to write their own applications.</p><p>My very first personal computer was an <a href="http://en.wikipedia.org/wiki/Atari_800">Atari 800</a>, I was in my early teens when I got it, it was a hand me down from my uncle, who had gotten himself a shiny new IBM PC.<br /></p><p> <img src="http://ensode.net/roller/dheffelfinger/resource/atari800.JPG" align="baseline" border="0" hspace="0" vspace="0" /></p><p>During that time, computer magazines came with games and applications in source code form that you had to type into your computer in order to "install" them. A lot of us didn't know exactly what all these lines of code meant, but we wanted the game or application so we typed away, unfortunately typos were an issue, since we were just blindly copying what seemed like greek into our BASIC prompt. Fortunately BASIC was interpreted, so it would catch syntax errors immediately, but many times the syntax was correct, but there was still a typo in the line, making the program not run as expected. It could be frustrating at times, but it was very satisfying to finally get the code to work exactly right. You could also experiment and make little changes here and there to see if you could change the behavior of the software. I remember eagerly waiting for the next issue of <a href="http://www.cyberroach.com/analog/">A.N.A.L.O.G</a> magazine to arrive in the mail every month to see what goodies it would bring.</p><p>It is worth mentioning that at this time there wasn't yet a dominant computer architecture for personal computers. Some of us had Ataris (8 bit and/or ST), others had Commodores (PET, Commodore 64 or 128, Amiga), others had IBM PCs, other architectures existed as well. What all of these architectures had in common was that they all came with a BASIC interpreter. As a matter of fact, in most cases, the machine would boot directly into a BASIC prompt. The BASIC versions of the machines were not 100% compatible across one another, since vendors modified them to highlight specific features of their own products, but in general your BASIC skills could be used across architectures.</p><p>I remember been amazed at the wonderful things you could make these machines do, it got me really motivated to learn to write my own software, not simply blindly typing code listings from magazines. A lot of software developers from that era got our start that way, at the time, the barrier of entry for software development was very low. I derived a lot of satisfaction in creating software, I would proudly show my creations to my friends and relatives. All of these got me motivated to pursue a career in software development, which is what motivated me to major in computer science when I went to college.<br /></p><p>Somewhere in the 90's most of these various architectures disappeared, and the one true personal computer platform emerged, the IBM PC, or what we simply call a PC today. Just like all the platforms of the time, the IBM PC came with a BASIC interpreter, but unlike the others, BASIC wasn't built into the operating system, it was something you had to look for if you wanted to use it. When the PC became the de facto standard, the focus of having end users as programmers started to decline. Magazines stopped coming with BASIC listings for you to type in. When DOS 6.0 came out, PCs even stopped coming with a BASIC interpreter altogether. Now if you wanted to develop software, you had to install a compiler or interpreter yourself, which, sadly, is still the case today.</p><p>So I wonder, how do new generations of software developers get their start? It is not as easy to "get your feet wet" these days like it was back in the day. I wonder if they pick computer science without knowing exactly what they are getting into? It's a shame that software development is not as accessible as it once was.<br /></p><p> <br /></p></p>
http://mail.ensode.net/roller/dheffelfinger/entry/openoffice_documents_version_control_withOpenOffice.org Document Version Control With MercurialDavid R. Heffelfinger2009-03-08T15:29:30+00:002009-06-26T12:50:37+00:00
<p><p>I've always wanted to put my documentation under version control, just like I do with my source code. However, word processor files are binaries, therefore not that well suited for version control (track changes aside). Of course, they can be committed, however, being binaries they can't be diffed very easily.</p><p>Standard OpenDocument Text (the default format for OpenOffice.org Writer since version 2), are nothing but zipped XML files. I searched around for an easy, automated way to unzip them and zip them "on the fly" as necessary, thinking that i could put the "raw" XML files under version control. However, I couldn't find anything that would help in that regard. Manually zipping and unzipping files seemed like more trouble than it's worth.<br /></p><p><a href="http://www.openoffice.org/">OpenOffice.org</a>'s word processor, <a href="http://www.openoffice.org/product/writer.html">Writer</a>, allows us to save in formats that are text based, such as Docbook XML, Microsoft Word 2003 XML, and OpenDocument Text Flat XML (.fodt). I figured I could try to use one of these formats internally, since they are text based they would be "diffable" by Mercurial (or any other version control tool), then when I needed to distribute the document I could export to Word format, PDF or what have you.</p><p>I haven't had the opportunity to work with DocBook in the past, and I admit I've been kind of curious about it, so I tried this option first. Unfortunately it turned out I couldn't use this format since I frequently work with Word templates (even though I work with OpenOffice.org, word templates work fine in Writer) and it doesn't seem like DocBook supports them.</p><p>I then turned my attention to the OpenDocument Flat XML (.fodt) format, this format can work with word templates, and it is saved as a plain text (XML) file. It looked like the perfect solution. To test it out, I created a simple document, saved it as OpenOffice Flat XML, and committed it to a Mercurial repository. I then made a simple change to this document, and did an <code>hg diff</code> on it.<br /></p><p>To my dismay, this very simple change (I just added a new paragraph with a single sentence on it) resulted in quite a number of diffs between the two versions. Apparently this format contains a bunch of metadata such as creation time, creator, the time the file was saved, etc. This metadata was creating a number of diffs that were irrelevant to the task at hand, which is to find out what change I actually made to the file.</p><p>At this point I considered using the <a href="http://www.selenic.com/mercurial/wiki/index.cgi/HandlingOpenDocumentFiles">Handling OpenDocument Files</a> oodiff trick described in the Mercurial site, however this trick seemed to me more like a hack than a proper solution. When using this approach, files are checked in as binary, then when diffing, a tool called <a href="http://stosberg.net/odt2txt/">odt2txt</a> to convert the document to plain text "on the fly" then diff the plain text version. The problem with this approach is that the files are still commited to version control as binary, and most version control tools are not very efficient in storing binary files.</p><p>At this point started using the above trick, however recently I found the <a href="http://www.selenic.com/mercurial/wiki/index.cgi/ColorExtension">color extension</a> for Mercurial, which allows diffs to be color coded. After I installed this extension, I gave the .fodt format a try again, and I started to notice patterns of what to look for when looking for diffs. For example, paragraphs are nested inside a <code><text:p> </code> tag, this makes it easy to find text changes. Images are stored inside a <code><draw:image></code> tag, which makes it straightforward to see if an image was added, deleted or moved. Tables use the <code><table:table></code>, <code><table:column></code> and <code><table:cell></code> tags, making it fairly easy to identify them. This seemed like a good solution, however after a while I noticed that sometimes making a simple change in the document (for example, adding a heading somewhere in the middle), created a bunch of diffs on the document again, for example, lines that were now farther down in the document were being reported as deleted from one place and added in another, which is inaccurate.</p><p>For now, I went back to the oodiff trick, even though it bothers me a bit that I am checking in binary files to the repository, however this approach results in sane diffs that actually allow me to track what was changed in the document.<br /></p><p><br /></p></p>
http://mail.ensode.net/roller/dheffelfinger/entry/netbeans_book_now_available_fromNetBeans Book Now Available From AmazonDavid R. Heffelfinger2008-11-02T16:22:20+00:002009-06-29T12:01:14+00:00<p>It has come to my attention that my newly released NetBeans Book is now available through Amazon.</p>
<p><a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&location=http%3A%2F%2Fwww.amazon.com%2FJAVA-DEVELOPMENT-NETBEANS-DAVID-HEFFELFINGER%2Fdp%2F1847195466%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1225641232%26sr%3D8-3&tag=ensode-20&linkCode=ur2&camp=1789&creative=9325"><img alt="Java EE 5 Development With NetBeans 6 amazon link" src="http://images.packtpub.com/images/100x123/1847195466.png" /></a><img width="1" height="1" border="0" style="border: medium none ! important; margin: 0px ! important;" src="http://www.assoc-amazon.com/e/ir?t=ensode-20&l=ur2&o=1" /><br />
<a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&location=http%3A%2F%2Fwww.amazon.com%2FJAVA-DEVELOPMENT-NETBEANS-DAVID-HEFFELFINGER%2Fdp%2F1847195466%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1225641232%26sr%3D8-3&tag=ensode-20&linkCode=ur2&camp=1789&creative=9325">Java EE 5 Development With NetBeans 6</a><img width="1" height="1" border="0" style="border: medium none ! important; margin: 0px ! important;" src="http://www.assoc-amazon.com/e/ir?t=ensode-20&l=ur2&o=1" /></p>
<p>
It is also available directly from <a href="http://www.packtpub.com/java-ee5-development-with-netbeans-6">Packt Publishing</a>.
</p>http://mail.ensode.net/roller/dheffelfinger/entry/blocking_external_domains_pointed_toBlocking External Domains Pointed to Your IP AddressDavid R. Heffelfinger2008-10-07T22:12:29+00:002009-06-26T12:56:58+00:00<p>
Last night I realized some bozo decided to point his domain name to my site. I don't know exactly what he was thinking, or what benefit he could possibly get from doing so. The only thing I could think would happen is that all my content would have an exact duplicate in Google, and we all know Google doesn't like duplicate content.
</p>
<p>
I contacted <a href="http://www.eapps.com">eApps</a>,my hosting company, they contacted the owner of the intruding domain, and he refused to remove his domain name from my IP address. Tech support suggested I could set up an Apache rule to serve only my domains from my IP address.
</p>
<p>
I googled around to see how to go about this, but came out blank. Most issues I found were about preventing specific hosts to link to my site, which is not what I was trying to do. Once again I asked eApps support, and they came up with a solution.
</p>
<p>
I needed to add some rules to the Apache .htaccess file that would result in only my domains being served from my IP address:
</p>
<code>
</code><pre>SetEnvIfNoCase Host "mysite1\.com" local_sites
SetEnvIfNoCase Host "mysite2\.com" local_sites
Order Allow,Deny
Allow from env=local_sites
</pre>
<p>
Adding the above lines to .htaccess did the trick. The bozo is no longer serving my content from his domain.
</p>http://mail.ensode.net/roller/dheffelfinger/entry/i_can_t_fix_your1I can't fix your corrupted PDFDavid R. Heffelfinger2008-10-06T20:48:16+00:002009-06-26T12:58:00+00:00Just like I can't fix corrupted Excel spreadsheets, I neither can fix corrupted PDF files. By the way, if your PDF requires a password just to be read, I can't help you crack it.
However, if you can't copy and paste or print your PDF (but you can read it), I wrote an utility you can use to remove those restrictions: <a href="http://www.ensode.net/pdf-crack.jsf">http://www.ensode.net/pdf-crack.jsf</a>.http://mail.ensode.net/roller/dheffelfinger/entry/i_can_t_fix_yourI can't fix your corrupted Excel SpreadsheetDavid R. Heffelfinger2008-10-06T20:45:19+00:002009-06-26T12:57:37+00:00
<p>Since a while back I wrote a utility that can <a href="http://www.ensode.net/xls-crack.jsf"></a>, every now and then I receive emails from random people asking me to fix their corrupted excel files.</p>
<p>Well, sorry, I am unable to do that, good luck.</p>