Archive for January, 2006

January 26th 2006

Ask the Dev Answers

Up front, let me say how fun it was to write answers to these questions last night. I took a little bit of time before lunch to post them, as I got too tired to finish formatting them last night. If you have any more, feel free to ask!

When will iyeyhwuk be fixed? :)

Done. It’s easy to fix things that aren’t bugs in our code :)

What color underwear are you wearing right now?

This is one of those details that is better left to the imagination of my readers.

Who’s your favorite user and why?

Actually, there’s too many to name. There’s so many contributors to the community that are invaluable, and it’s always great to see what everyone comes up with.

How did you end up at REAL Software and in Austin?

I was very persistent. My older brother offered me a chance to live with him for free for the summer between my senior year and my first year at college. Since in small-town Kansas minimum wage jobs pay … minimum wage, and in Austin a job at McDonald’s would net you $8.75 an hour, it was a great opportunity. I honestly was hoping for a job at some place like Starbucks.

However, I was online at what remained of the REALbasic Cafe, and Paul Scandariato (Intelli Innovations, Inc.) suggested that I try to get a job at REAL Software. Since I had been using REALbasic for about 5 years at that time, I thought that would be a cool place to work.

So, I kept emailing Geoff and Dave until they finally invited me in for an interview, and I began interning the next day.

A year later, a full time job opened up. I took it, and have enjoyed it ever since.

What did you study at Kansas State University?

I started out as a double major in Piano Performance and Computer Science. While I loved playing the piano, and I learned a lot in my classes, I didn’t have the dedication to practice several hours each day, so I dropped that major for the second semester. During my second semester, I began realizing that I was paying a lot of money to study something I was already making a living with — I was paying for college by programming, which is what I was getting a degree in.

I wasn’t a role-model student. I skipped all of my computer classes that didn’t have tests that day, waited until a couple hours before the assignment was due before starting the programming assignments, and in general slacked off and still received A’s.

Getting a computer science degree isn’t important to me. I learn faster by studying on my own, and programming on my own. I’m not saying college isn’t worthwhile — on the contrary, it is very helpful to many people.

What’s your dream feature for REALbasic?

ESP module! Err, realistic feature? The problem is, I have too many features I want to see. A few features that come to mind are:

  • Data modelling for designing your data structures visually, and having it automatically generate code for talking to binary files, XML, and databases in a cross-platform manner.
  • Code analysis tools built it, such as profiling, ‘warnings’, and tips. I’m not an advocate for ‘warnings’ showing up every time you build, because you tend to ignore them. However, if you could run an analysis tool that would tell you deprecated functions, where you might have an error with implicit conversions, etc., I think it would be a very valuable tool. Also, class diagrams.
  • More code editing features- I want to be able to annotate my code with links, pictures, movies, sounds. I want comments to automatically wrap. I want parameters of methods to autocomplete. I want to be able to disclose blocks to hide code I don’t care about at the moment.
  • Classes inside of modules, including support for fully-qualified types. This would help encapsulation so that you could have private “support” classes that no one else can see, but that your special package can use. Fully qualified types would allow you to have Module1.FooClass and Module2.FooClass, and nothing would ever get confused.
  • A system like VB’s Delegates, where you can implement events of one class in another class. A common example would be instead of creating a subclass of Timer, you could just implement the action event of your timer instance inside of your other class.
  • A full optimization layer for REALbasic code. Enough said — there’s no reason REALbasic code can’t be as fast (or even faster in some cases) than C/C++ code, and I want to eventually break the speed barrier using plain REALbasic.

I think that’s enough for now :)

What object-oriented features would you like to see added to REALbasic?

Good question. One is mentioned in the above question — a delegate-like system for REALbasic. A few others that come to mind are:

  • Introspection: Useful for something such as a generic serialization framework.
  • Template-style classes: Useful for many things.
  • Weak References: This is one missing link in our reference counted world. While you can work around their non-existence, it would make life much easier when solving circular references if we had weak references.

What annoys you most about REALbasic?

There are three things that I see as slighly annoying:

  • It’s sometimes easier to do something repetitive in TextWrangler with RegEx than it is to do it in the IDE — such as define a lot of really small classes.
  • I want a separate tab for laying out a window and editing the code of a window. I find myself looking for a tab to switch to when I want to see my layout, and I can’t find it.
  • It’s not easy to search the current method — it is easiest done with the mouse once the find dialog pops up. Which leads me to my next point — it shouldn’t be a dialog.

Overall, however, I prefer REALbasic over any other environment, and I much prefer 2006 to 5.5 and prior.

What types of programming projects do you enjoy working on the most?

Recently, I’ve been more interested in compiler features more than anything. While Mars does incredibly awesome work for the time he has, he is only one man and we can only get so many things out of him at one time. He’s tackled the big things, and I’ve pitched in with some small-ish things, such as shared properties and methods, the new for-loop syntax, continue statement, single-line #if statement, insert unnanounced feature that will be revealed at the Cocoa talk at REAL World, and more that I know I’m forgetting.

However, what interests me most are things that are new to me, or different than I usually work on. Working for REAL Software fits me great because not only do I get to work on the things that I love, I get to work on a large variety of things, which keeps me interested in what I’m doing.

How do you seperate computer use for work, and private? Meaning, how do you get your self to even get in front of a computer in your spare time after a grueling day at work? Or do you do something completely different in your spare time, like don’t touch the computer?

Well, for me programming has always been a hobby. Ever since HyperCard was first set in front of me when I was in first grade, I always enjoyed spending time in front of the computer, exploring new territory. The only difference is that now I get paid to program.

There are plenty of times that I get home and don’t touch my computer at all. However, I often have a good 15-20 different projects that I want to work on. Between Thanksgiving and Christmas, my schedule was along the lines of:
7:00- Get up, eat breakfast while reading email
7:15- Begin working on Cocoa
8:15-8:30- Reach a good stopping place, finish getting around, drive to work.
9:15- Work more on Cocoa
6:30-7:00- Get hungry, leave work to head home and eat
7:45- Work more on Cocoa
10:30- Go to sleep

I did that for four weeks straight, and why could I do that? Because I was so excited about it, and was having fun doing the work. Now, if it had been a project that wasn’t that interesting to me, it’d stay at work.

The other obvious motivator for other projects can often be money. I’m currently finishing up a product that I’m going to begin marketing in the next couple months that has a lot of potential. It has me excited not because I necessarily am having the most wonderful time writing the software, but I’m having fun starting a business, fitting all the pieces together, and dreaming of becoming rich ;)

However, even with all the excitement of a project, there are indeed some days that I’m just braindead when I get home, and all I do is watch some TV, play a game or two, and play the piano. Having a hobby such as playing the piano is great. Being able to take a 15 minute break every hour to go and relax away from the computer is a necessity.

What is the work environment like? What’s a typical day at RS like?

It’s very laid back, and perfect for me. The thing I love about REAL Software the most is the people. Even when I was only an intern, it was great to come to work with everyone each day.

My typical day begins at 8:30 when I start my drive into work. I currently live in North Austin, while the office is in South Austin. It generally takes me 25 minutes in the morning for my commute. I do plan on moving much closer in July, when I get married and my lease expires.

I log into my computer when I get to work, plug in my FireWire drive, and read emails from the lists, check the Feedback System for new items assigned to me, and begin working either from that list or the projects I was working on the day before.

A group of us usually go out to lunch together, alternating between favorites and new places every-so-often. Lunch is about an hour long, sometimes longer (for places like Hula Hut), sometimes less (for places like Taco Bell). Continue working after lunch until about 6:00, where I start my drive home.

I have my own office currently, although that isn’t going to stay that way forever. I kick my shoes off in the morning, play some classical music throughout the day, and keep the lights off in my office (the sunlight from the windows is enough light for me to be comfortable).

There are practical jokes played once-in-a-while, and often they are quite elaborate. If you want to hear some good stories, get some good ideas, or share some good ideas, I’ll share them much more easily over a lunch conversation at REAL World than I will on my public blog ;)

All-in-all the work environment is basically exactly what I’ve always hoped for in a job.

Do you think that you can write as good software in real basic as you can do in Cocoa? Then I am talking about like Delicious Library, iPhoto, sandvox and yojimbo (bare bones) ? And if you say yes, then why don’t we see such software written by RB?

Yes. There’s nothing special about those applications you mention. Things will be easier once REALbasic builds Cocoa to utilize some features that they take advantage of, but it’s not impossible to build such programs using REALbasic. Here are a few applications that I think are great examples of what REALbasic can look like on the Mac:

  • REALbasic 2006: Sorry to pimp our own product out, but I think that the new REALbasic feels like a peer on OS X more than any other version of REALbasic.
  • Intelli Innovations products, such as IntelliScanner Media Collector: This product actually came out before Delicious Library, and while it doesn’t have a bookshelf (which can easily be written as a custom canvas), it still looks and feels like a Mac OS X application. All of their products have sensible designs, IMHO.
  • Studiometry: This cross platform application looks great on Mac OS X. Definitely something to check out.
  • ProSelect: This app, while not using a standard UI, is cross-platform and an excellent example of a well designed application.
  • Shared Space: A visual organizer. While not currently being developed, you should download it and check it out. It’s a great program that looks great as well.
  • What’s funny is that the question mentioned Cocoa apps, such as “iPhoto.” iPhoto actually began as a Carbon application (it was available for Mac OS 9). However, they did rewrite it in Cocoa.

    The other interesting part is that the applications you mention have largely custom interfaces. There’s nothing stopping you from writing a custom interface in REALbasic either.

10 Comments »

January 25th 2006

Ask the Dev

I had an idea over lunch that not many people know very much about me aside from the fact that I work at REAL Software. So, I’ll give everyone here a chance to ask their questions. Simply post the questions in the comments area, and I’ll follow up in a day or two with a post containing answers to all the questions asked*.

*This isn’t an opportunity to ask me questions about unannounced things in REALbasic, so I may skip questions like that :)

10 Comments »

January 24th 2006

REAL World 2006

If you haven’t already, you should sign up to come to REAL World. I’m hoping to meet each and every one of you there, and if you check out our website, a full schedule has been posted. As you can see, there’s quite a few interesting topics. I’ll highlight what I’m presenting and helping organize:

  • Updating Your Application To Cocoa: A two hour session, presented by me, detailing how to update your application for Cocoa (including Universal Binaries), accessing Cocoa-specific features, and making your application perform as good as it can on Mac OS X. While I can’t guarantee that you’ll see a 2006 alpha with Cocoa support before REAL World, I can guarantee you that you will see Cocoa at work if you come to REAL World, and if you ask nicely enough, I might even let you try it out yourself :) I’ll be able to answer nearly any question you have, and it should be a fun and extremely worthwhile two hour session. I’m looking forward to “letting loose” and being able to talk about Cocoa in the wild ;)
  • Introduction to Creating Plugins Using GCC: Learn how to create plugins for REALbasic using GCC for Mac OS X, Windows, and Linux. We’ll go through the process of creating a plugin, setting up a makefile system, and touch on debugging plugins as well.
  • Mastering Declares: One of my favorite things to do is “hack” around and call into cool system functionality using the declare statement. Come and enjoy this informative session that will take you through the basics and give you tips and tricks on writing declares. Geared towards intermediate and advanced users alike, even if you know how to write a declare statement, you might learn something new. While this session will touch on Cocoa, be sure to come to the Cocoa session to learn even more about how to access Cocoa functionality.
  • REALbasic Coding Competition: Mike Bailey and I are organizing several competitions for everyone to participate in. Bring your laptops with you to each of the competitions and compete alone or with other people to solve problems and win prizes. There will also be a conference-long competition where winners will be announced at the end of the conference. I hope to have everyone participate in at least one of the competitions!

I hope every one of you can make it to at least one of my sessions. Even if not, I’ll be hanging around available for conversation, cold beverages, and even maybe a bit of tech. support :)

8 Comments »

January 18th 2006

All That Mac Terminology

The Mac has had a very transitional past, and a lot of things have come and gone. In the midst, we’ve seen different processors, APIs, file formats, and OSes. REALbasic supports a lot of the Mac heritage, and thus it is sometimes confusing to hear these terms thrown around. Hopefully this post will clear up any confusion that people might have.

Processors

  • 68k: The processors that drove the Macintosh platform from day 1 were stack-based processors that had some unique characteristics about them. System calls were done with software exceptions, which was actually quite efficient in that day. If you remember in REALbasic, you could specify an Inline68k string on a Declare statement — that was the 68k assembly code that raised the exception. Motorola is still using 68k processors, re-branded as ColdFire, as solutions for embedded solutions that require low-power ratings.
  • PowerPC: These RISC processors helped get the Macintosh to where we are at today. Arguably, the architecture is better, if only because it’s so much cleaner. RISC stands for Reduced Instruction Set Computer, which means that the complete reference manual for the PowerPC architecture doesn’t require several volumes to span, but rather a small-ish book will suffice (of which I have one sitting on my desk). However, it’s not because of the merits of the architectures that Apple has switched. PowerPC I expect will continue to be around for some time in many forms (just not the Mac form in the near future).
  • x86: The x86 architecture describes a very large series of processors. Not just Intel, but also AMD. The x86 name arises from a long series of processors that were all ended with the suffix of “86″: 8086, 80186, 80286, 386, and 486 (list of processors attributed to Wikipedia). On a side note, the day the Intel iMacs were announced, Apple’s stock ended the day at $80.86. These processors, while much more complex in instruction set, also are a respectible platform. Now, all major personal computer brands (excluding gaming consoles, if you count those) are looking to be x86 within the next couple years.

Operating Systems

  • System VersionNumber: The old name of the operating system was simply “System” followed by a version number. This lasted until it’s final version, 7.6.1. In these days, the only APIs around were called the “Toolbox”, and almost all of the system code was written for the 68k processors. However, in the System 7.1 days, PowerPC computers were introduced.
  • Mac OS 8.0-9.2: These versions of the OS were very transitional. Carbon was introduced in 8.1 (IIRC), and applications began adopting it. This was a huge undertaking, but Apple knew the future was going to be different, and at the same time programming System 7 and prior was quite a nightmare. Things got much better in these days.
  • Mac OS X: This is the OS we’re using today.

Application Programming Interfaces (APIs)

  • Toolbox: The Toolbox terminology has evolved. Originally, it meant the set of system calls available on the earlier Macintosh days (pre-Carbon). However, it’s a catchy name, and has evolved to be used in even current contexts
  • Carbon: This API was originally called a transitional API. However, once Mac OS X came out, Apple rebranded it to be a peer to Cocoa on the Mac. The downsides to Carbon over Cocoa didn’t mean too much in the earlier days, but Carbon continued to evolve into 10.3, where HIViews were finally stable and complete. One transition after another (QuickDraw->CoreGraphics, control manager to HIVews, WaitNextEvent->RunApplicationEventLoop/ReceiveNextEvent) makes it hard to support older systems while being a good citizen on the latest systems. It’s not impossible, but quite a bit of work.
  • Cocoa: This API is Mac OS X only. While it’s written and exposed through Objective-C (a programming language), it can be utilized within other languages. This API has been around since the days when Mac OS X was NeXT.

Executable Formats

  • PEF: Named the Preferred Executable Format, it’s actually not preferred anymore. It continues to work today on Mac OS X, but you cannot build an Intel-native version of your application using PEF. PEF was the only way to deploy applications before Mac OS X, and if you built a Carbon-PEF application, it would run natively on a PowerPC Mac OS X machine.
  • Mach-O: Mach-O, short for Mach Object, is the native executable format on Mac OS X. It’s not really that special — it’s what has been native to NeXT for a long time, and that’s the way it continues to be. To build an app that works on an Intel Macintosh, it must be built in the Mach-O format.

So, now the interesting parts — these technologies are all separate entities. Cocoa and Carbon applications can be built as Mach-O (Cocoa Mach-O, Carbon Mach-O) and both can be built for PowerPC, x86, or both (universal). Carbon can be built as PEF, but not Intel. Because of this, it’s incorrect to say something like, “This doesn’t work in Carbon, but works in Mach-O.” Because Carbon is an API and Mach-O is a file format, they are incompatible statements. The correct way to say it would be, “This doesn’t work in PEF, but works in Mach-O.”

And to answer one question that might be asked, yes, it would be possible to build a Cocoa PEF application. Because Cocoa is simply an API, it can be called from any executable with a proper Objective-C bridge. The only extra layer is transitioning between Mach-O and PEF, which is easily done. When I first wrote the core bridge code for Cocoa in REALbasic, I realized that with a little extra work REALbasic could actually build Cocoa PEF applications. However, Cocoa PEF applications wouldn’t be useful in any ways — I’m just using it as a point that PEF and Mach-O don’t determine what API you’re using.

Hopefully this cleared up the confusion on what Carbon, Cocoa, Mach-O, PEF, and how they relate.

8 Comments »

January 16th 2006

New Intel Macs

Well, I’ve been excited about the new Intel Macs. They look great, and look like they’re going to be great machines. Aside from the obvious addition of another core for each machine, they both have built in capabilities for video conferencing, as well as digital audio, which are both welcome additions.

The iMac doesn’t have much mystery. Looks pretty much the same, lots of power, wonderful screen.

The MacBook Pro, however, has a few things that are mysterious. First, it’s name — who thought it up? I think they could have done a much better job, such as Xbook — following suit after the Xserve. It gets rid of “Power”, and sounds much better in my opinion.

The second thing is: we heard so much about better performance-per-watt of the new Intel chips, right? Well, how does it stack up? I can’t find a single mention on Apple’s website about how long they estimate the battery will last. Go ahead, search. I did search a week ago, and searched again this morning — still no guesses on how long the battery will go. Given that this was one of the major selling points at the WWDC keynote, I’m a bit baffled.

However, the folks at Unsanity had a very revealing post about the MacBook Pro:

Power: The new portable ICBMs (Intel-chip based Macs, also iCBM) require more power than their previous iterations. They have a 60-watt-hour battery compared to the old PowerBook’s 50-watt-hour battery. They also have 85 watt AC adapters compared to the old 65 watt AC adapters. Of course, more power also means more heat.

Interesting. So, what I’m anticipating is that at “reduced” power, the MacBook’s battery life should be equal to the PowerBook’s. However, at the highest settings, I’m anticipating a worse battery life. This is a bit saddening, as I was hoping to hear of 5+ hours of continued usage out of the next generation.

With that said, I still want one. I’m not going to buy one for at least another couple months, but it’s high on my list of things I want.

What’s everyone elses impressions?

8 Comments »

January 13th 2006

Relative Paths

I needed a function to create a cross-platform relative path, and decided to make it into a module for everyone’s benefit. If you’ve ever wanted to, in addition to storing the SaveInfo, also save relative path information for files, you know it can be a tricky problem. However, this module adds to methods to the FolderItem class to do exactly this.

Module RelativePath
// Constants
Private Const kUpDirPath = ..
Private Const kSameDirPath = .
Private Const kPathSeparator = :

// Methods
Function CreateRelativePath(Extends fromFile As FolderItem, toFile As FolderItem) As String
If Not fromFile.Directory Then
fromFile = fromFile.Parent
End If

// Get a list of path parts by looping until the parent is nil.
Dim tmpf As FolderItem
Dim fromPathParts() As String
Dim toPathParts() As String

tmpf = fromFile
While tmpf <> Nil
fromPathParts.Append tmpf.Name
tmpf = tmpf.Parent
Wend

tmpf = toFile
While tmpf <> Nil
toPathParts.Append tmpf.Name
tmpf = tmpf.Parent
Wend

// If the top-level items don't match, we're on different volumes, and that ain't going to work
If fromPathParts( ubound( fromPathParts ) ) <> toPathParts( ubound( toPathParts ) ) Then
Return ""
End If

// Now, remove each of the common items from the tops of both arrays.
While ubound( fromPathParts ) >= 0 And ubound( toPathParts ) >= 0 _
And fromPathParts( ubound( fromPathParts ) ) = toPathParts( UBound( toPathParts ) )
fromPathParts.Remove( UBound( fromPathParts ) )
toPathParts.Remove( UBound( toPathParts ) )
Wend

// Now, for every "from" path part that's remaining, it's one level we must go up.

Dim relativePathParts() As String

If UBound( fromPathParts ) < 0 Then
// Just operate on the current directory
relativePathParts.Append kSameDirPath
Else
For i As Integer = 0 To UBound( fromPathParts )
relativePathParts.Append kUpDirPath
Next
End If

// Now that we're up to the same parent folder, we need to traverse down into
// each "toPathPart"
While UBound( toPathParts ) >= 0
relativePathParts.Append toPathParts.Pop
Wend

// Finally, return the result
Return join( relativePathParts, kPathSeparator )
End Function
Function ResolveRelativePath(Extends fromFile As FolderItem, path As String) As FolderItem
If Not fromFile.Directory Then fromFile = fromFile.Parent
// Split the path parts and operate on the parts
Dim outf As FolderItem = fromFile
Dim pathParts() As String = Split( path, kPathSeparator )

For i As Integer = 0 To UBound( pathParts )
If outf = Nil Then Exit
If pathParts(i) = kUpDirPath Then
outf = outf.Parent
ElseIf pathParts(i) = kSameDirPath Then
// Nothing, stay the same
Else
outf = outf.Child( pathParts(i) )
End If
Next

Return outf
End Function
End Module


Download this project

Example usage:

Dim f1, f2 As FolderItem
f1 = GetOpenFolderItem( "????" )
f2 = GetOpenFolderItem( "????" )

Dim relativePath As String
relativePath = f1.CreateRelativePath( f2 )
msgBox "RelativePath is " + relativePath

f2 = f1.ResolveRelativePath( relativePath )

msgBox "Resolved file is " + f2.AbsolutePath

3 Comments »

January 10th 2006

Announcing Cocoa

That’s Cocoa! He’s my 6 month old puppy I just adopted on Sunday. I’ve been wanting to get a dog since I was a little kid, but only these last couple weeks was my desire strong enough to seek one out. Finally, I saw one that I loved, and despite not being brown, I still named him Cocoa, after this large part of my life being unveiled the day after I adopted him.

He’s a black lab mix, and has quite a bit of energy, but loves to cuddle when he’s tired. He’s still adjusting to my apartment, which he’s finding quite roomy. This is the first dog I’ve house-broken, and I feel a little bad when I need to put him up for the morning, the afternoon, and when I go to sleep. He loves the walks though, and I love that it’s getting me outside more. Although my sleep last night wasn’t as continuous as I’d like, it’ll only get better as he gets more adjusted to this apartment.

If you were hoping for more information about REALbasic and Cocoa — sorry! If you really want more information, be sure to join the beta program via the feedback system so that when an alpha is available, you can try it out!

I hope everyone else is as excited about this as I am. It’s been the project I couldn’t talk about, tell anyone about, or even mention for the last 8 months. While I wasn’t working full time on it for all 8 months, I have put in a lot of time on it, and it’s been fun writing the code for, as an example, the PushButton and being able to run it and see it work (or not! :P).

Well, I just wanted to show off my new puppy to everyone, and also portray the excitement I’ve had about this project since day 1. Have a great week everyone!

6 Comments »

January 5th 2006

A Joke

I don’t usually post jokes on here, but I couldn’t pass this one up. On another blog I read, there’s a great blonde joke.

Enjoy!

Comments Off

January 3rd 2006

Another Holiday Treat

Happy New Years, everyone!

Well, all is well here in Austin — reaching temperatures of 80 today. On the non-programming front, I got engaged during the break, and have been taking a small break from programming mostly until yesterday.

I’m starting on a project with one of my relatives, originally inspired by my mom, which appears to never have been done before. I attempted to write it back in July, but then ran into some problems that arose mathematically. My uncle used to be the head of the math department at Fort Hays State University, and when my mom told him about it, he began to think about the problem from a different direction. During the break, he and I sat and talked about different ideas on how to solve the problem better and more efficiently — rather than evaluating every permuation possible, approach the problem such that we won’t have to. With his help, we’ve come up with an algorithm to solve the problem. I will hopefully be more verbose about it in the future, but until we’ve hit the market, I can’t go into too many details for fear of the market being crowded before we have a chance to get a foot in on it — there’s no existing software that we can find. Some related, but none that solve the problem completely.

So, I had fun learning some graph theory, re-learning matrix math and delving into some linear algebra, revisiting some set theory — all good fun. My treat today will be pointing out some great plugins for writing programs that need math not built into REALbasic:

  • MPCalc Plugin: If you’re dealing with extremely large numbers, check out this plugin. It can deal with numbers up to 30,000 decimal places with full precision. It also includes a nice set of mathematical functions dealing with these numbers. Related is the Precision Plugin, which provides an easier to use interface, although not necessarily all of the features are available.
  • Complex Plugin: Dealing with imaginary numbers, are you? This is the plugin for you. This provides an easy way to deal with complex numbers in REALbasic.
  • Matrix Plugin: A good plugin for working with matrices. Not much else to be said, other than it works great.

Bob Delaney wrote all of those plugins, and even more. You can see the extensive list here. I’m sure most of you have heard of his plugins, but hopefully someone here hasn’t, or maybe one of you has been dreading writing a class to deal with something he’s already solved.

Hope everyone had a great set of holidays! My new years resolution is to post here more often ;)

3 Comments »