<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-19204885</id><updated>2011-12-30T07:56:30.247+08:00</updated><title type='text'>Tuldok Lambat's Tech Blog</title><subtitle type='html'>Technical ramblings about anything .NET and some not so .NET</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tuldoklambat.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19204885/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tuldoklambat.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tuldok Lambat</name><uri>http://www.blogger.com/profile/03508888443598740332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://img508.imageshack.us/img508/2906/jojosmall7vz.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-19204885.post-114182635095312958</id><published>2006-03-08T21:58:00.000+08:00</published><updated>2006-03-10T10:52:03.066+08:00</updated><title type='text'>Backup Your SQL Data Into A Script</title><content type='html'>The objective: &lt;strong&gt;Backup your SQL Server data into a script&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Tools of sorts can do this trivial task easy. One of the tools that can is &lt;a href="http://www.mygenerationsoftware.com/portal/default.aspx"&gt;MyGeneration&lt;/a&gt;. I'm not here to talk about this nifty tool though. I'm here to show you a nice TSQL script that can do that. Lo and behold.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;SET NOCOUNT ON&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- create a temporary table to hold the table info of the current db&lt;br /&gt;DECLARE @tables TABLE (&lt;br /&gt;seq int identity(1,1)&lt;br /&gt;,id int&lt;br /&gt;,name varchar(100))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;INSERT INTO @tables&lt;br /&gt;SELECT s.id, s.name&lt;br /&gt;FROM sysobjects s&lt;br /&gt;WHERE s.xtype='U'&lt;br /&gt;AND s.status &amp;gt; 0&lt;br /&gt;ORDER BY s.name&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- create a temporary table to hold the columns of the table being process&lt;br /&gt;DECLARE @columns TABLE (&lt;br /&gt;name varchar(100))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- drop #temp table if it exists, this may happen if the running this sp previously was cancelled&lt;br /&gt;-- or returns an exception&lt;br /&gt;IF object_id('tempdb..#temp', 'U') IS NOT NULL&lt;br /&gt;DROP TABLE #temp&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- create a temporary table to hold the constructed INSERT commands&lt;br /&gt;CREATE TABLE #temp (&lt;br /&gt;seq int identity(1,1)&lt;br /&gt;,cmd varchar(8000))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- holds the sequence numbers&lt;br /&gt;DECLARE @tabseq int&lt;br /&gt;DECLARE @cmdseq int&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- holds table info&lt;br /&gt;DECLARE @tablename varchar(100)&lt;br /&gt;DECLARE @tableid int&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- usually "dbo"&lt;br /&gt;DECLARE @user_name varchar(100)&lt;br /&gt;SET @user_name = user_name()&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- holds the SELECT statement that's ran against the table to create the INSERT commands (@cmd)&lt;br /&gt;DECLARE @select varchar(8000)&lt;br /&gt;-- holds the INSERT command&lt;br /&gt;DECLARE @cmd varchar(8000)&lt;br /&gt;-- holds the number of INSERT command for the table in process&lt;br /&gt;DECLARE @cmd_count int&lt;br /&gt;-- holds the field part of the constructed INSERT command&lt;br /&gt;DECLARE @fields varchar(8000)&lt;br /&gt;-- holds the VALUES part of the constructed INSERT command&lt;br /&gt;DECLARE @values varchar(8000)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- START SCRIPT CONSTRUCTION&lt;br /&gt;PRINT 'SET NOCOUNT ON'&lt;br /&gt;PRINT ''&lt;br /&gt;PRINT 'USE ' + db_name()&lt;br /&gt;PRINT ''&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- process each table&lt;br /&gt;WHILE EXISTS(SELECT TOP 1 * FROM @tables)&lt;br /&gt;BEGIN&lt;br /&gt;-- reset these values for each table&lt;br /&gt;SET @fields = ''&lt;br /&gt;SET @select = ''&lt;br /&gt;SET @values = ''&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;SELECT TOP 1&lt;br /&gt;@tabseq = seq,&lt;br /&gt;@tableid = id,&lt;br /&gt;@tablename = name&lt;br /&gt;FROM @tables&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- fetch the column info for the current table&lt;br /&gt;INSERT INTO @columns&lt;br /&gt;SELECT name&lt;br /&gt;FROM syscolumns&lt;br /&gt;WHERE id = @tableid&lt;br /&gt;ORDER BY colid&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- construct @fields and @values string for each columns,&lt;br /&gt;-- this have an effect of looping through the @columns table&lt;br /&gt;UPDATE @columns&lt;br /&gt;SET @fields = @fields + name + ', '&lt;br /&gt;,@values = @values + 'ISNULL('''''''' + CAST(' + name + ' AS varchar(8000)) + '''''''',''NULL'') + '', '' + '&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;SET @select = 'SELECT ''INSERT INTO ' + @user_name + '.' + @tablename+ ' (' + LEFT(@fields, LEN(@fields) - 1) + ') VALUES ('' + ' + LEFT(@values, LEN(@values) - 9) + ' + '')'' FROM ' + @tablename&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;INSERT INTO #temp EXEC (@select)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- if @@ROWCOUNT return zero that means the SELECT statement above did not return any data&lt;br /&gt;-- which means the table is empty and therefore need not be scripted&lt;br /&gt;IF @@ROWCOUNT &amp;gt; 0&lt;br /&gt;BEGIN&lt;br /&gt;-- disable constraints before inserting data&lt;br /&gt;PRINT '-- Data population script for ' + @tablename + ' table.'&lt;br /&gt;PRINT 'SET IDENTITY_INSERT ' + @tablename + ' ON'&lt;br /&gt;PRINT 'ALTER TABLE ' + @tablename + ' NOCHECK CONSTRAINT ALL'&lt;br /&gt;PRINT ''&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;SELECT @cmd_count = COUNT(*) FROM #temp&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- construct INSERTS&lt;br /&gt;PRINT '-- Data population script for ' + @tablename + ' table (' + CAST(@cmd_count AS varchar(100)) + ' records).'&lt;br /&gt;WHILE EXISTS(SELECT TOP 1 * FROM #temp)&lt;br /&gt;BEGIN&lt;br /&gt;SELECT TOP 1 @cmdseq = seq, @cmd = cmd FROM #temp &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;PRINT @cmd&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;DELETE #temp WHERE seq = @cmdseq&lt;br /&gt;END&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- enable constraints back&lt;br /&gt;PRINT ''&lt;br /&gt;PRINT 'ALTER TABLE ' + @tablename + ' CHECK CONSTRAINT ALL'&lt;br /&gt;PRINT 'SET IDENTITY_INSERT ' + @tablename + ' OFF'&lt;br /&gt;PRINT ''&lt;br /&gt;END&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;DELETE #temp&lt;br /&gt;-- clear @columns table&lt;br /&gt;DELETE @columns&lt;br /&gt;DELETE @tables WHERE seq = @tabseq&lt;br /&gt;END&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;PRINT 'SET NOCOUNT OFF'&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;-- END SCRIPT CONSTRUCTION&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;font-size:78%;"  &gt;DROP TABLE #temp&lt;/span&gt;&lt;/p&gt;Now, there's not much to say about this script. Comments are there to do just that. Just run this inside Query Analyzer within a database context and you're on. The result can be seen inside the Message pane that you could copy and paste into a file or just click on the Query &gt; Results To File menu to have Query Analyzer prompt you a file where the result would be directly save when you run the script (see Figures 1 &amp; 2)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;strong&gt;Figure 1.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" alt="" src="http://photos1.blogger.com/blogger/4532/1896/320/scriptor_2.jpg" border="0" /&gt;&lt;span style="font-size:78%;"&gt;&lt;strong&gt; Figure 2.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" alt="" src="http://photos1.blogger.com/blogger/4532/1896/320/scriptor_3.jpg" border="0" /&gt;&lt;br /&gt;Be forewarned though, this script has limits to what data type can be scripted, for one, it cannot do image data types and the likes, don't ask me what "the likes" are I haven't got time to test them =) all but it works for most common data types i.e. int, varchar, text, char, and all their mutations. It also only works for SQL Server 7.0 and later.&lt;br /&gt;&lt;br /&gt;Cheers!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);font-size:85%;" &gt;ERRATA: &lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;a href="http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=1053&amp;lngWId=5"&gt;http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=1053&amp;amp;lngWId=5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);font-size:85%;" &gt;I just found out that the script posted here does not work for tables without an identity so I corrected that version to conditionally "SET IDENTITY INSERT...". This second version also tries to include table with images although not populating that column.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19204885-114182635095312958?l=tuldoklambat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuldoklambat.blogspot.com/feeds/114182635095312958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19204885&amp;postID=114182635095312958&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19204885/posts/default/114182635095312958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19204885/posts/default/114182635095312958'/><link rel='alternate' type='text/html' href='http://tuldoklambat.blogspot.com/2006/03/backup-your-sql-data-into-script.html' title='Backup Your SQL Data Into A Script'/><author><name>Tuldok Lambat</name><uri>http://www.blogger.com/profile/03508888443598740332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://img508.imageshack.us/img508/2906/jojosmall7vz.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19204885.post-113462058734735560</id><published>2005-12-15T12:23:00.000+08:00</published><updated>2005-12-20T23:12:50.243+08:00</updated><title type='text'>Setting An External Application's Opacity</title><content type='html'>&lt;span style="font-family:Georgia;font-size:85%;"&gt;Opacity is nothing new in the .NET world, in fact it's an inherent property of WinForms although in actuality it's really an intrinsic property of Win2k's (and later Windows OS’es) window forms. In my opinion, the opacity property is one of the features of windows form that is not use most often but at the same time also one of the properties occasionally seek in an application i.e wouldn't be nice to have your IM console a bit translucent or your media player set invisibly enough so that everyone won't notice? It’s wickedly evil yet simple to do.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;font-size:130%;"&gt;The enabling technology&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;As far as I know, the .NET framework (v2.0) as it stands today do not have inherent capability to subclass external applications and mess with its window and its style, which I think is just logical lest it affects its portability. Leaving us no better choice than to use good old Windows API. The following table describes the API functions and constants/ flags we’re going to utilize for our demo application.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://img471.imageshack.us/my.php?image=ss03gq.png" target="_blank"&gt;&lt;img alt="Free Image Hosting at www.ImageShack.us" src="http://img471.imageshack.us/img471/1867/ss03gq.th.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-family:Verdana;font-size:78%;"&gt;Please refer to your MSDN for more info regarding the above functions.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;Now that we’ve define the functions to use. It’s time to put them into code. The snippet below is the content of the APIHelper class contained in the sample.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;class APIHelper&lt;br /&gt;{&lt;br /&gt;public static int GWL_EXSTYLE = -20;&lt;br /&gt;public static int WS_EX_LAYERED = 0x80000;&lt;br /&gt;public static int LWA_ALPHA = 0x2;&lt;br /&gt;[DllImport("user32")]&lt;br /&gt;public static extern int WindowFromPoint(int x, int y);&lt;br /&gt;[DllImport("user32")]&lt;br /&gt;public static extern int SetLayeredWindowAttributes(int hWnd, byte crey, byte alpha, int dwFlags);&lt;br /&gt;[DllImport("user32")]&lt;br /&gt;public static extern int SetWindowLong(int hWnd, int nIndex, int dwNewLong);&lt;br /&gt;[DllImport("user32")]&lt;br /&gt;public static extern int GetWindowLong(int hWnd, int nIndex);&lt;br /&gt;[DllImport("user32")]&lt;br /&gt;public static extern int GetParent (int hWnd);&lt;br /&gt;[DllImport("user32")]&lt;br /&gt;public static extern int GetParentOwner(int hWnd);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;Practically, the function SetLayeredWindowAttributes is the only function that enables setting the opacity of a window, the functions SetWindowLong and GetWindowLong are just there as auxillary to its working. While the functions GetParent and WindowFromPoint are there because of the demo application’s objective, that is – to enable the user to change the opacity of an external window (obtained by the GetParent) by dragging a pointer to it (WindowFromPoint identifies the window pointed to).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;font-size:130%;"&gt;A brief explanation&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;Before we delve on the technical details of the demo, I’d like you to bear this in mind, &lt;/span&gt;&lt;em&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;“Everything in Windows is a window”. &lt;/span&gt;&lt;/em&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;True, Windows wouldn’t be called as such if its &lt;/span&gt;&lt;em&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;not&lt;/span&gt;&lt;/em&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;. The textboxes, the labels, the buttons, the forms and all the rest of the controls (except for, I think, the image controls) are all windows, that is, they have what you call a “windows handle” (hWnd or handle by any other name). A window handle uniquely identifies each window (or should I say control in higher level parlance), and this is what we need to peruse the above functions.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;In particular, I’d like to discuss the following snippet that made use of the GetParent. This snippet is located under the MouseUp event, the trigger that indicates that we’re through selecting a window.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;lastWnd = APIHelper.WindowFromPoint(MousePosition.X, MousePosition.Y);&lt;br /&gt;while (APIHelper.GetParent(lastWnd) &gt; 0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;lastWnd = APIHelper.GetParent(lastWnd);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;As you can see, the snippet retrieves the window handle of the “window” pointed to by mouse position. Now this can just be any other controls present on a form window, which we won’t need to deal with since what we’re interested is the form. And for us to get a handle from it is to walk the parent-child hierarchy until we find a window (/control) that don’t have a parent – the topmost window or the form window.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;Now that we have grabbed a window handle, it’s time to do our thing. The TrackBar control in our demo app will be use to adjust the window’s opacity thru its scroll event.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;&lt;br /&gt;int oldWinStyle = APIHelper.GetWindowLong(lastWnd, APIHelper.GWL_EXSTYLE);&lt;br /&gt;APIHelper.SetWindowLong(lastWnd, APIHelper.GWL_EXSTYLE,&lt;br /&gt;trackBar1.Value &amp;lt; 255 ? oldWinStyle APIHelper.WS_EX_LAYERED :&lt;br /&gt;oldWinStyle &amp; ~APIHelper.WS_EX_LAYERED);&lt;br /&gt;APIHelper.SetLayeredWindowAttributes(lastWnd, 0, (byte)trackBar1.Value, APIHelper.LWA_ALPHA);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:0;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;font-size:85%;"&gt;In pseudo terms, the snippet simply says, get the window’s previous style OR that to WS_EX_LAYERED to enable its opacity (or layering) and when done set its LWA_ALPHA attribute to the value indicated on the TrackBar. Easy is it? Below are the snapshots of the demo app in action.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img219.imageshack.us/my.php?image=ss34bj.png" target="_blank"&gt;&lt;img alt="Free Image Hosting at www.ImageShack.us" src="http://img219.imageshack.us/img219/143/ss34bj.th.png" border="0" /&gt;&lt;/a&gt; &lt;a href="http://img219.imageshack.us/my.php?image=ss46te.png" target="_blank"&gt;&lt;img alt="Free Image Hosting at www.ImageShack.us" src="http://img219.imageshack.us/img219/7442/ss46te.th.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;Figure 1 &amp; 2: Before and after applying the transparency using the demo application.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img212.imageshack.us/my.php?image=ss21sp.png" target="_blank"&gt;&lt;img alt="Free Image Hosting at www.ImageShack.us" src="http://img212.imageshack.us/img212/5965/ss21sp.th.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;Figure 3: Applying transparency to a set of windows using yet another demo application included in the download.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:0;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;font-size:130%;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:0;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;font-size:85%;"&gt;The opacity feature of Win2K forms really is cool and a bit tweaking of the demo app would surely make it a nice-to-have tool in everyone’s desktop. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:0;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:78%;"&gt;&lt;strong&gt;References:&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;249341"&gt;&lt;span style="font-size:78%;"&gt;&lt;strong&gt;How to create layered Windows in Visual Basic&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;a href="ms-help://MS.MSDNQTR.2003FEB.1033/winui/winui/windowsuserinterface/windowing/windows/usingwindows.htm"&gt;&lt;span style="font-size:78%;"&gt;&lt;strong&gt;Using Windows&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;&lt;strong&gt;&lt;br /&gt;&lt;br /&gt;Downloads: &lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;a href="http://www.megaupload.com/?d=P8CO97WY"&gt;&lt;span style="font-size:78%;"&gt;&lt;strong&gt;http://www.megaupload.com/?d=P8CO97WY&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt; &lt;span style="font-size:78%;"&gt;(Framework 2.0)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.megaupload.com/?d=RPSTEM8T"&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;http://www.megaupload.com/?d=RPSTEM8T&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:78%;"&gt; (Framework 1.1)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;&lt;a href="http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=4314&amp;amp;lngWId=10"&gt;Most Recent Version (Framework 1.1)&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:78%;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19204885-113462058734735560?l=tuldoklambat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuldoklambat.blogspot.com/feeds/113462058734735560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19204885&amp;postID=113462058734735560&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19204885/posts/default/113462058734735560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19204885/posts/default/113462058734735560'/><link rel='alternate' type='text/html' href='http://tuldoklambat.blogspot.com/2005/12/setting-external-applications-opacity.html' title='Setting An External Application&apos;s Opacity'/><author><name>Tuldok Lambat</name><uri>http://www.blogger.com/profile/03508888443598740332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://img508.imageshack.us/img508/2906/jojosmall7vz.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19204885.post-113324032614612782</id><published>2005-11-29T12:58:00.000+08:00</published><updated>2005-12-15T14:35:56.723+08:00</updated><title type='text'>Ugly-Printing: Reducing Your Page Content Size</title><content type='html'>&lt;span style="font-family:Georgia;font-size:85%;"&gt;Previously we talked about the idea of compressing the ViewState and the idea of persisting it on the server to reduce the content size of your .aspx page. In addition to those ideas I’ll be discussing with you yet another way of speeding up your .aspx web pages.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;font-size:130%;"&gt;Pretty-printing…&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;The developers of ASP.NET had put lots of effort in formatting the HTML source of our .aspx page and did so pretty well, just right click your browser and select View Source to see what I mean (Figure 1). These were all well and good for those who know how and care to peek under the covers of your web pages but does it really matter to the average user? For all we know, the average user care less if the underlying HTML source is pretty-printed or not. What matters to them, besides your content of course, is the speed at how it delivers its content in front of them. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img206.imageshack.us/my.php?image=prettyprint7pj.jpg" target="_blank"&gt;&lt;img alt="Free Image Hosting at www.ImageShack.us" src="http://img206.imageshack.us/img206/2096/prettyprint7pj.th.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:78%;"&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:78%;"&gt;Figure 1. Pretty printed HTML source.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;font-size:130%;"&gt;The Filter property&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;The HttpResponse class exposes a Filter property that you could peruse to filter (and modify) the contents of the resulting HTML. This is just what we need to remove the extraneous character (mostly whitespace characters like carriage-returns and tabs) that ASP.NET deliberately put in for pretty-printing, in addition we could also extend our filtering scheme to include removing HTML comment, script comments, spaces between operators (like a + b when a+b will suffice) and etc. for further reduction. You can also try obfuscating your scripts using this scheme. Think of the endless possibilities.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;font-size:130%;"&gt;Digression&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;Staying young and beautiful almost always has a tradeoff. You’ll spend lots of effort and time to maintain one’s beauty, just asks my missus and she’ll tell you. So why stay young and die early in the process (because you worry often that you’re getting older) when you can get old earlier and live longer.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;font-size:130%;"&gt;Ugly-printing…&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;The digression above was just rhetorical but it holds true in computer processing. Agile method proponents always wants to keep everything simple because they acknowledge that most user care less if the system is aesthetically pleasing as long as it work and gets the job done. Most likely such system will be used longer than a system that is aesthetically pleasing yet doesn’t work at all. What I’m really saying is, why pretty-print when we can ugly-print for better user experience.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;Using the HttpResponse.Filter and setting up our filter mechanism is not complicated but it’s not trivial either. What we need is a class that derives from the abstract Stream class with the required members implemented (see your MSDN documentation), especially the Write method, where the actual filtering process takes places.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;public class UglyPrint : Stream&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;public override void Write(byte[] buffer, int offset, int count)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;byte[] data = new byte[count];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;Buffer.BlockCopy(buffer, offset, data, 0, count);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;string inputstring = Encoding.ASCII.GetString(data);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;inputstring = Regex.Replace(inputstring, @"&amp;gt;[\s\S]*?&amp;lt;", new MatchEvaluator(Evaluate));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;data = Encoding.ASCII.GetBytes(inputstring);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;strSink.Write(data, 0, inputstring.Length);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;protected string Evaluate(Match m)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;string ms = m.ToString();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;ms = Regex.Replace(ms, @"\r\n\s*", "");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;return ms;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;Here I made use of the Regular Expression class (Regex) to find the pattern “&amp;gt;[\s\S]*?&amp;lt;”, the pattern basically meant, all white spaces and/or non-white space between the “&amp;gt;” and “&amp;lt;” symbol. If we found such pattern, it will call the Evaluate function and further search the matched string with symbols “\r\n\s*” which meant all carriage-returns followed by zero or more white spaces and replaces them with an empty string.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;Now, that we have setup the filtering class. It’s now time to use in our page. Just add the following snippet in the Page_Load event.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;this.Response.Filter = new UglyPrint(this.Response.Filter);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;or inherit from the ZipPage class (included in the example), like so:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;public partial class DynamicNodes_aspx : ZipPage&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;This System.Web.UI.Page derived ZipPage class implements the UglyPrint class and the classes from the ViewState Compression and Persistence blog.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;That’s it and you’re done. Run the page and try viewing its source in the browser (Figure 2).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://img206.imageshack.us/my.php?image=uglyprint4jb.jpg" target="_blank"&gt;&lt;img alt="Free Image Hosting at www.ImageShack.us" src="http://img206.imageshack.us/img206/5251/uglyprint4jb.th.jpg" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:78%;"&gt;Figure 2. After ugly-printing the page.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;Now, that’s what I call a mess. It’s ugly but it’s faster and because it’s hard to read you are well off from other prying eyes. Also from the snapshot below (Figure 3) you’ll see how much the page was reduced from 17,881 to 16,861. This may seem not much but that’s just because our filtering scheme is simple and did not strip of white spaces inside the scripts. But like I mentioned earlier we could still extend the filtering scheme and make it more robust.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://img206.imageshack.us/my.php?image=beforeugly1ia.jpg" target="_blank"&gt;&lt;img alt="Free Image Hosting at www.ImageShack.us" src="http://img206.imageshack.us/img206/2280/beforeugly1ia.th.jpg" border="0" /&gt;&lt;/a&gt; &lt;a href="http://img206.imageshack.us/my.php?image=afterugly5up.jpg" target="_blank"&gt;&lt;img alt="Free Image Hosting at www.ImageShack.us" src="http://img206.imageshack.us/img206/2526/afterugly5up.th.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:78%;"&gt;Figure 3. Shows the size difference before and after ugly-printing the page.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;font-size:130%;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;Think of the combine effect of compressing the ViewState or persisting it in the server with this idea of ugly-printing and you’ll get an idea of how much less your .aspx page now weigh. You need not worry how long this overhead takes because it depends on the complication of your filtering scheme but nonetheless a lighter page means a faster delivery. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;Note:&lt;br /&gt;&lt;/strong&gt;Please take note that the above example leaves lot to be done. The filtering logic in the code above is simple and just serves as a proof-of-concept. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana;font-size:78%;"&gt;&lt;strong&gt;Downloads: &lt;a href="http://www.megaupload.com/?d=2HHKPJ8J"&gt;http://www.megaupload.com/?d=2HHKPJ8J&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;font-size:78%;"&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19204885-113324032614612782?l=tuldoklambat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuldoklambat.blogspot.com/feeds/113324032614612782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19204885&amp;postID=113324032614612782&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19204885/posts/default/113324032614612782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19204885/posts/default/113324032614612782'/><link rel='alternate' type='text/html' href='http://tuldoklambat.blogspot.com/2005/11/ugly-printing-reducing-your-page_29.html' title='Ugly-Printing: Reducing Your Page Content Size'/><author><name>Tuldok Lambat</name><uri>http://www.blogger.com/profile/03508888443598740332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://img508.imageshack.us/img508/2906/jojosmall7vz.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19204885.post-113274519039560470</id><published>2005-11-23T19:26:00.000+08:00</published><updated>2005-11-23T19:34:04.863+08:00</updated><title type='text'>ViewState Compression and Persistence</title><content type='html'>&lt;span style="font-family:Georgia;font-size:85%;"&gt;For most web developers, one of the breakthroughs that the .net framework brought them is the ViewState. That enabling technology that save/restore page state between postback. But this cool stuff carries with it an overhead. Enabled by default and for the most part ignored during development, the ViewState may bloat to a size that may affect performance especially during page load.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;font-size:130%;"&gt;So what do we do?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;We can turn viewstate off all together. A not so good idea because that would mean throwing an extra programming effort for you to take care of the page state. Although a nicer idea would be to turn viewstate off for only the controls that need don't need it. But this won't entirely solve the problem of a bloated viewstate.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;font-size:130%;"&gt;So what are the other options?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;Other option I've seen on the &lt;/span&gt;&lt;a href="http://www.hanselman.com/blog/permalink,guid,febce059-7e7c-439e-af3d-c53d250b3e9c.aspx"&gt;net&lt;/a&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt; entails compressing the viewstate. I've tried it and it actually reduced the size of my viewstate by more than a half! Below is my port of it in .NET 2.0 (FYI, .NET 2.0 now comes with a compression namespace but you can always opt to use 3rd party products like ShapNZipLib, ComponentOne.Zip, etc).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;using System;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;using System.Collections.Generic;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;using System.Text;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;using System.IO;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;using System.IO.Compression;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;public class GZip&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;public static byte[] Compress(byte[] b)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;MemoryStream ms = new MemoryStream();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;GZipStream zs = new GZipStream(ms, CompressionMode.Compress, true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;zs.Write(b, 0, b.Length);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;zs.Close();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;return ms.ToArray();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;public static byte[] Decompress(byte[] b)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;MemoryStream ms = new MemoryStream();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;GZipStream zs = new GZipStream(new MemoryStream(b), CompressionMode.Decompress, true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;byte[] buffer = new byte[4096];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;int size;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;while (true)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;size = zs.Read(buffer, 0, buffer.Length);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;if (size &amp;gt; 0) ms.Write(buffer, 0, size);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;else break;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;zs.Close();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;return ms.ToArray();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;public class Deflate&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;public static byte[] Compress(byte[] b)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;MemoryStream ms = new MemoryStream();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;DeflateStream zs = new DeflateStream(ms, CompressionMode.Compress, true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;zs.Write(b, 0, b.Length);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;zs.Close();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;return ms.ToArray();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;public static byte[] Decompress(byte[] b)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;MemoryStream ms = new MemoryStream();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;DeflateStream zs = new DeflateStream(new MemoryStream(b), CompressionMode.Decompress, true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;byte[] buffer = new byte[4096];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;int size;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;while (true)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;size = zs.Read(buffer, 0, buffer.Length);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;if (size &amp;gt; 0) ms.Write(buffer, 0, size);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;else break;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;zs.Close();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;return ms.ToArray();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;//Please see code snippet below on how to use these classes.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;font-size:130%;"&gt;Is that it?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;The buck doesn't stop here. I've read Dino Esposito's Programming Microsoft ASP.NET (ISBN:0735619034) and in one of the advance topics in his book he mentioned saving the ViewState in a file at the server. I was having second thoughts on this idea at first. Since this would mean lots of files and disk read/write activities in the server but then I thought of the advantages (and it outweighs the dis in some ways). First, security-wise, the ViewState won't get manipulated. Second, at least you have control of the server's resources and you can scale it up all you want rather than upgrading all of the client workstation. Third, I can't think of anything but I'm sure with this, I'll be saving the client some load up time =). See how it's implemented below:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;using System;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;using System.Collections.Generic;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;using System.Text;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;using System.Web.UI;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;using System.IO;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;public class ZipPage : Page&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;protected override void OnPreLoad(EventArgs e)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;this.Session["_storeViewStateInServer"] = false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;base.OnPreLoad(e);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;public bool StoreViewStateInServer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;get &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;return (bool)this.Session["_storeViewStateInServer"];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;set &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;this.Session["_storeViewStateInServer"] = value; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;protected override object LoadPageStateFromPersistenceMedium()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;LosFormatter f = new LosFormatter();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;string vstate;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;if (StoreViewStateInServer)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;StreamReader sr = new StreamReader(GetFileName());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;vstate = sr.ReadToEnd();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;sr.Close();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;vstate = this.Request.Form["__ZIPSTATE"];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;byte[] b = Convert.FromBase64String(vstate);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;b = Deflate.Decompress(b);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;vstate = Convert.ToBase64String(b);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;return f.Deserialize(vstate);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;protected override void SavePageStateToPersistenceMedium(object state)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;LosFormatter f = new LosFormatter();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;if (StoreViewStateInServer)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;StreamWriter sw = new StreamWriter(GetFileName());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;f.Serialize(sw, state);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;sw.Close();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;StringWriter sw = new StringWriter();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;f.Serialize(sw, state);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;byte[] b = Convert.FromBase64String(sw.ToString());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;b = Deflate.Compress(b);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;ClientScript.RegisterHiddenField("__ZIPSTATE", Convert.ToBase64String(b));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;private string GetFileName()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;string url = Request.ServerVariables["Path_Info"];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;url = url.Replace("/", "_");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;// Place the file in a temp folder (with write permissions) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;string fileName = "{0}/{1}_{2}.viewstate";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;fileName = String.Format(fileName, "Temp", Session.SessionID, url);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;return Server.MapPath(fileName);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;Now you'll just have to inherit from this class and you're on the go. By default the ViewState won't be save on the server, I'll let you set it up by setting the StoreViewStateInServer property. Note that opting to save the ViewState in the server won't compress it since it doesn't matter anyway. Also please don't forget to give ASPNET machine account proper rights to the folder you'll be writing those temp tables or else it won't be able to persist the ViewState and exceptions will occur.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;font-size:130%;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia;font-size:85%;"&gt;The two solutions cited to reduce the load up time of your aspx page are just one of the many things you can do the tweak you web app performance. Next blog I'll be showing you how to compress the HTML rendered on the page by removing the extra characters inserted by ASP.NET during page rendering. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19204885-113274519039560470?l=tuldoklambat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuldoklambat.blogspot.com/feeds/113274519039560470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19204885&amp;postID=113274519039560470&amp;isPopup=true' title='162 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19204885/posts/default/113274519039560470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19204885/posts/default/113274519039560470'/><link rel='alternate' type='text/html' href='http://tuldoklambat.blogspot.com/2005/11/viewstate-compression-and-_113274519039560470.html' title='ViewState Compression and Persistence'/><author><name>Tuldok Lambat</name><uri>http://www.blogger.com/profile/03508888443598740332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://img508.imageshack.us/img508/2906/jojosmall7vz.png'/></author><thr:total>162</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19204885.post-113265519192810868</id><published>2005-11-22T18:17:00.000+08:00</published><updated>2005-11-22T18:26:31.936+08:00</updated><title type='text'>Welcome!</title><content type='html'>Welcome to my very first technical blog.  This is where I'll be sharing my experiences in the information technology field.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19204885-113265519192810868?l=tuldoklambat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19204885/posts/default/113265519192810868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19204885/posts/default/113265519192810868'/><link rel='alternate' type='text/html' href='http://tuldoklambat.blogspot.com/2005/11/welcome.html' title='Welcome!'/><author><name>Tuldok Lambat</name><uri>http://www.blogger.com/profile/03508888443598740332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://img508.imageshack.us/img508/2906/jojosmall7vz.png'/></author></entry></feed>
