# Wednesday, January 14, 2004

New Years Resolution

 

I never really  make them. But I do like to do things each New Years. One is reformat all my computers and reinstall everything. A nice clean start. I also like to clean the hard to reach places in my apartment, like take the refrigerator out and clean in the dark abyss back there. Also change the batteries in the smoke detector, you get the idea.

 

One thing I do along with the reformat of the hard drives is clean up Outlook. I archive ootles of mail and go through my contacts and try to keep them in order. I always have a few friends who have like 3 or 4 entries in my contacts because they have a work mail, pop, and hotmail/yahoo. I had well over 500 contacts in my contact folder in Outlook. I have no idea how up to date it is, I know in 2003, I moved twice and had 4 different mailing addresses. I am also one of those annoying people who have a work email, personal pop email and a hotmail account (which is basically a porn only account). So I must be causing others problems, how many of my contacts are the same.

 

So I ran a cool tool that I have been playing with for a while called Plaxo. It is basically a free tool that allows you to mass email your whole contact list and have people verify their data over the web. It works cool and they don’t spam you, I have been a member of Plaxo for months. Your contacts don’t have to even join, just verify on a web form their info is correct. Of course as my pal Conor says “You give me control over my own Contact record, watch out, evil things may happen!!!”.

 

After I ran it, many people had changed information, or gave me more info than I had before. Also lots of old friends saw me in their inbox and emailed to say hi. I also got 36 bounces that I have to track down the owners through other means. All in all, a great experience.

 

How does Plaxo make money? Beats the hell out of me. I do hope that they stay around tho, I want to run this again next year.

 

So check out Plaxo if you have the time.

posted on Wednesday, January 14, 2004 8:44:07 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] Trackback
# Tuesday, January 13, 2004

My 90 Seconds of Fame

 

Yesterday was my professional acting debut. Well sort of. I was on camera and said lines and was paid and it will all be on TV. They had the bright camera lights and said “Action” and “Cut” a lot and took many takes. So I am going with that.

 

Basically my buddy Adam needed a male in his early 30s with brown hair, who had a flexible schedule on Monday afternoon for a re-enactment of a real life situation for The Maury Povich Show (Adam works there). So Maury’s standards for actors apparently is low and I got the part. I played a professional photographer who was accused of being a peeping tom. The whole shoot took about 2.5 hours and the re-enactment when it airs on Maury will be about a minute and half. I got paid and also got a free dinner out of it all, not too shabby. Plus I got to mock Adam to the amusement of his co-workers.

 

Lord knows this blog will have the date and time of the airing of the program.

posted on Tuesday, January 13, 2004 6:40:07 PM (Eastern Standard Time, UTC-05:00)  #    Comments [2] Trackback
# Monday, January 12, 2004

With the power of the Pentium IV Processor, Scott Hanselman could be Jesus

 

That is something that Scott Hanselman and I came up with at TechEd Malaysia-we tend to have a lot of fun together. . Well I have always had issues with partying too hard with Scott, but anyway, he will be in town to speak at the NYC .NET Developers Group this Thursday night. Here is his topic:

 

Zen and the Art of Web Services (or How I Stopped Worrying and Learned to Love WSDL)

 

Will Web Services save the world? More importantly, will they save you time? Are Web Services just a bunch of hooey? We’ll separate the good from the bad and dig into the WHY of Web Services and the HOW of the .NET Framework. We’ll go low level and sniff packets on the wire and we’ll go high level and design business documents with XML schema. We'll auto-generate Business Domain Objects and Messages. We’ll discuss the meaning of the WS*.* specifications, interoperability and get our heads around the "Zen" of Web Services and see where .NET succeeds and where it falls down. This talk will be as technical as you want it to be, but it will also be valuable for the Business Person or Project Manager who really wants to answer the question "Web Services: So What?" Doesn’t sound like the typical Users Group meeting, does it? You’ll just have to come by and find out!

posted on Monday, January 12, 2004 5:44:53 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] Trackback
# Sunday, January 11, 2004

How the das Blog Cache Engine Works (And a Caching tip in General)

 

Clemens and I may disagree on SQL Server v XML storage, but the das Blog Cache engine is real simple and we agree on it. What we do is cache the main page for 1 day (86400 seconds). We also varybyparam for the date and none. This way the page will stay in cache for either 1 day or until it is edited again (via a comment or an addition blog entry.)

 

I was putting together some samples for the MDC in Cairo next week and made a real simple page that caches a page based on the query string (varybyparam) and a file dependency (an XML file).  Here is an example in a simple page using an ASP .NET datagrid against Northwind:

 

<%@ Page language="c#" Codebehind="Cache_VaryByParam_Filedep.aspx.cs" AutoEventWireup="false" Inherits="DataGridCSharp.CachingDataGridFile" %>

<%@ OutputCache duration="86400" varybyparam="CustomerID" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<HTML>

<HEAD>

<title>CachingDataGrid</title>

<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">

<meta name="CODE_LANGUAGE" Content="C#">

<meta name="vs_defaultClientScript" content="JavaScript">

<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">

</HEAD>

<body MS_POSITIONING="GridLayout">

<form id="Form1" method="post" runat="server">

<asp:DataGrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 16px; POSITION: absolute; TOP: 72px" runat="server"></asp:DataGrid>

<asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 24px; POSITION: absolute; TOP: 40px" runat="server"

                   Width="440px">Label</asp:Label>

</form>

</body>

</HTML>

 

 

Then all we do is add a file dependency, in the case of das Blog it is the actual XML file that stores the data. This way the page will stay in cache for either 1 day or until it is edited again (via a comment or an addition blog entry.) Here is the code behind for the simple Northwind example from above.

 

          private void Page_Load(object sender, System.EventArgs e)

          {

              //we are setting the OutputCache to 1 day and the varybyparam for the querystring

              //<%@ OutputCache duration="86400" varybyparam="CustomerID" %>       

              //override the cache if this file changes

              Response.AddFileDependency(Server.MapPath("Contacts.xml"));

             

              Label1.Text="Page Generated At: " + System.DateTime.Now.ToString();

              // simple databinding for testing

              SqlConnection conn =new SqlConnection("server=(local);uid=sa;pwd=;database=Northwind");

              //open the connection

              conn.Open();

              //can set a command to a SQL text and connection

SqlCommand cmd = new SqlCommand("Select * From Orders Where CustomerID='" + Request.QueryString["CustomerID"] +"'", conn);

              SqlDataReader dr;

    

              //open a datareader

              dr = cmd.ExecuteReader(CommandBehavior.Default);

 

              //do the databinding

              DataGrid1.DataSource = dr;

              DataGrid1.DataBind();

          }

posted on Sunday, January 11, 2004 11:36:27 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] Trackback
# Saturday, January 10, 2004

Ghetto Superstar

 

Last night was rock climbing and triathlon buddy Adam’s 30th birthday. For some reason he decided to travel to Hoboken to a dive bar to celebrate his birthday. (He lives around the block from me on 87th Street). Well we traveled to the Garden State apparently to take advantage of the fact that you can smoke in bars in Hoboken and you can’t in New York City. Personally after several drinks, a cigarette myself and dancing with Tom and Linda to some Wyclef Jean and Mya, I think that the smoking ban in New York City is a good thing.

 

I met Adam’s college, the casting director for The Maury Povich Show and they are going to have me do an acting stint on the show. I play a pervert who is a peeping tom talking photos of 17 year olds changing. This outta be good. We tape on Monday, so stay tuned-literally.

posted on Saturday, January 10, 2004 10:33:34 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] Trackback
# Tuesday, January 6, 2004

Hit me Baby One More Time

 

Come on I can’t resist but comment on this one. Britney and Jason got an annulment today. So the marriage lasted 55 hours, let me just say that the world would be a much better place with Britney married off. Now every dumb guy out there thinks that they have a shot with her. Come on, why would you want to. She is the symbol of everything wrong with the world today. I won’t deny that Britney is an attractive young lady, but she is a poor role model and her skimpy dress makes us grown men thing bad and evil thoughts. :)

 

You win Britney, you got your publicity stunt and forced the world to notice you even in the twilight of your career.

posted on Tuesday, January 6, 2004 2:13:53 PM (Eastern Standard Time, UTC-05:00)  #    Comments [3] Trackback
# Monday, January 5, 2004

For Linda

 

Your Blog is Boring Lately Dude. So that is what Jack told me on Friday night and Linda also told me on New Years Eve. Sorry, I had a lot of techie Yukon stuff to post recently so I can get some feedback for the book chapter that I am writing this month.

 

So you want some non-techie stuff? How about this rant. Starting this week, to help fight terrorism, the United States is requiring visitors from most countries to be fingerprinted and photographed as part of their Visa requirements. This has a lot of people up in arms. Critics say this will cause unnecessary travel delays and may never prove to be effective. So what if you are delayed in the airport, I don’t care, ever wait in line at Immigration & Customs in Paris? Enough said.  Never be effective? Let’s see, many of the 9/11 hijackers were here on overstayed visas. Would have caused them to be more careful, and maybe given us more clues to catch them. Every little helps the intelligence community.

 

There are no “rights” that are being given up, visiting a foreign country is a privilege, not a right. Other countries will retaliate, Brazil being the first. Who cares, I have been to Brazil before and getting a visa was a painful process anyway, so now they are just shooting themselves further in the foot.

 

Damn, if I were in charge, I would require a DNA sample too.

posted on Monday, January 5, 2004 5:04:08 PM (Eastern Standard Time, UTC-05:00)  #    Comments [2] Trackback
# Friday, January 2, 2004

Middle East Developers Conference 2004, Jan 24-27, Cairo, Egypt 

Last year the first ME Developers Conference in Cairo, Egypt was a resounding success with over 1,600 Developers attending a packed, 3-day event!   We also had attendees from several countries in the region.This year promises to be even better, as this years’ keynote will feature Microsoft's Chairman & Chief Software Architect:  Bill Gates!!

There will be a few RDs speaking there besides me:

  • Patrick Hynds (Boston)
  • Abdelmalek Kemmou (Morocco)
  • Goksin Bakir (Turkey)
  • Selcuk Uzun (Turkey)
  • Hossam Khalifa (Egypt)

I will be doing 4 sessions there. Once again the very popular DataGrid session, but three new sessions one on the ASP .NET Cache and two on Yukon, TSQL Enhancements and XML. See you all there.

posted on Friday, January 2, 2004 3:18:43 PM (Eastern Standard Time, UTC-05:00)  #    Comments [12] Trackback
# Monday, December 29, 2003

.NET Stored Procedures in Yukon

You have heard about .NET Stored Procedues in Yukon. You have also heard about the power of TSQL. So which to use, TSQL or .NET? Here is the best rule of thumb. TSQL is for data access. Just about 99% of the time you will want to use TSQL to return data. When you want to do heavy CPU computational "things" you will want to use a CLR Language like C# or VB .NET. Here are some scenarios where a CLR language is much better:

1. Your queries have very complex procedural logic and require intensive computation
2. You need to access external resources like a text file or event log
3. You want to take advantage of .NET Base class libraries (like RegEx for example)
4. You want to leverage you database code across multiple projects

How does this work? You create a .NET assembly in Visual Studio and use what is called the In-Process Service Provider, or ADO in-proc for short. To use the In-Process Service Provider you can use the System.Data.SqlServer namespace to get access to all the classes in ADO In-proc. Then using your .NET language and ADO In-Proc you write some stored procedures, etc and then compile the assembly and bind it to your database. Now you can call your new database objects. Let's take a look at how to do that. Let's get started. Open up Visual Studio (you will need a beta of the next version of Visual Studio) and select "SQL Server Project" from the New Project dialog box. After you set your project type to SQL Server Project, Visual Studio asks you to set a "Add Database Reference" or basically set an active connection. Lastly, add a new item to your Visual Studio project like normal and choose a "stored procedure" from the dialog.

Ok, we are now ready to start coding. We are going to return a single value back to the calling application by querying the database using the SqlServer namespace classes and returning a single value. The first thing that you will notice is the namespaces used, by default when Visual Studio loads up a Stored Procedure project it adds the three new namespaces for you:

sing System.Data.Sql;
using System.Data.SqlServer;
using System.Data.SqlTypes;

These are the namespaces that you will use in your .NET Stored Procedure. The most important one is the SqlServer namespace. Here is a simple SP.

using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlServer;
using System.Data.SqlTypes;

public class CSingleValue
//My first .NET Stored Procedure! :)
{
[SqlProcedure]
public static int SingleValue()
{
//Use a SqlCommand object and the SqlContext
 //SqlContext will always return you an active
 //command (or what you ask for) from the current
 //database that exists for your project
 //notice a lot like SqlClient, but no connection
 SqlCommand cmd = SqlContext.GetCommand();

 //now that we have an active command we are going
 //to set the command text to return a single value
 //here we are going to send back the total sales
 //figure in the Northwind database
 cmd.CommandText = "select Sum((UnitPrice*Quantity)-Discount) From [Order Details] As TotalSales";

 //now we have to execute a datareader to get the single row
 SqlDataReader dr = cmd.ExecuteReader();

 //our datareader has the value in it
 //now do something with it, like return it to
 //as the result of the procedure
 dr.Read();

 int intTotalSales = (int)dr["TotalSales"];

 //return the  value
 return intTotalSales;
}
};

Let's dissect the code. First you use a SqlCommand from the SqlServer namespace and create it via the SqlContext object. SqlContext is your friend. For starters it will always give you the current connection of the calling function and in this case set all of the command's behaviors due to the scope of the connection. The next line of code sets the CommandText property of the Command object to a valid SQL statement. Then we create and execute a SqlDataReader and read the results into a variable and return that value.
Easy no? Well we are not there just yet.  You have to bind your stored procedure to your database. Visual Studio should do this for you, but here is how to manually bind it.

Create Assembly SqlServerProject1
From 'C:\SqlServerProject1.dll'
With Permission_Set=SAFE

You have three options with the permissions:
1. Safe
2. External_Access
3. UnSafe

Safe will only permit you access inside the database objects, unable to access the outside world. The assembly must be type-safe. External_Access gives you all of safe, but allows you to access the outside world, files, system resources, etc. UnSafe does not have to be type-safe and can call unmanaged code. Now you have to bind your procedure to the database, once again Visual Studio should do this for you, but here is how to manually do it:

Create PROCEDURE SingleValue
As
External Name SqlServerProject1:[SqlServerProject1.CSingleValue]::SingleValue

Calling your stored procedure is quite simple, just call it like any other stored procedure in SQL Workbench or in client side ADO .NET code:

Exec SingleValue

 

posted on Monday, December 29, 2003 5:37:21 PM (Eastern Standard Time, UTC-05:00)  #    Comments [1] Trackback