﻿<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>Ayende @ Rahien</title><link>https://ayende.com/blog/</link><description>Ayende @ Rahien</description><copyright>Copyright (C) Ayende Rahien  2004 - 2021 (c) 2026</copyright><ttl>60</ttl><item><title>Error handling in the field</title><description>&lt;p&gt;I&amp;rsquo;m not talking about this much anymore, but alongside RavenDB, &lt;a href="https://hibernatingrhinos.com/#products"&gt;my company&lt;/a&gt; produces a set of tools to help you work with OR/M (object relational mappers) such as &lt;a href="https://hibernatingrhinos.com/products/nhprof"&gt;NHibernate&lt;/a&gt; or &lt;a href="https://hibernatingrhinos.com/products/efprof"&gt;Entity Framework&lt;/a&gt; as well as tracking what is going on with &lt;a href="https://hibernatingrhinos.com/products/cosmosdbprof"&gt;Cosmos DB&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The profilers are implemented as two separate components. We have the &lt;em&gt;Appender&lt;/em&gt;, which runs inside the profiled process, and the &lt;em&gt;Profiler&lt;/em&gt;, which is a WPF application that analyzes and shows you the results of the profiling. For the profilers, all the execution is done on the users&amp;rsquo; machine.&lt;/p&gt;
&lt;p&gt;We have crash reporting enabled and we are diligent in fixing any and all errors from the field. We recently ran into a whole &lt;em&gt;spate&lt;/em&gt; of errors, looking something like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Windows.Controls.VirtualizingStackPanel.UpdateExtent(Boolean areItemChangesLocal)
   at System.Windows.Controls.VirtualizingStackPanel.ShouldItemsChangeAffectLayoutCore(Boolean areItemChangesLocal, ItemsChangedEventArgs args)
   at System.Windows.Controls.VirtualizingPanel.OnItemsChangedInternal(Object sender, ItemsChangedEventArgs args)
   at System.Windows.Controls.Panel.OnItemsChanged(Object sender, ItemsChangedEventArgs args)
   at System.Windows.Controls.ItemContainerGenerator.OnItemAdded(Object item, Int32 index, NotifyCollectionChangedEventArgs collectionChangedArgs)
   at System.Windows.Controls.ItemContainerGenerator.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args)
   at System.Windows.WeakEventManager.ListenerList`1.DeliverEvent(Object sender, EventArgs e, Type managerType)
   at System.Windows.WeakEventManager.DeliverEvent(Object sender, EventArgs args)
   at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
   at System.Windows.Data.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
   at System.Windows.WeakEventManager.ListenerList`1.DeliverEvent(Object sender, EventArgs e, Type managerType)
   at System.Windows.WeakEventManager.DeliverEvent(Object sender, EventArgs args)
   at System.Windows.Data.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
   at System.Windows.Data.ListCollectionView.ProcessCollectionChangedWithAdjustedIndex(NotifyCollectionChangedEventArgs args, Int32 adjustedOldIndex, Int32 adjustedNewIndex)
   at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
   at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
   at Caliburn.Micro.BindableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
   at System.Collections.ObjectModel.ObservableCollection`1.InsertItem(Int32 index, T item)
   at Caliburn.Micro.BindableCollection`1.OnUIThread(Action action)
   at HibernatingRhinos.Profiler.Client.Sessions.SessionListModel.Add(SessionModel model)&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;And here is the relevant code:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://ayende.com/blog/Images/Open-Live-Writer/3a1239dc9742_8C7C/image_2.png"&gt;&lt;img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/3a1239dc9742_8C7C/image_thumb.png" alt="image" width="364" height="87" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is called from a timer thread (not from the UI) one, and the Items collection in this case is a BindableCollection&amp;lt;T&amp;gt;.&lt;/p&gt;
&lt;p&gt;The error is happening deep in the guts of WPF and it seems like it has been triggered by some recent Windows update. Here is the &amp;ldquo;fix&amp;rdquo; for this issue:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ayende.com/blog/Images/Open-Live-Writer/3a1239dc9742_8C7C/image_6.png"&gt;&lt;img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/3a1239dc9742_8C7C/image_thumb_2.png" alt="image" width="967" height="135" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Basically, &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; report this error, and continue executing normally (the next UI operation will fix the UI state, usually within &amp;lt; 200 ms).&lt;/p&gt;
&lt;p&gt;This is the right call in terms of development time and effort, but I got to say, this makes me feel quite uncomfortable to see a change like that.&lt;/p&gt;</description><link>https://ayende.com/blog/198369-A/error-handling-in-the-field?Key=f638ff2f-5a7a-484a-b493-9154e1942416</link><guid>https://ayende.com/blog/198369-A/error-handling-in-the-field?Key=f638ff2f-5a7a-484a-b493-9154e1942416</guid><pubDate>Mon, 17 Oct 2022 12:00:00 GMT</pubDate></item><item><title>NHibernate Profiler video</title><description>&lt;iframe width="1280" height="720" src="https://www.youtube.com/embed/MTaSR-VkEiM" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;</description><link>https://ayende.com/blog/193123-A/nhibernate-profiler-video?Key=a8dd61e5-a2ff-435e-9c1f-9f5072688ae9</link><guid>https://ayende.com/blog/193123-A/nhibernate-profiler-video?Key=a8dd61e5-a2ff-435e-9c1f-9f5072688ae9</guid><pubDate>Wed, 17 Feb 2021 12:00:00 GMT</pubDate></item><item><title>Entity Framework Profiler video</title><description>&lt;iframe width="1280" height="720" src="https://www.youtube.com/embed/r0CH5iptaoQ" frameborder="0" allowfullscreen="" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"&gt;&lt;/iframe&gt;</description><link>https://ayende.com/blog/193122-A/entity-framework-profiler-video?Key=06ec8e06-6e64-4dff-8a8f-4cf486ef7f4d</link><guid>https://ayende.com/blog/193122-A/entity-framework-profiler-video?Key=06ec8e06-6e64-4dff-8a8f-4cf486ef7f4d</guid><pubDate>Tue, 16 Feb 2021 12:00:00 GMT</pubDate></item><item><title>NHibernate Profiler &amp; Entity Framework Profiler 6.0 RTMed!</title><description>&lt;p&gt;I&amp;rsquo;m very happy to announce that we have recently released version 6.0 of &lt;a href="https://hibernatingrhinos.com/products/efprof"&gt;Entity Framework Profiler&lt;/a&gt; and &lt;a href="https://hibernatingrhinos.com/products/nhprof"&gt;NHibernate Profiler&lt;/a&gt;. Here are some of the highlights:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ayende.com/blog/Images/Open-Live-Writer/NHibernate-Profiler--Entity-Fram.0-RTMed_E7CE/image_2.png"&gt;&lt;img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/NHibernate-Profiler--Entity-Fram.0-RTMed_E7CE/image_thumb.png" alt="image" width="1127" height="253" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This new version brings quite a lot to the table. We applied a lot of lessons to optimize the performance of the profiler so it can process events faster and in a more efficient manner. We also fully integrated it with the async/await model that became so popular. For Entity Framework users, we now support all versions of EF, running on .NET 4.7 all the way to .NET 5.0 and anything in between.&lt;/p&gt;
&lt;p&gt;What I think is the crown jewels of this release, however, is the new Azure integration feature. We initially built this feature to allow you to profiler serverless code and Azure Functions, but it turned out that this is &lt;em&gt;really &lt;/em&gt;useful.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://hibernatingrhinos.com/products/efprof/learn#AzureStorageChannel"&gt;Profiler Azure Integration&lt;/a&gt; allows you to setup a storage container on Azure that would accept the profiled output from your application. Pretty simple, right? The profiler application will monitor the container and show you the events as they are written, so even if you don&amp;rsquo;t have direct access to profiler the code (very common on serverless / Azure scenarios), you can still profiler your code. That helps a lot as well when talking about running inside containers, Kubernetes, etc. The usual way the profiler and the application communicate is over a TCP channel, but given the myriad of network topologies that are now in common use, this can get complex. By utilizing Azure Integration, we can resolve the whole solution and give you a seamless way to handle profile your code.&lt;/p&gt;
&lt;p&gt;On demand profiling of your code is just one part of the new feature. You can now do &lt;em&gt;continuous profiling &lt;/em&gt;of your system.&lt;em&gt;&amp;nbsp;&lt;/em&gt;Because we throw the events into a blob container in Azure, and given that the data is compressed and &lt;em&gt;cheap&lt;/em&gt; to store, you can now afford to simply record all the queries in your application and come back to it a few days or weeks later and look into interesting behaviors.&lt;/p&gt;
&lt;p&gt;That is also a large part of why we worked on improving our performance, we expect to be dealing with a &lt;em&gt;lot &lt;/em&gt;of data&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You are also able to specify a certain timeframe for this kind of profiling, as well as specify whatever we should remove the data after looking on it or retain it. The new profiling feature gives you a way to answer: &amp;ldquo;What queries run in production on Monday between 9:17 and 10:22 AM&amp;rdquo;. This comes with all of the usual benefits of the profiler, meaning that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can correlate each query to the exact line of code that triggered it.&lt;/li&gt;
&lt;li&gt;The profiler analyze the database interaction and raise alerts on bad behaviors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The last part is done not on a single query but with access to the full state of the system. It can allow you to find hot spots in your program, patterns of data access that leads to much higher latency and cost a &lt;em&gt;lot&lt;/em&gt; more money.&lt;/p&gt;
&lt;p&gt;To celebrate the new release, we are offering the profilers with 20% discount for the new quarter as well as offer a bundling option. You can get the Entity Framework Profiler or the NHibernate Profiler bundled with our &lt;a href="https://hibernatingrhinos.com/products/CosmosDBProf"&gt;Cosmos DB Profiler&lt;/a&gt;.&lt;/p&gt;</description><link>https://ayende.com/blog/192641-A/nhibernate-profiler-entity-framework-profiler-6-0-rtmed?Key=b5fedcb8-9081-4231-81de-77003169ec38</link><guid>https://ayende.com/blog/192641-A/nhibernate-profiler-entity-framework-profiler-6-0-rtmed?Key=b5fedcb8-9081-4231-81de-77003169ec38</guid><pubDate>Wed, 16 Dec 2020 12:00:00 GMT</pubDate></item><item><title>We’re hiring… come work for us</title><description>&lt;p&gt;&lt;a href="http://ayende.com/blog/Images/Windows-Live-Writer/e31ace4e8272_DCCA/unnamed_2.png"&gt;&lt;img title="unnamed" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: right; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="unnamed" src="http://ayende.com/blog/Images/Windows-Live-Writer/e31ace4e8272_DCCA/unnamed_thumb.png" width="327" align="right" height="188"&gt;&lt;/a&gt; &lt;p&gt;It seems that recently we have been going in rounds. Get more people, train them, and by the time they are trained, we already need more people &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="http://ayende.com/blog/Images/Windows-Live-Writer/e31ace4e8272_DCCA/wlEmoticon-smile_2.png"&gt;. &lt;p&gt;I guess that this is a good problem to have. At any rate, we are currently looking for an experience well rounded developer. &lt;p align="center"&gt;&lt;strong&gt;This job availability is for our offices in Hadera, Israel. If you aren’t from Israel, this isn’t for you&lt;/strong&gt;. &lt;p&gt;This job is primarily for work on our Profilers line of products. Here is the laundry list:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Awesome .NET skills&lt;/li&gt; &lt;li&gt;Experience in UI development using WPF, MVVM style&lt;/li&gt; &lt;li&gt;Understanding how computers work and how to make them dance&lt;/li&gt; &lt;li&gt;History with concurrency &amp;amp; multi threading (concurrent work history not required)&lt;/li&gt; &lt;li&gt;Architecture / design abilities&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I would like to see open source history, or projects that you can share (in other words, &lt;em&gt;your&lt;/em&gt; projects, not employer’s code that you try to give to look at).&lt;/p&gt; &lt;p&gt;Please contact us at &lt;a href="mailto:jobs@hibernatingrhinos.com"&gt;jobs@hibernatingrhinos.com&lt;/a&gt; if you are interested.&lt;/p&gt;</description><link>https://ayende.com/blog/167841/were-hiring-come-work-for-us?Key=44fa96e3-07f3-4a51-8173-8dfcc4ee5bac</link><guid>https://ayende.com/blog/167841/were-hiring-come-work-for-us?Key=44fa96e3-07f3-4a51-8173-8dfcc4ee5bac</guid><pubDate>Wed, 13 Aug 2014 09:42:00 GMT</pubDate></item><item><title>Uber Prof 2.0 is OUT!</title><description>&lt;p&gt;Exactly 4 years after the 1.0 release of Uber Prof, we have the 2.0 release for Uber Prof.&lt;/p&gt; &lt;p&gt;You can find it here: &lt;a href="http://hibernatingrhinos.com/products/"&gt;http://hibernatingrhinos.com/products/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;New features include production and cloud profiling, performance improvement and better error detection &amp;amp; guidance.&lt;/p&gt;</description><link>https://ayende.com/blog/160577/uber-prof-2-0-is-out?Key=98e152f5-2a43-41d9-b560-93304ce79061</link><guid>https://ayende.com/blog/160577/uber-prof-2-0-is-out?Key=98e152f5-2a43-41d9-b560-93304ce79061</guid><pubDate>Tue, 01 Jan 2013 10:00:00 GMT</pubDate></item><item><title>Goodbye, 2012: Our end of year discount starts now!</title><description>&lt;p&gt;Well, as the year draws to a close, it is that time again, I got older, apparently. Yesterday marked my 31th trip around the sun.&lt;/p&gt; &lt;p&gt;To celebrate, I decided to give the first 31 people a &lt;strong&gt;31% discount&lt;/strong&gt; for all of our products.&lt;/p&gt; &lt;p&gt;This offer applies to:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://ravendb.net/licensing"&gt;Raven DB&lt;/a&gt; (Standard edition)&lt;/li&gt; &lt;li&gt;&lt;a href="http://hibernatingrhinos.com/products/nhprof/buy"&gt;NHibernate Profiler&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://hibernatingrhinos.com/products/efprof/buy"&gt;Entity Framework Profiler&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://hibernatingrhinos.com/products/l2sprof/buy"&gt;Linq to SQL Profiler&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://hibernatingrhinos.com/products/llblgenprof/buy"&gt;LLBLGen Profiler&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;This also applies to our support &amp;amp; consulting services.&lt;/p&gt; &lt;p&gt;All you have to do is to use the following coupon code: goodbye-2012&lt;/p&gt; &lt;p&gt;Enjoy the end of the year, and happy holidays.&lt;/p&gt;</description><link>https://ayende.com/blog/160385/goodbye-2012-our-end-of-year-discount-starts-now?Key=3cc53059-f0aa-48ca-ba7f-9131593f0f0a</link><guid>https://ayende.com/blog/160385/goodbye-2012-our-end-of-year-discount-starts-now?Key=3cc53059-f0aa-48ca-ba7f-9131593f0f0a</guid><pubDate>Fri, 21 Dec 2012 05:02:00 GMT</pubDate></item><item><title>Production Cloud Profiling With Uber Prof</title><description>&lt;p&gt;With Uber Prof 2.0 (&lt;a href="http://nhprof.com/"&gt;NHibernate Profiler&lt;/a&gt;, &lt;a href="http://efprof.com/"&gt;Entity Framework Profiler&lt;/a&gt;, &lt;a href="http://l2sprof.com/"&gt;Linq to SQL Profiler&lt;/a&gt;, &lt;a href="http://llblgenprof.com/"&gt;LLBLGen Profiler&lt;/a&gt;) we are going to bring you a new era of goodness.&lt;/p&gt; &lt;p&gt;In 1.0, we gave you a LOT of goodness for the development stage of building your application, but now we are able to take it a few steps further. Uber Prof 2.0 supports production profiling, which means that you can run it &lt;em&gt;in production&lt;/em&gt; and see what is going on &lt;em&gt;in your application now!&lt;/em&gt;&lt;/p&gt; &lt;p&gt;To make things even more interesting, we have also done a lot of work to make sure that this works on the cloud as well. For example, go ahead and look at this site: &lt;a title="http://efprof.cloudapp.net/" href="http://efprof.cloudapp.net/"&gt;http://efprof.cloudapp.net/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is a live application, that doesn’t really do anything special, I’ll admit. But the kicker is when you go to this URL: &lt;a title="http://efprof.cloudapp.net/profiler/profiler.html" href="http://efprof.cloudapp.net/profiler/profiler.html"&gt;http://efprof.cloudapp.net/profiler/profiler.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://ayende.com/blog/Images/Windows-Live-Writer/Cloud-Profiling-With-Uber-Prof_8519/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://ayende.com/blog/Images/Windows-Live-Writer/Cloud-Profiling-With-Uber-Prof_8519/image_thumb.png" width="944" height="315"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is EF Prof, running on the cloud, and giving you the results that you want, &lt;em&gt;live&lt;/em&gt;. You can read all about this feature and &lt;a href="http://blog.hibernatingrhinos.com/12769/uber-prof-production-profilingndash-profiling-production-application-on-azure?key=6fc682a1295942c592ad8f11b18ec185"&gt;how to enable it here&lt;/a&gt;, but I am sure that you can see the implications. &lt;/p&gt;</description><link>https://ayende.com/blog/160321/production-cloud-profiling-with-uber-prof?Key=7504912e-62b1-4a6d-92a6-becb03303035</link><guid>https://ayende.com/blog/160321/production-cloud-profiling-with-uber-prof?Key=7504912e-62b1-4a6d-92a6-becb03303035</guid><pubDate>Tue, 18 Dec 2012 10:00:00 GMT</pubDate></item><item><title>Über Profiler v2.0–Private Beta is open</title><description>&lt;p&gt;Well, it took a while, but the next version of the NHibernate Profiler is ready to go to a private beta.&lt;/p&gt; &lt;p&gt;We go to private beta before the product is done, because we want to get as much early feedback as we can.&lt;/p&gt; &lt;p&gt;We have 10 spots for NHibernate Profiler v2.0 and 10 spots for Entity Framework Profiler v2.0.&lt;/p&gt; &lt;p&gt;If you are interested, please send me an email about this.&lt;/p&gt;</description><link>https://ayende.com/blog/157985/uber-profiler-v2-0-private-beta-is-open?Key=addf4b10-01f6-4b74-8f8f-c643f83b0d43</link><guid>https://ayende.com/blog/157985/uber-profiler-v2-0-private-beta-is-open?Key=addf4b10-01f6-4b74-8f8f-c643f83b0d43</guid><pubDate>Thu, 16 Aug 2012 09:00:00 GMT</pubDate></item><item><title>What is next for the profilers?</title><description>&lt;p&gt;We have been working on the profilers (&lt;a href="http://nhprof.com/"&gt;NHibernate Profiler&lt;/a&gt;, &lt;a href="http://efprof.com/"&gt;Entity Framework Profiler&lt;/a&gt;, &lt;a href="http://l2sprof.com/"&gt;Linq to SQL Profiler&lt;/a&gt;, &lt;a href="http://llblgenprof.com/"&gt;LLBLGen Profiler&lt;/a&gt; and &lt;a href="http://hibernateprofiler.com"&gt;Hibernate Profiler&lt;/a&gt;) for close to three years now. And we have been running always as 1.x, so we didn’t have a major release (although we have continual releases, we currently have close to 900 drops of the 1.x version).&lt;/p&gt; &lt;p&gt;The question now becomes, what is going to happen in the next version of the profiler?&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Production Profiling, the ability to setup your application so that you can connect to your production application and see what is going on &lt;em&gt;right now&lt;/em&gt;. &lt;/li&gt; &lt;li&gt;Error Analysis, the ability to provide you with additional insight and common solution to recurring problems.&lt;/li&gt; &lt;li&gt;Global Query Analysis, the ability to take all of your queries, look at their query plans and show your potential issues.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Those are the big ones, we have a few others, and a surprise in store &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://ayende.com/blog/Images/Windows-Live-Writer/What-is-next-for-the-profilers_868C/wlEmoticon-smile_2.png"&gt;&lt;/p&gt; &lt;p&gt;What would you want to see in the next version of the profiler?&lt;/p&gt;</description><link>https://ayende.com/blog/11265/what-is-next-for-the-profilers?Key=98ae56ef-3200-41b0-beec-1c206cbe1608</link><guid>https://ayende.com/blog/11265/what-is-next-for-the-profilers?Key=98ae56ef-3200-41b0-beec-1c206cbe1608</guid><pubDate>Thu, 02 Jun 2011 09:00:00 GMT</pubDate></item><item><title>Uber Prof &amp; NuGet</title><description>&lt;p&gt;Fitzchak has all the details in our &lt;a href="http://blogs.hibernatingrhinos.com/archive/2011/03/31/nuget-packages-and-an-example-use-of-the-profiler.aspx"&gt;company blog&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img alt="NugetPackages" src="http://blogs.hibernatingrhinos.com/images/blogs_hibernatingrhinos_com/Windows-Live-Writer/33b8e30a3166_9ED0/NugetPackages_thumb_1.png" /&gt;&lt;/p&gt;</description><link>https://ayende.com/blog/4799/uber-prof-nuget?Key=e4deb5ce-de52-4c43-89ba-2c3f410d2801</link><guid>https://ayende.com/blog/4799/uber-prof-nuget?Key=e4deb5ce-de52-4c43-89ba-2c3f410d2801</guid><pubDate>Fri, 01 Apr 2011 11:00:00 GMT</pubDate></item><item><title>New Profiler Feature: Avoid Writes from Multiple Sessions In The Same Request</title><description>&lt;p&gt;Because I keep getting asked, this feature is available for the following profilers:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://nhprof.com/"&gt;NHibernate Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://efprof.com/"&gt;Entity Framework Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://l2sprof.com/"&gt;Linq to SQL Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://llblgenprof.com/"&gt;LLBLGen Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://hibernateprofiler.com/"&gt;Hibernate Profiler&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This new feature detects a very interesting bad practice, write to the database from multiple session in the same web request.&lt;/p&gt;  &lt;p&gt;For example, consider the following code:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SaveAccount(Account account)
{
    &lt;span class="kwrd"&gt;using&lt;/span&gt;(var session = sessionFactory.OpenSession())
    &lt;span class="kwrd"&gt;using&lt;/span&gt;(session.BeginTransaction())
    {
           session.SaveOrUpdate(account);
           session.Transaction.Commit();    
    }
}&lt;/pre&gt;

  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Account GetAccount(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)
{
    &lt;span class="kwrd"&gt;using&lt;/span&gt;(var session = sessionFactory.OpenSession())
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; session.Get&amp;lt;Account&amp;gt;(id);
    }
}&lt;/pre&gt;
  &lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;&lt;/blockquote&gt;

&lt;p&gt;It is bad for several reasons, micro managing the session is just one of them, but the worst part is yet to come…&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MakePayment(&lt;span class="kwrd"&gt;int&lt;/span&gt; fromAccount, &lt;span class="kwrd"&gt;int&lt;/span&gt; toAccount, &lt;span class="kwrd"&gt;decimal&lt;/span&gt; ammount)
{
    var from = Dao.GetAccount(fromAccount);
    var to = Dao.GetAccount(toAccount);
    from.Total -= amount;
    to.Total += amount;
    Dao.SaveAccount(from);
    Dao.SaveAccount(to);
}&lt;/pre&gt;
  &lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;&lt;/blockquote&gt;

&lt;p&gt;Do you see the error here? There are actually several, let me count them:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We are using 4 different connections to the database in a single method.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;We don’t have transactional safety!!!!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think about it, if the server crashed between the fifth and sixth lines of this method, where would we be? &lt;/p&gt;

&lt;p&gt;We would be in that wonderful land where money disappear into thin air and we stare at that lovely lawsuit folder and then jump from a high window to a stormy sea.&lt;/p&gt;

&lt;p&gt;Or, of course, you could use the profiler, which will tell you that you are doing something which should be avoided:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/Windows-Live-Writer/New-Alert-Multiple-Write-Sessions-In-The_C8D8/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/Windows-Live-Writer/New-Alert-Multiple-Write-Sessions-In-The_C8D8/image_thumb.png" width="775" height="110" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isn’t that better than swimming with the sharks?&lt;/p&gt;</description><link>https://ayende.com/blog/4775/new-profiler-feature-avoid-writes-from-multiple-sessions-in-the-same-request?Key=7f102633-ec3a-497f-b84f-8c191dab2292</link><guid>https://ayende.com/blog/4775/new-profiler-feature-avoid-writes-from-multiple-sessions-in-the-same-request?Key=7f102633-ec3a-497f-b84f-8c191dab2292</guid><pubDate>Tue, 01 Mar 2011 12:26:00 GMT</pubDate></item><item><title>New Uber Prof Feature: Too Many Database Calls In The Same Request</title><description>&lt;p&gt;&lt;font size="3"&gt;Recently, we added a way to track alerts across all the sessions the request. This alert will detect whenever you are making too many database calls in the same request.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;But wait, don’t we already have that?&lt;/p&gt;  &lt;p&gt;Yes, we do, but that was limited to the scope of one session. there is a very large set of codebases where the usage of OR/Ms is… suboptimal (in other words, they could take the most advantage of the profiler abilities to detect issues and suggest solutions to them), but because of the way they are structured, they weren’t previously detected.&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;What is the difference between a session and a request? &lt;/font&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="3"&gt;Note: I am using NHibernate terms here, but naturally this feature is shared among all profiler:&lt;/font&gt;&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a href="http://nhprof.com/"&gt;NHibernate Profiler&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://efprof.com/"&gt;Entity Framework Profiler&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://l2sprof.com/"&gt;Linq to SQL Profiler&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://llblgenprof.com/"&gt;LLBLGen Profiler&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://hibernateprofiler.com/"&gt;Hibernate Profiler&lt;/a&gt;&lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font size="3"&gt;A session is the NHibernate session (or the data/object context in linq to sql / entity framework), and the request is the HTTP request or the WCF operation. If you had code such as the following:&lt;/font&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; T GetEntity&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)
{
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (var session = sessionFactory.OpenSession())
    {
         &lt;span class="kwrd"&gt;return&lt;/span&gt; session.Get&amp;lt;T&amp;gt;(id);
    }
}&lt;/pre&gt;
  &lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;&lt;/blockquote&gt;

&lt;p&gt;This code is bad, it micro manages the session, it uses too many connections to the database, it … well, you get the point. The problem is that code that uses this code:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Friends&amp;gt; GetFriends(&lt;span class="kwrd"&gt;int&lt;/span&gt;[] friends)
{
   var results = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Friends&amp;gt;();
   &lt;span class="kwrd"&gt;foreach&lt;/span&gt;(var id &lt;span class="kwrd"&gt;in&lt;/span&gt; friends)
       results.Add(GetEnttiy&amp;lt;Friend&amp;gt;(id));

   &lt;span class="kwrd"&gt;return&lt;/span&gt; results;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;The code above would look like the following in the profiler:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/Windows-Live-Writer/New-Alert-Too-Many-Database-Calls-In-The_C8E2/Image1.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Image1" border="0" alt="Image1" src="http://ayende.com/Blog/images/ayende_com/Blog/Windows-Live-Writer/New-Alert-Too-Many-Database-Calls-In-The_C8E2/Image1_thumb.png" width="251" height="400" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, each call is in a separate session, and previously, we wouldn’t have been able to detect that you have too many calls (because each call is a separate session).&lt;/p&gt;

&lt;p&gt;Now, however, we will alert the user with a too many database calls in the same request alerts. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/Windows-Live-Writer/New-Alert-Too-Many-Database-Calls-In-The_C8E2/Image2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Image2" border="0" alt="Image2" src="http://ayende.com/Blog/images/ayende_com/Blog/Windows-Live-Writer/New-Alert-Too-Many-Database-Calls-In-The_C8E2/Image2_thumb.png" width="699" height="317" /&gt;&lt;/a&gt;&lt;/p&gt;</description><link>https://ayende.com/blog/4774/new-uber-prof-feature-too-many-database-calls-in-the-same-request?Key=5fe23059-c0d9-4990-8c16-0372c0ee5bac</link><guid>https://ayende.com/blog/4774/new-uber-prof-feature-too-many-database-calls-in-the-same-request?Key=5fe23059-c0d9-4990-8c16-0372c0ee5bac</guid><pubDate>Mon, 28 Feb 2011 12:15:00 GMT</pubDate></item><item><title>New Uber Prof Concept: Cross Session Alerts</title><description>&lt;p&gt;We have recently been doing some work on Uber Prof, mostly in the sense of a code review, and I wanted to demonstrate how easy it was to add a new feature. The problem is that we couldn’t really think of a nice feature to add that we didn’t already have. &lt;/p&gt;  &lt;p&gt;Then we started thinking about features that aren’t there and that there wasn’t anything in Uber Prof to enable, and we reached the conclusion that one limitation we have right now is the inability to analyze your application’s behavior beyond the session’s level. But there is actually a whole &lt;em&gt;set&lt;/em&gt; of bad practices that are there when you are using multiple sessions.&lt;/p&gt;  &lt;p&gt;That led to the creation of a new concept the Cross Session Alert, unlike the alerts we had so far, those alerts looks at the data stream with a much broader scope, and they can analyze and detect issues that we previously couldn’t detect.&lt;/p&gt;  &lt;p&gt;I am going to be posting extensively on some of the new features in just a bit, but in the meantime, why don’t you tell me what sort of features do you think this new concept is enabling.&lt;/p&gt;  &lt;p&gt;And just a reminder, my architecture is based around &lt;a href="http://ayende.com/Blog/archive/2009/03/06/application-structure-concepts-amp-features.aspx"&gt;Concepts &amp;amp; Features&lt;/a&gt;.&lt;/p&gt;</description><link>https://ayende.com/blog/4773/new-uber-prof-concept-cross-session-alerts?Key=eeebdd89-c238-4266-b655-fc2be2a2ae50</link><guid>https://ayende.com/blog/4773/new-uber-prof-concept-cross-session-alerts?Key=eeebdd89-c238-4266-b655-fc2be2a2ae50</guid><pubDate>Fri, 25 Feb 2011 10:05:00 GMT</pubDate></item><item><title>Uber Prof New Features: A better query plan</title><description>&lt;blockquote&gt;Originally posted at 1/7/2011&lt;/blockquote&gt;&lt;p&gt;Because I keep getting asked, this feature is available for the following profilers:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://nhprof.com"&gt;NHibernate Profiler&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://efprof.com"&gt;Entity Framework Profiler&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://l2sprof.com"&gt;Linq to SQL Profiler&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://llblgenprof.com"&gt;LLBLGen Profiler&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://hibernateprofiler.com"&gt;Hibernate Profiler&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This feature is actually two separate ones. The first is the profiler detecting what is the most expensive part of the query plan and making it instantly visible. As you can see, in this fairly complex query, it is this select statement that is the hot spot.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/UberProfNewFeaturesAbetterqueryplan_CDD8/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/UberProfNewFeaturesAbetterqueryplan_CDD8/image_thumb_3.png" width="1132" height="666" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p&gt;Another interesting feature that only crops up whenever we are dealing with complex query plans is that the query plan can get &lt;em&gt;big&lt;/em&gt;. And by that I mean &lt;em&gt;really&lt;/em&gt; big. Too big for a single screen.&lt;/p&gt;  &lt;p&gt;Therefore, we added zooming capabilities as well as the mini map that you see in the top right corner.&lt;/p&gt;</description><link>https://ayende.com/blog/4752/uber-prof-new-features-a-better-query-plan?Key=7d9a03d2-2816-444d-a87c-5750ccf802f3</link><guid>https://ayende.com/blog/4752/uber-prof-new-features-a-better-query-plan?Key=7d9a03d2-2816-444d-a87c-5750ccf802f3</guid><pubDate>Sat, 15 Jan 2011 10:00:00 GMT</pubDate></item><item><title>Uber Prof New Features: Go To Session from alert</title><description>&lt;blockquote&gt;Originally posted at 1/7/2011&lt;/blockquote&gt;&lt;p&gt;This is another oft requested feature that we just implemented. The new feature is available for the full suite of Uber Profilers:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://nhprof.com"&gt;NHibernate Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://efprof.com"&gt;Entity Framework Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://l2sprof.com"&gt;Linq to SQL Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://llblgenprof.com"&gt;LLBLGen Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://hibernateprofiler.com"&gt;Hibernate Profiler&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You can see the new feature below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/UberProfNewFeaturesGoToSessionfromalert_C9AD/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/UberProfNewFeaturesGoToSessionfromalert_C9AD/image_thumb.png" width="1094" height="388" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I think it is cute, and was surprisingly easy to do.&lt;/p&gt;  &lt;p&gt;Uber Prof have recently passed the stage where it is mostly implemented using itself, so I just had to wire a few things together, and then I spent most of the time just making sure that things aligned correctly on the UI.&lt;/p&gt;</description><link>https://ayende.com/blog/4751/uber-prof-new-features-go-to-session-from-alert?Key=b28db449-7214-454f-abbf-7eaf960a299a</link><guid>https://ayende.com/blog/4751/uber-prof-new-features-go-to-session-from-alert?Key=b28db449-7214-454f-abbf-7eaf960a299a</guid><pubDate>Fri, 14 Jan 2011 10:00:00 GMT</pubDate></item><item><title>Happy New Year, and across the board profiler discount</title><description>&lt;p&gt;To celebrate the new year, I decided to offer a single day coupon that will get you &lt;strong&gt;35% discount&lt;/strong&gt; for all my profiler products.&lt;/p&gt;  &lt;p&gt;The coupon code is valid until the &lt;strong&gt;1st of January 2011&lt;/strong&gt;, but I won’t mention in which timezone, so you might want to hurry up.&lt;/p&gt;  &lt;p&gt;The coupon code is: &lt;/p&gt; &lt;dl&gt;&lt;dd&gt;&lt;strong&gt;HNY-45K2D465DD&lt;/strong&gt;&lt;/dd&gt;&lt;/dl&gt;  &lt;p&gt;You can use it to buy:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://nhprof.com/buy"&gt;NHibernate Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://efprof.com/buy"&gt;Entity Framework Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://l2sprof.com/buy"&gt;Linq to SQL Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://llblgenprof.com/buy"&gt;LLBLGen Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://hibernateprofiler.com/buy"&gt;Hibernate Profiler&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Happy new year!&lt;/p&gt;</description><link>https://ayende.com/blog/4737/happy-new-year-and-across-the-board-profiler-discount?Key=1a8256cc-e422-4d3a-b639-6dc0d9c03c30</link><guid>https://ayende.com/blog/4737/happy-new-year-and-across-the-board-profiler-discount?Key=1a8256cc-e422-4d3a-b639-6dc0d9c03c30</guid><pubDate>Fri, 31 Dec 2010 09:11:56 GMT</pubDate></item><item><title>What is Uber Prof’s competitive advantage?</title><description>&lt;blockquote&gt;Originally posted at 11/25/2010&lt;/blockquote&gt;&lt;p&gt;In a &lt;a href="http://ayende.com/Blog/archive/2010/11/24/your-design-should-be-focused-on-your-competitive-advantage.aspx"&gt;recent post&lt;/a&gt;, I discussed the notion of competitive advantage and how you should play around them. In this post, I am going to focus on Uber Prof. Just to clarify, when I am talking about Uber Prof, I am talking about &lt;a href="http://nhprof.com/"&gt;NHibernate Profiler&lt;/a&gt;, &lt;a href="http://efprof.com/"&gt;Entity Framework Profiler&lt;/a&gt;, &lt;a href="http://l2sprof.com/"&gt;Linq to SQL Profiler&lt;/a&gt;, &lt;a href="http://hibernateprofiler.com/"&gt;Hibernate Profiler&lt;/a&gt; and &lt;a href="http://llblgenprof.com/"&gt;LLBLGen Profiler&lt;/a&gt;. Uber Prof is just a handle for me to use to talk about each of those.&lt;/p&gt;  &lt;p&gt;So, what is the major competitive advantage that I see in the Uber Prof line of products?&lt;/p&gt;  &lt;p&gt;Put very simply, they focus very heavily on the developer’s point of view. &lt;/p&gt;  &lt;p&gt;Other profilers will give you the SQL that is being executed, but Uber Prof will show you the SQL and:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Format that SQL in a way that make it easy to read.&lt;/li&gt;    &lt;li&gt;Group the SQL statements into sessions. Which let the developer look at what is going on in the natural boundary.&lt;/li&gt;    &lt;li&gt;Associate each query with the exact line of code that executed it.&lt;/li&gt;    &lt;li&gt;Provide the developer with guidance about improving their code.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are other stuff, of course, but those are the core features that make Uber Prof into what it is.&lt;/p&gt;</description><link>https://ayende.com/blog/4705/what-is-uber-profs-competitive-advantage?Key=6dca10eb-7243-4817-8756-300adfc29ee8</link><guid>https://ayende.com/blog/4705/what-is-uber-profs-competitive-advantage?Key=6dca10eb-7243-4817-8756-300adfc29ee8</guid><pubDate>Sat, 27 Nov 2010 10:00:00 GMT</pubDate></item><item><title>Profiler Usage Analysis</title><description>&lt;p&gt;I have been doing some studying of how people are using the profiler, and it shows some interesting results.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Typical profiler session is :&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;NH Prof : 1:15 hours&lt;/li&gt;      &lt;li&gt;Hibernate Profiler: 1:05 hours&lt;/li&gt;      &lt;li&gt;EF Prof: 42 minutes&lt;/li&gt;      &lt;li&gt;L2S Prof: 50 minutes&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;83% of the profiler users have used it more than once. In fact, here is the # of usages:     &lt;br /&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/ProfilerUsageAnalysis_AD59/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/ProfilerUsageAnalysis_AD59/image_thumb.png" width="483" height="291" /&gt;&lt;/a&gt;       &lt;br /&gt;So we have over 50% that use it regularly. &lt;/li&gt;    &lt;li&gt;Most people use it predominately to view the statements executed:     &lt;br /&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/ProfilerUsageAnalysis_AD59/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/ProfilerUsageAnalysis_AD59/image_thumb_1.png" width="483" height="291" /&gt;&lt;/a&gt;      &lt;br /&gt;This means that the reports are getting comparatively little attention.&lt;/li&gt;    &lt;li&gt;The results per geographical location are also interesting:     &lt;br /&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/ProfilerUsageAnalysis_AD59/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/ProfilerUsageAnalysis_AD59/image_thumb_3.png" width="776" height="635" /&gt;&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;</description><link>https://ayende.com/blog/4593/profiler-usage-analysis?Key=69f59707-3f1b-4621-8a3e-6aadc83a5fa5</link><guid>https://ayende.com/blog/4593/profiler-usage-analysis?Key=69f59707-3f1b-4621-8a3e-6aadc83a5fa5</guid><pubDate>Tue, 17 Aug 2010 09:00:00 GMT</pubDate></item><item><title>Hibernate Profiler New Feature: Parameters Values</title><description>&lt;p&gt;One of the annoying things about the &lt;a href="http://hibernateprofiler.com"&gt;Hibernate port of the profiler&lt;/a&gt; was that JDBC didn’t provide us with the parameters values.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://erichauser.net/2010/03/07/hibernate-profiler-jdbc-parameters/"&gt;Eric&lt;/a&gt; has just fixed and that is now live:&lt;/p&gt;  &lt;p&gt;&lt;img alt="hibernate-parameters" src="http://erichauser.net/wp-content/uploads/hibernateparameters_thumb.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Enjoy…&lt;/p&gt;</description><link>https://ayende.com/blog/4430/hibernate-profiler-new-feature-parameters-values?Key=4cd35576-fc82-48fa-8726-325ddb4c5f87</link><guid>https://ayende.com/blog/4430/hibernate-profiler-new-feature-parameters-values?Key=4cd35576-fc82-48fa-8726-325ddb4c5f87</guid><pubDate>Tue, 09 Mar 2010 12:12:00 GMT</pubDate></item></channel></rss>