text:
tag:blogger.com,1999:blog-33394598757550881132014-10-29T15:44:57.433-06:00Rob's Technology CornerMy blog typically about Delphi Programming.Robert Lovehttps://firstname.lastname@example.com:blogger.com,1999:blog-3339459875755088113.post-42848225766447215172014-10-28T09:15:00.000-06:002014-10-28T09:15:39.271-06:00Introduction to GITThis week at CodeRage 9 I will be presenting. "Introduction to Distributed Version Control"

My session covers the basics of how a Distributed Version Control System works. I focus is on GIT but it applies to Mercurial - Hg.

Here is a link to the slides I used for the first 10 minutes of the presentation.

I used 3 clients in the Demo.

Command Line

SourceTree GIT/Hg Client in the Demo.

Rad Studio XE7

I highly recommend learning the command line tools, there are two great demos for GIT available that I reference in the presentation.

Command Line Demo - https://try.github.io

Command Line Demo with Branching - https://pcottle.github.io/learnGitBranching/

What I don't cover heavily in the introduction is branching. Understanding this allows you to really leverage the power of Distributed Version Control. Atlassian has a great tutorial on GIT but the best part of this document is how it compares the various workflows you could use with GIT.

If your coming from SVN and moving to GIT I created this cheat sheet to remember the common commands.

Another thing I wanted to cover but did not have time was options when it comes to hosting your git repositories that I have used.

Public and Private Repositories outside your firewall:

GitHub
Great visibility for open source projects.
Priced per Private Repository, with unlimited users.
Public Repositories are free.

BitBucket
Good Visibility for open source projects
Priced per user, with unlimited repositories. 5 and under users are Free.
Public Repository with unlimited users are free.

I have found that I create several small repositories, and the pricing for BitBucket works well for that. So I tend to put my private repositories on BitBucket and my Public Repositories on GitHub.

There are several products that are designed for behind the firewall. I have only used the free Bonobo Git Server. Really want to switch to Stash, but I have to wait right now due to budget limits.

Robert Lovehttps://firstname.lastname@example.com:blogger.com,1999:blog-3339459875755088113.post-51726125419641523562014-09-12T10:42:00.001-06:002014-09-12T10:42:27.737-06:00VCL or FireMonkey - XE7In a previous blog post I mentioned we are starting a rewrite of an existing application using Delphi XE7 . One of the comments was raised if we are going to use VCL or Firemonkey.

It was decision we took quite seriously. Using Delphi we spent a few days developing Firemonkey sample applications and compared them to what we could do in VCL. Firemonkey is quite nice. It has some really nice way of presenting data. However, ultimately we have decided on writing our application using the VCL.

Primary reasons we to considered using VCL

Existing libraries that can be reused.

We have written 30+ Custom Controls, that we can reuse.

Still maintained and enhanced.

Reasons we considered Firemonkey

Can create some really pretty applications, animations, etc... that are more time consuming to create under VCL.

Gets most of the new features in the Delphi libraries.

Gives a potential to go cross platform However, we have no requirements for this.

Reasons we choose the VCL over Firemonkey.

We have no need to go cross platform with this application

VCL applications look like the belong on windows, Firemonkey applications look like that are made to work on Windows.

Firemonkey is a fast moving target, and Delphi upgrades may be more difficult if we skip versions.

VCL is still getting improvements (But since it's mature it's not as difficult to adapt) but it's easier to upgrade between Delphi versions.

Existing code libraries can be reused.

Cost we don't have to buy or develop controls we already have.

Specific VCL controls - (Where we could not find a equivalent in Firemonkey)

TImageScrollBox in the Envision Library (Really nice way to view images)

TRichViewEdit from the TRichView Library (Any RTF editor may work)

TTrayIcon support

TWebBrowser - HTML Viewing Component for desktop, we see it there for mobile.

The good news is that XE7 supports both and I have a decision to make. I know some have said get rid of one or the other. I personally like having the choice, they each meet a different set of needs.

That being said part of my hope is that some of the reasons we chose VCL or Firemonkey are removed are removed in future releases. I also really want supported interactions that allow us to mix Firemonkey and VCL Code, such as a TFrame in VCL or Firemonkey being able to be embedded into VCL or Firemonkey form.

Regardless of the the framework choice, XE7 appears to be a good choice for development and has compelling reasons to use over XE6.

Robert Lovehttps://firstname.lastname@example.com:blogger.com,1999:blog-3339459875755088113.post-86046572593967714562014-09-04T16:25:00.000-06:002014-09-04T18:25:31.967-06:00Product/Component Vendors and XE7 SupportHere are the most prominent 3rd Party components(That don't ship in the Rad Studio/Delphi products) that we use. We may or may not use these in the application we will be rewriting in Delphi XE7 as we have make lots of decisions first such as VCL or Firemonkey.

2 Days after XE7 was released and some people are are on top of there game.
THANK YOU!

The following already support XE7

JCL

JVCL

DUnitX

Delphi.Mocks

Spring4D

TMS Component Pack

FinalBuilder

Patiently waiting on Support for XE7

Fast Reports 5

TMS VCL Subscription

Specifically waiting on

TMS Advanced Charts

TMS FlexCel component Suite

TMS Diagram Studio

TMS Business Subscription (Waiting to purchase <g>)</g>

SmartInspect

Envision Imaging Library

I really like what TMS did for upgrading to XE6 and now they have done the same for XE7.
Robert Lovehttps://firstname.lastname@example.com:blogger.com,1999:blog-3339459875755088113.post-25458026060119177762014-09-03T12:26:00.001-06:002014-09-03T12:26:37.312-06:00XE6 Upgrade Story, Now on to XE7...We started the Delphi XE6 so early in the process we had to convert all the 3rd party components we used to XE6 without help from the vendors. Our plan was to upgrade Delphi XE6, and move to ContinuaCI. We also rewrote our FinalBuilder scripts from scratch, keeping in mind we would be upgrading more often. This project was scheduled to go from April and release at the end of September. We actually finished development in mid June and released after regression testing on Aug 7th. The release went really well we had ONE new bug reported in Production We also had less than 15 reported bugs during the development cycle. Comparing it to our last major upgrade from Delphi 2007 to XE we were over schedule, we lost count on the number development bugs, and we had many more problems in production.
Testing our application suite takes apx 1.5 months to complete. Due to the time it takes to completely retest the application we tend to have to isolate areas and focus on them for release. This allows us to have faster testing time as we don't have to as thoroughly test all areas. A luxury we don't get when upgrading Delphi as all area of the code need to be retested.

Because testing time is such a major part of development, we have been slowly but surely increasing the number of of unit tests. We also have some research going on in GUI Automation Tools, but we are not pleased with our current options here. We are also researching adding GUI testing to DUnitX. Each has benefits and drawbacks that are obvious and others that we will only find out by trying.

That being said our team will not be able to upgrade our whole product suite to XE7 as 3 months of QA time a year to do Delphi Upgrades is too costly. So we will have to wait for XE8 and maybe even XE9 for our whole product suite to be upgraded.

That being said XE7 still appears to is a very compelling upgrade.

Our very first Delphi application that was developed here (long before I arrived) is showing it's age, it was originally developed in Delphi 3. It came complete with every bad programming practice I have ever seen. Global variables, events containing all the business logic, the worst being it's desire to use hidden TEdit as variables. Granted it was the first Delphi application written by that team, and they were learning the language on this project.... But it's just not worth trying to fix. Not to mention that the business has evolved and wants something different that what it did.

The last version of Delphi that will touch this application is XE6.

Today we are starting a project that will rewrite this application, were we will be using XE7.

Robert Lovehttps://firstname.lastname@example.com:blogger.com,1999:blog-3339459875755088113.post-81163056758885907602014-05-06T10:59:00.000-06:002014-05-06T10:59:42.018-06:00Support and how it should work.During our XE to XE6 upgrade project, we felt it was time to redo our build process.

We are using FinalBuilder and ContinuaCI produced by VSoft Technologies in Canberra, Australia.

During the process we ran into some minor bugs, in the product. We also had some major and minor feature requests.

Anytime I ran into one of these, I would shoot off an email to the product support email address.

Sending an email to them would result in a automatic Ticket Number response email from the FogBugz software they are using. I don't know much about FogBugz, but as customer I love the interaction and being able to see the status of the emailed ticket at any time.

Then after sending the email, I would then leave for the day, the next morning I would come in and have a response to my ticket.

What made me happy about these responses was most of the time they contained a link to a build with a fix to the problem I was experiencing. If I had made a minor feature request, that commonly was also implemented in the same time period. For major feature requests, I was informed that the request was placed on the list to implement, some times with follow up questions to ensure they knew what I was asking for.

Typical response time for a bug fix: < 24 hours.
Longest I remember waiting on a bug fix < 2 weeks.

As a customer I have never felt my opinion or bug was under valued or should be discounted because of some other mitigating factor. A behavior I commonly get from other companies.

I could be getting lucky with my requests, but I highly doubt it as we have seen this behavior several times over the years we have been using their products. I am sure sooner or later something nasty will come up that will take longer, but I know it won't just be sidelined, it will be worked on, and I will be kept informed of what is going on.

My point is, VSoft Technologies really has support covered. I wish other companies, I work with had that level of support. Robert Lovehttps://firstname.lastname@example.com:blogger.com,1999:blog-3339459875755088113.post-63715914417127951492014-04-18T13:19:00.002-06:002014-04-18T13:19:45.622-06:00XE6 - New Look and FeelOne of the first things long time Delphi Developers may notice about XE6 is that it has new look and feel.

One thing I have learned over the years is that when you change the user interface in any way you will get a divergent number of opinions. My opinion of this change is simple: I like it.

I have made two similar screenshots of XE5 and XE6, so you can compare the differences.

Robert Lovehttps://email@example.com:blogger.com,1999:blog-3339459875755088113.post-26793751692721481052014-04-16T17:03:00.000-06:002014-04-16T17:07:08.993-06:00Delphi XE6 - Easy to upgradeDelphi XE6 was just released yesterday! My team of 10 Delphi Developers has been moving fast.

Several Open Source Libraries that my team uses have been updated to support XE6.

DUnitX

Delphi-Mocks

JCL

JVCL

Spring4D

We also updated OmniThreadLibrary but don't know how to submit changes back for that but all we did was created XE6 packages from the prior version it worked fine.

We were able to internally update our commercial libraries such as TMS, SmartInspect, Envision, RichView, FastReports and few others because we did not want to wait. The latest version of FinalBuilder already supports XE6 so that made our build easy.

We now have our primary application working with XE6. It was quite easy to do.

Our code base is over 2 million lines of code. We have 178 Packages (all have been converted) We have 650+ DPR, several of these have been converted. Finishing all of the secondary applications (DPR's) right now, and expect to have our conversion complete in the next 3 weeks.

This has been a VERY EASY upgrade. We were upgrading from Delphi XE.

I had some headaches with the license registration, but once you get past that the product works well.

Robert Lovehttps://email@example.com:blogger.com,1999:blog-3339459875755088113.post-33695765667973115182014-02-17T11:05:00.000-07:002014-02-17T18:05:49.802-07:00pfSense - Network PerformanceI am lucky enough to live in an area where I can get a fiber connection to my home.
I pay for 100 GB and 100 GB down. However, I was never able to achieve this performance levels. About a year ago I took a bandwidth speed test. This is what I was able to get get. My wife was on the phone (VOIP) at the time and my kids were watching Netflix. So I had competing traffic.

At home I have been using a Dlink 665 Router for a long time, and it worked for my needs.

But then I wanted to do the following

 Block all DNS Query traffic that is not going to "Approved" DNS Servers.

 VPN into my home network.

 Monitor bandwidth by device on my network.

I have been researching options on what could provide provide these, including:

Devices

Aftermarket firmware for existing devices.

Using Linux or FreeBSD and spending hours configuring it.

After not having much luck finding something that would meet my needs, in my price range.
asked a co-worker what he used. He pointed me to pfSense.

pfSense is a Open Source Firewall based on FreeBSD.

I add a second NIC to an older spare machine I had. Then I installed pfSense, it was a very easy to install. I had it running with the base configuration, a few minutes after inserting the CD and starting the install.

I then spent a few hours to get it configured as desired, but it was really easy. Most of the time was spend readdressing my home network, as I desired a more structured ip address layout compared to random undocumented method that I had before.

I expected to get the features I was after, but one took me by surprise.
I noticed our connection seemed much faster than before.

So I took another speed test, I had my son watch Netflix like he was before.

Wow!

Granted lots of things could have changed in a years time. So some of the differences may not be attributable to pfSense. However, I am not about to install the Dlink 665 again to find out out the true differences.

But since I noticed the improvement, without the speed test, I thought I should post a glowing review of pfSense. All of the features I wanted have been working really well, and it has more feature than I will ever need, allowing me to expand to meet my needs.

If you need need a better firewall at the your home or office. It's worth looking into pfSense.

Robert Lovehttps://email@example.com:blogger.com,1999:blog-3339459875755088113.post-25201267450837830732013-12-30T14:44:00.000-07:002014-01-05T17:59:39.197-07:00DUnitX and my plansI have been a big fan of using unit testing frameworks. I use both DUnit and DUnitX for my Delphi tests.

I am right now contributing to DUnitX as I see it as the future framework of choice for Delphi Developers.

I just wanted to talk in public about some of work I have going on around DUnitX. My goal is simple to get feedback from the Delphi community.

IDE Expert
It is really easy to setup a test project and test fixtures with DUnitX, but I thought it could be easier.

So I created a new Delphi Open Tools Expert that does the following:

File | New | Other | Delphi Projects | DUnitX Project

Creates a new DPR/DPROJ

DPR Source is modeled after the DUnitX example unit tests.

Base Project Search Path set to $(DUnitX)

Optionally creates a Test Unit

File | New | Other | Delphi Files | DUnitx Unit

Creates new Delphi unit

Adds DUnitX.TestFramework to uses

Creates a new class with correct attributes, you get to specify class name

Optionally creates Setup and TearDown methods

Optionally creates Sample Test Methods.

Registers the TestFixture in the initialization section.

Basically it's not much, but it provides a framework to reduce your time to get to writing actual test code. I am nearly done with this code, I wrote most of it during the Christmas Break. Hopefully in the next week I can finish this. It's going to take some time, as I have to build a machine with Delphi 2010 through XE5 on it to test this functionality as I only have XE and XE5 installed right now.

To see the current state of the code check out this expert branch.
Update: Code is now part of the master branch on the Main Project

Data Driven Test Cases

The potential to have data driven test cases is the main reason why I started looking at DUnitX.

 [TestFixture]
 TMyTestObject = class(TObject)
 public
 [Setup]
 procedure Setup;
 [TearDown]
 procedure TearDown;
 // Sample Methods
 // Simple single Test
 [Test]
 procedure Test1;
 // Test with TestCase Atribute to supply parameters.
 [Test]
 [TestCase('TestA','1,2')]
 [TestCase('TestB','3,4')]
 procedure Test2(const AValue1 : Integer;const AValue2 : Integer);
 end;

The method Test2 above shows up as two different tests, the first time it's called with 1 and and second time it's called with 3 and 4.

I recently made a change to underlying structure of the code. First I created a new record called TestCaseInfo followed by two new abstract attribute classes

 ///
 /// Internal Structure used for those implementing CustomTestCase or
 /// CustomTestCaseSource descendants.
 ///
 TestCaseInfo = record

 ///
 /// Name of the Test Case
 ///
 Name : string;

 ///
 /// Values that will be passed to the method being tested.
 ///
 Values : TValueArray;
 end;

 TestCaseInfoArray = array of TestCaseInfo;

 ///
 /// Base class for all Test Case Attributes.
 ///
 /// <remarks>
 /// Class is abstract and should never be, used to annotate a class as a
 /// attribute. Instead use a descendant, that implements the GetCaseInfo
 /// method.
 /// </remarks>
 CustomTestCaseAttribute = class abstract(TCustomAttribute)
 protected
 function GetCaseInfo : TestCaseInfo; virtual; abstract;
 public
 property CaseInfo : TestCaseInfo read GetCaseInfo;
 end;

 ///
 /// Base class for all Test Case Source Attributes.
 ///
 /// <remarks>
 /// <para>
 /// Class is abstract and should never be, used to annotate a class as a
 /// attribute. Instead use a descendant, that implements the
 /// GetCaseInfoArray method.
 /// </para>
 /// <para>
 /// Note: If a method is annotated with a decendant of
 /// TestCaseSourceAttribute and returns an empty TestCaseInfoArray, then
 /// no test will be shown for the method.
 /// </para>
 /// </remarks>
 CustomTestCaseSourceAttribute = class abstract(TCustomAttribute)
 protected
 function GetCaseInfoArray : TestCaseInfoArray; virtual; abstract;
 public
 property CaseInfoArray : TestCaseInfoArray read GetCaseInfoArray;
 end;

With these two classes, I changed TestCaseAttribute to descend from CustomTestCaseAttribute.
Then I changed the architecture to create a Test based on the TestCaseInfo record structure, that is obtained by either the CaseInfo or the CaseInfoArray properties of the abstract classes.

This little change provides for some really nice functionality, for example I have working sample that uses FireDAC to provide the values to my tests method

 FireDacTestCaseAttribute = class(CustomTestCaseSourceAttribute)
 protected
 FTestName : String;
 FConnectionName : String;
 FSelectStatement : String;
 function GetCaseInfoArray : TestCaseInfoArray; override;
 public
 constructor Create(const ATestName : String;const AConnectionName : String; const ASelectStatement : String);
 end;

 // Which then can be used like this:
 [FireDacTestCase('TestName','MyDBConn','select strVal, IntVal from Table');
 procedure MyTestMethod(AValue1 : String; AValue2 : Integer);

// Right now the test come out names 'TestName1', 'TestName2', 'TestName3' although that will
// change before I commit my code to allow specifying values.

//Most likely passing the TValuesArray with a Format call on testName like this:

 [FireDacTestCase('TestName%0:s%1:s','MyDBConn','select strVal, IntVal from Table');
 procedure MyTestMethod(AValue1 : String; AValue2 : Integer);

This attribute is not in the DUnitX.TestFramework.pas to avoiding creating dependencies on those that don't use this functionality. This needs quite a bit of work before it's polished enough for general use, but it's what I am working on next after the expert is submitted as a pull request.

Note: Since FireDac changed it's naming, I believe it might be XE4 or XE5 specific.

Repeat Attribute

DUnitX defines a RepeatAttribute that is currently not implemented. I made an attempt at implementing it, and I don't like it. If anyone has better idea, I would be happy to entertain it.

Otherwise, I have some small improvements I think I will make and will submit it again.

My implementation can be found in Pull Request #26 which won't auto merge due another change being implemented first, but can be viewed in a working state in my RepeatAttribute branch.

Future Plans
Things I want see in a Unit Testing framework is vast, I not sure what I will start on next but here are some areas I am considering with no preference on order. Note: this is not a road map as some may never be done (at least by me)

Test Categories similar to NUnit as I have 10k+ of DUnit tests currently and categories might make it easier to group run on the ones I am interested in.

VCL and Firemonkey GUI Runner

Understands and can filter on categories

Quick Filter by name

Run all or specified tests

Simplify the DUnitX project source and make easier to select which runner is used.

VCL

Firemonkey

Console

Something similar to GUITesting.pas found in DUnit

Load and run tests stored in BPLs.

Data Driven Tests Enhancements

dbExpress

CSV Test Case Source

XML Test Case Source

TestCaseSource Attribute

IOC looks up the Test Case Source Builder Interface

Other Sources implement Test Case Builder Interface and Register it in IOC Container.

Remote Test Framework

Think mobile, tests are on the device the runner is on your development machine.

Think Test Farm, multiple machines, with different configurations all running tests.

Implement TestInOwnThreadAttribute

Find better way to test new functionality in DUnitX.

Thank you

And last but not least I would like to thank Vincent Parrett and his team for the set of great tools he as produced for the Delphi community.

I use the following:

FinalBuilder - Build Automation Tool - Commercial - Well worth the price!!!!

ContinuaCI - Build Server - Commercial - Free single for a single build server/agent.

DUnitX - Unit Testing Framework - Open Source

Delphi-Mocks - Mocking Framework - Open Source

DUnit-XML - DUnit XML output in NUnit Style - Open Source

There is more Open Source he has produced all listed on GitHub.

Robert Lovehttps://email@example.com:blogger.com,1999:blog-3339459875755088113.post-60889490381240847792013-10-08T10:47:00.000-06:002013-10-08T10:47:22.278-06:00CodeRage - Next Week Next week is CodeRage, I am looking forward to speaking again.

I have two sessions:

A VCL Developers Guide to Firemonkey

October 15, 2013 @ 8:00 AM PDT

This session is for those VCL developers who want to learn Firemonkey but have never taken a dive in. Designed to help these developers save time by addressing the difference in a quick and easy way.

Responsive Delphi Design

October 16, 2013 @ 1:00 PM PDT

Now with mobile developer we are faced with multiple form factors (Device Sizes). How do we create a single application that looks good on each form factor you

Attendance is FREE and online, all you need to do is Register before the 15th.

Robert Lovehttps://firstname.lastname@example.com:blogger.com,1999:blog-3339459875755088113.post-50820171473335076262013-08-09T08:39:00.000-06:002013-08-15T15:58:55.110-06:00Getting ready for AndroidAndroid support in Delphi is on the Roadmap and is expected in the fall. Although I have a Mac and an IPad, I have an Android Phone. I was not as excited for the XE4 (iOS support) release as I am about Android support.

I have some thoughts on Android that I want to share...

Market Share
Overall I see a greater number of Android devices, in fact we have 5 Android based devices in my home and only 1 iOS device. Market studies that I have read vary, but shows in some cases a 50-50 market
and in other it shows that Android has a greater market share. Regardless the possibility of using Delphi to write a single application that can target both is very exciting.

Android Versions

Android currently has shipped 7 different, Major product releases. These are separated by different code names. Unlike iOS where most of the users are using the latest version. Knowing this code names will make your life easier as they are referenced in documentation, blog posts, articles, etc...

The 3 most popular (as of July 8, 2013):
Gingerbread - 34.1%
Ice Cream Sandwich - 23.3%
Jelly Bean - 37.9%

Full details on the break down of each code name are market share can be found on the developer.android.com site. Another good tidbit from this site is the various screen resolutions and
form factors you will see when targeting android.

Distribution
Distribution is not locked down like the iOS market.
You can distribute you applications in several different ways including
-Google Play Store
-Amazon App Store
-Download from you own site

Design of your application
I love to hear customers talk about just moving an existing windows application to Windows. After talking with them, they quickly realize that the form factor and touch interface requires a redesign to the look and feel of an application. For example, most VCL Delphi Applications I have seen contain a Grid. I rarely see such anything like that on mobile platforms. To help with this mind set switch I would recommend reading a couple of Design Guidelines.

iOS Human Interface Guidelines

Android Developer Pattern Guidelines. (Check out other sections as well)

A bit about the internals of Android

At the heart of Android is the Linux Kernel (Version 3.x since Ice Cream Sandwich release).
On top of the Kernel sits the Dalvik Virtual Machine which runs Java Byte Code.

So when it comes to development you have two targeting options.

Native - Runs at the Linux Kernel Level

Java Byte Code - Runs in the Dalvik Virtual Machine

Since Delphi is using LLVM for the Android Compiler, applications running will be targeting native.

Java has history of being able to interop between native compiled code, it uses a technology called JNI.

I suspect that Delphi will have some easy way to do JNI since several of the android libraries are based in Dalvik.

Now it's time to wait and see what Delphi's Android support will really shape up to be.

Robert Lovehttps://firstname.lastname@example.com:blogger.com,1999:blog-3339459875755088113.post-10361778758771107312013-02-18T06:00:00.000-07:002013-02-19T08:14:20.803-07:00Legacy Code: ScopingHey when I change X why does it break Y when they "should" be completely unrelated. It's a common problem in development where changing one bit of code has unintended side effects on a different section of code. Proper varible scoping can help reduce these errors. Unit testing is the other piece to solving this problem.

Lets start with the most common global variables. They are are almost always bad, in fact it's really hard to come up with an example of where I feel like they should be used. However, by default Delphi creates several of them for you.

Specifically, when you create a new form or datamodule there is a variable in that unit that represents that form or datamodule. We have tried to remove these with varying degrees of success. Over the years the visual designers have given us errors after removing them. Not to mention if auto created then the variable is needed. So now by default we ignore and don't use them. However, there are exceptions and here is one story....

Our application uses a single database connection of type TSqlConnection. It was placed on a TDataModule and let everyone use it. Every demo you see with Delphi told you do it this way. It made everything really easy, until...

We had new needs which turned into problems.

We wanted to take a section of code, and multi-thread it. You need to have a database connection per thread, to pull this off. All of that code was immediately broken and had to be changed.

We wanted to use a separate set of connection parameters when doing different tests.

We wanted to unit test without creating the whole data module, which over time became a place for developers who were lazy to place common code.

We had non visual code that was used in more than one application. The other applications had different requirements on how the connection needed to be setup. So those had connections setup in a different unit than the original global version.

So what have we done to help resolve this problem...

Our code base really depends on TFrame we have several hundred them, actually we were lucky all our frames used a common TFrame Descendant that we created. Each frame typically represents a new tab in our application. Each frame is created in a common factory. This factory has knowledge of the database connection. So one of many things we did, to help us for the future was to add a Connection property to the common TFrame Descendant. The connection property is set in the common factory. Now frames have a connection they can access without directly accessing the global connection variable.

Now one by one as we visit each screen we are able to remove the global references, and use the new Connection property. We still have several frames that use the global connection. But sometimes you have incrementally attack a problem, as you can't rewrite each time decide you hate the code your looking at, otherwise I would never make a deadline.

It is not just Global variables that are a problem, it's improperly scoped variables. Here is one that I have seen done multiple times.

unit Unit1;

interface
uses SysUtils, Classes, Forms, SqlExpr;
type
 TExample1 = class(TForm)
 MyQuery : TSqlQuery;
 protected
 public
 procedure DoSomething;
 published
 end;

var
 MyExample1 : TMyExample1;

implementation

{$R *.dfm}

{ TExample1 }

procedure TExample1.DoSomething;
begin
 MyQuery.SQL.Clear;
 MyQuery.SQL.Add('SELECT * FROM SOMETABLE');
 MyQuery.Open;
 while not MyQuery.EOF do
 begin
 // Do Something with MyQuery
 MyQuery.Next;
 end;
 MyQuery.Close;
end;

end.

Every time I see code like this it's typically want to scream not again, although it is a quick and easy refactor.

First off let's explore what the problem is with this code. MyQuery was a Component that was dropped on to the form. When you drop a component on a form, anyone who has access to the form can change it because if you don't specify, private, protected or public the default behavior is published! The DFM Streaming mechanism depends on this so there is not much you can do to change this.

However, dropping components on to a form or Datamodule that are only used in one method is like asking someone to abuse you.

Instead change your code to create the query like this.

unit Unit1;

interface
uses SysUtils, Classes, Forms, SqlExpr;
type
 TExample1 = class(TForm)
 protected
 public
 procedure DoSomething;
 published
 end;

implementation

{ TExample1 }

procedure TExample1.DoSomething;
var
 MyQuery : TSQLQuery;
begin
 MyQuery := TSqlQuery.Create(nil);
 try
 MyQuery.SQLConnection := SomeConnection; // Hopefully passed to you and not global
 MyQuery.SQL.Clear;
 MyQuery.SQL.Add('SELECT * FROM SOMETABLE');
 MyQuery.Open;
 while not MyQuery.EOF do
 begin
 // Do Something with MyQuery
 MyQuery.Next;
 end;
 MyQuery.Close;
 finally
 MyQuery.Free;
 end;
end;

end.

Notice the MyQuery is no longer declared in published section but is now local to DoSomething.

 The key point of all of this...

 When writing code you should scope the variable declarations to be as close as possible to the code that uses it.Robert Lovehttps://firstname.lastname@example.com:blogger.com,1999:blog-3339459875755088113.post-26541640320520735712013-02-14T08:46:00.000-07:002013-02-15T05:15:25.296-07:00Legacy Code: Abstract to InterfaceSay you where given the following legacy code snippet, and where told that you needed five new packet types that need to be written.

 TDataObject = class(TObject)
 // Some Shared Data here.
 end;

 TPacketWriter = class(TObject)
 private
 function CreateObjectX : TDataObject;
 procedure WriteFileZ(Data : TDataObject);
 protected
 procedure WriteFileX(Data : TDataObject); virtual; abstract;
 procedure WriteFileY(Data : TDataObject); virtual; abstract;
 public
 procedure Execute;
 end;

 TPacketWriterTypeA = class(TPacketWriter)
 protected
 procedure WriteFileX(Data : TDataObject); override;
 procedure WriteFileY(Data : TDataObject); override;
 end;

 TPacketWriterTypeB = class(TPacketWriter)
 protected
 procedure WriteFileX(Data : TDataObject); override;
 procedure WriteFileY(Data : TDataObject); override;
 end;

 ...

procedure TPacketWriter.Execute;
var
 lObj : TDataObject;
begin
 lObj := CreateObjectX;
 try
 WriteFileX(lObj);
 WriteFileY(lObj);
 WriteFileZ(lObj);
 finally
 lObj.Free;
 end;
end;

 ...
 // where it was used
var
 PWA : TPacketWriterTypeA;
 PWB : TPacketWriterTypeB;
begin
 PWA := TPacketWriterTypeA.create;
 try
 PWA.Execute;
 finally
 PWA.Free;
 end;

 PWB := TPacketWriterTypeA.create;
 try
 PWB.Execute;
 finally
 PWB.Free;
 end;
end;

Well you might say that is easy I can quickly add the following.

 TPacketWriterNewType1 = class(TPacketWriter)
 protected
 procedure WriteFileX(Data : TDataObject); override;
 procedure WriteFileY(Data : TDataObject); override;
 end;

 TPacketWriterNewType2 = class(TPacketWriter)
 protected
 procedure WriteFileX(Data : TDataObject); override;
 procedure WriteFileY(Data : TDataObject); override;
 end;

 TPacketWriterNewType3 = class(TPacketWriter)
 protected
 procedure WriteFileX(Data : TDataObject); override;
 procedure WriteFileY(Data : TDataObject); override;
 end;

 TPacketWriterNewType4 = class(TPacketWriter)
 protected
 procedure WriteFileX(Data : TDataObject); override;
 procedure WriteFileY(Data : TDataObject); override;
 end;

 TPacketWriterNewType5 = class(TPacketWriter)
 protected
 procedure WriteFileX(Data : TDataObject); override;
 procedure WriteFileY(Data : TDataObject); override;
 end;

But I have goal that all new code should be unit tested. Let just say that WriteFileX and WriteFileY are unique in each case and they are complex pieces of code. In the real world example The Execute Method was even more complex. Writing a test on just the execute method would involve a lot of cut and paste of test code for each instance. Not something that smelled correct to me.

The key here that I want to point out is that when you see virtual; abstract; you should ask if an interface makes sense. In this case the answer I determined that an interface made sense. I refactored the TPacketWriter to implement an interface with the resulting code looking like this:

 TDataObject = class(TObject)
 // Some Shared Data here.
 end;

 IPacketFileWriter = interface
 ['{9BE43D5A-5566-4218-A83A-A54D567AD986}']
 procedure WriteFileX(Data : TDataObject);
 procedure WriteFileY(Data : TDataObject);
 end;

 TPacketWriter = class(TObject)
 private
 function CreateObjectX : TDataObject;
 procedure WriteFileZ(Data : TDataObject);
 public
 procedure Execute(aFileWriter : IPacketFileWriter);
 end;

 TPacketWriterTypeA = class(TInterfacedObject,IPacketFileWriter)
 protected
 procedure WriteFileX(Data : TDataObject);
 procedure WriteFileY(Data : TDataObject);
 end;

 TPacketWriterTypeB = class(TInterfacedObject,IPacketFileWriter)
 protected
 procedure WriteFileX(Data : TDataObject);
 procedure WriteFileY(Data : TDataObject);
 end;

 TPacketWriterNewType1 = class(TInterfacedObject,IPacketFileWriter)
 protected
 procedure WriteFileX(Data : TDataObject);
 procedure WriteFileY(Data : TDataObject);
 end;

 TPacketWriterNewType2 = class(TInterfacedObject,IPacketFileWriter)
 protected
 procedure WriteFileX(Data : TDataObject);
 procedure WriteFileY(Data : TDataObject);
 end;

 TPacketWriterNewType3 = class(TInterfacedObject,IPacketFileWriter)
 protected
 procedure WriteFileX(Data : TDataObject);
 procedure WriteFileY(Data : TDataObject);
 end;

 TPacketWriterNewType4 = class(TInterfacedObject,IPacketFileWriter)
 protected
 procedure WriteFileX(Data : TDataObject);
 procedure WriteFileY(Data : TDataObject);
 end;

 TPacketWriterNewType5 = class(TInterfacedObject,IPacketFileWriter)
 protected
 procedure WriteFileX(Data : TDataObject);
 procedure WriteFileY(Data : TDataObject);
 end;

...

procedure TPacketWriter.Execute(aFileWriter : IPacketFileWriter);
var
 lObj : TDataObject;
begin
 lObj := CreateObjectX;
 try
 aFileWriter.WriteFileX(lObj);
 aFileWriter.WriteFileY(lObj);
 WriteFileZ(lObj);
 finally
 lObj.Free;
 end;
end;

...

// Where it was used
var
 PW : TPacketWriter;
begin
 PW := TPacketWriter.Create;
 try
 PW.Execute(TPacketWriterTypeA.Create);
 PW.Execute(TPacketWriterTypeB.Create);
 PW.Execute(TPacketWriterNewType1.Create);
 PW.Execute(TPacketWriterNewType2.Create);
 PW.Execute(TPacketWriterNewType3.Create);
 PW.Execute(TPacketWriterNewType4.Create);
 PW.Execute(TPacketWriterNewType5.Create);
 finally
 PW.Free;
 end;
end;

So why do this?

I was able to write a test for TPacketWriter.execute using a Mock Object that implemented the Interface

I was able to test both WriteFilesX and WriteFileY for each class independently

Implementing new supporting types is easy and I don't have to worry about TPacketWriter.Execute when I am writing my test.

I am sure there are other reasons, but writing testable code was my primary motivation.

There are many other things I can change with this code. But the point I want to repeat.

When you see virtual; abstract; you should ask if an interface makes sense.

Robert Lovehttps://email@example.com:blogger.com,1999:blog-3339459875755088113.post-22552476322055333672013-02-14T08:41:00.002-07:002013-02-14T17:35:06.834-07:00Legacy CodeToday, It has been 18 years since Delphi was released. Some Delphi projects have been around for quite some time now. I think we all look back on code we wrote a year or two ago that we would write in a completely different way today. Sometimes is because a new feature of the language or a new library is available, and sometimes it is just that you have learned a better way to do something.

Where I work....

In 1998 there was a mainframe application, that was not going to make it through the year 2000 switch. A decision was made to rewrite the application and Delphi was chosen. We have had several other applications that were started after the year 2000 that were written in other technologies. Many of the these have had to be completely rewritten. However, our not so little Delphi application not only survives it thrives. Business is always changing we are constantly updating our application to meet these ever changing needs.

Much of the original code written in 1998 still exists in some form, with many more lines of code after that. The team has evolved over that time as well, we only have one developer left who started the project. I estimate that we have had 40+ unique developers who have worked on this code base. Each unique,

each had there own coding style and skill sets.

Some of the past code is very procedural with tons of global variables and is written in a such a way that it's very difficult to test and maintain. Where new code is written using better practices, and with good unit test coverage. But it's not uncommon to be asked to change an area of the application that has not been significantly changed since it was first written in 1998. When faced with such a change, how do I do that in a safe way and not continue to keep the code looking like it was written in 1998.

I have been collecting various snippets of code and how I changed them for the better. Today I will be starting a series of blog posts on dealing with legacy code. I suspect this may generate a bit of debate and that conversation is welcome. I have learned that there is always a better way. I have also learned that what works from problem X may be the complete wrong solution for problem Y.

My hope is that what I write will help others to think in new and different ways when dealing with code.

Robert Lovehttps://firstname.lastname@example.com:blogger.com,1999:blog-3339459875755088113.post-23282872897904871932013-02-07T08:42:00.001-07:002013-02-14T17:36:15.298-07:00AnyDAC - worries with some real excitement.When I read Marco Cantu's Post titled "Embarcadero Buys AnyDAC" I began to worry.

Where I work we spent a great deal of time converting from the BDE to dbExpress. Granted we did it faster than we thought it would take, it's not something I am ready to do again. Having to switch from dbExpress to another Database Layer was really not going to be an option for us. So I spent some time really reading the documentation on AnyDAC.

From what I have read this has turned from worry to exciting news, with a one thing that may need to be done.

First off let me address my worry about dbExpress.

 AnyDAC is a library that can sit on top of dbExpress, ODBC or it's own drivers.

 AnyDAC can connect to dbExpress driver through a TADPhysTDBXDriverLink component.

What is lacking that would need to developed. (Maybe already done since I have no code to look at yet, and I am just reading docs)

Ability to have a TSQLConnection use an existing TADConnection class or vice versa.

I basically think it would be great if AnyDAC existing connection could become an dbExpress Driver.

I know enough about the dbExpress framework to know this is something that would be very possible to do.

In the long run this would also allow Embarcadero to only have to support one set of drivers and not one for dbExpress and one for AnyDAC.

If Embarcadero does something stupid and don't do this and just stop maintaining dbExpress Drivers without providing a bridge then I would have to stop upgrading Delphi versions, but I really don't see that happening.

This would allow existing dbExpress applications to start using AnyDAC without having to have two connections to the database.

Then I started looking at the features of AnyDAC and found several that are really appealing.

Although I don't have a BDE application, I know several still do

Existing BDE Applications have a Detailed Guide on conversion to AnyDac.

With a step by step coverage on converting BDE Applications.

BDE needs to go away, this really looks like a really good option for those applications.

I primarily use Oracle but we also use Sybase, SQL Server, My SQL, SQLite and DB2. All have good support with AnyDAC with many other Databases supported.

Sometimes I have to basically join results from two different databases. It usually results in some pretty ugly code. AnyDAC helps solve this problem by supporting Local SQL which allows you to execute SQL queries against any TDataSet descendants as the data source.

Oracle Support includes support for more data types than the existing dbExpress Driver.

TADMemTable is faster than TClientDataSet there was old blog entry on the comparison of speed between memory based datasets and show the difference for the various operations.

Good support for low level trace/logging of what is going on at the API level.

Currently has 100% of the source available I am hoping Embarcadero keeps that up. It's a big complaint of mine when it comes to dbExpress.

Live Data Window Mode, appears to be something that could really help us with some performance on some of our search screens.

Array DML, appears it may help us speed up some of our batch operations such as file importing.

In addition I noticed that AnyDAC really has a good cross platform story. Which might be a huge thing for the Mobile editions of Delphi. Granted I think that connecting directly to a remote database via a mobile application is a security risk.

Overall I think this will be a good thing, depending on the decisions made by Embarcadero that have yet to be made.

Robert Lovehttps://firstname.lastname@example.com:blogger.com,1999:blog-3339459875755088113.post-67249772786912446402012-12-26T13:14:00.001-07:002013-02-14T17:36:15.300-07:00Oracle DBX DriverToday I was looking my draft posts in blogger. I found this one, I actually ran into this a several months ago...

Today, I ran into the following:

Access violation at address 00368099 in module 'dbxora.dll'. Write of address 00000000

It occurs when calling TSqlQuery.Next after retrieving several thousand rows. I stepped through the Delphi code and found the error actually occurs inside the dbxora.dll.

I ran the same query in Toad, which works until you scroll to the bottom of the query.

Then it raises the following message:

 ORA-01427: single-row subquery returns more than one row

So when I found out the real error was, it was easy to see my mistake and fix the query.

Besides the problem that I created I see the following problems with this story.

I received an A/V instead of a valid error message.

The source code to dbxora.dll is not present which means I don't have a way to change this behavior.

Note: This project was written with Delphi XE Update 1

Robert Lovehttps://firstname.lastname@example.com:blogger.com,1999:blog-3339459875755088113.post-31428153448916489792012-09-20T09:36:00.000-06:002013-02-14T17:35:57.944-07:00CodeRage 7 - Dates and Call for Papers AnnouncedToday the Call for Papers for Code Rage 7 was just announced.

This is my favorite event every year.

This year the conference will be 2 weeks.

CodeRage 7 - The Online Delphi Developer Conference -- November 6-8, 2012

CodeRage 7 - The Online C++ Developer Conference -- November 13-15, 2012

We typically scheduled a conference room and have my whole team participate in a single room, allowing

dialog and training for the whole team.
Robert Lovehttps://firstname.lastname@example.com:blogger.com,1999:blog-3339459875755088113.post-84495336952458139052012-08-15T15:39:00.000-06:002012-08-15T15:39:53.863-06:00FinalBuilder Server replacement Continua CI For quite some time VSoft Technologies the makers of FinalBuilder have been working on a replacement for FinalBuilder Server, that they had called FindBuilder Server vNext +1. They just announced a public beta of this new product called Continua CI.

I have played with this software and if your build is not automated it's required to take a look. If your build is automated it worth taking a look. For those who have used FinalBuilder Server it will take you by surprise as they are really not alike. But many things that I had to build special scripts to do with FinalBuilder server are now just taken care of for you.

For example:

Multiple Stages - where I could have 1 or more build stages, followed by 1 or more unit testing stages, an installation building stage, and a deployment stage.

Can handle customized build numbers derived from version control values such as a SVN revision ID.

Linking of the items in the our bug tracking database.

Handling building of Branches in our SVN Repo

The basic architecture of FinalBuilder Server required a dependency on the FinalBuilder desktop product and typically builds would run on a single server. With Continua CI you now have a server that does nothing more than provide the web interface, and store information about the builds and trigger agents to do the build. The server and agent can be on the same machine if desired or you could have multiple agents configured with different stages of your build running on each.

Where I work we have a 25 minute build, test, deploy process that occurs with each commit. As we look at Continua CI we are rethinking our current build process to span multiple machines with the goal to get this down to the 5-10 minute range, something I think is very possible with this product without a huge effort.

Feel free to read the documentation on the product to get a better understanding of what it offers. Remember that the product is in beta so the documentation is still a work in process, but it's more than enough to get you going.

But the biggest news that they announced was how it was licensed.

Out of the box, Free of charge, Continua supports :

Unlimited Users

Unlimited Projects

Unlimited Configurations

1 Local Agent(on the same machine as the server)

1 Concurrent Build.

After that you can purchase concurrent build licenses. Once you have at least 1 license installed, you can use as many remote agents as you like, agents do not take up licenses, concurrent builds do.

If we use Continua the way we used FinalBuilder Server before it will now cost us $0. Granted we current have user 12 licenses that we have maintenance on, so they will convert to 6 concurrent builds licenses.

Which may be more than we need but I suspect we could use at least 4 and if other teams here use it then we might need quite a few more.

The pricing is right to try, it was fairly easy to setup, and get a CI server going.

Robert Lovehttps://email@example.com:blogger.com,1999:blog-3339459875755088113.post-24007530745798866312012-07-09T22:37:00.001-06:002012-07-09T22:37:57.958-06:00Embarcadero - Clang and LLVMRecently Tim Anderson reported that Embarcadero was going to be using the Clang Compiler in the Rad Studio. When word broke about Embarcadero using LLVM with Delphi I was quite pleased. I had been playing around with LLVM learning its IR for quite some time and it is a great tool for most any development language. However, knowing that they have based there C++ work on the the Clang Compiler is very pleasing to me. Clang is a very nice C/C++/Objective-C Compiler.

Benefits of the Clang Compiler

Complete support for C++98 and nearly complete support for C++11 Standards

Good platform for building Source Level Tools

The Default Compiler in XCode on Mac OS X

Can compile FreeBSD and is the Default Compiler

Can compile the Boost C++ Libraries

It can be easily embedded into any application as it designed to be a library

The API is built with tooling and IDE integration in mind.

Good Error Messages

Better performance that GCC

Use of the LLVM Core libraries (The Compiler back-end)

Some of the Benefits of LLVM (I really don't do it justice with my small list)

Target-Independent Code Generator with production level support for the following processors. (Although not all features are supported on each processor)

X86

ARM

Sparc

PowerPC

Hexagon

Mips

JIT Support with an optional command line tool (lli) to run LLVM bitcode

Optimizer has many Optimizations with a plug-able infrastructure to add additional optimization's

Optional Support for implementing Garbage Collection

Good set of Tools

It well documented.

All of this makes me wonder how much of other things from LLVM that they may end up using all or part of as LLDB, KLEE, or VMKit

Now which features of clang and llvm will be exposed in the Embarcadero tool chain is not know yet. But it's nice to know that there is a good foundation they are building on.

I guess it might be time to sign up for Priority Preview Access to see this in action.

Robert Lovehttps://email@example.com:blogger.com,1999:blog-3339459875755088113.post-22840624237777634612011-09-23T08:17:00.000-06:002011-09-23T08:23:49.486-06:00See you at CodeRageI have never seen so many Delphi Events as we are seeing right now.

There is definitely a buzz regarding the new Delphi XE2

DelphiLive in San Jose has completed and it was a great event.

Half the Delphi World Tour dates have past, with a several more to go.
In Utah the Delphi World Tour represented one of the largest Delphi Event in Years.

Next Up is CodeRage Oct 17-21, 2011. It a FREE, virtual conference. For those who are confused about the idea of a virtual conference.... think of of it as 50 back to back webinars in 5 Days.

My team goes to training room with loads of junk food. Where we discuss the sessions as they occur. It really for good team building.

I will be sharing 4 sessions at CodeRage this year.

Learning Magic Tricks: The Beginners Guide to RTTI

Learn what RTTI is and how to use it. This session is designed for those that have heard of RTTI, but don't know where to start.

Practical Magic: Why would I use Delphi RTTI?

Attendees are shown several practical examples of how the RTTI in Delphi works.

Magic Unleashed: A Deep Dive into the Delphi RTTI

In this session, we pull back the covers and explore the internals of how RTTI.pas and TypInfo.pas work inside of Delphi exposing all of the RTTI options you have to use in your applications.

Exploring the Delphi Debugger

This session explores how to use the Delphi Debugger to find those difficult to find problems. We explore the little known features of the debugger that can make your life easier when real problems arise.

All of the RTTI sessions are back to back, allowing for Q/A after each. With three sessions I will be able to provide more information than I have ever been able to do before.

Robert Lovehttps://email@example.com:blogger.com,1999:blog-3339459875755088113.post-3850723959623216262011-09-06T15:36:00.000-06:002011-09-06T15:36:14.092-06:00XE2 and Registration Headaches.
Today I hit the registration limit on XE2.

I installed it on the following machines.

Laptop (Primary for DelphiLive Presentation)

Laptop (Backup for DelphiLive Presentation)

Desktop (Home)

MacMini, Windows VM

Desktop (Work)

Registered in in that order. I ran in to the registration Limit with #5. I am the only person who uses these machines.

So I think no big deal, I will request a registration limit increase. I requested the increase and walked away from my machine for meeting. Thinking I can wait 14 days to register no big deal.

Then I did the following.

1. File|New VCL Application

2. Ctrl-F9

Then the following dialog appears.

I have never been a fan of activation, but I have not been against it... Until Now!

Now that I can see that the 14 day grace does not just cripple the application on start-up, it annoys the developer and reduces their productivity.

The good news is that support did respond and the activation limit has been increased. But this is just a headache that paying customers should not have to deal with.

Robert Lovehttps://email@example.com:blogger.com,1999:blog-3339459875755088113.post-25926805412946663552011-08-25T22:41:00.001-06:002011-08-26T00:08:07.326-06:00New Mac and Rad Studio XE2Note: I was given permission to blog about the Rad Studio XE2 Beta.

Today my first Mac OSX computer arrived at my home. I have only used a Mac when working
on Sound and Lights at local theatre. I have spent about 10 hours total time working on a Mac in the last 10 years. So I would guess this as close to a new user experience as one my expect.

The primary reason I bought the Mac is because Rad Studio XE2 supports writing applications for this platform. I like to make sure I stay on top of the various Delphi technologies so I had to buy one.

I opened the box and hooked up the various cables. Turned it on and I saw a little diagram asking me to turn on my touch pad or mouse. Well I turned on the touch pad and nothing happened. After trying various combinations I gave up and called support. After having to power of the Mac twice we were able to get the wireless keyboard and mouse to work. Things were not going well, and I was a bit worried I had made a mistake but things turned around.

I had installed the latest Rad Studio XE2 Beta version on my home computer, which is a Windows 7 machine.
Then I performed the following steps:
1. File|New Firemonkey HD Application.
2. I then right Clicked on Target platform and added OSx

I knew I had to install something on the Mac but I did not know where it was or how to do it.
I opened the Help file and found it had a Huge amount of information that pointed me in the right direction.
From the little I did read I was very very pleased with the depth of coverage.

3. I Installed the Platform Assistant on the Mac according to the instructions.
4. I launched the platform assistant clicking on the "paserver.command" in
"Developer" section of finder.

5. Then in back in Delphi, I right clicked on the "OS X" Target Platform and selected "Assign Remote Profile"
6. On the "Select Remote Profile for 'OS X' Platform" dialog I pressed "Add..."
7. I walked through the Wizard and Added Information about my Mac.

8. Then finally I selected the new profile that was created.
9. I then pressed the run button.

The application appeared on the Mac as expected.

I must say the out of the box experience with Delphi and the Mac looks very polished, it was very easy to setup. I spent more time trying to get the wireless mouse and keyboard to work than getting Rad Studio configured and my first App running.

Now that I have a basic app running it's time to really explore how FireMonkey integrates will both Windows and OS X.

For more information check out the Rad Studio XE World Tour or the Delphi Live conference.Robert Lovehttps://firstname.lastname@example.com:blogger.com,1999:blog-3339459875755088113.post-37834323731715316402011-06-15T00:15:00.000-06:002011-06-15T12:13:41.127-06:00THtmlWriter - First LookI wanted my build process to automatically generate a web page with what was changed in the given build. Basically I had to query our Internal Bug Tracking system and produce a web page. Allowing me to take a

snapshot of bug tracking system as it looked liked when the build was produced.

This was going to be a simple console application that our build could run.

So I decided to try THtmlWriter written by Nick Hodges.

I spent more time reviewing the code of THtmlWriter than I did actually using it.

It was very easy to use, and will most likely use it in future

If you need to produce HTML from Delphi application it's worth looking at this.

So here is my +1 Vote for THtmlWriterRobert Lovehttps://email@example.com:blogger.com,1999:blog-3339459875755088113.post-55075649813745305932011-06-07T12:34:00.000-06:002011-06-07T12:34:53.103-06:00Application -vs- Component DeveloperDuring Interviews I have heard the following from candidates.
"I am Application developer, I use components, I don't build them."

I typically have thought well I have found another "point and click" developer who is not familiar with OOP. Since I have been at my component no candidate who has said this has been hired.

Recently I ran into an exception (outside of an Interview) a Delphi Developer who was very familiar with OOP but had still not built a component. I realized that there an artificial barrier into component development, that many might see. In a future blog postI will confront this artificial barrier head on and show how easy it is to do component development. This post is show some of the arguments of why we would want to do component development as an application developer.

In 2007 we converted our application from BDE to DBX. We had written an application that converted all TQuery components to TDbxQuery components.

The process of conversion to the 3 component model of DBX (TSqlQuery -> TProvider -> TClientDataset) was going to be error prone. It was also going to take an insane amount of time that we were not willing to spend.

So we spent a few days creating a component that looked like and behaved like TQuery but internally used the 3 Component DBX model. It was similar to TSimpleDateset but had properties and functions that matched existing TQuery functionality that we used. This allowed for a search and replace of instances of TQuery with TdbxQuery. This allowed us to complete this conversion in less time that if we had just used the built in components. Since we maintained the component we were able to expose any functionality of the 3 components model that we needed.

During this process we realized we had hundreds of TDBGrid components. So we decided to help our application for the long term. We replaced TDBGrid with TDwsGrid. Initially the code looked something like this. It basically offered nothing over TDbGrid.

TDwsGrid = class(TCustomDBGrid)
 published
 property Align;
 property Anchors;
 property BiDiMode;
 property BorderStyle;
 property Color;
 property Columns stored False;
 property Constraints;
 property Ctl3D;
 property DataSource;
 property DefaultDrawing;
 property DragCursor;
 property DragKind;
 property DragMode;
 property Enabled;
 property FixedColor;
 property Font;
 property ImeMode;
 property ImeName;
 property Options;
 property ParentBiDiMode;
 property ParentColor;
 property ParentCtl3D;
 property ParentFont;
 property ParentShowHint;
 property PopupMenu;
 property ReadOnly;
 property ShowHint;
 property TabOrder;
 property TabStop;
 property TitleFont;
 property Visible;
 property OnCellClick;
 property OnColEnter;
 property OnColExit;
 property OnColumnMoved;
 property OnDrawColumnCell;
 property OnDblClick;
 property OnDragDrop;
 property OnDragOver;
 property OnEditButtonClick;
 property OnEndDock;
 property OnEndDrag;
 property OnEnter;
 property OnExit;
 property OnKeyDown;
 property OnKeyPress;
 property OnKeyUp;
 property OnMouseActivate;
 property OnMouseDown;
 property OnMouseEnter;
 property OnMouseLeave;
 property OnMouseMove;
 property OnMouseUp;
 property OnMouseWheel;
 property OnMouseWheelDown;
 property OnMouseWheelUp;
 property OnStartDock;
 property OnStartDrag;
 property OnTitleClick;
 end;

The other day I had a look at this component, it now does the following.

Sorts the Grid based on Click of column Title

Persists Column positions and sizing to a configuration file.

Ability to Export to Excel.

It's not a huge amount functionality but it allowed us to add this to many screens without how having to place this code to do this in every place we used TDbGrid.

When explaining this to application only developer one might expect a response of. "Well why not buy a 3rd party control that does that?" My answer "We did just that, when we had the budget we purchased a TMS Subscription and now use TDBAdvGrid in many places."

But the experience previously learned still applied to 3rd party component packages. We now are in the processed of creating, our new component which now looks like this:

TdwsAdvDbGrid = class(TAdvDBGrid)
end;

Allowing us to add additional functionality to TAdvDBGrid if we need it. Granted for now we don't need to add anything. But the lesson learned from the previous experience has shown the value.

This does not just apply to additional functionality, it also applies to common custom settings.
Say for example every time you use a TEdit you need to change the Font to comply with a standard
you have set. Instead of doing the tedious mistake ridden work of doing this. Instead create a TMyEdit then use that instead of TEdit.

interface

uses
 SysUtils, Classes, Controls, StdCtrls;

type
 TMyEdit = class(TEdit)
 public
 constructor Create(AOwner : TComponent); override;
 end;

procedure Register;

implementation
{ TMyEdit }

constructor TMyEdit.Create(AOwner: TComponent);
begin
 inherited;
 Font.Name := 'My Crazy Font';
end;

So basically a developer should be able to do both, application and component development. Taking the time to learn component development will only help you in your your abilities to create great applications.Robert Lovehttps://email@example.com:blogger.com,1999:blog-3339459875755088113.post-50260271549872298592011-06-02T19:34:00.004-06:002011-06-07T12:37:16.811-06:00Runtime/Designtime what? Delphi PackagesTo most Delphi developers a package is typically where you would place components so that you can drop them on your forms.

So one might assume that a 3rd Party Component developer would know how packages work. Well over the years I have seen several of these developers make basic mistakes when it comes to Delphi packages.

The application I work on is built with runtime packages. We currently have to deploy 208 packages.
Management of Packages and having the built correctly is paramount for us. Not all packages involve components, but the most common mistakes happen at that level.

This blog post is my attempt to help developers understand one area of packages, that I typically see mistakes.

A package is just a collection of units that are complied together into a BPL.

Here is the package sources for brand new package with a single unit.

package Package2;

{$R *.res}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$IMPLICITBUILD ON}

requires
 rtl;

contains
 Unit13 in 'Unit13.pas';

end.

There are two key sections requires and contains.

Contains is the list of units that your package contains. Requires is the list of other packages your package needs to compile. For example say you have a pkgBaseBall.bpl that contains a unit called baseball.pas.
Then you create a new packages called pkgSports.bpl that contains a unit called sports.pas which listed baseball.pas in it's uses clause. You will need to add pkgBaseBall to the requires clause the package named pkgSports.bpl

Key Files involved in package development.

*.DPROJ - XML File in MSBUILD format that contains project options and files.

*.DPK - Main source code of the package. (It's the code listed above)

*.BPL - Compiled Binary

*.DCP - Delphi Compiled Package, contains information about he interface section of the contained units.

Package Types
There are 3 basic types of Packages.

Designtime only

Runtime only

Designtime and runtime

Runtime Packages

When creating a Delphi you have the option to build with runtime packages. This option is found in the project options.

If you build with packages you must distribute the packages (.BPL files) your application uses.
<strong style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">

Most Delphi application that I have seen are build without runtime packages. Typically these developers tend to not realize the impact bad package design can cause on application that uses runtime packages.

When building with runtime packages the list of package you must distribute is semi-colon delimited list next to the check box for Build with run time packages in the project options. The only files you need to distribute for applications build with runtime packages is the BPLs. The other key package files do not need to be distributed.

Runtime packages should never contain or require designtime code.

Designtime Packages

Designtime packages are where you place your design time code. This includes

Property Editors

Component Editors

Open Tool Experts

References to other packages that are design time.

Component Registration "i.e. the Register method."

Designtime packages should never contain runtime code.

Designtime and Runtime

This is the lazy developer package. I don't want to create and maintain two packages, so I will just use one. This seems easy at first, but if not done carefully it leads to the most common mistake I run into. Then write some code that requires a designtime only package. This in effect makes your package designtime only regardless of your package type selection. It's easy to do any property or component editor will require DesignIDE which is design time package that you can't distribute.

The Rules
The summary version of common mistakes.

"Runtime" Packages should never contain Design time Code

"Designtime" Packages should never contain Runtime Code.

"Designtime and Runtime" Packages should never Require "Designtime" Packages.

"Runtime" Packages should never Require "Designtime" Packages.

Avoid "Runtime" Packages that require "Designtime and Runtime" Packages

Avoid the use of "Designtime and Runtime" Packages.

Why do I care?

If an application builds with runtime packages, and someone screws this up you will find that application requiring deployment of design time packages to work. If you do deploy the runtime package, you may run into a a runtime error "Application is not licensed to use this feature" This is because your using files that you should not be distributing.Robert Lovehttps://firstname.lastname@example.com


text:
Monday - Friday: 8:00 am to 5:00 pm (Night classes are also available)
Mentored Learning Schedule
New Horizons Southern California has several training locations located throughout Southern California. Visit our location pages to learn more about each location by selecting your nearest location.
Also remember that nearly all of our classes are taught Online with a live, interactive instructor so you can take your classes from your home or office and expect the same superior experience.
Each of our training facilities is equipped with the latest computer hardware and software and is an ideal learning environment to assure your success.

subset: commoncrawl


text:
Five Reasons We Wish the 2011 Oscars Had Happened in January
Surprises! Bad behavior! Christopher Nolan!
Skip to content, or skip to search.
Skip to content, or skip to search.
Surprises! Bad behavior! Christopher Nolan!
To keep all those intimidating actors on their toes.
It's all on IMDb.
Including, "Let movie stars tell you whom to vote for."
Breaking down the dynamics of the Oscar season's finest foursome.
The two biggest things that happened yesterday go head-to-head.
[Unintelligible Boston accents.]
Vulture's taken a look at the newest crop of contenders and the careful narrative crafted for each.
He's sorry, Mark Zuckerberg, it was just one of the characters in his movie who said those nasty things about you.
And not an asshole.
Natalie Portman takes home a trophy, too.
Who's up? Who's down?
Emmy-winner zing!
Insulting winners 'The Social Network' and 'The Kids Are All Right,' White made for an uncomfortable evening.
Including the most unlikely Winklevoss twins ever: Wee Man and Preston Lacy.
Also, find out who Judi Dench is playing in the Clint Eastwood–directed biopic.
Sony really wants to hit that $100 million mark.
She stole someone's idea! Maybe!


text:
Ed Koch: "Always a Bridesmaids?
| Posted 06.16.2011 | Entertainment
Read More: Bridesmaids Movie, Kristen Wiig, Ed Koch, A.j. Abucay, Thomas Farley, Mayor Koch, Bridesmaids Review, Maya Rudolph, New York Insider Productions, Lucille Ball, Entertainment News
While worth seeing, some will find Bridesmaids, as I did, a little too raunchy. Having a woman defecate in a sink was too much for me.


text:
Pill - All Of The Lights (Freestyle)
Posted Apr 15, 2011 at 12:00 AM
All Of The Lights (Freestyle) Pill
Editor Rating: HOTTTTT
User Rating:
Give All Of The Lights (Freestyle) a spin - it's the latest release from Pill, having dropped on Friday, April 15th, 2011.
Bump All Of The Lights (Freestyle), the latest cut from Pill. It was released on Friday, April 15th, 2011. Things are improving for Pill with each new offering, and All Of The Lights (Freestyle) is certainly no exception. It's a worthy addition to the Pill's catalogue, which has seen much evolution as of late. We're definitely anticipating the next step.
Have you heard Pill's Moment For Life Freestyle? If you dig this, visit Pill's profile for the latest info, news, songs, and mixtapes.
Let us know what you think, folks.
CommentsAdd Comment View Comment Thread
top comment


text:
Castrol® Appoints Ogilvy Public Relations As Primary U.S. Agency
NEW YORK, May 14, 2013 /PRNewswire/ -- Ogilvy Public Relations (Ogilvy PR), an integrated, global communications firm today announced that Castrol®, one of the world's leading provider of lubricant solutions, has selected Ogilvy PR as its primary agency to implement a strategic media relations program across the United States in support of Castrol's GTX and EDGE families of products. The account will be managed out of Ogilvy PR's New York office.
Castrol is synonymous with premium quality, high performance and leading-edge technology in lubrication. Castrol products have been tested and proven at the very limits of endurance and Castrol's long history of motor sports sponsorship has allowed the company to develop and test its products under the most demanding of conditions. Today, millions of people worldwide share in the benefits of that race-proven technology. Currently, Castrol can be found in retailers across the country, including: Auto Zone, Advance Auto Parts, Pep Boys and Wal-Mart.
"As the Castrol brand evolves and grows beyond the traditional automotive arena through our sports sponsorships, we are thrilled to be partnering with Ogilvy PR to help drive brand awareness," said Carolyn Eckert, Director of Communications. "Over the past two years, Ogilvy PR has supported our Castrol Index™ for Major League Soccer and we look forward to expanding on their work and the relationships they have built on Castrol's behalf."
Ogilvy PR will work with Castrol to craft a comprehensive media relations campaign to support the GTX and EDGE products, in addition to the brand's sports sponsorships across Major League Soccer, U.S. Soccer and the National Football League. Ogilvy PR has supported the Castrol Index™ for Major League Soccer since 2011 by utilizing a multi-channel media relations campaign to drive adoption and acceptance of the Castrol Index™ by MLS fans in the United States. Earlier this year, Ogilvy PR introduced the Castrol Index™ for U.S. Soccer and will continue to support Castrol's sponsorship of the U.S. Men's National Team throughout the FIFA World Cup™ qualifying matches."Castrol is an innovative brand that continues to find new ways to connect with consumers," said Jennifer Risi, Executive Vice President of Ogilvy Media Influence and Director of Content Creation. "We look forward to continuing our relationship with Castrol by building a strong and effect strategic media relations program to support the entire Castrol portfolio of products and sponsorships." About CastrolBP Lubricants USA Inc. markets premium lubricants and business-building programs directly to independent lube operators, service providers, new car dealers and leading retailers. Our leadership brands include Castrol® GTX® -- a premium conventional motor oil; Castrol® GTX® High Mileage™ - a premium synthetic blend designed for vehicles with over 75,000 miles; the Castrol® EDGE ® line of advanced full-synthetic super premium motor oils that offer unsurpassed strength and performance; Castrol® Power RS™ – an advanced full synthetic motorcycle oil; as well as our range of commercial transport lubricants. To find out more about Castrol products and programs, please call 1-888-CASTROL or log on to www.castrol.com/us. About Ogilvy Public Relations Ogilvy Public Relations (Ogilvy PR) is a global, multi-disciplinary communications leader operating in more than 85 offices across six continents. In 2012, Ogilvy was named Cannes Lions Network of the Year and Most Effective Agency Network by the Effie Global Effectiveness Index, named Public Affairs Consultancy of the Year by the Holmes Report, won Consumer Consultancy of the Year in Asia Pacific (Holmes Report), and won the WPP global, top award (WPPed Cream, Creme de la Creme) for the fifth time in six years. Ogilvy PR integrates deeply with all Ogilvy & Mather disciplines (advertising, direct marketing, activation, promotional, digital and entertainment) through the proprietary Ogilvy Fusion™ approach to delivering comprehensive, business solutions through content creation, community building, and communications with measurable results. Ogilvy PR is a unit of Ogilvy & Mather, a WPP company (NASDAQ: WPPGY), and one of the largest marketing communications companies in the world. For more information, visit our website at www.ogilvypr.com or follow us on Twitter at @ogilvypr. SOURCE Ogilvy Public Relations
Select the service that is right for you!COMPARE ALL SERVICES
Action Alerts PLUSTry it NOW
Jim Cramer and Stephanie Link actively manage a real portfolio and reveal their money management tactics while giving advanced notice before every trade.
Product Features:
- $2.5+ million portfolio
- Large-cap and dividend focus
- Intraday trade alerts from Cramer
- Weekly roundups
TheStreet Quant RatingsTry it NOW
Only $49.95/yr
Access the tool that DOMINATES the Russell 2000 and the S&P 500.
Product Features:
- Buy, hold, or sell recommendations for over 4,300 stocks
- Unlimited research reports on your favorite stocks
- A custom stock screener
- Upgrade/downgrade alerts
Stocks Under $10Try it NOW
David Peltier, uncovers low dollar stocks with extraordinary upside potential that are flying under Wall Street's radar.
Product Features:
- Model portfolio
- Stocks trading below $10
- Intraday trade alerts
- Weekly roundups
Dividend Stock AdvisorTry it NOW
Jim Cramer's protege, David Peltier, identifies the best of breed dividend stocks that will pay a reliable AND significant income stream.
Product Features:
- Diversified model portfolio of dividend stocks
- Alerts when market news affect the portfolio
- Bi-weekly updates with exact steps to take - BUY, HOLD, SELL
Real Money ProTry it NOW
All of Real Money, plus 15 more of Wall Street's sharpest minds delivering actionable trading ideas, a comprehensive look at the market, and fundamental and technical analysis.
Product Features:
- Real Money + Doug Kass Plus 15 more Wall Street Pros
- Intraday commentary & news
- Ultra-actionable trading ideas
Options ProfitsTry it NOW
Our options trading pros provide daily market commentary and over 100 monthly option trading ideas and strategies to help you become a well-seasoned trader.
Product Features:
- 100+ monthly options trading ideas
- Actionable options commentary & news
- Real-time trading community
- Options TV


text:
Mel Martinez
Revolving Door (0)
Sightings (5)
Sunday Show Preview - Posted November 7, 2008
Meet the Press: Obama-Biden transition team co-chair Valerie Jarrett, House Majority Whip James Clyburn, Sen. Mel Martinez (R-FL) and a roundtable with White House historian ... [FishbowlDC]
Morning Reading List, 10.24.08 - Posted October 24, 2008
Good morning Washington. Got a blind item, interesting link, funny note, comment, birthday, anniversary or anything of the sort for Morning Reading List? Drop us a line or let us know in the tips box below. We've got your morning mix of media Muesli after the... [FishbowlDC]
Sunday Show Preview - Posted October 3, 2008
Meet the Press: Democratic strategist Paul Begala and Republican strategist Mike Murphy, and a roundtable with NBC's David Gregory, PBS' Gwen Ifill, Wall Street ... [FishbowlDC]
This Week In Pool Reports - Posted March 30, 2007
Mixed emotions this week in the pool between the news of Tony Snow and Wednesday night's festivities. FLOTUS makes a fashion faux pas and John Boehner has a little trouble with the letter "G". "FLOTUS wore a shimmering purple/green dress -- which the pool will bet dollars-to-doughnuts is the same dress she... [FishbowlDC]
Taking Out The Trash, 03.15.07 - Posted March 15, 2007
Imus is not a big hit among media folk. Politico's Ben Smith reports that it isn't just the Nevada Democrats who are on the anti-Fox bandwagon. The CBC Political Education and Leadership Institute is has jumped on too. In the wake of the Libby trial, Jack S... [FishbowlDC]


text:
New York City
Wallbooking the First and Fourth Amendments
Someone is chalking the First and the Fourth Amendments around the neighborhood: asking for Comments, Shares and Likes. This chalk was on the hex tiled circle in the Central Plaza of Tompkins Square Park, a place where kids often do chalk drawings.
Wallbooked First Amendment chalked on the green painted wall around the hole where Mary Help of Christians once was.
"Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof; or abridging the freedom of speech, or of the press; or the right of the people peaceably to assemble, and to petition the Government for a redress of grievances."
"The right of the people to be secure in their persons, houses, papers, and effects, against unreasonable searches and seizures, shall not be violated, and no Warrants shall issue, but upon probable cause, supported by Oath or affirmation, and particularly describing the place to be searched, and the persons or things to be seized."
Tree Walk Update – Give Me Feedback
I want to thank the 20 or so people who came to the tree identification walk yesterday. Much thanks for the large turnout goes to EV Grieve, it seems like everyone in the neighborhood reads Grieve. If interest is expressed, I'll do more walks.
Your feedback was much welcomed. I am incorporating new features into the latest version of the map accordingly. Use the contact form to tell me whatever. You can also use the contact form to say you wish to be informed of future walks and news.
Are you interested in obtaining high resolution, wall-sized or fold-up map? I am thinking of doing this to help finance this project, as I receive no grants or funding.
Tompkins Trees Identification Walks
I'm holding two tree identification walks tomorrow, Saturday, July 26, 2014 at 9AM and 5PM in Tompkins Square Park. I'm hoping to attract a few local tree and gardening experts to help me out in this. The public is invited, I'll share what knowledge I have of the trees and the park in general. Please print your own map from the image I've posted on this page. But if you can't do that, I'll have a few maps on hand. Meet in the Central Plaza near the Hare Krishna Tree.
ATM Skimming Warning from the NYPD
These warning signs about ATM Skimming from the NYPD were taped up all along Avenue A. Looks like good tips, damn, I have to admit that some of these designs could easily have fooled me.
Detailed PDF


text:
Category:Tennessee Democrats
From Wikipedia, the free encyclopedia
This category has only the following subcategory.
- ► Tennessee Jacksonians (1 C, 29 P)
Pages in category "Tennessee Democrats"
The following 200 pages are in this category, out of 329 total. This list may not reflect recent changes (learn more).(previous 200) (next 200)
(previous 200) (next 200)


text:
Online Dating for Newbies
10 - 50 downloadsAdd this app to your lists
Download Online Dating for Newbies
Changelog and permissions
PermissionsChangelogPackage com.koolappz.EP77704400001
- This application requires no special permissions to run.
- New pricePrice increased from S$1.50 to S$1.70 on 03/22/11.
- NewFirst appearance on 01/06/11.
Users who installed this also installed


text:
Join/Renew AARP Today
Join/Renew for Just $16 A Year
- Discounts on travel and everyday savings
- Subscription to AARP The Magazine
- Free membership for your spouse or partner
Members can print free savings coupons
Learn how to live smart and stay sharp
Members save on e-
readers and tablets
Find the resources you need
Enter an ingredient, course or keyword and get cooking!
Learn how AARP Driver Safety can help you stay safe—and enter for a chance to win $1,000. See official rules.
Nothing has been viewed
Photo by: Joseph De Leo
Mario Batali is a feisty, ponytailed redhead whose motto could be "the pasta course waits for nobody." Mario hosted one of the first TVFN cooking shows, "Molto Mario," where he entertained viewers with real-people cooking peppered with unintentionally hilarious asides. Po, his tiny converted diner in Greenwich Village, bustles with the exuberance of an Italian fishing village. Now his second New York success, the restaurant Babbo, is opened and thriving as well as a third, Lupa. When I'm desperate for dinner, this soothing, simple, and easy-to-shop-for recipe of his invariably comes to the rescue.
1. Heat 3 tablespoons of the olive oil in a large sauté pan over medium heat. Sauté the garlic until soft but not burned. Add the shiitakes and cook until they give up their liquid, 2 to 3 minutes.
2. Pour in the stock and Cinzano: Bring to a boil and boil until reduced by half, about 5 minutes. The sauce should just coat the mushrooms.
3. Bring a large pot of salted water to a boil. Drop in the fettuccine and bring back to a boil. Taste, and drain when it is slightly al dente but no longer crunchy, about 1 minute.
4. Over high heat, toss the arugula into the shiitake sauce until it just wilts. Pour the sauce over the drained pasta and drizzle with the remaining 2 tablespoons olive oil. Serve hot.
Nutritional information does not include Light Chicken Stock. For nutritional information on Light Chicken Stock, please follow link above.
Nutrients per serving (% daily value)
From companies that meet the high standards of service and quality set by AARP.
Members save 15% all day, every day when dining at participating Denny's restaurants.
Members get a FREE Donut with purchase of a L or XL beverage at Dunkin' Donuts.
Members can locate discounts via the AARP® Member Advantages Offer Finder mobile app.
Join or renew today! Members receive exclusive member benefits & affect social change.
AARP is a nonprofit, nonpartisan organization that helps people 50 and older improve the quality of their lives.


text: Strict Standards: Redefining already defined constructor for class XML_Parser in /home/sites/www.americanpoems.com/web/store/aom/includes/os.php on line 1188 Strict Standards: Declaration of XML_Parser::raiseError() should be compatible with PEAR::raiseError($message = NULL, $code = NULL, $mode = NULL, $options = NULL, $userinfo = NULL, $error_class = NULL, $skipmsg = false) in /home/sites/www.americanpoems.com/web/store/aom/includes/os.php on line 1604 Strict Standards: Declaration of XML_Unserializer::startHandler() should be compatible with XML_Parser::startHandler($xp, $elem, &$attribs) in /home/sites/www.americanpoems.com/web/store/aom/includes/os.php on line 3503 Strict Standards: Declaration of Cache_Lite_File::get() should be compatible with Cache_Lite::get($id, $group = 'default', $doNotTestCacheValidity = false) in /home/sites/www.americanpoems.com/web/store/aom/includes/cache.php on line 1020 American Poems: Books: Star Wars: A Musical Journey (Music From Episodes I - Vi) Home Apparel Appliances Books DVD Electronics Home & Garden Kindle eBooks Magazines Music Outdoor Living Software Tools & Hardware PC & Video Games Search All Products Apparel Appliances Arts & Crafts Automotive Baby Beauty Books Computers DVD Electronics Gourmet Food Grocery Health Home & Garden Industrial & Science Jewelry Kindle eBooks Kitchen Magazines Miscellaneous Mobile Apps MP3 Downloads Music Musical Instruments Office Products Outdoor Living Pet Supplies Photo & Camera Shoes Software Sporting Goods Tools & Hardware Toys VHS Video On Demand PC & Video Games Watches Wireless Wireless Accessories Advanced Search Sitemap View Cart Checkout Location: Home » Books » Star Wars: A Musical Journey (Music From Episodes I - Vi) Star Wars: A Musical Journey (Music From Episodes I - Vi) enlarge Other Views: Author:Dan Coates Creator:John Williams Brand:Alfred Publishing Company Category:Book List Price: $16.95 Buy New: $11.85 as of 12/19/2014 20:14 EST details You Save: $5.10 (30%) In Stock New (20) Used (7) from $11.85 Seller:pennylanemusicbooks Sales Rank:33,223 Languages:English (Unknown), English (Original Language), English (Published) Media:Sheet music Number Of Items:1 Pages:58 Shipping Weight (lbs):0 Dimensions (in):9 x 0.2 x 12 Publication Date:December 1, 2007 MPN:1056581 Model:28304 ISBN:0739048473 UPC:038081308746 EAN:9780739048474 ASIN:0739048473 Availability:Usually ships in 1-2 business days Features: . Also Available In: Kindle Edition - Star Wars: A Musical Journey (Music From Episodes I - Vi) Piano Solos Sheet music - Star Wars: A Musical Journey (Music From Episodes I - Vi) Piano Solos Similar Items: The Lord of the Rings for Easy Piano Harry Potter -- Sheet Music from the Complete Film Series: Easy Piano Harry Potter -- Sheet Music from the Complete Film Series: Piano Solos Star Wars for Beginning Piano Solo Super Mario Series for Piano: Easy Piano Editorial Reviews: Synopsis(Easy Piano Songbook). For the first time, this piano sheet music collection encompasses the entire Star Wars saga! Set amid stunning imagery from the films, these easy piano arrangements bring the magic of the movies to life as they masterfully invoke the grand romanticism of John Williams's epic, award-winning scores. This collection includes several all-new arrangements by Dan Coates. The most definitive and memorable pieces from each of the six Star Wars episodes are included. Titles include: Twentieth Century Fox Trademark * Anakin's Theme * Across the Stars * Battle of the Heroes * Binary Sunset * Cantina Band * Duel of the Fates * The Force Theme * The Imperial March * Jawa Sandcrawler * Luke and Leia * May the Force Be with You * Princess Leia's Theme * Star Wars (Main Title) * The Throne Room * Yoda's Theme. CERTAIN CONTENT THAT APPEARS ON THIS SITE COMES FROM AMAZON SERVICES LLC. THIS CONTENT IS PROVIDED 'AS IS' AND IS SUBJECT TO CHANGE OR REMOVAL AT ANY TIME. Brought to you by American Poems Categories •Apparel •Appliances •Arts & Crafts •Automotive •Baby •Beauty •Books •Computers •DVD •Electronics •Gourmet Food •Grocery •Health •Home & Garden •Industrial & Science •Jewelry •Kindle eBooks •Kitchen •Magazines •Miscellaneous •Mobile Apps •MP3 Downloads •Music •Musical Instruments •Office Products •Outdoor Living •Pet Supplies •Photo & Camera •Shoes •Software •Sporting Goods •Tools & Hardware •Toys •VHS •Video On Demand •PC & Video Games •Watches •Wireless •Wireless Accessories Subcategories Humor & Entertainment •Humor •Movies •Performing Arts •Pop Culture •Puzzles & Games •Radio •Sheet Music & Scores •Television •Trivia & Fun Facts Related Categories •Piano Instruments Music Arts & Photography Subjects •Piano Songbooks Music Arts & Photography Subjects •Humor & Entertainment Subjects Books


text:
Sorry this ad is no longer available.
excellent resturant mangerdungannon
- Contract type
- Permanent
- Posted
- 918 days ago
hello we are looking a brilliant person to run our new resturaunt . the kitchen will be run by a top chef and looking the front of house to be run great to
person will be also able to help in the seledction of rest of front of house
we can cater for 100+ diners and there is going to be a bar also
so apply and we will get back to you thanks
Ad ID: 104581929


text:
Mark >How can you be certain that every underlying application protocol's >authentication scheme addresses all of the use cases for SOAP? The obvious solution is for developers to carefully select an application protocol that does exhibit the richness of services they require - not to un-necessarily duplicate said services. EamonReceived on Sunday, 8 July 2001 19:08:09 GMT
This archive was generated by hypermail 2.2.0+W3C-0.50 : Monday, 7 December 2009 10:59:02 GMT


text:
|Donate please!... I mean if you want to.
A Dragon's Flame: Chapter OneA Dragon's Flame: Chapter One by thefieldsofice
A Dragon's Flame
Part I
Chapter One: Five Years Later
Spike's lungs burned with exhaustion as he darted down the dark, vacant streets. He looked over his shoulder time and time again, hoping that those in his pursuit would finally give up.
As he passed a building, he thought it might serve as a refuge, but as he tried the door, only to find it locked, his hopes were dashed. Not willing to waste anytime knocking, Spike turned and began running once more.
Quickly, he found himself regretting this, for the hoof steps he had been running from, were beginning to echo louder and closer.
A now older Spike awoke with his heart racing and a cool chill running down his scales. He brought his hand to his head and tried to wipe away some of the sweat he had accumulated in his sleep. It didn't take him long to realize that his face wasn't the only thing damp, for his pillows were as well.
He looked over to see the first beams of sunlight were beginning to r
Name: Ryan
Gender: Male
Age: 17
Favorite genres of music: Classical, Country, Rock, Pop, and Alternative (Everything except for Rap).
Favorite style of art: Any that looks good or any entertaining story.
Personality: Twilight Sparkle
Political Views: Democratic Socialism (Democracy and Equality)
Current Residence: The Deep South... Kill me.
Religious Views: Atheist
Favorite character: Twilight Sparkle
Favorite Color: Red
Personal Quote: Equality and Democracy for all!
"Freedom in capitalist society always remains about the same as it was in the ancient Greek republics: Freedom for slave owners" - Vladimir I. Lenin


text:
Burkes Armada Hotel, Spanish Point
Rooms: 61
Spainish Point Miltown Malbay - Spanish Point - Ireland Hotel Website | 065-7084110
204 Traveller
Reviews - Burkes Armada Hotel
fantasticSubmitted by: Tanya in 30/09/09
- Age Group: 26 - 30
- From: Ireland
- Traveller type: Family Traveller
not a bad word 2 say bout this hotel...really enjoyed my stay...defo going back there
Lovely hotel spoiled by inadequate heatingSubmitted by: Helen in 13/11/08
- Age Group: 31 - 40
- From: United Kingdom
- Traveller type: Special Interest/Event
The hotel decor is excellent and it's clearly had some money spent on it. It also lends itself beautifully to weddings, which is why I was there. What a shame, then, that they chose to be so penny pinching with the heating. The room was freezing most of the time and the heating was controlled centrally such that it only came on late at night and first thing in the morning. One evening I had to call reception and plead with them to put the heating on; it was so cold that I couldn't bear to change my clothes! The Armada isn't a cheap hotel so I can't understand why they would follow such a bizarre heating policy, especially in November on the west coast of Ireland! That's enough to stop me from ever staying there again, which is a great shame because the staff and surroundings were both great.
Read 202 additional reviews of Burkes Armada Hotel at TripAdvisor.
Want to see more hotels? View all hotels in Spanish Point
Top Local Tips for Spanish Point
Great money savers Use the supervalue hotel tokens to get a great value break
Overrated Request sea view room - as the rest of rooms are a let down.
Lahinch Lahinch Seaworld is worth a trip - 15 mins drive from Armada Hotel. It can be quite expensive though.
- (hotels)
Other names for Burkes Armada Hotel
- armada hotel milltown malbay
- Address: Spainish Point Miltown Malbay - Spanish Point - Ireland
Travel Library Traveller Rating?
"fantastic" - Tanya
Candid Traveller Photos
- Loading Image...
- Loading Image...
- Loading Image...
- Loading Image...
- (hotels)
Hotels Near Burkes Armada Hotel
- Imperial Hotel Lisdoonvarna, Ireland Distance: 22.1 km / 13.8 mi
- Atlantic Hotel Lahinch, Ireland Distance: 10.8 km / 6.7 mi
- Shamrock Inn Hotel Lahinch, Ireland Distance: 10.9 km / 6.7 mi
- Vaughan Lodge Hotel Lahinch, Ireland Distance: 11.4 km / 7.1 mi
- Falls Hotel Ennistymon, Ireland Distance: 13.9 km / 8.6 mi
- Rathbaun Hotel Lisdoonvarna, Ireland Distance: 22.3 km / 13.8 mi
- Sheedys Country House Hotel Lisdoonvarna, Ireland Distance: 22.2 km / 13.8 mi
- Halpins Townhouse Hotel Kilkee, Ireland Distance: 23.7 km / 14.7 mi
- Logues Liscannor Hotel Liscannor, Ireland Distance: 24.4 km / 15.1 mi
- Woodstock Hotel & Golf Club Ennis, Ireland Distance: 30.1 km / 18.7 mi
- Auburn Lodge Hotel Ennis, Ireland Distance: 30.1 km / 18.7 mi
- Temple Gate Hotel Ennis, Ireland Distance: 30.3 km / 18.8 mi
- Gregans Castle Hotel Ballyvaughan, Ireland Distance: 35.5 km / 22.1 mi
- Hylands Burren Hotel Ballyvaughan, Ireland Distance: 36.5 km / 22.7 mi
- Dromoland Castle Hotel Newmarket On Fergus, Ireland Distance: 37.6 km / 23.3 mi


text:
Meditate Your Way to Inner Peace
Today, my practice continues to intensify. Whenever I meditate, my ~ing leads me on imaginative journeys into my subconscious. At times, I get extremely emotional. Other times I feel so rested that I fall into a deep sleep. As a result of my dedication to my meditation practice, I have discovered the key to serenity that will get me through anything in life. I now can reconnect to my own energy and the energy of the Universe the moment I shut my eyes. Above all, I've accessed the key to happiness and I am psyched to share it with you.
So if you want what I have, do what I do…
Begin your meditation practice today by breathing in, I am willing to change and breathing out, I surrender my fear. Recite this mantra throughout the day and expect miracles.
If you're a meditation newbie I've made it super easy for you! CLICK HERE and check out my new Spirit Junkie Meditation Album!


text:
Notification of appropriate authority in case of risk
This sectionnoteType=Explanatory Memorandum has no associated
22. (1) Where the appropriate nature conservation body have not given consent for an operation, but they consider that there is a risk that the operation may nevertheless be carried out, they must notify the appropriate authority.
(2) Such notification must be given at least one month before the end of the period mentioned in regulation 20(2)(c).