Skip to main content

Getting Granddad A Mac

A Sunday not too long ago I visited my granddad for his 89th birthday and he asked me to take a look at his computer again. Some ISP settings had changed and his Outlook Express e-mail client didn't fetch or send e-mail anymore. The lady at the support centre directed him to their webmail client, but that's just not as good.

My granddad had a very old Windows XP desktop tower with a small 15" display, doing no more than 1024x768, a 1GHz CPU and 384MB RAM. It took minutes to boot and sometimes minutes to open Internet Explorer windows. It was also very noisy. I've been wanting to get him a new computer for the past 3 years but he always told me it wasn't necessary. He found his computer good enough for what he needed to do with it. Personally I attribute his resistance to a new computer as fear for something new. He is 89 years old now and was 86 when I first talked to him about a new computer. People don't like change after a certain age. Young people find it incredible, but old people just do not easily learn anything new anymore.

Of course, the computer I had planned on buying him was a Mac. One might argue that getting someone a Mac, coming from Windows XP, would be too big of a change but think about it... How much different is going from Windows XP to Windows 7, or nowadays Windows 8? I dare to say the learning curve is just as big (with Windows 8 even more so) than going from XP to OS X 10.8.

For some reason I couldn't figure out how to get his e-mail client to fetch e-mail again. Innerly I got frustrated that everything took ages to accomplish and made the decision of getting him a new computer. I didn't tell him I was going to, he'd argue, again, it wasn't necessary. Sometimes you just have to tell people what to do and what to use because they don't know any better.

The next day after work I got him the cheapest iMac and called him up. I said: "Granddad, don't be upset, I just got you a new computer. I know in the past you told me not to get one but I think it's necessary. A computer should be fast, easy to understand, not need a whole desk just for itself and be noiseless. What time do you go to bed?"

It was 18:30 when I rang him up and he told me he usually didn't go to sleep before eleven so I said: "Good. I'll be there in an hour."

Unboxing the iMac was an experience, he expected a traditional desktop PC and was amazed:

"So we don't need this (big) keyboard an mouse anymore?" — "No."
"And this tower down here?" — "Nope."
"And these speakers?" — "Neither."
"The monitor can go as well?" — "Yep."

All those cables, gone. The keyboard was wired, his mouse was wired, the monitor had 2 wires, power and data, his speakers had wires to the back of the desktop tower, he had a USB hub because his old computer only had 2 ports, the tower had a power-cable as well and then there was the ethernet cable for Internet access. His Internet router was a wireless one but the computer didn't have a Wi-Fi card in it.

After unpacking I plugged in the one cable that comes with an iMac and turned on the computer. It frees up all those messy cables and in fact the whole computer table could go away. The iMac is so small it can just sit on his proper wooden "bureau" and take up no space other than the foot on which it stands.

After running through the install I set up Mail and iCloud for him and logged him into the iTunes Store and Mac App Store. I made it so that scrollbars always showed. In the past I always thought that Apple made the wrong choice of leaving us the choice to turn on scrollbars. It turns out they were right leaving the option, elderly don't quite grasp the disappearing scrollbars and lack the knack of knowing that there might be more content, even if a scrollbar isn't showing. I also removed unnecessary apps like System Preferences and Launchpad.

That evening I taught him three apps, which I placed next to Finder on the Dock: Safari, Mail and Contacts. (I'd install Pages and Numbers later) He was thrilled to find out there was no right-click, saying: "Oh, that is so much easier."

The next day I got an e-mail from him, telling me what he had done that day, checking the header of the mail I saw:

Mime-Version: 1.0 (Mac OS X Mail 6.2 \(1499\))

My 89 year old granddad had turned on his new iMac, opened Mail, composed a new e-mail and sent it. Success.

The Solr Wildcard Problem And Multiterm Solution

A while ago I ran into a problem with Solr and wildcard searches. Turns out it's more of a little known fact than a problem, Solr treats wildcards a bit different than how one would expect.

Normally, when a user enters a search-term we will append '*' to it so it will find words starting with the term that is being searched for. Common sense dictates that when someone searches for "train*", the set of results will also contain the word "train" itself. But "train" is not part of the results. When looking for "train*" Solr will return "trainer", "training", "trains" but it won't return results with the word "train" in it.

In case you want documents matching the exact word as well you will have to change your Solr statement. Instead of searching for "word*" you'll have to look for "word OR word*", only then documents matching "word" will turn up in the result-set.

After discussing it with Nick Veenhof, it turns out that, as of Solr 3.6 there's been a new type of analyser introduced that addresses this shortcoming (although it seems to be more of a side-effect). The multiterm analyser type. Copy the query analyzer section of the text fieldType and change the type to "multiterm". What multiterm addresses is that when you look for "train*" it will run the query as if you've been searching for "train", "trains", "training", "trainer". You might be inclined to think that that's the same as searching for anything that starts with "train", but that is not the case. Without specifying the multiterm analyser the wildcard searches are not analysed at all and thus can't be used for stemming, or downcasing or accent mapping...

Specifying the new multiterm analyser will also "expand" the wildcard search to the actual word, in our case "train", which is what we were looking for.

In case you're using Drupal to interface with Solr there's an issue filed about this along with a simple example explaining the difference between a non-analysed wildcard search and a multiterm search.

Tomcat, Solr And Special Characters

If Solr does not return any results when looking for words with special characters, this post could explain why.
Solr's example schema.xml comes with the charFilter element to map special chars to their ASCII equivalents. Look for the following in the "index" and "query" section of the solr.TextField class:

<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>

You can open the mapping-ISOLatin1Accent.txt file to see what gets mapped to what.

What often gets overlooked is that Tomcat, which takes the search request URI, also has to properly encode those special characters or they'll end up like gibberish when it reaches Solr. This is simple to do. The URIEncoding="UTF-8" attribute needs to be added to the Connector element in Tomcat's conf/server.xml

It is not part of a standard Tomcat installation, which is what most people use when setting up Solr.

This is what the Connector should look like:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

Now, when looking for "bacteriën" (bacteria) or "financiën" (finance) Tomcat won't mess up the 'ë', Solr will properly map them and look for "bacterien" and "financien".

At the time of this writing, a patch for this issue just got applied to Solr 4.1 which will take care of the encoding for us. It will ask the HTTPRequest for its character encoding and convert it correctly.

Ten Things I Wish Apple Does In 2013

2012 seems to have been all about the hardware at Apple. Retina displays on 2 new 10" iPads, iPad mini (magnificent device), retina displays on newly designed 13" and 15" MacBook Pros, complete overhaul of the range of iPods, a superb iPhone 5 and a drastically less voluminous iMac.

Apple knows the hardware department is top-notch, they're doing great things, nothing needs to change. They don't need to redesign anything and 4 years down the line their devices will still look the best. The problem lies with the software side of things. Things don't "just work" anymore.

Things don't just work anymore and that's understandable. Today's software-world is many times more complex than it was in 2004. Computing has changed. The era of the single desktop computer in a family's home, without any cloud integration, has passed.

Nowadays we have multiple devices each. Kids have their own notebooks for schoolwork, they are given iPads as entertainment devices, as they get older they get smartphones and their parents could very well be reading books on their own iPads once the kids are put to bed.

Together with the shift to multiple devices Apple has also pushed the digital consumption to all of those devices. We expect all our content to be available everywhere, all the time. In a world where not all devices are constantly online this creates technical problems. Apple's trying its hardest to get its iCloud infrastructure to keep it all in sync but there's work left to be done.

As 2012 was the year of hardware, I hope Apple does nothing but improve its software in 2013. Here is what I feel really needs to be addressed:

  1. Unify Apple IDs and iCloud IDs.
    Provide a way to merge the two IDs and stop the dichotomy between the two. There are people backing up things on their iPhones to iCloud with a different login than the one they buy content with on the Apple Store. It is a mess and it needs to be fixed.
  2. Gives us back our @mac.com / @me.com / @icloud.com e-mail address.
    Long-time Apple users will feel the same. Those who've had @mac.com e-mail addresses but refused to pay for Apple's abysmal service during the .Mac and MobileMe years never got their @mac.com e-mail addresses back once iCloud rolled around the corner. Moreover, they can't opt to have iCloud e-mail because the <first part>@icloud.com is already taken by their own <first part>@mac.com Apple ID of old.
  3. Make iMessage work.
    In the previous blog post I've written about it in great length: iMessage does not work well enough. It fails to deliver messages to iPhone when the user you are addressing has an iPad within Wi-Fi range, but he himself is currently somewhere without a data connection. iMessage does not fall back to sending a text message once 1 device has been found. When iMessaging, you primarily target someone's phone. It should arrive at the phone at all times.
  4. Make iMessage more sentient.
    Currently when I'm chatting to someone via iMessage from the computer my iPhone is going berserk. Do the way Google does it and don't make the phone buzz when iCloud knows you're chatting from the computer. Set a 5 or 10 minute timeout after the last-received message before an iPhone can buzz again.
  5. Update Maps POIs.
    Apple Maps is great. It is beautiful, it's easy to use, it works on the home-screen, it gives good directions. It gives them to the wrong destination. Apple's Maps app is great, there's not a wrong street on it, but it's their (Yelp's) POI data which is incredibly inaccurate. It is so bad it becomes unusable. Get rid of Yelp or do a major effort to update it, world-wide. Because I see gas stations where there aren't any at all, I see hotels 3 blocks from where they actually are, I see shops on the wrong side of the road... Nothing is accurate. I'd say that's OK for the POIs around where you live, because you know better... But you use POIs when you're somewhere you've never been before. People fully rely on this information when it is all they have. I've been updating POIs in my neighbourhood for 6 months, not one has changed.
  6. Sync "Do Not Disturb" via iCloud.
    When someone doesn't want to be disturbed, one could assume he doesn't want to be disturbed on any of his devices. Sync this switching on and off of the "Do Not Disturb" setting between all devices registered with the same iCloud ID. No-one feels like switching to "Do Not Disturb" mode on three seperate devices every night before going to bed. The same goes for "Airplane Mode".
  7. Make iCloud work for movies outside USA. (Update: Apple added this on 2013-02-27)
    This one's easy. When you're not in the USA, deleting a purchased movie from iTunes will delete it forever. It does not work the way music does outside of the United States. If it doesn't, then why does iTunes tells us: "Your movie purchases in iCloud will also appear whenever you're signed into the iTunes Store." Clearly it doesn't. Your movie purchase will not appear once you've deleted it. There is no re-downloading movies.
  8. Update iWork. (Update: Apple released iWork '13 on 2013-10-22)
    iWork dates back to January 2009. That's 4 years. That's older than most people's computers. It's seriously lagging behind in functionality. You only need one example: it still has a separate window for Search & Replace. Enough said.
  9. Remove excessive skeuomorphism. (Update: Apple released iOS 7 on 2013-09-18)
    Skeuomorphism is a good thing. Windows 8 looks too stark. But in iOS and OS X it has been overdone. iBooks is ridiculous, and it's telling that in an update Apple added the option to remove the book artefacts around pages. The calendar is ridiculous as well and we don't need shredding animations when deleting a Passbook ticket. Skeuomorph icons are a good idea because we do need to quickly recognize objects as address books and calendars, but the applications don't have to function like their physical instantiations.
  10. Update some OS X behaviour.
    When cmd+tabbing to Finder and no Finder window is open, or if it is minimised, show it anyway. I know it might not adhere to OS X's window-model but it's been an annoyance for years, especially for people switching away from Windows. Do not make us stare like fools at our desktop where seemingly nothing happened other than then menubar changing to "Finder". Just open a new Finder window, OK?
    On the same topic, get rid of the buttons to minimise and zoom windows. Zooming has not been doing what people have been expecting it to be doing for years. The people who "get" the zoom button are so few that they won't mourn its removal. Declutter the UI and get rid of zoom. You either drag the window out to your preferred dimensions or you go full-screen. No "zooming".
    Get rid of the minimise button as well, or find a way to make it "just work". Why introduce a preference to minimise windows in their Dock icons when it's almost impossible to get them back? It is very unintuitive. People need to hit F3 for Mission Control and see their windows. If there are any minimised, show them below the line like it was in previous OS X versions.

There you have it, my wish list of things Apple needs to address in order to reinstate the confidence its customers should have when using their products. I could have added more but ten things is enough. Let's hope they find their way to this page. Let's make things just work.

"Delivered" — iMessage's Problem

An iMessage, sent to someone who owns an iPhone, that can not be delivered to that iPhone, can never be "Delivered".

My wife inherited my old iPhone 3GS when I got the iPhone 5. She wasn't with a sanctioned iPhone operator in Belgium so she didn't get the APN settings OTA. I didn't think of checking them and setting them manually. So, she did not have an active data connection to her phone when she was out of the house.

We set up Messages at home when she was on Wi-Fi and Apple recognised her number as being linked to her Apple ID. Or is it iCloud ID? That dichotomy's another story... Now, when I started sending her texts they never reached her because during the day she is not at home, and Apple's servers couldn't connect to her phone.

Yet, whenever I text her Messages.app said the message was "Delivered". It got delivered alright, to her iPad that was lying at home, connected to our Wi-Fi network.

The reason must be that Apple's servers check for any device registered for receiving iMessages with the receiver's Apple ID. When it can reach one device it sends the message through and responds success to the sender. The sender has no idea to which devices the message arrived, all he gets to see is "Delivered".

Usually, when people send texts they mean to reach someone's phone. That's their primary target. If iCloud can sync it to iPads, iPods and Macs that's great but the phone remains most important.

With the above in mind (someone who has an unreachable phone but another device which can be reached) three situations can occur, one of which can be easily remedied, one is a bit harder and one where nothing can be done.

  1. Sending from iPhone. Apple should check the devices registered with the recipient's Apple ID, if it can reach the iPad but it can not reach the iPhone it should send the iPad message as per usual but also fall back to sending an SMS to the unreachable iPhone. Currently it does not fallback to SMS as soon as another non-iPhone device can be reached.
  2. Not sending from iPhone, but the sender has an iPhone. Apple should check the devices registered with the recipient's Apple ID, if one of them is a non-reachable iPhone it should then check whether the sender has a (reachable-via-data-connection) iPhone registered to his Apple ID. If so, then Apple can contact the iPhone and have it send an SMS to the recipient's phone to make sure the text gets delivered. Only if the sender has the fallback-to-SMS setting turned on of course.
  3. Not sending from iPhone and the sender has no iPhone. There is no way the message can be delivered to the non-reachable iPhone. I assume Apple does not have SMS servers in every country to make this happen on their behalf instead of using the sender's iPhone. But then it should not say "Delivered". It could say "Delivery failed." and show a popup with more info.

Solving situation 1 and 2 would help Apple get back on track with their "It just works" meme. It's a technical challenge, trying to get texts delivered any way they can. It's a interesting problem to solve. And when solved it would be magic. The user does not need to know how. It should just work.

Situation 3 would occur less frequently I think. People who don't have iPhones are less inclined to use iMessage.

With all of Apple's new services and software in the past couple of years... it has come to a point where a lot does not "It just works" anymore. More articles like this one will get written until they start fixing their software. Apple's hardware is drastically improving, their software department has been lacking.

I hope Apple will devote 2013 to doing nothing else but making things just work again.
Like it used to be.

Mastering MAMP's Metadata-Munching MySQL

Since this post ran a bit long I've included a TL;DR section.

The Problem

MAMP's MysQL uses a shared InnoDB file "ibdata1" which grows over time and never shrinks. Not even when dropping databases. All the metadata and indices for all databases stay in there forever.

The Solution

Tell MySQL to store medata and indices in separate files per database.

  1. Dump all databases in files and drop the databases.
  2. Delete ibdata1, ib_logfile0 and ib_logfile1.
  3. Add innodb_file_per_table to the [mysqld] section of /etc/my.cnf
  4. Restart MySQL and reimport the dumped databases.

The Article

Recently I had to import a MySQL dump of 9GB resulting in a database of 21GB. I didn't have enough space on my hard drive and after continuously deleting applications and music as the import went on I realised I wouldn't make it. I aborted the process and dropped the partial database. Funnily enough I noticed I didn't get all my space back. After a little scooting around on the file system I understood something I had been suspecting for a while already. MAMP's default MySQL settings suck.

jeroen@liver:/Applications/MAMP/db/mysql$ ls -hl | grep ibdata1
-rw-rw---- 1 jeroen admin 14G Nov 4 16:25 ibdata1

I've always been slightly opposed to using MAMP for serious work but the company I work for uses it and their setup scripts expect folder layouts the way MAMP sets them up. Now, after a year of using MAMP on a 128GB MacBook Air I saw the shared InnoDB file MySQL uses had grown to 14GB. That is a lot of wasted space.

Why is it wasted space you might ask? Surely MySQL needs it for something. Yes, MySQL needs it. It stores the _current_ database-indices in there as well as the metadata for them, you can even restore whole databases, after having dropped them, from this InnoDB data file. But, it also stores all that information for databases you have already dropped. See, MySQL's ibdata1 file never shrinks, it only grows.

As a web developer working with Drupal for about a year now, one of the things I do a lot is importing databases of ongoing projects, dropping them when I screw up and reimporting a backup to try again. Therefore I bet not too many web-developers know about MAMP's hungry MySQL or I would've heard about it earlier.

There is a solution and it is called innodb_file_per_table. When you put this in the MySQL configuration file it tells MySQL to store the metadata and indices for each database in a separate file within that database's folder. Then, when you drop a database and MySQL deletes the folder it will also remove the metadata files.

If you're wondering where you can find the MySQL config file your best guess is /etc/my.cnf unless of course you're using MAMP because it just starts MySQL with any meaningful parameters, neither does it install a my.cnf anywhere MySQL looks for one. (More info here: http://bensch.be/mysql-config-with-mamp) You can copy one of MAMP's default MySQL config files to /etc/my.cnf. Look for them under /Applications/MAMP/Library/support-files/

None of MAMP's MySQL config files however include the innodb_file_per_table setting so make sure to add this to the [mysqld] section of the file you chose to copy to the /etc/my.cnf:

innodb_file_per_table

When you restart your MySQL server it will start putting the medatadata in the database folders that will be created from then on, unfortunately this does not get rid of the huge ibdata1 file. All current databases must be dumped and dropped first, then the ibdata1, ib_logfile0 and ib_logfile1 fils can be deleted. MySQL can be restarted with the innodb_file_per_table setting in place and the dumped databases can be reimported.

You'll be saving gigabytes of disk space in your day-to-day development.

While I was writing this post I came across this Stack Overflow answer: http://stackoverflow.com/a/4056261 It tells the same story but with a bit more detail about what's in the ibdata1 file.

Have Vim Recognise Drupal's .module Files As PHP

OS X's Vim doesn't by default recognise file-types when opening files.
You can turn it on by adding following lines to the .vimrc file in your home directory.

$ echo -e "filetype indent on\nsyntax on" >> ~/.vimrc

This will add "filetype indent on" and "syntax on" to the file, or create it if it doesn't already exist. The "syntax on" is needed or Vim won't recognise the filetypes.

Now Vim will recognise file-types, indent them and colour the syntax of the recognised files.
Drupal however puts a lot of PHP code in .module files. These .module files aren't recognised by Vim as being PHP files.

We can tell Vim to interpret .module files as PHP by modifying the "Virata" piece of code in Vim's filetype file at /usr/share/vim/vim73/filetype.vim from:

" Virata Config Script File
au BufRead,BufNewFile *.hw,*.module,*.pkg setf virata

to:

" Virata Config Script File or Drupal module
au BufRead,BufNewFile *.hw,*.module,*.pkg,
\ if getline(1) =~ '<?php' |
\ setf php |
\ else |
\ setf virata |
\ endif

If you don't have access to the global filetype.vim file you can also put these lines in your own home directory's .vimrc.

Next time you want to edit a .module file in Vim it'll detect it as a PHP file. Some of you might say, no-one uses Vim, but when you quickly need to check/hack something on a server, chances are you'll be connecting through SSH using Vim to make the changes, so this might come in handy. Do set up your server-accounts' vim in such a way that viewing PHP in Vim becomes a bit more bearable.

Other settings you can put in your ~/.vimrc that might help you live with Vim are these:

set ruler " Show a ruler on the bottom
set expandtab " Expand tabs as spaces
set tabstop=2 " A tab is 2 spaces
set softtabstop=2 " Typing a tab in insert mode is 2 spaces
set shiftwidth=2 " Indent 2 spaces
set smartindent " Be smart when indenting
set title
set cindent
set hlsearch " Highlight searches
set incsearch " Search incrementally

Apple's Single-Threaded Mail.app.

Last weekend we bought a new computer for my mother. Until then she had a 5 year old hand-me-down white MacBook whose battery was dead, still had a physical trackpad-button, the power-cable near the connector was completely ripped and the palmrest-edges weren't just cracked, they were gone.

Time for a new one we thought, so we got her Apple's entry-level notebook, the MacBook Air. A notebook no other computer manufacturer seems capable of matching in terms of price, build-quality or industrial-design finesse.

Whatever.

The problem was with setting the thing up. Apparently we got a model of MacBook Air which had been sitting on the shelf for a while as it did not come with OS X Mountain Lion and when running Software Update it had to pull in so much data, both software and firmware updates, that it choked when it tried to install them and just reported an error.

Running Software Update again triggered a re-download of the whole 1.6GB before failing again with the same error. Third time's a charm I thought but I went about it less... intuitive. I thought it'd be a good idea to download the firmware updates first (one by one) and apply those before trying the rest of the software updates. That eventually worked. So Apple, you have a problem when applying these two types of updates in one go.

This is not something "normal" people would be able to pull off. It was quite upsetting. Imagine having to take it back the next day because on day 1 something as simple as a software update kept failing, after having downloaded a huge amount of data, repeatedly.

After downloading 1.6GB of updates, three times, we got an up-to-date OS X Lion. It was getting late already and I didn't even dare mention anymore that another 4.3GB Mountain Lion download was in tow.

Anyway, the title of this post has to do with a single-threaded Mail.app. When we got to setting up her mail account, we found Mail.app beach-balling all the time. Whatever got clicked it beach-balled a minute or two before we could click again. I had enough and said I'd take the MacBook Air home and bring it back the next day because I had had enough. (Why does Apple gear only ever works flawless with me, I don't know.)

That same evening I found out that a MobileMe account got pre-installed, probably after entering her iCloud credentials. OS X Lion's Mail.app pre-populated itself with a MobileMe account. MobileMe, as we know, does not exist anymore. Mail.app was constantly trying to reach MobileMe's mail server, couldn't find it and started timing out, taking the whole Mail application with it. I patiently beach-balled my way through Mail.app's settings until I could hit the button that deleted the MobileMe account.

How could anyone ship a Mail application that completely hangs as soon as one mail account has problems connecting to the server? It's beyond me.