Jake Of All Trades: CMTI's Jake Ochs


Dear Microsoft,

I am not an app developer, nor am I a market sage or pundit by any means, but here is what it would take for me to switch to a Windows phone.

I enjoy my aging Android handset. It’s slow, but it does the job. Apps are not as important to me as you’d think but there are some areas that I believe a focus on would help:

  1. Swype. The absolute must-have is Swype or an equivalent alternate keyboard. For all its goodness, I can’t for the life of me understand how iOS users put up with the bog-standard keyboard that they do.
  2. Rocking Gmail and Google calendar support. You can generalize this to top-notch email and calendar support across the board, but the ability to star Gmail or google app account emails is critical. I am also a huge calendar user and need solid read and write support for multiple calendars to even consider a switch.
  3. I am a dedicated Flipboard user, but I think you’re on to something with your hub approach. Make your news and people apps rock and third-party apps would not be an issue in this space. Note, they are good, but not great, check out Google’s Currents or the aforementioned Flipboard for functional inspiration.
  4. Mapping and Navigation need to be in the same ballpark as the Google offering. That includes turn-by turn and voice recognition support. I can’t tell you how many times my hiney has been saved by commanding my phone to “Navigate to x address” when driving somewhere I didn’t expect to be.
  5. Lastly, and this is the toughest to fix, is essential third-party support for apps that meet geo-specific needs. As a NY Metro area dweller, I need to have the NY Waterways app, for instance, to buy tickets when PATH is delayed. I need a Best Parking-type app for last-minute parking options and deals. My point isn’t that I need my favorite apps, but that I think some research should be done into targeting high-density urban areas and seeding the necessary apps for those areas. I suspect Seamless is another service that could use a Windows port in many urban areas.

I am intrigued by the good and difficult work you’ve done on UI differentiation. I also think your Office support is your killer feature, although I suppose an argument can also be made for Xbox integration. (I am not a gamer, so I have no experience in this regard.) For me, truthfully, Outlook’s support of alternate calendars has the ability to be the single killer feature that could drive acceptance for me. At some point, I’d like to pick up the developer mantle on Windows 8, but I have no immediate plans. Good luck, MS. I think the world needs a strong third mobile ecosystem.

by jake


skills wordle Note to folks interviewing for a senior developer position: I see you have been productively working as a consultant for quite some time and you have broad experiential knowledge. I respect that, coming from a similar background, really, I do! You are not interviewing for a consulting position anymore, though, with an esoteric and fleeting requirement that pretty much paves the way for a generalist. Even though you have a great breadth of knowledge, show me that you are an SME in at least one discipline that I have an expressed interest in. If I’m looking for a LAMP developer, show me that you are an 8 or above (on a scale of 1-10) as a front-end, PHP or MySQL developer. An additional tip: if you bill yourself as an expert in front-end, PHP or Java development, you MUST have SOLID knowledge of a framework. (I would extrapolate that to any discipline that is claimed in a resume: Imagine the absurdity of a Windows developer who doesn’t know MFC!) In the PHP world, this means Zend (usually for corporate positions) Cake or Symfony. In Java, Struts or (my preference) Spring. Front end developers pretty much need to have solid skills in jQuery/jQueryUI. YUI/Ext is acceptable and, for IBM shops, for goodness sakes, learn Dojo! Just billing yourself as an FE dev without solid knowledge of a Javascript framework just won’t fly anymore.

On the flip side: Employers grousing that there aren’t enough skilled developers to fill open positions, stop complaining and offer more money! If you can’t fill a position, you need to up the ante! For some reason, this basic economic truth is hostage to a wholly imaginary salary cap for developers in broad swaths of the technology industry. When the legal profession was heating up in the ‘90’s it wasn’t uncommon for starting associates to earn more than 2nd or 3rd years simply because the demand outstripped supply. I don’t recall hearing complaints that our education system was failing us by not producing enough lawyers.

On a personal note, thanks to my former manager for taking the chance on me as I made the transition from consultant to FT employment over a year ago. I probably failed the skill requirement I just set forth (although I was probably just fluent enough in jQuery to squeak by) but you took a chance on me and really set me on my FT path. I hope my simple guide will help others in my shoes make the transition.

by jake


So my current employer is on the migration path away from Notes. As I am no longer involved in Notes development work on a regular basis, this impacts me very slightly, although as a longtime Notes developer, proponent and –subjectively- guru, it does bother me on some level. Critically, I have to say that in design and implementation, there are some obvious issues that affect the user experience negatively. In no particular order:

  1. On my first day at my current position, I logged into my newly provisioned PC and fired up Lotus Notes 8.52. Yay! Wait, what’s this? An R7 mail template? How did that happen? I immediately asked desktop support to upgrade me to the latest R8 template they had available and within 24 hours was happily enjoying the benefits of the upgraded client and iNotes experience. Over the course of the next few weeks I would hear grumbling about Notes and would recommend to anyone to make the same request I made. What is unbelievable to me in this day and age is that an existing Notes infrastructure of several thousand users was running a vanilla Notes mail template and didn’t see fit to upgrade. Of course users would be unhappy with a late ‘90’s vintage mail experience! As an IBM account, who was responsible for post-sales follow up to make sure that the customer had reaped the benefits of their upgrade to R8 and would continue to be satisfied? Not being privy to whatever else went on, who wouldn’t be irritated at going through a client and server upgrade process only to see the same old Notes mail template interface? It’s like opening the door to your shiny new Bentley and finding a vinyl taxicab bench seat awaits you. There’s a big fat fail in this story somewhere and as much as it’s the fault of the customer for not properly following through,  IBM ultimately lost a customer.
  2. How do mail rules still suck so bad? Unless you are a programmer, the choices of rules you can apply are pitiful. Want to know what to do? Fire up Outlook or create a rule in GMail as a guide. That’s it. I still can’t create a rule for a subject line that begins with or ends with a string? Really? Ever try intelligently filing list mail while still seeing active conversations in your inbox? This isn’t rocket science, it’s a normal mode of email use and has been for, say, 2 decades now.
  3. the problem with stationary Stationary needs to go. I mean, it’s cute that you can change your picture and all, but noone really cares anymore and its not like email is this shiny new toy. Do people still need to have a rocket ship picture on their memos to show how avant garde they are anymore? What’s the problem? Try previewing a Notes email thread in vertical mode. See how useless the stationary makes the preview? I know, its really a rich-text issue and its the nature of the beast, I am (er, was) a Notes developer and I am well aware of the engineering choices behind what we see, but stop making excuses and make Notes conform to user expectations, which brings me to…
  4. Fix attachments. I know attachments are also artifacts of the Rich Text field and all its power, yadayadayada, but guess what? How many people expect to see attachments listed somewhere discrete in their email like its done in EVERY SINGLE OTHER EMAIL INTERFACE ON THE PLANET? I don’t care to see big fat attachment application icons sprinkled haphazardly over the course of an email and I bet most of you don’t either.
  5. Google calendar integration works, but only in a technical sense. I should be able to choose and differentiate between the multiple calendars in my Google account, not just suck them all in as one lump. Also, the parser is unforgiving. While that may be OK for Google its not for, say, Basecamp.
  6. Autocorrect in Outlook adds immeasurably to the professionalism of my emails, copy that.

The gist of what I’m getting to is that -irrespective of all the Notes platform goodness- the Notes client is lacking as a basic E-mail, Calendaring&Scheduling app relative to Outlook and Thunderbird. There’s more, but unless and until there’s some recognition that IBM is focusing on the obvious, what’s the point?

by jake


  1. isSomething = function(val) {
  2. if (val == undefined || val == null || val == "") return false;
  3. return true;
  4. };

Spot the problem? Give up? This JavaScript function is being used to test if passed objects contain (useful) data. But what about zero? is that useful? This function says not - passing a zero will result in a return value of false. Why? Because when comparing two objects using the == comparator, JavaScript uses implicit conversion. So a 0 == false comparison results in true. Now, you may want that implicit conversion, but most probably what you want it to not implicitly convert the compared values to comparable types. In that case what you need is the "===" operator (extra "=") . Try it in your JavaScript console: 0 === false evaluates to false while 0 == false evaluates to true. The corrected function should thus read:
  1. isSomething = function(val) {
  2. if (val === undefined || val === null || val === "") return false;
  3. return true;
  4. };

by jake
JavaScript


Just a quick return from the dead to point out Dare Obasanjo’s fantastic read – Learning from our Mistakes: the Failure of OpenID, AtomPub and XML on the Web. An insightful article that ring true to me through personal experience in each domain. Mind you, I still utilize all three technologies in useful scenarios every day and find them all to be elegant solutions to my specific problem domains, but I wholeheartedly agree with Dare’s conclusions. Enough blather, go read.

Coming soon: a long-delayed series on jQuery, jqGrid, AJAX, DWR and JSON. Enjoy LS11 and the warm weather in Orlando, yellow-bleeders!

by jake


Notes/Symphony plugin developers: Google has made all the tools of recently acquired Instantiations free. This includes the excellent SWT Designer, which is a RAD layout tool for SWT widgets. Details here. Have a great weekend.

by jake


If you are having trouble running your plugin apps in Eclipse after having upgraded your Notes client to 8.5.2 from 8.5.1, navigate to the desired run configuration and "select all" for the target platform category. Some new plugins were aded in 8.5.2 that weren't there in 8.5.1 and not selecting them prevents the Notes client from starting up from the OSGi console. Also, use Mikkel’s post as a checksum for your client configuration.

slect_all

by jake


The bane of my existence has been for quite some time the inability to get XDebug to work in a 64-bit Windows environment. I've had to resort to running my development AMP stack (Apache, MySQL, NetBeans) in either an Ubuntu x32 or XP 32 bit VM to work around this defect. Of course, I'd much rather not have to start a resource heavy VM to do dev work and this inability to step through a script on my native 64-bit desktop (formerly Vista, now -Halleluja!- Windows 7) always vexed me. I just revisited the issue and found that by copying and pasting the results of a phpinfo() page into XDebug's helper page  you'll get instructions on which .dll to download, where to put it, etcetera etcetera. Lastly, you'll want to follow the Netbeans wiki's instructions on how to configure XDebug, notably appending the following to php.ini:

  1. xdebug.remote_enable=1
  2. xdebug.remote_handler=dbgp
  3. xdebug.remote_mode=req
  4. xdebug.remote_host=127.0.0.1
  5. xdebug.remote_port=9000

Got all that? Next, fire up Netbeans, set a breakpoint and press debug. Voila!

by jake


That’s What Would You Do. I’d write WWJD in the title but I don’t want to offend…

 screenieI’ve been struggling to retrofit some pretty deeply nested Java code that was originally written implicitly as a Notes agent into the multithreaded environment of an Eclipse plugin. Specifically, I have a pretty long running thread that I’d like to be able to monitor the progress of in the UI as well as cancel interactively. Ordinarily, I’d write a Job that breaks the work up into units, emits a Status at the end of each unit and reschedules itself for more work. I would then be able to write a handler to respond to the status changed event and update the UI accordingly. It occured to me that this is not an optimal use of time as constantly completing and rescheduling an ongoing task that does some heavy lifting may take its toll on the overall speed of the task’s execution. More importantly, I’m not particularly interested in reworking the heavily object oriented and deeply nested code that performs the actual work. How would you approach the problem? (Read: chime in in the comments)

My solution was to keep a parent progress tracking object persistent in the Eclipse Activator OSGi object and create a Job Family. The family contains two jobs: the one that performs the work,  updates the tracker object and listens for cancel flags in the tracker as part of its work loop and a job that monitors the tracker object every second or so (I tailor the interval in a .properties file) and updates the progress bar in the UI when a change is detected. I also have a generic logging interface that was easily extendable to update the UI as well. When the job is done –either via completion or cancellation, i can simply cancel the job family to release the job threads’ resources. Now that I’m working in a plugin, I’ve taken care to collect all my Notes objects in a vector for eventual dispose()-ing as per best practices for a GUI that may persist for some time.

My biggest concern is that repeatedly calling Display.getDefault().syncExec(Runnable) each time a GUI event is fired is tedious, but I don’t see an alternative. Can anyone show me otherwise?

OFFTOPIC: I know Safari 5's Reader feature is essentially the same as Readability, but boy is it gorgeous! Check it out. (Still not enough to pry Firefox from its spot as my default, though.)

SHAMELESS PLUG: Kindly rate this post using the star system below and/or rate my authoring abilities on Scribnia.
by jake


Excuse me for the pedantic nature of this post, but I recently had an issue with developing a fairly complex agent for Notes coded in Java that caused me to revisit a basic understanding of how Java in Notes works. You see, the Java Virtual Machine, JVM for short, is essentially a stack-based emulator that runs bytecode compiled from the Java language source. Without getting into too much detail, the JVM has two memory pools to speak of, the stack and the heap, that can impact the performance and reliability of your Java program. The heap is where Java stores the expanding and contracting soup of objects any given Java program creates. Often, Notes Java programmers run into memory issues when calling too many native Notes classes from within Java, which merely reference native C objects. Not following best practices in ensuring that the objects are called as efficiently as possible and dereferenced properly can cause a program to eat away at the available resources assigned to the heap. (Best practices in this case being defined by the authority on the subject and originator of the Java Notes classes, Bob Balaban.) This is commonly referred to as a memory “leak” and will eventually cause the JVM to crash, if the program doesn’t terminate before the leak becomes fatal. Now, how this applies to my particular problem is precisely nothing: After compiling and running a program that does indeed use the Notes backend classes, running it flawlessly using Bob’s two-headed beast method and importing it into Notes, it would mysteriously die with a Java.lang out of memory error. Going through the excruciating, but very cool process of installing, running and staring at the results of Eclipse TPTP until my eyeballs hurt to analyze the memory usage,screenie I determined that the Notes backend classes –as I had expected- were not unduly taxing the system. They were not taxing the system at all, in fact, as I was reusing an extremely limited number of Notes objects and not creating new ones arbitrarily –in effect I was practicing good object hygiene. Thus all the tips&tricks pouring in from my lazyweb twitter request and nagging of old acquaintances centering around increasing the Notes JVM heap size at runtime had no effect. It wasn’t the heap that was the problem.

As you probably surmized by now, the answer lay in the JVM’s stack. Each thread in the JVM gets it own stack, a last in, first out (LIFO) piece of memory that handles local variables and such for the thread. (See Java VM Spec, scroll down to section 3.5.2)  Highly recursive calls tend to fill up this type of stack pretty quickly. I did notice in my tptp reports a disproportionate amount of char and byte arrays being instantiated and –upon further tracing and asking around- learned that a third-party library I am using to convert HTML  into PDF (PD4ML, highly recommended, BTW) would under a particular circumstance make use of the Java JAI classes to render images in a highly recursive manner. The JAI classes are quite good about cleaning up after themselves, but they do seem to need more room in the JVM’s stack than the default 409600 bytes that the Notes client assigns for anything more than trivial use cases of JAI. Increasing the stack size in the Notes client using the notes.ini variable JavaStackSize neatly solved the problem. Stress-testing the agent with 2500% of the previous load that caused a JVM failure proves out the theory that the the JAI calls just needed a little more headroom to run (I can empathize with that) and a more pernicious leak wasn’t the issue. Problem solved, crisis averted and sanity restored. Thank you for listening.

Oh, and getting Windows Live Writer fully functional as a blog posting tool using the Drupal BlogAPI, XML-RPC and WLW's nifty image editing sauce (check out the drop-shadow on the screenshot above) is uber-rewarding.

by jake
Syndicate content