<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-956064359108114628</id><updated>2012-01-20T11:19:52.062+02:00</updated><category term='Reality'/><category term='Technology'/><category term='Seam'/><category term='Selenium'/><category term='Hibernate'/><category term='Philosophy'/><category term='wow'/><category term='Techniques'/><category term='SOA'/><category term='Concurrency'/><category term='Web'/><category term='Testing'/><category term='MongoDB'/><category term='warcraft'/><category term='Markets'/><category term='IDEs'/><category term='Software'/><category term='Honeycomb'/><category term='History'/><category term='Copyrights'/><category term='iOS'/><category term='Spring'/><category term='Android'/><category term='Morals'/><category term='Guice'/><category term='Mobile'/><category term='Generators'/><category term='Business Analysis'/><category term='Author&apos;s Rights'/><category term='Project Management'/><category term='Predictions'/><category term='programming'/><category term='rants'/><category term='NodeJS'/><category term='Art'/><category term='Wow moments in technology'/><category term='blizzard'/><category term='Java'/><category term='Patents'/><category term='gaming'/><category term='USB'/><category term='DI'/><category term='Development'/><category term='Classes'/><category term='Life'/><category term='Coding Future'/><category term='DB'/><category term='Dynamic'/><category term='OOP'/><category term='JSF'/><category term='Ubuntu'/><category term='architecture'/><category term='JavaScript'/><category term='Analysis'/><title type='text'>Philosophy on Software</title><subtitle type='html'>"By all means, do not use a hammer."
– IBM Manual, 1925</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>44</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-924868547934552752</id><published>2012-01-19T04:34:00.001+02:00</published><updated>2012-01-19T04:35:18.603+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Markets'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='Philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Predictions'/><title type='text'>It's formal - Mobile Games = Hollywood</title><content type='html'>&lt;br /&gt;It's "formal". As mobile game development moves forward it slips into the same pit as&amp;nbsp;Hollywood&amp;nbsp;has been for a long time.&lt;br /&gt;It's no longer enough to have a great game. A publisher, yes a publisher, has to get resources behind it to get the ROI. In the movie business it is awareness and stars that sell the movies. It is uniqueness and awareness that will make sure your game meets its ROI. And since movie stars are unique, you&amp;nbsp;essentially&amp;nbsp;get the same formula for success and failure in both cases.&lt;br /&gt;&lt;br /&gt;I've been saying it for &lt;a href="http://jalexoid.blogspot.com/2011/07/ride-is-over-selling-mobile-apps-to.html"&gt;some time now&lt;/a&gt; - selling apps as a business model is a dead end. For indie developer, at least.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://venturebeat.com/2012/01/18/developer-shares-costs-and-sales-expectations-as-whale-trail-hits-android-market/"&gt;VentureBeat: Developer shares costs and sales expectations as Whale Trail hits Android Market&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-924868547934552752?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/924868547934552752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2012/01/its-formal-mobile-games-hollywood.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/924868547934552752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/924868547934552752'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2012/01/its-formal-mobile-games-hollywood.html' title='It&apos;s formal - Mobile Games = Hollywood'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-6955008358289029232</id><published>2011-11-09T11:59:00.001+02:00</published><updated>2011-11-11T19:45:49.691+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='DB'/><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='NodeJS'/><title type='text'>Why should you learn Node.js and MongoDB?</title><content type='html'>Given that the has been a massive "storm" over the net about these new technologies that are emerging to conquer the new markets, I want to write a simple blog explaining why it is very beneficial to tinker with them.&lt;br /&gt;&lt;br /&gt;In any case any wise man will be able to take something positive from all of the new developments that are coming up. Learning is not always about learning what is the best, sometimes the mediocre and even the worst can have some gems that can be picked up by the wise. Consider how Edisson invented the light bulb. I'll just cover something arising from my experience with NodeJS and MongoDB.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-wBu20XL3PNc/Tr1A6hbmEMI/AAAAAAAAAQk/Ih_mw2TUT6o/s1600/nodejs.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="107" src="http://2.bp.blogspot.com/-wBu20XL3PNc/Tr1A6hbmEMI/AAAAAAAAAQk/Ih_mw2TUT6o/s200/nodejs.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Let's start with Node.js &lt;/b&gt;&lt;br /&gt;A simple adaptation of V8 with server-side functionality. It's quite simple in the simplest operations. It does have a huge advantage when creating AJAX driven sites, as having the same language for the UI as for the backend helps a lot. Its biggest "feature" is the event oriented programming.&lt;br /&gt;For the majority of software developers it should be like a dip in an &lt;a href="http://en.wikipedia.org/wiki/Ice_swimming"&gt;ice cold water pool&lt;/a&gt;.&amp;nbsp; It is really something that OOP paradigms do not have a lot. Interestingly enough, JavaScript is not a &lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;functional programming language&lt;/a&gt; and thus it's Event Driven structure is quite unusual. If you've done WebUI programming in JavaScript then this will not feel like home.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Now why I believe it's valuable to learn it?&lt;/i&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; First of all, it introduces something new into your mind. It's the disruptive thought in your head that will make you think about it. The extreme event orientation is also a quite interesting concept and does scale well due to not locking nature, though within limits. Also it introduces how things should not be done and any wise person* knows what to do with it. The extremes of event orientation means that writing any substantial amount of code is exceptionally hard. Working with network operations event orientation helps a lot. Working with data access is easier in an imperative way, not functional or event oriented. &lt;br /&gt;&amp;nbsp;&amp;nbsp; JavaScript shines when you're working with the frontend, but it's a total mess when working with the backend systems.But it's no wonder, since JavaScript was created for that purpose.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;What have I learned from Node.js?&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;User interaction is 100% event oriented and you have to remember that&lt;/li&gt;&lt;li&gt;All network operations are better handled in an event oriented manner&lt;/li&gt;&lt;li&gt;All essential data access does not work well without an imperative approach&lt;/li&gt;&lt;li&gt;In event oriented functional programming the code tents to produce a lot of clutter and gets almost unmaintanable&lt;/li&gt;&lt;li&gt;Data composition operations do not work well in an extremely event oriented system&lt;/li&gt;&lt;li&gt;To handle all the cases of an operation, you typically end up with functions of nested, upon tested functions.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;node.js needs to have :&lt;ul&gt;&lt;li&gt;a "wait" like functionality&lt;/li&gt;&lt;li&gt;a simplified function creation (like this)&lt;/li&gt;&lt;li&gt;a properly though out error event handling infrastructure&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://media.mongodb.org/logo-mongodb.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://media.mongodb.org/logo-mongodb.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Now for some huMongoDB.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Well we all know the &lt;a href="http://www.youtube.com/watch?v=b2F-DItXtZs"&gt;"But it's web scale" cartoon&lt;/a&gt;. The main issue is that people assume that it's just for everything.&lt;br /&gt;I love MongoDB, but my view is rather subjective because it implements what I was wishing for in my post &lt;a href="http://jalexoid.blogspot.com/2008/12/hopw-about-nice-future-for-dbms-query.html"&gt;How about a nice future for DBMS query languages?&lt;/a&gt; (2008). However, I am also a realist and understand &lt;a href="http://blog.schmichael.com/2011/11/05/failing-with-mongodb/"&gt;UrbanAirship's&lt;/a&gt; move to &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt;(of which I am a big supporter)&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Now let's begin with the reality check&lt;/i&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Transactional databases were created for a reason - transaction processing. They are good at it. They are tuned for it. And there is a lot of knowledge and experience behind all of it.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The new generation of databases were created as a result of a demand for databases in the world where there is a huge amount of people accessing the web. A lot of read queries and not so many writes. Eventual consistency is a reasonable feature of that system.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;So why is MongoDB bundled in with node.js?&lt;/i&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Quite simple it's a match made in heaven. MongoDB uses a format very similar to JSON - BSON. Thus there is little need to convert any data between the two. Most of the operations in MongoDB are done using JavaScript.&lt;br /&gt;&amp;nbsp;&amp;nbsp; And I actually used MongoDB for an interesting web project with node.js. They worked together like they were designed for each other. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;Why would you want to learn MongoDB?&lt;/i&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; MongoDB has some interesting features that let you expand your knowledge. And as with node.js it will "tickle your mind". Integrated map/reduce is a really interesting feature. The anti-SQL language also shows that it's really not impossible to have something working and not be an SQL. The schemaless model is a testament that schema's are not the ultimate solution to everything. And all of the issues that come with MongoDB that you will encounter will strech your mind beyond it's current borders.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #073763;"&gt;&lt;span style="font-size: small;"&gt;* A wise man learns by the mistakes of others, a smart person by his own and a fool never learns.&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp;- Latin Proverb&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-6955008358289029232?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/6955008358289029232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2011/11/why-should-you-learn-nodejs-and-mongodb.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/6955008358289029232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/6955008358289029232'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2011/11/why-should-you-learn-nodejs-and-mongodb.html' title='Why should you learn Node.js and MongoDB?'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-wBu20XL3PNc/Tr1A6hbmEMI/AAAAAAAAAQk/Ih_mw2TUT6o/s72-c/nodejs.png' height='72' width='72'/><thr:total>1</thr:total><georss:featurename>Sandyford Industrial Estate, Dublin 18, Ireland</georss:featurename><georss:point>53.27424717441861 -6.21826171875</georss:point><georss:box>53.19837217441861 -6.37619021875 53.350122174418615 -6.06033321875</georss:box></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-3695625021714716858</id><published>2011-09-30T14:03:00.000+03:00</published><updated>2011-09-30T14:12:54.880+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='Markets'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='gaming'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Analysis'/><category scheme='http://www.blogger.com/atom/ns#' term='Predictions'/><title type='text'>Another nail in the coffin of Mobile Game Development</title><content type='html'>I've been saying it for a while now - selling mobile apps through the AppStore is a dead business strategy for a while now(&lt;span style="font-size: small;"&gt;&lt;a href="http://jalexoid.blogspot.com/2011/07/ride-is-over-selling-mobile-apps-to.html"&gt;Previous post on the subject&lt;/a&gt;&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Now a newer studies point to the same conclusions.(&lt;a href="http://www.streamingcolour.com/blog/2011/09/28/results-ios-game-revenue-survey/"&gt;iOS Game Revenue Survey&lt;/a&gt;)&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://jalexoid.blogspot.com/2011/07/ride-is-over-selling-mobile-apps-to.html"&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But again, mobile app developers, do not despair. Because mobile app business is actually expanding, just that the direct consumer market is drying up. If your apps are worthwhile, you may want to have your apps become a part of marketing campaigns for companies. Apple uses Word Lens in their marketing. Angry Birds' creators at Rovio make more money off marketing and promotional material than from sales(my speculation).&lt;br /&gt;&lt;br /&gt;Now why has the market concentrated on the few? Simply because their marketing and, maybe, app quality is better. People are as always susceptible to marketing. Since the mobile app market has grown to these proportions, you have companies fighting for a larger market share; Not only with quality but also marketing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.industrygamers.com/news/iphone-devs-in-top-20-make-97-of-total-category-revenue/"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.streamingcolour.com/blog/2011/09/28/results-ios-game-revenue-survey/"&gt;iOS Game Revenue Survey&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is the data from the source above.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://chart.apis.google.com/chart?chf=bg,s,67676700&amp;amp;chs=360x205&amp;amp;cht=p&amp;amp;chco=E8F4F7%7CBBCCED%7C7777CC%7C49188F%7C224499&amp;amp;chd=s:CHNPOHC&amp;amp;chl=%241M%2B%7C%24100k-1M%7C%2410k-100k%7C%241000-10k%7C%24100-%241000%7C%2410-%24100%7C%3C%2410&amp;amp;chtt=Developers+by+total+earnings+from+Apple+AppStore" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://chart.apis.google.com/chart?chf=bg,s,67676700&amp;amp;chs=360x205&amp;amp;cht=p&amp;amp;chco=E8F4F7%7CBBCCED%7C7777CC%7C49188F%7C224499&amp;amp;chd=s:CHNPOHC&amp;amp;chl=%241M%2B%7C%24100k-1M%7C%2410k-100k%7C%241000-10k%7C%24100-%241000%7C%2410-%24100%7C%3C%2410&amp;amp;chtt=Developers+by+total+earnings+from+Apple+AppStore" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I can safely say, that I personally know companies and individual people that made more money by developing mobile applications for Android and iOS without them ever selling a single item(app store or in app purchases). Companies made more than the top and individuals beat the average by a wide margin. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.industrygamers.com/news/iphone-devs-in-top-20-make-97-of-total-category-revenue/"&gt;iPhone Devs In Top 20% Make 97% Of Total Category Revenue&lt;/a&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Slashdot reports: &lt;a href="http://games.slashdot.org/story/11/09/30/0730251/Top-1-of-iOS-Game-Developers-Make-a-Third-of-All-Revenue"&gt;Top 1% of iOS Game Developers Make a Third of All Revenue&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-3695625021714716858?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/3695625021714716858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2011/09/another-nail-in-coffin-of-mobile-game.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3695625021714716858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3695625021714716858'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2011/09/another-nail-in-coffin-of-mobile-game.html' title='Another nail in the coffin of Mobile Game Development'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-5193001566763442001</id><published>2011-08-23T06:58:00.001+03:00</published><updated>2011-08-27T06:45:00.837+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Classes'/><title type='text'>Class warfare in the OOP land</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-F350U5Twi88/TlMcoiZAFjI/AAAAAAAAAOM/NNyjn3p-zJk/s1600/kapital.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-F350U5Twi88/TlMcoiZAFjI/AAAAAAAAAOM/NNyjn3p-zJk/s320/kapital.jpg" width="220" /&gt;&lt;/a&gt;&lt;/div&gt;Social mobility is the tool to combat class warfare in the real world, but why doesn't it translate in any way into the OOP world?&lt;br /&gt;&lt;br /&gt;When an object is "born" it gets a class and that's it! Nasty lack of the ability to change the attributes and properties of the object results in the need to create relationships and delegates in the object structure.&lt;br /&gt;&lt;br /&gt;But imagine the situation - an object should change it's properties, including adding new functionality, based on some data or a result of a function.&lt;br /&gt;You'd think that&amp;nbsp;polymorphism&amp;nbsp;&amp;nbsp;solves the issue, but think again! Functionality on the fly? Nope. Every option has to be coded ahead of time, including using a bunch of if's.&lt;br /&gt;&lt;br /&gt;Now, let's assume this:&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;An IF statement is an anathema to OOP.&lt;/b&gt; &lt;i&gt;It's essentially underuse of OOP.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Object mobility:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;i&gt;The ability to modify an object on the fly, beyond the data. The object is created as non-class object. And object gains a class when needed.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Here is the actual case for class mobility:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; When you are filling out some form by checking a few boxes you make that form serve some specific purpose. Now there can be a complex object structure and a requirement to the user to select a type of form in advance. However, managing that could become cumbersome.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Let's assume the person does no know what specifics are needed for particular type of form. Over checking some elements, the base object might adjust itself to the actual need of the user. With a strict object graph/structure only delegates and facades could be a design decision. But with the structure where an object mutates based on the need for new functionality you could perform validations, expose new properties and describe itself better for the presentation and persistence layer.&lt;br /&gt;&lt;br /&gt;To achieve this the following needs to be implemented:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Augment the classic OOP implementations with strict classes to have &lt;i&gt;duck classing.&lt;/i&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Duck classing - classes are considered equals,if all publicly available interfaces are equal. The next step of duck typing of the dynamic languages. A class is defined as a collection of properties/fields and methods. All basic elements of the language are pushed down to the level of properties/fields and methods.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Add the &lt;i&gt;mutator&lt;/i&gt; and &lt;i&gt;deprecator&lt;/i&gt; framework into the object language.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;i&gt;Mutator&lt;/i&gt; - a method/function that processes adding new functionality/data(&lt;i&gt;learning&lt;/i&gt;) to an object.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;i&gt;Deprecator&lt;/i&gt; - a method/function that processes removal of functionality that is not used, a.k.a resource deallocation.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The main benefit of this approach would be in two places:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;During the design phase - the object model could be very flexible in&amp;nbsp;acquiring&amp;nbsp;new functionality on demand&lt;/li&gt;&lt;li&gt;Long lived objects in an application could become more specialized over time or less specialized&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;This is not something unseen. The JavaScript objects wok in exactly the same way, they just don't have proper classes. You can add new or replace functionality to an object. In fact that is how an object is created in JavaScript.&lt;br /&gt;&lt;br /&gt;var someObject = {};&lt;br /&gt;someObject.mathematician = function(){.. some complex mathematics..};&lt;br /&gt;var objectIsAMathematician = someObject;&lt;br /&gt;someObject.statistician = function(){.. some statistics..};&lt;br /&gt;var objectIsAMathematicianAndAStatistician =&amp;nbsp;objectIsAMathematician;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-5193001566763442001?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/5193001566763442001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2011/08/class-warfare-in-oop-land.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/5193001566763442001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/5193001566763442001'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2011/08/class-warfare-in-oop-land.html' title='Class warfare in the OOP land'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-F350U5Twi88/TlMcoiZAFjI/AAAAAAAAAOM/NNyjn3p-zJk/s72-c/kapital.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-3531594911282326854</id><published>2011-07-18T00:48:00.001+03:00</published><updated>2011-07-18T00:48:35.714+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Patents'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Copyrights'/><category scheme='http://www.blogger.com/atom/ns#' term='Author&apos;s Rights'/><title type='text'>Software needs a new IP protection class of it's own</title><content type='html'>Over a good discussion with several of my new IP legal profession practising acquaintances we got to the topic of software an IP. What I personally got out of it is some more enlightenment over the whole international IP landscape and the inadequacy of the old concepts of IP applied to software. This applies more to countries where the copyright and author's rights laws have been in place for longer than software exists.&lt;br /&gt;&lt;br /&gt;I believe that both copyrights and patents on software are  just too much. My personal belief is that software needs a new method  for protecting it - a new class of IP.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Because software:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; is not really art&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; that needs  copyright&lt;/li&gt;&lt;li&gt;not a physical invention&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; that has no  other protection  than a patent&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Currently, software looks like this(my global perspective, includes countries that have software patents):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JKRowling getting:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;copyright over Harry Potter books&amp;nbsp;&lt;/li&gt;&lt;li&gt;in addition to  total monopoly over all and any books that have young magicians living  in a mixed world of hidden magic and reality for 20 years&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Picasso having:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;copyright on his amazing  cubist works of art(I suggest seeing them up close to understand). &lt;/li&gt;&lt;li&gt;a 20  year  monopoly on all cubist paintings&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;My  idea is simple. A new class of IP protection specifically for software.&lt;br /&gt;&lt;ol&gt;&lt;li&gt; software gets copyright of 20 years&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in reality in 20  years software written today will become irrelevant&lt;/li&gt;&lt;li&gt; an optional 1  to 2 year(after a costly extension)* patent to a very specific  implementation&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; to be accompanied by source code demonstrating the  novelty&lt;/li&gt;&lt;li&gt;mandatory contribution of the sources to a software registry&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for the software to be archived in a copyright registry and owner tracked** or released  into PD.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this is done for both patents(schematics and the patent itself are publicly available) and copyrighted material(libraries tend to archive books for future generations), but not software.&lt;/li&gt;&lt;li&gt;all internally used and developed software is to be governed by separate NDA like agreements with employees&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; copyright is to be attained at the first public release&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Open Source software repositories are to be considered as software registries if those make commitment to retain indefinitely the open source software or place the software into another software repository for further availability to anyone who requests it.&lt;br /&gt;Software repositories may charge a fee no more than the cost of delivering the said software to the requester using requester’s preferred media(mail CD/DVD/BluRay, Internet or any other media). However software repositories may not charge for repository contents listings.&lt;br /&gt;&lt;br /&gt;(This is intended as a discussion starting topic)&lt;br /&gt;&lt;br /&gt;* - Possibly even an extension for longer, if no one objects&lt;br /&gt;** - There is another issue with software today - abandonware&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-3531594911282326854?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/3531594911282326854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2011/07/software-needs-new-ip-protection-class.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3531594911282326854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3531594911282326854'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2011/07/software-needs-new-ip-protection-class.html' title='Software needs a new IP protection class of it&apos;s own'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-6515786763537788156</id><published>2011-07-11T09:26:00.000+03:00</published><updated>2011-07-11T09:26:59.618+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Markets'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><title type='text'>The ride is over: Selling mobile apps as a business (Flyrry data)</title><content type='html'>As a followup, some Flurry data that shows that freemium mobile games bring in more income. &lt;br /&gt;What does that show? That post acquisition paid services model trumps sales.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.flurry.com/bid/65656/Free-to-play-Revenue-Overtakes-Premium-Revenue-in-the-App-Store"&gt;Flurry: Free-to-play Revenue Overtakes Premium Revenue in the App Store&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blog.flurry.com/Portals/41620/images/AppStore_Top100GrossingGames_Freemium_vs_Premium-resized-600.png" /&gt;&lt;br /&gt;&lt;br /&gt;That is not unusual, because other games bring in more income with a freemium model.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://venturebeat.com/2010/10/08/lotro-revenue-doubles-f2p/"&gt;Venturebeat: Lord of the Rings Online doubles its revenue after going free-to-play&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-6515786763537788156?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/6515786763537788156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2011/07/ride-is-over-selling-mobile-apps-as.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/6515786763537788156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/6515786763537788156'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2011/07/ride-is-over-selling-mobile-apps-as.html' title='The ride is over: Selling mobile apps as a business (Flyrry data)'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-7512540242071874080</id><published>2011-07-10T02:37:00.002+03:00</published><updated>2011-08-27T06:47:41.541+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Markets'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><title type='text'>The ride is over: Selling mobile apps as a business</title><content type='html'>&lt;div style="background-color: transparent; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;If you are a developer and think “Hey! I have this great idea for a mobile app! I’ll make millions with it!” you are delusional.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Let me explain why and what can be done to be actually able to make money and start a business.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Lets begin with the some reality. The mobile application space is crowded. Really crowded. Apple’s AppStore has over 400’000 apps and Android Marketplace has over 200’000. You could say that that means nothing, but it actually does. Crowded app stores mean that it’s harder to stumble upon your particular app.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;The early entrants to the market are there at the top and are not going to be unseated any time soon. The games and tools in the tops are established and got their income streams set up.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Innovative ideas could come out and take the stores by storm, but let’s be realistic here. Most implementations of innovative ideas take years to mature. Just look at the history.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Point #1: Mobile app market is an established market&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Yes. As hard as sounds, mobile app market is already an established market since 2010. So all ventures in that market will require either opening a market segment or stealing market share from someone else. Both options are not easy.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Point #2: It’s almost impossible getting noticed.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Getting noticed is priority #1 for a new developer. It does not matter if your app is free or costs money. If you are not noticed your app will not be in demand. Top sellers are dominated by established players and featured items does not always result in jump in profits. In fact, being in the top sellers and being featured is not a guarantee success.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Point #4: App sales are no longer an option &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Yes, you read it right. Sale of an application is no longer an viable option as a business plan. It’s just not possible to make enough sales to cover the development costs of even a small team. In short, one man team can make enough but not start a company with full time employees.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;With all of that bleak outlook above, there are options of making it in the mobile apps arena.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Custom app development shops are making good income these days. As always existing businesses are looking to get their apps onto the mobile platform and that is a growth area at the moment.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Create a service and add a mobile component based on that service. If you develop a standalone app, then you will fail because you’ll be copied by enthusiasts that have a day job. A service component will make sure that the users will not migrate to something else.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;As for developing a single good and innovative app, there still is a way.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Here are the options:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Spend a lot of money on a marketing campaign. Minimal campaign would cost $5000.&lt;/span&gt;&lt;/li&gt;&lt;li style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;A truly innovative idea with a hook.&lt;/span&gt;&lt;/li&gt;&lt;li style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Excellent mobile app (a creative designer is mandatory)&lt;/span&gt;&lt;/li&gt;&lt;li style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Making a deal with carriers/operators/ODMs&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;I know of quite a few mobile app startups that have failed miserably during the last year. Some of them even had featured and top apps in the app stores. All that survived are either still looking for marketing agreements with operators/carriers or ended up developing custom applications for established businesses.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-7512540242071874080?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/7512540242071874080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2011/07/ride-is-over-selling-mobile-apps-to.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/7512540242071874080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/7512540242071874080'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2011/07/ride-is-over-selling-mobile-apps-to.html' title='The ride is over: Selling mobile apps as a business'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-5870883749255551999</id><published>2011-06-29T23:01:00.000+03:00</published><updated>2011-06-29T23:01:00.544+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wow'/><category scheme='http://www.blogger.com/atom/ns#' term='warcraft'/><category scheme='http://www.blogger.com/atom/ns#' term='gaming'/><category scheme='http://www.blogger.com/atom/ns#' term='blizzard'/><title type='text'>World Of Warcraft: Still quite Expensive PC Game to Play (Updated pricing)</title><content type='html'>So. Blizzard finally woke up to the inevitable reduction in payer count. Good for them. Now let's see how they actually reacted.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here are some stats for the prices around the net from January 3rd 2011 (&lt;a href="http://jalexoid.blogspot.com/2011/01/world-of-warcraft-most-expensive-pc.html"&gt;source&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;table border="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="background-color: #cfe2f3;"&gt;Blizzard EU online store&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/td&gt;             &lt;td style="background-color: #cfe2f3;"&gt;&lt;/td&gt;&lt;td align="right" style="background-color: #cfe2f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 99.96 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Blizzard EU online store&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/td&gt;  &lt;td align="right"&gt;79.96 GBP&lt;/td&gt; &lt;td align="right"&gt;93.01 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-color: #cfe2f3;"&gt;Blizzard US online store&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/td&gt; &lt;td align="right" style="background-color: #cfe2f3;"&gt;129.96 USD&lt;/td&gt; &lt;td align="right" style="background-color: #cfe2f3;"&gt;97.81 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Amazon UK(physical copy) &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/td&gt;   &lt;td align="right"&gt;56.41 GBP&lt;/td&gt; &lt;td align="right"&gt;&amp;nbsp;&amp;nbsp; 65.93 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-color: #cfe2f3;"&gt;Amazon US(physical copy) &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/td&gt;  &lt;td align="right" style="background-color: #cfe2f3;"&gt;108.23 USD &lt;/td&gt;&lt;td align="right" style="background-color: #cfe2f3;"&gt;81.46 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Amazon DE(physical copy)&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/td&gt;              &lt;td&gt;&lt;/td&gt;&lt;td align="right"&gt;76.58 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-color: #cfe2f3;"&gt;Amazon FR(physical copy)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/td&gt;              &lt;td style="background-color: #cfe2f3;"&gt;&lt;/td&gt;&lt;td align="right" style="background-color: #cfe2f3;"&gt;71.13 EUR&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Here are the new game priced for June 29th, 2011:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="background-color: #cfe2f3;"&gt;Blizzard EU online store&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/td&gt; &lt;td style="background-color: #cfe2f3;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td align="right" style="background-color: #cfe2f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 74.48 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Amazon UK(physical copy) &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/td&gt;   &lt;td align="right"&gt;44.50 GBP&lt;/td&gt; &lt;td align="right"&gt;&amp;nbsp;&amp;nbsp; 49.56 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-color: #cfe2f3;"&gt;Amazon US (physical copy) &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/td&gt;  &lt;td align="right" style="background-color: #cfe2f3;"&gt;84.41 USD &lt;/td&gt;&lt;td align="right" style="background-color: #cfe2f3;"&gt;58.50 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Amazon DE (physical copy)&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/td&gt;              &lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td align="right"&gt;67.83 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-color: #cfe2f3;"&gt;Amazon FR (physical copy)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/td&gt;              &lt;td style="background-color: #cfe2f3;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td align="right" style="background-color: #cfe2f3;"&gt;54.99 EUR&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Battle NET does not show full prices for upgrade to Cataclysm if you chose another region, so I can't compare them.&lt;br /&gt;&lt;br /&gt;Notice, that buying a physical package is still much cheaper than buying everything online&lt;br /&gt;&lt;br /&gt;The prices above are based on the game being bought by a new player  for the first time. One month of playtime included. Each successive  month costs additionally in accordance with the region.&lt;br /&gt;The prices  are a sum of the prices of World Of Warcraft and The Burning Crusade,  Wrath of The Lich King and Cataclysm expansion packs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-5870883749255551999?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/5870883749255551999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2011/06/world-of-warcraft-still-quite-expensive.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/5870883749255551999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/5870883749255551999'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2011/06/world-of-warcraft-still-quite-expensive.html' title='World Of Warcraft: Still quite Expensive PC Game to Play (Updated pricing)'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-5462807630133273631</id><published>2011-06-25T10:39:00.000+03:00</published><updated>2011-06-25T10:39:13.763+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>USB Setup for Debugging any Android device on Ubuntu</title><content type='html'>There are a few tutorials on how to setup your Linux desktop for Android development. &lt;br /&gt;&lt;br /&gt;There is one procedure that needs to be done for Ubuntu to become more device dev friendly*(as root):&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;groupadd -r usbaccess&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;adduser &lt;i&gt;{yourname}&lt;/i&gt; usbaccess&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# cat &amp;gt; /etc/udev/rules.d/11-usb.rules&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SUBSYSTEM=="usb", MODE="0664", GROUP="usbaccess"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[Press Enter and CTRL+D]&lt;/span&gt;&lt;/i&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# udevadm control --reload-rules&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you have ACL enabled, then you could use ACL. It also requires assigning ACL_MANAGE flag.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# cat &amp;gt;&amp;gt; /etc/udev/rules.d/71-usb.rules&lt;br /&gt;SUBSYSTEM=="usb", ENV{ACL_MANAGE}="1"&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;i&gt;[Press Enter and CTRL+D]&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# setfacl -d -m u:&lt;i&gt;{yourname}&lt;/i&gt;:rwx /dev/bus/usb&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# setfacl -R -m u:&lt;i&gt;{yourname}&lt;/i&gt;:rwx /dev/bus/usb&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# udevadm control --reload-rules&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-5462807630133273631?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/5462807630133273631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2011/06/usb-setup-for-debugging-any-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/5462807630133273631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/5462807630133273631'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2011/06/usb-setup-for-debugging-any-android.html' title='USB Setup for Debugging any Android device on Ubuntu'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-324479663610589292</id><published>2011-06-17T16:42:00.003+03:00</published><updated>2011-06-19T03:30:38.988+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='History'/><category scheme='http://www.blogger.com/atom/ns#' term='Predictions'/><title type='text'>Technology progress cycles</title><content type='html'>&lt;h1&gt;Technology progress cycles&amp;nbsp;&lt;/h1&gt;&lt;h3 class="western"&gt;Introduction&lt;/h3&gt;&lt;br /&gt;With the accelerating technological innovation analysts and businesses are constantly trying to figure out the next step in technology. Most predictions are proven incorrect by time. Like in any other field evaluating the next possible mainstream technology trends is impossible without knowing the current state of technology focus and impact. With understanding of the current state and identifying the overall pattern of the technological process cycles we could identify the very next technological trend and validate it. Through analysis of the historical technology trends and identification of patterns associated with them, we can get to an abstract model for the technological trend cycles.  Using that model accuracy of predictions can be greatly improved. The model that is created is shown to be in effect  at least for three technologies - the  model and two model validating technologies. One of those validation technologies appears to be at the last stage of the cycle, while the other is in the middle of the cycle.&lt;br /&gt;&lt;br /&gt;Inspired by Plato and Aristotle&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h5 class="western"&gt;On prediction&lt;/h5&gt;&lt;br /&gt;Prediction is hard. There are a lot of competing technologies and identifying the most appropriate technology for the next stage is not always accurate. In the current model-less state it's even harder to know what is the current stage is. It is no wonder that the visionaries who made the world of technology today, had a very different view on the future years ago.&lt;br /&gt;&lt;br /&gt;&lt;h3 class="western"&gt;The Object of  Study for the Development of the Model&lt;/h3&gt;&lt;br /&gt;&lt;h5 class="western"&gt;History of Literature as a Technology of Storing Wisdom of Humanity&lt;/h5&gt;&lt;br /&gt;While writing would be the most appropriate study object for the theory, writing has too many lines of evolution to track down. Literature is easier and I am focusing on the Eurocentric history.&lt;br /&gt;&lt;br /&gt;Literature has come into existence 2000 BCE. At that time literary works were only accessible to the privileged few. Due to massive illiteracy and high cost of manuscripts all works of literary art were inaccessible to the most of the population over centuries. That inaccessibility did not prevent these works from being created. A lot of them had other goals than being widely available and widely read. Literature of the early history mainly focused on rulers, religion, annals and folklore.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Through the years the technology for the production of literary works was changing, the actual works have not been used by many people. First there was papyrus scrolls and clay tablets. Then parchment and bound books came to the scene.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The next big boost literature got was from the printing press. Suddenly the price of books became lower. As a result more people could be enjoying the same beauty of literature as the privileged few. People started reading more and other way of thinking has become possible.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As years passed and the printing presses became widespread, the printing of the periodicals started to appear. Before that only topics printed were the "immortal" ones, like religion or philosophy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;From that point on the production of literary works became less and less a prerogative of the select few. First the the church was stripped of it's monopoly on the printed word. Then the academia was on the line. Then the journalists and professional writers. And finally the publishers. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enter modern times. This are the times when an author can publish a book without an interference by a publisher. News sources need not be journalists. And the old way of consuming and producing literary works has been revolutionized and transformed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-dVt5SVWkQ40/TftXO-BfQ1I/AAAAAAAAAMA/hyn3aXwahkE/s1600/steppes-of-literature.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="128" src="http://2.bp.blogspot.com/-dVt5SVWkQ40/TftXO-BfQ1I/AAAAAAAAAMA/hyn3aXwahkE/s400/steppes-of-literature.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Fig 1. Literature Progress&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h5 class="western"&gt;The Extracted Pattern.&lt;/h5&gt;In the long text above I outlined the main steppes of the cycle of progress for literature.&lt;br /&gt;&lt;br /&gt;Stages of the cycles:&lt;br /&gt;&lt;i&gt;Disconnect&lt;/i&gt; - is the period up-to the invention of the printing press. The inaccessibility of the literary works results in only a few people accessing them.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Consumption&lt;/i&gt; - After the printing press was invented the number of people that could afford to buy a book rose and with rise of literacy levels literature was being accepted and adopted by more people. We are still not giving up on the consumption of literature.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Production&lt;/i&gt; - As the printing presses became widespread and more people could be published, the production phase of the written word came to be. No longer did you have to be a professor or have a sanction from the church to write something and be published. It could be a novel or an article.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Revolution and Assimilation&lt;/i&gt; - in the modern times things are changing fast. The written word is not the same as it was 50 years ago. Electronic publishing is very much the norm. The newspapers have been trampled by the internet. The books are now available in electronic formats. As a papyrus scroll did 2000 years ago, E-Books, blogs, twitter and other tools are the things that make up today's "written" word. And literature has been assimilated into our daily lives and the new technology - internet.&lt;br /&gt;&lt;br /&gt;&lt;h3 class="western"&gt;The Model&lt;/h3&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-rxv7bfPhUe4/TftQ0rivOFI/AAAAAAAAAL8/H-ET-Vx86pc/s1600/techno-cycles.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="141" src="http://4.bp.blogspot.com/-rxv7bfPhUe4/TftQ0rivOFI/AAAAAAAAAL8/H-ET-Vx86pc/s400/techno-cycles.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Fig 2. The Model Diagram&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h5 class="western"&gt;Formal definitions of the stages&lt;/h5&gt;&lt;br /&gt;&lt;i&gt;Disconnect&lt;/i&gt; - is the early stage of technology. It is characterized by low adoption, severe limitations and/or high price. Usually it's the stage where only the privileged few can use it, it is still in the laboratories and no mass production exists.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Consumption&lt;/i&gt; - is the stage of the acceleration of technology. It's characterized by accelerating mass adoption and acceptance. People start using it and adopt it fully, but creativity based on that technology is limited.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Production&lt;/i&gt; - is the later state of technology. It's characterized by high level of use by people and higher level of user involvement. The biggest indicator of this stage is the amount of content being created by users.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Revolution and Assimilation&lt;/i&gt;- is the external state of the technology. It is characterized by the presence of an external technological advancement that has disruptive effects on the whole technology. In addition has a property of being assimilated into the revolutionizing technology. Portability and omnipresence of the revolutionized technology is also a indicator.&lt;br /&gt;&lt;br /&gt;&lt;h5 class="western"&gt;The 2 properties of the cycles&lt;/h5&gt;Property #1 Self-similarity.&lt;br /&gt;The property of self-similarity applies to each and every stage. Each of the stages comprises of the 4 stages. Each disconnect, has it's own disconnect. Each production has it's own production. With the exception of revolution stage, due to that stage being external and mapping to other technology's consumption stage.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Property #2 Technological cycle is accelerating&lt;br /&gt;As we are witnessing technology does not improve linearly, there is quite a bit of acceleration. As the technology overall is accelerating, so are the stages. Seeing that in every day. I believe that the technological cycles are accelerating based on the Fibonacci sequence and graphically look like the golden spiral.&lt;br /&gt;&lt;br /&gt;&lt;h5 class="western"&gt;Non linearity of succession&lt;/h5&gt;The technological cycles have another noticeable property - non-linearity of succession. When the whole cycle completes the revolutionizing technology may not be just one. And a technology may revolutionize several other technologies. The succession is non-linear and not tree like.&lt;br /&gt;&lt;br /&gt;&lt;h3 class="western"&gt;Validation of the Theory&lt;/h3&gt;&lt;br /&gt;&lt;h5 class="western"&gt;The Internet&lt;/h5&gt;&lt;br /&gt;&lt;i&gt;Disconnect.&lt;/i&gt;&lt;br /&gt;1962 &lt;i&gt;to 1990&lt;/i&gt; - In the early stages of the internet only the defence and academic institutions had access to internet. It was exceptionally limited in access and geography.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Consumption.&lt;/i&gt;&lt;br /&gt;1990 &lt;i&gt;to 2003&lt;/i&gt; - After the invention of the HTTP and WorlWideWeb the internet has started to gain popularity and exploded into wide acceptance in the late 1990-ies. The technology was mainly used for the purpose of delivering content by producers and little collaboration.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Production.&lt;/i&gt;&lt;br /&gt;2003 &lt;i&gt;to 2013(est.)&lt;/i&gt; - The popularity of the social networks and Wikis resulted in a drastic change in the basis of technology. The new incarnation was even renamed to Web 2.0. Most of the trends and focus has changed from the content providers and fixed delivery to users creating content and using the same technology basis for creative purposes. At the moment of writing this is the stage of the internet technology, the revolutionary technology has not yet reached the consumption stage.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;NOTE: At the end of the consumption stage of the internet, the dot-com bubble burst. That was a major catalyst for the move to the production stage.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4 class="western"&gt;Communication technology&lt;/h4&gt;&lt;i&gt;Disconnect.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;invention of writing to public postal service&lt;/i&gt; - The early stages of the communication technologies were exceptionally disconnected. Only the privileged few could access any kind of public communications service.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Consumption.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;public postal services to the 1990&lt;/i&gt; - During that era of the communications technologies have moved forward. Mostly due to strict controls the trends did not change up until the revolutionary technology entered it's consumption stage. Mail(disconnect), telegraph(consumption) and telephone(production) were widespread but severely limited.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Production.&lt;/i&gt;&lt;br /&gt;1990 to 2013(est.) - The Internet. It revolutionized the way we communicate. Starting with e-mail, moving onto the instant messaging and voice.&lt;br /&gt;&lt;br /&gt;Within the consumption stage of the communication technology cycle, the three stages are clearly visible. Mail is a disconnect and folded into telegraph. Telegraph is a consumption stage and displayed adoption and low interaction. Telephone is the production phase, having the hallmark of being the interactive telecommunication technology.&lt;br /&gt;&lt;br /&gt;And as you can see both properties of the cycles apply. The cycles were accelerating and stages of the cycles contain the same cycles.&lt;br /&gt;&lt;br /&gt;&lt;h6 class="western"&gt;Mobile telecommunication technologies&lt;/h6&gt;&lt;br /&gt;&lt;i&gt;Disconnect.&lt;/i&gt;&lt;br /&gt;1895 to 1990 - Starting with the invention of the radio the low adoption of the mobile radio equipment as a telecommunication medium in the masses signifies that that time is associated with the disconnect stage.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Consumption.&lt;/i&gt;&lt;br /&gt;1990 to 2012(est) - With the new cellular networks starting to emerge the adoption and popularity of the mobile telecommunications technology became apparent. The rise of the number of mobile subscribers is a clear indicator for the consumption stage of the technology. First people had pagers, then cellphones and later stage smartphones.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Production.&lt;/i&gt;&lt;br /&gt;2012(est) to ?? - We have not yet hit the production stage of the mobile telecommunications technology. Though some early indicators of the revolutionizing technology is visible. (June 13th, 2011)&lt;br /&gt;&lt;br /&gt;&lt;h3 class="western"&gt;The Analysis and Prediction&lt;/h3&gt;&lt;br /&gt;Out of all the above we can see that there is clearly some pattern to the technological progress. History repeats itself and nature "likes" to repeat. For those reasons people are susceptible to following cycles. And this is text just points out the natural cycles.&lt;br /&gt;So far the technology of the communications has gone through the main cycles and is at it's last stage. How long that stage will stake? It's definitely not going to take as long at latter stages took 200 years ago.&lt;br /&gt;Scientists and analysts are already talking about the future in sensor networks, omnipresence of processing devices and high mobility of data and communications.&lt;br /&gt;What is obvious is that current state of the communications technologies does not appeal to the next generation. The phone has gone from being a stationary device to talk to people far away to a mobile device to do all communication related activities and more. And that is still not the end of it.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;© 2011&lt;/h4&gt;&lt;h4 class="western"&gt;References:&lt;/h4&gt;Wireless sensor networking&lt;br /&gt;&lt;a href="http://domino.watson.ibm.com/comm/research.nsf/pages/r.communications.innovation2.html"&gt;http://domino.watson.ibm.com/comm/research.nsf/pages/r.communications.innovation2.html&lt;/a&gt;&lt;br /&gt;Building Super Scalable&lt;br /&gt;Systems: Blade Runner Meets Autonomic Computing in the Ambient Cloud&lt;br /&gt;&lt;a href="http://highscalability.squarespace.com/blog/2009/12/16/building-super-scalable-systems-blade-runner-meets-autonomic.html"&gt;http://highscalability.squarespace.com/blog/2009/12/16/building-super-scalable-systems-blade-runner-meets-autonomic.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-324479663610589292?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/324479663610589292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2011/06/technology-progress-cycles-rfc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/324479663610589292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/324479663610589292'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2011/06/technology-progress-cycles-rfc.html' title='Technology progress cycles'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-dVt5SVWkQ40/TftXO-BfQ1I/AAAAAAAAAMA/hyn3aXwahkE/s72-c/steppes-of-literature.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-1292531388412319270</id><published>2011-06-13T05:46:00.003+03:00</published><updated>2011-06-13T18:34:33.915+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='History'/><category scheme='http://www.blogger.com/atom/ns#' term='Predictions'/><title type='text'>Technology progress</title><content type='html'>&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: small; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;b&gt;Abstract&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Due to the accelerating technological innovation analysts and businesses are constantly &amp;nbsp;trying to figure out the next step in technology. Most if not all&amp;nbsp;of&amp;nbsp;the predictions are proven incorrect by time. Like in any&amp;nbsp;other field evaluating the next possible mainstream technology trends is impossible without knowing the current state of technology focus and impact. With understanding of the current state and identifying the overall pattern&amp;nbsp;of&amp;nbsp;the technological process cycles we could identify the very next technological trend and validate it. Through analysis&amp;nbsp;of&amp;nbsp;the historical technology trends and identification of patterns associated with them, we can get to an abstract model for the technological trend cycles. &amp;nbsp;Using that model accuracy of predictions can be greatly improved. The model that is created is shown to be in effect &amp;nbsp;at least for three technologies - the model bearing and two model validating technologies. One of those validation technologies appears to be at the last stage of the cycle, while the other is in the middle of the cycle.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;More later...&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-1292531388412319270?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/1292531388412319270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2011/06/technological-progress.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/1292531388412319270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/1292531388412319270'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2011/06/technological-progress.html' title='Technology progress'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-3276537529637746630</id><published>2011-03-29T07:39:00.000+03:00</published><updated>2011-03-29T07:39:59.849+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Generators'/><title type='text'>Android UI framework</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://investmentsinenergy.com/wp-content/uploads/2010/12/wind_turbine.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://investmentsinenergy.com/wp-content/uploads/2010/12/wind_turbine.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Android's UI framework looks quite nice when you start. But with projects of increasing complexities and complex views, you end up wondering if Android tools developer team has not gone far enough.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;So what's the issue with this?&lt;br /&gt;&lt;br /&gt;First of all the things that they done right. the &lt;a href="http://developer.android.com/intl/de/guide/topics/resources/accessing-resources.html"&gt;&lt;i&gt;R.java&lt;/i&gt;&lt;/a&gt; generation and automatic ID generation is marvellous. Why Swing doesn’t have XML UI building blocks and resource reference generation is beyond me...&lt;br /&gt;But then you get into more complex elements. When your views contain a lot of elements, you can look at your basic Swing builder in NetBeans and wonder&lt;br /&gt;&lt;blockquote&gt;"Why is is simpler to attach an event processor for a button click?"&lt;/blockquote&gt;So the UI designer in Android SDK is geared towards designers not caring about what developers do. But most of the time designers work closely with developers. So there is this gap between them in Android.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, because Android is supposed to run on constrained hardware dynamically creating structures at runtime is not the most optimal solution. Specially when those structures are XML DOM based.&lt;br /&gt;On the other hand, manually searching for objects using &lt;a href="http://developer.android.com/intl/de/reference/android/app/Activity.html#findViewById%28int%29"&gt;findViewById()&lt;/a&gt; is a tedious task.&lt;br /&gt;&lt;br /&gt;Now enter the extension to the Android &lt;a href="http://developer.android.com/intl/de/guide/topics/resources/accessing-resources.html"&gt;&lt;i&gt;R.java&lt;/i&gt;&lt;/a&gt; generator.&lt;br /&gt;&lt;br /&gt;The simple generator generates a simple static Java structure. Like a &lt;a href="http://www.ibm.com/developerworks/java/library/j-typesafejpa/"&gt;Static Metamodel in JPA 2.0&lt;/a&gt; . The major benefit of that, is that you can navigate through the view, using a predefined verifiable structure that is populated on first call or lazily loaded.&lt;br /&gt;That is no more lines like this:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; setContentView(R.layout.main); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TextView tv = (TextView) findViewById(R.id.textView);&lt;br /&gt;&lt;br /&gt;But you do it something along the lines of:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; MainLayout root = MainLayout.populate(this); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TextView tv = root.linearLayout.textView.get();&lt;br /&gt;&lt;br /&gt;This may seem too complex in the second sample, but when you have 10 text elements on the screen it pays off. Why?&lt;br /&gt;Because you only add one single instance variable(a.k.a field) &lt;i&gt;root&lt;/i&gt; and operate on it. Accessing a view multiple times does not require you to define a field for each of those views or do a &lt;a href="http://developer.android.com/intl/de/reference/android/app/Activity.html#findViewById%28int%29"&gt;findViewById()&lt;/a&gt; every time you need to set some value on that view.&lt;br /&gt;&lt;br /&gt;The operation of the generator is pretty simple.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It takes the layouts&lt;/li&gt;&lt;li&gt;Parses the XML in them&lt;/li&gt;&lt;li&gt;Generates a static hierarchy of classes, something similar to generated R.java but for each layout.&lt;/li&gt;&lt;li&gt;It does not inherit from anything, so no dependencies are created&lt;/li&gt;&lt;li&gt;And it contains the code to differentiate the type of layout applied&lt;/li&gt;&lt;li&gt;Call the &lt;a href="http://developer.android.com/intl/de/reference/android/app/Activity.html#setContentView%28int%29"&gt;setContentView()&lt;/a&gt; on the activity.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-3276537529637746630?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/3276537529637746630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2011/03/android-ui-framework.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3276537529637746630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3276537529637746630'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2011/03/android-ui-framework.html' title='Android UI framework'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-3249943078176732094</id><published>2011-03-27T18:13:00.000+03:00</published><updated>2011-03-27T18:13:25.495+03:00</updated><title type='text'>Software piracy, piracy... copyright infringement</title><content type='html'>Software "piracy" is rooted in a very big number of variables that are&amp;nbsp; themselves not that easy to calculate...&lt;br /&gt;&lt;br /&gt;After some pondering on the issue and resent software industry's increase in trying to "weed out piracy", I've ended up with some factors for the rate of "piracy"*:&lt;a name='more'&gt;&lt;/a&gt;&lt;ol&gt;&lt;li&gt;Per capita GDP and more importantly income disparity&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; This point will make sure that even the people that earn enough will obtain a lot of software illegally.&lt;/li&gt;&lt;li&gt;Value of the software vs average middle class salary&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Specifically excluding people that are top earners. This point hits the entertainment software really hard. Productive software has more than time drained to show for itself. But even then, tax calculation software that people use once per year will suffer. Limited use and seasonal software should follow the way of the seasonal and casual labour - be hired temporarily. Entertainment software has a much bigger issue, they have to bring perceived value that cannot be obtained using hacked/cracked software.&lt;/li&gt;&lt;li&gt;Convenience is king&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; We live in the world of convenience. And that requirement of convenience is by necessity. We are pushed for higher productivity every day. If you wash dishes/clothes manually, then you don't have enough time to relax and be productive at work. Invasive DRM, software acquisition and other parts that make the experience of owning software inconvenient will result in people cracking DRM and downloading copies illegally. You have to treat your client in China the same as your client in US. Electronic channel legal software sales outside US are in an appalling state. And obtaining legally software is a nightmare in some countries that have proper bandwidth in place**... People rarely want to wait for your software to be available for them. These are not physical goods, that you have to ship and people know that.&lt;/li&gt;&lt;li&gt;Company's image&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; That also has a role. Even pirates that are "moral pirates" will buy stuff from companies that don't have an amoral image(from their POV).&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Even then, the dominating market players still win if "piracy" is rampant. Because people will "pirate" the dominant company's software more that any other. Granted, there a some that will "pirate" Indy games.&lt;br /&gt;&lt;br /&gt;* - There still will be people that will illegally obtain copies of software, no matter what the factors. The "moral pirates".&lt;br /&gt;** - I have to thank Valve for bringing out Steam. The king of convenience and accessibility.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-3249943078176732094?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/3249943078176732094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2011/03/software-piracy-piracy-copyright.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3249943078176732094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3249943078176732094'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2011/03/software-piracy-piracy-copyright.html' title='Software piracy, piracy... copyright infringement'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-4564994387593218914</id><published>2011-01-29T12:06:00.007+02:00</published><updated>2011-01-31T05:18:25.294+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Honeycomb'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Walkthough the Honeycomb Gallery Sample application (Whats new)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ezkkvgwuhpQ/TUPmohK-jJI/AAAAAAAAAKA/qsSFHneZdWs/s1600/Honeycomb.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/_ezkkvgwuhpQ/TUPmohK-jJI/AAAAAAAAAKA/qsSFHneZdWs/s200/Honeycomb.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;As the SDK preview of Honeycomb is released so are the the sources for the sample applications. One important addition to the samples list is the Honeycomb Gallery application. This application is the UI sampler application and displays the changes made to Android's UI framework.&lt;br /&gt;&lt;br /&gt;I will go thought the application and review the changes that have the greatest impact.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Honecomb preview seems to be unavailable for many people, so here is the code I go through: &lt;a href="http://activelogic-eu.s3.amazonaws.com/GalleryHC.zip"&gt;GalleryHC.zip @ ActiveLogic.EU S3&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MainActivity&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_ezkkvgwuhpQ/TUPj4X4DftI/AAAAAAAAAJ4/l-HJa5sK4fU/s1600/actionbar.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_ezkkvgwuhpQ/TUPj4X4DftI/AAAAAAAAAJ4/l-HJa5sK4fU/s1600/actionbar.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;A sample &lt;i&gt;ActionBar&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;i&gt;&lt;b&gt;&lt;span style="font-family: inherit;"&gt;ActionBar&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;The first change that you notice in the code is that there is an &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ActionBar&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MainActivity&lt;/span&gt; implements &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ActionBar.TabListener&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;* - Otherwise, as with previous releases, an activity class has to extend &lt;i style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Activity&lt;/i&gt; with it's standard lifecycle methods.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ActionBar&lt;/span&gt; consists of tabs(&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ActionBar.Tab&lt;/span&gt;), can have a custom &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;View&lt;/span&gt; and adds &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MenuItems&lt;/span&gt; from &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;View.onCreateOptionsMenu&lt;/span&gt;(optionally). These are the basic elements of the new &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ActionBar&lt;/span&gt; in Honeycomb. This &lt;i&gt;ActionBar&lt;/i&gt; is no doubt influenced by Twitter's(Android App) UI elements, though not without interesting additions.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ezkkvgwuhpQ/TUPkt1NdXMI/AAAAAAAAAJ8/qqig5M5S0kg/s1600/fragments.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="100" src="http://2.bp.blogspot.com/_ezkkvgwuhpQ/TUPkt1NdXMI/AAAAAAAAAJ8/qqig5M5S0kg/s320/fragments.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Fragments philosophy&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Fragments &lt;/b&gt;&lt;/i&gt;&lt;br /&gt;The next new element that I encounter in the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MainActivity&lt;/span&gt;, are the &lt;i&gt;Fragments&lt;/i&gt;.&amp;nbsp; The main activity uses two fragments - &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TitlesFragment&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ContentFragment&lt;/span&gt;.(No need to explain what these two are for...)&lt;br /&gt;&lt;br /&gt;In short, &lt;b&gt;&lt;i&gt;a fragment is a self contained sub-screen&lt;/i&gt;&lt;/b&gt;. These are created to encourage reuse and to give the UI a more flexible mechanism to adapt to screen sizes. Operations with fragments are transactional, so that these operations can be recorded and the "Back" button would work as expected. Each fragment transaction is placed in the stack, to be used for navigation. &lt;b&gt;&lt;a href="#star1" name="star1top"&gt;&lt;sup&gt;*&lt;/sup&gt;&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Main activity also inflates the menu items from &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;main_menu.xml&lt;/span&gt;, that are &lt;i&gt;automagically&lt;/i&gt; added to the &lt;i&gt;ActionBar&lt;/i&gt;. It has the functionality for switching the theme, for the actual switch it uses the new &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Activity.recreate()&lt;/span&gt; method.&lt;br /&gt;&lt;br /&gt;The main activity also uses the new Animation framework. To show and hide the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TitlesView&lt;/span&gt; of the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TitlesFragment&lt;/span&gt;. The activity uses &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ObjectAnimator&lt;/span&gt;&lt;b&gt;&lt;a href="#star2" name="star2top"&gt;&lt;sup&gt;**&lt;/sup&gt;&lt;/a&gt;&lt;/b&gt; to animate both slide out effect and fade out effect.&lt;br /&gt;&lt;br /&gt;The new Fragment framework also integrates with the layout XMLs and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;main.xml&lt;/span&gt; of the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MainActivity&lt;/span&gt; has these fragments defined part of the main layout.&lt;br /&gt;This is not the only way to use them, but it's the simplest.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Now&lt;/b&gt; on to the &lt;b&gt;fragments&lt;/b&gt; of &lt;i&gt;MainActivity&lt;/i&gt;!&lt;br /&gt;&lt;br /&gt;&lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ContentFragment&lt;/b&gt; houses the actual &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ImageView&lt;/span&gt; to display the selected image.&lt;br /&gt;Absolutely  simple fragment, but shows other parts of the new functionality.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It  adds the drop, of the drag-and-drop, listener to the main view.&lt;/li&gt;&lt;li&gt;It shows  that the &lt;i&gt;ActionBar&lt;/i&gt; can be hidden or shown dynamically.&lt;/li&gt;&lt;li&gt;It shows the most basic usage of &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Fragment&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;&lt;b&gt;Basic usage of fragment.&lt;/b&gt;&lt;/i&gt; Fragments have to override the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Fragment.onCreateView()&lt;/span&gt; method, where all of the proper initialization has to be processed. The &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;View&lt;/span&gt; returned is basically the visible part of the fragment, akin to &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;setContentView()&lt;/span&gt; on the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Activity&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;TitlesFragment&lt;/b&gt;&lt;/span&gt; is a &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ListFragment&lt;/span&gt; and basically it's the same principle as the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ListActivity&lt;/span&gt; is for &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Activity&lt;/span&gt;. That is, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ListFragment&lt;/span&gt; is a convenience class for usage with fragments that display only lists(via &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ListView&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;DnD functionality&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;The interesting part of the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TitlesFragment&lt;/span&gt; is the demo of the drag-and-drop functionality.&lt;br /&gt;On a long click of an item in the list, the drag operation is started. If you drop it on the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ContentFragment&lt;/span&gt; area, it will be loaded.&lt;br /&gt;There is an example of the drag operation's shadow drawing via &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;View.DragShadowBuilder&lt;/span&gt;, it draws a box that is the same size as the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TextView&lt;/span&gt; that is in the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ListView&lt;/span&gt; item. But since &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;View.DragShadowBuilder&lt;span style="font-family: inherit;"&gt; has a standard &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;onDraw(Canvas)&lt;/span&gt; method, any other shape, text or image can be drawn. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;ClipBoard&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;This fragment also showcases the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ClipData&lt;/span&gt;, from the new &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ClipBoard&lt;/span&gt;&lt;/b&gt;. The &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ClipData&lt;/span&gt; is associated with the drag operation to transfer the related data (&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;View.startDrag()&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CameraActivity &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;CameraActivity&lt;/span&gt; contains only &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;CameraFragment&lt;/span&gt;. Withch is by itself nothing new. Most of the API used in &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;CameraFragment&lt;/span&gt; is from API level 9(Gingerbread) and earlier. But it has, &lt;b&gt;one function &lt;/b&gt;that is &lt;b&gt;new&lt;/b&gt; making the &lt;i&gt;ActionBar&lt;/i&gt;'s logo button act as Back/Up operation. As per API doc &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ActionBar.setDisplayHomeAsUpEnabled&lt;/span&gt; : Set whether home should be displayed as an "up" affordance. Set this to true if selecting "home" returns up by a single level in your UI  rather than back to the top level or front page. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="#star1top" name="star1"&gt;&lt;sup&gt;*&lt;/sup&gt;&lt;/a&gt;&lt;/b&gt; - This can be easily backported to 2.1 releases with no problems. Since it's a simple stack of previous views/fragments.&lt;br /&gt;&lt;b&gt;&lt;a href="#star2top" name="star2"&gt;&lt;sup&gt;**&lt;/sup&gt;&lt;/a&gt;&lt;/b&gt; - Interesting observation on the usage of ValueAnimator.getAnimatedValue() and ObjectAnimator.ofPropertyValuesHolder(with multiple PropertyValuesHolders). Witch one will the ValueAnimator.getAnimatedValue() return? First one? Of will the ValueAnimator.AnimatorUpdateListener()'s onAnimationUpdate() be called for each PropertyValuesHolder?&lt;br /&gt;&lt;br /&gt;Legalese for images: &lt;br /&gt;&lt;blockquote&gt;Portions of this page are reproduced from work created and &lt;a href="http://code.google.com/policies.html"&gt;shared by the Android Open Source Project&lt;/a&gt;  and used according to terms described in the &lt;a href="http://creativecommons.org/licenses/by/2.5/"&gt;Creative Commons  2.5 Attribution License&lt;/a&gt;.  &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-4564994387593218914?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/4564994387593218914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2011/01/deconstructing-honeycomb-gallery.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/4564994387593218914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/4564994387593218914'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2011/01/deconstructing-honeycomb-gallery.html' title='Walkthough the Honeycomb Gallery Sample application (Whats new)'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ezkkvgwuhpQ/TUPmohK-jJI/AAAAAAAAAKA/qsSFHneZdWs/s72-c/Honeycomb.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-3005787820466000114</id><published>2011-01-03T14:15:00.004+02:00</published><updated>2011-08-27T06:42:11.263+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wow'/><category scheme='http://www.blogger.com/atom/ns#' term='warcraft'/><category scheme='http://www.blogger.com/atom/ns#' term='gaming'/><category scheme='http://www.blogger.com/atom/ns#' term='blizzard'/><title type='text'>World Of Warcraft: The most Expensive PC Game to Play</title><content type='html'>(UPDATE 2011 June 4th - &lt;a href="http://jalexoid.blogspot.com/2011/06/world-of-warcraft-still-quite-expensive.html"&gt;World Of Warcraft: Still quite Expensive PC Game to Play (Updated pricing)&lt;/a&gt;) &lt;br /&gt;&lt;br /&gt;I started playing World of Warcraft(WoW) in 2006 and I have to admit I got addicted. The game was a lot of fun. Blizzard are known to release good titles with Diablo, Warcraft and StarCraft behind them. But now it is getting out of hand.&lt;br /&gt;I've done some basic research. WoW is the most single expensive game for PC on the market right now.&lt;br /&gt;&lt;br /&gt;Here are some stats for the prices around the net(2011 January 3rd):&lt;br /&gt;&lt;br /&gt;&lt;table border="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="background-color: #cfe2f3;"&gt;Blizzard EU online store*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/td&gt;             &lt;td style="background-color: #cfe2f3;"&gt;&lt;/td&gt;&lt;td align="right" style="background-color: #cfe2f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 99.96 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Blizzard EU online store*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/td&gt;  &lt;td align="right"&gt;79.96 GBP&lt;/td&gt; &lt;td align="right"&gt;93.01 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-color: #cfe2f3;"&gt;Blizzard US online store*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/td&gt; &lt;td align="right" style="background-color: #cfe2f3;"&gt;129.96 USD&lt;/td&gt; &lt;td align="right" style="background-color: #cfe2f3;"&gt;97.81 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Amazon UK(physical copy) &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/td&gt;   &lt;td align="right"&gt;56.41 GBP&lt;/td&gt; &lt;td align="right"&gt;&amp;nbsp;&amp;nbsp; 65.93 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-color: #cfe2f3;"&gt;Amazon US(physical copy) &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/td&gt;  &lt;td align="right" style="background-color: #cfe2f3;"&gt;108.23 USD &lt;/td&gt;&lt;td align="right" style="background-color: #cfe2f3;"&gt;81.46 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Amazon DE(physical copy)&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/td&gt;              &lt;td&gt;&lt;/td&gt;&lt;td align="right"&gt;76.58 EUR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-color: #cfe2f3;"&gt;Amazon FR(physical copy)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/td&gt;              &lt;td style="background-color: #cfe2f3;"&gt;&lt;/td&gt;&lt;td align="right" style="background-color: #cfe2f3;"&gt;71.13 EUR&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The prices above are based on the game being bought by a new player for the first time. One month of playtime included. Each successive month costs additionally in accordance with the region.&lt;br /&gt;The prices are a sum of the prices of World Of Warcraft and The Burning Crusade, Wrath of The Lich King and Cataclysm expansion packs.&lt;br /&gt;&lt;br /&gt;* - How do you like it, a non-physical copy of a game, that is a 0 cost to manufacture is more expensive than a physical box shipped to your door.&lt;br /&gt;&lt;br /&gt;(Oh, why is the price of a 6 year old game 14.99?)&lt;br /&gt;&lt;br /&gt;What is the result of above? World Of Warcraft is the most expensive single PC game on the market right now. In fact it's the most expensive consumer entertainment game software right now.&lt;br /&gt;&lt;br /&gt;To put in mildly - Viacom, Activision and Blizzard are milking "this baby" to the limit.&lt;br /&gt;&lt;br /&gt;As a result, I have stopped playing WoW at all. My 12.99 EUR** per month have dried up for Blizz.&lt;br /&gt;&lt;br /&gt;So why am I so upset with the pricing? &lt;br /&gt;&lt;br /&gt;Generally speaking the game was worth every cent spent on it if you upgraded and played it from the beginning. It's cost to value ration is better than movies or most other mildly passive entertainment options. The reason is that for those 12.99 EUR per month you could get over 100 hours of pure entertainment per month. No movie, theater, game can beat that. (Well, except the free games are mathematically more valuable)&lt;br /&gt;&lt;br /&gt;But since the first introduction of the expansion packs, the value of the preceding versions has dropped. The expansions have introduced a lot of new features. Those features are not separated as strictly between expansion packs as players of different levels of experience and interest are. So you can't play the untarnished version of World of Warcraft anymore. You are forced to play Cataclysm, even if you don't own it. So when you buy World Of Warcraft(the original) you can't play the original game. Them you upgrade to The Burning Crusade, the content there is not as valuable in experience due to Wrath of The Lich King. And so on...&lt;br /&gt;And then, there are a lot of items that are made so obsolete, that people don't even want to get them. "Epic" items of the original World Of Worcraft can't even compare with the basic items available in The Burning Crusade...&lt;br /&gt;&lt;br /&gt;Because I expect Blizzard to be two heads above any other PC game company, there I am disappointed much more when they fail with pricing and content separation.&lt;br /&gt;Up until Cataclysm I held them to be smarter than any other... They are still the best gaming company out there. The awesomeness of StarCraft 2 just adds more to that image.&lt;br /&gt;But, if they don't come up with a better way to separate their value adding expansion packs, they are going to ruin a very good game for more people.&lt;br /&gt;&lt;br /&gt;** - Here's a good financial point that they might have missed. Because I haven't played WoW for over 30 moths now(Jan 2011) they didn't receive additional 390 EUR. And that is because they would not lower the price of Wrath of the Lich King after one year...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-3005787820466000114?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/3005787820466000114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2011/01/world-of-warcraft-most-expensive-pc.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3005787820466000114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3005787820466000114'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2011/01/world-of-warcraft-most-expensive-pc.html' title='World Of Warcraft: The most Expensive PC Game to Play'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-5121610939607605849</id><published>2009-11-21T14:59:00.002+02:00</published><updated>2011-01-29T12:12:51.934+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Art'/><title type='text'>Picasso's Cubism and Surrealism</title><content type='html'>Taking a turn from IT topics, a art related post.&lt;br /&gt;&lt;br /&gt;I am not your usual art fan. But my strange world views allow me to look at art from "another angle". Reticently I went to Pablo Picasso exhibition in Helsinki. I did not expect anything special, just want to know what all the "fuss" is about. He is heralded, by some, as the greatest art genius of the 20'th century.&lt;br /&gt;Some background info on him can be found at &lt;a href="http://en.wikipedia.org/wiki/Pablo_Picasso"&gt;Wikipedia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;But it boils down to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;His father was a painter and was teaching him from an early age&lt;/li&gt;&lt;li&gt;He said that he wasn't talented &lt;i&gt;per se&lt;/i&gt; but had the opportunity to expose his childis&lt;/li&gt;&lt;li&gt;his creativity&lt;/li&gt;&lt;li&gt;He is one of the cocreators of cubism&lt;/li&gt;&lt;li&gt;etc...&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;While walking through the exhibition, in chronological order, any one can see the progression from classic painting to expression of his personality in the most bold manner possible. That is the fist thing that struck me. His portraits, portray not the person in from of him, not even Picasso's perception of the person, but general feeling about Picasso.&lt;br /&gt;Then we come to his musing into his perceptions of things. His Man with Mustache painting depicts a construction clutter, as it seems from the first sight, but as the name says, it in fact is a man sitting at a table. There we go to the next logical step, the cubism.&lt;br /&gt;Cubism is a really interesting movement, but don't be fooled by the pictures in books and images on the net, the actual paintings are much like 3D games on your computers. You feel either that those images are coming out of the painting or you feel drawn into the depth of the picture. The painting Paysage With Two Figures looks as if Disney was making a his famous panoramas. Maybe Disney was influenced by those type of paintings. Some of his most interesting cubism paintings, look like imprints, rather than 3D objects. That even applies to portraits. While the 3D effect of portraits is absolutely obvious to any onlooker, the imprint type paintings have some broader effects. Imprint type paintings tend to change the image itself when looking onto it from different angles. Not to mention that the other effect of the imprint type paintings is like looking into a deep hole. Several times I felt like I was goint to fall into it.&lt;br /&gt;After cubism, Picasso seems to get back to classic portrait painting, but not for long. Surrealism steps in. It is triggered, by what I could understand, by Picasso falling madly in love. The surrealist pictures are have a high level of sexual motives. And yet, that is where his pictures shine. Most surrealist pictures are incredible. It's rearranged and mutilated body parts have a strange attraction. His woman motives are so attractive, that prior to reading the name of Woman in Red Armchair picture, I sat in front of it for ten minutes, because I could not take my eyes away from it. I guessed it's name fairly easy. And even after I finished whe whole of exhibition I went back to Woman in Red Armchair, and was staring at it for 10 more minutes! And this period is exactly when he had the most sexual tension in his pictures. He depicts people kissing, making love and highlights womens vaginas.&lt;br /&gt;And afterwards he takes on more classical themes. Greek motives can be seen throughout his paintings. The most interesting, is that his portrait of Eva, has her head in the spirit of ancient Greek sculptures. Her neck is prolonged, as if it is sitting on a column, with her body as a base.&lt;br /&gt;&lt;br /&gt;And these are my most memorable impressions of the &lt;a href="http://www.ateneum.fi/"&gt;Ateneum Art Museum's in Helsinki&lt;/a&gt; Picasso exhibition.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-5121610939607605849?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/5121610939607605849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/5121610939607605849'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2009/11/picassos-cubism-and-surrealism.html' title='Picasso&apos;s Cubism and Surrealism'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-4631213891055145263</id><published>2009-11-04T15:41:00.001+02:00</published><updated>2010-01-22T10:08:05.259+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Selenium'/><title type='text'>Selenium the joy and horror - Cached page data, fails verification</title><content type='html'>Up until Selenium IDE was created, manual testing was such a PITA. Now we have Selenium, bus as all new technologies and tools, there are a few quirks there...&lt;br /&gt;&lt;br /&gt;If your tests are run very fast, and to save time you need them to be very fast, you will have issues with data verification.&lt;br /&gt;&lt;br /&gt;Firefox sometimes displays cached version of a page, even though all the possible parameters and headers have been set not to cache the page.&lt;br /&gt;I found that doing two &lt;b&gt;open&lt;/b&gt; commands in a row helps this problem most of the time.&lt;br /&gt;If, that does not help, then adding &lt;b&gt;pause 500&lt;/b&gt;&amp;nbsp; in between the &lt;b&gt;open&lt;/b&gt; commands helps.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;D&lt;/b&gt;efinitely turn off all panels of &lt;b&gt;F&lt;/b&gt;irebug!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Do not forget to set "Pragma: no-cache", "Expires: [right now]", "Last-modified: [two days ago]", "Cache-control" and other headers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-4631213891055145263?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/4631213891055145263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/4631213891055145263'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2009/11/selenium-joy-and-horror-cached-page.html' title='Selenium the joy and horror - Cached page data, fails verification'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-3212554398587649293</id><published>2009-06-11T00:59:00.007+03:00</published><updated>2011-01-29T12:13:31.858+02:00</updated><title type='text'>The definitive guide of connecting Apache via LDAP SSL to ActiveDirectory + Subversion</title><content type='html'>&lt;span style="font-size: 85%;"&gt;Being taken though hell I of configuring the damn authentication mechanism.&lt;br /&gt;I needed to integrate Apache with ActiveDirectory via LDAP SSL. The manual SUCKS! It does not say anything useful, except for the syntax of the directives.&lt;br /&gt;&lt;a href="http://www.jejik.com/articles/2007/06/apache_and_subversion_authentication_with_microsoft_active_directory/"&gt;This article&lt;/a&gt; was the most definitive of configuring the integration. But lacks the information about how to make the SSL work correctly.&lt;br /&gt;&lt;br /&gt;Here's the kicker, it is as simple as the following several elements(this is in the top of /etc/apache2/sites-available/default):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;# Make sure ve don't care about the server's certificate, because we don't&lt;br /&gt;LDAPVerifyServerCert off&lt;br /&gt;LDAPTrustedMode SSL&lt;br /&gt;# The server's client cert information: the cert and the matching private key&lt;br /&gt;LDAPTrustedGlobalCert CERT_BASE64 /etc/apache2/sites-available/cert1.pem&lt;br /&gt;LDAPTrustedGlobalCert KEY_BASE64 /etc/apache2/sites-available/key1.pem&lt;br /&gt;&lt;br /&gt;These go into the ROOT. Do not try to put them in the Location, nor Directory, nor VirtualHost.&lt;br /&gt;&lt;br /&gt;And the main change to enable the SSL transport:&lt;br /&gt;AuthLDAPURL "ldaps://adserver.example:636/DC=adserver,DC=example?sAMAccountName?sub?(objectClass=*)" SSL&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;These are the steps:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 85%; font-weight: bold;"&gt;1. Create the client Key and Certificate&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;br /&gt;The cert1.pem and key1.pem are created like &lt;a href="http://sial.org/howto/openssl/self-signed/"&gt;described here&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;kbd&gt;openssl genrsa 1024 &amp;gt; &lt;/kbd&gt;key1.pem&lt;br /&gt;openssl req -new -x509 -nodes -sha1 -days 365 -key key1.pem &amp;gt; cert1.pem&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 85%; font-style: italic;"&gt;For an additional configuration reduction bonus you can have it in one single file:&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 85%; font-style: italic;"&gt;cat cert1.pem key1.pem &amp;gt; pcert.pem&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 85%; font-style: italic;"&gt;LDAPTrustedGlobalCert CERT_BASE64 /etc/apache2/sites-available/pcert.pem&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 85%; font-weight: bold;"&gt;2. Enable the correct modules on Apache HTTP Server 2.2.&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;br /&gt;On my Ubuntu system the module enabling is done like this:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="de1"&gt;&lt;span style="font-size: 85%;"&gt;sudo a2enmod alias&lt;/span&gt;&lt;/div&gt;&lt;div class="de1"&gt;&lt;span style="font-size: 85%;"&gt;sudo &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;a2enmod auth_basic&lt;/span&gt;&lt;/div&gt;&lt;div class="de1"&gt;&lt;span style="font-size: 85%;"&gt;sudo &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;a2enmod authnz_ldap&lt;/span&gt;&lt;/div&gt;&lt;div class="de1"&gt;&lt;span style="font-size: 85%;"&gt;sudo &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;a2enmod authz_default&lt;/span&gt;&lt;/div&gt;&lt;div class="de1"&gt;&lt;span style="font-size: 85%;"&gt;sudo &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;a2enmod authz_user&lt;/span&gt;&lt;/div&gt;&lt;div class="de1"&gt;&lt;span style="font-size: 85%;"&gt;sudo &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;a2enmod dav&lt;/span&gt;&lt;/div&gt;&lt;div class="de1"&gt;&lt;span style="font-size: 85%;"&gt;sudo &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;a2enmod dav_svn&lt;/span&gt;&lt;/div&gt;&lt;div class="de1"&gt;&lt;span style="font-size: 85%;"&gt;sudo &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;a2enmod ldap&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;Or uncomment these elements in the httpd.conf:&lt;br /&gt;LoadModule actions_module modules/mod_actions.so&lt;br /&gt;LoadModule auth_basic_module modules/mod_auth_basic.so&lt;br /&gt;LoadModule authn_default_module modules/mod_authn_default.so&lt;br /&gt;LoadModule authnz_ldap_module modules/mod_authnz_ldap.so&lt;br /&gt;LoadModule authz_host_module modules/mod_authz_host.so&lt;br /&gt;LoadModule authz_user_module modules/mod_authz_user.so&lt;br /&gt;LoadModule ldap_module modules/mod_ldap.so&lt;br /&gt;&lt;br /&gt;And the modules that are prescribed by the Subversion.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 85%; font-weight: bold;"&gt;3. The access restrictions&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-style: italic;"&gt; and Subversion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The short info for configuring the access restrictions.&lt;br /&gt;This will allow people in the users in SVN Writers to commit and SVN Readers will be able to checkout and connect.&lt;br /&gt;&lt;br /&gt;&amp;lt;Location&amp;gt;&lt;br /&gt;# This enables Subversion&lt;br /&gt;DAV svn&lt;br /&gt;# Location of the Subversion repository&lt;br /&gt;SVNPath /home/ldaptest/&lt;br /&gt;&lt;br /&gt;# How we are going to get authenticated&lt;br /&gt;AuthBasicProvider ldap&lt;br /&gt;AuthType Basic&lt;br /&gt;AuthzLDAPAuthoritative on&lt;br /&gt;AuthName "My Subversion server"&lt;br /&gt;#The URL of the ActiveDirectory server&lt;br /&gt;AuthLDAPURL "ldaps://adserver.example:636/DC=adserver,DC=example?sAMAccountName?sub?(objectClass=*)" SSL&lt;br /&gt;# Credentials for the Apache HTTP to connect to the A/D to issue queries&lt;br /&gt;AuthLDAPBindDN "subversion@adserver.example"&lt;br /&gt;AuthLDAPBindPassword 555&lt;br /&gt;&lt;br /&gt;# Limit all write operations to users within SVN Writers group&lt;br /&gt;&amp;lt;LimitExcept&amp;gt;&lt;br /&gt;require ldap-group CN=SVN Writers,CN=Users,DC=adserver,DC=example&lt;br /&gt;&amp;lt;/LimitExcept&amp;gt;&lt;br /&gt;# Limit logon and reading to only users in SVN Readers group&lt;br /&gt;require ldap-group CN=SVN Readers,CN=Users,DC=adserver,DC=example&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 85%; font-weight: bold;"&gt;4. Add the following to the default site on Apache HTTP&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;br /&gt;The file is&lt;/span&gt;&lt;span style="font-size: 85%; font-style: italic;"&gt; /etc/apache2/sites-available/default&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;Right at the TOP.&lt;br /&gt;&lt;br /&gt;# Make sure ve don't care about the server's certificate, because we don't&lt;br /&gt;LDAPVerifyServerCert off&lt;br /&gt;LDAPTrustedMode SSL&lt;br /&gt;# The server's client cert information: the cert and the matching private key&lt;br /&gt;LDAPTrustedGlobalCert CERT_BASE64 /etc/apache2/sites-available/cert1.pem&lt;br /&gt;LDAPTrustedGlobalCert KEY_BASE64 /etc/apache2/sites-available/key1.pem&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-3212554398587649293?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/3212554398587649293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2009/06/definitive-guide-of-connecting-apache.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3212554398587649293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3212554398587649293'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2009/06/definitive-guide-of-connecting-apache.html' title='The definitive guide of connecting Apache via LDAP SSL to ActiveDirectory + Subversion'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-3976655605718722301</id><published>2009-06-02T11:16:00.007+03:00</published><updated>2009-12-03T08:38:03.022+02:00</updated><title type='text'>Be careful how you truncate...</title><content type='html'>Here's one example how truncation has made the entry look like it's a conspiracy theorists' website:&lt;a href="http://1.bp.blogspot.com/_ezkkvgwuhpQ/SiTgPSyFusI/AAAAAAAAAAM/vl0tbZBGIgI/s1600-h/Instructables-I.did.not.post.it.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5342641611312839362" src="http://1.bp.blogspot.com/_ezkkvgwuhpQ/SiTgPSyFusI/AAAAAAAAAAM/vl0tbZBGIgI/s320/Instructables-I.did.not.post.it.gif" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;The text below reads:"...See the video at the end for the Test Results!   NOT...posted by Kipay".&lt;br /&gt;&lt;br /&gt;This one is from &lt;a href="http://www.instructables.com/id/Computer_Recycling_and_Repurposing/"&gt;Instructibles&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-3976655605718722301?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/3976655605718722301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2009/06/be-careful-how-you-truncate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3976655605718722301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3976655605718722301'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2009/06/be-careful-how-you-truncate.html' title='Be careful how you truncate...'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ezkkvgwuhpQ/SiTgPSyFusI/AAAAAAAAAAM/vl0tbZBGIgI/s72-c/Instructables-I.did.not.post.it.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-7853136957451377277</id><published>2009-05-24T22:30:00.008+03:00</published><updated>2011-01-29T12:14:19.831+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Analysis'/><title type='text'>5 signs of a hijacked client</title><content type='html'>&lt;span style="font-weight: bold;"&gt;The context rant&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While doing my main line of work, I never shy away from doing some consultancy work for clients. And I mean no programming, I mean business operation consultancy. Though I am a application development consultant and application developer, I do have enough experience to identify when a company has issues with overhead in work. I mean premature optimization is what a lot of programmers are all about and sometimes the business side benefits from that very well.&lt;br /&gt;&lt;br /&gt;For the topic at hand. I had this good friend nagging me for a long amount of time for a consult. He is a successful businessman and no one in their right mind would call his business a failure. It's a nice Anonymous LTD that manages to turn over a few million euros per year with 12 people. So I signed up. I do not consider charging my friends for any non technical work. Since I follow the ideology of having a lot of friends at the expense of quick income.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The "motherload&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;So I started rather quickly on analyzing Anonymous LTD. The analysis part was quite fun and easy. I liked talking to people and they gladly shared all of the positives and negatives of their work. Some even had suggestions :) And that is where I started to suspect that something was wrong.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;The employees are de facto subordinate non management staff.&lt;/span&gt;&lt;br /&gt;The sales people were "afraid"(read subordinate) of not the management, but to the accounting. Yeah, that is when I had the first WTF moment.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;There is a department that everyone tries to please, and not the management.&lt;/span&gt;&lt;br /&gt;The sales and other employees felt that they were somehow more dependent on accounting rather then the strategical management. Remember, accounting is a support operation in non accounting related companies.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;The management displays uncertainty and consults some department on business matters.&lt;/span&gt;(Legal and purely technical are different stories)&lt;br /&gt;Really, when I went on to ask why the hell was there no CEO in the company, my friend, the director called up head of accounting to ask!!!!&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;You present a solution that improves managerial oversight and operations visibility and it's shot down by management.&lt;/span&gt;&lt;br /&gt;I proposed a new reporting tool/function, that was integrated into the stock tracking and order system. The director and top sales manager said: "Wow! Great! We really want it!". And two days later, they cut out the functionality, because it had not enough financial data(the stock tracking and order system, was not suppose to have any financial info).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;The management's position changes whenever the company gets new, non management level,  people on board.&lt;/span&gt;&lt;br /&gt;I already had the contract secured and signed. The company that was suppose to perform the work was selected and already analyzing requirements. Great! I thought. Then a new person is hired into the sales team. The contract is cancelled, because of hudge requirements changes.&lt;/li&gt;&lt;/ol&gt;The company had an issue with their &lt;span style="font-style: italic;"&gt;stock to quote to order to delivery&lt;/span&gt; operation. It is unreliable and overburdened by out of date data. They still don't have any automation of warehouse stock information. Why? Because the new head sales-person wants to see a dashboard with all the client's information orders, payment statuses, credit and in real time and the accounting do not want to let that information out of their hands.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;That is what I call a hijacked company:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A company that is taken over by a nonessential department and weak, collaborating, management.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    Be very, very careful, it's a trap of uncertainty.&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Aftermath&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I managed to push trough a CEO for the company, because the managing director was and is my friend and a little too soft. And last time I checked, he still keeps accounting at bay and the director is non managing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-7853136957451377277?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/7853136957451377277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2009/05/5-signs-of-hijacked-client.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/7853136957451377277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/7853136957451377277'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2009/05/5-signs-of-hijacked-client.html' title='5 signs of a hijacked client'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-8873306676854379085</id><published>2009-03-22T23:38:00.012+02:00</published><updated>2011-01-29T12:14:37.555+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Concurrency'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='rants'/><title type='text'>Why is software not that scalable?</title><content type='html'>&lt;span style="font-size: 85%; font-weight: bold;"&gt;(FYI: This is a 3 AM rant, so don't take it too hard, if anyone reads this at all)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Most software out there relies so much on shared data, that it does not easily scale.&lt;br /&gt;&lt;br /&gt;The problem with that is, that somehow developers don't understand that most of the time the data may be allowed to be stale(though still relevant) - see how Amazon Dynamo's clients handle it. Or that most data is accessed only by one process at a time.&lt;br /&gt;In fact, when looking at human interaction systems we see that most of the data is stale when people perform a certain task.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Here are some point that I describe below&lt;/span&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Allow data to be stale, there is very little reason of making sure everything is always up to date all the time, spread the data as much as possible&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Check out the data access patterns, most data is access&lt;/li&gt;&lt;li&gt;Understand that need for data does not involve one process/thread being hung up on one resource&lt;/li&gt;&lt;li&gt;If you need stuff to be up-to-date in real time, share the responsibility - aggregating data is faster and easier&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;On the freshness of data. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sample from most of the governmental institutions: laws and regulations have a time of activation that is shared in advance. A lot of decisions are made at a low level without checking the central(at a national level) legal repository every time. That is when data is stale, but still very much relevant.&lt;br /&gt;&lt;br /&gt;Sample from most businesses: business rules are much more dynamic than at the governmental institution, but still we see that most of them change very little. Sure you can change it at once, but you would never expect any of you own businesses employees to act on the changed rules, until the employee gets the message about a change in the rules.&lt;br /&gt;&lt;br /&gt;Sample from every society that has laws that change or may be changed: when a law is passed, you don't know that is has changes some other law or made something illegal or legal instantly. It has a date of coming into force. Up until then every person will know most important laws that are in effect and when the new law comes into effect.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Then there is the access to data.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sample from banking: chances are that there will be no more than ONE "process" using an account data at a time. In fact, I bet that, the absolute majority of operations are performed by one process accessing ONE account. The reality is, that the only part that the bank needs to be absolutely sure about is the "credit" operation(Say bye to "credit-&amp;gt;debit|undo transaction"). The debit operation can be reasonably fast in asynchronous mode and can send notification of a failure.&lt;br /&gt;&lt;br /&gt;Sample from real life: if you don't find your personal mug in the cupboard you don't just stand at the cupboard until someone returns it! You go and look around. The mug is the data here and the person is the process. Standing and waiting for it ti be returned is equivalent of locking a resource.&lt;br /&gt;As this sample shows, locking and waiting is not always the best option. The reality is, that it's not the process that has taken the resource that locks, it's the waiting resource that locks and waits.&lt;br /&gt;&lt;br /&gt;My proposed strategy, is &lt;span style="font-style: italic;"&gt;acquire ownership of the data and leave a note stating who knows it's whereabouts&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;So the morale is don't lock, but take. Don't wait, but look around.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Now. I can't really comment on systems where real time data is essential. But in medicine real time means means the difference between life and death. But those systems are embarrassingly parallelizable.&lt;br /&gt;&lt;br /&gt;Remember, our world works on &lt;span style="font-weight: bold;"&gt;Eventually Consistent Model&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; the, &lt;span style="font-style: italic;"&gt;ironically fatally named&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;ACID&lt;/span&gt; one.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-weight: bold; text-align: center;"&gt;Just look around, the world is already massively parallel, why create new ideas when mother nature has provided us with a lot of the answers.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-8873306676854379085?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/8873306676854379085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2009/03/why-is-software-not-that-scalable.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/8873306676854379085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/8873306676854379085'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2009/03/why-is-software-not-that-scalable.html' title='Why is software not that scalable?'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-8952808728052379296</id><published>2009-03-07T12:59:00.002+02:00</published><updated>2009-12-03T08:38:26.696+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wow moments in technology'/><title type='text'>WOW! Moment</title><content type='html'>Rarely do I go "Wow!". But this is something incredible!&lt;br /&gt;Check out &lt;a href="http://adaptivepath.com/aurora/"&gt;Aurora Concept&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-8952808728052379296?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/8952808728052379296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2009/03/wow-moment.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/8952808728052379296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/8952808728052379296'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2009/03/wow-moment.html' title='WOW! Moment'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-8552361519917852908</id><published>2008-12-25T14:43:00.007+02:00</published><updated>2011-01-29T12:54:17.543+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='Techniques'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><title type='text'>Make your Hibernate data objects smart?</title><content type='html'>In a race to learn Hibernate and create products for my former job, I have found a simple way to make my Hibernate data objects smarter.&lt;br /&gt;We all know th standard way to access the Hibernate session using the SessionHolder*.&lt;br /&gt;&lt;br /&gt;This is a basic abstract class(shown below) that will add the .add(), .update() and .delete() methods to your data objects.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Just extend this class by your Hibernate DTO like this:&lt;br /&gt;public class Address extends BaseData&lt;br /&gt;&lt;br /&gt;And then just after populating the new Address object, you write address.add().&lt;br /&gt;&lt;div style="overflow: auto;"&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public abstract class BaseData implements Serializable {&lt;br /&gt;&lt;br /&gt;    public String add() {&lt;br /&gt;     try {&lt;br /&gt;       SessionHolder.currentSession().getSess().save(this);&lt;br /&gt;       SessionHolder.currentSession().getSess().flush();&lt;br /&gt;     } catch (Exception ex) {&lt;br /&gt;       SessionHolder.endSession();&lt;br /&gt;       ex.printStackTrace();&lt;br /&gt;       Messenger.addFatalMessage(ex.getMessage(), ex.getMessage());&lt;br /&gt;       return StandardResults.FAIL;&lt;br /&gt;     }&lt;br /&gt;     return StandartResults.SUCCESS;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String update() {&lt;br /&gt;     try {&lt;br /&gt;      SessionHolder.currentSession().getSess().update(this);&lt;br /&gt;      SessionHolder.currentSession().getSess().flush();&lt;br /&gt;      return StandartResults.SUCCESS;&lt;br /&gt;     } catch (Exception ex) {&lt;br /&gt;      SessionHolder.endSession();&lt;br /&gt;      ex.printStackTrace();&lt;br /&gt;      Messenger.addFatalMessage(ex.getMessage(), ex.getMessage());&lt;br /&gt;      return StandardResults.FAIL;&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String delete() {&lt;br /&gt;     try {&lt;br /&gt;       SessionHolder.currentSession().getSess().delete(this);&lt;br /&gt;       SessionHolder.currentSession().getSess().flush();&lt;br /&gt;      return StandartResults.SUCCESS;&lt;br /&gt;     } catch (HibernateException ex) {&lt;br /&gt;      SessionHolder.endSession();&lt;br /&gt;      ex.printStackTrace();&lt;br /&gt;      Messenger.addFatalMessage(ex.getMessage(), ex.getMessage());&lt;br /&gt;      return StandardResults.FAIL;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This particular class was designed to be used in a JSF web application. Hence, the return types for methods are String's and there is a reference to StandardResults and Messenger class.&lt;br /&gt;Messenger class is a generic class to present the user with a message.&lt;br /&gt;StandardResults is what it's name stands for.&lt;br /&gt;&lt;br /&gt;Please note, this may be used in JSF tables and lists only in places where the data is changed rarely or not concurrently.&lt;br /&gt;But placing this element in a column in a h:dataTable will work as intended:&lt;br /&gt;&lt;h:commandlink action="#{item.delete}" onclick="if(!confirm('?')){ return;}"&gt;&lt;br /&gt;&lt;h:outputtext value="X"&gt;&lt;br /&gt;&lt;/h:outputtext&gt;&lt;br /&gt;&lt;br /&gt;Also on your edit form page, you may use it without any potential problems, like this:&lt;br /&gt;&lt;h:commandbutton action="#{dtoThatIsBeingEdited.update}" value="Save changes"&gt;&lt;br /&gt;&lt;br /&gt;And on your new entry form page similarly:&lt;br /&gt;&lt;h:commandbutton action="#{dtoThatIsBeingCreated.add}" value="Create entry"&gt;&lt;br /&gt;&lt;br /&gt;In the end this technique saves a lot of time, by removing the need to create add, update and remove mehtods in your JSF  managed-beans for those simple and boring CRUD operations.&lt;br /&gt;&lt;br /&gt;* - For those who don't: see &lt;a href="http://www.hibernate.org/hib_docs/v3/reference/en-US/html/tutorial-firstapp.html#tutorial-firstapp-helpers"&gt;here&lt;/a&gt; or in simple terms this thing holds the session for the current thread and context - in the example, the call SessionHolder.currentSession() is translated to HibernateUtil.getSessionFactory().getCurrentSession().&lt;/h:commandbutton&gt;&lt;/h:commandbutton&gt;&lt;/h:commandlink&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-8552361519917852908?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/8552361519917852908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2008/12/make-your-hibernate-data-objects-smart.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/8552361519917852908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/8552361519917852908'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2008/12/make-your-hibernate-data-objects-smart.html' title='Make your Hibernate data objects smart?'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-82128858870094930</id><published>2008-12-15T01:21:00.007+02:00</published><updated>2011-01-29T12:55:41.144+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DB'/><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><title type='text'>How about a nice future for DBMS query languages?</title><content type='html'>Now thinking of SQL, it is a perfectly good language, but it is old. It is being pushed now to something that was not really intended for it.&lt;br /&gt;&lt;br /&gt;We start needing to have more complex structures returned from our databases. See emergence of Amazon's SimpleDB, CouchDB and such.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What about a database where we talk to it in something more familiar? Even JavaScript seems nice... Well, the nice thing is that it's OOP model is basically tuples, the thing that most RDBMS'es understand perfectly well...&lt;br /&gt;The problem at hand is the relation, but that is for another "pondering night".&lt;br /&gt;&lt;br /&gt;Imagine this SQL query:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SELECT * FROM table_a WHERE id &amp;gt; 5 and name = 'Test'&lt;/div&gt;&lt;br /&gt;In JavaScript form:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;table_a.filter( {id:gt(5),name:"Test"} ).all()&lt;/div&gt;(gt(5) here is a function returning a function that compares input so that it's greater than 5)&lt;br /&gt;&lt;br /&gt;Readable? Not too much. Flexible? Definitely. Can it be improved? Absolutely!&lt;br /&gt;&lt;br /&gt;There are more readable languages there... Like Python or Ruby.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-82128858870094930?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/82128858870094930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2008/12/hopw-about-nice-future-for-dbms-query.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/82128858870094930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/82128858870094930'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2008/12/hopw-about-nice-future-for-dbms-query.html' title='How about a nice future for DBMS query languages?'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-1040495731395501715</id><published>2008-12-12T16:08:00.004+02:00</published><updated>2009-12-03T08:39:04.794+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>How imperfect can you be to be good enough?</title><content type='html'>How imperfect can you be to be good enough?&lt;br /&gt;&lt;br /&gt;This is so true for software development and much more than just software development. There is no 100% reliability, no 100% testability.&lt;br /&gt;&lt;br /&gt;Nothing is absolute, and absolute is nothing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-1040495731395501715?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/1040495731395501715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2008/12/how-imperfect-can-you-be-to-be-good.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/1040495731395501715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/1040495731395501715'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2008/12/how-imperfect-can-you-be-to-be-good.html' title='How imperfect can you be to be good enough?'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-1297301218386392112</id><published>2008-12-10T23:50:00.005+02:00</published><updated>2011-01-29T13:05:42.077+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic'/><title type='text'>Quack my class: A lil' bit more dinamicity in Java</title><content type='html'>&lt;div align="left"&gt;Java is criticized for being too rigid due to static typing. But what do we know about type dynamicity in Java:&lt;/div&gt;&lt;ol&gt;&lt;li&gt; &lt;div align="left"&gt;Reflection and bean introspection&lt;br /&gt;In theory  you can write statically untraceable code using only refection API,  that would constitute dynamicity.&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;div align="left"&gt;Java 1.4 Proxy API&lt;br /&gt;Need to have a stub for an  interface? This is the tool for you. Supply an interface and  InvocationHandler and you will get an Object that implements the  Interface and will forward the method calls to your  InvocationHandler.&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;div align="left"&gt;ClassLoading is on demand&lt;br /&gt;You may load  classes from different locations on demand and invoke them thus  adding new functionality on the fly. This leads to ability to  generate code, compile it and load without intervention of a  developer.&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;div align="left"&gt;Java 5 introduced the instrumentation API&lt;br /&gt;Java 5 gave us something new. From this version we can redefine  classes via a standard interface – java agents.&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;div align="left"&gt;The upcoming invokedynamic JVM isntruction&lt;br /&gt;invokedynamic is less about Java as a language, but more to  introduce more languages to JVM, specially the dynamic ones.&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div align="left"&gt;On the scene we have OO “dynamic” languages that follow something called duck typing.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Duck typing&lt;/b&gt; - “if it walks like a duck and quacks like a duck, therefore it must be a duck”, the languages that have that scheme only determine if the variable will accept the method call or have a particular property/instance variable with corresponding name. But they will “complain” if the call was made incorrectly.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="left"&gt;In essence if you provide any object that has a method walk, to code that expects object of type Human, it will execute without any problems.&lt;/div&gt;&lt;div align="left"&gt;Duck typing in Java&lt;/div&gt;&lt;div align="left"&gt;True duck typing in Java is not really possible. But, there is always a “but”.&lt;br /&gt;Say there are 2 classes that are identical in their method signature, duck typing would allow those to be “interchangeable”. In Java you would need both of them to implement same interface to do it “correctly”.&lt;/div&gt;&lt;div align="left"&gt;We can also do some hacking and create an interface and use that. As for the classes we could create an InvocationHandler and a Proxy, witch would forward the method calls to the classes.[(2) in the list above].&lt;/div&gt;&lt;div align="left"&gt;The code would be like the following:&lt;/div&gt;&lt;pre class="brush: java"&gt;HashMap anything = new HashMap();&lt;br /&gt;&lt;br /&gt;   DuckInvocationHandler dih = new DuckInvocationHandler(anything);&lt;br /&gt;&lt;br /&gt;   anything.put("test", "Congratulations, it WORKS!");&lt;br /&gt;&lt;br /&gt;   MyMap duck = (MyMap)Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{MyMap.class}, dih);&lt;br /&gt;&lt;br /&gt;   System.out.println("Out: "+ duck.get("test"));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div align="left"&gt;The interface to represent what the result we want:&lt;/div&gt;&lt;pre class="brush: java"&gt;public interface MyMap {&lt;br /&gt;      Object get(Object i);&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="left"&gt;The InvocationHandler implementation:&lt;/div&gt;&lt;div&gt;java.lang.reflect.InvocationHandler has only one method to override.&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;@Override&lt;br /&gt;public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {&lt;br /&gt;   Method mth = nonDuckClass.getMethod(method.getName(), method.getParameterTypes());&lt;br /&gt;   return mth.invoke(nonDuck, args);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="left"&gt;This approach:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Is standards based&lt;/li&gt;&lt;li&gt;Will work only with interfaces&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div align="left"&gt;There is another way. A popular library for class manipulation is CGLib. It features the ability to Proxy a class, by creating a subclass of it at runtime.&lt;/div&gt;&lt;div align="left"&gt;How will the code look? CGLib also has an InvocationHandler, and it also has only one method invoke. So just replace java.lang.reflect.InvocationHandler with net.sf.cglib.proxy.InvocationHandler, and the conversion process is done for the handler.&lt;/div&gt;&lt;div align="left"&gt;The proxy creation process is a bit longer, but does have it's own advantages. The code:&lt;/div&gt;&lt;pre class="brush: java"&gt;// Use caching Enhancer object&lt;br /&gt;Enhancer e = new Enhancer();&lt;br /&gt;e.setUseCache(true);&lt;br /&gt;e.setCallback(duckInvocationHandlerInstance);&lt;br /&gt;e.setClassLoader(o.getClass().getClassLoader());&lt;br /&gt;e.setInterceptDuringConstruction(false);&lt;br /&gt;if (asType.isInterface())&lt;br /&gt;   e.setInterfaces(new Class[] { asType });&lt;br /&gt;else&lt;br /&gt;   e.setSuperclass(asType);&lt;br /&gt;Object output = e.create();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div align="left" style="margin-bottom: 0in;"&gt;This approach:&lt;/div&gt;&lt;ul&gt;&lt;li&gt; &lt;div align="left" style="margin-bottom: 0in;"&gt;Caching : As you can  see on line 3 we set the Enhancer to use cache.&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;div align="left" style="margin-bottom: 0in;"&gt;Works with both classes  and interfaces   &lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align="left" style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0in;"&gt;What are we missing? Type safety.&lt;br /&gt;For this to work correctly before you make the class quack as you wish, you need to check if the type and return type classes are compatible. For this I have created a small library, ready to use, but still a bit limited.&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0in;"&gt;The limitation is, that return and parameters values are not proxied. Therefore parameters have to of the same type and return type has to be either same type or subtype.&lt;/div&gt;&lt;div align="left"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="font-weight: bold;"&gt;The result&lt;/div&gt;&lt;div align="left"&gt;We may or may not want anything to do with duck typing. The reasons against is that Java was built to be strict. It violates the core Java philosophy – more checks during compile time. Although, this way is much better then totally blind duck typing, since you have to specify the interface.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="left"&gt;Where might we use it?&lt;br /&gt;&lt;br /&gt;The main reason for using it, is to be able to practically alias some APIs and possibly use different versions of one API in the same code.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-1297301218386392112?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/1297301218386392112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2008/12/quack-my-class-lil-bit-more-dinamicity.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/1297301218386392112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/1297301218386392112'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2008/12/quack-my-class-lil-bit-more-dinamicity.html' title='Quack my class: A lil&apos; bit more dinamicity in Java'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-537036639640957793</id><published>2008-12-02T17:11:00.010+02:00</published><updated>2011-01-29T13:12:52.278+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Guice'/><category scheme='http://www.blogger.com/atom/ns#' term='DI'/><category scheme='http://www.blogger.com/atom/ns#' term='Seam'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Dynamic Dependency Injection</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Dynamic Dependency Injection, Context Aware Injection or "on the fly" configuration.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Something that should be real easy, though is not thought of in &lt;a href="http://www.springframework.org/"&gt;Spring &lt;/a&gt;nor in &lt;a href="http://code.google.com/p/google-guice/"&gt;Guice&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;What is DDI?&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The challenges that &lt;a href="http://en.wikipedia.org/wiki/Dependency_injection"&gt;DI&lt;/a&gt; meets are well defined. And are already met. This is the next thing, in removing more glue code from you application code.&lt;br /&gt;The target of DDI is to to remove as much as possible of non value bearing code. Value bearing code is the pure logic. Like &lt;a href="http://seamframework.org/"&gt;Seam&lt;/a&gt; removes the need to get the data from the &lt;a href="http://java.sun.com/javaee/javaserverfaces/"&gt;JSF&lt;/a&gt; forms and places them in the &lt;a href="http://docs.jboss.org/seam/latest/api/org/jboss/seam/annotations/In.html"&gt;@In&lt;/a&gt; annotated field. And you are left only with the need to do actual value bearing logic.&lt;br /&gt;Sample from &lt;a href="http://docs.jboss.com/seam/latest/reference/en-US/html/tutorial.html#d0e582"&gt;here&lt;/a&gt;:&lt;br /&gt;&lt;pre class="brush: java"&gt;   public String register() {&lt;br /&gt;      List existing = em.createQuery("select username from User where username=#{user.username}") .getResultList();&lt;br /&gt;&lt;br /&gt;      if (existing.size()==0) {&lt;br /&gt;         em.persist(user);&lt;br /&gt;         log.info("Registered new user #{user.username}");&lt;br /&gt;         return "/registered.xhtml";&lt;br /&gt;      } else {&lt;br /&gt;         FacesMessages.instance().add("User #{user.username} already exists");&lt;br /&gt;         return null;&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;In the sample above your job as a developer is to do checks and proceed with the right branch of operation.&lt;br /&gt;That is 100% value bearing code, since it does exactly what it's intention is:&lt;br /&gt;&lt;a href="http://beta.blogger.com/post-create.g?blogID=956064359108114628#" name="targets"&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Check the data store for duplicate values&lt;/li&gt;&lt;li&gt;Save the data if not exists&lt;/li&gt;&lt;li&gt;Report error if exists&lt;/li&gt;&lt;/ul&gt;The &lt;a href="http://docs.jboss.org/seam/latest/api/org/jboss/seam/annotations/In.html"&gt;@In&lt;/a&gt; annotated field is populated based on the context in witch the &lt;a href="http://en.wikipedia.org/wiki/Session_Beans"&gt;EJB&lt;/a&gt; was run. In &lt;a href="http://www.springframework.org/"&gt;Spring &lt;/a&gt;and &lt;a href="http://code.google.com/p/google-guice/"&gt;Guice&lt;/a&gt;, it is awkward when doing the same. Mostly the beans are configured once and relations are more dynamic.&lt;br /&gt;&lt;br /&gt;Now DDI is another step forward. I say: Why remove only the setting and basic configuration? Let us remove the data fetching code and "script it".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt; DI code would be:&lt;br /&gt;&lt;pre class="brush: java"&gt;   @Autowired&lt;br /&gt;   private WarehouseQuantityDAO dao;&lt;br /&gt;&lt;br /&gt;   @Autowired&lt;br /&gt;   private OrderItemTO oi;&lt;br /&gt;&lt;br /&gt;   public boolean checkAvailableQuantity(){&lt;br /&gt;      int availableQuantity = dao.getQuantity(oi.getProductCode());&lt;br /&gt;      return availableQuantity &amp;gt; oi.getOrderedQuantity();&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;While DDI code would be something similar:&lt;br /&gt;&lt;pre class="brush: java"&gt;   @Autowired&lt;br /&gt;   @Bound(name="JPAEntity_named_query",bind="orderItem.productCode")&lt;br /&gt;   private int availableQuantity;&lt;br /&gt;&lt;br /&gt;   @Autowired&lt;br /&gt;   private OrderItemTO orderItem;&lt;br /&gt;&lt;br /&gt;   public boolean checkAvailableQuantity(){&lt;br /&gt;      return availableQuantity &amp;gt; oi.getOrderedQuantity();&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Though the end code seems similar, we did get rid of the &lt;a href="http://en.wikipedia.org/wiki/Data_Access_Object"&gt;DAO&lt;/a&gt; class.&lt;br /&gt;The @Bound annotation takes the value of &lt;span style="font-style: italic;"&gt;orderItem.productCode&lt;/span&gt; property and sets the parameter in the &lt;a href="http://java.sun.com/javaee/overview/faq/persistence.jsp"&gt;JPA&lt;/a&gt; named query. The &lt;a href="http://java.sun.com/javaee/overview/faq/persistence.jsp"&gt;JPA&lt;/a&gt; query returns an &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Integer.html"&gt;Integer&lt;/a&gt;, so we just set the value just prior to the calling of the method.&lt;br /&gt;&lt;br /&gt;In this way we can remove a lot of code that deals with data storage, when the essence of the logic is not data store.&lt;br /&gt;&lt;br /&gt;Meaning that if we change the &lt;span style="font-style: italic;"&gt;register()&lt;/span&gt; method code from &lt;a href="http://seamframework.org/"&gt;Seam&lt;/a&gt; sample, it might be not as obvious that the whole idea of the code is to check the data store. Though it would make the code shorter:&lt;br /&gt;&lt;pre class="brush: java"&gt;   @Autowired&lt;br /&gt;   @Bound(name="JPAEntity_named_query",bind="user.username")&lt;br /&gt;   private List existing;&lt;br /&gt;&lt;br /&gt;   public String register() {&lt;br /&gt;      if (existing.size()==0) {&lt;br /&gt;         em.persist(user);&lt;br /&gt;         log.info("Registered new user #{user.username}");&lt;br /&gt;         return "/registered.xhtml";&lt;br /&gt;      } else {&lt;br /&gt;         FacesMessages.instance().add("User #{user.username} already exists");&lt;br /&gt;         return null;&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;But the logic is the &lt;a href="http://beta.blogger.com/post-create.g?blogID=956064359108114628#targets"&gt;same&lt;/a&gt;.&lt;br /&gt;This could be done via &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;AOP&lt;/a&gt; in &lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt; and maybe in &lt;a href="http://code.google.com/p/google-guice/"&gt;Guice&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Referenced material:&lt;br /&gt;&lt;a href="http://www.springframework.org/"&gt;http://www.springframework.org/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/google-guice/"&gt;http://code.google.com/p/google-guice/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://seamframework.org/"&gt;http://seamframework.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-537036639640957793?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/537036639640957793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2008/12/dynamic-dependency-injection.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/537036639640957793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/537036639640957793'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2008/12/dynamic-dependency-injection.html' title='Dynamic Dependency Injection'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-1383806146728828950</id><published>2008-12-01T18:22:00.001+02:00</published><updated>2009-12-03T08:39:36.633+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project Management'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Analysis'/><title type='text'>Requirements Weight Matrix</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Histories&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The weight matrix came into being after a business analysis project at one medium sized company. During their business analysis we discovered that most of their unproductive time is spent on looking up the information on the products in stock.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The salesmen communicated with clients mostly by phone, after initial cooperation contract was signed. So informing the clients weather their order could be fulfilled the same day or in a month was not an easy task.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What I ended up with&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;So while doing simple feature mapping I ended up with the following matrix:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 100%;"&gt;This is only a sample&lt;/span&gt; &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;style&gt;   &lt;!--    BODY,DIV,TABLE,THEAD,TBODY,TFOOT,TR,TH,TD,P { font-family:"Arial"; font-size:x-small }    --&gt;  &lt;/style&gt;    &lt;br /&gt;&lt;table border="0" cellspacing="0" cols="5" frame="void" rules="none"&gt;&lt;colgroup&gt;&lt;col width="249"&gt;&lt;/col&gt;&lt;col width="90"&gt;&lt;/col&gt;&lt;col width="75"&gt;&lt;/col&gt;&lt;col width="80"&gt;&lt;/col&gt;&lt;col width="86"&gt;&lt;/col&gt;&lt;/colgroup&gt;  &lt;tbody&gt;&lt;tr&gt;    &lt;td align="center" height="17" width="249"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center" width="90"&gt;&lt;b&gt;Management&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center" width="75"&gt;&lt;b&gt;Sales&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center" width="80"&gt;&lt;b&gt;Accounting&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center" width="86"&gt;&lt;b&gt;Weight&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="right" height="17"&gt;&lt;b&gt;(Features/Group Modifiers)&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center" sdnum="1033;" sdval="1.5"&gt;&lt;i&gt;1.5&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center" sdnum="1033;" sdval="1"&gt;&lt;i&gt;1&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center" sdnum="1033;" sdval="0.9"&gt;&lt;i&gt;0.9&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;&lt;b&gt;Total&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;b&gt;Show items in warehouses&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;O&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;ET&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;R&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="3.575"&gt;3.58&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;b&gt;Send notification emails&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;ED&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;ED&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;ED&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="2.55"&gt;2.55&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;b&gt;Remove item reservation&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;R&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;O&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;RC&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="2.175"&gt;2.18&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;b&gt;Reserve items in warehouses&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;N&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;EC&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;R&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="1.95"&gt;1.95&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;b&gt;Pending shipment packages&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;O&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;N&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;O&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="1.8"&gt;1.8&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;b&gt;Order edit&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;N&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;E&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;N&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="1.5"&gt;1.5&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;b&gt;Order entry&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;N&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;EC&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;N&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="1.5"&gt;1.5&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;b&gt;Salesman report&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;R&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;N&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;RC&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="1.425"&gt;1.43&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;b&gt;Warehouse item movement report&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;N&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;N&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;EC&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="1.35"&gt;1.35&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;b&gt;Order cancel&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;N&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;EC&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;N&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="1"&gt;1&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;b&gt;Shipment package info&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;N&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;N&lt;br /&gt;&lt;/td&gt;    &lt;td align="center"&gt;R&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="0.45"&gt;0.45&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;b&gt;Modifiers&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;C - critical or core business(job role)&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="1.5"&gt;&lt;i&gt;1.5&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;T - client critical&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="2"&gt;&lt;i&gt;2&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;D - downtime possible.&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="0.75"&gt;&lt;i&gt;0.75&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;&lt;b&gt;Marks&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;E - everyday use&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="1"&gt;&lt;i&gt;1&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;O - occasional use(once per week)&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="0.75"&gt;&lt;i&gt;0.75&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;R - rare use(once per month and rarer)&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="0.5"&gt;&lt;i&gt;0.5&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td align="left" height="17"&gt;N - never used or unknown functionality&lt;br /&gt;&lt;/td&gt;    &lt;td align="right" sdnum="1033;" sdval="0"&gt;&lt;i&gt;0&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The matrix has to be filled out by each group separately. Anonymously and personally.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;To aggregate, you need to get the &lt;a href="http://en.wikipedia.org/wiki/Median"&gt;median point&lt;/a&gt; from each group, but it should not be too far from the &lt;a href="http://en.wikipedia.org/wiki/Mean"&gt;mean&lt;/a&gt;. (Substitute marks and modifiers with the actual values)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The weight matrix is constructed of the most basic functionality against user groups and marked with importance to each user group.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Each feature is a functionality that is expressed by up to 4 words(each noun acronym is one word) , so XYZ process start is a valid function descriptor.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;A functionality does not imply a UI button or action. Better, yet, UI functionality should be separated from actual functionality(reports are pure UI, no matter how much processing is done in the backend, except when reports are auto-generated)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Each user group marks each functionality with marks and modifiers.&lt;br /&gt;&lt;br /&gt;Marks:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;E - everyday use&lt;/li&gt;&lt;li&gt;O - occasional use(at least once per week or 2 times per month)&lt;/li&gt;&lt;li&gt;R - rare use(once per month)&lt;/li&gt;&lt;li&gt;N - never used or unknown functionality or not relevant to job role&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Modifiers:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;C - critical or core business&lt;br /&gt;will loose time/revenue as a result of failure, possibility of loosing clients&lt;br /&gt;&lt;/li&gt;&lt;li&gt;T - client critical&lt;br /&gt;will loose clients as a result of failure or equatable to loosing clients&lt;br /&gt;&lt;/li&gt;&lt;li&gt;D - downtime possible&lt;br /&gt;has little or no everyday impact on operations&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Each of these marks have their weight, each modifier is a multiplier and each users group has it's own multiplier.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;In the sample group multipliers Management - 1.25, Sales - 1 and Accounting - 0.9. And mark and modifier values are listed below.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;It is not impossible for all to have the same multiplier.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;There are basic rules to the values though:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Highest value is ET - Everyday - Client Critical&lt;/li&gt;&lt;li&gt;EC - Everyday Core Business is the second highest value and greater or equal to OT Occasional Client Critical&lt;br /&gt;EC &amp;gt; E and EC &amp;gt;= OT&lt;br /&gt;&lt;/li&gt;&lt;li&gt;OC - Occasional and Critical to business should have greater value than Everyday use&lt;br /&gt;OC &amp;gt; E and OC &amp;lt;&amp;gt;&lt;/li&gt;&lt;li&gt;E - Everyday should have the nominal value like 1 and should be greater of  equal to RT - Rare Client Critical&lt;br /&gt;E &amp;gt;= RT&lt;br /&gt;&lt;/li&gt;&lt;li&gt;... and so on, the common equation is(please feel free to modify it):&lt;br /&gt;N &amp;lt;&amp;gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;To have the most important functions, all the responses are converted to numbers, all the multipliers are applied and each functionality's values are summed up.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The result is that you have real representation of the value of the functionalities across whole business and with points of interest of each group of users/stake holders/beneficiaries.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The end result&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;From the business side the example demonstrates that in fact for that company to see the warehouse stock in real time was the most important feature and indeed that was the fact.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;As you can see that the order related activities are not at the top, this is because the company being analyzed was a wholesale company, where the amount of orders was easily manageable and had a distinct paper trail.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;This matrix made it simple in prioritizing features to be implemented, witch lead to a well accepted project delivery. And the project did not get tangled up in the management's view of how things were actually working.*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;It was a win-win situation, because the sales people got their information in real time and the management got a good view from above. All in all, increased productivity never hurt anyone.&lt;br /&gt;&lt;br /&gt;This maybe new or not so new idea, so I will not rush to claim that I invented it.&lt;br /&gt;&lt;br /&gt;* - Note, none of the team were stupid, and there are a lot of acceptable controls over the business for the management. And the system ended up quite flexible and usable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-1383806146728828950?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/1383806146728828950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2008/11/requirements-weight-matrix.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/1383806146728828950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/1383806146728828950'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2008/11/requirements-weight-matrix.html' title='Requirements Weight Matrix'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-6819732464577002643</id><published>2008-11-02T16:19:00.005+02:00</published><updated>2009-12-03T08:34:53.508+02:00</updated><title type='text'>NetBeans 6.5 vs Eclipse 3.4 Ganymede on Java Coding</title><content type='html'>&lt;a href="http://www.netbeans.info/"&gt;Netbeans&lt;/a&gt; IDE and &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; IDE&lt;br /&gt;I like and use both of these IDE's for different reasons. Netbeans is perfect for non Java development and mixed language development. Eclipse is the best option for Java coding. Why? Here is my reasoning.&lt;br /&gt;&lt;br /&gt;Netbeans:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Great technology integration&lt;br /&gt;the level of integration of assisting technologies as well as frameworks is much better than Eclipse.&lt;/li&gt;&lt;li&gt;Added ability to support a lot of other technologies&lt;br /&gt;Ruby with Ruby on Rails, PHP, JavaScript and Groovy are supported and integrated&lt;/li&gt;&lt;li&gt;Out of the box usable&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Eclipse:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Huge community&lt;br /&gt;gives access to various plugins, though their quality depends on the developer&lt;/li&gt;&lt;li&gt;Incredible flexibility&lt;br /&gt;Basically everything may be tweaked and configured&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Now why is Netbeans falling behind on Java coding? (IMHO)&lt;br /&gt;Some will say that incremental compilation is the point of weakness, but I really see it a lesser issue in productivity.&lt;br /&gt;The code assist is the main problem. And some defaults are enforced.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Code complete: Netbeans has been improved incredibly. Eclipse has groups of code completion. Each code completion group has it's own popup. Each popup is opened(switched to) by pressing Crtl+Space repeatedly.&lt;/li&gt;&lt;li&gt;Code complete: Eclipse has not only classes and code generation elements in the code completion popup, but the code templates. Such as typing main and pressing Ctrl+Space in Eclipse will give you an option to create a main method. Netbeans way is write psvm and hit code expansion button(CEB, mine is TAB).&lt;/li&gt;&lt;li&gt;Code complete: Intrusive template expansion in Netbeans. Just write in pst and hit CEB in Netbeans and, even though you just wanted a variable name for your PreparedStatement, you will get "printStackTrace();" in place of your "pst". And nothing warns you into what the template will be expanded...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Code expansion button = CEB, is a horrible thing if it's mapped to SPACE!&lt;/li&gt;&lt;li&gt;Custom Run configurations are a good idea in Eclipse. Though I still like the button to run the Application in Netbeans.&lt;/li&gt;&lt;li&gt;Netbeans enforces some defaults. The one that I hate the most is that everything in "Test Packages" has to be a jUnit test. Why? Tests may be simple classes with main methods! But you don't have an option to run it using something else other than jUnit.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Basically those are few simple reasons why I don't use Netbeans for Java coding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-6819732464577002643?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/6819732464577002643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2008/11/netbeans-65-vs-eclipse-34-ganymede-on.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/6819732464577002643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/6819732464577002643'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2008/11/netbeans-65-vs-eclipse-34-ganymede-on.html' title='NetBeans 6.5 vs Eclipse 3.4 Ganymede on Java Coding'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-6636512838508755099</id><published>2008-04-16T04:48:00.005+03:00</published><updated>2011-01-29T13:07:09.945+02:00</updated><title type='text'>Java ClassLoading</title><content type='html'>The essential part of the java world, but why is it so rigid and cumbersome?&lt;br /&gt;Every time we start Java the class loader is the essential part that drives the startup process.&lt;br /&gt;Every single piece of code that you have ever written for java is handled by some ClassLoader.&lt;br /&gt;Because it's not that easy. When a developer can develop an application that effectively uses ClassLoaders, I consider that person to have advanced level of knowledge of Java.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ClassLoader is essential in defining a Class. Basically a class lives attached to a class loader. That is both a good and a bad thing.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The main positive thing is that we can have multiple versions of the same class without conflicts&lt;/li&gt;&lt;li&gt;The main negative thing(in current state) is that we need to remove the whole ClassLoader(with it's children) to reload our changes.&lt;/li&gt;&lt;/ul&gt;The basic fact is that these 2 points are not mutually exclusive.&lt;br /&gt;But this way is mature. It's been with us for a very long time. We are actually used to it in it's current state.&lt;br /&gt;&lt;br /&gt;That is where tools like &lt;a href="http://www.zeroturnaround.com/javarebel/" mce_href="http://www.zeroturnaround.com/javarebel/"&gt;ZeroTurnaround's JavaRebel&lt;/a&gt; comes in our view. The idea is nice, it's executed well, and it definitely shows that there is a need for it.&lt;br /&gt;They use the new Instrumentation API.&lt;br /&gt;Instrumentation API is great, but it does have a little problem: &lt;a href="http://download.java.net/jdk7/docs/api/java/lang/instrument/Instrumentation.html#redefineClasses%28java.lang.instrument.ClassDefinition...%29" mce_href="http://download.java.net/jdk7/docs/api/java/lang/instrument/Instrumentation.html#redefineClasses(java.lang.instrument.ClassDefinition...)" target="_blank"&gt;no schema changes are allowed&lt;/a&gt;.&lt;br /&gt;That means that most of your changes will need the old process.&lt;br /&gt;&lt;br /&gt;Is it time we had a new method in ClassLoader that would unload a class(ClassLoader.undefineClass)? Or reload it, at least?&lt;br /&gt;I mean, the dynamic languages had that forever. PHP is a language that has a lot of inexperienced developers, and they still rarely manage to shoot themselves with that "feature". Does everyone consider everyone in java land an idiot that has to be constricted in every possible way?&lt;br /&gt;&lt;br /&gt;Java(and Java EE) deployment lifecycle is criticized a lot. It's long. Very long. And the compile time is not the main factor here, it's the deployment itself. With the current need to trash the whole ClassLoader hierarchy we are definitely taking too much time and memory consumption(resource usage) does suffer.&lt;br /&gt;Every single (re-)deploy goes through the same procedure on the lowest level:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Application specific operations&lt;/li&gt;&lt;li&gt;Remove any references to the ClassLoader(s) of the application&lt;/li&gt;&lt;li&gt;Create a new ClassLoader&lt;/li&gt;&lt;li&gt;Link the ClassLoader to the deployed code&lt;/li&gt;&lt;li&gt;Application specific operations&lt;/li&gt;&lt;/ul&gt;And this is an example where I just added a new logging method and a few statements to a class! As you look at it you might think what a sad state we are in!&lt;br /&gt;And if you have a thread there, guess you will have to restart the JVM to get rid of the old code from the memory.&lt;br /&gt;&lt;br /&gt;Now, I am NOT an expert in JVM internals, but how hard is it to change the piece of data in memory? Java classes are just data in the memory, like everything else.&lt;br /&gt;&lt;br /&gt;So what do you think? Is it time we have an ability to change the bytecode more dynamically?&lt;br /&gt;To have the classes reloaded through ClassLoader? Or, at least, the Instrumentation API would have the restriction on schema changes removed?&lt;br /&gt;What are your opinions?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-6636512838508755099?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/6636512838508755099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2008/04/java-classloading.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/6636512838508755099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/6636512838508755099'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2008/04/java-classloading.html' title='Java ClassLoading'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-4527537155672346347</id><published>2008-04-09T06:33:00.010+03:00</published><updated>2009-12-03T08:35:05.889+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><category scheme='http://www.blogger.com/atom/ns#' term='Morals'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding Future'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Do you have a backout profession?</title><content type='html'>We are living in a world where needs for professionals often rise and fall.&lt;br /&gt;Since the US is in a rough patch right now, we are seeing a decline of developer positions. Some are due to outsourcing to India. Others just because there is less Financing and projects are stopped.&lt;br /&gt;Europe is much the same, just the condition is generally a bit better. But hey, US is a major trading partner for us. And since I see little of American made goods on the shelves(and a lot of EU goods on American shelves), I expect that EU is mainly exporting to US a ton of products.&lt;br /&gt;So we in EU WILL be starting to feel the problems over the Atlantic some time in the near future.&lt;br /&gt;&lt;br /&gt;Software developer is a really volatile profession.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We rarely need to be at the client's side.&lt;/li&gt;&lt;li&gt;We may be successfully outsourced to another continent,&lt;br /&gt;maybe the moon would be a possible destination if there would be enough population :)&lt;/li&gt;&lt;li&gt;Most developers are closed off people, at least during the crunch hours. That leads to indifference of the management towards employees they don't "see".&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I mean if the cleaning person would be sick for a week you would notice it. Even the office administrator, office manager are more visible professions than a software developer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;So basically professions which services can be acquired via telecommunication technologies are really volatile by now.&lt;/span&gt; And those professions are usually the ones that are not really "visible".&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;So when you are planning your future DO you have a backout profession?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;I do. I was thinking of it for quite some time. For some reason it was obvois you cannot rely on a single profession where you are dependant on single technology. Specially where it, in theory, may be able to automate itself in the future.(AI making AI, Robots making Robots)&lt;br /&gt;My filosophy had always been: &lt;span style="font-weight: bold;"&gt;Do not put all eggs in a single basket.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My profession of nessecity* is &lt;span style="font-weight: bold;"&gt;a cook&lt;/span&gt;. A backout profession as I think of it.&lt;br /&gt;(Don't get me wrong, I LOVE cooking)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Why? &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Simple.&lt;/span&gt;&lt;br /&gt;There are some really basic professions, that cannot be outsourced:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a cook&lt;/li&gt;&lt;li&gt;a healer&lt;/li&gt;&lt;li&gt;a barber&lt;/li&gt;&lt;li&gt;etc...&lt;/li&gt;&lt;/ul&gt;The simple stuff will always be here.&lt;br /&gt;These professions are the ones that satisfy our basic life needs. So I would never expect them tho disappear any time in the future, unless the huamn species are wiped out or the earth blows up.&lt;br /&gt;&lt;br /&gt;And in the end I will still do coding and development for fun. No matter where I end up.&lt;br /&gt;It's not about the money or stability, it's about doing what I enjoy.&lt;br /&gt;And by a coincidence my second thing that I enjoy is one of the most basic professions of all - cooking.&lt;br /&gt;&lt;br /&gt;(I do filosphy when I'm sleepy... Can't help myself...)&lt;br /&gt;&lt;br /&gt;* - both sides in this word: others need for; my need for.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-4527537155672346347?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/4527537155672346347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2008/04/do-you-have-backout-profession.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/4527537155672346347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/4527537155672346347'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2008/04/do-you-have-backout-profession.html' title='Do you have a backout profession?'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-1472565865490650952</id><published>2007-09-06T15:09:00.001+03:00</published><updated>2009-12-03T08:39:59.326+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Perspecitves by expereince</title><content type='html'>With all our experiences we tend to have a biased view. That is how smart people operate. To get to wise level we need to understand that time changes everything.&lt;br /&gt;&lt;br /&gt;Same goes for programming...&lt;br /&gt;When you first need to evaluate frameworks, methods and other stuff. You must not jump to conclusions due to last bad experience. I was burnt a lot of times due to selecting the framework that was "cool" last time I used it, and was nowhere as good for a new project. Now I can say that I will not throw out a method or framework just because it's was not as good as I expected last project.&lt;br /&gt;At one time I was angry with RoR for not supporting PostgreSQL, that led to dumping it on next project as a candidate, at the end we dumped all our work and rewrote it in RoR and still made the deadline, just because I "saw the light" and tried it once more. And unfortunately I did the same mistake on next project, but it was the other way around.... RoR was selected just because it was fast... We got in a lot of trouble(mostly due to ACID-icity) and had to switch to Java EE and .NET combo...(I will not give any technical specifics of both projects)&lt;br /&gt;After those 2 project I now have a mind that is more open to possibilities, thus giving me the edge over people that see only one solution to any problem...&lt;br /&gt;&lt;br /&gt;So the moral is biblical: Don't judge and you will not be judged....&lt;br /&gt;&lt;br /&gt;When approaching any problem you have to let the "old bad" stuff be on the same plank as new and cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-1472565865490650952?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/1472565865490650952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2007/09/perspecitves-by-expereince.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/1472565865490650952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/1472565865490650952'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2007/09/perspecitves-by-expereince.html' title='Perspecitves by expereince'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-9143617993220158461</id><published>2007-08-17T15:03:00.001+03:00</published><updated>2009-12-03T08:40:06.908+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><title type='text'>Testing paralell code(the way YOU want)</title><content type='html'>In my quest for coding nirvana I came across the need to test parallel code correctly.&lt;br /&gt;&lt;br /&gt;Current testing toolkits are rather scarce on this front. There is no thread management included with them.&lt;br /&gt;Once I needed that all code would be tested under 2 conditions: threaded and serial.&lt;br /&gt;I had to create a new revision with a lot of code changes. The way I wanted it to be would be through an implicit thread manager, that can be told to force the code to be serial.&lt;br /&gt;&lt;br /&gt;So far I thought up a simple technique of enhancing Thread class by adding callbacks to constructors and start method. This technique actually works. All you need is to define a transformer by the means of Java 6.0 instrumentation functionality. And using ASM from Objectweb  you can add hooks to Thread object, otherwise it is not allowed to redefine java.lang.* classes.&lt;br /&gt;&lt;br /&gt;And I expect that someone will sometime find a way of adding more manageability to Threads during testing.&lt;br /&gt;Therefore we could catch thread related bugs like race conditions etc...&lt;br /&gt;Unfortunately wait method on Object is native, so it would be hard to control waiting aspect of testing...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-9143617993220158461?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/9143617993220158461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2007/08/testing-paralell-codethe-way-you-want.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/9143617993220158461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/9143617993220158461'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2007/08/testing-paralell-codethe-way-you-want.html' title='Testing paralell code(the way YOU want)'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-1167437956550067742</id><published>2007-07-20T12:31:00.001+03:00</published><updated>2009-12-03T08:40:19.973+02:00</updated><title type='text'>The price and value of software</title><content type='html'>I am a person that likes to compare alternatives.&lt;br /&gt;Software space is not excluded from the comparison space.&lt;br /&gt;&lt;br /&gt;I have some strict moral rules on illegaly using software. If you're using some software that generates revenue or lowers costs, you MUST pay for it. I agree that MS Office is a good product and I can pay 800 euros(with Windows) to use it when needed, but enabling software like Windows, brining NO value by itself, gives me 0 reasons to buy it. Windows wins out ONLY on games, nothing else would keep me with Windows.&lt;br /&gt;&lt;br /&gt;Entertainment software(games and such) are different species, but I follow the same rules.&lt;br /&gt;There I can say that if I buy that particular title will it keep men entertained for the same time as I would have spent the same money on an alternative? Say cinema? New titles go up to 60 euros and more. FPS are the biggest problems, I can complete HL2 in 6 hours non interruptible time. Now once you played, it's no longer that interesting and with a single ticket to a cinema costing &amp;lt; 5 euros with movies 1.5 to 2 hours I think spending the same time sitting in a cinema costs LESS while providing almost the same entertainment(personal view).&lt;br /&gt;&lt;br /&gt;So basically I would argue that like some prices are calculated based on how much you would spend on alternatives minus some small percentage, software prices should do the same.&lt;br /&gt;Software for business purposes should be priced not higher that the possible time savings. Custom software is another issue.&lt;br /&gt;Entertainment software prices should definitely be recalculated to honor the possible alternatives. Therefore im my country MOST of games are illegal copies. I personally play only WoW, the only game that I can say brings more entertainment than alternatives.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-1167437956550067742?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/1167437956550067742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2007/07/price-and-value-of-software.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/1167437956550067742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/1167437956550067742'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2007/07/price-and-value-of-software.html' title='The price and value of software'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-973239341396541251</id><published>2007-04-17T05:40:00.000+03:00</published><updated>2007-08-21T20:08:15.299+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding Future'/><title type='text'>Application developement process NIRVANA</title><content type='html'>What would you like coding to evolve to? I did a little thought on that and came up with some simple ideas.&lt;br /&gt;&lt;br /&gt;Going in the footsteps of Spring framework, we want LESS plumbing code.  Java, XML or other.*&lt;br /&gt;&lt;br /&gt;I asked myself what I wanted to ease my "typing pain"?&lt;br /&gt;For each piece of code that covers some logic, I want to say(ok, ok type in) I need this to operate. And I mean not like Spring does it, I mean like "I need the third letter from 17th page of a book that the client has selected to do my job". I don't want verbose XML's or Java helper classes for that. And I want it to be generic as much as possible, sure some things will still have to be coded and I do not mind doing it for too long.&lt;br /&gt;&lt;br /&gt;Defining process elements should be a simple operation. I like that it's already simple @ the top, but down here I am still in hell. Simple flows should be SIMPLE! (Map a to b and save to data store - should take no longer than 1 hour) Calling save method on data store should be something for optimization or out of the ordinary... Creation may be a different story...&lt;br /&gt;&lt;br /&gt;Otherwise Spring has it handled good, since auto-wiring components is a thing that I need to still be lazy...&lt;br /&gt;&lt;br /&gt;At the end I thought "Damn I'm LAZY".&lt;br /&gt;&lt;br /&gt;But then I thought of threads! Why J2EE containers "restrict" us using them? Why JMS became the solution to do parallel processing?&lt;br /&gt;Could we make so, that we declare that this logic is run in parallel and has a barrier? And I mean that that thread would be practically invisible, have the same auth token and maybe even run in the same global TX?&lt;br /&gt;&lt;br /&gt;The next thing is about saving state. I want be able to save state in such a way that the stack and execution points are saved. Therefore when restoring state the code could run from a certain point onwards, having the same local var's as if it had just come out of a long wait call. And I will not go to the extreme here, and be thankful for a partial implementation for this functionality... Some language constructs with some "save state here, and restore from here"...&lt;br /&gt;But this should directly linked with transactional memory. Ans since I am not for global transactional memory, I would just love transactional blocks.&lt;br /&gt;&lt;br /&gt;* - I am a person that sees extremes as answers. Fortunately I am smart enough to restrain those "feelings", but I'll be the most extreme here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-973239341396541251?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/973239341396541251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2007/04/application-developement-process.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/973239341396541251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/973239341396541251'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2007/04/application-developement-process.html' title='Application developement process NIRVANA'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-1302060843707948739</id><published>2007-02-03T00:02:00.001+02:00</published><updated>2009-12-03T08:35:16.916+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>IBM releases Java SDK 6 Early access, finally</title><content type='html'>Glad to hear that IBM has got a bit more progressive on their software front.&lt;br /&gt;&lt;br /&gt;Maybe we will get a certified for Java EE 5 WebSphere application server?&lt;br /&gt;&lt;br /&gt;Surely many great products have emerged from IBM, but somehow for last few years IBM has been a bit slow in adopting technologies. Good to see the wind changing. Hopefully they still will be able to keep the quality of products and quality standards HIGH on "stable" releases.&lt;br /&gt;Well in my personal opinion DB2 ROCKS! and if WAS would be just half of what DB2 is than LOOKOUT Oracle and Bea!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-1302060843707948739?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/1302060843707948739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2007/02/ibm-releases-java-sdk-6-early-access.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/1302060843707948739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/1302060843707948739'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2007/02/ibm-releases-java-sdk-6-early-access.html' title='IBM releases Java SDK 6 Early access, finally'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-223546920699715593</id><published>2006-11-11T02:58:00.001+02:00</published><updated>2009-12-03T08:36:43.566+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>SOA and RL(Real Life)</title><content type='html'>WS-* is probably the most popular SOA base.&lt;br /&gt;But if you want real improvements on the base level focus on decoupled components!&lt;br /&gt;Decoupled is the thing that will keep your code clean and easy.&lt;br /&gt;&lt;br /&gt;Of course this is not real life where SOA = WS. SOAP(Simple Object Access Protocol) please remove S out of SOAP or at least change it to something like OAP(Object Access Protocol). Have you tried to understand all the specs for WS? XML is easy and readable, XML Schemas introduce complexity(but NP), but WS has so many elements that I get lost in them. WS is slow, WS is complex, WS is not easy.&lt;br /&gt;&lt;br /&gt;Writing decoupled components implies such techniques as coding against interfaces, breaking down components into logically separate modules(not just refactoring classes) and other decoupling methods.&lt;br /&gt;When you look at 3 tier architectures, MVC and IoC(Dependency injection) you will see that they are decoupled into logical(not everywhere) parts.&lt;br /&gt;When not to go berserk and decouple everything from everything example: Accounting logic should not be decoupled from Tax application logic(most of the times), file storage logic is logically with file attribute logic.&lt;br /&gt;What you see that is not core part(and in "core" I mean that logic that is bound to the process that invokes it)  is usually should be moved out of the code and expose it as a "service"(no reference to SOA or WS).&lt;br /&gt;&lt;br /&gt;The best thing that works for me is just imagining thing in reality.&lt;br /&gt;How would you use accounting services?&lt;br /&gt;&lt;ol&gt;&lt;li&gt; You would go to an accountant and request to calculate your taxes. You do not care what the accountant does as long as you get the correct result.&lt;/li&gt;&lt;li&gt; When you have cash and want to deposit it you go to the bank, wait in line and give your money, id and deposit form and you wait for response that your transaction is complete(In this scenario money = data, bank teller = DA component, safe = data store).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Your secretary is writing a letter after you.(your words = data, secretary = DA component, pen and paper = data store, and you may even get corruption)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;In 1 - you don't have to learn all the tax laws = easier life, 2 - you don't have to store money at home = less chances to be robbed, 3 - you don't need to write and check spelling(I was not the best speller in school maybe you were?)&lt;br /&gt;&lt;span style="font-size: 130%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JUST TO NOTE: COMMUNITY EVOLVED STANDARDS ARE GENERALLY BETTER THAN A STANDARD CREATED BY A STANDARD BODY!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;DA - data access&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-223546920699715593?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/223546920699715593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2006/11/soa-and-rlreal-life.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/223546920699715593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/223546920699715593'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2006/11/soa-and-rlreal-life.html' title='SOA and RL(Real Life)'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-3011988908682813435</id><published>2006-11-01T11:26:00.001+02:00</published><updated>2009-12-03T08:36:34.844+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><title type='text'>Hide the developers! The "business" is coming</title><content type='html'>What a the developer on the ground needs the most is simplicity. Any developer should be like a technical guy. The architect/project lead comes and says do that and that and do not worry about anything else. That is why there are PMs and architects - they are the "buffer" between all the crazy requests end client makes, even on the latter stages of the project. I recently was in a project that wanted to introduce new requirements and concept change 2 weeks after the development phase had ended and all functionality was finalized.&lt;br /&gt;&lt;br /&gt;If you are a developer that is talking to "the client" your productivity as a developer falls tremendously. Be careful what you promise and NEVER EVER say "yes".&lt;br /&gt;If you ever tried to look at how the specification is being created you'll see that for every requirement PMs battle with "the client". I wouldn't call it a requirement session but rather requirement battlefield.&lt;br /&gt;&lt;br /&gt;Be careful though as a developer you have to protect yourself against bad PMs and architects. Never let PM or architect say "this is easy" when you know that this is not easy with the technology that was selected. When youre alone from you team in a meeting with "the client" always say "we will have to check it and we'll get back to you on it" because even "ok" will seem to the client that you are ready to accept his terms where you may be not.&lt;br /&gt;&lt;br /&gt;So remember if you're a developer concentrate on the technical side and leave "the client" to PM.&lt;br /&gt;&lt;br /&gt;"business" - is usually the end client of the project.&lt;br /&gt;&lt;br /&gt;(Most of this stuff is my personal mental note)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-3011988908682813435?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/3011988908682813435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2006/11/hide-developers-business-is-coming.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3011988908682813435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3011988908682813435'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2006/11/hide-developers-business-is-coming.html' title='Hide the developers! The &quot;business&quot; is coming'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-4375448732389468344</id><published>2006-10-30T13:26:00.001+02:00</published><updated>2009-12-03T08:36:26.509+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><title type='text'>Testing everything</title><content type='html'>I always need to test.&lt;br /&gt;Never do trust that anything will work. I always get this urge to test. I have absolutely no faith in theory. Practice makes perfect ... not theory.&lt;br /&gt;&lt;br /&gt;Developing applications without the ability to test if the code is working is too much for me, it's like painting blindfolded having both your hands in casts.&lt;br /&gt;Note to the tech staff and IT security staff: If you do not give developers full access to every resource that will be used(not actually the real thing but at least an accessible copy) than you will 100% get security breach because the code could not be tested under real conditions.&lt;br /&gt;&lt;br /&gt;The testing is a very head on process that allows the developer to test most of the code for most visible bugs. If we cannot test that means we are back in the pre-PC era. Look at what we develop and do not forget that testing is one of the most important things in the current development methods. I for one write code fast and not always do it right, because it would take me an awful lot of time to write clean and bug free code without testing like in assembler or machine code for microcontrollers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-4375448732389468344?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/4375448732389468344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2006/10/testing-everything.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/4375448732389468344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/4375448732389468344'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2006/10/testing-everything.html' title='Testing everything'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-7158457328331543095</id><published>2006-10-20T20:19:00.001+03:00</published><updated>2009-12-03T08:35:27.463+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='IDEs'/><title type='text'>"There and back again" - NetBeans to Eclipse</title><content type='html'>As background to this post. I have been working with NetBeans since it was Forte for Java CE. So I am pretty much used to NetBeans.&lt;br /&gt;&lt;br /&gt;Eclipse 3.1 was not compelling enough to switch from NetBeans. NetBeans 5.0 was a huge step, and Eclipse 3.1 was not the best thing to make the change. Eclipse 3.2 has one of the most tempting features fot the switch - Java Editor - witch is superbe. Code completion blows away any other editor(comapring IDEA, Eclipse and NetBeans).&lt;br /&gt;Eclipse team is very proud of their incremental compiler - I personally see no pluses in it, since if the code is bloken incremental or non incremental compiler - both will not help in that case. Auto compile is not a bad thing,though.&lt;br /&gt;&lt;br /&gt;In my experience everything other than Eclipse RCP and JDT is not as good as its presented. For example WST is just horrible. JSP editing is nowhere close to NetBeans one.&lt;br /&gt;&lt;br /&gt;So the only logical thing is to mix NetBeans and Eclipse for web development(or use some of the commercial tools, but JSP formatting is still horrible and unreadable).&lt;br /&gt;&lt;br /&gt;If anyone is wondering how to mix NetBeans and Eclipse here is how:&lt;br /&gt;1. Create Eclipse workspace, and the project that you need&lt;br /&gt;2. Create NetBeans project, and note NetBeans directory structure.&lt;br /&gt;3. Ajust your Eclipse directory structure to match NetBeans one.&lt;br /&gt;4. NetBeans keeps compiled files in a different directory(build), so in Eclipse set the output directory to build&lt;br /&gt;And basically youre done.&lt;br /&gt;&lt;br /&gt;NetBeans uses 100% Ant builds so you get pacakaged WAR EAR or JAR files, with no additional actions.&lt;br /&gt;NetBeans is gaining on Eclipse quite fast, so I am very excited. The 2 OSS IDEs that complement each other pretty good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-7158457328331543095?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/7158457328331543095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2006/10/there-and-back-again-netbeans-to.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/7158457328331543095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/7158457328331543095'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2006/10/there-and-back-again-netbeans-to.html' title='&quot;There and back again&quot; - NetBeans to Eclipse'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-5741558824921759887</id><published>2006-10-13T00:57:00.001+03:00</published><updated>2009-12-03T08:35:36.321+02:00</updated><title type='text'>JSTL and JSF</title><content type='html'>I do not get it. Sun has brought these two technologies how come are they not compatible, or even interchangeable?&lt;br /&gt;There is nothing of JSTL in JSF and vice versa.&lt;br /&gt;There is NO WAY to mix them in cooperative way. That is there is no way c:forEach may have h:commandLink’s or forms effectively.&lt;br /&gt;&lt;br /&gt;There is a good thing that JSF is quite good on the component side, allthough there is some confusion with "rendered" for new developers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-5741558824921759887?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/5741558824921759887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2006/10/jstl-and-jsf.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/5741558824921759887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/5741558824921759887'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2006/10/jstl-and-jsf.html' title='JSTL and JSF'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-3861224926804041865</id><published>2006-10-09T14:26:00.001+03:00</published><updated>2009-12-03T08:35:44.644+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DB'/><title type='text'>PostgreSQL, FirebirdSQL and MySQL(subjective view)</title><content type='html'>(Disclaimer: I am a PostgreSQL fan, this is my subjective personal experience)&lt;br /&gt;Had a interesting experience with 3 of these DBMS'es.&lt;br /&gt;Needed to write an application that opperates on 7000000 row table.&lt;br /&gt;Need was:&lt;br /&gt;- querry the table&lt;br /&gt;- calculate some data, based on the row data&lt;br /&gt;- update that row&lt;br /&gt;&lt;br /&gt;Platform Java 1.5. Latest versions, latest drivers. Containers transactional(1 MySQL run on MyISAM).&lt;br /&gt;Methods:&lt;br /&gt;a) Updateable resultSets&lt;br /&gt;b) execution of update statements same trx&lt;br /&gt;c) execution of update statements another trx&lt;br /&gt;&lt;br /&gt;Funny observations:&lt;br /&gt;In method a MySQL had no speed difference between InnoDB and MyISAM.&lt;br /&gt;Method a on PostgreSQL was slower than method b&lt;br /&gt;Firebird does  not support updatable resultSets.&lt;br /&gt;MySQL and PostgreSQL were on par in method b.&lt;br /&gt;MySQL  was 15% faster than PostgreSQL in method a.&lt;br /&gt;Firebird was 25-50% slower, even on beter conditions(memory and priority).&lt;br /&gt;Allthough Firebird required 50% less disk space.&lt;br /&gt;Some versions of MySQL with MyISAM did:  drop the changes, partial update on 1 row. InnoDB had no such problem.&lt;br /&gt;&lt;br /&gt;There will be no conclusion to this post. All DBMS'es are evolving. I just hope that they do not stop.&lt;br /&gt;&lt;br /&gt;-----&lt;br /&gt;&lt;br /&gt;Based on a cooment I should add that most of the time taken up was waiting for update and select queries.&lt;br /&gt;Data store should be a data store not an application.&lt;br /&gt;Do not keep logic(except referential integirty and query simplification) on the DBMS side.&lt;br /&gt;&lt;br /&gt;And in my example this was a telco billing application, so it was impossible to put all logic into the DB.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-3861224926804041865?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/3861224926804041865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2006/10/postgresql-firebirdsql-and.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3861224926804041865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/3861224926804041865'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2006/10/postgresql-firebirdsql-and.html' title='PostgreSQL, FirebirdSQL and MySQL(subjective view)'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-8241579648287969688</id><published>2006-10-09T10:31:00.001+03:00</published><updated>2009-12-03T08:35:53.791+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><title type='text'>JSF Naming</title><content type='html'>I have been working with JSF for several months and would like to know what are the best/most used naming strategies for JSF backing beans.&lt;br /&gt;&lt;br /&gt;Personal opinion:&lt;br /&gt;Adding Bean at the end seams not reflecting the function of the component. (Do you agree?)&lt;br /&gt;&lt;br /&gt;What do you think is the best naming?&lt;br /&gt;Is it based on the part of the view? (SearchHeader, MenuForm, UserLoginBox)&lt;br /&gt;View itself? (SearchView, EditView)&lt;br /&gt;Activity? (Recorder, Editor, Viewer)&lt;br /&gt;Any other naming conversion?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-8241579648287969688?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/8241579648287969688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2006/10/jsf-naming.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/8241579648287969688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/8241579648287969688'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2006/10/jsf-naming.html' title='JSF Naming'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-956064359108114628.post-2517730738877100576</id><published>2006-10-09T05:54:00.001+03:00</published><updated>2009-12-03T08:36:01.160+02:00</updated><title type='text'>Control over code</title><content type='html'>I do not know how you like, but I like to know what my code is doing.&lt;br /&gt;Memory and very low leve stuff may be ommited but when it comes to  ORM  its a different story. SQL is NOT low level.&lt;br /&gt;Sometimes I want to control what queries my ORM tool sends to my SQL server.&lt;br /&gt;But there we hit a snag. Its either all or nothing. Hibernate or iBatis are completely different, one you  have the freedom of not writting  all queries  yourself other is having full control over the queries.&lt;br /&gt;&lt;br /&gt;Map anything to nothing (iBatis approach)&lt;br /&gt;&lt;br /&gt;iBatis offers the luxury of mapping object to essentialy nonexistent entity. Be it a function/procedure call or a complex view(excluding updatable views). But iBatis(SQLMaps to be exact) is like flying an airplane. If you cant ir will stay grounded, if you can it will fly. A lot of queries and no descent generator.&lt;br /&gt;&lt;br /&gt;Map something to something(Hibernate approach)&lt;br /&gt;&lt;br /&gt;Anything can be autogenerated! Simplicity at it's best. Problem is if you have a table or a view you can map it, otherwise no way. JPA is very similar to Hibernate, excluding annotations(but lets not forget that XDoclet existed for quite a long time).&lt;br /&gt;&lt;br /&gt;Problem is that there is a need for only a part of anything2nothing and a lot of something2something. That is why iBatis is not the best choise*.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So what was I searching for I what I did not find:&lt;br /&gt;- simplicity for stuff like "category table with ID and NAME fields"&lt;br /&gt;- control like use this query to get that data&lt;br /&gt;- function/procedure mapping&lt;br /&gt;- ability to specify whitch query should be used for what&lt;br /&gt;&lt;br /&gt;But fortunatelly we have JDBC 4.0 on our horisons. iBatis will probably cease to exist due to similarity in its functionality to JDBC 4.0 DataSet. But iBatis and Hibernate still have powerful query construction languages(dynamic query construction in iBatis and HQL in Hibernate) .&lt;br /&gt;So my problem still persists, since we cannot easily mix those 2 methods together.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* - to be exact iBatis can have Hibernate as its base instead of SQL maps, but different managers are required if you need to mix them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/956064359108114628-2517730738877100576?l=jalexoid.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jalexoid.blogspot.com/feeds/2517730738877100576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jalexoid.blogspot.com/2006/10/control-over-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/2517730738877100576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/956064359108114628/posts/default/2517730738877100576'/><link rel='alternate' type='text/html' href='http://jalexoid.blogspot.com/2006/10/control-over-code.html' title='Control over code'/><author><name>Alexander Panzhin</name><uri>https://profiles.google.com/104276185257819786059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-MriakKwohZM/AAAAAAAAAAI/AAAAAAAAASQ/PWxV5uEsIQs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
