Thursday, January 31, 2008

dnrtv It is time for another personal project for me and this time I thought I would put together a dnrTV feed aggregator. Rather than watch each episode on my home computer, I prefer to watch them on the big screen TV in the living room. They are very viewable and I can sit in my lazy boy with the remote, a beer and maybe the laptop. ( mostly the remote and a beer )

In order to make this happen, I download each show to my Home Server and watch it via my Xbox 360 in the living room. The Xbox 360 acts as a media extender for any movie, music or picture I have stored on my network.

Basically, this software should run as a windows service on my Home Server and check the feed about once a week, download the show, unzip it,  and place the in the proper shared video directory. In order to change settings and monitor the health of the application, I want to create a winform application that will reside on my personal computer's system tray and communicate via some means to the service. Right now, I am leaning towards named pipes.  Our first Step is to create a Windows Service Project.

 

sshot-5

Next we will rename our service to 'dnrTVService' and then we will need to add an Installer Project to our solution. Let's name it 'dnrTVInstaller' and add the following code:

 

   1:  using System.ComponentModel;
   2:  using System.Configuration.Install;
   3:  using System.ServiceProcess;
   4:   
   5:  namespace dnrTVAggregator
   6:  {
   7:      [RunInstaller(true)]
   8:      public partial class dnrTVInstaller : Installer
   9:      {
  10:          public dnrTVInstaller()
  11:          {
  12:              InitializeComponent();
  13:   
  14:              ServiceProcessInstaller ProcessInstaller = new ServiceProcessInstaller();
  15:              ServiceInstaller Installer = new ServiceInstaller();
  16:   
  17:              ProcessInstaller.Account = ServiceAccount.LocalSystem;
  18:              ProcessInstaller.Username = null;
  19:              ProcessInstaller.Password = null;
  20:   
  21:              Installer.ServiceName = "dnrTV_Service";
  22:              Installer.Description = "Service to download new episodes of dnrTv to my Home Server";
  23:              Installer.StartType = ServiceStartMode.Manual;
  24:              Installer.DisplayName = "dnrTv Aggregator Service";
  25:   
  26:              this.Installers.Add(ProcessInstaller);
  27:              this.Installers.Add(Installer);
  28:          }
  29:      }
  30:  }

 

Here we setup the name of our service, it's description and display name. We also decide whether or not it will start manually or automatically. Without this installer project, you will not be able to use INSTALLUTL.EXE to install your service.  Next, let's go back to our service and make it do something. For the time being, let's just have it report the current date and time via a named pipe. We will use a System.Timer and throw an event every 10 seconds. 

 

   1:  using System;
   2:  using System.Diagnostics;
   3:  using System.IO;
   4:  using System.IO.Pipes;
   5:  using System.ServiceProcess;
   6:  using System.Timers;
   7:   
   8:  namespace dnrTVAggregator
   9:  {
  10:      public partial class dnrTVService : ServiceBase
  11:      {
  12:          Timer MyTimer = new Timer(10000);
  13:          public dnrTVService()
  14:          {
  15:              InitializeComponent();
  16:              MyTimer.AutoReset = true;
  17:              MyTimer.Elapsed += new ElapsedEventHandler(MyTimer_Elapsed);
  18:          }
  19:   
  20:          void MyTimer_Elapsed(object sender, ElapsedEventArgs e)
  21:          {
  22:              NamedPipeClientStream  np = new NamedPipeClientStream(".", "test_pipe", PipeDirection.InOut);
  23:              np.Connect();
  24:              
  25:              using (StreamWriter w = new StreamWriter(np))
  26:              {
  27:                  w.AutoFlush = true;
  28:                  w.WriteLine(String.Format("TIME IS {0}", DateTime.Now));
  29:              }
  30:              np.Close();
  31:          }
  32:   
  33:          protected override void OnStart(string[] args)
  34:          {
  35:              MyTimer.Start();
  36:          }
  37:   
  38:          protected override void OnStop()
  39:          {
  40:              MyTimer.Stop();
  41:          }
  42:      }
  43:  }

 

The OnStart and OnStop Event will start and end the timer and the MyTimer_Elaspsed will execute the needed code. As I said early, I'm just using some test code to demonstrate it's use. We will add our aggregation code in another post, but for now, let's keep it simple. Once you have compiled your service, you can install it using INSTALLUTIL /I dnrTVService.exe.

sshot-6

Our next step is to create the client winform application. We will drop three buttons on it, a start button, a stop button and a connect button. Also, we'll be needing a list box to report the time back too. Two additional controls we will be using will be the ServiceController to start and stop our service and a BackgroundWorker process.

 

sshot-7

The following code in our winform application will start up a background worker thread and wait for the service to contact us. Yes, I know it is sort of backwards, but it will have to do for now. I'll see about reversing the client/server role in my next post.

 

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.ComponentModel;
   4:  using System.Data;
   5:  using System.Drawing;
   6:  using System.Linq;
   7:  using System.Text;
   8:  using System.Windows.Forms;
   9:  using System.IO.Pipes;
  10:  using System.IO;
  11:   
  12:  namespace dnrTVClient
  13:  {
  14:      public partial class MainForm : Form
  15:      {
  16:          public MainForm()
  17:          {
  18:              InitializeComponent();
  19:          }
  20:   
  21:          private void StartButton_Click(object sender, EventArgs e)
  22:          {
  23:              dnrTVController.Start();
  24:          }
  25:   
  26:          private void StopButton_Click(object sender, EventArgs e)
  27:          {
  28:              dnrTVController.Stop();
  29:          }
  30:   
  31:          private void dnrTVProcessWorker_DoWork(object sender, DoWorkEventArgs e)
  32:          {
  33:              while (true)
  34:              {
  35:                  NamedPipeServerStream np = new NamedPipeServerStream("test_pipe", PipeDirection.InOut);
  36:   
  37:                  np.WaitForConnection();
  38:                  StreamReader r = new StreamReader(np);
  39:                  dnrTVProcessWorker.ReportProgress(0, r.ReadLine());
  40:   
  41:                  np.Close();
  42:              }
  43:          }
  44:   
  45:          private void ConnectButton_Click(object sender, EventArgs e)
  46:          {
  47:              dnrTVProcessWorker.RunWorkerAsync();
  48:          }
  49:   
  50:          private void dnrTVProcessWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
  51:          {
  52:              LogListBox.Items.Add(e.UserState.ToString());
  53:          }
  54:      }
  55:  }
 
Assuming we already compiled and installed our service, it is time to compile and run out client application. The output for the should look something like this.
 
sshot-8
 
Things look like they are going pretty good. For my next post in this series, I will add the aggregation code to pull the feed, download the show, unzip it and update a configuration XML file.
 
 
kick it on DotNetKicks.com
posted on Thursday, January 31, 2008 5:13:23 PM (Eastern Standard Time, UTC-05:00)  #    Comments [2]


 Wednesday, January 30, 2008

Looks like the "Day 1" or the first comic from the Heroes Happen Here series has been released. This comic was released by Microsoft and Seagate so make sure and signup for the RSS Feed to receive the comic everyday of the working week.

 

DailyComic_Full

posted on Wednesday, January 30, 2008 3:28:47 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]


 Thursday, January 24, 2008

imageSo you just got done prototyping that new Winform or WPF application and the interface is a bit lacking. You are a programmer, not an artist after all. Well, never fear, free icons are here (wow that really rhymed). All kidding aside, most of us are not good at drawing images and icons, so we need some resources for these items.

Our journey starts with Visual Studio 2005. If you recall, it  had  a zip file called VS2005ImageLibrary located at Program Files\Microsoft Visual Studio 8\Common7\VS2005ImageLibrary\. This file contained a nice collection of icons, animations, buttons and a variety or other objects that you could use within your application. Here are the instructions on how and where to extract the images.

After installing Visual Studio 2008, I checked to see if this library was still available and was happily surprised to find it still located at Program Files\Microsoft Visual Studio 9.0\Common7\VS2008ImageLibrary\1033\VS2008ImageLibrary\.   Here you will find images taken from Microsoft programs such as Office and Vista, along with some cool animations for your progress displays.

 

HTML_Webpage Dialogs_XP X's 

 

Our next stop is online, where there are plenty of resources to find images. I ran across an excellent one the other day on Damen Guard's Blog. This collection, Silk Companion #1, looked to be over a 450+ top quality 16x16 icons in PNG format. These were mostly derived from a larger collection at FAMFAMFAM. Here you find over the original 1000+ icons that can be used under the Creative Commons Attribution 2.5 License.

 

image

I also stopped by Icon Factory, but their freeware icons and images were not licensed for redistribution and can only be use as desktop icons. Not much good for a us programmers.

My next step will be to start compiling a list of the best of the best graphical resources, targeted for us, the programmers. If anyone has any suggestions, please feel free drop me a note.

 

kick it on DotNetKicks.com

posted on Thursday, January 24, 2008 1:49:33 AM (Eastern Standard Time, UTC-05:00)  #    Comments [3]


 Saturday, January 19, 2008

It is launch time again for Microsoft, and this time it is for Windows Server 2008, Visual Studio 2008 and SQL Server 2008. The one here in Tampa is not until May 8, but as soon as I can register for it I will.  You can get more information and register on their launch web site, Heroes happen {here}. They also have a RSS feed for a new comic series about IT professionals and Developers. Oh, did I mention that all attendees will being get free copies of all three products. Pretty Sweet !! Make sure and sign up for one in your area.

hero_event

 

kick it on DotNetKicks.com

posted on Saturday, January 19, 2008 2:18:51 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]


 Friday, January 18, 2008

I wrote some code last year to create an Microsoft Access Database, fill in some data and email it out. It never made it out to production so I thought I would share part of it here. Let's focus on creating the database in this post.

The first thing you need to do is get a COM reference to the Microsoft ADO Ext. X.X for DDL and Security. The X.X represents whatever version you happen to have on your machine. Mine used to be version 2.7, but with Visual Studio 2008, it was updated to 6.0.

AddReference

Once you have added the reference, ADOX will be added to the using section of your code.

 Using

Next you will want to create the catalog for the database. Insert the filename you wish into the following string and pass it to the CatalogClass.

   1:              CatalogClass cat = new CatalogClass();
   2:   
   3:              string tmpStr;
   4:              string filename = "Sample.MDB";
   5:              
   6:              tmpStr = "Provider=Microsoft.Jet.OLEDB.4.0;";
   7:              tmpStr += "Data Source=" + filename + ";Jet OLEDB:Engine Type=5";
   8:   
   9:              cat.Create(tmpStr);

The next step is to create the table and columns for your database. This is a pretty straight forward operation as shown in the example below.

   1:              Table nTable = new Table();
   2:              nTable.Name = "PersonData";
   3:                 
   4:              nTable.Columns.Append("LastName", DataTypeEnum.adVarWChar, 25);
   5:              nTable.Columns.Append("FirstName", DataTypeEnum.adVarWChar, 25);
   6:              nTable.Columns.Append("Address 1", DataTypeEnum.adVarWChar, 45);
   7:              nTable.Columns.Append("Address 2", DataTypeEnum.adVarWChar, 45);
   8:              nTable.Columns.Append("City", DataTypeEnum.adVarWChar, 25);
   9:              nTable.Columns.Append("State", DataTypeEnum.adVarWChar, 2);
  10:              nTable.Columns.Append("Zip", DataTypeEnum.adVarWChar, 9);
  11:    
  12:              cat.Tables.Append(nTable);
 

The final step is very important or you will get error when you close your application. Once the all the tables and columns have been added, you will need to release the com objects properly and in the proper order.

   1:              System.Runtime.InteropServices.Marshal.FinalReleaseComObject(nTable);
   2:              System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat.Tables); 
   3:              System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat.ActiveConnection); 
   4:              System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat);
 
That is it. You should now have a Access Database that you can write to. Hope this helps.
 
kick it on DotNetKicks.com
posted on Friday, January 18, 2008 3:11:18 AM (Eastern Standard Time, UTC-05:00)  #    Comments [2]


 Thursday, January 17, 2008

A coworker showed me this neat new feature of Visual Studio 2008. If you right click within the code editor and roll your mouse over Organize Usings, three options will come up; Remove Unused Usings, Sort Usings and Remove and Sort. The names are pretty self explanatory so I won't bore you and explanation of each; just wanted to pass on the good word.

sshot-2

 

kick it on DotNetKicks.com

posted on Thursday, January 17, 2008 6:33:19 PM (Eastern Standard Time, UTC-05:00)  #    Comments [3]


 Wednesday, January 16, 2008

Have you ever wanted to be able to extend a sealed class like string? With Visual Studio 2008 and C# 3.0, you now can with Extension Methods. You create these new methods to add additional custom abilities to an existing type, even if you don't have access to it. These new methods need to be static methods contained in static classes, and the first parameter should be the keyword this and the hosting type. This is demonstrated in the example below on line 8. This example takes input from the console and validates it against a regex string.

   1:  using System;
   2:  using System.Text.RegularExpressions;
   3:   
   4:  namespace ExtensionMethods
   5:  {
   6:      public static class MyClass
   7:      {
   8:          public static bool ValidPhoneNumber(this string s)
   9:          {
  10:              string valid_phone = "^[\\(]{0,1}([0-9]){3}[\\)]{0,1}[ ]?([^0-1]){1}([0-9])" +
  11:                                   "{2}[ ]?[-]?[ ]?([0-9]){4}[ ]*((x){0,1}([0-9]){1,5}){0,1}$";
  12:   
  13:              Regex regex = new Regex(@valid_phone);
  14:              return regex.IsMatch(s);
  15:          }
  16:      }
  17:      
  18:      class Program
  19:      {
  20:          static void Main(string[] args)
  21:          {
  22:              Console.Write("Please Enter Phone Number: ");
  23:              string newPhone = Console.ReadLine();
  24:   
  25:              if (newPhone.ValidPhoneNumber()) 
  26:                  Console.WriteLine("Good Phone Number");
  27:              else    
  28:                  Console.WriteLine("Bad Phone Number");
  29:   
  30:              Console.ReadLine();
  31:          }
  32:      }
  33:  }

Once the class has been created, it can be used as an extension of the string class as simply as if it was originally part of the it.

Other examples can be found at the blogs for David Hayden, or Scott Guthrie.

kick it on DotNetKicks.com

posted on Wednesday, January 16, 2008 5:34:10 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]


 Tuesday, January 15, 2008

This is an announcement that I am moving my feeds over to feed burner this week.  The new feed is http://feeds.feedburner.com/JohnRussellPlant. This way I will be able to start tracking my readers, or lack of, better.

posted on Tuesday, January 15, 2008 3:29:52 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]


Last week a co-worker let me know about these free E-books from Microsoft Press. It looks as if the LINQ book is in fact the full book while the other two on ASP.NET and SilverLight 1.0 are excerpts. More information can be found at the Microsoft Learning Portal.

 

MicrosoftLINQAJAXSilverlight

 

The free e-book includes content from three recent publications from Microsoft Press:

Introducing Microsoft LINQ by Paolo Pialorsi and Marco Russo (ISBN: 9780735623910)
This practical guide covers Language Integrated Query (LINQ) syntax fundamentals, LINQ to ADO.NET, and LINQ to XML. The e-book includes the entire contents of this printed book!

Introducing Microsoft ASP.NET AJAX by Dino Esposito (ISBN: 9780735624139)
Learn about the February 2007 release of ASP.NET AJAX Extensions 1.0, including an overview and the control toolkit.

Introducing Microsoft Silverlight 1.0 by Laurence Moroney (ISBN: 9780735625396)
Learn how to use Silverlight to simplify the way you implement compelling user experiences for the Web. Discover how to support an object-oriented program model with JavaScript.

kick it on DotNetKicks.com
posted on Tuesday, January 15, 2008 8:42:57 AM (Eastern Standard Time, UTC-05:00)  #    Comments [2]


 Sunday, January 13, 2008

Let's face it, a multiple monitor setup is the only way to go for a software developer, or any other computer professional these days. If you are still using only a single monitor, you are not working at your full potential. Here is a quote taken from lifehacker.com.

Survey after survey shows that whether you measure your productivity in facts researched, alien spaceships vaporized, or articles written, adding an extra monitor will give your output a considerable boost -- 20 percent to 30 percent, according to a survey by Jon Peddie Research.

Personally, I feel my productivity increases even more than that, and at minimal my development experience increases ten fold. I do not enjoy switching from layer upon layer of windows searching for the data I need in the proceeding window. Even Microsoft Research states this on their web sites:

You arrive at your office in the morning, sit down, look at your to do list and wonder how you're going to get it all done. If only you had a tool, a genie in a bottle, anything that would help you get more done in less time. And caffeine is out; you gave that up last week.

Microsoft researchers haven't perfected the genie, but they've found a tool that can increase your productivity by 9 to 50 percent and make your work day easier. And you can begin using it right away.

The researchers conducted user studies that proved the effectiveness of adding a second or even third monitor to your workstation, creating a wide-screen effect.

My setup at home consists of two Acer AL2216Wbd 22" Widescreen LCD monitors powered by a single Dualhead GeForce 8600GTS video card. I purchased the three of these for less than 6 hundred dollars from newegg. The cables that came with the two monitors were not long enough reach my computer, so I ordered a couple DVI cables from monoprice.com for less than $15.00 a piece. Previous, I had a much more expense 20.1" gateway monitor, but it recently bit the bucket so it was replaced with my current setup cheaper and I am loving it.  Here is a screen shot of my home workstation as it sits today. Notice that the background stretches across both monitors.

DSC01873

Windows does not do this by default, and you will need a third party program to get this effect. I use a free program called DisplayFusion from Binary Fortress Software.  It will let you adjust the images in case your two monitors run at different resolutions. This is handy if you use an LCD as a second monitor for you laptop.

sshot-1

If you need some good backgrounds, gamewallpapers is a good place to start. They have a wide assortment of some very cool backgrounds for your desktop. Another site with some nice backgrounds is dual-display and a third can be found here.

World of Warcraft

wallpaper_world_of_warcraft_05_preview

Half Life 2

wallpaper_half-life_2_01_preview

 

kick it on DotNetKicks.com
posted on Sunday, January 13, 2008 10:36:54 AM (Eastern Standard Time, UTC-05:00)  #    Comments [5]


DSC01866Last week I got my HP Media Smart Home Server EX470 setup for my home network. I must say, I really love this box. It is quite and takes very little power to operate and extends my ability to get at the data I want, when I want. Scott Hanselman mentioned on his blog that he measured the power consumption to cost around $3.00 per month @ $0.0079 per kWh. That is much cheaper than say, my Xbox 360 or home computers.

Home Server uses Windows Server 2003 SP2 as it's underlying operating system, but has many features especially designed for the home user.

These include:

  • Automatically backup of any PC on the network
  • Remote access to your files and applications including remote desktop
  • Stream your photos, music and videos to any PC or Xbox 360 on your network
  • Built in iTunes server to stream music to family members' PC
  • Duplication of designated folders across multiple hard drives
  • Centralize all shared files for your home network

There are currently two models made by HP, the EX470 and the EX475. Both comes with a standard 512mb of memory, but with a little computer know how and some help from Home Server Hacks, you can easily upgrade either machines to 2gb of RAM. The EX470 comes with a single 500gb hard drive in one of it's four drives bays, while the EX475 has two drives to bring it's standard configuration to a full 1 terabyte. All other specs between the two machines are identical. 

With the exception of setting up my the source control software Subversion on it, I am pretty much running the server as stock at the moment until I get a chance to more fully explore it's capacities. I will post more once I have delved deeper. 

kick it on DotNetKicks.com
posted on Sunday, January 13, 2008 5:30:48 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0]


 Tuesday, January 01, 2008

Rusty - Copy

John Russell Plant

My name is John, but most of my friends refer to me as Rusty. I'm a software developer, living in Clearwater, FL since January of 2005 and currently work for a web based benefit provider company called Motivano located in Tampa, FL. There I develop code in C#, VB.NET, ASP.NET and T-SQL. I've been writing code professionally for over twenty years using a variety of different languages and in varying Industries. I have been a part of the online community since the days of FidoNet running The 19th Hole BBS.  

My Interest include coding, motorcycles, sailing and gaming on Xbox Live.  Well, that is enough about me, get back to the blog.

posted on Tuesday, January 01, 2008 6:33:03 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]