Good Habits for Novelists and Independent Developers I

Saturday, February 12, 2011 Posted by

Many developers are best described as lazy.  Not lazy in the fat slob on a couch, eating potato chips while they don’t even throw enough effort into playing World of Warcraft, but rather they’re like lizards on hot rocks.  They will not move from a comfort zone, aim for elegant,  no maintenance solutions, and generally follow the cow road approach to development through a problem.

Never heard the way cow roads were built?  My grandfather explained the concept to me.  A road engineer, before there was a Civil Engineer’s exam, would drive a cow forward with harness and leads.  Up hills, through valleys, to shallow fording a river and through deer trails.  A cow you see, is lazy and instinctively chooses the way that uses the least energy, employs the best advantages of terrain to advantage.  But cows get stuck in briers, lose their way in the forest, have to be rescued by cowboys when a nasty storm comes up?  These are true, a Cow isn’t smart, a cow is simply wise when it comes to being lazy.  The cow may lead you astray, but typically if you can’t get a cow to move up a mountain, after driving him forward, and she keeps lying down, rather than moving forward, it’s time to get the dynamite out and blow a pass through the mountains.

Programmers subscribe to the cow metaphor.  Follow the herd and lay gravel and then pavement behind you in a smooth grade that people can work through.  Find cracks or problems in the pavement?  Patch it, feature enhance it, and move on.  Given the Pigs and Chicken metaphor of Agile development, I think that the cow metaphor is also appropriate, despite the Zen master focus many attribute to the modern Agile developer, the lazy cow is still Zen, still in keeping with the mentality of clean, re-factored code that reads easily.

The Novelist is no less a lazy cow than the developer.  They research furiously for the route to a good manuscript and a way to tell their story.  Their outlining is akin to the planning session, their mandatory writing sessions like the developer’s quiet hours, while they try to focus on specific projects and get the work done.  While often, a novelist might sit on his warm rock and bask in the completion skills and efforts they have, the good novelist knows that they have to constantly change, learn and adapt themselves to the market and the endeavors they choose.

I comment on novelists, only as an outsider looking in.  While I’ve written several novels, I haven’t managed to publish them yet.  I write at least 1750 words a day on one of them, typing furiously to complete this or that story in the twenty minutes I throw at them.  At 190,000 to 250,000 words per novel and 360 days of honest writing a year, that’s more than 2 novels a year worth of writing, but as any novelist, even an amateur might tell you, there’s fat to be trimmed and set aside or thrown away.

Software development, especially on independent and open source projects learns much from these good habits.  Writing 1000 lines of code in an hour is actually quite easy once you’ve outlined your problems.  Many writers write with a solid outline and I know few developers who write their best code without the framework.

Clean code, a book I can’t recommend and both fight with my dying breath enough, has many examples for building solid code.  Early on they talk about functions or methods having and doing only one thing well.  I’ve read writing books that talk about the elegant, short sentence that does a dozen things, but is a singular focus and idea.  I think clean code was talking about that sort of thing.  If you write a beautiful method, that joins 4 methods together, has no technical debt, had the JUnit written first, and has readable variables and functionality that transfers the knowledge of what it says and does to any developer in less than a second, then you have achieved that synthesis of code that novelists call their golden sentences.

I’m rambling…

How can I sum up my first post about this topic?

Good Habits for writers and Novelists:

  1. Set daily goals, for authors, at least 1500 words a day, for coders, make it a number of classes and or lines of code that at least amounts to an hour a day, every day, even on your birthday.
  2. Write small, cow road sentences or functions, that do a lot, with a little, plow through where you need to.
  3. Use dynamite when the problems are too big.  Ask for help, blow through your problems, get them done.

(Author’s note:  Some of my posts have been sitting in draft mode for several months.  I decided to release the last two, mainly because I commented about both of these as advice in the last week or so.  They’re not as polished as I’d like, but I’m hoping their serial nature will force me to come back and fix a few of these.)

The Business Side of Technology Contractors I

Saturday, February 12, 2011 Posted by

I like Contractors and many times I’ve loved being a contractor, but there are a few small things I’ve learned along the way that outline the Hustle of it all.

As a Contractor you’re an at will employee and the first on the chopping block should a company feel any financial strain.  For that reason, most contractors I know charge a high rate to cover for the lean times should they not have a job in place to quickly fail over to.  Fail over jobs could be an entire post, but the short and long of it is that while you’re working for one customer, you have to at least remain friendly if unavailable to the next set of customers and be prepared to do small weekend projects if they come up, to keep a modicum of good will.  You need to clear these side projects with your current employer, before you take the jobs.  I know this sounds rough, but the typical arrangement is, “Hey boss, you know I’m a contractor, I need to slide some work in next week for an old client.  It will be strictly weekend and night stuff,” and move on.  They can say no, but they have to weigh that against the eventual end of your projects and what they’d feel like if they couldn’t get a hold of you to finish a few things for them.  If they start out with a “No” it’s usually okay to mention the complexities of the contracting world, and move on.

This leads me to how much to charge.  At various times in the tech industry, there have been soft and there have been lucrative times in the technology market.  Competition has appeared from global sources. In the United States, where I live, there’s an old formula for figuring out an hourly rate.

For W-2 Employment the equation is, how much do you want to make a year, divided by 2000, and you get your hourly rate.

Want to make 200,000 a year?  100 dollars an hour will get you there.

Want to make 30,000 a year?  15 bucks an hour will make it work.

For 1099 Contractors the formula is a bit more complicated.  A simple conversion done by many is 16% greater than the W-2 rate.  This covers the 10% self-employment taxes and the 6% that the typical W-2 job pays for pitiful benefits.

Want to make 120,000 a year? divide by 2K, get 60 bucks an hour, multiply by 1.16 and you need to be charging 69.60 an hour to get close.  If you’re under 35, your garbage health insurance policy is 500 a month, not including family members, you’re paying 250 a month in disability and term life insurance(never to be discounted), and trying to squirrel some of this money away for the eventual lay off and/or transfer times.  Many Contractors find agencies, leagues or other groups to help provide insurance benefits.  While some folks can get group policies through their churches or civil work groups, I’m fond of Fractured Atlas a group I joined to support and promote some of my non-developer activities.  While I work to live in the technology sector, I do have those novels and screenplays in a drawer that I keep picking up, have a movie under my belt, and love my Bonsai.  Technology folks tend to have interesting hobbies and many of those hobbies have support groups or guilds that also provide access to decent insurance and benefits to help alleviate the costs.  As a larger note, contractors often should have a Liability policy, if they’re not being represented by a contracting firm.  The liability policy is not a sign that you’re weak and are going to mess up so badly they’re going to need to soak your insurance company for 2 million dollars to cover the hole.  It’s a sign to your employer that you mean business, and should you fail or flounder, you’re willing to pay for your mistakes and make things right, one way or another.

There’s hope though in the above configuration of benefits versus hourly rate.  Life and employers like round numbers when possible.  In negotiations, it’s best to chose numbers divisible by 10 and 25 for rates.  If 69.60 comes up in calculations, it’s usually okay to ask for 70 or even 75.  While it does not fully compensate for the level of quality collective bargaining provides, it does provide more money to even out the road.  That said, what’s better than 75 is 100.  Making 200,000 a year and spending like you’re making 120,000 a year is a great way to save money for lean times and grow your business.  Competition, however, will typically drive those numbers down.

The rate card, does not cover all instances, however.  Sometimes you need to charge for a piece of work, the installation of servers, migration to the  cloud, a redundant MySQL cluster, Data architecture modifications to prepare for a migration to or from PostGres to Oracle.  These are troubling bits based upon what the market will bear.  I like hourly rates, but if I’m leaving my programming comfort zone, and providing a framework of Java or PHP for someone to start their new company with, I like to shape the work and the money around what’s going on.  This part of bidding is more art than science, sometimes coming in at a little less or a little more than what the hourly costs would be.  A typical Spring framework, with spring security, a few portals and an adaptation for Jackrabbit, can run several thousand dollars, plus modification costs.  I might sell only one of these between Java Versions, so the work moving through and making the product both useful, feature rich and profitable depends on whether or not I had a specific customer paying for the initial development, or if I did the whole thing to keep my skills sharp.  In contrast, I’ve played with Grails several times now, but never managed to sell it even once.  I can’t go and charge the first guy on the block for 2 years playing with Grails, now can I?  I might make a bargain rate, hoping for more work and better days.

Well, I’ll probably add a few installments to this particular post.  Contracting is a rough, but rewarding business that has good times and rough times in it.  I know folks who will never settle down and those who have left the field in such disgust that they’ll never work for themselves again.  The back end is rife with accounting, bookkeeping, estimations and overall a drive to do good work and make it all fit together.

Dev Helper 2: The Windows XP box

Monday, August 9, 2010 Posted by

There are at least two main reasons I need a Windows XP guest to run in VirtualBox on my Desktop.

  1. If I’m running Linux, sometimes I need to run Windows software, like a MS-SQL server or Visual Studio to complete my work on a specific target that only works on Windows
  2. As Web development is one of my primary jobs, many times I need to test older versions of Internet Explorer, or even combinations of older versions of FireFox to insure cross-browser support.

Both of these can be handled in one easy Windows XP install.   Some might ask me, where do I get a Windows XP install, my install disks are old and worn out, or I’ve run out of licenses at home.  The answer here is actually that there’s rarely an easy fix, unless your workplace or you’ve kept a Windows XP license aside just for this occasion.  I purchased a license for XP nearly a decade ago, at retail prices when it came out.  This license still works, and I’m able to find install media for it through my MSDN license.  My MSDN also comes with licenses for installing test and/or development machines.  I use these sparingly as the licensing for these seems to be anathema to VirtualBox and virtual computing.

I create a new VirtualBox instance, install XP with my install media, license the machine, and then decide if I’m going to accept the windows updates based upon the testing I intend to do.  I sometimes take a snapshot of this install for a backup.  Be careful here to make certain you run only one valid license of Windows XP at a time.  There’s no reason to run afoul of your license agreement over this one, and as long as you load only one instance of your saved session at a time, you should be in good shape.  Once upon a time I’d keep saved instances at service pack 1, 2, and 3, but I urge you to stick to just 1 and 3.  It will save vital storage space and speed load times when you do need to test.  I do however, load a SQL Server 2000 and a SQL Server 2005 image and save them aside for work, moving forward.

Because I’m a strict conservationist on hard drive space, all of my Windows XP licenses use 4 GB hard drives and I vary RAM between 512 and 1024 MB.  While a GB of RAM can be helpful, and more can be better, XP was optimized in these ranges, starting out needing only 128 in the early days and then ballooning in size as things moved along.  Because I’m prone to have both a Linux guest and an XP guest running at the same time, along side other work, I prefer to keep this as small as possible.

There are a few programs I prefer to have on all of my WindowsXP machines.

  • 7-Zip: A universal and open source file compression utility, with both a command line and GUI client
  • FileZilla: A fairly robust GUI FTP manager.  Very nice, especially when I need to pass large files to the outside world.
  • Notepad++: A Gui text editor for when VIM just isn’t going to serve your purposes.
  • VIM:  A text editor recognizable to anyone whose been in Computer Science for the last two decades.  VIM works because Typing and the Keyboard are the most effective means short of plugging your brain into your computer, to get data in and/or out.  The Mouse is a wasteful, nearly brainless device that has enslaved you.  Repent your evil ways and embrace VIM.
  • SQL Server Management Studio:  This comes with a few strings attached with the developer documentation at MSDN.  There are a variety of ways to access this on the cheap or even free legally, but the best is if you have a legal SQL server, you have licenses to this development studio.  Use them wisely.
  • putty and the other putty tools(especially pscp):  Putty is a terminal access program for ssh, telnet and rsh.  The other tools assist in generating RSA keys, in moving files securely to servers via command line and a host of other little tools and tricks you just need to get through the day.
  • Cygwin:   I personally have a variety of tools I’ve helped compiled or have been compiled for me that make Cygwin a bit on the bulky and unwieldy side, but that package and the nonsense I have to go through to make it work are too troublesome for your average worker, and too long for this current article.  Cygwin helps the linux user bring to bear the many commands he/she already uses on a regular basis.  Cygwin works by giving you a Cygwin enabled terminal that you can run your commands within.

Now that I have my tools, I add my shared folders.  Exactly like my linux setup, I use the Work, Deploy, Longterm folders, mounted for share to my Windows Box.

An example work flow might be, I start a SQL server on my Windows Box, load a test DB, and then start my Jetty server on my linux shell that uses a JDBC connection pointed at my Windows Guest.  I do my primary development, testing with Chrome and Firefox(latest) on my main machine, and then test against IE 6 and an older Firefox on my WindowsXP slice.

Another example, I need to work on a Visual Studio C++ project on my Windows slice.  I check the code out to a work sub-folder, that’s effectively hosted on my main machine.  I complete coding and testing, and transfer the app and installer to my Deploy folder as part of my install.   I open a command prompt and pscp the finished file up to the QA server for testing, and then alt-tab over to Visual Source Safe or a simialr product, and commit my code.

All simple processes aided by a secondary host living resident on my machine.

The Joys of Virtual Box hosted, Dev helpers

Monday, August 9, 2010 Posted by

Virtual Box is a flexible, currently free, Virtualization environment not unlike VMWare or  Hyper-V .  If you’re a user of Windows 2007 Ultimate, you may have used a virtual copy of Windows XP, hosted locally before, VirtualBox is a similar solution and a similar tool to work through and try out.

Many others can give you a short tutorial on how to install VirtualBox and then install linux on that small server, but my short blog is about the tools you can then install on your VirtualBox in order to make it into an effective developer helper environment.

To that end, the above link will get Ubuntu up and running, and Ubuntu has an excellent repo install utility in apt-get, but I prefer the simplicity of the Yellow Dog Updater Modified, or YUM present on Red Hat Enterprise Linux, CentOS, and my favorite, Fedora.

Installing Fedora on VirtualBox is as easy as using the above tutorial and replacing the install medium with the most recent version of Fedora.  I typically give my resident operating systems a limited amount of resources to work with, not because I’m stingy, but because I like to run multiple Helpers at a time, so I can use some for Developer Testing and others for actual development and deployment.  You can change the RAM settings later, and if you’re sharp with Linux, you don’t need the GUI interfaces of Gnome to be able to use it, instead you use command line.

We live in a Windowsy world; in plain speak, Windows operating systems tend to be where we find our major IDE’s, our more widely popular Office suite and more software than you can typically shake a stick at.  I like to get as much RAM as I can on my Windows machine and then see what I can get away with in 1/2 a GB of RAM on my small Linux slice.  To that end, once I’ve got a terminal up for my small Linux host, I add in everything I’d need for normal web developer work.

yum install tomcat5 httpd mysql-server php java

Say yes to the installs, and you’ll get default locations and setup for Tomcat, Apache Web server, MySQL, php and Open Java.

I’m an old perl, awk and SED guy though too, and I want to get the best text parsing I can get.  I add in a compiler here as well.

yum install awk perl sed gcc

Now, I want to mount shared folders for doing my work.  I typically make three folders in my Documents directory on my windows machine, and then mount them as specific directories on my Linux guest.

  1. Work -  The Work folder is for text files I need to parse, including csv’s and other work that would be best handled by the superior command line tools of Linux.  I can’t tell you how many different times I’ve needed to edit up several lists of thousands of lines of text that I then wanted to break up into pieces, turn into excel spread sheets, and load into a database.  I mount a Work drive and make a soft link to it in my home directory for safe keeping.
  2. Deploy- My deploy directory has an apache and a tomcat or jetty folder within it, so I can not only drop deploy my work for quick test on my webserver, when I use the faster Java build times on my linux system, I can simply pull the wars, jars, ears, etc out of that folder for use in windows development, sending along through our Windowsy mail system or dropping onto Windows secured file shares that require a bit more than Samba can pull off to connect.
  3. Longterm- Is my last shared folder, mounted drive.  It’s a location where I put and file away my daily work that should be able to migrate between the two instances.  When work is finished it goes into a Longterm sub-folder that is named for the day I finished the work.  Folders are often named with Two letters for the name of the company I’m doing the work for (AC for ACME) followed by the full date format as YYYYMMDD (ex. AC20100807).  This gives me a simple sorting system in both Linux and Windows that lets me rapidly find my files.

An example work flow might be, I’m working on Flex in IdeaJ, my current working directory is called Project1 under the work folder.  Inside is my Subversion handled repo of code.  When I execute a build command from within IDeaJ, I have it use my build server on the small linux shell I’ve set up as my remote server.  The final process of my maven build script, dumps the war file in the deploy directory, and Tomcat or Jetty’s hot deploy solution is serving up my webapp to my local webserver.

Another work flow might be an excel spread sheet comes in with 10 tabs worth of massive data for me to crunch up and get to the DB ASAP.  Only problem is the file needs some massaging.  I save the file as pipe delimited from Excel, and massage the file with AWK and SED until I have a series of load files split into 10,000 line inserts into the DB.  I load them into my MySQL database from command line, then use the MySQL connector I downloaded from the website, to link the data elements of my excel spread sheet to my locally hosted MySQL database.

These are all specifics, but the key to this whole system is using the VirtualBox appliance and the installed Linux guest, as a way to get every advantage from working with linux and Windows simultaneously.

Simple tips in running Jetty on Linux

Sunday, August 1, 2010 Posted by

This is mainly just a short article to get me back in the habit of posting regularly. Recently, I’ve been working a bit with fine tuning Jetty, a light weight and configurable AppServer from Codehaus sponsored by Eclipse. Jetty gets production support from MortBay Consulting, who handle the heavy lifting for Codehaus. MortBay is also the developer of Jetty that was merged first with Webtide and finally with Intalio. Webtide, provides the training programs Mortbay founded with Jetty, and Intalio offers complete open source Cloud computing systems for businesses employing these tools. That’s about the end of my nod section.

Basic setup of Jetty is fairly simple. You unzip it into a folder, and then modify the JettyRoot/etc/jetty.xml file. You don’t need much here, and in fact jetty has a bunch of maven plugins and other companion tools from along the way, including integration with Cargo that let you deploy on the fly, but for my first tests, figuring out what the Jetty.xml file would do was kind of the first step.

David Yu was kind enough to give a full sample config file and then a walk through of it here.
My only issue with it, was that this was stand alone, self-documented configuration, and I rarely have something that works straight out of the box. To that end, I’m going to cite David’s file here and show my modifications.

I was dealing with a local server to start but planned on putting some beefy, database intensive apps, employing hibernate on here. To that end, I wanted to up the thread count. David’s first section lists them. Thread count pooling is one of those things I did primarily on the Java machine setup. Here, you just edit these lines here.

<Set name=”minThreads”>50</Set>
<Set name=”maxThreads”>500</Set>
Next you add the connector


<Call name=“addConnector”>
<Arg>
<New class=“org.mortbay.jetty.nio.SelectChannelConnector”>
<Set name=“host”><SystemProperty name=“jetty.host” /></Set>
<Set name=“port”><SystemProperty name=“jetty.port” default=“8080″/></Set>
<Set name=“maxIdleTime”>300000</Set>
<Set name=“Acceptors”>2</Set>
<Set name=“statsOn”>false</Set>
<Set name=“confidentialPort”>8443</Set>
<Set name=“lowResourcesConnections”>20000</Set>
<Set name=“lowResourcesMaxIdleTime”>5000</Set>
</New>
</Arg>
</Call>

As you can see, Wu has setup the typical Developer machine running on port 8080.  Tomcat defaults to the same port on initial setup, in part to avoid conflict with the web server like Apache that usually defaults to port 80.    But for this app, we’re going to let Jetty serve as the web server and the app server.

<Set name=“port”>80</Set>

Let’s remove the System call to the application command line that would have checked for a variable at runtime to change our jetty port, and just explicitly call the port we want as 80.

I’m also going to give this machine several IP addresses and later use the web app itself to determine some work, so I’m going to set the IP address to 0.0.0.0 so it will accept traffic from all IP’s on the box.

Change the host to this

<Set name=“host”>0.0.0.0</Set>

I plan on having a real SSL certificate on this machine, and want to use the default SSL port of 443 for my confidential port. There are two changes I need to make here.

First, I change this line to set my default port,

<Set name=“confidentialPort”>443</Set>

and then beneath the block I spelled out above, I need to add another listener.  So after “</Call>”

I add

<Call name=”addConnector”>
<Arg>
<New class=”org.mortbay.jetty.security.SslSocketConnector”>
<Set name=”Port”>443</Set>
<Set name=”maxIdleTime”>30000</Set>
<Set name=”keystore”><SystemProperty name=”jetty.home” default=”.” />/etc/keystore</Set>
<Set name=”password”>OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set>
<Set name=”keyPassword”>OBF:1u2u1wml1z7s1z7a1wnl1u2g</Set>
<Set name=”truststore”><SystemProperty name=”jetty.home” default=”.” />/etc/keystore</Set>
<Set name=”trustPassword”>OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set>
</New>
</Arg>
</Call>

I could set this up now and show you my passwords for my Secure cert, but let’s discuss what the next steps are instead so I can explain myself a little better.

That first section I did added an adapter that listens on port 80 of all IP’s the machine listens to.  The second section I added adds a listener that listens to port 443 and uses a keystore that actually comes standard with the mortbay version of Jetty.  If you have any problems on startup, with this mortbay connector, all you need to do is replace it with the Eclipse based jetty connector of the same name.  That was an interesting step in the documentation.  Many of the older versions of Jetty actually have two different major builds.  One that has eclipse objects and one with mortbay objects.  Check which one you’re using and configure accordingly.

Anyway, what the first Adapter did also was to declare that confidential communication received on port 80 should be redirected to port 443.  This ties into the Java web.xml page.

A good example of the security constraint configuration for web.xml can be found at IBM’s docs here.  Basically, you can add string matching constraints to services, types of requests or any other major communication flow of your application and direct them to either the CONFIDENTIAL port, or to the default port (port 80 for us) with the directive NONE.  You can litterally have dozens of these for your app, but for me, I just wanted to make certain that people coming to my loginServlet hit port 443 every time and on all requests.

Snippet for Web.xml

<security-constraint id=”basicloginauth”>
<url-pattern>/loginServlet*</url-pattern>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</security-constraint>

I’ll go ahead and tell you, the rest of Wu’s file, while filled with useful stuff about contexts, can now be left alone.
Next step, we need to change the context file.
goto your JettyRoot/contexts folder and delete everything in it.

Really, rm -f *.xml at the very least.  This stuff contains links to a bunch of test stuff, you’ll throw away later anyway, and only mucks things up for how simple we’re going to make it.

Now I want to make a simple context file that unwraps my superapp.war file from the webapps directory and serves it up after the root of my web address.

Make a file in the contexts folder called superapp.xml

and paste this into it

<?xml version=”1.0″  encoding=”ISO-8859-1″?>
<!DOCTYPE Configure PUBLIC “-//Mort Bay Consulting//DTD Configure//EN” “http://jetty.mortbay.org/configure.dtd”>
<Configure class=”org.mortbay.jetty.webapp.WebAppContext”>
<Set name=”contextPath”>/</Set>
<Set name=”war”><SystemProperty name=”jetty.home” default=”.”/>/webapps/superapp.war</Set>
</Configure>

Now, rename any old webapp you have lying around superapp.war, drop it into the folder and let’s see if we can’t get it running.

I already had Java running on my linux server, so my real concern here is getting this start.jar jetty gave me to load up the web server.

Here’s the command to run

java -jar start.jar etc/jetty.xml

and voila, point your web browser to localhost and look at your deployed webapp served there. If you have a loginServlet like I do in my app, point the host at localhost/loginServlet
Hey, looky there, we’re redirected to port 443 and we get a request to accept an unsigned cert. Well. That was a fairly short update, if any interest is shown, I’ll show you how to add a signed cert to the store and get Java to use the store.

Basic Security, Where are you going, where have you been?

Friday, March 26, 2010 Posted by

“Where Are You Going, Where Have You Been?” is a fairly famous story by Joyce Carol Oates. In it, Oates’ character Connie ends up being convinced to walk outside and go off with Arnold Friend and his companion. The story was inspired by the three murders committed by Charles Schmid, Schmid’s inspiration for the murder was supposedly he simply wanted to murder someone. Why am I spoiling your day with a tale of murder from the 1960′s and mentioning its literary connection to Joyce Carol Oates in a short blog about Password security? Because the struggle that character has with Arthur Friend, reminds me of all too many disasters with passwords.
Read the rest of this entry »

Don’t work yourself Sick

Friday, March 19, 2010 Posted by

Software development has for some time been a personal, introverted and lonely profession. Teamwork is essential to the modern development environment on large projects, but there are still lone wolves out there hacking out 10,000 lines of code an evening.

If you’re a developer, and if you aren’t this is still good advice, just not your metaphor, how many times, have you suddenly straightened your back and realized you’ve been starring and or typing for more than two hours straight? You’ve been largely motionless, extremely focused and blissfully unaware of the limitations of your body and spirit. You have been fixing things, making things and now you are suddenly aware of your bladder, colon, stomach, spine and eyes. It’s time to move and bend and be a human being again.

Read the rest of this entry »

Lessons Learned About Velocity Templates

Thursday, March 18, 2010 Posted by

Four different companies I’ve worked for used Velocity Templates. The technology isn’t a corporate secret, it’s a popular way to get that JSP/PHP style of template based development back into your Java. There are a few lessons I’ve learned from developing in Velocity that I’d like to share.
Read the rest of this entry »

Bonsai Scarification, Stratification, and Germination: Planting Bonsai from seed

Friday, February 26, 2010 Posted by

It’s been well over a decade since I worked for a small  nursery and helped grow and care for plants.  The care for trees, and specifically Bonsai is an ancient Chinese tradition, mastered by the Japanese, and extremely popular the world over.  One process that may need a bit of covering is one called the Scarification and Stratification of Bonsai Seeds, or growing Bonsai tree from seeds.

Read the rest of this entry »

Counter-Stalking

Friday, February 26, 2010 Posted by

Cyberstalking is illegal, well, it’s illegal on paper, but the laws on the books are too vague and the concepts too limited for most judges to understand.  Lori Drew is actually an example of a related concept or rather a subset of cyberstalking called cyber-bullying.  You see Lori Drew convinced a suicidal, former friend and playmate of her daughter, an underage girl by the name of Megan Meier, to kill herself after impersonating a young boy a little older than Megan.  The case was fairly cruel, the legal nebula around the actions were fairly vague, and only the related financial fall-out and public outrage really served to punish Lori for her crimes.

Read the rest of this entry »