<?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-19764600</id><updated>2011-12-03T17:33:29.228Z</updated><category term='mobile'/><category term='componentization'/><category term='technology'/><category term='wiki'/><category term='GWT'/><category term='quilt'/><category term='dom'/><category term='javascript'/><category term='SQL'/><category term='encoding'/><category term='bugs'/><category term='C'/><category term='web applications'/><category term='social'/><category term='self-extracting'/><category term='events'/><category term='GNU'/><category term='SOA'/><category term='IDE'/><category term='aboutme'/><category term='phone'/><category term='issue traking systems'/><category term='browsers'/><category term='HTTP'/><category term='firefox'/><category term='applications'/><category term='filesystems'/><category term='specs'/><category term='opensource'/><category term='git'/><category term='public key cryptography'/><category term='clothing'/><category term='licensing'/><category term='debian'/><category term='open'/><category term='unicode'/><category term='eclipse'/><category term='blogs'/><category term='hardware'/><category term='database'/><category term='backup'/><category term='linux'/><category term='xml'/><category term='office'/><category term='java'/><category term='authentication'/><category term='REST'/><category term='UTF-8'/><category term='boycott'/><category term='security'/><category term='politics'/><category term='programming'/><category term='document'/><category term='information'/><category term='CVS'/><category term='openssl'/><category term='BPM'/><category term='format'/><category term='communication'/><category term='bookmarks'/><category term='activities'/><category term='web services'/><category term='fashion'/><category term='API'/><category term='networking'/><category term='gui'/><category term='openssh'/><category term='archives'/><category term='versioning'/><category term='patents'/><category term='SOAP'/><category term='usb flash drive'/><category term='build'/><category term='software'/><category term='persistence'/><category term='orm'/><category term='reviewing'/><category term='microsoft'/><category term='standards'/><category term='date/time'/><category term='question/answer social applications'/><category term='vcs'/><category term='json'/><category term='subversion'/><category term='google'/><title type='text'>edpeur public mind dump</title><subtitle type='html'>These articles are not meant to be considered chronologically but they are an always updated collection of my thoughts I want to share. (So this is not a log)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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>62</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-19764600.post-2957276696140235973</id><published>2010-08-14T11:30:00.002Z</published><updated>2010-08-14T11:43:22.955Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='usb flash drive'/><category scheme='http://www.blogger.com/atom/ns#' term='specs'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>The lack of specifications on commodity hardware</title><content type='html'>It has always bothered me the lack of specifications commodity hardware lacks.&lt;br /&gt;&lt;br /&gt;USB flash drives I tested:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.imation.com/en-us/Imation-Products/USB-Flash-Drives--Accessories/Atom-Flash-Drive/"&gt;imation atom flash drive&lt;/a&gt; 4GB writes at 731 KiB/s&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.verbatim.com/products/detail.cfm?product_id=CCE0CBE4-1143-3415-5F83A1CFD826FDAF&amp;amp;cat_id=827AE955-1143-3415-5FD16D44ABF63B74"&gt;Verbatim TUFF-'N'-TINY™  4GB&lt;/a&gt; writes at 100 KiB/s&lt;/li&gt;&lt;/ul&gt;You can see for similarly priced products the big performance difference there is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-2957276696140235973?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/2957276696140235973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=2957276696140235973' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/2957276696140235973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/2957276696140235973'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2010/08/lack-of-specifications-on-commodity.html' title='The lack of specifications on commodity hardware'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-6481748973684794278</id><published>2009-12-19T17:24:00.004Z</published><updated>2010-03-01T22:09:41.910Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='question/answer social applications'/><title type='text'>On Question/Answer social applications</title><content type='html'>I really like question answer social applications like &lt;a href="http://stackoverflow.com/"&gt;StackOverflow.com&lt;/a&gt; because most of the times they are a better alternative to a forum. One of the creators &lt;a href="http://www.joelonsoftware.com/"&gt;Joel Spolsky&lt;/a&gt; explains the success at &lt;a href="http://www.youtube.com/watch?v=NWHfY_lvKIQ"&gt;Learning from StackOverflow.com&lt;/a&gt; video.&lt;br /&gt;The ideas that make StackOverflow.com so great are summarized at:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Voting: There needs to be a way to rank answers to a question up or down so you can see the best answer the first.&lt;/li&gt;&lt;li&gt;Tags: Hierarchical categorizing fails where tagging works wonderfully.&lt;/li&gt;&lt;li&gt;Editing: You need to be able to edit both questions and answers so they do not become obsolete.&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/badges"&gt;Badges&lt;/a&gt;: Users should gain status by completing actions on the site that gain knowledge on the site features and make people use them.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Karma: Users should gain status by asking good questions and replying with good answers.&lt;/li&gt;&lt;li&gt;Pre-search: Asking a question needs a search first. It really prevents duplicates.&lt;/li&gt;&lt;li&gt;Google is UI: Google should be able to index the whole site for users to access questions.&lt;/li&gt;&lt;li&gt;Performance: A performant site is used.&lt;/li&gt;&lt;li&gt;Critical Mass: Users will only use sites that trust on. And stackoverflow.com was developed by two very influential IT bloggers.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-6481748973684794278?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/6481748973684794278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=6481748973684794278' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/6481748973684794278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/6481748973684794278'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2009/12/on-questionanswer-social-applications.html' title='On Question/Answer social applications'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-4232334564192105872</id><published>2009-07-12T15:10:00.005Z</published><updated>2009-11-28T05:10:50.891Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='UTF-8'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><title type='text'>Web Applications should always use UTF-8 charset</title><content type='html'>I have seen that iso-8859-1 encoding in HTTP is broken as &lt;a href="http://www.w3.org/International/iri-edit/draft-duerst-iri.html"&gt;some "genius" from Microsoft&lt;/a&gt; decided to encode non iso-8859-1 characters using HTML entity encoding without using proper escaping, thus making non  iso-8859-1 characters unusable and iso-8859-1 encoding for web applications not useful. &lt;a href="http://niwo.mnsys.org/saved/%7Eflavell/charset/form-i18n.html"&gt;FORM submission and i18n&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Being &lt;a href="http://en.wikipedia.org/wiki/Windows-1252"&gt;Windows-1252&lt;/a&gt; a superset of &lt;a href="http://en.wikipedia.org/wiki/ISO/IEC_8859-1"&gt;iso-8859-1&lt;/a&gt; has made every browser and most other programs interpret &lt;a href="http://en.wikipedia.org/wiki/Windows-1252"&gt;Windows-1252&lt;/a&gt; when &lt;a href="http://en.wikipedia.org/wiki/ISO/IEC_8859-1"&gt;iso-8859-1&lt;/a&gt; is specified. Even the HTML5 standard states that iso-8859-1 should be interpreted as Windows-1252.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Apache_Tomcat"&gt;Apache Tomcat&lt;/a&gt; needs to use UTF-8 instead of   iso-8859-1 by default. Here are some tips on working around this bad Tomcat default: &lt;a href="http://wiki.apache.org/tomcat/Tomcat/UTF-8"&gt;Tomcat/UTF-8&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Always use UTF-8 as the encoding of any HTML page and especially of Web Applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-4232334564192105872?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/4232334564192105872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=4232334564192105872' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4232334564192105872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4232334564192105872'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2009/07/web-applications-should-always-use-utf.html' title='Web Applications should always use UTF-8 charset'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-8661458395131368950</id><published>2009-04-18T13:44:00.000Z</published><updated>2009-04-25T13:52:27.478Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bookmarks'/><title type='text'>On Web bookmarking</title><content type='html'>The use cases I need for a web bookmarking application are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Quick button or key combination to bookmark an URL.&lt;/li&gt;&lt;li&gt;Review bookmarks for obsolescence. Each bookmark should be checked periodically to find if the resource still exists and have a notification when it does not exist. Bookmarks should have attached a review date to be able to review bookmarks one by one.&lt;/li&gt;&lt;li&gt;Retitle bookmarks. (Many times the title on the page is not the one I want)&lt;/li&gt;&lt;li&gt;Classification. I do not like hierarchical classification because many bookmarks may own to more than one category and hierarchical classification can only have one folder structure. (Example: low fat meals/fish or fish/low fat meals) (tags also have problems as it is common to tag an AJAX tutorial as "AJAX,JavaScript" but AJAX already contains JavaScript implicitly on it but I want to get that page when I look for the broader term like JavaScript resources)&lt;/li&gt;&lt;li&gt;As bookmarks refer to online resources they may only be accessed online, but I still need transparent backups in case the online resource that hosts my bookmarks accidentally removes them or just disappears.&lt;/li&gt;&lt;li&gt;Pending revision. I sometimes see something that I need to review but I still do not want to publish in my public bookmarks.&lt;/li&gt;&lt;/ul&gt;I am currently using &lt;a href="http://en.wikipedia.org/wiki/Delicious_%28website%29"&gt;delicious.com&lt;/a&gt; to host my public bookmarks, but that solution alone lacks reviewing and quick bookmark saving (unless you use the fat Firefox plugin).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-8661458395131368950?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/8661458395131368950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=8661458395131368950' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8661458395131368950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8661458395131368950'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2009/04/on-web-bookmarking.html' title='On Web bookmarking'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-5582330581307835357</id><published>2009-03-29T12:27:00.003Z</published><updated>2009-03-29T12:51:56.093Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><title type='text'>Blogs worth reading</title><content type='html'>This is a list of blogs I read and recommend:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.codinghorror.com/blog/"&gt;Jeff Atwood's programming and human factors blog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.joelonsoftware.com/"&gt;Joel on Software&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-5582330581307835357?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/5582330581307835357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=5582330581307835357' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5582330581307835357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5582330581307835357'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2009/03/blogs-worth-reading.html' title='Blogs worth reading'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-5115956047141062212</id><published>2009-03-17T10:18:00.015Z</published><updated>2010-01-18T23:04:30.370Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='filesystems'/><title type='text'>On filesystem usage patterns</title><content type='html'>The &lt;a href="https://bugs.edge.launchpad.net/ubuntu/+source/linux/+bug/317781"&gt;ext4 data loss bug&lt;/a&gt; leaved some changed files with zero size in the case of a crash, making the API not transactional. The bug was fixed, not in the side of the application, but in the &lt;a href="http://en.wikipedia.org/wiki/ext4"&gt;ext4&lt;/a&gt; code itself with fixes to other delayed allocation &lt;a href="http://en.wikipedia.org/wiki/File_system"&gt;filesystem&lt;/a&gt;s like &lt;a href="http://en.wikipedia.org/wiki/XFS"&gt;XFS&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Btrfs"&gt;BTRFS&lt;/a&gt; to maintain semantics compatibility. I started to think about use cases both in servers and laptops to investigate if the current &lt;a href="http://en.wikipedia.org/wiki/POSIX"&gt;POSIX&lt;/a&gt; API of Linux and if the internal Linux filesystems implementations cover these use cases as best as possible.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Copying, moving, creating or replacing a huge file while saving a minor setting or browsing the Internet should not ever block your GUI application noticeably.&lt;/li&gt;&lt;li&gt;Modifying a file should always leave either the old one or the new one. (but never a zero length file!)&lt;/li&gt;&lt;li&gt;Small file change (substitution) atomic. Transaction complete should be notified but can be delayed for some amount of time like when in laptop mode.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Writes on the hard drive should always transition stable states to prevent any loss of prior data. As much only recent changes should be lost but old data should always be preserved.&lt;/li&gt;&lt;li&gt;Streaming&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Relational_database_management_system"&gt;RDBMS&lt;/a&gt; tables&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.thinkwiki.org/wiki/Laptop-mode"&gt;Laptop-mode&lt;/a&gt;: the system should be able to delay writes to disk to save power by only spining the hard drive each few seconds.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-5115956047141062212?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/5115956047141062212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=5115956047141062212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5115956047141062212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5115956047141062212'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2009/03/on-filesystem-usage-patterns.html' title='On filesystem usage patterns'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-3737511000938817501</id><published>2009-03-11T20:26:00.007Z</published><updated>2009-03-23T20:59:01.019Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='archives'/><category scheme='http://www.blogger.com/atom/ns#' term='self-extracting'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>On Self-extracting archives</title><content type='html'>Microsoft is still favoring &lt;a href="http://en.wikipedia.org/wiki/Self-extracting_archive"&gt;self-extracting archive&lt;/a&gt;s over normal &lt;a href="http://en.wikipedia.org/wiki/File_archiver"&gt;archive&lt;/a&gt;s. They probably want to sustain the &lt;a href="http://en.wikipedia.org/wiki/Antivirus_software"&gt;antivirus software&lt;/a&gt; market by providing files capable of containing &lt;a href="http://en.wikipedia.org/wiki/Computer_virus"&gt;computer virus&lt;/a&gt;es and not having a &lt;a href="http://en.wikipedia.org/wiki/Sandbox_%28computer_security%29"&gt;sandbox&lt;/a&gt; to run these files by default in their &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Windows"&gt;badly designed "operating" systems&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Microsoft goes over to extremes like having a self-extracting &lt;a href="http://en.wikipedia.org/wiki/EXE"&gt;EXE file&lt;/a&gt; that contains a &lt;a href="http://en.wikipedia.org/wiki/Cabinet_%28file_format%29"&gt;CAB file&lt;/a&gt; that contains a &lt;a href="http://en.wikipedia.org/wiki/ZIP_%28file_format%29"&gt;ZIP file&lt;/a&gt; that contains the actual files (see for example &lt;a href="http://support.microsoft.com/kb/303436"&gt;Microsoft KB 303436&lt;/a&gt; where they distribute such a file) (maybe they are so clueless that they think developers do not know what a ZIP file is and how to unpack it)&lt;br /&gt;&lt;br /&gt;One way to prevent Microsoft incompetence (or maybe corruption) is to have in proper operating system never execute EXE files outside a sandbox and by default detect self-extracting archives (by file contents inspection instead of just only the file extension) and unpack them directly by the installed unarchiving software.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-3737511000938817501?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/3737511000938817501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=3737511000938817501' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/3737511000938817501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/3737511000938817501'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2009/03/on-self-extracting-archives.html' title='On Self-extracting archives'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-1107060619133858673</id><published>2009-03-01T17:09:00.012Z</published><updated>2009-04-03T22:25:45.699Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='patents'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Why compatibility with Microsoft may lead to legal problems</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Microsoft"&gt;Microsoft&lt;/a&gt; sued &lt;a href="http://en.wikipedia.org/wiki/TomTom"&gt;TomTom&lt;/a&gt; (&lt;a href="http://www.techflash.com/microsoft/Microsoft_sues_TomTom_over_patents_in_case_with_Linux_subplot_40305732.html"&gt;Microsoft sues TomTom over Linux and other patent claims&lt;/a&gt;) for patents like &lt;a href="http://www.patentstorm.us/patents/5579517.html"&gt;5,579,517&lt;/a&gt; and &lt;a href="http://www.patentstorm.us/patents/5758352.html"&gt;5,758,352&lt;/a&gt;: "Common name space for long and short filenames". When TomTom was just using the badly designed &lt;a href="http://en.wikipedia.org/wiki/File_Allocation_Table"&gt;FAT&lt;/a&gt; from Microsoft for compatibility with Microsoft products. TomTom (like other flash storage users) could just have used a decent flash filesystem like &lt;a href="http://en.wikipedia.org/wiki/YAFFS"&gt;YAFFS&lt;/a&gt;. This is just another example why software patents lead to fragmenting compatibility between systems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-1107060619133858673?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/1107060619133858673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=1107060619133858673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/1107060619133858673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/1107060619133858673'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2009/03/why-compatibility-with-microsoft-may.html' title='Why compatibility with Microsoft may lead to legal problems'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-7335873056172340220</id><published>2009-02-28T16:13:00.014Z</published><updated>2009-04-17T23:46:42.296Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>On Integrated development environments</title><content type='html'>The main problems I find with the &lt;a style="" href="http://en.wikipedia.org/wiki/Eclipse_%28software%29" title="Eclipse (software)"&gt;Eclipse&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Integrated_development_environment"&gt;IDE&lt;/a&gt; are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.velocityreviews.com/forums/t144789-eclipse-stripping-whitespace-at-eol.html"&gt;Eclipse does not remove whitespace at end-of-line. It seems the eclipse based JBuilder does this flawlessly.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.fuzzylizard.com/archives/2006/12/11/840/"&gt;Eclipse does not have a good spaces vs tabs behavior&lt;/a&gt;. I think if eclipse it is not going to stick to 8 spaces indentation by default it should be using spaces everywhere by default instead of changing a well defined a tab is 8 spaces &lt;a href="http://en.wikipedia.org/wiki/De_facto"&gt;de facto&lt;/a&gt; standard.&lt;/li&gt;&lt;li&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108668"&gt;Eclipse is still using non standard character encodings on some platforms like MSWindows&lt;/a&gt;. &lt;a href="http://www.martinahrer.at/blog/2007/06/03/eclipse-encoding-settings/"&gt;Change the default encoding to UTF-8 in Eclipse&lt;/a&gt;. (If you read this bug thread you will see how old fashioned an IBM engineer can be)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155898"&gt;Eclipse does not recognize new &lt;/a&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155898"&gt;JARs&lt;/a&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155898"&gt; of &lt;/a&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155898"&gt;Java EE&lt;/a&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155898"&gt; applications in WEB-INF/lib until you restart eclipse&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;The features I need from an IDE are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Code_refactoring"&gt;Code refactoring&lt;/a&gt;: I want to be able to rename a method or variable without renaming other different equally named variables.&lt;/li&gt;&lt;li&gt;I need to know the callers of a function to know the consequences of changing its behavior.&lt;/li&gt;&lt;li&gt;I need VCS integration to know the current changes and be able to quickly change branches to develop new features.&lt;/li&gt;&lt;li&gt;I need automatic compilation and verification.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-7335873056172340220?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/7335873056172340220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=7335873056172340220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/7335873056172340220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/7335873056172340220'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2009/02/on-integrated-development-environments.html' title='On Integrated development environments'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-2358709269812243133</id><published>2009-02-08T11:00:00.003Z</published><updated>2009-02-08T11:14:24.625Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='information'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>Duplicate action detection and correct response</title><content type='html'>To prevent any action from being duplicated due to communication errors at the first try it is needed to identify the first communication with an id that the server has to verify to not duplicate the action.&lt;br /&gt;&lt;br /&gt;The common case is like this:&lt;br /&gt;&lt;br /&gt;A client sends a communication to a server requesting a new order. The communication has an orderid. The server gets all the info and performs the action. But that communication fails to get a response because of a network problem like loss of connectivity. Since the client is not sure the communication was totally OK the client must retry back the communication. Since the communication has an orderid there is no problem in sending it again (no risk of duplication). Since the server already performed the action, this second time the response code should be either just the same as the first case "OK - accepted" (for simplicity) or "OK - already accepted". It is critical this response be understood by the client as OK, otherwise the client will retry forever.&lt;br /&gt;&lt;br /&gt;I am explaining this because I have had problems trying to make understand people about this problems that made some orders, although correctly sent to the server, never marked as OK on the client system and thus retried forever making the user unhappy since his order was like not being sent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-2358709269812243133?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/2358709269812243133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=2358709269812243133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/2358709269812243133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/2358709269812243133'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2009/02/duplicate-action-detection-and-correct.html' title='Duplicate action detection and correct response'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-4941572936625113932</id><published>2009-01-06T11:57:00.009Z</published><updated>2009-01-06T12:27:00.713Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='social'/><category scheme='http://www.blogger.com/atom/ns#' term='bookmarks'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>Social Bookmarks Friend Finder (for delicious.com)</title><content type='html'>I am quite interested in social networks as they allow you to get in contact with people with similar interests.&lt;br /&gt;&lt;br /&gt;I found some time ago a social bookmarking site called &lt;a href="http://delicious.com/"&gt;delicious.com&lt;/a&gt; that allows you to have all you public bookmarks tagged. I liked to find similar users to me but the site had no option for that and I found &lt;a href="http://www.aiplayground.org/artikel/delicious-mates/"&gt;Find Similar Users on del.icio.us&lt;/a&gt; but it had some problems like excessive memory usage, no continue and the need to provide user and password to access the data. So I developed a similar Java program without those problems called &lt;a href="http://code.google.com/p/sbff/"&gt;Social Bookmarks Friend Finder (for delicious.com)&lt;/a&gt;. It is coded in Java, using the embedded &lt;a href="http://www.h2database.com/"&gt;H2 database&lt;/a&gt; by default (being able to use most compatible JDBC databases). Please try it if you want and report any issues. I would like to hear if it was useful to you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-4941572936625113932?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/4941572936625113932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=4941572936625113932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4941572936625113932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4941572936625113932'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2009/01/social-bookmarks-friend-finder-for.html' title='Social Bookmarks Friend Finder (for delicious.com)'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-5512709801814329174</id><published>2009-01-01T20:36:00.002Z</published><updated>2009-06-13T22:25:53.408Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='web applications'/><title type='text'>URLs should never have the server side technology</title><content type='html'>URLs should never have the server side technology used in them. Because it is just marketing for that technology and it does not just identify a resource.&lt;br /&gt;&lt;br /&gt;Technologies that are shown in the URL but should not (with URL examples):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Common_Gateway_Interface"&gt;CGI&lt;/a&gt; https://bugzilla.mozilla.org/show_bug.cgi?id=249338 my suggestion https://bugzilla.mozilla.org/bug?id=249338 or https://bugzilla.mozilla.org/bug/249338 &lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/PHP"&gt;PHP&lt;/a&gt; http://www.facebook.com/home.php my suggestion http://www.facebook.com/&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/JavaServer_Pages"&gt;JSP&lt;/a&gt; https://issues.apache.org/jira/secure/Dashboard.jspa my suggestion https://issues.apache.org/jira/&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Active_Server_Pages"&gt;ASP&lt;/a&gt; http://www.microsoft.com/en/us/default.aspx You should not ever have to refer to a default.aspx as http://www.microsoft.com/en/us/ should always be enough (&lt;a href="http://blog.bitquabit.com/2009/06/12/zombie-operating-systems-and-aspnet-mvc/"&gt;ASP.NET also has problems rooting in the ancestor of the current MSWindows CP/M&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Most of the times these are examples of the lack of correct &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;MVC&lt;/a&gt; web architectures. Always try to not use technologies that force you to have the technology name in the URL. It is bad practice. And a clear example of bad architecting.&lt;br /&gt;&lt;br /&gt;You should also prevent using the technology name in the URL as in:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://help.open.collab.net/servlets/tracking&lt;/li&gt;&lt;/ul&gt;So, always try to call a controller that will render a resource (JSON, HTML, XML, or any other format)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-5512709801814329174?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/5512709801814329174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=5512709801814329174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5512709801814329174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5512709801814329174'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2009/01/urls-should-never-have-server-side.html' title='URLs should never have the server side technology'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-6088619362078508108</id><published>2009-01-01T19:54:00.020Z</published><updated>2010-09-28T02:47:47.170Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>On Programming Languages</title><content type='html'>Business code should never be developed using a non&lt;a href="http://en.wikipedia.org/wiki/Memory_management"&gt; memory managed&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Programming_language"&gt;programming language&lt;/a&gt;. Being either &lt;a href="http://en.wikipedia.org/wiki/Reference_counting"&gt;reference counting&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29"&gt;garbage collection&lt;/a&gt; (although reference counting is time predictive it can make your application more laggy and can not alone detect object cycles so &lt;a href="http://www.jwz.org/doc/gc.html"&gt;garbage collection is the winner nowadays as Jamie Zawinski says&lt;/a&gt;). When writing business code you should not lose time managing memory when the computer can do it better for you.&lt;br /&gt;&lt;br /&gt;The programming languages I recommend are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java&lt;/a&gt; (for most applications including business or enterprise applications)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Python_%28programming_language%29"&gt;Python&lt;/a&gt; (for any small application for computer administration)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/C_%28programming_language%29"&gt;C&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/C++"&gt;C++&lt;/a&gt; (only for low level or computing intensive code)&lt;/li&gt;&lt;/ul&gt;Some other programming languages that I neither recommend nor discourage:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; is the web browser programming language. There are alternatives like &lt;a href="http://en.wikipedia.org/wiki/Google_Web_Toolkit"&gt;Google Web Toolkit&lt;/a&gt; that allows you to translate Java to JavaScript. I still have to take a look at &lt;a href="http://en.wikipedia.org/wiki/Google_Web_Toolkit"&gt;Google Web Toolkit&lt;/a&gt;. The main reason I use JavaScript is because it is the browser programming language and client applications are finally settling. But &lt;a href="http://stackoverflow.com/questions/5223/length-of-javascript-associative-array"&gt;JavaScript has some problems like the lack of a native (fast) function to know the length of an&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Associative_array"&gt;Associative array&lt;/a&gt; in contrast with Java's java.util.Map size() method and python's dictionaries len(). &lt;a href="http://google-web-toolkit.googlecode.com/svn/trunk/user/super/com/google/gwt/emul/java/util/AbstractMap.java"&gt;GWT implements java.util.HashMap with its own implementation in JavaScript instead of using its own maps because there is no fast size() function&lt;/a&gt;. &lt;a href="http://www.reddit.com/r/programming/comments/7rtxa/has_anyone_else_hated_javascript_but_later/"&gt;What other people think about JavaScript&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/PHP"&gt;PHP&lt;/a&gt; is a specialized programming language for web applications that is currently powering huge sites like &lt;a href="http://en.wikipedia.org/wiki/Facebook"&gt;Facebook&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Flickr"&gt;Flickr&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Wikipedia"&gt;Wikipedia&lt;/a&gt;. It still lacks &lt;a href="http://en.wikipedia.org/wiki/Unicode"&gt;unicode&lt;/a&gt; support among other things, but it is quite easy to deploy since most commercial web application servers support PHP. As a &lt;a href="http://en.wikipedia.org/wiki/Type_system#Strong_and_weak_typing"&gt;weak typed&lt;/a&gt; programming language you may get lots of problems like &lt;a href="http://stackoverflow.com/questions/1995113/strangest-language-feature#1995196"&gt;PHP's handling of numeric values in strings&lt;/a&gt;. Anyway &lt;a href="http://www.bitstorm.org/edwin/en/php/"&gt;PHP has lots of design errors so you may want to skip it for any important website&lt;/a&gt;. &lt;a href="http://www.codinghorror.com/blog/archives/001119.html"&gt;PHP Sucks, But It Doesn't Matter&lt;/a&gt;. I just do not use PHP because I do not feel safe with a weak typed language and so many design errors.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Ruby_%28programming_language%29"&gt;Ruby&lt;/a&gt; with its &lt;a href="http://en.wikipedia.org/wiki/Ruby_on_Rails"&gt;Ruby on Rails&lt;/a&gt; and great OO syntax it is a language that might have a bright future. It was used for sites like &lt;a href="http://en.wikipedia.org/wiki/Twitter"&gt;Twitter&lt;/a&gt; but &lt;a href="http://www.techcrunch.com/2008/05/01/twitter-said-to-be-abandoning-ruby-on-rails/"&gt;ruby on rails has scalability problems that make it not ready for large sites&lt;/a&gt;. &lt;a href="http://robey.livejournal.com/53832.html"&gt;Twitter changed its core from Ruby to Scala&lt;/a&gt;. Ruby 1.8 lacks a bytecode interpreter, &lt;a href="http://dablog.rubypal.com/2009/1/14/10-things-to-be-aware-of-in-moving-to-ruby-1-9"&gt;Ruby 1.9 transition will take some time as there are important changes&lt;/a&gt; and lacks &lt;a href="http://en.wikipedia.org/wiki/Unicode"&gt;Unicode&lt;/a&gt; support. These Ruby problems might get fixed in the future, but right now &lt;a href="http://glyphobet.net/blog/essay/228"&gt;Ruby's not ready&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/C_Sharp_%28programming_language%29"&gt;C#&lt;/a&gt; is a Java clone so it is also quite a good alternative but lacks lots of opensource frameworks to base your software on. So it is only an option if you do not mind the Microsoft only lock-in.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I do not like scripting languages because I want my code to work flawlessly and not compiled programming languages do not allow me to catch any error at compile time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-6088619362078508108?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/6088619362078508108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=6088619362078508108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/6088619362078508108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/6088619362078508108'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2009/01/on-programming-languages.html' title='On Programming Languages'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-4909203032425348770</id><published>2008-12-11T22:22:00.010Z</published><updated>2009-05-27T08:40:24.709Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><title type='text'>On Graphical User Interfaces</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Apple_Inc."&gt;Apple Inc.&lt;/a&gt; has always been the leader in &lt;a href="http://en.wikipedia.org/wiki/Graphical_user_interface" title="Graphical user interface"&gt;graphical user interface&lt;/a&gt;s. Apple have always know very well how to create intuitive user interfaces. Apple has always know the difference between a document and an application and has centered the user interface around the document while Microsoft has done the same around the unintuitive and computer specific &lt;a href="http://en.wikipedia.org/wiki/Application_software"&gt;software application&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Users should not need to know about applications (they do not need to know they have to open the spreadsheet application to create a spreadsheet document) they just need to know about documents or objects and actions (they just need to know that they can click somewhere to create a new document and just clicking on a document it is opened for viewing, editing or printing). Applications should be hidden totally from the user.&lt;br /&gt;&lt;br /&gt;I really hate applications that use &lt;a href="http://en.wikipedia.org/wiki/Multiple_document_interface"&gt;multiple document interface&lt;/a&gt; mostly because they force the user to understand what an application is, instead of just focusing on the object (text document, spreadsheet, image, video, song, ...). It seems Microsoft Office 2007 has finally done some progress to stay away of MDI but &lt;a href="http://en.wikipedia.org/wiki/File:Microsoft_Office_Excel_2007.png"&gt;Excel still has an internal close button (x)&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-4909203032425348770?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/4909203032425348770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=4909203032425348770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4909203032425348770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4909203032425348770'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/12/on-graphical-user-interfaces.html' title='On Graphical User Interfaces'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-5700618557401590780</id><published>2008-11-27T21:54:00.013Z</published><updated>2010-03-05T06:36:16.916Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>On Google Technologies</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Google"&gt;Google&lt;/a&gt; is currently the &lt;a href="http://en.wikipedia.org/wiki/Information_technology"&gt;information technology&lt;/a&gt; leader because most of their systems are better engineered than the competence (like Microsoft or Yahoo). Here is a list of technologies that Google uses that you should be using too.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Linux"&gt;Linux&lt;/a&gt; is used on all the servers of Google datacenters&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/GNU_Compiler_Collection"&gt;GCC&lt;/a&gt; for &lt;a href="http://en.wikipedia.org/wiki/C++"&gt;C++&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A &lt;a href="http://en.wikipedia.org/wiki/Servlet"&gt;Servlet&lt;/a&gt; Container. &lt;a href="http://google-opensource.blogspot.com/2009/01/opengse-released.html"&gt;Although Google uses its own Google Servlet Engine they recommend using&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Apache_Tomcat"&gt;Apache Tomcat&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Jetty_%28web_server%29"&gt;Jetty&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java&lt;/a&gt; used at least in Google &lt;a href="http://en.wikipedia.org/wiki/AdWords"&gt;AdWords&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Gmail"&gt;Gmail&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Google_Calendar"&gt;Google Calendar&lt;/a&gt; and with all Google &lt;a href="http://en.wikipedia.org/wiki/XMLHttpRequest"&gt;XMLHttpRequest&lt;/a&gt; web applications with &lt;a href="http://en.wikipedia.org/wiki/Google_Web_Toolkit"&gt;Google Web Toolkit&lt;/a&gt; (Google does not like coding directly in &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; so they use GWT to translate Java to JavaScript)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Eclipse_%28software%29"&gt;Eclipse&lt;/a&gt; for any Java development&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Python_%28programming_language%29"&gt;Python&lt;/a&gt; used at least in &lt;a href="http://en.wikipedia.org/wiki/YouTube"&gt;Youtube&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Protocol_Buffers"&gt;Protocol Buffers&lt;/a&gt; &lt;a href="http://code.google.com/apis/protocolbuffers/docs/overview.html#whynotxml"&gt;instead of the slow to generate and parse and difficult to use correctly XML&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Subversion_%28software%29"&gt;Subversion&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Git_%28software%29"&gt;Git&lt;/a&gt; (Git is used, at least, for &lt;a href="http://en.wikipedia.org/wiki/Google_Android"&gt;Google Android&lt;/a&gt; development)&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://panela.blog-city.com/python_at_google_greg_stein__sdforum.htm"&gt;Python at Google (Greg Stein - SDForum)&lt;/a&gt; is a blog post about technologies used at Google.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-5700618557401590780?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/5700618557401590780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=5700618557401590780' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5700618557401590780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5700618557401590780'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/11/on-google-technologies.html' title='On Google Technologies'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-8164707005143826947</id><published>2008-11-18T21:37:00.035Z</published><updated>2010-08-15T20:15:29.277Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>On SQL Databases</title><content type='html'>Choosing wisely a SQL database is a very important step for any software project that needs permanent storage and efficiently querying that data. So, here is my view of the current SQL databases.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Oracle_Database"&gt;Oracle Database&lt;/a&gt;. The leader in SQL databases. It is expensive. But most other databases are catching up.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Microsoft_SQL_Server"&gt;Microsoft SQL Server&lt;/a&gt;. Only an option if Microsoft lock-in is worth for you. It is expensive but quite good and easy to use and maintain. A big competitor for Oracle.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/IBM_DB2"&gt;IBM DB2&lt;/a&gt;. Not a big contender for new systems nowadays. It has cryptic error messages. It is mostly used in mainframes and banking. &lt;a href="http://trentrichardson.com/2008/10/23/exploring-various-sql-regex-syntax/"&gt;DB2 does not have Regular Expression support yet&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/MySQL"&gt;MySQL&lt;/a&gt;. The most popular free Open Source SQL database that nowadays is also ACID compliant. MySQL still has many bugs that will bite you when you most need it like &lt;a href="http://bugs.mysql.com/bug.php?id=10327"&gt;MySQL Bug #10327: Can't reopen temporary table - should be allowed&lt;/a&gt; and does not yet report the cause of many errors like &lt;a href="http://bugs.mysql.com/bug.php?id=24413"&gt;MySQL Bug #24413: Misleading error message when hard drive is full&lt;/a&gt; or like &lt;a href="http://forums.mysql.com/read.php?22,19755,233989"&gt;Can't create table (errno: 150)&lt;/a&gt;. &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/group-by-hidden-columns.html"&gt;MySQL also has some non standard SQL extensions that will make some statements not fail but will probably get you error results&lt;/a&gt;. &lt;a href="http://bugs.mysql.com/bug.php?id=13979"&gt;MySQL lacks full text search indexing on transactional tables&lt;/a&gt;. MySQL and MariaDB fixes bugs by saying they are annoying but documented (that way I fix bugs too ;-) (see &lt;a href="http://bugs.mysql.com/bug.php?id=53356"&gt;MySQL Bug #53356:   Character set bug at server with utf8 column and  latin1 connection&lt;/a&gt;). MySQL has some SQL extensions that are quite useful like &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/insert.html"&gt;INSERT IGNORE&lt;/a&gt; and &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html"&gt;ON DUPLICATE KEY UPDATE&lt;/a&gt;. Anyway, &lt;a href="http://dev.mysql.com/doc/mysql/"&gt;MySQL is a quite good SQL database and has great documentation&lt;/a&gt; (concise and complete).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/PostgreSQL"&gt;PostgreSQL&lt;/a&gt;. The original free Open Source ACID SQL database that now is fast and stable. &lt;a href="http://www.wikivs.com/wiki/MySQL_vs_PostgreSQL"&gt;PostgreSQL is nowadays faster, more stable and with more features than MySQL&lt;/a&gt;. &lt;a href="http://www.murrayc.com/blog/permalink/2008/04/25/postgresql-has-no-bugzilla/"&gt;PostgreSQL has no bugtracker&lt;/a&gt; so you may have a hard time looking for problems and their status. &lt;a href="http://petereisentraut.blogspot.com/2010/05/merge-syntax.html"&gt;I am waiting for PostgreSQL to include MERGE or MySQL's INSERT IGNORE and ON DUPLICATE KEY UPDATE&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Apache_Derby"&gt;Apache Derby&lt;/a&gt;. An embedded free Open Source Java SQL database. Since IBM bought it, it keeps all &lt;a href="http://en.wikipedia.org/wiki/IBM_DB2"&gt;IBM DB2&lt;/a&gt; semantics that can bite you if you also use other databases. (for example "user" is a reserved word and it will not let you use it as a column name and derby has still many bugs like &lt;a href="https://issues.apache.org/jira/browse/DERBY-3436"&gt;[#DERBY-3436] Embedded closes all open ResultSets on failure in auto-commit mode, whereas client keeps them open&lt;/a&gt; or &lt;a href="http://issues.apache.org/jira/browse/DERBY-160"&gt;[#DERBY-160] Foreign key constraint failure closes the cursors in embedded mode but not in Network Server mode&lt;/a&gt; that will bite you when you most need it) These kind of bugs make Apache Derby not production quality yet. Apache Derby is mostly used as &lt;a href="http://en.wikipedia.org/wiki/IBM_DB2"&gt;IBM DB2&lt;/a&gt; marketing tool, so its peace of development is slow.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/HSQLDB"&gt;HSQLDB&lt;/a&gt;. A free Open Source Java embedded database for testing purposes. It should not be used in production since all the data is kept in &lt;a href="http://en.wikipedia.org/wiki/Volatile_memory"&gt;volatile memory&lt;/a&gt; (instead of &lt;a href="http://en.wikipedia.org/wiki/Non-volatile_memory"&gt;non-volatile memory&lt;/a&gt;) and needs to process all the SQL statements on startup, making it unsuitable for large amounts of data. It also has bugs like: &lt;a href="http://sourceforge.net/tracker2/?func=detail&amp;amp;aid=1615886&amp;amp;group_id=23316&amp;amp;atid=378131"&gt; ID: 1615886 - Not in aggregate function or group by clause&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/H2_%28DBMS%29"&gt;H2&lt;/a&gt;. A free Open Source Java embedded database of the same creators of HSQLDB, but better designed, faster and with decent storage that it is production ready.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/SQLite"&gt;SQLite&lt;/a&gt;. The most popular SQL embedded database. It is free Open Source. Used in products like &lt;a href="http://en.wikipedia.org/wiki/Mozilla_Firefox" title="Mozilla Firefox"&gt;Mozilla Firefox&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Mac_OS_X" title="Mac OS X"&gt;Mac OS X&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/IPhone" title="IPhone"&gt;iPhone&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Skype" title="Skype"&gt;Skype&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Symbian_OS" title="Symbian OS"&gt;Symbian OS&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Android_%28mobile_device_platform%29" title="Android (mobile device platform)"&gt;Android&lt;/a&gt;, and many others. &lt;a href="http://www.sqlite.org/faq.html#q18"&gt;SQLite lacks full unicode support on most systems since the full unicode support module (ICU) is optional&lt;/a&gt;. SQLite also has many bugs (like &lt;a href="http://www.sqlite.org/datatype3.html"&gt;SQLite dynamic  typing&lt;/a&gt;) that the official developers consider as features, but differ from most other SQL databases and even the SQL standard.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Wikipedia's &lt;a href="http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems"&gt;Comparison of relational database management systems&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.wikivs.com/wiki/MySQL_vs_PostgreSQL"&gt;MySQL vs PostgreSQL - WikiVS&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-8164707005143826947?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/8164707005143826947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=8164707005143826947' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8164707005143826947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8164707005143826947'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/11/on-sql-databases.html' title='On SQL Databases'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-8089131765627211460</id><published>2008-09-27T11:19:00.019Z</published><updated>2008-12-15T10:26:50.270Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='open'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>Why you should buy Linux compatible hardware</title><content type='html'>I have always recommended buying &lt;a href="http://en.wikipedia.org/wiki/Linux"&gt;Linux&lt;/a&gt; compatible hardware.&lt;br /&gt;&lt;br /&gt;I have also seen along the years that most Linux supported hardware has more quality than hardware not supported by Linux because most Linux users choose wisely what is the best hardware to buy and they only develop drivers for them.&lt;br /&gt;&lt;br /&gt;Always take a look at the level of support of any hardware prior buying it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Image_scanner"&gt;Image scanner&lt;/a&gt;: &lt;a href="http://www.sane-project.org/lists/sane-mfgs-cvs.html"&gt;SANE: Supported Devices&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Printer_%28computing%29"&gt;Printer&lt;/a&gt;: &lt;a href="http://www.openprinting.org/printer_list.cgi"&gt;OpenPrinting database - Printer Listings&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Sound_card"&gt;Sound card&lt;/a&gt;: &lt;a href="http://www.alsa-project.org/main/index.php/Matrix:Main"&gt;ALSA SoundCard Matrix&lt;/a&gt;. Most cheap sound chips are supported in Linux. You will not need anything else unless you are a musician.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Computer_display_standard"&gt;Video Display&lt;/a&gt;: &lt;a href="http://xorg.freedesktop.org/wiki/Projects/Drivers"&gt;X.Org Video Drivers&lt;/a&gt;. I do not recommend any make other than &lt;a href="http://en.wikipedia.org/wiki/Intel_GMA"&gt;Intel GMA&lt;/a&gt;. Intel also has very good Linux support having various engineers working full time resolving issues to make their hardware more Linux compatible. Intel &lt;a href="http://en.wikipedia.org/wiki/Centrino"&gt;Centrino&lt;/a&gt; hardware is always a good bet as all their components are supported by Linux. &lt;a href="http://en.wikipedia.org/wiki/Nvidia"&gt;Nvidia&lt;/a&gt; has very bad support for Linux (they only provide closed source drivers and of much less quality than MSWindows ones). If you are a gamer you have to stick with MSWindows and pay for it or just buy a recent &lt;a href="http://en.wikipedia.org/wiki/Video_game_console"&gt;video game console&lt;/a&gt; and just be safe.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Wi-Fi"&gt;Wi-Fi&lt;/a&gt;: &lt;a href="http://linux-wless.passys.nl/"&gt;Linux wireless LAN support&lt;/a&gt;. If you stick with Intel Centrino you should not have any problems.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://www.linux.com/feature/118497"&gt;Is my hardware Linux-compatible? Find out here&lt;/a&gt; is a quite good article on hardware compatibility on Linux although a bit outdated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-8089131765627211460?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/8089131765627211460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=8089131765627211460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8089131765627211460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8089131765627211460'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/09/why-you-should-by-linux-compatible.html' title='Why you should buy Linux compatible hardware'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-7773413429642414825</id><published>2008-09-18T20:18:00.247Z</published><updated>2011-11-28T11:30:14.588Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='phone'/><title type='text'>My ideal mobile device</title><content type='html'>Hardware requirements:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Small enough to put it on my jeans front pocket and always be with me.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/GSM"&gt;GSM&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Universal_Mobile_Telecommunications_System"&gt;UMTS&lt;/a&gt; (to make phone calls and be always connected to the Internet) with efficient and well designed antenna+radio, &lt;a href="http://en.wikipedia.org/wiki/Wi-Fi"&gt;Wi-Fi&lt;/a&gt; (to use high speed and low cost networking when available), &lt;a href="http://en.wikipedia.org/wiki/Bluetooth"&gt;Bluetooth&lt;/a&gt; (to transfer files to other mobile devices on the go)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Wireless_modem"&gt;Wireless modem&lt;/a&gt; with &lt;a href="http://en.wikipedia.org/wiki/Universal_Serial_Bus"&gt;USB&lt;/a&gt; to connect it to my computer and with &lt;a href="http://en.wikipedia.org/wiki/Hayes_command_set"&gt;Hayes command set&lt;/a&gt;. Computer to phone Internet connection is also known as &lt;a href="http://en.wikipedia.org/wiki/Tethering"&gt;Tethering&lt;/a&gt;. (iOS, Symbian and &lt;a href="http://en.wikipedia.org/wiki/Android_%28operating_system%29"&gt;Android&lt;/a&gt; have Tethering)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Assisted_GPS"&gt;Assisted GPS&lt;/a&gt; to be able to know my position to show a map and be notified when I am near some place.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Non-volatile_memory"&gt;Non-volatile memory&lt;/a&gt; (keep memory without the need of a battery) (preferably &lt;a href="http://en.wikipedia.org/wiki/Flash_memory"&gt;flash memory&lt;/a&gt; instead of &lt;a href="http://en.wikipedia.org/wiki/Hard_disk"&gt;hard disk&lt;/a&gt; because flash is more resistant to being dropped)&lt;/li&gt;&lt;li&gt;External storage &lt;a href="http://en.wikipedia.org/wiki/Memory_card"&gt;memory card&lt;/a&gt;s (&lt;a href="http://en.wikipedia.org/wiki/microSD"&gt;microSD&lt;/a&gt; preferred) (iPhone does not have external storage memory cards) I also like being able to change the memory card without having to shutdown and remove the battery (many BlackBerries have the memory card bellow the battery)&lt;/li&gt;&lt;li&gt;Sliding Full keyboard. I like to sense the keys with my fingers to be able to type quickly and not make lots of errors. (My first impression of the &lt;a href="http://www.veoh.com/videos/v708866syXskpfB"&gt;iPhone keyboard&lt;/a&gt; &lt;a href="http://www.cellular-news.com/story/27431.php"&gt;was quite bad&lt;/a&gt;, but after having used my iPhone4 for some time I find it quite good. Anyway most people agree that iPhone's keyboard is not as good as a physical full keyboard like &lt;a href="http://en.wikipedia.org/wiki/BlackBerry"&gt;BlackBerry&lt;/a&gt;'s. &lt;a href="http://www99.epinions.com/review/RIM_Blackberry_VODA_BLACKBERRY_PEARL_8100VE_Cellular_Phone/content_304046509700"&gt;BlackBerry Pearl half keyboard is also not enough for me&lt;/a&gt;. Everyone that has tried the half keyboard of the Pearl and the full keyboard of the curve prefers the full keyboard.&lt;/li&gt;&lt;li&gt;High resolution (no less than 150k pixels) full-color display to be able to see at least one paragraph of text and photos that uses all the phone area (so I need a sliding keyboard). I do not like &lt;a href="http://en.wikipedia.org/wiki/PenTile_matrix_family"&gt;PenTile matrix family&lt;/a&gt; displays like the one at the &lt;a href="http://en.wikipedia.org/wiki/Nexus_One"&gt;Nexus One&lt;/a&gt;. I prefer rectangular matrix displays like the one at the &lt;a href="http://en.wikipedia.org/wiki/IPhone_4"&gt;iPhone4&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Good enough photo camera with acceptable flash to take the occasional photo or video. The camera startup time has to be fast otherwise the moment to take the photo may be gone. &lt;a href="http://news.cnet.com/8301-27076_3-10431279-248.html"&gt;Nexus One camera is faster and better than iPhone 3GS one&lt;/a&gt;, but &lt;a href="http://www.youtube.com/watch?v=V2KlGDEGPMk"&gt;iPhone camera is faster than Motorola Droid&lt;/a&gt;. Also the camera should be good enough to not have &lt;a href="http://techcityinc.com/2010/07/07/iphone-4-white-balance-photo-issue/"&gt;issues with the white balance like the iPhone4&lt;/a&gt; or the &lt;a href="http://www.flickr.com/photos/andyi/4292512356/"&gt;Nexus One that also have issues with white balance under dim light conditions&lt;/a&gt;. I do not need too many megapixels but good performance and quality (&lt;a href="http://androidandme.com/2010/05/phones/the-incredible-camera-showdown-droid-incredible-vs-nexus-one/"&gt;HTC seems to be degrading quality in latests phones like the HTC Droid Incredible that has a worst camera than the Nexus One&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Loudspeaker"&gt;Loudspeaker&lt;/a&gt; for the ringtone and hands-free operation.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Vibrator_%28mechanical%29"&gt;Vibrator&lt;/a&gt; with different vibration modes for different notifications (I keep most of the time my phone silent to prevent bothering others and preventing others knowing when I am being called or texted)&lt;/li&gt;&lt;li&gt;Standard micro-&lt;a href="http://en.wikipedia.org/wiki/Universal_Serial_Bus"&gt;USB&lt;/a&gt; or mini-&lt;a href="http://en.wikipedia.org/wiki/Universal_Serial_Bus"&gt;USB&lt;/a&gt; data and power adapter (iPhone has the proprietary iPod connector, but all Androids and &lt;a href="http://en.wikipedia.org/wiki/BlackBerry"&gt;BlackBerry&lt;/a&gt; have standard USB power connectors) &lt;a href="http://uk.reuters.com/article/idUKTRE55S1XZ20090629"&gt;It seems the better designed micro-USB will be the standard data and power connector for European phones&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Standard 3.5mm &lt;a href="http://en.wikipedia.org/wiki/Headphones"&gt;headphone&lt;/a&gt;, microphone and control &lt;a href="http://en.wikipedia.org/wiki/TRRS_connector"&gt;TRRS connector&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/BlackBerry"&gt;BlackBerry&lt;/a&gt;, iPhone and new Androids like &lt;a href="http://en.wikipedia.org/wiki/Nexus_One"&gt;Nexus One&lt;/a&gt; have a standard TRRS connector)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/FM_broadcasting"&gt;FM radio&lt;/a&gt; receiver (many Nokias and Androids have FM radio reception but neither iPhones nor Blackberries have FM radio)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Touchscreen"&gt;Touchscreen&lt;/a&gt; I do not find having a touchscreen improve usability too much (in presence of a full keyboard) (current Blackberries are quite usable without having a touchscreen), but I found the touchscreen should be &lt;a href="http://en.wikipedia.org/wiki/Touchscreen#Capacitive"&gt;capacitive&lt;/a&gt; (like iPhone or most &lt;a href="http://en.wikipedia.org/wiki/Android_%28operating_system%29"&gt;Android&lt;/a&gt;s) and not &lt;a href="http://en.wikipedia.org/wiki/Touchscreen#Resistive"&gt;resistive&lt;/a&gt; (like new Nokias or most MSWindowsMobile based phones) as resistive touch screens require a stylus, have less resolution and do not support &lt;a class="mw-redirect" href="http://en.wikipedia.org/wiki/Multitouch" title="Multitouch"&gt;multitouch&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Trackball"&gt;Trackball&lt;/a&gt; is very useful when you need to select a link on a web page or move around with precision (all &lt;a href="http://en.wikipedia.org/wiki/Android_%28operating_system%29"&gt;Android&lt;/a&gt;s have it).&lt;/li&gt;&lt;li&gt;I do not want a proximity sensor that does not work correctly (I prefer not having a proximity sensor at all). Both the &lt;a href="http://www.youtube.com/watch?v=8gFqAEuioi4"&gt;iPhone4&lt;/a&gt; and the &lt;a href="http://androidcommunity.com/forums/archive/index.php/t-31609.html"&gt;Nexus One&lt;/a&gt; has issues with the proximity sensor where it is easily unlocked when speaking and you can accidentally hang up.&lt;/li&gt;&lt;/ul&gt;Software requirements:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Exceptional Usability in every application and overall. Nokia engineers do not put much effort in usability of current phones (like in network connections or calculator) where both Android and iPhone excel Nokias by far. Blackberries are also very usable. I also need to disable every time consuming animation that some users like.&lt;/li&gt;&lt;li&gt;Phone calls :-)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Short_message_service"&gt;SMS&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Multimedia_Messaging_Service"&gt;MMS&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Web_browser"&gt;Web browser&lt;/a&gt; (preferably based on &lt;a href="http://en.wikipedia.org/wiki/WebKit"&gt;WebKit&lt;/a&gt;) that allows saving and offline HTML reading of content stored on the memory card (Madrid subway network has large sections without cell coverage) (iPhone, Android and Nokia have browsers based on WebKit, but none of them &lt;a href="http://code.google.com/p/android/issues/detail?id=6399"&gt;allow neither saving nor visualizing saved content&lt;/a&gt;), be able to find-on-page (iOS and &lt;a href="http://smarterware.org/1744/cupcake-adds-video-camera-touchscreen-keyboard-and-more-to-android"&gt;Android 1.5 browser has find-on-page&lt;/a&gt;) and &lt;a href="http://code.google.com/p/android/issues/detail?id=8880"&gt;keep open URLs/windows on shutdown or crash&lt;/a&gt; (Nokias and Android at least does not keep them)&lt;/li&gt;&lt;li&gt;HTTP &lt;a href="http://en.wikipedia.org/wiki/Proxy_server"&gt;Proxy server&lt;/a&gt; configuration. Many corporate Wi-Fi networks need a HTTP Proxy to access the Internet. Most phones do not allow HTTP proxy configuration (&lt;a href="http://discuz-android.blogspot.com/2008/01/set-proxy-for-android-web-browser.html"&gt;Android makes HTTP proxy configuration hard&lt;/a&gt;, Blackberry neither (you may set up the proxy only in the &lt;a href="http://en.wikipedia.org/wiki/BlackBerry_Enterprise_Server"&gt;BlackBerry Enterprise Server&lt;/a&gt;), but most Nokias and iOS have proxy configuration)&lt;/li&gt;&lt;li&gt;User data encryption using the password that unlocks the phone. (&lt;a href="http://msdn.microsoft.com/en-us/library/bb416357.aspx"&gt;Microsoft Windows Mobile has user data encryption&lt;/a&gt;, &lt;a href="http://code.google.com/p/android/issues/detail?id=3748"&gt;Android has internal data encryption&lt;/a&gt; &lt;a href="http://code.google.com/p/android/issues/detail?id=11211"&gt;but not for external storage&lt;/a&gt;, &lt;a href="http://na.blackberry.com/eng/ataglance/security/features.jsp#tab_tab_stored_data"&gt;BlackBerry has user data encyption&lt;/a&gt; also for external storage, &lt;a href="http://support.apple.com/kb/HT4175"&gt;Apple iOS has user data encryption&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Audio and video player without &lt;a href="http://en.wikipedia.org/wiki/Digital_rights_management"&gt;DRM&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/MP3"&gt;MP3&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Advanced_Audio_Coding"&gt;AAC&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/H.264/MPEG-4_AVC"&gt;H.264&lt;/a&gt; or similar for high quality audio and video) (&lt;a href="http://www.defectivebydesign.org/blog/1044"&gt;iPhone has DRM&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Stopwatch"&gt;Stopwatch&lt;/a&gt; and countdown &lt;a href="http://en.wikipedia.org/wiki/Timer"&gt;timer&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Calculator and &lt;a href="http://en.wikipedia.org/wiki/Spreadsheet"&gt;spreadsheet&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/E-book"&gt;E-book&lt;/a&gt; reader with standard format support like &lt;a href="http://en.wikipedia.org/wiki/EPUB"&gt;EPUB&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/FictionBook"&gt;FictionBook&lt;/a&gt; (in Android you have the great &lt;a href="http://www.fbreader.org/FBReaderJ/"&gt;FBReaderJ&lt;/a&gt;) (&lt;a href="http://en.wikipedia.org/wiki/Portable_Document_Format"&gt;PDF&lt;/a&gt; support is not needed since PDF is designed for printing, so it is not easily reformatted to view in different devices)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Portable_Document_Format"&gt;PDF&lt;/a&gt; reader for slide watching (not for ebook as I already said)&lt;/li&gt;&lt;li&gt;Simple Note taking (no titles in notes, just body)&lt;/li&gt;&lt;li&gt;Voice call (&lt;a href="http://en.wikipedia.org/wiki/Adaptive_multi-rate_compression"&gt;AMR&lt;/a&gt;) and sound (higher quality) recorder (Most Nokias have a voice recorder, Android can record voice but you have to access it using AnyCut application from the market, does not record voice in background and does not record calls (&lt;a href="http://code.google.com/p/android/issues/detail?id=2117"&gt;Android Feature Request 2117: Call Recorder&lt;/a&gt;), &lt;a href="http://www.blackberryforums.com/general-8300-series-discussion-curve/118070-voice-recorder-question.html"&gt;Blackberries need the latest OS 4.5 to have a voice recorder&lt;/a&gt; and iPhone 3GS has a Voice Memo application and the &lt;a href="http://www.iclarified.com/entry/index.php?enid=4614"&gt;Apple Store has a call recorder&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Video recorder and editor to trim large videos must  be available. &lt;a href="http://www.apple.com/iphone/guidedtour/"&gt;iOS has a video editor&lt;/a&gt; but &lt;a href="http://forum.xda-developers.com/showthread.php?p=6324564"&gt;Android  does not have basic video trim functionality&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Voice commands ("call ...", "pick up", "hang up", "record voice memo", "play ...") with speech synthesis to not have to touch or see the phone while not possible to (driving) (&lt;a href="http://atmac.org/iphone-voice-commands"&gt;iOS has voice commands&lt;/a&gt; &lt;a href="http://forums.macrumors.com/showthread.php?t=758326"&gt;but lacks "record voice memo"&lt;/a&gt;, &lt;a href="http://www.google.com/mobile/voice-actions/index.html"&gt;Voice Actions for Android&lt;/a&gt; are not usable because of &lt;a href="http://code.google.com/p/android/issues/detail?id=11062"&gt;Android issue #11062 voice commands do not work offline (they need a good internet connection)&lt;/a&gt;, &lt;a href="http://www.blackberrycool.com/2010/02/09/tips-and-help-with-blackberry-voice-commands/"&gt;BlackBerry Voice Commands&lt;/a&gt;, &lt;a href="http://europe.nokia.com/support/product-support/nokia-5500-sport/howto/use-voice-commands"&gt;Nokia Voice Commands allow to set voice commands for any application&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Voice to text transcription (not required)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Task_list"&gt;Task list&lt;/a&gt; manager&lt;/li&gt;&lt;li&gt;Formated text editor (either HTML or office word processor)&lt;/li&gt;&lt;li&gt;On-the-Fly &lt;a href="http://en.wikipedia.org/wiki/Spell_checker"&gt;Spell checker&lt;/a&gt; being able to choose language from the text editor (&lt;a href="http://forums.macrumors.com/showthread.php?t=894063"&gt;iOS&lt;/a&gt;, &lt;a href="http://www.lexdis.org.uk/strategy/166"&gt;BlackBerry&lt;/a&gt;, and &lt;a href="http://code.google.com/p/android/issues/detail?id=4939"&gt;Android&lt;/a&gt;&lt;a href="http://en.wikipedia.org/wiki/T9_%28predictive_text%29"&gt;&lt;/a&gt; have an spell checker).&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Cut,_copy,_and_paste" title="Cut, copy, and paste"&gt;copy/cut/paste&lt;/a&gt; (Android has copy/paste but &lt;a href="http://www.androidcentral.com/copy-and-paste-droid-incredible-and-htc-sense-user-interface"&gt;Android fragmentation make some phones have decent copy/paste in the browser while others not&lt;/a&gt; and Google is aware of &lt;a href="http://code.google.com/p/android/issues/detail?id=3190"&gt;Android Issue 3190: Improve copy-paste in Browser/WebView&lt;/a&gt;, &lt;a href="http://www.engadget.com/2009/03/17/iphone-finally-gets-copy-and-paste/"&gt;iOS has very good copy/paste&lt;/a&gt;, and Microsoft Windows Phone 7 just added basic copy/paste support&lt;a href="http://www.engadget.com/2010/03/16/windows-phone-7-series-wont-have-copy-and-paste/"&gt;&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Data stored in an efficient SQL embedded database (&lt;a href="http://en.wikipedia.org/wiki/SQLite"&gt;SQLite&lt;/a&gt; is being used on iPhone, Android and &lt;a href="http://en.wikipedia.org/wiki/Symbian_OS"&gt;Symbian OS&lt;/a&gt; 9.4)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Full_text_search"&gt;Full text search&lt;/a&gt; for any data stored on the phone (most importantly: calendar entries, tasks, and notes). The use case I need is this one: I just realized I need to buy milk so I click on "new task", type "buy milk" and save. Later on, I save some other tasks and then another "buy oranges". When I get to the supermarket I just want to click on "search", type "buy" and see all the things I have to buy and check then off (or delete) as they are done. Using a phone without full text search I would have to browse through all the tasks to see which of them are buy ones. &lt;a href="http://www.apple.com/iphone/features/search.html"&gt;iOS has search&lt;/a&gt;, but it will not search in contacts notes field, as Apple states, so you need third party apps. &lt;a href="http://supportforums.blackberry.com/t5/BlackBerry-Device-Software/How-To-Search-Notes-Within-Contacts/m-p/175463"&gt;BlackBerry&lt;/a&gt;&lt;a href="http://supportforums.blackberry.com/t5/BlackBerry-Device-Software/How-To-Search-Notes-Within-Contacts/m-p/175463"&gt; fails at search by not finding contacts by the notes field&lt;/a&gt;. Nokia supports search if you install &lt;a href="http://www.symbian-freak.com/news/006/10/search_app.htm"&gt;Nokia In-device search&lt;/a&gt;. Anyway Nokia is not a solution since if you have to search you may have many items and if you have many items you get &lt;a href="http://www.flickr.com/photos/eperez/tags/n80/"&gt;Nokia memory full problems&lt;/a&gt;. Incredibly, &lt;a href="http://code.google.com/p/android/issues/detail?id=2518"&gt;with Android you can not search in the calendar&lt;/a&gt; &lt;a href="http://code.google.com/p/android/issues/detail?id=3732"&gt;nor in all the fields of contacts&lt;/a&gt;. (search is better in iOS than Android because it searches more fields and has Unicode support, but neither searches notes field in contacts)&lt;/li&gt;&lt;li&gt;Good background and parallel applications support to be able to browse emails or tasks while listening to music or receiving messages (&lt;a href="http://www.allaboutsymbian.com/reviews/item/Nokia_X6_Review_pt_2_the_central_core_of_music.php"&gt;Nokias Symbian S60 will not let you browse photos while listening to music&lt;/a&gt;, iOS and Android have multitasking)&lt;/li&gt;&lt;li&gt;Good &lt;a href="http://en.wikipedia.org/wiki/Memory_management"&gt;memory management&lt;/a&gt;. Neither Microsoft Windows Mobile (&lt;a href="http://bolingconsulting.com/blog/?p=4"&gt;you can see how badly Microsoft Windows Mobile manages memory by looking at the limits they impose on the system&lt;/a&gt;) nor Symbian (&lt;a href="http://www.flickr.com/photos/eperez/tags/n80/"&gt;you can see how badly Symbian manages memory by looking at my crashy Nokia N80&lt;/a&gt;) based phones have good memory management leading to high memory usage, crashy applications and reduced performance over continuous usage. Android has good memory management because it uses Linux and Java with Android advanced memory manager.&lt;/li&gt;&lt;li&gt;Offline usage. I need all my important data to reside in the flash memory of the device so I can work offline when there is no wireless coverage or I just do not want to pay. It seems some terminals require you to have wireless connection for most operations even if the information could be locally stored. (Google Applications like calendar, gmail and maps work badly or not at all, like maps, if you are not online. Nokia Ovi Maps, &lt;a href="http://www.tomtom.com/en_gb/products/mobile-navigation/navigator-7-windows-smartphone/"&gt;TomTom for MSWindowsMobile&lt;/a&gt;, &lt;a href="http://www.tomtom.com/en_gb/products/mobile-navigation/tomtom-iphone-ipod-touch/"&gt;TomTom for iPhone&lt;/a&gt; and the old TomTom for Symbian work offline. Android (&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://code.google.com/p/android/issues/detail?id=4471"&gt;Android Issue #4471: Downloadable maps for offline navigation/location&lt;/a&gt;) and BlackBerry do not even have an offline GPS navigator application so they are not ideal for decent navigation)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;Model-view-controller&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Widget_toolkit" title="Widget toolkit"&gt;widget toolkit&lt;/a&gt; that comes with a &lt;a href="http://java.sun.com/docs/books/tutorial/uiswing/components/table.html"&gt;Table widget with TableModel&lt;/a&gt; as good or better than that of &lt;a href="http://en.wikipedia.org/wiki/Swing_%28Java%29"&gt;Swing&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/GTK%2B"&gt;GTK+&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Alarm_clock"&gt;Alarm clock&lt;/a&gt; with sound and vibration with GSM either turned off or muted to be able to have the phone wake me up without having a out of hours phone call wake me up. (Some phones do not have this functionality, but Android, iOS and Symbian do.)&lt;/li&gt;&lt;li&gt;Quick guest accounts to allow any person make a call or browse the Internet with my device being almost locked to any other information like contacts, bookmarks, browse history. It would be great to be able to create various accounts on the mobile just like in UNIX.&lt;/li&gt;&lt;li&gt;No &lt;a href="http://en.wikipedia.org/wiki/Spyware"&gt;spyware&lt;/a&gt;. (&lt;a href="http://en.wikipedia.org/wiki/IOS_%28Apple%29"&gt;Apple iOS 4&lt;/a&gt; allows fine grained permission to access location to applications and Android has a global setting)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Encryption"&gt;Encrypted&lt;/a&gt; communication. Like when accessing your email.&lt;/li&gt;&lt;li&gt;Publicly available issue list. Like &lt;a href="http://code.google.com/p/android/issues/list"&gt;Android issues list&lt;/a&gt;. But Symbian, iPhone, Microsoft Windows Mobile and BlackBerry being closed platforms do not have public available issue lists&lt;/li&gt;&lt;li&gt;Easy and Smooth Upgradeable Operating System. (Google Android has too many quirks when upgrading like the &lt;a href="http://www.google.com/support/forum/p/android/thread?tid=0d024b8a569861df&amp;amp;hl=en"&gt;problems with the inverted colors on the camera of the Nexus One on the 2.1 to 2.2 update&lt;/a&gt;. Google Android just do not seem to take much care of upgrades)&lt;/li&gt;&lt;/ul&gt;Conclusion:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/iPhone"&gt;iPhone&lt;/a&gt;: Yes. &lt;a href="http://en.wikipedia.org/wiki/IOS_%28Apple%29"&gt;Apple iOS 4&lt;/a&gt; added missing the features that make iPhone a usable phone like multitasking and spell checker (take a look at &lt;a href="http://www.youtube.com/user/TehChamp1337#g/c/885B4B43B41607DC"&gt;Apple  iOS 4 Keynote&lt;/a&gt;). Still you may want to read: &lt;a href="http://crackberry.com/top-10-reasons-why-iphone-no-blackberry"&gt;Top 10 Reasons Why the iPhone Is NO BlackBerry&lt;/a&gt;. &lt;a href="http://www.techcrunch.com/2009/07/27/apple-is-growing-rotten-to-the-core-and-its-likely-atts-fault/"&gt;iPhone is an extremely closed platform that is not worth following&lt;/a&gt;. &lt;a href="http://www.fsf.org/news/2010-05-app-store-compliance/"&gt;Apple App Store does not even allow GPL software&lt;/a&gt;. Just, be aware &lt;a href="http://i.imgur.com/RdcuT.jpg"&gt;the way Apple sells their products&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/BlackBerry"&gt;BlackBerry&lt;/a&gt;: Yes. &lt;a href="http://en.wikipedia.org/wiki/BlackBerry_Torch_9800"&gt;BlackBerry Torch 9800&lt;/a&gt; is the first BlackBerry to have a decent WebKit based browser based on &lt;a href="http://en.wikipedia.org/wiki/BlackBerry_OS"&gt;BlackBerry OS&lt;/a&gt; 6. There is also &lt;a href="http://www.linux.com/feature/123251"&gt;Linux Syncing for BlackBerrys&lt;/a&gt;. &lt;a href="http://crackberry.com/"&gt;crackberry.com&lt;/a&gt; is a good site for blackberry news.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Nokia"&gt;Nokia&lt;/a&gt;: No. Nokia seems to not target high demanding users. &lt;a href="http://www.flickr.com/photos/eperez/tags/n80/"&gt;It is not acceptable to have memory full crashes of applications because of bad memory management done by Symbian phones&lt;/a&gt;. &lt;a href="http://www.simplysymbian.com/2007/05/22/how-to-improve-the-nokia-n95-memory-issue/"&gt;I tried some things to workaround Nokia Symbian memory problems with no luck&lt;/a&gt;. They are going to feature efficient data storage using &lt;a href="http://en.wikipedia.org/wiki/SQLite"&gt;SQLite&lt;/a&gt; in &lt;a href="http://en.wikipedia.org/wiki/Symbian_OS"&gt;Symbian OS&lt;/a&gt; 9.4 or later but it is too little too late. Symbian OS became open source but they are not really trying to build a community as their bug tracker requires registration, most bugs are restricted and they only keep new bugs instead of importing all the old ones. &lt;a href="http://www.reuters.com/article/idUSLDE65N14720100624"&gt;Nokia kills Symbian OS for their high end phones&lt;/a&gt;. &lt;a href="http://blogs.gnome.org/bratsche/2009/08/28/nokia-n900/"&gt;Now that Nokia releases N900 that seems like a decent mobile phone. They declare the underlying platform is dead.&lt;/a&gt;&amp;nbsp;Now with Windows Phone they are entering a dangerous path because of the lack of features of Windows Phone.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_Phone"&gt;Microsoft Windows Phone&lt;/a&gt;: No. The old &lt;a href="http://en.wikipedia.org/wiki/Windows_Mobile"&gt;Windows Mobile&lt;/a&gt; failed to compete with BlackBerry and Microsoft decided to discontinue it. &lt;a href="http://arstechnica.com/microsoft/news/2009/09/ballmer-we-screwed-up-windows-mobile-wont-happen-again.ars"&gt;Microsoft agrees Microsoft Windows Mobile is a failure&lt;/a&gt;.  Microsoft Windows Phone seems to have lagged behind the other players and lacks a lot of important features other makes have.&amp;nbsp;&lt;a href="http://answers.microsoft.com/en-us/winphone/forum/wp7-wptips/the-windows-phone-7-feature-request-suggestion/90369a37-02fa-4e92-b0f6-71584a9cadd5"&gt;Microsoft &lt;/a&gt;&lt;a href="http://answers.microsoft.com/en-us/winphone/forum/wp7-wptips/the-windows-phone-7-feature-request-suggestion/90369a37-02fa-4e92-b0f6-71584a9cadd5"&gt;Windows Phone 7&lt;/a&gt;&lt;a href="http://answers.microsoft.com/en-us/winphone/forum/wp7-wptips/the-windows-phone-7-feature-request-suggestion/90369a37-02fa-4e92-b0f6-71584a9cadd5"&gt; lacks too many features&lt;/a&gt; to even look at it right now, so they better hurry up or the may have to quit the smartphone market for the second time.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Motorola"&gt;Motorola&lt;/a&gt;: No, as Motorola does not allow people to customize their smartphones. &lt;a href="http://www.droid-life.com/2011/01/19/motorola-tells-customer-to-buy-elsewhere-if-they-want-custom-roms/"&gt;Motorola Tells Customer to “Buy Elsewhere” if They Want Custom ROMs&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Sony_Ericsson"&gt;Sony Ericsson&lt;/a&gt;: Since Sony Ericsson moved away from Symbian and Windows Mobile towards Android, they seem to have a competitive edge again. Sony Ericsson does not follow any standards so they lose many points for power users. There are some phones that use standards, like using &lt;a href="http://en.wikipedia.org/wiki/microSD"&gt;microSD&lt;/a&gt; instead of Sony proprietary &lt;a href="http://en.wikipedia.org/wiki/Memory_Stick" title="Memory Stick"&gt;Memory Stick&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Android_%28mobile_device_platform%29"&gt;Google Android&lt;/a&gt; Yes, Android 4 almost catch up to iOS, but before you buy an Android device be aware of the &lt;a href="http://code.google.com/p/android/issues/list"&gt;huge list of bugs that Android needs to fix&lt;/a&gt; so you can know if it fits your needs. Google wasted too many resources on things like &lt;a href="http://www.youtube.com/watch?v=bFRxjnl1W6g"&gt;live wallpapers, cool startup and shutdown animations&lt;/a&gt;, 3D galleries, improving support for games and trying to replace Java with native code because of the Oracle lawsuit, but that made them lag too much from iOS because Google did not fix bugs or added requested features. Android seem to not target the enterprise or high demanding users (&lt;a href="http://code.google.com/p/android/issues/detail?id=11211"&gt;Android lacks external storage encryption support&lt;/a&gt; and &lt;a href="http://code.google.com/p/android/issues/detail?id=1106"&gt;backup/restore&lt;/a&gt;). Google should not allow carriers to use the Android brand on crappy products (&lt;a href="http://www.betabeat.com/2011/07/29/why-my-mom-bought-an-android-returned-it-and-got-an-iphone/"&gt;Why My Mom Bought an Android, Returned It, and Got an iPhone&lt;/a&gt;). Some Android Google Applications  have less functionality than the Web ones (&lt;a href="http://code.google.com/p/android/issues/detail?id=5990"&gt;Contacts lacks birthdate edit&lt;/a&gt;), &lt;a href="http://code.google.com/p/android/issues/detail?id=1027"&gt;I also miss notifications since I mostly have the phone sound turned off and the vibration is so sort and not repeating that I miss reminders&lt;/a&gt; and some minor clicking sound when playing low samplerate MP3s like voice. &lt;a href="http://code.google.com/p/android/issues/detail?id=3732"&gt;Google misses to implement search for all the information stored in the phone&lt;/a&gt;, the only one thing you would expect from Google. Android also has some major bugs like &lt;a href="http://code.google.com/p/android/issues/detail?id=2719"&gt;Issue 2719: Issues with character encoding of non-ascii multi-message SMS&lt;/a&gt; and useful ones like &lt;a href="http://code.google.com/p/android/issues/detail?id=1273"&gt;per connection HTTP Proxy configuration&lt;/a&gt;. Also, &lt;a href="http://www.flickr.com/photos/eperez/4393686146/"&gt;it is too common for Google sync to have problems&lt;/a&gt;. &lt;a href="http://code.google.com/p/android/issues/detail?id=5391"&gt;Android also lacks a month view datepicker&lt;/a&gt; (with the current &lt;a href="http://www.androidpeople.com/wp-content/uploads/2010/01/datepickerdialog.png"&gt;android datepicker&lt;/a&gt; it is difficult to pick a date).&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://www.youtube.com/user/phonedog"&gt;phonedog&lt;/a&gt; does some decent mobile phones video reviews.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Mobile_operating_system#Smartphone_OS_comparison"&gt;Smartphone OS comparison&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-7773413429642414825?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/7773413429642414825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=7773413429642414825' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/7773413429642414825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/7773413429642414825'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/09/my-ideal-mobile-device.html' title='My ideal mobile device'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19764600.post-3368916210767481495</id><published>2008-09-11T22:04:00.014Z</published><updated>2010-09-05T17:06:01.813Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='browsers'/><title type='text'>Microsoft Internet Explorer Bugs</title><content type='html'>Most clients still have &lt;a href="http://en.wikipedia.org/wiki/Internet_Explorer"&gt;Microsoft Internet Explorer&lt;/a&gt; 6 as required web platform and I have to support it for web applications. Being &lt;a href="http://en.wikipedia.org/wiki/Internet_Explorer"&gt;Microsoft Internet Explorer&lt;/a&gt; such a badly designed browser have lots problems that make developers do workarounds to make the code run and prevent any crashes on MSIE. Microsoft will support &lt;a href="http://en.wikipedia.org/wiki/Internet_Explorer_6"&gt;MSIE6&lt;/a&gt; until 2014 so the future of web innovation is endangered by Microsoft.&lt;br /&gt;&lt;br /&gt;This is a (growing) list of bugs of Microsoft Internet Explorer make my life harder:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://ajaxian.com/archives/ajax-ie-caching-issue"&gt;XMLHttpRequest MSIE Caching Bug&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webbugtrack.blogspot.com/2007/10/bug-235-createelement-is-broken-in-ie.html"&gt;createElement is broken in MSIE&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Many &lt;a href="http://en.wikipedia.org/wiki/XMLHttpRequest"&gt;XMLHttpRequest&lt;/a&gt; related bugs like &lt;a href="http://bytes.com/forum/thread643080.html"&gt;MSIE "crashes" on close of window&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Lack of integrated spell checker for textareas. You can download &lt;a href="http://www.iespell.com/"&gt;ieSpell&lt;/a&gt; but you should be using &lt;a style="" href="http://en.wikipedia.org/wiki/Mozilla_Firefox"&gt;Mozilla Firefox&lt;/a&gt; that already has integrated spell checker.&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/gpde/pages/javascript-memory-leak-detector.aspx"&gt;Memory leaks in MSIE in circular references between JavaScript and DOM objects&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://webbugtrack.blogspot.com/"&gt;Web Bug Track&lt;/a&gt; is a great list of mostly MSIE bugs.&lt;br /&gt;&lt;br /&gt;Please, &lt;a href="http://www.shlomifish.org/no-ie/"&gt;STOP using Microsoft Internet Explorer NOW&lt;/a&gt;! or at least &lt;a href="http://www.bringdownie6.com/"&gt;Bring Down MSIE6!&lt;/a&gt; &lt;a href="http://www.techcrunch.com/2009/07/14/youtube-will-be-next-to-kiss-ie6-support-goodbye/"&gt;Google is already taking steps by unsupporting MSIE6 soon&lt;/a&gt;. You may want to use &lt;a href="http://ie6update.com/"&gt;IE6 Update&lt;/a&gt; to make your users upgrade.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=JyQolo0Xdqw"&gt;Can Microsoft get any lower?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-3368916210767481495?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/3368916210767481495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=3368916210767481495' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/3368916210767481495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/3368916210767481495'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/09/microsoft-internet-explorer-bugs.html' title='Microsoft Internet Explorer Bugs'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-4098732807263594785</id><published>2008-09-08T22:21:00.004Z</published><updated>2010-01-30T20:11:42.321Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>C Libraries</title><content type='html'>These are some of the &lt;a href="http://en.wikipedia.org/wiki/C_%28programming_language%29"&gt;C&lt;/a&gt; libraries that I use and I recommend:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/GTK+"&gt;GTK+&lt;/a&gt; my preferred open source &lt;a href="http://en.wikipedia.org/wiki/Graphical_user_interface"&gt;GUI&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Widget_toolkit"&gt;widget toolkit&lt;/a&gt; (used in the &lt;a style="" href="http://en.wikipedia.org/wiki/GNOME"&gt;GNOME&lt;/a&gt; desktop)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/SQLite"&gt;SQLite&lt;/a&gt; best embeddable &lt;a href="http://en.wikipedia.org/wiki/SQL"&gt;SQL&lt;/a&gt; database (take a look at &lt;a href="http://www.sqlite.org/lockingv3.html"&gt;File Locking And Concurrency In SQLite Version 3&lt;/a&gt; so you can be sure that your data is safe with SQLite) (It is used in products like &lt;a href="http://en.wikipedia.org/wiki/Mozilla_Firefox"&gt;Mozilla Firefox&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Google"&gt;Google&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Android_%28mobile_phone_platform%29"&gt;Android&lt;/a&gt;, &lt;a style="" href="http://en.wikipedia.org/wiki/iPhone"&gt;iPhone&lt;/a&gt; and new &lt;a href="http://en.wikipedia.org/wiki/Symbian_OS"&gt;Symbian&lt;/a&gt; based phones)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-4098732807263594785?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/4098732807263594785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=4098732807263594785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4098732807263594785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4098732807263594785'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/09/c-libraries.html' title='C Libraries'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-1770307916692866571</id><published>2008-08-31T22:43:00.009Z</published><updated>2010-05-29T08:46:07.830Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>On Mozilla Firefox</title><content type='html'>I do not understand why &lt;a href="http://en.wikipedia.org/wiki/Mozilla_Firefox"&gt;Mozilla Firefox&lt;/a&gt; developers are so slow to fixing some usability bugs like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=249338"&gt;Bug 249338 – progressbar doesn't indicate upload progress&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=123913"&gt;Bug 123913 -  [RFE] tab-specific alerts are window-modal and should be tab-modal (need "sheets" widgets on non-MacOSX)&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;I am trying to fix some critical bugs related to saved files corruption like &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=226970"&gt;Bug 226970 – lost of all stored passwords if out of disk space file truncated to zero length&lt;/a&gt; but it is a tough endeavor since the OS abstraction library of &lt;a href="http://www.nabble.com/Adding-an-atomic-file-write-implementation-to-NSPR-to-fix-some-critical-bugs-p18430766.html"&gt;Mozilla NSPR seems to be unmaintained as nobody replied to my email offering my help to fix these bugs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mozilla has also do some changes like &lt;a href="http://tech.slashdot.org/tech/08/08/22/1139236.shtml"&gt;unverified SSL-Certificate management UI&lt;/a&gt; that may not be in the users interests but in the &lt;a href="http://en.wikipedia.org/wiki/Certificate_authority"&gt;CA&lt;/a&gt; industry ones. That &lt;a href="http://en.wikipedia.org/wiki/User_interface"&gt;UI&lt;/a&gt; has been thought to make users life much difficult when using non CA signed SSL-Certificates thus having websites pay for CA certificates. They could have just issued a big warning every time the user browses a non CA signed website instead of the ugly UI that may have been paid by the CA industry.&lt;br /&gt;&lt;br /&gt;Mozilla has historically not collaborated with the libre opensource community, making Mozilla code huge, thus needing many developers to properly maintaining it. Until Firefox3 it had an in house graphics renderer but switched to the powerful &lt;a href="http://en.wikipedia.org/wiki/Cairo_%28graphics%29"&gt;cairo&lt;/a&gt;. Same with data storage where it used the braindamaged &lt;a href="http://en.wikipedia.org/wiki/Mork_%28file_format%29"&gt;Mork file format&lt;/a&gt; (as &lt;a href="http://en.wikipedia.org/wiki/Jamie_Zawinski" title="Jamie Zawinski"&gt;Jamie Zawinski&lt;/a&gt; rightfully calls it) but switched to the powerful &lt;a href="http://en.wikipedia.org/wiki/SQLite"&gt;SQLite&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If Mozilla wants to succeed in the long run, they must collaborate with the libre opensource community by depending on other projects (and supporting them) instead of developing all their software in-house.&lt;br /&gt;&lt;br /&gt;Mozilla Firefox now also has to compete with &lt;a href="http://en.wikipedia.org/wiki/Google_Chrome"&gt;Google Chrome&lt;/a&gt; as &lt;a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;amp;taxonomyName=Internet+Applications&amp;amp;articleId=9124141&amp;amp;taxonomyId=168&amp;amp;pageNumber=2"&gt;it seems like Google, that pays up to 80% of Mozilla Firefox development, will cut the funding when Google Chrome surpasses in users to Firefox&lt;/a&gt;. Google would not have started Google Chrome development if they thought Mozilla developers would be good enough to deliver a quality browser and Google will not backup their plans since Google Chrome is already out of beta and bundled with other Google tools.&lt;br /&gt;&lt;br /&gt;With all these problems Mozilla Firefox future seems to be quite unclear. I think Firefox will start losing all the users when Google Chrome has all the features that Firefox users currently have and a Linux and Mac OS X port is released.&lt;br /&gt;&lt;br /&gt;This is the list of add-ons I consider a must have for Firefox:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://adblockplus.org/"&gt;Adblock Plus&lt;/a&gt; prevents advertisements&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/es-ES/firefox/addon/14439/"&gt;Tabberwocky&lt;/a&gt; opens new tabs just next to the current one.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://flashblock.mozdev.org/"&gt;FlashBlock&lt;/a&gt; only runs flash content when clicked on it&lt;/li&gt;&lt;li&gt;&lt;a href="http://livehttpheaders.mozdev.org/"&gt;livehttpheaders&lt;/a&gt; see HTTP headers of all the requests. This is for developers mainly&lt;/li&gt;&lt;li&gt;&lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt; is the best companion to help develop web pages. It lets you see the DOM, CSS, JavaScript, HTTP requests. This is also for developers mainly&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-1770307916692866571?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/1770307916692866571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=1770307916692866571' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/1770307916692866571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/1770307916692866571'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/08/on-mozilla-firefox.html' title='On Mozilla Firefox'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-1089553107855937645</id><published>2008-08-28T22:24:00.025Z</published><updated>2010-05-08T19:27:34.136Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='quilt'/><category scheme='http://www.blogger.com/atom/ns#' term='CVS'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='vcs'/><title type='text'>On Version Control Systems</title><content type='html'>Using a &lt;a href="http://en.wikipedia.org/wiki/Version_control_system"&gt;Version Control System&lt;/a&gt; is a must for any software development right from the start (even if your boss denies it). Here are some of my reviews:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/52447/switching-form-vss-to-cvs-what-features-are-lost-in-visual-studio"&gt;Microsoft Visual SourceSafe is a so bad product that anybody will tell you to use at least the basic CVS&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/PVCS"&gt;Serena  Dimensions PVCS&lt;/a&gt; is outdated and dysfunctional. I have used it in some projects but it causes more problems than it tries to solve. &lt;a href="http://www.spearce.org/2005/06/the_horrors_of.html"&gt;The horrors of PVCS Version Manager&lt;/a&gt; is a good thread to get a fell of the problems. Among the problems I found when using it were excessive bureaucracy that slowed development too much (PVCS needs a full time administrator even for the most simple projects). PVCS needs training to use it as it is quite different from other VCS. PVCS being lock based slows down development a lot. And finally &lt;a href="http://www.cmcrossroads.com/component/option,com_fireboard/Itemid,593/func,view/id,92127/catid,23/"&gt;no good merge functionality&lt;/a&gt;. &lt;a href="http://www.cmcrossroads.com/component/option,com_fireboard/Itemid,593/func,view/id,93277/catid,22/"&gt;Most PVCS users are migrating to either Perforce&lt;/a&gt;, Subversion or Git.&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/1074580/clearcase-advantages-disadvantages"&gt;IBM Rational ClearCase has no atomic commits, is no distributed, the license is quite expensive and requires a qualified administrator.&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Perforce"&gt;Perforce&lt;/a&gt;. I have not used perforce ever but the only one open source project I knew, &lt;a href="http://use.perl.org/articles/08/12/22/0830205.shtml"&gt;Perl, was still using Perforce switched to Git&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/182298/subversion-versus-vault"&gt;SourceGear Vault just does not get any better than subversion&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Concurrent_Versions_System"&gt;CVS&lt;/a&gt; is not appropriate these days because it does not save changesets of all the changed files in the server (CVS saves changes on each file separately making it hard to know all the changes made on other files at the same time) and predates defaults that are not useful today (like not using unified diffs by default)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Subversion_%28software%29"&gt;Subversion&lt;/a&gt; is an improved CVS with current defaults and true changesets of a set of files, but make branching and merging quite hard and is not well suited for disconnected or distributed development.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Git_%28software%29"&gt;Git&lt;/a&gt; is steadily becoming the de facto standard VCS (used in projects like the &lt;a href="http://en.wikipedia.org/wiki/Linux_kernel"&gt;Linux kernel&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/X.org"&gt;X.org&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Samba_%28software%29"&gt;Samba&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/GNOME"&gt;GNOME&lt;/a&gt;) that makes distributed and disconnected development much easier than subversion and is steadily taking subversion users. Git allows you doing things that other VCS just dream of, like &lt;a href="http://www.gnome.org/%7Efederico/news-2008-08.html#git-rebase-interactive"&gt;git rebase --interactive&lt;/a&gt;. &lt;a href="http://whygitisbetterthanx.com/"&gt;Why Git is Better Than X&lt;/a&gt;. Anyway, &lt;a href="http://thomas.apestaart.org/log/?p=898"&gt;Git still has a difficult to use command line interface&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Monotone_%28software%29"&gt;Monotone&lt;/a&gt; is a DVCS inferior to git: &lt;a href="http://developer.pidgin.im/wiki/MonotoneLimitations"&gt;MonotoneLimitations&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Mercurial_%28software%29"&gt;Mercurial&lt;/a&gt; is Git big contender. It is also used in many important projects. Mercurial was suggested for Linux kernel development but Git instead was created. &lt;a href="http://code.google.com/p/support/wiki/DVCSAnalysis"&gt;Google has chosen Mercurial for Google Code instead of Git&lt;/a&gt; because Mercurial command set is more similar to Subversion, it is written in Python that is supported in Google infrastructure and has efficient HTTP based transport, but they recognize Git has more features.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Quilt_%28software%29"&gt;Quilt&lt;/a&gt; is a great simple tool to maintain a set of patches that can make your life much easier when you have a set of patches applied to upstream software that you want to keep updated for any new upstream version.&lt;/li&gt;&lt;/ul&gt;My favorites are Git and Quilt and I consider CVS totally obsolete and Subversion is becoming obsolete for most development use cases but maybe to keep upstream versioning.&lt;br /&gt;&lt;br /&gt;This is a list of features I need in a VCS (I got most from &lt;a href="http://better-scm.berlios.de/comparison/comparison.html"&gt;Version Control System Comparison&lt;/a&gt;):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;See what is going to be commited (aka the full changeset) instead of just the modified, added, deleted files. With most VCSs I have to command diff and then command commit. This of course needs to allow aborting the commit operation. This feature is most useful to newbies that do not know that they always have to diff prior to commit to see if they see the changes they really want to commit or not.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Atomic commits (aka &lt;a href="http://en.wikipedia.org/wiki/Changeset"&gt;Changeset&lt;/a&gt;s) are a must. CVS and the crappy Visual Sourcesafe do not have atomic commits. Most modern VCSs have atomic commits.&lt;/li&gt;&lt;li&gt;Files and Directories Moves or Renames. CVS does not have moves or renames but subversion and git do. &lt;a href="http://stackoverflow.com/questions/1537616/handling-renames-svn-vs-git-vs-mercurial"&gt;Handling renames: svn vs. git vs. mercurial&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Remote repository replication. To be able to browse the history while offline. CVS and Subversion have some external programs to be able to do that. But you need a modern VCS like git to be able to get the history and work with it natively.&lt;/li&gt;&lt;li&gt;Propagating Changes to Parent Repositories and Disconnected operation. Be able to commit many changes without being online and be able to submit these changes upstream when I become online. CVS and subversion only support on-line operation so they are discarded.&lt;/li&gt;&lt;li&gt;Tracking Line-wise File History. I want to know who and when changed some line. cvs annotate, svn blame, git blame, ...&lt;/li&gt;&lt;li&gt;Networking support with HTTP and HTTPS to be able to access the repository behind a HTTP proxy. subversion and git can support it while CVS does not.&lt;/li&gt;&lt;li&gt;Easy branching, merging and rebasing: When I need to code a new feature or fix a new bug I want to base my new code in the latest stable code, not in the work-in-progress feature that it is not finished yet, and be able to work on many features in paralell without any interference between them. Whenever these features are ready and tested I want to easily merge them to mainline. This means being able to change branches quickly is a must. Since mainline could have been changing I want to be able to rebase my changes to the latest mainline. CVS, Subversion and perforce make merging painful so they are discarded. git is great for this kind of operation.&lt;/li&gt;&lt;li&gt;Easily revert a merged feature. I do not mind losing the history of the coding of the feature but it must be easy to revert them.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I want to easily make changes to upstream projects that are constantly changing and rebase my changes easily whenever I want.&lt;/li&gt;&lt;li&gt;Partial Pull: Be able to get just the last revision instead of the whole history of a project, just like CVS and subversion do. Monotone is not able to work just with the last revision and you have to get the huge whole history of the project.&lt;/li&gt;&lt;li&gt;I want to see merge requests from my developers and with a click accept the merge request or reject it with a comment. So developers should be able to submit merge requests. I do not want to lose any merge request and multiple merge requests of the same branch should be merged (so email will not work here).&lt;/li&gt;&lt;li&gt;Be able to completely remove a commit or file, committed by error or that may contain confidential information that should never be in the history. Subversion has problems with this use case (&lt;a href="http://stackoverflow.com/questions/1648115/how-to-remove-an-accidentally-put-large-file-4gb-from-subversion-repository"&gt;How to remove an accidentally put large file (4GB) from Subversion repository&lt;/a&gt;) but git lets you rebase the project history quite easily (&lt;a href="http://stackoverflow.com/questions/250238/collapsing-a-git-repositorys-history"&gt;Collapsing a git repository's history&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://martinfowler.com/"&gt;Martin Fowler&lt;/a&gt; has a good article on &lt;a href="http://martinfowler.com/bliki/VersionControlTools.html"&gt;Version Control Tools&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-1089553107855937645?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/1089553107855937645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=1089553107855937645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/1089553107855937645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/1089553107855937645'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/08/on-version-control-systems.html' title='On Version Control Systems'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-8133413850563193449</id><published>2008-08-07T14:24:00.039Z</published><updated>2009-11-15T16:46:31.803Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>On JavaScript WEB Application Frameworks</title><content type='html'>I have found &lt;a href="http://en.wikipedia.org/wiki/JQuery"&gt;jQuery&lt;/a&gt; to be the best library for JavaScript web development. jQuery has the biggest community, more high quality plug-ins than any other JavaScript library and I have found it is the best designed library. Most projects are moving to jQuery from other JavaScript libraries like &lt;a href="http://en.wikipedia.org/wiki/Prototype_JavaScript_Framework"&gt;Prototype JavaScript Framework&lt;/a&gt; (&lt;a href="http://www.quarkruby.com/2007/11/6/why-i-moved-from-prototype-to-jquery"&gt;See this article of a developer that migrated from Prototype to JQuery&lt;/a&gt; and this &lt;a href="http://trac.midgard-project.org/ticket/23"&gt;ticket about the midgard migration from prototype to jQuery&lt;/a&gt;) or like &lt;a href="http://en.wikipedia.org/wiki/Dojo_Toolkit"&gt;Dojo&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Yahoo%21_UI_Library"&gt;YUI&lt;/a&gt;  (&lt;a href="http://developer.ning.com/forum/topic/show?id=1185512%3ATopic%3A67927"&gt;Ning moved from Dojo to jQuery&lt;/a&gt; &lt;a href="http://www.chipx86.com/blog/?p=265"&gt;Djblets and Review Board moving from YUI to jQuery&lt;/a&gt; &lt;a href="http://www.marcworrell.com/article-1284-en.html"&gt;anyMeta moves from Dojo to JQuery&lt;/a&gt;). I still have to check out &lt;a href="http://en.wikipedia.org/wiki/Google_Web_Toolkit"&gt;Google Web Toolkit&lt;/a&gt; (it seems like the ideal bet, but it uses its own &lt;a href="http://code.google.com/webtoolkit/documentation/com.google.gwt.doc.DeveloperGuide.RemoteProcedureCalls.html"&gt;GWT-RPC protocol&lt;/a&gt; by default that is not a standard web service interface). (See this &lt;a href="http://wiki.freaks-unidos.net/javascript-libraries"&gt;Evaluation of JavaScript Libraries&lt;/a&gt; and &lt;a href="http://www.reddit.com/r/programming/comments/61xbz/evaluation_of_5_javascript_libraries_dojo?sort=top"&gt;reddit comments on it&lt;/a&gt;). Now, that &lt;a href="http://jquery.com/blog/2008/09/28/jquery-microsoft-nokia/"&gt;Microsoft and Nokia are supporting jQuery&lt;/a&gt; it is by no doubt the best option to choose. &lt;a href="http://stackoverflow.com/questions/176324/why-does-everyone-like-jquery-more-than-prototypescriptaclous-or-mootools-or-wh"&gt;Why does everyone like jQuery more than prototype/script.aclo.us or mootools or whatever?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Comparison_of_JavaScript_frameworks"&gt;Comparison of JavaScript frameworks&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These are my favorite &lt;a href="http://plugins.jquery.com/"&gt;jQuery plugins&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jqueryui.com/"&gt;jQuery UI&lt;/a&gt; high quality basic widgets&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://tablesorter.com/"&gt;Tablesorter&lt;/a&gt; makes any HTML table client sortable&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mikage.to/jquery/jquery_history.html"&gt;History&lt;/a&gt; prevents the client application from breaking the back button&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.reach1to1.com/sandbox/jquery/testform.html"&gt;Form Deserialization&lt;/a&gt; deserialize JSON to a HTML form&lt;/li&gt;&lt;li&gt;&lt;a href="http://malsup.com/jquery/form/"&gt;Form&lt;/a&gt; makes any form AJAX ready with little code&lt;/li&gt;&lt;li&gt;&lt;a href="http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/"&gt;Autocomplete&lt;/a&gt; text input autocompletion (both local and remote even using JSON)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Most browsers are getting or are quite optimized for &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; execution like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Mozilla_Application_Suite"&gt;Mozilla&lt;/a&gt;'s &lt;a href="http://en.wikipedia.org/wiki/SpiderMonkey_%28JavaScript_engine%29"&gt;SpiderMonkey&lt;/a&gt; &lt;a href="http://arstechnica.com/news.ars/post/20080822-firefox-to-get-massive-javascript-performance-boost.html"&gt;TraceMonkey&lt;/a&gt; for &lt;a href="http://en.wikipedia.org/wiki/Mozilla_Firefox"&gt;Firefox&lt;/a&gt; 3.5&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/WebKit"&gt;WebKit&lt;/a&gt;'s &lt;a href="http://en.wikipedia.org/wiki/WebKit#JavaScriptCore"&gt;JavaScriptCore&lt;/a&gt; &lt;a href="http://webkit.org/blog/189/announcing-squirrelfish/"&gt;SquirrelFish&lt;/a&gt; is starting to get results&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Google_Chrome"&gt;Google Chrome&lt;/a&gt;'s &lt;a href="http://en.wikipedia.org/wiki/V8_JavaScript_engine"&gt;V8&lt;/a&gt; already is quite optimized for JavaScript&lt;/li&gt;&lt;/ul&gt;See this &lt;a href="http://ejohn.org/blog/javascript-performance-rundown/" title="John Resig"&gt;comparison of JavaScript engines by John Resig&lt;/a&gt;&lt;a href="http://ejohn.org/blog/javascript-performance-rundown/"&gt; of jQuery fame&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;That means that Client Web Applications will run much faster and will allow for much more than is currently possible. So, it is time to start betting for a future of JavaScript Web Applications that contact the server using &lt;a href="http://en.wikipedia.org/wiki/XMLHttpRequest"&gt;XMLHttpRequest&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt; WEB Services. I also bet this will put &lt;a href="http://en.wikipedia.org/wiki/Server-side_scripting"&gt;dynamic server web pages&lt;/a&gt; technologies (like &lt;a href="http://en.wikipedia.org/wiki/JavaServer_Pages"&gt;JSP&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/PHP"&gt;PHP&lt;/a&gt;, ...) on extinction (also because these technologies do not use &lt;a href="http://en.wikipedia.org/wiki/Document_Object_Model"&gt;DOM&lt;/a&gt; to manipulate &lt;a href="http://en.wikipedia.org/wiki/XHTML"&gt;XHTML&lt;/a&gt; and I think it is the only correct way).&lt;br /&gt;&lt;br /&gt;A web indexer (like Google) just needs to access the raw resources using REST. It should not crawl any web application. And these resources should be raw (without any decoration like navigation menus) and just one resource per URL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-8133413850563193449?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/8133413850563193449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=8133413850563193449' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8133413850563193449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8133413850563193449'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/08/on-javascript-web-application.html' title='On JavaScript WEB Application Frameworks'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-9062066951136094242</id><published>2008-08-04T17:11:00.015Z</published><updated>2010-01-06T22:18:00.982Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='boycott'/><title type='text'>My Boycotts</title><content type='html'>This is the list of my boycotts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Microsoft for the development of alternative and bad designed file formats like &lt;a href="http://www.noooxml.org/"&gt;OOXML&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/XML_Paper_Specification"&gt;XML Paper Specification&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Extensible_Application_Markup_Language"&gt;Extensible Application Markup Language&lt;/a&gt; (&lt;a href="http://tech.slashdot.org/story/10/01/06/1829223/Microsoft-Wants-To-Participate-In-SVG-Development"&gt;XAML was a failure and Microsoft is trying to embrace and extend SVG to make it fail&lt;/a&gt;) when there are already standards like &lt;a href="http://en.wikipedia.org/wiki/OpenDocument"&gt;OpenDocument&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Portable_Document_Format"&gt;Portable Document Format&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Scalable_Vector_Graphics"&gt;Scalable Vector Graphics&lt;/a&gt; respectively. You can laugh or cry at &lt;a href="http://entertainment.slashdot.org/entertainment/08/10/14/0120221.shtml"&gt;Microsoft's Ethical Guidelines?&lt;/a&gt;. &lt;a href="http://www.consortiuminfo.org/standardsblog/article.php?story=20070629070544217"&gt;There They Go Again:  It's Time to Just Say No to Microsoft and Ecma&lt;/a&gt;. The worst part is that people that buy Microsoft products pay them so they can change they formats and have their costumers buy the same software again and again. Microsoft is also using outdated file formats like &lt;a href="http://en.wikipedia.org/wiki/BMP_file_format"&gt;BMP&lt;/a&gt; (by default in &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Paint"&gt;Microsoft Paint&lt;/a&gt;). &lt;a href="http://www.hiptop3.com/archives/what-caused-the-sidekick-fail"&gt;Microsoft still does not know how important a Backup is, losing people data&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sony for the development of alternative technologies like &lt;a href="http://en.wikipedia.org/wiki/Memory_Stick"&gt;Memory Stick&lt;/a&gt; instead of using de facto standards like &lt;a href="http://en.wikipedia.org/wiki/Secure_Digital_card"&gt;Secure Digital card&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;These previous companies create such alternative technologies just to lock-in users and have them pay more than they would in a competitive market.&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.airis.es/"&gt;Airis&lt;/a&gt; is synonymous of bad design. I have had an Airis DVB-T receiver where the remote control worked extremely bad in comparison with other products and this DVB-T finally exploded (thank god the case contained the explosion). &lt;a href="http://www.ciao.es/airis_computer_com__405759"&gt;You can find lots of criticism of www.airis-computer.com out there&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/El_Mundo_%28Spain%29" title="El Mundo (Spain)"&gt;El Mundo&lt;/a&gt; Spanish newspaper. &lt;a href="http://www.borjaventura.com/2009/02/04/mentirosos/"&gt;El Mundo publishes manipulated graphs provided by the Partido Popular political party&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-9062066951136094242?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/9062066951136094242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=9062066951136094242' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/9062066951136094242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/9062066951136094242'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/08/my-boycotts.html' title='My Boycotts'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-4433884540761290334</id><published>2008-08-04T15:18:00.012Z</published><updated>2009-11-02T22:38:57.316Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='public key cryptography'/><category scheme='http://www.blogger.com/atom/ns#' term='authentication'/><title type='text'>On Authentication</title><content type='html'>I think &lt;a href="http://en.wikipedia.org/wiki/Public-key_cryptography" title="Public-key cryptography"&gt;public-key cryptography&lt;/a&gt; &lt;a style="" href="http://en.wikipedia.org/wiki/Authentication" title="Authentication"&gt;authentication&lt;/a&gt; will be the only authentication system used in the future, totally replacing &lt;a href="http://en.wikipedia.org/wiki/User_name" class="mw-redirect" title="User name"&gt;user name&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Password" title="Password"&gt;password&lt;/a&gt; authentication.&lt;br /&gt;&lt;br /&gt;Currently we have to keep lots of passwords in mind or in a &lt;a href="http://en.wikipedia.org/wiki/Password_manager"&gt;password manager&lt;/a&gt; because every site needs a different one (you can not use the same password on every site since if someone has access to your password at any site he would have access to any of your sites).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Public-key_cryptography" title="Public-key cryptography"&gt;Public-key cryptography&lt;/a&gt; &lt;a style="" href="http://en.wikipedia.org/wiki/Authentication" title="Authentication"&gt;authentication&lt;/a&gt; also allows us to not require the usage of &lt;a href="http://en.wikipedia.org/wiki/Public_key_infrastructure"&gt;public key infrastructure&lt;/a&gt; and be able to have a decentralized &lt;a href="http://en.wikipedia.org/wiki/Web_of_trust"&gt;web of trust&lt;/a&gt;. &lt;a href="http://en.wikipedia.org/wiki/Privacy-enhanced_Electronic_Mail"&gt;Privacy-enhanced Electronic Mail&lt;/a&gt; will not work in a hierarchy of trust.&lt;br /&gt;&lt;br /&gt;To replace &lt;a href="http://en.wikipedia.org/wiki/User_name" class="mw-redirect" title="User name"&gt;user name&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Password" title="Password"&gt;password&lt;/a&gt; authentication with &lt;a href="http://en.wikipedia.org/wiki/Public-key_cryptography" title="Public-key cryptography"&gt;public-key cryptography&lt;/a&gt; &lt;a style="" href="http://en.wikipedia.org/wiki/Authentication" title="Authentication"&gt;authentication&lt;/a&gt; in &lt;a href="http://en.wikipedia.org/wiki/World_Wide_Web"&gt;the web&lt;/a&gt; the first step would be making it easier to generate and use key pairs in the &lt;a href="http://en.wikipedia.org/wiki/Web_browser"&gt;web browser&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Public-key_cryptography" title="Public-key cryptography"&gt;Public-key cryptography&lt;/a&gt; &lt;a style="" href="http://en.wikipedia.org/wiki/Authentication" title="Authentication"&gt;authentication&lt;/a&gt; also has the advantage of being &lt;a href="http://en.wikipedia.org/wiki/Single_sign-on"&gt;single sign-on&lt;/a&gt; as you only has to type the password of your private key once for all the session.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Smart_cards#Cryptographic_smart_cards"&gt;Cryptographic smart cards&lt;/a&gt; are the most secure way of authentication as they keep the private key always on the card and are also password protected.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Van_Jacobson"&gt;Van Jacobson&lt;/a&gt; is currently leading this &lt;a href="http://en.wikipedia.org/wiki/Copernican_Revolution"&gt;Copernican Revolution&lt;/a&gt; to make the Internet a &lt;a href="http://en.wikipedia.org/wiki/Content-centric_networking"&gt;Content-centric networking&lt;/a&gt; by disassociating the network from the data. He explains it in &lt;a href="http://www.youtube.com/watch?v=8Z685OF-PS8"&gt;A New Way to look at Networking&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-4433884540761290334?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/4433884540761290334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=4433884540761290334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4433884540761290334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4433884540761290334'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/08/on-authentication.html' title='On Authentication'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-3532757242363687056</id><published>2008-07-25T01:43:00.025Z</published><updated>2009-03-28T11:19:17.579Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><title type='text'>On Server side WEB Application Frameworks</title><content type='html'>Server side &lt;a href="http://en.wikipedia.org/wiki/Web_application_framework"&gt;web application framework&lt;/a&gt;s are a dead end.&lt;br /&gt;&lt;br /&gt;Now that most mobile phones have good &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; support (mostly by the use of &lt;a href="http://en.wikipedia.org/wiki/WebKit"&gt;WebKit&lt;/a&gt; in them) and are not just dumb terminals, it is time to develop only client side web applications and stop using the page-per-request web application model.&lt;br /&gt;&lt;br /&gt;The future is &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt; (to let web crawlers index the web) or maybe other &lt;a href="http://en.wikipedia.org/wiki/Service-oriented_architecture"&gt;Service-oriented architecture&lt;/a&gt; protocol and &lt;a href="http://en.wikipedia.org/wiki/XML"&gt;XML&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/JSON"&gt;JSON&lt;/a&gt; for the data.&lt;br /&gt;&lt;br /&gt;The main problem with server side web application frameworks are the load that impose HTML generation on the server and also the long waits to process an action that maybe the server does not need to deal with.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Struts"&gt;Struts&lt;/a&gt; (both Struts1 and Struts2 aka &lt;a href="http://en.wikipedia.org/wiki/WebWork"&gt;WebWork&lt;/a&gt;) have a problem with its design since although there is a controller that forwards actions to views you already need to know what view you are going to render since you have to pass the correct beans to it thus breaking the &lt;a href="http://en.wikipedia.org/wiki/Model_View_Controller" title="Model View Controller"&gt;Model View Controller&lt;/a&gt; (MVC) &lt;a href="http://en.wikipedia.org/wiki/Architectural_pattern_%28computer_science%29" title="Architectural pattern (computer science)"&gt;architectural pattern&lt;/a&gt;.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class MyAction extends ActionSupport&lt;br /&gt;{&lt;br /&gt;public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;request.setAttribute("myBean", myBean);&lt;br /&gt;return mapping.findForward("success");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Just by having to obtain a bean and attach it to the request for the view to render it you are associating a defined view, making &lt;code&gt;mapping.findForward("success");&lt;/code&gt; unneeded as you could just specify the actual view.&lt;br /&gt;&lt;br /&gt;Most server side &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;MVC&lt;/a&gt; (like &lt;a href="http://en.wikipedia.org/wiki/Struts"&gt;Struts&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/JavaServer_Faces"&gt;JavaServer Faces&lt;/a&gt;) frameworks are just anachronistic by not supporting REST Web Services and need to be replaced by implementing the controller in the client with JavaScript with &lt;a href="http://en.wikipedia.org/wiki/XHTML"&gt;XHTML&lt;/a&gt; for the view and accessing the data model using REST Web Services.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Model: &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt; with &lt;a href="http://en.wikipedia.org/wiki/JSON"&gt;JSON&lt;/a&gt; (with &lt;a href="http://en.wikipedia.org/wiki/XHTML"&gt;XHTML&lt;/a&gt; for documents)&lt;/li&gt;&lt;li&gt;View: &lt;a href="http://en.wikipedia.org/wiki/XHTML"&gt;XHTML&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Controller: &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-3532757242363687056?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/3532757242363687056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=3532757242363687056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/3532757242363687056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/3532757242363687056'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/07/on-server-side-web-application.html' title='On Server side WEB Application Frameworks'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-6483454820518319753</id><published>2008-07-15T17:52:00.010Z</published><updated>2009-11-22T12:54:12.223Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>On Surrogate keys</title><content type='html'>I am against the usage of &lt;a href="http://en.wikipedia.org/wiki/Surrogate_key"&gt;surrogate key&lt;/a&gt;s when you have a &lt;a href="http://en.wikipedia.org/wiki/Natural_key"&gt;natural key&lt;/a&gt; even being it of type VARCHAR.&lt;br /&gt;&lt;br /&gt;There should not be a problem using a VARCHAR as a primary key since if the database is correctly architected it may use internally an integer index to join to other tables. And anyway you always have to lookup the surrogate key from the natural key as the surrogate key should never be exposed outside of the application. You still have to declare UNIQUE the natural key and that will hurt the same (or even more), as having it as PRIMARY KEY, on INSERT.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/332300/is-there-a-real-performance-difference-between-int-and-varchar-primary-keys"&gt;Is there a REAL performance difference between INT and VARCHAR primary keys?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-6483454820518319753?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/6483454820518319753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=6483454820518319753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/6483454820518319753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/6483454820518319753'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/07/on-surrogate-keys.html' title='On Surrogate keys'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-5919854637018663485</id><published>2008-07-13T15:59:00.023Z</published><updated>2011-09-17T09:01:19.036Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='persistence'/><category scheme='http://www.blogger.com/atom/ns#' term='orm'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>On Database Persistence</title><content type='html'>Following the great failure of &lt;a href="http://en.wikipedia.org/wiki/Java_Platform%2C_Enterprise_Edition"&gt;Java EE&lt;/a&gt; 1.4 &lt;a href="http://en.wikipedia.org/wiki/Enterprise_JavaBean"&gt;Enterprise JavaBean&lt;/a&gt; 2.x &lt;a href="http://en.wikipedia.org/wiki/Entity_Bean"&gt;Entity Bean&lt;/a&gt; (&lt;a href="http://java.sun.com/j2ee/1.4/docs/tutorial/doc/BMP4.html"&gt;Bean-Managed Persistence&lt;/a&gt; &amp;amp; &lt;a href="http://java.sun.com/developer/technicalArticles/ebeans/EJB20CMP/"&gt;Container-Managed Persistence&lt;/a&gt;) (now deprecated). Please, read &lt;a href="http://www.wrox.com/WileyCDA/WroxTitle/productCd-0764558315.html"&gt;Expert One-on-One J2EE Development without EJB&lt;/a&gt; to understand why EJB 1.x and 2.x has hurt so much Java EE reputation. Also watch &lt;a href="http://www.infoq.com/presentations/Lessons-Learned-from-Java-EE"&gt;Rod Johnson - Lessons Learned from Java EE&lt;/a&gt; to understand the dangers of &lt;a href="http://en.wikipedia.org/wiki/Design_by_committee"&gt;design by committee&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I do not use any &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping"&gt;ORM&lt;/a&gt; tool in my Java projects as they create more problems than they try to solve. &lt;a href="http://stackoverflow.com/questions/530215/hibernate-vs-jpa-vs-jdo-pros-and-cons-of-each#530406"&gt;Hibernate vs JPA vs JDO - pros and cons of each?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codinghorror.com/blog/2006/06/object-relational-mapping-is-the-vietnam-of-computer-science.html"&gt;Object-Relational mapping is the Vietnam of Computer Science&lt;/a&gt;&lt;br /&gt;&lt;a href="http://seldo.com/weblog/2011/08/11/orm_is_an_antipattern"&gt;ORM is an anti-pattern&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/494816/using-an-orm-or-plain-sql"&gt;Using an ORM or plain SQL?&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;If you insist on using an &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping"&gt;ORM&lt;/a&gt;, here are two strong free implementations of the Java EE  &lt;a href="http://en.wikipedia.org/wiki/Java_Persistence_API"&gt;Java Persistence API&lt;/a&gt; (&lt;a href="http://en.wikibooks.org/wiki/Java_Persistence/What_is_JPA%3F"&gt;Java Persistence/What is JPA?&lt;/a&gt;) to choose from:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Hibernate_%28Java%29"&gt;Hibernate&lt;/a&gt; most popular &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping"&gt;ORM&lt;/a&gt; solution for Java.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/OpenJPA"&gt;OpenJPA&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://stackoverflow.com/questions/452385/what-java-orm-do-you-prefer-and-why"&gt;What Java ORM do you prefer, and why?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/576659/jpa-implementations-which-one-is-the-best-to-useJPA%20Implementations%20-%20Which%20one%20is%20the%20best%20to%20use?"&gt;JPA Implementations - Which one is the best to use?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-5919854637018663485?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/5919854637018663485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=5919854637018663485' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5919854637018663485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5919854637018663485'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/07/on-database-persistence.html' title='On Database Persistence'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-3455095895998311281</id><published>2008-07-05T17:17:00.022Z</published><updated>2010-07-24T19:31:40.602Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='applications'/><title type='text'>On task list managers</title><content type='html'>The use cases I need for a &lt;a href="http://en.wikipedia.org/wiki/Task_list"&gt;task list&lt;/a&gt; application are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I am at the middle of nowhere and some task pops up in my head. I need to save it quickly to prevent it being forgotten. I need to action my mobile phone into "new task" and type the text or record a voice message that will be voice recognized or later transcribed by me to text to be able to full text search it.&lt;/li&gt;&lt;li&gt;I also need to quickly append to tasks. So, I need to buy something and I just type shop and my shopping list entry appears. I select it and just add an item to it. (this feature needs full-text search with partial word matching)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I need to be able to &lt;a href="http://en.wikipedia.org/wiki/Full_text_search"&gt;full text search&lt;/a&gt; all my tasks, and since they are so many, they should be indexed to be able to search (like Google) by typing some words. They could be tag categorized (hierarchies are not as useful).&lt;/li&gt;&lt;li&gt;Each task should have a reviewed date attached to let me be able to review most old entries and update that date after review.&lt;/li&gt;&lt;li&gt;Tasks should notify me at a certain date/time and/or (using &lt;a href="http://en.wikipedia.org/wiki/Assisted_GPS"&gt;Assisted GPS&lt;/a&gt;) when I am near a place where I may be able to complete the task (just like &lt;a href="http://people.csail.mit.edu/hal/mobile-apps-spring-08/"&gt;Geolife&lt;/a&gt; does). To this end each task should have optional date/time and location fields.&lt;/li&gt;&lt;li&gt;There are certain repetitive tasks like, for example, cutting the grass that need to be rescheduled once they are completed (otherwise I forget and too much time can pass), so I need to set a time to notify and be able to review if it was too long or too short.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Be able to group tasks into toplevel projects or goals. So tasks can have subtasks. And be able to perform operations like review on a task's subtasks.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Any task may depend on any other task that would block the first task until it is completed. The user interface should (by default) show only tasks that do not depend on any other for completion. Dependent tasks may be external (maybe other person) and they may be on the shared task list with that other person or even in a public task list.&lt;/li&gt;&lt;li&gt;It needs to be scalable to a lot of task entries without losing performance. It should be as O(1) as possible. I have 800 tasks just for one year of use (the Nokia N80 slows a lot with so many tasks) so it would need to be scalable to 100000 tasks to cover a life time. This requirement adds up to using efficient storage like &lt;a href="http://en.wikipedia.org/wiki/SQLite"&gt;SQLite&lt;/a&gt; and having a GUI that can cope with 100000 tasks in the full task list view (probably it should only render some tasks at a time to be fast and do not require huge amounts of memory something that the N80 is not doing)&lt;/li&gt;&lt;li&gt;I need to be able to sort tasks by priority. (You can not sort tasks by priority if you have more than 5 tasks using just 5 priorities)&lt;/li&gt;&lt;li&gt;Off-line usage. I may not have Internet connection but I still need to access (and search) my tasks.&lt;/li&gt;&lt;li&gt;Synchronization. I want to be able to add, edit and remove tasks from by mobile device and my desktop computer. This will also serve as backup as the tasks will reside in any synchronized device.&lt;/li&gt;&lt;li&gt;Keep history of changes. In case I did an incorrect edit or deletion.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://suderei.supersized.org/archives/130-GTD-Task-management-with-Android-software-apps.html"&gt;GTD: Task management with Android software apps&lt;/a&gt; is also a good requirements list and a comparison of Android applications.&lt;br /&gt;I am currently using my &lt;a href="http://en.wikipedia.org/wiki/Nokia_N80"&gt;Nokia N80&lt;/a&gt; as my task list manager, but as you can see from the above list it does not meet all my requirements.&lt;br /&gt;A good on-line task manager is &lt;a href="http://www.rememberthemilk.com/"&gt;Remember The Milk: Online to do list and task management&lt;/a&gt; but it is mostly an online app. &lt;a href="http://en.wikipedia.org/wiki/Things_%28application%29"&gt;Things&lt;/a&gt; for Mac and iPhone is also a great one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-3455095895998311281?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/3455095895998311281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=3455095895998311281' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/3455095895998311281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/3455095895998311281'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/07/on-task-list-managers.html' title='On task list managers'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-4230273941879485260</id><published>2008-06-19T13:14:00.016Z</published><updated>2009-03-15T12:51:43.554Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='versioning'/><title type='text'>On library and its API versions</title><content type='html'>Many people still confuse the library version and its API version. This leads to problems like not knowing what APIs are supported and when deprecated API will be removed.&lt;br /&gt;&lt;br /&gt;There are lots of unuseful versioning examples out there. I am going to present the most useful and correct one.&lt;br /&gt;&lt;br /&gt;The API version needs just one number, that is increased when new API is added to the existing one.&lt;br /&gt;&lt;br /&gt;So, for example. we can have our "geometry3" API that has an API version number of 1.&lt;br /&gt;If we add a method area() to our Shape class we increment the API version number to 2. There should not be any problem because old API version1 users will still be able to use all the implemented API.&lt;br /&gt;&lt;br /&gt;Also, it is possible to have a library implement various APIs. Like in our example it would be able to implement "geometry2" and "geometry3" to support an easy migration to the new API. After some time of "geometry2" being deprecated it could be removed.&lt;br /&gt;&lt;br /&gt;For the library version we just need a number (or date) to be able to differentiate old releases for new ones (and be able to differentiate library files).&lt;br /&gt;&lt;br /&gt;So, for example, or library version could be 20080610 and if you look what API versions it implements you would be able to see "geometry2.5" and "geometry3.2".&lt;br /&gt;&lt;br /&gt;So when you create a new interface like "geometry4" you start from scratch and can add API from new minor API version to the next, but you must not change or remove API since that would break compatibility from prior minor API version number users.&lt;br /&gt;&lt;br /&gt;It is common to just have different binaries that implement each API mayor version like having libgtk-1.2.so.0 and libgtk-x11-2.0.so.0 but you could be able to just have a libgtk that implements both APIs in the same binary. You could also be able to have different binaries implementing the same APIs in that case there is a need to a way to specify what library should provide what interface to your binary, maybe using dependency injection.&lt;br /&gt;&lt;br /&gt;So, package managers like APT, should work by having programs depend on API versions like "geometry3.2" and be able to fetch a library package that implements "geometry3.2" or newer like "geometry3.4"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-4230273941879485260?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/4230273941879485260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=4230273941879485260' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4230273941879485260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4230273941879485260'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/06/on-library-and-its-api-versions.html' title='On library and its API versions'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-147122773415315178</id><published>2008-05-31T13:34:00.007Z</published><updated>2008-11-29T17:47:49.614Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='format'/><category scheme='http://www.blogger.com/atom/ns#' term='open'/><category scheme='http://www.blogger.com/atom/ns#' term='office'/><category scheme='http://www.blogger.com/atom/ns#' term='document'/><title type='text'>On Office Document formats</title><content type='html'>I am horrified by what Microsoft is doing to the world with the introduction of their &lt;a href="http://www.iso.org/iso/pressrelease/faqs_isoiec29500.htm"&gt;suspiciously  ISO fast-tracked bad designed OOXML formats&lt;/a&gt;, that made ISO not independent anymore as it seems ISO has been bought by Microsoft.&lt;br /&gt;&lt;br /&gt;There is already the great &lt;a href="http://en.wikipedia.org/wiki/OpenDocument"&gt;OpenDocument&lt;/a&gt; format that conforms to other ISO standards.&lt;br /&gt;&lt;br /&gt;I think &lt;a href="http://www.odfalliance.org/resources/Google%20XML%20Q%20%20A%20%282%29.pdf"&gt;Google expressed very well the problem with OOXML&lt;/a&gt;. But anyway &lt;a href="http://www.robweir.com/blog/2008/03/disharmony-of-ooxml.html"&gt;OOXML is not even harmonic itself&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now, that ISO made clear that their standards are not serious. The effort would be either to stop the corruption inside ISO or made international governments either audit ISO or stop accepting ISO standards and move to a fairer organization that maintains standards. At &lt;a href="http://www.noooxml.org/"&gt;NoOOXML&lt;/a&gt; there is much more information about this issue.&lt;br /&gt;&lt;br /&gt;OOXML is just an excuse for Microsoft to break the document format again and force users to upgrade. I am sure they could not care less about standards and collaboration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-147122773415315178?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/147122773415315178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=147122773415315178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/147122773415315178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/147122773415315178'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/05/on-office-document-formats.html' title='On Office Document formats'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-4481694162805746211</id><published>2008-05-31T11:45:00.004Z</published><updated>2009-02-21T01:30:54.189Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='build'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>On Software Build Systems</title><content type='html'>A &lt;a href="http://en.wikipedia.org/wiki/Software_build"&gt;Software Build&lt;/a&gt; System is a program that accepts a series of input files:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Code (&lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;External Dependencies (&lt;a href="http://en.wikipedia.org/wiki/JAR_%28file_format%29"&gt;JAR&lt;/a&gt; files)&lt;/li&gt;&lt;li&gt;Resources (&lt;a href="http://en.wikipedia.org/wiki/HTML"&gt;HTML&lt;/a&gt;, translations, &lt;a href="http://en.wikipedia.org/wiki/Cascading_Style_Sheets"&gt;CSS&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;, images, ...)&lt;/li&gt;&lt;/ul&gt;And outputs a series of files in another location (to allow building from read-only sources):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Archives (&lt;a href="http://en.wikipedia.org/wiki/WAR_%28file_format%29"&gt;WAR&lt;/a&gt;, or &lt;a href="http://en.wikipedia.org/wiki/JAR_%28file_format%29"&gt;JAR&lt;/a&gt;) (compiled or minimized code and minimized HTML and CSS)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://en.wikipedia.org/wiki/Apache_Maven"&gt;Apache Maven&lt;/a&gt; is a great build system as it can automatically upgrade and download external dependencies and uses a clear folder structure shared by most projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-4481694162805746211?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/4481694162805746211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=4481694162805746211' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4481694162805746211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4481694162805746211'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/05/on-software-build-systems.html' title='On Software Build Systems'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-4687061546951673763</id><published>2008-05-19T21:34:00.019Z</published><updated>2008-11-29T17:48:25.463Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='openssh'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='reviewing'/><category scheme='http://www.blogger.com/atom/ns#' term='openssl'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>On Debian OpenSSL problem DSA-1571-1</title><content type='html'>It is sad what happened to Debian OpenSSL leaving all keys weak (&lt;a href="http://www.debian.org/security/2008/dsa-1571"&gt;DSA-1571-1 openssl -- predictable random number generator&lt;/a&gt;) (&lt;a href="http://it.slashdot.org/article.pl?sid=08/05/13/1533212"&gt;Slashdot | Debian Bug Leaves Private SSL/SSH Keys Guessable&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;When I started using Valgrind long time ago and Valgrind warning about it, I knew something like this could happen.&lt;br /&gt;&lt;br /&gt;To detect weak keys, all the keys to take advantage of this problem are already available: &lt;a href="http://metasploit.com/users/hdm/tools/debian-openssl/" rel="nofollow"&gt;Debian OpenSSL Predictable PRNG Toys&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Open source software is getting lots of momentum and it needs software changes reviewing to prevent this kind of things happening. The Linux kernel has mostly good reviewing by having each patch needing review from at least two developers, one of the module maintainers and a core Linux developer (&lt;a href="http://linux.tar.bz/articles/2.6-development_process"&gt;Introduction to Linux kernel development process&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-4687061546951673763?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/4687061546951673763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=4687061546951673763' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4687061546951673763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4687061546951673763'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/05/on-debian-openssl-problem-dsa-1571-1.html' title='On Debian OpenSSL problem DSA-1571-1'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-7062691345411547600</id><published>2008-05-14T21:34:00.008Z</published><updated>2008-11-29T17:48:47.010Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GNU'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>On GNU Autotools</title><content type='html'>I do not like the &lt;a href="http://en.wikipedia.org/wiki/GNU"&gt;GNU&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Autotools"&gt;Autotools&lt;/a&gt; because they make me program &lt;a href="http://en.wikipedia.org/wiki/Shell_script"&gt;shell script&lt;/a&gt;s which I do not like, they generate shell scripts that must be distributed with the released tarball (I do not like to distribute generated files from source if I am already distributing source code), and it is neither backwards not upwards compatible making it problematic to maintain these files. Here is an &lt;a href="http://freshmeat.net/articles/view/889/"&gt;old article that explains the main problems with the GNU Build System&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-7062691345411547600?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/7062691345411547600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=7062691345411547600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/7062691345411547600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/7062691345411547600'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/05/on-gnu-autotools.html' title='On GNU Autotools'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-7901347592547544215</id><published>2008-04-23T20:13:00.010Z</published><updated>2008-11-29T17:48:59.056Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='wiki'/><title type='text'>On Wikis</title><content type='html'>I have found &lt;a href="http://en.wikipedia.org/wiki/Wiki"&gt;Wiki&lt;/a&gt;s to be a really useful tool for documentation in any environment.&lt;br /&gt;&lt;br /&gt;For &lt;a href="http://en.wikipedia.org/wiki/Wikipedia"&gt;Wikipedia&lt;/a&gt; it has been such a success because it allows editors to collaborate in an article without having a direct approval of any modification but doing any rollback if the change was incorrect.&lt;br /&gt;&lt;br /&gt;For corporate environment a wiki is a clear winner. I have seen most people just do a document that it is left to be rotten as people share it over email and is gradually outdated. Just having a URL with a wiki page is a much more useful resource to keep any documentation up to date.&lt;br /&gt;&lt;br /&gt;My preferred &lt;a href="http://en.wikipedia.org/wiki/Wiki_software"&gt;Wiki software&lt;/a&gt; is &lt;a href="http://en.wikipedia.org/wiki/MediaWiki"&gt;MediaWiki&lt;/a&gt; because it is extremely intuitive and fast, has a clear UI design and is actively developed (compared to other wikis like &lt;a href="http://en.wikipedia.org/wiki/MoinMoin"&gt;MoinMoin&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/XWiki"&gt;XWiki&lt;/a&gt; that have no clear UI or are just bloated). MediaWiki is being used at &lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java&lt;/a&gt; projects like &lt;a href="http://en.wikipedia.org/wiki/Eclipse_%28software%29"&gt;Eclipse&lt;/a&gt;, even being written in &lt;a href="http://en.wikipedia.org/wiki/PHP"&gt;PHP&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-7901347592547544215?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/7901347592547544215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=7901347592547544215' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/7901347592547544215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/7901347592547544215'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/04/on-wikis.html' title='On Wikis'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-1284330943009419370</id><published>2008-04-22T18:01:00.019Z</published><updated>2010-05-29T08:56:25.797Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>On SQL Injection</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/SQL_injection"&gt;SQL injection&lt;/a&gt; is sadly still a very common problem. Software broadly deployed like &lt;a href="http://secunia.com/advisories/26771/"&gt;WordPress still has SQL Injection Vulnerabilities&lt;/a&gt; because instead of &lt;a href="http://pear.php.net/manual/en/package.database.mdb2.intro-execute.php"&gt;using prepared statements in PHP with MDB2&lt;/a&gt; they encode the parameters they think that could be used in a SQL injection. I really think that is not the way to go and I suggest to everyone &lt;a href="http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html"&gt;using prepared statements (java)&lt;/a&gt;. Also, many SQL servers like &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/sqlps.html"&gt;MySQL have support for prepared statements&lt;/a&gt;, so it may even speed up the application. &lt;a href="http://www.h2database.com/html/advanced.html#sql_injection"&gt;To force you to use prepared statements and clean your application from unsafe SQL some databases, like H2, allow you to disable literals in SQL statements&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Using &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping" title="Object-relational mapping"&gt;object-relational mapping&lt;/a&gt; solutions like &lt;a href="http://en.wikipedia.org/wiki/Java_Persistence_API"&gt;Java Persistence API&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Hibernate_%28Java%29"&gt;Hibernate&lt;/a&gt; can ease programming to prevent SQL injection because most &lt;a href="http://en.wikipedia.org/wiki/Insert_%28SQL%29" title="Insert (SQL)"&gt;INSERT&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Update_%28SQL%29" title="Update (SQL)"&gt;UPDATE&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Delete_%28SQL%29" title="Delete (SQL)"&gt;DELETE&lt;/a&gt; takes care the ORM directly. You still have to use &lt;a href="http://docs.jboss.org/hibernate/stable/core/api/org/hibernate/Query.html#setParameter%28java.lang.String,%20java.lang.Object%29"&gt;setParameter&lt;/a&gt; in &lt;a href="http://en.wikipedia.org/wiki/Select_%28SQL%29" title="Select (SQL)"&gt;SELECT&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://xkcd.com/327/"&gt;&lt;img src="http://imgs.xkcd.com/comics/exploits_of_a_mom.png" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-1284330943009419370?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/1284330943009419370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=1284330943009419370' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/1284330943009419370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/1284330943009419370'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/04/on-sql-injection.html' title='On SQL Injection'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-5341226504797815238</id><published>2008-04-22T06:30:00.007Z</published><updated>2008-05-14T21:56:04.426Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='licensing'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Community owned software</title><content type='html'>The &lt;a href="http://en.wikipedia.org/wiki/Linux_kernel"&gt;Linux kernel&lt;/a&gt; is community owned software because the source code is copyrighted by many individuals and companies whereas &lt;a href="http://en.wikipedia.org/wiki/OpenOffice.org"&gt;OpenOffice.org&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/OpenJDK"&gt;OpenJDK&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Qt_%28toolkit%29"&gt;Qt&lt;/a&gt; is company owned software because &lt;a href="http://en.wikipedia.org/wiki/Sun_Microsystems"&gt;Sun Microsystems&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Trolltech" title="Trolltech"&gt;Trolltech&lt;/a&gt; have the copyright respectively. This allows them to license the software using any license, open source or privative ones. With community owned software like the Linux kernel this is really difficult because every owner should agree to any licensing changes and it can not be licensed privately because of this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-5341226504797815238?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/5341226504797815238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=5341226504797815238' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5341226504797815238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5341226504797815238'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/04/community-owned-software.html' title='Community owned software'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-8129114935662861658</id><published>2008-04-21T19:39:00.015Z</published><updated>2009-08-30T21:59:12.932Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>On Linux distributions</title><content type='html'>My preferred &lt;a href="http://en.wikipedia.org/wiki/Linux_distribution"&gt;Linux distribution&lt;/a&gt; is &lt;a href="http://en.wikipedia.org/wiki/Debian"&gt;Debian&lt;/a&gt; because:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Advanced_Packaging_Tool"&gt;APT&lt;/a&gt;  and &lt;a href="http://en.wikipedia.org/wiki/Dpkg"&gt;dpkg&lt;/a&gt;, these tools make life so easier that is difficult moving to anything else.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.debian.org/doc/developers-reference/resources.html"&gt;Debian web tools&lt;/a&gt; are great to keep track of any package and discuss anything with the Debian community.&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://en.wikipedia.org/wiki/Ubuntu_%28Linux_distribution%29"&gt;Ubuntu&lt;/a&gt; is 2nd, but I recommend it to anyone, as desktop operating system, instead of Debian, as Ubuntu is more user friendly and easier to use than Debian.&lt;br /&gt;&lt;br /&gt;I do not use:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/SUSE_Linux"&gt;SUSE Linux&lt;/a&gt; because &lt;a href="http://en.wikipedia.org/wiki/YaST"&gt;YaST&lt;/a&gt; has always got me headaches (different problems with different versions of SUSE) and I do not like the Microsoft-Novell pact.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Gentoo_Linux"&gt;Gentoo Linux&lt;/a&gt; because it is not a practical distribution as you have to spend ages recompiling software (you can also do that with Debian if you want) and is definitely not user friendly as you have to configure too many things where a distribution like Ubuntu (or even Debian) provides sane defaults. Take a look at this &lt;a href="http://www.youtube.com/watch?v=6XbEJoR-ypo"&gt;video of Gentoo Linux installation&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Fedora_%28Linux_distribution%29"&gt;Fedora&lt;/a&gt;. I would try it if it did not use &lt;a href="http://en.wikipedia.org/wiki/RPM_Package_Manager"&gt;RPM&lt;/a&gt; that I dislike. &lt;a href="https://bugzilla.redhat.com/show_bug.cgi?id=496192"&gt;Fedora also has some problems that you will see quite early like font rendering.&lt;/a&gt; Fedora is also a good candidate to a desktop Linux distribution but I have found that Ubuntu is just more polished.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Slackware"&gt;Slackware&lt;/a&gt;. Just do not use it. Having simple packages with no dependencies can give you major headaches.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Of course, for quality and industry proved support &lt;a href="http://en.wikipedia.org/wiki/Red_Hat_Enterprise_Linux"&gt;Red Hat Enterprise Linux&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/SUSE_Linux_Enterprise_Server"&gt;SUSE Linux Enterprise Server&lt;/a&gt; are the distributions to go if running production critical applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-8129114935662861658?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/8129114935662861658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=8129114935662861658' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8129114935662861658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8129114935662861658'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/04/on-linux-distributions.html' title='On Linux distributions'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-1365779563009724256</id><published>2008-03-16T14:05:00.010Z</published><updated>2009-10-24T08:53:06.606Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='issue traking systems'/><title type='text'>On Issue Tracking Systems</title><content type='html'>I have found &lt;a href="http://en.wikipedia.org/wiki/Issue_tracking_system"&gt;Issue Tracking System&lt;/a&gt;s to be much more convenient than email in many tasks.&lt;br /&gt;In any organization having an &lt;a href="http://en.wikipedia.org/wiki/Issue_tracking_system"&gt;Issue Tracking System&lt;/a&gt; is a must as it keeps clear what task should be done by what department and who is the person assigned the task.&lt;br /&gt;The problem is that as currently business work they never show the issue tracking system to an outsider (aka client) but instead the client must always communicate with the &lt;a href="http://en.wikipedia.org/wiki/Call_center"&gt;call center&lt;/a&gt;. An issue tracking system should be open to outside client for maximum effectiveness.&lt;br /&gt;&lt;br /&gt;Any company or project should always use an issue tracking system.&lt;br /&gt;&lt;br /&gt;My favorite issue tracker is &lt;a href="http://en.wikipedia.org/wiki/Bugzilla"&gt;Bugzilla&lt;/a&gt;, but I would change the comments list with a wiki entry and associated discussion (like &lt;a href="http://en.wikipedia.org/wiki/Wikipedia"&gt;Wikipedia&lt;/a&gt; has) for every issue.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/101774/what-is-your-bug-task-tracking-tool"&gt;Popularity of Issue Tracking Systems among developers&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-1365779563009724256?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/1365779563009724256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=1365779563009724256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/1365779563009724256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/1365779563009724256'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/03/on-issue-tracking-systems.html' title='On Issue Tracking Systems'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-8726088895135924736</id><published>2008-03-02T21:48:00.015Z</published><updated>2008-09-06T17:34:49.279Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='BPM'/><title type='text'>Client/Server APIs are essential</title><content type='html'>I have to work with lots of systems where only one UI is provided and no programming API is available so accessing that systems programmatically needs to use code like &lt;a href="http://htmlunit.sourceforge.net/"&gt;HtmlUnit&lt;/a&gt; or similar.&lt;br /&gt;Instead business should always develop and/or install software with &lt;a href="http://en.wikipedia.org/wiki/Service-oriented_architecture"&gt;Service-oriented architecture&lt;/a&gt; always in mind. Another very important aspect is the use of &lt;a href="http://en.wikipedia.org/wiki/Business_Process_Management"&gt;Business Process Management&lt;/a&gt; to take care of every process of the organization first correctly documenting it and later automating it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-8726088895135924736?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/8726088895135924736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=8726088895135924736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8726088895135924736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8726088895135924736'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/03/clientserver-apis-are-essential.html' title='Client/Server APIs are essential'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-3745921407883093850</id><published>2008-02-13T20:18:00.006Z</published><updated>2009-01-01T16:37:20.767Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='componentization'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Component-based software engineering</title><content type='html'>I am a big supporter of &lt;a href="http://en.wikipedia.org/wiki/Component-based_software_engineering"&gt;Component-based software engineering&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;When everything is a component you can remove any of its components without any problem and the application continues working but without that component. It is always a very good idea to componentize your application to clean the code and make it easier to read and modify.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://en.wikipedia.org/wiki/GLib"&gt;GLib&lt;/a&gt; you must always make your objects throw signals instead of calling other objects methods. This way you can remove any other object and have you component still working.&lt;br /&gt;&lt;br /&gt;Using the &lt;a href="http://en.wikipedia.org/wiki/GObject"&gt;GObject&lt;/a&gt; system of &lt;a href="http://en.wikipedia.org/wiki/GLib"&gt;GLib&lt;/a&gt; is quite easy and efficient to make components encapsulated and reusable.&lt;br /&gt;In &lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java&lt;/a&gt; you have &lt;a href="http://en.wikipedia.org/wiki/Observer_pattern"&gt;Observer/Observable&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/OSGi"&gt;OSGi&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-3745921407883093850?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/3745921407883093850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=3745921407883093850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/3745921407883093850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/3745921407883093850'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/02/component-based-software-engineering.html' title='Component-based software engineering'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-7947635117151238622</id><published>2008-01-28T22:04:00.001Z</published><updated>2010-08-22T17:51:01.260Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>On Memory Leaks</title><content type='html'>I have been using &lt;a href="http://en.wikipedia.org/wiki/IBM_Rational_Purify"&gt;Purify&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Valgrind"&gt;Valgrind&lt;/a&gt; to debug &lt;a href="http://en.wikipedia.org/wiki/Memory_leak"&gt;memory leaks&lt;/a&gt; in &lt;a href="http://en.wikipedia.org/wiki/C_%28programming_language%29"&gt;C&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/C%2B%2B"&gt;C++&lt;/a&gt; programs both in &lt;a href="http://en.wikipedia.org/wiki/Open_source"&gt;open source&lt;/a&gt; projects and for some clients.&lt;br /&gt;For practical reasons both have the same functionality and are able to &lt;a href="http://en.wikipedia.org/wiki/Debug"&gt;debug&lt;/a&gt; the same problems (memory leaks and invalid access to memory regions)&lt;br /&gt;If you are developing any C/C++ code and doing any allocation in the &lt;a href="http://en.wikipedia.org/wiki/Dynamic_memory_allocation"&gt;heap&lt;/a&gt; (either using &lt;a href="http://en.wikipedia.org/wiki/Malloc"&gt;malloc()&lt;/a&gt; or other means like new) you must run always your code through either these power debuggers that will almost always find any problems in your code.&lt;br /&gt;If you need any help do not hesitate to contact me. I will help you with your code.&lt;br /&gt;&lt;br /&gt;For Java, I recommend the great free open source &lt;a href="http://www.eclipse.org/mat/"&gt;Eclipse Memory Analyzer&lt;/a&gt; that will for sure help you plug the leak.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-7947635117151238622?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/7947635117151238622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=7947635117151238622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/7947635117151238622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/7947635117151238622'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/01/on-memory-leaks.html' title='On Memory Leaks'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-9195288267802239433</id><published>2008-01-25T19:53:00.010Z</published><updated>2010-02-06T00:06:27.468Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><title type='text'>Data Backup Systems</title><content type='html'>Something I am very interested in is Data &lt;a href="http://en.wikipedia.org/wiki/Backup"&gt;Backup&lt;/a&gt; Systems.&lt;br /&gt;&lt;br /&gt;The cases I want to prevent are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;When &lt;a href="http://en.wikipedia.org/wiki/Non-volatile_memory"&gt;non-volatile memory&lt;/a&gt; fails (be sure your &lt;a href="http://en.wikipedia.org/wiki/Hard_disk_drive"&gt;hard disk drive&lt;/a&gt; will fail, so do something about it)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;When a &lt;a href="http://en.wikipedia.org/wiki/Computer_virus"&gt;computer virus&lt;/a&gt; or malicious user (or just human error) corrupts data.&lt;/li&gt;&lt;/ul&gt;The solution needs:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Be able to backup my data and only backup URLs of data that can be easily downloaded from the Internet, not wasting backup space.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Data stored in multiple places separated physically from one another (to prevent both being damaged at the same time) using a &lt;a href="http://en.wikipedia.org/wiki/Remote_backup_service"&gt;remote backup service&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Data stored to be only read, so no &lt;a href="http://en.wikipedia.org/wiki/Computer_virus"&gt;computer virus&lt;/a&gt; or malicious user can corrupt backups.&lt;/li&gt;&lt;li&gt;Data stored &lt;a href="http://en.wikipedia.org/wiki/Incremental_backup"&gt;incrementally&lt;/a&gt; to be able to quickly and easily see changes in time of the data.&lt;/li&gt;&lt;li&gt;Be able to get any file at any point past in time.&lt;/li&gt;&lt;li&gt;Be totally automated and non-intrusive.&lt;/li&gt;&lt;li&gt;Do a perfect &lt;a href="http://en.wikipedia.org/wiki/Snapshot_%28computer_storage%29"&gt;snapshot&lt;/a&gt; of every backup. Backups should never be corrupt.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Encryption"&gt;Encrypted&lt;/a&gt;, so data can be sent to untrusted external storage.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Current solutions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use always &lt;a href="http://en.wikipedia.org/wiki/RAID1"&gt;RAID1&lt;/a&gt; (at least). &lt;a href="http://linux-raid.osdl.org/"&gt;Setting up software RAID in Linux&lt;/a&gt; is extremely easy and works exceptionally well. With &lt;a href="http://en.wikipedia.org/wiki/Linux"&gt;Linux&lt;/a&gt; you just need two hard drives (no need for them to be identical) and you do not need a RAID controller if you use software RAID as it works great and it may be even faster than hardware RAID. I will help you if you have any problems with it.&lt;/li&gt;&lt;li&gt;Set up automatic encrypted backups to off-site storage (like a web server).&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Mac_OS_X"&gt;Mac OS X&lt;/a&gt; users may be able to use &lt;a href="http://en.wikipedia.org/wiki/Time_Machine_%28Apple_software%29"&gt;Apple Time Machine&lt;/a&gt; but it lacks true network backup as backing up just to another local hard drive is not the best option.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-9195288267802239433?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/9195288267802239433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=9195288267802239433' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/9195288267802239433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/9195288267802239433'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/01/data-backup-systems.html' title='Data Backup Systems'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-6026457018737452513</id><published>2008-01-04T15:44:00.024Z</published><updated>2010-11-14T12:44:17.895Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Unicode Strings and byte buffers</title><content type='html'>Prior to Unicode there was &lt;a href="http://en.wikipedia.org/wiki/ASCII"&gt;ASCII&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/ISO_8859-1"&gt;ISO 8859-1&lt;/a&gt;  (except for &lt;a href="http://en.wikipedia.org/wiki/Windows_code_page"&gt;Microsoft that used their own encoding&lt;/a&gt; to lock-in users) and string manipulation was not hard.&lt;br /&gt;&lt;br /&gt;Now, &lt;a href="http://en.wikipedia.org/wiki/Unicode"&gt;Unicode&lt;/a&gt; is the future since everyone wants an easy solution to integrate all the characters of all the languages of the world to be supported by every application.&lt;br /&gt;&lt;br /&gt;It seems like lots of programming languages have problems handling Unicode strings, mainly because they put Strings and byte buffers on the same bucket.&lt;br /&gt;Maybe, some of the programming languages that have problems with Unicode handling is because programmers are using the API incorrectly, but some of them have a real design flaw that make working correctly with Unicode strings impossible.&lt;br /&gt;&lt;br /&gt;My test to know if a programming language has correct Unicode support is just uppercasing the "&lt;a href="http://en.wikipedia.org/wiki/%C3%81"&gt;á&lt;/a&gt;" string and verify the "Á" string is returned.&lt;br /&gt;&lt;br /&gt;Languages that have a correct API include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/C_%28programming_language%29"&gt;C&lt;/a&gt; with &lt;a href="http://en.wikipedia.org/wiki/Glib"&gt;glib&lt;/a&gt; (using &lt;a href="http://en.wikipedia.org/wiki/UTF-8"&gt;UTF-8&lt;/a&gt;) : &lt;code&gt;g_utf8_strup("á",-1)&lt;/code&gt; -&gt; Á&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java&lt;/a&gt; I do not know any way to do a better API. Java totally differentiates a string from a byte buffer. &lt;code&gt;"á".toUpperCase()&lt;/code&gt; -&gt; Á&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/C_Sharp_%28programming_language%29"&gt;C#&lt;/a&gt; has correct Unicode support: &lt;code&gt;"á".ToUpper()&lt;/code&gt; -&gt; Á&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.python.org/3.0/whatsnew/3.0.html"&gt;Python3&lt;/a&gt; does Unicode handling just like Java did from 1.0 released at 1995. Python is finally catching up with Java! Take a look at &lt;a href="http://docs.python.org/3.0/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit"&gt;What’s New in Python 3.0&lt;/a&gt; so you can know what was fixed. &lt;code&gt;print("á".upper())&lt;/code&gt; -&gt; Á&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Languages with hard to use (but correct) Unicode support:&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Python_%28programming_language%29"&gt;Python2&lt;/a&gt; &lt;a href="http://blog.ianbicking.org/why-python-unicode-sucks.html"&gt;Why Python2 Unicode Sucks&lt;/a&gt;. &lt;a href="http://boodebr.org/main/python/all-about-python-and-unicode"&gt;Python2 Unicode support&lt;/a&gt; just calls for problems like &lt;a href="http://blogs.gnome.org/jamesh/2007/12/10/urlparse-considered-harmful/"&gt;urlparse considered harmful&lt;/a&gt; as there is no difference between a byte buffer and a string. The slides &lt;a style="" href="http://farmdev.com/talks/unicode/"&gt;Unicode In Python2, Completely Demystified&lt;/a&gt; will help you understand Unicode in Python2. Move on to Python3 and you will be safe. Python2 has correct Unicode support but it is hard to use: &lt;code&gt;print u'á'.upper()&lt;/code&gt; -&gt; Á&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Perl"&gt;Perl&lt;/a&gt; &lt;a href="http://ahinea.com/en/tech/perl-unicode-struggle.html"&gt;Unicode-processing issues in Perl and how to cope with it&lt;/a&gt; and &lt;a href="http://docs.activestate.com/activeperl/5.10/lib/pods/perlunifaq.html"&gt;Perl Unicode FAQ&lt;/a&gt;. Perl has hard to use Unicode support: &lt;code&gt;perl -e 'use utf8; print uc("á\n");'&lt;/code&gt; -&gt; Á&lt;/li&gt;&lt;/ul&gt;Languages that lack Unicode support:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/PHP"&gt;PHP&lt;/a&gt; &lt;a href="http://news.php.net/php.internals/17771"&gt;Unicode not completely fixed until PHP 6&lt;/a&gt; &lt;a href="http://www.php.net/%7Ederick/meeting-notes.html#unicode"&gt;Unicode support in PHP 6 2005 meeting&lt;/a&gt; : &lt;code&gt;strtoupper("á")&lt;/code&gt; -&gt; Á&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Ruby_%28programming_language%29"&gt;Ruby&lt;/a&gt; &lt;a href="http://wiki.rubyonrails.com/rails/pages/HowToUseUnicodeStrings"&gt;Unicode handling in Ruby&lt;/a&gt; &lt;a href="http://intertwingly.net/blog/2007/12/29/Ruby-1-9-Strings-Updated"&gt;Ruby 1.9 Strings&lt;/a&gt; &lt;a href="http://headius.blogspot.com/2006/06/unicode-in-ruby-unicode-in-jruby.html"&gt;JRuby Unicode&lt;/a&gt;. Ruby does not have correct Unicode support &lt;a href="http://redmine.ruby-lang.org/issues/show/2350"&gt;#2350&lt;/a&gt;: &lt;code&gt;print "á".upcase&lt;/code&gt; -&gt; á&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-6026457018737452513?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/6026457018737452513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=6026457018737452513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/6026457018737452513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/6026457018737452513'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2008/01/unicode-strings-and-byte-buffers.html' title='Unicode Strings and byte buffers'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-7144786854915834523</id><published>2007-12-27T20:36:00.000Z</published><updated>2007-12-29T11:10:21.183Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='fashion'/><category scheme='http://www.blogger.com/atom/ns#' term='clothing'/><title type='text'>Shopping for clothing is hard</title><content type='html'>Here is a list of shops with my comments of them:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Outlet shops like &lt;a href="http://www.factory.es/"&gt;Factory&lt;/a&gt; suck. There are only too old clothes and most of them of very bad quality and high price.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/C&amp;amp;A"&gt;C&amp;amp;A&lt;/a&gt; is a great shop where you can find almost anything great there jeans, shoes, socks, underwear, ... for really good quality/price.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/H&amp;amp;M"&gt;H&amp;amp;M&lt;/a&gt; there are also really great shirts. &lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Celio_%28clothing%29"&gt;Celio&lt;/a&gt; is also trendy and elegant and very good quality/price mainly for jeans and other apparel like jackets.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Zara_%28clothing%29"&gt;Zara&lt;/a&gt; man is also quite good for fashion clothes and cool and elegant t-shirts.&lt;/li&gt;&lt;li&gt;&lt;a href="http://es.wikipedia.org/wiki/Springfield_%28Cadena_de_tiendas%29"&gt;Springfield&lt;/a&gt; you can also find some cool shirts at good quality/price.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/El_Corte_Ingl%C3%A9s"&gt;El Corte Inglés&lt;/a&gt; is also a good department store for clothing although more expensive than the rest. Anyway there is also quite great quality/price if you look closely.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-7144786854915834523?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/7144786854915834523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=7144786854915834523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/7144786854915834523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/7144786854915834523'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/12/shopping-for-clothing-is-hard.html' title='Shopping for clothing is hard'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-3250322269033251402</id><published>2007-12-24T19:09:00.003Z</published><updated>2008-09-14T02:18:27.703Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>On cryptographic hash functions</title><content type='html'>Now that &lt;a href="http://www.win.tue.nl/hashclash/"&gt;MD5 is considered too weak for most uses&lt;/a&gt;, it is time to look at other &lt;a href="http://en.wikipedia.org/wiki/Cryptographic_hash_function"&gt;cryptographic hash functions&lt;/a&gt; like &lt;a href="http://en.wikipedia.org/wiki/Whirlpool_%28cryptography%29"&gt;Whirlpool&lt;/a&gt; (it is even an &lt;a href="http://en.wikipedia.org/wiki/International_Organization_for_Standardization"&gt;ISO&lt;/a&gt; standard). We should be reviewing most software and protocols to stop generating &lt;a href="http://en.wikipedia.org/wiki/MD5"&gt;MD5&lt;/a&gt; hashes and use some of the currently recommended alternative &lt;a href="http://cryptodox.com/Hash_Functions"&gt;hash functions&lt;/a&gt; like Whirlpool. Even the &lt;a href="http://csrc.nist.gov/groups/ST/hash/sha-3/index.html"&gt;NIST has started a process to find a new secure hash function&lt;/a&gt; (the same process they did with &lt;a href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard"&gt;AES&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-3250322269033251402?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/3250322269033251402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=3250322269033251402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/3250322269033251402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/3250322269033251402'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/12/on-cryptographic-hash-functions.html' title='On cryptographic hash functions'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-1342949959685043481</id><published>2007-12-24T16:22:00.002Z</published><updated>2008-07-12T15:12:16.914Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>Spain political system does not work</title><content type='html'>Today I have seen that political parties of Spain are totally incoherent when referring to a matter and change the views of a matter whenever they come to power.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.cincodias.com/articulo/empresas/canon/digital/sale/adelante/pese/oposicion/PP/cdssec/20071221cdscdiemp_29/Tes/"&gt;suppression of the private copying levy was voted&lt;/a&gt; and &lt;a href="http://espana.barrapunto.com/comments.pl?sid=74429&amp;amp;cid=994522"&gt;the main parties changed their vote from the last time when the current opposition was in power&lt;/a&gt;. With liars like these no one can believe in Spain politics.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-1342949959685043481?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/1342949959685043481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=1342949959685043481' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/1342949959685043481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/1342949959685043481'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/12/spain-political-system-does-not-work.html' title='Spain political system does not work'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-5560242459748101603</id><published>2007-12-17T22:01:00.000Z</published><updated>2007-12-17T21:53:01.862Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='standards'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>When standards go wrong</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/POSIX"&gt;POSIX&lt;/a&gt; &lt;a href="http://c2.com/cgi/wiki?GetsIsDangerous"&gt;gets() function should not be used in any program&lt;/a&gt; as is a well known buffer overflow. But since it is in the POSIX standard &lt;a href="http://sources.redhat.com/bugzilla/show_bug.cgi?id=350"&gt;gets() is very difficult to remove from C libraries like glibc&lt;/a&gt; because that means that it would break standard conformance. That means that deprecated and unsafe API can stay on standard libraries for long.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-5560242459748101603?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/5560242459748101603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=5560242459748101603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5560242459748101603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5560242459748101603'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/12/when-standards-go-wrong.html' title='When standards go wrong'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-5338115743124395411</id><published>2007-12-17T21:20:00.022Z</published><updated>2010-05-29T08:58:02.882Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Programming languages I have stopped using</title><content type='html'>I do not support the use of these programming languages. Any people that is still choosing any of these programming languages for production code should be considered a bad manager or programmer. Of course, if you buy any software developed using these programming languages you will make a very bad decision.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Visual_Basic"&gt;Visual Basic&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Visual_Basic_.NET"&gt;Visual Basic .NET&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Visual_Basic_for_Applications"&gt;Visual Basic for Applications&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/VBScript"&gt;VBScript&lt;/a&gt; they have inconsistent syntax like totally insane array creation (&lt;code&gt;Dim age(6) as Integer&lt;/code&gt; will create a &lt;i&gt;seven&lt;/i&gt; element array). &lt;a href="http://visualbasic.about.com/od/imhoinmyhumbleopinion/a/aaVerityStob1.htm"&gt;Visual Basic is such a badly designed language that has made a lot of harm to IT&lt;/a&gt;. Microsoft should stop adding features to it and just keep maintaining for some years (there is lots of installed base) and encourage costumers to move to C#. All of the Visual Basic projects I have ever seen have been a failure or much worse than a similar project in a decent programming language. You should be moving to &lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/C_Sharp_%28programming_language%29"&gt;C#&lt;/a&gt; if you are still in Microsoft world.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Tcl"&gt;Tcl&lt;/a&gt; It is slow, not object-oriented and totally dynamic (I prefer &lt;a href="http://en.wikipedia.org/wiki/Type_system#Static_typing"&gt;static typing&lt;/a&gt;). You should be moving to &lt;a href="http://en.wikipedia.org/wiki/Python_%28programming_language%29"&gt;Python&lt;/a&gt; if you want a clear scripting language. &lt;a href="http://www.reddit.com/r/programming/info/262d3/comments?sort=top"&gt;Tcl problems [Reddit]&lt;/a&gt;. &lt;a href="http://tleaves.com/2004/10/20/10-things-i-hate-about-tcl/"&gt;10 problems of Tcl&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/MATLAB"&gt;MATLAB&lt;/a&gt; were indexing is one based, as it is conventional in mathematics, instead of zero based like normal programming languages. You should be moving to &lt;a href="http://en.wikipedia.org/wiki/SciPy"&gt;SciPy&lt;/a&gt; if you need clear syntax and a complete programming language. Take a look at "&lt;a href="http://vnoel.wordpress.com/2008/05/03/bye-matlab-hello-python-thanks-sage/"&gt;Bye Matlab, hello Python, thanks Sage&lt;/a&gt;" to know a personal history why the migration is worth it.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Perl"&gt;Perl&lt;/a&gt;. It does not have a cycle detecting garbage collector (so it can leak memory). It is quite difficult to do &lt;a href="http://en.wikipedia.org/wiki/Object-oriented_programming"&gt;object-oriented programming&lt;/a&gt;. The code written is not easy to maintain with a group of people. You can see &lt;a href="http://en.wikipedia.org/wiki/Perl"&gt;Perl5&lt;/a&gt; drawbacks at &lt;a href="http://lua-users.org/wiki/LuaVersusPerl"&gt;Lua Versus Perl5&lt;/a&gt; and &lt;a href="http://www.linuxjournal.com/article/3882"&gt;Why Python?&lt;/a&gt;. Switch to &lt;a href="http://en.wikipedia.org/wiki/Python_%28programming_language%29"&gt;Python&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Shell_script"&gt;Shell script&lt;/a&gt; as I said in a previous post, shell scripting can be handy but it is not worth the trouble and it is not an option for anything but a simple small script.&lt;/li&gt;&lt;li&gt;I have never programmed in &lt;a href="http://en.wikipedia.org/wiki/COBOL"&gt;COBOL&lt;/a&gt;, but I am happier for not having to. &lt;a href="http://www.codinghorror.com/blog/archives/001294.html"&gt;Just compare the same code in C# and in COBOL&lt;/a&gt;. &lt;a href="http://www.dimalang.com/wp-content/uploads/2009/07/dilbert-cobol-programmer-dinosaur1.gif"&gt;COBOL is a dinosaur&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I agree with &lt;a href="http://en.wikipedia.org/wiki/Edsger_W._Dijkstra" title="Edsger W. Dijkstra"&gt;Edsger W. Dijkstra&lt;/a&gt; (&lt;a href="http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html" class="external text" title="http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html" rel="nofollow"&gt;Why numbering should start at zero&lt;/a&gt;) that any one &lt;a href="http://en.wikipedia.org/wiki/Comparison_of_programming_languages_%28array%29"&gt;based array programing language&lt;/a&gt; is not serious.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-5338115743124395411?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/5338115743124395411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=5338115743124395411' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5338115743124395411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5338115743124395411'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/12/programming-languages-i-have-stopped.html' title='Programming languages I have stopped using'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-4003028298685519723</id><published>2007-12-12T21:02:00.010Z</published><updated>2008-06-06T17:31:40.229Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>On Java</title><content type='html'>I have to say that &lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java&lt;/a&gt; is my preferred language to build user applications (as I love C to develop operating system code or low level code).&lt;br /&gt;The things I love from Java are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Type_system#Static_typing"&gt;Static typing&lt;/a&gt;: I love when variables do not change type and types are checked at compile time.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Powerful &lt;a href="http://en.wikipedia.org/wiki/Integrated_development_environment"&gt;Integrated development environment&lt;/a&gt;s with code completion and inline error checking like &lt;a href="http://en.wikipedia.org/wiki/Eclipse_%28software%29"&gt;Eclipse&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Speed. &lt;a href="http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&amp;amp;lang=java&amp;amp;lang2=gcc"&gt;Java is not significally slower than C&lt;/a&gt; but is much less programming error prone.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Structured and correct &lt;a href="http://en.wikipedia.org/wiki/Application_programming_interface"&gt;Application programming interface&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/docs/books/tutorial/java/data/strings.html"&gt;Correct String based manipulation APIs for Unicode text&lt;/a&gt;. I have still not seen a "scripting" language that manages strings correctly with its encoding and differentiates correctly a string from a byte buffer.&lt;/li&gt;&lt;li&gt;Opensource &lt;a href="http://en.wikipedia.org/wiki/OpenJDK"&gt;OpenJDK&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-4003028298685519723?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/4003028298685519723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=4003028298685519723' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4003028298685519723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4003028298685519723'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/12/on-java.html' title='On Java'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-2612629954676046448</id><published>2007-12-09T17:42:00.002Z</published><updated>2008-09-06T17:39:23.190Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><title type='text'>Nokia N80 vs Sharp GX15</title><content type='html'>Here is a list of differences I have found between my new &lt;a href="http://en.wikipedia.org/wiki/Nokia_N80"&gt;Nokia N80&lt;/a&gt; and my old &lt;a href="http://en.wikipedia.org/wiki/Sharp_GX15"&gt;Sharp GX15&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Nokia N80 feels slower than the Sharp GX15 mainly because the N80 has &lt;a href="http://en.wikipedia.org/wiki/Symbian_OS"&gt;Symbian OS&lt;/a&gt; and the Sharp GX15 does not have a multitasking OS.&lt;/li&gt;&lt;li&gt;Sharp GX15 UI is better designed for &lt;a href="http://en.wikipedia.org/wiki/Usability"&gt;usability&lt;/a&gt; than the Nokia. For example, to use the &lt;a href="http://images.wirelessinfo.com/images/upload/Image/reviews/images/Nokia/N73/Product%20Photos/Nokia%20N73%20Screenshots/calculator2.jpg"&gt;Nokia S60 calculator&lt;/a&gt; you have to hit more keys and is more difficult to use than the &lt;a href="http://www.mobile-review.com/review/image/sharp/gx15/pic20-2.jpg"&gt;Sharp GX calculator&lt;/a&gt; where common operators are in the navigation pad unlike Nokia S60 where you have to navigate to the operator and then select it. Also the calendar has a usability problem because you have to type dates using the numeric keypad unlike the &lt;a href="http://www.mobile-review.com/review/image/sharp/gx15/pic17-2.jpg"&gt;Sharp GX where you navigate the monthly view when selecting a date&lt;/a&gt; thus making it much more difficult to select, for example, Monday in two weeks, in the Nokia.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sharp GX15 is an older model so it has less functionality and memory but it was a really good deal when I bought it. Nokia N80 also delivers really good value for the money.&lt;/li&gt;&lt;/ul&gt;Overall both phones are really good for the money but Nokia should look more at usability. It is great that Nokia is working to bring Linux to its products with &lt;a href="http://en.wikipedia.org/wiki/Maemo"&gt;Maemo&lt;/a&gt; but it still has a long way to go unlike Google &lt;a href="http://en.wikipedia.org/wiki/Android_%28mobile_phone_platform%29"&gt;Android&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-2612629954676046448?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/2612629954676046448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=2612629954676046448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/2612629954676046448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/2612629954676046448'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/12/nokia-n80-vs-sharp-gx15.html' title='Nokia N80 vs Sharp GX15'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-4987469274799215880</id><published>2007-12-08T17:29:00.024Z</published><updated>2010-12-02T23:15:47.524Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='dom'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><title type='text'>XML (and DOM) vs JSON</title><content type='html'>The main problem with &lt;a href="http://c2.com/cgi/wiki?XmlAbuse"&gt;XML is that it is being abused&lt;/a&gt;, by unexperienced programmers, for applications where it is not suited (XML is designed for document text markup) like general data structures serialization (like &lt;a href="http://en.wikipedia.org/wiki/SOAP"&gt;SOAP&lt;/a&gt; where formats like &lt;a href="http://en.wikipedia.org/wiki/JSON"&gt;JSON&lt;/a&gt; are much more suited) and persistence (where a &lt;a href="http://en.wikipedia.org/wiki/Relational_database_management_system"&gt;RDBMS&lt;/a&gt; like a SQL database is much more suited).&lt;br /&gt;&lt;br /&gt;XML is OK as markup for text documents, but it is not suited as a data serialization format.&lt;br /&gt;&lt;br /&gt;In my honest opinion, &lt;a href="http://en.wikipedia.org/wiki/XML"&gt;XML&lt;/a&gt; should always be created and accessed through &lt;a href="http://en.wikipedia.org/wiki/Document_Object_Model"&gt;DOM&lt;/a&gt;. I have seen lots of software creating XML documents not using &lt;a href="http://en.wikipedia.org/wiki/Document_Object_Model"&gt;DOM&lt;/a&gt; and thus making huge mistakes like &lt;a href="http://www.daisy.org/daisypedia/introduction-xml-syntax"&gt;malformedness&lt;/a&gt;, &lt;a href="http://www.xmlnews.org/docs/xml-basics.html#references"&gt;incorrect escaping&lt;/a&gt; and even making the data serialized to XML not being the same as the data deserialized from that XML. Take a look at this &lt;a href="http://totheriver.com/learn/xml/xmltutorial.html#6.2"&gt;tutorial to generate XML with DOM&lt;/a&gt; otherwise you may perform these &lt;a href="http://en.wikipedia.org/wiki/XHTML#Common_errors"&gt;XHTML common errors&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The biggest mistake made with XML was making it a text file format by default instead of a binary format. If it was made a binary format everyone would always use DOM to access and modify it both from client and server applications (exiting templates using a XML editor) and many of the mistakes developers make today would not me made.&lt;br /&gt;&lt;br /&gt;I have found that for data structures serialization &lt;a href="http://en.wikipedia.org/wiki/JSON"&gt;JSON&lt;/a&gt; (or its sibling  &lt;a href="http://en.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt;, as used in &lt;a href="http://en.wikipedia.org/wiki/Google_App_Engine"&gt;Google App Engine&lt;/a&gt;) is much more suitable than XML, because accessing a list hash and scalar data hierarchy is easier than accessing data from XML DOM. I totally agree with &lt;a href="http://www.authenteo.com/page/XML_vs_JSON?mode=html"&gt;Kris Zyp - XML vs JSON&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Anyway, for maximum efficiency and speed you need to use &lt;a href="http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One"&gt;ASN.1&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Distinguished_Encoding_Rules"&gt;DER&lt;/a&gt; or a less standard but maybe with even more future like &lt;a href="http://en.wikipedia.org/wiki/Google"&gt;Google&lt;/a&gt;'s &lt;a href="http://en.wikipedia.org/wiki/Protocol_Buffers"&gt;Protocol Buffers&lt;/a&gt; (see &lt;a href="http://code.google.com/apis/protocolbuffers/docs/overview.html#whynotxml"&gt;what Google has to say about the inefficiency of XML&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/646943/what-is-the-worst-abuse-of-xml-that-you-have-seen"&gt;What is the worst abuse of XML that you have seen?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-4987469274799215880?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/4987469274799215880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=4987469274799215880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4987469274799215880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4987469274799215880'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/12/xml-and-dom-vs-json.html' title='XML (and DOM) vs JSON'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-6041420409959976921</id><published>2007-12-02T15:29:00.002Z</published><updated>2008-07-21T10:30:19.737Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='date/time'/><category scheme='http://www.blogger.com/atom/ns#' term='standards'/><title type='text'>On date/time (ISO 8601)</title><content type='html'>Date/time should always be saved in &lt;a href="http://en.wikipedia.org/wiki/Coordinated_Universal_Time"&gt;UTC&lt;/a&gt; in the database and used in UTC internally in the system and only displayed to the user in its favorite timezone and time-format. (Also, the &lt;a href="http://www.cl.cam.ac.uk/%7Emgk25/mswish/ut-rtc.html"&gt;PC Real Time Clock should run in UT&lt;/a&gt;)&lt;br /&gt;It freaks me out when I see an Internet site that still shows date/time of the content in the machine that hosts that content in its local time instead of UTC.&lt;br /&gt;I am a big supporter of &lt;a href="http://en.wikipedia.org/wiki/ISO_8601"&gt;ISO 8601&lt;/a&gt; and I use it everywhere.&lt;br /&gt;You should be using &lt;a href="http://en.wikipedia.org/wiki/ISO_8601"&gt;ISO 8601&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Coordinated_Universal_Time"&gt;UTC&lt;/a&gt; in case of any doubt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-6041420409959976921?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/6041420409959976921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=6041420409959976921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/6041420409959976921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/6041420409959976921'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/12/on-datetime-iso-8601.html' title='On date/time (ISO 8601)'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-8472589132538086063</id><published>2007-11-24T16:13:00.006Z</published><updated>2009-05-26T23:09:30.257Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Why shell scripting sucks</title><content type='html'>Writing any program in &lt;a href="http://en.wikipedia.org/wiki/Shell_script"&gt;shell script&lt;/a&gt; is like shooting in your own foot in my humble opinion. I am talking about &lt;a href="http://en.wikipedia.org/wiki/Bourne_shell"&gt;Bourne shell&lt;/a&gt; and its descendants. Here are my reasons:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Having the default setting of globing '*' returning '*' instead of nothing when there is nothing to match is just plain wrong. Suppose I write a shell script that updates the modify time in all the files in a directory so I write 'touch *', if there are files it works as expected, but if there are no files it creates '*' file!&lt;/li&gt;&lt;li&gt;To test that a variable is equal to something you have to do: &lt;tt&gt;if [ x$1 = x-h ]&lt;/tt&gt; that can not be a good programming language.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Lack of &lt;a href="http://en.wikipedia.org/wiki/Associative_array"&gt;associative array&lt;/a&gt;s, so it is not useful for anything but really basic scripts. (&lt;a href="http://tiswww.case.edu/php/chet/bash/NEWS"&gt;Bash 4.0 finally has support for associative arrays&lt;/a&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;It is not compiled, but executed line by line (you may not know it but python is compiled to bytecode at runtime and the bytecode interpreted unlike Java where the bytecode is also compiled to machine specific code)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So, in my opinion you better stop doing any shell scripts and write &lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;java&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Python_%28programming_language%29"&gt;python&lt;/a&gt; instead of a sucky shell script.&lt;br /&gt;If anyway, you code a shell script please see &lt;a href="http://wooledge.org:8000/BashPitfalls"&gt;Bash Pitfalls&lt;/a&gt; to know about all the &lt;a href="http://www.pixelbeat.org/programming/shell_script_mistakes.html"&gt;common shell script mistakes&lt;/a&gt; you can make and always &lt;a href="http://www.davidpashley.com/articles/writing-robust-shell-scripts.html"&gt;write robust shell scripts&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-8472589132538086063?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/8472589132538086063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=8472589132538086063' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8472589132538086063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8472589132538086063'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/11/why-shell-scripting-sucks.html' title='Why shell scripting sucks'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19764600.post-8094716501219205892</id><published>2007-11-24T13:19:00.027Z</published><updated>2010-05-12T22:15:34.420Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Java Packages</title><content type='html'>This is a list of some of the opensource &lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java&lt;/a&gt; packages that I am currently using in my programs:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/"&gt;Apache Commons&lt;/a&gt; is a great collection of packages that are not part of the core Java APIs&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Apache_Commons"&gt;Apache Commons&lt;/a&gt; &lt;a href="http://hc.apache.org/httpclient-3.x/"&gt;HttpClient&lt;/a&gt; that adds features the Java internal HTTP client lacks&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Log4j"&gt;log4j&lt;/a&gt; is the defacto standard Java logging package superseding the included  &lt;a href="http://java.sun.com/j2se/1.4.2/docs/guide/util/logging/overview.html"&gt;java.util.logging&lt;/a&gt; official SUN package. Even SUN includes &lt;a href="http://commons.apache.org/logging/"&gt;Apache Commons Logging&lt;/a&gt; with its &lt;a href="http://java.sun.com/developer/releases/petstore/"&gt;Java Pet Store Web Application Blueprint&lt;/a&gt;. &lt;a href="http://en.wikipedia.org/wiki/SLF4J"&gt;SLF4J&lt;/a&gt; should be used for new projects&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://poi.apache.org/"&gt;Apache POI&lt;/a&gt; great module to read and write &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Excel"&gt;Microsoft Excel&lt;/a&gt; files. POI has some bugs like &lt;a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=45260"&gt;Bug 45260 - Excel file unreadable due to applyFont()&lt;/a&gt; but it is ready for production. &lt;a href="http://stackoverflow.com/questions/1740060/which-is-better-open-source-for-excel-file-parsing-in-java"&gt;Which is better open source for Excel file parsing in Java?&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://opencsv.sourceforge.net/"&gt;opencsv&lt;/a&gt; a &lt;a href="http://en.wikipedia.org/wiki/Comma-separated_values"&gt;CSV&lt;/a&gt; parser and writer. &lt;a href="http://stackoverflow.com/questions/200609/can-you-recommend-a-java-library-for-reading-and-possibly-writing-csv-files"&gt;Can you recommend a Java library for reading (and possibly writing) CSV files?&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/iText"&gt;iText&lt;/a&gt; best &lt;a href="http://en.wikipedia.org/wiki/Portable_Document_Format"&gt;PDF&lt;/a&gt; creation and manipulation library. &lt;a href="http://stackoverflow.com/questions/364247/creating-a-pdf-from-java-and-displaying-it-in-a-webpage"&gt;Creating a PDF from Java and Displaying it in a webpage&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/JasperReports"&gt;JasperReports&lt;/a&gt; best Java reporting framework&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/JFreeChart"&gt;JFreeChart&lt;/a&gt; is the best way to create any kind of chart in Java&lt;/li&gt;&lt;li&gt;&lt;a href="http://htmlunit.sourceforge.net/"&gt;HtmlUnit&lt;/a&gt; great module to automate interaction with a website (formely I used &lt;a href="http://httpunit.sourceforge.net/"&gt;HttpUnit&lt;/a&gt; but it lacks good &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; support)&lt;/li&gt;&lt;li&gt;&lt;a href="http://nekohtml.sourceforge.net/"&gt;NekoHTML&lt;/a&gt; best Java &lt;a href="http://en.wikipedia.org/wiki/HTML"&gt;HTML&lt;/a&gt; parser&lt;/li&gt;&lt;li&gt;&lt;a href="https://jersey.dev.java.net/"&gt;Jersey&lt;/a&gt; &lt;a href="https://jsr311.dev.java.net/"&gt;JAX-RS&lt;/a&gt; reference implementation you can use to write &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt; Web Services&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Apache_CXF"&gt;Apache CXF&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/JAX-WS"&gt;JAX-WS&lt;/a&gt; implementation for &lt;a href="http://en.wikipedia.org/wiki/SOAP_%28protocol%29"&gt;SOAP&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Web_service"&gt;Web Service&lt;/a&gt;s (I previously used &lt;a href="http://en.wikipedia.org/wiki/Apache_Axis2"&gt;Apache Axis2&lt;/a&gt; but &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=46072#236043"&gt;found Apache CXF to be better engineered and easier to use than Apache Axis2&lt;/a&gt;. I also preffer using Java to specify the interface in my code and have WSDL autogenerated instead of having to write WSDL)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.opensymphony.com/quartz/"&gt;Quartz&lt;/a&gt; job scheduler. The classic &lt;a href="http://en.wikipedia.org/wiki/Cron"&gt;cron&lt;/a&gt; for use in any Java program&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Spring_Framework"&gt;Spring Framework&lt;/a&gt; great framework for developing any Java application&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Spring_Security"&gt;Spring Security&lt;/a&gt; easy and powerful way to add security to your site with many ways to authenticate&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.springsource.org/ldap"&gt;Spring LDAP&lt;/a&gt; best Java library for LDAP with a correct API for query building to prevent &lt;a href="http://www.owasp.org/index.php/LDAP_injection"&gt;LDAP injection&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Lucene"&gt;Lucene&lt;/a&gt; full text indexing and searching&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-8094716501219205892?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/8094716501219205892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=8094716501219205892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8094716501219205892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/8094716501219205892'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/11/java-packages.html' title='Java Packages'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-5297913522855380942</id><published>2007-11-17T12:32:00.003Z</published><updated>2008-12-25T11:10:05.151Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='events'/><title type='text'>On Event Loops</title><content type='html'>Whenever you may have to do any &lt;a href="http://en.wikipedia.org/wiki/Graphical_user_interface"&gt;Graphical User Interface&lt;/a&gt; development you should have had to learn about &lt;a href="http://en.wikipedia.org/wiki/Event-driven_programming"&gt;event-driven programming&lt;/a&gt; and the event loop the &lt;a href="http://en.wikipedia.org/wiki/Widget_toolkit"&gt;widget toolkit&lt;/a&gt; you are using has. Like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Glib" title="Glib"&gt;Glib&lt;/a&gt; &lt;a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html"&gt;Main Event Loop&lt;/a&gt; (can be used without &lt;a href="http://en.wikipedia.org/wiki/GTK+"&gt;GTK+&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29" title="Java (programming language)"&gt;Java&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Event_dispatching_thread" title="Event dispatching thread"&gt;Event dispatching thread&lt;/a&gt; (can not be used without &lt;a href="http://en.wikipedia.org/wiki/Abstract_Window_Toolkit"&gt;AWT&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Microsoft_Windows"&gt;Microsoft Windows&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows"&gt;Message loop&lt;/a&gt; (can not be used without a MSWindows &lt;a href="http://en.wikipedia.org/wiki/Graphical_user_interface"&gt;GUI&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;One thing that everyone is told (but it is difficult to follow) is to never do blocking IO in the event dispatching thread because that will block the GUI thus making the application irresponsible for an amount of time that depends on the length of that IO.&lt;br /&gt;&lt;br /&gt;Because not doing blocking IO in the event loop thread is difficult currently lots of applications in every widget toolkit have this problem. See this post by &lt;a href="http://ometer.com/"&gt;Havoc Pennington&lt;/a&gt; of &lt;a href="http://en.wikipedia.org/wiki/GNOME"&gt;GNOME&lt;/a&gt; fame "&lt;a href="http://log.ometer.com/2008-09.html#7"&gt;SYNCHRONOUS IO NEVER OK&lt;/a&gt;"&lt;br /&gt;&lt;br /&gt;One way to fix this problem would be to have a way of preventing any blocking call from executing inside the event loop by either logging a warning or just aborting the application when debugging it.&lt;br /&gt;&lt;br /&gt;Many people do not care too much about executing blocking code in the event loop because they think the call will run fast and the user will not notice the GUI has blocked. But that reasoning begins to break when the user has an scenario where files are on slow NFS, network or just slow permanent storage. Then the application has to be fixed for that scenario (like &lt;a href="https://developer.pidgin.im/ticket/37"&gt;pidgin: stop doing blocking file IO&lt;/a&gt; and &lt;a href="https://developer.pidgin.im/ticket/2280"&gt;Non-blocking Logging Features&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;One other problem is that even widget toolkits have some functions (or methods) that block for IO and are not even marked for so. There is also lack of good non blocking interfaces in operating systems (many still do not scale well enough with the number of events or are too messy to program)&lt;br /&gt;&lt;br /&gt;Even functions as open() can block for IO since it has to either check for file existence and permissions for open and create the file entry if the file is open for writing. So, currently if you do not want to block your UI for IO you have to put all file management (open, read, write, close, ...) in a separate thread.&lt;br /&gt;&lt;br /&gt;There is hope for better event based development with in kernel features like &lt;a href="http://lse.sourceforge.net/io/aio.html"&gt;Kernel Asynchronous I/O (AIO) Support for Linux&lt;/a&gt; but that is only the first step since any kernel call inside the event dispatching thread should not block under any circumstances.&lt;br /&gt;&lt;br /&gt;I personally think event-driver programming is the way to develop any program so I am committed to fix any issue that makes this problem fade.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-5297913522855380942?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/5297913522855380942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=5297913522855380942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5297913522855380942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5297913522855380942'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/11/on-event-loops.html' title='On Event Loops'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-9174903735515090662</id><published>2007-11-12T17:37:00.008Z</published><updated>2009-04-05T11:40:17.436Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><title type='text'>Open Source Mobile Phone Platforms</title><content type='html'>I am looking for a good Open Source Mobile Phone Platform and these ones seem like the one with most of the momentum:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Google"&gt;Google&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Android_%28mobile_phone_platform%29"&gt;Android&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Apache_license"&gt;Apache license&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Nokia"&gt;Nokia&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Maemo_%28operating_system%29"&gt;Maemo&lt;/a&gt; (Partial Open Source and Proprietary)&lt;/li&gt;&lt;/ul&gt;The future of open source in mobile phone platforms is good as the main current platforms (&lt;a href="http://en.wikipedia.org/wiki/Google"&gt;Google&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Android_%28mobile_phone_platform%29"&gt;Android&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/iPhone"&gt;iPhone&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Symbian_OS"&gt;Symbian&lt;/a&gt;) use really important open source components like &lt;a style="" href="http://en.wikipedia.org/wiki/WebKit"&gt;WebKit&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/SQLite"&gt;SQLite&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Let's hope for a future OSS platform for Mobile Phones like there currently is with distributions like &lt;a href="http://en.wikipedia.org/wiki/Ubuntu_%28Linux_distribution%29"&gt;Ubuntu&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-9174903735515090662?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/9174903735515090662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=9174903735515090662' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/9174903735515090662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/9174903735515090662'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/11/open-source-mobile-phone-platforms.html' title='Open Source Mobile Phone Platforms'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-222673526480790634</id><published>2007-11-12T14:04:00.007Z</published><updated>2010-04-10T11:30:08.687Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>atomic file writing</title><content type='html'>It still shocks me when I see code that is not writing files atomically.&lt;br /&gt;Most people still think that it is OK when changing something in a text file to do something like:&lt;br /&gt;file = open("filename.txt", O_RDONLY);&lt;br /&gt;read(file,...&lt;br /&gt;close(file)&lt;br /&gt;now change whatever in memory and write the file back:&lt;br /&gt;file = open("filename.txt", O_RDWR|O_CREAT|O_TRUNC|O_LARGEFILE, 0666)&lt;br /&gt;write(file,...&lt;br /&gt;close(file)&lt;br /&gt;&lt;br /&gt;This is the correct way to save the file back, also known as atomic save:&lt;br /&gt;file = open("filename.txt.tmp", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0666)&lt;br /&gt;if(write(file,...&lt;br /&gt;&lt;a href="https://bugs.edge.launchpad.net/ubuntu/+source/linux/+bug/317781/comments/54"&gt;if(fsync(file) /* this is needed as Linux can reorder operations on files */&lt;/a&gt;&lt;br /&gt;if(close(file)&lt;br /&gt;if(rename("file.txt.tmp", "file.txt") /* commit */&lt;br /&gt;&lt;br /&gt;Remember you have to check every write() and close() and the rename() for errors and rollback with unlink("file.txt.tmp") in case of any error.&lt;br /&gt;&lt;br /&gt;This is not something some newbies do, as this problem is in software like &lt;a href="http://en.wikipedia.org/wiki/Mozilla_Firefox"&gt;Mozilla Firefox&lt;/a&gt; with critical bugs like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=63292"&gt;Bug 63292 – session additions to global history lost on crash&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=193749"&gt;Bug 193749 – bookmarks and personal preferences are lost after system crash due to power failure&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=226970"&gt;Bug 226970 – lost of all stored passwords if out of disk space file truncated to zero length&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=228978"&gt;Bug 228978 – bandaid for disk full dataloss problems - warn user on start up that disk is nearly full and data may be lost&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;The main problem with not doing atomic file writes is that any problem while writing the file can leave the old one corrupted and that means data loss (one of the most common problems is full &lt;a href="http://en.wikipedia.org/wiki/Non-volatile_memory"&gt;non-volatile memory&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Good implementations of atomic file writing are in &lt;a href="http://en.wikipedia.org/wiki/Pidgin_%28software%29"&gt;Pidgin&lt;/a&gt;&lt;br /&gt;&lt;a href="http://developer.pidgin.im/viewmtn/revision/file/45a353a8a7978312260680050564b3a32f0d07aa/libpurple/util.c"&gt;purple_util_write_data_to_file_absolute()&lt;/a&gt; (that I helped to debug) and &lt;a href="http://en.wikipedia.org/wiki/GLib"&gt;glib&lt;/a&gt; &lt;a href="http://library.gnome.org/devel/glib/unstable/glib-File-Utilities.html#g-file-set-contents"&gt;g_file_set_contents()&lt;/a&gt;. But there are still lots of programs and libraries out there that are still not using atomic file writing.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.placenet.org/benoit/index.php/post/2009/04/03/I-want-to-believe"&gt;There is still no agreement on the correct way to save a file atomically as noted by Benoît Dejean. Even the ext3 &amp;amp; ext4 developer (Ted Ts'o) does not do proper research on this.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-222673526480790634?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/222673526480790634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=222673526480790634' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/222673526480790634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/222673526480790634'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/11/atomic-file-writing.html' title='atomic file writing'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-7471433213954256157</id><published>2007-11-09T19:48:00.000Z</published><updated>2008-01-25T20:32:28.878Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='activities'/><title type='text'>Things I like to do</title><content type='html'>&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Reading"&gt;Reading&lt;/a&gt; (nonfiction)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Learning"&gt;Learning&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Fixing things&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Walking"&gt;Walking&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Running"&gt;Running&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Mountain_biking"&gt;Mountain biking&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Socialization"&gt;Socializing&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Traveling"&gt;Traveling&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Any &lt;a href="http://en.wikipedia.org/wiki/Adventure"&gt;adventurous&lt;/a&gt; stuff&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-7471433213954256157?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/7471433213954256157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=7471433213954256157' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/7471433213954256157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/7471433213954256157'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/11/things-i-like-to-do.html' title='Things I like to do'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-9064056828517762497</id><published>2007-11-09T19:15:00.011Z</published><updated>2010-05-15T17:27:39.677Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Software I use</title><content type='html'>&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Operating_system"&gt;Operating system&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/Debian"&gt;Debian&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/GNU"&gt;GNU&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Linux"&gt;Linux&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Instant_messaging"&gt;Instant Messenger&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/Pidgin_%28software%29"&gt;Pidgin&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/E-mail_client"&gt;E-mail client&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/Mutt_%28e-mail_client%29"&gt;Mutt&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Web_browser"&gt;Web browser&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/Google_Chrome"&gt;Google Chrome&lt;/a&gt;  (&lt;a href="http://en.wikipedia.org/wiki/WebKit"&gt;WebKit&lt;/a&gt; based) and &lt;a href="http://en.wikipedia.org/wiki/Iceweasel"&gt;Iceweasel&lt;/a&gt; for development&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Desktop_environment"&gt;Desktop environment&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/GNOME"&gt;GNOME&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Raster_graphics_editor"&gt;Raster graphics editor&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/GIMP"&gt;GIMP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Vector_graphics"&gt;Vector graphics&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/Inkscape"&gt;Inkscape&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Office_suite"&gt;Office suite&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/OpenOffice.org"&gt;OpenOffice.org&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Gnumeric"&gt;Gnumeric&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/AbiWord"&gt;AbiWord&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Media_player_%28application_software%29"&gt;Media player&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/MPlayer"&gt;MPlayer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Multimedia_framework" title="Multimedia framework"&gt;Multimedia framework&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/FFmpeg"&gt;FFmpeg&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Download_manager"&gt;Download manager&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/Lftp"&gt;Lftp&lt;/a&gt; (supports many protocols besides HTTP and FTP, and &lt;a href="http://en.wikipedia.org/wiki/Segmented_downloading"&gt;segmented downloading&lt;/a&gt;) and &lt;a href="http://en.wikipedia.org/wiki/Wget"&gt;Wget&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Programming_language"&gt;Programming languages&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/C_%28programming_language%29"&gt;C&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Python_%28programming_language%29"&gt;Python&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Integrated_development_environment"&gt;Integrated development environment&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/Eclipse_%28software%29"&gt;Eclipse&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Version_control_system"&gt;Version control system&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/Concurrent_Versions_System"&gt;CVS&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Subversion_%28software%29"&gt;subversion&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Git_%28software%29"&gt;git&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Quilt_%28software%29"&gt;quilt&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-9064056828517762497?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/9064056828517762497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=9064056828517762497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/9064056828517762497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/9064056828517762497'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/11/software-i-use.html' title='Software I use'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-5717664150568043021</id><published>2007-11-09T15:28:00.007Z</published><updated>2009-07-20T21:42:10.058Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Why I use Open Source</title><content type='html'>&lt;ul&gt;&lt;li&gt;Because I can modify the source code as I want.&lt;/li&gt;&lt;li&gt;Because I do not have to accept things like &lt;a href="http://en.wikipedia.org/wiki/Digital_rights_management"&gt;DRM&lt;/a&gt;. (&lt;a href="http://xkcd.com/488/"&gt;Why DRM is bad&lt;/a&gt;, anyway &lt;a href="http://torrentfreak.com/drm-is-dead-riaa-says-090719/"&gt;DRM is dead&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Because I do not have to wait for updates from the company that produced the software. In Open Source software anyone can update the software.&lt;/li&gt;&lt;li&gt;Because I do not want a monopolistic company setting my software price with &lt;a href="http://en.wikipedia.org/wiki/Market_segmentation"&gt;market segmentation&lt;/a&gt; (&lt;a href="http://www.codinghorror.com/blog/archives/001283.html"&gt;market segmentation is used in most Microsoft products&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;Because I do not like proprietary software reinventing the wheel every day. Proprietary software lacks collaboration so it duplicates lots of unnecessary work.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Because I like standards and good implementations of them. See for example &lt;a href="http://en.wikipedia.org/wiki/OpenOffice.org"&gt;OpenOffice.org&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/OpenDocument"&gt;OpenDocument&lt;/a&gt; in contrast with suspiciously fasttracked OOXML that just seems like the ISO has been bought by Microsoft and is not independent anymore.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Because I can do things that can not be done with proprietary software. (Like DRM)&lt;/li&gt;&lt;li&gt;Because &lt;a href="http://www.codinghorror.com/blog/archives/001097.html"&gt;free software ends up being better than the proprietary counterpart&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-5717664150568043021?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/5717664150568043021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=5717664150568043021' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5717664150568043021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/5717664150568043021'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/11/why-i-use-open-source.html' title='Why I use Open Source'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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-19764600.post-4663798059798696759</id><published>2007-11-07T22:00:00.010Z</published><updated>2009-07-20T21:47:50.746Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='aboutme'/><title type='text'>About me</title><content type='html'>&lt;ul&gt;&lt;li&gt;I am a big advocate of the &lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java&lt;/a&gt; programming language.&lt;/li&gt;&lt;li&gt;I am a &lt;a href="http://en.wikipedia.org/wiki/Debian"&gt;Debian&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/GNU"&gt;GNU&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Linux"&gt;Linux&lt;/a&gt; user.&lt;/li&gt;&lt;li&gt;I promote the use of &lt;a href="http://en.wikipedia.org/wiki/Open_source"&gt;Open source&lt;/a&gt; because it advances technology development and prevents the use of crappy closed source and non free software.&lt;/li&gt;&lt;li&gt;I am a &lt;a href="http://en.wikipedia.org/wiki/Wikipedia"&gt;Wikipedia&lt;/a&gt; user and editor.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I adhere to &lt;a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;Don't repeat yourself&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;When developing something I always try to &lt;a href="http://en.wikipedia.org/wiki/KISS_principle"&gt;KISS principle&lt;/a&gt; otherwise other things that base on it will over-complicate and in a &lt;a href="http://en.wikipedia.org/wiki/Snowball_effect"&gt;snowball effect&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;I do &lt;a href="http://en.wikipedia.org/wiki/Defensive_programming"&gt;Defensive programming&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I am not religious in any way.&lt;/li&gt;&lt;li&gt;I am an &lt;a href="http://en.wikipedia.org/wiki/Optimism"&gt;optimist&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I &lt;a href="http://www.alkalizeforhealth.net/Lbattleofbrews.htm"&gt;drink tea instead of coffee&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;I do not &lt;a href="http://en.wikipedia.org/wiki/Smoking"&gt;smoke&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;I do not watch &lt;a href="http://en.wikipedia.org/wiki/Television"&gt;Television&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;I do not watch sports but I play them.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I am against &lt;a href="http://en.wikipedia.org/wiki/Cultural_exception"&gt;Cultural exception&lt;/a&gt;. Do not let your government say what you have to do, protect your liberty!&lt;/li&gt;&lt;li&gt;I use the Black &lt;a href="http://en.wikipedia.org/wiki/HTC_Dream"&gt;HTC Dream&lt;/a&gt; as my main &lt;a href="http://en.wikipedia.org/wiki/Mobile_phone"&gt;mobile phone&lt;/a&gt;, because it is the best phone there are.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19764600-4663798059798696759?l=edpeur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edpeur.blogspot.com/feeds/4663798059798696759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19764600&amp;postID=4663798059798696759' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4663798059798696759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19764600/posts/default/4663798059798696759'/><link rel='alternate' type='text/html' href='http://edpeur.blogspot.com/2007/11/i-am-big-advocate-of-java-programming.html' title='About me'/><author><name>Eduardo Pérez Ureta</name><uri>http://www.blogger.com/profile/10021380993283492209</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>
