Friday, December 12, 2008

Remember The Milk

I was a dedicated omnifocus user, but I just switched to Remember The Milk. If it was just my notebook or a desktop, omnifocus is the top GTD app hands down. However the omnifocus iPhone app is just tooo..... clunky. I have all the usual complaints about it, it loads slow, too much navigation to do simple things, so on and so forth. To me it seems like their developers are too used to the high horsepower of modern macs, and are having a hard time writing an app for a processor/ram/hd constrained product like the iPhone.

Remember The Milk on the other hand, is a pure webapp for macs, with a syncable iPhone app. The webapp is slightly slower than omnifocus for mac, which is understandable. However, their webapp has gmail like keyboard shortcuts, which is nice. I do miss omnifocus's ability to add a new task from anywhere. Remember The Milk also integrates well with gmail, I subscribed to my task list as a calendar in iCal, and has nifty settings like "postpone", and understands natural language as you input data. Unfortunately for omnifocus, the faster Remember The Milk iPhone app made me a switcher. 

Sunday, September 28, 2008

Stanza for the iPhone

I recently downloaded both the OSX and iPhone version of Stanza, with the intention of turning my iPhone into a good pdf reader. The verdict? Stanza on the iPhone is awesome for reading newspapers, books and magazines. Stanza is bad for reading tech documentation, especially those with diagrams and pics. I had hoped that Stanza might be good for tech docs, but alas my hopes were dashed. I still use it on an almost daily basis though, since there's a lot of classic books that are now in the public domain.

Tuesday, September 9, 2008

I have iPhone thumb

I have iPhone thumb, which is alternately known as blackberry thumb or nintendonitis. Trying to switch to my other fingers to give my thumbs some rest. Owie.

Monday, September 1, 2008

Omnifocus for the iPhone

So I bought an iPhone 3G. I figured iPhones are no longer trendy since everyone and their mother has one, and Apple probably has most of the bugs worked out, so I might as well get one. So far I have been impressed. I ended up purchasing Omnifocus for the iPhone, as I really liked Omnifocus for the desktop. However, the Omni Group decided that there would be no recurring tasks on the iPhone version of Omnifocus. What the bloody hell. That's the dumbest thing I've seen this week, and it cost me $20 from the app store.

Sunday, August 31, 2008

Rad Studio crashing again!

It's damn frustrating, this is twice in the last 2 hours. I'm not even doing anything weird, just editing a source file. I checked the ram usage of my workstation, it's at 600mb out of 4gb total. Rad Studio crashes more than any IDE I have ever used in my entire life. 

Tuesday, July 29, 2008

A new age of military healthcare?

So to take a break from all my Delphi stuff, I figure I'll post about where I've spent most of my career, which is in healthcare. The majority of my experience comes in working with the VA's EHR, named VistA. VistA by the way, was created at least a decade before Microsoft Vista. Recently, I've become more interested in CHCS and AHTLA, which is part of the DoD EHR system. Interestingly, it seems that MHS (Military Health Systems) is turning to new web based technologies to gather feedback from their users. I'm glad to see some of the MHS leaders taking advantage of social technologies.

Wednesday, July 23, 2008

Darwin Race of Langauges is Over!

Congratulations to all who finished! My downfall was I bit off more than I could chew by using a semi-familiar IDE and language, while attempting to learn COM and WMI. No excuses though! Even though I couldn't finish the race, I had fun and I learned more about RAD Studio in the process.

My one regret is that due to all the problems to solve being GUI based, I couldn't enter using my best language, GT.M. I bet that would be something no one else has seen =P.

In any case, that's just me rambling on (and trying to find some way to work GT.M into my post). Too bad none of the people who finished the competition entered anything for OSX.

Sunday, July 20, 2008

Special kind of error

I tried to cast an internal control to TwwDBGrid as a TwwCheckBox and use it's Checked property. All I can say is WOW!

Here's the follow on error

That is a special error. As in "Special Education".

Whoops, I still have more time!

For some odd reason, I thought that the competition ended on the 18th. It turns out it actually ends on the 22nd, so I still have more time to work on it. The next block of free time that I have will be on the 21st, so we'll see if I can work some magic to figure out WMI and COM before the actual deadline.

Friday, July 18, 2008

Darwin Race of Languages - Day 4

So I've been defeated by COM and WMI. To me, what's missing in the Delphi world are comprehensive tutorials and documentation like you can find with MSDN and Sun (for Java). What I ended up trying to do was look at existing code that uses WMI in Delphi, and attempt to reverse engineer it. I have a reasonable understanding of the objects and techniques used in the sample code, but when I got stuck, I had no idea what was causing the problem. Unfortunately, the time ran out for the competition before I could make anymore headway. 

Earlier in the competition, I posted about my usual steps when learning something new, for the Darwin Race of Languages, I got stuck on step 2, developing the proof of concept, by reverse engineering existing examples.

If anyone is interested in looking at the code I was working on, the entire project is in a zip file here. Note that I'm not sure if all the imports will be correct on anyone elses pc, as the paths were local to my pc. I can't really call the code "my code", since it was mostly a cut and paste from someone named ciuly. I also used as reference, this project from Planet Source Code, which interestingly enough had errors, but ran on my workstation. When I attempted to extract the code and place it in my project, I ran into the same EOleException that I had in ciuly's example. That leads me to believe that the issue lies somewhere in my project, but not in the sourcecode. 

Darwin Race of Languages - Day 3 Part 2

Still no luck. All I can find are MSDN articles related to WMI on Microsoft's official languages, such as C++, C#, VB, etc. I can also find many examples of using WMI in Delphi, but there are no comprensive, newbie friendly tutorials on the different WMI components as related to Delphi and RAD Studio. I'm sure it's a simple fix to solve my problem, but those simple problems are the things that a newbie friendly tutorial will help walk me through.

When I was learning C#/.NET, I did most of my learning on MSDN. I've done multithreading, socket connections, registry modification, file encryption, used active directory, so on and so forth. I never once had to ask the wider .NET community for assistance, as MSDN has always been good to me. Ditto for learning Java, Sun's documentation is good as well (at least it was back when I was doing Java, the version 1 days).

  Google, MSDN;

procedure Will_I_Win;
  Delphi: New_Language;
   RAD_Studio: New_IDE;
  WMI: New_Component;
   Success: string;
   RAD_Studio := IDE.Create('CodeGear');
   Delphi  := RAD_Studio.Language;
   WMI := Component.Create('MS');
   success := 'You Fail';
   while OtherProjectsGoingOn do
     if Solveable(Delphi, RAD_Studio, WMI, "2 weeks") then
         success := 'yay!';

Darwin Race of Languages - Day 3 Part 1

I've been reading through tons of examples of using WMI with Delphi, and I've tried running what seems like the most likely candidate for what I want to do (return the CPU temperature). However, I keep getting the error below.

It seems like I am unable to use Sinkclass.DefaultInterface when I call Services.ExecNotificationQueryAsync. Since the "Sink" is supposed to be an eventhandler that fires upon receipt of an event from Services, I guess this is a good error, since I don't have any code defined to handle the event, and I have absolutely no clue where DefaultInterface is in my Sink object. 

I'm not sure if I will be able to complete the project before the deadline, but I'll keep trying until the time runs out.

Sunday, July 13, 2008

TStringList's has poor parsing capabilities

TStringList cannot handle spaces in its DelimitedText property. So the workaround is to ensure that your strings with spaces are enclosed in chars that are defined in the TStringList QuoteChar property. So what happens when you use the nifty LoadFromFile procedure on a large delimited text file with many spaces but no QuoteChars? 

The answer is you get a messed up TStringList, because if you have no QuoteChars, TStringList assumes that spaces are delimiters too. Isn't that fun!

The parsing capabilities of TStringList are half-assed at best. In addition to the spaces/QuoteChars fiasco, your delimiter can only be a string with a length of one.

And don't worry, I've already programmed around TStringList's shortcomings. I had to load the file and parse it myself, adding quotes where necessary, then passing it to TStringList.DelimitedText. 

Saturday, July 12, 2008

My Delphi Race of Languages Day 2

Whew, MSDN is always a tough read! So far all I have are a "Hello World" app, and I examined a sample project that I found here. That author uses ActiveX to query WMI, I think I may go the ODBC route as I'm more familiar with T-SQL. Here's a few screenshots of todays small progress.

Here's a screenshot of RAD Studio running inside of Parallels on OSX.

Here's a screenshot of the sample project files.

Here's a screenshot of the imports I did so that I can use WMI with my app. Note that there is an activex import there, I'm probably going to remove that and use ODBC as noted earler.

Here's a screenshot of my simple little hello world.

[edit]I'm not so sure on using ODBC now. I don't know if it's a good idea to assume that an end user will have MDAC installed on their machine.[/edit]

Friday, July 11, 2008

Unclickable Pics in Blogger

I figured out why uploaded pics are sometimes unclickable in Blogger. When you use Blogger's compose mode, and drag pics around your post, sometimes blogger loses the "a href" tag, and leaves behind the "img" tag. Thus, only a pic, no link. Just a handy tip in case anyone else was wondering.

Dropbox is pretty nifty

So to take a break from constantly writing about Delphi and RAD Studio, here's a little bit about Dropbox. Dropbox is an online file storage application which interfaces seamlessly with Finder in OSX. It's actually pretty nifty to be able to work on remote files in exactly the same way as you would a local file. They probably use MacFuse to some extent on their backend. 

Here's my Dropbox directory viewed on the web

Here's my Dropbox directory viewed in Finder

My Delphi Race of Languages day 1

I've checked out the progress of some of the other competitors, seems like my late start has put me behind by a few days. That's alright though. My usual approach to a problem that I don't understand, is to do the following:
  1. Use my google-fu to do some research
  2. Get a proof of concept working
  3. Design the actual application
  4. Testing and refinement
So I'm at the google-fu stage. So far, it seems like the way to go in Delphi is to use WMI (Windows Management Interface), which is a part of the Win32 API, but I need to set up my project in RAD Studio to be able to use it properly.

I entered the Darwin Race of Languages

So my rantings on Delphi and RAD Studio sort of spawned a programming/IDE competition hosted here. I got an invite to compete, and I figure... why not? The worst that could happen is I become better at RAD Studio and Delphi, which is a good thing. I'm sure the critics that I have would love to tear apart my code, and I'm going to give them that chance!

Thursday, July 10, 2008

Mea Culpa!

The problem is solved! It was caused by me forgetting that Delphi is case insensitive, so I had a var named cParsedFile, and I tried to instantiate the object with a "cParsedFile := CParsedFile.Create;". I am really glad that the problem is in my code. If the problem is my code, then I can fix it! Kudos to Jørn Einar, and Bart Roozendaal for helping me figure it out, and thanks to Animal, Lars Fosdal, Thomas Müller and everyone else who gave assistance! This feels like I won some sort of award, and now I give my thank you speech ^_^.

To make up for my earlier comment, where I stated that RAD Studio was made by monkeys, here is a pic proving that RAD Studio was NOT made by monkeys.

And for good measure, and to prove that I can take criticism, here's a pic of me with egg on my face!

Screenshots of my Visibility Problem

Below are screenshots of a debugging session showing the visibility issue. I blacked out any proprietary code and information, hopefully still leaving enough code to show the problem I'm running into.

Here is my procedure, showing the var definition. Note that "global" is in the "uses" part of the implementation section.

Here is my procedure, showing the constructor call.

Here we are running my app, hitting the breakpoint in my procedure.

Here we are in my procedure, about to enter the constructor.

Here we are in the constructor. Notice that now we are inside global.pas, this is the correct location for CParsedFile.Create.

The instant I hit "Step into" I get an access violation error. If you look at the code at the top of the constructor (above screenshot), you will see that it's nothing fancy, just a bunch of string assignments (these strings are defined in the class definition of CParsedFile in the implementation section of global.pas).

If I was referencing a separate var, or there was another definition of CParsedFile, why am I stepping into the correct constructor? If I edit my procedure so that "CParsedFile.Create" is now "global.CParsedFile.Create", and step through it, everything is fine. So you understand my frustration when:
  1. I can compile
  2. When I step through my code with the debugger, I get to the appropriate constructor
  3. I get a runtime error in the constructor
  4. This runtime error is fixed by prefacing the unit in front of my constructor call in my procedure.

Wow RAD Studio is fast

For the project that I participate in, I usually work remotely through logmein, and that has been my only experience with RAD Studio. Trying to solve my visibility problem prompted me to install RAD Studio on my MacBook Pro through Parallels on Windows XP, so that I could work on code that I own and can post freely online. 

Holy crap RAD Studio is fast, even though I'm running it through a virtualized OS. Now I just need to buy more ram so I can stop using virtual memory so much. I guess OSX + Firefox + Parallels + Windows XP will eat up 2GB =P.

So I can mark up one win for RAD Studio, it definitely executes faster than Visual Studio.

See... my experiences with Delphi and RAD Studio aren't all bad.

Tuesday, July 8, 2008

Read your guys' comments on my visibility issues in RAD Studio

Believe me, I'm reading through them. I've been busy today so I haven't been able to look at that section of code again, but I'll get to it in the next few days and see if I can figure out (with the help of your comments) what was going on in my code.

Sunday, July 6, 2008

Visual Studio is better than CodeGear RAD

It's very clear to me that Visual Studio is the superior IDE compared to CodeGear RAD, and that is sad. Other Delphi programmers are constantly telling me how Microsoft gutted Borland's Delphi team, and hired away their best and brightest, including Anders Hejlsberg. Well you know what, all of Anders' creativity and talent are being put into C# right now. So it's no surprise that to many people, C# and Visual Studio are superior to Anders' old projects, Delphi and CodeGear RAD (or Turbo Pascal, whatever you wanna call it). It's unfortunate that Borland lost the corporate power game against Microsoft, but nobody said life was fair.

So from one Delphi developer to another, I ask you to demand more from CodeGear (or Embarcadero). You want people like me to sing the praises of CodeGear RAD? The best way to do that is to make CodeGear RAD the SUPERIOR TOOL.

And what's with the unconditional love for Borland/CodeGear? Is it because they are the scrappy company vs the monolithic giant? Even Java fans routinely criticize Sun. And you know what? Sun responds. Not everyone is happy with the way Sun treats their community at times, but at least they try to change for their users.

Effort vs Benefits of using different IDE's and Platforms

If I can paraphrase one of the commenters on my blog, Donald Shimoda suggests that I'm not spending enough time learning about CodeGear RAD and Delphi before I started using it. He says that I should read a few books before attempting to code in Delphi.

I disagree with him. I implore developers out there to not settle for crappy IDE's, API's and languages. Back in the day, hardware was expensive, programmers were cheap, and the tools were written for the machines, not the programmer. Nowadays, hardware is cheap, programmers are expensive, and tools are written for the programmer, not the machine. 

Remember this, all you other developers out there, the programmer is the expensive one, the important one. You have the power to demand more from your tools.

Some observations on Delphi and CodeGear RAD

To whatever random Delphi people that might read this blog and think that my criticisms stem from me not using CodeGear RAD for any length of time, please understand that the project I'm working on is relatively complex. I'm converting 30 or so forms from VB to Delphi, doing bug fixes all along the way. I use it all, xml, datasets, all kinds of widgets, straight file manipulation, everything. If there's anything at all that I can discover about Delphi or CodeGear RAD to help me work on this project, I use it. It especially frustrates me when I KNOW there's a way to do something in .NET, but there's no counterpart in the Delphi API's. I usually end up having to manually code more in Delphi than I did in C#/.NET.
  • Delphi has no foreach control statement.
  • Delphi arrays are primitive datatypes (like C, or you can call it a pointer with offsets, just like C, whatever floats your boat). So if you want to search an array, you have to write the code to do it yourself. There's no array object types, so there's no myArray.Find(value). I imagine there's redundant array searching code in pretty much every Delphi app out there (unless you rolled your own API into a .dll and bring it with you to different projects).
  • If I pass a dynamic array into a function, Delphi assumes that it is a static array when in the function.
  • Why doesn't ShowMessage automatically convert numerics to strings with an overloaded "+" operator? Oh it can, you say.... if I overload "+" myself... great.
  • CodeGear RAD does not understand nested block comments. It takes the first end block comment, and applies that to the first start block comment. Nested block comments should function like nested parenthesis.
  • Delphi has no automatic set/get declarations for accessing data inside a class. Not a big deal, but I thought it was nifty when C# added special syntax just for this.

Friday, July 4, 2008

Some things CodeGear RAD does well

So to balance out all the CodeGear hate, I decided to post some of the things that CodeGear RAD does well.

1. Uses the Delphi language - Delphi as a language is pretty nice to use. I particularly like how you are forced to declare your variables at the top of a function, it keeps your code cleaner. However, I would say that you should be able to declare your variables at the top of any section of code who's visibility is different from others. Case in point. If you are inside a "for" loop, you should be able to declare a variable that is accessible from only within the "for" loop. Current Delphi standards say that even though your intent is to only use this variable within the "for", you must declare it at the top of the function, where it is accessible to the entire function.

2. Debugging - From my previous experience with Visual Studio, I was happy to see that CodeGear had debugging facilities that were just as strong as Visual Studio. 

3. Wysiwig editor - Again, from my previous experience with Visual Studio, I was happy to see that CodeGear had a wysiwig editor that was similar to Visual Studio (believe me, I've read all the stuff about MS gutting Borland's development team to form .NET and C#, so I understand that there are similarities in the platforms and IDE's). My only complaint about the wysiwig editor for both Visual Studio and CodeGear RAD, is that there are components that have no visible display, but can be added to your form's gui anyways. Case in point, your data access components (TClientDataSet, etc.). To me, the display editor should be kept pure, and if the IDE wants to show you a graphical representation of non-graphical components, it should be on a separate screen, not intermingled with your display widgets.

4. Heavy use of Win32 API - From experiences with poorly documented 3rd party widgets, I try to stay as far away from 3rd party add-ons as I can. The only time I will use one is when the widget is so awesome that it solves a problem perfectly for me. 

5. Usage of .NET - As far as I understand it, CodeGear is one of the only IDE's besides Visual Studio that can write code to .NET's CLR.

6. How similar it is to Visual Studio - Yes yes, I know the history. Delphi is the father of C#, CodeGear RAD (or whatever it used to be called) is the father of the modern Visual Studio. Still, the 2 IDE's are so similar that I could pick up CodeGear RAD and hit the ground running.

The main reason why I am so critical of CodeGear RAD, is because I have heavy experience with Visual Studio, .NET and C#, so I can see where CodeGear RAD falls short. It is only natural to compare the 2 platforms, given how much history they have together. Here's my feelings about Visual Studio vs CodeGear RAD summed up in a pic.

More about me being pissed at CodeGear RAD

To expand on the visibility issues, when I set a breakpoint and attempted to debug my code, control would flow from "test := TestClass.Create;" in Form1 to the definition of TestClass in global.pas. It would actually step into the constructor, and bomb on the first line of executable code. If I commented out all the executable code in the constructor, it would bomb upon attempting to exit the constructor. If I didn't have the proper visibility to execute the constructor, why did CodeGear RAD's compiler allow me to compile at all, and why would it bomb upon attempting to EXIT the constructor, as opposed to ENTER the constructor (I shouldn't even have been able to enter the constructor if the visibility was wrong).

Now I'm pissed at CodeGear RAD

I just wasted a good 4 hours because of retarded behavior of CodeGear RAD. Lets say I have a form called Form1, and a file called global.pas. I define a custom class called TestClass in global.pas. In the "uses" section of Form1, I add global. In the implementation section of Form1, I have a procedure called Proc1. In the "var" section of Proc1 I declare "test: TestClass;". In the code section of Proc1, I write "test := TestClass.Create;". 

I figure since "global" is in the "uses" section of Form1, I'm good to go with using "TestClass" in Proc1. I compile with no errors. When I run my app, I get an "access violation". I rack my brain and use all the google-fu at my disposal to figure out what I'm doing wrong. Cause obviously the fault lies with my code somewhere right? Wrong. I must use a "test := global.TestClass.Create;" in Form1. In order for it to run properly. I completely lose my fucking mind at this point. 

In any programming language known to man, something is either visible to you, or it is not visible to you. There is no "well, you can see it at compile time, but not at runtime". If "TestClass.Create;" was NOT in the proper visibility, THE COMPILER SHOULD HAVE THROWN AN ERROR. If "TestClass.Create;" was IN the proper visibility, THE RUNTIME SHOULD HAVE EXECUTED PROPERLY. 

I understand when I waste my time because of something I did. I can accept that. What I cannot accept is when someone else wastes my time. The group of monkeys that made CodeGear RAD need to go take a class in compiler theory. 

Before anyone bitches at me, please read the paragraph above on visibility, and why the compiler should have thrown an error. 

CodeGear RAD crashing again

This is the 3rd crash in a week. Not my application crashing mind you, but CodeGear RAD crashing. I edited out any sensitive information in the pic below. If there weren't so many people using CodeGear RAD, I'm not sure I would trust it to create executables that would run well in production.

Upon restarting CodeGear RAD, here it is with the view changed (everything undocked).

Just for note: ONLY CodeGear RAD crashes on this box. Not IE, not MSSQL, not Visual Studio, not anything else. CodeGear RAD is the special one.

Thursday, June 26, 2008

So I've read more comments on my post

Seriously guys, I never even thought that anyone would read my blog. I assumed that I would just be one of the (probably) millions of boring blogs that no one reads because no one cares. If that ends up being the fate of mine, so be it, it's not a big deal to me. But apparently me posting that I didn't like Delphi was sort of scandalous or something. Perhaps it was the attention given to me by Marco Cantu? 

Overall, I'd have to say that the majority of comments are actually helpful. I'd say in my absolutely unscientific opinion, 15% of the comments are trolls, 75% point out where I was wrong, or how to solve my issues, and 10% actually agree with me (on various points). When the initial bashing began, I figured I'd get flamed even more, but surprisingly, the comments actually started to get more helpful as time went on. If anything gives me hope that I might enjoy using Delphi one day, that would be it.

Wednesday, June 25, 2008

I apparently annoyed some Delphi users

All I can say is wow! I left a comment responding on the original commenters blog, and I'll add that text below.

Wow, I really seem to have struck a nerve eh? It doesn't really bother me if people read or don't read my blog. As some of the commenters have said, I have zero comments on anything, which is perfectly fine with me. On the flipside of this, this is the first time I have ever commented on anyone else's blog. *shrug* first time for everything I guess.

To those who have at least attempted to educate me, I thank you. I'll read the links you sent, hopefully that will mitigate some of my annoyances with Delphi. 

To those who just called my post crap.... if expressing your e-rage helps you, do whatever you feel you need to do.

While it doesn't bother me if no one reads my blog, I *did* post it online where anyone can read it, so fair is fair, anyone should be able to comment on it. I originally had moderate comments on and I didn't get to them quickly - my apologies. If your comment isn't up there, that means I missed it, comment again and I'll catch it this time.

While I now understand that some of my post isn't true (from reading the comments), I stand by my assertion that Delphi is annoying. However, I will at least attempt to learn otherwise. 

So my 4th point and my 5th point may be erroneous, but that still leaves many things to be annoyed about. And to the dude who said I was an MS fanboy, haha if you read one more post down you'd see that I'm a newly minted Apple fanboy. In any case, I don't mean to be abrasive, if that's the way it sounded.

My Annoyances with CodeGear RAD

So lately I've been learning some delphi, and learning the one and only IDE that can run delphi, CodeGear RAD. In short, RAD today is just as good as Visual Studio was 5 years ago. Here's a list of my annoyances.

  • When you select a block of text, hitting the tab key actually replaces the text with a tab char INSTEAD of moving the selection one indentation level over. I mean come on. Visual Studio does it, I'm sure Eclipse does it, even Microsoft Word does it. Get with the times.
  • Weird bug where RAD will crash. Upon restart, all of the frames that make up the MDI interface of RAD are all undocked and floating freely. Not a major thing, but annoying nonetheless.
  • If you launch your application from within RAD, it must be managed within RAD. If you use the Windows Task Manager to change your applications status because let's say.... your app is stuck in an infinite loop and you need to close it down, RAD will crash.
  • You have to pay 3rd parties for extra widgets. That makes absolutely no sense to me. Visual Studio and the Windows API provide me all the widgets I could want. I know that Delphi has access to all of the Windows API, but for some reason, Delphi developers like to make their own widgets and sell them to each other.
  • There is no free version of CodeGear RAD. Visual Studio has several excellent free versions, and Eclipse is absolutely free as in beer. I would think that providing a free entry level IDE would be a good way to get new developers using Delphi, and would be a segue into purchasing a license for a higher version of RAD. But what do I know....
  • You can only write Delphi code using RAD, which costs money to own. There is absolutely no way to write Delphi code for free. There are properties and objects that are COMPLETELY HIDDEN from the developer, and the only way to access them is through RAD's wysiwyg editor. Wait a minute you say... doesn't Visual Studio do the same thing? No. Anything you can do in Visual Studio's wysiwyg editor, you can do in code. As a matter of fact, ANYTHING that Visual Studio can do, you can do in code, which is what you expect from any language and platform. If you were so inclined, you could grab a free C# .NET compiler and use notepad to write code just fine. This is impossible in the Delphi world, you must purchase an expensive piece of software to write "Hello World".
Here's my overall feeling towards CodeGear RAD summed up into one pic.

Saturday, June 14, 2008

Delicious Library

Just checked out Delicious Library 2.0, and it's surprisingly fun to manage my physical media in a GUI format.

Tuesday, June 10, 2008

Addendum to OSX apps I use

Adium: Tabbed chatting, custom backgrounds, what's not to love? Oooohhh that's right, ichat still holds the edge in tele/video conferencing, as well as screen sharing. For straight up text chatting however, Adium is the bees knees.

Parallels: It's a toss up between Parellels and VMWare, both are good. I can run my bootcamp partition as a virtual machine from within OSX, which is nifty, and Coherence mode tries to make it appear that the Windows apps are running natively in OSX.

Google Notifier: I use gmail and google calendar to organize my life. I figure iCal and have gotta be slick, but I can't think of a reason to force myself to use either. iCal+Mail has a smart text functionality, where it can parse your emails for contact info, dates, etc., and makes those actionable items. However, I can send an sms to my gmail account, and I can sms a new entry to my google calendar, which is extremely nifty. Perhaps with Apple's new mobileme service they might be comparable to Google Apps, but seeing as Google Apps is free..... I dunno. Google Apps still wins with me.

NTFS-3G: I WOULD be using this every day if I could get it to work properly. I'm not a *nix noob, I'm perfectly fine with manually mounting and unmounting volumes, but I think having my NTFS formatted drive mounted while I installed ntfs-3g is causing me to have problems. So it's either reinstall ntfs-3g, or reformat my external drive.

Friday, May 9, 2008

I heart my mac

I always made fun of maczealots, poked at the linux people, and stuck my nose in the air at people who only knew windows. However, I now have to eat all the words I ever said against apple fanboys. If it wasn't for games, I'd never leave OSX. Not only is OSX all shiny and slick, but all the things I thought were just eye candy actually end up increasing my productivity. Coverflow for folder browsing, Expose as an app switcher, tagged files searchable through Spotlight, Multitouch for touchpad interaction, not to mention a fantastic screen and great keyboard. Here's a quick list of the apps that I have come to use on a near daily basis.

MS Office 2008 - yes yes yes, I know. As a converted macdude, I'm supposed to hate everything made by M$ (or whatever the cool kids call em nowadays). Word and Excel still can't be beat. And I still hold Visual Studio for .NET as a shining example of what a modern IDE should be.
iWork - I haven't found a need for Keynote yet, but I do use Pages on occasion. Pages isn't as full featured as Word is, but it is much much easier to write a pretty document in Pages. Case in point: I made my newest resume using Pages, and exported it into a *.doc.
Eclipse - Not as good as Visual Studio, but getting closer.
Terminal - OSX's terminal does all the good things that terminal apps other *nix os's do, tabbed sessions, etc. Not to mention all my familiar *nix commands which I can run. Indeed, I manage all the application servers at the office from Terminal.
Safari - not as good as firefox, but I need my Multitouch, which only works on Cocoa apps. No firefox extensions makes me a sad panda.
Omnigraffle - WOW. Just as full featured as Visio, and extremely well put together. I use Omnigraffle for mind mapping, especially when I have to learn new things.
Omnifocus - double WOW. I've read all about the GTD (Getting Things Done) fad, I thought it was just for people who don't know how to use post-it notes or a text editor. While I don't have to eat my words again.... I may have to nibble them.... just a little.
iTunes - Meh. I liked using Media Center in Vista better. Media Center's "album view" is just as pretty as Cover Flow, and lets me see more albums at once.
VLC - Oh yeah!
TrueCrypt - This app is a must. Seriously. The entire world should be using this.

Wednesday, April 23, 2008

Google Android

I figure it's about time to give some love to our Google Android team, Android Connect! We've kinda kept it under the radar for a long time, but since we've already submitted our project to google for Phase 1 of their Android coding competition, I figure it's ok to talk about it now.

Our idea was to use the GPS functionality built into Android to allow phones to sense and track proximity to each other. The analogy we used in development was an infection spreading through a population. Not the most user friendly analogy, so the one we submitted under was a smile passed from person to person =). We have a webservice which accepts updates from any device running our Android Connect application, which will then track location, and infection. One of the portions that I'm working on at the moment is building an emulator to simulate a bunch of Android Connect devices roaming around downtown Honolulu. That way when a new user joins up and gives their GPS updates, if they're in downtown Honolulu, they can see their infection spread across the simulated devices in real time.

If you want to check out our Android Connect project, you please visit this website: Android Connect

Tuesday, April 1, 2008

MacBook Pro - Pros and Cons

* Cost - There is no doubt that buying high end Apple hardware has a high sticker shock. The only way I could justify it to myself is that as a computer professional with delusions of grandeur and an overinflated sense of self worth, I deserve a high end machine =P
* Weight - The MacBook Pro is a heavy laptop. But that's ok, I think of myself as physically stronger than your average geek.
* Crappy Driver support for Win XP - For such a powerful machine with dual boot capability, Apple has some Win XP graphics drivers that are far behind the times. I mean, why can't they roll Nvidia's latest drivers into their bootcamp driver package?
* OSX Quirks - Yes yes yes, OSX is pretty cool, but it does have some annoyances. Luckily all of the ones that have bothered me so far are solved with some nifty 3rd party addons. I mean really...... who at Apple decided that Apple+Tab will bring an application to the forefront, but not give focus to the last window.... really...

* Build Quality - This laptop is the most well constructed laptop that I have sampled, and while I didn't take the time to look at any Asus or Acer laptops, the MacBook Pro clearly *feels* better constructed than a Dell XPS or Latitude, or Sony Vaio.
* Keyboard - This is the best laptop that I have typed on yet. Keyboards are like mice, every person has their preferences. For me, the keys feel solid, with just the right amount of *springiness* and response. Typing is crisp.
* Looks - There is no doubt that when considered from all angles, the MacBook Pro is better looking than all other laptops in its price range. Lately, I've been more into minimalist designs in the things I buy, and Apple's current designs tickle me.
* High End Components - 2.6ghz proc with 6mb cache, 2gb ram (soon to be 4gb), 250gb hd, 802.11n, 512mb graphics card, LED screen.
* OSX - I consider OSX to be a selling point. To me, it feels that OSX took the GUI usability of Windows XP, included functionality from the *nix world (like multiple desktops), and added a heaping spoonful of eye candy. So far, it's seemed well put together.
* Nifty Things - Little things that make me go "hey, that's pretty cool". Examples are the magnet power connector, the backlit keyboard, the autodimming screen, the good keyboard, etc.
* Multitouch - I so thought that multitouch was just a gimmick. When I added a 3rd party addon called Multiclutch, it put multitouch firmly in the category of a must have. I know that Firefox has addons that do gestures, but you still need to click and drag. Multitouch is faster. Now only if firefox can have the appropriate Cocoa "hooks" so that I can have my multitouch AND firefox extensions, I will be in web browsing nirvana. Seriously, I only use safari because I can extend the multitouch functionality with the multiclutch addon.

Laptops only

My personal computing life has taken a change recently. I have moved from a homebuilt desktop only kinda guy, to a laptop-everywhere-I-go kinda guy. It all started when my graphics card died on my desktop, and I realized that in order to fix my pc I would need to rebuild it from scratch as my components were 2-3 generations old. So I figure I'll try a laptop. I originally bought a Gateway MT3422 from Best Buy, and I firmly believe that as of today, it is the most laptop that you can buy for the money.

Then came a lan party. I haven't been to one of those things in years, and indeed it had been about 2 years since I had played a pc game. Holy crap I forgot how much fun gaming is! So since my trusty gateway had only integrated graphics, I decided I needed an even better newer laptop. I began looking around at the flagship laptops from Apple, Dell, Lenovo and Sony. Do you know what the interesting thing is? When you spec out a Sony, Dell, or Lenovo to equivalent specs of a MacBook pro, they end up being about the same price! With that in mind, and the fact that you can use bootcamp to dual boot WinXP/Vista with OSX, I figure... why not. So I splurged and bought the high end 15" MacBook Pro. 

I've had my MacBook pro for about a week now, and I can honestly say that it is tied with my first homebuilt pc as the finest piece of computing hardware that I have ever owned. It is totally worth the money that you pay.

Monday, March 10, 2008

Learning Struts

I've decided that I need to broaden my skillset, so I've decided to try and learn struts. I've always preferred back-end applications development, so web applications have never held an interest to me, but seeing trends in programming has led me to suck it up and try it out.

The different frameworks that I've looked at were Ruby on Rails, PHP, and JSP. I decided on JSP/struts, since it seems to have built some momentum among my peers from UHM (I read your blogs once in awhile, even if ya'll don't remember me), and I figure if it's good enough for them, I should at least give it a shot.

So far, this is what I've accomplished:
* Installed jre and jdk se on my ubuntu server dev box
* Installed ant and tomcat
* Got a sample webapp from running (Hello World!)

My next steps are to write my own simple webapps as a stepping stone to my overall goal, which is still a secret!

The last time I wrote a webapp was waaaay back in the .NET 1.0 days. Web technology has progressed since then, I have a lot of catching up to do.

Sunday, March 9, 2008

Management Archetypes

Over the course of my young career as a programmer in the dynamic field of healthcare IT, I've been exposed to many, many managers and executives, both those that have managed myself, and those that have managed my colleagues and friends. Lately, I've been trying to think of ways to classify my experiences into a few brief stereotypes.

The Shogun: This stereotype leads from behind the scenes, as if playing a game of chess. This is good in that running a moderate to large organization is a nightmare of taskings to keep track of, contracts to manage, fires to put out, and work to chase, so secluding yourself in a castle and letting your sargeants handle the day to day issues allows you time to be a forward thinker. However, this is bad in that your soldiers are not loyal to you, since they never see the shogun. Instead, they are loyal to the sargeants who have lead them through the trenches. Paying your soldiers well helps, but ultimately human beings are social animals, and by removing yourself from the social circle, you are removing yourself from one of the most effective ways to command loyalty.

Alexander the Great: This stereotype leads from the front lines, and is often times the first into battle. Alexander the Great fought where his soldiers fought, slept in the dirt, and ate what his soldiers ate. His soldiers followed him to the end of the known world, and together they created one of the greatest empires in human history. This is good in that your soldiers love you, and will stick with you in thick and thin, through good pay and bad, crap work and good work. Being an Alexander the Great is bad in that you are just one person, and there are only 24 hours in a day. By spending so much time in the trenches, there is a tendency to neglect the day to day running of your organization, and often your next in commands have to pick up the pieces left in your wake. So while your soldiers love you, your generals may resent you for shunting so much work onto their shoulders.

These are my thoughts so far. And if any of my current or former managers happens to read this, my comments are not about any one person in particular. Rather, this is a combination of all the managers I have known in my life, and indeed I included what I think I would be like as a manager. For the record, I think I would be more of an Alexander the Great (obviously you can tell that my comments above are biased towards Alexander =P).

Wednesday, February 27, 2008

Comparisons between GT.M and other software ecosystems

Since the beginning of modern computer programming (circa 1980 or so), people involved in EHR's have been trying to compare Mumps to say, C/C++, or Java, or VB. Then they try to compare Mumps to common database engines, such as SQL Server, MySQL, and Oracle. Those comparisons are generally not equitable all around, as Mumps is a combination of static file storage, programming language, runtime environment, and related utilities.

As a static file storage system, Mumps alone is inequitable to SQL Server, or other DBMS's, since Mumps only stores data in B-trees. Note that in the extreme back end of SQL Server, data is also stored in B-trees, but that level is never displayed to the developer. Instead, you interact with your B-tree data by using SQL the language. VistA solves this by using Fileman, which in itself is a combination DBMS, Display API, Database API, and various programmer level utilities. So rather, a better comparison would be the disk IO speed of Java vs Mumps globals, or the query speed of SQL Server vs Fileman. As a side note, Fidelity just released a beta version of PIP, which is their own relational engine, available on sourceforge. I'm really excited to try it out!

Mumps is also not directly equatable to Java, or C. Since Mumps is also a runtime environment and set of database utilities in addition to a programming language, it's better to compare Mumps to Java and JVM, or C# and .NET, or C# and WINE.

We were running some numbers at work on a virtual machine running Ubuntu 7.1, and in a nutshell, GT.M is slower than Java and C for number crunching, but GT.M has a higher level of inherent number accuracy. The Java and C implementations were having number overflows when they used a datatype that was too small to handle the large integers we were computing. Note that this did not throw a runtime error, and the results looked real enough until they were compared to a sample set. GT.M did not have this problem, and got the correct answers from the beginning.

When compared to disk IO, I have not had a chance to compare mumps global speed vs Java or C disk IO, but in GT.M I can update 4,000,000 subnodes in 17 seconds. That is blazingly fast, but again, I have nothing to compare it against.

When compared as a database, SQL Server far outperforms Fileman. The general rule of thumb is that SQL Server is faster than Fileman by a magnitude of 4 to 1. I know that many people always say how "SQL Server and Oracle are slower than Fileman", but that is simply not true. My coworkers and I have used the exact same server with the same problem set, implemented in both Fileman and SQL Server, and run the same query to receive the same dataset. SQL Server outperforms Fileman, bar none.

In Fileman's defense, it is more than just a DBMS, it handles user IO, and has it's own programming API (date/time utilities, etc.).

Our next step will be to have a complete problem which requires a large database query, and number crunching as a cohesive unit. Perhaps then the Mumps model of tight integration will see an advantage as you can directly manipulate globals and Fileman from your code, whereas C or Java has to interact with SQL Server through ADO or ODBC.

I know I haven't posted numbers yet, but we have more testing that we'd like to do. I don't want to have anything indexed by google until I have a complete set of numbers to post at once in a coherent manner.

Free hosting on

So I did some digging around on my options for hosting, and I realized blogger and wordpress are both free. I bought a domain name that I thought was pretty cool (, and I figure I might as well tie it to my domain. Wordpress cost $10 for this feature, whereas blogger is free. That sealed the deal for me, and now I'm the owner of my own blog that I hope no one reads.

Seriously, between Google Apps, Google the search engine, Blogger, etc., Google is taking over the world. I think Google is going to be Skynet.

Please don't kill me Skynet...... or at least save me for last!

Webhosting vs Server@Home

Lately, I've been thinking about where I'm going to host this site. My choices are, host it from home, or host it on a webhost. Here are the pros and cons as far as I can tell.

Pros -
24 x 7 uptime
Someone to bitch at if things go wrong

Cons -
Tech support may be less competent than me
Storage and bandwidth caps
Hassle to move large amounts of data around

Pros -
I own the server, thus I am root and can do whatever I want
Easy to plug and play new server components, or extend drive space, etc.
Monthly costs are actually comparable to paying for a Virtual Private Server at a hosting company. Electricity and hardware costs factored in, it will cost me roughly $35 a month.
Cons -
I am responsible for my own tech support
More costly upfront, though most cheap-low power servers can be built for $200-$250
If I cap out my home bandwidth, that would suck.

Right now, I'm leaning towards a home server. It would be more fun anyway, and depending on how long the hardware lasts, it might be cheaper. In any case, I have some things to take care of, so this site probably won't be hosted anywhere in the near future.

Playing with Drupal

So far, Drupal totally kicks ass!

Why did I wait so long to try it? I dunno. I'd like to thank for turning me onto this and other great open source enterprise level applications.

Lack of BNF Grammar for Mumps

In my quest to find a document generator for mumps, I've found that there's nothing really built for it. Doxygen looks great, but only supports C/C++ style languages. The Doxygen faq says to use an input transform (their term, not fileman!) to translate your language into a C style. So I figure well, if I gotta do that, might as well write my own parser. So the logical place is to start with a grammar. But guess what? There is no BNF grammar for mumps to be found. Supposedly it's part of the ANSI and ISO standards, both of which you have to pay to receive a copy of. Through my searching, I've discovered that supposedly the MDC decided to keep all non-ansi/iso copies of the mumps BNF grammar on paper only, no electronic form available. Other people that have asked for the grammar have been told to look at a vendor specific implementation, and infer the grammar from that. Great.

Testing a blogger account

First post! Yay!