<?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-22096748</id><updated>2011-12-22T17:02:43.142+07:00</updated><title type='text'>Bending bits..</title><subtitle type='html'>IT tech notes</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-22096748.post-8676645122384172574</id><published>2010-07-26T19:15:00.001+07:00</published><updated>2010-07-26T19:16:09.962+07:00</updated><title type='text'>Nice tools for e-reading</title><content type='html'>I have been waiting very long time to get an e-reader (since eInk was invented, or nearly ;) )now their recent price reductions have convinced me it's time to get one.&lt;br /&gt;&lt;br /&gt;When the time for buying came I was totally lost in between nook and kindle, I like the nook cause it's more open and I need to read loads of manuals and web pages; on the other hand I'm living in Thailand and is really hard to get any books online, so having a Kindle would be fantastic. End of the day I went for Nook and the time has come to start finding my books and content.&lt;br /&gt;&lt;br /&gt;For books there's many places available to find all the classics and I hope I'll be able to tweak my Firefox soon to be able to buy from B&amp;amp;N.&lt;br /&gt;&lt;br /&gt;But how to get all those juicy online sites, RSS, Newspapers and online manuals I want to carry around into my reader?&lt;br /&gt;&lt;br /&gt;Here my todays' favorite tools:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1) Calibre.&lt;/b&gt; This is no big news if you have an ereader, fantastic application, let you organize your collection and can download RSS content, newspapers, it has a lot of built in sources in many languages, it can work with nearly any device and has awesome capabilities for import/export to nearly any available format. A MUST have&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2) Readability add-on.&lt;/b&gt; This one is for browser reading but it's worth mentioning, for long time I have been using firebug to narrow the paragraphs and tweak the CSS styles to make pages easier to read, today I found an extension that cleans the pages and makes them look like nice book pages! Try it it's fantastic, just go: Tools &amp;gt; Add-ons &amp;gt; Search or follow this link: https://addons.mozilla.org/en-US/firefox/addon/46442/&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3) Read it later.&lt;/b&gt; Nice stuff! It's like the old, bookmark and make available off-line but networked! You simply mark the pages you want to "read later" and this nice add on will create a beautiful list out of them, later on, you do what the name say: Download to read later (Offline) you can do this in full format or in a cleaner text format (similar to the one made by readability). &lt;br /&gt;And it even gets better, if you create a free account your can send content from multiple browsers and devices (Firefox, Chrome, mobiles, twitter clients!) and&amp;nbsp; later on download it with Calibre and read in your beautiful e-reader (or your favorite device)&lt;br /&gt;&lt;br /&gt;3) http://www.feedbooks.com Nice site, clean layout, it's really easy to find books in Spanish, French and German.&lt;br /&gt;&lt;br /&gt;4) http://www.scribd.com/ Another great site, lots of content available.&lt;br /&gt;&lt;br /&gt;When I find how to use the Modify Headers to be able to buy in b&amp;amp;N I'll post a new message. Wouldn't it be lovely if the nice people who rooted the Nook will tweak the system so buying from outside US from the Nook would be possible. (Just daydreaming sorry)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22096748-8676645122384172574?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/8676645122384172574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=8676645122384172574' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/8676645122384172574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/8676645122384172574'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2010/07/nice-tools-for-e-reading.html' title='Nice tools for e-reading'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-4222612901079378892</id><published>2009-10-12T14:28:00.002+07:00</published><updated>2009-10-12T14:34:14.533+07:00</updated><title type='text'>Tweak flexigrid for PHP</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Tequila currently uses a sortable table javascript that automatically converts every table to sortable on loading based on CSS, as I liked very much the flexigrid on jsquery I decided to give it a try, here are some easy changes to implement flexigrid on your application with no effort!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;1. Fix column width for tables without width declaration&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;Flexigrid looks absolutely horrible when the columns of your table have no width, I found in the forums this really cool fix:&lt;br /&gt;&lt;pre class="js" name="code"&gt;Index: flexigrid.js &lt;br /&gt;=================================================================== &lt;br /&gt;--- flexigrid.js (revision 4246) &lt;br /&gt;+++ flexigrid.js (revision 4247) &lt;br /&gt;@@ -1362,10 +1362,20 @@ &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .mousemove(function(e){g.dragMove(e)}) &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .mouseup(function(e){g.dragEnd()}) &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .hover(function(){},function (){g.dragEnd()}) &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; &lt;br /&gt;&amp;lt;/p&amp;gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// support table with no sizes specified by resizing header columns to data column sizes &lt;br /&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var &amp;lt;b style="color: black; background-color: rgb(255, 255, 102);"&amp;gt;headers&amp;lt;/b&amp;gt; = $('th:visible &amp;gt; div', g.hDiv); &lt;br /&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $('tr:first td &amp;gt; div', g.bDiv).each &lt;br /&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ( &lt;br /&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; function(idx,ele) &lt;br /&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { &lt;br /&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $(&amp;lt;b style="color: black; background-color: rgb(255, 255, 102);"&amp;gt;headers&amp;lt;/b&amp;gt;[idx]).&amp;lt;b style="color: black; background-color: rgb(160, 255, 255);"&amp;gt;width&amp;lt;/b&amp;gt;( $(ele).&amp;lt;b style="color: black; background-color: rgb(160, 255, 255);"&amp;gt;width&amp;lt;/b&amp;gt;() ); &lt;br /&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;br /&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ); &lt;br /&gt;+ &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //browser adjustments &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($.browser.msie&amp;amp;&amp;amp;$.browser.version&amp;lt;7.0) &lt;br /&gt;&lt;/pre&gt;&lt;a href="http://groups.google.com/group/flexigrid/browse_thread/thread/936873a1038229af/03a04b3dfdb58949?lnk=gst&amp;amp;q=headers+width#03a04b3dfdb58949" target="_blank"&gt;This fix published by Greg Mac on flexigrid group&lt;/a&gt;&lt;br /&gt;&lt;big&gt;&lt;b&gt;2. Automatic table conversion&lt;/b&gt;&lt;/big&gt;&lt;br /&gt;To keep compatibility with our normal code and to minimize javascript entries, we can simply add this code anywhere you prefer: your common js library, flexigrid library, a new file or your HTML document in a script block:&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&amp;lt;br /&amp;gt;function convertflexigrid()&amp;lt;br /&amp;gt;{&amp;lt;br /&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('table.flexigrid').flexigrid();&amp;lt;br /&amp;gt;}&amp;lt;br /&amp;gt;$(document).ready( convertflexigrid );&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br /&gt;Yep! And that will be the first jsquery code I ever write :D (not blaming you for not feeling very excited about it)&lt;br /&gt;&lt;br /&gt;Now simply add the CSS class flexigrid to any table in your application and you will have a flexigrid!&lt;br /&gt;&lt;pre class="html" name="code"&gt;&amp;lt;br /&amp;gt;&amp;lt;table &lt;b&gt;class="flexigrid"&lt;/b&gt; ...&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;3. Using Tequila? &lt;/b&gt;&lt;br /&gt;We'll add support for flexigrid soon, we are looking for the best way to integrate all the posibilities of flexigrid, in the meantime you can simply:&lt;br /&gt;a) deploy the library to your favorite template&lt;br /&gt;b) Modify or duplicate view_alternatetable and line #83 for this code that add the css and js references&lt;br /&gt;&lt;pre class="php" name="code"&gt;// Notice we deploy the JS to the folder flexigrid&amp;lt;br /&amp;gt;addJS('jquery.js,flexigrid/flexigrid.js,flexigridtrigger.js');&amp;lt;br /&amp;gt;addCSS('flexigrid.css,style.css');&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=0e09f58f-7355-8331-9a91-75d2ee396c44" /&gt;&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/22096748-4222612901079378892?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/4222612901079378892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=4222612901079378892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/4222612901079378892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/4222612901079378892'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2009/10/tweak-flexigrid-for-php.html' title='Tweak flexigrid for PHP'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-4321165290301840300</id><published>2009-10-09T14:26:00.001+07:00</published><updated>2009-10-09T14:26:20.481+07:00</updated><title type='text'>Cool tables with jquery</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Sometimes you just have to recognize is time to upgrade!&lt;br/&gt;&lt;br/&gt;I have been using for tequila applications a really cool JS script called sortabletables. I improved it long ago to support ajax, HTML controls and other nice tricks, the main attraction was that you just need to define a CSS class for the tables you want to make sortable.&lt;br/&gt;Today browsing the jquery library I found this amazing piece of code:&lt;br/&gt;&lt;a href='http://flexigrid.info/'&gt;http://flexigrid.info/&lt;/a&gt;&lt;br/&gt;Go on give it a try! To be included in next Tequila main release!!&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=b2aae7e7-a6d1-8665-84eb-42bab4c0a23e' alt='' class='zemanta-pixie-img'/&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/22096748-4321165290301840300?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/4321165290301840300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=4321165290301840300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/4321165290301840300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/4321165290301840300'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2009/10/cool-tables-with-jquery.html' title='Cool tables with jquery'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-3315086601338337559</id><published>2009-08-03T18:51:00.003+07:00</published><updated>2009-09-11T12:48:16.427+07:00</updated><title type='text'>Debugging applications</title><content type='html'>&lt;h3 id="sites-page-title-header" align="left"&gt;How to debug - A general guide&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Debugging Applications&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Debugging applications can be a challenging task; it takes programming abilities, understanding of the code flow and specific bug finding abilities, on top of these there can be multiple complications, environment, closed libraries, different browsers and servers.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I write this document in the hope that it will help you improve your debugging abilities, so you can minimize your debugging time and also code better to prevent bugs! &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;i&gt;* This tutorial uses many techniques from PHP Tequila framework but can be easily used for other languages / frameworks.&lt;/i&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Editor selection&lt;/h2&gt;&lt;br /&gt;The best starting point is the editor selection; use an editor that helps with indentation, function identification, and common syntax highlighting. Line numbers is an absolute must!&lt;br /&gt;&lt;p&gt;&lt;br /&gt;For PHP I strongly recommend: Zend , for general purposes Notepad++ (be sure to add/enable the function list plug in).&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;&lt;b&gt;Enable error reporting in your environment &lt;/b&gt;&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;I often find systems with dozens of errors simply because developers turn off reporting, and as PHP allow Notices and some errors to go by they simply don't care. This can hide big coding problems and it also looks really bad on a developer / company. &lt;b&gt; This MUST never be done, turn on your debugging!&lt;/b&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;To turn on error reporting:&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;h5&gt;Permanently (A MUST for all developers and managers):&lt;/h5&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt; &lt;li&gt;Open PHP.ini&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Set error_reporting = E_ALL;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;i&gt;* After PHP 5 you can use E_STRICT; to get notice of deprecated functions&lt;/i&gt;&lt;br /&gt;&lt;h5&gt;Runtime&lt;/h5&gt;At the beginning of your code add:&lt;br /&gt;&lt;p&gt; error_reporting(E_ALL);&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;* When you set tequila to debug mode, error reporting is turned on&lt;/i&gt;&lt;/p&gt;Disable error suppression PHP allows @ symbol to suppress errors, this is very useful in some cases but at debugging time must be removed to be able to see the errors.&lt;br /&gt;&lt;hr size="2"&gt;&lt;br /&gt;&lt;h2&gt;Debugging&lt;/h2&gt;In order to learn debugging we must understand:&lt;br /&gt; &lt;ul&gt;&lt;li&gt;Types of bugs&lt;/li&gt;  &lt;li&gt;The debugging process&lt;/li&gt;  &lt;li&gt;Complex applications (Ajax, RIA, etc.) behavior&lt;/li&gt;  &lt;li&gt;Complex applications moments of interest&lt;/li&gt;  &lt;li&gt;Tools&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;b&gt;Types of bugs&lt;/b&gt;&lt;br /&gt;Syntax/parse errors&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;Fatal errors, warnings and notices&lt;/li&gt;  &lt;li&gt;Database errors&lt;/li&gt;  &lt;li&gt;Logical errors&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Syntax Errors&lt;/h4&gt;This is the most common error at development time, luckily most can be avoided using a good editor; the most common causes are:&lt;br /&gt; &lt;ul&gt;&lt;li&gt;Missing &lt;b&gt;;&lt;/b&gt; at the end of the line (The error normally displays on the next line)&lt;/li&gt;  &lt;li&gt;Missing or extra parentheses&lt;/li&gt;  &lt;li&gt;Unclosed braces&lt;/li&gt;  &lt;li&gt;Type errors&lt;/li&gt;  &lt;li&gt;Incorrect string concatenation&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;h4&gt;Fatal Errors&lt;/h4&gt;&lt;p&gt;Fatal errors normally occur in development time and stop PHP from running. Error messages are normally clear and indicate the precise line that causes the error.&lt;/p&gt;&lt;p&gt;Common causes are:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;Extra } in classes&lt;/li&gt;  &lt;li&gt;Calls to non existing classes or functions&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Warnings&lt;/h4&gt;&lt;p&gt;Errors that doesn't stop PHP but will normally cause problems. Some common causes:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;Incorrect number of parameters&lt;/li&gt;  &lt;li&gt;Not found index in array&lt;/li&gt;  &lt;li&gt;Cannot modify header information&lt;/li&gt;  &lt;li&gt;Session_start - headers already sent&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; All warnings must be fixed, &lt;i&gt;normally PHP will display which line of code is making the incorrect function call&lt;/i&gt;, this is the place to start checking.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If you need to trace the function calls (stack) to detect where the problem occurs you can use debug_print_backtrace() in PHP; in Tequila you can call showcallstack();&lt;/p&gt;&lt;h4&gt;Notices&lt;/h4&gt;&lt;p&gt;Notices are lighter errors in PHP, sometimes code appear to work properly if you ignore them, but this might just mean code shows a standard behavior but doesn't always mean the developer intended behavior. Good code &lt;b&gt;must not generate a single Notice&lt;/b&gt;, common 'Notice' causes are:&lt;br /&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Undeclared variables&lt;/li&gt;  &lt;li&gt;Missing quotes &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;i.e.&lt;/p&gt;&lt;pre name="code" class="php"&gt;&lt;br /&gt;$array[key];&lt;br /&gt;// if you mean:&lt;br /&gt;$array['key'];&lt;br /&gt;//it will work as PHP believes it's a constant with value 'key'&lt;br /&gt;// but if you meant&lt;br /&gt;$array[$key];&lt;br /&gt;//it might work but logic is completely wrong, an empty key might be returned&lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;Database errors&lt;/h2&gt;&lt;p&gt;In this category I will comment about database design, SQL errors and Data validation errors which are very common ones. &lt;/p&gt;&lt;p&gt;It's also important to notice that not all errors are bugs or failures but sometimes incorrect use of data and/or resources.&lt;/p&gt;&lt;p&gt;What makes use of data 'correct'?&lt;/p&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;Minimal exchange of information &lt;/li&gt;&lt;ul&gt;&lt;li&gt;Delimited rows&lt;/li&gt;    &lt;li&gt;Delimited columns&lt;/li&gt;    &lt;li&gt;Don't retrieve BLOB/TEXT until required&lt;/li&gt;  &lt;/ul&gt;  &lt;li&gt;Standard SQL queries&lt;/li&gt;  &lt;li&gt;Non specific db-brand queries&lt;/li&gt;  &lt;li&gt;Proper indexed and accessed information&lt;/li&gt;  &lt;li&gt;Proper keys definition&lt;/li&gt;  &lt;li&gt;Reuse of objects and connection objects &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In Tequila by using DAO classes and generated pages these errors are somehow minimized as the page provide simple JS validation and the SQL is formed by the DAO class, unfortunately DAO cannot determine when to eliminate BLOB's/TEXT fields from the query, nor workaround poor DB libraries.&lt;/p&gt;&lt;p&gt;As with any code introduction new places for bugs/issues are created, let's examine some common ones.&lt;/p&gt;&lt;h3&gt;DAO errors&lt;/h3&gt;&lt;p&gt;There are some common misuses of DAO classes:&lt;br /&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Using DAO instead of DAO_unique for tables with no autonumeric field (auto increment)&lt;/li&gt;  &lt;li&gt;Using $key instead of $keys for DAO_unique&lt;/li&gt;  &lt;li&gt;Not setting $nullable array for tables that doesn't allow nulls and use ADODB library&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Abuse of data retrieval&lt;/h3&gt;Some errors are very hard to notice as they don't create errors but just affect performance&lt;br /&gt; &lt;ul&gt;&lt;li&gt;Not filtering results&lt;/li&gt;  &lt;li&gt;Loading Text and BLOB fields when they are not required, specially on multiple records &lt;/li&gt;  &lt;li&gt;Loading a full set of data to display just a section (pagination, see LIMIT clause for more info)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;i&gt;* To avoid these problems in DAO classes you should create a special method in the DAO child that return just the fields you need.&lt;/i&gt;&lt;br /&gt;&lt;h3&gt;SQL Errors&lt;/h3&gt;A common source of failures are incorrect SQL statements; at development time all SQL queries must be tested out of the system first (and then in); some SQL statements might work correctly with a simple test query, but will fail when using real data, some common mistakes are:&lt;br /&gt; &lt;ul&gt;&lt;li&gt;Filter criteria is incorrectly joined&lt;/li&gt;  &lt;li&gt;One side of a JOIN can include NULL values, You need to use a left/right join (this often becomes evident, when the system uses real data)&lt;/li&gt;  &lt;li&gt;Null values in the data&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Database design&lt;/h3&gt;&lt;p&gt;Database design is an speciality in itself, please consult with your manager or project leader. When creating tables don't forget to use the prefixes T_ for tables and I_ for fields. &lt;/p&gt;&lt;p&gt;Out of Tequila I still recommend this or a similar notation, specially if you consider a database migration can take place in the future.&lt;/p&gt;&lt;h3&gt;Issues with Naming, Advanced functions &amp;amp; DB versions&lt;/h3&gt;&lt;p&gt;Please be aware that some common functions might not be supported by specific databases, or will fail even if supported,&lt;/p&gt;&lt;p&gt;Here's a list of some of issues we have discovered in different databases:&lt;br /&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;MySql before 4.1&lt;br /&gt;   &lt;/li&gt;  &lt;ul&gt;&lt;li&gt;Lack of support for subselects (Use joins instead)&lt;/li&gt;  &lt;/ul&gt;  &lt;li&gt;MySql&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Regex support is faulty. We have found mysql crashed several times due to use of REGEX to find tags (others worked well)&lt;/li&gt;  &lt;/ul&gt;  &lt;li&gt;MSSQL&lt;/li&gt;&lt;ul&gt;&lt;li&gt;SQL PHP library is really deficient, therefore Tequila uses the ADODB COM object (You can monitor &lt;a title="Microsoft Blog for PHP MSSQL library" target="_blank" rel="nofollow" href="http://blogs.msdn.com/sqlphp/archive/2009/02/18/Working-on-version-1.1-of-the-SQL-Server-Driver-for-PHP.aspx"&gt;status of new library here&lt;/a&gt;)&lt;/li&gt;  &lt;/ul&gt;  &lt;li&gt;MSSQL using ADODB&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Support is still incredibly bad, with lack of paging support and other critical stuff.&lt;/li&gt;    &lt;li&gt;Until the release of the &lt;a title="Microsoft Blog PHP MSSQL" target="_blank" rel="nofollow" href="http://blogs.msdn.com/sqlphp/archive/2009/02/18/Working-on-version-1.1-of-the-SQL-Server-Driver-for-PHP.aspx"&gt;new Microsoft library&lt;/a&gt; this issues are unsolvable and Tequila/PHP uses workarounds for them. &lt;/li&gt;  &lt;/ul&gt;  &lt;li&gt;ORACLE&lt;br /&gt;   &lt;/li&gt;  &lt;ul&gt;&lt;li&gt;Long names. Oracle doesn't support very long field names&lt;/li&gt;    &lt;li&gt;Oracle use UPPER CASE&lt;/li&gt;  &lt;/ul&gt;&lt;/ul&gt;&lt;h5&gt;CASE sensitivity&lt;/h5&gt;&lt;p&gt;A common cause for bugs on system migration is case sensitivity, be aware of the following:&lt;br /&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;MySQL doesn't respect Case in table names in windows systems&lt;/li&gt;  &lt;li&gt;MySQL respect case in *nix systems&lt;/li&gt;  &lt;li&gt;PHP is case sensitive (always)&lt;/li&gt;  &lt;li&gt;Oracle forces UPPERCASE*&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;&lt;i&gt;*Tequila has a modified Oracle library that allow mixed case to be used in queries (to allow db migration) however this comes with an overhead.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;Implications breakdown&lt;/h4&gt;Coming down to code this means that when you change the OS or even the web server your application might completely crash. Possible reasons are:&lt;br /&gt; &lt;ul&gt;&lt;li&gt;The Script to create the DB was exported from the window system&lt;/li&gt;  &lt;li&gt;The target database uses different case&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Example&lt;/p&gt;&lt;p&gt; We assume system was developed on win and SQL is dumped from this system&lt;br /&gt;&lt;/p&gt;&lt;pre name="code" class="php"&gt;// Table is exported from Win system&lt;br /&gt;$mSql = "SELECT UserName from Users WHERE idUser = 3";&lt;br /&gt; ...&lt;br /&gt;$username = $rst['UserName'];&lt;br /&gt;// Will succeed in windows&lt;br /&gt;// Will fail in *nix as Users table doesn't exist; Users != users&lt;br /&gt;// Will fail in Oracle as field it's called $rst['USERNAME']&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;Recommended practices&lt;br /&gt; &lt;/h4&gt;&lt;ul&gt;&lt;li&gt;In your code use always UPPER CASE for table names and fields&lt;/li&gt;  &lt;li&gt;Define your database using UPPER CASE for tables&lt;/li&gt;  &lt;li&gt;Verify your export database script 'case' is correct before recreating.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Database Mobility&lt;/h3&gt;Coding for proper database mobility is a challenge in itself. In Tequila/BB we have standardized a set of practices to favor mobility:&lt;br /&gt; &lt;ul&gt;&lt;li&gt;Prefer use DAO over SQL to have a single control point&lt;/li&gt;  &lt;li&gt;Have single entry points for DB querys (functions execSQL and insertSQL)&lt;/li&gt;  &lt;li&gt;Have a single function for data retrieval (getData)&lt;/li&gt;  &lt;li&gt;Use only standard SQL&lt;/li&gt;  &lt;li&gt;Avoid / Minimize use of stored procedures&lt;/li&gt;  &lt;li&gt;Avoid / Minimize use of temp tables&lt;/li&gt;  &lt;li&gt;Prefix all tables with T_&lt;/li&gt;  &lt;li&gt;Prefix all field names with I_&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;* These practices are critical, not following them might result in your code being rejected, some critical cases like the use of 'name' field will result in database reserved word conflicts&lt;/i&gt;&lt;br /&gt;&lt;h2&gt;Logical errors&lt;/h2&gt;&lt;p&gt;The most difficult kind of error to debug, it normally doesn't relate with a mistake in the language but with the problem solving&lt;/p&gt;&lt;p&gt;This errors will normally be noticed because the results of an operation doesn't match the expected ones in all or some of the cases.&lt;/p&gt;&lt;p&gt;To narrow down this errors, we often need to analyze what's happening at execution time, sometimes we are able to line by line debugging if we have a proper set up environment, still many times, we need to debug in online servers, or other environments without an integrated debugger.&lt;/p&gt;&lt;p&gt;In order to debug this errors we normally need to 'see' what's happening inside the application, for this your best friends in PHP are:&lt;/p&gt;&lt;pre name="code" class="php"&gt;echo; print_r; debug_print_backtrace()&lt;br /&gt;&lt;/pre&gt;This functions however doesn't allow us to debug in a real environment or to inspect specific cases, Tequila implements a set of &lt;a title="Tequila web site, debugging functions" target="_blank" href="http://sites.google.com/site/phptequila/manuals/debugging"&gt;debugging functions&lt;/a&gt; that works conditionally allowing you to implement them in a real environment and have the ability to inspect what's happening.&lt;br /&gt;&lt;h5&gt;Tequila equivalent functions. &lt;/h5&gt;&lt;p&gt;  Tequila offers the possibility of conditionally activate debugging, please check &lt;a title="Tequila debugging functions documentation" target="_blank" href="http://sites.google.com/site/phptequila/manuals/debugging"&gt;Tequila documentation&lt;/a&gt; for a complete set of functions and the ways to activate in different scenarios&lt;/p&gt;&lt;h5&gt;Example of a logical case&lt;/h5&gt;&lt;p&gt;Let's imagine an example where $user is the publisher of a document, and the document $author field appear empty&lt;/p&gt;The strategy for tackling this bug would be something like:&lt;br /&gt; &lt;ol&gt;&lt;li&gt;Try to point out the place where you believe data / execution is going wrong (Controller perhaps?, model?)&lt;br /&gt; &lt;/li&gt;  &lt;li&gt;Add debugging code, i.e. myecho ("executing suspecting function, Value of user = $user");&lt;/li&gt;  &lt;li&gt;Add debug code (as in 2) in several spots until you can trace the place where the value of $user change&lt;br /&gt;   &lt;/li&gt;  &lt;ol&gt;&lt;li&gt;Try function / class entry points&lt;/li&gt;    &lt;li&gt;Try before and after calling other functions that you believe can affect this value&lt;/li&gt;  &lt;/ol&gt;  &lt;li&gt;Remove all the debugging entries that show correct values&lt;/li&gt;  &lt;li&gt;Drill down the function where the value was altered&lt;/li&gt;  &lt;li&gt;Repeat until you can pin point an specific line or section&lt;br /&gt; &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The idea behind is to narrow the problem to an specific function or segment of the code. &lt;/p&gt;&lt;h5&gt;Notes&lt;/h5&gt;&lt;p&gt;&lt;i&gt;Remember:&lt;/i&gt;&lt;br /&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Try to be logical, common functions used by everyone in the same way are normally not the cause of the problem&lt;br /&gt; &lt;/li&gt;  &lt;li&gt;Don't blame a piece of code because you cannot understand it&lt;br /&gt;   &lt;/li&gt;  &lt;ul&gt;&lt;li&gt;SQL&lt;/li&gt;    &lt;li&gt;RegEx&lt;/li&gt;    &lt;li&gt;Packages&lt;/li&gt;    &lt;li&gt;Libraries&lt;/li&gt;    &lt;li&gt;Complex strings&lt;/li&gt;  &lt;/ul&gt;&lt;br /&gt; &lt;li&gt;Most times libraries and packages are safe to use, it's more common that your own code is faulty and not the team /public code. &lt;i&gt;(This doesn't mean they cannot contain bugs/issues that no one discovered before, but you shouldn't blame this parts from the beginning)&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Dates&lt;/h2&gt;&lt;p&gt;Dates are a small challenge in application development, verify that your application date data is congruent. Tequila favors the canonical format:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;  YYYYMMDD HH:MM:SS&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;  As this is the only universally understood format, while you can use many formats to display dates, we recommend this to store and pass date data.&lt;/p&gt;&lt;p&gt;Be aware of locales with different years like Thai, for this cases we recommend to store normal data and just replace the year on view, &lt;b&gt;as the calendar doesn't match the year it mentions but the current one.&lt;/b&gt;&lt;/p&gt;&lt;b&gt;Example:&lt;/b&gt;&lt;br /&gt;&lt;p&gt;Thai year: 2552, does not match the calendar of standard year 2552, but matches the calendar of 2009.&lt;/p&gt;&lt;h2&gt;Other errors&lt;/h2&gt;There are other kinds of possible errors that go beyond debugging, you can read Tequila good practices or other similar documents to better understand this, among this errors:&lt;br /&gt; &lt;ul&gt;&lt;li&gt;Bad architecture design&lt;/li&gt;  &lt;li&gt;Improper code separation&lt;/li&gt;  &lt;li&gt;Non independent functions&lt;/li&gt;  &lt;li&gt;Bad OO coding  &lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Line by line debugging&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;The best and easiest way to debug in any language is to use a line by line run time debugger in the style of visual studio, where you can see how the application is running and the values are changing, unfortunately this option is not often available in PHP.&lt;/p&gt;You can try installing the debugger in Zend or one of the many options available. (Check IBM link for more info)&lt;br /&gt;&lt;hr size="2"&gt;&lt;h2&gt;Debugging in Online servers without access to Core files&lt;/h2&gt;In some case you will find that it will be useful to get debugging information from Tequila core files in an environment you don't have access to modify, you have 2 options for this scenario:&lt;br /&gt;&lt;h3&gt;Files that are inheritable&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Most Tequila classes are descendant of other Tequila classes, i.e. Dao, application_controller, application_view. In this case you will normally have access to the child class (part of the application) but not to the parent file (part of core)&lt;br /&gt;&lt;/p&gt;&lt;i&gt;Case: Debug person_DAO() method save&lt;/i&gt;&lt;br /&gt; &lt;ol&gt;&lt;li&gt;Open DAO.php from your local copy of Core&lt;/li&gt;  &lt;li&gt;Open person_DAO&lt;/li&gt;  &lt;li&gt;Copy all methods you are interested in debugging from (1) to (2)&lt;/li&gt;  &lt;li&gt;Add Tequila debugging information&lt;/li&gt;  &lt;li&gt;Execute locally to verify your new code doesn't introduce new errors and that debugging information is valuable&lt;br /&gt; &lt;/li&gt;  &lt;li&gt;Upload to testing/real environment&lt;/li&gt;  &lt;li&gt;Execute using by case activation&lt;a title="Tequila website &amp;gt; Debugging" target="_blank" href="http://sites.google.com/site/phptequila/manuals/debugging"&gt;(Check debugging page if you need help with this)&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt; You will now have full view of what's happening without needing to have access to DAO or any other Core class&lt;br /&gt;&lt;h3&gt;Files that are not inheritable&lt;/h3&gt;Other times you will need to have access to framework files, here the recommendation splits again:&lt;br /&gt; &lt;ol&gt;&lt;li&gt;Systems under development&lt;/li&gt;  &lt;li&gt;Long time running systems&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;b&gt;For systems under development&lt;/b&gt;, I recommend to add and keep a core with basic debugging functions (production copy has all debugging info commented). Only once the system is released the debugging information is removed&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;For long time running systems&lt;/b&gt;, if there's really no option, the debugging file should be prepared and replaced on server so per instance conditional debugging can be run.&lt;/p&gt;&lt;p&gt;Another last option for servers with many systems will be to keep on server 2 copies of the framework, one with debugging instructions and a production one, it's very easy to update the configuration of a single system to use one or the other.&lt;/p&gt;&lt;h2&gt;Debugging advanced applications&lt;/h2&gt;&lt;p&gt;Debugging have become increasingly complex in web applications as there are too many elements taking part.&lt;/p&gt;&lt;h4&gt;Common components &lt;/h4&gt; Let's start by inspecting the common components:&lt;br /&gt; &lt;ol&gt;&lt;li&gt;Database server&lt;br /&gt; &lt;/li&gt;  &lt;li&gt;Web server&lt;/li&gt;  &lt;li&gt;PHP&lt;/li&gt;  &lt;li&gt;Framework&lt;/li&gt;  &lt;li&gt;Application&lt;/li&gt;  &lt;li&gt;Browser&lt;/li&gt;  &lt;li&gt;JS&lt;/li&gt;  &lt;li&gt;CSS&lt;/li&gt;  &lt;li&gt;XML&lt;/li&gt;&lt;/ol&gt; The real problem with Rich Clients is that they hide information from us, the data comes in one of many formats "behind the curtains" making access to data very complicated.&lt;br /&gt;It's important to notice that to debug these applications many times you will need good understanding of HTML, CSS, JS, PHP, XML and AJAX. If you don't feel confident about your abilities on some, request help from your peers or your project manager &lt;b&gt;after you have pinpointed the problem.&lt;/b&gt;&lt;br /&gt;&lt;h4&gt;Tools to debug applications&lt;br /&gt; &lt;/h4&gt;&lt;ol&gt;&lt;li&gt;Firefox&lt;/li&gt;  &lt;li&gt;Firebug&lt;/li&gt;  &lt;li&gt;Web developer (optional)&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Common errors in rich applications&lt;/h2&gt;&lt;p&gt;&lt;i&gt;Let's review some common errors in rich applications:&lt;/i&gt;&lt;br /&gt; &lt;/p&gt;&lt;ol&gt;&lt;li&gt;Missing files / resources&lt;/li&gt;  &lt;li&gt;Missing updates&lt;br /&gt; &lt;/li&gt;  &lt;li&gt;CSS Class conflict&lt;/li&gt;  &lt;li&gt;Data related problems&lt;br /&gt;   &lt;/li&gt;  &lt;ol&gt;&lt;li&gt;Incorrect data&lt;/li&gt;    &lt;li&gt;Server errors make the data dirt&lt;/li&gt;    &lt;li&gt;UTF with BOM files&lt;/li&gt;  &lt;/ol&gt;  &lt;li&gt;Cache results don't let you see the results&lt;br /&gt; &lt;/li&gt;  &lt;li&gt;Incorrect JS&lt;br /&gt; &lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;1. Missing files / resources&lt;/h3&gt;One of the most common issues we find in applications is that developers forget to download or deploy some files, CSS files, support images, etc..&lt;br /&gt;&lt;h4&gt;Images&lt;/h4&gt;This mistakes are subtle and sometimes hard to notice as some browsers simply don't show anything, unfortunately other browser will show a massive X in place of the missing image.&lt;br /&gt;&lt;h4&gt;CSS&lt;/h4&gt;You will normally notice you are missing a CSS file because the screen looks weird (layout), or the font colors, backgrounds have changed&lt;br /&gt;&lt;h4&gt;JS&lt;/h4&gt;&lt;p&gt;Javascript errors are caused many times by not loaded JS files.&lt;/p&gt;&lt;h3&gt;Debugging&lt;/h3&gt;&lt;p&gt;  You can easily find which files are missing using firebug,&lt;br /&gt; Open firebug&lt;br /&gt; &lt;/p&gt;&lt;ol&gt;&lt;li&gt;Go to Net tab&lt;/li&gt;  &lt;li&gt;Select All, or the specific type you suspect&lt;/li&gt;  &lt;li&gt;All missing files are written in red&lt;br /&gt;   &lt;/li&gt;  &lt;ol&gt;&lt;li&gt;You can mouse over them to see the complete path of the file and then verify if the resource exist on server or not&lt;/li&gt;    &lt;li&gt;You can click the + symbol, to check the requesting Headers, the Response header and the HTML&lt;/li&gt;  &lt;/ol&gt;&lt;/ol&gt;&lt;h4&gt;Paths are correct, resources still missing&lt;/h4&gt;In some environments, resources will keep failing to download, this is specially true when you load a lot of files. Tequila offers some strategies to prevent this problem. To enable them: file minimization, joining and monitored downloading, you simply:&lt;br /&gt; &lt;ol&gt;&lt;li&gt;Open includes/config.php (server side)&lt;/li&gt;  &lt;li&gt;Find the js_includes configuration section &lt;i&gt;(package it's included in core)&lt;/i&gt;&lt;/li&gt;  &lt;li&gt;Modify these lines to enable:&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre name="code" class="php"&gt; $js_safeloading = true;&lt;br /&gt;$js_blocktillcomplete = true;&lt;br /&gt;$js_retry = 3;&lt;br /&gt;$js_cachedir = 'temp';&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;This will minimize, join all JS files, cache results for faster execution, monitor downloading, retry up to $js_retry times and optionally ($js_blocktillcomplete) Block the screen use until the files are loaded successfully.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;i&gt;* Notice. Minimization require all your JS files to be very well done (at least all closing brackets and ending semicolons). Tequila uses a standard minimization library and there are many tools online to check your library is valid, try this very strict validator &lt;a title="JavaScript validation" target="_blank" rel="nofollow" href="http://www.jslint.com/"&gt;JSLINT&lt;/a&gt; &lt;/i&gt;&lt;/p&gt;&lt;h3&gt;2. Missing updates&lt;/h3&gt;&lt;p&gt;Another common reason of involuntary bug induction is incorrect application updating, as files and resources are split across the application it's quite common that partial updates are made. i.e. Template files are not updated, or JS or CSS or...&lt;/p&gt;&lt;h4&gt;Solution&lt;/h4&gt;Use a file comparison tool, or use mercurial to upgrade your application.&lt;br /&gt;&lt;h3&gt;3. CSS Class conflict&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;CSS is awesome, it allow many levels of definition that allow precise change of look and layout, unfortunately some times CSS definitions can crash. i.e. A YUI component / JS component define the look of &amp;lt;div&amp;gt; and so your application does. The final result is a mix of both definitions.&lt;/p&gt;&lt;h4&gt;Debugging&lt;br /&gt; &lt;/h4&gt;&lt;ol&gt;&lt;li&gt;Find out the source of the conflict&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Right click on the conflicting element&lt;/li&gt;    &lt;li&gt;Inspect element&lt;/li&gt;    &lt;li&gt;Verify on the left panel you are on the right HTML tag&lt;/li&gt;    &lt;li&gt;Check the list of styles on the right panel, to see which one is defining the tag&lt;br /&gt;     &lt;/li&gt;    &lt;ol&gt;&lt;li&gt;Each entry also mentions the file and line number&lt;br /&gt;     &lt;/li&gt;    &lt;/ol&gt;  &lt;/ol&gt;&lt;/ol&gt;&lt;h4&gt;Solution&lt;/h4&gt;Once you have identified the conflicting resources you can:&lt;br /&gt; &lt;ol&gt;&lt;li&gt;Decide to remove one of them (this removal can be specific to one page, i.e. a complex one-screen)&lt;br /&gt; &lt;/li&gt;  &lt;li&gt;Modify one of the CSS to be more specific&lt;br /&gt;   &lt;/li&gt;  &lt;ol&gt;&lt;li&gt;You can use CSS syntaxis to affect just the children of one node, i.e. #mainlayer div&lt;br /&gt;   &lt;/li&gt;    &lt;li&gt;You can modify the HTML to apply an specific class to the affected element&lt;br /&gt;   &lt;/li&gt;    &lt;li&gt;You can add a class to parent to differentiate, (i.e. HTML: &amp;lt;div class="special_case"&amp;gt;  CSS:  .special_case div )&lt;/li&gt;  &lt;/ol&gt;&lt;/ol&gt;&lt;h3&gt;4. Data related problems&lt;/h3&gt;Modern applications transmit a lot of data using ajax, this data is hard to debug as it's normally not visible, so the 1st step is to make data visible.&lt;br /&gt;&lt;h4&gt;Viewing exchanged data&lt;br /&gt; &lt;/h4&gt;&lt;ol&gt;&lt;li&gt;Open firebug using the icon on the right bottom corner&lt;br /&gt; &lt;/li&gt;  &lt;li&gt;Click on console&lt;/li&gt;&lt;ol&gt;&lt;li&gt;You will see a list of all AJAX calls&lt;/li&gt;    &lt;li&gt;Open them by clicking on the + icon&lt;/li&gt;    &lt;li&gt;Params tab: You will be able to see the information sent by JS&lt;br /&gt;   &lt;/li&gt;    &lt;li&gt;Headers tab: You can see the headers sent by server&lt;/li&gt;    &lt;li&gt;Response tab: You can view here the reply from server&lt;/li&gt;  &lt;/ol&gt;&lt;/ol&gt;&lt;p&gt;&lt;b&gt;Common problems&lt;/b&gt;&lt;/p&gt;Based on this data you can start moving towards a solution, some common problems you can find are&lt;br /&gt; &lt;ol&gt;&lt;li&gt;Server errors make the data dirty&lt;/li&gt;  &lt;li&gt;Incorrect data&lt;/li&gt;  &lt;li&gt;UTF with BOM files&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;1. Server errors&lt;/h4&gt;This is the easiest error to debug, simply inspect the "response tab" like a normal web page and work over the PHP in server to clean up all the errors.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;* If you are sending all parameters using GET (querystring). You can also right click on the Console entry and select Open in New Tab&lt;/i&gt;&lt;br /&gt;&lt;p&gt;This will allow you to inspect data in detail, you can switch server modes from XML to cd, to get rid of the headers and be able to read the complete errors. (Simply replace rrt=xml -&amp;gt; rrt=nh or cd; read RRT section on Tequila manuals for more info on Requested Response Types)&lt;/p&gt;&lt;h4&gt;2. Incorrect data&lt;/h4&gt;Incorrect data might point to a logic problem in the server code, use your normal debugging techniques to solve this issue.&lt;br /&gt;&lt;p&gt;Another possible problem is that server and client versions are out of sync. Verify which data is correct before starting modifications. Then work on the server or JS files as necessary.&lt;/p&gt;&lt;h4&gt;3. UTF with BOM files&lt;/h4&gt;Sometimes you will discover everything is correct, data is perfect, JS is in place and still you keep getting errors from your ajax callback function &lt;u&gt;(this happens specially with XML data).&lt;/u&gt;&lt;br /&gt;&lt;p&gt;There's a subtle bug with files saved as UTF with BOM, the problem is that when they are included, PHP immediately start the output making impossible to set the correct XML headers.&lt;/p&gt;&lt;h5&gt;Solution&lt;/h5&gt;Open every file included in the task with Notepad++ or another editor that support this setting and re save them &lt;b&gt;WITHOUT BOM &lt;/b&gt;&lt;i&gt;(optionally you can enable output cache but this is only recommended for testing, cache code is commented in index.php file)&lt;/i&gt;&lt;br /&gt;&lt;h3&gt;5. Cache results don't let you see the results&lt;/h3&gt;This is a common issue, sometimes you own browser cache keeps showing images, css or data from previous calls. You can clear the cache or install the "web developer" plug in mentioned above, simply:&lt;br /&gt;&lt;br /&gt;Click on Disable button &amp;gt; Disable Cache.&lt;br /&gt;This will allow you to have a clean environment all the time.&lt;br /&gt;&lt;h5&gt;Server cache&lt;br /&gt;&lt;/h5&gt;&lt;p&gt;We have found on some online servers that PHP pages are cached and the changes made on the PHP are not reflected, try adding some extra info, an extra echo or some visual element that let you know your code is being executed. You might even be connected to the wrong server :)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;If required, duplicate the file you are testing, and use this copy for debugging / developing. Update the real file after results are satisfactory, normally the server will start using the updated version after some hours.&lt;/p&gt;&lt;h3&gt;6. Incorrect JS&lt;/h3&gt;Once you have determined that the server is sending the right responses and all resources are loaded, it's time to move debugging to the client side, You can work on this debugging in many ways.&lt;br /&gt;&lt;h4&gt;Echo, echo echo.&lt;/h4&gt;Using the exact same technique as in PHP, you can use alert() at some places to inspect execution values.&lt;br /&gt;&lt;h4&gt;debug.js&lt;/h4&gt;Tequila includes a very basic library to inspect values at running time, you must include it at server side to be able to use it on client, a couple of useful functions are:&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;pre name="code" class="js"&gt;&lt;i&gt;&lt;br /&gt;function showobj(myObj, title, complete)&lt;br /&gt;function showScript (content, safehtml, title)&lt;br /&gt;&lt;/i&gt;&lt;/pre&gt;&lt;i&gt;&lt;/i&gt;&lt;h4&gt;&lt;i&gt;Firebug!&lt;/i&gt;&lt;/h4&gt;&lt;i&gt;And your best friend again: line by line debugging. Before you get crazy following each line, you should inspect your code in an external editor and determine the function you think might be the problem, i.e. the callback function, in ajax&lt;br /&gt;&lt;/i&gt;&lt;h4&gt;&lt;i&gt;To start debugging in firebug&lt;/i&gt;&lt;/h4&gt;  &lt;ol&gt;&lt;i&gt;&lt;/i&gt;&lt;li&gt;&lt;i&gt;Open firebug (icon on bottom right side of the screen)&lt;/i&gt;&lt;/li&gt;&lt;i&gt;  &lt;/i&gt;&lt;li&gt;&lt;i&gt;Click on script tab&lt;/i&gt;&lt;/li&gt;&lt;i&gt;  &lt;/i&gt;&lt;li&gt;&lt;i&gt;Under script you will find 2 selectors, the 2d one indicates the name of the library being displayed&lt;/i&gt;&lt;/li&gt;&lt;i&gt;  &lt;/i&gt;&lt;li&gt;&lt;i&gt;Open this selector and select the library you want to debug&lt;/i&gt;&lt;/li&gt;&lt;i&gt;  &lt;/i&gt;&lt;li&gt;&lt;i&gt;Move the left pane to the line of code you want to inspect&lt;/i&gt;&lt;/li&gt;&lt;i&gt;  &lt;/i&gt;&lt;li&gt;&lt;i&gt;Add a breakpoint by clicking on the left hand side of the numbers, a red spot will appear&lt;/i&gt;&lt;/li&gt;&lt;i&gt;  &lt;/i&gt;&lt;li&gt;&lt;i&gt;Keep the window open&lt;/i&gt;&lt;/li&gt;&lt;i&gt;  &lt;/i&gt;&lt;li&gt;&lt;i&gt;Trigger in the normal window the action you want to inspect&lt;/i&gt;&lt;/li&gt;&lt;i&gt;  &lt;/i&gt;&lt;li&gt;&lt;i&gt;Execution will stop in the breakpoint you added, you can then&lt;/i&gt;&lt;/li&gt;&lt;i&gt;&lt;/i&gt;&lt;ol&gt;&lt;i&gt;&lt;/i&gt;&lt;li&gt;&lt;i&gt;Control execution advance using the icons on top of the code, right side&lt;/i&gt;&lt;/li&gt;&lt;i&gt;    &lt;/i&gt;&lt;li&gt;&lt;i&gt;Watch the value of all variables including objects on the right pane&lt;/i&gt;&lt;/li&gt;&lt;i&gt;    &lt;/i&gt;&lt;li&gt;&lt;i&gt;You can also add custom watches on the right pane&lt;br /&gt;   &lt;/i&gt;&lt;/li&gt;&lt;i&gt;  &lt;/i&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;i&gt;&lt;/i&gt;&lt;h2&gt;&lt;i&gt;Useful links on debugging:&lt;/i&gt;&lt;/h2&gt;&lt;i&gt;&lt;/i&gt;&lt;ul&gt;&lt;i&gt;&lt;br /&gt; &lt;/i&gt;&lt;li&gt;&lt;i&gt;&lt;a rel="nofollow" href="http://www.ibm.com/developerworks/library/os-debug/"&gt;http://www.ibm.com/developerworks/library/os-debug/&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;&lt;i&gt;  &lt;/i&gt;&lt;li&gt;&lt;i&gt;&lt;a rel="nofollow" href="http://www.phpfreaks.com/tutorial/debugging-a-beginners-guide"&gt;http://www.phpfreaks.com/tutorial/debugging-a-beginners-guide&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;&lt;i&gt;  &lt;/i&gt;&lt;li&gt;&lt;i&gt;&lt;a rel="nofollow" href="http://www.php-debugger.com/dbg/installation.php"&gt;http://www.php-debugger.com/dbg/installation.php&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;&lt;i&gt;  &lt;/i&gt;&lt;li&gt;&lt;i&gt;&lt;a rel="nofollow" href="http://xdebug.org/"&gt;http://xdebug.org/&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;&lt;br /&gt;Good luck and happy debugging!&lt;br /&gt;&lt;br /&gt;Itzco&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22096748-3315086601338337559?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/3315086601338337559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=3315086601338337559' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/3315086601338337559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/3315086601338337559'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2009/08/debugging-applications.html' title='Debugging applications'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-4620136451679478537</id><published>2009-07-10T18:40:00.001+07:00</published><updated>2009-07-10T18:40:44.193+07:00</updated><title type='text'>GPRS / EDGE access from vista using Nokia</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;font face='sans-serif'&gt;I fight for days with my mobile and my computer to be able to connect to the internet using the mobile GPRS connection, finally it's working, so here are some tips.&lt;br/&gt;&lt;br/&gt;* This steps can help in other connectivity problems (my laptop also stop working with EDGE modem via USB)&lt;br/&gt;&lt;br/&gt;1) Authorize bluetooth connection between the phone and the computer&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;2) Start the &lt;b&gt;Remote Access Autoconnection Manager&lt;br/&gt;&lt;/b&gt;&lt;font face='sans-serif'&gt;After tracing down the possible problems why the laptop didn't try to connect to the mobile I found this:&lt;br/&gt;&lt;/font&gt;&lt;a href='http://www.micropctalk.com/forums/showthread.php?s=28be31d4957094abd6228740e90b4fbb&amp;amp;t=416&amp;amp;page=2'&gt;http://www.micropctalk.com/forums/showthread.php?s=28be31d4957094abd6228740e90b4fbb&amp;amp;t=416&amp;amp;page=2&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;This service is required for the computer to dial up using the bluetooth modem in the mobile. Your mobile might be discovered and connected to exchange files but still don't provide access to internet.&lt;br/&gt;&lt;br/&gt;To start this service go to:  Control panel &amp;gt; Services&lt;br/&gt;Find it in the list and start it&lt;br/&gt;&lt;br/&gt;&lt;b&gt;* If you are able to start the service test again the connection&lt;br/&gt;&lt;/b&gt;&lt;br/&gt;Troubleshooting:&lt;br/&gt;- Try running the services that the remote autoconnection manager depends on.&lt;br/&gt;- Check the Secure Socket Tunneling Protocol Service, in my case this was the problem:&lt;br/&gt;Information on the service:&lt;br/&gt;&lt;a href='http://www.blackviper.com/WinVista/Services/Secure_Socket_Tunneling_Protocol_Service.htm'&gt;http://www.blackviper.com/WinVista/Services/Secure_Socket_Tunneling_Protocol_Service.htm&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;To be able to start this service follow the instructions from this link:&lt;br/&gt;&lt;a href='http://social.technet.microsoft.com/forums/en-US/itprovistaapps/thread/7c60879d-ff50-4a30-bd00-55d4ae18d266/'&gt;http://social.technet.microsoft.com/forums/en-US/itprovistaapps/thread/7c60879d-ff50-4a30-bd00-55d4ae18d266/&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;I Quote:&lt;br/&gt;&lt;span style='border-collapse: separate; color: rgb(0, 0, 0); font-family: &amp;apos;Times New Roman&amp;apos;; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;' class='Apple-style-span'&gt;&lt;span style='font-family: Verdana; font-size: 11px;' class='Apple-style-span'&gt;&lt;p align='left' style='border-style: none; margin: 1em 0px; padding: 0px; list-style-type: none; text-decoration: none;'&gt;Simply open Regedit, browse to the following key:&lt;/p&gt;&lt;p style='border-style: none; margin: 1em 0px; padding: 0px; list-style-type: none; text-decoration: none;'&gt;HKLM\SYSTEM\CurrentControlSet\Service\RasMan&lt;/p&gt;&lt;p align='left' style='border-style: none; margin: 1em 0px; padding: 0px; list-style-type: none; text-decoration: none;'&gt;** (HKLM is an abbreviation of HK_LOCAL_MACHINE)  &lt;br/&gt;&lt;/p&gt;&lt;p align='left' style='border-style: none; margin: 1em 0px; padding: 0px; list-style-type: none; text-decoration: none;'&gt;Export this key to your pc (just in case it doesn't work)&lt;/p&gt;&lt;p align='left' style='border-style: none; margin: 1em 0px; padding: 0px; list-style-type: none; text-decoration: none;'&gt;Click on the Value&lt;span class='Apple-converted-space'&gt; &lt;/span&gt;&lt;strong&gt;DependOnService&lt;/strong&gt;&lt;/p&gt;&lt;p align='left' style='border-style: none; margin: 1em 0px; padding: 0px; list-style-type: none; text-decoration: none;'&gt;Remove the&lt;span class='Apple-converted-space'&gt; &lt;/span&gt;&lt;strong&gt;SstpSvc&lt;/strong&gt;&lt;span class='Apple-converted-space'&gt; &lt;/span&gt;entry.&lt;/p&gt;&lt;p align='left' style='border-style: none; margin: 1em 0px; padding: 0px; list-style-type: none; text-decoration: none;'&gt;Reboot..&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;- To properly set the parameters of the mobile and the computer you can follow this instructions (for Thailand but many tips are common)&lt;br/&gt;&lt;br/&gt;&lt;font face='sans-serif'&gt;http://www.crushdepth.net/modules/news/article.php?storyid=102&lt;br/&gt;&lt;br/&gt;Hope it helps someone else not loosing many days!&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&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/22096748-4620136451679478537?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/4620136451679478537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=4620136451679478537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/4620136451679478537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/4620136451679478537'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2009/07/gprs-edge-access-from-vista-using-nokia.html' title='GPRS / EDGE access from vista using Nokia'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-4039858407967208291</id><published>2009-05-27T17:33:00.001+07:00</published><updated>2009-05-27T17:33:19.171+07:00</updated><title type='text'>Syncronizing code using Mercurial bundles</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;span style='border-collapse: separate; color: rgb(0, 0, 0); font-family: Verdana; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;' class='Apple-style-span'&gt;&lt;div&gt;It's easy to exchange code changes using bundles &lt;span style='border-collapse: separate; color: rgb(0, 0, 0); font-family: Verdana; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;' class='Apple-style-span'&gt;(using tortoisehg&lt;/span&gt;):&lt;/div&gt;&lt;div&gt;&lt;br/&gt;&lt;/div&gt;&lt;h2 style='font-size: 18px; font-weight: bolder; color: rgb(51, 102, 255);'&gt;To create a bundle:&lt;/h2&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Right click on repository &amp;gt; TortoiseHG -&amp;gt; View Change Log&lt;/li&gt;&lt;li&gt;Right click on the changeset you want to &amp;gt; Bundle rev ___&lt;/li&gt;&lt;li&gt;Select a location to save the bundle&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;For the first time you need to send a bundle with all changesets, you can do this using the cmd window:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br/&gt;&lt;/div&gt;&lt;div&gt;&lt;span style='font-family: &amp;apos;-webkit-sans-serif&amp;apos;; font-size: 16px;' class='Apple-style-span'&gt;&lt;pre style='border: 1pt solid rgb(174, 189, 204); padding: 5pt; background-color: rgb(243, 245, 247); font-family: courier,monospace; white-space: pre-wrap;'&gt;hg bundle --base null project.hg&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a style='color: rgb(255, 153, 0); font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: 16px; font-size-adjust: none; font-stretch: normal;' target='_blank' title='Bundles' href='http://www.selenic.com/mercurial/wiki/CreateBundleOfAllChanges'&gt;More info&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br/&gt;&lt;/div&gt;&lt;h2 style='font-size: 18px; font-weight: bolder; color: rgb(51, 102, 255);'&gt;To create a new repository based on a bundle&lt;br/&gt;&lt;/h2&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Go to the directory where you want to have the project&lt;/li&gt;&lt;li&gt;Right click -&amp;gt; TortoiseHG -&amp;gt; Create a repository&lt;/li&gt;&lt;li&gt;Right click -&amp;gt; TortoiseHG -&amp;gt; Synchronize&lt;/li&gt;&lt;li&gt;Click Bundle button&lt;/li&gt;&lt;li&gt;Select the file you received&lt;/li&gt;&lt;li&gt;Click Pull&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;h2 style='font-size: 18px; font-weight: bolder; color: rgb(51, 102, 255);'&gt;To update an existing repository&lt;/h2&gt;&lt;div&gt;Follow steps 4-7&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=f00703bf-9e84-895e-b5e4-41a8761c1954' class='zemanta-pixie-img'/&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/22096748-4039858407967208291?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/4039858407967208291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=4039858407967208291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/4039858407967208291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/4039858407967208291'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2009/05/syncronizing-code-using-mercurial.html' title='Syncronizing code using Mercurial bundles'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-4934123015237306075</id><published>2009-05-27T11:38:00.001+07:00</published><updated>2009-05-27T11:38:41.463+07:00</updated><title type='text'>Web design 2.0</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Working on a new site? Read some useful stuff to make it better!&lt;br/&gt;http://www.webdesignfromscratch.com/real-web-20-design.php&lt;br/&gt;http://savethepixel.org/&lt;br/&gt;http://www.webdesignfromscratch.com/web-2.0-design-style-guide.php#separate-top-sections&lt;br/&gt;&lt;br/&gt;Grab some great icons here&lt;br/&gt;&lt;br/&gt;http://www.iconspedia.com&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=0b1f0787-d86f-89fb-a56c-aff5aeefeedc' class='zemanta-pixie-img'/&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/22096748-4934123015237306075?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/4934123015237306075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=4934123015237306075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/4934123015237306075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/4934123015237306075'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2009/05/web-design-20.html' title='Web design 2.0'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-5686757745844538637</id><published>2009-03-18T17:04:00.001+07:00</published><updated>2009-03-18T17:04:57.847+07:00</updated><title type='text'>Rounded Corners II</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Some days ago I published a simple way to add rounded corners using DIV's, but today I face a case where it wasn't convenient to add so many DIV's.&lt;br/&gt;&lt;br/&gt;I had an H2 element in drupal i wanted to look like the top of a rounded box, after googling a little I discover this really nice technique.&lt;br/&gt;&lt;br/&gt;&lt;a href='http://woork.blogspot.com/2008/03/liquid-expandable-section-with-rounded.html'&gt;http://woork.blogspot.com/2008/03/liquid-expandable-section-with-rounded.html&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Which only requires you to add a span element around the H2 text, in my case I didn't require the toggle.&lt;br/&gt;&lt;br/&gt;By the way it was really hard to disappear an space in between the H2 and the div that followed, not spaces, margins and paddings set to 0, at the end it was a matter of setting the border-top to 0.. weird.&lt;br/&gt;&lt;br/&gt;Happy CSS'ing!&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=ceb9ca17-6381-493d-ae49-7cf824519e5d' class='zemanta-pixie-img'/&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/22096748-5686757745844538637?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/5686757745844538637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=5686757745844538637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/5686757745844538637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/5686757745844538637'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2009/03/rounded-corners-ii.html' title='Rounded Corners II'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-3930190286782754450</id><published>2009-03-16T13:02:00.001+07:00</published><updated>2009-03-16T13:02:42.347+07:00</updated><title type='text'>Drupal, Multilanguage site</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;So Drupal won me, I start making our website on it after trying it on joomla (No complains about it, just like drupal better).&lt;br/&gt;&lt;br/&gt;One of the winning points was the multilanguage support in drupal 6.x, but when I actually try to enter content in many languages I couldn't find it!&lt;br/&gt;&lt;br/&gt;Some Google research take us to:&lt;br/&gt;&lt;br/&gt;&lt;b&gt;1. Activate the modules:&lt;/b&gt;&lt;br/&gt;Goto to admin &amp;gt; Build &amp;gt; Modules and activate&lt;br/&gt;- Content translation&lt;br/&gt;- Locale&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Now let's add the languages we want to use and the language switcher&lt;/b&gt;&lt;br/&gt;2. Add the language switcher block, so user can select it's language&lt;br/&gt;&lt;br/&gt;3. Enable the languages you want to use&lt;br/&gt;admin &amp;gt; Site Configuration &amp;gt; Languages&lt;br/&gt;&lt;br/&gt;4. Enable language negotiation&lt;br/&gt;admin &amp;gt; Site configuration &amp;gt; Languages &amp;gt; Configure Tab&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Now let's configure the admin&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;5. Create a role that can translate (if an existing one ignore this)&lt;br/&gt;&lt;br/&gt;6. You will find a  'translate content' permission, assign to the roles you want.&lt;br/&gt;Administer &amp;gt; User management &amp;gt; Permission&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Configure the content types that can be translated&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;7. In Admin &amp;gt; Content management &amp;gt; content  types &lt;br/&gt;- Click edit on each content type you want to translate&lt;br/&gt;- In Workflow settings tab activate &lt;br/&gt;  Multilingual support &amp;gt; Enabled, with translation&lt;br/&gt;&lt;br/&gt;Do the same for each content type&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Creating content in multiple languages&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;8. For enabled types (7), you will find a new select control "Language", be sure to select one of them 'language neutral' doesn't show translate tab&lt;br/&gt;&lt;br/&gt;* If you cannot see the language selector probably:&lt;br/&gt;- You didn't set permissions to translate content for this user (6)&lt;br/&gt;- You didn't select this content type as translatable (7)&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Translate content&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;9. Browse to the page you want to translate, you will find a new 'Translate' tab&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Keep versions together&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;When you update one language the other languages will not match, you can:&lt;br/&gt;&lt;br/&gt;10. When editing look for: "Translation settings" section, and select "Flag translations as outdated"&lt;br/&gt;&lt;br/&gt;Optionally, add a log message in the Revision information, to help the other authors understand what you did, without reading each word!&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Ok! That's it, you have a multilanguage website!&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=08e57427-d62b-4866-81b1-5d868ee9deb8' class='zemanta-pixie-img'/&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/22096748-3930190286782754450?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/3930190286782754450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=3930190286782754450' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/3930190286782754450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/3930190286782754450'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2009/03/drupal-multilanguage-site.html' title='Drupal, Multilanguage site'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-3992084729740772337</id><published>2009-03-06T11:55:00.003+07:00</published><updated>2009-03-06T12:10:49.990+07:00</updated><title type='text'>Round corners using img, CSS and DIV</title><content type='html'>Today we explore a nice css trick to make a box with round edges, it's  important to mention that this is not a pure CSS trick (cannot be added  in a class and see your boxes changing corners) if you know how to do  this without HTML changes please share with us!&lt;br /&gt;&lt;br /&gt;So let's see how to do this, we'll need:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;HTML code&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;CSS code&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Images&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h3&gt;1. The HTML&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Let's asume your starting code is:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  &amp;lt;div&amp;gt;&lt;br /&gt;&lt;br /&gt;  Whatever goes in the box&lt;br /&gt;&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;  We  will need to modify this by adding a class and 4 more divs, each one of  this div's will also have a class to be able to position it nicely&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;div class='roundbox'&amp;gt;&lt;br /&gt;&amp;lt;div class='top'&amp;gt;&amp;lt;div class='A'&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class='B'&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;Your content&lt;br /&gt;&amp;lt;div class='bottom'&amp;gt;&amp;lt;div class='A'&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class='B'&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;2. The css&lt;/h3&gt;&lt;br /&gt;Have a look at this code&lt;br /&gt;&lt;pre&gt;   1 .roundbox {background-color:#F0F0F0; color:#6A6A6A; font-size:10px;width:455px; margin-left:0px;}&lt;br /&gt;   2 .roundbox .top {width:100%; height:9px; background-image:url(../images/gray_border_2.gif); background-repeat:repeat-x; background-color:#FF0000}&lt;br /&gt;   3 .roundbox .top .A, .roundbox .top .B {width:8px; height:9px; font-size:1px;}&lt;br /&gt;   4 .roundbox .top .A {float:left;  background-image:url(../images/gray_border_1.gif);}&lt;br /&gt;   5 .roundbox .top .B {float:right; background-image:url(../images/gray_border_3.gif);}&lt;br /&gt;   6 &lt;br /&gt;   7 .roundbox .bottom {width:100%; height:9px;}&lt;br /&gt;   8 .roundbox .bottom .A, .roundbox .bottom .B {width:8px; height:9px; font-size:1px;}&lt;br /&gt;   9 .roundbox .bottom .A {float:left;  background-image:url(../images/gray_border_4.gif);}&lt;br /&gt;  10 .roundbox .bottom .B {float:right; background-image:url(../images/gray_border_5.gif);}&lt;br /&gt;  11 &lt;br /&gt;  12 .roundbox .content {width:100%; font-size:10px;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;In this code you can see:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;The top and bottom image of the box will be repeated horizontally (line 2) &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Layers A,B floated left and right. (line 4,5)&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;You should replace the background-image:url with your own images (line 4,5)&lt;br /&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Set the size of the corner images using the height and width properties (line 3)&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Bottom is just a copy of TOP changing the images.&lt;br /&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Note: In this case there's no image on the bottom because the table end's with no special effect in the bottom.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;And  ready!, you don't need to do this for every box, you just need to add  top/bottom layers and assign the class roundbox to the container div.&lt;/p&gt;&lt;br /&gt;Hope this helps someone!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22096748-3992084729740772337?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/3992084729740772337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=3992084729740772337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/3992084729740772337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/3992084729740772337'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2009/03/round-corners-using-img-css-and-div_06.html' title='Round corners using img, CSS and DIV'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-410840312598366280</id><published>2009-03-05T19:48:00.002+07:00</published><updated>2009-03-05T19:54:21.360+07:00</updated><title type='text'>Scrum &amp; Agile</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Year after year I try to convince managers and customers to work on Agile / Scrum.&lt;br/&gt;&lt;br/&gt;Seems like the perfect alternative considering customers normally doesn't even know what they really want/need. We all know requirements will change, they know very well they don't know a lot about their own process and even less about the software to be developed.. Yet, everyone wants to fix a requirement based on ignorance :(&lt;br/&gt;&lt;br/&gt;Again and again I listen, sounds fantastic, let's try Scrum! but it's followed by:&lt;br/&gt; - Can you send us a schedule, milestones and quotation based on Scrum..&lt;br/&gt;&lt;br/&gt;It makes perfect sense as most customers need to present internally a time and a budget. They are also afraid of not being able to follow the project as they cannot get the big picture. &lt;br/&gt;&lt;br/&gt;Conclusion: Customer need / wants to be able to control the project&lt;br/&gt;&lt;br/&gt;Iterations and releases should be more than enough but rarely they are, specially at the time of signing a contract, most times proposing SCRUM you just get a customer working in traditional way expecting to be able to change the spec. Bad.. &lt;br/&gt;&lt;br/&gt;Answers should be:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Budget will not go over the limit (set budget / time)&lt;/li&gt;&lt;li&gt;You will get exactly what you wanted (even if you don't know yet what is it)&lt;/li&gt;&lt;li&gt;An objective and main functionality should be defined and changes in spec that goes out of them not allowed (change in a controlled fashion?)&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;Any other idea would be greatly appreciated!&lt;br/&gt;&lt;br/&gt;Anyway, have a look at this article, this guy is of course amazing, not only does he explain the process perfectly he also discuss this kind of issues.&lt;br/&gt;&lt;br/&gt;&lt;a href='http://www.martinfowler.com/articles/newMethodology.html'&gt;http://www.martinfowler.com/articles/newMethodology.html&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=0f35c6d9-ba50-4457-83b0-42549425e36a' class='zemanta-pixie-img'/&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/22096748-410840312598366280?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/410840312598366280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=410840312598366280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/410840312598366280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/410840312598366280'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2009/03/scum-agile.html' title='Scrum &amp; Agile'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-6559433178060948699</id><published>2009-03-05T17:44:00.001+07:00</published><updated>2009-03-05T17:44:32.091+07:00</updated><title type='text'>Drupal vs. joomla</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I have been making web sites and systems for a long time and now I'm getting more and more requirements to use  joomla or drupal. &lt;br/&gt;&lt;br/&gt;So I install both and try to make a plain web site to see which one will allow me to deliver quickly with good quality.&lt;br/&gt;&lt;br/&gt;After a lot of browsing, seems to me drupal is the winner in many technical aspects, but I know that being the best techincaly doesn't mean you can provide a better user experience, or help the user achieve his goals better.&lt;br/&gt;&lt;br/&gt;Here are some quick observations &amp;amp; tips when using both to make a simple web site (most functionality removed, you just use them to keep the site updated :( )&lt;br/&gt;&lt;br/&gt;&lt;big&gt;Install&lt;/big&gt;&lt;br/&gt;Both are really easy. &lt;br/&gt;&lt;font color='#3366ff'&gt;No winner&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;big&gt;Basic Setup&lt;/big&gt;&lt;br/&gt;Both are very easy to setup&lt;br/&gt;&lt;br/&gt;&lt;big&gt;Add Content&lt;/big&gt;&lt;br/&gt;Joomla is quite nice and easy, just decide sections and categories and go ahead.&lt;br/&gt;&lt;br/&gt;Drupal is.. pure beauty, I'm loving it by the minute..&lt;br/&gt;&lt;br/&gt;&lt;big&gt;Plain websites.&lt;/big&gt;&lt;br/&gt;Joomla was quite fast just a couple of hours. still checking how to remove all good things of drupal and make it look like a normal website (I'll try tomorrow).. &lt;br/&gt;&lt;br/&gt;Probably I'll go &lt;font color='#3366ff'&gt;Joomla &lt;/font&gt;for a quickie&lt;br/&gt;&lt;br/&gt;Drupal. Add page, add to menu, I hadn't do nearly anything and it's looking great! languages were a breeze, the menu's too, moving content around so easy.. Let's see how it goes when it's time to fit into my design but so far I love this thing..&lt;br/&gt;&lt;br/&gt;&lt;big&gt;Components / add ons&lt;/big&gt; &lt;br/&gt;There's everything in both, but in Joomla it comes many times with a price tag. &lt;br/&gt;&lt;font color='#3366ff'&gt;Drupal&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;big&gt;Your own templates. &lt;/big&gt;&lt;br/&gt;Who care what you can download, any professional site need its own design.&lt;br/&gt;I was able to make Joomla look the way I wanted in around 1 hour (I had the design ready at hand).&lt;br/&gt;&lt;br/&gt;Will see tomorrow how long it takes with drupal, doesn't look that hard. &lt;br/&gt;&lt;br/&gt;One thing is sure, both can do far better explaining the every day web developer how to make their design a template.&lt;br/&gt;&lt;br/&gt;Here a couple of great links to start:&lt;br/&gt;&lt;br/&gt;&lt;a href='http://tips.webdesign10.com/how-to-make-a-drupal-theme' target='_blank'&gt;Drupal templates&lt;/a&gt;&lt;br/&gt;&lt;a href='http://www.tobacamp.com/tutorial/5-easy-steps-converting-html-template-to-joomla-template/' target='_blank'&gt;Joomla templates&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;big&gt;Multilanguage. &lt;/big&gt;&lt;br/&gt;Can't remember last time I made a site in just one. &lt;font color='#3366ff'&gt;&lt;br/&gt;Drupal &lt;/font&gt;hands down. Joomfish wasn't hard to get but then you need to add each language to the system before being able to add content.&lt;br/&gt;&lt;br/&gt;&lt;big&gt;Architecture&lt;/big&gt;&lt;br/&gt;I normally end up coding in most systems but I hadn't had the chance yet in any of this 2. So just by reference: Seems that &lt;font color='#3366ff'&gt;drupal&lt;/font&gt; is the one here.&lt;br/&gt;&lt;br/&gt;&lt;big&gt;Multisite&lt;/big&gt;&lt;br/&gt;Drupal to avoid installing many instances, if your sites have any way their own hosting, any is good&lt;br/&gt;&lt;br/&gt;&lt;big&gt;Upgrades&lt;/big&gt;&lt;br/&gt;No idea&lt;br/&gt;&lt;br/&gt;&lt;big&gt;Result&lt;/big&gt;&lt;br/&gt;&lt;br/&gt;I'll use whatever the customer ask for :)&lt;br/&gt;&lt;br/&gt;For a middle-big site, portal style, I would go drupal.&lt;br/&gt;&lt;br/&gt;For a normal website, Joomla is fine&lt;br/&gt;&lt;br/&gt;&lt;big&gt;Read more&lt;/big&gt;&lt;br/&gt;&lt;br/&gt;Now you should read 2 Really interesting comparisons! (real ones not like this one)&lt;br/&gt;&lt;small&gt;&lt;small&gt;&lt;a href='http://www.communicopia.com/blog/joomla-versus-drupal'&gt;http://www.communicopia.com/blog/joomla-versus-drupal&lt;/a&gt;&lt;br/&gt;&lt;a href='http://www.topnotchthemes.com/blog/090224/drupal-vs-joomla-frank-comparison-ibm-consultant'&gt;http://www.topnotchthemes.com/blog/090224/drupal-vs-joomla-frank-comparison-ibm-consultant&lt;/a&gt;&lt;/small&gt;&lt;/small&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=19f0c20b-f508-4083-81f4-020cbbd2cd5b' class='zemanta-pixie-img'/&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/22096748-6559433178060948699?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/6559433178060948699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=6559433178060948699' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/6559433178060948699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/6559433178060948699'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2009/03/drupal-vs-joomla_6909.html' title='Drupal vs. joomla'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-7518776436698109261</id><published>2009-02-24T16:57:00.003+07:00</published><updated>2009-02-24T16:57:51.652+07:00</updated><title type='text'>NicEdit saving ajax</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;NicEdit is a nice WYSIWYG editor,  very compact and fast to load &lt;br/&gt;&lt;br/&gt;The code is quite nice and I was very impressed to check the page of his author young brilliant guy, hopes he keeps with the good work&lt;br/&gt;&lt;br/&gt;One detail that I missed in this editor is ajax saving functionality, a button in the panel anyway is not useful for us as the editor is part of a bigger form.&lt;br/&gt;&lt;br/&gt;So before collecting the values using a generic function we can update the content of the transformed text areas using this code:&lt;br/&gt;&lt;br/&gt;for (var i=0; i &amp;lt; nicEditors.editors.length; i++)&lt;br/&gt;{&lt;br/&gt;        nicEditors.editors[i].instanceById(nicEditors.editors[i].nicInstances[i].e.name).saveContent();&lt;br/&gt;}&lt;br/&gt;// Your normal functions&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;This solution only applies for textareas converted to WYSIWYG&lt;br/&gt;&lt;br/&gt;One advantage of this function is that we don't need to hold a reference from the moment we create the controls. Perhaps there's a more elegant syntaxis, but the straight reference by index didn't work well :)&lt;br/&gt;&lt;br/&gt;Hope someone finds this useful&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=c4e6ece9-38fe-48af-8e52-43a413c6ab51' class='zemanta-pixie-img'/&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/22096748-7518776436698109261?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/7518776436698109261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=7518776436698109261' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/7518776436698109261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/7518776436698109261'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2009/02/nicedit-saving-ajax.html' title='NicEdit saving ajax'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-1618437758725219712</id><published>2009-02-17T15:27:00.001+07:00</published><updated>2009-02-17T15:27:49.435+07:00</updated><title type='text'>PHP Removing an element from an array</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;A good function to remove an element from an array (Not last element as array_pop will do) but an element which value we know, but not the index.&lt;br/&gt;&lt;br/&gt;http://www.bin-co.com/php/scripts/array_remove.php&lt;br/&gt;&lt;br/&gt;Nice and compact!&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=85cf8d10-24fb-47e0-9368-f2e904964990' class='zemanta-pixie-img'/&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/22096748-1618437758725219712?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/1618437758725219712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=1618437758725219712' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/1618437758725219712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/1618437758725219712'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2009/02/php-removing-element-from-array.html' title='PHP Removing an element from an array'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-113939677086950408</id><published>2006-02-08T18:06:00.000+07:00</published><updated>2006-02-10T14:01:20.550+07:00</updated><title type='text'>Java. II Understanding the mess</title><content type='html'>Java. Understanding the mess.&lt;br /&gt;&lt;br /&gt;Yesterday in my previous blog, I talked a lot about my initial considerations on Data storage and object persistence, today I’ll keep a more scientific track (ordered and documented) on my re-discovery trough the Java world.&lt;br /&gt;&lt;br /&gt;I think this might be useful for people that get suddenly immerged in working in Java in enterprise wide projects, or to beginners wanting to understand the mess this environment has become.&lt;br /&gt;&lt;br /&gt;Why I consider myself qualified to do this? Well.. I don’t, but there is no option, I have to do it :D, second I have long time experience programming and designing system, analysis, architectures, etc. I program in Java, .Net, all older Microsoft technologies, PHP, CGI, JavaScript, DHTL, XML, XSL, etc.. Well that can show you how a programmer can go trough so many places and still be so ignorant!&lt;br /&gt;&lt;br /&gt;Time to work!&lt;br /&gt;&lt;br /&gt;Ok, the first step, understanding precisely where each technology plays, when exactly do you have to forget the classes and start using struts, or JSP, or Java Beans, or enterprise Java Beans, or Entity Java Beans, or Session beans.. or any other of those fantastic terms.&lt;br /&gt;&lt;br /&gt;First thing is to understand Java environment is full of very creative people, not only in the field of programming but also in the name-a-product-technology-standard game! They always manage to come with a fantastic cute mysterious sounding name for everything, in this respect I think .Net is more serious, you have classes, where and how you use them is up to you, they don’t develop amazing names for them on each situation, you use to have COM, DCOM, DCOM+ easy to follow right? Well first resource to understand this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://struts.apache.org/struts-action/userGuide/preface.html#suspects"&gt;http://struts.apache.org/struts-action/userGuide/preface.html#suspects&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;An amazing page made by the people of struts/apache project.&lt;br /&gt;&lt;br /&gt;So let me quote some parts of this page and extend my opinion, sorry if I’m not supposed to quote, just email me and I’ll take it out.&lt;br /&gt;&lt;br /&gt;So first READ IT, don’t be that lazy!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Technologies in the Java World.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;* Second part of this saga, does not include a lot on frameworks or persistence options.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Java&lt;/strong&gt;. An object oriented language, we are talking about, for info go to java.sun.com&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Application frameworks. &lt;/strong&gt;An environment tight or loose in which Classes (with all the funny names and changes) run together, this framework will provide extra services (pooling, persistence, security) and increased performance, , etc.&lt;br /&gt;&lt;br /&gt;This frameworks according to this research so far can be:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Lightweight (see POJOS, Spring)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Heavyweight (see EJB 2.0)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Mix (supposedly EJB 3.0)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The difference basically in the fact that the classes can run only in the container or if they can run alone and be coupled together.&lt;br /&gt;&lt;br /&gt;More on frameworks in the next blog.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Spring.&lt;/strong&gt;&lt;br /&gt;A lightweight application framework for POJOs. The main advantage is that the objects are loosely coupled and can be tested outside the environment.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;POJOs. &lt;/strong&gt;Another funny-cutie name, really who make this? Meaning: Plain-Old Java Objects. My personal favorites.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;JavaBeans. &lt;/strong&gt;Component architecture for the Java 2 Platform, Standard Edition (J2SE). Components (JavaBeans) are reusable software programs that you can develop and assemble easily to create sophisticated applications.&lt;br /&gt;&lt;br /&gt;Ok so let’s get simple:&lt;br /&gt;JavaBeans is a component model, and the components need to run in a container like beanBox (for developing) many commercial servers for production sites.&lt;br /&gt;&lt;br /&gt;Information however is somehow confusing, a Java Bean is not the same as an EJB Enterprise Java Bean, they are guided by different specifications, Java Beans are supposed to run on the client and EJB on the server, but surprise!! There are EJB Components (server) and EJB objects (client that remotely executes EJB component methods.&lt;br /&gt;&lt;br /&gt;Resuming, simple things Beans, Components and Distributed Components: EJB. An EJB running on the client will be a remote interface invoking methods in a counterpart EJB running on the server. (COM, DCOM, Component services ring a bell?)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:85%;"&gt;From Sun:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:85%;"&gt;Is JavaBeans a complete component architecture?&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;JavaBeans is a complete component model. It supports the standard component architecture features of properties, events, methods, and persistence. In addition, JavaBeans provides support for introspection (to allow automatic analysis of a JavaBeans component) and customization (to make it easy to configure a JavaBeans component).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;More info on:&lt;br /&gt;&lt;a href="http://java.sun.com/products/javabeans/"&gt;http://java.sun.com/products/javabeans/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/products/javabeans/faq/faq.general.html"&gt;http://java.sun.com/products/javabeans/faq/faq.general.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Enterprise Java beans. EJB&lt;/strong&gt;&lt;br /&gt;Version 2.0&lt;br /&gt;Components that have to run in a EJB container system&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;EJB is designed to create easy applications, this is done by providing a framework that does, threading, load balancing, transaction and resource management, versioning, scalability, mobility, persistence, and security, so the bean (component) will only attend to its own functionality, (wow! This is revolutionary! Come on...)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;EJB implements a remote interface (DCOM where are you!)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;EJB Query language exist.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Enterprise JavaBeans (EJB) technology is the server-side component architecture for the Java 2 Platform, Enterprise Edition (J2EE) platform. EJB technology enables rapid and simplified development of distributed, transactional, secure and portable applications based on Java technology. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are 3 types of EJB Session, entity and now MessageDrivenBeans, entity and now MessageDrivenBeansand now MessageDrivenBeans&lt;br /&gt;&lt;br /&gt;Read more&lt;br /&gt;&lt;a href="http://java.sun.com/products/ejb/index.jsp"&gt;http://java.sun.com/products/ejb/index.jsp&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.javaworld.com/jw-10-1998/jw-10-beans.html"&gt;http://www.javaworld.com/jw-10-1998/jw-10-beans.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;MessageDrivenBean&lt;/strong&gt;&lt;br /&gt;A bean (component) designed to handle asynchronous JMS Message (Java Message Service)Message (Java Message Service)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;EJB 2.0 supports the integration of JMS in two ways: as a resource available to beans and as a &lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;MessageDrivenBean&lt;/span&gt;&lt;span style="font-size:85%;"&gt;. When JMS is used as a resource, the bean using the JMS API is a message producer or sender. In that case, the bean is sending messages to a virtual channel called a &lt;/span&gt;&lt;em&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;topic &lt;/span&gt;&lt;/em&gt;&lt;span style="font-size:85%;"&gt;or &lt;/span&gt;&lt;em&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;queue&lt;/span&gt;&lt;/em&gt;&lt;span style="font-size:85%;"&gt;. A &lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;MessageDrivenBean&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, on the other hand, is a message consumer or receiver. It listens to a specific virtual channel (topic or queue), and handles messages delivered to that channel. To better understand the roles of both message producers and consumers, a &lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;SessionBean &lt;/span&gt;&lt;span style="font-size:85%;"&gt;bean is used to send a message using JMS and then a new &lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;MessageDrivenBean &lt;/span&gt;&lt;span style="font-size:85%;"&gt;is used to consume that same message. &lt;/span&gt;&lt;a href="http://www.javaworld.com/javaworld/jw-06-2000/jw-0609-ejb-p3.html"&gt;source&lt;/a&gt;&lt;strong&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Session beans&lt;/strong&gt;&lt;br /&gt;Trivial not persist-worthy components (classes, beans EJB), normally linked to one session and destroyed at the end. There will normally be many instances of this object (1 per session)&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Session beans represent the business services and are not shared between users. A session bean provides coarse-grained service methods when implemented per the Session Facade pattern. &lt;/span&gt;&lt;a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html"&gt;Source&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Entity beans&lt;/strong&gt;&lt;br /&gt;Represent information stored in the database, provides access to multiple users, survives a session (is permanent).&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Entity beans, on the other hand, are multiuser, transactional objects representing persistent data. An entity bean exposes the values of attributes by providing an accessor method (also referred to as a &lt;/span&gt;&lt;em&gt;&lt;span style="font-size:85%;"&gt;getter &lt;/span&gt;&lt;/em&gt;&lt;span style="font-size:85%;"&gt;or &lt;/span&gt;&lt;em&gt;&lt;span style="font-size:85%;"&gt;get method&lt;/span&gt;&lt;/em&gt;&lt;span style="font-size:85%;"&gt;) for each attribute it wishes to expose. &lt;/span&gt;&lt;a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html"&gt;Source&lt;/a&gt;&lt;strong&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Java Message Service JMS&lt;/strong&gt;&lt;br /&gt;JMS is a vendor agnostic API for accessing messaging systems.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;JMS lets you send messages from one JMS client to another through a messaging service, sometimes called a message broker or router. A message is a type object in JMS, which has two parts: a header and a message body. The header is composed of routing information and metadata about the message.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Servlets.&lt;/strong&gt;&lt;br /&gt;A purpose specific class that works with the HTTP mechanism (web).&lt;br /&gt;In Java slang, “is an applet that runs on the server”&lt;br /&gt;Servlets needs to run inside a container or framework and this one will manage the HTTP and lifecycle.&lt;br /&gt;Logically the purpose of a servlet must be related to web actions and not pure logic.&lt;br /&gt;&lt;a href="http://www.novocode.com/doc/servlet-essentials/"&gt;http://www.novocode.com/doc/servlet-essentials/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;JSP.&lt;/strong&gt;&lt;br /&gt;I like the page definition: “JSP as inside-out servlets”.&lt;br /&gt;JSP are simply dynamic pages in the way of old asp or php, alas HTML pages with dynamic sections inserted to be parsed and executed. JSP however are compiled as servlets.&lt;br /&gt;JSP can use Beans JSLT and other tag libs. Same as ASP was able to use COM, DCOM, COM+ objects not so fresh stuff eh? PHP? Well, can use anything.. Same as ASP was able to use COM, DCOM, COM+ objects not so fresh stuff eh? PHP? Well, can use anything..&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Java says: “JSP technology is part of the Java technology family. JSP pages are compiled into servlets and may call JavaBeans components (beans) or Enterprise JavaBeans components (enterprise beans) to perform processing on the server. As such, JSP technology is a key component in a highly scalable architecture for web-based applications.”&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Java Server Face (JSF)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;A presentation layer technology, a framework for java to produce user-interfaces.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;JavaServer Faces technology simplifies building user interfaces for JavaServer applications. Developers of various skill levels can quickly build web applications by: assembling reusable UI components in a page; connecting these components to an application data source; and wiring client-generated events to server-side event handlers&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;JavaServer Faces technology includes: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;A set of APIs for representing UI components and managing their state, handling events and input validation, defining page navigation, and supporting internationalization and accessibility. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;A JavaServer Pages (JSP) custom tag library for expressing a JavaServer Faces interface within a JSP page. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;a href="http://java.sun.com/j2ee/javaserverfaces/overview.html"&gt;Source&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Struts&lt;/strong&gt;&lt;br /&gt;An MVC web application framework that includes:web application framework that includes:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Request lifecycle centralized processing&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Robust support for localizing&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A set of custom JSP tags&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tiles framework for templates&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Validator framework, for client and server.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;strong&gt;JSF vs Struts&lt;/strong&gt;&lt;br /&gt;As struts and Java Server faces overlap the View side of the MVC it seems like they are competing, however struts is more than the view is also the M and the C right? Well, right, the HTTP management and the validation plus the tiles. There is also advocates of taking out Struts and use Spring framework.&lt;br /&gt;* More on this on tomorrow blog. Frameworks comparison.&lt;br /&gt;&lt;a href="http://blogs.sun.com/roller/page/craigmcc?entry=struts_or_jsf_struts_and"&gt;There is a very interesting blog from the Strut creator talking about this have a look.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;MVC. Model View Controller&lt;/strong&gt;&lt;br /&gt;A design pattern to be able to provide content to different clients or user-interface types, its a Presentation Abstraction Technique, which means makes the presentation layer independent of the business and the data layer.&lt;br /&gt;Simple, some users will browse using computer, other PDA, another mobile, other one something else, therefore, HTML, WML, XML, Swing, etc. and MVC will handle the middle part.&lt;br /&gt;&lt;br /&gt;Operates like:&lt;br /&gt;&lt;strong&gt;Model&lt;/strong&gt;. Enterprise data and business rules, together normally represents a real-world process or scenario.&lt;br /&gt;&lt;strong&gt;View&lt;/strong&gt;. A render of the content of a model. Accesses the data and present it.&lt;br /&gt;&lt;strong&gt;Controller&lt;/strong&gt;. The middle tier that translates the interactions with the view to actions in the Model, i.e. If the user clicks a button (interaction) the final result is to delete a record (action in the model)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Tag libraries.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;There are many kind of tags, tags are simply speaking pieces of code that you don’t want to repeat, you make a tag, and with all your tags a tag library.&lt;br /&gt;&lt;br /&gt;There are many flavors like: Custom tags, JSLT, JSP tags, Jakarta Taglibs, Struts Layout, Display Tags.&lt;br /&gt;&lt;br /&gt;However After seeing this page on &lt;a href="http://java.sun.com/developer/onlineTraining/J2EE/Intro2/jsp_tags/jsptags.html"&gt;Custom JSP Tag Libraries&lt;/a&gt; I have no idea why I would like to use them, but ok, let’s say that I have seen similar things in the past. At this moment I would say, make a bean! Or a POJO :D (still makes me laugh). But let’s check the tag libraries.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/developer/onlineTraining/J2EE/Intro2/jsp_tags/jsptags.html"&gt;Sun&lt;/a&gt;&lt;span style="font-size:85%;"&gt;: Custom JSP tags, like standard JSP tags, are actions that encapsulate a certain reusable functionality and can be invoked by the JSP to perform those functions.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;And here : “The JavaServer Pages Standard Tag Library (JSTL) encapsulates as simple tags the core functionality common to many Web applications. JSTL has support for common, structural tasks such as iteration and conditionals, tags for manipulating XML documents, internationalization tags, and SQL tags. It also provides a framework for integrating existing custom tags with JSTL tags”&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/products/jsp/taglibraries/index.jsp"&gt;From java.sun&lt;/a&gt;&lt;span style="font-size:85%;"&gt;: JavaServer Pages (JSP) tag libraries define declarative, modular functionality that can be reused by any JSP page. Tag libraries reduce the necessity to embed large amounts of Java code in JSP pages by moving the functionality of the tags into tag implementation classes. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ant&lt;/strong&gt;&lt;br /&gt;After discovering the big mess compiling Java is, they gave the world Ant, a building script tool that compiles and copy files using a descriptor file (in xml)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;XML Parsing and processing:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SAX, DOM, others&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;There are plenty of technologies, projects and efforts, basically XML parsing is made in all languages using either a lightweight parser that retrieves nodes, or by heavier models that let you manipulate the tree or use expressions to search for nodes&lt;br /&gt;&lt;br /&gt;There are many flavors in Java to choose from, I think this XML parser API Feature summary can Help you (&lt;a href="http://java.sun.com/webservices/docs/1.6/tutorial/doc/index.html"&gt;http://java.sun.com/webservices/docs/1.6/tutorial/doc/index.html&lt;/a&gt;)&lt;br /&gt;Table 3-1 XML Parser API Feature Summary (look down blogger being weird..)&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Feature&lt;/td&gt;&lt;td&gt;StAX&lt;/td&gt;&lt;td&gt;SAX&lt;/td&gt;&lt;td&gt;DOM&lt;/td&gt;&lt;td&gt;TrAX&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;API Type &lt;/td&gt;&lt;td&gt;Pull, streaming &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Push, streaming &lt;/td&gt;&lt;br /&gt;&lt;td&gt;In memory tree &lt;/td&gt;&lt;br /&gt;&lt;td&gt;XSLT Rule &lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Ease of Use &lt;/td&gt;&lt;br /&gt;&lt;td&gt;High &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Medium &lt;/td&gt;&lt;br /&gt;&lt;td&gt;High &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Medium &lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;XPath Capability &lt;/td&gt;&lt;br /&gt;&lt;td&gt;No &lt;/td&gt;&lt;br /&gt;&lt;td&gt;No &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;CPU and Memory Efficiency &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Good &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Good &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Varies &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Varies &lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Forward Only &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;br /&gt;&lt;td&gt;No &lt;/td&gt;&lt;br /&gt;&lt;td&gt;No &lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Read XML &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Write XML &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;br /&gt;&lt;td&gt;No &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Create, Read, Update, Delete &lt;/td&gt;&lt;br /&gt;&lt;td&gt;No &lt;/td&gt;&lt;br /&gt;&lt;td&gt;No &lt;/td&gt;&lt;br /&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;br /&gt;&lt;td&gt;No &lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Other common terms  (related to java but not from Java)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Threads&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Xml&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Property files&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Request, response, cookies, headers.&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Sessions&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Internationalization&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Templates&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;XSL&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well enough for today tomorrow, I’ll explore, applications frameworks and persistence frameworks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22096748-113939677086950408?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/113939677086950408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=113939677086950408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/113939677086950408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/113939677086950408'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2006/02/java-ii-understanding-mess.html' title='Java. II Understanding the mess'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22096748.post-113933342969650636</id><published>2006-02-08T00:30:00.000+07:00</published><updated>2006-02-08T13:55:03.116+07:00</updated><title type='text'>Java. Choosing the right DB persistence tools</title><content type='html'>Or: Getting programmers to loose time and control..&lt;br/&gt;&lt;br/&gt;Actively programming on PHP and developing my own framework for RAD (rapid Application Development)&amp;nbsp;&amp;nbsp;I enjoy the opportunity to from the ground build up a collection of services and classes that interact together to create powerful applications in very little time.&lt;br/&gt;&lt;br/&gt;I found some very advanced programmers who kindly publish their own framework ideas enriching my knowledge and opening further possibilities for it, and then! It happened..&lt;br/&gt;&lt;br/&gt;A friend/partner ask me for some help on Hibernate to use in Java..&lt;br/&gt;&lt;br/&gt;I tend to respect Java developers as normally they are very qualified people (overqualified sometimes :D) working with approaches that are far more OO than the ones we normally see in other platforms.&lt;br/&gt;&lt;br/&gt;Anyway and very probably caused by my ignorance I fall again into a nightmare of terms, (very interesting I have to recognize) but anyway, far too many for a healthy environment.&lt;br/&gt;&lt;br/&gt;Hibernate, Jboss, Spring, Cocoon, castor, Struts of course!, Java beans, Enterprise Java Beans, Entity Java Beans, iBatis, JFC, JDBC, JSP, action files, ANT, thousands of XML configuration files, Velocity, EJB, POJO (I love this one) etc...&lt;br/&gt;&lt;br/&gt;As a good point I must say that I found Java to be a very rich platform with some work done in any direction you want to move, on the other hand I think many of this ideas have loose some clarity in their purpose.&lt;br/&gt;&lt;br/&gt;Today I’ll focus my concerns in DB storage and object persistence. Basically JDBC, Hibernate, iBatis. And please remember all my opinions are based on pure ignorance!, As I explore more on each one of this I’ll post my findings to extend the diffusion of my lack of knowledge!&lt;br/&gt;&lt;br/&gt;I consider myself a very lazy programmer, I have coding even 2 lines twice, so I tend to end up with a collection of classes, functions, generators and snippets for every repeating activity I don’t want to ever make again, and something I enjoy is being able to control what is happening with my code! &lt;br/&gt;&lt;br/&gt;When I started reading that JDBC is not recommended better go for hibernate or other solution I was then really concerned!, I very much understand how fantastic is the idea behind hibernate, coupling the OO world and let someone else care for the data is good. But how much control over the code is good to sacrifice? &lt;br/&gt;&lt;br/&gt;Of course it can be noted here that there is a big win once the initial burden is passed, and that there is great control on everything using the XML config files, True.., but don’t get me.. &lt;br/&gt;I think one day there was some great programmers working together they were being lazy to think some basic storage logic and to write 5 SQL sentences, so they decide to find a new mechanism for doing that, then they tried to grow it universal and complexity raised, they include multidabase, any project any data, and at the end... Hibernate! &lt;br/&gt;&lt;br/&gt;Hibernate also seems very logical considering that Java seems to work all the way forgetting completely about DB, something you can notice in the fact that when learning most programming languages, the 2d or 3d step is to connect to DB and from there you grow the rest, and in Java, well there’s lots of tutorials and even complete books that deal with all aspects of Java and never even mention a DB, or JDBC.&lt;br/&gt;&lt;br/&gt;But well anyway... I prefer writing the SQL’s that fighting the XML’s and then still not being able to control the application!, Now even worse, I read that for some operations involving lots of data better to use something else to complement the solution as performance on bulk data is not good.. hey but wait. I don’t control the data! I’m not even supposed to care how’s stored, unless of course I first design the tables and start from the bottom, but if I’ll do this, what’s the purpose of a high level tool as hibernate?&lt;br/&gt;&lt;br/&gt;So here in my inexpert eyes the problem is like this: Top-down solution, I create my application using real OO (object oriented) I forget data, and I leave it to hibernate, cool but if then I need to attack my data directly mmhhh.. not like, this bring me some concerns about the integrity of the information, personally when I have made the storage procedures to preserve my classes I make an explicit announce to fellow programmers and final users, “You mess with the tables I’m not responsible” why? Because I ensure in the classes that the data is consistent!, Isn’t that the purpose of a class that works with data? Or actually of any class? Don’t we have get/set methods to avoid having ‘stupid’ public vars that doesn’t allow us to make verification, validation and processing when required? Then if I let hibernate take care of this, I should NEVER mess in!, unless is too inefficient with massive amounts of information.&lt;br/&gt;&lt;br/&gt;Then the second alternative, I create the DB and I start from the bottom-up, then.. where is the OO approach? I mean this is a data access object of specific purpose, this is a table representing object, but excuse me, I have never being in a meeting analyzing a problem a customer have and listen they mention tables.. they mention customers, orders, deliveries, users, departments, production lines, etc.. tables? Well some make furniture :P; So, of course, you can include table objects to make good programming and then put your business rules, logical, OO solution classes on top, but if your OO is for making objects for each table, well, I wouldn’t consider then this solution a proper Hibernate one. The purpose have changed, now I’m making data access objects, not object oriented programming with object persistency.&lt;br/&gt;&lt;br/&gt;A rather poor other explanation is that there is a lot of boilerplate code every time you access a database so better use another solution.&lt;br/&gt;True, but there is also a lot of boiler plate repeating code in many other tasks, and what do we do? We create classes and functions to attend them!, what I call functional or service classes (classes that doesn’t represent entities of the problem, but serve specific purposes in the system).&lt;br/&gt;&lt;br/&gt;So of course only a silly programmer will every time he make an insert will code everything, and then only a very hard working one will implement the error handling routines, transactions, etc..&lt;br/&gt;&lt;br/&gt;Then you have many databases available ahh! What a nightmare... but wait.. PHP developers handle the same problem, how they do?&lt;br/&gt;&lt;br/&gt;Well I’m not advocating here for not using Hibernate or other solution because anyway I’ll use them (customer commands!)&lt;br/&gt;&lt;br/&gt;JDBC Handles the task of connecting to any database of course getting the proper drivers and configuration, so we have no initial boundaries, then we should never hardcode db access so in a system wide XML file can provide this info, like&lt;br/&gt;&amp;lt;DatabaseConnection&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Type/&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp; &amp;lt;ConnectionString /&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp; &amp;lt;User /&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Pwd /&amp;gt;&lt;br/&gt;&amp;lt;/DatabaseConnection&amp;gt;&lt;br/&gt;&lt;br/&gt;* This is not a real schema just making ideas more self explanatory :D&lt;br/&gt;&lt;br/&gt;Then you have to deal with all that ugly horrible repeating code..!!&amp;nbsp;&amp;nbsp;really? Why not just develop a class for that? A connection can be shared by any instance of this class and then offer a simple list of SQL events.&lt;br/&gt;&lt;ul&gt;&lt;li&gt;ExecuteSQL&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Insert&lt;/li&gt;&lt;br/&gt;&lt;li&gt;getRst&lt;/li&gt;&lt;br/&gt;&lt;li&gt;getValue&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;The real list will go bigger as some methods can be directly mapped but for starting this will provide:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;ExecuteSQL, Any SQL which returns a success/fail result, inserts, deletes, updates.&lt;/li&gt;&lt;br/&gt;&lt;li&gt;InsertSQL, Insertion SQLs that will get back the new Autogenerated ID&lt;/li&gt;&lt;br/&gt;&lt;li&gt;getRst, Will return a resultset, recordset or however you want to call&lt;/li&gt;&lt;br/&gt;&lt;li&gt;getValue, Similar, use to retrieve a single value from the DB example count(*) or get a parameter.&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;This getValue is an example of a little bit more complex method, as it will parse the resultset extract the information and return just a value, so nice and easy. &lt;br/&gt;Other methods Update, Delete, Insert for very specific functionalities can be implemented, taking out from the programmers all requirements of knowledge of SQL and DB and internally calling ExecuteSQL internally.&lt;br/&gt;&lt;br/&gt;This classes can be created per database implementing a common interface, which means, you develop the one you need, next project need another DB? Make the same with the other DB, must of the times, I think changes will be very small if existing! And in runtime you can dynamically call the right one using: DatabaseConnection.Type value.&lt;br/&gt;&lt;br/&gt;Once you have a class of similar functionality, (accessing the DB, retrieving data and passing SQL statements) then you have already: transactions, try-catch blocks, and common code out of the equation! What is the next big problem?&lt;br/&gt;&lt;br/&gt;Representing a table (notice, not a class) as I said if this is real OO cool if this is only to make objects out from tables, that’s different, maybe then iBatis is the tool but haven’t yet tested.&lt;br/&gt;&lt;br/&gt;Well I think this is very common task, and as someone pointed out somewhere, tables are collections of records, this class will represent the whole rather than the element. Maybe better have a couple of classes, one that represent a record, as after all this will be a better approach as the record, i.e. user, will represent a complex set of data therefore very well represented by a class; and another class to represent the whole collection, with listing, searches, and addition of new records, as well as massive updates, deletes, etc. &lt;br/&gt;&lt;br/&gt;This classes indeed once you program the first or the second you’ll notice all are the same, different properties but all the same. Because at the end, all are tables right? So being this Java why not having a super class or a common interface for them? Or the other lazy approach.. why not making a simple generator? Amount of XML none, configuration none, SQL’s to learn none, hQL language none, quality of code? As good as you are, and the best absolute control, grained personalization capabilities, and as you are generating code then is up to you how far you take each.&lt;br/&gt;&lt;br/&gt;But what happens when someone modify the class and then the table and the class has to be regenerated? You loose everything, true, I can foresee 2 options, 1) be careful :P 2) Extend the class into another one and do whatever you need.&lt;br/&gt;&lt;br/&gt;About performance and scalability well I think as long as you put the classes to run in the same container or alone they will at least no behave worse than the other ones.&lt;br/&gt;&lt;br/&gt;Final result, no boilerplate code, no performance issues, all SQL passing trough a single place, easy to control easy to debug, and easy to enrich in the future, developers will not loose time in this instead of important things because anyway this will be nearly automatic.&lt;br/&gt;&lt;br/&gt;And the biggest beauties: You will know exactly what’s happening in your application and you will not have an infinite collections of XML’s mapping references and other million things,&lt;br/&gt;&lt;br/&gt;You might point out that there are fantastic GUI’s that do all the magic of the XML and then hibernate is a drag and drop activity, well sounds to me very Microsoft, I personally hate code generators and tools that took me away from the code and force me to learn their own paradigm, simple example .Net they took out the super easy request, response, etc.. object model to engage you in their ASPX pages so the VB programmers can do without troubles (My specialty was VB :D) and then when you want to automate tasks, generate forms on the fly, controls, etc.. you just discover that you have to traverse the .net universe they make with their rules. Result: too complex, too time consuming and end of the day unnecessary!&lt;br/&gt;&lt;br/&gt;We will end up in assembler? No I’m not a fanatic, but simplification has its limits, and the main one is, when simpler gets complicated well... is not anymore simpler :D&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22096748-113933342969650636?l=edgebenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edgebenders.blogspot.com/feeds/113933342969650636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22096748&amp;postID=113933342969650636' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/113933342969650636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22096748/posts/default/113933342969650636'/><link rel='alternate' type='text/html' href='http://edgebenders.blogspot.com/2006/02/java-choosing-right-db-persistence.html' title='Java. Choosing the right DB persistence tools'/><author><name>itzco</name><uri>http://www.blogger.com/profile/13441923073238422859</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
