<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0cDQXg6eyp7ImA9WhRaFEQ.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656</id><updated>2012-02-17T16:04:30.613+01:00</updated><category term="mobile" /><category term="logcat" /><category term="MacBook" /><category term="gallery" /><category term="media" /><category term="Technology" /><category term="sd-card" /><category term="mock" /><category term="UI" /><category term="Tutorial" /><category term="Future" /><category term="Apple" /><category term="HTTP" /><category term="Symbolic Links" /><category term="click listener" /><category term="Audio" /><category term="shell" /><category term="shortcuts" /><category term="resource" /><category term="Mac OS X" /><category term="layout" /><category term="rfkill" /><category term="JSON" /><category term="mklink" /><category term="Android" /><category term="Visual Life" /><category term="ListView" /><category term="Windows 7" /><category term="debug" /><category term="UxD" /><category term="enum" /><category term="quick and dirty" /><category term="java" /><category term="Rapid Prototyping" /><category term="UX" /><category term="Server" /><category term="Design" /><category term="bookmarks" /><category term="bash" /><category term="Command" /><category term="source" /><category term="Interfaces" /><category term="Junction Points" /><category term="Google Chrome" /><category term="Firefox" /><category term="iPhone" /><category term="reload settings" /><category term="Linux" /><category term="Eclipse" /><category term="zsh" /><category term="Swype" /><category term="GPS" /><category term="Intel" /><category term="WiFi" /><title>GEEK!mind</title><subtitle type="html">Software Engineering, Psychology &amp;amp; Design.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.geekmind.net/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.geekmind.net/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/geekmind" /><feedburner:info uri="geekmind" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A0cEQX46cSp7ImA9WhdXFUg.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-2711605827470979600</id><published>2011-08-05T11:56:00.001+02:00</published><updated>2011-08-28T21:16:40.019+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-28T21:16:40.019+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="zsh" /><category scheme="http://www.blogger.com/atom/ns#" term="bash" /><category scheme="http://www.blogger.com/atom/ns#" term="source" /><category scheme="http://www.blogger.com/atom/ns#" term="shell" /><category scheme="http://www.blogger.com/atom/ns#" term="reload settings" /><title>How to reload your .zshrc</title><content type="html">Stupid me, after editing my .zshrc I always invoked a new shell to apply those changes. Now I &lt;a href="http://superuser.com/questions/46139/what-does-source-do"&gt;found out&lt;/a&gt;, that you can use your shell's &lt;a href="http://ss64.com/bash/source.html"&gt;built-in source command&lt;/a&gt; to reload your zsh settings.&lt;br /&gt;
&lt;blockquote&gt;sk@supernova:~/ &amp;gt; source ~/.zshrc&lt;/blockquote&gt;or, even shorter:&lt;br /&gt;
&lt;blockquote&gt;sk@supernova:~/ &amp;gt; . ~/.zshrc&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-2711605827470979600?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/KckYLtnTScc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/2711605827470979600/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=2711605827470979600&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/2711605827470979600?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/2711605827470979600?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/KckYLtnTScc/how-to-reload-your-zshrc.html" title="How to reload your .zshrc" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.geekmind.net/2011/08/how-to-reload-your-zshrc.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUGQHozeip7ImA9WhZUFUk.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-1826660503550381495</id><published>2011-06-08T16:43:00.000+02:00</published><updated>2011-06-08T16:43:41.482+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-08T16:43:41.482+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enum" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>Java: Customizing enums</title><content type="html">After reading this you might wonder why I would write about something obvious like that. And I agree. It is quite obvious. Once you know about it. However, first I didn't know and neither did the other Java programmers I've spoken to. So I thought it's worth writing up a quick blog post.&lt;br /&gt;
&lt;br /&gt;
Probably all of you already know about &lt;a href="http://en.wikipedia.org/wiki/Enumerated_type"&gt;enums&lt;/a&gt; and use them as type-safe flags or enumerations:&lt;br /&gt;
&lt;blockquote&gt;enum Cardsuit { CLUBS, DIAMONDS, SPADES, HEARTS };&lt;/blockquote&gt;That is pretty basic and probably everyone learned that in Java 101. What was new to me, though, is that you can customize the &lt;i&gt;enum { }&lt;/i&gt; pretty much like a &lt;i&gt;class&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
So for example, one day I was working on a XML parser implementation, where depending on an attribute value of a XML element I had to make a decision. Since in XML everything is a String I wrote a quick method which compares an &lt;i&gt;enum&lt;/i&gt; to a &lt;i&gt;String&lt;/i&gt;. But I didn't know where to put it in my code. I figured the best place would be within the &lt;i&gt;enum&lt;/i&gt; itself. Not really thinking that it would work, but still curious I tried the following:&lt;br /&gt;
&lt;script class="brush: java; wrap-lines: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[
public enum KeyActionType {
 CLUBS, DIAMONDS, SPADES, HEARTS;
 
 public boolean compareToString(String s) {
  return s.equalsIgnoreCase(this.toString());
 } 
}
]]&gt;
&lt;/script&gt;I tried to compile it and voilà: it worked! No errors, no warnings.&lt;br /&gt;
&lt;br /&gt;
In my actual XML parser I then would only have to do the following:&lt;br /&gt;
&lt;blockquote&gt;if ( Cardsuit.CLUBS.compareToString(xmlString) ) { .... }&lt;/blockquote&gt;Of course there would have been many other ways to do this, but this solution seems quite clean and elegant to me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-1826660503550381495?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/QnPhxv2EwBw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/1826660503550381495/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=1826660503550381495&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/1826660503550381495?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/1826660503550381495?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/QnPhxv2EwBw/java-customizing-enums.html" title="Java: Customizing enums" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.geekmind.net/2011/06/java-customizing-enums.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEGSXk4eyp7ImA9WhZXGUg.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-6241571021052973987</id><published>2011-05-09T17:57:00.000+02:00</published><updated>2011-05-09T17:57:08.733+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-09T17:57:08.733+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="media" /><category scheme="http://www.blogger.com/atom/ns#" term="sd-card" /><category scheme="http://www.blogger.com/atom/ns#" term="gallery" /><title>Android: Hide your application's media files from the Gallery App</title><content type="html">If you have a media heavy application it is very likely that you store the image, sound or video data on the sd-card, since it gives you a lot more space than bundling everything with the application. Also, it enables you to dynamically add, remove or modify your media data.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-hedFBGI1yQE/TcgOYnHf4EI/AAAAAAAAG-U/QUNOS5lRbns/s1600/android_gallery_nomedia.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-hedFBGI1yQE/TcgOYnHf4EI/AAAAAAAAG-U/QUNOS5lRbns/s320/android_gallery_nomedia.png" width="192" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
However, the problem that comes with it is, that all your media is public now and can be read by other applications, e.g. the Gallery App, which scans the whole sd-card for image files. To prevent other applications from scanning and displaying your media files, you can simply add an empty file called &lt;i&gt;&lt;span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"&gt;.nomedia&lt;/span&gt;&lt;/i&gt;&amp;nbsp;in the root folder of your media data.&lt;br /&gt;
&lt;br /&gt;
From the official &lt;a href="http://developer.android.com/reference/android/provider/MediaStore.html#MEDIA_IGNORE_FILENAME"&gt;Android documentation&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;Name of the file signaling the media scanner to ignore media in the containing directory and its subdirectories. Developers should use this to avoid application graphics showing up in the Gallery and likewise prevent application sounds and music from showing up in the Music app.&amp;nbsp;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-6241571021052973987?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/wU9ILkH6Mis" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/6241571021052973987/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=6241571021052973987&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/6241571021052973987?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/6241571021052973987?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/wU9ILkH6Mis/android-hide-your-applications-media.html" title="Android: Hide your application's media files from the Gallery App" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-hedFBGI1yQE/TcgOYnHf4EI/AAAAAAAAG-U/QUNOS5lRbns/s72-c/android_gallery_nomedia.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.geekmind.net/2011/05/android-hide-your-applications-media.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UBRXg9fCp7ImA9WhZRFkQ.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-3866991276738536821</id><published>2011-04-13T11:15:00.003+02:00</published><updated>2011-04-13T12:40:54.664+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-13T12:40:54.664+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Server" /><category scheme="http://www.blogger.com/atom/ns#" term="mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="JSON" /><category scheme="http://www.blogger.com/atom/ns#" term="HTTP" /><category scheme="http://www.blogger.com/atom/ns#" term="iPhone" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>Debugging Client-Server Communication</title><content type="html">Especially in mobile development you most likely have some&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Client%E2%80%93server_model"&gt;client-server communication&lt;/a&gt; going on, which is often the source of a lot of problems and long debugging sessions. To make the debugging easier it is helpful to see what each side sends or receives. There are two UNIX tools that can come in quite handy in such situations:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Netcat"&gt;netcat&lt;/a&gt; - to listen to all TCP and UDP connections on a specific port&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/CURL"&gt;cURL&lt;/a&gt; - to send 'fake' requests to a server&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Both a very powerful tools and you can do a lot of stuff with them (e.g. write your own web server with a shell script). However, in this post we will keep it simple and focus on debugging a HTTP (JSON) communication between a web server and a mobile client (iPhone, Android, but could be pretty much any kind of client).&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Listening to incoming requests&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
We start a listening server with&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;nc -lk $ip $port&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;-l: listen&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;-k: forces nc to stay listening for another connection after its current connection is completed.&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;$ip: the IP/interface you want to bind to. Use 0.0.0.0 to bind to all interfaces and IPs.&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;$port: the port you want to bind to. Doesn't really matter which one you use, as long as the client uses the same one to connect to.&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
In practice it might look like this:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sk@supernova:~/ &amp;gt; &lt;b&gt;nc -lk 0.0.0.0 8080&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;POST /rpc HTTP/1.1&lt;br /&gt;
Accept: application/json&lt;br /&gt;
Content-type: application/json&lt;br /&gt;
Accept-Encoding: gzip&lt;br /&gt;
Host: 192.168.2.3&lt;br /&gt;
Content-Length: 152&lt;br /&gt;
Connection: Keep-Alive&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;{"id":3,"jsonrpc":"2.0","method":"sendTestMessage","params":{"clientVersion":"0.11.4-debug","user":"sk@geekmind.net","imei":"32420214181983746","message":"This is a test message :-)"}}&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;In &lt;span class="Apple-style-span" style="color: #274e13;"&gt;green&lt;/span&gt; the HTTP header and in &lt;span class="Apple-style-span" style="color: #073763;"&gt;blue&lt;/span&gt; the actual content, in this case a &lt;a href="http://en.wikipedia.org/wiki/JSON-RPC"&gt;JSON-RPC&lt;/a&gt; message. While the header is mostly irrelevant to us, it might in some cases contain useful information to detect the source of the problem. However, more interesting, and in most cases more prone to errors is our own "custom protocol" and its implementation. By evaluating the content section we can now easily compare if there is a difference between what we were expecting to receive and what the client was actually sending out.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Sending "fake" requests to a server&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes the problem may not be in the client's implementation of our communication protocol, but on the server side. The complementary approach to the above example is to send "fake" requests to our server and look at the response we get.&lt;br /&gt;
&lt;br /&gt;
With cURL it is as simply as that:&lt;br /&gt;
&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;curl -v -i -X POST -d $data $uri&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;-&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;v: verbose&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;-i: include HTTP headers in the output&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;-X: HTTP request type. Defaults to GET if none given&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;-d: data&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Applied it might look like this:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sk@supernova:~/ &amp;gt; &lt;b&gt;curl -v -i -X POST -d '{"id":1,"jsonrpc":"2.0","method":"sendTestMessage","params":{"clientVersion":"0.11.4-debug","user":"sk@geekmind.net","imei":"1111111111111111111"}}' http://android.geekmind.net/rpc&lt;/b&gt;&lt;br /&gt;
* About to connect() to android.geekmind.net port 80 (#0)&lt;br /&gt;
* &amp;nbsp; Trying 74.125.43.121... connected&lt;br /&gt;
* Connected to android.geekmind.net (74.125.43.121) port 80 (#0)&lt;br /&gt;
&amp;gt; POST /rpc HTTP/1.1&lt;br /&gt;
&amp;gt; User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3&lt;br /&gt;
&amp;gt; Host: android.geekmind.net&lt;br /&gt;
&amp;gt; Accept: */*&lt;br /&gt;
&amp;gt; Content-Length: 157&lt;br /&gt;
&amp;gt; Content-Type: application/x-www-form-urlencoded&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;lt; HTTP/1.1 200 OK&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
&amp;lt; Content-Type: text/html; charset=utf-8&lt;br /&gt;
Content-Type: text/html; charset=utf-8&lt;br /&gt;
&amp;lt; Cache-Control: no-cache&lt;br /&gt;
Cache-Control: no-cache&lt;br /&gt;
&amp;lt; Expires: Fri, 01 Jan 1990 00:00:00 GMT&lt;br /&gt;
Expires: Fri, 01 Jan 1990 00:00:00 GMT&lt;br /&gt;
&amp;lt; Date: Fri, 08 Apr 2011 09:19:32 GMT&lt;br /&gt;
Date: Fri, 08 Apr 2011 09:19:32 GMT&lt;br /&gt;
&amp;lt; Server: Google Frontend&lt;br /&gt;
Server: Google Frontend&lt;br /&gt;
&amp;lt; Transfer-Encoding: chunked&lt;br /&gt;
Transfer-Encoding: chunked&lt;br /&gt;
&amp;lt;&lt;br /&gt;
* Connection #0 to host android.geekmind.net left intact&lt;br /&gt;
* Closing connection #0&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #660000;"&gt;{"jsonrpc": "2.0", "id": 1, "error": "1", "message": "ERROR: user and IMEI do not match!"}} &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;In &lt;span class="Apple-style-span" style="color: #660000;"&gt;red&lt;/span&gt; the response we got from the server. In this case we used a real username with a wrong &lt;a href="http://en.wikipedia.org/wiki/International_Mobile_Equipment_Identity"&gt;IMEI&lt;/a&gt; and tested if the server generates the right response. In our case the server correctly produced an error.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
If you're interested in reading more about the actual implementation of client-server communication on mobile devices, check out my blog post &lt;a href="http://www.geekmind.net/2009/11/android-simple-httpclient-to.html"&gt;Android: Simple HttpClient to send/receive JSON Objects&lt;/a&gt;. The code is available on &lt;a href="https://github.com/znq/Simple-HTTP-Client"&gt;GitHub&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
If you want to directly monitor a real connection I suggest that you have a look at tools like &lt;a href="http://www.wireshark.org/"&gt;Wireshark&lt;/a&gt; and &lt;a href="http://www.tcpdump.org/"&gt;tcpdump&lt;/a&gt;. Wireshark has a GUI and is fairly easy to understand. It also helps to have a server instance running on your local machine (development server), so you don't need to figure out how to tap into your phones WiFi connection.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-3866991276738536821?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/2o3_DD335F0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/3866991276738536821/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=3866991276738536821&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/3866991276738536821?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/3866991276738536821?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/2o3_DD335F0/debugging-client-server-communication.html" title="Debugging Client-Server Communication" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.geekmind.net/2011/04/debugging-client-server-communication.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkANQXozeip7ImA9WhZSFEQ.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-5662640668279550512</id><published>2011-03-30T17:26:00.000+02:00</published><updated>2011-03-30T17:26:30.482+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-30T17:26:30.482+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Visual Life" /><category scheme="http://www.blogger.com/atom/ns#" term="Design" /><category scheme="http://www.blogger.com/atom/ns#" term="Intel" /><title>Visual Life</title><content type="html">A collection of promo videos of Inte's Visual Life contest. Interesting people and inspiring to watch.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/i73f0pQBfQ8?hd=1" title="YouTube video player" width="640"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;
Check them out, if you get a chance.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=i73f0pQBfQ8&amp;amp;hd=1"&gt;Invitation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=e5NgG5koPZU&amp;amp;hd=1"&gt;The Sartorialist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=oGuYu7EfgQs&amp;amp;hd=1"&gt;Remastered&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=BTfAzjBTokc&amp;amp;hd=1"&gt;Michael Wolff&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=63wanWqzav8&amp;amp;hd=1"&gt;Avant Cellist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-5662640668279550512?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/7NLN_IkVroE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/5662640668279550512/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=5662640668279550512&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/5662640668279550512?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/5662640668279550512?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/7NLN_IkVroE/visual-life.html" title="Visual Life" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/i73f0pQBfQ8/default.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.geekmind.net/2011/03/visual-life.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MFQ3c8fyp7ImA9Wx9UFU4.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-4563844643032138214</id><published>2011-02-12T20:33:00.001+01:00</published><updated>2011-02-12T20:36:52.977+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-12T20:36:52.977+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Technology" /><category scheme="http://www.blogger.com/atom/ns#" term="UxD" /><category scheme="http://www.blogger.com/atom/ns#" term="Future" /><category scheme="http://www.blogger.com/atom/ns#" term="Interfaces" /><category scheme="http://www.blogger.com/atom/ns#" term="UX" /><category scheme="http://www.blogger.com/atom/ns#" term="UI" /><title>The Age of Fire - Futuristic Interfaces</title><content type="html">Here is a really well-made video about futuristic interfaces in a completely interconnected home environment. It shows the beauty and usefulness that comes with it, but also points out the inherent problems of complete interconnectivity.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="478" src="http://player.vimeo.com/video/11802060?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=ff9933" width="600"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;
Interesting challenges for User Interface Engineers and Designers :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-4563844643032138214?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/y6wI8V5hbGc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/4563844643032138214/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=4563844643032138214&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/4563844643032138214?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/4563844643032138214?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/y6wI8V5hbGc/age-of-fire-futuristic-interfaces.html" title="The Age of Fire - Futuristic Interfaces" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.geekmind.net/2011/02/age-of-fire-futuristic-interfaces.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMCRX88eCp7ImA9Wx9VEE4.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-2522159494271414131</id><published>2011-01-26T00:48:00.004+01:00</published><updated>2011-01-26T09:27:44.170+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-26T09:27:44.170+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="zsh" /><category scheme="http://www.blogger.com/atom/ns#" term="bash" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="shell" /><category scheme="http://www.blogger.com/atom/ns#" term="Mac OS X" /><title>Shortcuts to improve your bash &amp; zsh productivity</title><content type="html">So, you hate using a terminal? That might be, because you use the arrow keys to navigate character by character through a long command just to change a paramater at the other end of the line, right? Here's a list of my most-used bash &amp;amp; zsh shortcuts, that will definitely boost your productivity and will help you to improve your command line experience.&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 19px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;table style="font-size: inherit; line-height: 1.4em; margin-bottom: 1em !important; margin-left: 0px !important; margin-right: 0px !important; margin-top: 1em !important; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;thead style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;th align="left" style="border-bottom-color: rgb(187, 187, 187) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;Shortcut&lt;/th&gt;&lt;th align="left" style="border-bottom-color: rgb(187, 187, 187) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;Action&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;&lt;tbody style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + A&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Move&lt;/strong&gt;&amp;nbsp;to the&amp;nbsp;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;beginning of the line&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + E&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Move&lt;/strong&gt;&amp;nbsp;to the&amp;nbsp;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;end of the line&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + [left arrow]&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Move&lt;/strong&gt;&amp;nbsp;one&amp;nbsp;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;word backward&lt;/strong&gt;&amp;nbsp;(on some systems this is&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;ALT + B&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + [right arrow]&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Move&lt;/strong&gt;&amp;nbsp;one&amp;nbsp;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;word forward&lt;/strong&gt;&amp;nbsp;(on some systems this is&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;ALT + F&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + U&lt;/code&gt;&amp;nbsp;(bash)&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Clear&lt;/strong&gt;&amp;nbsp;the&amp;nbsp;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;characters&lt;/strong&gt;&amp;nbsp;on the line&amp;nbsp;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;before the current cursor&lt;/strong&gt;&amp;nbsp;position&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + U&lt;/code&gt;&amp;nbsp;(zsh)&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;If you're using the zsh, this will&amp;nbsp;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;clear the entire line&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + K&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Clear&lt;/strong&gt;&amp;nbsp;the&amp;nbsp;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;characters&lt;/strong&gt;&amp;nbsp;on the line&amp;nbsp;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;after the current cursor&lt;/strong&gt;&amp;nbsp;position&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;ESC + [backspace]&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Delete&lt;/strong&gt;&amp;nbsp;the&amp;nbsp;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;word in front&lt;/strong&gt;&amp;nbsp;of the cursor&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + W&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Delete&lt;/strong&gt;&amp;nbsp;the&amp;nbsp;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;word in front&lt;/strong&gt;&amp;nbsp;of the cursor&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;ALT + D&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Delete&lt;/strong&gt;&amp;nbsp;the&amp;nbsp;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;word after&lt;/strong&gt;&amp;nbsp;the cursor&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + R&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Search history&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + G&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;Escape from search mode&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + _&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Undo&lt;/strong&gt;&amp;nbsp;the last change&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + L&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Clear screen&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + S&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;Stop output to screen&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + Q&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;Re-enable screen output&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + C&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Terminate/kill&lt;/strong&gt;&amp;nbsp;current foreground process&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + Z&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Suspend/stop&lt;/strong&gt;&amp;nbsp;current foreground process&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;table style="font-size: inherit; line-height: 1.4em; margin-bottom: 1em !important; margin-left: 0px !important; margin-right: 0px !important; margin-top: 1em !important; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;thead style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;th align="left" style="border-bottom-color: rgb(187, 187, 187) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;Command&lt;/th&gt;&lt;th align="left" style="border-bottom-color: rgb(187, 187, 187) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;Action&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;&lt;tbody style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;!!&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Execute last command&lt;/strong&gt;&amp;nbsp;in history&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;!abc&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Execute last command&lt;/strong&gt;&amp;nbsp;in history&amp;nbsp;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;beginning with&lt;/strong&gt;&amp;nbsp;&lt;em style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;abc&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;!abc:p&lt;/code&gt;&lt;/td&gt;&lt;td align="left" style="border-bottom-color: rgb(221, 221, 221) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.2em !important; padding-left: 1em !important; padding-right: 1em !important; padding-top: 0.2em !important;"&gt;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Print last command&lt;/strong&gt;&amp;nbsp;in history&amp;nbsp;&lt;strong style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;beginning with&lt;/strong&gt;&amp;nbsp;&lt;em style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;abc&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;h3 style="border-bottom-width: 0px !important; border-color: initial !important; border-left-width: 0px !important; border-right-width: 0px !important; border-style: initial !important; border-top-width: 0px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 1em !important; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;History Search&lt;/h3&gt;&lt;div style="line-height: 1.5em !important; margin-bottom: 1em !important; margin-left: 0px !important; margin-right: 0px !important; margin-top: 1em !important; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Press&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + R&lt;/code&gt;&amp;nbsp;to search through the history. Continue pressing&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + R&lt;/code&gt;&amp;nbsp;until you find the entry you're looking for. Press&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;[ENTER]&lt;/code&gt;&amp;nbsp;to execute the current expression. Press&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;[Right Arrow]&lt;/code&gt;&amp;nbsp;to modify the current expression. Press&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + G&lt;/code&gt;&amp;nbsp;to escape from search mode.&lt;/div&gt;&lt;h3 style="border-bottom-width: 0px !important; border-color: initial !important; border-left-width: 0px !important; border-right-width: 0px !important; border-style: initial !important; border-top-width: 0px !important; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 1em !important; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Special setup for Mac OS X&lt;/h3&gt;&lt;div style="line-height: 1.5em !important; margin-bottom: 1em !important; margin-left: 0px !important; margin-right: 0px !important; margin-top: 1em !important; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Go to&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;Terminal&lt;/code&gt;&amp;nbsp;-&amp;gt;&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;Preferences&lt;/code&gt;&amp;nbsp;-&amp;gt;&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;Settings&lt;/code&gt;&amp;nbsp;-&amp;gt;&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;Keyboard&lt;/code&gt;&lt;/div&gt;&lt;ul style="line-height: 1.4em; margin-bottom: 1em !important; margin-left: 2em !important; margin-right: 0px !important; margin-top: 1em !important; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;To enable the use of the&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;ALT&lt;/code&gt;&amp;nbsp;or&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;OPTION&lt;/code&gt;&amp;nbsp;key, select&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;use option as meta key&lt;/code&gt;&lt;/li&gt;
&lt;li style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;To enable the&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + [left arrow]&lt;/code&gt;&amp;nbsp;and&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;CTRL + [right arrow]&lt;/code&gt;&amp;nbsp;shortcuts, select&lt;/li&gt;
&lt;ul style="line-height: 1.4em; margin-bottom: 0px !important; margin-left: 2em !important; margin-right: 0px !important; margin-top: 0px !important; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;control cursor left&lt;/code&gt;&amp;nbsp;and set it to&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;\033b&lt;/code&gt;&amp;nbsp;and&lt;/li&gt;
&lt;li style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;control cursor right&lt;/code&gt;&amp;nbsp;and set it to&amp;nbsp;&lt;code style="background-color: rgb(248, 248, 255) !important; border-bottom-color: rgb(222, 222, 222) !important; border-bottom-style: solid !important; border-bottom-width: 1px !important; border-left-color: rgb(222, 222, 222) !important; border-left-style: solid !important; border-left-width: 1px !important; border-right-color: rgb(222, 222, 222) !important; border-right-style: solid !important; border-right-width: 1px !important; border-top-color: rgb(222, 222, 222) !important; border-top-style: solid !important; border-top-width: 1px !important; color: rgb(68, 68, 68) !important; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px !important; padding-left: 0.2em !important; padding-right: 0.2em !important; padding-top: 0px !important;"&gt;\033f&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 22px;"&gt;You know of any other important shortcuts that I missed? Please let me know in the comments.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-2522159494271414131?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/ATzU1cRCdxY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/2522159494271414131/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=2522159494271414131&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/2522159494271414131?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/2522159494271414131?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/ATzU1cRCdxY/shortcuts-to-improve-your-bash-zsh.html" title="Shortcuts to improve your bash &amp; zsh productivity" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.geekmind.net/2011/01/shortcuts-to-improve-your-bash-zsh.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUDQnw6cSp7ImA9Wx9WFEo.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-4347647102038548547</id><published>2011-01-19T23:31:00.000+01:00</published><updated>2011-01-19T23:31:13.219+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-19T23:31:13.219+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="logcat" /><title>Android: Better Logging Output</title><content type="html">Ever got annoyed by the flood of information in Android's adb logcat output? Luckily Google Engineer&amp;nbsp;&lt;a href="http://jsharkey.org/"&gt;Jeff Sharkey&lt;/a&gt; put together a Python script to make the output visually more appealing and easier to follow. Below are a few tipps on how to effectively combine &lt;i&gt;coloredlogcat.py&lt;/i&gt;&amp;nbsp;with &lt;i&gt;adb logcat's&lt;/i&gt;&amp;nbsp;parameters and options.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K6NH2gxxhAc/TTdQAInmHVI/AAAAAAAAG4E/1feI0PgdOQk/s1600/logcat_screenshot.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="396" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/TTdQAInmHVI/AAAAAAAAG4E/1feI0PgdOQk/s640/logcat_screenshot.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;b&gt;Colored Logcat Output&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Setup&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Download &lt;a href="http://jsharkey.org/downloads/coloredlogcat.pytxt"&gt;coloredlogcat.py&lt;/a&gt; from Jeff Sharky's blog&lt;/li&gt;
&lt;li&gt;Copy the script to your local ~/bin folder and make it executable&lt;/li&gt;
&lt;blockquote&gt;mkdir ~/bin cp ~/Downloads/coloredl chmod +x ~/bin/coloredlogcat.py&lt;/blockquote&gt;&lt;li&gt;Add ~/bin permanently to your $PATH variable. Either in your .bashrc or .zshrc (or whatever shell you use) add or modify this line:&lt;/li&gt;
&lt;blockquote&gt;export PATH=$HOME/bin:$PATH&lt;/blockquote&gt;&lt;/ol&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Usage&lt;/span&gt;&lt;br /&gt;
You can either use it directly, by simply entering&amp;nbsp;&lt;i style="background-color: #fff2cc;"&gt;coloredlogcat.py&lt;/i&gt;, or you can use &lt;i style="background-color: #fff2cc;"&gt;adb logcat&lt;/i&gt;&amp;nbsp;with all it's parameters and just &lt;a href="http://en.wikipedia.org/wiki/Pipeline_(Unix)"&gt;pipe&lt;/a&gt; it into &lt;i style="background-color: #fff2cc;"&gt;coloredlogcat.py&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Show only DEBUG output from the &lt;i&gt;MyApp&lt;/i&gt;&amp;nbsp;TAG. Everything else is SILENT: &lt;i&gt;*:s&lt;/i&gt; (not shown)&lt;br /&gt;
&lt;blockquote&gt;adb -d logcat "*:S MyApp:D" | coloredlogcat.py&lt;/blockquote&gt;Show only WARNING, ERROR and FATAL output. Great for checking on exceptions.&lt;br /&gt;
&lt;blockquote&gt;adb -d logcat "*:W" | coloredlogcat.py&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;References&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.android.com/guide/developing/tools/adb.html#logcat"&gt;Logcat Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Logcat priorities&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;V — Verbose (lowest priority)&lt;/li&gt;
&lt;li&gt;D — Debug&lt;/li&gt;
&lt;li&gt;I — Info&lt;/li&gt;
&lt;li&gt;W — Warning&lt;/li&gt;
&lt;li&gt;E — Error&lt;/li&gt;
&lt;li&gt;F — Fatal&lt;/li&gt;
&lt;li&gt;S — Silent (highest priority, on which nothing is ever printed)&lt;/li&gt;
&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Special options&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;i style="background-color: #fff2cc;"&gt;adb logcat -c&lt;/i&gt; clears the entire log&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-4347647102038548547?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/cen189lk6Ug" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/4347647102038548547/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=4347647102038548547&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/4347647102038548547?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/4347647102038548547?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/cen189lk6Ug/android-better-logging-output.html" title="Android: Better Logging Output" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_K6NH2gxxhAc/TTdQAInmHVI/AAAAAAAAG4E/1feI0PgdOQk/s72-c/logcat_screenshot.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://www.geekmind.net/2011/01/android-better-logging-output.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIGSX08eyp7ImA9Wx9WEU0.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-7835519337078439897</id><published>2011-01-15T16:26:00.003+01:00</published><updated>2011-01-15T17:05:28.373+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-15T17:05:28.373+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="WiFi" /><category scheme="http://www.blogger.com/atom/ns#" term="rfkill" /><title>Linux WiFi: operation not possible due to RF-kill</title><content type="html">Some people have been experiencing WiFi problems with Ubuntu 10.10 since an update that happend just before Christmas 2010. The problem seems to be a bug in a kernel module, which prevents the &lt;a href="http://www.mjmwired.net/kernel/Documentation/rfkill.txt"&gt;rfkill's soft and hard block&lt;/a&gt; from syncing correctly.&lt;br /&gt;
&lt;br /&gt;
In practice that means you can press your laptop's WiFi button as often as you want, it doesn't change anything. Your wireless adapter will always appear as disabled. If you try to start the wireless interface manually you get the following error message:&lt;br /&gt;
&lt;blockquote&gt;sk@ubuntu:~# &lt;b&gt;sudo ifconfig wlan0 up&lt;/b&gt;&lt;br /&gt;
SIOCSIFFLAGS: Operation not possible due to RF-kill&lt;/blockquote&gt;If you do a &lt;b&gt;&lt;i&gt;rfkill list all&lt;/i&gt;&lt;/b&gt; you should get an output similar to this:&lt;br /&gt;
&lt;blockquote&gt;sk@ubuntu:~$ &lt;b&gt;sudo rfkill list all&lt;/b&gt;&lt;br /&gt;
0: hp-wifi: Wireless LAN&lt;br /&gt;
Soft blocked: yes&lt;br /&gt;
Hard blocked: no&lt;br /&gt;
1: phy0: Wireless LAN&lt;br /&gt;
Soft blocked: yes&lt;br /&gt;
Hard blocked: no&lt;/blockquote&gt;Depending on the state of your WiFi button the &lt;b&gt;&lt;i&gt;Hard blocked&lt;/i&gt;&lt;/b&gt; will either be &lt;b&gt;&lt;i&gt;yes&lt;/i&gt;&lt;/b&gt; or &lt;b&gt;&lt;i&gt;no&lt;/i&gt;&lt;/b&gt;. Press the WiFi button and run &lt;b&gt;&lt;i&gt;rfkill list all&lt;/i&gt;&lt;/b&gt; again to make sure the value for &lt;b&gt;&lt;i&gt;Hard blocked&lt;/i&gt;&lt;/b&gt; changes.&lt;br /&gt;
&lt;br /&gt;
The actual problem is, that the &lt;b&gt;&lt;i&gt;Soft blocked&lt;/i&gt;&lt;/b&gt; value is always set to &lt;i&gt;&lt;b&gt;yes&lt;/b&gt;&lt;/i&gt;, because for some reason the syncing between the hardware block and the software block doesn't work as supposed. To override this behavior, you can just run &lt;b&gt;&lt;i&gt;rfkill unblock wifi&lt;/i&gt;&lt;/b&gt; and it should work again. Double check by entering &lt;b&gt;&lt;i&gt;rfkill list all&lt;/i&gt;&lt;/b&gt; again and make sure it looks like this, with all values set to &lt;b&gt;&lt;i&gt;no&lt;/i&gt;&lt;/b&gt;:&lt;br /&gt;
&lt;blockquote&gt;sk@ubuntu:~$ &lt;b&gt;sudo rfkill list all&lt;/b&gt;&lt;br /&gt;
0: hp-wifi: Wireless LAN&lt;br /&gt;
Soft blocked: no&lt;br /&gt;
Hard blocked: no&lt;br /&gt;
1: phy0: Wireless LAN&lt;br /&gt;
Soft blocked: no&lt;br /&gt;
Hard blocked: no&lt;/blockquote&gt;If you then run &lt;b&gt;&lt;i&gt;ifconfig wlan0 up&lt;/i&gt;&lt;/b&gt; (or enable the wireless via your desktop's network manager) you should be able to connect to a wireless network again without any further issues.&lt;br /&gt;
&lt;br /&gt;
The configuration, which I've been using:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Compaq Presario CQ60&lt;/li&gt;
&lt;li&gt;Atheros&amp;nbsp;AR5001 Wireless Network Adapter&lt;/li&gt;
&lt;li&gt;Ubuntu 10.10&lt;/li&gt;
&lt;/ul&gt;I also read, that some people could fix it, by turning off the WiFi button during the boot process and then switch it on again, once the system is up and running. It seems that the system expects the hard block to be set to off. This is still a bug, but it could explain why then the soft block didn't sync with the hard block any more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-7835519337078439897?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/7I3bST3KxuU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/7835519337078439897/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=7835519337078439897&amp;isPopup=true" title="19 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/7835519337078439897?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/7835519337078439897?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/7I3bST3KxuU/linux-wifi-operation-not-possible-due.html" title="Linux WiFi: operation not possible due to RF-kill" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><thr:total>19</thr:total><feedburner:origLink>http://www.geekmind.net/2011/01/linux-wifi-operation-not-possible-due.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcCSHY-fCp7ImA9WhdXFk4.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-3149284248235631561</id><published>2010-11-01T00:47:00.005+01:00</published><updated>2011-08-29T17:01:09.854+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-29T17:01:09.854+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="UX" /><category scheme="http://www.blogger.com/atom/ns#" term="UI" /><category scheme="http://www.blogger.com/atom/ns#" term="Rapid Prototyping" /><title>Rapid Prototyping of Web Applications</title><content type="html">Ryan Singer from 37 Signals gave a really interesting talk at the&amp;nbsp;&lt;i&gt;Future of Web Apps &lt;/i&gt;in London about the rapid prototyping process of web applications.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="336" src="http://player.vimeo.com/video/15772341?byline=0&amp;amp;portrait=0" width="600"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;
For me, the most important insight was to start off with building a really bare-bone HTML framework, which then involves step-by-step by having already right from the beginning a programmer working on the data models and controllers in parallel with a web designer improving the markup and CSS, instead of going the traditional way of letting only a graphic designer spending days (or even weeks) bringing his design ideas to perfection and blocking other people (i.e. programmers) from getting started, to then finally figure out a couple of weeks later that from a UX perspective the whole thing doesn't work.&lt;br /&gt;
&lt;br /&gt;
Kinda obvious and simple once you hear it. However, most people in the industry still have their way of thinking that you have to tinker a design visually to perfection, but don't get the point that a static design is only a small proportion of what makes an application gonna work or not.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K6NH2gxxhAc/TSo50M18xCI/AAAAAAAAG3o/g-6GejEtiQ4/s1600/ui_design.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="440" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/TSo50M18xCI/AAAAAAAAG3o/g-6GejEtiQ4/s640/ui_design.jpg" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;b&gt;UI Design&lt;/b&gt; (Photo by &lt;a href="http://www.flickr.com/photos/lucamascaro/4941101192/"&gt;Lucas Mascaro&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Something I personally like a lot, is what I call &lt;i style="font-weight: bold;"&gt;"back to kindergarden"&lt;/i&gt;&amp;nbsp;or&amp;nbsp;the &lt;i&gt;&lt;b&gt;pen, paper &amp;amp; scissors&lt;/b&gt;&lt;/i&gt; approach, which basically means that we draw all pages and UI elements on paper by using different sized pens of various colors and then play around with them and walk through different use cases by moving the small paper snippets around and then discuss our ideas with other team members including developers. Including the developers is very important, because they're the ones who actually have to build the whole thing. They sometimes might restrict the creativity with bringing up all these ambiguous technological limits, but they're quite crucial when it comes down to decision making about feasibility and time estimates.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tipp:&lt;/b&gt; having pre-designed templates, which can be printed out makes it a lot easier to throw away the current ideas and start over without having to completely start all the way from scratch again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-3149284248235631561?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/fAcaJDhpdhQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/3149284248235631561/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=3149284248235631561&amp;isPopup=true" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/3149284248235631561?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/3149284248235631561?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/fAcaJDhpdhQ/rapid-prototyping-of-web-applications.html" title="Rapid Prototyping of Web Applications" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_K6NH2gxxhAc/TSo50M18xCI/AAAAAAAAG3o/g-6GejEtiQ4/s72-c/ui_design.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://www.geekmind.net/2010/11/rapid-prototyping-of-web-applications.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMGR3kyeip7ImA9Wx5VGU0.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-929459007455289233</id><published>2010-10-12T18:53:00.000+02:00</published><updated>2010-10-12T18:53:46.792+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-12T18:53:46.792+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Audio" /><category scheme="http://www.blogger.com/atom/ns#" term="MacBook" /><category scheme="http://www.blogger.com/atom/ns#" term="Apple" /><title>Hissing noise when connecting earbuds to MacBook</title><content type="html">Recently I bought some high quality Sennheiser earbuds, but since using them together with my MacBook I was annoyed by a constant hissing noise when playing back very quiet parts of a song. For a while I didn't bother and just accepted it as it is, but later on I played around with some tools in &lt;i&gt;&lt;b&gt;/Application/Utilities&lt;/b&gt;&lt;/i&gt;&amp;nbsp;and found an application called &lt;i&gt;&lt;b&gt;Audio Midi Setup&lt;/b&gt;&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K6NH2gxxhAc/TLSM9BzbqYI/AAAAAAAAG1o/ZFEIRV_0P4U/s1600/02+audio+midi+setup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://2.bp.blogspot.com/_K6NH2gxxhAc/TLSM9BzbqYI/AAAAAAAAG1o/ZFEIRV_0P4U/s400/02+audio+midi+setup.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Luckily I was listening to some calm music while randomly fooling around with these settings and when I changed the bit rate of the &lt;b&gt;&lt;i&gt;Built-In Output&lt;/i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;nbsp;from &lt;/span&gt;&lt;i&gt;2ch-16bit&lt;/i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;nbsp;to &lt;/span&gt;&lt;i&gt;2ch-24bit&lt;/i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;nbsp;all the sudden I got an impressive increase of sound output with almost no hissing noise. It's still not perfect, but definitely much better compared to what I was tortured with before. Although, increasing the bit rate all the way up to&amp;nbsp;&lt;/span&gt;&lt;i&gt;2ch-32bit&lt;/i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;nbsp;didn't cause any significant improvement to 24 bit, that's why I went with &lt;/span&gt;&lt;i&gt;2ch-24bit&lt;/i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;nbsp;for now.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;If someone can explain what the correlation between bit rate and hissing noise is, please let me know in the comments. I'm curious to know :-)&lt;/span&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-929459007455289233?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/-AUV4U2KkXE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/929459007455289233/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=929459007455289233&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/929459007455289233?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/929459007455289233?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/-AUV4U2KkXE/hissing-noise-when-connecting-earbuds.html" title="Hissing noise when connecting earbuds to MacBook" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_K6NH2gxxhAc/TLSM9BzbqYI/AAAAAAAAG1o/ZFEIRV_0P4U/s72-c/02+audio+midi+setup.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://www.geekmind.net/2010/10/hissing-noise-when-connecting-earbuds.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMBR349fip7ImA9Wx5VEUU.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-4540507546973940228</id><published>2010-10-04T10:54:00.000+02:00</published><updated>2010-10-04T10:54:16.066+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-04T10:54:16.066+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>Android: Implementing your own Listener</title><content type="html">In Android development it's quite common to use things like &lt;a href="http://developer.android.com/reference/android/view/View.OnClickListener.html"&gt;OnClickListener&lt;/a&gt; and similar listeners to implement functionality triggered by a click on a button or other state changes. You probably use them all the time, without even knowing how they work. And actually you don't need to know. But it's worthwhile investing some time, because once you got the idea it's quite simple to implement your own listeners, which can come in handy here and there.&lt;br /&gt;
&lt;br /&gt;
Listeners are pretty much callback functions implemented through &lt;a href="http://en.wikipedia.org/wiki/Interface_(Java)"&gt;Java Interfaces&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;Interfaces are commonly used in the Java language for callbacks. Java does not allow the passing of methods (procedures) as arguments. Therefore, the practice is to define an interface and use it as the argument and use the method signature knowing that the signature will be later implemented.&lt;/blockquote&gt;I will explain it with a simple example. Lets say we create our own custom &lt;a href="http://developer.android.com/reference/android/view/View.html"&gt;view&lt;/a&gt;&amp;nbsp;for our new innovative&amp;nbsp;user interface that is a bit more complex so that a normal Android &lt;a href="http://developer.android.com/reference/android/widget/Button.html"&gt;Button&lt;/a&gt; just isn't satisfactory enough for our needs. Lets say we want to have something like a color picker in it:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_K6NH2gxxhAc/TKOgnQh1JOI/AAAAAAAAG1g/o6BW_IpVIzU/s1600/color_choser.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_K6NH2gxxhAc/TKOgnQh1JOI/AAAAAAAAG1g/o6BW_IpVIzU/s1600/color_choser.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
In this case we would have our custom View &lt;i&gt;ColorPicker&lt;/i&gt;, which senses for touch events in our color field and then calculates the correct color values. Now we have the option to store that color value within the &lt;i&gt;ColorPicker&lt;/i&gt;&amp;nbsp;and add an additional &lt;i&gt;PREVIEW&lt;/i&gt;&amp;nbsp;button to our user interface, on which the user has to click to preview the selected color on for example some random text.&lt;br /&gt;
&lt;br /&gt;
If this is a process, which the user is applying a lot it will be pretty annoying to click every time on the &lt;i&gt;PREVIEW&lt;/i&gt;&amp;nbsp;button, just to update the text's color attribute and to see whether the color is okay or not. Wouldn't it be much better if the color on the text would update instantly whenever you change the selection in the color picker? This is quite an improvement to the overall user experience of your application. You reduce a step in the user's workflow and you save a button in the interface.&lt;br /&gt;
&lt;br /&gt;
And it can be realized fairly simple by using listeners (or callbacks). First you need to define a new Interface within your &lt;i&gt;ColorPicker&lt;/i&gt;&amp;nbsp;class or as a separate interface file (like a class file) for a more generic use:&lt;br /&gt;
&lt;script class="brush: java; wrap-lines: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[
public interface OnColorChangedListener {

 void onColorChanged(View v, Color color);
}
]]&gt;
&lt;/script&gt;&lt;br /&gt;
Now we have the interface definition, but we also need "something" that actually "holds" our interface. Therefor we add these lines to our ColorPicker class:&lt;br /&gt;
&lt;script class="brush: java; wrap-lines: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[
// Listeners
protected OnColorChangedListener mOnColorChangedListener;

// Setter methods
public void setOnColorChangedListener(OnColorChangedListener l) {
 this.mOnColorChangedListener = l;
}
]]&gt;
&lt;/script&gt;&lt;br /&gt;
Now we have the basic framework for our listener. In addition we add a helper method to our &lt;i&gt;ColorPicker&lt;/i&gt; class that calculates the correct color value whenever the user touches the color field and calls the &lt;i&gt;onColorChanged&lt;/i&gt;&amp;nbsp;method.&lt;br /&gt;
&lt;script class="brush: java; wrap-lines: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[
private void userSelectedNewColor(int x, int y) {
 
 // Calculate the Color here depending on the selected x and y coordinates:
 Color mColor = ....
 
 // Only call the listener if there is one set:
 if (this.mOnColorChangedListener != null) {
  this.mOnColorChangedListener.onColorChanged(this, mColor);
 }
}
]]&gt;
&lt;/script&gt;&lt;br /&gt;
The final piece that is missing now is just our control Activity, that will respond to this change. We need to create a new instance of the &lt;i&gt;OnColorChangedListener&lt;/i&gt;, assign it to our instance of the &lt;i&gt;ColorView&lt;/i&gt; and implement our callback function &lt;i&gt;onColorChanged&lt;/i&gt;, which in this case only applies the received color to &lt;i&gt;myText&lt;/i&gt;. But you can implement here whatever you feel like.&lt;br /&gt;
&lt;script class="brush: java; wrap-lines: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[
mColorView.setOnColorChangedListener(new OnColorChangedListener() {

 @Override
 public void onColorChanged(View v, Color color) {
  // Apply color to text:
  this.myText.setColor(color);
 }
});
]]&gt;
&lt;/script&gt;&lt;br /&gt;
I hope this tutorial was easy to understand. If there are still some issues that need to be cleared up please let me know in the comments. Interfaces might look like a bit of a hassle in the actual process of writing them down, but they will help you a lot in writing clearer code and designing the architecture of your application in a more structured way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-4540507546973940228?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/uE2pHhuwMA0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/4540507546973940228/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=4540507546973940228&amp;isPopup=true" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/4540507546973940228?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/4540507546973940228?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/uE2pHhuwMA0/android-implementing-your-own-listener.html" title="Android: Implementing your own Listener" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_K6NH2gxxhAc/TKOgnQh1JOI/AAAAAAAAG1g/o6BW_IpVIzU/s72-c/color_choser.png" height="72" width="72" /><thr:total>8</thr:total><feedburner:origLink>http://www.geekmind.net/2010/10/android-implementing-your-own-listener.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEANSH4_fip7ImA9Wx5RF0g.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-6215510511819116142</id><published>2010-07-25T18:41:00.033+02:00</published><updated>2010-08-25T19:19:59.046+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-25T19:19:59.046+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="UI" /><category scheme="http://www.blogger.com/atom/ns#" term="quick and dirty" /><title>Android: Display dialogs in fullscreen</title><content type="html">Ever wondered how to maximize a dialog to the screen's full size? The first thing probably everyone would naturally do is to set&lt;br /&gt;
&lt;blockquote&gt;android:layout_width="fill_parent" android:layout_height="fill_parent"&lt;/blockquote&gt;in your &lt;i&gt;mydialog.xml &lt;/i&gt;layout file. However, that doesn't seem to have any effect at all.&lt;br /&gt;
&lt;br /&gt;
The solution that works is not much more complicated than that, but unfortunately not that easy to think of in the first place. What you have to do is, when you setup your &lt;i&gt;Dialog&lt;/i&gt;&amp;nbsp;in code, you have to set (&lt;b&gt;again&lt;/b&gt;) your layout (as you do in the .xml file) &lt;b&gt;after&lt;/b&gt; you set your content view.&lt;br /&gt;
&lt;script class="brush: java; wrap-lines: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[
myDialog = new Dialog(this);
myDialog.setContentView(R.layout.mydialog);
myDialog.setTitle("My test dialog");
  
window.setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

myDialog.show();
]]&gt;
&lt;/script&gt;I don't know why it works when set in code and not when set in the .xml file, but for now I just accept that it does. If you know the answer to this please let me know in the comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-6215510511819116142?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/FKtEmh72Jt0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/6215510511819116142/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=6215510511819116142&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/6215510511819116142?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/6215510511819116142?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/FKtEmh72Jt0/android-display-dialogs-in-fullscreen.html" title="Android: Display dialogs in fullscreen" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://www.geekmind.net/2010/07/android-display-dialogs-in-fullscreen.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cER306cCp7ImA9Wx5REEs.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-7109064227414161075</id><published>2010-06-17T17:44:00.006+02:00</published><updated>2010-08-17T18:03:26.318+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-17T18:03:26.318+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="UI" /><category scheme="http://www.blogger.com/atom/ns#" term="quick and dirty" /><title>Android: open new Activity as Dialog</title><content type="html">Did you ever have the problem that your pop-up dialog was so complex that it messed its parent's activity's code? There is a very simple solution to that. Just create the whole thing as a new activity class and change them theme to &lt;i&gt;Theme.Dialog&lt;/i&gt; in your &lt;i&gt;AndroidManifest.xml&lt;/i&gt;&amp;nbsp;for that specific activity:&lt;br /&gt;
&lt;pre class="brush: xml;"&gt;&lt;activity android:label="My Dialog (activity)" android:name=".MyActivity" android:theme="@android:style/Theme.Dialog"&gt;&lt;/activity&gt;&lt;/pre&gt;And the result should looking similar to this:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_K6NH2gxxhAc/TGqvepaBPKI/AAAAAAAAGzU/NpT8rGo16j8/s1600/dialogactivity.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_K6NH2gxxhAc/TGqvepaBPKI/AAAAAAAAGzU/NpT8rGo16j8/s320/dialogactivity.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
That's a really quick &amp;amp; dirty hack. However, the most important thing I learned out of this "accident" is, that I now know how I can easily customize the basic look of my activity screens, just by changing the android:theme attribute in the activity element of the &lt;i&gt;AndroidManifest.xml&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-7109064227414161075?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/fFE3BduiAv8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/7109064227414161075/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=7109064227414161075&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/7109064227414161075?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/7109064227414161075?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/fFE3BduiAv8/android-open-new-activity-as-dialog.html" title="Android: open new Activity as Dialog" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_K6NH2gxxhAc/TGqvepaBPKI/AAAAAAAAGzU/NpT8rGo16j8/s72-c/dialogactivity.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://www.geekmind.net/2010/06/android-open-new-activity-as-dialog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcDRX0_fCp7ImA9Wx5SGU0.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-5432044455975368983</id><published>2010-05-15T20:58:00.059+02:00</published><updated>2010-08-15T21:54:34.344+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-15T21:54:34.344+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="iPhone" /><category scheme="http://www.blogger.com/atom/ns#" term="UI" /><category scheme="http://www.blogger.com/atom/ns#" term="quick and dirty" /><title>iPhone: "abuse" UITabBar to provide simple, good looking buttons</title><content type="html">The iPhone's &lt;a href="http://developer.apple.com/iphone/library/documentation/uikit/reference/UITabBar_Class/Reference/Reference.html"&gt;UITabBar&lt;/a&gt;&amp;nbsp;can also be used to provide as a simple, good looking solution adding extra functionality to the current screen. Similar to what Android tries to solve with the menu button, which, when selected pops up a menu providing extra functionality. Since the iPhone doesn't have a menu I thought why not use a UITabBar for that, which saves you a lot of time developing your own custom solution.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_K6NH2gxxhAc/TGhCBxCNuOI/AAAAAAAAGzM/Vf3-TTtHGc4/s1600/Screen+shot+2010-07-06+at+4.11.46+PM.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_K6NH2gxxhAc/TGhCBxCNuOI/AAAAAAAAGzM/Vf3-TTtHGc4/s320/Screen+shot+2010-07-06+at+4.11.46+PM.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;UITabBar items "abused" as buttons&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Each UITabBar has a &lt;a href="http://developer.apple.com/iphone/library/documentation/uikit/reference/UITabBarDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UITabBarDelegate"&gt;UITabBarDelegate&lt;/a&gt;, which requires you to implement&lt;br /&gt;
&lt;blockquote&gt;(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item&lt;/blockquote&gt;for example like this:&lt;br /&gt;
&lt;script class="brush: cpp; wrap-lines: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {
 switch (item.tag) {
  case 0:
   [self showSortingSheet];
   break;
  case 1:
  {
   VCMapViewChangeLocation *mapViewController = [[VCMapViewChangeLocation alloc] initWithNibName:@"VCMapViewChangeLocation" bundle:nil];
   [self.navigationController pushViewController:mapViewController animated:YES];
   [mapViewController release];
   break;
  }
  case 2:
  {
   VCMyProfile *vcMyProfile = [[VCMyProfile alloc] initWithNibName:@"VCMyProfile" bundle:nil];
   [self.navigationController pushViewController:vcMyProfile animated:TRUE];
   [vcMyProfile release]; 
  }
  default:
   break;
 }
}
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
However, there is one little annoyance. Whenever you click a button on a UITabBar it stays selected. Which is the right thing to do, when you actually use it as a tab bar. But since we are not, we have to add a little line of code in our UITabBarDelegate method:&lt;br /&gt;
&lt;blockquote&gt;[self.localNavigation setSelectedItem:nil];&lt;/blockquote&gt;This line makes sure, that as soon as we select a tab item in the UITabBar it immediately gets deselected again, with the result that it appears to the user like a normal button behavior.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Warning:&lt;/b&gt;&amp;nbsp;this solution worked perfectly for me in the past. However, Apple might reject future applications, since you're giving the UITabBar a totally different purpose as it was originally meant for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-5432044455975368983?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/PoVlvk8Jm_E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/5432044455975368983/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=5432044455975368983&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/5432044455975368983?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/5432044455975368983?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/PoVlvk8Jm_E/iphone-abuse-uitabbar-to-provide-simple.html" title="iPhone: &quot;abuse&quot; UITabBar to provide simple, good looking buttons" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_K6NH2gxxhAc/TGhCBxCNuOI/AAAAAAAAGzM/Vf3-TTtHGc4/s72-c/Screen+shot+2010-07-06+at+4.11.46+PM.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.geekmind.net/2010/05/iphone-abuse-uitabbar-to-provide-simple.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEDRng4fip7ImA9WxBaFUg.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-2261908605575802447</id><published>2010-03-25T23:54:00.001+01:00</published><updated>2010-03-26T00:11:17.636+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-26T00:11:17.636+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="bookmarks" /><category scheme="http://www.blogger.com/atom/ns#" term="shortcuts" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Chrome" /><title>Chrome: adding shortcuts to bookmarks</title><content type="html">In Firefox you can associate shortcuts to your bookmarks, which I used to:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;quickly open &lt;b&gt;frequently used sites&lt;/b&gt;, e.g. Gmail, Facebook, etc. or&lt;/li&gt;
&lt;li&gt;to open a page with a &lt;b&gt;specific topic&lt;/b&gt;, e.g. the Wikipedia article about "Linux" or&lt;/li&gt;
&lt;li&gt;to trigger a &lt;b&gt;custom search or query&lt;/b&gt;, e.g. on Google Translate&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Now that I recently switched from Firefox to Chrome I imported my Firefox bookmarks and still had the shortcuts available, but when I edited my bookmarks I couldn't find the option to modify the shortcuts, neither could I add new shortcuts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;After playing around a while I finally found something called &lt;b&gt;"Search Engines"&lt;/b&gt;, which is a bit of a misleading name, but does exactly the same as bookmark shortcuts in Firefox.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;You get there by right clicking on the &lt;b&gt;URL bar / search bar&lt;/b&gt; and selecting &lt;b&gt;Edit Search Engines...&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K6NH2gxxhAc/S6voMM-w5KI/AAAAAAAAGOQ/ZtN16AP6phQ/s1600/01_chrome_shortcuts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K6NH2gxxhAc/S6voMM-w5KI/AAAAAAAAGOQ/ZtN16AP6phQ/s320/01_chrome_shortcuts.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Now, when you click on &lt;b&gt;Add&lt;/b&gt;&amp;nbsp;you get a form like this, where &lt;b&gt;Keyword&lt;/b&gt;&amp;nbsp;is the shortcut you use in the address bar, &lt;b&gt;URL&lt;/b&gt;&amp;nbsp;the site where you wanna go with &lt;b&gt;%s&lt;/b&gt;&amp;nbsp;as a placeholder for your search term.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_K6NH2gxxhAc/S6vogpyYGxI/AAAAAAAAGOY/6M3ix3UIdkk/s1600/03_chrome_shortcuts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_K6NH2gxxhAc/S6vogpyYGxI/AAAAAAAAGOY/6M3ix3UIdkk/s320/03_chrome_shortcuts.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;&lt;div&gt;In this case to get to the Wikipedia article for "Linux" I would just have to enter &lt;b&gt;"wiki Linux"&lt;/b&gt;&amp;nbsp;in the address bar and I get directly there.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;In case you wanna go to a static URL like &lt;a href="https://mail.google.com/"&gt;Gmail&lt;/a&gt; you just don't use the &lt;b&gt;%s&lt;/b&gt;&amp;nbsp;placeholder and enter the URL completely.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-2261908605575802447?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/3W_NOKdh_So" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/2261908605575802447/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=2261908605575802447&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/2261908605575802447?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/2261908605575802447?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/3W_NOKdh_So/chrome-adding-shortcuts-to-bookmarks.html" title="Chrome: adding shortcuts to bookmarks" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_K6NH2gxxhAc/S6voMM-w5KI/AAAAAAAAGOQ/ZtN16AP6phQ/s72-c/01_chrome_shortcuts.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.geekmind.net/2010/03/chrome-adding-shortcuts-to-bookmarks.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYNQH4-fCp7ImA9WxBUGUU.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-9146407912970552648</id><published>2010-03-07T17:57:00.002+01:00</published><updated>2010-03-07T18:16:31.054+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-07T18:16:31.054+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>Andoid: Eclipse error  "Conversion to Dalvik format failed"</title><content type="html">If you receive this error in Eclipse when compiling large .java files or using big .jar libraries&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;[2009-03-30 17:28:14 - Dex Loader] Unable to execute dex: null
[2009-03-30 17:28:14 - MyProject] Conversion to Dalvik format failed: 
Unable to execute dex: null&amp;nbsp;&lt;/pre&gt;&lt;/blockquote&gt;then add the following to your &lt;i&gt;eclipse.ini&lt;/i&gt; and the problem should be fixed:&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;-Xms128m
-Xmx512m&lt;/pre&gt;&lt;/blockquote&gt;Still problems? Increase these values and try again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-9146407912970552648?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/BxlXh7g5cHI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/9146407912970552648/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=9146407912970552648&amp;isPopup=true" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/9146407912970552648?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/9146407912970552648?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/BxlXh7g5cHI/andoid-eclipse-error-conversion-to.html" title="Andoid: Eclipse error  &quot;Conversion to Dalvik format failed&quot;" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://www.geekmind.net/2010/03/andoid-eclipse-error-conversion-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MGQ3w-eSp7ImA9WxFSEEs.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-6381226380166065465</id><published>2010-03-07T15:40:00.005+01:00</published><updated>2010-04-12T11:43:42.251+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-12T11:43:42.251+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="iPhone" /><category scheme="http://www.blogger.com/atom/ns#" term="debug" /><title>iPhone: debugging EXC_BAD_ACCESS errors</title><content type="html">After developing for iPhone and Android for quite some time now I consider myself an advanced developer on both these mobile platforms. But even though I left the beginner stage, sometimes things still don't work as they should (or at least as I expected) and I thought sharing some of my learning experiences would help other developers to lessen their pain.&lt;br /&gt;
&lt;br /&gt;
One of the biggest pains (besides Objective-C itself) is definitely the memory management on the iPhone. Luckily we don't have this problems on Android, due to the fact of using Java and garbage collection, which makes programming an ease (almost!) and enables you to focus on creating something rather than wasting a lot of time debugging. However, Apple decided not to include garbage collection for the iPhone, even though it's available within their frameworks and is actually used for Mac development. I won't elaborate much more on the pros and cons of &lt;a href="http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html"&gt;Objective-C's memory management&lt;/a&gt; and the object ownership concept, since a lot of other bloggers ranted about that topic already too many times before me, but rather give you some useful tips to reduce the time you spend debugging.&lt;br /&gt;
&lt;br /&gt;
The most common problem you will have is probably an&lt;i&gt; EXC_BAD_ACCESS&lt;/i&gt; error, which occurs when you try to release memory that has already been released. This could be the reason if for example you try&lt;br /&gt;
&lt;ul&gt;&lt;li&gt; to release an object, which you don't own&lt;/li&gt;
&lt;li&gt;to release an object, which is in the autorelease pool&lt;/li&gt;
&lt;li&gt;to release an object, which has the "assign" property instead of "retain"&lt;/li&gt;
&lt;/ul&gt;&lt;a name='more'&gt;&lt;/a&gt;The problem with that is, that the error doesn't occur at the point where you accidentally release the object, but when the object gets released somewhere else at a later point in the code, where it is actually supposed to be released. This could be either by another owner or when the autorelease pool is getting cleaned-up. And this &lt;i&gt;"somewhere else"&lt;/i&gt; might not be easy to find. In general I recommend to compile and test your code as often as possible, because of the complex way you have to declare variables and allocate memory in Objective-C (declare, @property, @synthesize, eventually retain and release) it's very likely that you forget one of the steps in your code, especially when things need to be done quickly. In the end you will spend more time debugging and finding the problem than what it would have taken with just being more thorough from the beginning on.&lt;br /&gt;
&lt;br /&gt;
You might, for example, get an output like this:&lt;br /&gt;
&lt;blockquote&gt;2010-03-07 15:03:11.136 MyProject[&lt;span style="color: red;"&gt;58016&lt;/span&gt;:207] *** -[UIView setFrame:]: message sent to deallocated instance &lt;span style="color: red;"&gt;0x1b33240&lt;/span&gt;&lt;br /&gt;
Program received signal:&amp;nbsp; “EXC_BAD_ACCESS”. &lt;/blockquote&gt;Finding the source of that problem is hard by just knowing the object's address in memory: &lt;i&gt;0x1b33240&lt;/i&gt;. Thus we should enable a few options in our executable's settings: under &lt;i&gt;group &amp;amp; files&lt;/i&gt; doubleclick on your executable and then under the "&lt;i&gt;Arguments&lt;/i&gt;" tab add and enable the following options: &lt;br /&gt;
&lt;blockquote&gt;NSDebugEnabled&lt;br /&gt;
MallocStackLogging&lt;br /&gt;
NSZombieEnabled&lt;br /&gt;
MallocStackLoggingNoCompact &lt;/blockquote&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K6NH2gxxhAc/S5O1e3V9t3I/AAAAAAAAGJ8/FW7niU_QC8s/s1600-h/01+executable+properties.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_K6NH2gxxhAc/S5O1e3V9t3I/AAAAAAAAGJ8/FW7niU_QC8s/s400/01+executable+properties.png" width="337" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Now recompile your code, run it in the simulator and try to reproduce the same error you had before. But this time you will be able to enter the following command in &lt;i&gt;gdb&lt;/i&gt;:&lt;br /&gt;
&lt;blockquote&gt;&lt;i&gt;shell malloc_history $PID $ADDRESS_OF_OBJECT_IN_MEMORY&lt;pid&gt; &lt;object's address="" in="" memory=""&gt;&lt;/object's&gt;&lt;/pid&gt;&lt;/i&gt;&lt;/blockquote&gt;In our case that would be (see the pid and address I marked red above):&lt;br /&gt;
&lt;blockquote&gt;&lt;i&gt;shell malloc_history &lt;span style="color: red;"&gt;58016&lt;/span&gt; &lt;span style="color: red;"&gt;0x1b33240&lt;/span&gt;&lt;/i&gt;&lt;/blockquote&gt;and results with the following (or similar) output: &lt;br /&gt;
&lt;blockquote&gt;ALLOC 0x1b33240-0x1b33267 [size=40]: thread_a02fa500 |start | main | UIApplicationMain | -[UIApplication _run] | CFRunLoopRunInMode | CFRunLoopRunSpecific | PurpleEventCallback | _UIApplicationHandleEvent | -[UIApplication sendEvent:] | -[UIApplication handleEvent:withNewEvent:] | -[UIApplication _reportAppLaunchFinished] | CA::Transaction::commit() | CA::Context::commit_transaction(CA::Transaction*) | CALayerLayoutIfNeeded | -[CALayer layoutSublayers] | -[UILayoutContainerView layoutSubviews] | -[UINavigationController _startDeferredTransitionIfNeeded] | -[UINavigationController _startTransition:fromViewController:toViewController:] | -[UINavigationController _layoutViewController:] | -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] | -[UIViewController contentScrollView] | -[UIViewController view] |&lt;b&gt;&lt;span style="color: red;"&gt; -[CategorySuperViewController loadView] | -[CategoryViewController initWithStyle:] | -[Functionality requestNewAd] | +[AdMobView requestAdWithDelegate:]&lt;/span&gt;&lt;/b&gt; | +[NSObject alloc] | +[NSObject allocWithZone:] | _internal_class_createInstance | _internal_class_createInstanceFromZone | calloc | malloc_zone_calloc &lt;/blockquote&gt;What we can see is where exactly the error occurs, but we still don't know by what it is caused and where this happens in the code. What we know though, is that it has something to do with an AdMobView object, which we most likely &lt;i&gt;released&lt;/i&gt; at some other point in our code where we shouldn't have released it (because we didn't have ownership or because it's on autorelease).&lt;br /&gt;
&lt;br /&gt;
To fix the problem we just check all AdMobView releases. If you're unsure you can just temporarily disable them, recompile and run it again to see if that was the problem. Another thing, that happens to me sometimes, is that I accidentally type &lt;i&gt;dealloc&lt;/i&gt; instead of &lt;i&gt;release&lt;/i&gt;, which immediately removes the object from memory, while with a &lt;i&gt;release&lt;/i&gt; it might keep existing, because it may still be owned by someone else. In general, never use &lt;i&gt;dealloc&lt;/i&gt; (unless you really know what you're doing).&lt;br /&gt;
&lt;br /&gt;
I hope this helps you to make iPhone development and debugging a bit easier and please let me know if something is still unclear.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-6381226380166065465?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/1Bf7Pmp8IWk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/6381226380166065465/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=6381226380166065465&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/6381226380166065465?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/6381226380166065465?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/1Bf7Pmp8IWk/iphone-debugging-excbadaccess-errors.html" title="iPhone: debugging EXC_BAD_ACCESS errors" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_K6NH2gxxhAc/S5O1e3V9t3I/AAAAAAAAGJ8/FW7niU_QC8s/s72-c/01+executable+properties.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://www.geekmind.net/2010/03/iphone-debugging-excbadaccess-errors.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AFQHs8cCp7ImA9WxBUGUs.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-8267065886849679501</id><published>2010-03-07T13:41:00.000+01:00</published><updated>2010-03-07T13:41:51.578+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-07T13:41:51.578+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="Swype" /><title>Swype beta for Android</title><content type="html">After having been using the leaked version of &lt;a href="http://swypeinc.com/"&gt;Swype&lt;/a&gt; for a while, I'm happy to hear that they finally provide an &lt;a href="http://beta.swype.com/"&gt;official beta for Android&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
If you haven't heard about Swype, yet, it's an innovate new way of rapidly entering text on&amp;nbsp;mobile touch screen devices.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K6NH2gxxhAc/S5OaQs0J7SI/AAAAAAAAGJ0/-KxA7OQJsUs/s1600-h/swypetextentry.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="252" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/S5OaQs0J7SI/AAAAAAAAGJ0/-KxA7OQJsUs/s320/swypetextentry.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I highly recommend that you give it a try. I cannot image going back to the standard Android or iPhone keyboard, even though they're pretty good themselves. Check out this video comparing Swype with a standard touch keyboard.&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/pTooBnKAdSw&amp;hl=en_US&amp;fs=1&amp;rel=0&amp;color1=0x234900&amp;color2=0x4e9e00"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/pTooBnKAdSw&amp;hl=en_US&amp;fs=1&amp;rel=0&amp;color1=0x234900&amp;color2=0x4e9e00" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
Finally convinced? Get it &lt;a href="http://beta.swype.com/"&gt;here&lt;/a&gt; on Swype's beta page. Unfortunatelly, they made it a bit of a hassle to install. First you have to sign-up for their limited beta program, then you have to download the Swype Installer, install it, run it and log in. Now it will actually download the "real" Swype keyboard application. Need more details and help? Swype provides a &lt;a href="https://beta.swype.com//android/welcome/detailed/"&gt;step-by-step guide&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Some users, including myself, who had the leaked version of Swype installed before, might have some problems when switching over to the official beta. I got the following message:&lt;br /&gt;
&lt;blockquote&gt;"The Swype package you installed is configured for another device and  will operate with limited functionality. Please contact Swype about this  issue."&lt;/blockquote&gt;and wasn't actually able to swype. Pressing the letters one by one (like on a normal keyboard) worked, though. As a &lt;a href="http://forum.xda-developers.com/showthread.php?p=5810990#post5810990"&gt;user pointed out on xda-developers.com&lt;/a&gt;&amp;nbsp;you have to do the following steps to make it finally work:&lt;br /&gt;
&lt;blockquote&gt;1) Long hold your text box.&lt;br /&gt;
2) Switch input methods to another keyboard.&lt;br /&gt;
3) Type a letter or two. Swap back to Swype.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-8267065886849679501?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/gB9ji7Lom8s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/8267065886849679501/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=8267065886849679501&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/8267065886849679501?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/8267065886849679501?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/gB9ji7Lom8s/swype-beta-for-android.html" title="Swype beta for Android" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_K6NH2gxxhAc/S5OaQs0J7SI/AAAAAAAAGJ0/-KxA7OQJsUs/s72-c/swypetextentry.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.geekmind.net/2010/03/swype-beta-for-android.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcNQX46eip7ImA9WxBXEko.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-1668877719234642836</id><published>2010-01-23T20:46:00.001+01:00</published><updated>2010-01-23T20:48:10.012+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-23T20:48:10.012+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="layout" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="resource" /><title>Android: providing different layout resources for older versions</title><content type="html">To provide backward compatibility with older phones still running on &lt;i&gt;Android 1.5&lt;/i&gt; you might have to provide separate layout resources for &lt;i&gt;Android 1.5&lt;/i&gt; and &lt;i&gt;Android 1.6+&lt;/i&gt;. Especially when dealing a lot with &lt;i&gt;RelativeLayout&lt;/i&gt;, which was basically crap before &lt;i&gt;Android 1.6&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Instead of having one &lt;i&gt;res/layout&lt;/i&gt; folder we will create two new folders:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;i&gt;res/layout-v3&lt;/i&gt; for Android 1.5&lt;/li&gt;
&lt;li&gt;&lt;i&gt;res/layout-v4&lt;/i&gt; for Android 1.6 and higher&lt;/li&gt;
&lt;/ul&gt;Now move all your files to &lt;i&gt;res/layout-v3&lt;/i&gt; and test your application on various phones and emulators (which are running different Android versions). Whenever you see that there's a non-acceptable difference in the layout copy the responsible &lt;i&gt;.xml&lt;/i&gt;-file to the &lt;i&gt;res/layout-v4&lt;/i&gt; folder and modify the file in both folders so that they work for &lt;i&gt;Android 1.5&lt;/i&gt; and &lt;i&gt;Android 1.6 and higher&lt;/i&gt; again. Android will then pick the right layout resource during runtime depending on its current firmware version.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Bug in Android 2.0&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
There seems to be a bug in Android 2.0. Instead of picking the resource from &lt;i&gt;res/layout-v4&lt;/i&gt; as it should and if it doesn't find it there then from &lt;i&gt;res/layout-v3&lt;/i&gt;, it expects the the resource wrongly in the default &lt;i&gt;res/layout&lt;/i&gt; folder. To make it work you should rename &lt;i&gt;res/layout-v3&lt;/i&gt; back to &lt;i&gt;res/layout&lt;/i&gt; again (or just create a symlink). The second problem or bug that comes with it, is to provide the special resources for Android 2.0 or higher. Instead of providing those in &lt;i&gt;res/layout-v5&lt;/i&gt; Android 2.0 expects wrongly &lt;i&gt;res/layout-v6&lt;/i&gt;. So just use this instead for now. The bug is fixed in Android 2.0.1, but there are still quite some Android 2.0 phones out there.&lt;br /&gt;
&lt;br /&gt;
I hope this post is not too confusing ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-1668877719234642836?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/8RR6ocL14yk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/1668877719234642836/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=1668877719234642836&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/1668877719234642836?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/1668877719234642836?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/8RR6ocL14yk/android-providing-different-layout.html" title="Android: providing different layout resources for older versions" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.geekmind.net/2010/01/android-providing-different-layout.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YHQ3g5fyp7ImA9Wx5XFEk.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-286516756751546209</id><published>2009-11-21T20:05:00.004+01:00</published><updated>2010-09-14T09:25:32.627+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-14T09:25:32.627+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial" /><category scheme="http://www.blogger.com/atom/ns#" term="ListView" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>Android: Custom List Item with nested clickable Button</title><content type="html">This tutorial will show you how to add a button (or any other clickable item) to a customized list view item.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_K6NH2gxxhAc/Swg0hqNDlTI/AAAAAAAAEQU/4qG-YjJRuBM/s1600/Android_ButtonOnListView.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_K6NH2gxxhAc/Swg0hqNDlTI/AAAAAAAAEQU/4qG-YjJRuBM/s320/Android_ButtonOnListView.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
In the screenshot above you can see a &lt;a href="http://developer.android.com/reference/android/widget/ListView.html"&gt;ListView&lt;/a&gt; with custom built items. Each list item consists of&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;TextView for the title&lt;/li&gt;
&lt;li&gt;TextView for the content&lt;/li&gt;
&lt;li&gt;RelativeLayout (&lt;b&gt;clickable&lt;/b&gt;) consisting of&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;TextView: "For more information click here"&lt;/li&gt;
&lt;li&gt;ImageView for the arrow icon&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;We start this tutorial at a point where you should already know how to create your own customized ListViews and Adapters. If you have no clue how to do so please let me know in the comments. If there's a demand I will eventually compile another tutorial about creating custom list items and list adapters in the future.&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;1) Build custom adapter that extends &lt;a href="http://developer.android.com/reference/android/widget/BaseAdapter.html"&gt;BaseAdapter&lt;/a&gt; and implement all the required inherited abstract methods from the parent class:&lt;/b&gt;&lt;br /&gt;
&lt;script class="brush: js; wrap-lines: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[
public class MyAdapter extends BaseAdapter {
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;b&gt;2) Implement &lt;a href="http://developer.android.com/reference/android/widget/Adapter.html#getView%28int,%20android.view.View,%20android.view.ViewGroup%29"&gt;View getView(int position, View convertView, ViewGroup parent)&lt;/a&gt;:&lt;/b&gt;&lt;br /&gt;
This is where you create and manipulate the view that is used for a list item. I highly recommend that you take advantage of a view holder as it is described in this &lt;a href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html"&gt;API example&lt;/a&gt; to improve speed and efficiency.&lt;br /&gt;
&lt;br /&gt;
The crucial part is now that you, after you have inflated the list item's main layout &lt;br /&gt;
&lt;script class="brush: js; wrap-lines: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[
convertView = mInflater.inflate(R.layout.list_item, null);
]]&gt;
&lt;/script&gt;&lt;br /&gt;
you also need to get hold of the sub-layout (bottom part). That's the part you want to be clickable. &lt;br /&gt;
&lt;script class="brush: js; wrap-lines: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[
holder.layout_bottom = (RelativeLayout) convertView.findViewById(R.id.layout_listitem_bottom);
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;b&gt;3) Create an onClickListener for the bottom layout and associate the data (in this case a web URL) with the current view:&lt;/b&gt;&lt;br /&gt;
&lt;script class="brush: js; wrap-lines: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[
holder.layout_bottom.setFocusable(true);
holder.layout_bottom.setClickable(true);
holder.layout_bottom.setTag(curItem.url);
holder.layout_bottom.setOnClickListener(new OnClickListener() {
 @Override
 public void onClick(View view) {
  String url = (String) view.getTag();
  Intent myIntent = new Intent(view.getContext(), WebView_Activity.class);
  myIntent.putExtra("url", url);
  view.getContext().startActivity(myIntent);
 }
});
]]&gt;
&lt;/script&gt;&lt;br /&gt;
While for a &lt;a href="http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html"&gt;OnItemClickListener&lt;/a&gt;, which is associated to each item of a ListView, we always know which item of the list has been selected through the int position paremeter. We don't have this information for our &lt;a href="http://developer.android.com/reference/android/view/View.OnClickListener.html"&gt;OnClickListener&lt;/a&gt; that is used in the bottom layout. So how do we get the neccessary information that is associated to the current list item?&lt;br /&gt;
&lt;br /&gt;
The trick is to use &lt;a href="http://developer.android.com/reference/android/view/View.html#setTag%28java.lang.Object%29"&gt;View.setTag()&lt;/a&gt; and &lt;a href="http://developer.android.com/reference/android/view/View.html#getTag%28%29"&gt;View.getTag()&lt;/a&gt;. The Android documentation states: &lt;i&gt;“Sets the tag associated with this view. A tag can be used to mark a view in its hierarchy and does not have to be unique within the hierarchy. Tags can also be used to &lt;u&gt;store data within a view&lt;/u&gt; without resorting to another data structure.”&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
In this example we use setTag() to store an URL with each sub-layout and getTag() in the onClickListener to extract that URL whenever a sub-layout was clicked. Then we create an Intent for our WebView, pass the URL to it and start a new Activity. And Voilà! You should have a web browser now displaying the website associated to the item you clicked before. &lt;br /&gt;
&lt;br /&gt;
However, there's one little detail that keeps annoying me. Even though I now can click/tap the bar at the bottom via the touch screen interface I'm not able to select it via the trackball. It always selects the whole list item (see screenshot below) and from there goes directly to the next list item ignoring the bottom bar, even though I set &lt;code&gt;.setFocusable(true)&lt;/code&gt; and &lt;code&gt;setClickable(true)&lt;/code&gt; for the bottom bar's RelativeLayout in &lt;code&gt;getView()&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_K6NH2gxxhAc/Swg5DSrwZOI/AAAAAAAAEQc/a0EZzO86weU/s1600/Android_ButtonOnListView_Selector.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_K6NH2gxxhAc/Swg5DSrwZOI/AAAAAAAAEQc/a0EZzO86weU/s320/Android_ButtonOnListView_Selector.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
If anyone knows a solution to this please let me know in the comments or respond to &lt;a href="http://stackoverflow.com/questions/1709166/android-listview-elements-with-multiple-clickable-buttons"&gt;my question&lt;/a&gt; asked on stackoverflow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-286516756751546209?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/KgpdE5m7VhE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/286516756751546209/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=286516756751546209&amp;isPopup=true" title="28 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/286516756751546209?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/286516756751546209?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/KgpdE5m7VhE/android-custom-list-item-with-nested.html" title="Android: Custom List Item with nested clickable Button" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_K6NH2gxxhAc/Swg0hqNDlTI/AAAAAAAAEQU/4qG-YjJRuBM/s72-c/Android_ButtonOnListView.png" height="72" width="72" /><thr:total>28</thr:total><feedburner:origLink>http://www.geekmind.net/2009/11/android-custom-list-item-with-nested.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UDRH89fCp7ImA9WhZRFkQ.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-6441728542276885039</id><published>2009-11-07T16:02:00.010+01:00</published><updated>2011-04-13T12:41:15.164+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-13T12:41:15.164+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial" /><category scheme="http://www.blogger.com/atom/ns#" term="JSON" /><category scheme="http://www.blogger.com/atom/ns#" term="HTTP" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>Android: Simple HttpClient to send/receive JSON Objects</title><content type="html">This tutorial is focused on creating a very simple HTTP client for Google's mobile operating system &lt;a href="http://en.wikipedia.org/wiki/Android_%28operating_system%29"&gt;Android&lt;/a&gt;, which then can communicate with a web server and exchange &lt;a href="http://en.wikipedia.org/wiki/JSON"&gt;JSON&lt;/a&gt; information. I won't go too much into detail, since the code is pretty much self-explaining and already has a lot of comments describing the program flow.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_K6NH2gxxhAc/SvWUpjsWIcI/AAAAAAAAEL8/cPPLLmBGgFY/s1600-h/SimpleHttpClient_JSON.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_K6NH2gxxhAc/SvWUpjsWIcI/AAAAAAAAEL8/cPPLLmBGgFY/s320/SimpleHttpClient_JSON.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;1) Create a new Android project&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2) Add permission to access the Internet from your application to your &lt;i&gt;AndroidManifest.xml&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush: xml;"&gt;&lt;manifest&gt;
    
    &lt;uses-permission android:name="android.permission.INTERNET"&gt;
&lt;/uses-permission&gt;
&lt;/manifest&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;3)&amp;nbsp;Create a new (static) class called &lt;i&gt;HttpClient.java&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;script class="brush: js; wrap-lines: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[
/***
 Copyright (c) 2009 
 Author: Stefan Klumpp &lt;stefan.klumpp@gmail.com&gt;
 Web: http://stefanklumpp.com

 Licensed under the Apache License, Version 2.0 (the "License"); you may
 not use this file except in compliance with the License. You may obtain
 a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 */

package com.devstream.http;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.zip.GZIPInputStream;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONObject;
import android.util.Log;

public class HttpClient {
 private static final String TAG = "HttpClient";

 public static JSONObject SendHttpPost(String URL, JSONObject jsonObjSend) {

  try {
   DefaultHttpClient httpclient = new DefaultHttpClient();
   HttpPost httpPostRequest = new HttpPost(URL);

   StringEntity se;
   se = new StringEntity(jsonObjSend.toString());

   // Set HTTP parameters
   httpPostRequest.setEntity(se);
   httpPostRequest.setHeader("Accept", "application/json");
   httpPostRequest.setHeader("Content-type", "application/json");
   httpPostRequest.setHeader("Accept-Encoding", "gzip"); // only set this parameter if you would like to use gzip compression

   long t = System.currentTimeMillis();
   HttpResponse response = (HttpResponse) httpclient.execute(httpPostRequest);
   Log.i(TAG, "HTTPResponse received in [" + (System.currentTimeMillis()-t) + "ms]");

   // Get hold of the response entity (-&gt; the data):
   HttpEntity entity = response.getEntity();

   if (entity != null) {
    // Read the content stream
    InputStream instream = entity.getContent();
    Header contentEncoding = response.getFirstHeader("Content-Encoding");
    if (contentEncoding != null &amp;amp;&amp;amp; contentEncoding.getValue().equalsIgnoreCase("gzip")) {
     instream = new GZIPInputStream(instream);
    }

    // convert content stream to a String
    String resultString= convertStreamToString(instream);
    instream.close();
    resultString = resultString.substring(1,resultString.length()-1); // remove wrapping "[" and "]"

    // Transform the String into a JSONObject
    JSONObject jsonObjRecv = new JSONObject(resultString);
    // Raw DEBUG output of our received JSON object:
    Log.i(TAG,"&lt;jsonobject&gt;\n"+jsonObjRecv.toString()+"\n&lt;/jsonobject&gt;");

    return jsonObjRecv;
   } 

  }
  catch (Exception e)
  {
   // More about HTTP exception handling in another tutorial.
   // For now we just print the stack trace.
   e.printStackTrace();
  }
  return null;
 }


 private static String convertStreamToString(InputStream is) {
  /*
   * To convert the InputStream to String we use the BufferedReader.readLine()
   * method. We iterate until the BufferedReader return null which means
   * there's no more data to read. Each line will appended to a StringBuilder
   * and returned as String.
   * 
   * (c) public domain: http://senior.ceng.metu.edu.tr/2009/praeda/2009/01/11/a-simple-restful-client-at-android/
   */
  BufferedReader reader = new BufferedReader(new InputStreamReader(is));
  StringBuilder sb = new StringBuilder();

  String line = null;
  try {
   while ((line = reader.readLine()) != null) {
    sb.append(line + "\n");
   }
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    is.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  return sb.toString();
 }

}
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4) Add the following code to your &lt;i&gt;MainActivity.java&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;script class="brush: js; wrap-lines: false" type="syntaxhighlighter"&gt;
&lt;![CDATA[
/***
 Copyright (c) 2009 
 Author: Stefan Klumpp &lt;stefan.klumpp@gmail.com&gt;
 Web: http://stefanklumpp.com
  
 Licensed under the Apache License, Version 2.0 (the "License"); you may
 not use this file except in compliance with the License. You may obtain
 a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
*/


package com.devstream.http;

import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {
 private static final String TAG = "MainActivity";
 private static final String URL = "http://www.yourdomain.com:80";

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  // JSON object to hold the information, which is sent to the server
  JSONObject jsonObjSend = new JSONObject();

  try {
   // Add key/value pairs
   jsonObjSend.put("key_1", "value_1");
   jsonObjSend.put("key_2", "value_2");

   // Add a nested JSONObject (e.g. for header information)
   JSONObject header = new JSONObject();
   header.put("deviceType","Android"); // Device type
   header.put("deviceVersion","2.0"); // Device OS version
   header.put("language", "es-es"); // Language of the Android client
   jsonObjSend.put("header", header);
   
   // Output the JSON object we're sending to Logcat:
   Log.i(TAG, jsonObjSend.toString(2));

  } catch (JSONException e) {
   e.printStackTrace();
  }

  // Send the HttpPostRequest and receive a JSONObject in return
  JSONObject jsonObjRecv = HttpClient.SendHttpPost(URL, jsonObjSend);

  /*
   *  From here on do whatever you want with your JSONObject, e.g.
   *  1) Get the value for a key: jsonObjRecv.get("key");
   *  2) Get a nested JSONObject: jsonObjRecv.getJSONObject("key")
   *  3) Get a nested JSONArray: jsonObjRecv.getJSONArray("key") 
   */


 }
}
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
The full source code is also available on &lt;a href="https://github.com/znq/Simple-HTTP-Client"&gt;GitHub&lt;/a&gt; for download.&lt;br /&gt;
&lt;br /&gt;
Check the official Android documentation for more information about &lt;a href="http://developer.android.com/reference/org/json/JSONObject.html"&gt;JSONObjects&lt;/a&gt; and Apache's &lt;a href="http://developer.android.com/reference/org/apache/http/package-summary.html"&gt;HttpClient&lt;/a&gt; classes.&lt;br /&gt;
&lt;br /&gt;
I hope this tutorial was helpful for you. If it was too simple for your needs stay tuned. Upcoming tutorials will deal with the following topics:&lt;br /&gt;
&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Creating a separate HttpClient &lt;i&gt;thread&lt;/i&gt; to uncouple the hard work happening in the background from the user interface&lt;/li&gt;
&lt;li&gt;Dealing with HTTP exceptions: transport exceptions, protocol exceptions, timeouts.&lt;/li&gt;
&lt;li&gt;Setting up a &lt;i&gt;BackgroundService&lt;/i&gt; and a &lt;i&gt;ServiceInterface&lt;/i&gt;, which will be the new home for our HttpClient. This enables many activies to simply connect to the service and to access the resources provided instead of creating a new HttpClient object for each activity&lt;/li&gt;
&lt;li&gt;Instead of using a simple HttpClient (as shown in this tutorial), we will utilize &lt;i&gt;ClientConnectionManager&lt;/i&gt; to provide us with a connection pool to save resources and improve performance&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-6441728542276885039?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/mf4VkQAfNA8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/6441728542276885039/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=6441728542276885039&amp;isPopup=true" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/6441728542276885039?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/6441728542276885039?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/mf4VkQAfNA8/android-simple-httpclient-to.html" title="Android: Simple HttpClient to send/receive JSON Objects" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_K6NH2gxxhAc/SvWUpjsWIcI/AAAAAAAAEL8/cPPLLmBGgFY/s72-c/SimpleHttpClient_JSON.png" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://www.geekmind.net/2009/11/android-simple-httpclient-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYBQXszeCp7ImA9Wx5SGU0.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-4810370223824453281</id><published>2009-10-31T17:25:00.011+01:00</published><updated>2010-08-15T21:55:50.580+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-15T21:55:50.580+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial" /><category scheme="http://www.blogger.com/atom/ns#" term="ListView" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="UI" /><title>Android: Custom ListView Selector</title><content type="html">The following tutorial will show you how to create a custom list selector as shown in the image below. I use an orange frame around the selected list item in this example, but you can virtually design anything you like.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K6NH2gxxhAc/SuxhD670DyI/AAAAAAAAEI8/VPcSQka2hv0/s1600-h/screenshot_list.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K6NH2gxxhAc/SuxhD670DyI/AAAAAAAAEI8/VPcSQka2hv0/s320/screenshot_list.png" /&gt;&lt;/a&gt;&lt;/div&gt;To make it easier we use the original files for the list selector and transition from the Android SDK as a draft and modify them instead of starting from scratch.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1) Copy files from the Android SDK:&lt;/b&gt;&lt;br /&gt;
Go to &lt;i&gt;android-sdk/platforms/android-1.6/data/res/drawable&lt;/i&gt; and copy the following .xml files to your project's &lt;i&gt;/res/drawable&lt;/i&gt; folder:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;list_selector_background.xml&lt;/li&gt;
&lt;li&gt;list_selector_background_transition.xml&lt;/li&gt;
&lt;/ul&gt;You also need the following &lt;a href="http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch"&gt;9-patch&lt;/a&gt; images from the same folder, because they're referenced by the above .xml-files. You have to copy them, because within the SDK they're not a &lt;i&gt;public resource&lt;/i&gt;, which means you can't just access them through the &lt;i&gt;android:&lt;/i&gt; namespace as you could do with other public resources.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;list_selector_background_focus.9.png&lt;/li&gt;
&lt;li&gt;list_selector_background_longpress.9.png&lt;/li&gt;
&lt;li&gt;list_selector_background_pressed.9.png&lt;/li&gt;
&lt;li&gt;list_selector_background_disabled.9.png&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;2) Edit the two xml files and add to all resource values, which are publicly accessible the &lt;i&gt;"android:namespace"&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
In our case this is only the following item:&lt;br /&gt;
&lt;pre class="brush: xml;"&gt;&lt;item android:drawable="@android:color/transparent" android:state_window_focused="false"&gt;&lt;/item&gt;&lt;/pre&gt;All the other elements can point to the local namespace, because we copied the resources (images) into our local project's &lt;i&gt;/res/drawable/&lt;/i&gt; folder.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3) Modify whatever you like&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Instead of having the selected list item been overpainted by a transparent orange color (as it is default in Android), I prefered to have a full opaque (non-transparent) border around the selected list item. Therefor I opened up the &lt;i&gt;list_selector_background_focus.9.png&lt;/i&gt; file in &lt;a href="http://www.gimp.org/"&gt;gimp&lt;/a&gt; and removed everything except of a thin orange frame (→ make sure the center is transparent). The black pixels around the image are &lt;a href="http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch"&gt;9-patch&lt;/a&gt; parameters. Don't remove them. If you want to modify them read up on it first &lt;a href="http://developer.android.com/guide/developing/tools/draw9patch.html"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K6NH2gxxhAc/SuxlZHvSSsI/AAAAAAAAEJE/pkxmW1ecUYc/s1600-h/gimp_list_selector.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/SuxlZHvSSsI/AAAAAAAAEJE/pkxmW1ecUYc/s320/gimp_list_selector.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;4) Creating a new style&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Open up your &lt;i&gt;/res/values/styles.xml&lt;/i&gt; (create it if it doesn't exist) and add this new style to it:&lt;br /&gt;
&lt;pre class="brush: xml;"&gt;&lt;style name="MyListView" parent="@android:style/Widget.ListView"&gt;
 &lt;item name="android:listSelector"&gt;@drawable/list_selector_background&lt;/item&gt;
&lt;/style&gt;
&lt;/pre&gt;The &lt;i&gt;@drawable/list_selector_background&lt;/i&gt; is a reference to your list_selector_background.xml file in &lt;i&gt;/res/drawable/&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;5) Applying the new style to your layout&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Open up your layout's xml file and add the &lt;i&gt;style&lt;/i&gt; attribute&lt;listview&gt;&lt;b&gt;&lt;/b&gt;.&lt;/listview&gt;&lt;br /&gt;
&lt;pre class="brush: xml;"&gt;&lt;listview android:drawselectorontop="true" android:id="@+id/MyList" android:layout_height="wrap_content" android:layout_width="wrap_content"&gt;
&lt;/listview&gt;
&lt;/pre&gt;I also added &lt;i&gt;android:drawSelectorOnTop=“true”&lt;/i&gt; so that the orange image frame will be drawn with full opacity (no transparency effects).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-4810370223824453281?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/sSNcDymJ4uo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/4810370223824453281/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=4810370223824453281&amp;isPopup=true" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/4810370223824453281?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/4810370223824453281?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/sSNcDymJ4uo/android-custom-listview-selector.html" title="Android: Custom ListView Selector" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_K6NH2gxxhAc/SuxhD670DyI/AAAAAAAAEI8/VPcSQka2hv0/s72-c/screenshot_list.png" height="72" width="72" /><thr:total>9</thr:total><feedburner:origLink>http://www.geekmind.net/2009/10/android-custom-listview-selector.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIESXsycCp7ImA9WxBXEko.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-7577711239359640357</id><published>2009-10-31T14:30:00.016+01:00</published><updated>2010-01-23T20:55:08.598+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-23T20:55:08.598+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mock" /><category scheme="http://www.blogger.com/atom/ns#" term="GPS" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>How to enable fake GPS on Android</title><content type="html">In order to build a location depend app or to test the behavior of your app at places besides the one you're currently located it is very helpful to use the Android emulator and just set your location manually.&lt;br /&gt;
&lt;br /&gt;
This post&amp;nbsp; will guide you through the steps of setting up fake GPS on the Google Android emulator&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Set permissions in AndroidManifest.xml:&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush: xml;"&gt;&lt;uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"&gt;&lt;/uses-permission&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Find the correct local port for your Android emulator:&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;$ adb devices&lt;br /&gt;
List of devices attached&lt;br /&gt;
emulator-5554 device&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
The port we are looking for is in this case &lt;b&gt;5554&lt;/b&gt;. Now connect via &lt;b&gt;telnet&lt;/b&gt;:&lt;br /&gt;
&lt;blockquote&gt;$ telnet localhost 5554&lt;br /&gt;
Trying ::1...&lt;br /&gt;
Trying 127.0.0.1...&lt;br /&gt;
Connected to localhost.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
Android Console: type 'help' for a list of commands&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;b&gt;Set your preferred location manually: &lt;/b&gt;You set the location with the &lt;i&gt;geo fix&lt;/i&gt; command:&lt;br /&gt;
&lt;blockquote&gt;geo fix $longitude $latitude&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
For example the city center of Barcelona:&lt;br /&gt;
&lt;blockquote&gt;geo fix 2.169919 41.387917&lt;br /&gt;
OK&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
To get the latitude and longitude you want simply go to &lt;a href="http://maps.google.com/"&gt;http://maps.google.com&lt;/a&gt; on your computer's web browser, move the desired location to the center of your screen and simply enter this little JavaScript command into the address bar:&lt;br /&gt;
&lt;pre class="brush: jscript;"&gt;&lt;javascript:void(prompt('',gapplication.getmap().getcenter()));&gt;&lt;/javascript:void(prompt('',gapplication.getmap().getcenter()));&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;CAUTION:&lt;/b&gt; the format of the coordinates you get from Google Maps is (&lt;i&gt;$latitude, $longitude&lt;/i&gt;) - but the way you enter the &lt;i&gt;geo fix&lt;/i&gt; for Android has longitude and latitude switched around.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Make sure everything works properly:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Just launch the Google Maps application in your emulator. It should take you directly to the location you entered and display a blue blinking light. &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K6NH2gxxhAc/Suw7T2gUGwI/AAAAAAAAEI0/oCa5uersUHk/s1600-h/mock_gps.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K6NH2gxxhAc/Suw7T2gUGwI/AAAAAAAAEI0/oCa5uersUHk/s320/mock_gps.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Access Android's &lt;i&gt;Location Service&lt;/i&gt; in your application:&lt;/b&gt;&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;
&lt;![CDATA[
LocationManager mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Location myLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
Double myLatitude = myLocation.getLatitude();
Double myLongitude = myLocation.getLongitude();
Log.i(TAG, "My location INIT: " + myLatitude + " | " + myLongitude);

Geocoder geocoder = new Geocoder(this);
java.util.List&lt;address&gt;


 addressList;
try {
 addressList = geocoder.getFromLocation(myLatitude, myLongitude, 5);
 if(addressList!=null &amp;amp;&amp;amp; addressList.size()&gt;0) {
  String address = new String();
  Log.i(TAG,addressList.get(0).toString());
  address = addressList.get(0).getAddressLine(0) + ", "
    + System.getProperty("line.separator")
    + addressList.get(0).getAddressLine(1)  + ", "
    + addressList.get(0).getAddressLine(2); 
  ((TextView)findViewById(R.id.CurrentLocation)).setText(address);
 }
 
} catch (IOException e) {
 e.printStackTrace();
}
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Notes:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I noticed that sometimes the manully entered location dissolves. I haven't looked into that yet, but a workaround for now is to simply re-enter the location via the &lt;i&gt;geo fix&lt;/i&gt; command again.&lt;/li&gt;
&lt;li&gt;You always mix up latitude and longitude?&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;&lt;b&gt;Latitude&lt;/b&gt;: goes from East&amp;lt;&amp;gt;West, like the rungs of a ladder (→ sounds similar to latitude)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Longitude&lt;/b&gt;: runs from North&amp;lt;&amp;gt;South. Think of the globe as a big, fat guy with a long (→ longitude) tie hanging down from the North Pole.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-7577711239359640357?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/6U2q7zxBc5U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/7577711239359640357/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=7577711239359640357&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/7577711239359640357?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/7577711239359640357?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/6U2q7zxBc5U/how-to-enable-fake-gps-on-android.html" title="How to enable fake GPS on Android" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_K6NH2gxxhAc/Suw7T2gUGwI/AAAAAAAAEI0/oCa5uersUHk/s72-c/mock_gps.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.geekmind.net/2009/10/how-to-enable-fake-gps-on-android.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QGRH8zfSp7ImA9WxNVFUU.&quot;"><id>tag:blogger.com,1999:blog-380980011076825656.post-1072163221523388934</id><published>2009-10-26T10:47:00.006+01:00</published><updated>2009-10-26T20:28:45.185+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-26T20:28:45.185+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="click listener" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>Android: easier click listeners in 1.6</title><content type="html">Romain guy just posted a really cool &lt;a href="http://android-developers.blogspot.com/2009/10/ui-framework-changes-in-android-16.html"&gt;improvement of button click listeners&lt;/a&gt; for the Android SDK 1.6 on the official &lt;a href="http://android-developers.blogspot.com/"&gt;Android Developers Blog&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Instead of having every time this recurring bunch of code to set up a simple click listener you can now just add &lt;pre class="brush: xml;"&gt;&amp;lt;Button android:onClick="myClickHandler" /&amp;gt;&lt;/pre&gt;to your button element in your layout's XML file.&lt;br /&gt;
&lt;br /&gt;
Finally the code to handle the click is as simple as that:&lt;br /&gt;
&lt;pre class="brush: java;"&gt;class MyActivity extends Activity {
  public void myClickHandler(View target) {
  // Do stuff
  }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/380980011076825656-1072163221523388934?l=www.geekmind.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekmind/~4/7-yvMudmdl8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.geekmind.net/feeds/1072163221523388934/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=380980011076825656&amp;postID=1072163221523388934&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/1072163221523388934?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/380980011076825656/posts/default/1072163221523388934?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekmind/~3/7-yvMudmdl8/android-easier-click-listeners-in-16.html" title="Android: easier click listeners in 1.6" /><author><name>Stefan Klumpp</name><uri>http://www.blogger.com/profile/02899343387413244345</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_K6NH2gxxhAc/THlKag7L_HI/AAAAAAAAG0A/tOK1BsVjkFA/S220/Manga_Tarragona_August_2010_without_beard.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.geekmind.net/2009/10/android-easier-click-listeners-in-16.html</feedburner:origLink></entry></feed>

