Adding an Ubuntu Unity Menu Link for IntelliJ

It’s pretty simple to add a menu launcher link for anything in Ubuntu.

Just make a file with a “.desktop” extension and then edit the file so that it has the pathing for the image file (48 px seems to be the size to choose) and the executable.  Here’s my intellij.desktop file contents:

#!/usr/bin/env xdg-open
[DesktopEntry]
Version=1.0
Terminal=false
StartupNotify=true
Icon=/home/bil/apps/intellij10/bin/idea_CE48.pngName=IntelliJ 10Exec=env UBUNTU_MENUPROXY=0 /home/bil/apps/intellij10/bin/idea.sh

Note the Icon line is a single line but doesn’t fit in this blog format.

I like to keep the file in the directory with the application folder, same level.

Now just drag the file to the Unity bar, and there you go.

My Linux Experiment: Month 1

OK so I decided to set my Linux OS experiment in motion.   I researched notebooks and settled on an HP Pavilion and it will have Unix installed as the primary OS.

I’m a developer.  And I do not know anyone who uses Linux as their workstation OS.   But I’m going to try it.

Decision

I do really like the Macs, but I got a more loaded machine from HP for $1100 compared to the $2100 tag on Apple’s current top of the line 15-incher.   Lenovo put themselves out of the running because they continually put that stupid textured trackpad on their Thinkpads; they annoy my fingers after an hour of use.  I hate it.  It’s too bad because except for that, I probably would have ordered the Thinkpad its one of the few machines I think is aesthetically more cool than a Mac.  I prefer the functional look of the Lenovo to the HP but usability is of course a factor – I have to be able to use it without physical discomfort.

Now while I have a bit of regret about not buying another Mac (I am typing on one now) there were a few things that put me off about them; I think its the locked in attitude (like adding your own ram is more difficult due to proprietary screws; ever update a JDK on a Mac??  ouch) and the much extra cost to hook up two monitors (this machine will funtion at home as a dev workstation).   Also, there’s a “exclusive” design/you aren’t cool thing with a lot of Mac owners, compounded by the fact that their Foxconn manufacturer in China has its workers sign a non-suicide pact.

HP struck a nice balance with the features and cost and gave some good service years back as well.  I’m NOT their whipping boy, they just happened to put together what I would like.  Other runners up were Alienware (a little over the top looking, heavy and power hungry) and Asus (I just didn’t like the form factor — but I do own a netbook its rock solid).

Now The Linux

I’ve been trying two different distributions:  Ubuntu 11 for about 2-3 months, and recently Mint 11.   I am still deciding.

Mint is a lot like Windows.   It is very very user friendly.   But I am not sure I enjoy the look of it so much and, being a power user, fell a little bit farther back from the OS than I’d ike.   it is however Ubuntu underneath (support is a question for me before I commit as well).  I’ll leave it on my old Compaq for now.

Right now I am leaning towards Ubuntu 11.  I like the top-side menu bar, the launcher, and feel close to what’s underneath.  Everything I use works on it.

One thing:  Linux cannot run Netflix because it does not support DRM.  this is SO annoying; I tried VMWare is a Chrome OS image but Chrome OS is so annoying I won’t do it.  So I may either be dropping Netflix or making a Windows image.

————

So that’s it, we’ll see.  My main apps:  browsers, Eclipse, Sublime Text, Tomcat etc. all run on Linux easy.   Libre office will be an adventure, but so is “Page.”

My plan is to test it for 9 months to 1 year, and if it works, great, if not, switch back to Mac or Windows.

Why am I doing this?  Because Windows pissed me off, Macs are too expensive for what they deliver and I like to work in a terminal.  So there.

Finally Sick Of Windows

For along time I’ve been a proponent of Windows, mostly because it has a nice file system navigator and is highly and easily configurable.  For instance, putting several versions of Java, or even a new version of a JDK on a Windows machine is quite simple compared to the major hoops you have to jump through to put it on Mac or Linux.

But the last two newer machines, and my older XP notebook finally pulled the last straw.  WINDOWS IS SLOW.   Plain and simple.  It constantly needs updating, it updates when your turning it off and updates when you are starting it up.  The waiting is excrutiating.

On top of it the current an last places I worked at loaded encryption software on their hard drives; the Mac people didn’t have to face this.  So deploying a WAR file to local Tomcat that takes 30 seconds literally could take 10-12 minutes.

No More Windows for me.

Plus there’s that little mac feature of close the notebook, open the notebook (which also seems to work for Linux) — the usability of an immediate on OS can’t be understated.  And I love it.

We are in a world of a new battle for OS’s.  Android could possibly be the next big OS.  Chrome OS is a great answer to a lightweight featured user OS on lesser hardware.  mac is merging a lot of its OS’s together to solidify user experience.   Asus makes machines with two-second boot buttons running Linux.  So that world, compared to Windows 7, loaded with McAffee and PGP and a thousand UI enhancements I don’t need, sloooow enhancements.  Well for a power user and developer like myself its a no brainer:  No More Windows.

I loaded Ubuntu 11 desktop on this notebook I am typing on; the install accommodated dual-boot very easily.  It’s fast as hell, running solid.   It has nice UX built in.  All my programs, save one, run on it.  I can close it, open it, close it, open it.  What’s not to like?

My next notebook — when they release a quadcore ultra book that can take 8-16 gigs ram — will be running Mac OS or Linux.  I’ve already decided.

 

 

Pondering Poor UX

It’s kind of hard to believe these days that poor user experience that can hinder your website would be developed and deployed.  But it happens — all the time.  Its just a testament to how difficult UX is to understand.

Recently I was on an artificial sweetener website.  I could not, for the life of me, find their products.  Across the top menu  they had “About Us, Lifestyle, Recipes, Community”.   Nothing, NOTHING on the home page to list the products.   I was forced to change a page and scroll down to find a category called “products.”  And it was listed third in that page menu on the left!

The site’s retail home page literally did not have a link to its own product list.

I see this all the time.  Now, while I am no UX expert, I do consider my self an expert use-er.   It means, I know what I want when I go to a site and if I am overly inconvenienced I bail out.

What  causes this?  Having sat on a few of the meetings with people who uh, design this stuff (usually I’m just working on the engine code so I get no say) I observe this:

  • No talent to design.  Serious.  Design is measured subjectively so often, this always slips by.
  • Failure to understand the user.  Usually this manifests itself by the application team using their domain language in meetings, thinking the user knows the same domain language.  They do not.
  • Too complex.  It may be a designer, a pm, or a developer but they want to flex their technical muscle.
  • Failure to understand the mission of the company.  That’s right — what the hell are you trying to do with the site?

There are some ways to get around this, a few solutions:

  • AB testing for your pages.
  • Full blown web analytics.
  • An experienced UX team AND you listen to them.
  • A good set of missions statements/grounding for the project team.

That’s just a few.

These days companies are trying to re-invent the user experience,   Personally I think it fails more often than not.   One redesign I would be curious to see stats on is Target’s new site.  Personally, I think it was a step back, and, it loads very very slow and you have to scroll like a madman on the home page.   I think they were trying to get away from the standard, Amazon, but sorry that pattern is laid down.  People like it, it works.

A site years ago, Campmor, used to have an almost Craig’s-list appearance.  It was unique in that you could drill and filter to products quickly.   They “updated” and made it Web-2-oh-ish.   And I stopped shopping on it; the site was too difficult to navigate and required a ton of clicks; I couldn’t do my visual scans on a ton of say sleeping bags like on the old site.  It became useless.

This is just retail but like well designed clothing, a well designed site is difficult to find.  I find the mobile sites interesting because they FORCE a team to be practical.  Maybe that’s the place to start before trying to predict behaviors that don’t exist.

 

Is X11 the new Flash for Apple?

So on Labor Day I decided to sit back, relax and try out some new fat install wiki software.  I like to use Zim but after messing around with Microsoft One Note which is stupendious I am really dying for something that would let me paste in images without a lot of work.  I looked and settled on vetting KeepNote and RedNotebook.  My requirements:  cross platform local wiki.  Anyone who know me knows I work in the big three environments at any given time: Windows, Linux, Mac  and being an application user, not an OS frek, I like cross platform stuff like Eclipse.  JEdit still hasn’t passed my test, since Notepad++ on Windows and Textmate or ANYTHING ESLE on Mac are superior in performance.

MacPorts Purgatory

So its time to install KeepNote and RedNotebook.    Interestingly enough they are both Python applications, run in X-Windows.  Of course there’s no .dmg for a Mac install. OK, so that means I can install them via Macports.  Simple . . . .

I start the install with a MacPorts selfupdate.  Takes about 20 minutes.  Upon installing the new wikis I get missing python library errors.  Then I get python version errors.  Apparantly python 2.6 is conflicting with 2.7.  One of the wiki instructions says uninstall Fink (another packaging tool for Mac).  Christ.  I do some fixes and now py27-nose won’t load.

As I get farther down the road, i decide to do a full clean and self update for MacPorts.  It takes 3 effin hours to re-download and build everything.  Then I start getting perl errors.  More versioning errors.  So I remove all the perl versions and get the “right” one in, another 45 minutes.  We’re up to about 5 hours of time now.

Perl is good now, I get errors install the GTK libraries.  More dicking around with MacPorts.  Finally, I get an install.  Total time has been 6 hours — but its not over!

8 total hours to update all my libraries to install two python applications on my Mac.  Talk about productivity.

When I fire up the apps X11 pukes, throwing a terminal error.  A couple of Googles later I have update to the latest latest pathc of Snow Leopard and install a special X11 dmg package form the open source site.

Irony

Finally!  They’re running!  A few errors but I can run both KeepNote and RedNotebook.  But guess what?  THEY LOOK AND BEHAVE JUST LIKE FRIGGIN ZIM!!!

That’s right, except for image pasting the icons, everything are just the same Python UI pieces and the applications aren’t even as good as Zim for what I need.  Jeez.

X11=Flash With More Tenacious Developers

You know, I don’t think Steve Jobs wants anyone running X11 applications (like Gimp or my wikis) on a Mac.  Apple is notorious for controlling is UX; for instance the banning of Flash off its iPhone platform.  X11 is an open source project for Mac to run the dang X-Windows apps on the mac, which is basically running over a Next core.    But Jobs, I am guessing, doesn’t want it.  Or whoever is ruling Apple now.

The Modern Developer

Having been in a lot of modern shops and talking/interviewing some olde skool java developers I realized there are some tools that are advantageous to being a modern developer and being more productive.  Here they are:

1.  Own your OWN notebook development computer

You need to own your own because it allows you to spike code and try things out and most importantly the ability to KEEP WORKING even if your work computer is out for the count.

Own your own tools.  Auto mechanics do.  Doctors do.  Artists do.  You should too.

2.  Be Portable

Owning a notebook is a good start; better yet having a work-issued notebook.   You won’t be tied to your cube and you can do presentations and collaborate.

But don’t just stop there.   Reduce the amount of “work stuff” you need so it can all be carried in a single bag.  Practice working in other spots besides your cube, or work next to colleagues trying to establish patterns of productivity.  Sometimes a good set of headphones helps; but the big hump is gettng over that behavioral cube-pattern.

3.  Learn to Use your trackpad

I know a lot of people like to use full sized keyboards/mice but in fact, learning to use a trackpad allows you to be even more portable, light, and also learn gestures which are far more powerful than using a mouse.

4. Get a Smart Phone

For the short-term, minimally, future smart phones will be driving the UX industry.  Again you learn usability and gestures will will improve your development skills and insight as to how users may use the software you work on.

And you are a software developer.  Own the tools of the trade.

Enterprise Hosting At Home

OK that title is a not serious.

At my current gig we need servers; and I’ve been waiting for the bosses to make the deals to get some real server services.  It’s finally happening, but, its real slow — the handshakes, board room stuff all that.  I didn’t want to strap myself to a kluge solution, but since I see the light at the end of the tunnel I went ahead and pulled a solution out.

Here’s the need:  we need a QA server to allow the product owners/business to look at and test the websites we are developing before we deploy them.  Our current solution involves a week on a staging server before production and we do not control the deployments or data or anything.

Our sites are Java/Spring/Hibernate running on Tomcat with Afresco/MySQL.  Services for Java can be pretty expensive and time consuming to set up correctly, and I wasn’t about to pay for it myself.

First Solution spike: Amazon EC2.  It seems like a good solution but the business wouldn’t give me a credit card and some of the “free tier” services run out after a year — and then they start charging.  Plus the 10 gig limit is of no use to us for storage we have a ton of data and media. (Honestly, its expensive to do this for real we spiked our needs and were quite surprised.)

Second Solution spike: Google App Engine.  Nope — waaaaay to limited, good for proof of concept/RAD apps and that’s it (or Python).

Third Solution spike: VMWare.  Easy enough to set up an image but, would have to have business users install VMware and then obtain my 1 gig+ images.   Too complicated.

Fourth Solution spike: Portable Linux.  In the old days you could run a version of Linux in Windows — Damn Small Linux still does this.   But them as you know, you descend into distro hell trying to get everything configured on some weird Linux deployment.  Finally I tried QEMU with and Ubuntu iso — is worked but was sooooooooooo heavy and slow, and again the file izes were massive over a gig easy.

The Solution

I went home and saw a dusty old server tower sitting in the corner and decided that was it — serve it up from home.  I used to do this in the old days with another domain I have, before it became cost effective to have PHP sites hosted (like WordPress).  I used Zone Edit, which maps a static ip/domain name to the  dynamic IP you get from your DSL service provider (or whomever) and had a little daemon software you install on your local home machine (that has no static IP) that syncs the IP addresses should the service change it.

Setup:

  • Set up my server with my apps.  I set them on port 80 — even though Tomcat runs on 8080.  Just easier.
  • Made sure the server’s firewall wasn’t blocking anything.
  • Gave my server an internal static IP (although — could use the DNS server).
  • Opened port 80 on my DSL modem/router for the server’s IP.
  • Created an account at a site called No IP.  You can also still use Zone Edit but No IP has a better daemon software to run. This account maps the dynamic IP my DSL service gives me to a static IP and domain name for free — like “mysite.no-ip.net” or something.  So you have to create that domain, or you can also map an existing name to the static IP they give you (for a fee I think).
  • Installed and configured the No IP daemon on my server (Win/Mac or Linux!!!!)

Testing:

You can’t test inside your network for some modems because they do not allow loopback mapping — for me, if I went to “mysite.no-ip.net” I got the login for my modem on 192.168.0.1.  You need an outside line AND you can put the mapping in your lmhosts file.   In the old days with Zone Edit I used a dial-up Juno account to make sure it was running for real.  But in my case, I just used my Android phone and surfed on the 4g network (make sure you turn off local networking) to make sure the sites were up.

Also I installed TeamViewer on the server, my work machine and the app for my android phone.  TeamViewer (to me) is the next generation of VNC for remote machine access and management.  You have to pay if its for commercial — I’ll be taking the work site proof of concept offline soon — but its free for home/personal use such as the open source Grails things I have been looking to publish.

That’s it, you’re serving up from home, enterprise style.

 

Linux Tip: CPU Utilization – top

I use the top command when I want to see CPU usage and some other CPU stuff.


user@ubuntu:/etc$ top

Reminds me of a text version of the processes view in Windows task manager:


top - 21:56:18 up 1 day, 1:02, 2 users, load average: 1.12, 0.34, 0.25
Tasks: 134 total, 1 running, 133 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.7%us, 4.0%sy, 0.0%ni, 94.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 379840k total, 368436k used, 11404k free, 50188k buffers
Swap: 0k total, 0k used, 0k free, 191652k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
830 root 20 0 89360 15m 6600 S 3.0 4.3 0:43.89 Xorg
8646 user 20 0 46132 12m 9792 S 1.3 3.3 0:04.53 gnome-terminal
1246 root 20 0 5676 2848 2304 S 0.3 0.7 2:29.56 vmtoolsd
8837 user 20 0 2544 1216 928 R 0.3 0.3 0:00.19 top
1 root 20 0 2796 1640 1172 S 0.0 0.4 0:01.33 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
6 root 20 0 0 0 0 S 0.0 0.0 0:00.10 events/0
7 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuset
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 netns
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 async/mgr
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pm
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 sync_supers
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 bdi-default

It updates itself too. Oh yeah — ctrl-C your way out.

Careful With Your Time There, Code Slinger

So what do you do after paid hours?

Let me guess.  You code up web sites in Fortran on Rails because that’s the best language in the world;  you spend hours and hours at night figuring out the next cool thing for EJB 4 even though you’ve never done EJB before, or maybe you read blog after blog like Slashdot and Joel on Software and forums about Agile because you da man.

Me too.  Just wrote my first Frails plugin that takes dot matrix printer output and converts it to ascii.

No matter what you do, even if its something as meaningless as spending time with your family (remember I am a sarcastic beast), we all share one thing:  it’s OUR free time.  Not the company’s, and no one else’s.

I raise this point because I’ve noticed several times over the years in the industry that a lot of people looking for a code slinger aren’t good willed.  You have to remember:  the world is about sales, and you are a product.  Bottom line.

In the past years I’ve donated tons of time to companies, people, non-profs, and made estimates, code contributions, and set up old hardware to “save a buck.”   But the worst, the WORST thing that happens is when someone willingly misguides you to get free labor and expertise out of you.  And this happens quite a bit.  Us coders aren’t doctors but this is a lot like the free advice giving doctors cringe at.

One time there was a person at my job who wanted “help with a site” and made it sound like they were helping a friend.  Pretty soon they wanted to meet during work of all things to talk about it in meeting rooms, and since they came in early I heard from others this person was working on the site.  I gave about 8 hours then heard they might be billing and not telling me.  And had the audacity to say “I was in it for the money” laying a guilt trip — on a professional hack, um, I mean software engineer.

Imagine.

A few times at jobs I’ve been approached to help people “learn” a technology outside of work or flat out work on their business idea without being told it was that, or being offered partnership.

And how many Big Places want the type of employee that works “for free” — extra overtime because “you love your work”?   This especially has been a piece of contention with me because it literally breaks contracts (hour work for hour pay).

So I have a warning to the younger developers out there:  step lightly when committing your time.  Focus on doing a good job at work, enjoy being the junior and stay away from the time-wolves who want your labor for free.

If you would like a project outside of work, make sure it pays or that’s it has visible assets so you can use it on your resume.   And if you need to learn a new technology don’t leech onto people’s free time, learn it yourself.  Take a look at all the great developers around you and look at Gates and Jobs.   they did it outside the box on their own.  Just keep it in mind, that’s all.

Iterative Death March

I was watching some of my buddies on a project and they have been living in the bowels of hell.  They are on an Iterative Death March project.

A Death March Project classically defined is a nightmarish high risk, huge overtime/grueling work, looming deadline project. Oh, the horror.  You can read about it in wikipedia (Death March)  or in the book that I first remember telling me about this methodology — Death March by Edwartd Yourdon.

Iterative Death March is the agile version, but repeats itself every sprint and for the whole release.  The poor participants are doomed to live in hell over and over week by week with more mission critical deadlines.  It is much much worse than classic Death March technique, like having your head held underwater repeatedly.

I’ve been on a few myself.

The Problem

Iterative Death March is an agile style that is very common today.   If you read my post Agile Steamship Part 1, then you can see some of the causes.  But basically, for a developer, the experience is like this:

  • The project is at mission critical according to some higher-up and time is running out towards the deadline.
  • Hardly any requirements have been fleshed after months, MONTHS, have went by.
  • Technical expertise was never consulted, and there is no cross-team technical vision or architecture.  The same work gets repeated over and over.
  • There are plenty, PLENTY of PM’s who partake in daily blamestorming meetings.  In fact, before the actual work is done the framework for whom to blame (developers) is well architected and set into place.
  • Agile is dropped into place so that developers can be blamed more efficiently.  By making them put their names on tasks, they are now accountable.  But, none of the poor planning and inaction is tracked up to that point.
  • Bodies all over.  Tons of them.  People brought in off of projects.   People with knowledge are reassigned though.  new faces with no domain knowledge are brought in.
  • Due to the bodies the effective people’s productivity is reduce so they can train them, contributing to blown deadlines.
  • Bugs are logged on unfinished software before its released creating a faux backlog of yet more work in the way of actually accomplishing something.
  • Repeat.  Iterate in short sprints.
  • Meeting hell.   Developers never get more than 20 minutes of contiguous time to actually make the software.
  • Weekends, holidays, and evenings bled from peoples’ lives on short notice with the classic huge pre-release work spike common to many poorly executed waterfall projects.  Just on a nice, short time frame.
  • Scope on the agreed sprint work is changed mid-sprint making code bad and work lag even more.  The about face exerted on development efforts for multitasking like that is well documented and results in 30-60% inefficiency, depending on the circumstances (daily interruptions vs. multitasking on several things.
  • Attrition and apathy.
  • Less software.  Poorer quality.  Higher cost.

I have been there.  No thanks.  Al this crap is in the old Mythical man Month book (from 40 years ago) and still there are teams that don’t listen.

My Solution

Alleviating a management team that will do this to developers has made me no friends, because of a lot of reasons, but mostly because there are other forces like promotions and political power struggles going on outside of the project.  Frankly, its annoying.   But it can be alleviated by taking thee steps:

  • Make an accountability trail for everyone, this is the trust framework.  Culturally this is a huge move.   Trackable sharepoint for the BA’s and the PM deliverables WITH tech team signoff.
  • Bring tech leads in at the start
  • Plan to the point of paranoia.
  • Tech team makes a plan to build, and the PM does not control what’s in it at the tech level as long as it lines up with the business stories and the agreed time-boxed schedule.
  • If the dates can’t be hit, don’t hit them.  Nothing in the world is important enough to do a crappy job that does absolutely nothing good for the company while people’s lives are trashed.
  • Smaller, more expert tech strike teams.
  • No new faces during building unless absolutely agreed upon.
  • NO scope changes mid-sprint.   The sprint is an agreed contract between the coordinators (PM’s, business) and the people who know how to build the software (which the PMs and business do not).  Changing scope changes outcome, causes attrition.
  • Ruthless focus on the task at hand.
  • A well planned, sustainable pace.

Last Thoughts

I thought about my buddies on that Iterative Death March team, and some of the other personnel and the business unit and realized that the reason these types of projects come about isn’t because of the project itself, its because of the people.   That’s right — its PEOPLE who create a good or bad atmosphere.  We are the ones who fail or succeed at the planning, or the builds, or the scope management.

And that’s why my best jobs in my career, it was the people who made it great and not the work.  If the people are great the work becomes creative, inventive, and effective.

Hmmm.  Interesting.