Simple Silverlight 2 app - APIDemo - Part 2, Building the FeaturePics API Demo

This post is a continuation of Simple-Silverlight-2-app-APIDemo-Part-1-Building-the-DiggSample. You might want to start with that, as this part modifies it as necessary to extract data using the  FeaturePics.com Developer's Search API. You can see a sample of the xml returned with Sample Query. So the task is to map the fields returned by the FeaturePics query into the display formerly used for the DiggSample.

First step was to copy all the files to a new directory and rename the project, including the namespace, to APIDemo. This could have been done without changing the namespace or copying the files, but I wanted to retain a working copy of the DiggSample while creating ApiDemo.

The Image Class

The DiggSample has the public class DiggStory where the data for each Digg Story is stored. I created a similar class:

namespace APIDemo
{
    public class FPImage
    {
        public int ImageId { get; set; }
        public string ImageName { get; set; }
        public string Caption { get; set; }
        public Uri ImagePage { get; set; }
        public string ImageFile { get; set; }
        public int Width { get; set; }
        public int Height { get; set; }
        public string Author { get; set; }
        public Uri AuthorPage { get; set; }
    }
}

The API Query

Now that I have a place to store individual image records, it was time to obtain the data to display. If you followed the DigSample tutorial, you know that the api query is in Page.xaml.cs and looks like this:
        string diggUrl = String.Format('http://services.digg.com/stories/topic/{0}?count=20&appkey=http%3A%2F%2Fscottgu.com', topic);

The FeaturePics API accepts one or more keywords, so I replace spaces, if any, with %20. The FeaturePics query version looks like this:

        string fpUrl = String.Format('http://adminservices.featurepics.com/GetImagesExt.asmx/SearchResultsExt?Keywords={0}&NumberPerPage=30', topic.Replace(' ', '%20'));

This query should return a set of 30 images related to the contents of 'topic'. I should probably note there are other similar query possibilities returning data sets with somewhat different characteristics, but this is a good example.

Testing the Query

I assigned the FPImage fields to the expected query fields, compiled, and entered the first search term, cat. Nothing. Nothing at all was processed by my code. In the course of debugging the problem I noted these declarations:

  <?xml version='1.0' encoding='utf-8' ?>
- <ImageSet xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns='http://AdminServices.FeaturePics.com/'>

This is a standard .NET Web Service xml output format, but it was the first time I have coded the consumption of such a web service, and I wasted some time learning the necessary syntax. All of the field tags contain the "http://AdminServices.FeaturePics.com/" string as well as the field name. One way to specify the tag name is:

ImageId = (int)image.Element("{http://AdminServices.FeaturePics.com/}ImageId"),

Or, you can define the namespace once:

    // define the namespace declaration
    XNamespace nsFP = "http://AdminServices.FeaturePics.com/";

and subsequently use that definition:

                ImageId = (int)image.Element(nsFP + "ImageId"),


This is how I ended up populating the FPImage class:

void DisplayImages(string xmlContent)
{
    XDocument xmlImages = XDocument.Parse(xmlContent);
    // define the namespace declaration
    XNamespace nsFP = "http://AdminServices.FeaturePics.com/";
    var images = from image in xmlImages.Descendants(nsFP + "ImageExt")
             where image.Element(nsFP + "ImageFile").Value != null
             select new FPImage
              {
                ImageId = (int)image.Element(nsFP + "ImageId"),
                ImageName = ((string)image.Element(nsFP + "ImageName")).Trim(),
                ImageFile = (string)image.Element(nsFP + "ImageFile"),
                ImagePage = new Uri((string)image.Element(nsFP + "ImagePage")),
                Caption = !String.IsNullOrEmpty((string)image.Element(nsFP + "Caption")) ? (string)image.Element(nsFP + "Caption") : "No caption found",
                Author = !String.IsNullOrEmpty((string)image.Element(nsFP + "Author")) ? (string)image.Element(nsFP + "Author") : "Artist attribution not found",
                AuthorPage = new Uri((string)image.Element(nsFP + "AuthorPage")),
                Width = (int)image.Element(nsFP + "Width"),
                Height = (int)image.Element(nsFP + "Height")
              };
    ImagesList.SelectedIndex = -1;
    ImagesList.ItemsSource = images;
}

Some of the early FeaturePics images do not have the Caption or Author fields filled in, so I provide a replacement string.

Displaying the results

The main result page is Page.xaml. Not many changes were made here, text labels were changed to refer to FeaturePics rather than to Digg, and field names were changed to map those found in FPImage.

The image details are displayed in StoryDetailsView.xaml, and it too is very similar to the version in DiggSample. I added a row for the Artist's Images link, and changed the dimensions both of the page itself, and of the column widths. These changes were made in StoryDetailsView.xaml. And of course the field names were changed to match those in FPImage. There were also some CSS type changes made in App.xaml.

Using the control

The DiggSample uses an extremely simple html page to display the control. I wanted something that would show off the possibilities a bit better, so I set about creating APIDemo.html.

The biggest change here was setting height and width constraints on the #silverlightControlHost CSS definition. The page width was also limited and text added above and to the right of the control.

After these changes the control would not display in FireFox. After some trial and error, I found that deleting the CSS body "overflow: auto; " improved the IE display and fixed the FireFox problem.

The point of these changes is, of course, to demonstrate that the APIDemo control could be a part of any web page. It is one possible way to use the FeaturePics search API. And best of all, I learned a bit about Silverlight in the process.

Project files

You can download a copy of my project: ApiDemo.zip.

28. August 2008 11:32 by Kal | Comments (0) | Permalink

Simple Silverlight 2 app - APIDemo - Part 1, Building the DiggSample

Scott Guthrie published an eight step Silverlight 2 Beta 1 tutorial. The page that links to all eight parts and explains how to get started is Get Started Building Silverlight 2 Applications.

I did not even really understand what Silverlight is, so decided to get my feet wet with this very basic tutorial. I followed the first two or three tutorials religiously, typing in the code and experiencing a bit of how it works. Then I read the remainder pretty carefully and downloaded the complete demo application at the end.

Scott's demo application performs a search of the Digg api and displays selected parts of the xml returned.

Digg.com has a pretty cool set of Digg APIs that they publish over HTTP.  Because they have a Flash cross-domain policy file in place on their server, we can call them directly from our Silverlight Digg client application (and not require us to tunnel back through our web-server to reach their APIs).

FeaturePics.com has recently published a Developers API, and I have not yet seen the code used in an application, so I hit on the idea of modifying Scott's demo app to provide a FeaturePics API demo. So that was what I set out to do.

Version Issues

When I tried to compile the downloaded Digg demo app there were a few changes necessary due to the Silverlight on my computer is Beta 2 and the code is for Beta 1. Probably the most difficult of these to resolve was the WatermarkedTextBox control could not be found. Google found Kathy Kam, Reflection on the CLF and .NET.

One breaking change you may have noticed between Silverlight 2 Beta 1 and Beta 2 is that WatermarkedTextBox is no longer available in the Silverlight SDK (System.Windows.Controls.Extended.dll). 

We decided to remove the control because in a future version of Silverlight, we will be adding a “Watermark” property to TextBox. Given this upcoming change, it does not make sense to have "WatermarkedTextBox" as a separate control, so we decided to remove the control from Silverlight 2.

Because the update to TextBox will not happen until a future version of Silverlight feel free download and use the WatermarkedTextBox source code and unit test in the mean time. By downloading the source and unit tests you accept the license.

Here is an example on how to use it:

image

So I downloaded the referenced project, built it, and referenced it in DiggSample, which produced an immediate error because I had previously referenced the System.Windows.Controls.Extended that is included in Beta 2. Possibly I could have just removed that previous reference, but instead I renamed the download project to Extended2. Then I added the following line to the controls definition, and the app compiled.

xmlns:wtb='clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Extended2'

I happen to have available a couple of vacant domains and I used one of them DiggSample, Beta 2 Version. The search is for Digg Topics only, so try something like football or soccer. 

16. August 2008 12:53 by Kal | Comments (0) | Permalink

How big of a house do you really need?

Ron from OilCrisis.com sent a link from the July 18 Wall Street Journal titled "The Newest Cottage Industry, Buyers Snap Up Small Homes; 1,000 Square Feet ...

The article talks about a family of six doing fine in one of these little jewels. Now it happens that my family and I live in a 1,000 sq. ft. double-wide mobile home with another 200 ft of deck space and a small outdoor shed. There is also a covered carport. We have one small and two tiny bedrooms and two baths.

In general it is comfortable and we do fine. It is well insulated and heating bills in winter are low. But I would like it to be larger. Not so much larger, mind you, but a bit larger would be nice. I have owned a 1,700 sq. ft. house with large double garage before, and I do not need that much space, and I neither need nor want one of the bankrupting McMansions. Maybe 1,300 ft. would do very nicely.

Our 11 year old daughter has her own room. It has a singe bed on one wall and a dresser on the other. In between is is about 5 feet, and a computer on a stand with barely enough space for a monitor and keyboard just about fills that space. The fourth wall is a closet. There is no work space, or space for an aquarium, or much of anything else. It is very basic, but adequate in a minimalist kind of way.

I do think small is fine in general. But it is not simple to fit in enough walls for bookshelves and art and windows. Storage is a biggie. I spent most of the day reorganizing 'the bodega', which is jammed to the gills. There are tools and various kinds of supplies and a plastic Christmas tree and the list goes on. I suppose a lot of people would not need all of that. With 100+ ft devoted to well thought out storage, bins, shelves, possibly moving shelves as in a library, to maximize space use, the 1000 ft house could be made to work pretty well. It would definitely help if there were a central gym with table tennis and pool tables and other sharable facilities.

Some skylights would be a nice touch. And a nice garden would be highly desirable, even though growing any significant amount of food takes significant time and attention.

3. August 2008 23:08 by Kal | Comments (0) | Permalink

RSS In Plain English - a video

If you need an explanation of RSS, or even just want to see a simple but effective video: RSS in Plain English

1. August 2008 19:15 by Kal | Comments (0) | Permalink

FeaturePics Developers API

I just saw a press release for a way to put quality images on your website or blog.

FeaturePics Web services provides programmatic access to the FeaturePics Image Collection.
You can enhance your web site by retrieving images from FeaturePics Image Collection by subject and showing them in layouts suitable for your site design.
FeaturePics supports the XML/HTTP Protocol. As a variant, the Response can be formed in JSON format.
Code examples (C# and Javascript) are at http://www.featurepics.com/API/API.aspx

1. August 2008 18:53 by Kal | Comments (0) | Permalink

FeaturePics rss feed

There is a new rss feed at FeaturePics. It will provide the 150 most recent photos, and typically there are more than that each day. If your RSS Reader supports finding feeds (most do) you can just click on this link: rss.featurepics.com. Or if you need the feed url: FeaturePics Daily Images will take you directly there.

1. August 2008 18:49 by Kal | Comments (0) | Permalink

Blogengine 1.4.5 released and installed here

I downloaded the update and installed it. Seems to be working fine, more or less. My calendar widget has gone away, as has the blog role. Maybe I should have waited for the directions.

There is an update to the SQL Membership provider database that I did not immediately spot. But it worked fine once I saw it.

1. August 2008 18:41 by Kal | Comments (0) | Permalink

Visual Studio Spell Checker

Elena at FeaturePics asked me to proof read a couple of .aspx pages that are heavy with JavaScript. I spotted a couple of spelling errors early on and decided to see if there is a spell checker.

I found a spell checker for Visual Studio that uses the MS Office Dictionary. At first it showed every 'FeaturePics' as a spelling error, along with 'img' and 'var' and a few more that are key words.  I typed these words into a word document and did the “Add to dictionary” routine. Then I closed VS and reopened it and those words no longer came up as errors. The spell checker can be found here.  At first it did not appear to work, but the 'Check Accessibility' in the next paragraph got both spelling and other errors to come rolling in.

In VS there is an item on the tools menu named 'Check Accessibility'. It compares your doc with what it claims to be. In Elena's case, http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd, and flags all the items that do not conform to the standard.

Really a lot of them are things like enclosing font attributes in quotes. It might be possible to do most of those with a couple of search and replace calls. I put in a bunch of /> tags that way, but did not try to do the more elaborate changes.

20. July 2008 21:06 by Kal | Comments (0) | Permalink

Feature Pics

One of the sites I am involved with is FeaturePics.com, a full service image provider. There was a nice review at The Artisan’s Shout, a blog by, for, and about Artists. Check out both of these links, and while you are there, take advantage of the free blog image license at FeaturePics.

15. July 2008 10:02 by Kal | Comments (0) | Permalink

Is it a virus? "Subject: UPS Paket N361082283"

Today I got an email with the subject shown and the following text:

Unfortunately we were not able to deliver postal package you sent on July the 1st in time because the recipient’s address is not correct.

Please print out the invoice copy attached and collect the package at our office

Your UPS

It has a zipped attachment, which contains a folder named UPS_Invoice_317, which in turn contains UPS_INVOICE.exe.

I went to http://onecare.live.com/site/en-us/center/whatsnew.htm to see if they would identify it as a virus, or not, and signed up for their free scan. Files are downloading as I write this.

The Quick Scan did not find anything. I am guessing it did not look in "Temporary Internet files\Content.Outlook\...". So now I am running a full drive scan.

The full scan terminated with an error, so I ran it again. This time it found the Trojan:Win32/Agent.EE., but it could not be cleaned, probably because Istill have the email open.

I deleted the message from both email and from the computer.

It is clear I need a better scanner on the email server.

14. July 2008 19:51 by Kal | Comments (0) | Permalink

Calendar

<<  May 2017  >>
MoTuWeThFrSaSu
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

View posts in large calendar

Month List