<?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:blogger='http://schemas.google.com/blogger/2008' 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-4431645511404250310</id><updated>2025-05-11T11:59:10.628-07:00</updated><category term="development"/><category term="java"/><category term="general"/><category term="electronics"/><category term="eventfy"/><category term="linux"/><category term="performance"/><category term="shopping"/><category term="appfuse"/><category term="blog"/><category term="css"/><category term="mobile"/><category term="oracle"/><category term="pingr"/><category term="ssd"/><category term="virtual machines"/><category term="UML"/><category term="aspectj"/><category term="communication"/><category term="design"/><category term="e-reader"/><category term="internet"/><category term="javascript"/><category term="jquery"/><category term="kindle"/><category term="maven"/><category term="shell script"/><category term="translation"/><title type='text'>Thoughts For Beans</title><subtitle type='html'>Thoughts on Java development, technology, interesting links etc</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-7212447876913361272</id><published>2012-09-20T17:30:00.000-07:00</published><updated>2012-09-21T08:53:56.298-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile"/><title type='text'>Mobile-friendly websites</title><content type='html'>Many people these days rely more on their mobile devices - phones, tablets etc - to access the Internet than on desktop / laptop computers. As such, it is a common requirement in many websites today that we design / test / tune the usability not just for different computer browsers but also for mobile devices.&lt;br /&gt;
&lt;br /&gt;
While not every website has to cater to mobile devices this article gives some ideas on how you can make new and existing websites more mobile-friendly without requiring lots of coding or duplication.
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;br /&gt;
If you are building a new website from scratch there are few tools that can help kick-start your own project such as:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;H5BP&lt;/b&gt;:&amp;nbsp;&lt;a href=&quot;http://html5boilerplate.com/&quot; target=&quot;_blank&quot;&gt;http://html5boilerplate.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Initializr&lt;/b&gt;:&amp;nbsp;&lt;a href=&quot;http://www.initializr.com/&quot; target=&quot;_blank&quot;&gt;http://www.initializr.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
These tools are project skeletons you can use to start your own projects. They already integrate / implement several best practices, proven technologies and tricks that can save you a lot of time.&lt;br /&gt;
&lt;br /&gt;
If you already have a website and you can&#39;t rewrite / refactor it on top of one of the projects above then you have few options:&lt;br /&gt;
&lt;br /&gt;
You can write a completely separate mobile site - some sites take this route since this allows full separation between the &quot;PC version&quot; and the mobile version of their sites. The obvious drawback is that now you have 2 sites to maintain.&lt;br /&gt;
&lt;br /&gt;
Another option is to pick few tweaks from the projects above and add it in your existing site. For example, many times we can make existing websites more mobile-friendly with few simple changes:&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Automatically&amp;nbsp;adjust page layout and font sizes&lt;/h4&gt;
&lt;br /&gt;
Just include this single line in the head element of all your HTML pages:&lt;br /&gt;
&lt;br /&gt;

&lt;pre class=&quot;prettyprint linenums:1&quot;&gt;&amp;lt;head&amp;gt;&lt;br&gt;    …&lt;br&gt;    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0&quot;&amp;gt;&lt;br&gt;    …&lt;br&gt;&amp;lt;/head&amp;gt;
&lt;/pre&gt;

&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;
This is how &lt;a href=&quot;http://www.eventfy.com/&quot; target=&quot;_blank&quot;&gt;www.eventfy.com&lt;/a&gt; looks like in the iPhone without and with this single-line code:&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrGEO-EDg7OKCzNuzbNuzpqccpBe4Upg2XdA79-QMzhVfmzlBcpDcoZNiZorbOSIX-YlkMhS9MPLDnpdfEZHdDpbzsWg5YMwwkqgzE77abbVntG31og_5A447tHHOGNvUavji_kpH2FII/s1600/1.NoViewportTweak.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrGEO-EDg7OKCzNuzbNuzpqccpBe4Upg2XdA79-QMzhVfmzlBcpDcoZNiZorbOSIX-YlkMhS9MPLDnpdfEZHdDpbzsWg5YMwwkqgzE77abbVntG31og_5A447tHHOGNvUavji_kpH2FII/s320/1.NoViewportTweak.png&quot; width=&quot;170&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Eventfy without viewport tweak&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9Erq42svo5ylzzyec3GgMBLcts1cTShlXf07qPEq9Fzm0ktR0vpu8tKXCIejEKtKHfwVoOData9kQbhuhGa2wRik9C4VUkr7QAo9nRUC7SW5ou0c7wt-tnTZ3h8WeUw6RVJ3Z3xE9p0I/s1600/2.WithViewportTweak.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9Erq42svo5ylzzyec3GgMBLcts1cTShlXf07qPEq9Fzm0ktR0vpu8tKXCIejEKtKHfwVoOData9kQbhuhGa2wRik9C4VUkr7QAo9nRUC7SW5ou0c7wt-tnTZ3h8WeUw6RVJ3Z3xE9p0I/s320/2.WithViewportTweak.png&quot; width=&quot;170&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Eventfy with viewport tweak&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&amp;nbsp;It may not look like a lot but with this minor tweak users don&#39;t need to constantly zoom in and scroll horizontally in every page. Also, it does not break usability in PC browsers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Use responsive layouts&lt;/h4&gt;
&lt;br /&gt;
If you use fixed layouts where we position DIVs regardless of the client&#39;s resolution users will likely have to scroll horizontally. You can improve things considerably if you use percentages to set the widths of your DIVs. This will avoid the scroll bars but may result in tiny columns for users with smaller screens.
&lt;br /&gt;&lt;br /&gt;
A better approach would be to setup the layout so that it properly adapts to the client&#39;s resolution / screen width. Check out Bootstrap&#39;s live grid example &lt;a href=&quot;http://twitter.github.com/bootstrap/scaffolding.html#gridSystem&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. Note that when you open it with your PC browser maximized the 9 columns (those marked with &#39;1&#39;) are listed horizontally. When you resize the browser reducing the window width the layout will automatically change so that all &#39;1&#39; columns are stacked on top of each other.&lt;br /&gt;
&lt;br /&gt;
It sure helps if you can use something like Twitter Bootstrap, but if not you can still achieve similar results with custom CSS code.&amp;nbsp;More specifically, you can use the &lt;a href=&quot;http://www.w3.org/TR/css3-mediaqueries/&quot; target=&quot;_blank&quot;&gt;@media&lt;/a&gt; tag to query information about your client and tweak your CSS classes. For example:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint linenums:1&quot;&gt;@media all {
    &lt;span class=&quot;rem&quot;&gt;// add common CSS here&lt;/span&gt;
}

&lt;span class=&quot;rem&quot;&gt;/*--- iPad ---*/&lt;/span&gt;
&lt;span class=&quot;rem&quot;&gt;/*--- full screen mode ---*/&lt;/span&gt;
@media (device-width: 768px) and (orientation: portrait) {
    .panel {
        height                       : 934px; &lt;span class=&quot;rem&quot;&gt;/*1004-80*/&lt;/span&gt;
    }
}
&lt;span class=&quot;rem&quot;&gt;/*--- browser mode ---*/&lt;/span&gt;
@media (device-width: 768px) and (orientation: landscape) {
    .panel {
        height                       : 668px; &lt;span class=&quot;rem&quot;&gt;/*748-80*/&lt;/span&gt;
    }
}

&lt;span class=&quot;rem&quot;&gt;/*--- iPhone / small screens ---*/&lt;/span&gt;
&lt;span class=&quot;rem&quot;&gt;/*--- full screen mode ---*/&lt;/span&gt;
@media (max-width: 480px) and (orientation: portrait) {
    .panel {
        height                       : 380px; &lt;span class=&quot;rem&quot;&gt;/*460-80*/&lt;/span&gt;
    }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;div&gt;
With the code above the &quot;panel&quot; class will be tweaked based on the client&#39;s resolution.&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
You can find a better example of what you can do with CSS and media queries in the &lt;a href=&quot;http://www.eventfy.com/&quot; target=&quot;_blank&quot;&gt;www.eventfy.com&lt;/a&gt; website. In common PC resolutions Eventfy&#39;s top menu bar lists all items horizontally. In smaller screens it consolidate items in a drop-down list to save space. This&amp;nbsp;is what it looks like:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZfVC6218TdhA5lSk4SsYPadYBwCHN-bLuxeG1g1Oi_L46LwlpbdRwG61kLUNKh0DI8g7of5QVm2li7zdZH2jMncabs7NVXMmB-Ss4VgI7A1L07tRGbHQKj6Iiys7GtBkknvbat7tuMrc/s1600/1.EventfyTopBarFullRes.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;25&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZfVC6218TdhA5lSk4SsYPadYBwCHN-bLuxeG1g1Oi_L46LwlpbdRwG61kLUNKh0DI8g7of5QVm2li7zdZH2jMncabs7NVXMmB-Ss4VgI7A1L07tRGbHQKj6Iiys7GtBkknvbat7tuMrc/s640/1.EventfyTopBarFullRes.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Eventfy&#39;s top menu bar - full monitor resolution&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaejEArvJRiLxZnOyGQduoQOqD7Nzamiw8L6BwCfzEUnjl8_SbQOlbeOsASsA1Cbd2_x2Itpb-jIKHCDyjCI1QZQ2le9wz9UX38BYvspmhIurOlBd2fHpE-SIo0Inj926zKV9BwlQQW5E/s1600/2.EventfyTopBarSmallRes.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;197&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaejEArvJRiLxZnOyGQduoQOqD7Nzamiw8L6BwCfzEUnjl8_SbQOlbeOsASsA1Cbd2_x2Itpb-jIKHCDyjCI1QZQ2le9wz9UX38BYvspmhIurOlBd2fHpE-SIo0Inj926zKV9BwlQQW5E/s200/2.EventfyTopBarSmallRes.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Eventfy&#39;s top menu bar - browser window resized at 360px width&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjou9P3_jlpKmEi_tWc1FvAy1zhXWpuJe8oWc3ERBDarmRzVrfYtDqt-DdyEf8POy1zxa_dcp1wqxzJLqkl5sxNormX1UF_wpS8PZJZSNWUQeS2qcpjRUv9eMc9r4dGoXjLR4sZdYndy1I/s1600/3.EventfyTopBarSmallResOpen.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjou9P3_jlpKmEi_tWc1FvAy1zhXWpuJe8oWc3ERBDarmRzVrfYtDqt-DdyEf8POy1zxa_dcp1wqxzJLqkl5sxNormX1UF_wpS8PZJZSNWUQeS2qcpjRUv9eMc9r4dGoXjLR4sZdYndy1I/s320/3.EventfyTopBarSmallResOpen.png&quot; width=&quot;224&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Eventfy&#39;s top menu bar, expanded menu - browser window resized at 360px width&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Another thing I did to make better use of small mobile screens is to hide some unimportant content. For example, the long marketing message below the Eventfy title only shows up in big browser windows, and is hidden in smaller devices.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div&gt;
Setting this up was simple, I created a CSS class &quot;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;details&lt;/span&gt;&quot;, and in the @media with &quot;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;max-width: 480px&lt;/span&gt;&quot; sections I override it with a &quot;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;display: none;&lt;/span&gt;&quot;. This way all the extra content that fits nicely in the big PC browser window but doesn&#39;t in smaller devices gets hidden.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Conclusion&lt;/h4&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;If you are building a new website, consider making it compatible with mobile devices from the start. It isn&#39;t extra work if you are doing it from the beginning.&lt;/li&gt;
&lt;li&gt;If you already have existing websites, determine if it makes sense to make them mobile-friendly. Not every website would benefit with support for mobile devices.&lt;/li&gt;
&lt;li&gt;Test your sites with mobile devices. Pick someone to test it and give you feedback, or pretend you are one of your users. Identify main usability items that can be improved (e.g. reduce zooming / scrolling, adjust layout, hide extra content etc).&lt;/li&gt;
&lt;li&gt;Try tools to help improve layout in different devices / browsers without increasing maintenance. These can save you a lot of time coding / tweaking things by hand.&lt;/li&gt;
&lt;li&gt;Implement tweaks to improve usability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
And that&#39;s it for now, happy coding folks!&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/7212447876913361272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/09/mobile-friendly-websites.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/7212447876913361272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/7212447876913361272'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/09/mobile-friendly-websites.html' title='Mobile-friendly websites'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrGEO-EDg7OKCzNuzbNuzpqccpBe4Upg2XdA79-QMzhVfmzlBcpDcoZNiZorbOSIX-YlkMhS9MPLDnpdfEZHdDpbzsWg5YMwwkqgzE77abbVntG31og_5A447tHHOGNvUavji_kpH2FII/s72-c/1.NoViewportTweak.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-2410400993034488447</id><published>2012-09-10T11:49:00.001-07:00</published><updated>2012-09-14T12:55:16.994-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blog"/><category scheme="http://www.blogger.com/atom/ns#" term="communication"/><category scheme="http://www.blogger.com/atom/ns#" term="general"/><category scheme="http://www.blogger.com/atom/ns#" term="internet"/><category scheme="http://www.blogger.com/atom/ns#" term="pingr"/><title type='text'>My GoDaddy domain is down</title><content type='html'>&lt;br /&gt;
My domain registrar (GoDaddy) &lt;a href=&quot;http://techcrunch.com/2012/09/10/godaddy-outage-takes-down-millions-of-sites/&quot;&gt;is currently down&lt;/a&gt; (9/10/2012 11:20AM AZ) in what seems to be an attack from the group Anonymous. Not only their services are down, even their &lt;a href=&quot;http://www.godaddy.com/&quot;&gt;main webpage&lt;/a&gt; is down right now! Wow, that was ugly!&lt;br /&gt;
&lt;br /&gt;
I am not hosting any of &lt;a href=&quot;http://www.eventfy.com/&quot;&gt;my projects&lt;/a&gt; with them. Everything is hosted on Google infrastructure (AppEngine, Apps for Business, Blogger etc). Unfortunately they are all down too because I still rely on GoDaddy&#39;s DNS servers! Grrrrr! :(&lt;br /&gt;
&lt;br /&gt;
The only positive thing I can take from this issue is that my web monitor app &lt;a href=&quot;http://pingr.eventfy.com/&quot;&gt;Pingr&lt;/a&gt; worked as designed and quickly notified me about the problem. In this case there isn&#39;t much I can do to fix it though, have to wait for GoDaddy figure it out on their side. At least &lt;a href=&quot;http://pingr.eventfy.com/&quot;&gt;Pingr&lt;/a&gt; will tell me once their system is back up.&amp;nbsp;Until then Pingr&#39;s main URL (&lt;a href=&quot;http://pingr-eventfy-com.appspot.com/&quot;&gt;http://pingr.eventfy.com/&lt;/a&gt;) will be unavailable.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;P.S.&lt;/b&gt; If anyone else wants to receive a notification from Pingr when your system is backup you can use it from its Google AppEngine&#39;s URL:&amp;nbsp;&lt;a href=&quot;http://pingr-eventfy-com.appspot.com/&quot;&gt;http://pingr-eventfy-com.appspot.com/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Update:&lt;/b&gt; at 3:18PM AZ (about 4 hours since I found out about this issue!) my domain &lt;i&gt;eventfy.com&lt;/i&gt;&amp;nbsp;finally got back up.&lt;br /&gt;
&lt;br /&gt;
It seems some sites are still affected but GoDaddy is slowly getting there. You can find a discussion about this issue here (&lt;a href=&quot;http://www.reddit.com/r/technology/comments/znvwk/godaddycom_dns_servers_are_completely_down_and/&quot;&gt;Reddit&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Update:&lt;/b&gt;&amp;nbsp;yesterday night (9/13) GoDaddy sent me an email taking the blame, stating that it wasn&#39;t caused by an external hacker but by themselves. Not sure if (i) I buy it and (ii) it makes me feel any safer if this is true. Anyways they gave me a 30% off new product or renewal valid for 7 days. Man, I am just happy I don&#39;t depend on this for my livelihood! :)</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/2410400993034488447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/09/my-domain-is-down.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/2410400993034488447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/2410400993034488447'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/09/my-domain-is-down.html' title='My GoDaddy domain is down'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-6139190473519434740</id><published>2012-09-05T15:10:00.001-07:00</published><updated>2012-09-06T13:44:59.728-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="shell script"/><title type='text'>Server resource utilization monitoring</title><content type='html'>Pretty much every Linux distribution has tools to help sys admins monitor the utilization of common server resources such as CPU, memory and storage. For advanced monitoring and reporting we may need to install 3rd-party tools (e.g. &lt;a href=&quot;http://www.nagios.org/&quot;&gt;Nagios&lt;/a&gt;&amp;nbsp;or &lt;a href=&quot;http://www.fullyautomatednagios.org/wordpress/&quot;&gt;FAN&lt;/a&gt;) but sometimes we just want a simple way to get warnings when critical server resources may be close to overload.&lt;br /&gt;
&lt;br /&gt;
Here is a set of simple shell scripts (tested in RHEL and CentOS) you can use to monitor CPU, memory and storage space. If utilization goes over a threshold these scripts will send you an email warning hopefully soon enough so that you can fix it before a system crash. Assuming you have access to basic commands like vmstat, df, mail and crontab these scripts can be setup even if you do not have root access to the server.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;
CPU Monitor&lt;/h2&gt;
This will send you an email notification if the average CPU utilization of the last 10 seconds is higher than the configured threshold.
&lt;br /&gt;
&lt;pre class=&quot;prettyprint linenums:1&quot;&gt;#!/bin/sh

#
#CONFIGURATION BLOCK:
#

#Set the alarm threshold here
#e.g. set to 90 to make it send notifications if average utilization goes past 90%
THRESHOLD=90
#Add your email address here
MAILTO=&quot;myemail@eventfy.com&quot;
#The temp file below will be replaced everytime this script runs
TEMPFILE=/tmp/cpu.temp

#
#LOGIC BLOCK:
#

HOSTNAME=`hostname`
rm -f $TEMPFILE 

#Calculate the CPU Utilization with the command below
#Note: this command will calculate the avg CPU utilization of last 10 secs
CPU=$(vmstat 10 2 | tail -1 | awk &#39;{print $15}&#39; | sed &#39;s/%//&#39;)
let &quot;CPU = 100 - $CPU&quot;
#echo &quot;`date` - CPU Utilization: $CPU&quot;

#Compare the current value with the threshold one.
if [ $(expr $CPU &quot;&amp;gt;=&quot; $THRESHOLD) -ne 0 ]
then
echo &quot;Warning - CPU utilization on server $HOSTNAME is ${CPU}%&quot; &amp;gt;&amp;gt; $TEMPFILE
fi

#Send an email if /tmp/cpu.temp is present.
if [ -e $TEMPFILE ]
then
mail -s &quot;$HOSTNAME CPU Warning&quot; $MAILTO &amp;lt; $TEMPFILE
fi

rm -f $TEMPFILE
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Memory&amp;nbsp;Monitor&lt;/h2&gt;
This will send you an email notification if the percentage of used RAM + swap is higher than the configured threshold.
&lt;br /&gt;
&lt;pre class=&quot;prettyprint linenums:1&quot;&gt;#!/bin/sh

#
#CONFIGURATION BLOCK:
#

#Set the alarm threshold here
#e.g. set to 90 to make it send notifications if memory utilization goes past 90%
THRESHOLD=90
#Add your email address here
MAILTO=&quot;myemail@eventfy.com&quot;
#The temp file below will be replaced everytime this script runs
TEMPFILE=/tmp/memory.temp

#
#LOGIC BLOCK:
#

HOSTNAME=`hostname`
rm -f $TEMPFILE

#Calculate the SWAP Utilization with the below command.
#Note: this script will take avg utilization of last 10 secs
TOTAL_RAM=$(vmstat 1 2 -s | grep &quot;total memory&quot; | awk &#39;{print $1}&#39;)
#echo &quot;`date` - TOTAL_RAM: $TOTAL_RAM&quot;
USED_RAM=$(vmstat 1 2 -s | grep &quot;used memory&quot; | awk &#39;{print $1}&#39;)
#echo &quot;`date` - USED_RAM: $USED_RAM&quot;

TOTAL_SWAP=$(vmstat 1 2 -s | grep &quot;total swap&quot; | awk &#39;{print $1}&#39;)
#echo &quot;`date` - TOTAL_SWAP: $TOTAL_SWAP&quot;
USED_SWAP=$(vmstat 1 2 -s | grep &quot;used swap&quot; | awk &#39;{print $1}&#39;)
#echo &quot;`date` - USED_SWAP: $USED_SWAP&quot;

PERCENT_USE=0
let &quot;PERCENT_USE=100 * ($USED_RAM + $USED_SWAP) / ($TOTAL_RAM + $TOTAL_SWAP)&quot;
#echo &quot;`date` - Memory Utilization: $PERCENT_USE&quot;

#Compare the current value with the threshold one.
if [ $(expr $PERCENT_USE &quot;&amp;gt;=&quot; $THRESHOLD) -ne 0 ]
then
echo &quot;Warning - memory utilization on server $HOSTNAME is ${PERCENT_USE}%&quot; &amp;gt;&amp;gt; $TEMPFILE
fi

#Send an email if /tmp/memory.temp is present.
if [ -e $TEMPFILE ]
then
mail -s &quot;$HOSTNAME Memory Warning&quot; $MAILTO &amp;lt; $TEMPFILE
fi

rm -f $TEMPFILE
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Disk Space&amp;nbsp;Monitor&lt;/h2&gt;
This will send you an email notification if a target partition&#39;s percentage used space is higher than the configured threshold.
&lt;br /&gt;
&lt;pre class=&quot;prettyprint linenums:1&quot;&gt;#!/bin/sh

#
#CONFIGURATION BLOCK:
#

#Set the alarm threshold here
#e.g. set to 70 to make it send notifications if partition utilization goes past 70%
THRESHOLD=70
#Add your email address here
MAILTO=&quot;myemail@eventfy.com&quot;
#The temp file below will be replaced everytime this script runs
TEMPFILE=/tmp/diskspace.temp
#Set target partition with unique substring identifier based on the output of &#39;df -P&#39;
TARGET_PARTITION=&quot;LogVol00&quot;

#
#LOGIC BLOCK:
#

HOSTNAME=`hostname`
rm -f $TEMPFILE

#Calculate the partition utilization with the command below
PERCENT_USE=$(df -P | grep &quot;$TARGET_PARTITION&quot; | awk &#39;{print $5}&#39; | sed &#39;s/%//&#39;)
#echo &quot;`date` - Disk space usage: $PERCENT_USE&quot;

#Compare the current value with the threshold one.
if [ $(expr $PERCENT_USE &quot;&amp;gt;=&quot; $THRESHOLD) -ne 0 ]
then
echo &quot;Warning - low disk space (${PERCENT_USE}%) available on partition ${TARGET_PARTITION} in server $HOSTNAME&quot; &amp;gt;&amp;gt; $TEMPFILE
fi

#Send an email if /tmp/diskspace.temp is present.
if [ -e $TEMPFILE ]
then
mail -s &quot;$HOSTNAME Disk Space Warning&quot; $MAILTO &amp;lt; $TEMPFILE
fi

rm -f $TEMPFILE
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Setup&lt;/h2&gt;
1. With a text editor (e.g. vi) create new shell script files so you can copy/paste the code above.&lt;br /&gt;
2. Make sure you edit the configuration part of each script (e.g. your email address, target partition etc).&lt;br /&gt;
3. Setup crontab to execute these scripts every X minutes:&lt;br /&gt;
&lt;br /&gt;
Use &quot;crontab -e&quot; to edit and save your changes. Assuming you will keep these scripts in &quot;/root/monitor&quot; and want to run each one every 10 minutes your crontab configuration would look like this:

&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;0,10,20,30,40,50 * * * * /root/monitor/cpu.sh
1,11,21,31,41,51 * * * * /root/monitor/memory.sh
2,12,22,32,42,52 * * * * /root/monitor/diskspace.sh
&lt;/pre&gt;
&lt;br /&gt;
&lt;h3&gt;
Notes&lt;/h3&gt;
These scripts do not require special permissions and should run fine with non-root users in most systems. It may be a good idea to setup these scripts as root if you have root access though.&lt;br /&gt;
These scripts are very lightweight but it may still be a good idea to set them so they don&#39;t run at the same time like above.&lt;br /&gt;
You can use &quot;crontab -l&quot; to list and review the crontab configuration.

&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Additional Notes&lt;/h2&gt;
You should test these scripts in your server if you plan to rely on these notifications. You can run a quick test by setting the thresholds to some low number and validate that you are getting emails.&lt;br /&gt;
&lt;br /&gt;
If you get error &quot;mail: command not found&quot; you may need to run this as root:

&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;yum install mailx
&lt;/pre&gt;
And finally, keep in mind that these scripts will be sending you emails until the problem is fixed. It would be simple to change it to only send emails when the situation changes, but I was okay with emails every 10 mins until the problem is fixed.
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/6139190473519434740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/09/server-resource-utilization-monitoring.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/6139190473519434740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/6139190473519434740'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/09/server-resource-utilization-monitoring.html' title='Server resource utilization monitoring'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-5392319754146855491</id><published>2012-08-27T05:00:00.000-07:00</published><updated>2012-08-27T05:00:18.278-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="shopping"/><title type='text'>My Amazon Wish List</title><content type='html'>&lt;style&gt;
.hero-unit {
    padding: 60px;
    margin-bottom: 30px;
    background-color: #EEE;
    border-color: #DDD;
    border-style:solid;
    border-width:1px;
    border-radius: 6px 6px 6px 6px;
}
.ad {
    float: left;
    width: 100px;
}
.desc {
    float: right;
    width: 100px;
}
.cell {
    float: left;
    margin: 10px;
    width: 230px;
    padding: 10px;
    min-height: 250px;
    background-color: #EEE;
    border: 1px;
    border-color: #DDD;
    border-style:solid;
    border-width:1px;
    border-radius: 6px 6px 6px 6px;
}
&lt;/style&gt;


&lt;br /&gt;
&lt;div class=&quot;container&quot;&gt;
&lt;div class=&quot;hero-unit&quot;&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
Selected items from&lt;/div&gt;
&lt;h1 style=&quot;text-align: center;&quot;&gt;
My Amazon Wish List&lt;/h1&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0073F92OK&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Lots of juice to power your gadgets during those long flights&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0058AH2US&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
If you have a compatible Mac get this and the Samsung SSD laptop kit for the best upgrade you can possibly get on your laptop!&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B005T3GPXY&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Includes laptop upgrade kit accessories&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B004J6DLD4&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
This kit comes also with 4 rechargable batteries (2xAA and 2xAAA) and spacers to convert the batteries into C or D sizes&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0044V3USU&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Hide your backyard and pool stuff in style&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B001F17IQW&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
No, really, how cool is that?&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B00004R9VV&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Zap those flying bugs and reclaim your backyard!&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B00752VLSG&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Yes it is expensive as heck but this is a wish list right? :)&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B003P2UMS0&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Get few of these and save energy (and $$$)&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B003P2UMP8&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Helps you find the energy hogs in your house&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B006ML9J4O&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Automate your house&#39;s cooling / heating&lt;br /&gt;
Set the temperatue with your smartphone&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B000NL0T1G&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
You should probably be extra careful shaving with this one&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B002JW8S6K&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=0786958731&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=0786959916&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=1589949358&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B000W9BP44&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B002Z8E52Y&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B003P2UM1W&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Is there any all-in-one better than this yet?&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B003WJR694&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0032Y2OT6&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
For the (weekend) handyman (wannabe)&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B00002N6SK&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
This magical item not only gives you darkvision but if the need arises you can also use it as a club!&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B002H0BOBA&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Hook this up on your living (or media) room HTPC and its &quot;couch potato&quot; time&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0085MX3SG&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Guess this is good for guitarists?&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/5392319754146855491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/08/my-amazon-wish-list.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/5392319754146855491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/5392319754146855491'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/08/my-amazon-wish-list.html' title='My Amazon Wish List'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-5022543881753851768</id><published>2012-08-24T17:30:00.000-07:00</published><updated>2012-08-24T17:30:00.829-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="eventfy"/><category scheme="http://www.blogger.com/atom/ns#" term="translation"/><title type='text'>Translate your website with Google Website Translator</title><content type='html'>Oftentimes we want to support multiple languages in our websites. One &quot;easy&quot; way is to keep one separate resource bundle for each language we support, but this isn&#39;t as simple as it seems. First you need a tag / mapping mechanism to match labels in your pages with tags in the property files (frameworks like JSF already provide it) but then you need to maintain multiple sets of labels. Any new field / screen etc will require changes all resource bundles, which can quickly become a burden. In many cases this burden may be &amp;nbsp;acceptable in exchange for full control and performance, but in other cases we can use Google&#39;s Website Translator tool.&lt;br /&gt;
&lt;br /&gt;
Follow these steps to find out how to easily include a styled language selector into your website, and to remove the Google Website Translator toolbar. I recently applied these steps in Eventfy and the final result looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggTLc6ZFZHxRSMbQ2Xmgqxp7UW5Uhcrgu4bPjsEkENt7HGpekag6qqJpl_9vALYHmzzCWzOYUU4YIY5SXFF5LgSPtWi0u_gZkUG604eeWp6YCq8TwN4BBFI153YgfGVG4gmHG0nPE6Yg4/s1600-h/eventfyEnglish10.png&quot;&gt;&lt;img alt=&quot;eventfyEnglish&quot; border=&quot;0&quot; height=&quot;216&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_aEfDEp_i-lAMvP_hVkkGjTrIjAqHrKpID7lCqJ867OJt1g4YSiapi7gspDY68OZrbi2gENBt1clPwZm9dQgv_f6pNMgAHp5OFCyKGmtdpRJsRigzQj3HT19dWwHLHLTOY9dlV7NBi_4/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;eventfyEnglish&quot; width=&quot;499&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
First login with your Gmail account and sign your site up to &lt;a href=&quot;https://translate.google.com/manager/&quot; title=&quot;Google Website Translator&quot;&gt;Google Website Translator&lt;/a&gt;. Just click the “&lt;em&gt;+ Add new website&lt;/em&gt;” button:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLxDBIKi3_EUWhRt4Lc_9_vMc2BNByi_eAb0qv6vpWJZLDTVd4lZDi-KikqIdjMxgINBzkrCee_w3gtut_60LsO416Rfpf6CcB0yAevoaKCjbt8UYPOMvcVAKb1UXylBIJ0W89OIOVHkc/s1600-h/image8.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;49&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmUzpQMhPWxy6egCzNxVAHldXFwVn5b7zRhIqXF9MOSWPa2-BMhpm8bUZUTqYwvtC4pC-Sp8Si01bibjOlt5xOek-_9yiJemnfuNiTQ5bTa4tjVXgLL3ITStNGcSfDcLhM6WPWHINZ0sc/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;333&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Select your site’s default language, and all other languages you want the GWT widget to list to your users. At the end it will give you a HTML code snippet like this:&lt;br /&gt;
&lt;div class=&quot;codeview&quot;&gt;
&lt;pre&gt;&amp;lt;div id=&lt;span class=&quot;str&quot;&gt;&quot;google_translate_element&quot;&lt;/span&gt;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;script type=&lt;span class=&quot;str&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt;&amp;gt;
function googleTranslateElementInit() {
  &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; google.translate.TranslateElement({pageLanguage: &lt;span class=&quot;str&quot;&gt;&#39;en&#39;&lt;/span&gt;, includedLanguages: &lt;span class=&quot;str&quot;&gt;&#39;en,es,fr,it,nl,pt&#39;&lt;/span&gt;, layout: google.translate.TranslateElement.InlineLayout.SIMPLE}, &lt;span class=&quot;str&quot;&gt;&#39;google_translate_element&#39;&lt;/span&gt;);
}
&amp;lt;/script&amp;gt;&amp;lt;script type=&lt;span class=&quot;str&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt; src=&lt;span class=&quot;str&quot;&gt;&quot;//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit&quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, &quot;Courier New&quot;, courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;
Just add this code where you want the language selector to appear in your page. In Eventfy’s case I added it inside a &lt;strong&gt;&amp;lt;li style=&quot;padding-top:5px;&quot;&amp;gt;&lt;/strong&gt; block to get it aligned with the other menu items. This is all there is to get it to work, give it a try!&lt;br /&gt;
&lt;br /&gt;
This is how Eventfy looked with this default code:&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio8QpnQhFfitr21YbxGGkNdQS-5haIw07qnz-ARis8jxnB_2aTzFJQ-bBZ46CAM30dIT9q14MXpMddOFp8ckBOvBhWbjdSpgQXf6fz2eFoTHwy-hdxLqj_v19y4QVdul6Wvfk_CzdO3KQ/s1600/blogDefaultLanguageSelector.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;30&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio8QpnQhFfitr21YbxGGkNdQS-5haIw07qnz-ARis8jxnB_2aTzFJQ-bBZ46CAM30dIT9q14MXpMddOFp8ckBOvBhWbjdSpgQXf6fz2eFoTHwy-hdxLqj_v19y4QVdul6Wvfk_CzdO3KQ/s320/blogDefaultLanguageSelector.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Default language selector with Google icon&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-LwYKkANo86_fVpORmNdDfopk0BjXwVK86bme-AYuAosBPWj9GSZuw2e8OQ7xTvN4AaAlMp8F-H5OkRKYaHnNYFUFF4H0ebDl4pDEaAdp_5u8lcnZaS9LDYe-1ItrYsZtwe7QyBEZJqA/s1600/blogDefaultLanguageToolbar.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;225&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-LwYKkANo86_fVpORmNdDfopk0BjXwVK86bme-AYuAosBPWj9GSZuw2e8OQ7xTvN4AaAlMp8F-H5OkRKYaHnNYFUFF4H0ebDl4pDEaAdp_5u8lcnZaS9LDYe-1ItrYsZtwe7QyBEZJqA/s320/blogDefaultLanguageToolbar.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Google translator toolbar hiding Eventfy&#39;s top menu and bad Portuguese translation&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
I like how easy it was to include it into Eventfy but I thought the language selector and the toolbar didn&#39;t look good with the rest of the site.&amp;nbsp;The next step was then to override Google&#39;s default style with custom CSS so it looks as part of Eventfy&#39;s design. I removed the Google icon and the Google translator toolbar with the following style overrides:&lt;br /&gt;
&lt;br /&gt;
1. Remove Google icon and &quot;linky&quot; behavior from language selector:&lt;br /&gt;
&lt;div class=&quot;codeview&quot;&gt;
&lt;pre&gt;.goog-te-gadget-icon {display:none;}
.goog-te-gadget-simple a {text-decoration: none !important;}&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
2. Remove the Google translate toolbar:&lt;br /&gt;
&lt;div class=&quot;codeview&quot;&gt;
&lt;pre&gt;.goog-te-banner-frame.skiptranslate {display: none !important;}
body { top: 0px !important; }
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;strong&gt;Note:&lt;/strong&gt; you may want to add a &lt;strong&gt;&amp;lt;span class=&quot;notranslate&quot;&amp;gt;&lt;/strong&gt; anywhere you don&#39;t want translations (e.g. email addresses like “&lt;em&gt;someone at somedomain dot com&lt;/em&gt;”).&lt;br /&gt;
&lt;br /&gt;
Please note that while this is very easy to setup, since this is all computer-based some translations are way off. Thankfully we - site admins and users - can improve / override the automated translations with rules and suggestions (always managed by the website admin). More specifically, users can click on a translated phrase and suggest a better translation. Then, the website&#39;s admin can see and approve / reject suggestions from the&amp;nbsp;&lt;a href=&quot;https://translate.google.com/manager/&quot; title=&quot;Google Website Translator&quot;&gt;Google Website Translator&lt;/a&gt;&amp;nbsp;website.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjL7-ADpaQHPUByJHppW05usNhD4yZRysNX1wVvk6kAthdwrkjChDGziXfK9lcnlfmHUBxGFlx53Wy5cKcpagfrRnCVIOXN0ioJSJhlwQT51wo5dQDd8kZC_0zTxWsMDSvV_EMdeHX2Btk/s1600/blogFinalResult.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;225&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjL7-ADpaQHPUByJHppW05usNhD4yZRysNX1wVvk6kAthdwrkjChDGziXfK9lcnlfmHUBxGFlx53Wy5cKcpagfrRnCVIOXN0ioJSJhlwQT51wo5dQDd8kZC_0zTxWsMDSvV_EMdeHX2Btk/s320/blogFinalResult.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Final result - no toolbar, no Google icon and improved Portuguese translation&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
I am still testing this service but if it works well it may be a simple (and cheap) approach to support multiple languages.&lt;br /&gt;
&lt;br /&gt;
Happy translations to all! :)</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/5022543881753851768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/08/translate-your-website-with-google.html#comment-form' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/5022543881753851768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/5022543881753851768'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/08/translate-your-website-with-google.html' title='Translate your website with Google Website Translator'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_aEfDEp_i-lAMvP_hVkkGjTrIjAqHrKpID7lCqJ867OJt1g4YSiapi7gspDY68OZrbi2gENBt1clPwZm9dQgv_f6pNMgAHp5OFCyKGmtdpRJsRigzQj3HT19dWwHLHLTOY9dlV7NBi_4/s72-c?imgmax=800" height="72" width="72"/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-5718028156317066391</id><published>2012-08-22T16:46:00.002-07:00</published><updated>2012-09-20T10:17:18.871-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="eventfy"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="jquery"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile"/><title type='text'>Hide input type file from older iOS devices</title><content type='html'>I recently added support for user image upload in &lt;a href=&quot;http://www.eventfy.com/&quot;&gt;Eventfy&lt;/a&gt;. You can find more details and screenshots &lt;a href=&quot;http://blog.eventfy.com/2012/08/new-release-of-eventfy-went-live-today.html&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Safari mobile in iOS devices like iPhone and iPad do not yet support file uploads and render input type file disabled. It may change with the upcoming update to iOS 6, but until then our web applications must take that limitation into account.&lt;br /&gt;
&lt;br /&gt;
I wanted to hide the file update controls in iOS and show a note in its place. Instead of checking the browser version I am simply checking the state of the input file, which may also cover other devices with similar limitations.&lt;br /&gt;
&lt;br /&gt;
The code below describes how to set it up with jQuery, but it is simple to do the same with plain Javascript.&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;HTML part:&lt;/li&gt;
&lt;div class=&quot;codeview&quot;&gt;
&lt;pre class=&quot;brush: xml; smart-tabs: false;&quot;&gt;&amp;lt;div id=&quot;&lt;span style=&quot;background-color: #ffe599;&quot;&gt;imageUploadDiv&lt;/span&gt;&quot; class=&quot;control-group&quot;&amp;gt;
 &amp;lt;label class=&quot;control-label&quot; for=&quot;imageUpload&quot;&amp;gt;Image&amp;lt;/label&amp;gt;
 &amp;lt;div class=&quot;controls&quot;&amp;gt;
   &amp;lt;input id=&quot;&lt;span style=&quot;background-color: #ffe599;&quot;&gt;imageUploadInt&lt;/span&gt;&quot; name=&quot;imageUploadInt&quot; class=&quot;input-file&quot; type=&quot;file&quot; /&amp;gt;
   &amp;lt;p class=&quot;help-block&quot;&amp;gt;You can optionally include a picture or image in your invite&amp;lt;/p&amp;gt;
   &amp;lt;span id=&quot;imgPreview&quot; class=&quot;thumbnail&quot; style=&quot;display:none;width: 250px;&quot;&amp;gt;&amp;lt;/span&amp;gt;
 &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div id=&quot;&lt;span style=&quot;background-color: #ffe599;&quot;&gt;imageUploadiOSWarning&lt;/span&gt;&quot; class=&quot;alert alert-info&quot; &lt;span style=&quot;background-color: #ffe599;&quot;&gt;style=&quot;display: none;&quot;&lt;/span&gt;&amp;gt;
 &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;alert&quot;&amp;gt;×&amp;lt;/button&amp;gt;
 &amp;lt;strong&amp;gt;Note&amp;lt;/strong&amp;gt; Image upload isn&#39;t supported by iOS before version 6.0
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;li&gt;Javascript / jQuery part:&lt;/li&gt;
&lt;div class=&quot;codeview&quot;&gt;
&lt;pre class=&quot;brush: xml; smart-tabs: false;&quot;&gt;&amp;lt;script&amp;gt;
$(document).ready(function(){
    if ($(&quot;#&lt;span style=&quot;background-color: #ffe599;&quot;&gt;imageUploadInt&lt;/span&gt;&quot;).prop(&quot;disabled&quot;)) { 
        $(&#39;#&lt;span style=&quot;background-color: #ffe599;&quot;&gt;imageUploadiOSWarning&lt;/span&gt;&#39;).show();
        $(&#39;#&lt;span style=&quot;background-color: #ffe599;&quot;&gt;imageUploadDiv&lt;/span&gt;&#39;).hide();
    }
}
&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/ol&gt;
&lt;br /&gt;
In this simple example DIV &quot;&lt;i&gt;imageUploadInt&lt;/i&gt;&quot; is presented by default. But as soon the document loads we check if the input file was automatically disabled by the browser, and if so we hide&amp;nbsp;&quot;&lt;i&gt;imageUploadInt&lt;/i&gt;&quot; and show instead DIV &quot;&lt;i&gt;imageUploadiOSWarning&lt;/i&gt;&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt; this DIV structure and CSS classes are defined in &lt;a href=&quot;http://twitter.github.com/bootstrap/&quot;&gt;Twitter Bootstrap&lt;/a&gt;. You can find more about Bootstrap control forms&amp;nbsp;&lt;a href=&quot;http://twitter.github.com/bootstrap/base-css.html#forms&quot;&gt;here&lt;/a&gt;, on section &#39;Validation States&#39;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Update:&lt;/b&gt; I tested the image upload function in Eventfy yesterday (9/19) with iOS 6 and this code works great. Now users can upload pictures (if their device supports it), otherwise they are presented with a message explaining why the control is disabled.&lt;br /&gt;
&lt;br /&gt;
Here are some screenshots to show how it works with iOS 6:&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhESAuYWt3Az1FO3PWDuV-ZGUwCEmSEb_MvdnYMrVlNuyaP9SdudMSOqiR9sY15rEJEaUBupR6r8n7twyQXR4zY7E3sKqYeBjj7GI6MYbTnn4A8YV2OW8-ynqcqfqoj7DXGTF0JAJxUd04/s1600/1.InputFileEnabled.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhESAuYWt3Az1FO3PWDuV-ZGUwCEmSEb_MvdnYMrVlNuyaP9SdudMSOqiR9sY15rEJEaUBupR6r8n7twyQXR4zY7E3sKqYeBjj7GI6MYbTnn4A8YV2OW8-ynqcqfqoj7DXGTF0JAJxUd04/s320/1.InputFileEnabled.png&quot; width=&quot;170&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Input type file is enabled with iOS 6&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTiO4zq8Z2XNHr0nrQg-mvhf9to3kdvzVEjgar5O_np5z3FzL6nKfznHM9oSkuno6D35x7Ejm64Q9K1HnGtDJgNH9nOuEQGGe0Nsj7YnBRJc5-C96IFKHC3lD5bg1LZE44kQ87cWCp6u4/s1600/2.SelectPhoto.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTiO4zq8Z2XNHr0nrQg-mvhf9to3kdvzVEjgar5O_np5z3FzL6nKfznHM9oSkuno6D35x7Ejm64Q9K1HnGtDJgNH9nOuEQGGe0Nsj7YnBRJc5-C96IFKHC3lD5bg1LZE44kQ87cWCp6u4/s320/2.SelectPhoto.png&quot; width=&quot;170&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Photo selection&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy9GbgfjktNwbOYBno19840DjdTs_Iyet80AjTIvRQOrKVqW41A9Mk-VQU3p5aub29i0bxJO0CYIV2ljQL0HrQjP9D6NabTbCMkTupYD7BLesO-hI9V_JEC35pZHEnvalVFXXy8xLjpNI/s1600/3.PhotoUploaded.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy9GbgfjktNwbOYBno19840DjdTs_Iyet80AjTIvRQOrKVqW41A9Mk-VQU3p5aub29i0bxJO0CYIV2ljQL0HrQjP9D6NabTbCMkTupYD7BLesO-hI9V_JEC35pZHEnvalVFXXy8xLjpNI/s320/3.PhotoUploaded.png&quot; width=&quot;170&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Photo uploaded to Eventfy&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/5718028156317066391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/08/hide-input-type-file-from-ios-devices.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/5718028156317066391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/5718028156317066391'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/08/hide-input-type-file-from-ios-devices.html' title='Hide input type file from older iOS devices'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhESAuYWt3Az1FO3PWDuV-ZGUwCEmSEb_MvdnYMrVlNuyaP9SdudMSOqiR9sY15rEJEaUBupR6r8n7twyQXR4zY7E3sKqYeBjj7GI6MYbTnn4A8YV2OW8-ynqcqfqoj7DXGTF0JAJxUd04/s72-c/1.InputFileEnabled.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-3341745956829883805</id><published>2012-08-19T10:30:00.000-07:00</published><updated>2012-08-20T21:26:01.879-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="shopping"/><title type='text'>My Amazon Favorite Buys</title><content type='html'>&lt;style&gt;
.hero-unit {
    padding: 60px;
    margin-bottom: 30px;
    background-color: #EEE;
    border-color: #DDD;
    border-style:solid;
    border-width:1px;
    border-radius: 6px 6px 6px 6px;
}
.ad {
    float: left;
    width: 100px;
}
.desc {
    float: right;
    width: 100px;
    padding: 0px;
    margin: 0px;
}
.desc p {
    padding: 0px;
    margin: 0px;
}
.cell {
    float: left;
    margin: 10px;
    width: 230px;
    min-height: 270px;
    padding: 10px;
    margin-right: 20px;
    background-color: #EEE;
    border: 1px;
    border-color: #DDD;
    border-style:solid;
    border-width:1px;
    border-radius: 6px 6px 6px 6px;
}
.container {
    overflow: auto;
    width: 100%;
}
&lt;/style&gt;

&lt;br /&gt;
&lt;div class=&quot;container&quot;&gt;
&lt;div class=&quot;hero-unit&quot;&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
A list of&lt;/div&gt;
&lt;h1 style=&quot;text-align: center;&quot;&gt;
My Amazon Favorite Buys&lt;/h1&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
Read the &lt;a href=&quot;#disclaimerAmazonFavBuys&quot;&gt;disclaimer&lt;/a&gt; or check this list out and you may find something interesting&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B003WUBIZQ&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Great case for your small USB drive and USB cable&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0041OSQ9S&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Small but large capacity USB drive, fast transfers and no separate power chord, excellent for backups&lt;br /&gt;
Note: they released a new version available &lt;a href=&quot;http://www.amazon.com/gp/product/B006Y5UV4A/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B006Y5UV4A&amp;amp;linkCode=as2&amp;amp;tag=thoforbea-20&quot;&gt;here&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B000JE9LD4&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B002HWJT1A&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Here&#39;s a relatively inexpensive item (compared to &lt;a href=&quot;http://www.amazon.com/gp/product/B0081XAXXM/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B0081XAXXM&amp;amp;linkCode=as2&amp;amp;tag=thoforbea-20&quot;&gt;this one&lt;/a&gt;, that is) that can make a big difference when you&#39;re flying.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B003LN2KL0&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B004N625B4&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Tiny wireless N adapter&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B001737OQW&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Tire inflator with a built in pressure gauge and adapters for bikes, balls etc&lt;br /&gt;
Quite noisy but strong enough for SUVs&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0026IC2A0&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Cool mist humidifier, good for those in dry climates&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0031U1ATG&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Works great with iPhones&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B002K0TU2C&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Hook up 2 computers to the same monitor, keyboard, mouse and audio&lt;br /&gt;
Worked great with my URB keyboard and mouse&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B001Q70A0G&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Find those da$% scorpions! Or check out CSI-style how clean your hotel room &lt;i&gt;really&lt;/i&gt; is, it may surprise you&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0018S4XIS&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
This is one of those things you never need... until you need it, that is!&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0015YWKYY&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
More HDMI ports for your TV&lt;br /&gt;
Switch inputs automatically so you don&#39;t even have to use the included control&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B000Z80ICM&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Good UPS for computers&lt;br /&gt;
Get this if you want extra time to save your work during a blackout, or to ensure a graceful shutdown if you hook it via USB&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B000GAYQM2&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Don&#39;t use it very often but has a good price, looks great and so far it worked for years without problems&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0009VC6ZM&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Nice gift for the wife, it looks great (on her, that is!)&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B00000DM9W&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Great radio for the bathroom countertop. I wouldn&#39;t keep it in the shower like some people at Amazon though&lt;br /&gt;
If this one is OOS you can find a similar version &lt;a href=&quot;http://www.amazon.com/gp/product/B00171MWSO/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B00171MWSO&amp;amp;linkCode=as2&amp;amp;tag=thoforbea-20&quot;&gt;here&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B003XU76NI&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Best kitchen (or general purpose) radio ever, great quality sound and design&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B00009ECGG&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Excellent classic D&amp;amp;D game for under $10. If you like D&amp;amp;D and CRPG but you never played BG2 do yourself a favor and get it now. Great stories with an amazing replay value&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=1589947207&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Amazing board game set on the Game of Thrones&#39; universe&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B004I8WD7S&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B002VPE1NO&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B004H1NK4Q&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Broom? What broom? Every house should have one of these&lt;br /&gt;
Note: this product doesn&#39;t replace a full blown vacuum&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0043EW354&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B000FED5DU&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
I bought 2 more expensive ones (the most expensive from Norelco and one from Wahl) but ended up coming back to this cheap one&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B00070OWMU&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
This compact fabric steamer worked so well for my sister-in-law&#39;s wedding the whole family used it. So much so they kept it as a &quot;gift&quot; and we now gotta buy another one for the next weddings&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B004UU9ZAW&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Great gift for babies, it plays different sounds and songs in English and Spanish&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0035LCUVS&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Hands free soap dispenser. Get it for the kitchen and the bathrooms&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0032FOK9C&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Gift&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cell&quot;&gt;
&lt;div class=&quot;ad&quot;&gt;
&lt;iframe frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B001ELJO2Y&quot; style=&quot;height: 240px; width: 120px;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;desc&quot;&gt;
Gift&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;hero-unit&quot;&gt;
&lt;h4 id=&quot;disclaimerAmazonFavBuys&quot; style=&quot;text-align: center;&quot;&gt;
Disclaimer&lt;/h4&gt;
I purchased all items on this list either from Amazon or from other merchants and I am very happy with them. I am sharing this list so that if you buy anything you like here there will be a (tiny) smaller chance for them to be taken out of the market. However, your own experience with these products may differ.&lt;br /&gt;
I found that in most cases Amazon has the best prices or is at least close. You may want to check it with &lt;a href=&quot;http://www.google.com/shopping&quot;&gt;Google Shopping&lt;/a&gt;, other price comparison tools or in deal sites like &lt;a href=&quot;http://slickdeals.net/&quot;&gt;Slickdeals&lt;/a&gt;. Still, Amazon reviews are great to help you find your own great buys, even if you buy elsewhere.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/3341745956829883805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/08/my-amazon-favorite-buys.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/3341745956829883805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/3341745956829883805'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/08/my-amazon-favorite-buys.html' title='My Amazon Favorite Buys'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-242557129472493760</id><published>2012-08-17T19:30:00.000-07:00</published><updated>2012-09-06T14:37:06.577-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blog"/><category scheme="http://www.blogger.com/atom/ns#" term="eventfy"/><category scheme="http://www.blogger.com/atom/ns#" term="pingr"/><title type='text'>This blog is back</title><content type='html'>&lt;span style=&quot;font-family: inherit;&quot;&gt;After a (too) long hiatus I finally decided to get rid of the cobwebs and write here again. I didn&#39;t have lots of cool ideas to discuss so I decided to start a new pet project to give me some inspiration. After few weekends this is what I came up with:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;b&gt;Eventfy&lt;/b&gt; (&lt;a href=&quot;http://www.eventfy.com/&quot;&gt;http://www.eventfy.com&lt;/a&gt;), a simple web tool to setup events. You can use Eventfy instead of group emails to organize and track events. You can even setup conditional events like those poker (or RPG) games you can&#39;t confirm yet because you&#39;re not sure enough people will show up. In this case, once enough people confirm their presence Eventfy automatically notifies everybody that the game is on. If not enough people confirmed by the deadline you set Eventfy sends an event cancellation note to all invited. Thanks to responsive design techniques all functions work great from computers and from small devices like smartphones and tables.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;b&gt;Pingr&lt;/b&gt; (&lt;a href=&quot;http://pingr.eventfy.com/&quot;&gt;http://pingr.eventfy.com&lt;/a&gt;), a basic web-based availability monitoring tool. Just enter a URL from your site and Pingr will monitor it for you. If the site goes down or performance (ping or download speed) drops below normal thresholds it will quickly send you a notification.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;b&gt;Eventfy Blog&lt;/b&gt; (&lt;a href=&quot;http://blog.eventfy.com/&quot;&gt;http://blog.eventfy.com&lt;/a&gt;), where I will post updates about anything hosted in the Eventfy.com domain.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;These are quite simple projects but they are mobile-friendly (the screens won&#39;t look crappy on smaller screens and as such users won&#39;t have to zoom in / out in iPhone and iPad) and &amp;nbsp;it can transparently scale to meet the demand (hosted on Google App Engine&#39;s&amp;nbsp;PaaS solution).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Check out after the break all the different topics I am planning to discuss here soon, all inspired from my experiences with Google cloud platform, public internet domains, responsive websites, HTML5, Twitter Bootstrap, jQuery and more.&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;I spent just few weekends on these small projects but I end up getting inspired (and thankfully a bit more knowledgeable too) to write about and share code / details on the following topics:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Blogging platforms: Wordpress vs Blogger&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Custom domains&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;How to find a good name for cheap&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Setup DNS zones: A, CNAME, MX etc&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Centralize multiple services in Google Apps for free&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Use it to manage your custom domain and get&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: square; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;email addresses like &lt;i&gt;yourname@yourdomain.com&lt;/i&gt; backed by Gmail&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: square; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;many Google services like Blogger, Calendar, Gmail, Docs mapped to URLs like &lt;u&gt;blog.&lt;/u&gt;yourdomain.com, &lt;u&gt;calendar.&lt;/u&gt;yourdomain.com, &lt;u&gt;mail.&lt;/u&gt;yourdomain.com etc&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Integrate with your Google App Engine projects&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Cloud computing on the cheap&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Platform_as_a_service&quot;&gt;PaaS&lt;/a&gt; vs &lt;a href=&quot;http://en.wikipedia.org/wiki/Infrastructure_as_a_service&quot;&gt;IaaS&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Google App Engine vs Amazon&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Google AdSense in websites and mobile sites&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Set up ads (and get $$$) on responsive websites&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Build responsive modern-looking websites with HTML5 + Twitter Bootstrap + jQuery&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;A single site for both computers, smartphones and all in-between&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Kickstart your project with &lt;a href=&quot;http://html5boilerplate.com/&quot;&gt;H5BP&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Start from a boilerplate project with &lt;a href=&quot;http://www.initializr.com/&quot;&gt;Initializr&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Bootstrap themes&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Functional web tests with &lt;a href=&quot;http://seleniumhq.org/&quot;&gt;Selenium&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;A simple way to escape user input and prevent code and sql injection attacks&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Cool graphs with &lt;a href=&quot;http://www.jqplot.com/&quot;&gt;jqPlot&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;User authentication with OAuth, Google Accounts&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;ul&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Don&#39;t spend time writing your own auth mechanism&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Let users securely sign in with their Google or Facebook accounts&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Resource optimization in Google App Engine&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Reduce datastore I/O with caching&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Improve performance with batch operations&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Date and time hell - yes, this is more complicated than you think&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Timezone conversions&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Internal vs Human friendly formats (e.g. server uses UTC)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: circle; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Device-specific date / time formats&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Datetime picker mechanism that works with both PC and iOS devices&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Google App Engine cron tasks&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Icalendar&quot;&gt;iCalendar&lt;/a&gt; attachments in emails&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Website performance optimization&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;LESS vs CSS in the real world&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Build responsive UIs with AJAX and JSON&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;b id=&quot;internal-source-marker_0.44909364986233413&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Message templates in Java&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;I am happy with all the different ideas and fun these projects gave me so far. If you ever find yourself looking for ideas to write about try starting up / build something new and I am sure you too will find lots of cool things to discuss.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;If you are interested in any of this just keep an eye here or subscribe and you will find updates on these topics - in no particular order - pretty soon.&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #222222;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Until then feel free to give &lt;a href=&quot;http://www.eventfy.com/&quot;&gt;Eventfy&lt;/a&gt; and &lt;a href=&quot;http://pingr.eventfy.com/&quot;&gt;Pingr&lt;/a&gt; a try and leave me a comment to let me know what you think.&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/242557129472493760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/08/this-blog-is-back.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/242557129472493760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/242557129472493760'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2012/08/this-blog-is-back.html' title='This blog is back'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-3638830821635877138</id><published>2010-05-18T18:30:00.000-07:00</published><updated>2012-08-20T21:03:40.337-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="e-reader"/><category scheme="http://www.blogger.com/atom/ns#" term="electronics"/><category scheme="http://www.blogger.com/atom/ns#" term="general"/><category scheme="http://www.blogger.com/atom/ns#" term="kindle"/><title type='text'>Kindle media converter Windows script</title><content type='html'>Check this post out for a Windows batch script to convert images into PDFs optimized for the Amazon Kindle e-reader.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
So a while back I got an Amazon Kindle as a birthday gift from my brother-in-law (many thanks Junior!).&lt;br /&gt;
&lt;br /&gt;
&lt;iframe align=&quot;left&quot; class=&quot; qypbzbwlzmfscrzaqsaw qypbzbwlzmfscrzaqsaw&quot; frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=B0015T963C&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&quot; style=&quot;height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;&quot;&gt;&lt;/iframe&gt;&lt;iframe align=&quot;left&quot; class=&quot; qypbzbwlzmfscrzaqsaw qypbzbwlzmfscrzaqsaw&quot; frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=0740777351&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&quot; style=&quot;height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Coincidentally, I also got from my lovely wife a book with 20 years of Dilbert - that&#39;s funny, even though I read it for years I had no idea there were 20 years of Dilbert! The book, which is pretty huge by the way, thankfully came with a CD with images of all its pages.&lt;br /&gt;
&lt;br /&gt;
Needless to say what happened, right? Since Kindle&#39;s light weight makes it much more comfortable to read than the book I wanted to find a good way to put all the images there.&lt;br /&gt;
&lt;br /&gt;
Amazon did include support in the Kindle for photo-albums, or folders with image files (see detailed step by step &lt;a href=&quot;http://www.tech-recipes.com/rx/4022/create-photo-albums-for-viewing-images-on-your-kindle-2/&quot;&gt;here&lt;/a&gt;). This mechanism works well for photos but not so well when there are a proper sequence of images - for some reason it frequently presented some random page instead of the next page. Also, since the images weren&#39;t sized specifically for the Kindle it had to resize it on the fly (the Kindle isn&#39;t exactly a speed daemon to handle anything other than text books) and the images were using more space with resolution and colors its grayscale screen just isn&#39;t able to reproduce.&lt;br /&gt;
&lt;br /&gt;
Then few months back I put together a Windows batch script to improve on that. I decided to share it, perhaps it might be useful for other e-reader users, or someone who wants to learn from a working script on how to use this amazing open source image processing tool &lt;a href=&quot;http://www.imagemagick.org/script/index.php&quot;&gt;ImageMagick&lt;/a&gt;. The script uses Windows and ImageMagick commands to process these 3 steps:&lt;br /&gt;
&lt;br /&gt;
1. Iterate through all sub-folders for images (GIF, PNG, JPG and BMP) and sort them alphabetically by path and file names&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
This script can correctly handle directory hierarchies like:&lt;br /&gt;
.\volume1\image1.png&lt;br /&gt;
.\volume1\image2.gif&lt;br /&gt;
.\vol2\img1.gif&lt;br /&gt;
.\v3\img1l.gif&lt;br /&gt;
.\v3\img1r.gif&lt;br /&gt;
etc&lt;/div&gt;
&lt;br /&gt;
2. Convert all images from their original format to GIF, resizing it to 600x800 with 16 shades of gray for optimal Kindle memory use.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
If you have a different e-reader you can still use this mechanism with some minor modifications to resolution and image depth - keep reading for more info&lt;/div&gt;
&lt;br /&gt;
3. Generate a PDF file with all processed images - this step ensures Kindle will follow the proper page sequence.&lt;br /&gt;
&lt;br /&gt;
Please note that this isn&#39;t a super efficient solution or script, and I am sure some Windows batch file genius can point how to better implement some of these functions. I actually learned quite a bit about Windows batch scripts while I was implementing it (and especially how bad Windows scripting is compared to Unix shell scripting).&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
Installation&lt;/h1&gt;
&lt;b&gt;1. ImageMagick&lt;/b&gt;&lt;br /&gt;
ImageMagick is a set of image commandline-based manipulation tools. You can download the latest stable build here: &lt;a href=&quot;http://www.imagemagick.org/script/download.php&quot;&gt;http://www.imagemagick.org/script/download.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Following their recommendation I downloaded ImageMagick-6.6.1-10-Q16-windows-dll.exe. You should use the latest stable version available on their website. During the installation there is a checkbox labeled &quot;Add application directory to your system path&quot; - make sure this is checked (default value). This is how the converter batch script will be able to use ImageMagick. I installed without changing any options, just Next / Next / Finish.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. Ghostscript&lt;/b&gt;&lt;br /&gt;
Ghostscript is a PDF manipulation tool. You can download the latest stable build here: &lt;a href=&quot;http://pages.cs.wisc.edu/~ghost/&quot;&gt;http://pages.cs.wisc.edu/~ghost/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
Since we are using Windows we don&#39;t need to download the sources (the first set of files in the download page) - just scroll down and download one of the 2 Windows binary builds (32 or 64bit).&lt;/div&gt;
&lt;br /&gt;
I downloaded file &lt;b&gt;gs871w32.exe&lt;/b&gt; from this page just for compatibility reasons. If you have a 64bit Windows you can use instead the latest 64bit build for improved performance. Again, I installed it with all default settings.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. Testing&lt;/b&gt;&lt;br /&gt;
Open a command prompt window and type this command:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;convert.exe -version
&lt;/pre&gt;
&lt;br /&gt;
If ImageMagick&#39;s installation worked properly the result should look like this:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEPN0bVYd5eAAB8B0KWkIHgabE1vmqwbzADlWsNYQ8RzXAE3CjuD8Yr5YbBwZzJsYL74RP32EAPQ8Y_m2qh2Czc8OrWr0DCP-Oc-xUh3VZDiJbQhTznJUX0nVRqPclnn-6VJCsHrMcJqQ/s1600/1.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;202&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEPN0bVYd5eAAB8B0KWkIHgabE1vmqwbzADlWsNYQ8RzXAE3CjuD8Yr5YbBwZzJsYL74RP32EAPQ8Y_m2qh2Czc8OrWr0DCP-Oc-xUh3VZDiJbQhTznJUX0nVRqPclnn-6VJCsHrMcJqQ/s400/1.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
About the script&lt;/h1&gt;
&lt;br /&gt;
The complete script can be downloaded &lt;b&gt;&lt;a href=&quot;http://sites.google.com/site/pedroburglin/thoughtsforbeansfiles/convertToKindle.zip&quot;&gt;here&lt;/a&gt;&lt;/b&gt;. Follow the text below for detailed instructions on how it works and how you can use it.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;warning&quot;&gt;
You should NOT download and execute batch scripts on your computer from someone you don&#39;t know without taking a good look at the code to ensure it is not going to cause your computer any harm. I am just sharing it here because it could be useful for others and I do not provide any guarantees that it will work for you or that it will not somehow break your computer. However, at least I didn&#39;t knowingly design it to break anything in your computer. If you download and execute this script you are doing so on your own risk.&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;warning&quot;&gt;
The 2nd warning is, you should NOT use this script on content you do not &lt;b&gt;own&lt;/b&gt;. I am sharing this just as a way to convert what you already have into your e-reader. Support good authors.&lt;/div&gt;
&lt;br /&gt;
Okay, so now that the &quot;no-guarantee liability babble&quot; is out of the way let me explain how it works:&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
1. Image consolidation&lt;/h2&gt;
&lt;br /&gt;
&lt;pre&gt;mkdir work

REM Copy all images to current directory with unique names
    ECHO Pass 1/9 - Consolidate images
pushd %*
for /F &quot;delims=&quot; %%j in (&#39;dir /B /O /S *.gif&#39;) do (
  rem echo file=%%j
  set fileName=%%j
  set uniqueName=!fileName:\=_!
  set uniqueName=!uniqueName::=!
  copy &quot;!fileName!&quot; &quot;work\!uniqueName!&quot;
)
popd
&lt;/pre&gt;
&lt;br /&gt;
This block creates a temporary &quot;work&quot; sub-directory to consolidate images from all other sub-directories. It copies all images from other sub-directories with new names based on the image&#39;s path + original name, so the path and name sorting is kept and there are no naming collisions. For example, &quot;.\vol1\1.png&quot; would be copied as to &quot;vol1_1.png&quot; and &quot;.\vol2\1.png&quot; would be &quot;vol2_1.png&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
Let me re-state this - the script make copies of all images from all sub-directories into &quot;work&quot;. It will NOT remove / rename / process the original images in any way, but only these temporary copies in &quot;work&quot;.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
2. Remove unwanted images&lt;/h2&gt;
&lt;pre&gt;REM Remove unwanted images
del &quot;work\*Credi*&quot;
&lt;/pre&gt;
&lt;br /&gt;
This block removes all unwanted images from the &quot;work&quot; directory based on the image name. If your source has images you do not want to transfer to the Kindle you can use this step to filter them out and squeeze the final PDF size a bit.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
3. Convert all temporary images to 4bit color GIFs&lt;/h2&gt;
&lt;pre&gt;set MAGICK_TMPDIR=work

REM Convert all GIFs
ECHO Pass 2/9 - GIF to 4bit color GIF
FOR %%a in (work\*.gif) DO (
    ECHO Processing file: &quot;%%~nxa&quot;

    REM Convert GIF to 4bit color GIF
    convert.exe -type GrayScaleMatte +level 0,15 -level 0,15 -quality 100 &quot;%%a&quot; &quot;t1-%%~na.gif&quot;
)
&lt;/pre&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
I know PNG is a newer and better format than GIF for various reasons, but I found that if I switch from GIF to PNG above then for some reason I got weird image size issues in the final PDF file.&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
4. Divide pages in two images&lt;/h2&gt;
&lt;br /&gt;
I didn&#39;t need this one for my book but it may be useful for other ones. If every original image has two pages side by side (e.g. a full image scan of the two pages) you can uncomment the block below to divide each image into two:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;REM Divide pages in two images
rem FOR %%a in (t1*.gif) DO (
rem     convert.exe &quot;%%a&quot; -crop 50%%x100%% +repage &quot;t2-%%~na%%d.gif&quot;
rem )
REM Remove temporary images
rem del t1*.gif
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
5. Rename all temporary GIFs based on their proper page number&lt;/h2&gt;
&lt;pre&gt;REM Rename all GIFs to format 00000.gif
    ECHO Pass 5/9 - Rename
pushd %*
set /A cnt=0
for /F &quot;delims=&quot; %%j in (&#39;dir /B /O t*.gif&#39;) do (
  rem echo cnt1=!cnt!
  set /a cnt+=1
  set cnt2=!cnt!
  if &quot;!cnt2:~1,1!&quot;==&quot;&quot; set cnt2=0!cnt2!
  if &quot;!cnt2:~2,1!&quot;==&quot;&quot; set cnt2=0!cnt2!
  if &quot;!cnt2:~3,1!&quot;==&quot;&quot; set cnt2=0!cnt2!
  if &quot;!cnt2:~4,1!&quot;==&quot;&quot; set cnt2=0!cnt2!
  rem echo cnt2=!cnt2!
  ren &quot;%%j&quot; &quot;!cnt2!.gif&quot;
)
popd
&lt;/pre&gt;
&lt;br /&gt;
&lt;h2&gt;
6. Trim, resize, rotate and compress&lt;/h2&gt;
&lt;pre&gt;REM Crop, Trim, Resize
    ECHO Pass 6/9 - Border
    mogrify.exe -bordercolor #FFFFFF -border 30 &quot;*.gif&quot;

    ECHO Pass 7/9 - Trim
    mogrify.exe -bordercolor #FFFFFF -border 30 -fuzz 10%% -trim +repage &quot;*.gif&quot;

    ECHO Pass 8/9 - Resize
rem    mogrify.exe -resize ^^!600x800^^! -colors 16 -compress LZW -quality 30030 &quot;*.gif&quot;
    mogrify.exe -rotate -90 -colors 16 -compress LZW -quality 30030 &quot;*.gif&quot;
&lt;/pre&gt;
&lt;br /&gt;
For the specific set of images I was converting resizing to 600x800 didn&#39;t give me the best results, so I commented it out. It may be useful for other sources, however. Also, I found I had to rotate the images to better use Kindle&#39;s screen real state, which may also not be ideal for other sources.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
Depending on what you are converting you might want to disable rotation and/or enable resize.&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
7. Generate the final PDF including all GIFs in the proper order&lt;/h2&gt;
&lt;pre&gt;REM Convert *.GIF into PDF
    ECHO Pass 9/9 - GIF to PDF
    pushd %*
    set gifs=
    set /A cnt=0
    for /F &quot;delims=&quot; %%j in (&#39;dir /B /O *.gif&#39;) do (
        echo Appending %%j
        set gifs=!gifs! &quot;%%j&quot;
        set /A cnt+=1
        if !cnt!==600 (
            convert.exe -limit memory 128mb -limit map 256mb -compress zip -quality 100 -density 200 &quot;out.pdf&quot; !gifs! &quot;out.pdf&quot;
            set /A cnt=0
            set gifs=
        )
    )
    if !cnt! GTR 0 (
        convert.exe -limit memory 128mb -limit map 256mb -compress zip -quality 100 -density 200 &quot;out.pdf&quot; !gifs! &quot;out.pdf&quot;
    )
    popd
&lt;/pre&gt;
&lt;br /&gt;
The step above usually is where this script takes the most time - on my Core2Duo desktop it took few hours to convert all the images into one PDF file. Since I left it running throughout the night it didn&#39;t bother me much. I also found that it required a good amount of free space in the disk, to store temporary files.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
8. Clean-up of all temporary files&lt;/h2&gt;
&lt;pre&gt;REM Remove GIF files leaving only the PDF
    del &quot;*.gif&quot;
    rd /q /s work
&lt;/pre&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
The commands above are used to remove all GIFs from the &lt;b&gt;current&lt;/b&gt; directory, and not from any sub-directory. Then, it also removes the temporary &quot;work&quot; directory for a complete clean-up.&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
Some weird error messages may pop up while the script is running - this wasn&#39;t happening with the version of ImageMagick I used to write it, but found it is with the current stable version. Thankfully it does not affect functionality, as far as I could see&lt;/div&gt;
&lt;br /&gt;
If everything worked properly, in the end of the process you will have in the current directory all your original sub-directories and the final PDF file.&lt;br /&gt;
&lt;br /&gt;
So, for a quick test I processed about 5 Dilbert images and divided in two sub-directories, simulating multiple volumes we want to consolidate into a single Kindle-optimized PDF.&lt;br /&gt;
&lt;br /&gt;
The path structure looked like this:&lt;br /&gt;
C:\Temp\convertToKindle - convertToKindle.bat&lt;br /&gt;
C:\Temp\convertToKindle\v1 - v1-1.gif, v1-2.gif&lt;br /&gt;
C:\Temp\convertToKindle\v2 - v2-1.gif, v2-2.gif, v2-3.gif&lt;br /&gt;
&lt;br /&gt;
Then after I executed convertToKindle.bat I had a new file, out.pdf with all 5 images, looking like this:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsyHs2C02XuRuS18LfMCKplVH3SQFGu2n4I0qES2_O2ApdA87dQr8vodWmm08ZCrVFhpdzOIXtGum9eX3RXsc5kqvtxp5hwtUPXtLS5VRGPWhqQugjyWeEADV2tvw6DULMR3qEyKV3u44/s1600/6.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsyHs2C02XuRuS18LfMCKplVH3SQFGu2n4I0qES2_O2ApdA87dQr8vodWmm08ZCrVFhpdzOIXtGum9eX3RXsc5kqvtxp5hwtUPXtLS5VRGPWhqQugjyWeEADV2tvw6DULMR3qEyKV3u44/s320/6.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Like I said, these settings work well for this particular source - depending on what you&#39;re converting and your e-reader you might need to play with it to find optimal settings for rotation and resize.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
Tip - process multiple documents in one shot&lt;/div&gt;
&lt;br /&gt;
If you have multiple sources and want to convert each on a separate PDF file you can follow these instructions to process all of them one at a time:&lt;br /&gt;
&lt;br /&gt;
1. setup your directories like this:&lt;br /&gt;
- root&lt;br /&gt;
- source1&lt;br /&gt;
- source2&lt;br /&gt;
- source3&lt;br /&gt;
&lt;br /&gt;
2. copy convertToKindle.bat to source1, source2 and source3&lt;br /&gt;
&lt;br /&gt;
3. create a new Windows batch file named &lt;b&gt;processAll.bat&lt;/b&gt; in the root folder and paste the commands below:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;cd source1
call convertToKindle.bat
cd ..

cd source2
call convertToKindle.bat
cd ..

cd source3
call convertToKindle.bat
cd ..
&lt;/pre&gt;
&lt;br /&gt;
Now if you execute &lt;b&gt;processAll.bat&lt;/b&gt; it will execute &lt;b&gt;convertToKindle.bat&lt;/b&gt; on every source directory, generating one PDF for each directory.&lt;br /&gt;
&lt;br /&gt;
That&#39;s it, I hope this can be helpful for others.&lt;br /&gt;
Pedro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Update - 05/27/2010&lt;/h2&gt;
I found few similar tools that may be easier / better to use available elsewhere. So, just in case this batch script seems too complicated you might also want to try one of these instead:&lt;br /&gt;
&lt;br /&gt;
1. &lt;b&gt;Mangle&lt;/b&gt;: &lt;a href=&quot;http://foosoft.net/mangle/&quot;&gt;http://foosoft.net/mangle/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
2. &lt;b&gt;KindleManga&lt;/b&gt;: &lt;a href=&quot;http://code.google.com/p/kindlemanga/&quot;&gt;http://code.google.com/p/kindlemanga/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
3. &lt;b&gt;Manga2PDF&lt;/b&gt; (Linux): &lt;a href=&quot;http://www.mobileread.com/forums/showthread.php?t=12790&amp;amp;highlight=manga2pdf&quot;&gt;http://www.mobileread.com/forums/showthread.php?t=12790&amp;amp;highlight=manga2pdf&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
4. &lt;b&gt;ePubizator&lt;/b&gt; (Multiplataform): &lt;a href=&quot;http://www.mobileread.com/forums/showthread.php?t=36677&quot;&gt;http://www.mobileread.com/forums/showthread.php?t=36677&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;warning&quot;&gt;
Note: I did not try any of these tools, so your mileage may vary.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/3638830821635877138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/02/kindle-media-converter-windows-script.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/3638830821635877138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/3638830821635877138'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/02/kindle-media-converter-windows-script.html' title='Kindle media converter Windows script'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEPN0bVYd5eAAB8B0KWkIHgabE1vmqwbzADlWsNYQ8RzXAE3CjuD8Yr5YbBwZzJsYL74RP32EAPQ8Y_m2qh2Czc8OrWr0DCP-Oc-xUh3VZDiJbQhTznJUX0nVRqPclnn-6VJCsHrMcJqQ/s72-c/1.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-1332924457612139000</id><published>2010-05-10T18:35:00.000-07:00</published><updated>2012-08-20T21:09:55.372-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="virtual machines"/><title type='text'>Quest to find the best Linux for slow computers, Fedora 12 LXDE upgrade to 13</title><content type='html'>I replaced &lt;a href=&quot;http://www.kubuntu.org/getkubuntu/download&quot;&gt;Kubuntu Netbook Remix&lt;/a&gt; (KNR) on my netbook with the &lt;a href=&quot;http://spins.fedoraproject.org/lxde/&quot;&gt;LXDE spin of Fedora 12&lt;/a&gt;. KNR looks nice and has many nice features for devices with small screens but it was just painfully slow on my netbook. LXDE is (in theory) a more crappy-hardware-friendly Linux flavor, so I decided to give it a try.&lt;br /&gt;
&lt;br /&gt;
LXDE&#39;s UI looks uglier and less flexible than KNR&#39;s, but performance is indeed better. With that in mind I put together a development environment based on a Fedora LXDE virtual machine I can use to test my own projects in Linux. Nothing terribly resource-intensive but things like &lt;a href=&quot;http://www.grails.org/&quot;&gt;Grails&lt;/a&gt;, &lt;a href=&quot;http://www.gradle.org/&quot;&gt;Gradle&lt;/a&gt;, &lt;a href=&quot;http://appfuse.org/&quot;&gt;AppFuse&lt;/a&gt;, etc. I wanted to know if this VM would be fast enough so I could use it as my development environment.&lt;br /&gt;
&lt;br /&gt;
Click on &quot;Read more&quot; below to check out the rest of this post on a development environment VM and instructions on how to update Fedora 12 LXDE with the unofficial release 13.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I know this approach adds some overhead when compared to a native development environment, but if the performance hit is not noticeable enough it could be interesting. For example, the next time I upgrade my laptop I can simply copy my VMs and keep my fully configured environment. Also, since all servers I work with are Unix-based, there would be more script reuse and less environment-specific issues (not that I get many of these, but some of my colleagues insist in hardcoding Windows-style paths sometimes). And lastly, I can keep project-specific VMs to organize my development environments. So far this approach has been working well for the past few days.&lt;br /&gt;
&lt;br /&gt;
But I wanted to see how Fedora 13 LXDE is looking like (we still have few days before the official launch). Since I couldn&#39;t find where to download anything but the main version of Fedora 13 I upgraded a copy of my VM following these steps:&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Update current libraries&lt;/h3&gt;
&lt;pre&gt;su
yum update
&lt;/pre&gt;
&lt;br /&gt;
&lt;h3&gt;
Download and install Fedora 13 release RPM&lt;/h3&gt;
a. Download this file: &lt;a href=&quot;http://mirror.aarnet.edu.au/pub/fedora/linux/releases/test/13-Beta/Fedora/i386/os/Packages/fedora-release-13-0.7.noarch.rpm&quot;&gt;http://mirror.aarnet.edu.au/pub/fedora/linux/releases/test/13-Beta/Fedora/i386/os/Packages/fedora-release-13-0.7.noarch.rpm&lt;/a&gt;&lt;br /&gt;
b. Install it with the command below:&lt;br /&gt;
&lt;pre&gt;rpm -Uvh fedora-release-13-0.7.noarch.rpm
&lt;/pre&gt;
&lt;br /&gt;
&lt;h3&gt;
Verify the release has changed&lt;/h3&gt;
&lt;pre&gt;cat /etc/fedora-release
Fedora release 13 (Goddard)
&lt;/pre&gt;
&lt;br /&gt;
&lt;h3&gt;
Upgrade all libraries to Fedora 13&lt;/h3&gt;
&lt;pre&gt;yum upgrade -y
&lt;/pre&gt;
&lt;br /&gt;
And after one hour or two I had a fully functional Fedora 13 LXDE VM. I just don&#39;t see lots of changes other than few icons and the wallpaper. I guess I will have to wait until the official launch... :(</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/1332924457612139000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/05/quest-to-find-best-linux-for-slow.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/1332924457612139000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/1332924457612139000'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/05/quest-to-find-best-linux-for-slow.html' title='Quest to find the best Linux for slow computers, Fedora 12 LXDE upgrade to 13'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-4537296994789472711</id><published>2010-05-05T09:28:00.000-07:00</published><updated>2012-08-20T21:11:19.720-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="general"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>NFJS 2010 - Northern Virginia Software Symposium II</title><content type='html'>This is my last post about the &lt;a href=&quot;http://www.nofluffjuststuff.com/conference/reston/2010/04/home&quot;&gt;No Fluff Just Stuff Software Symposium&lt;/a&gt; here in Reston, VA. Sad to say I didn&#39;t get any of the 3 iPads! I did see my name scrolling down for the last iPad (the most expensive model!) but the system had to pick someone else&#39;s name just 2 or 3 positions from mine! Oh well... guess I am not destined to get one, since I am not gonna buy one and my luck isn&#39;t gonna get me a free one either. This is something else I might consider buying, if it ever sees the light of day &lt;a href=&quot;http://gizmodo.com/5471559/notion-ink-adam-tablet-caught-on-video-specs-finalized&quot;&gt;Notion Ink Adam&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Anyways, the symposium was amazing - Jay Zimmerman put together a great set of speakers and enough varied content for everybody. Thanks Jay! These are the sessions I attended, along with my comments:&lt;br /&gt;
&lt;br /&gt;
Click on the &quot;Read more&quot; link below to check out my notes on Friday&#39;s presentations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;
Friday&lt;/h2&gt;
&lt;br /&gt;
&lt;h3&gt;
Implementing Evolutionary Architecture - &lt;a href=&quot;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fentity%2FNeal-Ford%2FB001K7PMYQ%3Fie%3DUTF8%26ref_%3Dsr%5Ftc%5F2%5F0%26qid%3D1273077458%26sr%3D1-2-ent&amp;amp;tag=thoforbea-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=390957&quot;&gt;Neal Ford&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;https://www.assoc-amazon.com/e/ir?t=thoforbea-20&amp;amp;l=ur2&amp;amp;o=1&quot; style=&quot;border: none !important; margin: 0px !important;&quot; width=&quot;1&quot; /&gt;&lt;/h3&gt;
&lt;h3&gt;
Testing the Entire Stack - &lt;a href=&quot;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fentity%2FNeal-Ford%2FB001K7PMYQ%3Fie%3DUTF8%26ref_%3Dsr%5Ftc%5F2%5F0%26qid%3D1273077458%26sr%3D1-2-ent&amp;amp;tag=thoforbea-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=390957&quot;&gt;Neal Ford&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;https://www.assoc-amazon.com/e/ir?t=thoforbea-20&amp;amp;l=ur2&amp;amp;o=1&quot; style=&quot;border: none !important; margin: 0px !important;&quot; width=&quot;1&quot; /&gt;&lt;/h3&gt;
&lt;h3&gt;
Smithing in the 21st Century - &lt;a href=&quot;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fentity%2FNeal-Ford%2FB001K7PMYQ%3Fie%3DUTF8%26ref_%3Dsr%5Ftc%5F2%5F0%26qid%3D1273077458%26sr%3D1-2-ent&amp;amp;tag=thoforbea-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=390957&quot;&gt;Neal Ford&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;https://www.assoc-amazon.com/e/ir?t=thoforbea-20&amp;amp;l=ur2&amp;amp;o=1&quot; style=&quot;border: none !important; margin: 0px !important;&quot; width=&quot;1&quot; /&gt;&lt;/h3&gt;
Like I said on my last post, I really like Neal&#39;s presentations. He described REST in detail, and how we can use it to keep systems loosely coupled. Also, he gave some great recommendations on tools and strategies for testing different aspects of common web and desktop applications.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
What Stops You From Delivering? - David Hussman&lt;/h3&gt;
Discussed about ways to find your process bottlenecks and how to deal with them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Saturday&lt;/h2&gt;
&lt;br /&gt;
&lt;h3&gt;
Pragmatic Architecture - &lt;a href=&quot;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fentity%2FTed-Neward%2FB000APO1SC%3Fie%3DUTF8%26ref_%3Dsr%5Ftc%5F2%5F0%26qid%3D1273077512%26sr%3D1-2-ent&amp;amp;tag=thoforbea-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=390957&quot;&gt;Ted Neward&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;https://www.assoc-amazon.com/e/ir?t=thoforbea-20&amp;amp;l=ur2&amp;amp;o=1&quot; style=&quot;border: none !important; margin: 0px !important;&quot; width=&quot;1&quot; /&gt;&lt;/h3&gt;
Discussed about architecture and how oftentimes we either under or over-architect systems.&lt;br /&gt;
&lt;br /&gt;
It is quite common in the J2EE world to find teams building systems using so many different design patterns just because they want to use it, not because it is the easiest / best way to solve the problem. In the other extreme we have teams that just go coding stuff without minimal or any architecture discussion.&lt;br /&gt;
&lt;br /&gt;
In the end architecture should be defined at a high-level before we start coding things, otherwise it will be defined with much less control and may not end up being quite what you expected.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Architect for Scale - &lt;a href=&quot;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fentity%2FMichael-T.-Nygard%2FB001JS6NA8%3Fie%3DUTF8%26ref_%3Dntt%5Fathr%5Fdp%5Fpel%5Fpop%5F1&amp;amp;tag=thoforbea-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=390957&quot;&gt;Michael Nygard&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;https://www.assoc-amazon.com/e/ir?t=thoforbea-20&amp;amp;l=ur2&amp;amp;o=1&quot; style=&quot;border: none !important; margin: 0px !important;&quot; width=&quot;1&quot; /&gt;&lt;/h3&gt;
&lt;h3&gt;
Software Architecture for the Cloud - &lt;a href=&quot;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fentity%2FMichael-T.-Nygard%2FB001JS6NA8%3Fie%3DUTF8%26ref_%3Dntt%5Fathr%5Fdp%5Fpel%5Fpop%5F1&amp;amp;tag=thoforbea-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=390957&quot;&gt;Michael Nygard&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;https://www.assoc-amazon.com/e/ir?t=thoforbea-20&amp;amp;l=ur2&amp;amp;o=1&quot; style=&quot;border: none !important; margin: 0px !important;&quot; width=&quot;1&quot; /&gt;&lt;/h3&gt;
I am a big fan of Michael since I read his book &quot;&lt;a href=&quot;http://www.amazon.com/gp/product/0978739213?ie=UTF8&amp;amp;tag=thoforbea-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0978739213&quot;&gt;Release It!: Design and Deploy Production-Ready Software (Pragmatic Programmers)&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://www.assoc-amazon.com/e/ir?t=thoforbea-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0978739213&quot; style=&quot;border: none !important; margin: 0px !important;&quot; width=&quot;1&quot; /&gt;&lt;br /&gt;
&quot;. His presentations focused on architecture for systems designed to handle volumes orders of magnitude higher than what I am used to. It was really interesting to glimpse on what kind of problems we may see soon, with more and more people using computer systems, and what kind of solutions we are using today to support it with high availability and performance. He described techniques such as process parallelization, architecture partitioning (sharding) and content delivery networks (e.g. Akamai) to support scalability.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Building RESTful Apps with SpringMVC - &lt;a href=&quot;http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fentity%2FCraig-Walls%2FB001JOVOZ6%3Fie%3DUTF8%26ref_%3Dsr%5Ftc%5F2%5F0%26qid%3D1273077396%26sr%3D1-2-ent&amp;amp;tag=thoforbea-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=390957&quot;&gt;Craig Walls&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;https://www.assoc-amazon.com/e/ir?t=thoforbea-20&amp;amp;l=ur2&amp;amp;o=1&quot; style=&quot;border: none !important; margin: 0px !important;&quot; width=&quot;1&quot; /&gt;&lt;/h3&gt;
He demonstrated a single SpringMVC-based web application with support for both browsers and REST web service clients. It was a good demo, I will try that later.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
300 Sessions&lt;/h3&gt;
This was cool, each presenter got only 5 minutes to present a topic. I wish they had shared these PPTs too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Sunday&lt;/h2&gt;
&lt;br /&gt;
&lt;h3&gt;
Cloud Computing - Rohit Bhardwaj&lt;/h3&gt;
This one was really interesting - Rohit described and demonstrated how we can use Amazon EC2 and S3 as a low-cost approach for on-demand infrastructure services. He also demonstrated a simple Google AppEngine project, and compared the costs and specifics of each major player in the cloud computing world. It might be just me but I didn&#39;t know Google gave us free resources for our projects in Google App Engine! If you just want to test out an idea you can setup a virtual environment in no time, and as long you don&#39;t use lots of resources (up to 500MB, up to 5 million page hits per month, limited CPU use etc) you can set it up for FREE!&lt;br /&gt;
&lt;br /&gt;
Google&#39;s offer is free but limited: no database (you have to use BigTable instead), not all parts of Java are supported (e.g. no Thread) etc. They basically hide the servers from you, so you can focus only on the application side.&lt;br /&gt;
&lt;br /&gt;
Amazon&#39;s offer is not free but cheap, and they give you control over the infrastructure. You can try out different server architectures, create server templates etc without buying any physical infrastructure. This is great for temporary needs, like a performance test where after the test proved a set of hypothesis it can be discarded.&lt;br /&gt;
&lt;br /&gt;
One approach is to build and test your app in Google, and then migrate it to Amazon or to your in-house infrastructure. As long you don&#39;t build close ties with Google&#39;s infrastructure that shouldn&#39;t be too complicated.&lt;br /&gt;
&lt;br /&gt;
Now that I have cheap infrastructure I just need to have the killer idea on how to use it to make tons of money! Ideas anyone? Please? :D&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Enter the Gradle - Ken Sipe&lt;/h3&gt;
Gradle is like a new Maven, a project build system. From this presentation I got that it is still not mature yet for my purposes (though big projects are already using it) but it made me more interested in Groovy, the language used to build Gradle. I will definitely spend more time learning Groovy and Grails in good part because of this presentation.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Maintaining Source Code Quality - David Bock&lt;/h3&gt;
David described how we can easily include project analyzers to determine code quality and use it as metrics towards better quality. Great stuff, but I used most of it on previous projects (PMD, FindBugs, CheckStyle etc). I did learn about some new source code analyzers though. He also pointed out the importance for enforcing a project-specific code style - it is not about cosmetic preferences, but to simplify merges in the source code versioning system.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Programming Clojure - Aaron Bedra&lt;/h3&gt;
What else can I say about this one? I think I twisted my brain hahaha... really, this was the last session I attended in the conference, and the most complex one. Aaron had to consolidate a 4 hours presentation into just 1.5 hours, and while I think he did a good job at it describing Clojure&#39;s syntax my opinion is that it just made people want to avoid it.</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/4537296994789472711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/05/nfjs-2010-northern-virginia-software.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/4537296994789472711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/4537296994789472711'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/05/nfjs-2010-northern-virginia-software.html' title='NFJS 2010 - Northern Virginia Software Symposium II'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-4636581510353450204</id><published>2010-04-30T20:33:00.000-07:00</published><updated>2010-04-30T20:33:40.665-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="general"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>NFJS 2010 - Northern Virginia Software Symposium</title><content type='html'>I am attending the &lt;a href=&quot;http://www.nofluffjuststuff.com/conference/reston/2010/04/home&quot;&gt;No Fluff Just Stuff Software Symposium&lt;/a&gt; here in Reston, VA. The schedule this year is really good, with names like Neil Ford, Jeff Brown, Matthew McCullough and so many other experienced speakers and book authors discussing things like REST, polyglot development with languages like Ruby, Clojure etc, cloud computing, testing, Agile development etc. Many of these guys are either book authors, code committers or both for really cutting edge technologies that are shaping up what most of us will be doing and working with years from now. Sometimes it is hard to decide which session you want to attend - at any given time during the event they have 6 parallel sessions going on!&lt;br /&gt;
&lt;br /&gt;
I attended today 2 sessions with Neal Ford, &quot;Implementing Evolutionary Architecture&quot; and &quot;Testing the Entire Stack&quot;. He is not just a gifted speaker but also makes it obvious he knows well what he is talking about from hands on experience. If you ever have the chance to attend one of his sessions at NFJS or some other symposium make try not to miss it, I am sure you will learn something you can use. His keynote &quot;Smithing in the 21st Century&quot;, where he presented his views of how (and to what extent) we can predict the future and to where we are headed in the near future was great, and it was interesting not just for developers / architects but to pretty much anyone interested in technology.&lt;br /&gt;
&lt;br /&gt;
Unfortunately I just found out about the symposium less than 2 weeks back so I couldn&#39;t convince my company to fund my tickets (who knows if they change their mind in the next weeks? that would be a good surprise :D). Despite of that, a good thing is that I got to do volunteer work helping the event organizers on some basic tasks (things like attendee registration, organizing the presentation printouts etc), got to meet some nice people and should even get some credit back. Also, NFJS will be giving away 2 iPads, books and other prizes at random for the attendees - who knows, if my name gets picked for one of the iPads that wouldn&#39;t be bad at all, especially because this is likely the only way I would ever get one! :D&lt;br /&gt;
&lt;br /&gt;
I will let you know on Sunday if I got one of the iPads hehehe... along with my personal feedback of the sessions I attended. I know these things are subjective, but who knows, if you get the NFJS guys in your town this could help you pick your sessions.</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/4636581510353450204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/04/nfjs-2010-northern-virginia-software.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/4636581510353450204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/4636581510353450204'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/04/nfjs-2010-northern-virginia-software.html' title='NFJS 2010 - Northern Virginia Software Symposium'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-2845028172428144058</id><published>2010-04-10T07:39:00.000-07:00</published><updated>2012-08-20T21:14:03.497-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="appfuse"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Quick web app prototyping with AppFuse</title><content type='html'>&lt;h1&gt;
Quick web app prototyping with AppFuse&lt;/h1&gt;
&lt;br /&gt;
Sometimes we just need to put together a quick web app for prototyping, discuss screen flows, design layouts, create web services etc. I found AppFuse to be a pretty good option for this purpose.&lt;br /&gt;
&lt;br /&gt;
You can follow the steps in this article to setup your environment and create a new web application with AppFuse. The best thing is that once your environment has all the requirements setup it is super quick to create as many new web apps whenever you need. Even if you aren&#39;t very familiar with things like AppFuse, Maven, Spring, Hibernate etc but still want to be able to generate new web apps, just try to endure the first steps - once you see the web app up and running on your computer I am sure you will be more motivated to learn it all through AppFuse.&lt;br /&gt;
&lt;br /&gt;
Click on the &quot;Read more&quot; link below to get started with AppFuse and build a working web application in no time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
I used AppFuse 2.1.0 M1 on my examples for this article since this is what I would use if I had to start a new project today. If you prefer to use the last full release of AppFuse 2.0.2 or the snapshot release for M2 check out the additional sections at the end of this article.&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
Prerequisites&lt;/h2&gt;
&lt;br /&gt;
1. Java Development Kit 1.5.x or newer&lt;br /&gt;
You can download the latest one here:&lt;br /&gt;
http://java.sun.com/javase/downloads/widget/jdk6.jsp&lt;br /&gt;
&lt;br /&gt;
2. Apache Maven 2.0.x (AppFuse 2.0.2) or Maven 2.2.x (AppFuse 2.1.0+)&lt;br /&gt;
You can download both versions here:&lt;br /&gt;
http://maven.apache.org/download.html&lt;br /&gt;
&lt;br /&gt;
3. Any email server&lt;br /&gt;
You can download an open source implementation here:&lt;br /&gt;
Java Apache Mail Enterprise Server (JAMES) - http://james.apache.org/download.cgi#Apache_James_Server&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
An email server is not exactly required for you to use AppFuse but it is used by the standard automated tests. If this is your first time using AppFuse it is a good idea to start James just to avoid having to disable or modify jUnit tests.&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
No database is required (how cool is that?) if you can use one of the supported embedded database such as H2 or HSQLDB. Sure, you can easily configure AppFuse to use other databases such as MySQL or Oracle, but while this is a good idea for a real enterprise application it is out of the scope for this quick guide.&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
Eclipse (or any other Java IDE) isn&#39;t actually required if you just want to run AppFuse&#39;s starter web application - however, if you are planning on customizing it, play with changing configuration and properties files etc you really want to use it. I included instructions to setup the project in Eclipse but if you use some other IDE you might want to check AppFuse&#39;s website or forum for more information.&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
Environment setup&lt;/h2&gt;
&lt;br /&gt;
You will need to execute the steps in this section only once. After you set up all requirements on your development environment you will be able to create and start new web applications with just 4 or 5 commands, without even touching code or configuration files!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
For this example I will install the JDK, Maven and James in &quot;C:\Users\Pedro\Env\Java&quot; and create my AppFuse-based projects in &quot;C:\Users\Pedro\Projects&quot; - but you can use whatever paths you want – especially if your name isn&#39;t &quot;Pedro&quot;! From now on I will refer to &quot;C:\Users\Pedro\Projects&quot; just as PROJECT_ROOT.&lt;/div&gt;
&lt;br /&gt;
1. I always create a batch file (in Windows) or shell script (in Unix) to set up my environment variables. Usually this is a better practice than set environment variables only in the system configuration since it is easier to clone on other machines and make the project less coupled with the underlying environment. If you want to do the same, on PROJECT_ROOT create a file called setenv.bat with the content below:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;set JAVA_HOME=C:\Users\Pedro\Env\Java\jdk1.6.0_17
set PATH=%JAVA_HOME%\bin;%PATH%
set M2_HOME=C:\Users\Pedro\Env\Java\apache-maven-2.2.1
set MAVEN_HOME=C:\Users\Pedro\Env\Java\apache-maven-2.2.1
set PATH=%MAVEN_HOME%\bin;%PATH%
set MAVEN_OPTS=-Xms256m -Xmx512m
&lt;/pre&gt;
&lt;br /&gt;
&lt;div class=&quot;warning&quot;&gt;
Remember to replace the paths in setenv.bat described above with the ones you use on your environment.&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
Let&#39;s create a new web project!&lt;/h2&gt;
&lt;br /&gt;
&lt;h3&gt;
1. Start your mail server:&lt;/h3&gt;
&lt;br /&gt;
Execute C:\Users\Pedro\Env\Java\james-2.3.2\bin\run.bat&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaH7IzhrMNhPuJgvXuV1C0L5NsNSA_02CO7gkThMtsb9SS9t1NOibFUF8Y8fpmCKhORJs6TePXr-9pBn99JfmN_oXNKL1c0K76MpO-bpY62AOOYJXX8IueQC-r8I3ew3QvKCJ-rkwhcXY/s1600/1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaH7IzhrMNhPuJgvXuV1C0L5NsNSA_02CO7gkThMtsb9SS9t1NOibFUF8Y8fpmCKhORJs6TePXr-9pBn99JfmN_oXNKL1c0K76MpO-bpY62AOOYJXX8IueQC-r8I3ew3QvKCJ-rkwhcXY/s320/1.png&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzy0HVr3FqPSXWYH7dU6Aix49Y7t6Vh8PQZM2DS2grgzRhYz7kou_eg2j050UzzMvlfoaUVYYAiz4P4UCbAfICOc3XOqu1HF-rTTrab3ndg6qbinKpOMk9PJYPSfZfahB6RNhC3Wb58Sk/s1600/2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzy0HVr3FqPSXWYH7dU6Aix49Y7t6Vh8PQZM2DS2grgzRhYz7kou_eg2j050UzzMvlfoaUVYYAiz4P4UCbAfICOc3XOqu1HF-rTTrab3ndg6qbinKpOMk9PJYPSfZfahB6RNhC3Wb58Sk/s320/2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
2. Open a command prompt, go to PROJECT_ROOT and execute setenv.bat&lt;/h3&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZfcBpF_Hyy9d7wBrDUugjrHQ1KUw3PrNyoUpcAgHaSv2q_WatO_qy9TZi2zseLX30PbbduqVSSi3ieG5Y477Xn9BgZn49g86ssljveM9B_aNCyjW85Vu6BfJxHhCOqvL9dUr0nsPb_28/s1600/3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZfcBpF_Hyy9d7wBrDUugjrHQ1KUw3PrNyoUpcAgHaSv2q_WatO_qy9TZi2zseLX30PbbduqVSSi3ieG5Y477Xn9BgZn49g86ssljveM9B_aNCyjW85Vu6BfJxHhCOqvL9dUr0nsPb_28/s320/3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
3. Create a new AppFuse project:&lt;/h3&gt;
&lt;br /&gt;
AppFuse supports different combinations of various frameworks - in the example below uses Spring, Hibernate and JSF. If you want to use other frameworks you can check out &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;AppFuse&#39;s official site&lt;/a&gt; for the appropriate Maven commands.&lt;br /&gt;
&lt;br /&gt;
Also, note that the first time you create an application with AppFuse it will take Maven several minutes to download all the dependencies from the internet into your local Maven repository. However, the next times since it will already have the JARs the build will finish much faster.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
[AppFuse 2.1.0 M1]&lt;/h3&gt;
&lt;br /&gt;
On the same command prompt window copy and paste the commands below to generate the web application:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
I am using simple names in the example below, but for a real project you might want to replace &quot;com.mycompany&quot; with a more meaningful Java package, and &quot;appfusem1&quot; with your project name.&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-jsf-archetype -DarchetypeVersion=2.1.0-M1 -DgroupId=com.mycompany -DartifactId=appfusem1
cd appfusem1
mvn appfuse:full-source
mvn -P hsqldb
mvn -P hsqldb install
&lt;/pre&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
Because of the many tests being executed as part of the build process &lt;b&gt;it is normal&lt;/b&gt; for warning and error messages to popup in the command prompt, just give it some time and wait for it to complete.&lt;/div&gt;
&lt;br /&gt;
If you got a SUCCESS message like the one shown below your web application was generated correctly and it is ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCHltOXI83yy6_T_MaToS2kaTS_UhykZMoxZwtl8H1GW-r9gqXdRBJwpju8OkCeCDMzpo2NDGTtiXBUbJ_vVaAqg8l8MJLAUTpTC6qzRn8yBa2mjZNnrW4x71-ZO6_0K_l63PwOCO-o7k/s1600/4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCHltOXI83yy6_T_MaToS2kaTS_UhykZMoxZwtl8H1GW-r9gqXdRBJwpju8OkCeCDMzpo2NDGTtiXBUbJ_vVaAqg8l8MJLAUTpTC6qzRn8yBa2mjZNnrW4x71-ZO6_0K_l63PwOCO-o7k/s320/4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Build, test and run:&lt;/h3&gt;
&lt;pre&gt;mvn -e -P hsqldb jetty:run-war
&lt;/pre&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2doVff7yLbONfL5Tbq5sP111lb7rW5h-lu6lZaDUXp3pjitKuRIYNOlMZjfzbFbgo8OSIUWl3H2XMChckv2qkFkgG40TgnOny062Hhg8TLQ3zWVoOr379G1l-Trq710LMEkYBp-QTVys/s1600/5.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2doVff7yLbONfL5Tbq5sP111lb7rW5h-lu6lZaDUXp3pjitKuRIYNOlMZjfzbFbgo8OSIUWl3H2XMChckv2qkFkgG40TgnOny062Hhg8TLQ3zWVoOr379G1l-Trq710LMEkYBp-QTVys/s320/5.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Wait for the message highlighted above.&lt;br /&gt;
&lt;br /&gt;
Open your internet browser and go to URL &quot;http://localhost:8080/&quot;.&lt;br /&gt;
You can login as username &quot;admin&quot; password &quot;admin&quot; or username &quot;user&quot; password &quot;user&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXERZDHmfXVp4aZHt9GucvgPooqonb77hYI15xig6IMkRTQDfZ5EdVEuztmY7r71zXEeSGAlMZWSyKgsJ_Rq6uEc-1xMj4T0ebXAdddtxsfVloUJiahsYsa-4yoEczfm7KAxMV9hZROBQ/s1600/6.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXERZDHmfXVp4aZHt9GucvgPooqonb77hYI15xig6IMkRTQDfZ5EdVEuztmY7r71zXEeSGAlMZWSyKgsJ_Rq6uEc-1xMj4T0ebXAdddtxsfVloUJiahsYsa-4yoEczfm7KAxMV9hZROBQ/s320/6.png&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzAzZN3qvSjdx81Pp0pJ69O5woVCzMK3NjDreUjJ92TURCGQ87ClgZFFI6Sgke5Gu3TF3H9QdO4b3YCF1P9qjrmbPIzKaSOORsEIPpty84tXvUZQr8aukM7u8h_FXgci4_Ko4I0Hd-BnE/s1600/7.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzAzZN3qvSjdx81Pp0pJ69O5woVCzMK3NjDreUjJ92TURCGQ87ClgZFFI6Sgke5Gu3TF3H9QdO4b3YCF1P9qjrmbPIzKaSOORsEIPpty84tXvUZQr8aukM7u8h_FXgci4_Ko4I0Hd-BnE/s320/7.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Disable database rebuild, unit and UI tests&lt;/h3&gt;
&lt;br /&gt;
Database rebuild, unit and web tests are enabled by default, which means that even with the JARs the builds will take some time to complete. It is a good idea to run and keep these tests in sync with the code so you can avoid surprises, but for times when we just want a quick build we just need to add property &quot;-DskipTests=true&quot; in the command line to disable it all.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;pre&gt;mvn -e -P hsqldb jetty:run-war -DskipTests=true
&lt;/pre&gt;
&lt;br /&gt;
&lt;h3&gt;
Import project in Eclipse:&lt;/h3&gt;
&lt;br /&gt;
You can use Maven to generate Eclipse&#39;s .project file:&lt;br /&gt;
&lt;pre&gt;mvn -P hsqldb org.apache.maven.plugins:maven-eclipse-plugin:2.5.1:eclipse
&lt;/pre&gt;
&lt;br /&gt;
Open Eclipse with PROJECT_ROOT as the workspace. If Eclipse does not ask you for the workspace when it starts, go to File / Switch Workspace / Other and enter the path to your PROJECT_ROOT&lt;br /&gt;
&lt;br /&gt;
In Eclipse, select File / Import, expand General and select Existing Project into Workspace&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipEjp-XJoY8gLZUgkbmR5U3CHU024wV3ILeyFCkQwbpk6RfvGmBFWJBnR6xdoI4dctKULGrWzq35OMXqvbFKfRrq6Waxnv85wHmZ-xgKIV3bB5Kt2FvQrs9RS5hgTkCRCmuXz0dQVqJeE/s1600/8.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipEjp-XJoY8gLZUgkbmR5U3CHU024wV3ILeyFCkQwbpk6RfvGmBFWJBnR6xdoI4dctKULGrWzq35OMXqvbFKfRrq6Waxnv85wHmZ-xgKIV3bB5Kt2FvQrs9RS5hgTkCRCmuXz0dQVqJeE/s320/8.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Click Next and for the root directory just click Browse and Ok to select the current workspace, make sure your new project is listed and checked, and click Finish.&lt;br /&gt;
&lt;br /&gt;
Once the import is finished you will see many dependency issues – to correct this you must add a variable classpath in Eclipse named &quot;M2_REPO&quot; pointing to your Maven repository&lt;br /&gt;
eg. M2_REPO=C:\env\.m2\repository&lt;br /&gt;
&lt;br /&gt;
You can do that via Eclipse: right-click the project root node, select Java Build Path, Libraries, Add Variable, New, and create M2_REPO pointing to your Maven repository.&lt;br /&gt;
&lt;br /&gt;
You can also do that using Maven: in the command prompt window just execute the command below:&lt;br /&gt;
&lt;pre&gt;mvn -Declipse.workspace=C:\Users\Pedro\Projects eclipse:add-maven-repo&lt;/pre&gt;
&lt;br /&gt;
&lt;h2&gt;
Instructions for different versions of AppFuse&lt;/h2&gt;
&lt;br /&gt;
&lt;h3&gt;
[AppFuse 2.0.2]&lt;/h3&gt;
&lt;pre&gt;mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-jsf -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany -DartifactId=appfuse202
cd appfuse202
mvn appfuse:full-source
&lt;/pre&gt;
&lt;br /&gt;
To correct a minor bug with AppFuse + embedded databases in Windows, edit and replace in pom.xml:&lt;br /&gt;
&lt;pre&gt;&amp;lt;jdbc.url&amp;gt;&amp;lt;![CDATA[jdbc:hsqldb:${java.io.tmpdir}/appfuse202;shutdown=true]]&amp;gt;&amp;lt;/jdbc.url&amp;gt;
&lt;/pre&gt;
with:&lt;br /&gt;
&lt;pre&gt;&amp;lt;jdbc.url&amp;gt;&amp;lt;![CDATA[jdbc:hsqldb:tmp/appfuse202;shutdown=true]]&amp;gt;&amp;lt;/jdbc.url&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;pre&gt;mvn -e -P hsqldb
mvn -e -P hsqldb install eclipse:eclipse
&lt;/pre&gt;
&lt;br /&gt;
&lt;div class=&quot;info&quot;&gt;
How to disable database rebuild, unit and UI tests in 2.0.2: add &quot;-Dmaven.test.skip=true&quot;. For example:&lt;br /&gt;
mvn -e -P hsqldb jetty:run-war -Dmaven.test.skip=true&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
[AppFuse 2.1.0 M2 SNAPSHOT]&lt;/h3&gt;
&lt;pre&gt;mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-jsf-archetype -DarchetypeVersion=2.1.0-M2-SNAPSHOT -DgroupId=com.mycompany -DartifactId=appfusem2
cd appfusem2
mvn appfuse:full-source
mvn -P hsqldb
mvn -P hsqldb install eclipse:eclipse
&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/2845028172428144058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/04/quick-web-app-prototyping-with-appfuse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/2845028172428144058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/2845028172428144058'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/04/quick-web-app-prototyping-with-appfuse.html' title='Quick web app prototyping with AppFuse'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaH7IzhrMNhPuJgvXuV1C0L5NsNSA_02CO7gkThMtsb9SS9t1NOibFUF8Y8fpmCKhORJs6TePXr-9pBn99JfmN_oXNKL1c0K76MpO-bpY62AOOYJXX8IueQC-r8I3ew3QvKCJ-rkwhcXY/s72-c/1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-3557852637254712742</id><published>2010-03-17T08:00:00.000-07:00</published><updated>2012-09-06T08:37:57.423-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="performance"/><title type='text'>J2EE Performance Tuning</title><content type='html'>Found a very good overview on &quot;How to Diagnose a Performance Problem in a J2EE System&quot; written by John Bley: &lt;a href=&quot;http://weblogic.sys-con.com/node/43024&quot;&gt;http://weblogic.sys-con.com/node/43024&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Even though this article was written in 2003 somehow it&amp;nbsp;is still pretty up to date. Guess the ways we build our systems are not changing&amp;nbsp;so fast afterall.</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/3557852637254712742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/03/j2ee-performance-tuning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/3557852637254712742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/3557852637254712742'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/03/j2ee-performance-tuning.html' title='J2EE Performance Tuning'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-8097041939270863359</id><published>2010-03-10T16:33:00.000-08:00</published><updated>2010-03-10T16:33:00.916-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="virtual machines"/><title type='text'>Virtual Machines - managing virtual drives</title><content type='html'>From time to time I have to expand the disks on my virtual machines. Or convert disks from preallocated 9+GBs into sets of 2GB files (so they fit in FAT32 USB sticks, for example). I found this tool vmware-vdiskmanager to be the best way to manage these tasks, but it does not come bundled with VMWare Player. It does come, however, in the also free-as-in-beer VMWare Server. So if you need it, download and install VMWare Server &lt;a href=&quot;http://www.vmware.com/products/server/&quot;&gt;here&lt;/a&gt; so you can use the examples below.&lt;br /&gt;
&lt;br /&gt;
# VMware Virtual Disk Manager Utility (vmware-vdiskmanager.exe):&lt;br /&gt;
- Documentation: http://www.vmware.com/support/ws55/doc/ws_disk_manager_running.html&lt;br /&gt;
&lt;br /&gt;
# Examples:&lt;br /&gt;
&lt;br /&gt;
- Convert existing virtual disk from fixed preallocated size to growable, split into 2GB files (trust me, it helps wonders to set all your virtual disks this way to avoid future headaches):&lt;br /&gt;
&lt;pre&gt;C:\&quot;Program Files&quot;\VMware\&quot;VMware Server&quot;\vmware-vdiskmanager.exe -r data.vmdk -t 1 data-1.vmdk&lt;/pre&gt;&lt;br /&gt;
- Defragment existing virtual disk (unless you have a SSD you should do this every now and then both in the VM and in the host OS):&lt;br /&gt;
&lt;pre&gt;C:\&quot;Program Files&quot;\VMware\&quot;VMware Server&quot;\vmware-vdiskmanager.exe -d data.vmdk&lt;/pre&gt;&lt;br /&gt;
- Shrink virtual disk:&lt;br /&gt;
&lt;pre&gt;C:\&quot;Program Files&quot;\VMware\&quot;VMware Server&quot;\vmware-vdiskmanager.exe -k data.vmdk&lt;/pre&gt;&lt;br /&gt;
- Expand virtual disk:&lt;br /&gt;
&lt;pre&gt;C:\&quot;Program Files&quot;\VMware\&quot;VMware Server&quot;\vmware-vdiskmanager.exe -x 32GB data.vmdk&lt;/pre&gt;&lt;br /&gt;
Note: when you expand an already partitioned virtual disk it will not show immediately the new size when you boot your virtual machine. However, now you can use tools inside the virtual machine to expand the partition so the operating system can see and use it. In Linux, for example, you can do this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;df &amp;lt;- run this to list all mounted partitions
Filesystem ... Mounted on
/dev/sda1 ... /
/dev/sdb1 ... /data &amp;lt;- this is the partition I want to expand
&lt;/pre&gt;&lt;br /&gt;
Note: the block below worked for me, but as always, MAKE BACKUPS OF EVERYTHING if you don&#39;t want to risk losing your precious data. Or don&#39;t backup, but don&#39;t blame me if you mess up and lose your whole filesystem...&lt;br /&gt;
&lt;pre&gt;login as root and run these commands:
&lt;li/&gt;umount /dev/sdb1&lt;br /&gt;
&lt;li/&gt;fdisk -l /dev/sdb - write down the start and end cylinders for the target partition&lt;br /&gt;
&lt;li/&gt;fdisk /dev/sdb&lt;br /&gt;
&lt;li/&gt;in fdisk use the [d] command to delete the partition - yeah, I know, this is scary, but if you REALLY took the time to backup your virtual machine then go ahead; if everything works your data will not be lost in fdisk&lt;br /&gt;
&lt;li/&gt;use the [n] command to add a new primary partition, using the same partition number and start cylinder, but use the default value for end cylinder for it to use all the space you made available in fdisk&lt;br /&gt;
&lt;li/&gt;use the [w] command to write the partition table to the disk and exit - if it asks you to restart your server, do that before proceeding, otherwise keep going&lt;br /&gt;
&lt;li/&gt;login as root again and run these commands:&lt;br /&gt;
&lt;li/&gt;e2fsck -f /dev/sdb1&lt;br /&gt;
&lt;li/&gt;resize2fs /dev/sdb1&lt;br /&gt;
&lt;li/&gt;mount /dev/sdb1&lt;br /&gt;
&lt;li/&gt;df -h&lt;br /&gt;
&lt;/pre&gt;&lt;br /&gt;
If everything worked as planned you should now have a bigger partition, and all your precious data should still be there. If something didn&#39;t work, well, you still have your backups, right? RIGHT? ;D</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/8097041939270863359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/03/virtual-machines-managing-virtual.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/8097041939270863359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/8097041939270863359'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/03/virtual-machines-managing-virtual.html' title='Virtual Machines - managing virtual drives'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-6704768063784448697</id><published>2010-03-06T08:59:00.000-08:00</published><updated>2012-09-06T08:38:36.651-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="electronics"/><category scheme="http://www.blogger.com/atom/ns#" term="performance"/><category scheme="http://www.blogger.com/atom/ns#" term="ssd"/><title type='text'>Solid State Drives - Part 2</title><content type='html'>On my previous post I tried to convince you that it makes sense to buy an overpriced storage device called SSD if you use computers for a living. Now, to conclude my discussion on SSDs I will go into more low-level details such as:&lt;br /&gt;
&lt;br /&gt;
1. Why I bought specifically Intel&#39;s I-25M?&lt;br /&gt;
2. How I installed it, and why I cloned my old drive instead of starting it &quot;fresh&quot;?&lt;br /&gt;
3. What are the tweaks one needs to apply on a XP machine with SSD?&lt;br /&gt;
4. Good comparison of SSDs x HDDs&lt;br /&gt;
&lt;br /&gt;
--------------------&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. Why I bought specifically Intel&#39;s I-25M?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
- Quick answer: because it currently has the best value if you weight compatibility, performance and price among the top SSDs.&lt;br /&gt;
&lt;br /&gt;
- Verbose answer:&lt;br /&gt;
If you are joining the SSD bandwagon you should try to pair it up with a modern operating system, such as Windows 7. Also, plan on doing a clean install of the OS instead of imaging your current hard drive into the SSD. That will simplify things a lot, since older operating systems were not designed with SSDs in mind and may cause issues ranging from sub-optimal performance to even significantly decrease the life of SSDs.&lt;br /&gt;
&lt;br /&gt;
Sadly I could not follow this advice myself - I wanted to install my SSD on my work laptop, since this is what I use 99% of the time for &quot;money-making&quot; tasks. Ya know, unless we rob a bank or do some other illegal stuff we need to do something they call work to get money to buy cool stuff like electronics. My company currently doesn&#39;t allow me to use Windows 7 yet, and I didn&#39;t want to mess with my VPN. Not having the option to switch my work computer to Windows 7 I had to figure out a way to make it work with XP.&lt;br /&gt;
&lt;br /&gt;
Some SSDs do not support XP well. More specifically, many of them only support something called TRIM in Windows 7. You can look for TRIM and SSD on Google or Wikipedia, but it&#39;s enough to say that you NEED the ability to run TRIM at least every week or month, otherwise your SSD&#39;s performance and life will sink fast. Intel&#39;s SSD works pretty well with XP - in fact, their SSDs are one of the simpler devices to use, requiring the least amount of tweaks to work in top shape with XP. Sure it also helps I got a decent deal from Newegg the last Black Friday! :D&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. How I installed it, and why I cloned my old drive instead of starting it &quot;fresh&quot;?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I had to find a way to clone my original HDD into the SSD so I would not have to reinstall everything, including apps, network settings and more importantly the VPN. Then, after digging through zillions of forums I found that the most important thing you need to pay attention to when cloning XP drives into an SSD is something called &lt;b&gt;partition alignment&lt;/b&gt;. You can look it up, but basically it has to do where the XP partition starts in the disk, and for you to get the best performance it must start on a sector that is a multiple of your SSD&#39;s page size. Since XP wasn&#39;t built with SSDs in mind it always start its partitions on a position that doesn&#39;t match the start of a page in your SSD. What this means is that when XP needs to read or write something to the SSD, the SSD needs to do double the work to access two pages instead of one. Some SSDs handle it better than others, but it is a performance constraint nevertheless. If you partition your SSD using Vista or Windows 7 you should be safe, these operating systems always start a partition on sector 2048, which is compatible with most SDDs out there.&lt;br /&gt;
&lt;br /&gt;
Note that partition alignment can give a good performance boost even for regular HDDs, as described by Microsoft here (http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/prork/pree_exa_oori.mspx?mfr=true). For (much) more detailed information on benefits of partition alignment for SSDs see here (http://www.ocztechnologyforum.com/forum/showthread.php?48309-Partition-alignment-importance-under-Windows-XP-%2832-bit-and-64-bit%29-why-it-helps-with-stuttering-and-increases-drive-working-life).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;- SSD partitioning:&lt;/b&gt;&lt;br /&gt;
To ensure proper partition alignment I used the Disk Management tool from my Windows 7 computer to remove the old and re-create a new partition on the SSD. This tool comes bundled with Windows 7 and Vista, just go to Control Panel, Administrative Tools, Computer Management. There I removed all partitions from the SSD (it was a new drive, so I had no data to lose), created a new partition and formatted it with NTFS.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;- Disk cloning:&lt;/b&gt;&lt;br /&gt;
I first used a free tool called Macrium Reflect (&lt;a href=&quot;http://www.macrium.com/reflectfree.asp&quot;&gt;http://www.macrium.com/reflectfree.asp&lt;/a&gt;) to backup my original HDD. This tool is great for disk image backups, you can even mount the image as a virtual drive in Windows Explorer if you need to retrieve files without imaging a disk. Unfortunately, I found that every time I imported the original HDD image into the SSD Macrium was also bringing the bad alignment from the original disk. I could not find a workaround for it, but at least I was happy to backup the original disk in case something bad happened.&lt;br /&gt;
&lt;br /&gt;
Looking for a (free) solution I found on some forums people recommending a trial version of a tool called Drive Snapshot. It didn&#39;t work for me for some reason, like Macrium this tool was reverting my SSD to the original bad alignment.&lt;br /&gt;
&lt;br /&gt;
Then I found something that finally worked, a free tool called XXClone (&lt;a href=&quot;http://www.xxclone.com/&quot;&gt;http://www.xxclone.com/&lt;/a&gt;). I thought it wouldn&#39;t work, it seems the latest version of this tool was released in 2007. I was surprised to find that the SSD was able to boot after XXClone, and better yet, the partition was still properly aligned!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. What are the tweaks one needs to apply on a XP machine with SSD?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Ok, so after cloning was completed I got the disk to boot on my laptop. Now it was time to tweak XP so it would work with the best performance and wouldn&#39;t decrease the life of my SSD.&lt;br /&gt;
&lt;br /&gt;
Below are the changes I made to the XP registry for it to work better with the SSD. If you want you can just copy/paste this block into a new file called &quot;SSD.reg&quot; and double-click it to apply the changes. While it worked fine for me I WON&#39;T BE LIABLE IF IT BREAKS YOUR COMPUTER, SO USE IT ON YOUR OWN RISK.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters]
&quot;EnablePrefetcher&quot;=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunction]
&quot;Enable&quot;=&quot;N&quot;

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\OptimalLayout]
&quot;EnableAutoLayout&quot;=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
&quot;LargeSystemcache&quot;=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
&quot;DisablePagingExecutive&quot;=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
&quot;ClearPageFileAtShutdown&quot;=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
&quot;NtfsDisable8dot3nameCreation&quot;=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
&quot;NtfsDisableLastAccessUpdate&quot;=dword:00000001

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer]
&quot;AlwaysUnloadDLL&quot;=dword:00000001
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4. Good comparison of SSDs x HDDs&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
On my previous post I presented some synthetic benchmarks taken with CrystalMark. That really doesn&#39;t mean much in terms of real life experience. To get a glimpse of how SSDs perform when compared to regular HDDs take a look at videos like these on YouTube:&lt;br /&gt;
- &lt;a href=&quot;http://www.youtube.com/watch?v=T_Jz7IMwBt4&amp;feature=related&quot;&gt;http://www.youtube.com/watch?v=T_Jz7IMwBt4&amp;feature=related&lt;/a&gt;&lt;br /&gt;
- &lt;a href=&quot;http://www.youtube.com/watch?v=96dWOEa4Djs&amp;feature=related&quot;&gt;http://www.youtube.com/watch?v=96dWOEa4Djs&amp;feature=related&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/6704768063784448697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/03/solid-state-drives-part-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/6704768063784448697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/6704768063784448697'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/03/solid-state-drives-part-2.html' title='Solid State Drives - Part 2'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-1686577655592133140</id><published>2010-02-21T00:05:00.000-08:00</published><updated>2012-09-06T08:38:22.795-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="electronics"/><category scheme="http://www.blogger.com/atom/ns#" term="performance"/><category scheme="http://www.blogger.com/atom/ns#" term="ssd"/><title type='text'>Solid State Drives - Part 1</title><content type='html'>I have been reading a lot about Solid State Drives (SSDs) for quite some time. SSDs are storage devices we can use to replace standard Hard Disk Drives&amp;nbsp;(HDDs), but offer less space and cost much much more. &lt;br /&gt;
&lt;br /&gt;
HDDs are based on mature (i.e. old) technology, basically consistinting of multiple spinning magnetic disks read and written by moving heads. Suppose you want to read a part of a certain file: the reading head must move to a specific track / cylinder and wait&amp;nbsp;until the data in the spinning disk passes just under the reading head. This procedure of&amp;nbsp;one physical move operation and then wait for the data is called &lt;em&gt;seek time&lt;/em&gt;. And as much it sounds complex, it is actually amazingly fast in modern HDDs - both the heads and the disks are freaking fast. It still, however, takes some time, and by relying on moving parts this whole mechanism is quite sensitive to impacts. When my external Maxtor 500GB USB harddrive fell on the table (yes, it didn&#39;t drop on the floor or anything, it just fell from vertical to horizontal position on the table!) I could only imagine its disks spinning at 7200 RPM with the writing heads scratching on everything just like an old vinyl LP! Poor HD, it is now on the HD heavens, you will be remembered!&lt;br /&gt;
&lt;br /&gt;
SSDs currently offer less space than HDDs, but since it has no moving parts (it is based on the same memory we use on digital cameras, small USB drives etc) it would still be &quot;alive&quot;, one point to SSDs here. But also, without heads and spinning disks etc SSDs run cooler, use less energy (great for laptops) and can get the data without any delay - the seek times are ridiculously fast! Or so the manufacturers say...&lt;br /&gt;
&lt;br /&gt;
It took me some time to find courage (i.e. $$$) to try it myself, but I finally got one on last year&#39;s Black Friday. Then I had to read even more to set it up properly. After 4 months using it every day in one of my work laptops I am certain that SSDs are to become mainstream in the next couple years, with falling prices and improved performance.&amp;nbsp;Though they may not replace HDDs anytime soon, it makes a lot of sense to setup a mixed system, with SSDs to store the operating system and programs, and HDDs to store music, photos, movies, backups etc.&lt;br /&gt;
&lt;br /&gt;
Now, if you are interested in more comprehensive reviews and bechmark comparisons, I am not dreaming of competing with sites like AnandTech (&lt;a href=&quot;http://anandtech.com/storage/showdoc.aspx?i=3747&amp;p=1&quot;&gt;http://anandtech.com/storage/showdoc.aspx?i=3747&amp;p=1&lt;/a&gt;), ARS Technica (&lt;a href=&quot;http://arstechnica.com/hardware/news/2009/03/anand-investigates-ssd-performance-shenanigans.ars&quot;&gt;http://arstechnica.com/hardware/news/2009/03/anand-investigates-ssd-performance-shenanigans.ars&lt;/a&gt;) or Tom&#39;s Hardware (&lt;a href=&quot;http://arstechnica.com/hardware/news/2009/03/anand-investigates-ssd-performance-shenanigans.ars&quot;&gt;http://arstechnica.com/hardware/news/2009/03/anand-investigates-ssd-performance-shenanigans.ars&lt;/a&gt;)&amp;nbsp;- but, given how complex and expensive SSDs currently are, I wanted to share my own perspective as a Java developer.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;# SSDs benefits:&lt;/strong&gt;&lt;br /&gt;
- read and write speeds are much better than HDDs&lt;br /&gt;
- more resistant to shocks due to no moving parts&lt;br /&gt;
- when its lifetime is over you can still read your data and transfer it to other storage devices - something that is not easily accomplished with HDDs in most cases&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;# SSD drawbacks:&lt;/strong&gt;&lt;br /&gt;
- still costly, but prices are going down&amp;nbsp;as new and better products are being offered&lt;br /&gt;
- less storage space&amp;nbsp;- unless you have lots of money to burn you may have to get used to work with less space in your laptop than what you have now&lt;br /&gt;
- many operating systems, especially older ones (XP, this is you!),&amp;nbsp;were not designed to use SSDs efficiently, causing sub-optimal performance and increased wear&lt;br /&gt;
- limited lifetime - due to technical limitations&amp;nbsp;in flash memory, over time it will stop being able to write new data. No one knows exactly how long each of these SSDs last. All manufactures provide some bogus unrealistic metrics, but if I had to guess it would not be much longer than 3 to 5 years&lt;br /&gt;
&lt;br /&gt;
I said I would not make benchmarks but just to give you a glimpse of how faster SSDs are I posted these two images below. In the left we have a 160GB Western Digital HDD, and in the right we have a 80GB Intel X-25M - both tests executed on a Dell Latitude D630 laptop.&lt;br /&gt;
&lt;br /&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPNzagBQpJ4Y_4UYjsxcF59PlspuCpDkHoZBejGmbl1YqO9GX5G68W0UeUuUjeR85IkSkRcyNYLaCQwY-qDr4tXNqVjxec1C2uVROOJXRuEpryzd7FPkaL8PTV7ZJeEpFYe4im1AB4Xyo/s1600-h/WD160GBHDD20091203-DellD630.JPG&quot; imageanchor=&quot;1&quot; style=&quot;display: block; clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; kt=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPNzagBQpJ4Y_4UYjsxcF59PlspuCpDkHoZBejGmbl1YqO9GX5G68W0UeUuUjeR85IkSkRcyNYLaCQwY-qDr4tXNqVjxec1C2uVROOJXRuEpryzd7FPkaL8PTV7ZJeEpFYe4im1AB4Xyo/s320/WD160GBHDD20091203-DellD630.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTwuzjJ2zJzBF0zJGdTsVo7IF5eUIa_4X75xq8nZ_fgyYgiEjzDSJTm1BxeLyjN0_Z3hjlTw6ituGXthbM01FWWqqVJV2-82etKe98KAXeXseEtrU_-4Kbac8BMHMYw6af6APaejeEXQw/s1600-h/Intel80GBSSD20091203-DellD630.png&quot; imageanchor=&quot;1&quot; style=&quot;display: block; clear: right; cssfloat: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;271&quot; kt=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTwuzjJ2zJzBF0zJGdTsVo7IF5eUIa_4X75xq8nZ_fgyYgiEjzDSJTm1BxeLyjN0_Z3hjlTw6ituGXthbM01FWWqqVJV2-82etKe98KAXeXseEtrU_-4Kbac8BMHMYw6af6APaejeEXQw/s320/Intel80GBSSD20091203-DellD630.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
The Seq row represents scenarios similar to when we are reading / writing big files (i.e. a DVD movie) to the disk. The 4K row is, however, far more significative for the overall disk performance - it represents reading / writing of small chunks of data to the disk, an activity&amp;nbsp;that is&amp;nbsp;far more common on a workstation throughout the day.&lt;br /&gt;
&lt;br /&gt;
Without getting into further details, I think it is pretty evident that SSDs are significantly faster than common HDDs. Should you buy one? Well it depends... but you can be sure it made sense for &lt;em&gt;me&lt;/em&gt; to buy it! To explain why I believe in that, these two are the biggest concerns people have with SSDs, and also the main reasons why I bought it:&lt;br /&gt;
&lt;br /&gt;
1.&amp;nbsp;&quot;SSDs are too costly&quot; -&amp;nbsp;I work with computers 8 to 10 hours per day. Every day. And when I am not working for my employer I am likely to be testing something for myself to learn new tricks. I always need to keep few resource hog applications up all the time (e.g. Oracle, Eclipse, virtual machines etc), which causes a lot of disk I/O. When I build a complex project with Ant or Maven it can take around 5 minutes - yeah, it seems fine, but sometimes I need to do that many many many times during the day, and&amp;nbsp;you can guess it adds up fast.&lt;br /&gt;
&lt;br /&gt;
Now, let us assume the SSD costs $200 and that my employer pays me&amp;nbsp;$40 / hour. If the SSD&#39;s improved performance saves me 15 minutes per day in project builds, application startups etc, it would take me only 1 month to &quot;recover&quot; my investment. And after that, it is just profit - &lt;em&gt;boom baby&lt;/em&gt;! Also, because I can now provide consistent faster results, especially on tasks associated with high disk I/O (e.g. build virtual machines, install Oracle etc), perhaps my boss will have good news on my next performance review and give me a raise! Yeah, I know I am dreaming now...&lt;br /&gt;
&lt;br /&gt;
2. &quot;SSDs will die after 5 or so&amp;nbsp;years&quot; - Ok, I wish you could see my face of &quot;not caring&quot;. Seriously, in 5 years I want to be able to buy a few petabytes of quantum-based storage for the same $200. By then I will just not care if a 80GB or 160GB SSD is not able to write anymore. Even its speed, which is great for todays standard, is going to be dog slow!&lt;br /&gt;
&lt;br /&gt;
Ok, now that we agree it makes sense in some cases (e.g. mine) to replace HDDs with SSDs, which one we should buy? Man, I wish things were simple... even though we have a gazillion companies selling these things, it is still something I would never ask my father to buy and install one by himself, and he plays with computers since I was 6 years old.&lt;br /&gt;
&lt;br /&gt;
First, you need to pick the right SSD - and like I said, there are too many companies selling them. And I can tell you, you REALLY do not want to pick one of the bad SSDs - many of them are worse than regular HDDs, and they get even worse over time! Since this is not a super consumer-friendly (i.e. plug-and-play-and-forget) kind of&amp;nbsp;device, your best bet is to stick with the top 2 vendors -&amp;nbsp;the ones with most modern technology and the biggest number of fellow &quot;SSD-ers&quot; to help you on forums if you ever need help. Currently I consider Intel and OCZ as the two top contenders in the SSD market, with Intel having the upper hand in value. OCZ&#39;s top model (Vertex LE) is somewhat faster than Intel&#39;s I-25M G2 but it is way more expensive - the 100GB costs around twice as much of what I paid for Intel&#39;s 80GB SSD! Sure, there are others (e.g. GSkill, SuperTalent etc), but at this time I think it is just safer to stick with one of these two. Kingston entered the market re-branding Intel drives, so apart from the niceties in the Kingston bundle they count as Intel hardware.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Intel has two interesting models, the I-25M&amp;nbsp;with 80GB&amp;nbsp;or 160GB. Both use Intel&#39;s own controller.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;
&lt;iframe align=&quot;center&quot; frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=B002IJA1EG&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&quot; style=&quot;align: center; height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;iframe align=&quot;center&quot; frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=B002IJA1EQ&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&quot; style=&quot;align: center; height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;OCZ has just too many different models and capacities, but the most popular ones seem to be the Vertex (Indilix controller) and&amp;nbsp;Sumit series (Samsung controller).&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;
&lt;iframe align=&quot;center&quot; frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=B001NPCTBO&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&quot; style=&quot;align: center; height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;iframe align=&quot;center&quot; frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://rcm.amazon.com/e/cm?t=thoforbea-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=B0029EV5B8&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&quot; style=&quot;align: center; height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
If you really want to jump in the SSD bandwagon I recommend you keep an eye for deals&amp;nbsp;on sites like &lt;a href=&quot;http://www.amazon.com/gp/product/B002IJA1EG?ie=UTF8&amp;amp;tag=thoforbea-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B002IJA1EG&quot;&gt;Amazon&lt;/a&gt;, &lt;a href=&quot;http://www.newegg.com/&quot;&gt;Newegg&lt;/a&gt;, &lt;a href=&quot;http://www.slickdeals.net/&quot;&gt;SlickDeals&lt;/a&gt;, &lt;a href=&quot;http://www.dealdump.com/&quot;&gt;DealDump&lt;/a&gt; etc (see my previous post about the Black Friday for a more deals sites)&amp;nbsp;for either one of these 3 models (Intel, Vertex and Summit) with the storage size your wallet can afford. These short-lived deals can make a good difference for your wallet, or even allow you to get a bigger drive for the same $$$.&lt;br /&gt;
&lt;br /&gt;
Ok, this post ended up quite longer than I expected. I will leave for my next post to describe how I installed, setup, cloned and tweaked&amp;nbsp;the SSD on my laptop, and why I picked Intel over other alternatives.</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/1686577655592133140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/02/solid-state-drives-part-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/1686577655592133140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/1686577655592133140'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/02/solid-state-drives-part-1.html' title='Solid State Drives - Part 1'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPNzagBQpJ4Y_4UYjsxcF59PlspuCpDkHoZBejGmbl1YqO9GX5G68W0UeUuUjeR85IkSkRcyNYLaCQwY-qDr4tXNqVjxec1C2uVROOJXRuEpryzd7FPkaL8PTV7ZJeEpFYe4im1AB4Xyo/s72-c/WD160GBHDD20091203-DellD630.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-1460305654559727451</id><published>2010-02-04T07:10:00.000-08:00</published><updated>2010-02-20T22:06:16.239-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="aspectj"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Java magic with AspectJ</title><content type='html'>Sometimes in our programming projects we can start things from scratch and implement them exactly how we want them. In these happy and creative times we so much have control of everything, if we don&#39;t like some of our own designs, APIs or mechanisms we can just go and change it, simple like that. Bad thing oftentimes we aren&#39;t so lucky, and we have to work on more constrained settings, using existing crappy code and macaroni architectures. In times like these we gotta be happy if we at least have the source code we are supposed to extend / use!&lt;br /&gt;
&lt;br /&gt;
Recently I had to work on a project whose a big chunk of the code was implemented by another team. And we were not supposed to change that code. But we were still somehow supposed to change the exception handling and logging for a certain kinds of Java classes on both &lt;i&gt;that&lt;/i&gt; codebase and our own custom code.&lt;br /&gt;
&lt;br /&gt;
Since we are on a pretty bad economy, instead of spending time to update my resume I thought of using this as an opportunity to test and learn AspectJ. It was a long shot but I read about it in the past, but never had a strong need to use it until now&amp;nbsp;and thought it was worth trying. The thing is, I was interested in it a while back but thought it would be just like other technologies, like Spring, Hibernate, JSF etc. Think about it, if you need to do real work and have only 2 or 3 days, can you do something with Spring + Hibernate + JSF from scratch if you never worked with it before? The learning curve for most of these things is just too high if you need quick results!&lt;br /&gt;
&lt;br /&gt;
Man, I am glad I tried AspectJ. I know its inner workings use some arcane technology (bytecode manipulation isn&#39;t for the faint of hearth), but it was SO much easier than I expected to hook my custom exception handling logic in the existing code I felt it was almost too easy to be true! :P&lt;br /&gt;
&lt;br /&gt;
Since I think other people may benefit from this mechanism let me share some basic but still useful information about it. In a nutshell AspectJ is an arcane technique to alter behavior of existing Java binaries. You can transparently inject logic into certain &quot;point cuts&quot;, like when a certain method name is executed, or when classes from a certain package are loaded etc etc. Few cool examples of what you can do with that are:&lt;br /&gt;
- a custom global logging mechanism to existing classes from a certain package (e.g. my.company.*)&lt;br /&gt;
- custom exception handling mechanism for certain exception types&lt;br /&gt;
- method profiling, for performance monitoring and tuning&lt;br /&gt;
- reduce LOC and complexity on your new code using aspects to handle multiple functional concerns transparently, outside your business classes&lt;br /&gt;
&lt;br /&gt;
There are 2 main ways of using AspectJ:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. Static-weaving:&lt;/b&gt; You can use AspectJ&#39;s ajc compiler to alter existing class files (either .java or .class), injecting your custom aspects and pack all changed files into a new JAR file. Then you put the new JAR in your classpath instead of the old classes (in most cases it may also work to just put the JAR first in the JVM&#39;s CLASSPATH). The Eclipse team divides this method as Compile-Time Weaving, when ajc compiles *.java into *.class injecting the aspects, and Post-Compile Weaving, when ajc injects aspects into pre-compiled class files. The performance penalty here is 0, it will be the same thing if you recompiled the original classes with your aspect&#39;s logic in it.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. Load-time weaving:&lt;/b&gt; This is where AspectJ&#39;s magic is more evident - your original classes and JARs are modified when they are loaded by the JVM! You do not have to replace any JARs, it will all be done dynamically. In most cases the performance overhead imposed by AspectJ to &quot;weave&quot; your aspects in the existing classes is negligible when loading the classes, but note that there will be no runtime overhead - once AspectJ injects your aspects it will not mess with that class again.&lt;br /&gt;
&lt;br /&gt;
If I have to choose between one of the 3 methods described above I would try Load-Time Weaving (LTW) first, because I think in most cases the performance overhead during class load times (note it is &quot;load times&quot; and not &quot;run time&quot;) should not be enough to overshadow the benefits of not having to bother updating JAR files every time the original class must be updated. If there is a significant performance hit due a broad scope of weaved classes then it is easy to move to one of the two static weaving methods described in item 1 above.&lt;br /&gt;
&lt;br /&gt;
Ok, enough talk, how can we actually use it? Let&amp;nbsp;me describe it with a very simple example that can serve as the basis for whatever else you want to do with AspectJ: (yeah, you guessed) a custom logging and performance monitoring mechanism!&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;# Dev env setup&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
1. Download and install AspectJ Development Tools (AJDT) for Eclipse. You can download it &lt;a href=&quot;http://www.eclipse.org/ajdt/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
2. Download my AspectJ examples project &lt;a href=&quot;http://sites.google.com/site/pedroburglin/thoughtsforbeansfiles/AspectJ.zip?attredirects=0&amp;amp;d=1&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
3. Extract the AspectJ examples project somewhere in your development environment and import it in Eclipse.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyWPKZl4Ft77FdX6aqtkCarNGXSU85gpLRcwm1P__5xVCiVvocLEsWRWN27frwMpeG2PdlZ2BAtx6E2TQ08beRsZ5-h9Lx4Zb34G_xVB5gU_NaWWtfxzOD42CgtFqqiCkRP0F0QfGw3hI/s1600-h/aspectj1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; kt=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyWPKZl4Ft77FdX6aqtkCarNGXSU85gpLRcwm1P__5xVCiVvocLEsWRWN27frwMpeG2PdlZ2BAtx6E2TQ08beRsZ5-h9Lx4Zb34G_xVB5gU_NaWWtfxzOD42CgtFqqiCkRP0F0QfGw3hI/s320/aspectj1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyJtHoCX1PQZbHVGYTfe_xN8Lp_IteulpN2wgsIfD2JVepNwYEqyInOsEvK1pb-pahWjqvOzpOF65JtR62Nqbj_dFhcakRit7pPKRynXHGvp4EvxC2YsPFTDst0MqAcvJSn5L612amYtw/s1600-h/aspectj2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; kt=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyJtHoCX1PQZbHVGYTfe_xN8Lp_IteulpN2wgsIfD2JVepNwYEqyInOsEvK1pb-pahWjqvOzpOF65JtR62Nqbj_dFhcakRit7pPKRynXHGvp4EvxC2YsPFTDst0MqAcvJSn5L612amYtw/s320/aspectj2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHivTNYGotFvzpfWdP1SWAph5XSIRRmT_zly4iCDSLrwkqy9FheF_MzIJw_bGxLvZMM_FEc5RGJKhb9CTJuizReQrK0l_YyMLVIC7CgCjGlvI6jlILkIXtQFRZfztbSJOVAeSuam5tWOc/s1600-h/aspectj3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;292&quot; kt=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHivTNYGotFvzpfWdP1SWAph5XSIRRmT_zly4iCDSLrwkqy9FheF_MzIJw_bGxLvZMM_FEc5RGJKhb9CTJuizReQrK0l_YyMLVIC7CgCjGlvI6jlILkIXtQFRZfztbSJOVAeSuam5tWOc/s400/aspectj3.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;# Project notes&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
1. &quot;test.Test.java&quot; is a simple test class. Their methods will be intercepted by AspectJ to transparently inject additional behavior without us having to change any code in Test.java.&lt;br /&gt;
&lt;br /&gt;
2. Our two aspects LogAspect.aj and MethodProfilerAspect.aj are located in package &quot;aspects&quot;.&lt;br /&gt;
&lt;br /&gt;
3. Eclipse with AJDT show us what aspects affecting each method in class Test.java in the Cross References view (we can see it in the screenshot above, in the bottom right). Just select a method in the Java editor and it will list the aspects in that view. Or select an aspect method in LogAspect.aj and it will list the intercepted methods in that view. This is pretty useful to control scoping, just keep in mind that AJDT will only list methods in its own classpath, and&amp;nbsp;it may be different (i.e. the aspects may catch more classes) when you deploy the aspect JAR in the app server.&lt;br /&gt;
&lt;br /&gt;
Without any aspects, this is the output of test.Test.java:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Test.method1
Test.method2
Test.method3
&lt;/pre&gt;&lt;br /&gt;
Enabling just LogAspect.aj we then get this output: &lt;br /&gt;
&lt;pre&gt;&lt;span style=&quot;color: #444444;&quot;&gt;[LogAspect] before public static void test.Test.main(java.lang.String[])
[LogAspect] param[0]=&#39;[Ljava.lang.String;@12ac982&#39;
[LogAspect] before public void test.Test.method1()&lt;/span&gt;
Test.method1
&lt;span style=&quot;color: #444444;&quot;&gt;[LogAspect] after public void test.Test.method1()
[LogAspect] before public java.lang.Object test.Test.method2()&lt;/span&gt;
Test.method2
&lt;span style=&quot;color: #444444;&quot;&gt;[LogAspect] after public java.lang.Object test.Test.method2()
[LogAspect] returned &#39;null&#39;
[LogAspect] before public java.lang.Object test.Test.method3(java.lang.String)
[LogAspect] param[0]=&#39;InputValue&#39;&lt;/span&gt;
Test.method3
&lt;span style=&quot;color: #444444;&quot;&gt;[LogAspect] after public java.lang.Object test.Test.method3(java.lang.String)
[LogAspect] returned &#39;ReturnValue&#39;
[LogAspect] after public static void test.Test.main(java.lang.String[])&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;
And finally, enabling just MethodProfilerAspect.aj we get this output:&lt;br /&gt;
&lt;pre&gt;&lt;span style=&quot;color: #444444;&quot;&gt;[MethodProfilerAspect] entering public static void test.Test.main(java.lang.String[])
[MethodProfilerAspect] entering public void test.Test.method1()&lt;/span&gt;
Test.method1
&lt;span style=&quot;color: #444444;&quot;&gt;[MethodProfilerAspect] exiting public void test.Test.method1() in 31ms
[MethodProfilerAspect] entering public java.lang.Object test.Test.method2()&lt;/span&gt;
Test.method2
&lt;span style=&quot;color: #444444;&quot;&gt;[MethodProfilerAspect] exiting public java.lang.Object test.Test.method2() in 62ms
[MethodProfilerAspect] entering public java.lang.Object test.Test.method3(java.lang.String)&lt;/span&gt;
Test.method3
&lt;span style=&quot;color: #444444;&quot;&gt;[MethodProfilerAspect] exiting public java.lang.Object test.Test.method3(java.lang.String) in 16ms
[MethodProfilerAspect] exiting public static void test.Test.main(java.lang.String[]) in 109ms&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;
If you look at the aspects&#39; source code you will see how little coding was required for that. But this is just the tip of the iceberg, there are many other cool things we can do with AspectJ, like dynamically change the return value of certain methods, catch,&amp;nbsp;modify&amp;nbsp;and re-throw Exceptions etc.&lt;br /&gt;
&lt;br /&gt;
So this is pretty powerful... but &quot;with power comes responsibility&quot; - you must be careful and not depend on too many aspects, or&amp;nbsp;your project&amp;nbsp;could become a maintenance nightmare!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;# Additional interesting articles about AspectJ&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Pointcuts and Advices: &lt;a href=&quot;http://www.eclipse.org/aspectj/doc/next/adk15notebook/ataspectj-pcadvice.html&quot;&gt;http://www.eclipse.org/aspectj/doc/next/adk15notebook/ataspectj-pcadvice.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Join Points and Pointcuts: &lt;a href=&quot;http://www.eclipse.org/aspectj//doc/next/progguide/language-joinPoints.html&quot;&gt;http://www.eclipse.org/aspectj//doc/next/progguide/language-joinPoints.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/1460305654559727451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/02/java-magic-with-aspectj.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/1460305654559727451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/1460305654559727451'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2010/02/java-magic-with-aspectj.html' title='Java magic with AspectJ'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyWPKZl4Ft77FdX6aqtkCarNGXSU85gpLRcwm1P__5xVCiVvocLEsWRWN27frwMpeG2PdlZ2BAtx6E2TQ08beRsZ5-h9Lx4Zb34G_xVB5gU_NaWWtfxzOD42CgtFqqiCkRP0F0QfGw3hI/s72-c/aspectj1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-5267538186806793209</id><published>2009-12-18T18:30:00.000-08:00</published><updated>2012-09-06T08:38:53.368-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="general"/><category scheme="http://www.blogger.com/atom/ns#" term="shopping"/><title type='text'>Black friday madness</title><content type='html'>November, sweet november... month of the most important of holidays on Earth - the Black Friday! When all geeks can join in a mad rat race for the best deals, from clothing to electronic gadgets. For about 3 days people get in lines throughout the night, take enough red bull and 5 hour energetic drinks to glow green in the dark just to save some dough for the holidays. This kind of sacrifice may sound stupid for those who never experienced it, but since I came here to the US I can say this is the funniest holidays ever. Which other holiday can we find 47&#39; HDTVs for less than half the regular price? Or get into a Walmart of Target store and see people fighting over cheap doorbuster deals? And hordes of geeks fighting online and killing web servers with DOS attacks trying to purchase half-price electronics? It is not for the faint of hearth, that is for sure!&lt;br /&gt;
&lt;br /&gt;
This has been my approach during the past Black Fridays:&lt;br /&gt;
1. Monitor &quot;official&quot; BF sites for leaked ads weeks before the Black Friday - the ones I usually look into are:&lt;br /&gt;
&lt;br /&gt;
• &lt;a href=&quot;http://bfads.net/&quot;&gt;http://bfads.net/&lt;/a&gt;&lt;br /&gt;
• &lt;a href=&quot;http://www.blackfriday.info/&quot;&gt;http://www.blackfriday.info/&lt;/a&gt;&lt;br /&gt;
• &lt;a href=&quot;http://www.black-friday.net/&quot;&gt;http://www.black-friday.net/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
2. Based on the leaked ads, make a list of your targets - when the time comes there is no room for you to decide what to buy, if you hesitate you lose the deal!&lt;br /&gt;
&lt;br /&gt;
2. Create a webmail account just for deals and other junk - apply for email lists on every store you can think of. Stores sometimes send good deals in its email lists and this is sometimes the fast way to score it! Just make sure you create a &quot;junk&quot; email account to use only for that purpose or set rules in your existing email client (webmails like hotmail and gmail are good at that too) to move all emails from these companies to a separate folder. Some stores I get deals via email:&lt;br /&gt;
&lt;br /&gt;
• Newegg - &lt;a href=&quot;http://www.newegg.com/&quot;&gt;http://www.newegg.com/&lt;/a&gt;&lt;br /&gt;
• Amazon - &lt;a href=&quot;http://www.amazon.com/&quot;&gt;http://www.amazon.com/&lt;/a&gt;&lt;br /&gt;
• BestBuy - &lt;a href=&quot;http://www.bestbuy.com/&quot;&gt;http://www.bestbuy.com/&lt;/a&gt;&lt;br /&gt;
• Target - &lt;a href=&quot;http://www.target.com/&quot;&gt;http://www.target.com/&lt;/a&gt;&lt;br /&gt;
• CostCo - &lt;a href=&quot;http://www.costco.com/&quot;&gt;http://www.costco.com/&lt;/a&gt;&lt;br /&gt;
• TigerDirect - &lt;a href=&quot;http://www.tigerdirect.com/&quot;&gt;http://www.tigerdirect.com/&lt;/a&gt;&lt;br /&gt;
• CompUSA - &lt;a href=&quot;http://www.compusa.com/&quot;&gt;http://www.compusa.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
And so much more... some stores also give you discount coupons when you signup, so make sure you do not overlook it.&lt;br /&gt;
&lt;br /&gt;
3. Monitor deal sites and forums for the best deals - the ones I use the most are:&lt;br /&gt;
&lt;br /&gt;
• DealDump - &lt;a href=&quot;http://www.dealdump.com/&quot;&gt;http://www.dealdump.com/&lt;/a&gt;&lt;br /&gt;
• SlickDeals HotDeals forum - &lt;a href=&quot;http://slickdeals.net/forums/forumdisplay.php?f=9&quot;&gt;http://slickdeals.net/forums/forumdisplay.php?f=9&lt;/a&gt;&lt;br /&gt;
• FatWallet - &lt;a href=&quot;http://www.fatwallet.com/&quot;&gt;http://www.fatwallet.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
* - make sure you also follow the BF forum at SlickDeals - you need all the information as fast as possible!&lt;br /&gt;
&lt;br /&gt;
4. And lastly, refrain from sleeping. This is key - if you sleep during the Black Friday week you WILL lose good deals. If you sleep during Thanks Giving / Black Friday / Saturday you will lose the BEST deals! In times like these you can&#39;t rely on a cup of coffer, you need something &quot;military grade&quot; - in times like these 5 Hours Extra is your best friend! :D&lt;br /&gt;
&lt;br /&gt;
5. Some brick-and-mortar deals are inviting - but think wisely before stepping into the streets. Many times the online stores match or even top the deal. Also, shopping online you can easily cover dozens of stores - while other people are in line for one single store!&lt;br /&gt;
&lt;br /&gt;
I hope you already figured I made a few jokes so far, I am not that crazy to spend 8 hours in line during a freezing night like some people to score a TV or laptop for peanuts. But for those who still think I am a materialistic person, I guess that may be true... but I have to say that most of the Black Friday fun is actually in digging and &quot;fighting&quot; (by fighting I mean trying to get your order thru, not actually fighting a dude over a TV!) for deals than actually spending tons of cash on stuff. And if you are picky with what you buy you do not need to spend a lot on stuff, spend good time with friends - I have had lots of good times with the wife and a friend on Black Fridays - and get out of it with good stuff you can use.&lt;br /&gt;
&lt;br /&gt;
I just wish I had the idea to write this post BEFORE this years&#39; BF... oh well, perhaps no one will notice if I copy / paste it for next year&#39;s BF hehehe :D</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/5267538186806793209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2009/12/black-friday-madness.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/5267538186806793209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/5267538186806793209'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2009/12/black-friday-madness.html' title='Black friday madness'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-1435974773082804920</id><published>2009-12-13T18:00:00.000-08:00</published><updated>2010-03-09T10:36:29.509-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="oracle"/><title type='text'>Setup Oracle&#39;s SGA size</title><content type='html'>I always work with Oracle databases on my laptop. I prefer to install them myself so I can tune it to run without using all my memory. Also, instead of installing Oracle directly on my laptop I always do so on virtual machines because this way it is easier to share my environments with my colleagues and to setup individual sandboxes for each project I am working on.&lt;br /&gt;
&lt;br /&gt;
When I have to work with databases installed by others I found I usually have to decrease how much memory is assigned to Oracle. The scripts below describe how to do just that.&lt;br /&gt;
&lt;br /&gt;
&amp;#8226; update Oracle&#39;s SGA size:&lt;br /&gt;
&lt;br /&gt;
-- show current SGA size&lt;br /&gt;
select sum(value)/1024/1024 from v$sga;&lt;br /&gt;
&lt;br /&gt;
-- set SGA target size to 256MB&lt;br /&gt;
alter system set sga_target = 256M scope=both;&lt;br /&gt;
&lt;br /&gt;
-- list buffer size&lt;br /&gt;
select current_size from v$buffer_pool;&lt;br /&gt;
&lt;br /&gt;
-- list all pools&lt;br /&gt;
select pool, sum(bytes)/1024/1024 Mbytes from v$sgastat group by pool;&lt;br /&gt;
&lt;br /&gt;
-- additional Oracle memory settings:&lt;br /&gt;
-- make sure you don&#39;t setup SGA to the same or higher size than MEMORY&lt;br /&gt;
alter system set memory_max_target = 512M scope=spfile;&lt;br /&gt;
alter system set memory_target = 512M scope=spfile;&lt;br /&gt;
alter system set sga_max_size = 256M scope=spfile;&lt;br /&gt;
alter system set sga_target = 256M scope=spfile;&lt;br /&gt;
-- you will need to restart Oracle for the changes to take effect (e.g. dbshut and dbstart)</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/1435974773082804920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2009/12/setup-oracles-sga-size.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/1435974773082804920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/1435974773082804920'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2009/12/setup-oracles-sga-size.html' title='Setup Oracle&#39;s SGA size'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-2654942379157326281</id><published>2009-12-11T23:07:00.000-08:00</published><updated>2012-09-06T08:39:27.398-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="design"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="UML"/><title type='text'>UML diagram editors</title><content type='html'>From time to time people ask me to write UML diagrams. Sometimes it makes sense, but oftentimes I could be better off using my time on something else, like writing code, prototyping etc. Please don&#39;t get me wrong, I am not against good documentation or UML per se, but many people like to focus too much time on pretty documents with beautiful colorful diagrams while others, more pragmatic ones, prefer instead to have a system built on time, with quality and running in production. I like to think of myself as part of the &quot;pragmatic&quot; group.&lt;br /&gt;&lt;br /&gt;I KNOW documentation is important, it can make the difference of people using your software or not, or your development team implementing what your client actually needs instead of something completely outlandish. That is not my point. My point for this post is that we should generally try to stick with what we are good on, but sometimes we just dont have a choice and have to work on something we KNOW isn&#39;t one of our strong skills. I thought PMs were supposed to limit such times, making sure tasks are assigned to the best resources based on their talents, but from my experience this is not exactly how it generally works. Not necessarily because of the PMs, sometimes they just don&#39;t have better resources to tackle the job.&lt;br /&gt;&lt;br /&gt;But regardless what I think, as much I try to avoid wasting a lot of time writing documents that no one will read, sometimes I have no choice and just have to do it. I guess that is why they call it work, we can&#39;t like all that we do for a living. But what I can do is to try to finish it as quickly as possible, while still developing good quality documents. Which bring us to graphical design talent... and this is one area of talent that, I must confess, I am not especially gifted. I&#39;ve worked with people born with natural talent for graphical design, they could use pretty much any tool and come up in few minutes with amazing diagrams or images or web site layouts etc. Think like someone opening Microsoft Paint and drawing a Mona Lisa in few minutes - yeah, I know, that was a stretch, but the point is, this is one of the things in life that you are either born with or you are not. Sure you can learn techniques to improve, but your true potential is more or less apparent from the early start.&lt;br /&gt;&lt;br /&gt;Now the question is, how someone who&#39;s not a superfast gifted designer can create decent looking diagrams fast? My answer is &quot;with especialized tools that format most things for you and you just have to enter the data&quot;. Think something a bit more especialized than Microsoft Visio. I can spend hours on Visio, moving lines and boxes, changing colors etc, and no matter what I do on it it will always end up looking like a pig. Before people say I did not try enough I can say that I tried learning from articles and books about it, but after some time I just accepted that I&#39;m better of spending my time designing server-side frameworks, integrating enterprise applications, working with web services etc than creating striking-looking diagrams and working with web design. Which is actually quite liberating, to accept that I should leave such things for other people more gifted than myself while focusing on what, I like to think, am good on and like a lot to do. We should not try to do everything, but to focus on what we LIKE to do, right?&lt;br /&gt;&lt;br /&gt;So what can I do when I need to write diagrams so they at least look decent and describe the concepts and ideas I am trying to document? And are finished quick so I can move on to other tasks? Well... tools that automatically generate the diagrams for me is a good start, I would think.&lt;br /&gt;&lt;br /&gt;For example, NetBeans can automatically generate a UML class diagram from your source code. The generated diagram will be complex and unless you do some additional editing to filter out some of the noise no developer would ever waste time reading it, they would obviously prefer following the source code instead (assuming your source code is decently written - it is, right??), but it does look decent to see on a document or presentation. For those who dont know, it would appear that you put a lot of time on it... yeah, right! :P&lt;br /&gt;&lt;br /&gt;Ok, so NetBeans is fine... but most times when I need to write UML diagrams I still do not have the classes yet, I am still discussing the solution design with a team. So I need something more flexible than that. But not too flexible that I would have to spend ages moving lines and boxes here and there! That is when I found a ridiculously small application called Quick Sequence Diagram Editor (QSDE).&lt;br /&gt;&lt;br /&gt;Different than most similar tools, in QSDE instead of moving graphical elements around with your mouse you actually PROGRAM the sequence diagrams! I initially thought it was stupid and it would take much longer to write diagrams this way than just using the mouse... man I was wrong, and I am glad I kept trying to use this little gem. Now I can draw sequence diagrams real fast using QSDE.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjePBieNj3zY7O1S_8WkGZXzemR5rsAC-tltm4HSTLjuQKc_cX_jVuIcd22DJUPA-R66VdkoIpySp88sWX8pknnbqWE1UC9SJeAP1XhHCv9WdAlfVswYt2XXb4ee0BYua0K5rdSaqD9aPA/s1600-h/UML1.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 318px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjePBieNj3zY7O1S_8WkGZXzemR5rsAC-tltm4HSTLjuQKc_cX_jVuIcd22DJUPA-R66VdkoIpySp88sWX8pknnbqWE1UC9SJeAP1XhHCv9WdAlfVswYt2XXb4ee0BYua0K5rdSaqD9aPA/s320/UML1.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5414195192338726674&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Another decent UML tool that I used for other UML diagrams than sequence is StarUML. It is free and pretty decent for class diagrams, check it out.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAAxXYKtm-fNLJDlnYe5GPTfJbHPlDoteMUVQitwdjV_BVXQgB5_klG3QgtnG58aqRxM3KUyDRzyA_YB4Kkks_m91RAi-HoBibyp-3DtOcdFrRGFD3-HIyXRWw8LUSGRL0UdAdXGubxR0/s1600-h/UML2.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 188px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAAxXYKtm-fNLJDlnYe5GPTfJbHPlDoteMUVQitwdjV_BVXQgB5_klG3QgtnG58aqRxM3KUyDRzyA_YB4Kkks_m91RAi-HoBibyp-3DtOcdFrRGFD3-HIyXRWw8LUSGRL0UdAdXGubxR0/s320/UML2.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5414195195280781282&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is just a simple (and lame) diagram made with StarUML&lt;br /&gt;&lt;br /&gt;# References:&lt;br /&gt;&lt;br /&gt;&amp;#8226; StarUML - &lt;a href=&quot;http://staruml.sourceforge.net/&quot;&gt;http://staruml.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;#8226; Quick Sequence Diagram Editor - &lt;a href=&quot;http://sourceforge.net/projects/sdedit/&quot;&gt;http://sourceforge.net/projects/sdedit/&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/2654942379157326281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2009/11/uml-diagram-editors.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/2654942379157326281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/2654942379157326281'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2009/11/uml-diagram-editors.html' title='UML diagram editors'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjePBieNj3zY7O1S_8WkGZXzemR5rsAC-tltm4HSTLjuQKc_cX_jVuIcd22DJUPA-R66VdkoIpySp88sWX8pknnbqWE1UC9SJeAP1XhHCv9WdAlfVswYt2XXb4ee0BYua0K5rdSaqD9aPA/s72-c/UML1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-6224989079721063668</id><published>2009-11-21T15:22:00.000-08:00</published><updated>2012-09-06T08:37:25.775-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="maven"/><title type='text'>Setting up a Maven repository proxy with Nexus</title><content type='html'>&lt;span style=&quot;font-weight:bold;&quot;&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hey, quick hint: if you need quick get-to-the-point instructions on how to setup a free Maven repository proxy you can skip this section and scroll down to the next one. But, if you have some time to spare and are curious to know why one would need to setup his own Maven repository proxy, please bear with me a little and keep reading...&lt;br /&gt;&lt;br /&gt;It should be a bit more than 3 years since I stopped using Ant in favor of Maven to automate builds, tests etc. After years using Ant for both personal and professional projects I got into a (then) new project where the dev team was using Maven. By that time I had already read about Maven and tried it briefly on minor prototypes just to evaluate it against Ant. In those first contacts it just seemed much more complicated than Ant, everything was considerably different etc.&lt;br /&gt;&lt;br /&gt;Like I said, in this new project other analysts had already set it up the whole development environment, and since I had other pressing issues to focus on I did not learn much about it. The guys who set it up were amazing technical analysts, they picked excellent tools (they used AntHill Pro, among some others) and had a deep understanding of best practices for build management, test automation, quality control etc, and because of that I never had to trouble with nor had to deal with Maven or the build process myself.&lt;br /&gt;&lt;br /&gt;Then, about another 1 and a half years ago, I began as the leading developer (and pretty much THE ONLY developer, designer, architect etc, I should add) on another project I wanted to stick with Maven. I guess I just got spoiled with things like automated dependencies download and the ability to integrate with such amazing apps like Hudson and Trac. Finally, the fact that AppFuse is heavily based on Maven also helped me made my mind.&lt;br /&gt;&lt;br /&gt;A quick note on AppFuse: it is amazing how simple AppFuse makes it for us to kick-start our solutions rather than spend time on mundane things like defining your project hierarchy, setup Maven, Spring, Hibernate etc, but it comes with the price of being another level of abstraction – it help make things work even if you don&#39;t quite know how they work. Based on that, my advice is to use it or a similar super framework to save you time on redundant tasks but do take the time to learn how it does what it does!&lt;br /&gt;&lt;br /&gt;So, long story short, that project I was working almost by myself grew, it got more developers and made its way to a production environment. During one of our code drops I got a message from the release manager that the build server was not able to build the application, something to do with a missing dependency. Well, yeah, if you ever worked with Maven you know one of the first things you learn is that it can download dependencies for you from the Internet. But this time it did not work. I built it locally, and it worked fine, no problem. I then removed my Maven repository, and that is when I got the exact same error we got in the build server – Maven was unable to contact one of the public Maven repositories the project depended on. &lt;br /&gt;&lt;br /&gt;It is funny that I remember speaking to the build manager couple weeks before that incident that we should setup our project&#39;s own Maven repository to avoid something like that. But, as much as an outage of a Maven public repository is to be expected and therefore should be prevented, since I had never seen it before it got a very low priority in our To-Do list.&lt;br /&gt;&lt;br /&gt;I found a quick fix for that by simply pointing the build server to my personal Maven repository, which had all required dependencies and did not need to download anything from the internet. So, in the end, there was no big harm other than me and the build manager having to spend about one hour to figure it out, upload files to build server and finally get the build completed.&lt;br /&gt;&lt;br /&gt;What we can learn from this story? I don&#39;t know about you, but I learned that if we blindly depend on things beyond our control, as stable as they look like or use to be, they will fail us on unpredictable times.&lt;br /&gt;&lt;br /&gt;It is my responsibility to shield my project from any outages on systems I do not control. The same way I always build simulators and stubs for external systems I must do something similar for external Maven repositories. And that is where a local project Maven repository fits in.&lt;br /&gt;&lt;br /&gt;A Maven repository proxy is just a simple mechanism that acts as a mediator between your Maven-based applications and the Maven public repositories in the internet. It gives you control over your application dependencies – say, if you built your application yesterday with success, and assuming then that your Maven repository proxy is up to date, the public Maven repositories can burn  and you will still be able to build your application. I hope they don&#39;t actually burn though, that was just an expression to make the point! Also, since you are not downloading hundreds of JAR files over the internet but from a local server, it may even improve your build times considerably.&lt;br /&gt;&lt;br /&gt;So, which one to use? I tried 3 or 4 different Maven repository proxies and found Nexus to be the best one of the bunch, on my humble opinion. It could not be much simpler to install and set it up, and once you do you can forget about it, it just works!&lt;br /&gt;&lt;br /&gt;If you are one of my 2 or 3 readers who might had the patience to get to this point with me, be happy this section is over. I will describe in the section below how easy it is to install and setup Nexus as your free-as-in-beer local Maven repository proxy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;To-the-point Nexus installation and configuration&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nexus is released both as a stand-alone server and as a standard WAR file. This section will describe how to install the WAR file release only.&lt;br /&gt;&lt;br /&gt;To install Nexus as a WAR file just follow these instructions:&lt;br /&gt;&lt;br /&gt;1. You need a servlet container to install Nexus WAR file. While any recent application server should work just fine I only tested it with Tomcat 6.0.20. If you do not have a servlet container I recommend you to download and install the latest stable release of Tomcat 6.x into your build server. For the purposes of this article I will assume you have Tomcat installed in $TOMCAT_ROOT (wherever it is) running on 127.0.0.1, port 8080. Make sure you replace IP address, port and paths on the next steps based on your environment.&lt;br /&gt;&lt;br /&gt;2. Download the Nexus WAR file – usually I would recommend you to download the latest stable version but I had some trouble with Nexus 1.4.0 on Tomcat. The previous version, 1.3.6, works fine though and you can get it directly from this URL: &lt;a href=&quot;http://nexus.sonatype.org/downloads/older/nexus-webapp-1.3.6.war&quot;&gt;http://nexus.sonatype.org/downloads/older/nexus-webapp-1.3.6.war&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. Rename the WAR file to nexus.war – this will make your Nexus portal URL much simpler.&lt;br /&gt;&lt;br /&gt;4. With your Tomcat running, copy or upload the file nexus.war into “$TOMCAT_ROOT/webapps” - this should deploy Nexus in just few seconds, as shown in the image below.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ2sO2UYJIByBjZlyP0XQNfS65obyLatGRB52G5st859lrXOA_LrlUryzDtvU0Jp44PscHN0CW38Mj8dp1LGX220vhZ1t6OfBh-2PxzmXbQRgw44CBBVgWOI8dEXQcah4gG8BwdgMBtLA/s1600/1.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 162px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ2sO2UYJIByBjZlyP0XQNfS65obyLatGRB52G5st859lrXOA_LrlUryzDtvU0Jp44PscHN0CW38Mj8dp1LGX220vhZ1t6OfBh-2PxzmXbQRgw44CBBVgWOI8dEXQcah4gG8BwdgMBtLA/s320/1.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5406702427162521698&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If everything worked you should now be able to access Nexus web console in this URL: &lt;a href=&quot;http://127.0.0.1:8080/nexus/&quot;&gt;http://127.0.0.1:8080/nexus/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9E8tK5A-Ny8t-E_RcqljEcw1PdAcgkB3JyZOdWqlCb5tssRy7_d2N-iFl2E5NmGie9h-JOvLgjN3ajp-e29SxlOxMBRsig8nl95EROwef4_28xwQbrgTmns2qu52pV2jfJvL4HU7NLhQ/s1600/2.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 179px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9E8tK5A-Ny8t-E_RcqljEcw1PdAcgkB3JyZOdWqlCb5tssRy7_d2N-iFl2E5NmGie9h-JOvLgjN3ajp-e29SxlOxMBRsig8nl95EROwef4_28xwQbrgTmns2qu52pV2jfJvL4HU7NLhQ/s320/2.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5406702434397274498&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Click on Repositories link in the left menu to see which repositories are available and their URLs, as shown in the figure below. Nexus comes pre-configured with the most popular repositories including Maven Central, Codehaus and Apache. If your application requires only the most popular libraries the odds are that you may not need to change Nexus&#39; configurations at all. If that is the case, the only thing you need to do is to edit your application&#39;s pom.xml to use Nexus repository paths (e.g. “http://127.0.0.1:8080/nexus/content/repositories/central/”). If you want to confirm exactly where each one of these URLs are pointing to or if you need to include new repositories you need to log in as an administrator.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifS_sxWoSLQEl1qY6QDKGNYatJchS0dYjU4NPpZtW5Dmpr4MBYYJA17ifDyTrVqBxHKowtTbhx8o5yXm2TBO0P_5442duDQ8OFZ5ZCgqEizYk4z_tzVhEiAZ_tZ3cOjsKQW4wPxwlGKQU/s1600/3.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 179px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifS_sxWoSLQEl1qY6QDKGNYatJchS0dYjU4NPpZtW5Dmpr4MBYYJA17ifDyTrVqBxHKowtTbhx8o5yXm2TBO0P_5442duDQ8OFZ5ZCgqEizYk4z_tzVhEiAZ_tZ3cOjsKQW4wPxwlGKQU/s320/3.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5406702438731199410&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To log in as an administrator and configure Nexus click on the link “Log In” on the top-right portal. It will ask for credentials, to witch you can use admin / admin123.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI0v8GpxUkossXK4K4og64yw8AqDp8zeIjOyhMdq6Lr7HtlFg8_jVA6y4gknZU5_Hpp7zp6VLt2EGxncimVgbd1qzp99ZKKE-8cPAC4vp2qmaGxqVoRwcwMN8ZCxO4rTaBpbuFSn4pt7U/s1600/4.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 179px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI0v8GpxUkossXK4K4og64yw8AqDp8zeIjOyhMdq6Lr7HtlFg8_jVA6y4gknZU5_Hpp7zp6VLt2EGxncimVgbd1qzp99ZKKE-8cPAC4vp2qmaGxqVoRwcwMN8ZCxO4rTaBpbuFSn4pt7U/s320/4.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5406702441581446098&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once you log in, click on Repositories and select “Maven Central”. As an ADMIN you will see new tabs, click on “Configuration”. In this screen you will find that URL “http://127.0.0.1:8080/nexus/content/repositories/central/” is associated with a remote repository URL “http://repo1.maven.org/maven2/”, the Maven Central public repository. So, in essence, when your application tries to download a library from the Nexus URL that is not in your Nexus repository, Nexus will download it from Maven Central, but the next time it will not need to, since Nexus will keep the library in its local repository.&lt;br /&gt;&lt;br /&gt;For my particular project I had to setup 2 or 3 additional repositories in Nexus. That was also easy, I just “cloned” one of the existing entries in the Nexus web console. I then updated the repositories section on my project&#39;s pom.xml to point to the repository paths listed in Nexus&#39; web console. I was amazed my project got built successfully the first time, it was so simple even my humble self got it right the first time!&lt;br /&gt;&lt;br /&gt;If you tried this but found that I missed some important step this may help - there is much more detailed information on how to install Nexus here: &lt;a href=&quot;http://www.sonatype.com/books/nexus-book/reference/install-sect-as-a-war.html&quot;&gt;http://www.sonatype.com/books/nexus-book/reference/install-sect-as-a-war.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;References&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;#8226; Nexus: &lt;a href=&quot;http://nexus.sonatype.org/&quot;&gt;http://nexus.sonatype.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;#8226; AppFuse: &lt;a href=&quot;http://appfuse.org/&quot;&gt;http://appfuse.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;#8226; AntHill Pro: &lt;a href=&quot;http://www.anthillpro.com/&quot;&gt;http://www.anthillpro.com/&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/6224989079721063668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2009/11/setting-up-intranet-maven-repository.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/6224989079721063668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/6224989079721063668'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2009/11/setting-up-intranet-maven-repository.html' title='Setting up a Maven repository proxy with Nexus'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ2sO2UYJIByBjZlyP0XQNfS65obyLatGRB52G5st859lrXOA_LrlUryzDtvU0Jp44PscHN0CW38Mj8dp1LGX220vhZ1t6OfBh-2PxzmXbQRgw44CBBVgWOI8dEXQcah4gG8BwdgMBtLA/s72-c/1.PNG" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-3571198738038121750</id><published>2009-11-06T11:35:00.000-08:00</published><updated>2012-09-06T08:39:54.018-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="oracle"/><title type='text'>Oracle database quick reference</title><content type='html'>Similar to the Unix/Linux quick reference post, this one lists multiple snippets about the Oracle database. Feel free to drop a comment with your own Oracle &quot;gems&quot;.&lt;br /&gt;
&lt;br /&gt;
# how to list all triggers affecting a table&lt;br /&gt;
select * from all_triggers where triggering_event like &#39;%INSERT%&#39; and table_name=&#39;PUT_TABLE_NAME_HERE&#39;;&lt;br /&gt;
&lt;br /&gt;
# if you get error ORA-24170 when dropping an user see the article below&lt;br /&gt;
drop user myuser cascade;&lt;br /&gt;
ORA-24170: MYUSER.SOME_QUEUE_NAME is created by AQ, cannot be dropped directly&lt;br /&gt;
read: http://forums.oracle.com/forums/thread.jspa?messageID=1184946&lt;br /&gt;
&lt;br /&gt;
# set password for sys/system oracle users&lt;br /&gt;
ALTER USER SYSTEM IDENTIFIED BY password;&lt;br /&gt;
ALTER USER SYS IDENTIFIED BY password;&lt;br /&gt;
&lt;br /&gt;
# create a full export of an Oracle database:&lt;br /&gt;
exp system/password file=database.dmp full=y statistics=none&lt;br /&gt;
&lt;br /&gt;
# import an Oracle database dump file:&lt;br /&gt;
imp USERNAME/PASSWORD@ORACLE_SID file=database.dmp full=y&lt;br /&gt;
imp USERNAME/PASSWORD@ORACLE_SID file=database.dmp fromuser=ORIGINAL_USER touser=NEW_USER grants=n&lt;br /&gt;
&lt;br /&gt;
# run Oracle imp as a SYSDBA:&lt;br /&gt;
imp \&#39;/ as sysdba\&#39; file=database.dmp&lt;br /&gt;
&lt;br /&gt;
# purge and disable Oracle 10g recyclebin tables:&lt;br /&gt;
-- login as sysdba&lt;br /&gt;
purge dba_recyclebin; &lt;br /&gt;
alter system set recyclebin = OFF scope=both;&lt;br /&gt;
&lt;br /&gt;
# list tables with a field with a given name:&lt;br /&gt;
select * from all_tab_columns where column_name like &#39;%PUT_A_COLUMN_NAME_HERE%&#39;;&lt;br /&gt;
&lt;br /&gt;
# rebuild all Oracle indexes for performance tuning:&lt;br /&gt;
select &#39;ALTER INDEX &#39; || OWNER || &#39;.&#39; || OBJECT_NAME || &#39; REBUILD;&#39; from dba_objects where status = &#39;VALID&#39; and object_type in (&#39;INDEX&#39;)&lt;br /&gt;
&lt;br /&gt;
# improve indexes performance:&lt;br /&gt;
select &#39;analyze table &#39; || OWNER || &#39;.&#39; || object_name || &#39; compute statistics;&#39; from dba_objects where object_type in (&#39;TABLE&#39;);&lt;br /&gt;
&lt;br /&gt;
# Oracle database performance optimizer - run it every time we have significant changes on a database schema&lt;br /&gt;
sqlplus /nolog&lt;br /&gt;
connect system/&lt;password&gt;&lt;br /&gt;   begin&lt;br /&gt;       dbms_stats.gather_schema_stats (&lt;br /&gt;       ownname=&amp;gt;&#39;PUT_SCHEMA_NAME_HERE&#39;,&lt;br /&gt;       degree=&amp;gt;3);&lt;br /&gt;       end;&lt;br /&gt;   /&lt;br /&gt;   quit;&lt;br /&gt; &lt;br /&gt;# compile all invalid objects in Oracle:&lt;br /&gt;The best way to compile all database objects that are invalid is to use a script in the $ORACLE_HOME/rdbms/admin directory named utlrp.sql. This script finds all objects in the data dictionary that are invalid and compiles them. This script is typically mentioned in patch notes but you can use it any time a schema change occurs.&lt;br /&gt;I also included other alternative approaches just in case.&lt;br /&gt; &lt;br /&gt;1. best way:&lt;br /&gt;sqlplus system/password&lt;br /&gt;@$ORACLE_HOME/rdbms/admin/utlrp.sql&lt;br /&gt; &lt;br /&gt;2. by schema:&lt;br /&gt;select &#39;ALTER &#39; || OBJECT_TYPE || &#39; &#39; || OWNER || &#39;.&#39; || OBJECT_NAME || &#39; COMPILE;&#39; from dba_objects where status = &#39;INVALID&#39; and object_type in (&#39;PACKAGE&#39;,&#39;FUNCTION&#39;,&#39;PROCEDURE&#39;) and owner=&#39;PUT_SCHEMA_NAME_HERE&#39;&lt;br /&gt;union&lt;br /&gt;select &#39;ALTER PACKAGE &#39; || OWNER || &#39;.&#39; || OBJECT_NAME || &#39; COMPILE BODY;&#39; from dba_objects where status = &#39;INVALID&#39; and object_type in (&#39;PACKAGE BODY&#39;) and owner=&#39;PUT_SCHEMA_NAME_HERE&#39;;&lt;br /&gt;set pages 50000&lt;br /&gt;spo compile.sql&lt;br /&gt;/&lt;br /&gt;spo off&lt;br /&gt;@compile.sql&lt;br /&gt; &lt;br /&gt;3. using the utl_recomp APIs:&lt;br /&gt;connect sys/password as sysdba;&lt;br /&gt;select &#39;utl_recomp_begin: &#39; || to_char(sysdate, &#39;HH:MI:SS&#39;) from dual;execute utl_recomp.recomp_serial();&lt;br /&gt;select &#39;utl_recomp_end: &#39; || to_char(sysdate, &#39;HH:MI:SS&#39;) from dual;&lt;br /&gt;quit;&lt;br /&gt;&lt;br /&gt;# how to enable table shrink in a Oracle 10g database:&lt;br /&gt;&lt;br /&gt;alter table mytable enable row movement;&lt;br /&gt;alter table mytable shrink space;&lt;br /&gt;&lt;br /&gt;# how to shrink multiple schemas in a Oracle 10g database:&lt;br /&gt;&lt;br /&gt;select &#39;ALTER TABLE &#39; || OWNER || &#39;.&#39; || OBJECT_NAME || &#39; ENABLE ROW MOVEMENT;&#39; from dba_objects where object_type in (&#39;TABLE&#39;) and owner in (&#39;MY_SCHEMA1&#39;,&#39;MY_SCHEMA2&#39;,&#39;MY_SCHEMA3&#39;);&lt;br /&gt;&lt;br /&gt;select &#39;ALTER TABLE &#39; || OWNER || &#39;.&#39; || OBJECT_NAME || &#39; SHRINK SPACE CASCADE;&#39; from dba_objects where object_type in (&#39;TABLE&#39;) and owner in (&#39;MY_SCHEMA1&#39;,&#39;MY_SCHEMA2&#39;,&#39;MY_SCHEMA3&#39;);&lt;br /&gt;&lt;br /&gt;# how to shrink datafiles:&lt;br /&gt;select &#39;ALTER TABLE &#39;&#39;&#39; || OWNER || &#39;&#39;&#39;.&#39;&#39;&#39; || TABLE_NAME || &#39;&#39;&#39; SHRINK SPACE COMPACT&#39; from all_tables;&lt;br /&gt;&lt;br /&gt;SELECT VALUE FROM V$PARAMETER WHERE upper(NAME) = &#39;DB_BLOCK_SIZE&#39;;&lt;br /&gt;&lt;br /&gt;SELECT &#39;ALTER DATABASE DATAFILE &#39;&#39;&#39; || FILE_NAME || &#39;&#39;&#39; RESIZE &#39; || CEIL( (NVL(HWM,1)*&amp;amp;&amp;amp;BLKSIZE)/1024/1024 ) || &#39;M;&#39; SHRINK_DATAFILES FROM DBA_DATA_FILES DBADF,&lt;br /&gt;(SELECT FILE_ID, MAX(BLOCK_ID+BLOCKS-1) HWM FROM DBA_EXTENTS GROUP BY FILE_ID ) DBAFS &lt;br /&gt;WHERE DBADF.FILE_ID = DBAFS.FILE_ID(+) AND CEIL(BLOCKS*&amp;amp;&amp;amp;BLKSIZE/1024/1024)- CEIL((NVL(HWM,1)* &amp;amp;&amp;amp;BLKSIZE)/1024/1024 ) &amp;gt; 0 ;&lt;br /&gt;&lt;br /&gt;# how to find which objects have extents at the end of a datafile.&lt;br /&gt;Relocating these objects makes shrinking of relevant datafile possible.&lt;br /&gt;&lt;br /&gt;select *&lt;br /&gt;from (&lt;br /&gt;select owner, segment_name,&lt;br /&gt;segment_type, block_id&lt;br /&gt;from dba_extents&lt;br /&gt;where file_id =&lt;br /&gt;( select file_id&lt;br /&gt;from dba_data_files&lt;br /&gt;where file_name = &amp;amp;FILE )&lt;br /&gt;order by block_id desc&lt;br /&gt;)&lt;br /&gt;where rownum &amp;lt;= 5;&lt;/password&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/3571198738038121750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2009/11/oracle-database-quick-reference_06.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/3571198738038121750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/3571198738038121750'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2009/11/oracle-database-quick-reference_06.html' title='Oracle database quick reference'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-8266027295498190669</id><published>2009-11-04T11:26:00.000-08:00</published><updated>2012-08-28T10:38:45.048-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><title type='text'>UNIX / LINUX quick reference</title><content type='html'>I have compiled the Unix/Linux code snippets below as a quick reference covering the &quot;how to&quot; on various topics. Please feel free to leave a comment with your own &quot;Unix command line gems&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;How to:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# list top memory processes on a Linux machine:&lt;/b&gt;&lt;br /&gt;
ps aux | awk &#39;{print $4&quot;\t&quot;$11}&#39; | sort | uniq -c | awk &#39;{print $2&quot; &quot;$1&quot; &quot;$3}&#39; | sort -nr&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# show how many CPUs on a Linux machine:&lt;/b&gt;&lt;br /&gt;
cat /proc/cpuinfo&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# create a symbolic link:&lt;/b&gt;&lt;br /&gt;
ln -s originalPath newLinkPath&lt;br /&gt;
e.g. ln -s&amp;nbsp;/usr/local/apache/logs /tmp/apachelogs&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# list largest files in Linux (good for file system cleanup):&lt;/b&gt;&lt;br /&gt;
find / -type f -size +20000k -exec ls -lh {} \; 2&amp;gt; /dev/null | awk &#39;{ print $NF &quot;: &quot; $5 }&#39; | sort -nk 2,2&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# list largest directories in Linux:&lt;/b&gt;&lt;br /&gt;
du -h / | grep ^[0-9.]*G | sort -g&lt;br /&gt;
du -h / | grep ^[0-9.]*M | sort -g | more&lt;br /&gt;
find / -type d -size +1G&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# split big text files into smaller and more manageable files&lt;/b&gt;&lt;br /&gt;
split --lines=100000 --suffix-length=3 application.log application.log.a&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# redirect Linux output:&lt;/b&gt;&lt;br /&gt;
ls 1&amp;gt; out.log 2&amp;gt; err.log&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# do global string replaces in the VI editor:&lt;/b&gt;&lt;br /&gt;
:%s/old_string/new_string/g&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# set executable tag in shell script files recursivelly:&lt;/b&gt;&lt;br /&gt;
find . -name &quot;*.sh&quot; -exec chmod +x+x+x {} \;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# delete bak and log files recursivelly:&lt;/b&gt;&lt;br /&gt;
find . -name &quot;*.bak&quot; -exec rm {} \;&lt;br /&gt;
find . -name &quot;*.log&quot; -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# recursively determine how much space a directory is taking:&lt;/b&gt;&lt;br /&gt;
df -h : shows how much space we have on each partition&lt;br /&gt;
du -sh * : show how much space the current directory is taking&lt;br /&gt;
du -h | grep -v &#39;/&#39; | awk &#39;{print $1}&#39; : does the same without iterating thru the subdirs&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# find files that contain a given text string&lt;/b&gt;&lt;br /&gt;
grep -lir &quot;/data/platform&quot; *&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# find files that contain a given text string recursively&lt;/b&gt;&lt;br /&gt;
find . * -exec grep -li &quot;/data&quot; {} \;&lt;br /&gt;
find . * -exec grep -li &quot;/data&quot; {} \; &amp;gt; files.txt&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# poll the number of files in a folder every 3 seconds&lt;/b&gt;&lt;br /&gt;
ksh&lt;br /&gt;
while true&lt;br /&gt;
do&lt;br /&gt;
ls *.retry.xml | wc -l&lt;br /&gt;
sleep 3&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# archive a folder and sub-directories in tar/gz&lt;/b&gt;&lt;br /&gt;
tar -zcvf archive.tgz directory&lt;br /&gt;
e.g.&amp;nbsp;tar -zcvf&amp;nbsp;apacheLogs.tgz&amp;nbsp;/usr/local/apache/logs&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;# extract a tar/gz archive&lt;/b&gt;&lt;br /&gt;
tar -xvf archive.tgz directory&lt;br /&gt;
e.g.&amp;nbsp;tar -xvf&amp;nbsp;
apacheLogs.tgz .&lt;br /&gt;
&lt;br /&gt;
These are just some of the ones I use the most. You can also find many more &lt;a href=&quot;http://cb.vu/unixtoolbox.xhtml&quot;&gt;at the Unix Toolbox here&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/8266027295498190669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2009/11/unix-linux-quick-reference.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/8266027295498190669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/8266027295498190669'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2009/11/unix-linux-quick-reference.html' title='UNIX / LINUX quick reference'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4431645511404250310.post-4854687992037362194</id><published>2009-11-03T07:22:00.000-08:00</published><updated>2009-11-05T08:54:43.693-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><title type='text'>Automated handling of header notices in source files</title><content type='html'>I recently implemented a web-based application that grew from a proof-of-concept into a real solution for a telecom operator, and it has also been offered to other potential clients. And, since it uses only open technologies such as JSF, Spring and Hibernate, it is pretty easy for other developers to reuse it for demos and prototypes without training on proprietary technologies. It is so that other teams in my company have been asking me to share the source code so they too can use it on their own projects.&lt;br /&gt;&lt;br /&gt;While I&#39;ve worked with few developers in the past who don&#39;t quite like the idea of sharing &quot;their&quot; code with other teams, I&#39;m quite proud of this app and have no problems sharing it internally if it could help my company. However, to protect my company’s IP I thought I should at least include copyright messages on every single source code file before sharing it. I know I should have included it from the beginning but when we are working around the clock and we do not have to share the code these kinds of things are easily overlooked. So then I had a project with hundreds of classes and other artifacts without any copyright message. That should be a simple and common task to solve, right? Well, I thought as much... but when looking for a good way to handle it I found that my development tools do not have any functionality I could use to easily handle copyright messages on existing projects.&lt;br /&gt;&lt;br /&gt;There are many possible ways to automate this task, from SED-based Unix shell scripts to regular expressions in search/replace functions of more advanced text editors, but I wanted to find something easier to use and more well-integrated to my development environment.&lt;br /&gt;&lt;br /&gt;After digging for something in those lines I found a good free solution in an Eclipse plugin called Eclipse Releng Tools plugin, or simply Releng. It can be used to automate the task of including a header notice stating the code’s ownership and/or its license. This article will guide you step by step on how to install, setup and use this Eclipse plugin.&lt;br /&gt;&lt;br /&gt;But before we start, &lt;strong&gt;a note of warning&lt;/strong&gt; – YOU should make backups before following these instructions, install and run Releng. It did not cause me any troubles but I should not be held liable in any way if it causes you any problem.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;If you still do not have Eclipse installed, download it &lt;a href=&quot;http://www.eclipse.org/downloads/&quot;&gt;here&lt;/a&gt;. You should select the distribution package that best suits your specific project, or just pick &quot;Eclipse IDE for Java EE Developers&quot; since it works best for most projects. Note that for Eclipse to run you also need a Java Development Kit – &lt;em&gt;and if you do not have it and do not know how to install it you are not the target audience for this article and should probably not follow its instructions&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Once the download is finished extract the ZIP archive and start Eclipse. It will ask for a workspace folder. You can enter the path where your existing project is, or enter something else if you wish to start a new project or check out from a source code repository system. Click on the Workbench icon to close the welcome screen.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1LXJs4NkbnyNIKcagHi5_ZU_lsthZV0kOWODdUTYyniC2XXEwjYbX0qE3fAmCvU5ss6th8Dlq7R-12hUpY7mv3J8oxkLkXubtwPkzoyqrGwO8FrlTiAJ9VQ4oYIKtgm-GPessrmFmEJU/s1600-h/1.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1LXJs4NkbnyNIKcagHi5_ZU_lsthZV0kOWODdUTYyniC2XXEwjYbX0qE3fAmCvU5ss6th8Dlq7R-12hUpY7mv3J8oxkLkXubtwPkzoyqrGwO8FrlTiAJ9VQ4oYIKtgm-GPessrmFmEJU/s400/1.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5399899988015588786&quot; /&gt;&lt;/a&gt;&lt;center&gt;Eclipse&#39;s welcome screen&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;Since the Eclipse Releng Tools plugin is not installed by default in Eclipse we must install it now. In Eclipse’s top menu select “Help” / “Install New Software”.&lt;br /&gt;In the “Work with” tab select “--All Available Sites--”. This will list all the available Eclipse plugins. In the filter bar enter “Releng” to filter the results and show only the plugin we need to install. Check the “Eclipse Releng Tools” plugin and complete the installation process.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirKi_oDrRlyLauSq46y9KDjwMMhTWfVdPFMeR1YqyVGb_lz3Uvi_Mz2H5AtFGF4bFzBN4iW43HwAxbHpob42-JyXsou5GczYi73OWRbdYi0cB2nOu772bG0Bo9WQV_Js4NZnGna-sNUTY/s1600-h/2.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 310px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirKi_oDrRlyLauSq46y9KDjwMMhTWfVdPFMeR1YqyVGb_lz3Uvi_Mz2H5AtFGF4bFzBN4iW43HwAxbHpob42-JyXsou5GczYi73OWRbdYi0cB2nOu772bG0Bo9WQV_Js4NZnGna-sNUTY/s400/2.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5399900364089938050&quot; /&gt;&lt;/a&gt;&lt;center&gt;Eclipse&#39;s available plugins window&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;After the plugin is installed Eclipse will ask you to restart it. Do that so that it is activated when Eclipse comes back up.&lt;br /&gt;&lt;br /&gt;Open your project and note that when you right-click the project root you see the new menu item Fix Copyrights. Do not click on it now; this is just to show that the plugin was installed correctly.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoyZ9hiSpn0W6YoDAJjkReJpZft0OqIBYsYj7_jwZcFyaDMV9ITnmw473I6chsi-X3A8DWgKilTm6HFuQmIccJRe_d0mlG2kJG4Jcs2JBtlvDpPDZ9F86LPn5O5xt3L-oFXgzUB8MaqgE/s1600-h/3.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoyZ9hiSpn0W6YoDAJjkReJpZft0OqIBYsYj7_jwZcFyaDMV9ITnmw473I6chsi-X3A8DWgKilTm6HFuQmIccJRe_d0mlG2kJG4Jcs2JBtlvDpPDZ9F86LPn5O5xt3L-oFXgzUB8MaqgE/s400/3.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5399900617972658802&quot; /&gt;&lt;/a&gt;&lt;center&gt;Releng&#39;s new menu item&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Setup&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In Eclipse’s top menu select “Window” / ”Preferences”. In the Preferences window click on Copyright Tool. This will present you with the copyright template.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix_EFojR8azLXaQhY8uWxwhwT4DVO5BOxXXuwdYHMgSzDj2KWEaFUVsOm2waKPCLNnK502484-kFk3jjT8pDOUWIAiyi8sTOY87LilDRzxegZLkCrHqOSuLpiB5JadLx5hm9wCSMq65Zs/s1600-h/4.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 340px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix_EFojR8azLXaQhY8uWxwhwT4DVO5BOxXXuwdYHMgSzDj2KWEaFUVsOm2waKPCLNnK502484-kFk3jjT8pDOUWIAiyi8sTOY87LilDRzxegZLkCrHqOSuLpiB5JadLx5hm9wCSMq65Zs/s400/4.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5399900914870156834&quot; /&gt;&lt;/a&gt;&lt;center&gt;Releng&#39;s default copyright template&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;Replace the default message with this one below, including the empty lines (one at the top and two at the bottom):&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr style=&quot;background-color: #CCCCCC&quot;&gt;&lt;td&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;This file contains proprietary information of MyCompany.&lt;br /&gt;Copying or reproduction without prior written approval is prohibited.&lt;br /&gt;Copyright (C) ${date}  MyCompany.  All rights reserved.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Set the year fields to 2009 or the current year.&lt;br /&gt;Optionally you can enable or disable the copyright messages on properties and XML files. You can also instruct the plugin to replace existing copyright messages with this new template.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Usage&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Now that Releng is properly setup, right-click on your project’s root node and select “Fix Copyrights”. All of your source code should now include a header message with your notice, as shown in the image below.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinaaCin3dwEaA0acUYAt-E9WKqhuU66bADmJxITQT3nMm9SnrKmzDzp_ZGdNEa0fuEGG2V93By6zrR7UholL_YANHx7Vk_2QOZLIOG_lrVTJTCOhys84t-I0SeX6DFMX932zo8d-DbDAY/s1600-h/5.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinaaCin3dwEaA0acUYAt-E9WKqhuU66bADmJxITQT3nMm9SnrKmzDzp_ZGdNEa0fuEGG2V93By6zrR7UholL_YANHx7Vk_2QOZLIOG_lrVTJTCOhys84t-I0SeX6DFMX932zo8d-DbDAY/s400/5.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5399903429547249618&quot; /&gt;&lt;/a&gt;&lt;center&gt;Project processed by Releng&lt;/center&gt;</content><link rel='replies' type='application/atom+xml' href='http://thoughtsforbeans.blogspot.com/feeds/4854687992037362194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thoughtsforbeans.blogspot.com/2009/11/automated-handling-of-header-notices-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/4854687992037362194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4431645511404250310/posts/default/4854687992037362194'/><link rel='alternate' type='text/html' href='http://thoughtsforbeans.blogspot.com/2009/11/automated-handling-of-header-notices-in.html' title='Automated handling of header notices in source files'/><author><name>Pedro Burglin</name><uri>http://www.blogger.com/profile/17916331479743463671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5L-t3jx3SSxGDzKs6SS3PtYyBgRoW4EjWIWT1YIZkdRr2bxHd8ecJpGSNV46WwdcEDSG_ZmL2IawBkbMw-ii34mJWx-lX9gJENovIgeIRtc6La9q8VHsN1MNlVVd3vzQ/s220/pedro-photo.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1LXJs4NkbnyNIKcagHi5_ZU_lsthZV0kOWODdUTYyniC2XXEwjYbX0qE3fAmCvU5ss6th8Dlq7R-12hUpY7mv3J8oxkLkXubtwPkzoyqrGwO8FrlTiAJ9VQ4oYIKtgm-GPessrmFmEJU/s72-c/1.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>