<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-34303047</atom:id><lastBuildDate>Wed, 10 Apr 2013 18:00:30 +0000</lastBuildDate><category>Rx</category><category>articles</category><category>logging</category><category>Visual Studio</category><category>LINQPad</category><category>IIS 7</category><category>Microsoft</category><category>tools</category><category>installation</category><category>documentation</category><category>ILMerge</category><category>Help Server</category><category>bugs</category><category>DataObjects.Net</category><category>Ohloh</category><category>Misc</category><category>events</category><category>algorithms</category><category>X-tensive.com</category><category>Oracle</category><category>Erik Meijer</category><category>DTO</category><category>feature request</category><category>Mercurial</category><category>Skype</category><category>ASP.NET MVC</category><category>threading</category><category>ASP.NET</category><category>IDENTITY</category><category>query profiler</category><category>comparisons</category><category>disconnected state</category><category>prefetch API</category><category>agile</category><category>Git</category><category>configuration</category><category>polls</category><category>tips</category><category>ORM</category><category>key generators</category><category>future queries</category><category>SQL Azure</category><category>performance</category><category>productivity</category><category>SQL Server MSSQL</category><category>repository</category><category>T4 template</category><category>presentations</category><category>announcements</category><category>manual</category><category>currying</category><category>LINQ</category><category>research</category><category>64-bit</category><category>Google Code</category><category>politics</category><category>programming</category><category>storage providers</category><category>ORMBattle</category><category>UML</category><category>monads</category><category>F#</category><category>.NET Framework</category><category>MSBuild</category><category>9facts</category><category>concurrency</category><category>ideas</category><category>samples</category><category>legacy code</category><category>C#</category><category>tests</category><category>visual designer</category><category>VCS</category><category>data structures</category><category>POCO</category><category>functional programming</category><category>features</category><category>Russia</category><category>LINQ to SQL (L2S)</category><category>fun</category><category>LiveUI</category><category>statistics</category><category>stories</category><category>cheatsheet</category><category>StreamInsight</category><category>architecture</category><category>questions</category><category>Entity Framework</category><category>batching</category><category>Silverlight</category><title>Alex Yakunin's blog</title><description>Notes on DataObjects.Net and ORM solutions on .NET in general.</description><link>http://blog.alexyakunin.com/</link><managingEditor>noreply@blogger.com (Alex Yakunin)</managingEditor><generator>Blogger</generator><openSearch:totalResults>152</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/AlexYakunin" /><feedburner:info uri="alexyakunin" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>AlexYakunin</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-8229792769305224472</guid><pubDate>Fri, 11 Nov 2011 13:56:00 +0000</pubDate><atom:updated>2011-11-15T18:42:47.214+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">9facts</category><title>I'm back :)</title><description>I'm happy to announce I'm returning back after almost 1 year long absence here ;)&lt;br /&gt;
&lt;br /&gt;
So what's changed? Actually, a lot.&lt;br /&gt;
&lt;br /&gt;
In December 2010 I decided to start a new software project. My primary goal was to build a product that must be attractive for a wide set of categories of people. So after some period of research (I'll tell about this later) I came to the following idea:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;There is no single place on the web, where you can compare yourself with other people&lt;/span&gt; by the whole set of metrics that are relevant to you. I'm talking about nearly any metrics - e.g. your birth date, height, the number of hours you spent at work during this month, the highest place you've ever visited, the deepest dive you've made, the number of miles you run this week, your reputation on Stack Overflow and so on.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;Most of the ratings on the web are &lt;i&gt;global&lt;/i&gt;, but &lt;i&gt;local ratings&lt;/i&gt; seem more important in our life.&lt;/span&gt; E.g. what my ~ 2.5K reputation on Stack Overflow says about me in general? Nearly nothing. But being compared with reputation of developers in my city (Ekaterinburg, 1.5M population) or in some company here it becomes more meaningful: Stack Overflow is in English, so local developers rarely answer there. The same can be said about nearly any metric: &lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;almost no one remembers his position in global rating on Stack Overflow, but I bet you'd definitely remember you're #1 (#2, #3) on Stack Overflow in your city.&lt;/span&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;If we're able to compare an arbitrary set of such metrics for arbitrary groups of people in real time (e.g. your productivity measured by RescueTime + the number of LOCs you committed + the number of tasks closed in issue tracker), &lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;we bring Google Analytics to the world of achievements and productivity of people&lt;/span&gt;. This must be a precious tool for business - at least, I'd definitely use such a tool. And it&amp;nbsp;is&amp;nbsp;attractive&amp;nbsp;for people as well, since they can identify and highlight their local or global successes (e.g. attach them to a CV). Moreover, I'd use such a tool to compare and fix successes of my kids.&lt;/li&gt;
&lt;li&gt;If we're able to fix nearly any facts, &lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;we can identify the most popular facts in a particular group of people. And this set of facts must nicely describe what's common in this group&lt;/span&gt;. E.g. if it's a group of bodybuilders, most of them publish the weight they push, muscle size, etc.; if it's a group of developers, they compare their reputation on Stack Overflow, number of committed lines of code, lists of technologies they use, etc. Travelers might count the number of countries they visited, driving fans - the&amp;nbsp;horsepower&amp;nbsp;of their cars, and so on. &lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;Imagine, you're visiting some event and instantly see the most popular activities and achievements for the whole group of people there&lt;/span&gt;. IMO, that's cool!&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-H2bNJrTPp84/TsAcrTNlCII/AAAAAAAAIh4/9FKRZcTO8Xk/s1600/_9facts.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-H2bNJrTPp84/TsAcrTNlCII/AAAAAAAAIh4/9FKRZcTO8Xk/s400/_9facts.png" width="286" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Home page of 9facts.com displays the topmost&lt;br /&gt;
achievements in your country, city and groups &lt;br /&gt;
you're in, including your friends' group.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
So that's what &lt;a href="http://9facts.com/"&gt;9facts&lt;/a&gt; must finally evolve to - a tool allowing you to share and compare arbitrary (but mainly measurable) facts about your own and other people. Currently we're just in the beginning -&amp;nbsp;&lt;a href="http://9facts.com/about"&gt;"About 9facts"&lt;/a&gt; page fully describes the current state of the project; the&amp;nbsp;limitations it has now include:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Absence of an API allowing third-party apps to push facts with measurable data to it, although there are few integrated data providers grabbing some facts from Facebook, Twitter and Stack Overflow. Also, you can enter the facts manually there -&amp;nbsp;&lt;a href="http://9facts.com/about"&gt;our presentation&lt;/a&gt; explains what's so unique in this part.&lt;/li&gt;
&lt;li&gt;We can't log facts with data sequences (i.e. data change charts).&lt;/li&gt;
&lt;li&gt;Some of essential social features aren't implemented yet - e.g. there are no comments, messages, notifications about your high positions in tops and so on.&lt;/li&gt;
&lt;li&gt;UI/UX certainly needs to be improved as well - some actions and implied results there are far from being obvious.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
But the good thing is that it already works, and you already can compare yourself with the people nearby you (or in your city, country and so on) right now. You can do this in 3 steps:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://9facts.com/Account/Register"&gt;Register&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a href="http://9facts.com/Account/Login"&gt;sign in&lt;/a&gt;&amp;nbsp;to 9facts&lt;/li&gt;
&lt;li&gt;&lt;a href="http://9facts.com/Settings/BasicInfo"&gt;Specify your city or country in account&amp;nbsp;settings&lt;/a&gt;&amp;nbsp;-&amp;nbsp;otherwise you facts won't appear in city / country tops.&lt;/li&gt;
&lt;li&gt;Enable as many of&amp;nbsp;&lt;a href="http://9facts.com/FactProviders"&gt;fact providers&lt;/a&gt;&amp;nbsp;as you can, and / or&amp;nbsp;&lt;a href="http://9facts.com/AddFact"&gt;try to add some facts about you manually&lt;/a&gt;. If you don't know what to add,&amp;nbsp;&lt;a href="http://9facts.com/User/Top"&gt;look up the biggest top&lt;/a&gt;&amp;nbsp;to get some ideas (remember, there is "Add fact like this" action in context menu of any fact).&lt;/li&gt;
&lt;/ul&gt;
I'd&amp;nbsp;highly appreciate if you share your impression with us. There are several ways of doing this: create a fact about&amp;nbsp;&lt;a href="http://9facts.com/u/alex/1"&gt;Alex Yakunin&lt;/a&gt;&amp;nbsp;on 9facts, send an email to&amp;nbsp;&lt;a href="mailto:info@9facts.com"&gt;info@9facts.com&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a href="http://9facts.uservoice.com/forums/134427-general"&gt;leave a feature request @ UserVoice&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
More information about the current state of 9facts is provided in &lt;a href="http://blog.9facts.com/2011/11/weve-updated-9factscom.html"&gt;my post describing the latest update&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
So what I'm going to write about? We've learned a lot during last 6 months:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;9facts is an independent startup. X-tensive acts as co-investor here, but a part of money was raised from another investor. So I think I'll be able to tell a story about this, if / when we'll raise the next amount.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;We've built a new team for this project in pretty short time, so in particular, we should quickly enforce agile development, coding standards and practices. I can't say we fully succeeded with this, but I'm happy with the result.&lt;/li&gt;
&lt;li&gt;We are using DataObjects.Net in this project, so it's a sort of "eat your own dog's food" experience for me. We use DO in almost all the projects we run, but personally I didn't have any remarkable experience with ASP.NET MVC before 9facts, so now I know quite well how to use DO&amp;nbsp;efficiently&amp;nbsp;in this scenario. Splitting the application into tiers, using federation (sharding), performing schema and data upgrades, using caches, running certain actions periodically - these are just some topics I can cover.&lt;/li&gt;
&lt;li&gt;There is a JavaScript library plus certain amount of server-side code allowing us to handle AJAX requests (we don't sent regular POST requests at all), errors and many other things in unified fashion. Our ASP.NET MVC handlers processing form update requests (actually, any AJAX requests) usually contain much less code then you usually see in examples handling standard POST requests, although they are much better ready to real-world scenarios (in particular, error handling). Take a look at &lt;a href="http://9facts.com/Settings/BasicInfo"&gt;this page&lt;/a&gt;'s network traffic&amp;nbsp;to understand what I mean. I can add that normally we don't use client-side MVVM (although we use &lt;a href="http://knockoutjs.com/"&gt;knockout&lt;/a&gt; in few cases), i.e. the rendering is usually performed on the server side. IMO, that's the most convenient scenario for ASP.NET MVC applications.&lt;/li&gt;
&lt;li&gt;We're extensively using Task Parallel Library (TPL) and PLINQ, so I can share some experience related to this part as well.&lt;/li&gt;
&lt;li&gt;Finally, it might be interesting why I decided to develop something new, how I was peeking the ideas and so on.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
That was a brief list of topics I'm going to expand during next months. I hope you'll like this new kind of content in my blog.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=kLkTZFiifC4:TuNEXHPpsqU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=kLkTZFiifC4:TuNEXHPpsqU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/kLkTZFiifC4/im-back.html</link><author>noreply@blogger.com (Alex Yakunin)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-H2bNJrTPp84/TsAcrTNlCII/AAAAAAAAIh4/9FKRZcTO8Xk/s72-c/_9facts.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2011/11/im-back.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-7820061851108086586</guid><pubDate>Tue, 16 Nov 2010 08:55:00 +0000</pubDate><atom:updated>2010-11-16T16:11:01.309+05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">fun</category><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><title>Right way to buy DataObjects.Net</title><description>Today we've got a nice order: some guy has ordered DataObjects.Net using pretty old coupon code (upgrade from v3.9) providing 60% discount. I tried to find it in Google, but failed - i.e. there is no info about it at our web sites. On the other hand, promo code was really enabled, so discount was provided.&lt;br /&gt;
&lt;br /&gt;
Initially I was thinking about asking him to make a refund and use one of actual coupon codes. Obviously, this idea was really bad - in fact, it's our own mistake, he just found it (probably, occasionally). And Alexis Kochetov proposed a better idea: we must give him additional 10% discount. So we'll prolong his subscription for additional 2 months :)&lt;br /&gt;
&lt;br /&gt;
Of course, the gap is closed now :)&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=DMY_o0tYSsc:zJ_5caRV4Vw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=DMY_o0tYSsc:zJ_5caRV4Vw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/DMY_o0tYSsc/lol.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>2</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/11/lol.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-4524961258769661945</guid><pubDate>Sun, 31 Oct 2010 20:02:00 +0000</pubDate><atom:updated>2010-11-01T01:19:39.686+05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">monads</category><category domain="http://www.blogger.com/atom/ns#">functional programming</category><category domain="http://www.blogger.com/atom/ns#">.NET Framework</category><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">Microsoft</category><category domain="http://www.blogger.com/atom/ns#">articles</category><category domain="http://www.blogger.com/atom/ns#">concurrency</category><title>Link to Jon Skeet's post about new "async" and "await" keywords in C# 5</title><description>I just found &lt;a href="http://msmvps.com/blogs/jon_skeet/archive/2010/10/31/c-5-async-experimenting-with-member-resolution-getawaiter-beginawait-endawait.aspx"&gt;a great post explaining how new "async" and "await" keywords in C# 5 really work&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Summary:&lt;/b&gt; likely, you know that LINQ, from compiler's side, is actually &lt;i&gt;a language-integrated sequence monad&lt;/i&gt;; so new "async" and "await" keywords in C# 5 bring another one - &lt;i&gt;a language-integrated&amp;nbsp;&lt;a href="http://en.wikibooks.org/wiki/Haskell/Continuation_passing_style"&gt;continuation monad&lt;/a&gt;&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=yl1VP-W09g4:nKFHOl1kfgM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=yl1VP-W09g4:nKFHOl1kfgM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/yl1VP-W09g4/link-to-jon-skeets-post-about-new-async.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/11/link-to-jon-skeets-post-about-new-async.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-6318691157247530402</guid><pubDate>Wed, 01 Sep 2010 14:49:00 +0000</pubDate><atom:updated>2010-09-01T20:55:33.568+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">bugs</category><category domain="http://www.blogger.com/atom/ns#">fun</category><category domain="http://www.blogger.com/atom/ns#">architecture</category><category domain="http://www.blogger.com/atom/ns#">legacy code</category><title>When (0+x)*1 != x, or dealing with legacy data</title><description>&lt;div&gt;
I just
remembered, that in the beginning of summer Alex Ustinov has told me a nice story
about legacy data import. That time he was fighting with importing legacy data from
some old .DBF database using SQL Server Data Transformation Services. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
He said, "I
tried to pull out the data column directly “as is”, but failed - the data type of column value returned by provider sometimes differed from the expected one.
Probably, that was a result of some a bug in the data provider I used, or... Anyway, I immediately remembered that in order to convert the number to an integer data type in VB,
you can simply add&amp;nbsp;0 (zero) to it. So I did this, and discovered that data
import was almost fully fixed: the new script was capable of importing all the
rows but one! I repaired this by multiplying &amp;nbsp;the expression by 1 :)".&lt;br /&gt;
&lt;br /&gt;
I instantly imagined the following code:&lt;br /&gt;
&lt;pre class="brush: vb"&gt;var target = (0 + source) * 1 ` My friend, believe me, this is necessary!
&lt;/pre&gt;
&lt;br /&gt;
It's ridiculous, of course, but in fact such decisions are quite frequent, if we
speak about legacy code.&amp;nbsp;It’s easier to work around the issue rather than
understand what kind of bug is there (in DBF file itself, or in data provider –
who knows?), taking into account there is almost no issue-related information about either. All
this stuff was born before the Internet became really popular – precisely, a million
years ago.&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
P.S.&amp;nbsp;I’m
retelling this relying only on my own memory, so there can be some terminological mistakes. Thanks god, I didn't&amp;nbsp;deal with VB long enough to forget it :)&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=z0mfII9doDk:TsvPpsxM6L8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=z0mfII9doDk:TsvPpsxM6L8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/z0mfII9doDk/when-x01-x-or-dealing-with-legacy-data.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/09/when-x01-x-or-dealing-with-legacy-data.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-5971590385206926487</guid><pubDate>Tue, 17 Aug 2010 11:09:00 +0000</pubDate><atom:updated>2010-08-17T17:25:52.712+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">algorithms</category><category domain="http://www.blogger.com/atom/ns#">IDENTITY</category><category domain="http://www.blogger.com/atom/ns#">SQL Server MSSQL</category><category domain="http://www.blogger.com/atom/ns#">threading</category><category domain="http://www.blogger.com/atom/ns#">concurrency</category><title>Concurrency problem :)</title><description>Imagine we have a&amp;nbsp;concurrent integer counter, that doesn't support "Increment and read" operation, but supports two separate operations: "Increment" and "Read". Can it be used to generate sequences of&amp;nbsp;&lt;u&gt;unique&lt;/u&gt;&amp;nbsp;integer numbers concurrently, and if so, how?&lt;br /&gt;
&lt;br /&gt;
To be precise, I want to write a program involving only such counter for concurrency control, that, being executed concurrently, would produce a sequence of &lt;u&gt;unique&lt;/u&gt; numbers in each thread. I.e. I want to ensure no one number is shared among these sequences.&lt;br /&gt;
&lt;br /&gt;
The answer is &lt;a href="http://code.google.com/p/dataobjectsdotnet/issues/detail?id=415#c7"&gt;here&lt;/a&gt;&amp;nbsp;(although I'm not absolutely sure it is correct), but I'd suggest you to solve the puzzle by your own first.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #990000;"&gt;Initially it seems the problem is far from being practical - nearly any implementation of concurrent counter supports&amp;nbsp;"Increment and Read" operation. But it looks like we've found one that doesn't :)&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=PQ12bTnP1hA:kIXAulemMMQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=PQ12bTnP1hA:kIXAulemMMQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/PQ12bTnP1hA/concurrency-problem.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/08/concurrency-problem.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-7340331341299796790</guid><pubDate>Thu, 10 Jun 2010 17:39:00 +0000</pubDate><atom:updated>2010-06-10T23:41:11.384+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">tools</category><title>Highly recommended application: PivotalTracker</title><description>&lt;a href="http://www.pivotaltracker.com/"&gt;Take a look at it&lt;/a&gt;&amp;nbsp;- it's simply a great tool for agile developers.&lt;br /&gt;
&lt;br /&gt;
We started to use it few weeks ago, and, even while there is no good result from the point of planning and predictions&amp;nbsp;yet&amp;nbsp;(at least for DataObjects.Net project), it is really useful anyway.&amp;nbsp;Its main benefit for me is that I'm always know what's important right now \ what are the tasks I should spend my time on. When you take part in a set of projects + have certain amount of correspondence, it isn't always easy to do this. Finally, it's quite easy to re-arrange the stories there and see what happens.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.pivotaltracker.com/"&gt;PivotalTracker&lt;/a&gt; rules.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=zGE1fqM3Zfc:4XV4glp_z24:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=zGE1fqM3Zfc:4XV4glp_z24:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/zGE1fqM3Zfc/highly-recommended-application.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/06/highly-recommended-application.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-334353855509060438</guid><pubDate>Fri, 28 May 2010 06:12:00 +0000</pubDate><atom:updated>2010-05-28T17:07:40.635+06:00</atom:updated><title>New posts</title><description>See:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://feedproxy.google.com/~r/Xtensive/~3/blu2DUXipQs/users-from-russia-and-cis-countries.html"&gt;Users from Russia and CIS countries, apply for discounts!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://feedproxy.google.com/~r/DataObjects/~3/xtupU4pOS_c/dataobjectsnet-editions-and-prices_27.html"&gt;DataObjects.Net editions and prices, final version&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.x-tensive.com/2010/05/we-offer-free-licenses-for-dataobjects.html"&gt;Free licenses for DataObjects.Net and Help Server for bloggers, article writers and user group speakers&lt;/a&gt; - there is an exact description of what we expect here.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul class="NewsList" style="font-family: Arial, Geneva, Helvetica, sans-serif; font-size: 14px; line-height: 20px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 1.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=MYCKx8i_rfk:fucyultk4Ss:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=MYCKx8i_rfk:fucyultk4Ss:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/MYCKx8i_rfk/new-posts.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>4</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/05/new-posts.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-4672247761673653497</guid><pubDate>Sun, 23 May 2010 22:17:00 +0000</pubDate><atom:updated>2010-05-24T04:17:58.674+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">announcements</category><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><title>Two announcements</title><description>I just published two announcements in DataObjects.Net blog. Check out:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.dataobjects.net/2010/05/dataobjectsnet-editions-and-prices.html"&gt;DataObjects.Net editions and prices: upcoming changes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.dataobjects.net/2010/05/dataobjectsnet-v421-and-v43-rc2-are.html"&gt;DataObjects.Net v4.2.1 and v4.3 RC2 are available&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=QK2CMrUxxH4:lDe3IQfZcrM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=QK2CMrUxxH4:lDe3IQfZcrM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/QK2CMrUxxH4/two-announcements.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/05/two-announcements.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-8745431330423594233</guid><pubDate>Fri, 14 May 2010 19:48:00 +0000</pubDate><atom:updated>2010-05-15T01:49:24.298+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><title>DataObjects.Net v4.3 RC1 with Visual Studio 2010 and .NET 4.0 support is available</title><description>See &lt;a href="http://blog.dataobjects.net/2010/05/dataobjectsnet-v43-rc1-with-visual.html"&gt;this post&lt;/a&gt; for details.&lt;br /&gt;
&lt;br /&gt;
P.S. We've finally decided to publish all the posts related to DataObjects.Net in &lt;a href="http://blog.dataobjects.net/"&gt;its own blog&lt;/a&gt; - this must be definitely more convenient for the people interested in it. The idea of spreading all of such posts in personal blogs was deeply wrong :( So further I'll be blogging about everything &lt;i&gt;except&lt;/i&gt; DataObjects.Net itself here.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=NywNuMpb1sM:DFv2Z37vJYU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=NywNuMpb1sM:DFv2Z37vJYU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/NywNuMpb1sM/dataobjectsnet-v43-rc1-with-visual.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/05/dataobjectsnet-v43-rc1-with-visual.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-985274375725671843</guid><pubDate>Sat, 08 May 2010 06:54:00 +0000</pubDate><atom:updated>2010-05-08T12:54:21.817+06:00</atom:updated><title>Testing cross-posting to company blogs</title><description>Please ignore this entry.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=90nzxRxekfc:wvZkKanjeTc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=90nzxRxekfc:wvZkKanjeTc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/90nzxRxekfc/testing-cross-posting-to-company-blogs.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/05/testing-cross-posting-to-company-blogs.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-6348296083264471058</guid><pubDate>Thu, 06 May 2010 13:40:00 +0000</pubDate><atom:updated>2010-05-28T12:08:58.892+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">announcements</category><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><title>I'm back</title><description>Now I almost fully recovered from paratonsillitis - not sure, why, but&amp;nbsp;quinsy I got few weeks ago has finally "evolved" into it. Thanks god no one else from my family was infected.&lt;br /&gt;
&lt;br /&gt;
Since many tasks were waiting my attention, it worth to mention the most important ones.&amp;nbsp;So what's going to happen soon:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;v4.2 will be updated to include latest fixes.&lt;/span&gt; Few days ago I added support for VS.NET 2010 (.NET 3.5 only) into its installation scripts, as well as installation of XSD enabling IntelliSense for &amp;lt;Xtensive.Storage&amp;gt; configuration section - thanks to &lt;a href="http://psulek.blogspot.com/2009/12/intellisense-support-of-dataobjectsnet.html"&gt;Peter Šulek&lt;/a&gt;&amp;nbsp;(Peter, I updated XSD a bit according with the latest changes).&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;My primary goal is v4.3 installer.&lt;/span&gt;&amp;nbsp;There is no exact release date yet, but if there will be no any serious issues, you might expect VS2010 &amp;amp; .NET 4.0 version quite soon.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;New pricing and licensing policy will be announced shortly&lt;/span&gt; - that's one of reasons we delayed v4.3 release. Now it includes protected components, which will function until the end of June 2010. The restriction is compile-time only, i.e. runtime components will be fully usable further. We're going to use this period to integrate full-featured licensing system into DataObjects.Net.&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt;&amp;nbsp;&lt;a href="http://blog.dataobjects.net/2010/05/dataobjectsnet-editions-and-prices_27.html"&gt;the final pricing model is announced&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;We've finally decided to migrate our support forums to &lt;/span&gt;&lt;a href="http://www.osqa.net/"&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;OSQA&lt;/span&gt;&lt;/a&gt;&amp;nbsp;- we liked StackExchange, but e-mail correspondence with its team after &lt;a href="http://www.joelonsoftware.com/items/2010/04/13.html"&gt;this announcement&lt;/a&gt; has lead us to conclusion that it's better to migrate to different software.&amp;nbsp;So I also looking for good Unix hosting in US/EU to run our new support web site based on OSQA - unfortunately, they don't sell hosted solution yet.&lt;/li&gt;
&lt;li&gt;After getting this done, I'll switch back to Xtensive.Practices development.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Stay tuned! I'll try to compensate recent absence of my posts.&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=YUn0ERp_g00:3CZkaqntmHQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=YUn0ERp_g00:3CZkaqntmHQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/YUn0ERp_g00/im-back.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>7</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/05/im-back.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-6314552157949542083</guid><pubDate>Wed, 21 Apr 2010 18:40:00 +0000</pubDate><atom:updated>2010-04-22T00:44:31.895+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">announcements</category><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><title>DataObjects.Net v4.2.0 installers are updated</title><description>I decided to update v4.2.0 installers to the latest nightly build (from stable branch), since we’ve fixed a set of annoying bugs during last two week.So there is nothing new yet, just fixes. But &lt;span style="color: maroon;"&gt;if you're using v4.2 in production, it's highly recommended to update it.&lt;/span&gt;     &lt;br /&gt;    &lt;br /&gt;As usual, the latest build can be found in &lt;a href="http://www.x-tensive.com/Downloads/?Path=" target="_blank"&gt;Downloads area&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;P.S. The publishing process isn't finished yet.&amp;nbsp;Track the build date there,&amp;nbsp;it will be changed when publication is finished.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=mwOVd9IB3Qw:u42D5I3OPPk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=mwOVd9IB3Qw:u42D5I3OPPk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/mwOVd9IB3Qw/dataobjectsnet-v420-installers-are.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/04/dataobjectsnet-v420-installers-are.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-4107488368833991377</guid><pubDate>Mon, 19 Apr 2010 04:01:00 +0000</pubDate><atom:updated>2010-04-19T10:02:53.070+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">announcements</category><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><title>Status update</title><description>I'm a bit late with my planned schedule for &lt;a href="http://blog.alexyakunin.com/2010/04/birth-of-xtensivepnp-patterns-and.html"&gt;Xtensive.Practices&lt;/a&gt;&amp;nbsp;- the end of the last week was spent mainly on bug reports (this month we have a very limited number of people working on DO4, since there is a temporary, but strong demand for them on other projects we run, so I was responsible for resolving part of reported bugs).&amp;nbsp;I hope to finish planned works for ASP.NET and ASP.NET MVC during this week.&lt;br /&gt;
&lt;br /&gt;
Another important news is that we're going to show DataObjects.Net 4.3 RC on the next week:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Migration to PostSharp 2.0 is already finished. This was the most complex part, since new APIs are quite different to the old ones.&lt;/li&gt;
&lt;li&gt;We must migrate to .NET 4.0 &amp;amp; VS.NET 2010 now. Mainly this implies upgrade of .csproj files, a set of renames and few conditional compilation instructions. So as you might suspect, it won't be possible to build DO4 on VS.NET 2008 after this step, although we'll continue supporting .NET 3.5.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
So stay tuned. If it will be possible, we'll try to show something related to VS2010 even on this week.&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=egIFsm-5teA:8cCUjxQkGfI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=egIFsm-5teA:8cCUjxQkGfI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/egIFsm-5teA/status-update.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>8</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/04/status-update.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-8873265061257963206</guid><pubDate>Thu, 08 Apr 2010 13:11:00 +0000</pubDate><atom:updated>2010-04-08T22:06:05.780+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">samples</category><category domain="http://www.blogger.com/atom/ns#">announcements</category><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET MVC</category><title>New ASP.NET MVC Sample update + screenshots</title><description>I just updated ASP.NET MVC sample described in &lt;a href="http://blog.alexyakunin.com/2010/04/new-aspnet-mvc-sample.html"&gt;my previous post&lt;/a&gt;:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;I ripped out all the stuff that isn't directly related to usage of DO4 with ASP.NET MVC.&lt;/span&gt; Mainly, it was all the stuff related to login &amp;amp; user registration. I'm going to return back &amp;amp; update this part &amp;nbsp;when a generic security helpers will appear (to show the standard approach to this problem instead of one more example).&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Paging is implemented for Persons list.&lt;/span&gt; This is really pretty simple with .Take &amp;amp; .Skip, although you must remember that it's not a good idea to use this approach for really large sets of large data (e.g. millions of rows - check out the plans produced for such queries). But... Since almost any grid uses exactly this approach, I bet almost no one cares about this ;) I'll show much more efficient paging later.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;The sample generates 100K entities by default on its first start now&lt;/span&gt;&amp;nbsp;- just to show that paging really works ;) This must take about 10 seconds on moderate PCs.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;MVVM-like models are passed to almost all the views now.&lt;/span&gt; That's good from the point of design.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Finally, I extracted a lot of common stuff to &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;a href="http://code.google.com/p/dataobjectsdotnet/source/browse/Sandbox/#Sandbox/AspNetMvcSample2/AspNetMvcSample/Helpers"&gt;Helpers&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;.&lt;/span&gt; They handle almost everything related to errors, messages and even web site title and header.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Finally, I created a set of screenshots showing various aspects of this sample and &lt;a href="http://goo.gl/F0Ns"&gt;shared them in Picasa&lt;/a&gt;.&amp;nbsp;Here they are (as slideshow):&lt;/div&gt;
&lt;embed flashvars="host=picasaweb.google.ru&amp;amp;captions=1&amp;amp;hl=en_US&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.ru%2Fdata%2Ffeed%2Fapi%2Fuser%2Falex.yakunin%2Falbumid%2F5457742043346846161%3Falt%3Drss%26kind%3Dphoto%26authkey%3DGv1sRgCNXF0ajFi6O6ZQ%26hl%3Den_US" height="533" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.ru/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="800"&gt;&lt;/embed&gt;
&lt;br /&gt;
&lt;br /&gt;
As usual, all the changes are already @ Google Code. Today's nightly build will include this sample as well.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=gyX3xdOHgyM:0PxryGJvg-E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=gyX3xdOHgyM:0PxryGJvg-E:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/gyX3xdOHgyM/new-aspnet-mvc-sample-update.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>3</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/04/new-aspnet-mvc-sample-update.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-8023658148682665165</guid><pubDate>Wed, 07 Apr 2010 22:39:00 +0000</pubDate><atom:updated>2010-04-08T19:22:55.309+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">announcements</category><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET MVC</category><title>New ASP.NET MVC Sample</title><description>I just pushed &lt;a href="http://code.google.com/p/dataobjectsdotnet/source/browse/#hg/Sandbox/AspNetMvcSample2"&gt;new ASP.NET MVC sample for DO4&lt;/a&gt;&amp;nbsp;to Google Code - actually, that's my today's attempt to create a new ASP.NET MVC application from scratch and try to&amp;nbsp;efficiently&amp;nbsp;use DO4 there.&lt;br /&gt;
&lt;br /&gt;
So far the sample is really simple:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;It is based on default ASP.NET MVC application template;&lt;/li&gt;
&lt;li&gt;But there is a new &lt;a href="http://code.google.com/p/dataobjectsdotnet/source/browse/Sandbox/AspNetMvcSample2/AspNetMvcSample/Controllers/PersonController.cs"&gt;PersonController&lt;/a&gt;, &lt;a href="http://code.google.com/p/dataobjectsdotnet/source/browse/Sandbox/AspNetMvcSample2/AspNetMvcSample/#AspNetMvcSample/Views/Person"&gt;views&lt;/a&gt; and &lt;a href="http://code.google.com/p/dataobjectsdotnet/source/browse/Sandbox/AspNetMvcSample2/AspNetMvcSample.Tests/Controllers/PersonControllerTest.cs"&gt;test for it&lt;/a&gt;. So it's possible to view, create and remove Persons there.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
The sample shows how to:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Handle DataObjects.Net model validation errors:&lt;/span&gt; you must notice I don't use ASP.NET validators at all there, so all the checks are performed by validation framework integrated into DO4. See &lt;a href="http://code.google.com/p/dataobjectsdotnet/source/browse/Sandbox/AspNetMvcSample2/AspNetMvcSample.Model/Person.cs"&gt;Person.OnValidate()&lt;/a&gt; method - there is even a type-level check. Obviously, this doesn't mean ASP.NET MVC validation is incompatible with DO4 - you can enable it by simply adding data annotations to&amp;nbsp;&lt;a href="http://code.google.com/p/dataobjectsdotnet/source/browse/Sandbox/AspNetMvcSample2/AspNetMvcSample/Models/PersonEditModel.cs"&gt;PersonEditModel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Handle version conflicts.&lt;/span&gt; Try to edit the same objects in two browser windows.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Implement View Model &amp;lt;-&amp;gt; Business Model mapping&lt;/span&gt; (as far as I understand, usage of separate view model is recommended pattern for ASP.NET MVC). I used pretty simple approach here - in fact, all the mapping code is located inside &lt;a href="http://code.google.com/p/dataobjectsdotnet/source/browse/Sandbox/AspNetMvcSample2/AspNetMvcSample/Models/PersonEditModel.cs"&gt;PersonEditModel&lt;/a&gt;&amp;nbsp;and its base type (&lt;a href="http://code.google.com/p/dataobjectsdotnet/source/browse/Sandbox/AspNetMvcSample2/AspNetMvcSample/Models/EntityModel.cs"&gt;EntityModel&lt;/a&gt;), but possibly, this is even better, since the sample is purely educational now.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Use transactions&lt;/span&gt; - both in ASP.NET MVC controllers and unit tests.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Rollback the transaction in case of errors.&lt;/span&gt; SQL Profiler will show that transactions are really rolled back in case of any errors. Btw, the same is true for tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
That's all for now.&amp;nbsp;Obviously, all this stuff is crude from the point of APIs (although I tried to make the code look nicer), but clear APIs is what I'm going to do during the next week. &lt;span class="Apple-style-span" style="color: #990000;"&gt;If you'll get any ideas related to possible improvements of this sample, please leave them in comments.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;a href="http://blog.alexyakunin.com/2010/04/new-aspnet-mvc-sample-update.html"&gt;Screenshots of this sample are shown here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;P.S. Yesterday I promised to write my ideas on ASP.NET MVC helpers - as you see, this part isn't completed yet. But I hard-coded a part of them :) Tomorrow I'll try to add an advanced grid to this sample - I want to evaluate the most important use cases first.&lt;/div&gt;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=M0-0KztZCq4:OuroAESRleA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=M0-0KztZCq4:OuroAESRleA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/M0-0KztZCq4/new-aspnet-mvc-sample.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/04/new-aspnet-mvc-sample.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-8500901772321946</guid><pubDate>Tue, 06 Apr 2010 21:35:00 +0000</pubDate><atom:updated>2010-04-07T03:36:52.022+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">announcements</category><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><title>Intermediate info on upcoming post about ASP.NET MVC 2 helpers</title><description>In short, I've spent all the day reading about ASP.NET MVC 2 and watching videos related to it. So far I'm really impressed - although there are still some minor lacks (e.g. I hate strings in code), there is a quite solid and consistent model.&lt;br /&gt;
&lt;br /&gt;
If I'd be choosing between ASP.NET MVC and classic ASP.NET for new web application&amp;nbsp;now, I'd definitely use ASP.NET MVC.&lt;br /&gt;
&lt;br /&gt;
I'm still thinking about possible helpers and samples we must provide for it. The post describing my thoughts will be published only tomorrow.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=3fG3A7fXsQE:7DN8557OxFE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=3fG3A7fXsQE:7DN8557OxFE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/3fG3A7fXsQE/intermediate-on-upcoming-post-about.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/04/intermediate-on-upcoming-post-about.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-5269864669606692306</guid><pubDate>Tue, 06 Apr 2010 08:23:00 +0000</pubDate><atom:updated>2010-04-06T14:24:36.216+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">performance</category><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><title>Why forced SQL statement caching isn't always a good option</title><description>&lt;a href="http://dmitrimaximov.blogspot.com/"&gt;Dmitri Maximov&lt;/a&gt; just sent me a link to an &lt;a href="http://www.sqlskills.com/BLOGS/KIMBERLY/post/EXEC-and-sp_executesql-how-are-they-different.aspx"&gt;article perfectly explaining why forced statement caching isn't always a good option&lt;/a&gt;. "Forced statement caching" (&lt;span class="Apple-style-span" style="color: #990000;"&gt;sp_executesql&lt;/span&gt; or &lt;span class="Apple-style-span" style="color: #990000;"&gt;sp_prepexec&lt;/span&gt;) is frequently used in ORM tools as default query execution approach.&lt;br /&gt;
&lt;br /&gt;
The subject of that article is related to DataObjects.Net - it has&amp;nbsp;so-called&amp;nbsp;&lt;a href="http://blog.alexyakunin.com/2009/12/boolean-branching-in-dataobjectsnet.html"&gt;boolean branchinf feature&lt;/a&gt;&amp;nbsp;influencing on produced queries (and thus their cached query plans as well).&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=OUHehxoTTAU:M4tzecL_shE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=OUHehxoTTAU:M4tzecL_shE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/OUHehxoTTAU/why-forced-sql-statement-caching-isnt.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/04/why-forced-sql-statement-caching-isnt.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-7501463007402906107</guid><pubDate>Mon, 05 Apr 2010 18:20:00 +0000</pubDate><atom:updated>2010-04-06T00:24:21.556+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">feature request</category><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><title>Xtensive.Practices, ASP.NET helpers</title><description>So I'm thinking about the following set of helpers to implement for regular ASP.NET:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #0b5394;"&gt;&lt;b&gt;1) SessionManager&lt;/b&gt;&lt;/span&gt;&lt;b&gt; from Xtensive.Storage.Web.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
If you don't know, this is an &lt;span style="color: #0b5394;"&gt;IHttpModule&lt;/span&gt; automatically providing Session for each web request. More details are described &lt;a href="http://forum.x-tensive.com/viewtopic.php?f=56&amp;amp;t=5832&amp;amp;p=14254&amp;amp;hilit=SessionManager#p14254"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
But to consider this part completed, it must be extended to&amp;nbsp;automatically attach a &lt;span style="color: #0b5394;"&gt;DisconnectedState&lt;/span&gt; to &lt;span style="color: #0b5394;"&gt;Session&lt;/span&gt; provided by it&amp;nbsp;for a particular web request. This feature might be quite useful for long-running transaction scenarios - e.g. wizards, where actual database modification must be performed only on the final step, although the data is updated during all the steps there.&lt;br /&gt;
&lt;br /&gt;
I'm thinking about the following syntax:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="color: #0b5394;"&gt;TData SessionManager.Demand().GetDisconnected&amp;lt;TData&amp;gt;(string key = null) where TData : class&lt;/span&gt;&amp;nbsp;will attach cached &lt;span style="color: #0b5394;"&gt;DisconnectedState&lt;/span&gt; and deserialize cached data (of &lt;span style="color: #0b5394;"&gt;TData&lt;/span&gt; type) after doing this. If result of this call isn't null, it will be serialized &amp;amp; placed back to cache on successful completion of transaction.&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #0b5394;"&gt;SessionManager.Demand().SetDisconnected&amp;lt;TData&amp;gt;(string key = null, TData value) where TData : class&amp;nbsp;&lt;span style="color: black;"&gt;will set the specified value. If null, the cached one will be removed.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;2) Validator control&lt;/b&gt; (of course, server-side only) that automatically validates version of a particular object (i.e. performs an optimistic version check).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Not sure to which control these validators must be attached - probably, they must be attachable only to our special invisible controls identifying the object.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Any ideas are welcome here.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;3) Paging helpers.&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Actually I'm absolutely not sure if this is necessary at all - there are&amp;nbsp;plenty&amp;nbsp;of paging examples for LINQ like &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/06/29/linq-to-sql-part-3-querying-our-database.aspx"&gt;this&lt;/a&gt; and &lt;a href="http://www.dbtutorials.com/display/linq-to-sql-paging-cs.aspx"&gt;that&lt;/a&gt;, and any of them must work.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So may be we must just add something like &lt;span style="color: #0b5394;"&gt;IQueryable&amp;lt;T&amp;gt;.Page(int pageSize, int pageIndex = 0)&lt;/span&gt; extension method with its LINQ translator forwarding it to &lt;span style="color: #0b5394;"&gt;.Skip(...).Take(...)&lt;/span&gt; sequence? But AFAIK all the grids for ASP.NET that support LINQ are capable of adding this sequence automatically.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Thus... May be we must just show a sample here?&amp;nbsp;Again, any ideas are welcome.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #990000;"&gt;Please leave your opinions and requests in comments. The similar post for ASP.NET MVC will appear shortly.&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=uc22ft0_IWc:dpb7H3nbdk0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=uc22ft0_IWc:dpb7H3nbdk0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/uc22ft0_IWc/xtensivepractices-aspnet-helpers.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>9</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/04/xtensivepractices-aspnet-helpers.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-3453753640522068210</guid><pubDate>Fri, 02 Apr 2010 12:20:00 +0000</pubDate><atom:updated>2010-04-02T18:20:23.529+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">documentation</category><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><category domain="http://www.blogger.com/atom/ns#">key generators</category><title>Topics related to KeyGenerator in our support forum</title><description>The most current search results for "KeyGenerator" keyword:&amp;nbsp;&lt;a href="http://goo.gl/dVzp"&gt;http://goo.gl/dVzp&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://forum.x-tensive.com/viewtopic.php?f=56&amp;amp;t=5655&amp;amp;hilit=KeyGenerator"&gt;This topic&lt;/a&gt; explains the concept pretty well.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=hSPKfZ__LDs:EcTFP9rpNpU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=hSPKfZ__LDs:EcTFP9rpNpU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/hSPKfZ__LDs/topics-related-to-keygenerator-in-our.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/04/topics-related-to-keygenerator-in-our.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-8912855360871054748</guid><pubDate>Thu, 01 Apr 2010 20:20:00 +0000</pubDate><atom:updated>2010-04-02T02:27:54.522+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">announcements</category><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><title>Birth of Xtensive.PnP (patterns and practices)</title><description>The time has come :) I'm going to establish &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Xtensive.PnP&lt;/span&gt; (patterns and practices) solution in our repository on this week.&lt;br /&gt;
&lt;br /&gt;
The idea behind this step is to &lt;span class="Apple-style-span" style="color: #274e13;"&gt;separate use case oriented code to a set of "PnP" assemblies&lt;/span&gt;. I have the following layout of this solution in my mind:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Xtensive.PnP.dll&lt;/span&gt; will contain all the code dependent only on DataObjects.Net&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Xtensive.PnP.&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Technology&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;.dll&lt;/span&gt; will contain the code dependent on a particular technology, e.g. there must be&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Xtensive.PnP.&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;AspNetMvc&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;.dll&lt;/span&gt;&amp;nbsp;for ASP.NET MVC 2.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
So to start using a particular pattern, you must:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Add reference to the assembly implementing it&lt;/li&gt;
&lt;li&gt;Register all the types from either the whole assembly or a particular namespace (if there are several patterns in this assembly) to &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;DomainConfiguration.Types&lt;/span&gt; to enable its support.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
What project are expected to be there? I imagine the following:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Web&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;: helpers related to ASP.NET applications; initially there will be just &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;SessionManager&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Wpf&lt;span class="Apple-style-span" style="color: black;"&gt;: helpers related to WPF applications. We must provide &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;SessionManager&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt; analogue there returning&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Session&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt; for the current &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Window&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt; or its part (this is quite desirable in MDI case) and allowing to propagate the changes among them. This part will be based on more advanced WPF sample we're working on.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;AspNetMvc&lt;span class="Apple-style-span" style="color: black;"&gt;: helpers related to ASP.NET MVC 2. Shortly I'll describe what I already have in mind here.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Wcf&lt;span class="Apple-style-span" style="color: black;"&gt;: helpers related to WCF. Such types as&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;DisconnectedResult&amp;lt;T&amp;gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt; and &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;ModificationSet&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&amp;nbsp;(from WCF sample) will be there.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Localization&lt;span class="Apple-style-span" style="color: black;"&gt;: reusable types from Localization sample.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;/span&gt;Security&lt;/span&gt;: our security framework. Initially there will be just base types for Principal, User and Role + service managing all of them and a set of helper extension methods to &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Session&lt;/span&gt; object.&amp;nbsp;Likely, ASP.NET Membership Provider will be there as well.&amp;nbsp;ACLs will appear there a bit later - our initial goal is to provide a basic API that can be used.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
My further PnP plans include:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Tagging&lt;/span&gt;: attaching tags to items is one of typical problems developers deal with, and we're going to help you a bit here - by providing a framework for this. The case here is very close to localization: we'll propose a working approach + some helpers (may be, query preprocessor - I'm not sure for now) simplifying usage of this API.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Sync&lt;/span&gt;: most likely it will be implemented as PnP pattern as well.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Undo-redo&lt;/span&gt;: "redo" support is already provided - it is our Operations framework used by &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;DisconnectedState&lt;/span&gt;. So here we must add undo operations logging support (by nearly the same way) and add few helper types allowing to persist these info for each executed transaction and study it later.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Multitenancy&lt;/span&gt;: if you're developing a SaaS application, you must think how to scale it up. So this pattern must help to solve this issue. Base tenant type (with arbitrary key), service and &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Session&lt;/span&gt; extensions allowing to specify current tenant, domain module that automatically adds either a reference to tenant type (or its key fields) to the beginning of each primary key and index, query preprocessor automatically injecting tenant-related constraint to any query and service automatically providing Domain for a particular tenant based on its hash is the implementation plan I keep in mind here.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Something else? Your ideas are welcome.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
I'm going to implement PnP project mainly by my own forces:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Although each of these projects seems pretty complex, its complexity is mainly related to design and the way of integration with DO4, but not the amount of code (from this point all the projects must be relatively simple). So it's a good task for framework architect.&lt;/li&gt;
&lt;li&gt;This might help me to gather more information related to practical usage of DO4.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
And, what's more important,&amp;nbsp;I'd like to involve you in this process. Currently I have the following implementation plan:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;I'll work in 2 week iterations&lt;/span&gt;; so almost any of PnP projects will require 2 or 4 weeks.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;First week in each iteration will be spent on gathering requirements and samples.&lt;/span&gt; To maintain a discussion, I'll create a topic in &lt;a href="http://forum.x-tensive.com/viewforum.php?f=28"&gt;feature requests forum&lt;/a&gt; for each feature (PnP project) planned to be implemented in this iteration, where I will describe the features I keep in mind and will discuss the exact implementation with you. I'd be glad to hear any ideas on proposed or additional features.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;By the end of first week I'll make final decision on actual implementation&lt;/span&gt;, as well as on implementation time.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;The actual work on implementation will be started on the beginning of the second week.&lt;/span&gt; If any issues will be faced there, I'll talk about them with you.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;When feature is implemented, it will immediately appear in the nightly build&lt;/span&gt; (possibly, this will be done even earlier). So it will appear in release&amp;nbsp;after some period of testing.&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Documentation for each feature will be written during next feature's spec. duscussion phase.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Finally, here is my plan for the next 4 weeks:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;April 5 - April 11&lt;/b&gt;: discuss features for&amp;nbsp;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Web&lt;/span&gt;, &lt;span class="Apple-style-span" style="color: #990000;"&gt;AspNetMvc&lt;/span&gt;&amp;nbsp;and &lt;span class="Apple-style-span" style="color: #990000;"&gt;Localization&lt;/span&gt; PnP projects and migrate existing code to PnP solution. The only new project here is AspNetMvc project, so that's why they come together. &lt;span class="Apple-style-span" style="color: #38761d;"&gt;Goal of this phase is to develop ASP.NET and ASP.NET MVC samples utilizing binding, error handling, versions (optimistic locking), validation, paging and DisconnectedState (e.g. for wizard).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;April 12 - April 18&lt;/b&gt;: implement the decisions.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;April 19 - April 25:&lt;/b&gt;&amp;nbsp;discuss features for&amp;nbsp;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Wpf&lt;/span&gt;&amp;nbsp;and&amp;nbsp;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Wcf&lt;/span&gt;&amp;nbsp;projects. I intentionally want to wait with this, since &lt;a href="http://deniskrjuchkov.blogspot.com/"&gt;Denis Krjuchkov&lt;/a&gt; is working on new WCF sample now.&amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;Goal of this phase is to develop N-tier and regular samples utilizing data binding, error handling, versions (optimistic locking), validation, paging and, obviously, DisconnectedState.&amp;nbsp;&lt;/span&gt;Likely, we'll start discussing all the stuff here immediately when it's done; moreover, corresponding projects will appear in PnP solution shortly after appearance of new sample. But since I'd like to have a realistic plan, let's schedule this for 3rd week for now. If the time will permit, we'll go faster.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;April 26 - May 2&lt;/b&gt;: implement the decisions.&lt;/li&gt;
&lt;li&gt;Having this done, I'll switch to &lt;span class="Apple-style-span" style="color: #990000;"&gt;Security&lt;/span&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
If you have any ideas on possible improvements for the proposed process, feel free to share them in comments.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
P.S. It seems I'm the only person @ Xtensive writing absolutely serious posts today. Hopefully, you already have got enough smiles during &lt;a href="http://en.wikipedia.org/wiki/April_Fools'_Day"&gt;April Fools' Day&lt;/a&gt; :)&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=QjxMVnX6Xw8:YBmil-yxjS0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=QjxMVnX6Xw8:YBmil-yxjS0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/QjxMVnX6Xw8/birth-of-xtensivepnp-patterns-and.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>7</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/04/birth-of-xtensivepnp-patterns-and.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-1543330556082429647</guid><pubDate>Thu, 01 Apr 2010 18:19:00 +0000</pubDate><atom:updated>2010-04-02T00:19:30.980+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">features</category><category domain="http://www.blogger.com/atom/ns#">disconnected state</category><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><title>Topics related to DisconnectedState in our support forum</title><description>I made search for "DisconnectedState" keyword in our support forum. Since this feature is &lt;a href="http://dataobjectsdotnet.googlecode.com/hg/Manual/06-DisconnectedOperations.htm#DisconnectedOperations"&gt;poorly documented yet&lt;/a&gt;, I hope this information will be helpful, if you're trying to use it.&lt;br /&gt;
&lt;br /&gt;
Here is the link to the most current search results: &lt;a href="http://goo.gl/xjGP"&gt;http://goo.gl/xjGP&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Btw, what do you think, is it a good idea - to add such search links to similar sections of Manual?&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=_V7a3w0lgGo:zs7u8a20LJY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=_V7a3w0lgGo:zs7u8a20LJY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/_V7a3w0lgGo/topics-related-to-disconnectedstate-in.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>2</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/04/topics-related-to-disconnectedstate-in.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-5594035078733637096</guid><pubDate>Thu, 01 Apr 2010 10:22:00 +0000</pubDate><atom:updated>2010-04-01T16:27:45.590+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">fun</category><title>"Guess, who" quest</title><description>Our designer just shared&amp;nbsp;&lt;a href="http://x-tensive.com/Wiki.aspx?Article=The_Team"&gt;the photos of our team members&lt;/a&gt; that, by his optinion, express their characters best of all. Definitely a "must see" page, if you'd like to know "who is who" @ our team ;)&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=WGK6nrXrHjc:b-1xnro885c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=WGK6nrXrHjc:b-1xnro885c:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/WGK6nrXrHjc/guess-who-quest.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/04/guess-who-quest.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-8559490928222466352</guid><pubDate>Thu, 01 Apr 2010 09:34:00 +0000</pubDate><atom:updated>2010-04-01T16:36:38.402+06:00</atom:updated><title>Dmitri Maximov talks about our new "Envy" project</title><description>Here is &lt;a href="http://dmitrimaximov.blogspot.com/2010/04/birth-of-envy-project.html"&gt;the whole story&lt;/a&gt;. If you'd like the idea, don't forget to leave a comment there. AFAIK, they spent a lot of time on planning and discussions.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=ksn2zbd_iIc:AOAF7tfqbls:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=ksn2zbd_iIc:AOAF7tfqbls:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/ksn2zbd_iIc/dmitri-maximov-talks-about-our-new-envy.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/04/dmitri-maximov-talks-about-our-new-envy.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-157020455422517420</guid><pubDate>Tue, 30 Mar 2010 04:28:00 +0000</pubDate><atom:updated>2010-03-30T10:42:52.803+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">announcements</category><category domain="http://www.blogger.com/atom/ns#">DataObjects.Net</category><title>DataObjects.Net v4.2 installer is updated</title><description>I finally decided to update v4.2 installer to the latest nightly build - there are few more minor fixes (the issues are described in our support forum). It is uploading to our &lt;a href="http://www.x-tensive.com//Downloads/Default.aspx?Path="&gt;Download area&lt;/a&gt;&amp;nbsp;right now.&lt;br /&gt;
&lt;br /&gt;
This also perfectly demonstrates our &lt;a href="http://blog.alexyakunin.com/2010/03/repository-layout-is-changed.html"&gt;new "continuous stability" policy&lt;/a&gt; - now we really can publish a bugfix release on the next day.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #990000;"&gt;Why next day?&lt;/span&gt; Currently each night is spent on thorough testing of "stable" branch:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Default test sequence conststs of 1020 storage-independent tests (Core, etc.) + 1550 storage-dependent ones on 10 different database engines (so &lt;i&gt;efficiently&lt;/i&gt; there are 1020 + 10 * 1550 tests) running on each commit. This sequence exposes about 95-99% of issues immediately.&lt;/li&gt;
&lt;li&gt;Nightly test sequence is&amp;nbsp;running all&amp;nbsp;storage-dependent tests in 6 different configurations (overriding default mappings with 3 different inheritance mapping strategies and 2 different TypeId mapping policies, &lt;a href="http://blog.dataobjects.net/2009/07/do4-continuous-integration-and-testing.html"&gt;details are here&lt;/a&gt;), so &lt;i&gt;efficiently&lt;/i&gt; there are 1020 + 60 * 1550 = 94K tests. And they really take several hours to run on our testing farm consisting of 4 dedicated, but moderate PCs. A joke around this: when a PC gets old, it is plugged into matrix as an Agent (our testing PCs are named AgentSmith, AgentJohnson, AgentThompson, etc.).&lt;/li&gt;
&lt;/ul&gt;
So on each morning it's quite precisely known if our current build is really stable.&lt;br /&gt;
&lt;br /&gt;
Viva &lt;a href="http://mercurial.selenic.com/"&gt;Mercurial&lt;/a&gt;! Viva &lt;a href="http://www.jetbrains.com/teamcity/"&gt;TeamCity&lt;/a&gt;!&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=lDZ1VrR0iD4:ezF1G5j92cY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=lDZ1VrR0iD4:ezF1G5j92cY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/lDZ1VrR0iD4/dataobjectsnet-v42-installers-are.html</link><author>noreply@blogger.com (Alex Yakunin)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/03/dataobjectsnet-v42-installers-are.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34303047.post-6250098013013360996</guid><pubDate>Mon, 29 Mar 2010 08:59:00 +0000</pubDate><atom:updated>2010-03-30T10:29:46.748+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ideas</category><category domain="http://www.blogger.com/atom/ns#">Skype</category><title>Xtensive Spectator: our corporate Skype bot :)</title><description>We use &lt;a href="http://www.skype.com/"&gt;Skype&lt;/a&gt; for for many of our in-company talks - mainly, because of its group chats. Historically we had "Came in, came out" chat there ("Пришел, ушел" in Russian) - and there are quite simple rules for writing into this chat:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;If employee enters our office, it writes "++" there (or "+1" ;) )&amp;nbsp;&lt;/li&gt;
&lt;li&gt;If employee leaves our office, it writes "--" there&lt;/li&gt;
&lt;li&gt;If someone starts to work @ home, it types "++ @ home", and vice versa&lt;/li&gt;
&lt;li&gt;Generally, it's a bad idea to write anything else to this chat.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Profit:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;All of us know when someone comes or leaves the office&lt;/li&gt;
&lt;li&gt;All of us know who cames too late (actually, this doesn't work as we expected)&lt;/li&gt;
&lt;li&gt;Finally, it's possible to make some statistics based on this info.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
The last part (statistics)&amp;nbsp;was implemented few months ago: Marat Faskhiev has written a Skype bot capable of participating in our "Came in, came out" chat and providing textual reports on commands like "report" sent to it personally.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Screenshots&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
++ and -- messages:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://2.bp.blogspot.com/_niouYlmVT4c/S7Biyj4lpzI/AAAAAAAAHtE/W3p1cOg3_q4/s1600/XS-PP.png" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_niouYlmVT4c/S7Biyj4lpzI/AAAAAAAAHtE/W3p1cOg3_q4/s320/XS-PP.png" /&gt;&lt;/a&gt; 
&lt;a href="http://2.bp.blogspot.com/_niouYlmVT4c/S7Biyj4lpzI/AAAAAAAAHtE/W3p1cOg3_q4/s1600/XS-PP.png" imageanchor="1"&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_niouYlmVT4c/S7BiziZaCNI/AAAAAAAAHtM/RgKvnurOH5A/s1600/XS-MM.png" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_niouYlmVT4c/S7BiziZaCNI/AAAAAAAAHtM/RgKvnurOH5A/s320/XS-MM.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
Reports:&lt;br /&gt;
&lt;a href="http://2.bp.blogspot.com/_niouYlmVT4c/S7Bi0nvN0cI/AAAAAAAAHtU/r5GB_6MSwjM/s1600/XS-R.png" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_niouYlmVT4c/S7Bi0nvN0cI/AAAAAAAAHtU/r5GB_6MSwjM/s320/XS-R.png" /&gt;&lt;/a&gt;
&lt;a href="http://4.bp.blogspot.com/_niouYlmVT4c/S7Bi1TgoNKI/AAAAAAAAHtc/uokls1CJcO0/s1600/XS-RM.png" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_niouYlmVT4c/S7Bi1TgoNKI/AAAAAAAAHtc/uokls1CJcO0/s320/XS-RM.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
("month" is report showing hours we spent in March; only a part of employees is visible on screenshots)&lt;br /&gt;
&lt;br /&gt;
Obviously, this is just a kind of evaluation for us - i.e. as far as I know, such a "big brother" isn't seriously taken into account by most of our employees; on the other hand, I believe finally it can be useful. Statistics it provides gives some insight on how much time people really spend on work, and which of them work harder.&lt;br /&gt;
&lt;br /&gt;
And, what is more attractive, such a bot can be extended to e.g. do the following:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Pariticipate in all important Skype chats as corporate chat recorder&lt;/li&gt;
&lt;li&gt;Provide browser-based UI allowing to search chat history &amp;amp; provide permalinks to certain discussions (e.g. related to bugs), and obviously, browse various statistics&lt;/li&gt;
&lt;li&gt;Operate as intagration point: e.g. with RSS feeds (most likely there are such bots), issue trackers, build server, Twitter and so on.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;So the question is:&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt; what do you think, can this tiny application evolve to a corporate tool for small companies like ours, that intensively use Skype, and what features must be added to it to make it really useful?&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #990000;"&gt;Btw, would you like to see it as DO4 sample application?&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=u3yFKneGqjQ:-bP69FE6uNI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AlexYakunin?a=u3yFKneGqjQ:-bP69FE6uNI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AlexYakunin?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AlexYakunin/~3/u3yFKneGqjQ/xtensive-spectator-our-corporate-skype.html</link><author>noreply@blogger.com (Alex Yakunin)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_niouYlmVT4c/S7Biyj4lpzI/AAAAAAAAHtE/W3p1cOg3_q4/s72-c/XS-PP.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.alexyakunin.com/2010/03/xtensive-spectator-our-corporate-skype.html</feedburner:origLink></item></channel></rss>
