…Wherein I Rant Vigorously About Mobile Twitter Clients

clock February 5, 2012 00:23 by author Nick |

I am now going to go on a rant about Twitter clients – mobile Twitter clients in particular (though some desktop clients are rant-worthy as well).  I am going to do this because I can’t understand why they are such a pain in the ass and work so badly, when they could so easily work so well.

Okay, first, don’t get me wrong.  I really like Twitter.  (If you want, you can follow me, I’m @nickhodges --  no surprise in that handle, eh?)  I like it because it’s a great place to keep up on news, find interesting articles, read funny stuff, and to post your thoughts in short, pithy statements of 140 characters or less.  It’s also a great time killer.  If you are waiting at the doctors office, it’s a much better way to pass the wait than looking at a two and a half year old copy of People Magazine.  It’s interesting, fun, never the same thing twice, and frankly, I’m a little addicted.  I do almost all of my twitter reading on my phone or on my wonderful Amazon Kindle

But yet reading Twitter on my mobile devices drives. me. crazy.  When it comes to mobile Twitter clients, I’m not addicted -- I’m inflamed with a rage that burns like the heat of a thousand suns.

I’ve tried just about every one out there. They all drive me insane.  And so here is  my rant:

  • A twitter client should never, ever, ever, under any circumstances, for any reason, at any time, ever, ever, EVER move my “cursor”.  EVER. And by “cursor” I mean my location in my Twitter stream.  I determine where my cursor goes, not you, you blasted twitter client that thinks you can just show me whatever you want when you want to.  If I am reading Twitter on my phone, leave off on a funny Pauly Peligroso post, go away to another app, and then I come back, you darn well better have my twitter client looking right at that same stinking Pauly Peligroso post when I come back.  I don’t care if I’ve been gone for five minutes, five hours or five years, you flipping better have your cursor right there where I Ieft it. Not anywhere else.  Where. I. left. it.  Leave a gap if you have to. I don’t care, just leave it. Don’t try to do me a favor and “catch me up”.  If I need catching up, I’ll get myself caught up. Give me an option to get caught up, fine.  But for the love of Adam Sandler, DON’T MOVE MY POSITION IN MY TWITTER STREAM.   Ever,  ever, ever, never, ever, ever. 
  • Second, if you tell me that there are “143 new tweets”, and I say “Great, some new tweets”, put me at the freaking START of the 143 new tweets, not at the current time!!!!   Why in the name of sweet baby Dick Van Dyke would I ever, ever, ever what to start at the most recent tweet out of those 143 new tweets? Why would you tell me that there are 143 new tweets and then start me out at the point where there are zero new tweets? Why do I open up the fracking client and see some tweet from three seconds ago, when I want to read the 143 new tweets?  Why do I have to manually scroll down and try to figure out where the new tweets start?  What is that, some kind of sick, twisted joke?  Really?  I have to scroll?  Seriously?   I mean this is basically a variation of the “Never move my cursor spot”, but come on, this is ridiculous.
  • Third – stop trying to shorten my shortened URL’s.  I’m smart – I can shorten my URL’s myself.  It’s nice you want to do that for me, but at least let me opt out of it.  Nothing says “wasted time and resources” as a link that is a Twitter shortened version of a bit.ly link that started out as a tinyurl.com link.  I mean, come on, I can keep my twitter posts under 140 characters myself.  I don’t want your help.  I don’t need your help.  Stop it.

Bottom line: Mobile twitter clients stink and they make me want to bash public monuments with a sledgehammer. (I’d never do that, really, but I want to when I go back from checking my mail and the stupid TweetCaster moves me to  a tweet that was posted 23 seconds ago.)

Phew, okay, I feel better now.



Why I Prefer Android to iOS

clock January 16, 2012 19:54 by author Nick |

I have an Android phone – a Samsung Nexus S 4G which I love. It’s a "pure Google” phone in that it’s sponsored by Google and doesn’t have any of the vendor specific stuff on it that some of the carriers like to include.  And as you know, I just bought an Amazon Kindle which has a version of Android on it.  I’m still saving up for a full-fledged, 10 inch Android tablet.  I really like Android. 

And I have no interest at all in the iPhone, the iPad, and their accompanying operating system, iOS.

So I thought I’d explain why.  There are a number of reasons why I like Android and generally avoid Apple.  Here they are:

First, I really like that Android has the notion of a desktop similar to Windows.  On it you can place all kinds of things called “widgets’ – clocks, weather updates, twitter feeds, Facebook timelines, and shortcuts.   They are all available instantly on the pages of your desktop.  You can put almost anything you want on your multiple pages of the desktop.  I have one touch access to turning on and off things like WiFi and sound.  I can turn on the “Flashlight” (the camera flash) with a single touch of my desktop.  I can read news headlines just by swiping to my “news page”.  That’s a lot of power without having to hunt for and find a specific app.  The desktop on iOS (if you can call it that) is nothing but a listing of the applications on the device.  That’s fine as far as it goes, but the Android desktop provides a lot of very valuable and cool functionality.  I find that very useful.

Not only does Android provide the notion of a desktop with Widgets, it allows you to configure almost any aspect of the system.  You can choose from any number of configurable, intelligent keyboards that make typing easier.  You can pick from an array of desktop launchers that work in ways you might prefer.  You can choose launchers for efficiency, for visual appeal, or for configurability.  Or for all three.     You can even customize the lock screen if you want.  Again, this is really cool and I prefer it over the limited system that iOS provides. In the end, you have complete control over the appearance and functionality of your device – something I really value.

And the reason that Android provides so much flexibility and power to the user is that the OS is open source.  Developers can see how the OS works and build apps, launchers, and widgets accordingly.  And of course, they can even modify the operating system itself.  In addition to the Android Open Source Project, there are a number of alternative operating systems.  The most popular are CyanogenMod and MiUi.  Some handset vendors lock down their bootloaders, but most are wising up and allowing users to easy root their phones and modify them in ways of their choosing.  The stock systems customers buy are plenty powerful, but if one is so inclined, one can completely control what runs on the phone.  Sure you can jailbreak your iOS devices, but you are still stuck with the single, closed operating system.  Android users have no such restrictions.

Since the system is open, there are multiple ways to get applications.  Android users can get apps from the Google Android Market, from the Amazon AppStore, and other places like AppBrain, and they are perfectly free to “sideload” applications from any source if they so choose.  There is no single, controlled point of entry for applications.  That’s cool. And hey, maybe you don’t like Flash, but at least you can run it on an Android device if you want to. And oh yeah, you don’t have to pay for the privilege of distributing your apps, nor do you have to get “approval” from the AppStore gods.

And of course, Android customers have a wide choice of hardware as well as software.  The iPhone and the iPad hardware is cool, and yeah, you can have any choice of hardware you like -- as long as it is the hardware Apple provides.  Android phones and tablets come in many sizes, colors, and flavors.  Most come with removable and configurable storage. They come from different vendors and carriers. (iPhone initially launched with one (1!) choice of carriers, slowly moved to two, and now begrudgingly added a third.) They progress and advance more quickly.  Each vendor competes to out do the other in providing features and power.  You can already buy quad-core Android tablets.  

Now let me be clear:  If you like Apple, love Apple, or even are an “Apple Fanboi”, that’s fine with me.  Knock yourself out.  You won’t get any argument from me.  We all have our preferences, and if you prefer Apple over PC’s and Android, that’s great.  I’m not going to get into a flame war over “My OS is better than your OS”.  I’ve been there, done that, and frankly, I’ve grown out of it.  I happily admit that I was an immature fool to engage in those kinds of discussions.  You like Apple?  Awesome.  I don’t myself, but live and let live, eh?    I know it is too much to hope that the comments won’t prove to be contentious, but I myself am not going to get into a debate.  I’m just expressing my opinions here, and am 100% fine if you disagree 100% with me.

And easily one of the coolest things about Android is the whole Google eco-sphere and cloud.  Android is completely integrated with all the Google apps that we know and love:  Gmail, Maps, Docs, Reader, Tasks,  Google+, Google Music, everything.  A single sign-on brings it all together on your phone, on your tablet, and on your desktop computer.  There basically isn’t a Google App that isn’t completely integrated with Android.  And because the Google cloud is completely open, third-parties can easily integrate into it and use its functionality to enhance what Google provides. For instance, gReader is a third-party app that leverages Google Reader to provide a better RSS experience on Android.  Integrating with what Google provides is easily one of the most powerful and valuable features of Android.  Okay, call me a Google FanBoi, but there is a lot of cool power there that I really like and  use.

But at a more basic level, one of the more fundamental reasons I prefer Android is that, well, it’s not made by Apple.  I do not – and never really have – liked the way Apple does things.  I don’t like how they strictly and ruthlessly control their eco-systemsI don’t like the way that they treat developers.  I don’t like how they use lawsuits to try to stifle competition  (I thought the “look and feel” wars were over, but I guess not).  I’m perfectly happy to admit that Apple makes wonderful hardware and has blazed some important trails in many ways.  That’s all well and good – I just prefer not to do business with them.  Moreover – and I agree that this is harder to qualify --  I’ve never really like the “hipster, holier than thou” attitude that seems to emanate from the Apple community.  I know it’s totally my problem, but as far as I’m concerned,  the smuggest place on the planet is the center of an Apple store. And I don’t do smug.  I literally shake my head and snigger constantly when I take my daughter there (She has a Mac – despite my best efforts to persuade her otherwise...).   I know that’s not really rational, but that’s just how I feel.

So in summary, I like Android because it really doesn’t lock you in to anything.  It doesn’t lock you into hardware, application sources, carriers, or operating systems.  Just as DOS/Windows was more open flexible, and easy to develop for back in the early days of personal computing, so is Android currently the open, flexible, easy to develop for platform on portable devices.  I totally get that openness has it’s price – but I preferred the openness then, and I still prefer it today.



Why I Bought a Kindle Fire

clock January 14, 2012 18:47 by author Nick |

Last week I became the proud owner of a Kindle Fire.  I know that in my last post I spoke a few unkind words about Kindles, and so I wanted to write about why I decided to get a Kindle after all.

Here at our house, we are in Debt Assassin mode, so I have very little leeway for discretionary purchases like a tablet.  I get a monthly allowance to spend on anything I want, so if I want a new tablet, I have to save up.   I decided that I wanted a tablet earlier in the year, and I originally set my eyes on a Samsung Galaxy Tab 10.1 which at the time was the Android tablet to get.  (I have a blog post coming up about why I prefer Android over iOS…)  It is still a very nice dual-core tablet, but as things go in the tech business – and since it took me a while to save up my pennies – technology marches ever forward and I soon switched to wanting the more powerful and more feature-rich ASUS Transformer Prime

The Transformer Prime is a really, really sweet tablet.  It’s a quad-core machine using the Tegra-3 chip, with an amazing 1280x800, ten finger multi-touch screen.  It  has a flexible, add-on keyboard that effectively turns it into a notebook computer.  It even had a fifth core which would do minor tasks like check email and other background tasks while the screen is asleep.  It was priced right at that sweet spot of $499.  Interest was very, very high in this device, and all the Android blogs and news sites were abuzz with anticipation. 

It was supposed to be available just before Christmas, but pre-ordering the device was troublesome.  Amazon, which has a very good policy of not taking pre-orders unless it is sure it can deliver them, stop taking pre-orders in late November.  Delivery dates for other vendors were unclear.  When Amazon did start taking orders again before Christmas, they listed fulfillment as 5-7 weeks out.  Clearly ASUS had that good problem you don’t want to have – demand far outstripping their ability to deliver on that demand.  As a result, I held off on placing my order. 

But then a few hiccups began to occur.  I suspect that because it was the first tablet to use the Tegra-3 Quad-core chip, they had some problems with the product.  While initial quick-looks were very encouraging, reports started to surface of problems with wireless receptivity and the GPS.  Apparently the actual physical design of the case was causing reception problems.  These reports didn’t seem to dim interest in the device, however, as it’s still hard to get a hold of one, and as of this writing, Amazon itself isn’t taking orders, instead is is fulfilling the order via a reseller – who currently is jacking up the prices to over $600.  FInally, though it was short lived and ASUS pretty quickly backed down, word came out that ASUS had locked the bootloader for the Transformer Prime. 

Okay, so given all that, I decided to hold off and see what would happen.  ASUS was actually pretty good about acknowledging and fixing the problems, but I decided to defer my gratification (I was pretty jacked up for getting a tablet, and it was hard to wait…..) and let things shake out.  But then again, I wanted a tablet now.  And of course, as I’m holding off, Google announces their “Google Tablet” and that catches my eye, because I have a Nexus S phone and I’m a big fan of the whole “pure Google” concept. However, that isn’t coming out until the fall.   What to do?

Well, I took the advice of one of my co-workers and decided to get the Kindle.  His advice was this:  Tablets actually can have an impact on your life – you don’t know how it will fit or what role it will play. $500 is a lot to spend to find out, so get the Kindle at $200, find out how tablets work for you, and then save up for the Google tablet or whatever tablet is the “must have” tablet to get when I’m ready to buy.  Plus, the Kindle will likely hold it’s value, and I’ll be able to easily sell it when I decide to make the move.  In a sense, the Kindle is a “Starter Tablet” for me, and a pretty inexpensive one at that. 

And so far, I really like my decision.  I still have a pretty good chunk of change in my “saved up allowance” envelope (no sense putting it in the bank with interest rates hovering a hairs-breath of 0.00%….), and I can save for my next tablet.  I’m finding that I like the Kindle a lot (I’ll write about that in a future blog post) and the notion of “finding out how I work with a tablet” is definitely playing out.  I can now keep an eye on the market, and make a good decision on a good, quad-core tablet when the time comes.   Overall, it was outstanding advice, and I’m really happy with how things are working out.



The Bookstore of the Future

clock January 9, 2012 00:17 by author Nick |

Bookstores are Cool

I love bookstores.  A lot of people love bookstores.  I love hanging around in a bookstore and seeing what is new, what is popular, and what is available.  I love seeing the cool games and other non-book stuff they have.   I love how most bookstores now have wireless, a café, and plenty of large cozy chairs to sit in if you want a closer look at a book. Bookstores are very cool, and I like having a good one nearby.

There are more than just superficial reasons to like bookstores.  First, they provide instant gratification.  If you want a book, you can get it immediately.  You can hold it in your hand and walk out of the store with it.  Another nice feature is the ability to browse – you can wander around, look around, and perhaps find a title that you didn’t know you wanted.  In addition, the ambience of a good bookstore is appealing and valuable as well.   The addition of café’s, music, and other products have also made bookstores much more appealing.  Clearly there is demand in the marketplace for bookstores, since whenever I go to one, there are always people there. 

Bookstores are in Trouble

But bookstores clearly are struggling.  Big player Borders recently went out of business (Anyone else notice where http://www.borders.com goes?)  Many smaller, independent vendors have been driven out of the market as well , though some of superior quality to survive (For instance, my sister loves Wild Rumpus, near her home, and they seem to be doing very well).  Online retailing has affected brick and mortar sales.  In addition, used book stores seem to have grown as well, putting market pressure on retailers of new books.  The Books-4-Less store near my house is a pretty good source of reasonably priced books, and they have a very nice selection.  They also accept “trade ins” for store credit, so you can clean out your basement and get a few new books at the same time. 

But people shopping online in the comfort of their own homes at sites like Amazon can get a much wider selection, recommendations, reviews, and all kinds of information available.  Online retailers can offer reviews, an almost infinite range of other books to “browse”, recommendations, and more.    If you know what book you want to get and aren’t feeling an urgent need to have it at this exact moment, dialing it up on Amazon’s site and ordering it with (often free) super-saver shipping can be a great time saver.  Plus, there’s non tax, and you save the gas and time of a trip.  I don’t have specific numbers, but I’m guessing that the ease of buying books online has hurt bookstore sales more than anything else.  For instance, books are always a popular gift, and the convenience of Amazon’s gift giving capabilities make giving a book as a gift vastly more convenient.  Amazon gets the book, wraps it in gift paper, and takes it to the post office for you.  Very convenient.  I’m guessing that I’m not telling you people something that you haven’t already figured out yourselves -- you are taking advantage of them in increasing numbers.

And if that isnt’ bad enough, adding to the online competition for bookstores are devices like the Amazon Kindle and other similar electronic reading devices.  Sales of Kindles and Nooks continue at a brisk pace, and every one of those represents countless book purchases that won’t be made in a bookstore.  Digital books don’t need a bookstore at all (Can you even have a bookstore of digital books?)  I know people that have Kindles who have bought many books, but haven’t held a new book in their hand in a long time – a fact good for Amazon, but not good for the brick-and-mortar retailers.  Why  even go to a bookstore?  Your friend at the local Starbucks can recommend a book and you can be reading it in just a couple of minutes – not something the owners of Borders were happy to realize. 

The Kindle is cool, but there are a few things I don’t like about it.  The top one is there isn’t any easy way to “peek ahead”.  Surely you do this – you are lying in bed reading, and you start feeling tired.  Do you just quit now, or is there a natural breaking point coming soon – a chapter ending, a sub-chapter break?  You can’t do that easily with a Kindle.  Second, (and this is why Amazon is so up on it), you pretty much have to pay for everything you want to read.  You can’t easily loan books to friends (the time limit is no fun – what to do if you have two chapters left when the time runs out?) Borrowing books from the Library has the same problem.  Amazon Prime does offer a lending service, but again, you pay for it. (See why Amazon likes the Kindle? Winking smile)  There’s a lot to like about Kindle’s, but there are a few things not to like as well.

The Current Model Costs A Lot

One of the largest struggles of the average bookstore – and the broader book industry – is costs.  The current business model is staggeringly inefficient.  Huge boxes of books – most often more books than will ever sell – are printed at a central location, loaded onto trucks and shipped to bookstores all around the country.  Those boxes are opened, and books put out on the shelves.  The rest are stored somewhere at the bookstore “in the back”.  After a while, a certain percentage – hopefully a high one, but not always – of the books are sold.  The rest are put into the “bargain bin” and sold at a discount.  Eventually, the remainders end up at those sad little bookstores at the mall or destroyed.  The costs of transporting books – they are heavy, as anyone who has moved house knows – is high.  The waste of printing books no one wants is high.  Trying to figure out the right number of books to go to the thousands of different locations – some books may be more popular in Topeka, KS than in New York City – is pretty difficult to predict.  It’s the common problem of centralize planning – who can know?

The bottom line is that the costs involved with the current bookselling/bookstore business model are simply too high.  It’s no wonder Borders went out of business – they were a day late and a dollar short with their eReader – and it’s a wonder that Barnes & Noble have kept their stores, too.

Emerging Technology

Despite the aggressive onslaught of online retailing and eReaders and very high costs, I still think there is a future – a pretty cool future -- for brick-and-mortar bookstores. However, they are going to  have to change a bit, and adapt to some new and emerging technologies.

That key emerging technology bookstores need to learn to leverage is on-demand printing.  On-demand printing is a relatively new technology, but one that can be a positive and powerful inflection point for bookstores.  On-demand printing is the ability to print a book – cover, contents, everything (even hardcovers) – immediately and on demand.  Think of it as a copy machine for books.  I’m not intimately familiar with the current technology, but I understand that it is getting to the point where a book from an on-demand printer is virtually indistinguishable from a “real” book.  Services like lulu.com and other retailers enable authors to publish any content completely unencumbered by the established publishing houses.  Because books are printed as ordered, they don’t care about volume. 

In addition, the margins on book sales are much better, and so authors can make more money – much more money – on each book sale.  Delphi authors like Marco Cantu and Bob Swart have leveraged these services to bring you high-quality content while making more money in the process.  Sweet for everyone.  On demand printing is clearly an technology that will require some adjustments to business plans throughout the bookselling business.

The Bookstore of the Future

In the future, I envision a bookstore working very similarly on the surface, but very differently behind the scenes.  Bookstores will become a retail outlet for on-demand printing. On the outside and to the casual observer, bookstores will appear to be much the same – books on shelves, cafés, calendars, music, videos, etc.  But a closer look will reveal some differences brought about by on demand printing. 

First, a bookstore will have the ability to print immediately any book.   The shelves will be full of books as now, but a customer will also be able to ask for, and get, any book in the publishing system.  This feature will help bookstores match the online retailers by allowing a book buyer to get almost anything they want.  The ability to print any book immediately will be a big feature that will enhance a bookstore’s market appeal. 

And not only will a customer be able to get any book they want, the bookstore could offer any number of customizations to a book.  Kids could get copies of the Twilight series with a selection of different covers of their favorite characters.  Readers could choose font type and size, and perhaps even different colors of paper.  Each feature could cost extra, increasing margins.  I can foresee computer kiosks at the store allowing users to pick features a la carte.   Heck, I can even foresee bookstore branded kiosks at grocery stores much like RedBox.

The second subtle change that will take place is that the books available on the shelves will consist of fewer duplicates.  Since the books are printed onsite, they don’t need to stock up on multiple copies, leaving room on the shelves for a wider variety.  This will improve the browsing experience.  And of course the store can keep the shelves fully stocked.  The point of sale system would record each sale, and a book is sold, a replacement can be immediately and automatically printed. Efficient printing and stocking would mean that the shelves would be full, and a wider variety of books would be available on the shelves almost constantly. 

And of course, the printing of books right in the store means no more distribution costs – no more centralized printing with the subsequent distribution inefficiencies. New books will be distributed electronically of course.  Book stores will still need paper, glue, ink, toner, etc., but t’s much easier and less costly to distribute supplies than it is boxes of specific books.  And the waste of printing books that never get sold will be reduced because inventory will be wider and flatter with little over-stocking.

How it Will Happen

The transition to this new model will be interesting.  I don’t think that you’ll see it come from existing chains like Barnes & Noble.  Generally, a radical, disruptive change like this needs a fresh, upstart business to challenge the existing firms.  I also suspect that existing chains are too tightly tied to the existing publishing houses to allow them to be this flexible.  And I’m pretty sure that the existing publishing houses will not embrace this new model. The music industry has been glacial in accepting and understanding the changes brought by digital music, and I suspect that the book publishing industry will have a similar reaction. 

However, I think it will eventually happen.  The current bookstore model is clearly in trouble – even Barnes & Noble is having trouble in the marketplace despite the lost of major competitor Borders.  But in the end, the demand for the things that bookstores offer is strong.  The industry will be fine once they figure out how to leverage the advantages that on-demand printing offers.



Pandora, RIAA, and Buying Music

clock August 11, 2011 12:50 by author Nick |

Another “reprint” from my Embarcadero blog.  Funny thing is, I was thinking of writing this exact blog post yesterday.  Right now, I’m doing something that would have seemed crazy ten years ago:  I’m listening to a wonderful personalized radio station on Pandora through my television via my Blu-Ray player.  I can honestly say that paying for Pandora was some of the best money I’ve ever spent.


I’m a huge fan of Pandora.  If you haven’t discovered it yet, Pandora is a music streaming service that has a terrific knack for playing music that you like.  You can create stations simply be telling them one of your favorite artists, and then they start playing music from that artist, and then music similar to that artist, based on the input of other users. As they choose different songs for you, you can give them the thumbs up or the thumbs down, and the  I have a great station based on the GooGooDolls, and something like 98% of the songs they play on that station I like.  After a little tuning, I only very rarely give the thumbs down to a song they play for me.

The service is free, and I will occasionally try to click on some of their ads in support of the service.  But maybe the best thing is the number of new artists that I’ve discovered.  If not for Pandora, I’d have never heard of Colby Caillat or Sara Bareilles or Matt Nathanson.  And because of Pandora, I’ve purchased many new CD’s that I otherwise would not have.  The same thing happened to Julian Bucknall when he discovered Pandora.

Now, given the above, you’d think that the music industry would be delighted with Pandora.  Sadly, the opposite is true.  They are putting the thumbscrews to Pandora.  Pandora is still on the air — I’m listening right now — and hopefully that will continue.  I’m not familiar with all the details — I gather that they may be working this out so Pandora and other broadcasters can stay "on the air".  I’m all for artists and the record companies getting paid, but it seems to me that this is another example of an "old economy" business not realizing how things work and how they can benefit from the "new economy".



A Bunch of Stuff I’d Like to See Embarcadero Do

clock July 5, 2011 22:22 by author Nick |

There are a bunch of things that I’d like to see Embarcadero do.  I’ve listed and discussed some of them below.  I’ll probably think of more later.  Winking smile  They are in no particular order, and they are not grouped in any particular way.  They are a bit random, and range from business decisions to minor technological decisions. Where it makes sense, I’ve linked the titles to the entries on http://delphi.uservoice.com/ so that you can vote for the items if you see fit.

I’d like to see Embarcadero:

  1. Provide an Enterprise-level MVC web framework for Delphi.  This almost seems like a no brainer to me. Ruby on Rails has had a profound impact on web development and development in general.   In the .Net world, MVC has become the leading ASP.NET development method,winning over hearts and minds from WinForms.  The general idea of MVC is becoming the norm for much of the development world – separate those concerns!. Delphi’s new RTTI capabilities would actually make this kind of framework very, very possible and very, very cool.  And Delphi already has a very powerful and capable web infrastructure to build on:  good, old, and venerable WebBroker.  There are even existing frameworks out there that could be leveraged, including the G Framework.   There is a business opportunity here for Embarcadero, if not for an enterprising third-party Delphi developer.  A native, ISAPI based MVC framework in Delphi?  That would be very, very sweet.
  2. Stop trying to do other stuff and invest in Delphi.  This one has been one of my huge frustrations over the years.  Delphi is a profitable product, but no matter who owns or runs the show,  the profits always seem to get skimmed off to fund other “next big thing” projects of, well, questionable benefit at best.   Remember “SDO” taking the market by storm? Yeah, me neither. AppWave seems to be interesting and have a lot going for it, but I personally would rather have seen that effort invested back into Delphi.  I hate to think about where Delphi might be today if it hadn’t been used to fund other projects and instead been allowed to use it’s profits for it’s own development.  Delphi could use a year or two of un-distracted attention from its owner. 
  3. Create a Javascript/HTML development tool.  I’ve always said “As assembler is to the Intel chip, so Javascript is to the browser”.  James Governor has it right:  “Learning Javascript used to mean you weren't a "serious software developer". Today, not learning Javascript means the same thing.”  A powerful, feature rich RAD development tool for Javascript and JQuery would be really cool and a great new product for Embarcadero.  Maybe RADPHP could be steered in that direction?
  4. Make Dependency Injection part of the RTL: If you haven’t figured it out yet, I’m a big believer in Dependency Injection.  So much so, that I think that if you aren’t doing Dependency Injection, then you are doing it wrong.  Incorporating a DI Container into the Delphi RTL would be very cool.  Again, Generics, anonymous methods, and the new RTTI makes is very easy and powerful, and there are open source projects to leverage and build on (like my favorite, Delphi Spring).
  5. Do one thing at a time and do it really well:  This is the one that I wish they would do the most:  Take the product forward one step at a time. For instance, the next release should have as it’s main focus 64-bit Delphi and only 64-bit Delphi. That’s it.  Other improvements can be made, of course, but clearly that should be the “big one”, and it should be the only “big one”.  Don’t try to do two or three “big ones” in a single release. Make each release focused on a big, single step forward, executed thoroughly and solidly.  The product will be fine as long as it shows steady, sustained improvement.  Many large improvements executed all at once is not what the market wants.  Focus and deliberately move forward.

That’s all for now – I’ll probably have more as I think of them, but that ought to be food for thought for while



Accessing Private Stuff with Interfaces

clock June 27, 2011 17:38 by author Nick |

I have to admit that the following code surprised me.  I guess it makes sense, but I wouldn’t have guessed that you can expose private functionality via an interface like this.  Interesting. 

program DoPrivateStuff;

{$APPTYPE CONSOLE}

uses
  SysUtils;


type

  ITestInterface = interface
    procedure DoThisPrivateThing;
    procedure DoThisPublicThing;
  end;

  TTestClass = class(TInterfacedObject, ITestInterface)
  private
    procedure DoThisPrivateThing;
  public
    procedure DoThisPublicThing;
  end;

{ TTestClass }

procedure TTestClass.DoThisPublicThing;
begin
  Writeln('Doing a public thing');
end;

procedure TTestClass.DoThisPrivateThing;
begin
  WriteLn('Doing a private thing');
end;

var
   Test: ITestInterface;

begin
  try
    Test := TTestClass.Create;
    Test.DoThisPrivateThing;
    Test.DoThisPublicThing;
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.


Flotsam and Jetsam #37

clock June 22, 2011 12:06 by author Nick |
  • Marco Cantu has published his new book on Delphi XE.  I’ve been given an advanced copy (thanks, Marco!) and as you’d expect, it is excellent.  We are going to buy some copies here at Gateway Ticketing for use in our transition to Delphi XE.  As with everything Marco does, it is highly recommended
  • There a new Facebook group for Delphi Developers that seems to have a lot of activity.  You might consider joining.  It would be good for Delphi people to congregate in a single place on Facebook to share links and information, and this might be the place. 
  • And speaking of Facebook, you can now ’Like’ Embarcadero’s AppWave on Facebook.  I’m still not clear on exactly where all this AppWave thing is going, but it does look interesting.  I wonder what affect the “appstore” in Windows 8 will have on it.  I guess one advantage that AppWave has is that it is here right now, and Windows 8 is still pretty much vaporware at this point.
  • I went to see the Green Lantern this past weekend.  Highly recommended – I have no idea what all the bad reviews were about.  Great comic book movie.  (Those reviewers know that the Green Lantern is a comic book movie, right?)  The tech angle here is that it was the first time that I had seen a movie in 3D.  My take?  I never want to see a movie – any move, I don’t care if it’s a “blockbuster” or not – in 2D again. It was a terrific experience. This is a great feature that will definitely get me in the theater more. I have been going to the theatre less and less because of Netflix, but if I can see the upcoming Harry Potter movie in 3D, I will.  Looking forward to it being the normal experience on TV.
  • David I has been at Borland, Inprise, Borland, CodeGear, and now Embarcadero for 26 years.  He’s seen it all.  Congratulations to a titan of the industry – and a great guy.  I’ve known David for many years – since I met him at a PC User group at the Naval Postgraduate School in around 1994 – and it’s been an honor to be his friend.
  • I love a good story like this:  Throw Away that Hotel Soap.  There is staggering waste in our economy (anyone buying cases of plastic bottles of water – I’m looking at you…) and this is the kind of thing I love to see.


A Big Thank You

clock April 15, 2011 13:59 by author Nick |

I’d like to pass on a big thank you to Marco Cantu, Cary Jensen, and Cary’s lovely wife Loy Anderson for their wonderful hospitality while I was at Delphi Developer Days in Baltimore earlier this week.  It was an honor to be asked to be a guest speaker at the event, and I hope that my talk on unit testing with Delphi was worthy of the conference.  Cary also graciously gave me a signed copy of his excellent new book, Delphi in Depth: ClientDataSets

I should add that the conference was very valuable.  Cary and Marco do a great job and there were a lot of good examples and code, as well as a very nice manual with tons of great articles in it.  I heartily recommend attending next year if you are so inclined.



Flotsam and Jetsam #22

clock January 28, 2011 13:35 by author Nick |
  • SDTimes has an interesting article about a “Delphi Starter Edition”.  It appears that the Starter version will limit the revenue of a user to $1000 in overall revenue, as well as limiting all database access.  They are going to be priced at $199.  It also seems like there can only be five of them in any given organization.  Folks in the community are discovering that the Starter Edition will be available February 1.  And now Tim Del Chiaro has confirmed it in his blog.
  • We recently changed the name of our “Inside Sales Representatives” to be “Account Relationship Managers”.   This lead to the following statement in our weekly Manager’s Meeting: “Well, that’s really in the hands of the ARMs”.  Heh Heh.
  • I want a Rovio.
  • I just realized that I have a Windows key on my keyboard and that I don’t think I’ve ever used it once. Now, I know that the key has been there for a long time, but I just now realized that I simply never press it. Maybe I should be.  Do you guys actually ever hit the Windows key?
  • Today marks the the 25th year after the Challenger explosion, and I heard them on the Radio talking about it, saying “Do you remember where you were"?”   I remember it as clear as day. I was standing in the front office at Pasadena High School, where I was a Latin and English teacher.  Our principal, Tom Hancock, came out of his office with an ashen look on his face and said “Challenger just exploded”.  It hit our area particularly hard, as Pasadena is a suburb of Houston, with a major NASA facility nearby (The famous “Houston Control”), and the astronauts had lived and trained in the area.  That moment is a very start memory for me.


Update on THTMLWriter

clock January 6, 2011 12:56 by author Nick |

I’ve made a fairly significant change to THTMLWriter.  (Even if you aren’t a use of THTMLWriter, please keep reading, there’s a valuable lesson at the end.)

What Did I Do?

I created an interface – IHTMLWriter – which simply lists the public interface of the class – and then had THTMLWriter implement that interface.  Not a big deal.  The big deal is that now the Fluent Interface is done with the IHTMLWriter interface instead of the class itself.  This shouldn’t be a big deal if you are using the class – you merely need to change the variable declaration to IHTMLWriter, and remove any code that destroys/frees the class you may have created. 

Why did I do this?  Well, I have to confess that it was partly because I could.  But I also think that in general, interfaces are better to deal with, particularly with the fluent interface.  I’ve noticed that interfaces appear to be the typical way that such things are implemented.  In addition, an interface limits the scope available to the consumer of a class.  If  you can only use a class via the interface, I as the developer can decouple the implementation from the interface – something that is always good. Plus, if one of you fine people feels like there is a better way to crank out HTML, now you can do it, too, using the same interface. 

The Valuable Lesson

Here’s the part that you all need to read:  I was able to make this rather large change with a lot of confidence because I had a pretty extensive set of unit tests to back me up. 

The initial change – creating the IHTMLWriter interface and changing the class to implement and use it – broke everything.  No test would pass, and the test program did nothing but raise access violations.  So, of course, I went to work and fixed things up.  I had to change a little architecture, alter the way a few things were done, and generally fix things up. 

All of my debugging was done on the test project.  It provided a perfect, simple reproduction of the bugs.  The unit tests enabled me to easily step through simple examples and find the places where the bugs were and where things weren’t working right.  And eventually the tests all “turned green”. 

GoingGreen

And let me tell you, turning green is sweet!  First, it feels really good. I kept running the tests and watching that little green bar slide across because it felt great.  Why did it feel great?  Because I knew that my changes were complete and  because I had confidence that things were all working as they were supposed to.   The only way that was possible was because of the existence of the unit tests.  Without them, I’d never really ever be sure that things were back to normal and working.

Time Well Spent

So the unit tests allowed me to forge ahead with confidence, provided me with a useful and powerful vehicle for testing and debugging my changes, ensured that I would know when I was done, and enabled me to prove that things were working as they should – all while making a fairly substantial change to a fairly complex code library. 

And some people say they don’t have the time to write unit tests.  I say you don’t have the time not to.



Using Your BitTorrent Powers for Good, not Evil

clock December 27, 2010 21:10 by author Nick |

I’m a big fan of the BitTorrent Protocol.  It’s an amazingly simple yet clever protocol for easily and efficiently moving bits around on the internet.  By grabbing small chunks of a given file from multiple peer computers anywhere in the world, it can quickly and efficiently move files from one place to another. 

Sadly, BitTorrent has a bad reputation, as it is commonly used to move pirated software, music, movies, and TV shows around in violation of any number of copyright laws.  But the fact that it is used for nefarious purposes doesn’t make BitTorrent itself evil or illegal, anymore than cars are illegal for being used as bank robbery getaway vehicles.  It’s a shame that many companies and other organizations feel that they can’t avail themselves of BitTorrent because of its bad reputation.

In fact, there are plenty of legitimate uses for BitTorrent.  Many companies do use it to distribute their software.  For instance, Ubuntu provides torrents for their Linux distributions.  It’s a nice way to make large files available to customers fast and free – there’s no bandwidth limit or any fee associated with BitTorrent.  But be advised of one thing – once a torrent is out in the wild, there is no getting it back. It is totally roaming free out on the Interwebs.

Below is a screenshot of my µTorrent client, showing the torrents that I’m serving up from a server at my house.  Those Ubuntu files are quite popular, and because there are so many “seeders” (that is, other people making the file available for downloading), I was able  to download many of those files at rates over 2MB per second meaning I was downloading 650MB files in a matter of minutes.

Torrent

In addition to the Ubuntu files, I also went to ClearBits.net and downloaded a number of legal, free-and-clear torrents. I leave my client running 24 hours a day, and gladly give up some of my upstream bandwidth to support the good folks at Ubuntu and the furthering of the distribution of fine literature via completely legal torrents.  I like to think of it as a small contribution back to the community and doing my part to contribute to the legal side of BitTorrent.

So if you haven’t checked out BitTorrent, give it a look.  There are plenty of legitimate uses for it out there, and there’s no reason you can’t be using it  to distribute your software -- and maybe even providing a bit of bandwidth to the world. 



Announcing THTMLWriter

clock November 22, 2010 09:44 by author Nick |

I have started an open source project on GoogleCode called THTMLWriter.

THTMLWriter is a Delphi-based class library that enables you to create HTML code and HTML documents. It uses the fluent interface to make creating HTML text easy and natural.  You can create HTML Documents or HTML “chunks” by  using any tag as a base.

THTMLWriter is all class based.  I started out trying to do some fancy things with interfaces, but it just got too complicated, and so I opted to go with the “simplest thing that will work” option, and now you can write code that looks like this:

 

Temp := THTMLWriter.CreateDocument;
     TempHTML := Temp
                  .OpenHead
                    .AddAttribute('dweezle')
                    .AddText('farble')
                  .CloseTag
                  .OpenBody.AddAttribute('ding')
                      .OpenSpan
                        .AddAttribute('this', 'that')
                        .AddStyle('font: italic')
                        .OpenDiv
                          .AddAttribute('floo')
                          .AddText('Blah')
                        .CloseTag
                      .CloseTag
                      .AddText('Hoorah')
                      .AddBoldText(' Shadooby')
                      .OpenBold
                        .AddText('Goombah')
                      .CloseTag
                  .CloseTag
              .AsHTML;

 

The project more or less produces XHTML code at the 4.01 level – I’ve tried to be XHTML-compatible, but I confess I haven’t been fanatical about it.  That is one of the things I want to in the future.  In addition, I want to update the project to support HTML5.  I’m still thinking about how to do that.

The project is pretty complete – you should be able to construct most HTML constructs.  I’ve provided a lot of overrides and default parameters for many of the “normal” attributes on a given tag.   I’ll continue to update the project with improvements and refinements.  I’ve used HTML & XHTML Pocket Reference from O’Reilly as my guide. I haven’t quite implemented everything, but it’s definitely at the point the that it is ready for you fine  people.

The project includes a full set of DUnit tests to give you confidence that the code actually does what it is supposed to. 

I have added a lot of XMLDoc comments to the code, but it’s far from complete. I’ve used the Documentation Insight plugin from DevJET software – the guys who do the Delphi Spring Framework.  (I can’t recommend this plugin enough – an outstanding contribution to the Delphi community, above and beyond the amazing Delphi Spring Framework.)

You can get the code from Google code using Mercurial.  We are planning on migrating our codebase here at Gateway Ticketing to Mercurial after the first of the year, and this project was my learning curve for using Mercurial.  Now that I’ve been using Mercurial – a distributed source control system – I wonder how we as developers ever managed to use anything but a DVCS.  It is that good and that powerful.  I heartily recommend looking at migrating to a DVCS.  It’s so much more flexible and more powerful than a server based solution such as Subversion

I’d be very happy to add anyone to the project who is interested in contributing.  I’ll also be happy to integrate submitted patches as well.  This have been a fun project to keep my toe in the water of coding – being a manager now means I don’t get to code as much as I want --but living alone in Pennsylvania while my amazing wife moves our house out here has given me a lot of free time to code.

Enjoy and let me know what you think.



Setting up Hudson to compile Delphi Projects

clock November 5, 2010 21:37 by author Nick |

Just like you should be using Source Control (even if you are a one man operation), you should be doing continuous integration.  We currently use CruiseControl.net, but we are giving Hudson a look here at Gateway Ticketing, and it seems likely that we’ll end up switching and using it.  So naturally, I decided to play around a bit with Hudson. We used Hudson quite extensively at Embarcadero, but I had never really given it a whirl myself.

This is the Hudson Dude whose picture shows up in the Hudson interface. 

hudsondude

He’s quite dapper, no?

Hudson is Java-based, but don’t let that scare you.  You need not know a lick of Java to use it effectively.  It is very, very easy to download, install, and get up and running.  I found this blog post helpful in that regard.  I was up an running in minutes.

Hudson has a very nice browser interface for configuration.  It also has a very large and growing collection of community of plug-ins.  Hudson also makes it really easy to install plug-ins by providing support right in the interface.  Add them isn’t much more than selecting them in a list an clicking install.

Plugins are important, because you are going to need them in order to do a Delphi build.  The first one you’ll want to install is the MSBuild plug-in.  This will allow you to choose MSBuild as a build environment.

screen

All of the popular source control systems have plug-ins. I’ve been using Mercurial on my local machine, and so I chose that plug-in as well. 

I also discovered, after a series of trial and errors that the setenv plug-in is pretty much required as well.  As you may know, to do command line builds of Delphi projects, you need to set a number of environment variables. This is usually done via the rsvars.bat file.  Well, Hudson doesn’t know about that at all, and I didn’t have much luck running it as a batch file before doing the build.  Hudson seems to isolate the environment for each individual action.  The setenv plug-in lets you set global and local environment variables for Hudson.  Since I’ll be doing a lot of Delphi builds, I selected “Manage Hudson” and took the items from rsvars.bat and set them up as Global Properties:screen1

Doing that is critical, as that sets everything up so that Hudson can find the files needed by every Delphi project to define the build targets.  There are a couple of StackOverflow questions about this very topic that recommend passing a few parameters, but I found that if you set up setenv to incorporate what rsvars.bat does, you don’t need to pass any parameters on the MSBuild command line beyond the *.dproj or *.groupproj filename. 

In addition, you need to tell Hudson about MSBuild specifically – that’s easily done in the global configuration as well. Basically you give each installation a name and the full path to the MSBuild.exe for that .net version.  You might want to set up different MSBuild installations for  the .NET 2.0 and .NET 4.0 versions, for instance.

screen3

Once all that is set up, it’s really a matter of setting pretty self-explanatory properties of Hudson.

  1. Select “New Job”. 
  2. From here, I just chose “Build a free-style software project” to do a simple build of a Delphi project group.
  3. Give your job a name and click Ok.
  4. From there, you can pretty much figure things out.   I did the following.
    1. Pointed Hudson to the Mercurial repository I wanted it to pull from, including the branch I wanted.  The settings for Subversion and other SCM systems may have different settings.
    2. I chose to poll Mercurial for changes.  The “code” for setting that up is a bit tricky, but I found pressing the help button gave a pretty good rundown and some examples.  I just set it to poll every minute.  Not a big deal on my local machine, and it makes it easier to see how things are working while testing it out. screen4
    3. The final thing to do was to actually tell Hudson what to build.  That was easy – I have a project group called

      C:\Code\HTMLWriter\HTMLWriterGroup.groupproj
      ,

      and I simply added that as the MSBuild build file after telling Hudson which version of MSBuild to use.
    screen8

And that is pretty much it. From there, you can tell Hudson to build for you on demand, or you can just leave it to run, and it will build everytime it sees a change in your source.  Again, the “tricky” part was getting and using that setenv plug-in.  That simplified everything. 

UPDATE: Christer Fahlgren has also written a very nice blog post about running Hudson on Delphi projects.



Getting a Router in Another Room

clock July 27, 2010 16:19 by author Nick |

If you are like me, you have some form of high-speed internet coming into your house. You probably have Cable or DSL or something else, and then a “main” router where there the Internet comes from “out there” to “in here”.  You probably then have it served up with a wireless router.  Me?  I have Comcast cable piped into a NETGEAR WNR2000 Wireless-N Router. From there, I send the wires out to three computers in the room for my wife and kids.  I then use the wireless with my notebook around  Works pretty well.

But I have an office upstairs, and I wanted to put a server up there as well as a notebook on a desk for my use.  That’s two computers.  Now the notebook has a wireless care built in, but the server doesn’t, and I loathed the idea of putting a wireless card in a desktop.  I could run a wire up through the house, but what a pain in the butt.  So I needed to figure out how to get my wireless signal up to a router in my office.

I went to Best Buy and I got a Linksys Bridge.  It was a bit tricky to set up, but I did, and it worked pretty well.  It was somewhat intermittent, but I was able to have  switch up in my office with connectivity to any number of machines. 

But then, out of nowhere, the thing stopped working.  It just bricked itself.  No lights, no power, no nothing. Great.  So, off to Best Buy again, with a determination not buy that Linksys Bridge again.  So the nice sales gal there pointed me to a NetGear Gaming router that is basically a wireless bridge.  I guess that these things are very popular for gaming consoles so they market them mostly to gamers.  So I’m slowly walking out, and this other guy comes up to me and says “That will work for what you want, but I can show you something that is faster and more reliable”. 

Well, I don’t know about you, but I am into faster and more reliable, so I followed him, and he showed me this:

I was a bit hesitant at first, as it seemed a bit strange to pump my connection through my household power lines and the box explicitly calls it an “XBox 360” kit (that gaming thing again), but the guy said it works perfectly for a regular network and that he’d personally take my return if it didn’t work exactly like I wanted.

Well, as far as I can tell, he’ll never see me again. This thing worked like a charm. It was pathetically easy to install – network cable out of my router, into device, which I plugged into the wall.  Then, up in the office, I plug in the other one, with a network cable out of it into my switch.  Simple, clean, and easy.  It worked immediately, and the total setup time (hardware only, no software to configure) was literally five minutes. 

So far, it’s working great.  I now want to find out if I can buy one of these things and use it in yet another room.  That would be even cooler, as we have a renter who’d really appreciate that.

All in all, a purchase that I’m really happy with.