Friday, April 17, 2009

Mac Apps I really Like

(Most of these are free)

1Password
1Password is the primo password app for the Mac. (KeePassX is a good free alternative but it lacks the nice browser integration http://www.keepassx.org)

Fluid Convert web based apps to appear as standalone apps. I might be ditching NotationalVelocity (listed below) and just use simplenote webapp as a fluid app (seems to be working nicely so far.) I use Fluid also for wunderlist and my chess.com site.

Alfred I seem to like this better than the default Spotlight for finding/launching apps.

Evernote Trying to get used to just using this app (I still also use notational velocity for quick notes which syncs with SimpleNote but I might just try to stick to Evernote.)

EasyFind
Doing some more advanced finding on the Mac is a bit cumbersome (even with pathfinder) This simple app makes it easy.


App Cleaner
Get rid of the few extra installed files that might remain behind when you just delete something from your applications.

MacVim
vim but also has all the default OSX hooks for things like cut and paste, etc. Plus an Aqua look and feel.

DropBox
Think of it as an extra directory on your file system that is always available (even on multiple machines) and you can drop stuff in the public folder and make it available to anyone via a link.

Skitch
skitch.com is a webservice that works hand in hand with our application Skitch to give you 1-click uploading of images for fast and fun image sharing.

FileZilla
Excellent all purpose FTP editor (supports SFTP)

SmartSleep
Easily control how your Mac sleeps. I like my Mac set to sleep fast when I close the lid

AppShelf

Adium

SuperDuper

SnapAndDrag

SeaShore

MacFusion & GoogleMacFUSE

VLC

Witch (also in app store)

Onyx

Monday, April 6, 2009

Using Groovy @Delegate

Groovy 1.6 introduces some killer stuff!

I really like @Delegate.

For those that don't use Groovy much, what @Delegate does is best seen by an example. The one in the link above is pretty good dealing with Date in an Event, but as a real world example here's how I needed it....

groovy.sql is pretty cool and you can call toRowResult() on each groovy result set object, which lets you use those GroovyRowResult objects directly calling the column name as properties... for example..


def sql = Sql.newInstance("jdbc:jtds:sybase://.....I", "user", "passr", "net.sourceforge.jtds.jdbc.Driver")
def results = []
sql.eachRow("SELECT firstName, lastName FROM Person") {
results << it.toRowResult()
}


//print first and last names from results collected:
results.each {
println "firstName = $it.firstName lastName= $it.lastName"
}


Ok simple enough, but now what if you wanted to also get a "fullName" property? Ok simple enough we'll just make a Person object and create a method to create it. But wait, I still need access to all those other database fields. Now sure in many CRUD apps you'd already have a Person object with all the typical fields firstName, lastName etc... but in this case I only need display data and I'm perfectly happy with using the database field names for the property names so I want to just use my groovyRowResult directly but also want to be able to call "lastNam.". So in Java what would one do? I don't want to mess around trying to extend GroovyRowResult (if I even could?) or maybe my Person also needed to already extend another Base object as it is. Obviously you want to wrap row in an adapter and then in Java you'd have to use some reflection and proxy method/property calls to the wrapped row object if a call to a method/property wasn't found in Person. Sort of a pain to have to code that proxy stuff though. Granted not difficult and you can cut and paste it from other projects once you've done it once, but with Groovy it's even easier and much cleaner. for my sql example above...


class Person {
@Delegate(interfaces=false) GroovyRowResult row

def getFullName() {
return "${row.firstName} ${row.lastName}"
}
}

//...
sql.eachRow("SELECT firstName, lastName FROM Person") {
results << new Person( row: it.toRowResult() )
}

results.each {
println "firstName = $it.firstName" // finds firstName in delegate!!!!
println "lastName = $it.lastName"
}


Before using Delegate I was using propertyMissing, which would be fine in this case since I only have one delegate but things would be trickier if I had multiple nested objects (whereas using @Delegate it wouldn't be an issue - assuming you didn't have conflicting method/property names - in which case not sure what would happen.) Even using the old propertMissing in Groovy is quite cool:


//using propertyMissing
class Person {
@Delegate GroovyRowResult row

def getFullName() {
return "${row.firstName} ${row.lastName}"
}

def propertyMissing(String prop) {
def result = row."${prop}"
}
}

Blogger Syntax Highliter