<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Softaria</title>
	<atom:link href="http://softaria.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://softaria.com</link>
	<description>the software development company</description>
	<lastBuildDate>Thu, 19 Jan 2012 13:21:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Appcelerator Titanium evaluation</title>
		<link>http://softaria.com/2011/07/29/appcelerator-titanium-evaluation/</link>
		<comments>http://softaria.com/2011/07/29/appcelerator-titanium-evaluation/#comments</comments>
		<pubDate>Fri, 29 Jul 2011 11:00:10 +0000</pubDate>
		<dc:creator>roman</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Cross platform]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[PhoneGap]]></category>
		<category><![CDATA[Titanium]]></category>

		<guid isPermaLink="false">http://softaria.com/?p=370</guid>
		<description><![CDATA[Normally when we need cross-patform mobile solution, which work at both, iPhone/iPad and Android, we use PhoneGap based tecnology Recently I found its direct comeptitor, Titanium made some steps forward and now looks much better than it was an year &#8230; <a href="http://softaria.com/2011/07/29/appcelerator-titanium-evaluation/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Normally when we need cross-patform mobile solution, which work at both, iPhone/iPad and Android, we use <a title="Cross-platform mobile development" href="http://softaria.com/mobile-development/">PhoneGap based tecnology</a></p>
<p>Recently I found its direct comeptitor, <a href="http://www.appcelerator.com/" target="_blank">Titanium </a>made some steps forward and now looks much better than it was an year ago. So, we have installed its latest version for evaluation.</p>
<p>Here is the result:</p>
<h2>What can it do?</h2>
<ul>
<li>It allows developing in javascript.</li>
<li>It allows debugging with their eclipse-based IDE (debugging is only in paid version).</li>
<li>It works with android emulator and real devices on windows.</li>
<li>And with both iphone and android simulators and real devices on Mac.</li>
</ul>
<p>In order to deploy it compiles javascript to objective c and java (for iphone and for android).</p>
<p>For iphone the result is xCode project, ready to built with standard xCode.</p>
<p>It uses native widgets, providing unified API for both android and iphone.</p>
<p>Even if it uses javascript it does not use built-in browser, neither HTML or HTML5.</p>
<p>Javascript here is just a programming language (I guess they did not choose java because of licensing problems).</p>
<h2 id="What-is-good-about-it">What is good about it:</h2>
<ul>
<li>Ability to have one codebase for 2 platforms</li>
<li>Ability to develop on windows</li>
<li>Ability to debug on windows</li>
<li>Ability to have native, platform-dependent modules if required</li>
<li>It has rather big sample, which demonstartes usage of different API</li>
<li>As I have alredy noted, it results in native applications</li>
</ul>
<h2 id="What-is-not-so-good">What is not so good</h2>
<ul>
<li>Javascript <img src='http://softaria.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .  It is really tricky to start develop with it as with primary programming language without great experience</li>
<li>Poor code assist in IDE. In most cases it can&#8217;t suggest anything. So, developer needs to apply to documentation</li>
<li>Debugging is not a part of free edition. It costs 50 usd per month. (Though it worked for me for some reason, I guess it will be disabled in a month or so). <em>Note: they tell I can easy turn the subscription on and off when required. E.g. turn it on for month, then cancel, then turn on again etc.</em></li>
<li>Relatively long start (takes about 3 minutes to start on android simulator)</li>
</ul>
<h2 id="What-is-not-so-good">What is really bad</h2>
<p>When I realized they transfer javascript code to objective c code, I got one serious question: I can&#8217;t understand how they deal with manual memory allocation/deallocation with iOs, as in js you are free from this activity. I wondered if their automatic garbage collector (they should have it, yes?) is good enough to not lead to memory leaks on ios.<br />
So, I started to google for it, and found some proof here: <a href="http://usingimho.wordpress.com/2011/06/14/why-you-should-stay-away-from-appcelerators-titanium/">http://usingimho.wordpress.com/2011/06/14/why-you-should-stay-away-from-appcelerators-titanium/</a></p>
<p>Here is the cut from this post:</p>
<p><em>Your app starts to crash, seemingly at random. The reason : memory starvation. You see, although Titanium is supposed to take care of memory management for you, it doesn’t always work correctly. Most of the times, especially if your application is simple and doesn’t use many images and animations, the memory leaks Titanium generates over time will be small enough that you won’t even realise that your application is actually leaking. Problem is, when your application reaches a certain level of complexity, those leaks will become evident – in the form of sudden, unavoidable crashes.</em></p>
<h2 id="Some-installations-know-how">Conclusions</h2>
<p>It seems Titanium is yet &#8220;raw&#8221; technology, which is not suitable to develop big, production quality applications. Probably they will fix their problem with memory management later, but for now we stay with PhoneGap, which it at least stable. BTW, I was suggested to look at <a href="http://www.adobe.com/products/air/" target="_blank">Adobe Air</a>. Probably I will add new post devoted to it sometimes.</p>
<h2 id="Some-installations-know-how"><em>Appendix : some installations know-how</em></h2>
<p><em>For those who still plan to play with it there are some installations know-how:</em></p>
<p><em>1) Check Compatibility Matrix and get sure you have exactly required versions of everything installed. Especially it relates to Android SDK platform.</em><br />
<em> Titanium Studio 1.7.2 requires Android Platform 2.1.update. And it will simply not recognize android SDK if you have e.g platform 2.2 or 2.0. Compatibility matrix can be found here: <a href="http://wiki.appcelerator.org/display/guides/Titanium+Compatibility+Matrix">http://wiki.appcelerator.org/display/guides/Titanium+Compatibility+Matrix</a></em></p>
<p><em>2) Get sure you have JDK bin directory in your PATH environment variable. Titanium Studio tries to call &#8220;javac&#8221; and crashes if it can&#8217;t be found</em></p>
<p><em>3) Do not forget to delete all the android virtual devices before first run of the Studio (it will create one itself, if there are some existing devices, it will take the first, and will most probably crash)</em></p>
<p><em>4) When you configure Android SDK pay attention to choose correct API version. It MUST START WITH &#8220;Google&#8221; word! e.g. &#8220;Google API 2.2&#8243; is correct, while just &#8220;2.2&#8243; or &#8220;API 2.2&#8243; is not correct, though it is here by default! If you choose incorrect API it will crash.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://softaria.com/2011/07/29/appcelerator-titanium-evaluation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EclipseLink versus Hibernate</title>
		<link>http://softaria.com/2011/07/26/eclipselink-versus-hibernate/</link>
		<comments>http://softaria.com/2011/07/26/eclipselink-versus-hibernate/#comments</comments>
		<pubDate>Tue, 26 Jul 2011 09:03:34 +0000</pubDate>
		<dc:creator>roman</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[EclipseLink]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://softaria.com/?p=351</guid>
		<description><![CDATA[In my previous post I have started describing technology stack we use for typical business system with web interface. As I promised, now I am going into more details and advocating each of our choices. This post is devoted to &#8230; <a href="http://softaria.com/2011/07/26/eclipselink-versus-hibernate/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In my <a title="Our technology stack for web applications" href="http://softaria.com/2011/07/25/our-technology-stack-for-web-applications/">previous post</a> I have started describing technology stack we use for typical business system with web interface. As I promised, now I am going into more details and advocating each of our choices. This post is devoted to <a href="http://www.eclipse.org/eclipselink/" target="_blank">EclipseLink </a>and why we think it is better than its closest competitor &#8211; <a href="http://www.hibernate.org/" target="_blank">Hiberante</a>.</p>
<p>For those who want to read why Hibernate is not a choice, I wrote a <a href="http://itroman.wordpress.com/2010/12/05/why-i-do-hate-hibernate/" target="_blank">separate article</a> in my personal blog.</p>
<p>Here I want to focus on what makes EclipseLink better than Hibername.</p>
<p>At first, both of them are java <a href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank">ORMs</a>. Both now support <a href="http://en.wikipedia.org/wiki/Java_Persistence_API" target="_blank">JPA </a>specification. Both are production ready. As Hibernate is older, it is even more popular currently.</p>
<p>I would like to define two criteria to compare these ORMs from the business point of view. Then I will go through some technical details to show why EclipseLink is simply better.</p>
<p>The business points are:</p>
<ul>
<li>Predictability</li>
<li>Fragility</li>
</ul>
<p><strong>Fragility</strong></p>
<p>Let start with more simple thing &#8211; fragility. Just some statistical information. If you open issue trackers of both these products and search for all open CRITICAL and BLOCKER bugs you will see following picture (as for July 26, 2011) :</p>
<p>&nbsp;</p>
<table>
<tbody>
<tr>
<td><strong>Name</strong></td>
<td><strong>Number of bugs</strong></td>
<td><strong>Number of blockers</strong></td>
<td><strong>The oldest blocker</strong></td>
</tr>
<tr>
<td>Hibernate</td>
<td>156</td>
<td>49</td>
<td>29/Sep/2006</td>
</tr>
<tr>
<td>EclipseLink</td>
<td>15</td>
<td>3</td>
<td>04/Jun/2010</td>
</tr>
</tbody>
</table>
<p>Well, I think it explains itself. However I can only add we have made this short comparison not because we were curious, but because we really had too many problems with Hibernate stability. And now we have approximately 10 times less.</p>
<p><strong>Predictability</strong></p>
<p>By predictability I mean an ability for developer to predict how the code he/she just have wrote will behave. Good library should have high level of predictability. However it is not the case with Hibernate.  Let me repeat my own post from the blog I already noticed:</p>
<p><em>Just a sample:</em></p>
<p><em>User user = loadUser(id);</em></p>
<p><em>It is a good old explicit statement which obviously loads user. How many SQL statements this call should execute? Normal answer is “one statement”. Something like</em></p>
<p><em>select * from users where id=?</em></p>
<p><em>But the true is in Hibernate it can be any number. Thousands or millions. And the most cool feature is this number may be easily (and often unintentionally)  changed in several different places of the code!</em></p>
<p><em>It is because of autoloading. When you designed User refers to a collection of Roles you most probably never thought that one of your colleagues will later add ref from Role to let say Permission. And another one (couple of weeks later) from Permission to something else.</em></p>
<p><em>As a result, your fast and pretty loadUser now executes 100 times slowly. And even when you accidentally find it you will have to analyze the whole model to understand what happened and then start with huge refactoring to make your code fast again without breaking codes of you colleagues (that relies on Permission collection now!)</em></p>
<p>Now let me explain why it does not happen to you with EclipseLink. Two facts:</p>
<p>1) This happen only to &#8220;eager&#8221; links. And does not happen to &#8220;lazy&#8221; links.</p>
<p>2) With EclipseLink you have no any reason to use eager links at all, while with Hibernate you have the reason for it</p>
<p><strong>Lazy links and Lazy Initialization Exception</strong></p>
<p>The reason is lazy links only works inside transactions in hibernate. It means if you load an object from database and close database connection such links will no longer work. If you try them, they will result in lazy initialization exception. So, standard strategy in hibernate is either to make a lot of links eager or to add a big set of methods like:</p>
<ul>
<li>loadUser()</li>
<li>loadUserWithRoles()</li>
<li>loadUserWithRolesAndPermissions()</li>
<li>etc</li>
</ul>
<p>With EclipseLink it is not the case. Lazy links will work even if you accidentally closed database connection. In such a case, EclipseLink will simply take a read-only connection from connection pool, execute loading and then put the connection back to pool. It will do it hiddenly, without bothering developer.</p>
<p>So, if developers simply make all the links lazy, it will work with EclipseLink and will solve the problem described above.</p>
<p><strong>Conclusions</strong></p>
<p>Even though EclipseLink does not solve all the problems, good <a href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank">ORM </a>should solve in our opinion, it is currently the best java based <a href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank">ORM</a>. And it is definitelly better that Hibernate.</p>
]]></content:encoded>
			<wfw:commentRss>http://softaria.com/2011/07/26/eclipselink-versus-hibernate/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Our technology stack for web applications</title>
		<link>http://softaria.com/2011/07/25/our-technology-stack-for-web-applications/</link>
		<comments>http://softaria.com/2011/07/25/our-technology-stack-for-web-applications/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 12:28:11 +0000</pubDate>
		<dc:creator>roman</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[technology stack]]></category>
		<category><![CDATA[web application]]></category>

		<guid isPermaLink="false">http://softaria.com/?p=339</guid>
		<description><![CDATA[I have received several answers to my previous post claiming the described way is overcomplicated for most real life projects. As it is true, now I want to describe a way we normally build typical business applications with web interface. &#8230; <a href="http://softaria.com/2011/07/25/our-technology-stack-for-web-applications/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I have received several answers to my <a title="OSGi alternative (for web)" href="../2011/07/21/osgi-alternative-for-web/">previous post</a> claiming the described way is overcomplicated for most real life projects. As it is true, now I want to describe a way we normally build typical business applications with web interface. As for the way from previous post it is only for really big projects intended to be developed by several independent teams.</p>
<p>Okay, in this post I will describe the way in general and will list all the components of typical softaria web project, without going into details such as why we prefer one or another component. I plan to add more posts devoted to each component later.</p>
<p><strong>A typical project</strong></p>
<p>So, our typical business project:</p>
<ul>
<li>automates some business activity (e.g. activity of marketing department  or of business intelligence department)</li>
<li>needs 6 months for first version to be completed</li>
<li>intended to live for at least 5-7 years and have tens of releases during its life cycle (of course upgrading to new release needs to keep existing data)</li>
<li>needs to be integrated with 2-3 external systems by different means (e.g. web services)</li>
<li>has up to hundreds of thousands users (not millions)</li>
<li>uses only free and open source high quality components legally allowed for commercial projects</li>
<li>has web UI, of course</li>
</ul>
<p><strong>A technology stack</strong></p>
<p><strong><em>programming language</em></strong></p>
<p>At first, we use <a href="http://www.java.com/" target="_blank">java</a>. Java is better than Microsoft&#8217;s technologies because it has the same quality, but it is free. And because the java component market is high competitive, while Microsoft&#8217;s one is almost monopolized. That is why we have a lot of high quality free and open source components in java, which is not the case with Microsoft&#8217;s technologies.</p>
<p>The reasons why we do not use PHP are described <a title="Why don’t we use PHP" href="../2011/07/19/why-we-do-not-use-php/">here</a>.</p>
<p>Of course there are more technologies suitable for web, like e.g. <a href="http://www.rubyonrails.org/" target="_blank">RoR</a>, however I think the described 3 are leading.</p>
<p><strong><em>database</em></strong></p>
<p>Our standard choice is <a href="http://www.postgresql.org/" target="_blank">PostGRE sql server</a> &#8211; free , open source high quality relational database management system. (Here you can read, <a title="Why not MySQL?" href="../2011/07/15/why-not-mysql/">why not MySQL</a>.)</p>
<p><strong>Application server</strong></p>
<p>Our application server normally has 3 layers: data access layer, business logic layer and user interface layer. Each layer is built as a separate java project. The 4th java project contains data object model.</p>
<p>Everything built with <a href="http://maven.apache.org/" target="_blank">Apache Maven</a>.</p>
<p><em>Object relational mapping</em></p>
<p>We use <a href="http://www.eclipse.org/eclipselink/" target="_blank">EclipseLink ORM</a>, which is the reference implementation of java persistence API. In our experience it works much better than its closest competitor &#8211; <a href="http://www.hibernate.org/" target="_blank">Hibernate</a>. I will describe later why. [Update: described <a title="EclipseLink versus Hibernate" href="http://softaria.com/2011/07/26/eclipselink-versus-hibernate/">here</a>.]</p>
<p><em>Keeping database schema up to date</em></p>
<p>Is done with <a href="http://www.liquibase.org/" target="_blank">liquibase</a> &#8211; a library which allows database schema refactoring in controlled way. I plan to devote separate post to it as well.</p>
<p><em>User interface layer</em></p>
<p>We use either <a href="http://wicket.apache.org/" target="_blank">Apache Wicket</a>  or <a href="http://code.google.com/webtoolkit/" target="_blank">Google Web Toolkit</a> for building user interface. First fits better for traditional page-based interface, while the second is ideal for AJAX style, where an application should behave more like desktop one. Sometimes we mix both these technologies.</p>
<p><em>Layer integration </em></p>
<p>All the layers are integrated all together via <a href="http://www.springsource.org/" target="_blank">Spring Framework</a> &#8211; probably the best integration framework in the market. Besides <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html" target="_blank">inversion of control container</a> we intensively use other components of spring framework, such as <a href="http://static.springsource.org/spring-security/site/" target="_blank">spring security</a>, <a href="http://static.springsource.org/spring/docs/3.0.x/reference/transaction.html" target="_blank">transaction management</a> and a lot of other. Spring Framework also used for integration with 3d party systems (e.g. via <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer" target="_blank">RESTful </a>services)</p>
<p><em>Web server</em></p>
<p>Using Spring Framework as an integration framework has one additional plus: the resulting application can run in any servlet container: <a href="http://tomcat.apache.org/" target="_blank">Apache Tomcat</a>, <a href="http://www.mortbay.org/" target="_blank">Jetty</a>, <a href="http://www.caucho.com/" target="_blank">Resin </a>or even <a href="http://glassfish.java.net/" target="_blank">Glassfish </a>or Jboss. Though our normal choice is Tomcat, for some customers other servers are preferable.</p>
<p><em>Operation system</em></p>
<p>One good thing about java is it is cross-platform. So, the project can be installed at almost any operation system. However our choice for production environment is <a href="http://www.ubuntu.com/" target="_blank">Ubuntu Linux</a>. Probably it is because we were Ubuntu Silver Partner in 2007. And though we stopped this partnership, we kept the expertise.</p>
]]></content:encoded>
			<wfw:commentRss>http://softaria.com/2011/07/25/our-technology-stack-for-web-applications/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>OSGi alternative (for web)</title>
		<link>http://softaria.com/2011/07/21/osgi-alternative-for-web/</link>
		<comments>http://softaria.com/2011/07/21/osgi-alternative-for-web/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 10:45:11 +0000</pubDate>
		<dc:creator>roman</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[MindTouch]]></category>
		<category><![CDATA[OSGi]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://softaria.com/?p=332</guid>
		<description><![CDATA[About OSGi OSGi was born as a technology for desktop applications. The main idea behind it is fighting jar hell. And it works well, allowing plugin writers to not care about different jar versions used by a system core or &#8230; <a href="http://softaria.com/2011/07/21/osgi-alternative-for-web/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>About OSGi</strong></p>
<p><a href="http://www.osgi.org/" target="_blank">OSGi </a>was born as a technology for desktop applications. The main idea behind it is fighting <a href="http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell" target="_blank">jar hell</a>. And it works well, allowing plugin writers to not care about different jar versions used by a system core or by other plugins.</p>
<p>That is really good for desktop applications (such as <a href="http://www.eclipse.org/" target="_blank">eclipse</a>). But it is not as obvious about using OSGi for client server applications and, in particular, for web applications. Let me explain why.</p>
<p><strong>OSGi at web</strong></p>
<p>About an year ago I was really excited about <a href="http://www.eclipse.org/virgo/" target="_blank">Eclipse Virgo</a> &#8211; a project, which brings OSGi to web. At first sight, it simply adds all the pluses of OSGi to web world: no jar hell, ability to hot deploy, strict contracts between components.</p>
<p>However when we built real world big project with it we found one serious side-effect: it makes development cycle significantly longer. In our experience, it adds about 15-20%! It is because the technology is rather heavy and relatively fragile with debugger. (Re)starting server requires minutes. Hot deploy is not always work as expected in debug mode, so it requires restart relatively often.</p>
<p>Finally even though the technology somehow simplifies a life of plugin writers, they still need to have system core installed to develop a plugin. This last limitation not only makes plugin development harder, in some cases it makes it impossible, as for a lot of  customers system core is not a thing they wish to share with the world.</p>
<p><strong>Alternative solution</strong></p>
<p>So, finally, we have started looking for an alternative solution. And it brings us to a question: What is the main reason for using OSGi at all? The answer was: we use it because it fights jar hell. In other words, we use it because it isolates different parts of application from each other. But wait. Why to not do the same in more straightforward way? When we have web application, why not to replace OSGi bundles with isolated web applications (wars) which speak to each other via web services?</p>
<p>We started to look for similar architecture solution from real world and have found <a href="http://www.mindtouch.com/" target="_blank">MindTouch</a>. Though it is not written in java, it appears to be based on exactly the same principles! And as it is the number 3 product in its business niche (just after IBM&#8217;s one and Microsoft&#8217;s one), it means this approach works for it. So, it should work for us as well.</p>
<p><strong>How this works</strong></p>
<p>Now bit more details of the solution itself.</p>
<p>The application is deployed as a set of absolutely separated web applications.</p>
<p>From logical point of view, it has one core and a lot of plugins.</p>
<p>Both, core and plugins each consists of 2 parts: back end and UI.</p>
<p>Back end part has a set of <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer" target="_blank">RESTful </a>services as an API. The services use <a href="http://www.json.org/" target="_blank">JSON</a> as intercommunication format. Corresponding UI talk to their back-end via these services.</p>
<p>System core provides similar RESTful API to plugins. This API can be used by plugins for both: calling system level functions and registering plugin&#8217;s own services as callbacks.</p>
<p><strong>What does it give?</strong></p>
<p>Well, at first it obviously eliminates jar hell problem. As each plugin is isolated web application.</p>
<p>But it is not the only plus. Let me list other benefits:</p>
<ul>
<li>Back ends can be tested independently from UI, using any REST client, like e.g. <a href="http://curl.haxx.se/" target="_blank">curl</a>. The same for UI &#8211; it can be developed independently by using temporary static json files placed within any HTTP server.</li>
<li>Plugin can be developed independently from core: an API of plugin itself can be tested with curl. When plugin needs to call core, it can do it remotely &#8211; no need to download and install core locally.</li>
<li>Either plugin as a whole or only its part (UI or backend) can use any technology, which supports HTTP! Special benefit is an ability to involve junior developers in buildin UI (even with PHP). They will not be able to destroy the system architecture.</li>
</ul>
<p>So, this architecture is our current choice for big web applications.</p>
]]></content:encoded>
			<wfw:commentRss>http://softaria.com/2011/07/21/osgi-alternative-for-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java based pluggable forum</title>
		<link>http://softaria.com/2011/07/20/java-based-pluggable-forum/</link>
		<comments>http://softaria.com/2011/07/20/java-based-pluggable-forum/#comments</comments>
		<pubDate>Wed, 20 Jul 2011 07:01:46 +0000</pubDate>
		<dc:creator>roman</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[forum]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[spring framework]]></category>

		<guid isPermaLink="false">http://softaria.com/?p=327</guid>
		<description><![CDATA[In one of our projects  (a complex e-learning system for a University) we needed to add standard forum functionality. The problem was we needed this forum to be integrated with the system: It had to use the same users as &#8230; <a href="http://softaria.com/2011/07/20/java-based-pluggable-forum/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In one of our projects  (a complex e-learning system for a University) we needed to add standard forum functionality.</p>
<p>The problem was we needed this forum to be integrated with the system: It had to use the same users as the system does, it had to use complicated business rules to calculate those user&#8217;s permissions. E.g. if student&#8217;s group gets new teacher, this teacher must immediately get write permission to the forum&#8217;s topics corresponding to the group.</p>
<p>So, we were in need of forum which:</p>
<p>1) Can be added to existing system as plugin</p>
<p>2) Defines such concepts as User, Topic or Permission on abstract level and let the existing system implement those concepts</p>
<p>3) Performs fast, as the system serves ~5000 students.</p>
<p>Unfortunately we were not able to find any pluggable forum at the market.</p>
<p>So, we have developed our own.</p>
<p>The forum defines several interfaces such as UserManager, TopicManager or PermissionManager; and expects the system where it is plugged to implement all of them. So, it uses these implementations as &#8220;adapters&#8221; and really works with the same objects, original system does.</p>
<p>It took us approximately 120 hours to implement this.</p>
<p>So, if you need a pluggable, fast and stable forum in your java project, please <a title="Contact us" href="http://softaria.com/home/contact-us/">contact us</a>. We are ready to sell it for only 250 usd, which is much cheaper than implementing it from scratch.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://softaria.com/2011/07/20/java-based-pluggable-forum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why don&#8217;t we use PHP</title>
		<link>http://softaria.com/2011/07/19/why-we-do-not-use-php/</link>
		<comments>http://softaria.com/2011/07/19/why-we-do-not-use-php/#comments</comments>
		<pubDate>Tue, 19 Jul 2011 11:39:03 +0000</pubDate>
		<dc:creator>roman</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://softaria.com/?p=319</guid>
		<description><![CDATA[Though PHP is widely used and allows building really good systems; it was initially designed for building Private Home Pages. The abbreviate ”PHP” meant this initially. Later this technology grown and now it supports such concepts as Object Oriented Programming. &#8230; <a href="http://softaria.com/2011/07/19/why-we-do-not-use-php/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Though PHP is widely used and allows building really good systems; it was initially designed for building Private Home Pages. The abbreviate ”PHP” meant this initially. Later this technology grown and now it supports such concepts as Object Oriented Programming. But the problem with it is that it still supports every construction it started with. It is for backward compatibility. And a lot of these constructions are dangerous for big projects!</p>
<p>So, when you ask somebody to change something in a PHP-based project, it depends on his professionalism if he will use these legacy constructions (and therefore will quickly destroy your project’s architecture and will make the project not maintainable) or if he will not do it.</p>
<p>It is probably not a problem when you:</p>
<ul>
<li>know your provider  and sure in their professional level</li>
<li>sure you will never need to change provider and never need to ask somebody “with PHP knowledge” to fix something quickly</li>
</ul>
<p>However we at Softaria do not mess with PHP if it is possible. Because projects made with PHP can be easily destroyed by 3d party low-class developers. We prefer using java which is initially designed as object oriented language, suitable for building big, long-living systems.</p>
]]></content:encoded>
			<wfw:commentRss>http://softaria.com/2011/07/19/why-we-do-not-use-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cassandra ORM</title>
		<link>http://softaria.com/2011/07/18/cassandra-orm/</link>
		<comments>http://softaria.com/2011/07/18/cassandra-orm/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 10:35:32 +0000</pubDate>
		<dc:creator>roman</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[apache cassandra]]></category>
		<category><![CDATA[distributed data store]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://softaria.com/?p=317</guid>
		<description><![CDATA[Newest (0.8.x) release of Apache Cassandra (http://cassandra.apache.org/download/) includes a great new feature: support for so called &#8220;Cassandra Query Language&#8221;. It dramatically changes the whole cassandra-related ecosystem. As now it is probably has no sense to mess with complicated RPC API, &#8230; <a href="http://softaria.com/2011/07/18/cassandra-orm/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Newest (0.8.x) release of Apache Cassandra (http://cassandra.apache.org/download/) includes a great new feature: support for so called &#8220;Cassandra Query Language&#8221;.</p>
<p>It dramatically changes the whole cassandra-related ecosystem. As now it is probably has no sense to mess with complicated RPC API, at least in most cases. Also it may even make obsolete to use Hector, which was the best Cassandra client so far.</p>
<p>We have plaid with this new API and found it not yet mature, but already usable. Moreover, we were able to port one of our small internal project, called tiny ORM to use cassandra via CQL instead of relational database it was initially designed for.</p>
<p>So, now we have a java ORM which supports such concepts as polymorphism and all kind of relationships (one-to-many, many-to-one and many-to-many) and works above cassandra distributed data storage.</p>
<p>I wonder if anybody interested in it. Now we consider if we should open its sources.</p>
]]></content:encoded>
			<wfw:commentRss>http://softaria.com/2011/07/18/cassandra-orm/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Why not MySQL?</title>
		<link>http://softaria.com/2011/07/15/why-not-mysql/</link>
		<comments>http://softaria.com/2011/07/15/why-not-mysql/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 08:00:05 +0000</pubDate>
		<dc:creator>roman</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[deadlock]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[postgre sql]]></category>

		<guid isPermaLink="false">http://softaria.com/?p=309</guid>
		<description><![CDATA[We always suggest our customer to choose PostgreSQL if they need free reliable relational database management system. Sometimes we are asked:  “Why not MySQL? It is more popular” The answer is simple. And it can be found in official MySQL &#8230; <a href="http://softaria.com/2011/07/15/why-not-mysql/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>We always suggest our customer to choose <a href="http://www.postgresql.org/" target="_blank">PostgreSQL</a> if they need free reliable relational database management system. Sometimes we are asked:  “Why not MySQL? It is more popular”</p>
<p>The answer is simple. And it can be found in official MySQL documentation: <a href="http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html">http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html</a></p>
<p>The key phrase is: “<strong>You can get deadlocks even in the case of transactions that just insert or delete a single row</strong>”</p>
<p>And the true is deadlocks really happen to high load systems. And they do it periodically.</p>
<p>The only thing you can do with it is just “be prepared” and “be ready to restart each transaction”. In real world it means – increase development effort and add special “repeat transaction” layer. (In fact, the most developers use another rule:  “ignore it and hope it will not happen to us <img src='http://softaria.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ”)</p>
<p>One may tell the problem exists only when you use innodb engine. It is true. But other MySQL engines do not support such a basic concept as transactions! Why to use database without transactions at all?</p>
<p>So, during last 4 years we are with PostGRE, which performs much better in large, high load systems (and absolutely the same in average or small systems). If so, why mess with MySQL?</p>
]]></content:encoded>
			<wfw:commentRss>http://softaria.com/2011/07/15/why-not-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>We are №59 at elance</title>
		<link>http://softaria.com/2011/07/14/we-are-%e2%84%9659-at-elance/</link>
		<comments>http://softaria.com/2011/07/14/we-are-%e2%84%9659-at-elance/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 07:55:39 +0000</pubDate>
		<dc:creator>roman</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[elance]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://softaria.com/?p=303</guid>
		<description><![CDATA[About an year ago we had registered at elance &#8211; the world&#8217;s biggest platform for online employment. Today we are number 59 (from more than 110.000) in &#8220;Programming&#8221; category: http://www.elance.com/r/contractors/cat-web-programming/p-3 This is not as important, but sounds positive &#160; &#160; &#8230; <a href="http://softaria.com/2011/07/14/we-are-%e2%84%9659-at-elance/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>About an year ago we had registered at elance &#8211; the world&#8217;s biggest platform for online employment. Today we are number 59 (from more than 110.000) in &#8220;Programming&#8221; category: <a href="http://www.elance.com/r/contractors/cat-web-programming/p-3" target="_blank">http://www.elance.com/r/contractors/cat-web-programming/p-3</a></p>
<p>This is not as important, but sounds positive <img src='http://softaria.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://softaria.com/2011/07/14/we-are-%e2%84%9659-at-elance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A reasonable security</title>
		<link>http://softaria.com/2011/07/13/a-reasonable-security/</link>
		<comments>http://softaria.com/2011/07/13/a-reasonable-security/#comments</comments>
		<pubDate>Wed, 13 Jul 2011 09:41:34 +0000</pubDate>
		<dc:creator>roman</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://softaria.com/?p=295</guid>
		<description><![CDATA[Today I was asked by a potential customer:  &#8220;What measures will you take to ensure that a hacker (even a very good one) will not be able to access/abuse my database&#8221; As this is rather typical question, I have decided &#8230; <a href="http://softaria.com/2011/07/13/a-reasonable-security/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Today I was asked by a potential customer:  &#8220;What measures will you take to ensure that a hacker (even a very good one) will not be able to access/abuse my database&#8221;</p>
<p>As this is rather typical question, I have decided to put my (also typical) answer here. (The system we discussed was an average business software with web UI. Development cost was about 3-5k of usd.)</p>
<p>At first, there is no such thing as &#8220;absolute protection&#8221;.<br />
You see even sites of FBI are hacked sometimes.<br />
However the goal should not be to protect your system from the best hacker in the world &#8211; his time costs more than your system <img src='http://softaria.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
The goal is to make it economically not effective to hack your system: we must make the cost of hacking higher than the cost of profits one gets if hack it.</p>
<p>For this scale of system following measures are reasonable:</p>
<p>1) Use SSL (httpS) protocol for browsers to access the system. It will make impossible to &#8220;sniff&#8221; user&#8217;s passwords<br />
2) Introduce password complexity check to not allow users to enter too simple passwords that are easy to hack<br />
3) Add a &#8220;login attemp counter&#8221; which does not allow robots to make repeating login attempts: If one enters wrong password fro e.g. 3 times, he now asked to enter a captcha in addition to password.<br />
4) Keep the system up to date. Either manually or by finding a hosting where they warrant applying all the recent security patches on operating system level.<br />
5) Store sensitive information (like credit card numbers) encrypted in the database<br />
6) Disable root account and use sudo access only. Give this sudo access only to those who extremely need it. Ensure they use complex passwords for their account. And that these passwords ARE NOT USED in any other external systems (e.g. they are not known in Internet)<br />
7) Disable all the access to the server, but the SSH (for remote terminal) and httpS for browsers. Use firewall to block all the other ports but these 2.</p>
<p>This should be enough to keep the system secure.</p>
<p>Of course we could do much more, but I do not think it is reasonble to double the development cost by fighting the high level hackers who , indead, have much more profitable job than dealing with systems of this scale.</p>
]]></content:encoded>
			<wfw:commentRss>http://softaria.com/2011/07/13/a-reasonable-security/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.640 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2013-05-25 18:49:48 -->
