TannieSpace

geekery, drawing and then some

Posts about geekery (old posts, page 1)

The iPhone saga, part 6

unresponsive part of iPhone touch screen

Unfortunately, I had to continue my iPhone saga. The iPhone I received worked but showed some issues. It took a while before I figured out what exactly, but it turned out that randomly, the middle part of the screen would stop responding to touch. Sometimes it would work, sometimes it wouldn't (as shown on the picture). Sometimes the entire screen would stop responding, which I could usually solve by pressing that top-button to lock it and then unlock it.

I returned it today and expect it (or another one) back in a week or two. In general I've had no issues with the process, just too bad I got a bad phone in return. When I pick it up, I'll make sure to test it before taking it home though :)


The iPhone saga, part 5

I crawled out to the T-shop to pick up my phone and got a replacement one. As far as I can tell, I got a brand new one, yay! I didn't put the backup back; instead, I went for a clean install, selecting the apps I wanted and setting it up from scratch. So happy to have it back!


The iPhone saga, part 4

The T-mobile site updated my repair status with:

bq.. Result of repair: You can pick up your phone at the T-shop. Warning: if you get the confirmation that you can pick up your phone, it could take up to 3 workingdays before you can.

p. They should give me a ring from the T-shop when they have it, hopefully Thursday or Friday. I suspect they'll send it out today, so maybe even tomorrow, yay!

So far, everything went pretty smoothly and if it works when I get it back, I'll feel very happy %{color:purple}{:)}%

I miss my touchscreen...


Mobile site

Mobile site screenshot

I've tweaked and fiddled a bit, and now have a satisfying version of my website for mobile browsers. It all should just work, with a link to the full site on the top right should you prefer that.

I still want to tweak the layout, the pages list only shows up at the home-page, where it maybe should show up everywhere -- navigation matters. Also the search box shows up at the bottom, but maybe I should move it to the top.

I've added the little snowman to the home-page at least, to sync it with the main site's design.

I have also tried to keep it small. It currently loads at a 135kb for the main-page. Looking into making it less KB (the full version consists of 1MB of files, also trying to make it smaller). Just because a lot of us have fancy speedy connections doesn't mean I should aim for that. I aim for the average speed and hope it doesn't take too long to load either page.


The iPhone saga, part 3

I've not used my iPhone for a little over a week now, and I miss it somewhat. Every now and then I think %(quote)oh, I want to play 'Spider'% or something like that, and then realise I no longer have my iPhone. I've noticed I don't really want to use my current replacement phone. Pressing those buttons hurt my fingers too much. I love the touch-interface. I didn't know -- though I suspected as much -- how much easier that touch-interface works on my hands.

Currently, the repair status (which I can check online) says "Your phone is in repair.". The next step will tell me what they found, if anything, and what will happen next. I hope it'll update before the weekend, but suspect it might take a few more working days.

I like the online status check. Thank you, T-mobile.


Eek! Shopper got really bad...

Shopper update. I loved Shopper for quite some time. It was one of the first (paid) apps I bought for my iPhone, and I have stuck with it for over a year. Recently though, the business model the developers have chosen started to irk me. I started getting 'suggestions' and 'FDA alerts' (whatever that means).

With the latest update, they introduced ads. Ads in a paid app. I have not yet received my iPhone back, but I looked at the screenshots and read what other users wrote. Their screenshots don't show the real result, and in fact, the screencast on the website shows no sign of these annoying 'features'.

p(clear). They state on their website (in the forums):

bq.. As you might have noticed, we have introduced a messaging capability to Shopper with this release. We are using it to deliver a number of different types of alerts, hints (based on your feedback) and brand messages. We think there are a lot of innovative and useful things we can do with this capability. Over the past week, over 14,000 people have checked out an alert from the FDA or USDA and 30,000 people have checked out a Shopper usage hint. So while they don't please everyone, a great number of users find these features helpful.

p. So, not only do they introduce an annoying 'feature' they also track your clicking behaviour. First of all, you can't really avoid clicking on one of those stupid 'messages' because they clutter your screen and get in the way. Second, eh.. hello... wtf do you check what I click on? They may or may not have mentioned that in the t&c, accessible from inside the app, so no way to read before you buy.

They also write:

(...) just so you know, the costs associated with all of the recent upgrades are now much greater than the $0.99 download fee. So in order to keep the platform up and running, while continuing to build your suggestions into the most capable shopping app available (including this months addition), brand sponsorship is needed. We hope you understand and stick with us, but if not - we will be offering an opt-out subscription in the next release (...)

I can only imagine that this opt-out subscription will consist of a paid subscription. When I bought Shopper, it cost me around €3, a price I happily paid. Why on earth they didn't keep it there, or even now increase the price, still baffles me.

Instead, they have chosen a business model that forces ads onto loyal users, defending it with numbers and the current low price. When you as a company choose to take the more expensive route -- not necessarily a bad thing -- you of course have to get that money from somewhere. But with ads in an already-paid-for-app? Seriously?

Goodbye, Shopper, too bad our relationship had to end so horribly.


Software I wouldn't want to live without.

Over the years I've collected software (for my Mac) that I use on a daily basis and wouldn't want to live without. Sure I could find alternatives, but these programs suit me the most. I often pay for software, something some of my friends find ridiculous :) I'll happily pay a hardworking person for their work, especially if their work makes my live easier. Before I buy software I check it out thoroughly, which includes not only the software itself but also its help-function/support, the update policy (when to pay for the next update) and how much I'll get 'locked in'. I don't like getting locked in and choose applications that allow me to export to a sensible format. I also look for something that supports Applescript, because with Applescript I can do things more smoothly. I love it when I can script repetitive tasks, and I very much like using shortcut keys instead of a mouse.

First a neat little trick.

set menu shortcut

Which reminds me of this neat little trick I discovered for Snow Leopard -- I don't remember where I read it, otherwise I'd link it.

First, make sure you set up your keyboard preferences correctly: System preferences ⇒ Keyboard ⇒ Tab: Keyboard Shortcuts. Select 'Application Shortcuts' and then 'All Applications'. The top item should read 'Show Help Menu'. For me, by default the key was ⌘ - / but that caused issues because the default help-hot-key is ⌘ - ?. I changed mine to ⌘ - ⌃ - /.

Menu

Whenever I press this hotkey, I get the menu on the left. When you type a few letters it'll show you all the possible menu-items and you can simply select them here with your arrowkeys or by clicking on the item with your mouse. It saves me plenty of time not having to look for a certain item in the menus.

Programs

I have the following programs in use nearly daily (in random order):

iTerm
A tabbed terminal, alternative to the default terminal (free, supports applescript)
OmniWeb
An alternative browser by the lovely people of OmniGroup (free, supports applescript)
Tweetie
The desktop client (free with ads, excellent keyboard support)
OmniFocus
A task-manager, based on the GTD-system. (non-free, supports applescript)
GraphicConverter
A wonderful photo editing program that converts between many formats. After years of use I feels as if I still have only scraped the surface of what this program can do. I use it to organise my photos, edit them somewhat (change levels), crop them and rename / edit the IPTC data. (free-with-delay-until-you-pay, supports applescript)
MoneyWell
Personal finance program. Has excellent budgeting capabilities. (non-free, doesn't support applescript)
LaunchBar
Switched to LaunchBar from QuickSilver. It has an excellent page with a FAQ for QuickSilver switchers and does pretty much the same things. I haven't missed anything I used in QuickSilver. It lets you create you own actions with applescripts or shell scripts. (non-free, supports applescript)
TextMate
Very extensive text editor with plugins (non-free, don't think it supports applescript, has excellent self-scripting :) so I never needed it)
Scrivener
Writing app. (non-free, no applescript so far)
MarsEdit
Blog publishing software (non-free, supports applescript)
Plugins

The following plugins sit in my menubar or run invisibly in the background:

Mail plugins

Mail Tags and MailActOn
both excellent plugins to extend the default Mail.app's behaviour. MailActOn lets you sort mail into folders and do all sorts of things with your e-mail with the stroke of a few keys. (non-free)
Visor
A system-wide terminal accessible via a hotkey. (free)
Growl
System notifier. (free)
FastScripts
Applescript management utility, gives you access to your applescripts from anywhere through a menu and hotkeys. (non-free)
Hazel
A utility to automate actions with/on your files and folders. Most of it you could probably do with applescripts and automator and the folder-actions, I like the interface which makes it much easier to do. (non-free)
TextExpander
Sits in the background and replaces certain abbreviations with a pre-defined text. It also runs applescripts and shell-scripts with these abbreviations. Very useful for inserting snippets -- of code, standard e-mail replies etc. (non-free)

The iPhone saga, part 2

Leaving the iPhone at the store. Today I went to the T-Mobile store to drop off my iPhone. The Customer Service didn't phone me yesterday and I didn't want to wait till after the weekend. Unfortunately, I have no way of informing them they don't need to phone me anymore, so I suspect they will still do it Monday.

The guy at the store looked at my -- complete -- copy of the receipt and asked what I brought last time. I pointed it out and he said I brought enough, the guy should have taken in my phone.

This time, the other guy filled in the forms, gave me a copy and told me they'll call me in about a week or two. Keeping my thumbs crossed. And fingers too.


The iPhone saga, part 1

new phone Now that my iPhone has gone hysterical, I have put my SIM in my old SE K810i. As a phone, it works pretty well, and I like the camera in it more than the iPhone's. The buttons however need a harder push than I usually give them, which annoys me a little, and doesn't feel too nice on my fingers -- the reason I got the iPhone in the first place.

I went to the T-mobile store where the kind gentleman looked at my phone and said %(quote)Oh, that looks bad!%. He explained that I needed to bring a full copy of my receipt (silly me, I forgot to copy a certain part) or that I could fill in the online form and arrange it with Customer Service that way. He said I have a two year warranty by default, I've only had the phone for fourteen months, well within those two years, yay! I filled in the form online and the CS will phone me tomorrow to arrange everything.

I worry slightly that it will take a couple of weeks to get this resolved, with the holidays coming and all. On the other hand, I immediately noticed how much I rely on my iphone and I'll take this iphone-less time as a sort of experiment to see how I handle life without the iphone. It feels weird.

Funny how easy one get used to things.

Can you imagine not having an internet or mobile phone connection? Ten years ago I had my first mobile phone and used dialup, I think my first digital camera followed later. Now I have a mobile phone with internet and camera. And DSL. Not that I mind.


Create a new task in a project

For completion sake, I decided to post the bit to create a new task in a new or existing project in OmniFocus through AppleScript. I have this in my script that creates tasks from my mail.

If you know a bit of AppleScript, this should help out. If I have the energy, I might post the entire script later and explain the parts.

In this case, it took longest to figure out the following part:

tell MyProject set theTask to make new task with properties¬
{name:MyTaskTopic, context:MyContext, note:ThisNote} end tell

Apparently, when creating a new task you have to tell the project. If you want to set the context, you instead tell the task to set its context property to something.

This does make sense, in the way that you always tell the containing item to do something.

The part I use in my script:

if MyContext is equal to "NONE" and MyProject is equal to "NONE" then
set theTask to make new inbox task ¬
with properties {name:MyTaskTopic, note:ThisNote} set ProjectString to "INBOX"

else
if MyContext is equal to "NONE" and ¬
MyProject is not equal to "NONE" then
tell MyProject
set theTask to make new task ¬
with properties {name:MyTaskTopic, note:ThisNote}
end tell

else
if MyProject is equal to "NONE" and ¬
MyContext is not equal to "NONE" then set theTask to make new inbox task ¬
with properties {name:MyTaskTopic, context:MyContext, note:ThisNote}
set ProjectString to "INBOX"

else
tell MyProject set theTask to make new task ¬
with properties {name:MyTaskTopic, context:MyContext, note:ThisNote}
end tell
end if

try set Datum to setDueDate
set due date of theTask to setDueDate
on error
set due date of theTask to ((current date) + 604800)
end try

tell theTask
set note to return & return
tell note
set theURL to "message://< " & message_id & ">"
set linkText to theURL insert linkText at before first character
set value of attribute "link" of style of paragraph 1 to theURL insert message_content at before last character
end tell
end tell

which works like a charm.


Applescripts for OmniFocus: change the context or project of selected tasks.

I use OmniFocus a lot, and have recently tweaked some more AppleScripts to make my workflow even more smooth. I can add any mail to OmniFocus for replies, add confirmation of orders from mail to OmniFocus which will automatically go into my project-shoebox for orders, with a 'waiting for' context and a due date set to 1 week into the future, unless I've changed or added MailTags with a project, a keyword and a due date. In that case it'll take the project, the first keyword and the due date and use them to set up the OmniFocus task. I have a few more scripts:

  • in OmniWeb I can take and add a URL for later reading, it'll go into my inbox by default
  • in OmniWeb I can take and add a URL to my 'wish-list' project (with a start date for at 2 weeks in the future)
  • in OmniFocus I have scripts to easily change the context or the project of selected tasks
  • in Mail I can press a key and have the selected e-mail(s) sent to OmniFocus with a 'Respond to: ' before the subject line, sorting into either a default project or the one specified in MailTags, with the context set to 'mail' and the message URL in the note-field
  • in OmniFocus I can select such a task, press a key to run a script that will open the message and immediately create a reply (I have a separate one for just opening, in case I have to read it thoroughly first)

All these scripts make the integration between all these programs very easy. That and FastScripts. I found useful scripts over at Curtis Clifton's site. His scripts use Growl notification so if you have Growl installed you get a small notification.

I had some trouble putting my own scripts together, so I decided to paste the info here, just in case I need it later on, or someone else runs into similar issues. I found it quite hard to figure out how to add a task to an existing project or to move it from inbox / other project. In the end, it only took a few lines.

First, when I started my script, I wanted a default project or context (I'll use 'project' from now on, but it also applies to the context-script). To do this I created a 'property' at the beginning of the script:

property defaultProject : "Miscellaneous" property alertItemNum : ""

I used the alterItemNum for my alerts through this very simple routine:

on notify(alertName, alertTitle, alertText) display dialog alertText as string with icon 1 end notify

That went at the end of my script.

I started by addressing OmniFocus and 'talking' to the open document:

tell application "OmniFocus" tell front document tell (first document window whose index is 1)

Then, I checked to see if that document had anything selected, and if not, give an error-dialogue:

            set theSelectedItems to selected trees of content
            set numItems to (count items of theSelectedItems)
            if numItems is 0 then
                set alertName to "Error"
                set alertTitle to "Script failure"
                set alertText to "No valid task(s) selected"
                my notify(alertName, alertTitle, alertText)
                return
            end if

If I have no items selected, the script will call the alert routine from above ( my notify(alertName, alertTitle, alertText) ). Because I created a separate routine, I can use this anywhere in the script.

Next, display a dialogue asking for the project: ` display dialog "Change to what Project? " default answer defaultProject buttons {"Cancel", "OK"} default button 2

set theProject to (the text returned of the result) ` The variable 'theProject' will now contain the name of the (new) project to move the tasks too.

Next, the loop to go through all the items and move them:

            set selectNum to numItems
            set successTot to 0
            repeat while selectNum > 0
                set selectedItem to value of item selectNum of theSelectedItems
                set succeeded to my ChangeProject(selectedItem, theProject)
                if succeeded then set successTot to successTot + 1
                set selectNum to selectNum - 1
            end repeat

This loop will end as soon as the variable 'selectNum' (= numItems which I set to the count of the items in the variable SelectedItems) reaches 0. It calls the routine 'ChangeProject' which I'll get to in a bit, but I first want to wrap up this part. Let me also explain the 'if succeeded then set successTot to successTot + 1' line. The line before sets 'succeeded' to the result of the ChangeProject routine. This result can mean anything, numbers, letters, whatever. In this case we use it to return a 'true' or 'false'. That way, we only need to use 'if succeeded' (which will either be 'true' or 'false') as a condition. We don't need to check the actual content of the variable. This can come in handy for various checks, and it took me a while to catch on to that, so I figured I'd mention it here.

To end this main routine, I used:

            set alertName to "General" set alertTitle to "Script complete"
            if successTot > 1 then set alertItemNum to "s"
            set alertText to successTot & " item" & alertItemNum & " changed to Project " & theProject
        end tell
    end tell
    my notify(alertName, alertTitle, alertText)
end tell

Basically, this tells the dialogue box to say the script ran successfully and displays the number of items successfully moved and only to use the 's' after 'item' if the count of successful moves is higher than 1.

That wraps up the main part.

The routine to actually move the task to the other project only took 21 lines:

on ChangeProject(selectedItem, theProject)
    set success to false
    tell application "OmniFocus" to tell default document
        if (theProject is not "") then
            set MyProjectArray to null
            set MyProjectArray to complete theProject as project maximum matches 1
            try
                set MyProjectID to id of first item of MyProjectArray
                set theNewProject to project id MyProjectID
            on error
                set theNewProject to (make project with properties {name:theProject})
            end try

            try
                set newtask to selectedItem
                move newtask to end of tasks of theNewProject
                set success to true
            end try
        end if
    end tell
    return success
end ChangeProject

The first line sets the success to 'false', because we want to actively, after having our success, set it to 'true'. We then chat with OmniFocus again, and this time, we'll just talk to the default document (the one you have open). If the variable 'theProject' is not empty, we'll continue. If it is, the 'if-end if' ends, without having set the 'success' variable to true (and thus, the script failed). You could technically build in an extra loop to change it to a default project, however, I prefer it this way. If I accidentally emptied that dialogue-box, nothing will happen, just as I like it.

If theProject does contain something (anything), the script continues with its routine. It sets the MyProjectArray to null (makes it empty, just in case). It then used OmniFocus complete option to find the first matching project of OmniFocuses project-list. If you've ever only typed the first three letters in one of OmniFocus's project-areas (to set the project) and it magically came up with the right project, this is the same thing. It means you only have to type the first three or four letters of your project, and the script will find it. If it can't find the project, it will create it for you (at the end of your project-list).

After that, it will simply try to add the task to the desired project.


Shopping lists

img

[Updated: 2009-12-11: I no longer recommend Shopper, as of version 5.0. This paid app started to display ads and other cluttering info. See my newer post for more info ]

I generally make a shopping list when I go out buying groceries (about once per week). I used to go nearly every oter day, and spent money on food I hoped I could eat (but usually couldn't) which turned into one big waste pile which didn't feel good, money and waste wise. I put myself on a 'shopping list diet' basically, not buying anything that's not on the list. I check the pantry and the fridge before I go out and note what I need to buy. I read somewhere that if it wasn't important enough to put on your list while checking pantry and fridge, it's certainly not important enough to buy in the store just because you see it.

I do stray from this a bit, sometimes, when in the store I remember I need to buy dog-cookies (not in my pantry, so I don't see that I need too) or better, when they're on sale. I want to have a good enough stash of dog-food and treats for my dog. So occasionally I will stray from the list a bit, however, in general, the list really works. I have basically cut my grocery spending by at least 40% (yes, I did overspent horribly on groceries for a while).

For my shopping list making I've used Shopper for iPhone since September last year (and I admit I've strayed from the list a lot until last month, nothing to do with the program). I love the way it works, though I have flirted with other programs in the meantime. See, what I missed was the option to set the price based on store (to see where I could get the best deal). Realising today I had never e-mailed them to tell them that, I went to the website and found an entire page about Shopper v3 with all the functions I missed.

Now I can't wait for it to come out. I'm sure I'll love it. I love Shopper v2 for its simplicity already. Can only get better... ;)


Bit.ly + TextExpander + Applescript = WIN!

I wanted an easy way to shorten my URLs through one of the URL-shorteners out there. I liked bit.ly, because it's nice and short, has an easy to navigate web-interface (without a mouse) and I can use its magic with my terminal (cURL).

I also very much like TextExpander and after googling a bit, I ofcourse found an Applescript for TextExpander and Bit.ly. That link also shows how to set it up in TextExpander, very handy! The script does not however use your actual bit.ly account so you can keep track of the URLs you shorten. I tweaked it and made adjustments and it took hours and ofcourse, then I find this which is almost exactly what I had, except with URL-encoding (yummy). The only problem with that one was that I couldn't get it to have the URLs show up in my recent history. The 'history=1' didn't seem to work.

I tweaked some more and came up with something that completely does what I want. I use OmniWeb so I replaced the

set the PageURL to (the clipboard as string)

with

tell application "OmniWeb" set PageURL to address of active tab of browser 1 end tell

If you use safari, use

tell application "Safari" set PageURL to URL of front document end tell

I've made this as readable as possible, the '¬' do matter in Applescript.

tell application "OmniWeb" set PageURL to address of active tab of browser 1 end tell

set login to "YOUR LOGIN" set api_key to "YOUR API KEY" set the EncodedURL to urlencode(PageURL) of me

set curlCMD to ¬ "curl --stderr /dev/null \"http://api.bit.ly/v3/shorten?format=txt&longUrl=" ¬ & EncodedURL & "&history=1&login=" & login ¬ & "&apiKey=" & api_key ¬ & "\""

\-- Run the script and get the result: set bitlyURL to (do shell script curlCMD)

return bitlyURL

on urlencode(theText)
set theTextEnc to "" repeat with eachChar in characters of theText
set useChar to eachChar
set eachCharNum to ASCII number of eachChar
if eachCharNum = 32 then
    set useChar to "+" else if (eachCharNum ‚↠42) and (eachCharNum ‚↠95) ¬
    and (eachCharNum < 45 or eachCharNum > 46) ¬
    and (eachCharNum < 48 or eachCharNum > 57) ¬
    and (eachCharNum < 65 or eachCharNum > 90) ¬
    and (eachCharNum < 97 or eachCharNum > 122) then
        set firstDig to round (eachCharNum / 16) rounding down
        set secondDig to eachCharNum mod 16 if firstDig > 9 then
            set aNum to firstDig + 55 set firstDig to ASCII character aNum
end if
if secondDig > 9 then
    set aNum to secondDig + 55
    set secondDig to ASCII character aNum
end if
set numHex to ("%" & (firstDig as string) ¬
 & (secondDig as string)) as string
 set useChar to numHex
end if
set theTextEnc to theTextEnc & useChar as string
end repeat
return theTextEnc
end urlencode

ETA (2010.09.30): bit.ly changed a few things so I changed the script above to reflect that


Cleaning up my mailboxes, and useful procmail-bits.

I started decluttering my e-mail. I thought over 1gb worth of e-mail took up too much space, and what the hell did I save in those folders anyway?

I found I also had a huge procmailrc that filtered through my messages and put them in many nested folders.

Before I started I made a small inventory of what I had:

  • work-account, over 600MB in 4000 e-mails
  • private account, over 400MB in 3000 e-mails
  • third fun account, some 25MB worth of mail, nothing really important.

I use IMAP exclusively, and my accounts have about 1GB of space each, so I had the space to save it all. I also have the space to stack my living-room full of boxes, but I'd rather not.

So, I took the necessary steps to clean it up.

Step 1: Less folders!

I decided no more nested folders! This made everything a lot easier, and much cleaner, in mail.app and in mutt. Instant relief. Though I can't and won't go for that 'single archive' approach, I do prefer to have as little folders as possible. Right now I have the default 'Sent' (which I clear out daily) 'Trash' and 'Draft', and for my work account I have the folders 'work' 'social' 'specific mailing-list' 'other mailing-lists'. For my private account I have 'social', 'web', 'license-codes', 'health' and 'finance'. I do receive some social e-mail on my work-account (no rules against that where I work) so I decided to give that a special folder. I made a general and quick separation, based on gut-feeling alone. My work-account receives work-related mailing-lists, but all my other lists go to a third, specifically meant for mailing-list. This way I can disable the account, or simply not read it, if I just want to read my private e-mail.

Step 2: Clearing out old mail.

I went through all my e-mail.

Yes, all of it.

It was Hell.

It was horrible.

It was painful.

I have no clue why I saved so many e-mails that made me feel bad. I tossed them out.

I had e-mails from orders I made, years and years ago. Out they went.

Work related e-mails from problems long solved (talking years here). Delete delete delete.

E-mails with 10MB worth of photos attached. Saved the photos, deleted the attachment from the e-mail if I wanted to keep it, or deleted the e-mail entirely.

I deleted a lot.

I went from having over 1gb worth of e-mail (combined in all three accounts) to about 40mb (combined in all three accounts). I did it last week, and I still feel pretty damn good about it.

Step 3: Perfecting the archive process.

When e-mail from my family arrives, it gets tagged with a special header that MailTags understands. I did this by adding the following rule to my procmailrc:

:0f * ^FROM.*(adres1|adres2) | formail -A 'X-Keywords: family'

This tells procmail that if the mail comes from either 'adres1' or 'adres2' to add a header which says 'X-Keywords: family'. I have a similar rule for mails from friends.

I can then choose to filter it directly to my folder 'social' (for friends and family)

:0 * ^(X-Keywords|X-Mailtags).*(friends|family) .social/

It opens up all kinds of useful tagging!

Then, I looked at my mailing-list mail. I didn't want the hassle of creating a new rule for every list I joined, or to have my procmailrc clog up with old rules, so I looked around and found a great solution:

` :0 * ^X-BeenThere: \/[^@]+ * ! ^(List-Id|X-(Mailing-)?List):.* .$MATCH/

0 * ^((List-Id|X-(Mailing-)?List):(.[< ]\/[^>])) { LISTID=$MATCH

:0
* LISTID ?? ^\/[^@\.]*
.$MATCH/

} `

Both these rules do the same thing, but they act on different headers. Not all mailing-lists use the same method, so I had to use more than one rule. Basically it either looks at the @X-BeenThere@ or @List-Id/X-Mailing-List/X-List@ to see what list the message comes from, and then filters it into a folder with the same name. Excellent!

Step 4: Enjoy!

After a week of using my freshly cleaned mail-accounts, I still feel great about it. Almost everything goes automatically, and I've only had to do minor tweaks so far. With the help of MailActOn I can easily file my e-mails and keep everything nice, clean, sorted and stick to Inbox Zero (which I've done for quite some time, but that archive of mail just kept on bugging me).

Aaaah, the joys of a clean mailbox!


Why I like OmniWeb...

After several days of OmniWeb use I remember why I so happily used it before. It zooms through pages and (yes, get this!) I can actually watch (YouTube) movies again. For months every time someone sent me a link to a YouTube or other movie I'd either have to say 'Sorry, can't watch that' or forward the link, I'm almost afraid to say, to my iPhone so I could watch it there. Yes, you got that right, I could watch internet-movies on my iPhone but not on my laptop. Yes, I have an old laptop, but I love it.

With OmniWeb I can actually watch most of them (though a bit staggering sometimes) because the browser itself doesn't eat up too many resources (looking at you again Firefox! this hate will soon pass but I will indulge in it a bit). So far I have not once had to close my browser or other programs to reclaim memory / cpu. Closing a few tabs does the trick. Now, I may have to do this every once in a while, but having to do it every two hours (you know who I'm talking about) gets really really annoying.

Aaah, the small pleasures in life... YouTube movies...