Thursday, June 3, 2010

Personal Outlook #2

Virtual Meetings
I enjoy attending virtual events, it's a good way to learn and share information.   It's one of the reason's I started the Virtual Delphi Users Group.   I am always on the watch for good virtual events.  I have multiple computers every place I code.   With a virtual event I typically start it on a secondary computer and stay coding.   If I hear something interesting I look at the second machine to see the details.   On occasion something really good is covered and I never get back to coding.

For the next VDUG meeting we had advertised covering Delphi Prism 2011.    I just found this event "Extreme Cross-platform .NET with Delphi 2011""  presented by David I.  Which is the week before the VDUG Meeting, and was going to cover nearly the same material.   Not wanting to just show the same thing, I am going to change the topic a bit.   So, I think everyone should attend the event with David I.  

As for the VDUG Meeting, I am now working on refining a deeper dive into the Delphi Prism Language Features.      With some of the things we have learned trying to keep some of our code cross-compiling with Delphi Win32.    When I get the material prepared I will announce the new meeting on the VDUG Site.

Another virtual event I found today that looks interesting is a 3 hour Virtual Conference with Kent Beck on Continuous Deployment.    Since I have enjoyed many of his books.   Most of the time virtual conferences by the media companies are so product specific that if you don't use the product it's a waste of time.   But this looks interesting and I think I can apply the topic to our situation.  Specifically we currently use FinalBuilder Server to monitor our SVN repository for changes, which when detected they are automatically built and deployed to our test environment.

Stackoverflow Code-Golf
On stackoverflow.com there is a tag called Code-Golf that contains challenges to the write the smallest program possible meeting the requirements of the challenge.   I took note of this question and answered it in Delphi.     It shows that you can do cryptic things in Delphi, just like you can in other languages.   I think it's a good example of why you should use descriptive variable names and types.      The answer was the ugliest code I have ever written.

Saturday, April 24, 2010

Virtual Delphi Users Group

On April 20th, 2010 SLCDUG conducted an experiment on a virtual meeting.     The results were much better than expected.   This concept worked!  I have work to do to improve the overall experience.  We had several minor problems, but overall we can improve.

One thing I realized needed to improve was it needed  to have a central place were we could announce meetings and store recordings.   The SLCDUG site is just a blogger account and would not support files of the size the recordings.

So I setup a new domain and website just for the "Virtual Delphi Users Group"

Now, I find myself personally using Delphi Feeds most of the time so I want the VDUG Feed listed there, if you want to see it then vote for my submission.  (UPDATE: It's listed!)

The replay of the first meeting:   Component Development / Tips & Tricks has been posted on the the new site.

If your interested in sponsoring this group in any way let me know: rlove at peakbiz dot com

Wednesday, April 14, 2010

Virtual Delphi Users Group Meeting

I will be presenting at a Virtual Delphi Users Group Meeting Next Week.

Everyone is invited and it's free of charge.   It's not going to be a marketing show like a typical Webinar, it just plan free training on Delphi.

Date: Tuesday April 20, 2010
Time: 6:00 PM MDT (UTC - 6 hours)

Topics:
   Delphi Tips & Tricks - Phil Gilmore
   Delphi Component Development - Robert Love

Pre-Registration is required: https://www1.gotomeeting.com/register/512344336

I have more material on Component Development than time will allow, as such I will poll those attending the meeting to decide on the direction to take.


This will be the first of hopefully several, it really depends on participation levels, i.e. don't want to prepare and have nobody show up :-)

Tuesday, April 6, 2010

Personal Outlook #1

Sunday, April 4, 2010

Virtual User Group Options

The SLCDUG (Salt Lake City Delphi Users Group) is going to do some of it's meetings on-line.  

I started researching many options of what technlogy to use, with the following factors playing into my decision:

  1. Cost, since we don't collect dues the cost needs to be small enough that I can personally handle it if there is not a sponsor willing to pick up the tab.   
  2. Options are available to make this more like a local users group meeting than pre-scripted webinar presentation. 
  3. We have attendance in the past year at anywhere from 4 people to 50 people.    Because our virtual meetings will be available to everyone on the Internet, we need a solution that supports at least 100 people.

I was surprised to find that there is not a ton of un-biased reviews.   For example the most compressive review of GoToWebinar was done by a Cisco employee the company that produces Webex.    With that in mind I knew I could not depend on others research.   So I setup multiple computers in my home all signed up for the trial offers of the following companies and this is what I found in my comparision.

GoToWebinar
Price: $99/Month
Max Attendees: 100 @ $99 * 500 @ $399  *  1000 @ $499
OS Supported: Windows, MAC
Trial Length: 30 Days
Pros: 

  • Interface was easy to use.
  • Control windows are not broadcast
  • Ability to view only one application instead of the entire desktop.
  • Support for VOIP and Telephone conferencing for presenters and/or Attendees
  • May unmute either option quickly via software.
  • Up to 25 People could be unmuted.
  • Good registration and Tracking of who attended.
  • Was able to show a small video clip without slow down.
  • Ability to share or hide Attendees List
  • Easy to schedule future meetings
  • Ability to make someone else the presenter without reconnecting
Cons:
  • No support for Web Cams
  • No Support Linux
  • Can not be run from a virtual machine
WebEx 
Price:  Contact Sales (Scared here as 25 users is $49/Month but I have sent an email request)
Max Attendees: 500 (Meeting Center Product) 3000 (Event Center Product)
OS Supported: Windows, MAC, Solaris, Unix, Linux, 3G Enabled Smart phones (IPhone, Blackberry, Nokia, etc)
Trial Length: 14 Days (Meeting Center) unable to trial Event Center
Pros:

  • Control windows are not broadcast
  • Optional support to allow attendees to chat with each other.
  • Ability to Share or Hide Attendee List
  • Ability to make someone else the presenter without reconnecting
  • Easy way to schedule future meetings
Cons: (Based on Meeting Center)

  • No way to register for a meeting.
  • No way to see reports on who attended after meeting.
  • Interface seemed to get in the way more than I wanted.
  • Had Problems starting a 2nd Meeting after first trial meeting.
  • Users Joining meeting were prompted to join 14 day trial (Our attendees are not their customers!)
LiveMeeting
Price:  $22.50/Month  ($4.50 per user per month min 5 Users)
Initially this was confusing but figured it out.  Each Organizer need a license, attendees don't so the minimum license count will work for our situation)
Max attendees: 250 (Can get up to 1250 if you pay $16 per User)
OS Supported: Windows, any Java supported OS (Java Version does not support VOIP)
Trial Length: 30 Days (It's all of Microsoft on-line services, not just LiveMeeting)
Pros:

  • Price is very good.
  • Ability to Show or Hide Attendee List
  • Ability to allow Users to Create own Personal Recording
  • Optional Pre Registration 
  • Embarcadero Uses it for CodeRage so people are familiar with it.
Cons:
  • Organizers are required to use a Sign In Application, that reconfigures Outlook.
  • Most Difficult (As an Organizer) to get setup initially
  • Web Version does not support VOIP / Clients must Download Live Meeting to get VOIP
  • Only supports External Phone Conferencing Providers, not provided by Default.
  • If I allow all attendees to have MIC access, I can't control the Mute.   They can unmute themselves at will.  You can mute everyone but yourself but they can turn around and unmute immediately.
DimDim
Price: $75/Month (DimDim Webinar Version) (There is a Free version for 20 or less attendees)
Max Attendees: 1000
OS Supported: Windows, Mac, and Modern Browser that supports Flash.
Trial Length: 30 Days

Pros:
  • Optional Public Group Chat
  • Poor Support for Question and Answers, Private Chat was the only option.
  • Registration Support
  • Phone or VIOP Support
  • Price for smaller meetings
  • Cool count down timer and Registration Widget to embed on site later
  • Open API for setup of Meetings. (although: Lacked in Meeting API controls)
  • Will host Recordings
  • Shared Browsing Feature
Cons:
  • Speed of switching content views.
  • Only can share whole desktop.  Annoying Red box around screen.
  • No built in Polling
  • Registration Required Field are not changable (I don't care about phone number but DimDim makes it required)
  • Several Support Forums, with no clear direction where to go.  They were confusing at best.
  • Recording will not record everything, currently does not support white board or shared browsing



Common Problems regardless of option:
  • Unable to Broadcast PC Audio without setting up, Sound Mix and disabling your Mic or using a second PC/Mixer Board.   
Right now I am leaning to LiveMeeting because of price, but my favorite is GotoWebinar, its features are far more robust and would go along way in making the session seem more like a local user group meeting.

I am interested in feedback on those that have experience in using these technologies or other options I did not review.

Update:  Added DimDim to the list of products reviewed

Sunday, February 14, 2010

Happy 15th Birthday Delphi - My Delphi Story

On February 14, 1995 the first version of Delphi was released.  Little did I know how much this would affect my life.  

I had learned to program using Apple II Basic in grade school.    In high school, I was able to enroll in the AP computer science program.   At that time it was taught using Turbo Pascal 3.3.   I don't really remember when I purchased my first compiler, but I do know that it was TP 5.5.   During high school I started writing shareware programs using TP 5.5 for the VBBS System.   I earned enough money to support my newly formed programming habit.   I purchased many of the libraries offered by TurboPower.

I graduated from High School in 1992, I enrolled in college with a major in Theater :-)    Little did I realize that little habit of mine was going to change the course of my life.  While in college I started working as a tech support specialist for Prodigy after a short period I was promoted helping manage the LAN with both desktop and server support.  We were running in an OS/2 environment and took my first look at C to help manage many of the things we needed to do.   I was successful but I realized I did not like the language, as much as I did with Pascal.   During this time, I was fairly active reader of the Compuserve Forums for both Borland and TurboPower allowing me to learn of a new product.   I purchase Delphi the moment it came out, I also started attending the Salt Lake City Delphi users group.    At one of the meetings I met,  my soon to be future boss, who was looking for a programmer.   The company was very small operating out of a home that was converted into an office.  I did the programming for an application that manged the bookings for timeshare properties.  It was also far enough away from my school that I had to drop out of college.

Wanting to continually improve my programming skills I attended Software and Development West in San Fransisco.   There I found the Borland booth, and I ran into the Interbase marketing manager.   I told him about the work we had done with the Interbase API to make things faster and avoid the BDE.     I told him how we had developed UDFs for InterBase using Delphi.   I remember him saying:  I did not think you could do that, do you want to come speak about what you have done at our conference.    A week or two later I contacted him and said yes to the offer to speak at the conference.     I was going to be surprised, I was still a very green programmer and I had never had attended a Borland Conference before.    I don't remember much about the conference materials.  I do however remember the way I felt during the session I presented.  I had written a couple of very large white papers on the subject, so I felt prepared.   I also felt very young and scared. When it came time for the question and answers section of  my sessions, I was blown away many of the questions were WAY over my head.    I don't really know how I scored with the attendees of that session but I do know it took a few years to be accepted to speak at any future conferences.

The big benefit was I had the conference on my resume, I started looking for a new job one that would allow me to expanding my programming abilities and pay more.     I had 5 different job offers,  I took a job with a local consulting company which more than doubled my current pay.   It was an awesome job because the Delphi market was huge.   I worked for so many different clients in the next two years I lost count.   I specialized in going into new locations that was experiencing bugs in there code and helping them debug there code and resolve what appeared to be random access violation errors.    During this time I took over as the President of the Salt Lake City Delphi users group, which I still do to this day.

In 1998 my life was changing even more, I had found the love of my life and was married.  At the same time I could see the market for Delphi opportunities was starting to dry up, so I took something more stable, or so I thought.   I then took two jobs in a row where I was laid off as business directions changed.    After the second lay off I decided the consulting business was just as stable and paid more.     I had a three clients, the State of Utah, Borland, and a small embedded software developer.  The Borland contract, was awesome I was working with some of the people I had admired over the years.   However at one point in 2005 all three clients were asking for my services at least full time at the same time.  Instead of refusing work,  I tried to keep it up, but after about 4 months I crashed and burned.   It took months to fully recover, I was forced to quit all but one of the contracts.  The one contract I kept was with the State of Utah, they offered me a full time job, which I accepted and still work there to this day.

In July of 2008 I finally enrolled in school again to finish that degree that. Schools no longer teach pascal, so I have been using JavaScript, and Java.  But after many assignments Delphi it is still my development product of choice.

Just imagine the number of people that have been supported by income generated from working with Delphi.  Delphi  has supported my family from the beginning and hopefully well into the future.

To the point... I want to wish a happy 15th Birthday to Delphi.    I want to thank all of the people behind the product for the dramatic way they have affected my life!

Secondary point of the story:
In 15 years I have personally been responsible for purchases of more than 100 different licenses of Delphi.   If I had not been able to afford Turbo Pascal, I would have been forced to go another direction.  My entry level investment in 1990's in Turbo Pascal resulted in way over 100k of Delphi revenue stream.      It's time to find away back into the entry level market.

Thursday, January 28, 2010

An Object Binding Prototype

I have been really looking for good ways to keep the different layers of our application bound together. As such I have been looking at others code, searching out libraries, and building prototypes.

One such prototype I have built, is fairly simple. While, I am not sold on using this as a method for binding, I think its worth sharing. It requires Delphi 2010, and uses the enhanced
RTTI.

First off the TObjectBinder code can be downloaded from SVN Repository in my RTTIWork Branch.

Say you have class such as this one:
TPerson = class(TObject)
  FirstName : String;
  LastName : String;
end;

To use this code all you need to tie this object to your user interface is this:

  // Create Binding with Class you want as the source of the binding
  Binding := TObjectBinder.Create(TPerson);
  // Binding() Parameters
  // First: Property or Field of Class passed to the Constructor
  // Second: Object you want as the destination of the binding.
  // Third:  Property or Field of the Destination you want to bind too
  // Fourth: If the binding is readonly(Optional: Default False)
  // Fifth: ITypeMapping Interface (Optional: Default NIL) more on this later.
  Binding.Binding('FirstName',Edit1,'Text');
  Binding.Binding('LastName',Edit2,'Text');
  // Then there are two key methods you can use after that.
  // Load() takes the contents of the Person and populates
  //        Edit1 and Edit2 Controls
  Binding.Load(Person); // Where Person is an instance of TPerson
  // This takes the contents of Edit1 and Edit2 and Saves it back to the person.
  Binding.Save(Person);

What does this offer, allows you create a list of bindings of any property of any object
to any other property of any object. It reduces code like this...

  Edit1.Text := Person.FirstName;
  Edit2.Text := Person.LastName;
  ...
  Person.FirstName := Edit1.Text;
  Person.LastName := Edit1.Text;

I have buttons that need to be enabled only when the data changes, so I also implemented
Button1.Enabled := Binding.IsChanged(Person);

Since mappings may need to change data types, I created the following interface
to allow you to specify conversion methods and supply them.

  ITypeMapping = interface
     function SourceToDest(Source : TValue) : TValue;
     function DestToSource(Source : TValue) : TValue;
     function Compare(Source : TValue; Dest : TValue) : Integer;
  end;

Granted, if this was more than a prototype I would have built all of the common conversions
and automatically detected which one to use.

To take this further, I have a need to dynamically create a form that can edit an unknown object. Similar to what you can do with an Object Inspector, so this might work well to bind
to those dynamically create controls. Time to build another prototype :-)

Special thanks to Cobus Kruger for this great post and another option on doing the same thing.  In that solution, I did not like having to name my controls to have to match my model.   But the basic idea is very similar, and shows off yet another way to use the RTTI and potentially solve the same problem.