<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" 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" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-2051886115581731342</atom:id><lastBuildDate>Wed, 27 Nov 2024 10:22:43 +0000</lastBuildDate><category>WPF</category><category>patterns</category><category>DM-V-VM</category><category>XAML</category><category>Ruby</category><category>localization</category><category>CAB</category><category>IoC</category><category>Rails</category><category>architecture</category><category>wizard</category><category>C#</category><category>Caliburn</category><category>Castle Windsor</category><category>DI</category><category>Django</category><category>ESB</category><category>NServiceBus</category><category>Python</category><category>REST</category><category>RSpec</category><category>RubyMine</category><category>TDD</category><category>git</category><category>messaging</category><category>nhibernate</category><category>pjsip4net</category><category>powershell</category><category>queue</category><category>sip</category><category>sql</category><category>voip</category><category>web</category><title>Boris Tveritnev&#39;s Blog - Roblog</title><description></description><link>http://robbbloggg.blogspot.com/</link><managingEditor>noreply@blogger.com (RobertT)</managingEditor><generator>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-5864597562223695777</guid><pubDate>Sun, 18 Jan 2015 22:10:00 +0000</pubDate><atom:updated>2015-01-18T14:15:05.410-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">architecture</category><title>Simple architecture harder than complex</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;I want to write about the architecture of my latest commercial software project I developed&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana; line-height: 18.3999996185303px; white-space: pre-wrap;&quot;&gt;(&lt;/span&gt;&lt;a href=&quot;http://iseepro.ru/&quot; style=&quot;font-family: Verdana; line-height: 18.3999996185303px; white-space: pre-wrap;&quot;&gt;http://iseepro.ru/&lt;/a&gt;&lt;span style=&quot;font-family: Verdana; line-height: 18.3999996185303px; white-space: pre-wrap;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;font-family: Verdana; line-height: 1.15; white-space: pre-wrap;&quot;&gt;and I want to do this in storytelling manner. The reason I chose a narrative style is that it is not the architecture itself that is valuable (there is nothing special about it as you going to see later), but the way we got to it, the decisions and considerations that led us to where we currently are. We were restricted on time and on budget (we had none of both), but nevertheless managed to come up with the best product available within the market (this is very subjective, until proven by others, forgive me). This is a story of simplifying everything to the very extreme.&lt;/span&gt;&lt;/div&gt;
&lt;b id=&quot;docs-internal-guid-bb775704-ff15-3463-8186-3c70251a8de7&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Before I start, please check out statistics. The infamous Chaos Report published by Standish Group in 1995 revealed horrible numbers - 84% of IT projects considered to be a failure. The experiment involved managers of all levels from several thousand companies throughout all industries involved in IT activities. Well, 1995 is almost Middle Ages, we can only feel sorry for IT dinosaurs. Technologies made a tremendous progress with time both in complexity of tasks solved and in easiness of adoption. We’d expect to have drastically different numbers nowadays, right? IBM have published results for a similar survey conducted in 2008. The numbers were not that promising either - 60% of projects failed in that or another way. Imagine, with .NET 3.5, Java 6, RoR 2.x, with all that goodness we failed almost every second project. Seems like the problem is not the technology alone. &amp;nbsp;The main reason why projects fail is the lack of focus (McKinsey, link). It is the lack of focus on business problem that leads to over-complicated solutions in a desperate rush for superfluous qualities. This is why we break the schedules and get out of budget. &lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Having this in our minds we started our Cash Control system development.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Cash Control systems are used to mitigate money loss risk at points of sale. They help fight internal and external fraud in retail. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The appliance is made of a CCTV system integrated with a set of analytical tools operating on devices’ event streams. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The system is relatively simple and functional requirements can be captured in these three simple bullet points. The system should be able to:&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; margin-left: 24px; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;mix and correlate video stream with device event stream, both in real-time and afterwards;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; margin-left: 24px; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;match risky behaviour patterns in device event flow in real-time with customizable templates;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; margin-left: 24px; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;provide post-analysis tools and generate reports by cashdesks, cashiers, goods and alerts found.&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Non-functional requirements can be captured with a relatively short list as well. System should be:&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; margin-left: 24px; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;open for integration with devices of different types:&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; margin-left: 48px; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;cashdesks&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; margin-left: 48px; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;petrol stations, etc.&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; margin-left: 24px; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;open for integration with different CCTV systems. Even though our default package includes our partner’s system, our client may have already invested in another CCTV &amp;nbsp;appliance. In this case we provide them with analytics tool package, integrating it with CCTV system of their choice.&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; margin-left: 24px; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;cross-platform;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; margin-left: 24px; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;scalable, as our clients may be as small as one shop with several cashdesks and as huge as a network of hypermarkets.&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;We set up our first goal to launch the system in a big hypermarket in Moscow in half a year. Please bear in mind that none of us left their primary occupation. &lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Can you imagine, how happy my inner architecture astronaut became, as he met this kind of challenge? Immediately, without a single moment of thinking, I got a message from stars with the overall system design. Nice, isn’t it? So here is the ideal world (or the world with lack of oxygen, it depends on how you see it) picture.&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDUTngahrw2FLo1jwthAH0cSIYawVtyz4kkbWWV53rvILBED1eZ-I2tsPMBR7kNI9edWamWIOy-vwOrGNaF5ZFrE8iW2XpculUC2jthf2XEaU8RJCxWkKzffqcVpRGJPuaKrqDI6Xsj7hJ/s1600/cosmos.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDUTngahrw2FLo1jwthAH0cSIYawVtyz4kkbWWV53rvILBED1eZ-I2tsPMBR7kNI9edWamWIOy-vwOrGNaF5ZFrE8iW2XpculUC2jthf2XEaU8RJCxWkKzffqcVpRGJPuaKrqDI6Xsj7hJ/s1600/cosmos.png&quot; height=&quot;288&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;This solution is so fucking universal that it could install and administer itself, if only my inner architecture astronaut stayed without oxygen a little longer. It can serve any client, no matter how big it is. Could it be another way if you have SPA, nginx, Thin, Cramp, node.js, NoSql, Mapreduce, amqp, RabbitMQ?! &lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;A couple of years ago I had a joy of attending QCon London. I spent two days in a row at my favourite real-life projects track. Should I mention, that by the end of the second day I had already had enough of MySQL to Postgres and vice versa epic changes? The last talk was performed by ex-googlers Triposo founders. And believe it or not, but I was rewarded for my patience by these guys. Their attitude seemed so different from others’. They didn’t bother building super reliable infrastructure, but used existing available infrastructure instead: they kept their knowledge base backups in Dropbox; had static content stored and served by Amazon S3; put dynamic settings to change applications’ behaviour into a Google docs spreadsheet. Em.. Whoat?! Google docs as a part of a system?! Believe it or not, but ex-googlers didn’t create a clusterized parallelized distributed highly available redundant infrastructure. They chose not to do it at all. Their capital expenses were huge enough to allow themselves two workstations under a kitchen table. That’s where all magic happens - these two stations generate and publish travel guides. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;So what’s so special about these guys? They managed to build a successful business, because they had focused on their competitive advantage - extensible knowledge base, automatic guide builder and UX. &lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Our competitive advantage to be focused on is the most convenient analytics toolset which allows to solve our clients’ real life issues. Our major clients are retail market networks. Our first playground is a hypermarket in Moscow. Facts are:&lt;/span&gt;&lt;/div&gt;
&lt;ol style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; margin-left: 24px; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Real-time monitoring performed by guards is not the main use case by any means. The main scenario is alert post-analysis performed by a security analyst. &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; margin-left: 24px; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Load is not evenly distributed throughout the day and has a certain profile. It grows slowly from morning till evening and reaches its peak at rush hours. It is almost flat around zero during nighttime. We may get a load increased by a factor of two or three at days before holidays and weekends. &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; margin-left: 24px; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Retail infrastructure is mostly built on Windows;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; margin-left: 24px; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Our software delivered on-premise. &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Data-layer.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;There is a NoSql database drawn by my inner architecture-astronaut. I salute this choice, in general, as long as it at least shows that you have thought about your data and the best way to store that. But this is less and less true nowadays. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;But why NoSQL? First of all, it is data volume. We’ve examined a cashdesk communication protocol and estimated our hypermarket to produce around 600К events daily or 200М annually. &amp;nbsp;With average message size balancing around 1 KB, it totals to ~600 MB daily, or ~200 GB annually for just one hypermarket. However, we should remember that several hypermarkets &amp;nbsp;united in a single network may generate an order of magnitude more events. NoSQL works well with huge amounts of non-relational data, as long as this data is easily distributable due to its nature. The second reason to opt for NoSQL is write performance. It is obvious, that write operations will prevail read operations in an aggregating system. NoSQL has a good write performance as long as these operations are as easy to distribute as it is easy to partition the data itself. And the last, but probably the most important reason to chose NoSQL, is the lack of schema. Initially we would prefer not to restrict a message schema as long as different protocols have different fields in messages. There are few messages with identical set of fields even within one protocol. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Considering the fact that we were going to need elaborate search instruments our best bet here would have been a document-oriented database, like MongoDB. To accommodate for a huge dataset we would have several instances holding several shards in a cluster, of course.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;However, as I’ve already noticed, we were going to deploy our product on-premise and we had to take into account unskilled personnel. They can handle routine tasks like a database backup without problem, yet database cluster support is far beyond their capabilities. That would have been a huge risk for the overall system reliability. Among other things, our client could invest money in a storage solution of their own. Chances are very high that it would be that or another RDBMS. You surely know that switching RDBMS is far easier than changing NoSQL db to relational, don’t you? But I could have dropped all these clever excuses in favor of one and simple reason - neither of us had a production experience with MongoDB. The end.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4VaAuffDvrqF79FBptlFEmnX9Gt5MgkQn4ITarKmPse5pKYy8MLizk7SErnFrPskrFbg2Z2SDRQe0PsdCBygXZqXPM9dDZcxmhX6fX-PTYbxcYq8D6eQu_K4q5kLEBG_K_CpNSwdx2aA-/s1600/mysql.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4VaAuffDvrqF79FBptlFEmnX9Gt5MgkQn4ITarKmPse5pKYy8MLizk7SErnFrPskrFbg2Z2SDRQe0PsdCBygXZqXPM9dDZcxmhX6fX-PTYbxcYq8D6eQu_K4q5kLEBG_K_CpNSwdx2aA-/s1600/mysql.png&quot; height=&quot;313&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;So, as you might have guessed by now, we chose to store our data in RDBMS - MySQL. As for the data volume - we decided to postpone this problem till we face it. After all, we could have not succeeded with this project at all.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Ok, so we now use relational storage, but what happened &amp;nbsp;to data? Is it relational now? We introduced canonical events model and started to translate any message arrived within any protocol supported into this model. Canonical events model effectively defines the data schema, we know the meaning of information we store and get rid of what we don’t care about. We threw every event message in one big table in denormalized form. We filled cashiers, cashdesks and goods dictionaries in parallel, duplicating data. Event itself can already include every goods or cashier attribute. Events table had no foreign keys to dictionaries, after all the fact that we used relational database didn’t bind us to normalize ad nauseam. &lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;After we ran our product in trial for several months, we noticed that our queries had gotten slower. Oh gosh, we forgot that our dataset increases indefinitely. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;After we analysed real processes, we found out that events older than three months are, basically, rubbish. Nobody ever goes that far to the past. We had to get rid of this garbage, but we had to guarantee constant system performance. I mentioned earlier, that we have a certain load profile with almost absolute zero during the night. We might have used that timespan to run cleanup tasks deleting hundreds of thousands of records. Sounds like a good idea, doesn’t it? There is one problem with this approach. Deletion is the most expensive operation in relational database. You certainly can run the query with hundreds of thousands of rows to be deleted, but it doubtfully would complete in a reasonable timeframe. There is an easier way to clean up a table - to truncate it. But could we truncate parts of tables? Sure we can, by partitioning the table! Where is my cap badge? &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;We partitioned our events table by months and set up a periodic task to truncate a four months old partition every once in a while. We killed two birds with one stone with this trick. We got almost constant query performance, as queries always operated on 1-3 partitions with the majority of them reading data from the latest one, and we solved the data amount problem. &lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Reports.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Short note about reports.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;After we got rid of NoSQL we lost a possibility to run Map-reduce tasks on our data easily. However, we were still able to aggregate data for reports of course. There is a standard approach to aggregate data in relational databases areal: OLAP. There are several solutions available out there to start analysing your relational data in many dimensions, free and paid. Yet after we analysed the structure of information we had, we came to conclusion that our database had almost a classical star ROLAP scheme. By adding facts tables that referenced dictionaries, that were dimensions by coincidence, we easily solved that not so easy task. We forked activewarehouse gem and adjusted it for our needs. We started with baked in ETL dsl to extract and transform events to facts and dimensions initially. We ran these scripts on periodic basis, yet it proved to be very error prone. Again, considering the fact that we already had ROLAP scheme at place, it suddenly dawned on me, that we could append facts at the very same moment we inserted events in our database. We introduced another subscriber responsible for just that task, and that was it. As a side benefit we got immediately actual reports. Easy-peasy.&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Comet.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;I won’t elaborate on why did we change async web server and async application framework in favor of Rails and Mongrel. I’ll just mention, that Rails is a really convenient and powerful tool for rapid application development, provided the application is as simple as ours. &lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Comet is a browser to server communication pattern incorporating a permanent connection used to push data changes from server to browser to achieve near real-time behaviour in Web. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;I once led a project where we had to communicate with millions of connected devices and propagate changes to web layer in near real-time fashion. We had found a powerful and scalable tool to solve this problem. The system was built with Erlang XMPP server software MongooseIM. This marvelous piece of software allowed us to handle extensive XMPP traffic along with BOSH traffic. It also holds a transient state for web layer. Prodigy.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Should I mention, that when I hear words ‘comet’, ‘device’, ‘real-time’ together in one sentence I first think about Mongoose? This case was no exception. However, considering the fact that no hypermarket possessed a thousandth part of devices this server was capable to serve (either alone or in cluster), I decided to hold this secret weapon and opt for equally cool WebSocket and node.js technology. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;WebSocket is a binary protocol, part of html5. Its main advantage is that it is a standard, rather than a proprietary technology built as a browser plugin, it is supported by most of modern web browsers. node.js is a very fast webserver with evented processing model built on top of &lt;/span&gt;&lt;span style=&quot;background-color: #f6f6ef; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;libev.&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; Unfortunately, we immediately found out that a Websocket is supported by IE starting with version 10, whereas our clients had IE9 installed in the majority of cases. All in all, Websocket was abandoned pretty fast, even before the first prototype was written. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;With devices’ communication protocol at hand I managed to calculate the load that a huge hypermarket (huge hypermarkets have up to 50 cashdesks here in Moscow) would have generated. I got an exaggerated number of 30 events per second. It means that our comet server would have to distribute 30*Nusers events per second. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;If you remember the facts I mentioned in the very beginning, it was said that there was only one case when monitoring has been involved - security supervision. Even the biggest markets hardly have more than one security desk. That means Nusers for monitoring equals 1. Moreover, if you consider the fact that you hardly ever see all the cashdesks working at the same time (the latests Ruble crisis is not a good example here), and the fact that one can hardly perceive more than 7 objects simultaneously, you’ll get a workload similar to something like this: 30*⅔*⅙ - this would be the real load on our comet server to get monitoring events. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Keeping in mind that the webserver was the least loaded part of the system, it would easily serve these requests, even with the primitive polling. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrvy2YnWQAHlAmDYSctBGABVoOBEurBY2vyYOoaWrVvvtu7iIJpgmM_kRXOsdUS4qHj4L7QGtswMtSbyFB44zACQ8Ns2_ppdPovGGJqSgVP4FloM2gyavnO_G1AZDOI9r5ZW76dQOciTjq/s1600/rails.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrvy2YnWQAHlAmDYSctBGABVoOBEurBY2vyYOoaWrVvvtu7iIJpgmM_kRXOsdUS4qHj4L7QGtswMtSbyFB44zACQ8Ns2_ppdPovGGJqSgVP4FloM2gyavnO_G1AZDOI9r5ZW76dQOciTjq/s1600/rails.png&quot; height=&quot;313&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;After a short prototyping iteration we ended up with solution incorporating EventMachine thread inside the web application. EventMachine hosted an amqp subscriber, consuming certain cashdesks’ events from transient queues, pushing them to memory buffers, that got popped out by a regular Rails controller serving Ajax requests issued by a client. There is one small thing to note here, we optimised the traffic a bit by doing long polling. This is how we got rid of WebSockets and node.js.&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.Net.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;This is controversial - throughout the story I was getting rid of system components as much as possible, and here I tell you that we brought a whole enterprise framework with us. What for?&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Well, first of all, we didn’t carry it with the solution. Every modern Windows Server OS has .Net framework preinstalled as a part of a system. We used .Net to develop our Watchdog service. The fact that we deployed on-premise means, that we had absolutely no chance to remotely administer our solutions. The system had to be rock solid, which was easier to achieve with native tools. This is why I wrote it with C#. All in all, Watchdog was not required to be portable across various platforms as other services were. It was implementation that was target OS dependent, and if we used a custom written code to automatically maintain our processes on Windows it didn’t mean we were supposed to take the same approach with other platforms. Something like crontab would solve the problem on *nix systems.&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9mj9kKwX0qK4FuHeAD8tl9V7FkvHQgDZwslxZkRqAmqw25Yi_oeGKntSI6zQPS2zBGSSnU5cWBfwEVlzCJCCKFWjrBVVrXIQ3rmfBezbHM4L6J2BR1Wt6Kg35PNiuZYqQN1AOB8rlmex0/s1600/watchdog.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9mj9kKwX0qK4FuHeAD8tl9V7FkvHQgDZwslxZkRqAmqw25Yi_oeGKntSI6zQPS2zBGSSnU5cWBfwEVlzCJCCKFWjrBVVrXIQ3rmfBezbHM4L6J2BR1Wt6Kg35PNiuZYqQN1AOB8rlmex0/s1600/watchdog.png&quot; height=&quot;320&quot; width=&quot;311&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;ActiveX. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;We were “lucky” to have ActiveX on board as all our clients used Windows workstations, and all video systems we had had integrated so far, provided ActiveX API to access video programmatically. So, we didn’t write a universal facade to video systems providing streaming and event publishing features. Instead, we sacrificed cross-platform features for the speed of development. This decision, together with many other small decisions we made, allowed us to get things done on time and on budget. After all, there were no guarantees that we would succeed, so we wanted to move fast with short sprints.&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Hardware&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;I bet you won’t guess the hardware we needed to host the solution. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;It were one or two average size servers, depending on the availability requirements our clients had. Yet there is not much you can do about availability, provided that you can’t ignore regular power outages on sites.&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Conclusions&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;We managed to deploy our first release in production after 6 month of development with 2 developers and one designer working part time. We supplied 90% of features required to compete on market.&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The reason we managed to get things done is that we focused on business features rather on technology avoiding valueless experiments. &lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhox8LDjVtswY0jEzK1CJHX3s4vLQwLQtQ0ZLdDn5UvqlVuuUk3-K6Ux85PTr7U8RbBPGSRjohlvM3yKCuN2iHMZnyfShm53Nsr00Y62RV3Qv2-8vmGfiZLHkavH12GhILuWCKEYL-YOHYv/s1600/simplest.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhox8LDjVtswY0jEzK1CJHX3s4vLQwLQtQ0ZLdDn5UvqlVuuUk3-K6Ux85PTr7U8RbBPGSRjohlvM3yKCuN2iHMZnyfShm53Nsr00Y62RV3Qv2-8vmGfiZLHkavH12GhILuWCKEYL-YOHYv/s1600/simplest.png&quot; height=&quot;288&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The end.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
</description><link>http://robbbloggg.blogspot.com/2015/01/simple-architecture-harder-than-complex.html</link><author>noreply@blogger.com (RobertT)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDUTngahrw2FLo1jwthAH0cSIYawVtyz4kkbWWV53rvILBED1eZ-I2tsPMBR7kNI9edWamWIOy-vwOrGNaF5ZFrE8iW2XpculUC2jthf2XEaU8RJCxWkKzffqcVpRGJPuaKrqDI6Xsj7hJ/s72-c/cosmos.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-4113333198994484736</guid><pubDate>Sun, 09 Nov 2014 22:23:00 +0000</pubDate><atom:updated>2014-11-09T14:40:55.661-08:00</atom:updated><title>Highload 2014</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;If you ever happened to hear about the biggest Russian IT conference Highload++, than you might be interested how it was. This is how it was for me this year:&amp;nbsp;&lt;a href=&quot;http://rsbb.tilda.ws/page232.html&quot; target=&quot;_blank&quot;&gt;Highload 2014&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;I have deliberately chosen an external publishing platform for their beautiful storytelling format. Give it a try - Tilda.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Cheers.&lt;/span&gt;&lt;/div&gt;
</description><link>http://robbbloggg.blogspot.com/2014/11/highload-2014.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-5501944959668570292</guid><pubDate>Tue, 28 Oct 2014 21:25:00 +0000</pubDate><atom:updated>2014-10-28T14:27:40.189-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">REST</category><category domain="http://www.blogger.com/atom/ns#">web</category><title>Why REST is not JSON over HTTP</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Because REST is distributed Hypermedia. THE END.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; font-family: Verdana, sans-serif; line-height: 24px;&quot;&gt;&lt;a href=&quot;http://fast.wistia.net/embed/iframe/s4aqt9esc0?popover=true&quot; target=&quot;_blank&quot;&gt;Modern Web Architectures&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Enjoy.&lt;/span&gt;&lt;/div&gt;
</description><link>http://robbbloggg.blogspot.com/2014/10/why-rest-is-not-json-over-http.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-605436019120933322</guid><pubDate>Thu, 24 Jul 2014 21:22:00 +0000</pubDate><atom:updated>2014-07-24T14:22:46.989-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">architecture</category><title>Teach your code to speak genteelly, nil is country speach</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Imagine you ask a person something, but he just stares at you&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;in response&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;. Or even worse, you tell one to do what you want, and he seems to get your command, but turns his back to you and you can&#39;t tell if he did what you asked him to or not. Did you imagine it?&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Congratulations! You have just got nil/null, whatever represents nothingness in your programming language, in response to a function call.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;The same way you think a person who doesn&#39;t react appropriately to your questions or requests is an ass-head, the same way function returning nil is a moron-function.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;I do know that there are cases when you have nothing to return, but this is either a&amp;nbsp;&lt;a href=&quot;http://martinfowler.com/eaaCatalog/specialCase.html&quot; target=&quot;_blank&quot;&gt;Special Case&lt;/a&gt;&amp;nbsp;or an exceptional situation. Let&#39;s consider two examples for query and command. Yes, to be genteel your code have to comply with&amp;nbsp;&lt;a href=&quot;http://en.wikipedia.org/wiki/Command%E2%80%93query_separation&quot; target=&quot;_blank&quot;&gt;CQS&lt;/a&gt;&amp;nbsp;principle.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;First - query. To be honest whether a special case or an exception is better depends very much on a context. Let&#39;s consider two query categories: query for data (information, data structure) and query for behaviour. First case is easy, you just fill your data structure with whatever it turns it to an empty state if it has a meaning or you raise an exception if you can&#39;t&amp;nbsp;fulfill a query. Easy peasy. The second case is a&amp;nbsp;little bit more complicated. Lets say, you write a polymorphic query function which is supposed to return objects with state and behaviour that may be used to do something. As long as it is polymorphic it is to change a behaviour when you work with descendant classes i.e. return different objects with different behaviour, but not every descendant alters a default behaviour. Oh, and there is no default behaviour. Natural choice? - Nil. But&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;if I put it another way: to do nothing IS a default behaviour, it becomes obvious that your best bet is a Special Case with no op strategy, rather then nil, completely nothing.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Now a command. I&#39;d separate two kinds of commands: those that you do not expect to return a result and those you do. The first type is naturally implemented by procedures. Some programming languages have a void return type built in. This is probably the only valid case to return nothing. However, if your language of choice has no built-in tools to mark the function as a procedure then treat all commands as those that return result. In this case you&#39;d probably return nothing in case you&#39;ve failed to accomplish request, which is the worst way to do. Rather use an exception to inform a caller that his request puts you into an exceptional case when you can&#39;t process a command request.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;All in all it is very easy to be polite to those who use your code and to those who read it.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;To be little bit more convincing I&#39;ll&amp;nbsp;again&amp;nbsp;reference one of the best programming books ever:&amp;nbsp;&lt;a href=&quot;http://books.google.de/books/about/Clean_Code.html?id=_i6bDeoCQzsC&quot; target=&quot;_blank&quot;&gt;Clean Code&lt;/a&gt;, and a very good&amp;nbsp;&lt;a href=&quot;http://stackoverflow.com/questions/3989264/best-explanation-for-languages-without-null&quot; target=&quot;_blank&quot;&gt;discussion&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;And as if that was not enough already I&#39;d quote&amp;nbsp;&lt;span style=&quot;background-color: white;&quot;&gt;Sir&amp;nbsp;&lt;a href=&quot;http://en.wikipedia.org/wiki/Tony_Hoare&quot; target=&quot;_blank&quot;&gt;Charles Antony Richard Hoare&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #333333; line-height: 27.733333587646484px;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;blockquote style=&quot;background-color: white; border: 0px; color: #333333; font-style: italic; line-height: 27.733333587646484px; margin: 0px 0px 0px 1.4em; outline: 0px; padding: 0px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;div style=&quot;border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; outline: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;I call it my&amp;nbsp;&lt;a href=&quot;http://qconlondon.com/london-2009/presentation/Null+References:+The+Billion+Dollar+Mistake&quot; target=&quot;_blank&quot;&gt;billion-dollar mistake.&lt;/a&gt;&amp;nbsp;It was the invention of the null reference in 1965. [...] More recent programming languages like Spec# have introduced declarations for non-null references. This is the solution, which I rejected in 1965.&lt;/span&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;P.S. Should I mention that passing nil/null as a function argument is even worse for very obvious reasons?&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;P.P.S.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;I&#39;d like to try a programming language without nils. Without nothing. You got it.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Cheers.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
</description><link>http://robbbloggg.blogspot.com/2014/07/teach-your-code-to-speak-genteelly-nil.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-5971891831467211291</guid><pubDate>Thu, 27 Mar 2014 23:04:00 +0000</pubDate><atom:updated>2014-03-27T16:04:44.228-07:00</atom:updated><title>Rails vs OOP or is it Rails feat. OOP?</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;Please mind that this note is as opinionated as can be. I believe this is the only way one can speak about Rails as RoR itself leave no room for doubts.&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;I believe Rails was meant for small to middle web sites development, and never meant to be a foundation for something bigger. Just read&amp;nbsp;&lt;a href=&quot;https://37signals.com/&quot; target=&quot;_blank&quot;&gt;37signals&lt;/a&gt;&#39;&amp;nbsp;&lt;a href=&quot;https://gettingreal.37signals.com/&quot; target=&quot;_blank&quot;&gt;Getting Real&lt;/a&gt;&amp;nbsp;book and you will understand that Rails is backed by a company with a no-grow philosophy. And so is Rails - it will never be as big as Java or .Net are.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;You can ignore this until you start develop a little bit more elaborate software. And this is where you have to get serious about OOP. But Rails provides no aid here. Instead, it leads you into trouble, because it puts too much pressure on you with conventions and especially with&amp;nbsp;&lt;a href=&quot;http://railsoopbook.com/&quot; target=&quot;_blank&quot;&gt;poor naming&lt;/a&gt;. (I am not trying to charge&amp;nbsp;&lt;a href=&quot;http://en.wikipedia.org/wiki/David_Heinemeier_Hansson&quot; target=&quot;_blank&quot;&gt;DHH&amp;nbsp;&lt;/a&gt;with that, after all naming is the weakest skill in IT community of all times.) Thousands of people fall into problems of not understanding where they should rethink Rails conventions and deviate from them, which leads to heated discussions whether Rails breaks OOP and how to keep producing quality maintainable and testable code with Rails (fat models/skinny controllers attempt, writing&amp;nbsp;&lt;b&gt;true&amp;nbsp;&lt;/b&gt;unit-tests with Rails, is ActiveRecord an anti-pattern, etc). Well the answer is - get to know some OOP theory. These are the problems OOP community have been solving for decades now and there is nothing really new about that.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;Oh wait, there is something new! Rails deserves special gratitude&amp;nbsp;for whetting community appetite for least known&amp;nbsp;&lt;a href=&quot;http://www.artima.com/articles/dci_vision.html&quot; target=&quot;_blank&quot;&gt;DCI&amp;nbsp;&lt;/a&gt;design pattern.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;Rails community experience lot&#39;s of agitation and controversy, and this couldn&#39;t be another way. The reason for this is that RoR emphasizes on developers&#39; productivity at the first place rather then being dogmatic about design. Understanding this may turn us to be a little bit less dogmatic about Rails&#39; usage.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;More to read:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;https://gettingreal.37signals.com/&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;http://railsoopbook.com/&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;http://objectsonrails.com/&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;http://www.leansoftwarearchitecture.com/&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;http://clean-ruby.com/&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;http://www.artima.com/articles/dci_vision.html&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;http://folk.uio.no/trygver/2008/commonsense.pdf&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;Good luck!&lt;/span&gt;&lt;/div&gt;
</description><link>http://robbbloggg.blogspot.com/2014/03/rails-vs-oop-or-is-it-rails-feat-oop.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-6296100736117966358</guid><pubDate>Sun, 04 Aug 2013 16:57:00 +0000</pubDate><atom:updated>2013-09-13T09:06:46.823-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">TDD</category><title>TDD adventures Part 1. Productive TDD from real life.</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Following is a real-life demonstration of how effective one may be applying TDD to solve tasks under stress conditions.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Imagine that you are limited on time, you are under stress and you have a task you&#39;ve never solved before. Did I mentioned that you don&#39;t know the problem domain? How would you tackle this problem? What would you say If I&#39;d tell you to write a test first? Sounds crazy, eh? You have so many things to do and you don&#39;t want to waste your time on testing. Afterwards, maybe... First you have to write... What are you going to write first? Remember, you aren&#39;t familiar with problem. Write a test.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Alright, now the problem statement is as follows:&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&quot;Compare two CIDR ranges.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;The&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;significant&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&amp;nbsp;part of IPv4 Address is prefix&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;a href=&quot;http://255.255.255.255/24&quot; style=&quot;color: #1155cc;&quot; target=&quot;_blank&quot;&gt;255.255.255.255/24&lt;/a&gt;&amp;nbsp;notation means that only the first 24 bits of the IPv4 address make up the network mask. The bits which are not included in the network mask are not important.&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;There are several ways to write a CIDR range&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;These representations are equivalent:&lt;/span&gt;&lt;br /&gt;
&lt;a href=&quot;http://255.255.255.255/24&quot; style=&quot;color: #1155cc;&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;255.255.255.255/24&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://255.255.255.0/24&quot; style=&quot;color: #1155cc;&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;255.255.255.0/24&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;a href=&quot;http://255.255.255.100/24&quot; style=&quot;color: #1155cc;&quot; target=&quot;_blank&quot;&gt;255.255.255.100/24&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Comparing CIDR Ranges&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Ranges can be in subset, superset, disjoint or equal to each other. Write a code comparing them&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;.&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;Fuck, I never knew what this CIDR notation ment. I should have read about it before. Alright, let&#39;s google it. Whoooaaa! I&#39;ll read through this for half an hour. What do I do? I&#39;ve already applied TDD in day to day job, I&#39;ll give it a try. First things first, I&#39;ll write down what I know about the problem. This is going to be my test list.&quot;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range has prefix and suffix parts;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Ranges with equal prefix and suffix are equal;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Only the Prefix of the IPv4 Address is Significant;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;A CIDR Range Has Multiple Representations;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;That will do for the moment. Which one of them do I pick first? I should pick the simplest one to implement it as fast as possible. The first one is an ideal candidate for &lt;b&gt;Starter Test&lt;/b&gt;.&quot;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;    [TestFixture]
    public class CidrRangeTests
    {
        [Test]
        [TestCase(&quot;23.45.67.89/16&quot;, 23, 16)]
        public void when_instantiated_parses_string_into_address_prefix_and_suffix(string range, byte expectedMostSignificantByte, byte expectedSuffix)
        {
            //arrange 
            //act
            var sut = new CidrRange(range);

            //assert
            Assert.AreEqual(expectedMostSignificantByte, sut.Prefix[0]);
            Assert.AreEqual(expectedSuffix, sut.Suffix);
        }
    }
&lt;/pre&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;Now that the test is written I am going to write the CidrRange class itself. Forgive me Kent, but I am about to jump over one step - I won&#39;t &lt;b&gt;Fake It,&lt;/b&gt;&amp;nbsp;I consider this code to be an&amp;nbsp;&lt;b&gt;Obvious Implementation &lt;/b&gt;and &#39;ll write it straight away. I had lot&#39;s of choclate and I can keep things in mind and I have very short time&quot;.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;    public class CidrRange
    {
        //auto-props for the sake of simplicity
        public byte Suffix { get; private set; }
        public byte[] Prefix { get; private set; }

        public CidrRange(string range)
        {
            //assert not null
            var parts = range.Split(&#39;/&#39;);
            //assert count 2
            var prefixParts = parts[0].Split(&#39;.&#39;);
            //assert count 4
            Prefix = prefixParts.Select(byte.Parse).ToArray();
            Suffix = byte.Parse(parts[1]);
        }
     }
&lt;/pre&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;Green bar, hooray. Time spent? 10 minutes. OK, whats next? The next simplest test to implement - the shortest way to the green bar, is the second one: Ranges with equal prefix and suffix are equal&quot;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;        [Test]
        [TestCase(&quot;23.45.67.89/16&quot;)]
        [TestCase(&quot;1.2.3.4/24&quot;)]
        [TestCase(&quot;172.84.26.128/16&quot;)]
        [TestCase(&quot;197.54.16.128/25&quot;)]
        public void when_prefix_and_suffix_are_equal_should_consider_other_to_be_equal(string range)
        {
            //arrange 
            var sut = new CidrRange(range);
            var other = new CidrRange(range);

            //act
            //assert
            Assert.AreEqual(sut, other);
        }
&lt;/pre&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;And again, I &lt;b&gt;triangulate&lt;/b&gt; and replace fake with implementation in one step. Remeber, I had lot&#39;s of chocolate.&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;        protected bool Equals(CidrRange other)
        {
            return Suffix == other.Suffix &amp;amp;&amp;amp; Prefix.SequenceEquals(other.Prefix);
        }
&lt;/pre&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;OK, running the tests gives me a green bar. Yeah baby. What do I have to complete?&quot;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range has prefix and suffix parts;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Ranges with equal prefix and suffix are equal;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Only the Prefix of the IPv4 Address is Significant;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;A CIDR Range Has Multiple Representations;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;OK, now stop and think. The last one seems to broaden the equality equation for CIDR range. If I put it another way it should be likethe following&quot;.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;when CIDR ranges with exact suffixes differ in insignificant bits, they are considered equal;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;Cool, I feel for the core of the solution. Now I&#39;ll think more about the former: Only the Prefix of the IPv4 Address is Significant, - I may rephrase it like the following&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;when CIDR ranges with exact suffixes differ in significant bits, they aren&#39;t considered equal;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;OK, so now my test list looks like this&quot;:&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range has prefix and suffix parts;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Ranges with equal prefix and suffix are equal;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;when CIDR ranges with equal suffixes differ in insignificant bits, they are considered equal;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;when CIDR ranges with equal suffixes differ in significant bits, they aren&#39;t considered equal;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;Let&#39;s code!&quot;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;        [Test]
        [TestCase(&quot;197.54.16.128/25&quot;, &quot;198.54.16.128/25&quot;)]
        public void when_significant_prefix_bits_differ_should_not_consider_other_to_be_equal(string leftRange, string rightRange)
        {
            //arrange 
            var sut = new CidrRange(leftRange);
            var other = new CidrRange(rightRange);

            //act
            //assert
            Assert.AreNotEqual(sut, other);
        }
&lt;/pre&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;Red bar. OK, obviously in order to implement desired behavior I can no longer compare bytes, I have to drill down to bits. What facilities does BCL provides for this? I remember BitConverter and also there is a BitArray class. A-ha! This is what I am going to use. The algorythm is simple: Given the CIDR range&amp;nbsp;&lt;a href=&quot;http://255.255.255.255/24&quot; style=&quot;color: #1155cc;&quot; target=&quot;_blank&quot;&gt;255.255.255.255/24&lt;/a&gt;&amp;nbsp;we know that only the first 24 bits of the IPv4 address make up the network mask, - it means I have to take a prefix, turn it into a bit array, take a suffix, turn it into another bit array starting from the most significant bit and perform a bitwise AND operation in order to get a network mask. After I got both masks, I have to perform an operation, that will tell me if there any difference between them. Well, luckily I had lot&#39;s of choclate, and it&#39;s obvious that I need to perform a bitwise XOR&quot;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;        protected bool Equals(CidrRange other)
        {
            return Suffix == other.Suffix &amp;amp;&amp;amp; PrefixesEquals(other);
        }

        private bool PrefixesEquals(CidrRange other)
        {
            var leftMask = new BitArray(Prefix);
            var leftSuffix = new BitArray(32, false);
            for (int i = 31; i &amp;gt;= Suffix; i--)
            {
                leftSuffix[i] = true;
            }
            leftMask = leftSuffix.And(leftMask);

            var rightMask = new BitArray(other.Prefix);
            var rightSuffix = new BitArray(32, false);
            for (int i = 31; i &amp;gt;= other.Suffix; i--)
            {
                rightSuffix[i] = true;
            }
            rightMask = rightSuffix.And(rightMask);

            var result = rightMask.Xor(leftMask);
            return result.Cast&lt;bool&gt;().ToArray().All(x =&amp;gt; !x);
        }
&lt;/bool&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;Hmmm, red bar. Something is wrong here.&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;After five minutes in debugger it appeared that I was creating bit array for mask based on prefix with bytes in reversed order.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;    public class CidrRange
    {
        //auto-props for the sake of simplicity
        public byte Suffix { get; private set; }
        public byte[] Prefix { get; private set; }

        public CidrRange(string range)
        {
            //assert not null
            var parts = range.Split(&#39;/&#39;);
            //assert count 2
            var prefixParts = parts[0].Split(&#39;.&#39;).Reverse();
            //assert count 4
            Prefix = prefixParts.Select(byte.Parse).ToArray();
            Suffix = byte.Parse(parts[1]);
        }
&lt;/pre&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;Arghhh, red bar. I&#39;m toast. Come on, keep it on, I&#39;ve almost found the solution and I&#39;ve got tests that will prove it. The broken test is simple - &lt;b&gt;Starter test&lt;/b&gt; expects to see bytes in reversed order, I&#39;ll fix it in a twinkle&quot;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;        [Test]
        [TestCase(&quot;23.45.67.89/16&quot;, 23, 16)]
        public void when_instantiated_parses_string_into_address_prefix_and_suffix(string range, byte expectedMostSignificantByte, byte expectedSuffix)
        {
            //arrange 
            //act
            var sut = new CidrRange(range);

            //assert
            Assert.AreEqual(expectedMostSignificantByte, sut.Prefix[3]);
            Assert.AreEqual(expectedSuffix, sut.Suffix);
        }
&lt;/pre&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;Finally! Green bar. It took me some time to get here, if I wasn&#39;t low on time I&#39;d better be going teeny weeny steps of &lt;b&gt;Fake&lt;/b&gt; and &lt;b&gt;Triangulate&lt;/b&gt;. OK, now the test list looks like the following&quot;.&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range has prefix and suffix parts;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Ranges with equal prefix and suffix are equal;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;when CIDR ranges with exact suffixes differ in insignificant bits, they are considered equal;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;strike&gt;when CIDR ranges with exact suffixes differ in significant bits, they aren&#39;t considered equal&lt;/strike&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;Let&#39;s code.&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;        [Test]
        [TestCase(&quot;23.45.67.89/16&quot;, &quot;23.45.68.00/16&quot;)]
        public void when_insignificant_prefix_bits_differ_should_consider_other_to_be_equal(string leftRange, string rightRange)
        {
            //arrange 
            var sut = new CidrRange(leftRange);
            var other = new CidrRange(rightRange);

            //act
            //assert
            Assert.AreEqual(sut, other);
        }
&lt;/pre&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;red bar, eh? I was supposed to get a green bar!&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;After another five minutes in debugger it appeared that I&#39;ve filled the suffix mask with wrong number of bits and took into account the least significant bits comparing network masks. Fix follows.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;        private bool PrefixesEquals(CidrRange other)
        {
            var leftMask = new BitArray(Prefix);
            var leftSuffix = new BitArray(32, false);
            for (int i = 31; i &amp;gt;= 32 - Suffix; i--)
            {
                leftSuffix[i] = true;
            }
            leftMask = leftSuffix.And(leftMask);

            var rightMask = new BitArray(other.Prefix);
            var rightSuffix = new BitArray(32, false);
            for (int i = 31; i &amp;gt;= 32 - other.Suffix; i--)
            {
                rightSuffix[i] = true;
            }
            rightMask = rightSuffix.And(rightMask);

            var result = rightMask.Xor(leftMask);
            return result.Cast&lt;bool&gt;().ToArray().Skip(32 - Math.Min(Suffix, other.Suffix)).All(x =&amp;gt; !x);
        }
&lt;/bool&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;A wonderful, beautiful green bar! OK, what do I have?&quot;

&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range has prefix and suffix parts;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Ranges with equal prefix and suffix are equal;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;when CIDR ranges with exact suffixes differ in insignificant bits, they are considered equal;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;strike&gt;when CIDR ranges with exact suffixes differ in significant bits, they aren&#39;t considered equal&lt;/strike&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;Well, this is not the end, but this was the most interesting part. Following is what left&quot;.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range has prefix and suffix parts;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Ranges with equal prefix and suffix are equal;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;when CIDR ranges with exact suffixes differ in insignificant bits, they are considered equal;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;strike&gt;when CIDR ranges with exact suffixes differ in significant bits, they aren&#39;t considered equal&lt;/strike&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range is a subset of another range if prefixes are equal and the suffix is greater;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range is a superset of another range if prefixes are equal and the suffix is less;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range is a disjoint of another range if prefixes differ;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;I&#39;ll take them one by one.&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;        [Test]
        [TestCase(&quot;1.2.3.4/24&quot;, &quot;1.2.3.4/16&quot;)]
        public void when_prefixes_are_equal_and_left_suffix_is_greater_should_consider_left_to_be_a_subset(string leftRange, string rightRange)
        {
            //arrange 
            var sut = new CidrRange(leftRange);
            var right = new CidrRange(rightRange);

            //act
            var actual = sut.CompareTo(right);
            var expected = sut.Prefix.SequenceEqual(right.Prefix) &amp;amp;&amp;amp; sut.Suffix &amp;gt; right.Suffix
                ? RangeIntersectionResult.Subset
                : RangeIntersectionResult.Disjoint;

            //assert
            Assert.AreEqual(expected, actual);
        }
&lt;/pre&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;Ranges comparison is not a boolean operation, because there are four possible results&quot;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;    public enum RangeIntersectionResult
    {
        Equals,
        Subset,
        Superset,
        Disjoint
    }
&lt;/pre&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;And to compare my range objects I will need another method.&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;        public RangeIntersectionResult CompareTo(CidrRange other)
        {
            if (Equals(other))
                return RangeIntersectionResult.Equals;

            if (PrefixesEquals(other) &amp;amp;&amp;amp; Suffix &amp;gt; other.Suffix)
                return RangeIntersectionResult.Subset;

            return RangeIntersectionResult.Disjoint;
        }
&lt;/pre&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;Green bar! Hooray.&quot;
&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range has prefix and suffix parts;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Ranges with equal prefix and suffix are equal;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;when CIDR ranges with exact suffixes differ in insignificant bits, they are considered equal;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;strike&gt;when CIDR ranges with exact suffixes differ in significant bits, they aren&#39;t considered equal&lt;/strike&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range is a subset of other range if prefixes are equal and the suffix is greater;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range is a superset of other range if prefixes are equal and the suffix is less;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range is a disjoint of other range if prefixes differ;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;        [Test]
        [TestCase(&quot;172.84.26.128/16&quot;, &quot;172.84.26.255/24&quot;)]
        public void when_prefixes_are_equal_and_left_suffix_is_less_should_consider_left_to_be_a_superset(string leftRange, string rightRange)
        {
            //arrange 
            var sut = new CidrRange(leftRange);
            var right = new CidrRange(rightRange);

            //act
            var actual = sut.CompareTo(right);
            var expected = sut.Prefix.Skip(1).SequenceEqual(right.Prefix.Skip(1)) &amp;amp;&amp;amp; sut.Suffix &amp;lt; right.Suffix
                ? RangeIntersectionResult.Superset
                : RangeIntersectionResult.Disjoint;

            //assert
            Assert.AreEqual(expected, actual);
        }
&lt;/pre&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;        public RangeIntersectionResult CompareTo(CidrRange other)
        {
            if (Equals(other))
                return RangeIntersectionResult.Equals;

            if (PrefixesEquals(other) &amp;amp;&amp;amp; Suffix &amp;gt; other.Suffix)
                return RangeIntersectionResult.Subset;
            if (PrefixesEquals(other) &amp;amp;&amp;amp; Suffix &amp;lt; other.Suffix)
                return RangeIntersectionResult.Superset;

            return RangeIntersectionResult.Disjoint;
        }
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range has prefix and suffix parts;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Ranges with equal prefix and suffix are equal;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;when CIDR ranges with exact suffixes differ in insignificant bits, they are considered equal;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;strike&gt;when CIDR ranges with exact suffixes differ in significant bits, they aren&#39;t considered equal&lt;/strike&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range is a subset of other range if prefixes are equal and the suffix is greater;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range is a superset of other range if prefixes are equal and the suffix is less;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range is a disjoint of other range if prefixes differ;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;        [Test]
        [TestCase(&quot;197.54.16.128/25&quot;, &quot;197.54.16.127/25&quot;)]
        [TestCase(&quot;205.00.00.1/32&quot;, &quot;205.00.00.00/32&quot;)]
        public void when_prefixes_are_different_should_consider_left_to_be_a_disjoint(string leftRange, string rightRange)
        {
            //arrange 
            var sut = new CidrRange(leftRange);
            var right = new CidrRange(rightRange);

            //act
            var actual = sut.CompareTo(right);
            var expected = !sut.Prefix.SequenceEqual(right.Prefix)//this is not exactly correct specification, but it&#39;s OK for the sake of simplicity
                ? RangeIntersectionResult.Disjoint
                : RangeIntersectionResult.Subset;

            //assert
            Assert.AreEqual(expected, actual);
        }
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range has prefix and suffix parts;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Ranges with equal prefix and suffix are equal;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;when CIDR ranges with exact suffixes differ in insignificant bits, they are considered equal;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;strike&gt;when CIDR ranges with exact suffixes differ in significant bits, they aren&#39;t considered equal&lt;/strike&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range is a subset of other range if prefixes are equal and the suffix is greater;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range is a superset of other range if prefixes are equal and the suffix is less;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CIDR range is a disjoint of other range if prefixes differ;&lt;/span&gt;&lt;/strike&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;- &quot;Time? Wow, I still got some time left.&quot;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;This is a real life story disproving the &lt;a href=&quot;http://www.pathfindersolns.com/archives/1168&quot; target=&quot;_blank&quot;&gt;myth of TDD&lt;/a&gt; nonproductiveness. Stay tuned as I&#39;ll continue my adventures in TDD.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Next time I will refactor this code in a quiet and peacful manner.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;P.S. You can find code &lt;a href=&quot;https://github.com/siniypin/katas&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
</description><link>http://robbbloggg.blogspot.com/2013/08/tdd-adventures-part-1-productive-tdd.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-3466399227663950883</guid><pubDate>Mon, 25 Mar 2013 18:33:00 +0000</pubDate><atom:updated>2013-03-25T11:33:58.503-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Ruby</category><category domain="http://www.blogger.com/atom/ns#">RubyMine</category><title>[Ruby frustrations] RubyMine rejects to debug your code?</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;In short - make sure, that you&#39;ve removed gem &quot;debugger&quot; from your Gemfile, and have only one gem ruby-debug-(ide|base19x) version. Then follow&amp;nbsp;&lt;a href=&quot;http://stackoverflow.com/questions/11074794/cant-install-ruby-debug-base19x-gem/11075890#11075890&quot; target=&quot;_blank&quot;&gt;these&lt;/a&gt;&amp;nbsp;instructions.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;Good luck.&lt;/span&gt;&lt;/div&gt;
</description><link>http://robbbloggg.blogspot.com/2013/03/ruby-frustrations-rubymine-rejects-to.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-4048607081420563052</guid><pubDate>Wed, 03 Oct 2012 07:31:00 +0000</pubDate><atom:updated>2012-10-03T00:31:22.051-07:00</atom:updated><title>[100efforts] What Productivity Factor is and how should one use it?</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;This is a post on how to use our&amp;nbsp;&lt;a href=&quot;http://100efforts.com/&quot; style=&quot;color: #666699;&quot; target=&quot;_blank&quot;&gt;requirements management and efforts estimation tool&lt;/a&gt;&amp;nbsp;and more precisely it is a discussion on what Productivity Factor is. It gives you a simple method of finding reasonable values&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;to start with,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;in order to receive results that align with real life from the very beginning.&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;background-color: #e0e0e0; color: #333333; font-family: Verdana, sans-serif; font-size: 13px; line-height: 19.5px;&quot; /&gt;
&lt;b style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;Productivity factor (PF)&lt;/b&gt;&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;&amp;nbsp;serves the purpose of translating Use Case points into man-hours. PF is a ratio of number of man-hours per use case point.&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot; /&gt;
&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;Needless to say that PF will be different for various teams and for various phases of a project. The more experienced and well managed team is the more effortless work is.&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot; /&gt;
&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;There are a number of empiric suggestions for choosing a PF value.&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot; /&gt;
&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;First of all, as suggested by industry experts,&amp;nbsp;&lt;/span&gt;&lt;b style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;PF should be between 15 and 30&lt;/b&gt;&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot; /&gt;
&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;Several studies has established&amp;nbsp;&lt;/span&gt;&lt;b style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;a typical PF value of 20&lt;/b&gt;&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;, that is why it is a default value for every release you create in 100effors.com&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot; /&gt;
&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;Use this&amp;nbsp;&lt;/span&gt;&lt;b style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;approach&lt;/b&gt;&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;&amp;nbsp;to adjust PF for a specific project or phase of a project:&lt;/span&gt;&lt;br /&gt;
&lt;ol style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px; list-style-image: initial !important; list-style-position: initial !important; margin: 0.5em 0px 0.5em 10px; padding: 0px 0px 0px 15px;&quot;&gt;
&lt;li style=&quot;background-image: url(http://www.blogblog.com/tictac/tictac_orange.gif); background-position: 0% 6px; background-repeat: no-repeat no-repeat; line-height: 18px; list-style: none; margin-bottom: 3px; padding-left: 14px;&quot;&gt;Count the number of environmental factor ratings of E1-E6 that are below 3 and the number of factor ratings of E7-E8 that are above 3.&lt;/li&gt;
&lt;li style=&quot;background-image: url(http://www.blogblog.com/tictac/tictac_orange.gif); background-position: 0% 6px; background-repeat: no-repeat no-repeat; line-height: 18px; list-style: none; margin-bottom: 3px; padding-left: 14px;&quot;&gt;If the total is 2 or less, then use 20 man-hours per UCP.&lt;/li&gt;
&lt;li style=&quot;background-image: url(http://www.blogblog.com/tictac/tictac_orange.gif); background-position: 0% 6px; background-repeat: no-repeat no-repeat; line-height: 18px; list-style: none; margin-bottom: 3px; padding-left: 14px;&quot;&gt;If the total is 3 or 4, use 28 man-hours per UCP.&lt;/li&gt;
&lt;li style=&quot;background-image: url(http://www.blogblog.com/tictac/tictac_orange.gif); background-position: 0% 6px; background-repeat: no-repeat no-repeat; line-height: 18px; list-style: none; margin-bottom: 3px; padding-left: 14px;&quot;&gt;If the total is 5 or more then consider restructuring the project team so that the numbers fall at least below 5. A value of 5 indicates that this project is at significant risk of failure with this team.&lt;/li&gt;
&lt;/ol&gt;
&lt;br style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot; /&gt;
&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;And for sure the most reliable method is your&amp;nbsp;&lt;/span&gt;&lt;b style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;past experience&lt;/b&gt;&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;.&amp;nbsp;&lt;/span&gt;&lt;b style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;Compare estimated and actual efforts&lt;/b&gt;&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;&amp;nbsp;of completed projects/phases (&lt;/span&gt;&lt;a href=&quot;http://100efforts.com/&quot; style=&quot;background-color: #fcfbfa; color: #336699; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px; text-decoration: none;&quot; target=&quot;_blank&quot;&gt;100efforts.com&lt;/a&gt;&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;&amp;nbsp;provides an easy tool for this) and perform adjustments of Productivity Factor for following releases accordingly.&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot; /&gt;
&lt;span style=&quot;background-color: #fcfbfa; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;How to set a Productivity Factor in &lt;/span&gt;&lt;a href=&quot;http://100efforts.com/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: #3d85c6;&quot;&gt;100efforts.com&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #555555;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ol style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px; list-style-image: initial !important; list-style-position: initial !important; margin: 0.5em 0px 0.5em 10px; padding: 0px 0px 0px 15px;&quot;&gt;
&lt;li style=&quot;background-image: url(http://www.blogblog.com/tictac/tictac_orange.gif); background-position: 0% 6px; background-repeat: no-repeat no-repeat; line-height: 18px; list-style: none; margin-bottom: 3px; padding-left: 14px;&quot;&gt;Open your project of interest&lt;/li&gt;
&lt;li style=&quot;background-image: url(http://www.blogblog.com/tictac/tictac_orange.gif); background-position: 0% 6px; background-repeat: no-repeat no-repeat; line-height: 18px; list-style: none; margin-bottom: 3px; padding-left: 14px;&quot;&gt;Be sure that you have already created at least one release for the project&lt;/li&gt;
&lt;li style=&quot;background-image: url(http://www.blogblog.com/tictac/tictac_orange.gif); background-position: 0% 6px; background-repeat: no-repeat no-repeat; line-height: 18px; list-style: none; margin-bottom: 3px; padding-left: 14px;&quot;&gt;Go to “Efforts” tab&lt;/li&gt;
&lt;li style=&quot;background-image: url(http://www.blogblog.com/tictac/tictac_orange.gif); background-position: 0% 6px; background-repeat: no-repeat no-repeat; line-height: 18px; list-style: none; margin-bottom: 3px; padding-left: 14px;&quot;&gt;Click on release name under “Use case points estimation” section and you’ll be landed on the “Summary” page&lt;/li&gt;
&lt;li style=&quot;background-image: url(http://www.blogblog.com/tictac/tictac_orange.gif); background-position: 0% 6px; background-repeat: no-repeat no-repeat; line-height: 18px; list-style: none; margin-bottom: 3px; padding-left: 14px;&quot;&gt;Click “Productivity factor (PF)” link to enter your value.&lt;/li&gt;
&lt;/ol&gt;
&lt;br style=&quot;background-color: #e0e0e0; color: #333333; font-family: Verdana, sans-serif; font-size: 13px; line-height: 19.5px;&quot; /&gt;
&lt;span style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px;&quot;&gt;References:&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;background-color: #fcfbfa; color: #555555; font-family: &#39;Trebuchet MS&#39;, Verdana, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 21px; list-style: none; margin: 0.5em 0px 0.5em 10px; padding: 0px 0px 0px 15px;&quot;&gt;
&lt;li style=&quot;background-image: url(http://www.blogblog.com/tictac/tictac_orange.gif); background-position: 0% 6px; background-repeat: no-repeat no-repeat; line-height: 18px; list-style: none; margin-bottom: 3px; padding-left: 14px;&quot;&gt;&lt;a href=&quot;http://www.ironspeed.com/articles/Estimating%20Software%20via%20Use%20Cases/article.aspx&quot; style=&quot;color: #336699; text-decoration: none;&quot; target=&quot;&quot;&gt;Estimating Software Via Use Cases&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;background-image: url(http://www.blogblog.com/tictac/tictac_orange.gif); background-position: 0% 6px; background-repeat: no-repeat no-repeat; line-height: 18px; list-style: none; margin-bottom: 3px; padding-left: 14px;&quot;&gt;&lt;a href=&quot;http://www.codeproject.com/Articles/9913/Project-Estimation-with-Use-Case-Points&quot; style=&quot;color: #336699; text-decoration: none;&quot; target=&quot;&quot;&gt;Project Estimation with Use Case Points&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</description><link>http://robbbloggg.blogspot.com/2012/10/100efforts-what-productivity-factor-is.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-373164617424513336</guid><pubDate>Mon, 16 Jul 2012 15:26:00 +0000</pubDate><atom:updated>2012-07-16T08:27:04.674-07:00</atom:updated><title>Status or state after all?</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; id=&quot;imcontent&quot;&gt;
&lt;span dir=&quot;ltr&quot; style=&quot;direction: ltr; font-family: Verdana, sans-serif; word-wrap: break-word;&quot;&gt;Which of them do you use and when?&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; id=&quot;imcontent&quot;&gt;
&lt;span dir=&quot;ltr&quot; style=&quot;direction: ltr; font-family: Verdana, sans-serif; word-wrap: break-word;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; id=&quot;imcontent&quot;&gt;
&lt;span dir=&quot;ltr&quot; style=&quot;direction: ltr; font-family: Verdana, sans-serif; word-wrap: break-word;&quot;&gt;This is what I&#39;ve decided for myself:&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; id=&quot;imcontent&quot;&gt;
&lt;span dir=&quot;ltr&quot; style=&quot;direction: ltr; font-family: Verdana, sans-serif; word-wrap: break-word;&quot;&gt;&quot;State&quot; - is a set of attributes that define object&#39;s behavior and have a state machine of transitions.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; id=&quot;imcontent&quot;&gt;
&lt;span dir=&quot;ltr&quot; style=&quot;direction: ltr; font-family: Verdana, sans-serif; word-wrap: break-word;&quot;&gt;&quot;Status&quot; - is an attribute that holds a single character value.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; id=&quot;imcontent&quot;&gt;
&lt;span dir=&quot;ltr&quot; style=&quot;direction: ltr; font-family: Verdana, sans-serif; word-wrap: break-word;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; id=&quot;imcontent&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Other options, suggested by my colleagues:&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; id=&quot;imcontent&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;use unthinkingly;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;use only one of them. always;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;That&#39;s it, good luck!&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><link>http://robbbloggg.blogspot.com/2012/07/status-or-state-after-all.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-4582624662051040830</guid><pubDate>Thu, 23 Feb 2012 09:50:00 +0000</pubDate><atom:updated>2012-02-23T07:44:19.364-08:00</atom:updated><title>A business to IT people collaboration tool announcement</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Something tells me that people occasionally landing this page are not so far from software development as my grandma is.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Thus, I suspect, some of you guys out there might find my new endeavour useful.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;We&#39;ve developed a tool to help collaborate on requirements and usecases, trace them and estimate project efforts.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;A tool I desperately needed at my fulltime job before.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Starting is simple, either someone adds you as a collaborator of his project and you get an email with a&amp;nbsp;signup&amp;nbsp;link, or you visit our awesome site and signup for our services&amp;nbsp;yourself.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx1X2oy67j1KDpPwJVrOpmQNbzkc7rTnyLwjzB4s9g42lj-IXZnjPpkCkjAownpboHlI9RFADWOhEH379uRXTzjPNcacdMVjSluK7VGtJr3I-pRULfJIJXiEomIKhF1ARrJ1bhjEVt-dM5/s1600/signup.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;221&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx1X2oy67j1KDpPwJVrOpmQNbzkc7rTnyLwjzB4s9g42lj-IXZnjPpkCkjAownpboHlI9RFADWOhEH379uRXTzjPNcacdMVjSluK7VGtJr3I-pRULfJIJXiEomIKhF1ARrJ1bhjEVt-dM5/s320/signup.png&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Nothing could have been easier. You will receive a welcome email and&amp;nbsp;can now start working. Anyone can create a project and become its&amp;nbsp;self perpetuating Creator.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjR0ThnpTg0Hu_XDhsJHghkCGJsq7xW2IaJAa2xBmp2fYcbvZPWzUGtxn6y88VR1W8C7OzcA0pjVtreLBA-ENzqjzmxlxhBgqC1lDO_v2pG7qGcQnIfagHhzMdfkxhSphQoTxmomqhrzCm/s1600/new_proj.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;155&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjR0ThnpTg0Hu_XDhsJHghkCGJsq7xW2IaJAa2xBmp2fYcbvZPWzUGtxn6y88VR1W8C7OzcA0pjVtreLBA-ENzqjzmxlxhBgqC1lDO_v2pG7qGcQnIfagHhzMdfkxhSphQoTxmomqhrzCm/s320/new_proj.png&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;After you&#39;ve created a project, you are welcome to invite more people to collaborate. When adding people to your project you have to assign them roles. There are three roles except for your exclusive one, namely: Project Owner - usually a business person in charge for requirements; Contributor - any one allowed to contribute to project&#39;s items, a Project Manager or Business Analyst; Viewer - a person, whose sole need is to read and observe activities boiling in a project.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBsD0mPu8jfSImnxLR6gBBIFmUFi8NrqMSQasN65iR0NlY01j27XTdLVTwRFFZlTxu1mSeAfhVYmEFnKdo0Z-FE3HogGFerlg1Xe8iujJcuCjl-xXIO2qfekF7Z7A2xbLRY6McXUo02j7U/s1600/collab.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;127&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBsD0mPu8jfSImnxLR6gBBIFmUFi8NrqMSQasN65iR0NlY01j27XTdLVTwRFFZlTxu1mSeAfhVYmEFnKdo0Z-FE3HogGFerlg1Xe8iujJcuCjl-xXIO2qfekF7Z7A2xbLRY6McXUo02j7U/s320/collab.png&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;So you&#39;ve created a project and invited your colleagues to collaborate with you. Then you start by creating requirements, functional and nonfunctional. You define a release, you declare it to be mandatory and, say if you know what Kano is, you declare it as a Must have.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij7lvWI2e_II45M0oRUEW-wI6o3jnccziSB_cQC6zUGExtBTdUfWMGJTQX1yAvqeyo7doqjMb5d8i-R6tiqhRgT8tNcNfsmv3Hl8HglZolUVf5OquaAusDSvJ5IczqqeUmZSatFuAcaavC/s1600/new_req.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;144&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij7lvWI2e_II45M0oRUEW-wI6o3jnccziSB_cQC6zUGExtBTdUfWMGJTQX1yAvqeyo7doqjMb5d8i-R6tiqhRgT8tNcNfsmv3Hl8HglZolUVf5OquaAusDSvJ5IczqqeUmZSatFuAcaavC/s320/new_req.png&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;You categorize your requirement with tags. Though we provide a powerful set of tools to search through requirements, to sort and filter by literally every attribute, it is always useful to have a short sticker on an item to filter fast. &amp;nbsp;Filter by releases is in place,&amp;nbsp;of course,&amp;nbsp;for you to laser focus on what&#39;s vital for you now.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgulFjeOu1QhYXC01_FjqjSF28A9OVFec17YgQ9lBuTbunUBDuDZKY7bdoLUzhyphenhyphenwnMT39fM7DIxf3WG6PZWLSE1aE0JyR8TtJaCcL5cEBIfYPlZbAppMkGb_j0rSgllTBxt3T9_2zJZp05r/s1600/req_with_tags.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;136&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgulFjeOu1QhYXC01_FjqjSF28A9OVFec17YgQ9lBuTbunUBDuDZKY7bdoLUzhyphenhyphenwnMT39fM7DIxf3WG6PZWLSE1aE0JyR8TtJaCcL5cEBIfYPlZbAppMkGb_j0rSgllTBxt3T9_2zJZp05r/s320/req_with_tags.png&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;After you&#39;ve created a requirement, your colleague takes up and traces it with a number of use cases that define works to be done to achieve required function. He also defines how complex a use case is and who is the actor to participate in it.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6udDCAeMgW4phACMIBal_LNVgkICs94ztZwvhFp3niBwQueusDQTCbZIJ3sUYAT3yyTTOGbYbgA_HhqBQiO7ZmrVjPhniKUgObwS2h8cDys5chT9-8s3xXIUJXWw4_nzvWeGnpfubDF0T/s1600/new_uc_1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqUMuuuWUIfl1kBBGlrEKCcV4J7jerjD1AIq59tA54Jj01FZkOZnfvp95uV0fUN_9awuQdvg48ghv7mYOrTNRLM05SsTdddqenpAiiPLMliDCOl9n_L5rUthmVU3vXO8ZKHJWMwhyphenhyphen9QYcl/s1600/new_uc_1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;155&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqUMuuuWUIfl1kBBGlrEKCcV4J7jerjD1AIq59tA54Jj01FZkOZnfvp95uV0fUN_9awuQdvg48ghv7mYOrTNRLM05SsTdddqenpAiiPLMliDCOl9n_L5rUthmVU3vXO8ZKHJWMwhyphenhyphen9QYcl/s320/new_uc_1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuDR0ri_HXZyJnkql3im1ixe_NpZZ64ZOVhf0GAnb6dUk9T6iHHZOOse28-OQ4Y1yGHixfS1H50QnH3N0m0cC6JmqyDqTCW6EiiZi0GRezuuqo5RiJ12CgD37NdMykoJ9NhuhjLhKUuUJH/s1600/new_actor.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;142&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuDR0ri_HXZyJnkql3im1ixe_NpZZ64ZOVhf0GAnb6dUk9T6iHHZOOse28-OQ4Y1yGHixfS1H50QnH3N0m0cC6JmqyDqTCW6EiiZi0GRezuuqo5RiJ12CgD37NdMykoJ9NhuhjLhKUuUJH/s320/new_actor.png&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;And now it comes to the most interesting moment, my favorite - discussion. You&#39;ve required something no one knows how to accomplish. What can they do? Comment on your requirement or usecase!&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVi-cu9k49nGMJexp8m0i6w1beIPGSaHJ9ybPFTdK0RT8yc1kJuT3gbBCpZ_4z7xSQVrM8OoHk0cKC5Uhyhaugp8DWu_pn-iQLz8UICOFbWUoSOq9nbH_i-jJGGs3S-U3d9dkwuQagicUJ/s1600/new_comment.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;169&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVi-cu9k49nGMJexp8m0i6w1beIPGSaHJ9ybPFTdK0RT8yc1kJuT3gbBCpZ_4z7xSQVrM8OoHk0cKC5Uhyhaugp8DWu_pn-iQLz8UICOFbWUoSOq9nbH_i-jJGGs3S-U3d9dkwuQagicUJ/s320/new_comment.png&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Ok, everything is fine. You&#39;ve managed to figure things out during your long discussion, and now you are ready to estimate how long it&amp;nbsp;will&amp;nbsp;take to develop a project you require.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHIfM2T8mY9bLee64zWxf83Ucrh0dmR-PMt_T8j_olj5AdrKUW2R06Pz4vlifg13-1qFcJDzWP_53Xv9GPVI2stfERDYrChiC69C5gX4J8EOqTaRtLMmbSmiNAtKETtM-DqR5tQ-jmr1nN/s1600/efforts.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;156&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHIfM2T8mY9bLee64zWxf83Ucrh0dmR-PMt_T8j_olj5AdrKUW2R06Pz4vlifg13-1qFcJDzWP_53Xv9GPVI2stfERDYrChiC69C5gX4J8EOqTaRtLMmbSmiNAtKETtM-DqR5tQ-jmr1nN/s320/efforts.png&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Wow, it turns out that it is a rather simple task to find an answer.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;The last thing to do is specify some details required to tune estimation calculation and you&#39;re through with it.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi73Zl6NuFl6WWRrLqsG9N7lGHc3EYrMzHUpvy-eJE8ufWzyVblcQH73K-PDkhqgOW9xYbsXo4Ezxe7UVopbVEzpyaRMP_FlvibxcTjSsuiRawqky7M-HLsE_PDJwLROqImjXQYafjAAEI_/s1600/factors.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;163&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi73Zl6NuFl6WWRrLqsG9N7lGHc3EYrMzHUpvy-eJE8ufWzyVblcQH73K-PDkhqgOW9xYbsXo4Ezxe7UVopbVEzpyaRMP_FlvibxcTjSsuiRawqky7M-HLsE_PDJwLROqImjXQYafjAAEI_/s320/factors.png&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvidTUODUXBkDbq2QkVL6MutOoYpulVuKFOAxCrN0S8KuRPOsg9TgVPOSDEl_rt2jBbBGD5MkQBQb-ga6PIqqBvgHMdFLjfFM3GVhAJ8BHTe_SkF6noVTVbBpvfOke9dALm8WgndVJclZd/s1600/efforts_details.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;159&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvidTUODUXBkDbq2QkVL6MutOoYpulVuKFOAxCrN0S8KuRPOsg9TgVPOSDEl_rt2jBbBGD5MkQBQb-ga6PIqqBvgHMdFLjfFM3GVhAJ8BHTe_SkF6noVTVbBpvfOke9dALm8WgndVJclZd/s320/efforts_details.png&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: white; color: #222222; line-height: 16px; text-align: -webkit-auto;&quot;&gt;So it goes&lt;/span&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;I want to remind you that we are still in early stage, and there are plenty of things we have to improve. We need your feedback in order to make our service the bestest =).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Good luck!&lt;/span&gt;&lt;/div&gt;</description><link>http://robbbloggg.blogspot.com/2012/02/business-to-it-people-collaboration.html</link><author>noreply@blogger.com (RobertT)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx1X2oy67j1KDpPwJVrOpmQNbzkc7rTnyLwjzB4s9g42lj-IXZnjPpkCkjAownpboHlI9RFADWOhEH379uRXTzjPNcacdMVjSluK7VGtJr3I-pRULfJIJXiEomIKhF1ARrJ1bhjEVt-dM5/s72-c/signup.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-4194062547973144084</guid><pubDate>Mon, 16 Jan 2012 13:04:00 +0000</pubDate><atom:updated>2012-01-16T05:06:46.401-08:00</atom:updated><title>How do you tell a good code?</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;background-color: white; text-align: -webkit-auto;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Agree with Ayende:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; text-align: -webkit-auto;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&quot;... most good code bases are actually fairly boring. That is pretty much the definition of a good codebase...&quot;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; text-align: -webkit-auto;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; text-align: -webkit-auto;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;a href=&quot;http://ayende.com/blog/153697/a-meta-post-about-negative-code-reviews&quot;&gt;Source&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; text-align: -webkit-auto;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; text-align: -webkit-auto;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Good luck!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</description><link>http://robbbloggg.blogspot.com/2012/01/how-do-you-tell-good-code.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-6141416812718931144</guid><pubDate>Sun, 15 Jan 2012 20:31:00 +0000</pubDate><atom:updated>2012-01-15T12:34:43.369-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Rails</category><category domain="http://www.blogger.com/atom/ns#">RSpec</category><category domain="http://www.blogger.com/atom/ns#">Ruby</category><title>Speed up rails3 rspec2</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;If you&#39;ve eventually fell asleep while waiting for your test suits to run, here&#39;s a good description on how to&amp;nbsp;&lt;a href=&quot;http://www.rubyinside.com/how-to-rails-3-and-rspec-2-4336.html&quot;&gt;speed it up&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;PS One little nitpick: all of the spork commands should be executed in bundle exec context as long we use bundler insted of rubygems.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Good luck!&lt;/span&gt;&lt;/div&gt;</description><link>http://robbbloggg.blogspot.com/2012/01/speed-up-rails3-rspec2.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-4574844628671280125</guid><pubDate>Tue, 13 Sep 2011 07:31:00 +0000</pubDate><atom:updated>2011-09-13T00:33:41.049-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">powershell</category><title>Calculate LOC with one line of code</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Found a very useful tip on how to quickly estimate the size of a project with only one line of powershell script.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Navigate to the root directory of your project and in powershell type the following:&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;(dir -include *.cs,*.xaml -recurse | select-string .).Count&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Thats it.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Good luck!&lt;/span&gt;&lt;/div&gt;
</description><link>http://robbbloggg.blogspot.com/2011/09/calculate-loc-with-one-line-of-code.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-2962203520114519082</guid><pubDate>Thu, 11 Aug 2011 21:23:00 +0000</pubDate><atom:updated>2011-08-11T14:24:11.684-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Caliburn</category><category domain="http://www.blogger.com/atom/ns#">WPF</category><title>Execute Caliburn coroutine in action pipeline without UI trigger</title><description>&lt;span class=&quot;Apple-style-span&quot;  &gt;Seems rather easy, isn&#39;t it? &lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;Just put it into Presenter&#39;s Execute method and the did is done. Well, should it be like that I wouldn&#39;t wake up in the night and write this stuff!&lt;br /&gt;Let&#39;s see what&#39;s there in Execute:&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNcxN9CnFwIBzc3BVb9rfqqXUPju0J1jOGTaqixEBmCOo8LEnn1gTsw784RyzWw2zz1MHvvlCcykEdbTFZD-0CDQTYHgYMWCn9tQicUQgcsFHTv7LajtY3TNYTcv2o7BstTGwwyMvcjyvH/s1600/Execute.png&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img style=&quot;cursor: pointer; width: 400px; height: 114px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNcxN9CnFwIBzc3BVb9rfqqXUPju0J1jOGTaqixEBmCOo8LEnn1gTsw784RyzWw2zz1MHvvlCcykEdbTFZD-0CDQTYHgYMWCn9tQicUQgcsFHTv7LajtY3TNYTcv2o7BstTGwwyMvcjyvH/s400/Execute.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5556458611999329202&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;So, it just packs every single coroutine it has in SequentialResult and execute &#39;em. No filters pipeline used, no routedMessage. None of your neat filters applied to these coroutines.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;You might ask what is the difference with executing coroutines as a result of some UI action, be it a routed event or a command. The answer is in the Caliburn.PresentationFramework.Actions namespace.&lt;br /&gt;To be prrecise it is an Action Execute overloaded method that in simple case of SynchronousAction does the following:&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgny_2HQNoMC41IRelbm6mxF8vH6U1nwVRSO7NLl_7_a3fI-He-N7Z4nGA2d6pyMlZpMqLEjb6BlrDNazfP5utI6Y5jC8sKBKjkyCfp1LpHB75gdXihXVpWhOoF3atanlBJKjV2i9YADV09/s1600/Action.png&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img style=&quot;cursor: pointer; width: 400px; height: 164px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgny_2HQNoMC41IRelbm6mxF8vH6U1nwVRSO7NLl_7_a3fI-He-N7Z4nGA2d6pyMlZpMqLEjb6BlrDNazfP5utI6Y5jC8sKBKjkyCfp1LpHB75gdXihXVpWhOoF3atanlBJKjV2i9YADV09/s400/Action.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5556461001273692354&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;namely calls preprocessor filters, delegates a call to method that might be returning coroutine, handles errors with rescue filters, calls postprocessor filters. That is a filter pipeline I am talking about.&lt;br /&gt;Well, seems that Caliburn has everything I need. And all I have to do is just use it. &lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;As header states there is no UI trigger, i.e. I want to execute a coroutine when nobody clicked a button, but rather on some external trigger. As an example, consider model update with call to any data storage during Presenter initialization stage.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;Enter DegenerateMessage. This intellectual piece of code is a data container that is being handed to participants on courutine call pipeline in order to hint what was the original method name called.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiizPcpSNZt7KHE2zpf589i1qiwzbSNk08B9P8r4m7j6tcwAS9e087u0yAy8YoeKoPbLjibZRcTIxVgrPFsTTJ69140-wQSda3erJWdQ_0OQctcf2bhxqUxQ4vChYFfYqGTMKY03dYZfElC/s400/DegenerateMessage.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5639585059981082194&quot; style=&quot;cursor: pointer; width: 332px; height: 400px; &quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;Another intellectual piece of code is DegenerateMessageTrigger. It is so damn smart that it knows that in order to trigger an action it has to pass a message to message handler!  &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTVcuGK9lX1K4Ih5-RgrYVCxp_Wfj2Rb3jPFmErDdj5HcVrUWAYKKWGjCjLGDs2Olt9wOMltuo1D6FtJot67MtqZaC0ZVW2to020HLi84bpCIueqCkYOHD66Tv1FnRGldWjMAJWLTLN2QK/s400/DegenerateTrigger.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5639585059309128450&quot; style=&quot;cursor: pointer; width: 400px; height: 211px; &quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;And yet another piece is a DegenerateMessageHandler. It really shouldn&#39;t be called that way as it performs really complicated things. Namely, it creates an ActionHost and when Process is called converts DegenerateMessage to an ActionMessage and put it into the standard Caliburn action pipeline.  &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjrQV6mkMSinCLzp5wtJPVJkCTCnkZjOXKrqIr6bZM-yhs0PXc38nvR3EC9EnhFBC26pNX6s3VpvnEI7BUhVFcY1HuLTDFRcpruXA9w_iy7LZwM2GqxMCommiOYk1vNUtM4_vFfRvBdbMx/s400/DegenerateHandler.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5639585054639428210&quot; style=&quot;cursor: pointer; width: 397px; height: 400px; &quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;If it seems like dancing on your head, then know that you are not alone. But wait, there is another part I forgot to mention. It is a simple interface IResultExecutor aimed to hide all that smart code under two methods accepting Expressions with lambdas calling methods that return coroutines.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;Oh, and there is yet another thing. With &lt;a href=&quot;http://caliburnmicro.codeplex.com/&quot;&gt;Caliburn Micro&lt;/a&gt; you can accomplish the same with &lt;a href=&quot;http://mikaelkoskinen.net/post/caliburn-micro-wp7-coroutines-without-user-input.aspx&quot;&gt;only one line of code&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;Cheers! &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</description><link>http://robbbloggg.blogspot.com/2011/08/execute-caliburn-coroutine-in-action.html</link><author>noreply@blogger.com (RobertT)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNcxN9CnFwIBzc3BVb9rfqqXUPju0J1jOGTaqixEBmCOo8LEnn1gTsw784RyzWw2zz1MHvvlCcykEdbTFZD-0CDQTYHgYMWCn9tQicUQgcsFHTv7LajtY3TNYTcv2o7BstTGwwyMvcjyvH/s72-c/Execute.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-5990515185288212543</guid><pubDate>Thu, 04 Aug 2011 07:01:00 +0000</pubDate><atom:updated>2011-08-04T00:02:04.634-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ESB</category><category domain="http://www.blogger.com/atom/ns#">messaging</category><category domain="http://www.blogger.com/atom/ns#">queue</category><title>The best explanation to ESB ever.</title><description>&lt;span class=&quot;Apple-style-span&quot;  &gt;I&#39;ve finally managed to reread some of old Udi&#39;s &lt;a href=&quot;http://www.udidahan.com/2007/04/28/the-enterprise-service-bus-and-your-soa/&quot;&gt;articles&lt;/a&gt; and suddenly realized that following few lines are the best explanation of what ESB is all about, ever.&lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;I never want to miss it again that is why I repost it right here in my blog.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;i&gt;&quot;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(51, 51, 51); &quot;&gt;it’s all in the message. Forget about remote method invocations and pub-subbing events—down on the wire it’s all just messages. The trick is to think of your system as passing messages at the application level as well.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(51, 51, 51); &quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;i&gt;&lt;p&gt;Asynchronous message passing over queues. It’s really quite simple.&lt;/p&gt;&lt;p&gt;Once you’ve packaged everything into the message, that message can be dynamically routed anywhere, and so can its responses. The application doesn’t need to bind against any specific endpoint—it just drops a message addressed to some logical location. Infrastructure can make sure that messages get to the logical recipient, even if they change physical locations.&lt;/p&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(51, 51, 51); &quot;&gt;That infrastructure is what brings about the “Bus” architectural style between your distributed components.&lt;/span&gt;&quot;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;As Udi says, you have to reread it several dozens of times, until it strikes to you.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;Good luck!&lt;/span&gt;&lt;/div&gt;</description><link>http://robbbloggg.blogspot.com/2011/08/best-explanation-to-esb-ever.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-6750350821219641520</guid><pubDate>Tue, 19 Jul 2011 20:03:00 +0000</pubDate><atom:updated>2011-07-19T13:50:33.626-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">git</category><title>Git ftp deploy</title><description>&lt;span class=&quot;Apple-style-span&quot;  &gt;With tools like git, NServiceBus, RoR and the rest, life seams to be better then ever.&lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;With git I&#39;ve managed to setup deployment with a matter of minutes. Just like this: &lt;a href=&quot;http://blog.wekeroad.com/2009/11/23/deploying-a-web-application-with-git-and-ftp&quot;&gt;http://blog.wekeroad.com/2009/11/23/deploying-a-web-application-with-git-and-ftp&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;There are other ways, probably even simplier: &lt;a href=&quot;http://ayende.com/blog/4836/primitive-git-auto-deploy&quot;&gt;http://ayende.com/blog/4836/primitive-git-auto-deploy&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;Good luck!&lt;/span&gt;&lt;/div&gt;</description><link>http://robbbloggg.blogspot.com/2011/07/git-ftp-deploy.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-7366057357030350340</guid><pubDate>Sun, 05 Jun 2011 19:17:00 +0000</pubDate><atom:updated>2011-06-05T12:17:40.420-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Django</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>Django newby frustrations.</title><description>&lt;span class=&quot;Apple-style-span&quot;  &gt;As you might already guessed, I am currently in a process of discovering two technologies I had no experience with before. &lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;This time I met a strange error running a Django tutorial web application: UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xe0...&lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;The simplest solution to this can be found here: &lt;a href=&quot;http://victor-k-development.blogspot.com/2010/07/unicodedecodeerror-django.html&quot;&gt;http://victor-k-development.blogspot.com/2010/07/unicodedecodeerror-django.html&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;But the roots of the problem and an ultimate solution are to be found here: &lt;a href=&quot;http://stackoverflow.com/questions/4237898/unicodedecodeerror-ascii-codec-cant-decode-byte-0xe0-in-position-0-ordinal&quot;&gt;http://stackoverflow.com/questions/4237898/unicodedecodeerror-ascii-codec-cant-decode-byte-0xe0-in-position-0-ordinal&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;Good luck!&lt;/span&gt;&lt;/div&gt;</description><link>http://robbbloggg.blogspot.com/2011/06/django-newby-frustrations.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-7224761589655169303</guid><pubDate>Sun, 05 Jun 2011 13:02:00 +0000</pubDate><atom:updated>2011-06-05T06:02:41.293-07:00</atom:updated><title>RoR newby frustrations</title><description>&lt;span class=&quot;Apple-style-span&quot;  &gt;As usual, trying to adopt something new is really is a frustration. And though Rails is about to be &quot;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(51, 51, 51); line-height: 22px; &quot;&gt;a breakthrough in lowering the barriers of entry to programming&lt;/span&gt;&quot; you will defenitely meet some errors that might stop you on your way.&lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;First thing I met was: &quot;[rake --tasks] rake aborted! no such file to load -- sqlite3/sqlite3_native&quot;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;The solution is really simple. Rake is telling you that it can&#39;t find a native library for sqlite. Well, just do what you&#39;ve been told. Give it a sqlite.dll/.so (depends on OS you are). Put it in $ruby_home\bin.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;Next thing to immedeately pop up, after I gave it what it wanted was: &quot;[rake --tasks] WARNING: Global access to Rake DSL methods is deprecated.&quot; This one is not as obvious as former. Solution to this one is desribed here: &lt;a href=&quot;http://benwoodall.com/2011/06/rails-global-access-to-rake-dsl-methods-is-deprecated/&quot;&gt;http://benwoodall.com/2011/06/rails-global-access-to-rake-dsl-methods-is-deprecated/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;That&#39;s it for now.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;a href=&quot;http://benwoodall.com/2011/06/rails-global-access-to-rake-dsl-methods-is-deprecated/&quot;&gt;&lt;/a&gt;Good luck! &lt;/span&gt;&lt;/div&gt;</description><link>http://robbbloggg.blogspot.com/2011/06/ror-newby-frustrations.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-5828698722483299627</guid><pubDate>Wed, 01 Jun 2011 16:26:00 +0000</pubDate><atom:updated>2011-06-01T09:27:13.071-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Rails</category><category domain="http://www.blogger.com/atom/ns#">Ruby</category><title>Installing rails on windows</title><description>&lt;span class=&quot;Apple-style-span&quot;  &gt;If you tried to install rails with gems and failed with message &quot;...No such file or directory&quot; - dont woly be hapy. Just folllow these instructions: &lt;a href=&quot;http://stackoverflow.com/questions/849660/how-to-stop-the-gem-utility-from-accessing-my-home-directory&quot;&gt;http://stackoverflow.com/questions/849660/how-to-stop-the-gem-utility-from-accessing-my-home-directory&lt;/a&gt;&lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;Good luck!&lt;/span&gt;&lt;/div&gt;</description><link>http://robbbloggg.blogspot.com/2011/06/installing-rails-on-windows.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-6672423846935572060</guid><pubDate>Tue, 24 May 2011 13:28:00 +0000</pubDate><atom:updated>2011-05-24T06:40:29.050-07:00</atom:updated><title>JetBrains dotPeek to rescue.</title><description>&lt;span class=&quot;Apple-style-span&quot;  &gt;I don&#39;t know how you faced the fact that Reflector is no longer free, but I for one was very-very dissapointed. Now, our favorite JetBrains team comes to rescue with their brand new tool called dotPeek.&lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;Go and get it &lt;a href=&quot;http://www.jetbrains.com/decompiler/&quot;&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;PS. Five minutes later I found another tool that will compete to take Reflector&#39;s place - JustDecompile from Telerik. It is &lt;a href=&quot;http://www.telerik.com/products/decompiling.aspx&quot;&gt;here&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;PPS. Also, there is a work being done for Silverlight by &lt;a href=&quot;http://denisvuyka.wordpress.com/2011/04/27/il-view-net-reflector-oss-alternative-in-silverlight/&quot;&gt;Denis Vuyka&lt;/a&gt; and there is another OSS tool to compete for our souls - &lt;a href=&quot;http://wiki.sharpdevelop.net/ilspy.ashx&quot;&gt;ILSpy&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;PPPS. Life is good again.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;Good luck.&lt;/span&gt;&lt;/div&gt;</description><link>http://robbbloggg.blogspot.com/2011/05/jetbrains-dotpeek-to-rescue.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-3024602484239778614</guid><pubDate>Mon, 16 May 2011 08:48:00 +0000</pubDate><atom:updated>2011-05-16T02:44:58.819-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">NServiceBus</category><title>NServiceBus Saga Idempotency</title><description>&lt;span class=&quot;Apple-style-span&quot;&gt;Should your business entities had a natural identifier (I think even a surrogate one would do in this case), it would be trivial to ensure idempotency of sagas, that drive their processing.&lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Just store that Id in a temporal saga storage and enqueue a handler that will guard your sagas as the first handler in NServiceBus endpoint pipe. Something like this one:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyvwcwpSs3rU33dYN89K6iYKuezHi2MWqDfK_4HoUhzMX6p_WRS76GAe-9kgji5GzzDm2dko2UnVVbWg99yPUWq6xj0uiAxIpUeX24nP518xuaPk1bbTSQbq8W9hwMXx1y1pbYJVt4LN9o/s400/handler.png&quot; style=&quot;cursor:pointer; cursor:hand;width: 400px; height: 98px;&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5607232453473480850&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;And don&#39;t forget to specify message handling order:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZIQ_45T3Hs3BTd9ek9GmxeRx6xciMXLefOs-jnBldRS2pJ91BXgeSolpSB8A3iUP8mXOavqBg_nbdNsLv3PmKD3CM5ltCdpYHP2TyZXBOzqGozRbPUQvzTz_DukpLceBxMrNoRCdHmpiv/s400/config.png&quot; style=&quot;cursor:pointer; cursor:hand;width: 400px; height: 98px;&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5607232454531835250&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Good luck!&lt;/span&gt;&lt;/div&gt;</description><link>http://robbbloggg.blogspot.com/2011/05/nservicebus-saga-idempotency.html</link><author>noreply@blogger.com (RobertT)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyvwcwpSs3rU33dYN89K6iYKuezHi2MWqDfK_4HoUhzMX6p_WRS76GAe-9kgji5GzzDm2dko2UnVVbWg99yPUWq6xj0uiAxIpUeX24nP518xuaPk1bbTSQbq8W9hwMXx1y1pbYJVt4LN9o/s72-c/handler.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-2924535837840329425</guid><pubDate>Thu, 07 Oct 2010 13:40:00 +0000</pubDate><atom:updated>2010-10-11T01:03:35.907-07:00</atom:updated><title>Applying monadic combinators to build simple parser</title><description>&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-family:verdana;&quot;&gt;After reading &lt;a href=&quot;http://blogs.msdn.com/b/lukeh/archive/2007/08/19/monadic-parser-combinators-using-c-3-0.aspx&quot;&gt;this article&lt;/a&gt;, it dawned on me, how easy it might be to write parsers using internal dsl syntax. Looks a bit clumsy in C#, yet rather expressive.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:verdana;&quot;&gt;I&#39;ve used wonderful &lt;a href=&quot;http://www.ohloh.net/p/magnum&quot;&gt;Magnum&lt;/a&gt; &lt;a href=&quot;http://code.google.com/p/magnum/&quot;&gt;library &lt;/a&gt;built by &lt;a href=&quot;http://drusellers.com/&quot;&gt;Dru Sellers&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/magnum/people/detail?u=ChrisFromTulsa&quot;&gt;Chris&lt;/a&gt; (creators of open source service bus MassTransit project) as a foundation, since it already contains a base for monadic parsers.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:verdana;&quot;&gt;As an example, look how easy it is to write a parser for following simple grammar, describing file version structure:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:verdana;&quot;&gt;&amp;lt;version&amp;gt; ::= &amp;lt;part&amp;gt;{&amp;lt;delim&amp;gt;&amp;lt;part&amp;gt;|&amp;lt;part&amp;gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:verdana;&quot;&gt;&amp;lt;part&amp;gt; ::= &amp;lt;positive integer&amp;gt;+ | &amp;lt;letter&amp;gt;+&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:verdana;&quot;&gt;&amp;lt;delim&amp;gt; ::= “.” | “,” | “(” | “)” | “ “&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:verdana;&quot;&gt;And parser in mere 10 lines of code:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style=&quot;font-family: verdana;&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq5fOKJiFfR5F0ZXlj4VqKcrhoxn4Bw9U9PsVQAwYigGYBajng7xZQsOamy7d605-CX7HTw4M9vzMpFr24P64scjCP_z0_0ql-7AwUrP1tV4cfeNQs1TA8DN0Bj-J_w5N-xLLxMrdLVYfq/s1600/versionparser.png&quot;&gt;&lt;img style=&quot;cursor: pointer; width: 400px; height: 259px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq5fOKJiFfR5F0ZXlj4VqKcrhoxn4Bw9U9PsVQAwYigGYBajng7xZQsOamy7d605-CX7HTw4M9vzMpFr24P64scjCP_z0_0ql-7AwUrP1tV4cfeNQs1TA8DN0Bj-J_w5N-xLLxMrdLVYfq/s400/versionparser.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5526691518623645794&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:verdana;&quot;&gt;Good luck!&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;</description><link>http://robbbloggg.blogspot.com/2010/10/applying-monadic-combinators-to-build.html</link><author>noreply@blogger.com (RobertT)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq5fOKJiFfR5F0ZXlj4VqKcrhoxn4Bw9U9PsVQAwYigGYBajng7xZQsOamy7d605-CX7HTw4M9vzMpFr24P64scjCP_z0_0ql-7AwUrP1tV4cfeNQs1TA8DN0Bj-J_w5N-xLLxMrdLVYfq/s72-c/versionparser.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-6934803763045122909</guid><pubDate>Tue, 21 Sep 2010 19:05:00 +0000</pubDate><atom:updated>2010-09-21T12:41:01.975-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">patterns</category><title>Dependency injection</title><description>Below is a presentation I&#39;ve recently made for my colleagues.&lt;br /&gt;&lt;br /&gt;My fellow java developer exclaimed: &quot;But this is ridiculous to make presentations about DI! Everybody supposed to know it!&quot; And this is a big &lt;a href=&quot;http://davybrion.com/blog/2009/04/at-this-point-id-prefer-java-developers-over-net-developers/&quot;&gt;difference&lt;/a&gt; between two worlds &lt;a href=&quot;http://davybrion.com/blog/2010/08/how-i-feel-about-the-net-world-lately/&quot;&gt;.Net &amp;amp; Java&lt;/a&gt;. In java even junior developers know benefits of DI, whereas you can find a senior developer having no knowledge of DI in .Net realm. I consider it to be a consequence of paying &lt;a href=&quot;http://ayende.com/Blog/archive/2010/08/03/microsoft.data-because-the-90s-were-so-good-we-want-to.aspx&quot;&gt;way to much attention&lt;/a&gt; to developers&#39; tools by Microsoft. &lt;a href=&quot;http://www.microsoft.com/visualstudio/en-us/lightswitch&quot;&gt;LightSwitch&lt;/a&gt; and &lt;a href=&quot;http://www.asp.net/webmatrix&quot;&gt;WebMatrix&lt;/a&gt; are a justification to my words. Hey guys, do you really think we are that stupid? Why constantly &lt;a href=&quot;http://ayende.com/Blog/archive/2010/08/04/microsoft.data-and-positioning.aspx&quot;&gt;lower the bar&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Nevertheles, if you are interested, check it out and browse for code examples that come with my presentation.&lt;div style=&quot;width: 425px;&quot; id=&quot;__ss_5250166&quot;&gt;&lt;strong style=&quot;margin: 12px 0pt 4px; display: block;&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/siniypin/dependency-injection&quot; title=&quot;Dependency injection&quot;&gt;Dependency injection&lt;/a&gt;&lt;/strong&gt;&lt;object id=&quot;__sse5250166&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=dependencyinjectiondi-100921100133-phpapp02&amp;amp;stripped_title=dependency-injection&amp;amp;userName=siniypin&quot;&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt;&lt;embed name=&quot;__sse5250166&quot; src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=dependencyinjectiondi-100921100133-phpapp02&amp;amp;stripped_title=dependency-injection&amp;amp;userName=siniypin&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style=&quot;padding: 5px 0pt 12px;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://rapidshare.com/files/420416655/DI.rar&quot;&gt;Code&lt;/a&gt; as I promised.&lt;br /&gt;&lt;br /&gt;Good luck!&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</description><link>http://robbbloggg.blogspot.com/2010/09/dependency-injection.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-1151370478677666544</guid><pubDate>Sun, 12 Sep 2010 20:57:00 +0000</pubDate><atom:updated>2010-09-12T14:46:54.152-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Castle Windsor</category><category domain="http://www.blogger.com/atom/ns#">DI</category><category domain="http://www.blogger.com/atom/ns#">IoC</category><title>Windsor Castle BuildUp</title><description>&lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt;Good news, everyone! I&#39;ve discovered a way to enhance a brilliant &lt;a href=&quot;http://using.castleproject.org/display/IoC/Home&quot;&gt;DI-container Castle Windsor&lt;/a&gt; with not so brilliant feature as BuildUp.&lt;br /&gt;&lt;br /&gt;Saying that it is not that brilliant I mean that this feature is a beast, actually. It is an open door to violate DI principles, and there are more elegant ways to overcome a problem of having to resolve an external object through DI-container. After all, if Castle team considered this feature useful, they would roll it out long time ago, have no doubt!&lt;br /&gt;However, in my case it is a matter of time, to have an opportunity of resolving existing object&#39;s dependencies through DI-container, built as fast as possible. That is why I turned to BuildUp feature that some &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ff649576.aspx&quot;&gt;other DI-frameworks have&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I was really amused with Windsor&#39;s &lt;a href=&quot;http://using.castleproject.org/display/IoC/Extension+points&quot;&gt;degree of extendability&lt;/a&gt; and how trivial my solution appeared.&lt;br /&gt;&lt;br /&gt;BuildUp functionality is closed up under &lt;a href=&quot;http://www.tunatoksoz.com/post/Castle-Custom-Component-Activators.aspx&quot;&gt;ComponentActivator&lt;/a&gt;. Activators are called when LifetimeManager considers that a new object has to be created. And that logically brings us to restriction of this solution - it won&#39;t work with Singleton lifestyle. But it shouldn&#39;t actually! When you mark an object as a singleton - you effectively state that a container is going to be an owner of that object, thus it won&#39;t ever be built externally.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0PBhxoeMPu5tbIBUWbRkOrVn4nzpmNtMM2oqqEnkBNGa2iiKkL9rnFbOKqv4SpWm9zokD6xwih3aBF7YOmOMnZM0APnnf-sbvxv0j-kkwzOOD18Fv2y6c8b9Pp3xWfyXd6ZR6F9hIH-vc/s1600/BuildUpActivator.png&quot;&gt;&lt;img style=&quot;cursor: pointer; width: 400px; height: 178px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0PBhxoeMPu5tbIBUWbRkOrVn4nzpmNtMM2oqqEnkBNGa2iiKkL9rnFbOKqv4SpWm9zokD6xwih3aBF7YOmOMnZM0APnnf-sbvxv0j-kkwzOOD18Fv2y6c8b9Pp3xWfyXd6ZR6F9hIH-vc/s400/BuildUpActivator.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503375062314952850&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt;BuildUpComponentActivator extends &lt;/span&gt;&lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt;DefaultComponentActivator &lt;/span&gt;&lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt;and overrides a single method - Instantiate. This guy is a cheater, as you might guess, it never creates an object, but simply read it from context. All the dirty job of deriving dependencies is done by a parent class.&lt;/span&gt; &lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt;Should &lt;/span&gt;&lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt;BuildUpComponentActivator &lt;/span&gt;&lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt; fail to find an object in context, it will simply delegate all work to parent, and a new object will be created.&lt;/span&gt;&lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt; This is done to support resolving objects of the same type managed by container.&lt;br /&gt;&lt;br /&gt;Context is a dictionary, created with BuildUp extension method:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA1T0DkHlm3bDRbmQR1a46xMVz7ama5F8PtMdRYPcnicrswXdJsgmt3D80lDoMnqsjPA2N3rF1vSlPPqi0EGxzPWn1ypcaAfQNoAqVsx2ZUYqRGRCjycR_vx2EOzuIootdULYf9GbiOyx8/s1600/BuildUpContainerExt.png&quot;&gt;&lt;img style=&quot;cursor: pointer; width: 400px; height: 117px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA1T0DkHlm3bDRbmQR1a46xMVz7ama5F8PtMdRYPcnicrswXdJsgmt3D80lDoMnqsjPA2N3rF1vSlPPqi0EGxzPWn1ypcaAfQNoAqVsx2ZUYqRGRCjycR_vx2EOzuIootdULYf9GbiOyx8/s400/BuildUpContainerExt.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503375068586807362&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In order to be able to build up an object, one have to modify it&#39;s registration and override ComponentActivator setting. CanBeBuiltUp is a neat extension method wrapping this call for Windsor fluent registration API.&lt;br /&gt;&lt;br /&gt;There is only one shortcoming with this solution I came with - it doesn&#39;t provide you with any facilities to release this external object&#39;s dependencies. It has to be done manually somewhere.&lt;br /&gt;&lt;br /&gt;Please note, that there are &lt;a href=&quot;http://www.primordialcode.com/blog/post/castle-windsor-resolve-dependencies-existing-object-instance&quot;&gt;other solutions to this problem&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Good luck!&lt;br /&gt;&lt;/span&gt;</description><link>http://robbbloggg.blogspot.com/2010/09/windsor-castle-buildup.html</link><author>noreply@blogger.com (RobertT)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0PBhxoeMPu5tbIBUWbRkOrVn4nzpmNtMM2oqqEnkBNGa2iiKkL9rnFbOKqv4SpWm9zokD6xwih3aBF7YOmOMnZM0APnnf-sbvxv0j-kkwzOOD18Fv2y6c8b9Pp3xWfyXd6ZR6F9hIH-vc/s72-c/BuildUpActivator.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2051886115581731342.post-48009709978359465</guid><pubDate>Mon, 30 Aug 2010 19:10:00 +0000</pubDate><atom:updated>2011-05-16T01:51:38.917-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">pjsip4net</category><category domain="http://www.blogger.com/atom/ns#">sip</category><category domain="http://www.blogger.com/atom/ns#">voip</category><title>My two cents in OSS. Free VOIP .Net library.</title><description>&lt;span  &gt;Good news, everyone!&lt;br /&gt;&lt;br /&gt;A brand new pure OOP VOIP open souce library has just entered the .Net realm - pjsip4net. This is my projection of plain &quot;2D&quot; procedural C library &lt;a href=&quot;http://www.pjsip.org/&quot;&gt;pjsip&lt;/a&gt; into &quot;3D&quot; world of objects. It is so trendy to go 3D nowadays that I just couldn&#39;t resist. =)&lt;br /&gt;&lt;br /&gt;To be correct pjsip4net is a wrapper above high-level &lt;a href=&quot;http://www.pjsip.org/pjsip/docs/html/group__PJSUA__LIB.htm&quot;&gt;pjsua&lt;/a&gt; API. It provides you with readymade user agent capable to issue calls over SIP &amp;amp; (S)RTP protocols via UDP or TCP or even TLS from your .Net code.&lt;br /&gt;&lt;br /&gt;Actually, this code is still under construction due to my constant need to improve. But keep your wig on, it is already usable and tested.&lt;br /&gt;&lt;br /&gt;I have covered prety much everything in pjsua API, but still this is what you can do with it:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span  &gt;register at SIP server;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span  &gt;select a sound device;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span  &gt;select and prioritize codecs;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span  &gt;call another party;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span  &gt;auto answer;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span  &gt;auto conference (all calls will be marshalled to one big conference);&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span  &gt;NAT traversal (STUN, TURN, ICE);&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span  &gt;&lt;span&gt;blah blah blah with other party.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;  &gt;Enter pjsip4net: &lt;a href=&quot;http://code.google.com/p/pjsip4net/&quot;&gt;http://code.google.com/p/pjsip4net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Good luck!&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;</description><link>http://robbbloggg.blogspot.com/2010/08/my-two-cents-in-oss-free-voip-net.html</link><author>noreply@blogger.com (RobertT)</author><thr:total>1</thr:total></item></channel></rss>