<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3565103961097692379</id><updated>2012-01-25T08:15:29.460-05:00</updated><category term='nokia'/><category term='cable'/><category term='java'/><category term='python'/><category term='basement'/><category term='DIY'/><category term='e71'/><category term='symbian'/><category term='coding'/><category term='internet'/><category term='Basement Bathroom'/><category term='bathroom'/><category term='Tile'/><title type='text'>Eat Sleep Code</title><subtitle type='html'>My personal blog about coding, life, woodworking, home improvement, and technology.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-1959599093818585133</id><published>2010-11-21T22:43:00.002-05:00</published><updated>2010-11-21T23:01:39.336-05:00</updated><title type='text'>Open File Dialog in Android</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;For my app-in-progress, I needed to allow the user to select a file from their Android system that my app can use.  I was surprised to learn there is no real built-in file chooser dialog.  From my experience with .NET and the Win32 API, that's a function that you can count on being there.  I did not think it would be difficult to write one myself, but I'm always looking for quicker ways to get there.&lt;br /&gt;&lt;br /&gt;Eventually, I found a &lt;a href="http://android-er.blogspot.com/2010/01/implement-simple-file-explorer-in.html"&gt;blog post&lt;/a&gt; by Android-er, who shows a very simple version of the mechanics behind a file open dialog.  After getting my version of his code up and running, I wanted to make a few modifications to meet my needs.  These modifications are:&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Alphabetize the list of files &lt;/li&gt;&lt;li&gt;Exclude hidden files, hidden directories, and directories without read access&lt;/li&gt;&lt;li&gt;Only show files with compatible file extensions&lt;/li&gt;&lt;/ul&gt;Fortunately, this was very easy to do using standard Java API's.  Instead of calling:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;File[] files = f.listFiles();&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I create a FileFilter to filter out the results:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;File[] files = f.listFiles(new FileFilter() {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;@Override&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public boolean accept(File pathname)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;//If a file or directory is hidden, or unreadable, don't show it in the list.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;if(pathname.isHidden())&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;return false;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;if(!pathname.canRead())&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;return false;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;//Show all directories in the list.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;if(pathname.isDirectory())&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;return true;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;//Check if there is a supported file type that we can read.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;String fileName = pathname.getName();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;String fileExtension;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;        int mid= fileName.lastIndexOf(".");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;        fileExtension = fileName.substring(mid+1,fileName.length());&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;        for(String s : supportedFileExtensions) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;    &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;if(s.contentEquals(fileExtension)) { &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;    &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;return true;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;    &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;return false;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The last change was to sort the files and directories alphabetically.  I do the sorting operations after the list is constructed, but before the ArrayAdapter is initialized.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;//Sort the files alphabetically.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Collections.sort(fileStringList);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Collections.sort(pathStringList);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;fileListAdapter = new ArrayAdapter&lt;string&gt;(this.getContext(), R.layout.open_file_entry, R.id.fileName, fileStringList);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ListView lv = (ListView) this.findViewById(R.id.pcap_files_list);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;if(lv != null)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;lv.setAdapter(fileListAdapter);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So far, this code is working as intended.  I don't know if this is the most-optimal to do this, but that will be analyzed before I release this app to the market.  For now, I'm still building out the basic infrastructure.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3565103961097692379-1959599093818585133?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/1959599093818585133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2010/11/open-file-dialog-in-android.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/1959599093818585133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/1959599093818585133'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2010/11/open-file-dialog-in-android.html' title='Open File Dialog in Android'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-5976115394203846762</id><published>2010-11-16T22:13:00.007-05:00</published><updated>2010-11-16T22:50:28.944-05:00</updated><title type='text'>I/O Read Performance on Android 2.2</title><content type='html'>I've been experimenting with an app prototype that I hope to release on the Android market soon.  The app reads sizable files (few hundred KB to a several MB) containing thousands of records.  The app is a viewer for those records.&lt;br /&gt;&lt;br /&gt;When the app initializes, it makes a pass through the file to index it which will eventually provide the UI layer with the ability to paginate through the file.  When indexing, I find the boundaries of each record, and built up a data structure containing the offsets.  This part of the read must be very fast, and uses a sequential reading pattern to read the entire file.&lt;br /&gt;&lt;br /&gt;I started to notice some performance problems with this approach, so I decided to investigate performance of 3 common I/O methods.  I don't consider this a perfectly optimized benchmark, but it is an apples-to-apples comparison with the code I wrote.  I'm posting these performance results in case other Android developers are trying to figure out which I/O method to use.  Being new to Java in general, I wasn't sure what was the best approach.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;The first method of reading bytes from this file was done through a &lt;a href="http://developer.android.com/reference/java/io/DataInputStream.html"&gt;DataInputStream&lt;/a&gt;.  It was initialized like this:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;fin = new FileInputStream(new File(this.fileName));&lt;/div&gt;&lt;div&gt;din = new DataInputStream(new BufferedInputStream(fin));&lt;blockquote&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Data was read using methods such as readInt(), readShort(), etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The second method was to use a &lt;a href="http://developer.android.com/reference/java/io/RandomAccessFile.html"&gt;RandomAccessFile&lt;/a&gt; stream.  This type of stream was new to me, and was of interest because of the ability to access a file in random places.  Although the first type of parse operation does not require random access, the second type of operation will benefit from this.  The stream was initialized like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;rin = new RandomAccessFile(this.fileName, "r");&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The third type of method was coupling a &lt;a href="http://developer.android.com/reference/java/io/RandomAccessFile.html"&gt;RandomAccessFile&lt;/a&gt; stream with a &lt;a href="http://developer.android.com/reference/java/nio/MappedByteBuffer.html"&gt;MappedByteBuffer&lt;/a&gt;.  From reading the Android SDK, it appeared that there might be some advantages to this approach.  The file is just mapped into a section of memory in the JVM, and other processes are able to access (and even write to) the file.  It was initialized like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;rin = new RandomAccessFile(this.fileName, "r");&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;MappedByteBuffer&lt;/span&gt; buffer = rin.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, rin.length());&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After implementing all 3 versions of these streams, in such a way that they can be switched around very easy, I ran performance tests on files ranging from 500 to 10000 records.  I took 5 runs through the test collateral, and averaged the results.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Environment&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;HTC EVO&lt;/li&gt;&lt;li&gt;Android 2.2 (Froyo)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Performance&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_akGix-A_FV0/TONQHyqMNiI/AAAAAAAAAgA/jrt81pa7XBU/s1600/Sequential%2BIO%2BReads%2Bon%2BAndroid%2B2.2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 190px;" src="http://1.bp.blogspot.com/_akGix-A_FV0/TONQHyqMNiI/AAAAAAAAAgA/jrt81pa7XBU/s320/Sequential%2BIO%2BReads%2Bon%2BAndroid%2B2.2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5540360061383882274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusions&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;a href="http://developer.android.com/reference/java/io/DataInputStream.html"&gt;DataInputStream&lt;/a&gt; method of reading sequentially from a binary file was roughly twice as fast as the &lt;a href="http://developer.android.com/reference/java/io/RandomAccessFile.html"&gt;RandomAccessFile&lt;/a&gt; and &lt;a href="http://developer.android.com/reference/java/nio/MappedByteBuffer.html"&gt;MappedByteBuffer&lt;/a&gt; methods.  I think for my initial indexing of the file, the DataInputStream method will work the best.  When I implement the random access capability for pagination, I'll need to revisit this with further benchmarks that expose that behavior.  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3565103961097692379-5976115394203846762?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/5976115394203846762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2010/11/io-read-performance-on-android-22.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/5976115394203846762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/5976115394203846762'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2010/11/io-read-performance-on-android-22.html' title='I/O Read Performance on Android 2.2'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_akGix-A_FV0/TONQHyqMNiI/AAAAAAAAAgA/jrt81pa7XBU/s72-c/Sequential%2BIO%2BReads%2Bon%2BAndroid%2B2.2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-3131811913210067171</id><published>2009-12-23T00:26:00.002-05:00</published><updated>2009-12-23T00:32:06.748-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Basement Bathroom'/><category scheme='http://www.blogger.com/atom/ns#' term='DIY'/><title type='text'>Bathroom is heading down the final stretch</title><content type='html'>Over the past few months, my work on the bathroom stalled out, for a number of reasons.  This past week, all that changed.  I got my hands on a tile saw again, and started to make progress on the shower head wall.  I managed to start some tile on the floor of the shower as well.  Some tile around the niche had to be removed and will be replaced today, as I had made a few of the pieces too big.  Once the niche is patched up, the rest of it should go up fast.&lt;br /&gt;&lt;br /&gt;Installing the toilet today was trivial.  That was refreshing, as each stage of this project seems to be harder than I thought.  Tomorrow I take the granite side and backsplashes to a local place to have them trimmed down to fit the space.  After that, they can be installed and the sink/vanity will be complete.  &lt;br /&gt;&lt;br /&gt;I'm also making a custom cabinet for the bathroom for storage.  The cabinet needs to have it's trim applied, stain/varnish, and then install it in the bathroom.  That will be the first time that it's truly a sealed off room, and can be used as a half-bath until the shower is complete.  Hopefully that's soon though.&lt;br /&gt;&lt;br /&gt;I really underestimated this project, but I'm going to be able to apply a lot of lessons to the 1st floor bathroom remodel in a few months time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3565103961097692379-3131811913210067171?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/3131811913210067171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/12/bathroom-is-heading-down-final-stretch.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/3131811913210067171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/3131811913210067171'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/12/bathroom-is-heading-down-final-stretch.html' title='Bathroom is heading down the final stretch'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-1169914843135920412</id><published>2009-12-23T00:12:00.002-05:00</published><updated>2009-12-23T00:25:34.522-05:00</updated><title type='text'>Hello, Android</title><content type='html'>After the news of the Nexus One broke, I started reading all I could.  I think that Google is really planning to shake up the entire wireless business with this phone, and change the way that consumers are locked into contracts.  I currently have a Nokia E71, but I plan to ditch it when the Nexus One becomes available.  &lt;br /&gt;&lt;br /&gt;My E71 has been a good phone, but it has a lot of shortcomings:&lt;br /&gt;&lt;br /&gt;- Nokia's firmware updates are only released for European models.  Sure, I could force the update and void my warranty, but I've held off doing that.&lt;br /&gt;- Web browsing on the small screen pales in comparison to surfing on my wife's iPhone.  I'm no Apple fan, but if the Google browser is half as good, it will be a much better browsing experience than my Nokia.&lt;br /&gt;- I'm a big fan that once you buy a piece of hardware, you have the right to develop content for it.  With the iPhone, I'd have to buy a Mac, plus buy the iPhone SDK, plus certificates and fees.  Not gonna happen.  With Nokia, there's this signing process that apps have to go through and from what I've read, is not easy for the average hobbiest to do.  Android has a much lower bar for development.&lt;br /&gt;&lt;br /&gt;I really think that Android is positioning itself to be the best mobile platform in the future.  They seem to have the most-free (free as in freedom) development strategy.  You can write and test your code on Windows, OSX, and Linux.  It's only $25 to register as an Android developer which allows you to publish your apps.  There's no app-czar that needs to approve your app.  In-time, the app ecosystem around Android will surpass the other platforms.  And since phones today are all about the apps, it will push Android into the #1 position someday.&lt;br /&gt;&lt;br /&gt;I recently purchased &lt;a href="http://www.amazon.com/Hello-Android-Introducing-Development-Programmers/dp/1934356492/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1261545190&amp;sr=8-1"&gt;Hello, Android&lt;/a&gt; a few weeks ago, and ended up reading it in a few hours.  Very well-written book, as it walks through the development of a Sudoku application.  It has already inspired me to start playing around with the API's and try to create an app based on an idea my wife had.  I'm amazed at how after a few hours, I was able to make a lot of progress.  Of course, it helps that I have years of experience with embedded development, and a few months of Java experience.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3565103961097692379-1169914843135920412?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/1169914843135920412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/12/hello-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/1169914843135920412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/1169914843135920412'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/12/hello-android.html' title='Hello, Android'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-913782167525549792</id><published>2009-09-20T20:47:00.004-04:00</published><updated>2009-09-20T21:03:42.927-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Basement Bathroom'/><category scheme='http://www.blogger.com/atom/ns#' term='DIY'/><category scheme='http://www.blogger.com/atom/ns#' term='Tile'/><title type='text'>Putting down some time</title><content type='html'>Today was finally time to tile.  It's been many weeks since I wrote...a lot of that time has been spent on drywall and waterproofing the shower.  Mostly drywall though.  I've really taken my time getting the drywall and mud to look just perfect.  Usually at this point of the project, I tend to start to get sloppy because I just want things done.  Not this time though.  I'm intentionally trying to pace myself, not get burned out, and therefore doing everything to keep quality high here.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/_-dtqvJgBM38/SqLWlLB-9ZI/AAAAAAAADyY/k9PRFB_WOXQ/s720/DSCN0466.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 720px; height: 540px;" src="http://lh5.ggpht.com/_-dtqvJgBM38/SqLWlLB-9ZI/AAAAAAAADyY/k9PRFB_WOXQ/s720/DSCN0466.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I went with a number of &lt;a href="http://www.schluter.com/"&gt;Schluter&lt;/a&gt; products.  I'm using &lt;a href="http://www.schluter.com/8_1_kerdi.aspx"&gt;Kerdi&lt;/a&gt; for the shower walls, floor, and drain.  It seemed to be an easy way to go for a DIY'er, and I liked the idea of building a completely waterproof shower, unlike the traditional CBU showers, which still allow moisture to pass through the board.  I also am using &lt;a href="http://www.schluter.com/6_1_ditra.aspx"&gt;Ditra&lt;/a&gt;, because this tile floor is on a slab and cracks can appear at anytime.  All of their products have been impressive, and the &lt;a href="http://johnbridge.com"&gt;John Bridge&lt;/a&gt; forums have been a huge help to me on this project.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/_-dtqvJgBM38/Sra45zADN0I/AAAAAAAAD0A/UkLw7HIr8tI/s720/DSCN0475.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 720px; height: 540px;" src="http://lh5.ggpht.com/_-dtqvJgBM38/Sra45zADN0I/AAAAAAAAD0A/UkLw7HIr8tI/s720/DSCN0475.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I try to be a perfectionist with this stuff...I'm one of those that walks around my house and I can rattle off a list of items that I think look sloppy and I want to fix.  My wife thinks I'm nuts and says that no one else can see these mistakes.  Well, I do, and I really want this bathroom to not have much of anything that I need to go back and fix at some point.  I also want potential buyers to think a Pro did all this work, to get us the best possible prices for our house.&lt;br /&gt;&lt;br /&gt;My hat really goes off to the pro's that do this work full-time.  Spending 6 hrs on Saturday working with the shower, and today with Ditra and Tile, I'm really freaking sore.  My hands are all torn up, I still have thinset attached to me, my knees and palms are burning from being on them all day, etc.  That's what sitting at a desk for 40+ hours a week will do to you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3565103961097692379-913782167525549792?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/913782167525549792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/09/putting-down-some-time.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/913782167525549792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/913782167525549792'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/09/putting-down-some-time.html' title='Putting down some time'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_-dtqvJgBM38/SqLWlLB-9ZI/AAAAAAAADyY/k9PRFB_WOXQ/s72-c/DSCN0466.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-1491345522061426756</id><published>2009-08-11T20:22:00.005-04:00</published><updated>2009-08-11T21:56:43.552-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DIY'/><category scheme='http://www.blogger.com/atom/ns#' term='bathroom'/><category scheme='http://www.blogger.com/atom/ns#' term='basement'/><title type='text'>Bathroom framing is complete</title><content type='html'>The framing for the basement bathroom is complete!  This follows a successful concrete pour that patched the floor after all of the plumbing work.  Such a relief to make some solid progress like that.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_akGix-A_FV0/SoIRIbE37ZI/AAAAAAAAATk/xr6u-T7dH7s/s1600-h/DSCN0389.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_akGix-A_FV0/SoIRIbE37ZI/AAAAAAAAATk/xr6u-T7dH7s/s320/DSCN0389.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5368872542183878034" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We poured the concrete on a saturday.  Took 17 bags to fill the hole.  The bad news, is that I had about 15 bags left.  We rented an electric mixer which made the job really easy.  The hardest part was hauling the 15 leftover bags upstairs and into the car to take back to the store.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_akGix-A_FV0/SoIgsqQsBYI/AAAAAAAAATs/BbSErVCaZP4/s1600-h/DSCN0422.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_akGix-A_FV0/SoIgsqQsBYI/AAAAAAAAATs/BbSErVCaZP4/s320/DSCN0422.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5368889657409668482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Framing went well, and I gave the nail gun a really good workout.  Frame was done this past weekend.  Now, need to get the rough electrical to the point where I can get it inspected.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3565103961097692379-1491345522061426756?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/1491345522061426756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/08/bathroom-framing-is-complete.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/1491345522061426756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/1491345522061426756'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/08/bathroom-framing-is-complete.html' title='Bathroom framing is complete'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_akGix-A_FV0/SoIRIbE37ZI/AAAAAAAAATk/xr6u-T7dH7s/s72-c/DSCN0389.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-7025928195230570786</id><published>2009-07-20T22:22:00.004-04:00</published><updated>2009-07-20T22:41:56.681-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DIY'/><category scheme='http://www.blogger.com/atom/ns#' term='bathroom'/><category scheme='http://www.blogger.com/atom/ns#' term='basement'/><title type='text'>Basement Bathroom Week 1</title><content type='html'>Whew, what a week.  I have a new respect for plumbers...it's tough work.  I probably haven't worked that hard (physically) for a few years, and it's quite a toll when you're used to just sitting at a desk for your job.  Summary of where I'm at so far:&lt;br /&gt;&lt;br /&gt;- Portions of concrete floor removed&lt;br /&gt;- Removed dirt under the slab&lt;br /&gt;- DWV system installed&lt;br /&gt;- Copper supply lines installed&lt;br /&gt;- 3 walls framed up&lt;br /&gt;- Vent hooked up to house's stack pipe&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_akGix-A_FV0/SmUpDELzQyI/AAAAAAAAASU/C-VMN0-W1Rg/s1600-h/2009+(4).jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_akGix-A_FV0/SmUpDELzQyI/AAAAAAAAASU/C-VMN0-W1Rg/s320/2009+(4).jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5360736064094028578" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Biggest issue to tackle next is fixing the concrete floor.  I've gotten a lot of different comments on how to patch the floor.  This is especially important when I want to tile over the concrete.  If the concrete shifts enough, it will ruin my tile job.  I do plan to use Schluter Ditra as a crack isolation membrane as well.  It was suggested to me to use a lot of rebar, but someone else later explained that the shifting and cracking has more to do with temperature changes, and therefore in a basement bathroom it's not a big deal.  The biggest worry in a basement is having the new concrete to settle.  So the #1 priority is to compact the hell out of the gravel that I will be filling the hole with.&lt;br /&gt;&lt;br /&gt;We'll see...not looking forward to buying/carrying 30+ bags of concrete mix...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3565103961097692379-7025928195230570786?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/7025928195230570786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/07/basement-bathroom-week-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/7025928195230570786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/7025928195230570786'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/07/basement-bathroom-week-1.html' title='Basement Bathroom Week 1'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_akGix-A_FV0/SmUpDELzQyI/AAAAAAAAASU/C-VMN0-W1Rg/s72-c/2009+(4).jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-5149711118890963690</id><published>2009-07-10T22:11:00.007-04:00</published><updated>2009-07-10T22:27:03.085-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DIY'/><category scheme='http://www.blogger.com/atom/ns#' term='bathroom'/><category scheme='http://www.blogger.com/atom/ns#' term='basement'/><title type='text'>Demolition and layout for bathroom</title><content type='html'>Today was the first day of work on the basement bathroom.  Actually a half-day, as I had to work in the morning.  Purchased most of the PVC I need for the DWV system.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_akGix-A_FV0/Slf2YZk7RwI/AAAAAAAAAPw/SGBT2MFl2BQ/s1600-h/gif_1.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 173px;" src="http://2.bp.blogspot.com/_akGix-A_FV0/Slf2YZk7RwI/AAAAAAAAAPw/SGBT2MFl2BQ/s320/gif_1.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5357021180823553794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As a side note, it's interesting that the DWV system which is the most important part of this, costs only a fraction of what the total cost of this project will be.  Most of the time, money, and effort is on all the stuff that sits on top of the plumbing, and the plumbing (if done right) becomes only an afterthought.&lt;br /&gt;&lt;br /&gt;I started some demolition this afternoon and evening to clear out the old vinyl tile and get rid of the old drywall/studs in this area.  I put down some brown craft paper to layout the bathroom size along with the sink, toilet, and shower.  Although the layout could be compressed a foot or so, there's really no reason to do that here. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_akGix-A_FV0/Slf2-uLc37I/AAAAAAAAAP4/RO5_yMh7u5w/s1600-h/DSCN0295.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_akGix-A_FV0/Slf2-uLc37I/AAAAAAAAAP4/RO5_yMh7u5w/s320/DSCN0295.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5357021839188877234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tomorrow and Sunday I'll be starting to frame out the bathroom's backwall and the side wall, which will become the back of the shower.  Looking forward to trying out my new Dewalt hammer drill (new DIY projects always bring a new tool or two :-) for attaching the framing to the floor.  With those two walls framed up, I'll cut up the concrete floor and start working on the DWV system.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_akGix-A_FV0/Slf4ZeGcBVI/AAAAAAAAAQA/Cj19wM1katg/s1600-h/DSCN0289.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_akGix-A_FV0/Slf4ZeGcBVI/AAAAAAAAAQA/Cj19wM1katg/s320/DSCN0289.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5357023398240978258" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3565103961097692379-5149711118890963690?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/5149711118890963690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/07/demolition-and-layout-for-bathroom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/5149711118890963690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/5149711118890963690'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/07/demolition-and-layout-for-bathroom.html' title='Demolition and layout for bathroom'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_akGix-A_FV0/Slf2YZk7RwI/AAAAAAAAAPw/SGBT2MFl2BQ/s72-c/gif_1.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-3405354470426217402</id><published>2009-07-05T22:34:00.003-04:00</published><updated>2009-07-05T22:51:23.708-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DIY'/><category scheme='http://www.blogger.com/atom/ns#' term='bathroom'/><category scheme='http://www.blogger.com/atom/ns#' term='basement'/><title type='text'>Basement Bathroom project getting underway</title><content type='html'>The time has arrived to add a second bathroom to our house...in the basement.  The upstairs finished attic, while a desirable location, doesn't have good access near the 1st floor plumbing to add a bathroom.  A few years ago we had the unfortunate experience to have to waterproof our basement.  While dreadfully expensive, the nice benefit is that our basement is completely dry, so there is no risk to putting drywall and other finished materials down there.&lt;br /&gt;&lt;br /&gt;So the basic plan is to:&lt;br /&gt;&lt;br /&gt;- Remove the finished materials from the area&lt;br /&gt;- Cut the floor, and rough in the DWV and water supply lines&lt;br /&gt;- Frame in the bathroom&lt;br /&gt;- Build a tile shower from scratch, using the mortar bed/liner method&lt;br /&gt;- Tile the floor of the remaining part of the bathroom&lt;br /&gt;- Electrical &lt;br /&gt;- Drywall inside of bathroom&lt;br /&gt;- Install toilet and sink/vanity&lt;br /&gt;- Drywall outside of bathroom&lt;br /&gt;- Hang door and trim&lt;br /&gt;&lt;br /&gt;I'm taking a week off to do the rough plumbing, and luckily I have more vacation that I can use for the follow-up work.  Not sure how long it will take overall, but I plan to post pictures and update this blog during my progress.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3565103961097692379-3405354470426217402?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/3405354470426217402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/07/basement-bathroom-project-getting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/3405354470426217402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/3405354470426217402'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/07/basement-bathroom-project-getting.html' title='Basement Bathroom project getting underway'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-803198165692663347</id><published>2009-06-20T18:46:00.003-04:00</published><updated>2009-06-20T18:55:30.236-04:00</updated><title type='text'>Twitter and the #IranElection</title><content type='html'>I'll admit...I used to be one of those that looked at twitter for the first time, and just thought it was worthless.  I joined, I made a few tweets, added a few friends, and that was about it.  Used it at Microsoft PDC to find out some cool events going on, but that was really it.&lt;br /&gt;&lt;br /&gt;The Iran crisis has shown how powerful and useful it is a communications mechanism.  I wonder if the founders ever thought it could be used like this, or if they only were thinking about making some cool web 2.0 website to impress their friends.  The flow of information just simply cannot be stopped, and it's failing in all of these countries like Iran, China, and other's that feel the need to censor what their citizens can know about.  The use of &lt;a href="http://en.wikipedia.org/wiki/VPN"&gt;VPN&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Proxy_server"&gt;proxy servers&lt;/a&gt;, Tor, and other future technologies will make this next to impossible for governments to do this.  &lt;br /&gt;&lt;br /&gt;The world is watching what is happening in Iran through twitter, and Facebook, and Flickr, doing what the traditional media members cannot do right now.  It's a historical moment to see both the events in Iran, and how they are being broadcast out to the world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3565103961097692379-803198165692663347?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/803198165692663347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/06/twitter-and-iranelection.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/803198165692663347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/803198165692663347'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/06/twitter-and-iranelection.html' title='Twitter and the #IranElection'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-4371940619722970810</id><published>2009-06-11T22:41:00.000-04:00</published><updated>2009-06-11T22:43:12.841-04:00</updated><title type='text'>Xdebug, eclipse, and PHP</title><content type='html'>I wanted to try setting up a debugger for PHP on my Kubuntu dev box.  After struggling for a few hours with setting up the Zend Debugger on my LAMP server, I stumbled onto this page, which had me up and running in about 5 minutes:&lt;br /&gt;&lt;br /&gt;http://techmania.wordpress.com/2008/07/02/debugging-php-in-eclipse-using-xdebug/&lt;br /&gt;&lt;br /&gt;I can now step through my PHP, view variables, set breakpoints, etc, on my Kubuntu 9.04 machine.  Wish I had tried that first over the Zend debugger.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3565103961097692379-4371940619722970810?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/4371940619722970810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/06/xdebug-eclipse-and-php.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/4371940619722970810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/4371940619722970810'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/06/xdebug-eclipse-and-php.html' title='Xdebug, eclipse, and PHP'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-1071373631000470607</id><published>2009-06-07T21:21:00.001-04:00</published><updated>2009-06-11T22:45:16.327-04:00</updated><title type='text'>A followup to my last post about career goals</title><content type='html'>I was at a Microsoft event a few months back, and attended a &lt;a href="http://www.brianhprince.com/2009/01/soft-skillz-annual-career-introspection.html"&gt;Brian Prince's talk on Career Introspection&lt;/a&gt;.  One statement that struck me then, and remains in my head today:&lt;br /&gt;&lt;div&gt;&lt;blockquote&gt;&lt;b&gt;&lt;br /&gt;Change&lt;/b&gt; the company you work for, or change the&lt;b&gt; Company&lt;/b&gt; that you work for.&lt;/blockquote&gt;I feel that I'm in the 'former' group, trying to push through modern technologies and breaking new ground.  I feel like at some point I'm going to feel like I'm pushing a rope though.  However, like Brian suggests, I did commit myself to stay this year, and I have a good idea of where I want to be at the end of '09 (I have half a year to make it happen).  We'll see how close I end up.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Overall, the most important items from Brian's talk was to make sure we realize that the company is not going to manage your career for you.  Your manager will be plenty happy if you continue to do a great job exactly where you are today for the next 10+ years.  You have to manage your career and make sure your job lines up with your career.  To do this:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Find some recruiters, maybe through &lt;a href="http://www.linkedin.com/"&gt;LinkedIn.com&lt;/a&gt;:  Having recruiters in your network is a good thing, and I've had several conversations with them.  It never hurts to hear about a new opportunity, or to chat with them about what skills are big in your area.  I'm always upfront and say that I'm probably not looking to move, but it's good to have the conversations.&lt;/li&gt;&lt;li&gt;Keep your resume ready:  In today's job market, things can change quickly.  I'm sure that a lot of my colleagues who are in the same position for 15-20 years were not ready for what happened.  I have a resume that I update every few months, because you never know what's around the corner.&lt;/li&gt;&lt;li&gt;Network:  User groups, such as .NET SIG, Java, Linux, are a great way to hear about opportunities.  Training events where you're sitting in a room with people from other companies, or big industry events like Microsoft PDC are a great experience.  I learned a lot by chatting with other's at PDC, and it was great to poke my head out of the shell a bit and see what was going on.  My passion for new technology was awakened after PDC when I realized how far behind my company is.&lt;/li&gt;&lt;li&gt;Freelancing:  Yes, the extra hours suck and it's difficult to find work, but if you don't feel that you are doing what you want, consulting is a great way to get started.  I've been able to use a lot of technology that my company doesn't use.  Incidentally, I'm now starting to use some of what I have done as a consultant for my day job, and it has helped a lot.  &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;It's hard to say with any certainty what will happen this year.  All I know is that I need to keep reviewing where I'm at, and trying to figure out where I want to go and how I get there.&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/3565103961097692379-1071373631000470607?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/1071373631000470607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/06/followup-to-my-last-post-about-career.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/1071373631000470607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/1071373631000470607'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/06/followup-to-my-last-post-about-career.html' title='A followup to my last post about career goals'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-2230211742020056044</id><published>2009-05-31T13:08:00.000-04:00</published><updated>2009-05-31T13:23:42.655-04:00</updated><title type='text'>Career crossroads...</title><content type='html'>I had a call from a recruiter Thursday at work about a job opportunity using C#.  I wasn't really interesting in jumping ship at this point, but I always like to return these type of phone calls, because you never know.  I told her I didn't have much experience in C#, most of what I've done for the past 11 years is using C++.  She said the client wants C# experience, and even though C++ is similar in many ways, that doesn't count.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Which immediatly started to worry me.  My company tends to prefer old technologies and old way of doing things (jumping to Scrum being the only real diversion).  Am I eventually going to take myself out of the job market, like the Cobol programmers who never picked up another skill after new languages surpassed it? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sure, through my consulting efforts, I have done some PHP and Ruby on Rails, but that doesn't match up to someone with 3-5 years experience.  And .NET, which is really the market leader here, is something that I've only used to write things like test clients and other apps that are not meant to be shipped to customers.  I'm now doing some Java for work, but I have about 2 months experience, not the 3-5 years that I would need to apply for a job in that space.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Talking to the recruiter, she said .NET jobs far outweigh Java and C++ in this area.  She also said the Cleveland job market 'sucks' now for IT, which isn't surprising since it was a shitty job market for IT even when we weren't in a recession.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The big question is how do I fix this.  Do I continue to push for change in my company, to move forward in technology?  If I only keep working with the technology that my company wants, I will be pushed out of this job market.  Do I try to do more consulting work where I can use these newer technologies?  That seems like the logical choice, but it comes with a cost of personal time/family time, etc.  Or do I just dig in, and prepare to be at my current company for the long haul (meaning learning new technology isn't as important)? &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/3565103961097692379-2230211742020056044?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/2230211742020056044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/05/career-crossroads.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/2230211742020056044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/2230211742020056044'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/05/career-crossroads.html' title='Career crossroads...'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-3934534769159147371</id><published>2009-04-23T19:50:00.000-04:00</published><updated>2009-04-23T20:09:25.241-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><category scheme='http://www.blogger.com/atom/ns#' term='cable'/><title type='text'>So long Time-Warner...</title><content type='html'>After reading far too many stories &lt;a href="http://arstechnica.com/tech-policy/news/2009/04/twc-without-data-caps-internet-upgrades-now-in-doubt.ars"&gt;like this&lt;/a&gt; about Time-Warner's internet policies, we're dropping them for AT&amp;amp;T DSL.  Now, I have no problem with companies earning good profits, but the low bandwidth caps along with the fact that their bandwidth costs are so low, pushes me over the edge.  Now their blackmail attempts by withholding DOCSIS 3.0 make it an even easier decision. &lt;br /&gt;&lt;br /&gt;We ended up with AT&amp;amp;T DSL....for now....my $35 6Mbps package is ~$10 cheaper than TWC, but I'm only getting about 2 Mbps down right now.  Not too happy about that.  It looks like we can also do AT&amp;amp;T U-Verse for much faster speeds (without actually getting the TV service), so we might upgrade to that later on.  However, if we can only get 1/3 of our download speed now, I'm not sure if the U-Verse DSL will be that much better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3565103961097692379-3934534769159147371?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/3934534769159147371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/04/so-long-time-warner.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/3934534769159147371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/3934534769159147371'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/04/so-long-time-warner.html' title='So long Time-Warner...'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3565103961097692379.post-8075074155755540713</id><published>2009-04-21T22:25:00.000-04:00</published><updated>2009-04-21T22:41:10.355-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='e71'/><category scheme='http://www.blogger.com/atom/ns#' term='nokia'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>My First Symbian App...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_akGix-A_FV0/Se6Cg0gv-kI/AAAAAAAAANU/6Q4YTGxM0yM/s1600-h/StockApp1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 224px; height: 320px;" src="http://3.bp.blogspot.com/_akGix-A_FV0/Se6Cg0gv-kI/AAAAAAAAANU/6Q4YTGxM0yM/s320/StockApp1.png" alt="" id="BLOGGER_PHOTO_ID_5327338909589305922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I just recently purchased a Nokia E71, and have found a ton of good, free software out there.  One app that I really wanted, but couldn't find, was some kind of stock application.  After searching, I've started to write my own.&lt;br /&gt;&lt;br /&gt;I started reading about Symbian development, and more specifically their Java environment.  It looks like there is really good support for J2ME, and it seems that Symbian was an early adopter of Java on their OS.  The development tools are all free, and run on Windows/Linux without costing you a dime.&lt;br /&gt;&lt;br /&gt;I've been impressed with the emulator environment so far.  With my Windows CE embedded experience, the emulator was never really an option and we always had to debug on real hardware.  Which is good and bad.  While I have yet to actually run my application on my phone, it seems to run well on the emulator. &lt;br /&gt;&lt;br /&gt;Another thing I like about Symbian development is being able to work with C++, Java, and Python.  So far, I've only tried Java, but I'm feeling the urge to try out the other ones. &lt;br /&gt;&lt;br /&gt;So there's a screenshot of my stock app so far, just using some hard-coded static data.  I've started to write some code to pull the stock data off of yahoo (is that allowed?) and update the screen with a refresh command, but now I'm just trying to make it not look like a 4th grader designed the UI (which is a tough task since I don't write UI's, ever, unless it's something that a customer won't see).  I'll take any UI advice that you can offer.. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3565103961097692379-8075074155755540713?l=eat-sleep-and-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eat-sleep-and-code.blogspot.com/feeds/8075074155755540713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/04/my-first-symbian-app.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/8075074155755540713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3565103961097692379/posts/default/8075074155755540713'/><link rel='alternate' type='text/html' href='http://eat-sleep-and-code.blogspot.com/2009/04/my-first-symbian-app.html' title='My First Symbian App...'/><author><name>Kevin</name><uri>http://www.blogger.com/profile/12473422200717199884</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_akGix-A_FV0/Se6Cg0gv-kI/AAAAAAAAANU/6Q4YTGxM0yM/s72-c/StockApp1.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
