iPhone 4 Day

So it’s that day again: An Apple iPhone launch day in Belgium! As you may or may not remember, I was first in line to get my iPhone 3G 2 yars ago. After letting the 3GS pass last year (on purpose ;-)), and with 2 years of raising Apple-awareness, would I be lucky enough to repeat the success??

I knew that getting an iPhone4 was going to be way hotter than getting the iPhone 3G back in the day. However, I didn’t want to camp there the day before. So here’s my journey.

Continue reading

Advertisement

Devoxx 09 Schedule Overview

If, like me, you’re attending the Devoxx ’09 conference next week and are preparing your personal schedule, you might need a consolidated overview over what’s happening where at any given time.

Although the sessions and talks are listed on the Devoxx 09 website, it lacks such a bird’s-eye view IMHO. I created an Excel sheet containing everything you need to plan your week so you don’t miss any talk you’re interested in.

The file can be downloaded here:

See ya @ Dexovv 09! 🙂

Trouble with Java invocations using reflection

The WTF

In a mocked UnitTest, I created a mock on a logger interface to control its invocations. However, in addition to that, I wanted to reach every invocation through to a _real_ log4j backend of that logger interface since those log messages could contain information needed to find errors…

The idea is to lookup the invoked methods on the _real_ logger using reflection, so I don’t have to adapt the testCase whenever I change the log interface, it is just passing through anyway, right? I left polymorphism out of the mix to simplify the code (I don’t use polymorphism in log interfaces anyway).

Compilation is absolutely fine but at rumtime I got:

java.lang.IllegalArgumentException: argument type mismatch

Can you spot the error?

public Object execute(String invokedMethod, List parameterValues) throws Exception {
    // Invoke the method on the real logger
    MyLogger realLogger = new MyLoggerLog4jBackend();
    Method[] methods = realLogger.getClass().getMethods();

    // Ignore polymorphism in method lookup for now...
    Method method = null;
    for (int i = 0; i < methods.length && method == null; i++) {
        if (methods[i].getName().equals(invokedMethod)) {
            method = methods[i];
        }
    }

    if (method != null) {
        method.invoke(realLogger, parameterValues);
    }
}

Oh yes, the parameter of the invocation at runtime is actually a java.lang.IllegalArgumentException and MyLogger looks something like:

public interface MyLogger {

    [.. other irrelevant methods...]

    void fatalError(Exception e);

}

The Solution

It’s the invocation in itself:

method.invoke(realLogger, parameterValues);

If you take a close look at the invoke method’s declaration, you’ll see it’s:

public Object invoke(Object obj, Object... args);

But since parameterValues is a java.util.List, it used that list as a parameter in itself instead of unwrapping it! And since java.util.List and java.lang.Exception are not type compatible, boom!

5 things 4 Things

incomplete_things_logoAs mentioned in my previous posts, I chose Cultured Code’s Things as my GTD tool. The Mac / iPhone combination makes it really versatile and after about a month of using it, I’m still loving it. Therer are, however, a bunch of improvements required for Things to become truly great. These are the 5 features I consider “must have”s. Everything else would just be “nice to have”s to me as of writing.

I proposed these features directly to Cultured Code. Since I want to share the ideas with you and maybe even get some reader feedback (a man can dream, can’t he?), here’s a copy of the eMails I sent to them (most important first). Continue reading

Finding the right GTD app

It’s been about three weeks since I decided to use Cultured Code’s “Things” solution to get my things done.

But before I eventually spent the money on Things, I took a deeper look at it, together with two other GTD apps: the Omni Group’s “OmniFocus” and Potionfactory’s “The Hit List”.

OmniFocusOmniFocus icon

While it is certainly the most precise implementation of Allen’s GTD Methodology, it didn’t “feel right” for me. Its look and feel are just not as simple and fun to use as Things’. However, OmniFocus also has a couple of advantages over Things.

  • Most importantly, the ability to embed files into the tool db
  • Location-based contexts are a killer feature on the iPhone client
  • The clipping (it’s kind of a luxurious copy & paste to create new tasks) flexibility and options are a little bit better than Things’
  • The View Bar and Perspective features. The customization and fine-tuning of almost any part of the GUI to get a precise “view” on the data and the ability to store and recall these so called “perspectives” anytime is a really powerful feature that stands out when compared to other task management applications
  • Especially compared to Things, having a granularity at minute level is way more flexible than a day granularity

The Hit ListThe Hit List icon

While The Hit List’s GUI looks very promising at first glance, it turned out to me that the application is missing some serious power. Note though that, as of writing, the current version is only the first public beta and that the lack of functionality might be addressed in future versions.

What really hit me was the effort they put into making the whole application navigable and controllable from the keyboard. There’s a key combination for virtually anything and it really seems like they’ve put a lot of effort into designing that. Shortcuts are often elegantly displayed next to GUI elements (yes, you can turn that off) in order to familiarize the user with the equivalent keyboard shortcut. It’s so omnipresent that it might even be a little bit too much, but hey, props to them for putting the effort in!

The most annoying thing about The Hit List to me were the tabs. They show them off very prominently on all screen shots so you’d expect it to be a killer feature, right? Well actually it isn’t: tabs are really just a duplication of the menu on the left, except that you can select which of the menu items get turned into tabs.

There were only 3 outstanding features in The Hit List:

  • The aforementioned keyboard controls
  • GUI animations are geniously designed! The GUI is really responsive and dynamic, but not too much, just the perfect amount of it.
  • Data selection is well designed. For example, filing a task into a project happens through a very responsive, intelligent and nice looking input box. Typing a few letters of any part of the project or tag is enough for the hit list to find what you’re looking for.

Things was the winner for me. But…Things icon

…although it was my first choice, I took the opportunity of gained experience and recent tool comparisons to point out 5 of the most important features / improvements yet missing within Things to become _my_ perfect GTD application. I will feature those in an upcoming blog post, so stay tuned!

Getting Things Done using Things

Uuh… what?

For those who are new to the subject, “Getting Things Done” (or GTD) is a task management methodology created by David Allen and described in his book “Getting Things Done – The Art of Stress-Free Productivity”. To be honest, I didn’t read that book, I read the corresponding Wikipedia article, in fact, let’s quote it:

GTD rests on the principle that a person needs to move tasks out of the mind by recording them externally. That way, the mind is freed from the job of remembering everything that needs to be done, and can concentrate on actually performing those tasks.

How I got into it

First off, I have a sh*t ton of information to manage at any given time. I have my job, a bunch of internet stuff going on and I’m part of multiple musical formations, so needless to say it rarely gets boring. I used to be able to manage all my tasks in-brain. However, seems I’ve hit a critical mass these days. Phone didn’t stop ringing, eMails were making my inbox explode and I kinda had the time for none of it that day. When the information rush finally ended, I was sitting there thinking “Hmm.. out of all that mess, what were those 2 things I wanted to do immediately?” — no clue! That’s when I decided I’d need a tool to manage my stuff.

Why Things?

After fiddling around a bit, I stumbled upon a Mac OS Application labeled “Things“, by a small company named Cultured Code. It looked pretty much exactly like my always-wanted-to-have task-management-application. Only downside (at the time) I thought was the price. I didn’t really want to spend $40 for it, +$10 for the iPhone version to sync tasks and take them with me on-the-go, which makes us $50 for a task management solution. But maaaan did that application look great.

So I decided to let my colleague take a look. He’s the “king of tools” at work and he actually read David Allen’s GTD book, so he was the perfect judge for a first-impression. After watching the “Things” screencast, he was like “Yep, that’s it, it’s almost perfect… If I had a Mac I’d go out and buy it”. After that, I spent several hours browsing through articles and forum posts. I ruled out any solution that would make me send my task data to a third party server like Remember The Milk, I just hate that thought! In the end, the only serious (Mac) alternative to Things seemed to be The Omni Group’s OmniFocus. But supposedly, that one would be less flexible by being bound too tightly to the GTD principles or at least less fun to use than Things. On a side note, OmniFocus is also twice as expensive. That made me reconsider Things’ price as not being too expensive after all.

I downloaded the Things for Mac demo and bought the Things iPhone application to be able to test the syncronization, which is epic btw. I’m 5 days into using it and applying general GTD principles now and I really feel like staying on top of my tasks a lot better than before.

I have yet to buy the full Mac application of things but before, I’d like to see if I have the courage continuing to apply GTD in my everyday life. I’ll try to report back as the experience goes on…

To be continued…

Getting rid of a hanging network share in MacOS X

I originally posted this on the macrumors.com forum, so I’ll copy/paste the relevant parts over here.

ICEBreaker wrote:

Hi troubleshooters,

I wonder if you could help me troubleshoot a problem I have with my shared network volume. I have my iMac and PC connected to each other through the ethernet. The iMac is set to read/write the shared network volumes on my PC. The Finder is used to set up the SMB connection. Everything works fine. Mac applications are able to read and write files to the PC.

However, after a day or so (during which the PC has been kept on, while the Mac has slept) problems occur.

[…]
Attempts to read/write to the directory results in the following error message:

Sorry, the operation could not be completed because unexpected
error occurred.
(Error code - 1407)

Attempts to eject the shared volume results in the following error message:

A disk on 'pcxp' is in use and could not be ejected.
Try quitting applications and try again.

In terminal, I attempt to identify the open files:

lsof | egrep 'pcxp'

and get the following result:

lsof: WARNING: can't stat() smbfs file system /Volumes/Share
      Output information may be incomplete.
      assuming "dev=2f00000a" from mount table
Dock     96534 user [...] 896612 /Users/user/Shortcuts/pcxp

I try to kill the dock’s connection to the open file:

kill -9 96534

The dock is relaunched but the problem remains, this time with a new process number 97642.

When I try to restart my iMac, the desktop will close, and only my wallpaper remains. There, it will remain hung until I do a cold boot.

Can anyone figure out what is wrong. It’s pretty annoying to have to reboot my Mac daily.

Thanks a lot for your help!
JC

And here’s my reply:

LMAO, I was about to reply having the same issue. Then, while trying to reproduce the steps I took, I figured out the solution 😀

So I *had* exactly the same problem here between my Mac Pro and my XP PC. Same usage pattern (PC stays on, Mac sleeps every night). Fortunately, I only *had* this issue once in about two weeks, but it *was* annoying as hell!!

Some additional info I can provide on the issue’s behavior:

First off, I had 3 smb filesystems mounted when it happened. Let’s call them [smb1], [smb2] and [smb3] here. So I did the following:

  • At first,
    ls -al /Volumes

    -> yields only the local mounts, no smb mounts whatsoever.

  • Next, running
    sudo umount /Volumes/[smb1]

    -> HANGS, yes it blocks the terminal, tried to kill -9 the umount process without any success!!

  • At this point, even a simple
    ls -al /Volumes

    -> also HANGS the terminal.

  • lsof yields the following:
    lsof: WARNING: can't stat() smbfs file system /Volumes/[smb2]
          Output information may be incomplete.
          assuming "dev=2d000005" from mount table
    lsof: WARNING: can't stat() smbfs file system /Volumes/[smb3]
          Output information may be incomplete.
          assuming "dev=2d000006" from mount table

I was right about to give up, post this answer and hard reset the machine again when I tried the following:

sudo umount -f /Volumes/[smb2]

All of a sudden, the finder flashed a window (had no chance to see what it was) and the previously hanging ls and umount processes were gone! The finder GUI listed the smb shares on the remote server again and everything seems fine again!

So the steps to solve the issue would be:

  1. Run “lsof” in terminal
  2. See about what smb mounts it complaints
  3. sudo umount -f [any_failing_smb_mount]

Be aware though, that unmounting a filesystem using the force flag may produce unexpected results, but I guess it’s better than hard resetting the Mac and thus hitting the HDDs every day 😉

Greetings,
Mike

Recovering lost photos

photorecEver heard about those incredibly expensive file recovery tools? For recovering photos, documents and all kinda stuff? Since I run Time Machine on my Mac and since I do full backups of my valuable stuff regularly, I was pretty sure I’d never need one of those… until today!

Yesterday evening, I took some amazing photos with my Pentax DSLR. The lighting was absolutely perfect and I was looking forward to importing them in iPhoto today. I don’t sync my SD card with iPhoto every time I take a bunch of pictures. I generally wait until I need some pics immediately to copy all the previous ones over to my Mac. So this morning, I wanted to import the current batch of photos from my SD card into iPhoto. Worked as always, except for the photos I took yesterday evening. Out of the dozen or so I took, there was only one left. And that one was corrupted (a bunch of weird horizontal lines within the pic). ALL the others from yesterday were gone. And since I selected “Delete Originals after import”, the SD card was…. empty!

Having the exact same conditions as yesterday is unlikely, especially with the f’d up weather here in Belgium. Therefor, I decided to take a look at the file recovery tools out there.

Being on a Mac doesn’t help when it comes to finding free niche products. That narrowed down the available tool palette. I ended up taking a look at two tools: LC-Tech’s Photorecovery and Christophe Gernier’s photorec. The former being a commercial tool, I used the demo. The latter is an open source command line tool.

Continue reading

iPhone/iPod Touch headphone connector freaking out

To start off like the hosts of my favorite intrernet podcast

OK, so here’s the deal

iphone-headset-jackFirst off, I must admit that I don’t use headphones on the iPhone very often and that I carry it in my pocket all the time without a protection case, which may be part of my problem…. But anyway, sitting at work I wanted to listen to something other than this one song I’m looping on YouTube for days now, so I took my iPhone and the earphones. Put them in, iPod app, hit play, song fires up oka…. wow wait what the hack is that strange sound I’m getting here?! Yeh, indeed it was the kind of sound you get when your headphone jack starts to die or isn’t fully plugged in. Basically right and left channels cancel each other out and the only thing left is the difference between them, which is usually some weird reverb’ish sound. Lead vocals are usually gone when that happens and the phase is totally screwed.

I was wondering because my iPhone and the earphones are barely half a year old. I started hitting the headphone jack to see if that’s the source of the problem. Bad idea: things got crazy at that point!! I got slammed with loud crack noises killing my ears and the iPhone went all crazy playing and pausing the player continuously till I stopped hitting the connector… WEIRD!! Damn, my iPhone broke!

So I went over to Patrick, a colleage of mine who works in the office next door, to tell him about what just happened as he’s a die-hard Apple user (like me :-)), who happens to own an iPod touch. We started trying his earphones on my iPhone… works. My earphones on his iPod touch… works. WEIRD! As we were running out of ideas, we started babbling about how there supposedly is an immersion indicator in that earphone connector on the iPod touch. Enough for me to take my iPhone out of the pocket and use Patrick’s desk lamp to see if my iPhone also has one. Since I’m visually impaired, Patrick took a look and… found that there was a ton of dust at the bottom of my iPhone’s headphone connector! Took that out with a paper clip, headphones back in and voila! My iPhone rocks perfectly again!! Well THANK YOU SIR! 🙂