<?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-4153375873639804201</id><updated>2011-11-28T03:14:33.287+02:00</updated><category term='ORACLE'/><category term='MessageContract'/><category term='Visual Studio'/><category term='JavaScript memory leak'/><category term='SQL'/><category term='Cache'/><category term='WCF Performance'/><category term='Application Security'/><category term='UpdatePanel; .NET Validators'/><category term='AJAX'/><category term='Mozzila'/><category term='Terminals'/><category term='SQL Format'/><category term='Stored Procs performance'/><category term='Single point for WCF proxy calls'/><category term='ASP.NET'/><category term='AJAX.NET'/><category term='ReaderWriterLockSlim'/><category term='JavaScript performance'/><category term='.NET Tools'/><category term='ASP.NET Ajax'/><category term='.Net 3.5'/><category term='lightbox'/><category term='.Net Performance'/><category term='.NET Assembly Information'/><category term='JavaScript accordion'/><category term='Remote Desktop Connection'/><category term='http header'/><category term='performance'/><category term='Terminal'/><category term='Software Components'/><category term='LINQ to SQL'/><category term='JSON'/><category term='UpdatePanel'/><category term='Reflector'/><category term='svcutil'/><category term='Dynamic SQL'/><category term='prototype.js'/><category term='LINQ'/><category term='innerHTML'/><category term='Debugging javaScript'/><category term='CSS'/><category term='Popup window'/><category term='.Net loop performance'/><category term='cookies'/><category term='WCF proxy'/><category term='DHTML Control'/><category term='Cross Site Scripting'/><category term='WCF Client Dispose'/><category term='W3C DOM'/><category term='Prototype'/><category term='.NET Framework'/><category term='c# generics performance'/><category term='display assembly compilation mode'/><category term='Web 2.0'/><category term='Best Practices'/><category term='efficient .NET C# code'/><category term='WCF Client Performance'/><category term='C#'/><category term='Visual Studio 2008 add-in'/><category term='.Net Tools; .NET Assembly Information; Tools; display assembly compilation mode'/><category term='JavaScript Keyboard Support'/><category term='WCF'/><category term='multiple versions of IE'/><category term='HTML'/><category term='Tools'/><category term='browser performance'/><category term='IE'/><category term='Internet Explorer'/><category term='Visual Source Safe'/><category term='JavaScript'/><category term='XSS'/><category term='http traffic'/><category term='VSS 2005'/><category term='.NET'/><category term='JavaScript Tooltip'/><title type='text'>Caught In A Web</title><subtitle type='html'>Share knowledge on web development like: ASP.NET, AJAX, Web 2.0, JavaScript, CSS, HTML, JSON, XML and more</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>49</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-6126206939960837780</id><published>2008-06-25T17:32:00.002+03:00</published><updated>2008-06-25T17:39:18.072+03:00</updated><title type='text'>My blog was forward to Microsoft (MS Israel Community)</title><content type='html'>Hi All,&lt;br /&gt;I forward my blog to MS Israel Community.&lt;br /&gt;&lt;br /&gt;My new blog URL is: &lt;a href="http://blogs.microsoft.co.il/blogs/rotemb/"&gt;Rotem Bloom's Blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I want to say many thanks to Guy Burstein that helps me open the new blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-6126206939960837780?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/6126206939960837780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=6126206939960837780&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6126206939960837780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6126206939960837780'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2008/06/my-blog-was-forward-to-microsoft-ms.html' title='My blog was forward to Microsoft (MS Israel Community)'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-4321142522184632047</id><published>2008-06-18T09:57:00.000+03:00</published><updated>2008-06-18T10:00:25.186+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Assembly Information'/><category scheme='http://www.blogger.com/atom/ns#' term='display assembly compilation mode'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Tools'/><title type='text'>Assembly Information work under .NET 2.0</title><content type='html'>Hi All,&lt;br /&gt;The Assembly Information tool is now also work under .NET 2.0.&lt;br /&gt;&lt;br /&gt;You can download the setup from codeplex on the link below:&lt;br /&gt;&lt;a href="http://www.codeplex.com/AssemblyInformation/Release/ProjectReleases.aspx?ReleaseId=14490"&gt;Assembly Information work under .NET 2.0&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-4321142522184632047?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/4321142522184632047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=4321142522184632047&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/4321142522184632047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/4321142522184632047'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2008/06/assembly-information-work-under-net-20.html' title='Assembly Information work under .NET 2.0'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-2835984952549998460</id><published>2008-06-17T09:11:00.000+03:00</published><updated>2008-06-17T09:24:06.506+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WCF proxy'/><category scheme='http://www.blogger.com/atom/ns#' term='Single point for WCF proxy calls'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>WCF Practices: Single point for WCF proxy calls</title><content type='html'>Hi All,&lt;br /&gt;Let's say you want that all your WCF proxy calls will come from one function. This could be very useful and save a lot of code.&lt;br /&gt;For example you can write your proxy exception handling in one place.&lt;br /&gt;&lt;br /&gt;Here is the code example that work on .NET framework 3.5 only:&lt;br /&gt;&lt;br /&gt;// The public function that execute the WCF proxy call&lt;br /&gt;public void WCFProxyCall()&lt;br /&gt;{            &lt;br /&gt;   CreateConferenceRequest r = new CreateConferenceRequest();&lt;br /&gt;            &lt;br /&gt;   Func&lt;CreateConferenceRequest, CreateConferenceResponse&gt; createFunc = a =&gt;&lt;br /&gt;   proxy.CreateConference(a);&lt;br /&gt; &lt;br /&gt;   CreateConferenceResponse ci = ProxyWrapperOperation&lt;CreateConferenceRequest,  CreateConferenceResponse&gt;(createFunc, r);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// This is the single point function for the entire WCF proxy calls&lt;br /&gt;// Here you can write code for all your WCF proxy calls.&lt;br /&gt;private TResult ProxyWrapperOperation&lt;T, TResult&gt;(Func&lt;T, TResult&gt; operation, T parameter) &lt;br /&gt;{&lt;br /&gt;   TResult result;&lt;br /&gt;   try&lt;br /&gt;   {&lt;br /&gt;      result = operation(parameter);&lt;br /&gt;   }&lt;br /&gt;   catch (TimeoutException timeProblem)&lt;br /&gt;   {&lt;br /&gt;       proxy.Abort();&lt;br /&gt;       throw;&lt;br /&gt;   }&lt;br /&gt;   catch (FaultException unknownFault)&lt;br /&gt;   {&lt;br /&gt;       throw;&lt;br /&gt;   }&lt;br /&gt;   catch (CommunicationException commProblem)&lt;br /&gt;   {&lt;br /&gt;        proxy.Abort();&lt;br /&gt;        throw;&lt;br /&gt;   }&lt;br /&gt;            &lt;br /&gt;   return result;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-2835984952549998460?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/2835984952549998460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=2835984952549998460&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2835984952549998460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2835984952549998460'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2008/06/wcf-practices-single-point-for-wcf.html' title='WCF Practices: Single point for WCF proxy calls'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-8986076200470451139</id><published>2008-06-15T10:33:00.000+03:00</published><updated>2008-06-15T10:36:26.730+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.Net Tools; .NET Assembly Information; Tools; display assembly compilation mode'/><title type='text'>.NET Assembly Information Tool is now on codeplex</title><content type='html'>Hi All,&lt;br /&gt;I wrote a nice .NET tool that display .net assembly information like:&lt;br /&gt;1) Compilation mode Debug\Release.&lt;br /&gt;2) .NET Assembly full name&lt;br /&gt;3) .NET Assembly references&lt;br /&gt;&lt;br /&gt;You must have .NET framework 3.5 install in order to work with .NET Assembly Information tool.&lt;br /&gt;&lt;br /&gt;How to use:&lt;br /&gt;After the installation you can point on any .NET Assembly (DLL), press right click and press on the new menu called: "Assembly Information".&lt;br /&gt;A popup window with useful information on your Assembly will pops. &lt;br /&gt;&lt;br /&gt;You can find it under:&lt;br /&gt;&lt;a href="http://www.codeplex.com/AssemblyInformation"&gt;.NET Assembly Information&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-8986076200470451139?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/8986076200470451139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=8986076200470451139&amp;isPopup=true' title='28 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/8986076200470451139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/8986076200470451139'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2008/06/net-assembly-information-tool-is-now-on.html' title='.NET Assembly Information Tool is now on codeplex'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>28</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-7606276238848460525</id><published>2008-05-12T18:29:00.000+03:00</published><updated>2008-05-13T09:20:37.071+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='svcutil'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><category scheme='http://www.blogger.com/atom/ns#' term='MessageContract'/><title type='text'>svcutil with /r does not work for MessageContract</title><content type='html'>Hi,&lt;br /&gt;I was trying to generate WCF proxy (Client) using svcutil.exe from Visual Studio 2008. I also need to use the /r parameter of the svcutil.exe so the generated proxy code will not include the objetcs from my other internal assemblies.&lt;br /&gt;The command I use is something like:&lt;br /&gt;svcutil.exe /async http://localhost:8080/MyService /r:"C:\My.dll" /tcv:Version35 /out:MyClient.cs&lt;br /&gt;&lt;br /&gt;I saw that if my .NET MessageContract objects on My.dll still exists on my generated proxy, so I have to change these objects to DataContract objects and then the generated proxy was correct.&lt;br /&gt;&lt;br /&gt;You also need to remember that if your internal objects (on My.dll) contain objects form other internal assembly, You have to include this dll also in your svcutil command. So you new command will look like:&lt;br /&gt;svcutil.exe /async http://localhost:8080/MyService /r:"C:\My.dll" /r:"C:\MyOtherObjects.dll" /tcv:Version35 /out:MyClient.cs&lt;br /&gt;&lt;br /&gt;Your,&lt;br /&gt;Rotem&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-7606276238848460525?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/7606276238848460525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=7606276238848460525&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/7606276238848460525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/7606276238848460525'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2008/05/svcutil-with-r-does-not-work-for.html' title='svcutil with /r does not work for MessageContract'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-218635991268077321</id><published>2008-05-05T16:43:00.000+03:00</published><updated>2008-05-05T16:49:55.698+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WCF Performance'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF Client Performance'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Increasing WCF Client Applications Performance</title><content type='html'>Some times your WCF client object are created on the Middle-Tier of the application.&lt;br /&gt;This scenario leads for creating many WCF client objects quickly and, as a result, experience increased initialization requirements.&lt;br /&gt;&lt;br /&gt;There are two main approaches to increasing the performance of middle-tier applications when calling services:&lt;br /&gt;1. Cache the WCF client object and reuse it for subsequent calls where possible.&lt;br /&gt;2. Create a ChannelFactory object and then use that object to create new WCF client channel objects for each call.&lt;br /&gt;&lt;br /&gt;Issues to consider when using these approaches include:&lt;br /&gt;&lt;br /&gt; - If the service is maintaining a client-specific state by using a session, then you cannot reuse the middle-tier WCF client with multiple-client tier requests because the service's state is tied to that of the middle-tier client.&lt;br /&gt;&lt;br /&gt;- If the service must perform authentication on a per-client basis, you must create a new client for each incoming request on the middle tier instead of reusing the middle-tier WCF client (or WCF client channel object) because the client credentials of the middle tier cannot be modified after the WCF client (or ChannelFactory) has been created.&lt;br /&gt;&lt;br /&gt;- While channels and clients created by the channels are thread-safe, they might not support writing more than one message to the wire concurrently. If you are sending large messages, particularly if streaming, the send operation might block waiting for another send to complete. This causes two sorts of problems: a lack of concurrency and the possibility of deadlock if the flow of control returns to the service reusing the channel (that is, the shared client calls a service whose code path results in a callback to the shared client). This is true regardless of the type of WCF client you reuse.&lt;br /&gt;&lt;br /&gt;- You must handle faulted channels regardless of whether you share the channel. When channels are reused, however, a faulting channel can take down more than one pending request or send.&lt;br /&gt;&lt;br /&gt;Link to MS article:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa738757.aspx"&gt;Middle-Tier Client Applications&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-218635991268077321?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/218635991268077321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=218635991268077321&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/218635991268077321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/218635991268077321'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2008/05/increasing-wcf-client-applications.html' title='Increasing WCF Client Applications Performance'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-3840374489685640909</id><published>2008-05-05T16:15:00.000+03:00</published><updated>2008-05-05T16:17:20.817+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WCF Client Dispose'/><category scheme='http://www.blogger.com/atom/ns#' term='Best Practices'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Best Practices: How to Dispose WCF clients</title><content type='html'>Use of the using statement (Using in Visual Basic) is not recommended for Dispose WCF clients. This is because the end of the using statement can cause exceptions that can mask other exceptions you may need to know about.&lt;br /&gt;&lt;br /&gt;using (CalculatorClient client = new CalculatorClient())&lt;br /&gt;{&lt;br /&gt;    ...&lt;br /&gt;} // &lt;-- this line might throw&lt;br /&gt;Console.WriteLine("Hope this code wasn't important, because it might not happen.");&lt;br /&gt;&lt;br /&gt;The correct way to do it is:&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;    ...&lt;br /&gt;    client.Close();&lt;br /&gt;}&lt;br /&gt;catch (CommunicationException e)&lt;br /&gt;{&lt;br /&gt;    ...&lt;br /&gt;    client.Abort();&lt;br /&gt;}&lt;br /&gt;catch (TimeoutException e)&lt;br /&gt;{&lt;br /&gt;    ...&lt;br /&gt;    client.Abort();&lt;br /&gt;}&lt;br /&gt;catch (Exception e)&lt;br /&gt;{&lt;br /&gt;    ...&lt;br /&gt;    client.Abort();&lt;br /&gt;    throw;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-3840374489685640909?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/3840374489685640909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=3840374489685640909&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/3840374489685640909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/3840374489685640909'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2008/05/best-practices-how-to-dispose-wcf.html' title='Best Practices: How to Dispose WCF clients'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-2624602803255068554</id><published>2008-04-17T15:54:00.000+03:00</published><updated>2008-04-17T15:58:52.633+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http header'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>How to add custom http header in WCF</title><content type='html'>If you want to add custom http header web service calls, there is a simple way to do it in WCF. Here is the code:&lt;br /&gt;&lt;br /&gt;MessageHeader header&lt;br /&gt;                 = MessageHeader.CreateHeader(&lt;br /&gt;                        "My-CustomHeader",&lt;br /&gt;                        "http://myurl",&lt;br /&gt;                        "Custom Header."&lt;br /&gt;                        );&lt;br /&gt;&lt;br /&gt;using (Service1Client client = new Service1Client())&lt;br /&gt;{&lt;br /&gt;    using (OperationContextScope scope = new OperationContextScope(client.InnerChannel))&lt;br /&gt;    {&lt;br /&gt;       OperationContext.Current.OutgoingMessageHeaders.Add(header);&lt;br /&gt;&lt;br /&gt;       HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty();&lt;br /&gt;       httpRequestProperty.Headers.Add("myCustomHeader", "Custom Happy Value.");&lt;br /&gt;                        httpRequestProperty.Headers.Add(HttpRequestHeader.UserAgent, "my user agent");&lt;br /&gt;                        OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-2624602803255068554?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/2624602803255068554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=2624602803255068554&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2624602803255068554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2624602803255068554'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2008/04/how-to-add-custom-http-header-in-wcf.html' title='How to add custom http header in WCF'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-2196036642310337034</id><published>2008-04-15T17:54:00.000+03:00</published><updated>2008-04-15T18:15:48.349+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='ReaderWriterLockSlim'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net 3.5'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net Performance'/><title type='text'>ReaderWriterLockSlim Performance - Is it really so slim??!!!</title><content type='html'>Hi,&lt;br /&gt;On the .NET 3.5 Microsoft came up with new object named ReaderWriterLockSlim in order to achieve synchronised access to shared resources and also to improve the profermance issues that the old object (System.Threading.ReaderWriterLock) has.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/pedram"&gt;Pedram Rezaei's&lt;/a&gt; wrote on his blog great post on Performance Comparison of ReaderWriterLockSlim.&lt;br /&gt;On his performance tests he found that ReaderWriterLockSlim object is slower then the Monitor object.&lt;br /&gt;&lt;br /&gt;Pedram Rezaei's conclusion:&lt;br /&gt;"A reader-writer lock allows for multiple concurrent reads to enter a read-lock all at the same time and depending on the scenario, it can significantly improve the overall performance of your application when used instead of a mutual exclusive lock. A read-lock takes a shared lock and a write-lock takes an exclusive lock.&lt;br /&gt;&lt;br /&gt;The new ReaderWriterLockSlim correctly gives priority to write requests therefore only use when reads are frequent and writes are less common."&lt;br /&gt;&lt;br /&gt;You can take a look on his post here: A &lt;a href="http://blogs.msdn.com/pedram/archive/2007/10/07/a-performance-comparison-of-readerwriterlockslim-with-readerwriterlock.aspx"&gt;Performance Comparison of ReaderWriterLockSlim with ReaderWriterLock&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-2196036642310337034?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/2196036642310337034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=2196036642310337034&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2196036642310337034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2196036642310337034'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2008/04/readerwriterlockslim-performance-is-it.html' title='ReaderWriterLockSlim Performance - Is it really so slim??!!!'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-3447217407553444270</id><published>2008-04-14T16:48:00.000+03:00</published><updated>2008-04-14T16:56:46.135+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSS 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Source Safe'/><title type='text'>Open VSS 2005 client without enter user name and password</title><content type='html'>Hi,&lt;br /&gt;If you want to set VSS (Visual Source Safe) 2005 client default user name and password without type them all the time, you have to do the following steps:&lt;br /&gt;1) right click on VSS 2005 client icon&lt;br /&gt;2) select properties&lt;br /&gt;3) on the "target" at the end add your desire user name and pssword as follow: &lt;br /&gt;-Y&lt;user name&gt;,&lt;password&gt;&lt;br /&gt;So you target shuold look like something like:&lt;br /&gt;"C:\Program Files\Microsoft Visual SourceSafe\ssexp.exe" -YMyUser,123456.&lt;br /&gt;&lt;br /&gt;This will open your source safe client with current user without opening the user password screen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-3447217407553444270?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/3447217407553444270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=3447217407553444270&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/3447217407553444270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/3447217407553444270'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2008/04/open-vss-2005-client-without-enter-user.html' title='Open VSS 2005 client without enter user name and password'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-9044875394131538550</id><published>2008-04-13T09:47:00.000+03:00</published><updated>2008-04-13T09:50:29.272+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LINQ to SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2008 add-in'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>LINQ to SQL Visual LINQ Query Builder Visual Studio 2008 Add-In</title><content type='html'>Visual LINQ Query Builder is an add-in to Visual Studio 2008 Designer that helps you visually build LINQ to SQL queries. Functionally it provides the same experience as, for instance the Microsoft Access Query Builder, but in the LINQ domain.&lt;br /&gt;You can read more here:&lt;br /&gt;&lt;a href="http://code.msdn.microsoft.com/vlinq/"&gt;LINQ to SQL Visual LINQ Query Builder&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-9044875394131538550?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/9044875394131538550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=9044875394131538550&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/9044875394131538550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/9044875394131538550'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2008/04/linq-to-sql-visual-linq-query-builder.html' title='LINQ to SQL Visual LINQ Query Builder Visual Studio 2008 Add-In'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-5212563838965975224</id><published>2008-02-03T07:56:00.000+02:00</published><updated>2008-02-03T07:59:09.980+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflector'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Tools'/><title type='text'>.NET Reflector add-ins</title><content type='html'>.NET Reflector has a lot of useful add-ins. The list of all the add-ins can be found in CodePlex under the link below:&lt;br /&gt;&lt;a href="http://www.codeplex.com/reflectoraddins"&gt;.NET Reflector add-ins&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-5212563838965975224?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/5212563838965975224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=5212563838965975224&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/5212563838965975224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/5212563838965975224'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2008/02/net-reflector-add-ins.html' title='.NET Reflector add-ins'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-1358423352956531339</id><published>2007-11-04T22:22:00.000+02:00</published><updated>2007-11-04T23:04:36.255+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Stored Procs performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic SQL'/><title type='text'>Stored Procs performance are better then Dynamic SQL. Is it A myth?</title><content type='html'>People still thinks Stored Procedures are faster, even if there is much evidence that shows otherwise.&lt;br /&gt;&lt;br /&gt;Andres Aguiar's wrote is his blog that: "Fortunately, when they go and ask the LinQ for SQL/Entities team they get the same answer than they get from me. They are not.&lt;br /&gt;"&lt;br /&gt;&lt;br /&gt;To add more evidence, a couple of weeks ago he was in Redmond in a meeting with the ADO.NET team, and a Tech Lead from that team wrote the code below and said 'this is the fastest way to execute this SQL sentence with the .NET framework today'.&lt;br /&gt;&lt;br /&gt;SqlCommand cmd = sqlConnection.CreateCommand();&lt;br /&gt;cmd.CommandText = @"&lt;br /&gt;       SELECT Sales PersonId, FirstName, HireDate&lt;br /&gt;       FROM SalesPerson as sp&lt;br /&gt;       INNER JOIN Employee AS e ON sp.SalesPersonID = e.EmployeeID&lt;br /&gt;       INNER JOIN Contact AS c ON e.EmployeeID = c.ContactID&lt;br /&gt;       WHERE e.HireDate &lt; @date";&lt;br /&gt;cmd.Parameters.AddWithValue("@date", date");&lt;br /&gt;&lt;br /&gt;DbDataReader r = cmd.ExecuteReader();&lt;br /&gt;&lt;br /&gt;Why is this _faster_ than a stored procedure? Because the SQL Server engine could select a better execution plan depending on the value of the @date parameter.&lt;br /&gt;&lt;br /&gt;Even in that room there was people that were surprised.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;So here are some points why not using stored procedures:&lt;/strong&gt;&lt;br /&gt;1. Stored Procedures are written in big iron database "languages" like PL/SQL (Oracle) or T-SQL (Microsoft). These so-called languages are archaic, and full of the crazy, incoherent design choices that always result from the torturous evolution of ten years of backwards compatibility. You really don't want to be writing a lot of code in this stuff. For context, JavaScript is a giant step up from PL/SQL or T-SQL.&lt;br /&gt; &lt;br /&gt;2. Stored Procedures typically cannot be debugged in the same IDE you write your UI. Every time I isolate an exception in the procs, I have to stop what I am doing, bust out my copy of Toad, and load up the database packages to see what's going wrong. Frequently transitioning between two totally different IDEs, with completely different interfaces and languages, is not exactly productive. &lt;br /&gt;&lt;br /&gt;3. Stored Procedures don't provide much feedback when things go wrong. Unless the proc is coded interally with weird T-SQL or PL/SQL exception handling, we get cryptic 'errors' returned based on the particular line inside the proc that failed, such as Table has no rows. Uh, ok? &lt;br /&gt;&lt;br /&gt;4. Stored Procedures can't pass objects. So, if you're not careful, you can end up with a zillion parameters. If you have to populate a table row with 20+ fields using a proc, say hello to 20+ parameters. Worst of all, if I pass a bad parameter-- either too many, not enough, or bad datatypes-- I get a generic "bad call" error. Oracle can't tell me which parameters are in error! So I have to pore over 20 parameters, by hand, to figure out which one is the culprit. &lt;br /&gt;&lt;br /&gt;5. Stored Procedures hide business logic. I have no idea what a proc is doing, or what kind of cursor (DataSet) or values it will return to me. I can't view the source code to the proc (at least, without resorting to #2 if I have appropriate access) to verify that it is actually doing what I think it is-- or what the designer intended it to do. Inline SQL may not be pretty, but at least I can see it in context, alongside the other business logic. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;So why use Stored Procedures at all? Conventional wisdom says we do it because:&lt;/strong&gt;&lt;br /&gt;1. Stored procedures generally result in improved performance because the database can optimize the data access plan used by the procedure and cache it for subsequent reuse. &lt;br /&gt;&lt;br /&gt;2. Stored procedures can be individually secured within the database. A client can be granted permissions to execute a stored procedure without having any permissions on the underlying tables. &lt;br /&gt;&lt;br /&gt;3. Stored procedures result in easier maintenance because it is generally easier to modify a stored procedure than it is to change a hard-coded SQL statement within a deployed component. &lt;br /&gt;&lt;br /&gt;4. Stored procedures add an extra level of abstraction from the underlying database schema. The client of the stored procedure is isolated from the implementation details of the stored procedure and from the underlying schema. &lt;br /&gt;&lt;br /&gt;5. Stored procedures can reduce network traffic, because SQL statements can be executed in batches rather than sending multiple requests from the client. &lt;br /&gt;&lt;br /&gt;one more interesting fact on Stored Procs:&lt;br /&gt;Everyone who thinks stored procedures are pre-compiled, say "Aye!". Whoa, what a noise! For all of you who said "Aye!" a few seconds ago: open SqlServer's Books Online (v7 or v2000, doesn't matter), search for "cache execution plan". You'll find fine articles like "Execution Plan Caching and Reuse" and "SQL Stored Procedures". Let me just quote some lines from the "SQL Stored Procedures" article:&lt;br /&gt;&lt;blockquote&gt;SQL Server 2000 and SQL Server version 7.0 incorporate a number of changes to statement processing that extend many of the performance benefits of stored procedures to all SQL statements. SQL Server 2000 and SQL Server 7.0 do not save a partially compiled plan for stored procedures when they are created. A stored procedure is compiled at execution time, like any other Transact-SQL statement. SQL Server 2000 and SQL Server 7.0 retain execution plans for all SQL statements in the procedure cache, not just stored procedure execution plans.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;So what do you think? Is it a myth? :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-1358423352956531339?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/1358423352956531339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=1358423352956531339&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/1358423352956531339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/1358423352956531339'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/11/net-goodie-2-stored-procs-performance.html' title='Stored Procs performance are better then Dynamic SQL. Is it A myth?'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-6624390530708678456</id><published>2007-11-04T22:02:00.000+02:00</published><updated>2007-11-04T23:04:55.597+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='efficient .NET C# code'/><category scheme='http://www.blogger.com/atom/ns#' term='browser performance'/><category scheme='http://www.blogger.com/atom/ns#' term='c# generics performance'/><title type='text'>.NET goodie #2: High Performance C# Code</title><content type='html'>This article presents helpful tips for writing in-process .NET managed code that performs well. It's assumed that basic programming skills such as factoring control structures, pulling work outside of loops whenever possible, caching variables for reuse, use of the switch statement, and the like are known to the average reader. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Working with Objects and Value Types&lt;/strong&gt;&lt;br /&gt;Objects: A Double Whammy&lt;br /&gt;Objects are expensive to use, partly because of the overhead involved in allocating memory from the heap (which is actually well-optimized in .NET) and partly because every created object must eventually be destroyed. The destruction of an object may take longer than its creation and initialization, especially if the class contains a custom finalization routine. Also, the garbage collector runs in an indeterministic way; there's no guarantee that an object's memory will be immediately reclaimed when it goes out of scope, and until it's collected, this wasted memory can adversely affect performance&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Garbage Collector in a Nutshell&lt;/strong&gt;&lt;br /&gt;It's necessary to understand garbage collection to appreciate the full impact of using objects. The single most important fact to know about the garbage collector is that it divides objects into three "generations": 0, 1, and 2. Every object starts out in generation 0; if it survives (if at least one reference is maintained) long enough, it goes to 1; much later, it transitions to 2. The cost of collecting an object increases with each generation. For this reason, it's important to avoid creating unnecessary objects, and to destroy each reference as quickly as possible. The objects that are left will often be long-lived and won't be destroyed until application shutdown.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Lazy Instantiation/Initialization&lt;/strong&gt;&lt;br /&gt;The Singleton design pattern is often used to provide a single global instance of a class. Sometimes it's the case that a particular singleton won't be needed during an application run. It's generally good practice to delay the creation of any object until it's needed, unless there's a specific need to the contrary - for instance, to pre-cache slow-initializing objects such as database connections. The "double-checked locking" pattern is useful in these situations, as a way to avoid synchronization and still ensure that a needed action is only performed once. Lazy initialization is a technique that can enhance the performance of an entire application through object reduction.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Avoiding Use of Class Destructors&lt;/strong&gt;&lt;br /&gt;Class destructors (implemented as the Finalize() method in VB.NET) cause extra overhead for the garbage collector, because it must track which objects have been finalized before their memory can be reclaimed. I've never had a need for finalizers in a purely managed application. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Casting and Boxing/Unboxing Overhead&lt;/strong&gt;&lt;br /&gt;Casting is the dynamic conversion of a type at runtime to another, and boxing is the creation of a reference wrapper for a value type (unboxing being the conversion back to the wrapped value type). The overhead of both is most heavily felt in collections classes, as they all - with the exception of certain specialized ones like StringDictionary - store each value as an Object. For instance, when you store an Int32 in an ArrayList, it is first boxed (wrapped in an object) when it is inserted; each time the value is read, it is unboxed before it is returned to the calling code. You can use generics to avoid Boxing/Unboxing.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Trusting the Garbage Collector&lt;/strong&gt;&lt;br /&gt;Programmers new to .NET sometimes worry about memory allocation to the point that they explicitly invoke System.GC.Collect(). Garbage collection is a fairly expensive process, and it usually works best when left to its own devices. The .NET garbage collection scheme can intentionally delay reclamation of objects until memory is available, and in particular longer-lived objects (those that make it to generation 1 or 2) may not be reclaimed for an extended period. Even a simple "Hello, world!" console application may allocate 15 MB or more of memory for its "working set." My advice: don't call GC.Collect() unless you really know what you're doing.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Properties, Methods, and Delegates&lt;/strong&gt;&lt;br /&gt;Avoiding Overuse of Property Getters and Setters&lt;br /&gt;Most people don't realize that property getters and setters are similar to methods when it comes to overhead; it's mainly syntax that differentiates them. A non-virtual property getter or setter that contains no instructions other than the field access will be inlined by the compiler, but in many other cases, this isn't possible. You should carefully consider your use of properties; from inside a class, access fields directly (if possible), and never blindly call properties repeatedly without storing the value in a variable. All that said, this doesn't mean that you should use public fields!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;About Delegates&lt;/strong&gt;&lt;br /&gt;Delegates are slower to execute than interface methods. Delegates are often used to introduce a level of indirection in code, but in almost all cases interfaces allow a cleaner design. Of course, it's impossible to completely shun delegates; the entire event-handling paradigm in .NET is based on them. Example 2 compares the performance of delegates and direct method calls.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Minimizing Method Calls&lt;/strong&gt;&lt;br /&gt;The .NET compiler is capable of performing many optimizations for release builds. One of them is called "method inlining." If method A calls method B and certain other conditions are met, such as the code in method B being small enough, the code from B will be copied into A during compilation. However, .NET won't or can't inline certain types of methods, such as virtual methods or methods over a certain size. Each method invocation/property access entails significant overhead, such as the allocation of a stack frame, etc. Of course, you should never repeatedly call a method for the same result on purpose, but you should also be mindful of the impact of method calls in general. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Using the 'Sealed' Keyword&lt;/strong&gt;&lt;br /&gt;Wherever extensibility is not required, you should use the sealed keyword. This makes your design easier to understand, as someone can tell at a glance if a certain class or method isn't meant to be extended or overridden. It also increases the chances that the compiler will inline code. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Working with Collections&lt;/strong&gt;&lt;br /&gt;Avoid Overuse of Collections&lt;br /&gt;This might sound strange, but I'm not advocating working without data structures. The fact is, I've seen collections used many times when they don't actually simplify the code or provide any benefit at all. The single biggest avoidable use of collections is the use of an ArrayList when a simple array would suffice. It should be obvious that there's no way that calling a collection method - which may do significant work under the covers - can compare to something as simple as an array access for performance.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;for vs foreach&lt;/strong&gt;&lt;br /&gt;The rumor abounds that the foreach loop is bad for performance. The truth is actually a little more complicated. Basically, foreach involves no performance penalty when used against arrays. However, when used against lists it involves the same overhead as creating an enumerator and using it within a try/catch block! Ildasm.exe may come in handy here to see what's going on. This isn't a complete killer, but if you do enough list access you may want to avoid it.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Enumerators: Don't Go Overboard&lt;/strong&gt;&lt;br /&gt;Just because the possibility exists for the enumerating of a collection doesn't mean you have to do it. For instance, the ArrayList class is useful as an array replacement; one of its best features is indexed element access. By using an enumerator with ArrayList, you hide its most useful features and introduce needless overhead. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Avoid Overuse of Collection Wrappers&lt;/strong&gt;&lt;br /&gt;A peek at the code in classes such as ArrayList shows that, to implement synchronized, fixed-size, and read-only versions of these, methods such as Synchronized() actually create a new wrapper list around the original one (this scheme was copied from Java). While this is nice from certain design standpoints, it degrades performance; the method-call overhead for each operation is multiplied. For a fixed-size, synchronized ArrayList, this overhead is tripled! Chances are, if you're working with a collection and need synchronization, the code using the collection is already synchronized. In any case, simply locking on the collection itself around every access turns out to be faster than using a synchronized wrapper.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Working With Strings&lt;/strong&gt;&lt;br /&gt;Don't Use String.Format() to Concatenate Strings&lt;br /&gt;While string-formatting routines built into .NET are very useful for globalization and other tasks, they're not meant to be used for appending strings to each other.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Use StringBuilder to Build Strings Inside Loops&lt;/strong&gt;&lt;br /&gt;The StringBuilder class is basically an array list for string fragments; the StringBuilder takes care of expanding its internal char array, hiding this from the user. The use of this class is also specially optimized by the .NET compiler, making it impossible to duplicate this functionality with equivalent performance (for instance, by manipulating char arrays directly and converting to a string afterwards). &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Don't Use StringBuilder to Concatenate Small Numbers of Strings&lt;/strong&gt;&lt;br /&gt;Many .NET developers who consider themselves well-versed in performance matters advocate the use of the StringBuilder class whenever possible. However, it's not the fastest approach for concatenating small numbers of strings. Actually, any number can be combined in a single statement, although the performance benefit tends to dwindle above five or six substrings. This is due to instantiation and destruction overhead for the StringBuilder instance, as well as method-call overhead involved in calling Append() once for every added substring and ToString() once the string is built. What are the alternatives? Plus-sign concatenation and the String.Concat() method are equivalent; I prefer plus signs for readability. Note that this cannot be used across loops because the entire concatenation must occur within a single statement.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Don't Be Afraid to Use String Literals&lt;/strong&gt;&lt;br /&gt;Many developers incorrectly assume that a new object is created for every string literal, and, therefore, avoid their use. In some cases, using string literals directly in your code is a better approach than using string constants! It can make the code easier to understand and has no adverse impact on performance. This is due to the use of the .NET interned string table; this table maintains a String instance for every known string and reuses this instance whenever the same character sequence is used as a literal. See the documentation of the String.Intern() method for more details.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Threading&lt;/strong&gt;&lt;br /&gt;In itself, this is a huge topic. Most easy-to-apply, synchronization-related optimizations focus on minimizing the amount of code executing inside synchronized blocks, which may involve moving some code from inside to outside such blocks. In some cases, thoughtful programming may allow elimination of synchronization entirely from a class (see "Immutable Objects"). &lt;br /&gt;&lt;br /&gt;Performing a multithreaded micro-benchmark is more complicated than running a simple loop. In the simplest method, multiple threads are spawned, each looping over the benchmarked code; the reading is not started until all threads are successfully executing the code, and is terminated before the threads are shut down. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Thread Reuse&lt;/strong&gt;&lt;br /&gt;Newbie programmers make the common mistake of spawning a new thread for every request or other action. This can result in worse performance than using a single-threaded approach; the relative performance degradation is worse the quicker the individual requests can be serviced. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Writing Your Own Threading Code&lt;/strong&gt;&lt;br /&gt;Even better than the .NET thread pool, with its dependence on delegates, is to write your own threading code. Instead of using QueueUserWorkItem(), you typically write your own queueing code to coordinate work items. This also allows other benefits such as priority-based queueing. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Immutable Objects&lt;/strong&gt;&lt;br /&gt;Immutable objects are objects in which the data cannot be changed. In most cases, this is achieved by setting all fields in constructor methods and providing only property getters and/or methods that retrieve data from the object, without any mutator logic whatsoever. Many classes in the .NET Common Type System are immutable: System.String, System. Drawing.Font, etc. In addition, care should be taken that any values returned from property accessors, etc. are immutable as well. Otherwise, this data may be copied to insure the integrity of the object itself. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Data Copying&lt;/strong&gt;&lt;br /&gt;This flies in the face of the advice given earlier, to minimize the use of objects. However, it's really the other side of the coin from immutable objects. Object copying allows you to use the data in a non-immutable object, but in a way that still completely avoids synchronization. The more highly multithreaded the environment, the more strategies like this make sense. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Read-Write Locks&lt;/strong&gt;&lt;br /&gt;Synchronization issues in managed code mirror those in databases. In some situations, optimistic concurrency strategies can be used; in some dirty reads are acceptable, etc. For situations in which a structure is seldom updated and often read, the ReaderWriterLock class can give significant performance benefits over simple synchronization. It allows either multiple read access or single write access at once.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Minimizing Synchronized Blocks&lt;/strong&gt;&lt;br /&gt;The use of the [MethodImpl Attribute(MethodImplOptions.Synchronized)]attribute should be avoided, as it always locks an entire method and is also non-standard C# usage. Instead, the lock keyword or one of the System.Threading classes should be used. Wherever possible, adjust the start of a synchronized section forward and the end backward. Do whatever you can to decrease the number of synchronized operations. &lt;br /&gt;&lt;br /&gt;Hope you find this article interesting. I think it really important to understand and know how to right efficient C# code.&lt;br /&gt;&lt;br /&gt;Yours,&lt;br /&gt;Rock Rotem Bloom&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-6624390530708678456?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/6624390530708678456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=6624390530708678456&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6624390530708678456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6624390530708678456'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/11/high-performance-c-code.html' title='.NET goodie #2: High Performance C# Code'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-8513823130850775142</id><published>2007-11-01T16:32:00.000+02:00</published><updated>2007-11-01T16:45:05.308+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net loop performance'/><title type='text'>.NET goodie #1: Declaring variables inside or outside of a loop impact performance?</title><content type='html'>Did you ever wonder......&lt;br /&gt;Is there any difference in terms of performance between declaring a variable outside of a loop like this...  &lt;br /&gt;&lt;br /&gt;string str = ""; &lt;br /&gt;&lt;br /&gt;for (int i = 0; i &lt; 10; i++)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;   str = "hello";&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...versus declaring the variable within a loop and using it like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;for (int i = 0; i &lt; 10; i++)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;   string str = "hello";&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;So what do you think???!!! The asnwer in this case will be:&lt;br /&gt;&lt;br /&gt;The first example is actually slower, because it causes one more string allocation to occur. In c# the "creation" of variables is always moved to the top of methods in the compiled IL.  Therefore your second example is exactly the same performace as:&lt;br /&gt;&lt;br /&gt; string str;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;for (int i = 0; i &lt; 10; i++)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;   str = "hello";&lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Notice this does not assign an initial value to str of "".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-8513823130850775142?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/8513823130850775142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=8513823130850775142&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/8513823130850775142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/8513823130850775142'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/11/net-goodie-1-declaring-variables-inside.html' title='.NET goodie #1: Declaring variables inside or outside of a loop impact performance?'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-2266265561228521912</id><published>2007-11-01T15:50:00.000+02:00</published><updated>2007-11-01T16:00:08.152+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Format'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQL Formatter, beautified SQL statements</title><content type='html'>Hi,&lt;br /&gt;There is a free SQL formatter that supports several databases like:&lt;br /&gt;oracle, mssql, db2, mysql etc...&lt;br /&gt;&lt;br /&gt;You can take a large SQL statement with parameters and the "SQL Formatter" will beautified the SQL statement for you. It will add line breaks and more.&lt;br /&gt;&lt;br /&gt;You can found the cool SQL Formatter &lt;a href="http://www.gudusoft.com/sqlformatter.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Great tool for SQL debugging.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-2266265561228521912?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/2266265561228521912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=2266265561228521912&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2266265561228521912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2266265561228521912'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/11/sql-formatter-beautified-sql-statements.html' title='SQL Formatter, beautified SQL statements'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-7449594057344315799</id><published>2007-10-30T10:11:00.000+02:00</published><updated>2007-10-30T10:17:55.080+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='prototype.js'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><title type='text'>Cross site Ajax plugin for Prototype</title><content type='html'>Thierry Schellenbach has implemented a Prototype plugin that allows you to do &lt;a href="http://www.mellowmorning.com/2007/10/25/introducing-a-cross-site-ajax-plugin-for-prototype/"&gt;cross site remoting&lt;/a&gt; using the dynamic script tag method that other frameworks such as Dojo and jQuery have supported for awhile.&lt;br /&gt;&lt;br /&gt;You can implement this by simply setting crossSite: true as a config parameter to Ajax.Request.&lt;br /&gt;&lt;br /&gt;Code example:&lt;br /&gt;&lt;br /&gt; new Ajax.Request('myurl', {&lt;br /&gt;   method: 'GET',&lt;br /&gt;   crossSite: true,&lt;br /&gt;   parameters: Form.serialize(obj),&lt;br /&gt;   onLoading: function() {&lt;br /&gt;     //things to do at the start&lt;br /&gt;   },&lt;br /&gt;   onSuccess: function(transport) {&lt;br /&gt;     //things to do when everything goes well&lt;br /&gt;   },&lt;br /&gt;   onFailure: function(transport) {&lt;br /&gt;     //things to do when we encounter a failure&lt;br /&gt;   }&lt;br /&gt; });&lt;br /&gt;the full information can be found on Thierry Schellenbach &lt;a href="http://www.mellowmorning.com"&gt;blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-7449594057344315799?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/7449594057344315799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=7449594057344315799&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/7449594057344315799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/7449594057344315799'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/10/cross-site-ajax-plugin-for-prototype.html' title='Cross site Ajax plugin for Prototype'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-6170643759491834823</id><published>2007-08-07T12:00:00.000+03:00</published><updated>2007-08-07T12:04:43.559+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>JavaScript Image effect library</title><content type='html'>Christian Effenberger wrote nice JavaScript library that let you apply an image mask (in the form of another image) to any image via unobtrusive CSS.&lt;br /&gt;&lt;br /&gt;You can take a peek:&lt;br /&gt;http://www.netzgesta.de/corner/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-6170643759491834823?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/6170643759491834823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=6170643759491834823&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6170643759491834823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6170643759491834823'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/08/javascript-image-effect-library.html' title='JavaScript Image effect library'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-6332774928945931376</id><published>2007-07-17T12:44:00.000+03:00</published><updated>2007-07-17T12:48:56.607+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript accordion'/><category scheme='http://www.blogger.com/atom/ns#' term='prototype.js'/><category scheme='http://www.blogger.com/atom/ns#' term='DHTML Control'/><title type='text'>JavaScript accordion component</title><content type='html'>Kevin Miller wrote nice accordion component that use protoype.js.&lt;br /&gt;The component work both ways horizontal and vertical.&lt;br /&gt;&lt;br /&gt;Information can be found on the link below:&lt;br /&gt;&lt;a href="http://stickmanlabs.com/accordion/"&gt;accordion component&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-6332774928945931376?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/6332774928945931376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=6332774928945931376&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6332774928945931376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6332774928945931376'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/07/javascript-accordion-component.html' title='JavaScript accordion component'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-8322248303127772964</id><published>2007-07-11T10:57:00.000+03:00</published><updated>2007-07-11T11:41:12.122+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript Tooltip'/><category scheme='http://www.blogger.com/atom/ns#' term='Prototype'/><title type='text'>Tooltip effect using Script.aculo.us</title><content type='html'>Nick Stakenburg has written a nice simple tooltip built on Script.aculo.us called &lt;a href="http://www.illustate.com/playground/scriptaculous/tooltip/"&gt;Effect.Tooltip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cool and very simple to use&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-8322248303127772964?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/8322248303127772964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=8322248303127772964&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/8322248303127772964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/8322248303127772964'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/07/tooltip-effect-using-scriptaculous.html' title='Tooltip effect using Script.aculo.us'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-6170152681575423410</id><published>2007-06-24T15:15:00.000+03:00</published><updated>2007-06-24T15:20:05.522+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Debugging javaScript'/><title type='text'>DP_Debug JavaScript Debugging Extensions</title><content type='html'>Jim Davis has released a simple little JavaScript dumping library, &lt;a href="http://www.depressedpress.com/Content/Development/JavaScript/Extensions/DP_DeBug/"&gt; DP_Debug&lt;/a&gt;, that supports circular and recursive references, most system objects and specifies certain otherwise ambiguous conditions.&lt;br /&gt;&lt;br /&gt;In addition the library allows for simple access to Query String and Cookie values and provides basic logging, code timing support and program integration support.&lt;br /&gt;&lt;br /&gt;Full information can be found:&lt;br /&gt;http://www.depressedpress.com/Content/Development/JavaScript/Extensions/DP_DeBug/&lt;br /&gt;:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-6170152681575423410?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/6170152681575423410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=6170152681575423410&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6170152681575423410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6170152681575423410'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/06/dpdebug-javascript-debugging-extensions.html' title='DP_Debug JavaScript Debugging Extensions'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-6099910434411618306</id><published>2007-05-04T18:45:00.000+03:00</published><updated>2007-05-04T18:53:45.791+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX.NET'/><title type='text'>Jayrock JSON and JSON-RPC for .NET</title><content type='html'>&lt;a href="http://jayrock.berlios.de/"&gt;Jayrock&lt;/a&gt; is a modest and an open source implementation of JSON and JSON-RPC for the Microsoft .NET Framework, including ASP.NET. What's so modest about it? Well, modest as in plain and basic and no work of genius.&lt;br /&gt;&lt;br /&gt;A developer creates a helloworld.ashx that contains your server side logic:&lt;br /&gt;&lt;br /&gt;C#:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;namespace JayrockWeb&lt;br /&gt;{&lt;br /&gt;using System;&lt;br /&gt;using System.Web;&lt;br /&gt;using Jayrock.Json;&lt;br /&gt;using Jayrock.JsonRpc;&lt;br /&gt;using Jayrock.JsonRpc.Web;&lt;br /&gt;&lt;br /&gt;public class HelloWorld : JsonRpcHandler&lt;br /&gt;{&lt;br /&gt;[ JsonRpcMethod("greetings") ]&lt;br /&gt;public string Greetings()&lt;br /&gt;{&lt;br /&gt;return "Welcome to Jayrock!";&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Then you can access the file asking for a proxy via helloworld.ashx?proxy and you will see a test page. From code you can now:&lt;br /&gt;&lt;br /&gt;JavaScript:&lt;br /&gt;&lt;br /&gt;var s = new HelloWorld();&lt;br /&gt;&lt;br /&gt;alert("sync:" + s.greetings());&lt;br /&gt;&lt;br /&gt;s.greetings(function(response) {&lt;br /&gt;alert("async:" + response.result) });&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-6099910434411618306?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/6099910434411618306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=6099910434411618306&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6099910434411618306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6099910434411618306'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/05/jayrock-json-and-json-rpc-for-net.html' title='Jayrock JSON and JSON-RPC for .NET'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-1748746812727541750</id><published>2007-04-26T17:48:00.000+03:00</published><updated>2007-04-26T18:00:14.126+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='UpdatePanel; .NET Validators'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX.NET'/><title type='text'>Validators inside UpdatePanel won't work as expected</title><content type='html'>Hi,&lt;br /&gt;If you work with controls such as .NET Validators placed inside an UpdatePanel you probably know they won't work as expected.&lt;br /&gt;&lt;br /&gt;Until Microsoft will solve this issue you can use the "ASP.NET AJAX Validators" that can be download from here:&lt;br /&gt;1) Site 1: http://blogs.msdn.com/mattgi/attachment/1516974.ashx&lt;br /&gt;2) Site 2: http://forums.asp.net/forums/storage/1007/1545781/Validators.zip&lt;br /&gt;&lt;br /&gt;More information on &lt;a href="http://forums.asp.net/thread/1545781.aspx"&gt;asp.net forums&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I hope it helps :-)&lt;br /&gt;Bye Rotem&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-1748746812727541750?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/1748746812727541750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=1748746812727541750&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/1748746812727541750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/1748746812727541750'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/04/validators-inside-updatepanel-wont-work.html' title='Validators inside UpdatePanel won&apos;t work as expected'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-5840423718378835708</id><published>2007-04-26T17:43:00.000+03:00</published><updated>2007-04-26T17:47:39.922+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UpdatePanel'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX.NET'/><title type='text'>Controls that Are Not Compatible with UpdatePanel Controls</title><content type='html'>Hi All,&lt;br /&gt;&lt;p&gt;The following ASP.NET controls are not compatible with partial-page updates, and are therefore not supported inside an &lt;a href="http://ajax.asp.net/docs/mref/T_System_Web_UI_UpdatePanel.aspx"&gt;UpdatePanel&lt;/a&gt; control:&lt;/p&gt;&lt;br /&gt;  &lt;ul&gt;&lt;br /&gt;    &lt;li&gt;&lt;br /&gt;      &lt;p&gt;&lt;br /&gt;        &lt;a href="http://msdn2.microsoft.com/en-us/k5c13faz"&gt;TreeView&lt;/a&gt; and &lt;a href="http://msdn2.microsoft.com/en-us/07b8w058"&gt;Menu&lt;/a&gt; controls.&lt;/p&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;br /&gt;      &lt;p&gt;Web Parts controls. For more information, see &lt;a href="http://msdn2.microsoft.com/en-us/library/ab78a66e-9feb-4391-b3c3-8c07555e2308"&gt;ASP.NET Web Parts Controls&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;br /&gt;      &lt;p&gt;&lt;br /&gt;        &lt;a href="http://msdn2.microsoft.com/en-us/ysf0192b"&gt;FileUpload&lt;/a&gt; controls when they are used to upload files as part of an asynchronous postback. &lt;/p&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;br /&gt;      &lt;p&gt;&lt;br /&gt;        &lt;a href="http://msdn2.microsoft.com/en-us/4w7ya1ts"&gt;GridView&lt;/a&gt; and &lt;a href="http://msdn2.microsoft.com/en-us/7z482d0y"&gt;DetailsView&lt;/a&gt; controls when their EnableSortingAndPagingCallbacks property is set to &lt;span class="keyword"&gt;true&lt;/span&gt;. The default is &lt;span class="keyword"&gt;false&lt;/span&gt;.&lt;/p&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;br /&gt;      &lt;p&gt;&lt;br /&gt;        &lt;a href="http://msdn2.microsoft.com/en-us/t863ehhh"&gt;Login&lt;/a&gt;, &lt;a href="http://msdn2.microsoft.com/en-us/t92zy5x0"&gt;PasswordRecovery&lt;/a&gt;, &lt;a href="http://msdn2.microsoft.com/en-us/s1xhe282"&gt;ChangePassword&lt;/a&gt;, and &lt;a href="http://msdn2.microsoft.com/en-us/6s8b6814"&gt;CreateUserWizard&lt;/a&gt; controls whose contents have not been converted to editable templates.&lt;/p&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;br /&gt;      &lt;p&gt;The &lt;a href="http://msdn2.microsoft.com/en-us/9ze89as6"&gt;Substitution&lt;/a&gt; control.&lt;/p&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;br /&gt;      &lt;p&gt;Validation controls, which includes the &lt;a href="http://msdn2.microsoft.com/en-us/z8fh4ax6"&gt;BaseCompareValidator&lt;/a&gt;, &lt;a href="http://msdn2.microsoft.com/en-us/fczazdzk"&gt;BaseValidator&lt;/a&gt;, &lt;a href="http://msdn2.microsoft.com/en-us/d7365skb"&gt;CompareValidator&lt;/a&gt;, &lt;a href="http://msdn2.microsoft.com/en-us/303z9x0x"&gt;CustomValidator&lt;/a&gt;, &lt;a href="http://msdn2.microsoft.com/en-us/ccs7ftb0"&gt;RangeValidator&lt;/a&gt;, &lt;a href="http://msdn2.microsoft.com/en-us/sffh7429"&gt;RegularExpressionValidator&lt;/a&gt;, &lt;a href="http://msdn2.microsoft.com/en-us/ycxs7t4x"&gt;RequiredFieldValidator&lt;/a&gt;, and &lt;a href="http://msdn2.microsoft.com/en-us/xd4c894c"&gt;ValidationSummary&lt;/a&gt; control.&lt;/p&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;  &lt;/ul&gt;&lt;br /&gt;  &lt;p&gt;Controls that are incompatible with partial-page rendering can still be used on a page outside &lt;a href="http://ajax.asp.net/docs/mref/T_System_Web_UI_UpdatePanel.aspx"&gt;UpdatePanel&lt;/a&gt;&lt;br /&gt;controls. Additionally, in some cases you can use the controls in a&lt;br /&gt;specific way to make them compatible with partial-page updates. For&lt;br /&gt;example, you can use the &lt;a href="http://msdn2.microsoft.com/en-us/t863ehhh"&gt;Login&lt;/a&gt;, &lt;a href="http://msdn2.microsoft.com/en-us/s1xhe282"&gt;ChangePassword&lt;/a&gt;, or &lt;a href="http://msdn2.microsoft.com/en-us/t92zy5x0"&gt;PasswordRecovery&lt;/a&gt; controls inside an &lt;a href="http://ajax.asp.net/docs/mref/T_System_Web_UI_UpdatePanel.aspx"&gt;UpdatePanel&lt;/a&gt;&lt;br /&gt;control if you can convert their contents to templates. (If you are&lt;br /&gt;using Visual Studio, in Design view you can convert the controls by&lt;br /&gt;using smart-tag menu commands such as &lt;span class="ui"&gt;Convert to Template&lt;/span&gt; or &lt;span class="ui"&gt;Customize Create User Step&lt;/span&gt;.)&lt;br /&gt;When you convert these controls into editable templates, the validation&lt;br /&gt;controls that are used in the control are defined declaratively by&lt;br /&gt;using markup in the page. To make the validators compatible with an &lt;a href="http://ajax.asp.net/docs/mref/T_System_Web_UI_UpdatePanel.aspx"&gt;UpdatePanel&lt;/a&gt; control, set the &lt;a href="http://msdn2.microsoft.com/en-us/7t054e90"&gt;EnableClientScript&lt;/a&gt; property of the validators to &lt;span class="keyword"&gt;false&lt;/span&gt;.&lt;br /&gt;This disables the client script that would ordinarily be used to&lt;br /&gt;perform validation in the browser. As a result, during an asynchronous&lt;br /&gt;postback, the validators perform validation on the server. However,&lt;br /&gt;because only the content of the &lt;span class="nolink"&gt;UpdatePanel&lt;/span&gt; is refreshed, the validators can provide the kind of immediate feedback that is ordinarily provided by client script.&lt;/p&gt;&lt;br /&gt;  &lt;p&gt;To use a &lt;a href="http://msdn2.microsoft.com/en-us/ysf0192b"&gt;FileUpload&lt;/a&gt; control inside an &lt;a href="http://ajax.asp.net/docs/mref/T_System_Web_UI_UpdatePanel.aspx"&gt;UpdatePanel&lt;/a&gt; control, set the postback control that submits the file to be a &lt;a href="http://ajax.asp.net/docs/mref/T_System_Web_UI_PostBackTrigger.aspx"&gt;PostBackTrigger&lt;/a&gt; control for the panel.&lt;/p&gt;&lt;br /&gt;  &lt;p&gt;All other controls work inside &lt;a href="http://ajax.asp.net/docs/mref/T_System_Web_UI_UpdatePanel.aspx"&gt;UpdatePanel&lt;/a&gt; controls. However, in some circumstances, a control might not work as expected inside an &lt;a href="http://ajax.asp.net/docs/mref/T_System_Web_UI_UpdatePanel.aspx"&gt;UpdatePanel&lt;/a&gt; control. These circumstances include the following:&lt;/p&gt;&lt;br /&gt;  &lt;ul&gt;&lt;br /&gt;    &lt;li&gt;&lt;br /&gt;      &lt;p&gt;Registering script by calling registration methods of the &lt;a href="http://msdn2.microsoft.com/en-us/0skaxdwf"&gt;ClientScriptManager&lt;/a&gt; control.&lt;/p&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;br /&gt;      &lt;p&gt;Rendering script or markup directly during control rendering, such as by calling the &lt;a href="http://msdn2.microsoft.com/en-us/1463ysyw"&gt;Write(String)&lt;/a&gt; method.&lt;/p&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;  &lt;/ul&gt;&lt;br /&gt;  &lt;p&gt;If the control calls script registration methods of the &lt;a href="http://msdn2.microsoft.com/en-us/0skaxdwf"&gt;ClientScriptManager&lt;/a&gt; control, you could use corresponding script registration methods of the &lt;a href="http://ajax.asp.net/docs/mref/T_System_Web_UI_ScriptManager.aspx"&gt;ScriptManager&lt;/a&gt; control instead. In that case, the control can work inside an &lt;a href="http://ajax.asp.net/docs/mref/T_System_Web_UI_UpdatePanel.aspx"&gt;UpdatePanel&lt;/a&gt; control.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-5840423718378835708?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/5840423718378835708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=5840423718378835708&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/5840423718378835708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/5840423718378835708'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/04/controls-that-are-not-compatible-with.html' title='Controls that Are Not Compatible with UpdatePanel Controls'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-2579013879211696088</id><published>2007-04-14T14:14:00.000+03:00</published><updated>2007-04-14T14:23:44.369+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='cookies'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='Prototype'/><title type='text'>Prototype Library that helps store JSON data in cookies</title><content type='html'>Lalit Patel wrote JavaScript Library that helps to use JSON to store data in cookies.&lt;br /&gt;The nice library is built on top of Prototype and gives you a simple API to put and get JSON values into cookies.&lt;br /&gt;&lt;br /&gt;Full information and download:&lt;br /&gt;&lt;a href="http://www.lalit.org/lab/jsoncookies/"&gt;Yummy JSON Cookies (using Prototype)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Code Example:&lt;/strong&gt;&lt;br /&gt;var jar = new CookieJar({ &lt;br /&gt;     expires:3600,   // seconds  &lt;br /&gt;     path: '/' &lt;br /&gt;});   &lt;br /&gt;&lt;br /&gt;var dog = {name: 'Jacky', breed: 'Alsatian', age:5}; &lt;br /&gt;  &lt;br /&gt;jar.put('mydog', dog); &lt;br /&gt;mydog = jar.get('mydog'); &lt;br /&gt; &lt;br /&gt;alert("My dog's name is " + mydog.name); &lt;br /&gt;alert("He is " + mydog.age + " years old"); &lt;br /&gt;alert("He is an " + mydog.breed);&lt;br /&gt;&lt;br /&gt;Enjoy :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-2579013879211696088?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/2579013879211696088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=2579013879211696088&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2579013879211696088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2579013879211696088'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/04/prototype-library-that-helps-store-json.html' title='Prototype Library that helps store JSON data in cookies'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-2957530006196438244</id><published>2007-03-28T16:21:00.000+02:00</published><updated>2007-03-28T16:31:58.097+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript performance'/><category scheme='http://www.blogger.com/atom/ns#' term='browser performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript memory leak'/><title type='text'>Rules For JavaScript Library Authors</title><content type='html'>Dean Edwards wrote a nice article on "Rules For JavaScript Library Authors".&lt;br /&gt;His main points are:&lt;br /&gt;1) Be unobtrusive: &lt;br /&gt;My HTML doesn’t want to know about your JavaScript&lt;br /&gt;&lt;br /&gt;2) Object.prototype is verboten!&lt;br /&gt;This is so important that it needs a rule all to itself. Objects are the basic building blocks of JavaScript functionality. Don’t mess with them&lt;br /&gt;&lt;br /&gt;3) Do Not Over-extend&lt;br /&gt;The less you extend JavaScript’s built-in objects the better. Don’t get me wrong. Native JavaScript objects are a little sparse on useful methods. You will feel obliged to add one or two of your own. But “one or two” is not enough for the creative (library) programmer. Stop! Just add what you need. The less you extend JavaScript’s built-in objects the less you will clash with other libraries.&lt;br /&gt;&lt;br /&gt;4) Follow Standards&lt;br /&gt;As a library writer you are defining patterns of JavaScript code. Patterns are signs of weakness in programming languages. Remember, JavaScript and the DOM are continually being specified. If you are going to “fix” something then look to see if it has not already been fixed. Consider available solutions. If you follow standards, then follow them closely (e.g. don’t skip a parameter on a forEach method).&lt;br /&gt;&lt;br /&gt;5) Or Follow The Leader&lt;br /&gt;Mozilla leads the way in JavaScript. The creator of the language, Brendan Eich, continues to develop it. New language features are available in Mozilla browsers before any other. If you are going to add language features to JavaScript then look to Mozilla standards first. For example, if you want to extend Array to allow an enumeration method, then call that method forEach instead of each. If you do provide missing language features then follow existing standards closely.&lt;br /&gt;&lt;br /&gt;6) Be Flexible&lt;br /&gt;What if I want to modify behaviour without changing the source code of your library? How easy is that? Not easy enough. Make it easier.&lt;br /&gt;&lt;br /&gt;7) Manage Memory&lt;br /&gt;People care about memory leaks. Do your job&lt;br /&gt;&lt;br /&gt;8) Eliminate Browser Sniffing&lt;br /&gt;It seems that browser vendors will forever compete by adding new features.  As a library author you must keep up with the latest fashions. It is not good enough to browse Ajaxian occasionally. You must slavishly read every blog to find the next hack. Browser sniffing can be addictive&lt;br /&gt;&lt;br /&gt;9) Small is Better&lt;br /&gt;JavaScript libraries have come of age. Some of them now power premier sites. But we are not all on 2MBit DSL lines. So keep your library small. Better yet, provide a build page that allows me to efficiently build my library according to my needs.&lt;br /&gt;&lt;br /&gt;10) The Tenth Rule&lt;br /&gt;Good ol’ tenth rule. You can always rely on the tenth rule. The tenth rule is: be predictable. I should be able to guess what your methods do. And if I don’t know what a method is called then I should be able to guess that too.&lt;br /&gt;&lt;br /&gt;11) Bonus Rules&lt;br /&gt;* Documentation. Annoying but true. &lt;br /&gt;* The more namespacing you use, the less likely I am to remember your phone number. &lt;br /&gt;* Remember that potentially millions of people will be executing your code.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The article is a must read for web 2.0 programmers. &lt;br /&gt;&lt;br /&gt;The full article:&lt;br /&gt;&lt;a href="http://dean.edwards.name/weblog/2007/03/rules/"&gt;Rules For JavaScript Library&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-2957530006196438244?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/2957530006196438244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=2957530006196438244&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2957530006196438244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2957530006196438244'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/03/rules-for-javascript-library-authors.html' title='Rules For JavaScript Library Authors'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-1349473608693876525</id><published>2007-03-28T15:27:00.000+02:00</published><updated>2007-03-28T15:31:38.810+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DHTML Control'/><category scheme='http://www.blogger.com/atom/ns#' term='lightbox'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Popup window'/><title type='text'>Control.Modal: Great CSS Modal Windows and Lightboxes in one package</title><content type='html'>Ryan Johnson has created Control.Modal (CSS modal window based on the Prototype library).&lt;br /&gt;&lt;br /&gt;It weighs in at around 8K and hit a sweet spot for some functionality. The Prototype&lt;br /&gt;window class was overkill, and he needed more than just a lightbox&lt;br /&gt;&lt;br /&gt;Example and source code can be found here: &lt;a href="http://livepipe.net/projects/control_modal/"&gt;Control.Modal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-1349473608693876525?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/1349473608693876525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=1349473608693876525&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/1349473608693876525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/1349473608693876525'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/03/controlmodal-great-css-modal-windows.html' title='Control.Modal: Great CSS Modal Windows and Lightboxes in one package'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-8071970789906785716</id><published>2007-03-19T15:34:00.000+02:00</published><updated>2007-03-19T15:42:09.986+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript performance'/><title type='text'>Efficient looping in Javascript</title><content type='html'>Hi Guys,&lt;br /&gt;I read a great article that talk about the Efficient looping in Javascript.&lt;br /&gt;If you are a big fan of Javascript Libraries like Prototype and Mootools, this article will show you the performance problems of some of these Libraries Iterating like: &lt;br /&gt;Array.each()&lt;br /&gt;Native For-Loop&lt;br /&gt;Native For-In-Loop&lt;br /&gt;Prototype Each-Loop&lt;br /&gt;&lt;br /&gt;etc.....&lt;br /&gt;&lt;br /&gt;&lt;a href="http://solutoire.com/2007/02/02/efficient-looping-in-javascript/"&gt;Efficient looping in Javascript&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-8071970789906785716?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/8071970789906785716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=8071970789906785716&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/8071970789906785716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/8071970789906785716'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/03/efficient-looping-in-javascript.html' title='Efficient looping in Javascript'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-5002097139448155919</id><published>2007-03-19T15:23:00.000+02:00</published><updated>2007-05-04T18:54:19.643+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript Keyboard Support'/><title type='text'>Cross Browser Keyboard Support</title><content type='html'>First here is an excellant article on keystroke detection &lt;a href="http://www.quirksmode.org/js/keys.html"&gt;keystroke detection&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is the code in order to support Cross Browser Keyboard:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;document.onkeydown = function(e) {handleKeys(e)}&lt;br /&gt;document.onkeypress = function(e) {handleKeys(e)}&lt;br /&gt;var nonChar = false;&lt;br /&gt;&lt;br /&gt;function handleKeys(e) {&lt;br /&gt;    var char;&lt;br /&gt;    var evt = (e) ? e : window.event;       //IE reports window.event not arg&lt;br /&gt;    if (evt.type == "keydown") {&lt;br /&gt;        char = evt.keycode;&lt;br /&gt;        if (char &lt; 16 ||                    // non printables&lt;br /&gt;            (char &gt; 16 &amp;&amp; char &lt; 32) ||     // avoid shift&lt;br /&gt;            (char &gt; 32 &amp;&amp; char &lt; 41) ||     // navigation keys&lt;br /&gt;            char == 46) {                   // Delete Key (Add to these if you need)&lt;br /&gt;            handleNonChar(char);            // function to handle non Characters&lt;br /&gt;            nonChar = true;&lt;br /&gt;        } else&lt;br /&gt;            nonChar = false;&lt;br /&gt;    } else {                                // This is keypress&lt;br /&gt;        if (nonChar) return;                // Already Handled on keydown&lt;br /&gt;        char = (evt.charCode) ?&lt;br /&gt;                   evt.charCode : evt.keyCode;&lt;br /&gt;        if (char &gt; 31 &amp;&amp; char &lt; 256)        // safari and opera&lt;br /&gt;            handleChar(char);               //&lt;br /&gt;    }&lt;br /&gt;    if (e)                                  // Non IE&lt;br /&gt;        Event.stop(evt);                    // Using prototype&lt;br /&gt;    else if (evt.keyCode == 8)              // Catch IE backspace&lt;br /&gt;        evt.returnValue = false;            // and stop it!&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-5002097139448155919?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/5002097139448155919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=5002097139448155919&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/5002097139448155919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/5002097139448155919'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/03/cross-browser-keyboard-support.html' title='Cross Browser Keyboard Support'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-339166555001147615</id><published>2007-03-19T15:16:00.000+02:00</published><updated>2007-03-19T15:22:41.944+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='DHTML Control'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>CSS+Javascript Fancy menu</title><content type='html'>If you are looking for cool javascript+CSS menu, you can found one right here on link below:&lt;br /&gt;&lt;a href="http://devthought.com/cssjavascript-true-power-fancy-menu/"&gt;devthought.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I found it when I was surfing and looking for cool javascript and CSS stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-339166555001147615?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/339166555001147615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=339166555001147615&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/339166555001147615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/339166555001147615'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/03/cssjavascript-fancy-menu.html' title='CSS+Javascript Fancy menu'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-8525628234067664658</id><published>2007-03-11T18:54:00.000+02:00</published><updated>2007-03-11T18:59:22.549+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cache'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Cache Manager plug-in for ASP.NET</title><content type='html'>Hi Guys,&lt;br /&gt;&lt;a href="http://aspadvice.com/blogs/ssmith/"&gt;Steven Smith&lt;/a&gt; wrote Cache Manager for an ASP.NET application.&lt;br /&gt;"Cache Manager is an ASP.NET plug-in which can be added to any ASP.NET website with no code, no recompile, a single DLL, and a single entry in web.config. It allows web administrators to monitor and manage the ASP.NET Cache object for their ASP.NET applications."&lt;br /&gt;&lt;br /&gt;More information and download:&lt;br /&gt;&lt;a href="http://aspalliance.com/cachemanager/"&gt;Cache Manager&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hope it will be useful :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-8525628234067664658?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/8525628234067664658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=8525628234067664658&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/8525628234067664658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/8525628234067664658'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/03/cache-manager-plug-in-for-aspnet.html' title='Cache Manager plug-in for ASP.NET'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-4796228488092678512</id><published>2007-03-11T17:59:00.000+02:00</published><updated>2007-03-11T18:03:48.416+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='prototype.js'/><category scheme='http://www.blogger.com/atom/ns#' term='Prototype'/><title type='text'>Compressed versions of Prototype</title><content type='html'>John-David Dalton Compressed some prototype version like:&lt;br /&gt;1.4, 1.5rc0, 1.5rc1, 1.5 final.&lt;br /&gt;His package can be download from:&lt;br /&gt;&lt;a href="http://groups.google.com/group/prototype-core/files"&gt;Compressed prototype&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;He managed to get it down to 14.4kb.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-4796228488092678512?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/4796228488092678512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=4796228488092678512&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/4796228488092678512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/4796228488092678512'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/03/compressed-versions-of-prototype.html' title='Compressed versions of Prototype'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-1614944529036412174</id><published>2007-03-07T20:11:00.000+02:00</published><updated>2007-03-07T20:16:44.683+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><title type='text'>ASP.NET JavaScript IntelliSense</title><content type='html'>A new release of &lt;a href="http://blogs.msdn.com/webdevtools/archive/2007/03/02/jscript-intellisense-in-orcas.aspx"&gt;Visual Studio “Orcas”&lt;/a&gt; shows off the intellisense features nicely, including:&lt;br /&gt;1) Proactive Completion List: No more waiting for ‘.’&lt;br /&gt;2) Keywords in Completion List: fun your way to function&lt;br /&gt;3) ASP.NET AJAX Concepts in Completion List: Direct support for Atlas&lt;br /&gt;4) IntelliSense from Script Libraries for ASPX Pages: Now you can see objects that exist in other external script files.&lt;br /&gt;&lt;br /&gt;This comes along with the release of an updated &lt;a href="http://weblogs.asp.net/pglavich/archive/2007/03/03/ajax-control-toolkit-new-release-and-orcas.aspx"&gt;Ajax Control Toolkit.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;more information:&lt;br /&gt;&lt;a href="http://blogs.msdn.com/webdevtools/archive/2007/03/02/jscript-intellisense-in-orcas.aspx"&gt;blogs.msdn.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-1614944529036412174?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/1614944529036412174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=1614944529036412174&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/1614944529036412174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/1614944529036412174'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/03/aspnet-javascript-intellisense.html' title='ASP.NET JavaScript IntelliSense'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-967377344602390248</id><published>2007-02-18T18:53:00.000+02:00</published><updated>2007-02-18T19:00:11.594+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='multiple versions of IE'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet Explorer'/><title type='text'>How work with multiple versions of IE on your PC</title><content type='html'>Hi,&lt;br /&gt;Ever wanted to test your website in various versions of Internet Explorer?&lt;br /&gt;As a web developer I often want to work with multiple versions of IE on one machine.&lt;br /&gt;&lt;br /&gt;It is possible to run Internet Explorer in standalone mode without having to over-write previous versions thanks to &lt;a href="http://archivist.incutio.com/viewlist/css-discuss/33150"&gt;Joe Maddalone&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Full in formation and download can be found on:&lt;br /&gt;&lt;a href="http://tredosoft.com/Multiple_IE"&gt;TredoSoft&lt;/a&gt; web site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-967377344602390248?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/967377344602390248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=967377344602390248&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/967377344602390248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/967377344602390248'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/02/how-work-with-multiple-versions-of-ie.html' title='How work with multiple versions of IE on your PC'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-1674817413952859691</id><published>2007-02-18T18:47:00.000+02:00</published><updated>2007-02-18T18:52:55.534+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='http traffic'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Compressing http traffic</title><content type='html'>Some nice articles explain about Compressing HTTP traffic:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/05/01/ASPNETPerformance/"&gt;10 Tips for Writing High-Performance Web Applications&lt;/a&gt; look for Tip 9&lt;br /&gt;&lt;br /&gt;&lt;a href="http://support.microsoft.com/?id=322603"&gt;MSDN article on how to configure Internet Information Services (IIS) 5.0 to compress .aspx pages&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dotnetdevs.com/articles/IIS6compression.aspx"&gt;another article about turning on the compression built into IIS6 (over Win 2003).&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-1674817413952859691?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/1674817413952859691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=1674817413952859691&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/1674817413952859691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/1674817413952859691'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/02/compressing-http-traffic.html' title='Compressing http traffic'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-3071534659669730894</id><published>2007-02-18T18:33:00.000+02:00</published><updated>2007-02-18T18:45:21.403+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='browser performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Mozzila'/><title type='text'>JavaScript Performance Validator</title><content type='html'>Hi,&lt;br /&gt;There is great "JavaScript Performance Validator" tool that provides automatic source code performance analysis (profiling) of applications as they run.&lt;br /&gt;Currently the tool works with Mozilla Firefox 1.0.6, Mozilla Firefox 1.5 and Flock 0.7. At present they cannot support Internet Explorer, although they want to support Internet Explorer.&lt;br /&gt;&lt;br /&gt;More information can be found on the company (software verify) web site:&lt;br /&gt;&lt;a href="http://www.softwareverify.com/javascript/profiler/index.html"&gt;JavaScript Performance Validator&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Even if you work with Internet Explorer and your application can also run with Mozilla this tool can help you, because often the performance problems are the same in both browsers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-3071534659669730894?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/3071534659669730894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=3071534659669730894&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/3071534659669730894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/3071534659669730894'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/02/javascript-performance-validator.html' title='JavaScript Performance Validator'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-2908420268729314198</id><published>2007-01-24T01:33:00.000+02:00</published><updated>2007-01-24T01:37:33.409+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><title type='text'>Microsoft announces the ASP.NET Ajax 1.0 Release</title><content type='html'>Microsoft has announced the final 1.0 release of &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/01/23/asp-net-ajax-1-0-released.aspx"&gt;ASP.NET Ajax&lt;/a&gt; (a.k.a. Atlas).&lt;br /&gt;&lt;br /&gt;ASP.NET AJAX Control Toolkit&lt;br /&gt;In addition to the fully-supported ASP.NET AJAX 1.0 release, you can use the more than 30 free ASP.NET AJAX enabled controls available within the &lt;a href="http://ajax.asp.net/ajaxtoolkit/"&gt;ASP.NET AJAX Control Toolkit&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-2908420268729314198?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/2908420268729314198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=2908420268729314198&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2908420268729314198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2908420268729314198'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/01/microsoft-announces-aspnet-ajax-10.html' title='Microsoft announces the ASP.NET Ajax 1.0 Release'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-471791511520366141</id><published>2007-01-11T17:07:00.000+02:00</published><updated>2007-01-11T17:35:19.949+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cross Site Scripting'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='XSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Application Security'/><title type='text'>HttpUtility.HtmlEncode and Server. HtmlEncode do not prevent Cross Site Scripting</title><content type='html'>Do not use: &lt;b&gt;HttpUtility.HtmlEncode&lt;/b&gt; or &lt;b&gt;Server.HtmlEncode&lt;/b&gt; because this functions only encodes &lt;&gt;"&amp;amp; characters. This is not sufficient to protect against all possible attacks.&lt;br /&gt;For instance, the following ASP.NET code would be vulnerable:&lt;br /&gt;&lt;br /&gt;&lt;textarea cols="30" style="width:100%;height:80px" readonly="readonly"&gt;&lt;br /&gt;&lt;img id='img&lt;%=Server.HtmlEncode(Request.QueryString["userId"])%&gt;' src='/image.gif' /&gt;&lt;br /&gt;&lt;br /&gt;An attacker could inject client-side script here by setting userId to:' onload=alert('xss') alt='&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;In order to be fully protected use the method: &lt;b&gt;HtmlEncode&lt;/b&gt; of &lt;a href="http://msdn2.microsoft.com/en-us/security/aa973814.aspx"&gt;Microsoft Anti-Cross Site Scripting Library&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Tutorial that shows you how to use the Microsoft Anti-Cross Site Scripting Library:&lt;br /&gt;http://msdn2.microsoft.com/en-us/library/aa973813.aspx&lt;br /&gt;&lt;br /&gt;Forum:&lt;br /&gt;http://forums.asp.net/1107/ShowForum.aspx.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-471791511520366141?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/471791511520366141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=471791511520366141&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/471791511520366141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/471791511520366141'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2007/01/httputilityhtmlencode-and-server.html' title='HttpUtility.HtmlEncode and Server. HtmlEncode do not prevent Cross Site Scripting'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-3234525680410599452</id><published>2006-12-14T15:57:00.000+02:00</published><updated>2006-12-14T16:09:27.362+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='prototype.js'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Prototype'/><title type='text'>moo.fx javascript effects library for prototype.js or mootools framework.</title><content type='html'>moo.fx is a superlightweight, ultratiny, megasmall javascript effects library, to be used with &lt;a href="http://prototype.conio.net/"&gt;prototype.js&lt;/a&gt; or the &lt;a href="http://mootools.net/"&gt;mootools framework&lt;/a&gt;.&lt;br /&gt;It's very easy to use, blazing fast, cross-browser, standards compliant, provides controls to modify any CSS property of any HTML element, including colors, with builtin checks that won't let a user break the effect with multiple, crazy clicks. Optimized to make you write the lesser code possible, the new moo.fx is so modular you can create any kind of effect with it.&lt;br /&gt;&lt;br /&gt;more information on moo.fx:&lt;br /&gt;&lt;a href="http://moofx.mad4milk.net/"&gt;http://moofx.mad4milk.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-3234525680410599452?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/3234525680410599452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=3234525680410599452&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/3234525680410599452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/3234525680410599452'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2006/12/moofx-javascript-effects-library-for.html' title='moo.fx javascript effects library for prototype.js or mootools framework.'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-6303992694318987148</id><published>2006-12-12T10:36:00.000+02:00</published><updated>2006-12-12T10:45:16.921+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Terminals'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Components'/><category scheme='http://www.blogger.com/atom/ns#' term='Terminal'/><category scheme='http://www.blogger.com/atom/ns#' term='Remote Desktop Connection'/><title type='text'>Terminals the right answer for Remote Desktop Connection</title><content type='html'>2 friends of mine Dudu shmaya and Eyal Post wrote a great tool "Terminals".&lt;br /&gt;"Terminals is a multi tab terminal services/remote desktop client. It uses Terminal Services ActiveX Client (mstscax.dll).The project started from the need of controlling multiple connection simultaneously."&lt;br /&gt;&lt;br /&gt;Download:&lt;a href="http://notsosmartbuilder.blogspot.com/"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/Terminals/Release/ProjectReleases.aspx"&gt;http://www.codeplex.com/Terminals/Release/ProjectReleases.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dudu's Not So Smart Builder Blog:&lt;br /&gt;&lt;a class="externalLink" href="http://notsosmartbuilder.blogspot.com/"&gt;http://notsosmartbuilder.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Eyal's Blog: &lt;br /&gt;&lt;a class="externalLink" href="http://www.epocalipse.com/blog/"&gt;http://www.epocalipse.com/blog/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-6303992694318987148?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/6303992694318987148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=6303992694318987148&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6303992694318987148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6303992694318987148'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2006/12/terminals-right-answer-for-remote.html' title='Terminals the right answer for Remote Desktop Connection'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-6185524171520532661</id><published>2006-12-07T11:41:00.000+02:00</published><updated>2006-12-07T12:02:05.712+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='prototype.js'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Prototype'/><title type='text'>Prototype Event Extension: Event.wheel(e)</title><content type='html'>Frank Monnerjahn created a Prototype Event extension which makes it trivial to use the mouse wheel in Prototype with Event.observe(..).&lt;br /&gt;&lt;a href="http://www.ogonek.net/mousewheel/demo.html"&gt;The demo shows this in action&lt;/a&gt;.&lt;br /&gt;The Code:&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* Orginal: &lt;a href="http://adomas.org/javascript-mouse-wheel/"&gt;http://adomas.org/javascript-mouse-wheel/&lt;/a&gt;&lt;br /&gt;* prototype extension by "Frank Monnerjahn" themonnie @gmail.com&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#006600;"&gt;extend&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;Event, &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;wheel:&lt;span style="FONT-WEIGHT: bold;color:#003366;" &gt;function&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;event&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;color:#003366;" &gt;var&lt;/span&gt; delta = &lt;span style="color:#800000;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;color:#000066;" &gt;if&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;!event&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt; event = window.&lt;span style="color:#006600;"&gt;event&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;color:#000066;" &gt;if&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;event.&lt;span style="color:#006600;"&gt;wheelDelta&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;delta = event.&lt;span style="color:#006600;"&gt;wheelDelta&lt;/span&gt;/&lt;span style="color:#800000;"&gt;120&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;color:#000066;" &gt;if&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;window.&lt;span style="color:#006600;"&gt;opera&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt; delta = -delta;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;}&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold;color:#000066;" &gt;else&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold;color:#000066;" &gt;if&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;event.&lt;span style="color:#006600;"&gt;detail&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;{&lt;/span&gt; delta = -event.&lt;span style="color:#006600;"&gt;detail&lt;/span&gt;/&lt;span style="color:#800000;"&gt;3&lt;/span&gt;; &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;color:#000066;" &gt;return&lt;/span&gt; Math.&lt;span style="color:#006600;"&gt;round&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;delta&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;; &lt;span style="FONT-STYLE: italic;color:#009900;" &gt;//Safari Round&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;}&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic;color:#009900;" &gt;/*&lt;br /&gt;&lt;br /&gt;* end of extension&lt;br /&gt;&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="FONT-WEIGHT: bold;color:#003366;" &gt;var&lt;/span&gt; counterSite=&lt;span style="color:#800000;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;color:#003366;" &gt;function&lt;/span&gt; handleSite&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;e&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;counterSite += Event.&lt;span style="color:#006600;"&gt;wheel&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;e&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;$&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;&lt;span style="color:#3366cc;"&gt;'delta'&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;.&lt;span style="color:#006600;"&gt;innerHTML&lt;/span&gt; = counterSite +&lt;span style="color:#3366cc;"&gt;'#'&lt;/span&gt;+ Event.&lt;span style="color:#006600;"&gt;wheel&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;e&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt; + &lt;span style="color:#3366cc;"&gt;": "&lt;/span&gt; + &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;Event.&lt;span style="color:#006600;"&gt;wheel&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;e&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt; &amp;amp;lt;&lt;span style="color:#800000;"&gt;0&lt;/span&gt; ? &lt;span style="color:#3366cc;"&gt;'down'&lt;/span&gt; : &lt;span style="color:#3366cc;"&gt;'up'&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;}&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="FONT-WEIGHT: bold;color:#003366;" &gt;var&lt;/span&gt; counterDIV=&lt;span style="color:#800000;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;color:#003366;" &gt;function&lt;/span&gt; handleDIV&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;e&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;counterDIV += Event.&lt;span style="color:#006600;"&gt;wheel&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;e&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;$&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;&lt;span style="color:#3366cc;"&gt;'divdelta'&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;.&lt;span style="color:#006600;"&gt;innerHTML&lt;/span&gt; = counterDIV +&lt;span style="color:#3366cc;"&gt;'#'&lt;/span&gt;+ Event.&lt;span style="color:#006600;"&gt;wheel&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;e&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt; + &lt;span style="color:#3366cc;"&gt;": "&lt;/span&gt; + &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;Event.&lt;span style="color:#006600;"&gt;wheel&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;e&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt; &amp;amp;lt;&lt;span style="color:#800000;"&gt;0&lt;/span&gt; ? &lt;span style="color:#3366cc;"&gt;'down'&lt;/span&gt; : &lt;span style="color:#3366cc;"&gt;'up'&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;}&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Usage:&lt;/b&gt;&lt;br /&gt;Event.&lt;span style="color:#006600;"&gt;observe&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;document, &lt;span style="color:#3366cc;"&gt;"mousewheel"&lt;/span&gt;, handleSite, &lt;span style="FONT-WEIGHT: bold;color:#003366;" &gt;false&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;Event.&lt;span style="color:#006600;"&gt;observe&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;document, &lt;span style="color:#3366cc;"&gt;"DOMMouseScroll"&lt;/span&gt;, handleSite, &lt;span style="FONT-WEIGHT: bold;color:#003366;" &gt;false&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;; &lt;span style="FONT-STYLE: italic;color:#009900;" &gt;// Firefox&lt;/span&gt; &lt;/p&gt;&lt;div class="syntax_hilite"&gt;&lt;div id="javascript-2"&gt;&lt;div class="javascript"&gt;&lt;p&gt;Event.&lt;span style="color:#006600;"&gt;observe&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;$&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;&lt;span style="color:#3366cc;"&gt;'divdelta'&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;, &lt;span style="color:#3366cc;"&gt;"mousewheel"&lt;/span&gt;, handleDIV, &lt;span style="FONT-WEIGHT: bold;color:#003366;" &gt;false&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;Event.&lt;span style="color:#006600;"&gt;observe&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;$&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;(&lt;/span&gt;&lt;span style="color:#3366cc;"&gt;'divdelta'&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;, &lt;span style="color:#3366cc;"&gt;"DOMMouseScroll"&lt;/span&gt;, handleDIV, &lt;span style="FONT-WEIGHT: bold;color:#003366;" &gt;false&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;color:#006600;" &gt;)&lt;/span&gt;; &lt;span style="FONT-STYLE: italic;color:#009900;" &gt;// Firefox&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-6185524171520532661?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/6185524171520532661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=6185524171520532661&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6185524171520532661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6185524171520532661'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2006/12/prototype-event-extension-eventwheele.html' title='Prototype Event Extension: Event.wheel(e)'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-5187580435212089115</id><published>2006-12-03T17:37:00.000+02:00</published><updated>2006-12-03T17:48:58.056+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='innerHTML'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript performance'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='browser performance'/><category scheme='http://www.blogger.com/atom/ns#' term='W3C DOM'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>W3C DOM vs. innerHTML performance</title><content type='html'>On of the most important issue developer has to think of when he writes WEB 2.0, AJAX application is JavaScript and browser performance.&lt;br /&gt;I found great test page that intended to find out which method of generating large amounts of content is fastest in the browsers. Of course the results differ significantly from browser to browser.&lt;br /&gt;&lt;a href="http://www.quirksmode.org/dom/innerhtml.html"&gt;W3C DOM vs. innerHTML&lt;/a&gt;&lt;br /&gt;I hope this link will help improve your client code performance.&lt;br /&gt;&lt;br /&gt;More information on JavaScript performance can be on:&lt;br /&gt;&lt;a href="http://blogs.msdn.com/ie/archive/2006/11/16/ie-javascript-performance-recommendations-part-2-javascript-code-inefficiencies.aspx"&gt;The Microsoft Internet Explorer Weblog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-5187580435212089115?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/5187580435212089115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=5187580435212089115&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/5187580435212089115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/5187580435212089115'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2006/12/w3c-dom-vs-innerhtml-performance.html' title='W3C DOM vs. innerHTML performance'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-8567428363699347509</id><published>2006-12-03T17:34:00.000+02:00</published><updated>2006-12-03T17:36:45.581+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Components'/><title type='text'>Unlocker the tool for you</title><content type='html'>Cannot delete file: Access is denied&lt;br /&gt;There has been a sharing violation.&lt;br /&gt;The source or destination file may be in use.&lt;br /&gt;The file is in use by another program or user.&lt;br /&gt;Make sure the disk is not full or write-protected and that the file is not currently in use.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Unlocker is the solution for you&lt;/b&gt;&lt;br /&gt;Download and information:&lt;br /&gt;&lt;a href="http://ccollomb.free.fr/unlocker/"&gt;Unlocker&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-8567428363699347509?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/8567428363699347509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=8567428363699347509&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/8567428363699347509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/8567428363699347509'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2006/12/unlocker-tool-for-you.html' title='Unlocker the tool for you'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-5772136472792118739</id><published>2006-12-03T17:14:00.000+02:00</published><updated>2006-12-03T17:20:01.165+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Components'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Tools and Software Components for the .NET Framework</title><content type='html'>Every developer loves Tools and Software Components that make his life easier.&lt;br /&gt;On of the most updated list of tools, that also explain each on of them, can be found under:&lt;br /&gt;http://www.dotnetframework.de/dotnet/produkte/tools.aspx?t=tools&amp;kat=&lt;br /&gt;&lt;br /&gt;Enjoy :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-5772136472792118739?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/5772136472792118739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=5772136472792118739&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/5772136472792118739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/5772136472792118739'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2006/12/tools-and-software-components-for-net.html' title='Tools and Software Components for the .NET Framework'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-4210154043722337603</id><published>2006-12-03T17:03:00.000+02:00</published><updated>2006-12-03T17:12:34.941+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Internet Explorer'/><category scheme='http://www.blogger.com/atom/ns#' term='IE'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript memory leak'/><title type='text'>Understanding and Solving Internet Explorer Leak</title><content type='html'>Hi,&lt;br /&gt;Web 2.0 application use a lot of JavaScript code, so it's really important to understand how to write your JavaScript code in order to avoid browser memory leaks.&lt;br /&gt;Great MSDN article on this issue can be found:&lt;br /&gt;http://msdn2.microsoft.com/en-us/library/aa701095.aspx&lt;br /&gt;&lt;br /&gt;More information can be found:&lt;br /&gt;http://simon.incutio.com/slides/2006/etech/javascript/js-reintroduction-notes.html#memoryleaks&lt;br /&gt;&lt;br /&gt;Drip is a nice tool that help find IE memory leaks:&lt;br /&gt;http://outofhanwell.com/ieleak/index.php?title=Main_Page&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-4210154043722337603?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/4210154043722337603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=4210154043722337603&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/4210154043722337603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/4210154043722337603'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2006/12/understanding-and-solving-internet.html' title='Understanding and Solving Internet Explorer Leak'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-2471592614616609069</id><published>2006-12-03T16:58:00.000+02:00</published><updated>2006-12-03T17:01:31.216+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='prototype.js'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Prototype'/><title type='text'>Developer Notes for prototype.js</title><content type='html'>Hi,&lt;br /&gt;Here is a great link that have full explanation on prototype.js, can used as Developer Notes.&lt;br /&gt;http://www.sergiopereira.com/articles/prototype.js.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-2471592614616609069?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/2471592614616609069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=2471592614616609069&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2471592614616609069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/2471592614616609069'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2006/12/developer-notes-for-prototypejs.html' title='Developer Notes for prototype.js'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-170949782470110683</id><published>2006-12-03T16:42:00.000+02:00</published><updated>2006-12-03T16:50:22.624+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Prototype'/><title type='text'>JavaScript AJAX framework prototype dissected</title><content type='html'>Detail every method and property that was available on prototype AJAX framwork:&lt;br /&gt;http://snook.ca/archives/javascript/prototype_disse/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-170949782470110683?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/170949782470110683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=170949782470110683&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/170949782470110683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/170949782470110683'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2006/12/javascript-ajax-framework-prototype.html' title='JavaScript AJAX framework prototype dissected'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-3087112620243679123</id><published>2006-11-28T17:04:00.000+02:00</published><updated>2006-11-28T18:05:55.021+02:00</updated><title type='text'>How to add JavaScript and CSS file declaration in ASP.NET 2.0 head tag</title><content type='html'>Code example in C# that show how to add JavaScript and CSS file declaration to ASP.NET runat server tag:&lt;br /&gt;&lt;br /&gt;private const string JavaScriptIncludeTemplate = "script language='JavaScript' src='{0}' type='text/javascript' /script";&lt;br /&gt;&lt;/per&gt;&lt;br /&gt;string includeLocation;&lt;br /&gt;includeLocation = System.Web.VirtualPathUtility.ToAbsolute("~/JS/Test.js");&lt;br /&gt;&lt;br /&gt;// Check that we have header runat=server on page&lt;br /&gt;if ((System.Web.UI.HtmlControls.HtmlHead)Page.Header != null)&lt;br /&gt;{&lt;br /&gt;// Look if file declaration not already exist in page&lt;br /&gt;if (((System.Web.UI.HtmlControls.HtmlHead)Page.Header).FindControl(key) == null)&lt;br /&gt;{&lt;br /&gt;LiteralControl include = new LiteralControl(String.Format(JavaScriptIncludeTemplate, includeLocation));&lt;br /&gt;include.ID = key;&lt;br /&gt;&lt;br /&gt;// Add the file declaration to page&lt;br /&gt;// You can also use Controls.AddAt(addAt, include) to control the order of the JS file registration.&lt;br /&gt;((System.Web.UI.HtmlControls.HtmlHead)Page.Header).Controls.Add(include);&lt;br /&gt;}&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-3087112620243679123?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/3087112620243679123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=3087112620243679123&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/3087112620243679123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/3087112620243679123'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2006/11/how-to-add-javascript-and-css-file.html' title='How to add JavaScript and CSS file declaration in ASP.NET 2.0 head tag'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4153375873639804201.post-6713876603016389209</id><published>2006-11-28T16:27:00.000+02:00</published><updated>2006-11-28T17:01:35.859+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Prototype'/><title type='text'>JavaScript actsAsAspect</title><content type='html'>&lt;p&gt;&lt;br /&gt;The idea is that you run actsAsAspect() on any JavaScript object,&lt;br /&gt;and then your object receives 3 extra methods: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;before()&lt;/li&gt;&lt;li&gt;after()&lt;/li&gt;&lt;li&gt;around()&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;You then can use those methods to setup the callbacks you need.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The Code:&lt;br /&gt;function actsAsAspect(object) {&lt;br /&gt;object.yield = null;&lt;br /&gt;object.rv = { };&lt;br /&gt;object.before = function(method, f)&lt;br /&gt;{&lt;br /&gt;var original = eval("this." + method);&lt;br /&gt;this[method] = function()&lt;br /&gt;{&lt;br /&gt;this.rv[method] = f.apply(this, arguments);&lt;br /&gt;if (this.rv[method] == false)&lt;br /&gt;return false;&lt;br /&gt;return original.apply(this, arguments);&lt;br /&gt;};&lt;br /&gt;};&lt;br /&gt;object.after = function(method, f)&lt;br /&gt;{&lt;br /&gt;var original = eval("this." + method);&lt;br /&gt;this[method] = function()&lt;br /&gt;{&lt;br /&gt;this.rv[method] = original.apply(this, arguments);&lt;br /&gt;return f.apply(this, arguments);&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;object.around = function(method, f)&lt;br /&gt;{&lt;br /&gt;var original = eval("this." + method);&lt;br /&gt;this[method] = function() {&lt;br /&gt;this.yield = original;&lt;br /&gt;return f.apply(this, arguments);&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;Example: Applying actsAsAspect() to &lt;strong&gt;window&lt;/strong&gt;&lt;/p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;p&gt;&lt;br /&gt;actsAsAspect(window);&lt;br /&gt;function haha() { return "HA Ha ha ha..."; }&lt;br /&gt;after('haha', function() { alert(this.rv['haha']); });&lt;br /&gt;haha();&lt;br /&gt;&lt;code&gt;&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;span style="font-size:130%;"&gt;Full information can be found:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://beppu.lbox.org/articles/2006/09/06/actsasaspect"&gt;http://beppu.lbox.org/articles/2006/09/06/actsasaspect&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4153375873639804201-6713876603016389209?l=caught-in-a-web.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caught-in-a-web.blogspot.com/feeds/6713876603016389209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4153375873639804201&amp;postID=6713876603016389209&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6713876603016389209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4153375873639804201/posts/default/6713876603016389209'/><link rel='alternate' type='text/html' href='http://caught-in-a-web.blogspot.com/2006/11/javascript-actsasaspect.html' title='JavaScript actsAsAspect'/><author><name>Rotem Bloom</name><uri>http://www.blogger.com/profile/13853376077098966515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/x/blogger2/3369/507003890825171/320/435233/P1010006.jpg'/></author><thr:total>0</thr:total></entry></feed>
