<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7211139912294788986</id><updated>2024-09-09T15:05:12.330-07:00</updated><category term="Android"/><category term="Arcade"/><category term="MAME"/><category term="programming"/><category term="Wifi"/><category term="802.1X"/><category term="development"/><category term="802.11"/><category term="Fear"/><category term="Java"/><category term="ListView"/><category term="QuickPhones"/><category term="graphics"/><category term="Acer"/><category term="Asterisk"/><category term="Doubt"/><category term="Google"/><category term="MythTV"/><category term="NVidia"/><category term="Privacy"/><category term="QA-342"/><category term="Revo"/><category term="SIP"/><category term="Ubuntu"/><category term="Uncertainty"/><category term="VoIP"/><category term="WPA-Enterprise"/><category term="WPA2-Enterprise"/><category term="certificates"/><category term="kitkat"/><category term="scary"/><category term="security"/><category term="wireless"/><category term="ADB"/><category term="ADP1"/><category term="ADT"/><category term="AdMob"/><category term="Aspire"/><category term="C#"/><category term="Cisco"/><category term="DMProcessConfigXML"/><category term="EMMA"/><category term="Glass"/><category term="Hate"/><category term="ION"/><category term="Internet"/><category term="Meru"/><category term="Money"/><category term="PPPoE"/><category term="SQL"/><category term="Screen Orientation"/><category term="Subversion"/><category term="USBDeview"/><category term="Unidata"/><category term="Video"/><category term="WPU7700"/><category term="Windows Mobile"/><category term="Zyxel"/><category term="bitmap"/><category term="canvas"/><category term="database"/><category term="developer"/><category term="http"/><category term="intent"/><category term="mime"/><category term="myTouch3g"/><category term="overlay"/><category term="qt"/><category term="shapes"/><category term="views"/><category term="x64"/><category term="x86"/><title type='text'>Geek Taco</title><subtitle type='html'>Random musings about technology and life in general.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>44</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-6431045061706486595</id><published>2015-01-26T09:51:00.000-08:00</published><updated>2015-01-26T09:52:31.484-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="802.11"/><category scheme="http://www.blogger.com/atom/ns#" term="802.1X"/><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="certificates"/><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><category scheme="http://www.blogger.com/atom/ns#" term="kitkat"/><category scheme="http://www.blogger.com/atom/ns#" term="Privacy"/><category scheme="http://www.blogger.com/atom/ns#" term="scary"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="Wifi"/><category scheme="http://www.blogger.com/atom/ns#" term="wireless"/><category scheme="http://www.blogger.com/atom/ns#" term="WPA-Enterprise"/><category scheme="http://www.blogger.com/atom/ns#" term="WPA2-Enterprise"/><title type='text'>Network May Be Monitored By A Third Party  (a.k.a.  Android KitKat scary warning message part 3)</title><content type='html'>I guess people care about this annoying warning message that Android has thrown on us. &amp;nbsp; No other blog post here has generated anywhere near the number of hits that this issue has generated. &amp;nbsp;So, to all of your that have found my blog and read what I have to say, I thank you!&lt;br /&gt;
&lt;br /&gt;
Unfortunately, Google doesn&#39;t seem to care about this issue. &amp;nbsp; (Newsflash! &amp;nbsp;Google doesn&#39;t care about making certificates easy to use on Android. &amp;nbsp; And, by extension, they don&#39;t care to make wireless authentication on Android usable either! &amp;nbsp; I could write volumes on my experiences trying to get things improved. &amp;nbsp;But, I fear that it would inspire depression in anyone that read it.) &amp;nbsp; So, we need to do something to try to &lt;b&gt;GET&lt;/b&gt;&amp;nbsp;them to care!&lt;br /&gt;
&lt;br /&gt;
There have been several bugs opened about this problem, and most of those bugs have been closed with various reasons that make no sense. &amp;nbsp;(Which is what I base my claim that they don&#39;t care on.) &amp;nbsp;Some of the other people on the Internet that agree with me that this is a problem have continued to open new bugs to continue to push the problem and make Google listen. &amp;nbsp; If you care about this problem, PLEASE go to the Google bug tracker, and at least star the issue. &amp;nbsp; If you have the time, you might consider posting a comment to the bug that outlines why this issue causes you grief, and what changes you would like to see made in order to improve the situation. &amp;nbsp; (If you are only going to complain, do us all a favor and just star the issue. &amp;nbsp; If you want to complain, and offer suggestions on how to improve things, please post a comment!)&lt;br /&gt;
&lt;br /&gt;
I&#39;ll even make it easy for you. &amp;nbsp; The URL (with link!) to the current version of the bug is at :&amp;nbsp;&lt;a href=&quot;https://code.google.com/p/android/issues/detail?id=82036&quot;&gt;https://code.google.com/p/android/issues/detail?id=82036&lt;/a&gt;&amp;nbsp;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As you make your feelings known, please consider this. &amp;nbsp; There is actual value in having a warning like this, if you are the kind of person that values privacy and is against network operators using man-in-the-middle tactics to monitor what you are doing. &amp;nbsp; And, thanks to stupid legislation here in the US, if you are attending a K-12 school that provides Internet access, you &lt;u style=&quot;font-style: italic; font-weight: bold;&quot;&gt;SHOULD&lt;/u&gt;&amp;nbsp;care about this very much! &amp;nbsp; US law requires the schools to snoop on students as a condition to continue to receive funding! &amp;nbsp; &amp;nbsp;I&#39;m lazy, so I am not going to track down the exact law that requires this, but I know it is true because of my day job. &amp;nbsp; (Not going to say any more than that because my opinion might get me in trouble.)&lt;br /&gt;
&lt;br /&gt;
Because I would prefer that people being snooped on are given any warning that it could be happening, I am actually in favor of the warning message that was added. &amp;nbsp; However, I have problems with how it was implemented. &amp;nbsp; I think there are a few tweaks that could be made to the implementation that would take this from being a pointlessly scary warning message to a valuable warning message, and an opportunity to educate at least a few people on some of the security issues that are associated with installing new root CA certificates on any device or OS. &amp;nbsp; Also, as I have stated before, I don&#39;t like people that complain about a problem without offering solutions!&lt;br /&gt;
&lt;br /&gt;
So, here are my suggestions on how to transform the annoying mess that is the &quot;scary certificate warning message&quot; in to something useful and significantly less annoying :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Don&#39;t show the message (ever) if the certificate is used with 802.1X on a Wi-Fi connection -- Starting with Android 4.3, the &quot;Credential Store&quot; (a.k.a. &amp;nbsp;Certificate store, or key store) has been split in to two parts. &amp;nbsp;One part holds the certificates that will be used for authentication on Wi-Fi networks. &amp;nbsp; The other part holds certificates that are used for VPN connections, web site connections, and everything else. &amp;nbsp; Since you *HAVE* to install a certificate in order to securely use a Wi-Fi connection, showing this warning message is pointless. &amp;nbsp;The other alternative is not to use a certificate to validate the Wi-Fi network, which leaves you WIDE open to anyone doing a man-in-the-middle. &amp;nbsp; So, the scary warning actually has the potential to make users LESS secure by making them remove the certificates necessary to secure their networks! &amp;nbsp; Google must recognize this on some level, because they don&#39;t show the warning if an app uses the Wifi API to install certificates.&lt;/li&gt;
&lt;li&gt;When you tap the warning, give useful information -- &amp;nbsp;Right now, when you tap the warning, you are taken to the security settings screen. &amp;nbsp; This is COMPLETELY useless. &amp;nbsp; The user is expecting to be given more information on what this warning is all about. &amp;nbsp; Take them to a screen that explains what the potential issues are with installing a new CA certificate. &amp;nbsp; Explain clearly what the problem is, and don&#39;t try to scare them in to submission. &amp;nbsp;Try to give the user enough information to allow them to make a good decision about leaving the certificate installed. &amp;nbsp; Also, provide links to more detailed information so that those that are really curious can really dig in and understand the problems.&lt;/li&gt;
&lt;li&gt;Allow users to get rid of the warning -- Right now, you can dismiss the warning, but it comes back any time you install another CA cert, or anytime you reboot your device. &amp;nbsp; This behavior is annoying. &amp;nbsp; Tell me once, let me decide what to do, and then leave me alone! &amp;nbsp;Anything else is a bad user experience. &amp;nbsp; When the user taps the warning to get more information about what it is about, they should also be given two check boxes. &amp;nbsp; One check box should allow them to dismiss the warning just for the current certificate, the other should allow them to block ever showing it again. &amp;nbsp; There really are two types of users where this warning is concerned. &amp;nbsp;There are those that already understand the risks, and those that don&#39;t care. &amp;nbsp; The purpose of the warning to to try to get some of those that don&#39;t care to actually start to care. &amp;nbsp;But, annoying the crap out of them is only going to make them hate the issue so much that they will never care.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
If my three suggestions above were implemented, I suspect most people would no longer hate the warning message as much as they do now. &amp;nbsp; It also gives the power back to the user, which is what I always thought Android was supposed to be about.&lt;br /&gt;
&lt;br /&gt;
I understand that in addition to warning users that they may be causing themselves problems, they are probably also trying to cover their butts should a bunch of users get hacked and complain in the media, or worse, try to sue. &amp;nbsp; However, I really believe that showing the warning once is more than enough for Google to cover their butts on this.&lt;br /&gt;
&lt;br /&gt;
In the unlikely event that someone from Google reads this, and wants me to put my money where my mouth is, I will offer to submit patches to the AOSP project to implement all of the things above. &amp;nbsp;&lt;u style=&quot;font-style: italic; font-weight: bold;&quot;&gt;HOWEVER,&lt;/u&gt;&amp;nbsp;given my previous experiences with submitting patches to AOSP, I will be expecting a promise that the code will eventually be included. &amp;nbsp; By &quot;eventually&quot;, I mean that someone from Google will be assigned to review my code, and comment on it until the code is in the right state to be fully included in AOSP and eventually the main Android builds. &amp;nbsp; (As an aside, while I have tried not to give out any information on this blog about who I am, I am sure that Google has the ability to look up my e-mail address based on this blog being hosted on Blogger. &amp;nbsp; There is also someone on the Android dev team that knows me, and someone on the Android security team that knows me. &amp;nbsp;So, it should be easy enough to verify that I know what I am talking about, and it should be easy to reach out to me.)</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/6431045061706486595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2015/01/network-may-be-monitored-by-third-party.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/6431045061706486595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/6431045061706486595'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2015/01/network-may-be-monitored-by-third-party.html' title='Network May Be Monitored By A Third Party  (a.k.a.  Android KitKat scary warning message part 3)'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-2112397039331435432</id><published>2013-11-27T08:39:00.000-08:00</published><updated>2013-11-27T08:39:10.786-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="802.11"/><category scheme="http://www.blogger.com/atom/ns#" term="802.1X"/><category scheme="http://www.blogger.com/atom/ns#" term="Wifi"/><category scheme="http://www.blogger.com/atom/ns#" term="WPA-Enterprise"/><category scheme="http://www.blogger.com/atom/ns#" term="WPA2-Enterprise"/><title type='text'>How does this wireless authentication stuff work anyway?</title><content type='html'>My last couple of posts have been calling out some of the issues with wireless authentication on Android. &amp;nbsp; But, in my day job I deal with authentication on the most common operating systems you would see in the wild. &amp;nbsp;If you were only to read my blog posts this far, you would probably believe that Android is the worst device for wireless authentication there is. &amp;nbsp; The truth is, every operating system I have come across does something stupid when it comes to wireless authentication.&lt;br /&gt;
&lt;br /&gt;
But, perhaps the worst component of authentication on wireless networks is the complete lack of understanding that most people have of how it works. &amp;nbsp; Now, you can argue that you don&#39;t need to know how your engine works in order to drive a car, so you don&#39;t really need to know how wireless authentication works in order to use your computer. &amp;nbsp;And, in general, I would agree with you. &amp;nbsp; However, most people would agree with me that knowing more about how their engine works results in an engine that generally works better because those people know what to look for and what types of behaviors can cause them trouble down the line. &amp;nbsp; With wireless authentication, it is also the same thing. &amp;nbsp; However, if you destroy the engine on your car, you will be out a lot of money to fix it or replace the car. &amp;nbsp; If you screw up with your authentication the damage can be far worse, and far more expensive. &amp;nbsp; So, do yourself a favor and learn a bit more about how the authentication on your wireless networks work.&lt;br /&gt;
&lt;br /&gt;
My goal in this blog entry is to try to boil down the authentication process in to plain English, while mapping some of the technical jargon in to something that an average person can understand. &amp;nbsp;As a result, this blog entry will be very long. &amp;nbsp;But, hang in there with me. &amp;nbsp;I think it will be worth it.&lt;br /&gt;
&lt;br /&gt;
We are going to look specifically at user name and password based authentication on networks. &amp;nbsp;This type of authentication is commonly used on enterprise wireless networks. &amp;nbsp;However, it can also be used on wired networks. &amp;nbsp;In fact, the method of authentication used in these networks was designed originally to be used on wired networks. &amp;nbsp;It was adapted to work with wireless networks, and that is where it seems to have found the most success. &amp;nbsp;This standard is called IEEE 802.1X. &amp;nbsp;Some people may now be yelling at their screen, &quot;Nuh uh! &amp;nbsp;WPA-Enterprise or WPA2-Enterprise is used on wireless networks, not this 802.1X stuff!&quot; &amp;nbsp;Those people are both right and wrong at the same time. &amp;nbsp; The WPA specifications outline how to use the encryption keys that are generated during an authentication with 802.1X. &amp;nbsp; So, we will be focusing on 802.1X, and leaving the encryption key stuff for another time.&lt;br /&gt;
&lt;br /&gt;
There are two ways that an authentication starts. &amp;nbsp; One is that the network recognizes that you have connected to it and sends a request to start the authentication. &amp;nbsp;The other is the client machine (i.e. your laptop or phone) sends a message to the network requesting that it start the authentication process. &amp;nbsp;Both methods result in the network sending an identity request to the client station. &amp;nbsp; The station responds to this request with a message that contains some form of identification. &amp;nbsp; Because of the way that 802.1X has evolved, this identification is often referred to as the &quot;outer identity&quot; or &quot;anonymous identity&quot;. &amp;nbsp;This terminology is technically questionable, but seems to be what the industry has settled on. &amp;nbsp;Probably because the &quot;proper&quot; terminology would just be confusing to anyone that doesn&#39;t understand how the various authentication methods works. &amp;nbsp; So, we will use the &quot;outer identity&quot; or &quot;anonymous identity&quot; to reference this through the rest of this blog post.&lt;br /&gt;
&lt;br /&gt;
Following this identity request, the network will send a challenge message to start the authentication. &amp;nbsp; If you have ever configured authentication for a wireless network, and seen the choices such as (EAP-)PEAP, (EAP-)TTLS, (EAP-)TLS, this is where those settings come in to play. &amp;nbsp;The challenge message that the network sends includes an identifier that tells the client what type of authentication the network wants to use. &amp;nbsp;If the client is configured to allow that type of authentication, the process proceeds. &amp;nbsp; If not, then the client will respond to the network asking for a different type of authentication. &amp;nbsp; If the network allows the type of authentication the client requests then it sends another challenge, this time identifying the authentication method requested by the client.&lt;br /&gt;
&lt;br /&gt;
At this point, the details of the methods used for authentication diverge wildly depending on which authentication system you use. &amp;nbsp; But, the basic ideas are all the same. &amp;nbsp; So, rather than dive in to the details of the various authentication protocols, we will discuss what the goals of the authentication are, and then work backwards.&lt;br /&gt;
&lt;br /&gt;
The network, the client, and the user each have specific goals when they enter the authentication. &amp;nbsp;Those goals are :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The networks wants to make sure the client is someone that is allowed to use the network.&lt;/li&gt;
&lt;li&gt;The client wants to make sure that it doesn&#39;t provide its credentials to anyone other than the networks that it believes it can trust.&lt;/li&gt;
&lt;li&gt;The user just wants to get on the network, everything else be damned.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So basically, the client and the network want to make sure that both the network and the user are protected. &amp;nbsp;But, as usual, the user is the weak link as they will probably do just about anything to gain access to the network. &amp;nbsp;(Facebook statuses won&#39;t update themselves!) &amp;nbsp; &amp;nbsp; This is one of the biggest failures in the design of the various authentication protocols. &amp;nbsp; For methods such as PEAP or TTLS, the user has the ability to gut the security of the connection as an easy way of gaining access to the network. &amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So, if we ignore the desires of the user and focus on the security aspects of the authentication, how do the goals of the network and the client get met?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The first step is for the network to identify itself to the client. &amp;nbsp; Currently, this is done using a word that strikes terror in to most network administrators. &amp;nbsp;&quot;Certificates&quot;. &amp;nbsp; Certificates really aren&#39;t as scary as most admins think they are, but that is a topic for another blog entry. &amp;nbsp; For the purposes of this discussion, the network provides a certificate to the client that the client can run some checks on to verify that the network is who it claims to be. &amp;nbsp;(Side note : There are a lot of potential security issues with certificates and this type of authentication. &amp;nbsp;But, that is beyond the scope of this post.) &amp;nbsp; If the client decides it doesn&#39;t trust the certificate it will either send a message to the network indicating it doesn&#39;t like it, or simply disconnect from the network. &amp;nbsp; Assuming it does trust the certificate, various pieces of information are used to generate cartographic keys that allow all of the future messages to be encrypted when they cross the network. &amp;nbsp;This layer of encryption is usually referred to as the &quot;inner tunnel&quot; or sometimes just &quot;the tunnel&quot;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
At this point, if the client believes it can trust the network, it will fulfill the desires of the network by proving it should be allowed access to the network. &amp;nbsp; This is usually done by using a second authentication method &quot;inside the tunnel&quot;. &amp;nbsp; This portion of the authentication is known in most documentation as &quot;phase 2&quot; or &quot;the inner phase&quot;. &amp;nbsp; At this point of the authentication, the client sends the user name and password back to the server using the encryption keys that were generated by the certificate exchange. &amp;nbsp; It is believed that the encryption set up by the certificate exchange is pretty secure, since it is basically the same type of encryption that is used when you purchase something from a secure web site. &amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Taking a quick side trip back to the beginning of the authentication, it should now be more clear why the initial identity the network requests is called the &quot;outer identity&quot;. &amp;nbsp; However, it isn&#39;t any more clear why it might be called the &quot;anonymous identity&quot;. &amp;nbsp; The reason it can be called that is because the specifications for PEAP and TTLS explicitly state that the first identity request can be answered with an identity of &quot;anonymous&quot; because the users actual user name will be passed to the network using encryption later in the process. &amp;nbsp; The idea is that by returning &quot;anonymous&quot; for the first identity it makes it a little harder for a bad guy to use that identity to target a specific user, since the first identity is sent over the network with no encryption. &amp;nbsp;(Side note : The first identity isn&#39;t always sent unencrypted. &amp;nbsp; There are situations where it is encrypted, but the working assumption in the standards is that it is unencrypted.)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Once the user name and password are sent to the network, the network can decide if it wants to allow the client to access the network. &amp;nbsp;If the client is allowed, then the network sends a success message and opens the network up to be used. &amp;nbsp; If the client is not allowed, then the network sends a failure message and blocks the client from using the network.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
While I don&#39;t want to get in to many of the security aspects of this type of authentication, I do want to point out the weakest link. &amp;nbsp; There is an assumption that the client will validate the certificate the server provides to it. &amp;nbsp; There are a lot of places that can go wrong, but by far the biggest one is the user disabling the checking of that certificate at all. &amp;nbsp; Sadly, some devices like the Nook tablets and Windows RT both default to not checking the certificate, or in the case of the Nook doesn&#39;t even allow the user to configure checking the certificate! &amp;nbsp;(Note : I have not looked at the latest Nooks, so it is possible this issue has been resolved.) &amp;nbsp;If the client doesn&#39;t verify the certificate, then the client will send the user name and password to any device that pretends to be the wireless network the user wants to connect to. &amp;nbsp; Depending on the authentication method used, this could mean that the password is sent to the bad guy with no encryption, or only lightly hashed.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Hopefully someone finds this post useful. &amp;nbsp; 802.1X authentication can quickly go from something that seems simple enough to a wildly complex set of decisions with potentially huge negative consequences. &amp;nbsp; In the coming months, I plan to go in to more of a &quot;deep dive&quot; on the different authentication methods and what the known risks are with each of those methods.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/2112397039331435432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2013/11/how-does-this-wireless-authentication.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/2112397039331435432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/2112397039331435432'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2013/11/how-does-this-wireless-authentication.html' title='How does this wireless authentication stuff work anyway?'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-3995702893547724678</id><published>2013-11-26T15:43:00.000-08:00</published><updated>2015-01-26T09:11:13.412-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="802.1X"/><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Fear"/><title type='text'>Scary Warning Message on KitKat Part 2</title><content type='html'>&lt;i&gt;Update 1/26/2015 - Google has refused to take this issue seriously. &amp;nbsp;They have closed several bugs posted on the Android bug tracker. &amp;nbsp; Fortunately, there are some other people out there that agree that the current implementation is broken. &amp;nbsp; Unfortunately, Google doesn&#39;t seem to think that it is worth fixing. &amp;nbsp; Since I know a lot of people find this page while looking for information on this annoying warning, I would encourage you to go to the current bug on the Android bug tracker, and star it to show Google that you want this resolved! &amp;nbsp; Perhaps if enough of us star it, Google will start to pay attention. &amp;nbsp; You can find the current open bug &lt;a href=&quot;https://code.google.com/p/android/issues/detail?id=82036&quot;&gt;here&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
It always amazes me which posts of mine tend to generate the most traffic. &amp;nbsp; Not that my blog gets a ton of traffic, but once in a while I get spikes of traffic to a specific post and it surprises me a little. &amp;nbsp; My previous post on KitKat seems to be one of those that has caused a bit of a spike. &amp;nbsp; So, I figured a follow up might be interesting.&lt;br /&gt;
&lt;br /&gt;
A couple of hours ago, a coworker sent me a link to &lt;a href=&quot;https://code.google.com/p/android/issues/detail?id=62076&quot;&gt;Android issue 62076&lt;/a&gt;. &amp;nbsp; Gotta say, I was quite surprised to see a link to my blog as supporting evidence! &amp;nbsp; I was equally surprised to see that the bug was marked &quot;Works as Intended&quot; and closed. &amp;nbsp; I read through the statements on how it is intended to work, and came to the conclusion that if it does indeed work that way, this may not be as big a deal as I thought. &amp;nbsp; But, what was being claimed didn&#39;t seem to match up with my experience using KitKat.&lt;br /&gt;
&lt;br /&gt;
For those who don&#39;t want to sift through the bug chatter, here is a snip of the response from one of the Android team members :&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;pre style=&quot;background-color: white; font-size: 12px; max-width: 80em; padding-left: 0.7em; white-space: pre-wrap;&quot;&gt;The &quot;User&quot; portion of the trusted credential store is non-system CA certificates that have been installed and are trusted by the browser and other things that use the system Trusted Certificate Store. This warning is about protecting the user of the device.

Note that EAP-TLS and other Wi-Fi modes do not need to install a CA certificate to the Trusted Certificate Store. If you include your CA certificate in a PKCS#12 bundle when installing the credentials and select &quot;Wi-Fi&quot; as the destination for those credentials, you will not get this warning. You can also create a program that adds Wi-Fi credentials and configurations programmatically using the new WifiEnterpriseConfig API (see &lt;a href=&quot;http://developer.android.com/reference/android/net/wifi/WifiEnterpriseConfig.html&quot; rel=&quot;nofollow&quot; style=&quot;color: #0000cc;&quot;&gt;http://developer.android.com/reference/android/net/wifi/WifiEnterpriseConfig.html&lt;/a&gt;).

Asking for exceptions does not make sense. There is a process for getting a CA into the trusted list of browsers and operating systems. Please see &lt;a href=&quot;http://www.mozilla.org/projects/security/certs/policy/&quot; rel=&quot;nofollow&quot; style=&quot;color: #0000cc;&quot;&gt;http://www.mozilla.org/projects/security/certs/policy/&lt;/a&gt; for an example of the process that needs to be followed.&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
This all seems pretty reasonable, although arguing that you can write an app to install certificates in a way that doesn&#39;t cause scary messages seems to be a bit of a stretch for most people. &amp;nbsp; But, lets run with the claim for the PKCS#12 bundle for installing the certificates for a second.&lt;br /&gt;
&lt;br /&gt;
Lets start with a little test. &amp;nbsp; First, go download a root CA certificate from a known CA provider. &amp;nbsp;You might need to search around a bit to find one, or you can just use the &lt;a href=&quot;http://www.geotrust.com/resources/root-certificates/#&quot;&gt;GeoTrust certificate&lt;/a&gt;&amp;nbsp;that I will be using as I run through this test. &amp;nbsp; I used the first certificate on the list, which is the &quot;Equifax Secure Certificate Authority&quot; certificate. &amp;nbsp; Next, lets convert that certificate to a PKCS#12 bundle so that we can attempt to install it. &amp;nbsp; You can either try to figure out the magical incantations to do it using OpenSSL, or you could just hop over to the &lt;a href=&quot;https://www.sslshopper.com/ssl-converter.html&quot;&gt;SSL Shopper.com converter&lt;/a&gt;&amp;nbsp;that I will be using. &lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj72ihjNakYJ-dZCl5GMA5AoEOBE3pkObBxXEB58PdHvAPjh_ZpzaTmdMBazErtvZz3nQDdWyvFOlAbVN1xsF6ozTXdGID685MrrXMwOlrdEwGzmCIzCVd0xosJ7cr2VLcADpQ6r78XrZo/s1600/cantconvertca.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj72ihjNakYJ-dZCl5GMA5AoEOBE3pkObBxXEB58PdHvAPjh_ZpzaTmdMBazErtvZz3nQDdWyvFOlAbVN1xsF6ozTXdGID685MrrXMwOlrdEwGzmCIzCVd0xosJ7cr2VLcADpQ6r78XrZo/s320/cantconvertca.png&quot; height=&quot;165&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Whoops. &amp;nbsp;You mean we have to have a private key to create the bundle that we need to install a root CA in a way that doesn&#39;t trigger that scary warning message?! &amp;nbsp; Awww, c&#39;mon!&lt;br /&gt;
&lt;br /&gt;
A little bit of searching will quickly turn up that a PKCS#12 bundle is intended to store a user certificate and any supporting CA certificates it may need. &amp;nbsp; Further, even if you could get a PKCS#12 file with just the CA certificates in it, the code in the Android certificate installer would prevent you from using it. &amp;nbsp;(I have spent FAR too much time digging around in that code. &amp;nbsp;So you may have to trust me on this one.)&lt;br /&gt;
&lt;br /&gt;
Okay, so lets assume for a second that we are using an EAP-TLS network, and so we can create a PKCS#12 bundle that contains a user certificate and private key. &amp;nbsp; According to the statement from the bug, we should be able to do this, and as long as we select the &quot;Wi-Fi&quot; store, we should be good to go. &amp;nbsp; As I happened to have a small home grown CA set up on a Linux box, I tried this method. &amp;nbsp; After going through the install, I still saw the scary icon in the shade. &amp;nbsp; But, how could that be? &amp;nbsp; If the bug was closed because it works as intended, and someone with an @android.com e-mail address says the way it is intended to work shouldn&#39;t be showing that scary icon, we must have done something wrong. &amp;nbsp; Did I maybe forget to select &quot;Wi-Fi&quot; for the target store? &amp;nbsp; So, I decided to try again. &amp;nbsp; The first thing I would do is go an clear the &quot;Credential Store&quot; by going to Settings-&amp;gt;Security-&amp;gt;Clear Credentials. &amp;nbsp; Then, I tried it again, and again got the icon for the scary warning. &amp;nbsp; But this time, I made extra sure that I had selected the &quot;Wi-Fi&quot; store like the bug resolution said to. &amp;nbsp;Interesting...&lt;br /&gt;
&lt;br /&gt;
While poking around with KitKat, I remembered coming across another location that I could use to install certificates. &amp;nbsp; If you go to Settings-&amp;gt;WiFi, select the menu button at the bottom and select &quot;Advanced&quot; there is another option in that menu to install certificates. &amp;nbsp; But, before we do that, we need to clear out the certificates we had already installed. &amp;nbsp;So, we go to Settings-&amp;gt;Security-&amp;gt;Clear Credentials, but the option to clear the credentials isn&#39;t available. &amp;nbsp; Does this mean that the certificates weren&#39;t installed? &amp;nbsp;If you tap on &quot;Trusted Credentials&quot; and then select the &quot;User&quot; tab, you would find that the certificates you had installed are actually listed. &amp;nbsp; So, either the &quot;Clear Credentials&quot; option has a bug that prevents it from being used when a user has installed certificates to the &quot;Wi-Fi&quot; store, or the certificates are installed someplace other than the &quot;normal&quot; user key store. &amp;nbsp; The response to the bug indicated they were installed elsewhere, so lets assume that is the case. &amp;nbsp;(A quick aside. &amp;nbsp;They are actually stored in the same place as they always were, but they are flagged with a different user ID. &amp;nbsp; So, it could easily be argued that we are dealing with a bug. &amp;nbsp;Exactly what the bug is would depend on your view of how things should work, but the fact that historically using &quot;Clear Credentials&quot; has cleared all of the certificates that were installed on the &quot;User&quot; tab would seem to indicate that the same should continue to be true.)&lt;br /&gt;
&lt;br /&gt;
Okay, so the only way to get rid of them appears to be to tap each certificate listed, scroll down and tap the &quot;Remove&quot; button. &amp;nbsp; Fair enough, lets do that. &amp;nbsp; Now, we are ready to install certificates using the installed option located in the advanced section of the WiFi settings. &amp;nbsp; Doing so acts almost the same as installing them through the security menu. &amp;nbsp;The only difference is that you are not given the option to install to the &quot;Wi-Fi&quot; store. &amp;nbsp; So, I guess we have to assume that it is going there by default when you install this way. &amp;nbsp;(Another aside, testing this on the emulator shows that it does go in to the &quot;Wi-Fi store&quot;.)&lt;br /&gt;
&lt;br /&gt;
But, look at that, the scary warning is showing up again!&lt;br /&gt;
&lt;br /&gt;
Well crap. &amp;nbsp; Now what? &amp;nbsp; Lets try the other option outlined. &amp;nbsp; Let&#39;s write our own code. &amp;nbsp;But first, lets take a look at &lt;a href=&quot;https://code.google.com/p/android/issues/detail?id=59200&quot;&gt;this bug&lt;/a&gt;. &amp;nbsp; Uh oh. &amp;nbsp; Looks like that isn&#39;t an option either. &amp;nbsp; And I won&#39;t even bother to point out that the API doesn&#39;t allow for certificate chaining. &amp;nbsp; So, even if it DID work, most people would be outta luck using it anyway.&lt;br /&gt;
&lt;br /&gt;
So there you have it. &amp;nbsp;This is not a bug. &amp;nbsp;It works as intended. &amp;nbsp; Which means that you have &lt;u style=&quot;font-style: italic; font-weight: bold;&quot;&gt;*NO*&lt;/u&gt;&amp;nbsp;way to access an authenticated wireless network without seeing a scary warning that someone might be monitoring your traffic.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
But, before I go, let me relate a story that happened to me a few years ago that, while tangentially related seems like it makes a good warning. &amp;nbsp; Several years ago, I was on a conference call with a large mobile phone provider from the UK, and higher-ups at a phone manufacturer that had significant market share at the time. &amp;nbsp;I&#39;m leaving out names because I suspect neither party would be overly happy to be identified publicly. &amp;nbsp;During this call, the mobile phone provider was asking the manufacturer for APIs to support a product they wanted to deploy. &amp;nbsp; No matter how they asked, or how they threatened, the manufacturer kept telling the provider that they didn&#39;t need those APIs because the product they wanted to use would be obsoleted by something they were working on. &amp;nbsp; After getting off the call, I talked to my boss (who was also on the call) and said, &quot;Ignoring what your customers want seems to be a good way to kill a company.&quot; &amp;nbsp; In the years since that call, the manufacturer ignored more of what its customers wanted, and its market share has declined to a point that is shameful. &amp;nbsp; It doesn&#39;t matter how big your company is, or how your market share is today, if you ignore what your customers want, you will eventually die.&lt;br /&gt;
&lt;br /&gt;
Since there seems to be some interest in how the wireless authentication all fits together on Android, I plan to post additional information here. &amp;nbsp; If you want to know far more about the certificate internals of Android than any reasonable person would, you might want to check back.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/3995702893547724678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2013/11/scary-warning-message-on-kitkat-part-2.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/3995702893547724678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/3995702893547724678'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2013/11/scary-warning-message-on-kitkat-part-2.html' title='Scary Warning Message on KitKat Part 2'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj72ihjNakYJ-dZCl5GMA5AoEOBE3pkObBxXEB58PdHvAPjh_ZpzaTmdMBazErtvZz3nQDdWyvFOlAbVN1xsF6ozTXdGID685MrrXMwOlrdEwGzmCIzCVd0xosJ7cr2VLcADpQ6r78XrZo/s72-c/cantconvertca.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-4834879654755163505</id><published>2013-11-06T07:40:00.003-08:00</published><updated>2015-01-26T09:55:35.725-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="802.1X"/><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="certificates"/><category scheme="http://www.blogger.com/atom/ns#" term="Doubt"/><category scheme="http://www.blogger.com/atom/ns#" term="Fear"/><category scheme="http://www.blogger.com/atom/ns#" term="kitkat"/><category scheme="http://www.blogger.com/atom/ns#" term="scary"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="Uncertainty"/><category scheme="http://www.blogger.com/atom/ns#" term="Wifi"/><title type='text'>Android KitKat : Network may be monitored by an unknown third party</title><content type='html'>&lt;i&gt;Update 1/26/2015 - Google has refused to take this issue seriously. &amp;nbsp;They have closed several bugs posted on the Android bug tracker. &amp;nbsp; Fortunately, there are some other people out there that agree that the current implementation is broken. &amp;nbsp; Unfortunately, Google doesn&#39;t seem to think that it is worth fixing. &amp;nbsp; Since I know a lot of people find this page while looking for information on this annoying warning, I would encourage you to go to the current bug on the Android bug tracker, and star it to show Google that you want this resolved! &amp;nbsp; Perhaps if enough of us star it, Google will start to pay attention. &amp;nbsp; You can find the current open bug&amp;nbsp;&lt;a href=&quot;https://code.google.com/p/android/issues/detail?id=82036&quot;&gt;here.&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Let me start by making the disclaimer that these observations are based on an AOSP build of Android KitKat on a Galaxy Nexus. &amp;nbsp; (My Nexus 5 isn&#39;t due for two more days.) &amp;nbsp; However, things like this that exist in AOSP tend to also exist in the release builds.&lt;br /&gt;
&lt;br /&gt;
Along with all of the great new features in KitKat, Google has introduced what is probably the &lt;u style=&quot;font-style: italic; font-weight: bold;&quot;&gt;WORST&lt;/u&gt;&amp;nbsp;security hole possible. &amp;nbsp; A ham-fisted implementation of certificate pinning.&lt;br /&gt;
&lt;br /&gt;
Certificate pinning itself is a good idea. &amp;nbsp; It verifies that when you visit a web site, it provides you with the same certificate every time. &amp;nbsp; In general, certificates shouldn&#39;t be changing on web sites, and if one does you should be made aware of it.&lt;br /&gt;
&lt;br /&gt;
So, how could certificate pinning be a security hole then? &amp;nbsp; By creating a situation where a harmless certificate creates a scary, and unnecessary, warning message. &amp;nbsp;When you install any certificate in to the key store, you get a warning icon in the bar at the top of the screen. &amp;nbsp; Pulling down the shade presents the following screen :&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4sEB8ngZyQUTxntqx32lqL0w3tS3nr6kJ98kCWYUaME-krdvYyruSWlflPMCdCD1-cgiur2pfkudrhj5FPti-9MAIeMVPYnSe9xSdJRKhOGzhJL-szNJtt8STiQr43F7n9yqJDYFJzq0/s1600/scary-warning.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4sEB8ngZyQUTxntqx32lqL0w3tS3nr6kJ98kCWYUaME-krdvYyruSWlflPMCdCD1-cgiur2pfkudrhj5FPti-9MAIeMVPYnSe9xSdJRKhOGzhJL-szNJtt8STiQr43F7n9yqJDYFJzq0/s320/scary-warning.png&quot; height=&quot;320&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Let&#39;s consider the average user at this point. &amp;nbsp; Given the revelations about all of the snooping by various governments, it seems that a warning like this would make uninformed users very concerned. &amp;nbsp; (And, lets face it, there are very few informed users when it comes to 802.1X on Android.) &amp;nbsp; But, okay, maybe I am freaking out over nothing. &amp;nbsp;What happens when we tap the warning?&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeNb592gxU_OK3l5qWezNh59t72arp2hqaGna-4nqM7t1b0rvfVlfuNneT1O5upFN75h6RNbDYik8vf6foh5UJu8VcOq_f3wHwrmsoepL0NZ_UQW1XCgU4VaLXoWckVh60-J0SJAI36ok/s1600/scary-warning2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeNb592gxU_OK3l5qWezNh59t72arp2hqaGna-4nqM7t1b0rvfVlfuNneT1O5upFN75h6RNbDYik8vf6foh5UJu8VcOq_f3wHwrmsoepL0NZ_UQW1XCgU4VaLXoWckVh60-J0SJAI36ok/s320/scary-warning2.png&quot; height=&quot;320&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Hmm... Maybe not. &amp;nbsp; So, the assumption that an uninformed user is to draw based on this is that having any form of third party &quot;trusted credential&quot; installed means that a 3rd party will probably be monitoring my traffic.&lt;br /&gt;
&lt;br /&gt;
I&#39;m going to skip over the obvious irony here that something from Google is warning me that a 3rd party might be monitoring the web sites I visit, and reading my e-mail. &amp;nbsp;(If the irony is lost on you, you may want to do some research.) &lt;br /&gt;
&lt;br /&gt;
Google seems to be trying to argue that the only safe type of certificate is one that comes pre-installed on your device. &amp;nbsp; Which is a downright silly argument no matter how you slice it. &amp;nbsp; But, lets go ahead and let that one slide. &amp;nbsp; Being the security minded individual that I am, I make sure that all of my network connections are as secure as possible. &amp;nbsp; So, I make the (probably bad) assumption that purchasing a certificate for my RADIUS server from a public CA will provide me what I need in order to have a secure wireless network. &lt;br /&gt;
&lt;br /&gt;
Once I get the network setup, I try to connect my Android device to the network. &amp;nbsp; Now, being that we have paid even a little attention to the security issues around wireless networks, we know that we need to validate the server certificate in order to have a secure connection. &amp;nbsp; No problem, we purchased from a public CA, so we will just select that in the configuration settings. &amp;nbsp; But, you can&#39;t. &amp;nbsp; The pre-installed certificates on Android can&#39;t be used with 802.1X authentication. &amp;nbsp; Okay, no problem. &amp;nbsp;I&#39;ll just install the CA certificate on my device and then use that. &amp;nbsp; Oh, what is this scary message?&lt;br /&gt;
&lt;br /&gt;
Now, those of us that understand the meaning of this message will just dismiss it. &amp;nbsp; But, let&#39;s assume that you aren&#39;t a techno savvy individual that has enough time to spend learning about security. &amp;nbsp; This warning is going to freak you out! &amp;nbsp; If this conversation hasn&#39;t happened on a message board yet, it will soon :&lt;br /&gt;
&lt;br /&gt;
&quot;Hey, I got the upgrade to KitKat, and it is great! &amp;nbsp;But, now I get this warning saying that someone is monitoring my network connection! &amp;nbsp; How do I make that go away!? &amp;nbsp;I don&#39;t want someone monitoring my network connection!&quot;&lt;br /&gt;
&lt;br /&gt;
&quot;Getting rid of that warning is easy. &amp;nbsp; Go to Settings-&amp;gt;Security-&amp;gt;Clear credentials. &amp;nbsp; After that, the warning will go away.&quot;&lt;br /&gt;
&lt;br /&gt;
&quot;Thanks! &amp;nbsp;The warning is gone. &amp;nbsp;But now I can&#39;t connect to my wifi network! &amp;nbsp;HELP!&quot;&lt;br /&gt;
&lt;br /&gt;
&quot;Not a problem. &amp;nbsp;Go in to the configuration for your wifi network and change the &#39;CA certificate&#39; setting to &#39;(undefined)&#39;. &amp;nbsp;Problem solved!&quot;&lt;br /&gt;
&lt;br /&gt;
&quot;Perfect! &amp;nbsp;That solved my problem! &amp;nbsp;Thanks!&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And somehow Google either didn&#39;t consider this case, or they really want to decrease the security of wireless networks.&lt;br /&gt;
&lt;br /&gt;
Anyway, if you happen across this post while looking for how to make this scary looking warning go away, and you use a secure wifi network, please just swipe the warning out of the shade. &amp;nbsp; It is really nothing to worry about. &amp;nbsp; (I&#39;ll do a follow-up post in the next week or so about how authentication on wifi works and why you should care.)&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Edit 11/26/2013 : &lt;/i&gt;A coworker pointed out that my blog post was referenced in a bug posted to the Android bug tracker. &amp;nbsp; The same bug post had a response from someone using an @android.com e-mail address outlining why this issue isn&#39;t a problem. &amp;nbsp; I tested their solutions and wrote about it &lt;a href=&quot;http://geektaco.blogspot.com/2013/11/scary-warning-message-on-kitkat-part-2.html&quot;&gt;here&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/4834879654755163505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2013/11/android-kitkat-network-may-be-monitored.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/4834879654755163505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/4834879654755163505'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2013/11/android-kitkat-network-may-be-monitored.html' title='Android KitKat : Network may be monitored by an unknown third party'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4sEB8ngZyQUTxntqx32lqL0w3tS3nr6kJ98kCWYUaME-krdvYyruSWlflPMCdCD1-cgiur2pfkudrhj5FPti-9MAIeMVPYnSe9xSdJRKhOGzhJL-szNJtt8STiQr43F7n9yqJDYFJzq0/s72-c/scary-warning.png" height="72" width="72"/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-6275798363555564493</id><published>2013-10-13T15:32:00.003-07:00</published><updated>2013-10-13T15:33:12.025-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arcade"/><category scheme="http://www.blogger.com/atom/ns#" term="MAME"/><title type='text'>My Insane Arcade System Build (Part 8)</title><content type='html'>Dunno how many parts this will get up to, but it will probably be quite a few as I slowly lumber toward the completion of this &quot;little&quot; project.&lt;br /&gt;
&lt;br /&gt;
But, back to the gear. &amp;nbsp; Let&#39;s talk joysticks. &amp;nbsp; Since I want everything to light up, the sources I had for sticks was pretty limited. &amp;nbsp;Basically, it looks like&amp;nbsp;&lt;a href=&quot;http://www.paradisearcadeshop.com/&quot;&gt;Paradise Arcade Shop&lt;/a&gt;&amp;nbsp;was pretty much my only choice. &amp;nbsp; This isn&#39;t necessarily a bad thing as they send candy when they fill an order!&lt;br /&gt;
&lt;br /&gt;
As you can see, the box was a tad hammered when I got it :&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpiHVcyU80MewdyTF06U78X7Zs8gG6Bu6leTd31O_6KCjnkgTVDrOQ1uk40BeLx3oKlmJhKaWIrzav0NnRcsW5DLt2_fU9KIrsTinjBp7cqv0OzTfAxkHzIej2QwpT5cJf0g1wim2D7Oc/s1600/paradise_box.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpiHVcyU80MewdyTF06U78X7Zs8gG6Bu6leTd31O_6KCjnkgTVDrOQ1uk40BeLx3oKlmJhKaWIrzav0NnRcsW5DLt2_fU9KIrsTinjBp7cqv0OzTfAxkHzIej2QwpT5cJf0g1wim2D7Oc/s320/paradise_box.png&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Of course, this was not likely the fault of Paradise, but of the postal system. &amp;nbsp; But, it did make me a tad nervous about how the sticks inside would look.&lt;br /&gt;
&lt;br /&gt;
Fortunately, nothing appeared off when I opened the box :&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-YqDU2VV3Y8nOZOcI4e6gV68qJPY_iyo4MtSxlNfUsoq4Bxyp11U8JDK3Ygda0Vp0rrxQZQarz46v4aZl62uKa5kNxSeE3KVYTo8WVhN4sAK4WjZLpidSEH90Obhgs0-tJeSGLUeYEwY/s1600/sticks_in_box.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-YqDU2VV3Y8nOZOcI4e6gV68qJPY_iyo4MtSxlNfUsoq4Bxyp11U8JDK3Ygda0Vp0rrxQZQarz46v4aZl62uKa5kNxSeE3KVYTo8WVhN4sAK4WjZLpidSEH90Obhgs0-tJeSGLUeYEwY/s320/sticks_in_box.jpg&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Inside, there was the previously mentioned candy (top right), and 5 individually wrapped sticks with RGB LED ball tops.&lt;br /&gt;
&lt;br /&gt;
For a better look :&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl_gMQXx1kEMydqsnYeWylOKqbU2Kx5srF44TtPRHFGtW74E7yWWqigTyg3PomngUChfMVsNcrD4SlSMPG9SE14DAsyIvS5gYZQ3w_uUerIWfdox3PrJRcm-4LpWJ8Zb9JEtXwwtKXIC0/s1600/stick_and_candy.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl_gMQXx1kEMydqsnYeWylOKqbU2Kx5srF44TtPRHFGtW74E7yWWqigTyg3PomngUChfMVsNcrD4SlSMPG9SE14DAsyIvS5gYZQ3w_uUerIWfdox3PrJRcm-4LpWJ8Zb9JEtXwwtKXIC0/s320/stick_and_candy.png&quot; width=&quot;199&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The micro switches in the sticks seem to click pretty loud, which hopefully will be a non-issue once the sticks are nicely mounted inside their wooden control panel box. &amp;nbsp;(Spoiler Alert : They are fine once they are mounted.)&lt;br /&gt;
&lt;br /&gt;
I wired up each of the sticks to an Ultimarc LED controller and a mini-PAC to make sure that they worked. &amp;nbsp;Of the 5 sticks I bought, 4 of them worked perfect. &amp;nbsp;One stick had a burned out red LED, which gave me the opportunity to find out how customer service is with Paradise Arcade.&lt;br /&gt;
&lt;br /&gt;
I sent an e-mail and got a quick response asking if I had used resistors in line with the LEDs to avoid burning them out. &amp;nbsp; According to the documentation for the PACLED64 boards from Ultimarc, there is no need for resistors in line, so I responded letting them know which controller I was using and that the documentation specifically said I didn&#39;t need resistors. &amp;nbsp;(I took High School digital electronics, so I knew that resistors were usually used. &amp;nbsp;So I made sure to check the docs.)&lt;br /&gt;
&lt;br /&gt;
After that, I didn&#39;t get a response for the better part of the week. &amp;nbsp; In frustration I posted to the Arcade Controls forum asking if anyone had any issues with Paradise in the past. &amp;nbsp; A couple people said that they had, but calling them on the phone solved the problems quickly. &amp;nbsp;(As an aside, most people had not had any issues.) &amp;nbsp; I called and left a message asking for a status update on getting a new set of LEDs for that stick, and within an hour had an e-mail indicating that the LED was being shipped along with an apology for it taking so long to respond. &amp;nbsp; Perhaps they were on vacation or something? &amp;nbsp; Whatever it was, I did post back to the forum that the problem was resolved to my satisfaction, and I would be happy to order from them again. &amp;nbsp;(As I am writing this after the control panel is all put together, I can safely say that I actually did order from them again. &amp;nbsp;More on that in a later post.)&lt;br /&gt;
&lt;br /&gt;
One thing that I thought was really cool about these sticks is the restrictor plate comes built in to them. &amp;nbsp;As you can see in the image below, the plate fits three ways. &amp;nbsp;The default way allows for fully 8-way movement. &amp;nbsp;Flip it one way and the stick becomes a 4-way stick. &amp;nbsp; Flip it the other way, and it appears to become a 2-way stick! &amp;nbsp;(I didn&#39;t plan on using a 2-way stick, so I can&#39;t comment on how well that works.) &amp;nbsp;As I was shopping for sticks, it seemed that most of them required the restrictor plate be purchased in addition to the stick, so this seemed like a pretty good value.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfYgv7_6UA2VK6SCL1Y8dC4quWKfisopn1YfWe_G-CNL-FhL_7RkJDj1wn-Y-CIwH2J9bCD9uI0zoovGf3DX9WLrfEKqgmlfAmUvW0YqI2v0TisH_2aafa2CoJTOiQX3ABnf4xT7gmbIA/s1600/restrictor.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfYgv7_6UA2VK6SCL1Y8dC4quWKfisopn1YfWe_G-CNL-FhL_7RkJDj1wn-Y-CIwH2J9bCD9uI0zoovGf3DX9WLrfEKqgmlfAmUvW0YqI2v0TisH_2aafa2CoJTOiQX3ABnf4xT7gmbIA/s320/restrictor.png&quot; width=&quot;198&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The sticks themselves seem to be pretty well built. &amp;nbsp; I am FAR from an expert in this area, but they feel like they could easily handle the kind of moderate beating they are likely to get from guests at my house.&lt;br /&gt;
&lt;br /&gt;
So, in short, I would recommend these sticks.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/6275798363555564493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2013/10/my-insane-arcade-system-build-part-8.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/6275798363555564493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/6275798363555564493'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2013/10/my-insane-arcade-system-build-part-8.html' title='My Insane Arcade System Build (Part 8)'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpiHVcyU80MewdyTF06U78X7Zs8gG6Bu6leTd31O_6KCjnkgTVDrOQ1uk40BeLx3oKlmJhKaWIrzav0NnRcsW5DLt2_fU9KIrsTinjBp7cqv0OzTfAxkHzIej2QwpT5cJf0g1wim2D7Oc/s72-c/paradise_box.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-4825314529250867305</id><published>2013-09-21T12:00:00.000-07:00</published><updated>2013-09-21T12:00:02.398-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arcade"/><category scheme="http://www.blogger.com/atom/ns#" term="MAME"/><title type='text'>My Insane Arcade System Build (Part 7)</title><content type='html'>Among all of the stuff that has shown up, are the light guns. &amp;nbsp; I took a lot of pictures of these because the pictures on the ArcadeGuns.com web site left me with some questions about button layout.&lt;br /&gt;
&lt;br /&gt;
But, lets get to the pictures. &amp;nbsp;The guns showed up in a pretty standard USPS priority mail box. &amp;nbsp;It shipped two day priority from the ArcadeGuns.com folks.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZAJxAeELhmMufovVilLculpud9kpQKNuvLyfATfUtT8xMc_wfr73a5sDSVHYAobci_WJ8U4td-95u1_tiesAqJEzDhg-vjR-Kkqj9CcjeosZC_RSXk6vhyGtY8UrbDxEBQQkU-8ohwqQ/s1600/arcadeguns-box.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZAJxAeELhmMufovVilLculpud9kpQKNuvLyfATfUtT8xMc_wfr73a5sDSVHYAobci_WJ8U4td-95u1_tiesAqJEzDhg-vjR-Kkqj9CcjeosZC_RSXk6vhyGtY8UrbDxEBQQkU-8ohwqQ/s320/arcadeguns-box.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Inside, the guns were wrapped in bubble wrap and surrounded with packing peanuts. &amp;nbsp;As usual, the packing peanuts got everywhere when I opened the box, which was a pain. &amp;nbsp;But, beyond that, everything seemed to be packed snugly in the box.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR-ti6_qD7J8gmGzTfwg82xbMwHMlPaUfEZzZWCqWxXrbOFcq4KzDCdvWhdODSFl_f8ka1gnofEqRGShQLjTftMB3HeEvV3nsA4bS3Nz4zDPwv41lxPe_fCvA0tiJmu229JAAFkUpju7Y/s1600/arcadeguns-contents.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR-ti6_qD7J8gmGzTfwg82xbMwHMlPaUfEZzZWCqWxXrbOFcq4KzDCdvWhdODSFl_f8ka1gnofEqRGShQLjTftMB3HeEvV3nsA4bS3Nz4zDPwv41lxPe_fCvA0tiJmu229JAAFkUpju7Y/s320/arcadeguns-contents.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
As you can see, the guns were each wrapped in bubble wrap, as was the IR bar that goes along with them. &amp;nbsp;Because the IR bar will end up going behind the plexi-glass of the cabinet, I saved myself a few bucks and ordered it without the case.&lt;br /&gt;
&lt;br /&gt;
The IR bar itself really doesn&#39;t have much to it. &amp;nbsp;It is made up of 6 IR LEDs and a few resistors. &amp;nbsp;One nice feature is that the cable can easily be disconnected from the IR bar. &amp;nbsp; I suspect this will make things a bit easier when it comes time to install this in the cabinet.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvoBfpXy70P1nzUxPkkn4JdBGdy2A9Rmcj22pLKtseY9fJUdIZJ_q8WUs9MWzSz66ZsWOZrV5y8lhlVk3RP4yLLByc5o16U3hfxOp9J9jH3l5zdffbZwoe_q7aBrbBNhx3I0h6H9mSlzs/s1600/guns-ir-bar.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvoBfpXy70P1nzUxPkkn4JdBGdy2A9Rmcj22pLKtseY9fJUdIZJ_q8WUs9MWzSz66ZsWOZrV5y8lhlVk3RP4yLLByc5o16U3hfxOp9J9jH3l5zdffbZwoe_q7aBrbBNhx3I0h6H9mSlzs/s320/guns-ir-bar.png&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The guns themselves are where I had a few questions while looking at the ArcadeGuns.com site. &amp;nbsp; With some digging, I was able to find pictures that lead me to believe that there were two buttons on the guns. &amp;nbsp;One is where the hammer would be on a revolver, the other is in the center of the grip.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-UOAGWfko8XuSNm2Ph64BZKMxiU90dCD5TGnMAG0xvWvnPg7krrzblfv8RP0W9eLobe1sSpvQz1tN2COQoNKVY1Z9DayXQDwL6poPB_qRLBk4CJ_8qRFx8GVgPCDAgJ5AkR6X0S_syAo/s1600/redgun-back-btn.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-UOAGWfko8XuSNm2Ph64BZKMxiU90dCD5TGnMAG0xvWvnPg7krrzblfv8RP0W9eLobe1sSpvQz1tN2COQoNKVY1Z9DayXQDwL6poPB_qRLBk4CJ_8qRFx8GVgPCDAgJ5AkR6X0S_syAo/s320/redgun-back-btn.png&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg1EZOEBCTAsKuaZd-xqk15G1scBipr15M6ZQgrm2UAIUFCs-WWb_yIaZNRoiwsBZdPIZ_GN-F-ZpOnuJ2mkZ-fcGtaxifzLm-keadZNLOuWyN70QN6f2bx1Q8TM3KExe4nQ6WPrMRfNk/s1600/redgun-grip-btn.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg1EZOEBCTAsKuaZd-xqk15G1scBipr15M6ZQgrm2UAIUFCs-WWb_yIaZNRoiwsBZdPIZ_GN-F-ZpOnuJ2mkZ-fcGtaxifzLm-keadZNLOuWyN70QN6f2bx1Q8TM3KExe4nQ6WPrMRfNk/s320/redgun-grip-btn.png&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
I am not sure how much I&#39;ll like having the button on the grip. &amp;nbsp;It seems like it would be easy to hit. &amp;nbsp;But, I guess it can always be programmed not to do anything. &amp;nbsp;(Or to reload, which would make accidentally hitting it a bonus!)&lt;br /&gt;
&lt;br /&gt;
The mold of the gun is also interesting :&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisQHrzyrdfp4VXkjp5qT9n-M-Q-ehINEOq9yluTVokaC47iFEFZRqCFT3sx_Hlx8GVv0yzgWBcVNpeAGawXaeW5-EhVJRW6gYUvGSqotwuC4vn9qSISkl7JzuP4g2RwXUSxyrLbqe0EPM/s1600/redgun-body.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisQHrzyrdfp4VXkjp5qT9n-M-Q-ehINEOq9yluTVokaC47iFEFZRqCFT3sx_Hlx8GVv0yzgWBcVNpeAGawXaeW5-EhVJRW6gYUvGSqotwuC4vn9qSISkl7JzuP4g2RwXUSxyrLbqe0EPM/s320/redgun-body.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
If you look at the Ultimarc web store, you can find the kit to build your own light gun. &amp;nbsp;It is really small. &amp;nbsp;So, obviously most of the casing of the gun is to make it comfortable in your hands. &amp;nbsp; The really interesting piece to me is the section right in front of the trigger. &amp;nbsp;It seems unlikely that piece holds any kind of circuitry in the gun. &amp;nbsp;Perhaps ArcadeGuns.com is thinking of adding a recoil feature in the future? &amp;nbsp; Or, I guess it could also be just to even out the weight of the gun in your hand. &lt;br /&gt;
&lt;br /&gt;
I have not had a chance yet to try the guns out on a game. &amp;nbsp; But, one other thing I was curious about was how the buttons feel. &amp;nbsp; I remember from my younger days, playing &quot;Operation Wolf&quot; on the 8-bit Nintendo with the zapper. &amp;nbsp;The trigger on the zapper was really loud and and made a snapping sound each time you pulled it. &amp;nbsp; This didn&#39;t seem like a big deal for games like Duck Hunt where you only pulled the trigger once in a while, but on games like Operation Wolf, where you pull the trigger rapidly, it was really noisy, and felt as though you were going to break the trigger mechanism in the gun! &amp;nbsp;Fortunately, these guns are nothing like that. &lt;br /&gt;
&lt;br /&gt;
Each of the switches on this gun seem to be fairly soft. &amp;nbsp;They make a rubberized &quot;squishing/clicking&quot; sound when you press them. &amp;nbsp; Very similar to the buttons on remote unlock systems for cars, but probably a little softer. &amp;nbsp;Overall, I expect they will be pretty quiet when in use. &amp;nbsp;And, while I am unsure how much I am going to like having a trigger that soft, there does seem to be enough forward force on the trigger so that you could easily tell when you have pulled the trigger fully. &amp;nbsp; Also, while the trigger looks rather large, it doesn&#39;t seem to need to be pulled back very far before you hear the clicking of the switch inside. &amp;nbsp; I am guessing that for rapid fire games like Operation Wolf, these guns will be comfortable, and not feel like they are going to break like the old NES zapper did.&lt;br /&gt;
&lt;br /&gt;
Finally, as you can probably tell from the picture above, there is quite a bit of USB cord on these guns. &amp;nbsp;I am very hopeful that there is enough that I can string it through the cabinet and get to the USB ports on the PC inside. &amp;nbsp;But, I won&#39;t know that until the cabinet is complete, which is probably still a couple of months away.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/4825314529250867305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2013/09/my-insane-arcade-system-build-part-7.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/4825314529250867305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/4825314529250867305'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2013/09/my-insane-arcade-system-build-part-7.html' title='My Insane Arcade System Build (Part 7)'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZAJxAeELhmMufovVilLculpud9kpQKNuvLyfATfUtT8xMc_wfr73a5sDSVHYAobci_WJ8U4td-95u1_tiesAqJEzDhg-vjR-Kkqj9CcjeosZC_RSXk6vhyGtY8UrbDxEBQQkU-8ohwqQ/s72-c/arcadeguns-box.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-5010144893373980080</id><published>2013-09-20T12:00:00.000-07:00</published><updated>2013-09-20T12:00:05.789-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arcade"/><category scheme="http://www.blogger.com/atom/ns#" term="MAME"/><title type='text'>My Insane Arcade System Build  (Part 6)</title><content type='html'>Boy, oh boy! &amp;nbsp;Orders have been working their way to my house! &amp;nbsp; Probably enough for a few more posts!&lt;br /&gt;
&lt;br /&gt;
Lets start with a few simple things. &amp;nbsp;I don&#39;t have panels that make up the control panel from North Coast yet. &amp;nbsp;Those will probably be here in the next week or so. &amp;nbsp;However, I figured it is never too early to start looking at things to make it pretty. &amp;nbsp; So, while looking around for T-molding, I came across &lt;a href=&quot;http://www.t-molding.com/store/home.php&quot;&gt;t-molding.com&lt;/a&gt;. &amp;nbsp;T-molding.com will send you some samples to look at, so I took them up on it and ordered samples of the 5/8&quot; molding to get a feel for how the colors looked. &amp;nbsp;Here is a picture of the samples :&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6pbbAhcOSGE535j-n0Pz-2Eke5D11G3yW-ndB9Yko_36OGBXXghyphenhyphenL74TEytj_BgelvBaVRS6i3PLN1CKo-mq51PQXbTbA5By_rj-WOUHkDADtD95ICFQ-BffKHpVgYjpyYs4SJaSg1mQ/s1600/tmolding.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6pbbAhcOSGE535j-n0Pz-2Eke5D11G3yW-ndB9Yko_36OGBXXghyphenhyphenL74TEytj_BgelvBaVRS6i3PLN1CKo-mq51PQXbTbA5By_rj-WOUHkDADtD95ICFQ-BffKHpVgYjpyYs4SJaSg1mQ/s320/tmolding.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The one on the farthest left looks like an issue with the camera, but it is actually black with a silver stripe. &amp;nbsp;It looks really cool, but I am not sure it will look good on a cabinet that is already black. &amp;nbsp; I&#39;m leaning toward the light blue right now, but have to wait until the first parts of the cabinet show up to be sure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
My order from AllElectronics.com came packed in a pretty typical shipping package from the USPS.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidxIaR5Hc_s3qlPcHzqCxoJQWzfsC-Gq9W7yWoPEAxCah6uBIoJo4NE0d33GszibWyXgHp0G0T2OkVkA9hFoYqAfiRmAstS_nsOnx6p5NL3bA7-MPwftkoGLU-guqa1IxA5Yjm3Qal020/s1600/allelectric-shipped.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidxIaR5Hc_s3qlPcHzqCxoJQWzfsC-Gq9W7yWoPEAxCah6uBIoJo4NE0d33GszibWyXgHp0G0T2OkVkA9hFoYqAfiRmAstS_nsOnx6p5NL3bA7-MPwftkoGLU-guqa1IxA5Yjm3Qal020/s320/allelectric-shipped.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Inside was the goodies that I will need to make the connections to the sticks and buttons. &amp;nbsp; Which basically boils down to quick connect pieces, a few DSub connectors, and some wire. &amp;nbsp;It all came packed in a large plastic bag wrapped with some brown packing paper. &amp;nbsp;When it is unpacked, it looks like this :&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn-2QBNRaTB0ChTJT_dcy2GwmntK-qEjUaCD13sQCeU6t6V-teIiHXhL1Lz9Y-NxAVP1Lg79-lxypPpR8Z4ks-xxYTapcrco_yPtQMZy3AwH3IV1eYMzvlUqCr9m3ZKM4fze2G2XdqRpU/s1600/wiring.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn-2QBNRaTB0ChTJT_dcy2GwmntK-qEjUaCD13sQCeU6t6V-teIiHXhL1Lz9Y-NxAVP1Lg79-lxypPpR8Z4ks-xxYTapcrco_yPtQMZy3AwH3IV1eYMzvlUqCr9m3ZKM4fze2G2XdqRpU/s320/wiring.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
I elected to get a wiring that matches the colors used on a standard molex power connector on a computer. &amp;nbsp;This is because the PACLED64s need power and come with a molex connector. &amp;nbsp; It seems it will be easiest to keep the colors all the same.&lt;br /&gt;
&lt;br /&gt;
While not the most exciting stuff, it is all necessary to complete the project. &amp;nbsp;And, since I wanted to document everything involved in it, you get this exciting post! &amp;nbsp;Enjoy!&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/5010144893373980080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2013/09/my-insane-arcade-system-build-part-6.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/5010144893373980080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/5010144893373980080'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2013/09/my-insane-arcade-system-build-part-6.html' title='My Insane Arcade System Build  (Part 6)'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6pbbAhcOSGE535j-n0Pz-2Eke5D11G3yW-ndB9Yko_36OGBXXghyphenhyphenL74TEytj_BgelvBaVRS6i3PLN1CKo-mq51PQXbTbA5By_rj-WOUHkDADtD95ICFQ-BffKHpVgYjpyYs4SJaSg1mQ/s72-c/tmolding.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-5399108830788079725</id><published>2013-09-19T16:59:00.000-07:00</published><updated>2013-09-19T16:59:00.910-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arcade"/><category scheme="http://www.blogger.com/atom/ns#" term="MAME"/><title type='text'>My Insane Arcade System Build (Part 5)</title><content type='html'>We have narrowed down the buttons that we want, but really need to understand how we are going to light them before we make a final decision. &amp;nbsp; &amp;nbsp;It is probably easiest to buy the buttons and the LED controllers from the same place as you would expect that they have been tested to work together. &amp;nbsp; So, since we previously established that we were down to the Groovy Game Gear and Ultimarc buttons, it makes sense to look at the controllers they sell as well.&lt;br /&gt;
&lt;br /&gt;
Groovy Game Gear sells the &lt;a href=&quot;http://groovygamegear.com/webstore/index.php?main_page=product_info&amp;amp;products_id=239&quot;&gt;LED-Wiz32&lt;/a&gt;&amp;nbsp;which can control 32 LEDs. &amp;nbsp; Ultimarc has the &lt;a href=&quot;http://www.ultimarc.com/pacled64.html&quot;&gt;PACLED64&lt;/a&gt;&amp;nbsp;that can contol 64 LEDs. &amp;nbsp; If you will recall, we have 43 buttons, plus 5 sticks, and 1 track ball that we need to light. &amp;nbsp; So, we have 49 LEDs total that need to be lit. &amp;nbsp; So, we can order 2 LED-Wiz32s or 1 PACLED64, right?&lt;br /&gt;
&lt;br /&gt;
Not so fast there. &amp;nbsp;The devil is in the details. &amp;nbsp; If you read carefully, you will discover that 1 single color LED uses fewer leads than 1 RGB LED. &amp;nbsp; A single color LED has 2 leads. &amp;nbsp; An RGB LED has 4! &amp;nbsp;In addition, the RGB LED needs one lead for each of the three colors, and one lead for ground. &amp;nbsp; So, we can think of an RGB LED as actually being 3 single color LEDs, which changes the math a bit. &amp;nbsp; We still have 49 physical LEDs, but since we want to be able to control all three colors in the RGB LEDs, we actually need controls for 49*3, or 147 LEDs. &amp;nbsp; This means that we need 5 LED-Wiz32s, or 3 PACLED64 boards to drive all of those colors.&lt;br /&gt;
&lt;br /&gt;
Suddenly, the pricing for getting all of this light looks a bit different. &amp;nbsp; However, there is another factor to consider that is more aesthetic. &amp;nbsp;The PACLED64 requires power in addition to the USB cable, where the LED-Wiz32 seems to pull its power from the USB bus. &amp;nbsp; So, the PACLED64 is going to require some extra wires be extended in to your control panel to light all of the buttons. &amp;nbsp; However, the LED-Wiz32 will either require additional USB cables going in to the control panel, or a powered USB hub to be installed. &amp;nbsp; However, one thing to be aware of with powered USB hubs is most HUBs aren&#39;t built to provide maximum power to all of the ports on the hub. &amp;nbsp; So, finding a hub to use with the LED-Wiz32 may well be a guess and check type of proposition.&lt;br /&gt;
&lt;br /&gt;
My decision ultimately came down to cost and difficulty. &amp;nbsp; While I am not jazzed about pulling extra power wires in to the control panel to power the PACLED64, I am even less jazzed about finding a USB hub with enough power in it to feed the LED-Wiz32. &amp;nbsp; Not to mention, both basically require pulling power in to the control panel to run the LEDs. &amp;nbsp; Then, factor in the cost difference between the two, and I elected to go with the PACLED64. &amp;nbsp; &amp;nbsp;However, it is important to note that my decision was based purely on cost. &amp;nbsp; How well either board works is something I don&#39;t have the money to compare. &amp;nbsp; So, I am taking a roll of the dice that they both perform similarly.&lt;br /&gt;
&lt;br /&gt;
So, I elected to purchase the LED controller and buttons from Ultimarc. &amp;nbsp; However, there was an issue when I went to order them. &amp;nbsp; I needed 43, but the on-line site claimed they only had 20. &amp;nbsp; So, I shot a quick e-mail over to Andy at Ultimarc to ask when more buttons would be in. &amp;nbsp;Andy responded within 24 hours saying that it was an issue with the web site, and he had plenty in stock. &amp;nbsp; The issue was fixed, and I was able to order.&lt;br /&gt;
&lt;br /&gt;
So, the only other things that I needed to sort out is getting the quick connects and wire ordered. &amp;nbsp; In part 1, I mentioned that I ordered those parts from AllElectronics.com. &amp;nbsp; The order was pretty much a couple spools of wire, a couple hundred quick connects in a couple of sizes to be safe, and some 24 pin D-Sub connectors (both male and female).&lt;br /&gt;
&lt;br /&gt;
The D-Subs probably seem to come out of left field. &amp;nbsp;Why the heck would you need them!? &amp;nbsp; Well, back in part 1 of this effort, I mentioned that I wanted to have the option to wire in a JAMMA harness in the future, so that I could collect the hardware versions of my favorite games. &amp;nbsp; I figure that if I solder all of the wires from the switches in to some D-Sub connectors then I can later wire a JAMMA harness to the opposite gender D-Sub connectors, and I have a quick way to switch between the systems. &amp;nbsp; How well this idea works remains to be seen. &amp;nbsp; However, I figure worst case I end up wasting some time to add some flexibility to the overall project.</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/5399108830788079725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2013/09/my-insane-arcade-system-build-part-5.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/5399108830788079725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/5399108830788079725'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2013/09/my-insane-arcade-system-build-part-5.html' title='My Insane Arcade System Build (Part 5)'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-7845851896714557329</id><published>2013-09-18T16:34:00.000-07:00</published><updated>2013-09-18T16:34:00.603-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arcade"/><category scheme="http://www.blogger.com/atom/ns#" term="MAME"/><title type='text'>My Insane Arcade System Build (Part 4)</title><content type='html'>Since I decided to go with the U-HID for the primary control method, it seemed that my best option for a trackball and a spinner was to just order them from Ultimarc. &amp;nbsp; Groovy Game Gear had a much less expensive spinner, which was enticing, but it was unclear how hard it would be to hook to the U-HID, so I decided to pay a bit more and go with the spinner from Ultimarc. &amp;nbsp; The Ultimarc spinner appears to be the same price as the one at Groovy Game Gear until you realize that you need to purchase the spinner cap in addition to the spinner at Ultimarc. &amp;nbsp;Then it becomes more expensive. &amp;nbsp; If you are more confident in your wiring abilities than I am, you can save yourself some money here and order from Groovy Game Gear.&lt;br /&gt;
&lt;br /&gt;
For the trackball, I really liked the idea of not having to deal with a top mount plate. &amp;nbsp;Ultimarc has a track ball kit that doesn&#39;t require a top mount kit. &amp;nbsp; However, if you go back and look at the pictures for the Ultimate Quad control panel at North Coast Custom Arcades, you will see that it is clearly cut to be used with the top mount plate. &amp;nbsp; Reading through the various bits of information that I could find, it also became unclear to me if the ball on the Ultimarc U-trak would be too big to fit in the control panel. &amp;nbsp; It was also unclear if using that track ball would be considered &quot;custom&quot; by North Coast, which would add an additional charge to the purchase of the control panel kit. &amp;nbsp; However, after talking to the guys at North Coast, I was told that it was not an additional charge, but to get the panel cut for the U-trak track ball, I needed to specify that I planned to use that track ball in the comments section of the order. &amp;nbsp;(Which is a good reason to know what you are ordering before you do it!) &amp;nbsp; They also told me that the U-trak is what they used in their own builds, so it should work great.&lt;br /&gt;
&lt;br /&gt;
So, we now have the leg work done for all of the controls except the RGB LED buttons. &amp;nbsp; Finding the right buttons ended up taking a lot more time than I had expected. &amp;nbsp; First, I had to try to track down who I could actually order the buttons from, and what kind of buttons are available. &amp;nbsp; Ultimarc, Groovy Game Gear, and Paradise Arcade Shop all had RGB buttons. &amp;nbsp; Ultimarc and Groovy Game Gear also appeared to have controllers to run the LEDs. &amp;nbsp;(Paradise Arcade Shop appeared to sell a controller as well, but it wasn&#39;t in stock.) &amp;nbsp; Ultimarc and Groovy Game Gear sold the complete RGB buttons as a kit, while Paradise Arcade Shop sold the buttons and the RGB lights separately. &amp;nbsp; With Paradise Arcade shop, they sell at least two different types of RGB LED inserts. &amp;nbsp; It was unclear to me which inserts went with which buttons. &amp;nbsp; However, a quick e-mail to them asking if a certain button and light worked together resulted in an answer that I had picked the correct light to match with the button.&lt;br /&gt;
&lt;br /&gt;
I quickly discovered that I had too many choices of buttons, for my desired goal. &amp;nbsp; So, I set about trying to narrow down which ones I wanted. &amp;nbsp; Paradise Arcade Shop has a video on their site about lighted buttons that shows the difference in how buttons can look based on where the LED inside them is positioned. &amp;nbsp; This was good information that I had not considered previously. &amp;nbsp; After watching the video, I decided that I wanted buttons that didn&#39;t have a significant &quot;hot spot&quot; in the button. &amp;nbsp; Having a hot spot when the button is pushed is probably less of an issue, since it will be under your finger, but having hot spots when the button is not pushed could result in the buttons not looking as good as I would like.&lt;br /&gt;
&lt;br /&gt;
So, how do I figure out how the different buttons look? &amp;nbsp; Fortunately, someone on the &lt;a href=&quot;http://forum.arcadecontrols.com/&quot;&gt;Arcade Control Forms&lt;/a&gt; had the same question, and did some testing to find out. &amp;nbsp; You can find the post about the different buttons &lt;a href=&quot;http://forum.arcadecontrols.com/index.php?topic=121965.0&quot;&gt;here&lt;/a&gt;. &amp;nbsp;As a quick aside, there seems to be a lot more than just how the buttons look that will factor in to how much you like them. &amp;nbsp; As I was researching everything there was a lot of discussion about the different types of switches that were used in the buttons. &amp;nbsp; If you think you are going to be picky about how your buttons respond, I suggest you do some reading on that. &amp;nbsp; For me, I figured I would go with whatever the default is with the buttons and replace the switches later if I don&#39;t like them.&lt;br /&gt;
&lt;br /&gt;
After looking at the forum post, I came to the conclusion that I didn&#39;t want clear buttons. &amp;nbsp;This shrunk my choices a little bit. &amp;nbsp; However, after looking at the site for Paradise Arcade Shop, I discovered that the non-translucent buttons weren&#39;t in stock, which basically brought me down to a decision between the Groovy Game Gear, and the Ultimarc buttons. &amp;nbsp; But, like the controller for the buttons and sticks, it makes sense to understand how we are going to control the LEDs before we make a final decision.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/7845851896714557329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2013/09/my-insane-arcade-system-build-part-4.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/7845851896714557329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/7845851896714557329'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2013/09/my-insane-arcade-system-build-part-4.html' title='My Insane Arcade System Build (Part 4)'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-7646967876055800913</id><published>2013-09-17T16:12:00.000-07:00</published><updated>2013-09-17T16:12:00.041-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arcade"/><category scheme="http://www.blogger.com/atom/ns#" term="MAME"/><title type='text'>My Insane Aracde System Build (Part 3)</title><content type='html'>With the sticks selected and ordered, it was time to move on to the next most easy thing. &amp;nbsp; The light guns. &amp;nbsp;If you search around a lot, you will discover that there are a surprising number of options for light guns out there. &amp;nbsp; Since I plan to use a CRT monitor, I really wanted the classic optical light guns to go along with it. &amp;nbsp; However, it seems that those just aren&#39;t that easy to get integrated with a build like this. &amp;nbsp;(Not to say it is impossible, just that it is currently beyond the skills of this newbie.) &amp;nbsp; So, I looked at what was available, did some research, and found a few sets of guns.&lt;br /&gt;
&lt;br /&gt;
At least one set of guns was wireless. &amp;nbsp; While this sounds like it would be cool, the thought of keeping batteries in the darn things just sounds like a pain. &amp;nbsp; And, to keep things as authentic as possible, I really wanted something with a wire hanging, just like it would in the arcade. &amp;nbsp; So, I eventually narrowed myself down to the Arcade Guns light guns, and the AimTrak gun from Ultimarc. &amp;nbsp; &amp;nbsp;From what I could find, the Ultimarc AimTrak guns sound like they work really well. &amp;nbsp; I also liked the option of being able to add a recoil function to them to keep things even more authentic. &amp;nbsp; However, two things kept me from getting the AimTrak guns. &amp;nbsp;1) They only had the black ones in stock when I tried to order. &amp;nbsp; 2) Adding the recoil functionality requires soldering skills that are probably beyond mine.&lt;br /&gt;
&lt;br /&gt;
After digging in a bit more, I found that the Arcade Guns light guns actually use the AimTrak internals. &amp;nbsp; They also had the red and blue kits in stock, which would more closely match what I remember from my arcade days. &amp;nbsp; On closer look, I also think I like the button positioning on the Arcade Guns units. &amp;nbsp;So, I went ahead and ordered a set of those. &amp;nbsp; I also opted to save myself a few bucks by ordering the IR bar without a case. &amp;nbsp;I plan to install it directly in to my cabinet.&lt;br /&gt;
&lt;br /&gt;
As a quick aside, I spoke to the folks at North Coast Custom Arcades, and was assured that once I get my system all assembled, there will be enough space around the control panel to put the light gun cables through. &amp;nbsp;But, I&#39;ll get to the discussions with them in another post.&lt;br /&gt;
&lt;br /&gt;
Ordering the remaining parts ended up becoming an interesting exercise in finding the controller components I wanted, mixed with pricing, and what was available. &amp;nbsp; While asking some questions on the &lt;a href=&quot;http://forum.arcadecontrols.com/&quot;&gt;Arcade Controls Forum&lt;/a&gt;, I discovered that there are multiple ways to &quot;implement&quot; a joystick in a MAME cabinet. &amp;nbsp; You can wire a stick up to send keyboard codes to your computer, or you can wire it up to look to the machine like a standard USB joystick. &amp;nbsp; It seems to me that the key difference in which method you want to use is based on how you intend to use the sticks, and if they are analog sticks. &amp;nbsp; If the sticks are only going to be used for emulators, then it shouldn&#39;t matter which method you use. &amp;nbsp; However, if you are using analog sticks, then key presses won&#39;t provide the full sweep of options that you would get from an analog stick. &amp;nbsp;So, the &quot;correct&quot; answer is largely a matter of what hardware you use, and how you plan to use it. &amp;nbsp; For my build, I wanted the maximum possible flexibility. &amp;nbsp; After digging around, I came upon the Ultimarc U-HID controller, which seems to be programmable to allow it to show up as either a joystick, or key presses. &amp;nbsp;However, it is unclear if it would work with an analog joystick, or even how programmable it is. &amp;nbsp; But, knowing that I plan to primarily use emulators, I should be fine with whatever it ends up being able to do.&lt;br /&gt;
&lt;br /&gt;
However, one aspect to consider with the controllers is how many devices and switches you need to control. &amp;nbsp;We know that we have 43 buttons, with one switch each. &amp;nbsp; We also know that we have 5 sticks. &amp;nbsp;Each stick is going to have 4 switches for a total of 20 switches. &amp;nbsp;So, we will have 63 switches plus a track ball and spinner. &amp;nbsp; Since the U-HID only has 50 controls, we will either need 2 of them, or 1 of them and 1 of something else. &amp;nbsp; (As I write this, I realized I only ordered 1! &amp;nbsp;Looks like I need to figure out how to support the remaining 13 switches + track ball and spinner! &amp;nbsp; More on that later, I guess..)</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/7646967876055800913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2013/09/my-insane-aracde-system-build-part-3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/7646967876055800913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/7646967876055800913'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2013/09/my-insane-aracde-system-build-part-3.html' title='My Insane Aracde System Build (Part 3)'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-6374674575946886730</id><published>2013-09-16T15:33:00.000-07:00</published><updated>2013-09-16T15:33:00.262-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arcade"/><category scheme="http://www.blogger.com/atom/ns#" term="MAME"/><title type='text'>My Insane Aracde System Build (Part 2)</title><content type='html'>As with all &quot;simple&quot; projects, this one got out of hand in a hurry. &amp;nbsp; The first thing I needed to do was to figure out all of the things I didn&#39;t know I needed to know about. &amp;nbsp; That is always a fun thing. &amp;nbsp; So, with a little Googleing, I tracked down the &lt;a href=&quot;http://forum.arcadecontrols.com/&quot;&gt;Arcade Controls Forum&lt;/a&gt;. &amp;nbsp; This place is an insane wealth of information about every aspect of arcade game systems you could imagine. &amp;nbsp; Perhaps the worst thing about the forum is that there is SO MUCH information that it can be really hard to track down exactly what you are looking for. &amp;nbsp; However, when I couldn&#39;t find what I wanted to know, I found that registering and asking a question in the forum usually netted useful information, with few exceptions.&lt;br /&gt;
&lt;br /&gt;
But, lets start with a quick recap of what we know, and what we need to figure out.&lt;br /&gt;
&lt;br /&gt;
1. The arcade cabinet will be a &lt;a href=&quot;http://www.mameroom.com/Products_UAII_Kit.asp&quot;&gt;North Coast Custom Arcade Ultimate Arcade II Cabinet kit&lt;/a&gt;.&lt;br /&gt;
2. The control panel (where the sticks and buttons are installed) will be &lt;a href=&quot;http://www.mameroom.com/Products_Quad_Kit.asp&quot;&gt;North Coast Custom Arcade Ultimate Quad kit&lt;/a&gt;. &amp;nbsp;(I chose not to have the pinball buttons added, as the size of the control panel seemed like it would put them too far apart for comfort.)&lt;br /&gt;
3. I want RGB lighted sticks, buttons, and trackball.&lt;br /&gt;
4. I need some kind of computer to run it all.&lt;br /&gt;
5. I want the computer to boot up and be ready to play without needed to use a keyboard or mouse.&lt;br /&gt;
&lt;br /&gt;
Tracking down a computer was pretty easy. &amp;nbsp; I have an old AMD Phenom 1.9 Ghz Quad Core system that badly needed to be upgraded to support my wife&#39;s need for the latest versions of PhotoShop. &amp;nbsp; So, I ordered parts for a new system from NewEgg, and decided to convert the old system to be my arcade machine.&lt;br /&gt;
&lt;br /&gt;
With the machine figured out, I needed to get the parts ordered so that I could start to assemble my control panel. &amp;nbsp; After doing some Google searches, and reading through a bunch of posts on the Arcade Controls Forum, I game up with a list of a few places to order parts for the control panel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ultimarc.com/&quot;&gt;Ultimarc&lt;/a&gt;&amp;nbsp;- Has quite a good selection of buttons, sticks, trackballs, and light guns. &amp;nbsp;The web site was also reasonably easy to navigate for a newbie like me.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://groovygamegear.com/webstore/&quot;&gt;Groovy Game Gear&lt;/a&gt;&amp;nbsp;- Also has a good selection of buttons, sticks, and trackballs. &amp;nbsp;The web site was also reasonably easy to navigate for a newbie, but did take a bit more effort as they seemed to have a larger selection than Ultimarc.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.paradisearcadeshop.com/&quot;&gt;Paradise Arcade Shop&lt;/a&gt;&amp;nbsp;- Has one of the largest selections of buttons and sticks of all the places I looked. &amp;nbsp;The web site was a bit more difficult to navigate for a newbie. &amp;nbsp; But, once you figure out who the different vendors for sticks and buttons are, it becomes a bit easier to understand the layout.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.arcadeguns.com/&quot;&gt;Arcade Guns&lt;/a&gt;&amp;nbsp;- Strangely enough, it is a source for light guns for building arcade systems. &amp;nbsp;With deeper digging, you will find they use the same innards as the Ultimarc guns. &amp;nbsp; However, the button layout, and shells are different. &amp;nbsp; They also don&#39;t seem to offer a recoil add-on like Ultimarc does.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Finally, you will need a bunch of wire and quick connects. &amp;nbsp; While some of the shops above offer these things, I found they were a tad cheaper at &lt;a href=&quot;https://www.allelectronics.com/&quot;&gt;AllElectronics.com&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But, before I could start going crazy with the credit card, I needed to figure out exactly what parts I wanted to use so I could be sure that the control panel kit fit them all correctly. &amp;nbsp; The easiest thing to do is figure out a list of all of the obvious parts that are needed to assemble the control panel. &amp;nbsp; If you go to the page for the &lt;a href=&quot;http://www.mameroom.com/Products_Quad_Kit.asp&quot;&gt;North Cost Custom Arcade Ultimate Quad kit&lt;/a&gt;, and scroll down a bit, you can find a template that is to be used to design an overlay for the panel. &amp;nbsp;The overlay graphic is perfect for getting a count of what we need. By my count, we need the following :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;43 (total) buttons. &amp;nbsp;7 for each of the 8-way stick positions, 4 for players 1-4, 4 for coin inputs for the 4 players, and 7 more for the trackball, 4-way sitck, and asteroids buttons.&lt;/li&gt;
&lt;li&gt;1 spinner&lt;/li&gt;
&lt;li&gt;1 track ball&lt;/li&gt;
&lt;li&gt;4 8-way sticks&lt;/li&gt;
&lt;li&gt;1 4-way stick&lt;/li&gt;
&lt;li&gt;2 light guns (not part of the control panel, but we need them anyway)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Then, of course, we need all of the gear to actually wire up those devices to be used by the computer.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But, lets start with the easy decision. &amp;nbsp; Of all of the places I listed, the only one that had the RGB LED joysticks that I wanted was Paradise Arcade Shop. &amp;nbsp; At Paradise Arcade Shop, they sell complete sticks with the RGB LEDs, along with kits to add RGB LEDs to other sticks. &amp;nbsp; Since I am a newbie to all of this, I opted to go with the Paradise Arcade sticks, rather than buy other sticks and retro fit them with kits. &amp;nbsp; One thing that was really unclear to me is if they offered a 4-way stick, or if I would need to customize one to work. &amp;nbsp; So, I e-mailed them to see what they had to say, while I continued to research 4-way sticks. &amp;nbsp;In my research, I discovered that most 8 way sticks could have a restrictor plate inserted in them that would convert them to a 4-way stick. &amp;nbsp; In addition, I discovered that both 4 way and 8 way sticks only use 4 switches for control. &amp;nbsp; 8 way sticks were just able to hit 2 switches at once, where 4 way sticks couldn&#39;t. &amp;nbsp;So, there is not a lot of difference between the two. &amp;nbsp; However, many comments on the Internet indicated that a stick in 8 way mode can cause strange behavior on emulators with a game that is made for a pure 4 way stick. &amp;nbsp; So, I wanted to make sure I had a &quot;pure&quot; 4 way stick for those games.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
After more research, and an e-mail response from Paradise Arcade Shop, I found that the 8 way LED sticks actually include the restrictor plate to force the stick to a 4 way, or even a 2 way stick. &amp;nbsp;(Bonus!) &amp;nbsp; So, the decision on which sticks to buy was complete. &amp;nbsp; I ordered 5 of the RGB LED sticks from Paradise Arcade Shop.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/6374674575946886730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2013/09/my-insane-aracde-system-build-part-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/6374674575946886730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/6374674575946886730'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2013/09/my-insane-aracde-system-build-part-2.html' title='My Insane Aracde System Build (Part 2)'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-981284536611728491</id><published>2013-09-15T15:29:00.000-07:00</published><updated>2013-09-15T15:30:05.873-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arcade"/><category scheme="http://www.blogger.com/atom/ns#" term="MAME"/><title type='text'>My Insane Arcade System Build (Part 1)</title><content type='html'>I am a child of &amp;nbsp;the 80s and 90s. &amp;nbsp; When I was young, there was very little in the world better than spending an insane amount of time playing video games. &amp;nbsp; The grocery stores near my house had a hand full of different game systems that I would save my quarters to go play. &amp;nbsp; I had my favorites, but in general I was a huge fan of having a hand full of change and landing in an arcade full of cabinets. &amp;nbsp; The more games the better.&lt;br /&gt;
&lt;br /&gt;
I remember distinctly thinking to myself, &quot;When I am old enough to own a house, the whole basement will be decked out with every game I can get my hands on!&quot; &amp;nbsp; My basement would rival the arcades I grew up with.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, like many childhood dreams, I didn&#39;t end up becoming filthy rich enough to own the 10,000+ sq.ft. house I would need to store all of those systems, let alone have enough cash to buy them all. &amp;nbsp; I did, however amass a large collection of home video game systems and games that I plan to have in a prominent place once I finish my basement.&lt;br /&gt;
&lt;br /&gt;
Which brings me to the fun part. &amp;nbsp;I must have talked about my arcade dream enough, that my wife picked up on how much I would love to own a cabinet. &amp;nbsp; When it came time to finish the basement, I started looking in to what it would cost to have one, and promptly told her it was just too much money. &amp;nbsp;She insisted that it was something I get because I have dreamed of it for so long. &amp;nbsp; So, I started looking. &amp;nbsp;While I would love to have a JAMMA cabinet and start to collect boards, I figured I would start with a MAME cabinet that I could easily rewire to support JAMMA boards in the future.&lt;br /&gt;
&lt;br /&gt;
And thus began my hunt for the ultimate home arcade system. &amp;nbsp; The first thing I needed to do was figure out the parameters for the system I wanted. &amp;nbsp; My wife started by telling me what she would require to allow me to display the cabinet in the basement once it was finished :&lt;br /&gt;
&lt;br /&gt;
1. It can&#39;t look like a crappy home built system made from parts found at the hardware store. &amp;nbsp;-- &amp;nbsp; While there are lots of folks on the Internet that have the skills to build something that looks great using parts from the hardware store, I know I am not one of them. &amp;nbsp; So, reality dictates that I start to look at what I could buy pre-made.&lt;br /&gt;
&lt;br /&gt;
2. It *HAS* to play light gun games. &amp;nbsp;-- &amp;nbsp;While dating, and even on our honeymoon, my wife and I loved to play games like House of the Dead and Area 51. &amp;nbsp;If she is going to let me build this, she insisted that her favorite games be playable.&lt;br /&gt;
&lt;br /&gt;
Simple enough, right? &amp;nbsp; I figured I would just buy a pre-made system and then tweak it for my own needs. &amp;nbsp;I was aware of the &lt;a href=&quot;http://www.xgaming.com/store/category/arcade-machines/&quot;&gt;X-Arcade&lt;/a&gt; systems, so I figured I would start there. &amp;nbsp; This looked like a nice system, and having tried out the X-Arcade controller at Fry&#39;s years ago, it seemed like it would be a great first system. &amp;nbsp;However, the more I thought about it, the more I realized that I wanted a 4 player system. &amp;nbsp; So, I started to look around at other places such as &lt;a href=&quot;http://www.dreamarcades.com/&quot;&gt;Dream Arcades&lt;/a&gt;, and &lt;a href=&quot;http://www.mameroom.com/home.asp&quot;&gt;North Coast Custom Arcades&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I loved the North Coast Ultimate Arcade II cabinet with the 4 player controls. &amp;nbsp; Even more, I loved the pictures of that system using the RGB LED lighted buttons and sticks. &amp;nbsp; But, my concern was how hard it was going to be to move a fully assembled system down in to my basement, along with the cost of buying that unit outright. &amp;nbsp; So, I decided to purchase the various parts, and put it together myself. &amp;nbsp; It should be much easier to move individual pieces of the system in to the basement. &amp;nbsp; In addition, I could order the control panel now and start to put it together while I wait for the basement work to be finished. &amp;nbsp; When the basement is nearly done, I can order the main cabinet along with the other large and heavy pieces like the monitor.&lt;br /&gt;
&lt;br /&gt;
Pretty simple, right?&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/981284536611728491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2013/09/my-insane-arcade-system-build-part-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/981284536611728491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/981284536611728491'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2013/09/my-insane-arcade-system-build-part-1.html' title='My Insane Arcade System Build (Part 1)'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-7265171900745629237</id><published>2013-05-27T20:39:00.001-07:00</published><updated>2013-05-27T20:39:16.520-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="Doubt"/><category scheme="http://www.blogger.com/atom/ns#" term="Fear"/><category scheme="http://www.blogger.com/atom/ns#" term="Glass"/><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><category scheme="http://www.blogger.com/atom/ns#" term="Hate"/><category scheme="http://www.blogger.com/atom/ns#" term="Privacy"/><category scheme="http://www.blogger.com/atom/ns#" term="Uncertainty"/><title type='text'>Why all the Google Glass hate?</title><content type='html'>I suspect I am opening a can of worms here, and will probably end up getting flamed wildly in the comments telling me that I am stupid or whatever else. &amp;nbsp; However, I can&#39;t help but notice that most of the complaints about Google Glass are either based on a completely flawed understanding of what Glass is, and can do, or fears of a&amp;nbsp;surveillance&amp;nbsp;society that already exists in much worse ways.&lt;br /&gt;
&lt;br /&gt;
Let me start by saying, I have Google Glass. &amp;nbsp; But, I also take my privacy really seriously. &amp;nbsp;I don&#39;t have a Facebook account and have requested that anyone I know not post pictures of my family to Facebook or any other social networking sites without my approval. &amp;nbsp; I do have a twitter account, but I don&#39;t ever use it. &amp;nbsp;I got it so that I could develop some software for a friend that he wanted to use with twitter. &amp;nbsp; I also take the time to go to as many sites like Spokeo as possible and ask them to remove my information. &amp;nbsp;When a store asks me for anything but the money to pay for my purchase my response is &quot;Why?&quot;. &amp;nbsp;Finally I am the bane of TSA&#39;s&amp;nbsp;existence&amp;nbsp;because I believe that if some stranger playing police officer hasn&#39;t touched my junk, the flight will almost certainly have some horrible ending. &amp;nbsp;So, I always opt out. &amp;nbsp; While I am sure there is more I can do to protect my privacy, hopefully you will understand that I take my privacy very seriously.&lt;br /&gt;
&lt;br /&gt;
When Google Glass was originally announced I had some concerns about privacy myself. &amp;nbsp; However, because of the industry I am in, I need to stay on top of the latest technology when it incorporates wireless networks. &amp;nbsp;What I have found in Glass is far less concerning than what I had imagined in my mind. &amp;nbsp;(You&#39;ll have to trust me. &amp;nbsp;The technology in your mind is far superior to what currently exists!) &amp;nbsp;So, I would like to address some of the paranoid fantasies that people have about Glass.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;I don&#39;t want to have a conversation with someone wearing Glass. &amp;nbsp;They could be checking Facebook, or Twitter, or something else and not paying attention to me.&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;
Let me start with the obvious. &amp;nbsp; It doesn&#39;t matter if you have Glass or not. &amp;nbsp;If someone would rather be checking Facebook or Twitter while talking to you, you are either boring to talk to or that person isn&#39;t worth talking to.&lt;br /&gt;
&lt;br /&gt;
However, this is really a non-issue with Glass for several reasons. &amp;nbsp;First, contrary to what people seem to think, Glass does not provide a heads up display (HUD). &amp;nbsp; Rather, when properly worn the screen is just above your line of sight. &amp;nbsp;To see the screen, you have to look up. &amp;nbsp;If you are really engaged in a conversation with someone, you will notice if they start looking up. &amp;nbsp; But, lets assume for a second that you don&#39;t manage to notice that someone is looking up. &amp;nbsp;The second reason it is a non-issue is that the Glass cube above your eye will light up when it is turned on. &amp;nbsp;The amount it lights up allows for someone standing close enough to you to have a conversation will clearly see that you have something up on the screen. &amp;nbsp;In fact, it is light enough that when my sister used my Glass, I was able to see enough of the screen while looking at her to tell her how to navigate! &lt;br /&gt;
&lt;br /&gt;
But, lets go crazy and assume that you have some kind of weird spot blindness that prevents you from seeing the screen and noticing it is on. &amp;nbsp; There are currently two ways to interact with Glass. &amp;nbsp;You can reach up to the side of your head and use the touch pad on the frame, or you can nod your head to wake it up and then speak to it. &amp;nbsp;Again, you &lt;b&gt;&lt;i&gt;will&lt;/i&gt;&amp;nbsp;&lt;/b&gt;notice if someone is using Glass while talking to them. &amp;nbsp;If you don&#39;t, then you should question why you are talking to that person as you aren&#39;t engaged with them enough to notice.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;But, since Glass is always recording and streaming data to Google, people will always be able to see what I am doing!&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;
Let me ask you this. &amp;nbsp; Can your cell phone record an entire day of video? &amp;nbsp;No? &amp;nbsp;Then, consider that the battery in your cell phone is larger than the entire volume of Glass, even if you include the frames which have not electronics in them! &amp;nbsp; But maybe Glass is using some super secret system that uses less power than a cell phone which allows you to record all day! &amp;nbsp; The specs for Glass are openly available. &amp;nbsp;The hardware in Glass is basically the same as an under-clocked Galaxy Nexus. &amp;nbsp; Don&#39;t know about you, but the battery on my Galaxy Nexus lasts about a day when I use it lightly. &amp;nbsp; During heavy usage, like when I was at Google I/O, I am lucky to get half a day. &amp;nbsp;In addition, I tried recording video constantly while at I/O just to see how long it would last. &amp;nbsp;At about 55 minutes, Glass powered down. &amp;nbsp;(I had taken one or two pictures prior to recording, so I would put the actual recording time around 1 hour total on a fully charged battery.)&lt;br /&gt;
&lt;br /&gt;
The fact is that Glass doesn&#39;t have the hardware that would be needed to record video all day. &amp;nbsp;And when you consider the weight issues with a pair of glasses, it is unlikely that such a device will exist in the near term. &amp;nbsp;Sure, you could wear a backpack full of batteries that connect to the micro USB port on Glass and probably get more recording done, but would you? &amp;nbsp;In reality, if someone really wants to record constantly, they will use a device that doesn&#39;t do anything but record. &amp;nbsp;Why waste battery power on processing other stuff when all you want to do is record video? &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Okay, but when Glass is used to take a picture, the picture is uploaded to Google where they can tag my face and determine where I am.&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;
This argument just floors me. &amp;nbsp;My response to it is, &quot;And so does every other device that you have that can take a picture!&quot; &amp;nbsp;But, you argue &quot;Not my &lt;fill brand=&quot;&quot; in=&quot;&quot; the=&quot;&quot;&gt; camera that isn&#39;t Internet connected!&quot; &amp;nbsp;That is true for the automatically uploaded portion. &amp;nbsp;But, lets face it. &amp;nbsp;Most pictures will eventually find their way on line. &amp;nbsp;Plus, even with all of the steps I take trying to keep myself from being tagged in pictures, doing a Google Image Search on my name turns up at least one picture that is of me. &amp;nbsp;(Granted, it is over a decade old, but that is really beside the point.) &amp;nbsp; Your friends will tag you in the pictures, maybe you should start there. &amp;nbsp;Plus, governments and big business already know what you look like. &amp;nbsp;They already know what size your underwear is, what health problems you have, and where you like to get takeout from. &amp;nbsp;Google generally doesn&#39;t care where you are, or what you are doing. &amp;nbsp;(Not to mention they already have that information based on the location of your cell phone.) And, given the number of various types of cameras all over our world, there is a pretty good chance that you were recording by someone else at the exact same time. &amp;nbsp;In the world we live in, there is only one place that you can be sure you aren&#39;t be recorded. &amp;nbsp;Your home. &amp;nbsp;(And even that may be questionable at times.) &amp;nbsp; When you are in the bathroom you can be somewhat more assured that no one is recording you, but are you sure? &amp;nbsp;There are cases all over the place about people hiding cameras in all kinds of bathrooms around the world.&lt;/fill&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u style=&quot;font-weight: bold;&quot;&gt;Thank you! &amp;nbsp;You brought up the bathroom issue. &amp;nbsp;I don&#39;t want someone filming my junk while I am using the can or doing something else I don&#39;t want people to see!&lt;/u&gt;&lt;br /&gt;
&lt;u style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;&lt;/u&gt;
A few years ago, a friend showed me a video that was recorded, in secret, of a guy playing Guitar Hero at Best Buy,&amp;nbsp;jumping&amp;nbsp;around like a rock star would on stage. &amp;nbsp; This video was recorded on a normal cell phone camera. &amp;nbsp; For videos in the bathroom, you don&#39;t have to search very hard to find articles about the early days of cell phone cameras and people taking pictures of other naked people while in a locker room. &amp;nbsp;Yet, today, people go in to locker rooms all the time with a cell phone and it doesn&#39;t bother people much. &amp;nbsp;They may keep an eye on that person to make sure they don&#39;t do anything that appears to be taking a picture. &amp;nbsp;But, in reality it is easy enough to modify a cell phone so that it doesn&#39;t make a sound when taking a picture.&lt;br /&gt;
&lt;br /&gt;
Then, there is this :&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.allpredatorcalls.com/i-kam-xtreme-3-0-mega-pixel-video-recording-sunglasses-4-gb-internal-memory-expandable-to-32gb-flat-black-frame-50029/?gclid=CKPvhO61t7cCFStp7AodZGQAUg&quot;&gt;http://www.allpredatorcalls.com/i-kam-xtreme-3-0-mega-pixel-video-recording-sunglasses-4-gb-internal-memory-expandable-to-32gb-flat-black-frame-50029/?gclid=CKPvhO61t7cCFStp7AodZGQAUg&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Yup, $99 for a set of glasses with a camera built in that you would probably look at and think to yourself &quot;those are ugly&quot; and go on your way. &amp;nbsp; If you search around, I know you can find other similar glasses that are even less obvious that you would never notice. &amp;nbsp;Basically, this problem already exists. &amp;nbsp;The main difference with Glass is that the glasses upload the images to Google, and Google never deletes anything. &amp;nbsp;So, Glass would make it easier to throw someone in jail when they went around using the camera for something it wasn&#39;t intended. &amp;nbsp;Further, with the current generation of Glass, it is plainly obvious that someone is wearing it!&lt;br /&gt;
&lt;br /&gt;
But, in addition to this already being easily (and far less expensively) available, my point is that there are societal norms that people will conform to. &amp;nbsp;I have never worn my Glass glasses in to a bathroom outside of my house. &amp;nbsp;*IF* I ever did, you can be sure that I would point them at the ceiling so that they couldn&#39;t possibly be recording anything. &amp;nbsp;But, in general, I would leave them with my wife or stuff them in a bag. &amp;nbsp;I realize that not everyone would think of this, but people will eventually catch on after someone makes a comment to them in the bathroom. &amp;nbsp;In short, this is already an existing problem, but not one that people with any common courtesy would run in to.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Okay, but what about creep shots? &amp;nbsp;Guys taking pictures of girls chests (or worse) when they are unaware of it. &amp;nbsp;(Like I saw in the parody video on YouTube.)&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;
First, please refer to the question above. &amp;nbsp;It is already easily done with existing technology in ways that are FAR less obvious. &amp;nbsp; But, I have also overheard conversations where some dude-bro was talking about how he pretended to be texting so that he could get a shot of the cans on some &quot;hottie&quot; across the room. &amp;nbsp;It doesn&#39;t matter if the camera is obviously pointed at you, you don&#39;t know what someone is doing and will usually not confront them unless they make a mistake that convinces you they are doing something. &amp;nbsp;Cameras are on the back of the phone, taking pictures without someone knowing is a reality in out lives. &amp;nbsp;We deal with it with cell phones, why is Glass any different?&lt;br /&gt;
&lt;br /&gt;
But, I would argue that the real problem here is societal. &amp;nbsp;Why do the dude-bros think this type of behavior is okay in the first place? &amp;nbsp; The deeper issue is that they view women as objects meant to excite them. &amp;nbsp;As a male, I understand that looking at women and assessing their attractiveness is built in to us. &amp;nbsp;We all do it, and I believe it is a primal instinct that we have that was used to make sure the best genes survived in to the future. &amp;nbsp;The question is, what do we do after that? &amp;nbsp; If you don&#39;t find yourself thinking, &quot;Gee, I bet she wouldn&#39;t be too happy that I just rated her in my mind based on how she looks.&quot; then you may want to reconsider how you treat people in general. &amp;nbsp;But, I&#39;ll get off my feminist soap box as I could easily go on and on about things like that.&lt;br /&gt;
&lt;br /&gt;
Short version, people need to teach their children that everyone is a person with thoughts and feelings. &amp;nbsp;Objectifying anyone in a way they don&#39;t approve of is wrong.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;But, the difference is that with Glass nobody would know you were taking a picture or recording video.&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;
This argument is interesting, and when taken at face value doesn&#39;t work. &amp;nbsp; There are two ways to take pictures build in to Glass. &amp;nbsp;The first requires that you reach up and press a button on the frames to take the picture. &amp;nbsp;The second is to wake the device up and say, &quot;Okay glass, take a picture&quot;. &amp;nbsp;You would notice both of these things just like you would notice someone using a phone to take a picture.&lt;br /&gt;
&lt;br /&gt;
But, there is the hack out there that lets people take pictures of you just by winking. &amp;nbsp;That is more subtle, but I would bet still requires that Glass be awake before it would work. &amp;nbsp;Waking Glass up requires tapping the frame or jerking your head up. &amp;nbsp;Then, there is the issue of strange people winking at you. &amp;nbsp;And finally, see the spy glasses link above. &amp;nbsp;The problem already exists, and while I agree that it is&amp;nbsp;disturbing&amp;nbsp; it really isn&#39;t a good reason not to allow Glass to exist. &amp;nbsp;Rather, Google should take this criticism to heart and make a small modification that would make a huge difference. &amp;nbsp;Put a super bright LED on the glasses that is connected to the camera with hardware such that the camera cannot be operated without the LED being on. &amp;nbsp;Most people wouldn&#39;t have the&amp;nbsp;expertise to disconnect the LED in such tiny electronics. &amp;nbsp;And of the few that do, most wouldn&#39;t waste the time. &amp;nbsp; The remaining tiny percentage is people that have real issues and will do inappropriate things no matter what you try to do to stop them.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Okay, but when people have to use their cell phones to take a picture or video, there is the time needed to pull it out of their pocket before they start recording.&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;
As I have already stated, Glass doesn&#39;t record all the time. &amp;nbsp;So, something has to be done to it to wake it up and make it take a picture. &amp;nbsp; So taking a picture with Glass probably isn&#39;t much faster than taking it with a cell phone. &amp;nbsp;In fact, there are many phones out there that have a dedicated button for taking pictures. &amp;nbsp;Those devices can probably take a picture FASTER than Glass can.&lt;br /&gt;
&lt;br /&gt;
But, I also noticed something interesting while wandering around downtown San Francisco during the Google I/O 2013. &amp;nbsp;Most of the people walking around already had their phones in their hands. &amp;nbsp;Granted, there were a lot of people playing Ingress, which would account for some of it. &amp;nbsp;But, for the people that looked like they actually lived there, most of them had their phones out. &amp;nbsp;And a good number of those phones were iPhones, which currently can&#39;t play Ingress.&lt;br /&gt;
&lt;br /&gt;
If you already have your phone in your hand, the time needed to take a picture usually drops. &amp;nbsp;I would argue that you may be able to take a picture faster using a phone already in your hand than reaching up, waking up Glass, and telling it to take a picture. &amp;nbsp;Add to that, the fact that even after pressing the button there is a&amp;nbsp;noticeable&amp;nbsp;lag before Glass takes the picture, and you may realize that for &quot;OMG this is happening NOW&quot; pictures you are probably still better off with your phone!&lt;br /&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;
&lt;b&gt;&lt;u&gt;Yeah, but I heard that Glass constantly uploads your location when they are on.&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;
Again, another argument that floors me. &amp;nbsp; First, Glass only uploads your location once every 10 minutes. &amp;nbsp;Granted, that is a setting that Google should allow people to turn on and off, but they already have that information anyway. &amp;nbsp; Your cell phone has a GPS in it, and there is nothing that would stop Google from turning it on every 10 minutes and uploading your location. &amp;nbsp;(Who knows, they may already!) &amp;nbsp;Then, there is location data from cell towers and wifi access points. &amp;nbsp; Even without turning on the GPS, you can be&amp;nbsp;triangulated to a very small area for a possible location. &amp;nbsp;Small enough that it doesn&#39;t matter if it is pinpoint accurate. &amp;nbsp;They can find you if they want. &amp;nbsp; If you are &lt;b&gt;&lt;i&gt;REALLY&lt;/i&gt;&amp;nbsp;&lt;/b&gt;concerned about this, you should turn off your phone, never use the Internet, and move out to a cabin in the woods somewhere and have no contact with the outside world.&lt;br /&gt;
&lt;br /&gt;
They already know where you are, and what you are doing. &amp;nbsp;And they have tweaked the laws so that it is perfectly legal. &amp;nbsp;That ship has sailed.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Okay, but what about the ads? &amp;nbsp;I don&#39;t want ads popping up throughout my day!&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;
In the current developer specification, showing ads is forbidden. &amp;nbsp;If a developer started to provide unwanted ads with Glass, I think it would sink the whole system. &amp;nbsp;I realize that Google makes most of its money off of advertising. &amp;nbsp;However, I think they also see that people don&#39;t want to be bugged by ads all the time.&lt;br /&gt;
&lt;br /&gt;
I honestly believe that Google will continue to keep the &quot;no ads&quot; requirement in their apps. &amp;nbsp;Glass doesn&#39;t have a large enough screen to stick a banner add at the bottom where it is out of the way and still have it be readable. &amp;nbsp;So, ads would have to take over the whole screen for some amount of time. &amp;nbsp;Further, if ads popped up randomly throughout the day, early adopters would throw Glass in a drawer and tell people not to buy it. &amp;nbsp;I am honestly not sure how Google intends to make money off of Glass. &amp;nbsp;It is possible that the revenue they get from selling Android apps is enough of an incentive to do the same thing on Glass. &amp;nbsp;But, if Google wants Glass to be successful, they need to make it something people want to use. &amp;nbsp;Annoying ads popping up at random would kill the user experience.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;b&gt;&lt;u&gt;Yeah, but the glasses themselves look really stupid and ugly.&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;
Perhaps one of the silliest comments I have heard. &amp;nbsp; I would agree that most of the time the glasses look silly. &amp;nbsp;I suspect Google agrees and that is why they are working with a&amp;nbsp;sunglasses&amp;nbsp;designer to make the final product look better. &amp;nbsp;However, when Glass is worn with the included sunglasses shades, they really don&#39;t look as horrible. &amp;nbsp;I wore them with the sunglasses shade today going through a drive-thru and nobody seemed to care.&lt;br /&gt;
&lt;br /&gt;
Which brings me to perhaps the most important point of that argument. &amp;nbsp;If it were illegal to have bad fashion sense, many of us would already be in jail. &amp;nbsp;Further, if it were up to me to decide what looked good, most &quot;high fashion&quot; would land people in jail. &amp;nbsp;Fortunately, for the entire world, bad fashion choices won&#39;t land you in jail, and usually won&#39;t have people mocking you. &amp;nbsp;(Unless you are still in High School, or perhaps the fashion industry.)&lt;br /&gt;
&lt;br /&gt;
We can hope that once Glass is released to the public that it looks better. &amp;nbsp;If it doesn&#39;t, that may well kill the project.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;But Glass doesn&#39;t do anything my cell phone can&#39;t. &amp;nbsp;And how come Google owns the glasses even after I paid for them?&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;
In general, I agree. &amp;nbsp;Which I consider to be an argument for why people freaking out about Glass is silly. &amp;nbsp;At the same time, I also see why it is a valid argument for not using or having Glass. &amp;nbsp; What this argument fails to take in to consideration is what state Glass is currently in.&lt;br /&gt;
&lt;br /&gt;
There is a reason that existing versions of Glass cost $1500+tax. &amp;nbsp;The same reason accounts for why you are not allowed to resell them. &amp;nbsp;Not surprisingly, that same reason accounts for why the software is rough around the edges and loaning Glass is not allowed. &amp;nbsp;(Even though one of the Glass developers made a comment at I/O about asking someone with Glass if you could try it.) &amp;nbsp;Glass is not a finished product! &amp;nbsp; Google wants to get it in the hands of people that will be excited for the potential sooner rather than later. &amp;nbsp;(Which means developers.) &amp;nbsp;Those developers will experiment with things and create new apps for it. &amp;nbsp; The same developers will give feedback to Google about what is good, and what isn&#39;t. &amp;nbsp;And hopefully the final product will be better because of it!&lt;br /&gt;
&lt;br /&gt;
Consider the case of Microsoft and their recently announced Xbox One. &amp;nbsp; Do a search for &quot;Microsoft Durango&quot;. &amp;nbsp; You will quickly find out that there are a LOT of developers that had access to the development platform long before it was released. &amp;nbsp; &amp;nbsp;You may even come across an article talking about the &quot;zebra stripes&quot; on the console. &amp;nbsp; The developers needed access to the development kits early on. &amp;nbsp;I am sure they signed agreements preventing them from letting non-developers from seeing the prototype hardware along with giving Microsoft piles of cash while the agreement said that Microsoft obtained ownership of the development kit. &amp;nbsp; In the console industry, the quantity and quality of the launch titles can really help or hurt the adoption of the new hardware. &amp;nbsp;Microsoft wants to get developers working on top quality titles as early as possible so they can be successful. &amp;nbsp;At the same time, they are giving those developers an unfinished product to work with so that they can create those titles. &amp;nbsp;Google is doing the same thing with Glass. &amp;nbsp;The high price is because so few were made, and to keep out people that probably won&#39;t contribute to the success of Glass. &amp;nbsp;It was primarily available through a developer conference so that developers would get it, and provide feedback while working on new uses for the technology.&lt;br /&gt;
&lt;br /&gt;
I would almost bet money that once the final version of Glass is announced that Google stops caring if you resell the developer versions. &amp;nbsp;It is just that right now, they want to keep the audience to a group of people that will forgive them for having the software not be polished while hopefully contributing to its success.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Okay, but I don&#39;t want Google snooping on me!&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;
The EFF recent put out a report on the privacy policies of various companies. &amp;nbsp;Of Google, Apple, and Microsoft, Google ranked the highest for privacy. &amp;nbsp; Hopefully this means that the snooping they are doing isn&#39;t as bad as other companies are. (Source :&amp;nbsp;&lt;a href=&quot;https://www.eff.org/who-has-your-back-2013&quot;&gt;https://www.eff.org/who-has-your-back-2013&lt;/a&gt;&amp;nbsp;)&lt;br /&gt;
&lt;br /&gt;
But, there is also something that Google has going for it. &amp;nbsp; Glass runs Android! &amp;nbsp;Given the significant number of custom Android ROMs out in the wild, it is reasonable to believe that something similar will happen with Glass. &amp;nbsp; Google also has a history of making their hardware fairly easy to unlock for people that know what they are doing. &amp;nbsp; So, I suspect that if Glass is successful there will be a vibrant custom ROM scene. &amp;nbsp;That scene will probably have at least one &quot;anti-Google&quot; ROM in it that strips out any reporting that Google may have put in. &amp;nbsp;And the best part is, I don&#39;t think Google will really care!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wow. &amp;nbsp;You actually read this far! &amp;nbsp;I am impressed. &amp;nbsp;I would imagine that at this point you are either thinking, &quot;You know, he has a point.&quot; &amp;nbsp; Or, you are so pissed off at my obvious lack of understanding of the situation that you could throw your computer out the window. &amp;nbsp;Please feel free to ask questions and make constructive comments in the comments area of this post. &amp;nbsp;If you read this whole thing, hopefully you have come away with the impression that I don&#39;t believe that Glass is a perfect product. &amp;nbsp; In addition, if Glass were released today, it would be a huge flop. &amp;nbsp;But, I would love to know what I am missing, that doesn&#39;t already exist in the world in an easier and less expensive solution, that makes Glass so scary it should be banned or hated so much?</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/7265171900745629237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2013/05/why-all-google-glass-hate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/7265171900745629237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/7265171900745629237'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2013/05/why-all-google-glass-hate.html' title='Why all the Google Glass hate?'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-8226325722338215487</id><published>2012-09-04T08:34:00.000-07:00</published><updated>2012-09-04T08:35:01.184-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cisco"/><category scheme="http://www.blogger.com/atom/ns#" term="Internet"/><category scheme="http://www.blogger.com/atom/ns#" term="PPPoE"/><category scheme="http://www.blogger.com/atom/ns#" term="Zyxel"/><title type='text'>PPPoE with Zyxel Q1000Z and Cisco 2600 router with CenturyLink DSL</title><content type='html'>Comcast&#39;s service broke and their customer support was rude one too many times, so I switched to CenturyLink.  Being that I am not a &quot;normal&quot; customer by any stretch of the imagination, I wanted to set up something a bit more advanced than a simple NATted connection.   Specifically, I wanted to get an IPv6 tunnel to &lt;a href=&quot;http://www.tunnelbroker.net/&quot;&gt;Hurricane Electric&lt;/a&gt; while also keeping my corporate VPN connection up and running.  (Ideally, get my VPN running on the same box as the tunnel and other services.)   I have an old Cisco 2621 kicking around that seems it should be up to the task.&lt;br /&gt;
&lt;br /&gt;
Getting this going was surprisingly difficult.  Initially, I had the 2600 plugged in behind Q1000Z with the 2600 running in NAT mode providing access to the networks in my house.   I was double NATted because the Q1000Z didn&#39;t seem to want to set up static routes in any sane way.   Obviously, not an ideal setup.   &lt;br /&gt;
&lt;br /&gt;
There are numerous configurations around the net on how to do PPPoE from a Cisco device to a possible non-Cisco remote end.   (I say &quot;possible&quot; because CenturyLink doesn&#39;t advertise what their back-end network looks like.  Not surprising since most people wouldn&#39;t understand it anyway.)   Most of these configurations look very similar to each other.&lt;br /&gt;
&lt;br /&gt;
The configuration that finally worked for me is this (some important information replaced with Xs, you will have to fill in your own values.  Also, the configuration has been edited to remove irrelevant settings.) :&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
!&lt;br /&gt;
version 12.3&lt;br /&gt;
service timestamps debug datetime msec&lt;br /&gt;
service timestamps log datetime msec&lt;br /&gt;
service password-encryption&lt;br /&gt;
!&lt;br /&gt;
hostname frontdoor-with-v6&lt;br /&gt;
!&lt;br /&gt;
boot-start-marker&lt;br /&gt;
boot-end-marker&lt;br /&gt;
!&lt;br /&gt;
!&lt;br /&gt;
no aaa new-model&lt;br /&gt;
ip subnet-zero&lt;br /&gt;
!&lt;br /&gt;
!&lt;br /&gt;
ip name-server X.X.X.X&lt;br /&gt;
ip name-server X.X.X.X&lt;br /&gt;
ip name-server X.X.X.X&lt;br /&gt;
!&lt;br /&gt;
ip cef&lt;br /&gt;
vpdn enable&lt;br /&gt;
!&lt;br /&gt;
vpdn-group 1&lt;br /&gt;
request-dialin&lt;br /&gt;
protocol pppoe&lt;br /&gt;
!&lt;br /&gt;
interface FastEthernet0/0&lt;br /&gt;
ip address 192.168.0.1 255.255.255.0&lt;br /&gt;
ip nat inside&lt;br /&gt;
no ip mroute-cache&lt;br /&gt;
duplex auto&lt;br /&gt;
speed auto&lt;br /&gt;
!&lt;br /&gt;
interface FastEthernet0/1&lt;br /&gt;
no ip address&lt;br /&gt;
speed 100&lt;br /&gt;
half-duplex&lt;br /&gt;
pppoe enable&lt;br /&gt;
pppoe-client dial-pool-number 1&lt;br /&gt;
!&lt;br /&gt;
interface Dialer1&lt;br /&gt;
ip address negotiated&lt;br /&gt;
ip mtu 1492&lt;br /&gt;
ip nat outside&lt;br /&gt;
encapsulation ppp&lt;br /&gt;
ip tcp adjust-mss 1450&lt;br /&gt;
no ip mroute-cache&lt;br /&gt;
dialer pool 1&lt;br /&gt;
dialer-group 1&lt;br /&gt;
ppp authentication pap chap callin optional&lt;br /&gt;
ppp chap hostname XXXXXXX@qwest.net&lt;br /&gt;
ppp chap password 0 XXXXXXXXX&lt;br /&gt;
ppp pap sent-username XXXXXXXXXX password 0 XXXXXXXXXXXX&lt;br /&gt;
!&lt;br /&gt;
ip nat inside source list 1 interface Dialer1 overload&lt;br /&gt;
ip classless&lt;br /&gt;
ip route 0.0.0.0 0.0.0.0 Dialer1&lt;br /&gt;
ip route 10.1.0.0 255.255.0.0 192.168.0.2&lt;br /&gt;
!&lt;br /&gt;
access-list 1 permit 10.1.0.0 0.0.255.255&lt;br /&gt;
dialer-list 1 protocol ip permit&lt;br /&gt;
!&lt;br /&gt;
end&lt;/blockquote&gt;
&lt;br /&gt;
Most of this is taken almost verbatim from the numerous example sites.   However, when I originally set this up, FastEthernet0/1 was set to auto for both speed and duplex.   When the 2600 was set up in NAT mode behind the Q1000Z, the auto mode worked fine.  But, once I got the PPPoE session up, I got lots of random drop-outs in my connectivity.   Some things worked fine, others would load slowly, and still others just plain wouldn&#39;t work.   After digging around forever, I found a site that suggested setting the speed and duplex to 100-half instead of auto.   There were no obvious signs on a duplex mismatch on the Cisco side of the link, and the Zyxel didn&#39;t have any obvious way to look for errors.   So, I decided to give it a shot and see what happened.&lt;br /&gt;
&lt;br /&gt;
Strangely enough, it worked.  My connectivity was nice and speedy again, and all sites are coming up correctly.&lt;br /&gt;
&lt;br /&gt;
Hopefully this helps someone else that might be struggling to get a similar setup going.   Next, for the v6 tunnel and the VPN.  </content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/8226325722338215487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2012/09/pppoe-with-zyxel-q1000z-and-cisco-2600.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/8226325722338215487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/8226325722338215487'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2012/09/pppoe-with-zyxel-q1000z-and-cisco-2600.html' title='PPPoE with Zyxel Q1000Z and Cisco 2600 router with CenturyLink DSL'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-3260248143077720328</id><published>2012-07-19T09:52:00.000-07:00</published><updated>2012-07-19T09:52:49.823-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ADT"/><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="EMMA"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>Code coverage with Android and EMMA</title><content type='html'>Recently, I have been looking in to tools in Android that would help me improve code quality and find bugs before putting the product out. &amp;nbsp;I picked up a copy of&amp;nbsp;&lt;a href=&quot;http://www.packtpub.com/android-application-testing-guide/book&quot;&gt;Diego Torres Milano&#39;s &quot;Android Application Testing Guide&quot;&lt;/a&gt;&amp;nbsp;as a good place to get me started. &amp;nbsp; Since there are a lot of tools out there, and not all of them support Android, it was a useful guide to tools that should be working.&lt;br /&gt;
&lt;br /&gt;
One of the tools I was looking in to is code coverage. &amp;nbsp; Over the years, EMMA has been&amp;nbsp;integrated&amp;nbsp;with the Android build tools, which is supposed to make it easier to use. &amp;nbsp; Unfortunately, if you don&#39;t use them just the right way they can end up being a horrid time suck trying to figure out why your instrumented build just isn&#39;t working.&lt;br /&gt;
&lt;br /&gt;
For my testing, I was using the latest tools available as of this writing. &amp;nbsp;(That would be ADT 20) &amp;nbsp; Lots of the information available on the Internet is for older versions of tools that don&#39;t use the same commands as ADT 20. &amp;nbsp;I also started with the most basic app I could, and set it up so that I had an easy way to intentionally miss some code, or make sure I hit it all. &amp;nbsp; The code looked something like this :&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
@Override&lt;br /&gt;public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;&amp;nbsp; &amp;nbsp;String appname = &quot;unknown.app&quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp;super.onCreate(savedInstanceState);&amp;nbsp;&amp;nbsp; &amp;nbsp;setContentView(R.layout.activity_main);&lt;br/&gt;}
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
public void testme() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; System.out.println(&quot;This is a test!&quot;);&lt;br /&gt;}
&lt;/blockquote&gt;
&lt;br /&gt;
A pretty simple &quot;app&quot; that mostly comes out of the Android tools when you create a new project. &amp;nbsp; The &quot;testme()&quot; method is there because it will allow us to explicitly call some code (or not) to let us see that code coverage is really working.&lt;br /&gt;
&lt;br /&gt;
Next, I created a test app using the Android tools and created a new test case. &amp;nbsp; The test case extends ActivityInstrumentationTestCase2, as it will start up the activity we want to test in a state that is easy to use. &amp;nbsp;The test class looked something like this :&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
public class MyTest extends ActivityInstrumentationTestCase2&lt;testactivity&gt; {&lt;br /&gt;public MyTest()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;super(TestActivity.class);&lt;br /&gt;}&lt;/testactivity&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
public void testCodeCoverage()&lt;br /&gt;{&lt;br /&gt;}&lt;/blockquote&gt;
&lt;br /&gt;
The &quot;TestActivity&quot; referenced in the above code is the name of the Activity that we created earlier. &amp;nbsp; Also, note that our test doesn&#39;t actually do anything. &amp;nbsp; For now, this is okay. &amp;nbsp; When the MyTest class is run, ActivityInstrumentationTestCase2 will create the activity, which will result in the onCreate() method being called. &amp;nbsp; So, once we have our code coverage running, we will have a block of code that was covered, and a block that was not.&lt;br /&gt;
&lt;br /&gt;
At this point, we are going to use the command line. &amp;nbsp; We also need to make sure that we have a fairly current version of Apache Ant ready to use. &amp;nbsp; For my tests I was using 1.8.2.&lt;br /&gt;
&lt;br /&gt;
At the command line, we want to convert our apps to use Ant for building. &amp;nbsp; To do this, we need to use the &quot;android&quot; command that is included in the SDK. &amp;nbsp;(On Windows, it is &quot;android.bat&quot;) &amp;nbsp;We need to run two commands, one to convert the &quot;TestActivity&quot; app and one to convert the &quot;MyTest&quot; test project. &amp;nbsp;The command will look something like this :&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
android update project --path /path/to/TestActivityProject --name TestActivityProject --target android-16&lt;/blockquote&gt;
The &quot;--name&quot; parameter should be set to whatever you named your project, and &quot;--target&quot; should be set to the API level that you want to test with. &amp;nbsp; The &quot;--path&quot; parameter requires the FULL path name to your project. &amp;nbsp; So, if you are on windows it might be something like &quot;c:\users\foo\workspace\TestActivityProject&quot; I tested with an Android 4.1 VM, so I chose &quot;android-16&quot;. &amp;nbsp;The version you use isn&#39;t too important, unless you plan to use Ant to make your final builds.&lt;br /&gt;
&lt;br /&gt;
Next, to convert the test project :&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
android update test-project --main ../TestActivityProject --path /path/to/MyTestProject&lt;/blockquote&gt;
The &quot;--main&quot; parameter confused me a bit at first. &amp;nbsp; It should be a relative path from the directory you store &quot;MyTestProject&quot; in, to the path of &quot;TestActivityProject&quot;. &amp;nbsp; If you are using Eclipse and putting your code in a workspace, you should normally need to use ../&lt;project direction=&quot;&quot;&gt;.&lt;/project&gt;&lt;br /&gt;
&lt;br /&gt;
Finally, we are ready to build and run our test. &amp;nbsp;Go in to the directory for &quot;TestActivityProject&quot; and run &quot;ant&quot;. &amp;nbsp;(If ant isn&#39;t in your path, you may need to use a full path to ant instead.)&lt;br /&gt;
&lt;br /&gt;
But, whats this? &amp;nbsp;We get a help screen like the following :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
Android Ant Build. Available targets:&lt;br /&gt;&amp;nbsp; &amp;nbsp;help: &amp;nbsp; &amp;nbsp; &amp;nbsp;Displays this help.&lt;br /&gt;&amp;nbsp; &amp;nbsp;clean: &amp;nbsp; &amp;nbsp; Removes output files created by other targets.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; The &#39;all&#39; target can be used to clean dependencies&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (tested projects and libraries)at the same time&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; using: &#39;ant all clean&#39;&lt;br /&gt;&amp;nbsp; &amp;nbsp;debug: &amp;nbsp; &amp;nbsp; Builds the application and signs it with a debug key.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; The &#39;nodeps&#39; target can be used to only build the&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; current project and ignore the libraries using:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;ant nodeps debug&#39;&lt;br /&gt;&amp;nbsp; &amp;nbsp;release: &amp;nbsp; Builds the application. The generated apk file must be&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; signed before it is published.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; The &#39;nodeps&#39; target can be used to only build the&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; current project and ignore the libraries using:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;ant nodeps release&#39;&lt;br /&gt;&amp;nbsp; &amp;nbsp;instrument:Builds an instrumented package and signs it with a&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; debug key.&lt;br /&gt;&amp;nbsp; &amp;nbsp;test: &amp;nbsp; &amp;nbsp; &amp;nbsp;Runs the tests. Project must be a test project and&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; must have been built. Typical usage would be:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ant [emma] debug install test&lt;br /&gt;&amp;nbsp; &amp;nbsp;emma: &amp;nbsp; &amp;nbsp; &amp;nbsp;Transiently enables code coverage for subsequent&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; targets.&lt;br /&gt;&amp;nbsp; &amp;nbsp;install: &amp;nbsp; Installs the newly build package. Must either be used&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; in conjunction with a build target (debug/release/&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; instrument) or with the proper suffix indicating&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; which package to install (see below).&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; If the application was previously installed, the&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; application is reinstalled if the signature matches.&lt;br /&gt;&amp;nbsp; &amp;nbsp;installd: &amp;nbsp;Installs (only) the debug package.&lt;br /&gt;&amp;nbsp; &amp;nbsp;installr: &amp;nbsp;Installs (only) the release package.&lt;br /&gt;&amp;nbsp; &amp;nbsp;installi: &amp;nbsp;Installs (only) the instrumented package.&lt;br /&gt;&amp;nbsp; &amp;nbsp;installt: &amp;nbsp;Installs (only) the test and tested packages (unless&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nodeps is used as well.&lt;br /&gt;&amp;nbsp; &amp;nbsp;uninstall: Uninstalls the application from a running emulator or&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; device. Also uninstall tested package if applicable&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unless &#39;nodeps&#39; is used as well.&lt;/blockquote&gt;
&lt;br /&gt;
This is where I really screwed up and spent a lot of time scratching my head. &amp;nbsp; Since we want to use EMMA, we need an instrumented build, right? &amp;nbsp; So the command that we need is &quot;ant emma instrument install test&quot; to get a build, install it, and run the test in it.&lt;br /&gt;
&lt;br /&gt;
While this seems like the most intuitive answer, you will quickly find out that it doesn&#39;t work. &amp;nbsp;Everything will compile and install fine, and we can assume that the resulting apps are instrumented. &amp;nbsp; However, when it gets down to running the test, you will be greeted with something like this :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;[echo] Running tests ...&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[exec] INSTRUMENTATION_RESULT: shortMsg=java.lang.IllegalAccessError&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[exec] INSTRUMENTATION_RESULT: longMsg=java.lang.IllegalAccessError: Class&amp;nbsp;ref in pre-verified class resolved to unexpected implementation&amp;nbsp; &amp;nbsp; &amp;nbsp;[exec] INSTRUMENTATION_CODE: 0&lt;/blockquote&gt;
&lt;br /&gt;
Hmm.. &amp;nbsp;Something didn&#39;t work. &amp;nbsp;This is where I spent a ton of time trying different combinations and searching to understand what was going on. &amp;nbsp; Finally, as I was giving up, I noticed a browser page that I had already opened that said for EMMA code coverage, we need to run &quot;ant emma debug install test&quot;. &amp;nbsp;I didn&#39;t think it would work, but I gave it a shot. &amp;nbsp;Crazy as it is, it DID work! &amp;nbsp;(I literally spent 7 hours trying to figure out what the above error message was all about.)&lt;br /&gt;
&lt;br /&gt;
Once your instrumented build is run, the necessary coverage files will be downloaded, and a coverage.html file will be created in your test project&#39;s &quot;bin&quot; directory. &amp;nbsp; Opening that up should show that your onCreate() method ran all of its code, but the testme() method wasn&#39;t touched at all. &amp;nbsp; If you go in to the testCodeCoverage() method in the test app, you should be able to add the line &quot;getActivity().testme()&quot; and then run the instrumented build again. &amp;nbsp; This time, you should get 100% code coverage.&lt;br /&gt;
&lt;br /&gt;
Hopefully, this post saves someone out there a significant portion of their time getting started with code coverage!&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/3260248143077720328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2012/07/code-coverage-with-android-and-emma.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/3260248143077720328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/3260248143077720328'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2012/07/code-coverage-with-android-and-emma.html' title='Code coverage with Android and EMMA'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-4800896428498424775</id><published>2011-10-10T15:21:00.001-07:00</published><updated>2011-10-11T09:41:55.331-07:00</updated><title type='text'>Trouble in Android Wifi land</title><content type='html'>It has been a while since I posted last, but there are some issues with how Android handles the WPA/WPA2-Enterprise modes.  Hopefully making these issues a little more public will help get them fixed.  (And, before you start throwing things, yes, Google is aware of these issues.)&lt;br /&gt;&lt;br /&gt;Let&#39;s start with an easy, common issue.   Self signed certificates.   There are many tutorials on the net about how to configure WPA/WPA2-Enterprise using self signed certificates.   I would imagine that for any IT person that is trying to wrap their heads around 802.1X/WPA/WPA2-Enterprise, they are one of the first stops.  Hopefully, Android isn&#39;t running on their primary test device.&lt;br /&gt;&lt;br /&gt;If you attempt to use a self signed certificate on Android, it will usually fail.  I have run across the occasional device that doesn&#39;t have this problem, but &#39;stock&#39; Android like that found on the Nexus series generally has this problem.&lt;br /&gt;&lt;br /&gt;Not being able to use self signed certificates is annoying, and it leads us nicely in to the next Android annoyance.   To paraphrase, &quot;If an Android fails to authenticate, and nobody is watching the logs, did the authentication actually fail?&quot;  I think the best answer is, &quot;If I didn&#39;t get my network access, then yes, it failed.&quot;  However, because Android didn&#39;t tell you that it failed, you may be sitting there for some time before you realize something is wrong.&lt;br /&gt;&lt;br /&gt;Let&#39;s jump back to the self signed certificate issue I mentioned above.  I like to say that in the event of an error case, the program usually has some idea of what went wrong.  It just needs to present that information to the user in a useful way.  This case is no different.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Under the hood, Android uses wpa_supplicant to handle authentication 802.11 management and authentication. In the self signed certificate case, wpa_supplicant will produce an error such as this :&lt;br /&gt;&lt;br /&gt;TLS: Certificate verification failed, error 18 (self signed certificate)&lt;br /&gt;&lt;br /&gt;This error is usually surrounded with a bunch of OpenSSL error codes so many people just &quot;check out&quot; when reading the logs, and don&#39;t notice it.   On Android, it is a little bit worse.  This error message is buried in a log that the average user probably doesn&#39;t even know exists.  So, how does the user know what went wrong?&lt;br /&gt;&lt;br /&gt;In this example, the user figures it out after sitting there for a while and they don&#39;t get a connection to the network.  But, once they have come to the conclusion that they can&#39;t get on the network, what are they supposed to do?  Worse, what is the helpdesk call going to sound like?  I need you to summon your best red-neck, inbred, hillbilly with buck teeth accent and said, &quot;It&#39;s broke&quot;.  (&quot;It don&#39;t work&quot; is another wonderfully helpful description.)&lt;br /&gt;&lt;br /&gt;Since most users have a &lt;span style=&quot;font-weight:bold;&quot;&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;really&lt;/span&gt;&lt;/span&gt; short attention span, at this point they wander off to complain to anyone they can that the network is broken.   When a coworker or friend says, &quot;Yeah, but it works for me.&quot; that will change to &quot;Wireless is broken on Android.&quot;&lt;br /&gt;&lt;br /&gt;The reality is that Android&#39;s wireless is NOT broken.   Well, maybe not very broken.  When the wireless hardware is behaving itself, wpa_supplicant does a fine job of getting you connected.  You just have to be running something like CatLog, or have a development environment set up that will let you run &quot;adb logcat&quot;.   Then, you have to know enough about 802.1X authentications, and certificates to be able to recognize the one log line that tells you everything you need to know about the failure.  That should be easy enough.  (In case you are missing my sarcasm, consider trying to talk your mom through figuring this out over the phone.)&lt;br /&gt;&lt;br /&gt;While I use the self-signed certificate issue as an example of the problem, it is just the tip of the iceberg.   Other similar issues, that you won&#39;t hear about, include :&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;The certificate isn&#39;t yet valid.&lt;/li&gt;&lt;li&gt;The certificate is no longer valid.&lt;/li&gt;&lt;li&gt;Your authentication failed.&lt;/li&gt;&lt;li&gt;MS-CHAPv2 messages such as &#39;invalid password&#39;, or &#39;your password has expired&#39;.&lt;/li&gt;&lt;li&gt;And many, MANY others.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Let&#39;s assume that you understand these issues, have the tools to figure them out when they happen, and work in a small enough business that the helpdesk can go through this dance with everyone in the company.   Out of nowhere, you get slammed with an issue you CAN&#39;T fix!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href=&quot;http://social.technet.microsoft.com/wiki/contents/articles/windows-root-certificate-program-technical-requirements.aspx&quot;&gt;Here&lt;/a&gt;, you will find your next issue.  Section F, item 2 basically says that CAs can no longer sign certificates with their root certificate.   Or, in other words, all certificates have to be signed by an intermediate CA cert.  Now, I understand that Microsoft isn&#39;t a standards setting body, so CAs don&#39;t have to comply with these rules.  However, as Microsoft is still a dominant OS provider, CAs that don&#39;t comply won&#39;t be allowed in the shipping Microsoft cert store.  Based on this, it is pretty reasonable to assume that most CAs will follow these rules.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The problem this creates for Android shows itself when you try to install a chain of certificates on Android.   I was unable to find any sane way that worked.   Digging in the Android source code seems to indicate that cert chains can be installed using PKCS#12 certificate bundles.   However, Android seems to insist that PKCS#12 certificate bundles contain a user cert.   In other words, if you are using anything but EAP-TLS, you probably can&#39;t use PKCS#12 bundles to get your certificates in the store.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It may seem reasonable that creating a PEM file that has multiple certificates in it would get around this issue.  However, if you try that, you are presented with the following dialog :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-5TTmeIUEgxQ/TpRtv3AfudI/AAAAAAAAAAQ/sFUcU6pBBUY/s1600/cert_dialog.png&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 269px; height: 265px;&quot; src=&quot;http://1.bp.blogspot.com/-5TTmeIUEgxQ/TpRtv3AfudI/AAAAAAAAAAQ/sFUcU6pBBUY/s320/cert_dialog.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5662271300498864594&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note that the dialog indicates that there is only one CA certificate that will be installed.   If you complete the installation, and set up a new wireless authentication using this certificate, you will find the connection doesn&#39;t work.   If you happen to have CatLog, or a development machine around you will see in the logs that the certificate chain failed to validate.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you can&#39;t use self signed certificates, and can only buy certificates that are chained, it starts to become clear that the 802.1X/WPA-Enterprise/WPA2-Enterprise authentication on Android is darn near unusable.   You either need to find a CA that is willing to go against Microsoft.   Or, you have to choose not to use certificates in your authentications.  (Which, is a *BAD* idea!)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I just want to restate that Google has been made aware of these issues.   However, it was recent enough that they probably haven&#39;t had time to do anything about it, let alone get anything fixed and released.   Also, since I get really annoyed with people that like to complain, but don&#39;t offer any real solutions, I will be submitting patches to Google that will hopefully start to fix some of these issues.   At a minimum, hopefully Google can use my patches as a jumping off point for a good fix.&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/4800896428498424775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2011/10/trouble-in-android-wifi-land.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/4800896428498424775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/4800896428498424775'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2011/10/trouble-in-android-wifi-land.html' title='Trouble in Android Wifi land'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-5TTmeIUEgxQ/TpRtv3AfudI/AAAAAAAAAAQ/sFUcU6pBBUY/s72-c/cert_dialog.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-2936816244344821991</id><published>2011-04-11T10:03:00.000-07:00</published><updated>2011-04-11T13:52:51.814-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="graphics"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="shapes"/><title type='text'>Color changing rounded rectangles and Android</title><content type='html'>I recently came across an interesting problem.   I needed to have a rounded rectangle as the background of one of my widgets, but I needed to allow the border color of the rounded rectangle to be set by a configuration setting.&lt;br /&gt;&lt;br /&gt;Before the color changing requirement showed up, I was using a 9-patch to create my rounded rectangle.  It was simple, and worked quite well.  So, after some digging I came to the conclusion that I would need to change the colors in the 9-patch image in order to achieve my goals.   I ended up burning a lot of time trying to figure out how to do this.  (It isn&#39;t as simple as changing the colors in a normal .png file, unfortunately.)&lt;br /&gt;&lt;br /&gt;While digging, I came across &lt;a href=&quot;http://groups.google.com/group/android-developers/browse_thread/thread/63b12ebbe2959622&quot;&gt;this post&lt;/a&gt; that hinted that I might not need the 9-patch to do what I wanted.  But, the documentation for the shape XML is pretty much non-existent.  Which made things hard.&lt;br /&gt;&lt;br /&gt;A little more digging found an article that linked to &lt;a href=&quot;http://idunnolol.com/android/drawables.html&quot;&gt;this page&lt;/a&gt;.   This provided me the attributes for the XML that allow me to do what I needed to do.   So, I set out to give it a shot.  I started with a rounded rectangle with a white background and a black line around the outside.  The XML looked like this :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;lt;!--?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?--&amp;gt;&lt;br /&gt;&amp;lt;shape android=&quot;http://schemas.android.com/apk/res/android&quot; shape=&quot;rectangle&quot;&amp;gt;&lt;br /&gt;        &amp;lt;solid color=&quot;#ffffffff&quot;&amp;gt;&lt;br /&gt;        &amp;lt;stroke width=&quot;2dip&quot; color=&quot;#ff000000&quot;&amp;gt;&lt;br /&gt;        &amp;lt;corners radius=&quot;75dip&quot;&amp;gt;&lt;br /&gt;    &amp;lt;/corners&amp;gt;&amp;lt;/stroke&amp;gt;&amp;lt;/solid&amp;gt;&amp;lt;/shape&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;When I created the XML file in eclipse, there wasn&#39;t an option to create a shape XML file.  So, I picked one of the other types, and just deleted what was automatically created, and replaced it with the code above.   However, I also needed to move the XML file so that it was in the drawable directory.  (If you are like I was, you are thinking, &quot;But an XML file isn&#39;t a drawable!&quot;   But, you&#39;ll just have to trust me.)&lt;br /&gt;&lt;br /&gt;This provided me the basic rounded rectangle that I needed.  But, changing colors on-the-fly was still an issue.   After a bit of digging, I found that using this XML to create a drawable would give me everything I needed to get the job done.&lt;br /&gt;&lt;br /&gt;I decided to set the background for the layout that contained everything I was going to use.  (Which is why I am using a LinearLayout instead of some other widget.  But, any widget that allows a background to be set should work.)&lt;br /&gt;&lt;br /&gt;For a test, I changed my onCreate() method to include this code :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;        workareaLayout = (LinearLayout)findViewById(R.id.rightColumnInner);&lt;br /&gt;       &lt;br /&gt;        GradientDrawable sd = (GradientDrawable)this.getResources().getDrawable(R.drawable.roundrect);&lt;br /&gt;        sd.setColor(0xff00ff00);&lt;br /&gt;        sd.setStroke(10, 0xffff0000);&lt;br /&gt;        workareaLayout.setBackgroundDrawable(sd);&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;This created a nice rounded rectangle that is suitable for Christmas.   (It has a green background with a large red border.)&lt;br /&gt;&lt;br /&gt;The sd.setColor() call sets the background color for the rectangle.   The color is an ARGB value, so we start with 0xff since we don&#39;t want any transparency.   The 00ff00 portion indicates that we want to be the brightest green we can have.&lt;br /&gt;&lt;br /&gt;The sd.setStroke() call specifies the width of the border line, along with the color.   For this example, the width is 10, and the color is bright red, with no transparency.    The documentation isn&#39;t clear what a width of &quot;10&quot; means.  (Is it pixels?  Or one of the other measures commonly used in Android development?)  But, it appears that it is probably pixels.&lt;br /&gt;&lt;br /&gt;And with that, you should have the ability to create all kinds of crazy rounded rectangles.  However, keep in mind that this same method should work for other types of shapes that can be created with the shape XML.</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/2936816244344821991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2011/04/color-changing-rounded-rectangles-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/2936816244344821991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/2936816244344821991'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2011/04/color-changing-rounded-rectangles-and.html' title='Color changing rounded rectangles and Android'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-7694874210462942687</id><published>2010-11-11T10:11:00.000-08:00</published><updated>2010-11-11T10:19:22.594-08:00</updated><title type='text'>Getting ADB to work with the Samsung Tablet</title><content type='html'>It is a neat little device, the Samsung Galaxy Tablet.   However, as soon as I got one, I wanted to hook it to my computer and run some of my code on it.  Easy enough, right?  Well, not exactly.&lt;br /&gt;&lt;br /&gt;After fighting with it for several hours yesterday, I gave up and called it a day.  This morning I posted to the Android developers list looking for help.  Then, on a hunch, I installed the Samsung Galaxy S driver pack, and managed to make progress.&lt;br /&gt;&lt;br /&gt;I downloaded the driver from &lt;a href=&quot;http://drivers.softpedia.com/progDownload/Samsung-Galaxy-S-USB-Driver-for-Windows-x64-Download-96693.html&quot;&gt;here&lt;/a&gt;.  Make sure that you click on the link that says &quot;Softpedia Secure Download&quot; as there seem to be a lot of ads on the page that try to get you to install other crap.&lt;br /&gt;&lt;br /&gt;Once you have the driver downloaded, unzip it someplace.  (I threw it on the desktop, because it was easy.)  Then, open the control panel, go to System, then Device Manager, and find the SAMSUNG_Android device that should be listed in the &quot;Unknown Devices&quot; section.  Right click the device, and select &quot;Update Driver Software...&quot;.&lt;br /&gt;&lt;br /&gt;Next, select the option to &quot;Browse my computer for driver software&quot;, then enter the path to the &quot;USB Drivers&quot; directory you extracted from the download.  Make sure that the &quot;Include subfolders&quot; option is checked, and click Next.&lt;br /&gt;&lt;br /&gt;At this point, the main USB driver should be found.  After waiting a second, you should see a couple of new USB devices show up in the &quot;Unknown Devices&quot; section.   One will be a modem interface, the other is the ADB interface that we want to use.&lt;br /&gt;&lt;br /&gt;If you follow the same procedure above on these new devices you should be able to get the correct drivers installed.   Once all of the drivers are installed, you should be ready to go!  Running &quot;adb devices&quot; should show your Samsung tablet.</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/7694874210462942687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2010/11/getting-adb-to-work-with-samsung-tablet.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/7694874210462942687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/7694874210462942687'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2010/11/getting-adb-to-work-with-samsung-tablet.html' title='Getting ADB to work with the Samsung Tablet'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-2857485825001950020</id><published>2010-10-17T14:04:00.000-07:00</published><updated>2010-11-09T11:25:32.346-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="ListView"/><title type='text'>Fancy List Items in a ListView</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;A while ago, I was working on a project where I wanted to be able to have Android show a ListView, with custom entries in the list.   In most other languages and toolkits, doing this is a bit of a pain.  You have to implement a special painter to pain the list cell in just the right way.  Unless you are a pretty die-hard developer for that toolkit you may find yourself horribly confused as to how to handle the situation.&lt;br /&gt;&lt;br /&gt;Fortunately, Android made this &lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;REALLY&lt;/span&gt;&lt;/span&gt; easy.   If you know how to do a layout for a form, you know almost everything you need to know in order to make a fancy list item.&lt;br /&gt;&lt;br /&gt;First, you want to create a small layout that specifies how a single list entry should look.  For my purposes, I wanted to have a single line of large text, with smaller text below.  I also wanted the large text to be bright white, and the smaller text to be a darker gray color.  Finally, the smaller text should be indented on both sides to indicate that it is subordinate to the larger text.&lt;br /&gt;&lt;br /&gt;No problem!  A basic linear layout will do the job nicely.  My final layout looks like this :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;linearlayout android=&quot;http://schemas.android.com/apk/res/android&quot; layout_height=&quot;wrap_content&quot; layout_width=&quot;fill_parent&quot; orientation=&quot;vertical&quot;&amp;gt;&lt;br /&gt;&amp;lt;textview layout_height=&quot;wrap_content&quot; id=&quot;@+id/LargeText&quot; text=&quot;Large Text&quot; textcolor=&quot;@color/white&quot; textsize=&quot;25dip&quot; layout_width=&quot;fill_parent&quot;&amp;gt;&amp;lt;/textview&amp;gt;&lt;br /&gt;&amp;lt;textview layout_height=&quot;wrap_content&quot; layout_width=&quot;fill_parent&quot; layout_marginright=&quot;10dip&quot; layout_marginleft=&quot;10dip&quot; id=&quot;@+id/SmallText&quot; text=&quot;Smaller Text&quot; textcolor=&quot;#c0c0c0&quot;&amp;gt;&amp;lt;/textview&amp;gt;&lt;br /&gt;&amp;lt;/linearlayout&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Easy enough.  Now that we have that, we need to actually write some code that will use it.  I find it easiest to create a convenience class that lets me manipulate the list easily.  So, I create a class called MultiLineList, that looks something like this :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.widget.SimpleAdapter;&lt;br /&gt;&lt;br /&gt;public class MultiLineList {&lt;br /&gt;&lt;br /&gt; private ArrayList&amp;lt;HashMap&amp;lt;String,String&amp;gt;&amp;gt; list = new ArrayList&amp;lt;HashMap&amp;lt;String,String&amp;gt;&amp;gt;();&lt;br /&gt; private Activity parentActivity;&lt;br /&gt; private SimpleAdapter taskAdapter;&lt;br /&gt;&lt;br /&gt; public MultiLineList(Activity parent)&lt;br /&gt; {&lt;br /&gt;     parentActivity = parent;&lt;br /&gt; &lt;br /&gt;     taskAdapter = new SimpleAdapter(parentActivity, list,&lt;br /&gt;             R.layout.multi_item_layout, new String[] { &quot;largetext&quot;,&quot;smalltext&quot; },&lt;br /&gt;             new int[] { R.id.LargeText, R.id.SmallText } );&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt; public void clear()&lt;br /&gt; {&lt;br /&gt;     list.clear();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void addItem(String largeText, String smallText)&lt;br /&gt; {&lt;br /&gt;     HashMap&amp;lt;String,String&amp;gt; item = new HashMap&amp;lt;String,String&amp;gt;();&lt;br /&gt;     item.put(&quot;largetext&quot;, largeText);&lt;br /&gt;     item.put(&quot;smalltext&quot;, smallText);&lt;br /&gt;     list.add(item);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public SimpleAdapter getData()&lt;br /&gt; {&lt;br /&gt;     return taskAdapter;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;In the constructor, we create a SimpleAdapter that we use to map our text in to the different rows of the list view we will show the user.  &quot;R.layout.multi_item_layout&quot; is the name of the layout we created above.  (You may need to change this if you called your layout something else.)  The two strings, followed by the two ints give us a mapping in a hash table for how to identify the two different TextEdits that we put in the layout.   There is nothing special about only having two items.   We could easily have 10 strings and 10 matching ints.  What is important is that each string has a corresponding int that maps to a text edit in your layout.&lt;br /&gt;&lt;br /&gt;The addItem() method is where the good stuff happens.   As part of creating the SimpleAdapter in the constructor, we told it to use the &quot;list&quot; variable to get its data out of.  So, the addItem() method allows us to easily put new text in to the list to be used.   So, calling addItem(&quot;I am big&quot;, &quot;I am not&quot;) would give us a single entry in the list view that contained the text &quot;I am big&quot; in the large font, and &quot;I am not&quot; in the small font.&lt;br /&gt;&lt;br /&gt;Now that we have all of the ground work in place, it is time to put the pieces together.   Moving forward, I am going to assume that you have a basic form set up with a list view configured in it.  Also, that a ListView variable points to it called &quot;listView&quot;.   From there, using our fancy list widgets would look something like this :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;myList = new MultiLineList(this);&lt;br /&gt;myList.addItem(&quot;Large 1&quot;, &quot;Small 1&quot;);&lt;br /&gt;myList.addItem(&quot;Large 2&quot;, &quot;Small 2&quot;);&lt;br /&gt;&lt;br /&gt;listView.setAdapter(myList.getData());&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, the next time out list view is drawn, it will contain two items in the list.   The first one will have &quot;Large 1&quot; in the larger text, and &quot;Small 1&quot; in the smaller text.   The second one will contain &quot;Large 2&quot; in the larger text, and &quot;Small 2&quot; in the smaller text.&lt;br /&gt;&lt;br /&gt;From this simple example, you should be able to easily expand your list items to contain any just about any widget type you would want.  But, I leave that up to you to experiment with.</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/2857485825001950020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2010/10/fancy-list-items-in-listview.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/2857485825001950020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/2857485825001950020'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2010/10/fancy-list-items-in-listview.html' title='Fancy List Items in a ListView'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-1984855359507297694</id><published>2010-08-07T14:35:00.000-07:00</published><updated>2010-08-07T15:02:08.357-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="bitmap"/><category scheme="http://www.blogger.com/atom/ns#" term="canvas"/><category scheme="http://www.blogger.com/atom/ns#" term="graphics"/><category scheme="http://www.blogger.com/atom/ns#" term="overlay"/><title type='text'>Its all about the layers..</title><content type='html'>For an Android project I am currently working on, I wanted to take an image of the last state of my game board, and overlay another image on it.  While this seems like a simple thing it wasn&#39;t terribly simple to figure out.  (Though, it is surprisingly simple to implement.)&lt;br /&gt;&lt;br /&gt;To make this easy, lets assume you have two bitmaps.  We will call them bitmap1, and bitmap2.  Also to make it easy, we will assume they are stored as drawables in your Eclipse project.  &lt;br /&gt;&lt;br /&gt;It is also important to note that bitmap2 must have some transparent areas on it.  If bitmap2 is completely opaque, you won&#39;t see any of bitmap1, and this code will be a waste of effort.  (Since you could just draw bitmap2 by itself.)&lt;br /&gt;&lt;br /&gt;The first thing we want to do is get our drawables stored in Bitmap objects.  These bitmap objects should be called bitmap1 and bitmap2.   This is easily done with the following code :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;  BitmapDrawable draw1 = (BitmapDrawable)res.getDrawable(R.drawable.bitmap1);&lt;br /&gt;  Bitmap bitmap1 = draw1.getBitmap();&lt;br /&gt;&lt;br /&gt;  BitmapDrawable draw2 = (BitmapDrawable)res.getDrawable(R.drawable.bitmap2);&lt;br /&gt;  Bitmap bitmap2 = draw2.getBitmap();&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That was easy.  Now, we have to figure out how to combine the two.  This is where things start to get a little less obvious.   After Googling around, I found several different methods that could do it.  But, the method I am going to use below seemed the most straightforward to me.&lt;br /&gt;&lt;br /&gt;First, the code, then the explanation :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;  Bitmap layers = Bitmap.createBitmap(bitmap1.getWidth(), bitmap1.getHeight(), bitmap1.getConfig());&lt;br /&gt;  Canvas c = new Canvas(layers);&lt;br /&gt;  c.drawBitmap(bitmap1, new Matrix(), null);&lt;br /&gt;  c.drawBitmap(bitmap2, new Matrix(), null);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Believe it or not, you now have a merged bitmap in memory.  (But how?  It looks like all I did was draw on a canvas!?)&lt;br /&gt;&lt;br /&gt;Simple, if you look at the Canvas class, you will find that one of the constructors allows you to pass in a Bitmap object.  When you do this, anything that is drawn on the canvas is put in to the Bitmap that was passed in.   So, in our example above, if we wanted to see the result, we could draw the Bitmap object &#39;layers&#39; to the screen, and we would have the image of bitmap2 laid over bitmap1.&lt;br /&gt;&lt;br /&gt;Or, to look at it another way.  If you were working with a SurfaceView, and wanted to draw the bitmaps there, you would create a Canvas object, draw the two bitmaps in order, and pass the Canvas to the SurfaceView where it would be drawn.   The code here does the same basic thing.  However, instead of having the code drawn immediately on the SurfaceView, you have the output sent to a Bitmap.&lt;br /&gt;&lt;br /&gt;But, lets look at some assumptions in this code real quick.  When we create the &#39;layers&#39; Bitmap object, we have to tell the Bitmap object a little bit about the bitmap we want to create.  Specifically, we have to tell it what the size of the bitmap is, and what the configuration of the bitmap is.  The size is fairly obvious.  But, in the sample code above, we are assuming that either the two bitmaps are the same size, or that bitmap2 is smaller than bitmap1.   If bitmap1 is actually smaller than bitmap2, then the final bitmap will be the same size as bitmap1, and bitmap2 will be clipped to fit.   But what about the configuration?  What is that?  The configuration is a value that tells the bitmap what kind of data it will be storing.  Or, another way to look at it, how big each pixel will be in memory.  Without getting in to a bunch of detail, under normal circumstances, you will want to use ARGB_8888.&lt;br /&gt;&lt;br /&gt;Why the heck would you ever do this?  Well, if you needed a composite image that would be used repeatedly in your program you could either try to draw it in real-time every time it was needed, or draw it once and just reuse the drawing.  If the image is more than a few pixels, recreating the overlay each time could be an expensive operation.   Caching the result and using that instead can save you a fair bit of processing time that you can use for other cool effects in your program!</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/1984855359507297694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2010/08/its-all-about-layers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/1984855359507297694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/1984855359507297694'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2010/08/its-all-about-layers.html' title='Its all about the layers..'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-5075352952407208492</id><published>2010-07-12T19:41:00.000-07:00</published><updated>2010-07-19T19:58:21.273-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="database"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type='text'>The right way to do databases in Android</title><content type='html'>Feel free to comment below on what a loser I am.   I am sitting in a cabin outside of Yellowstone National Park, writing a blog entry about doing databases on Android.  However, I do think I should get a little geek cred as I am posting it from an EDGE connection on T-Mobile across the FroYo wireless tether.  But, anyway...&lt;br /&gt;&lt;br /&gt;When I first started working with Android, I found a simple tutorial on how to build SQLite databases.  A few weeks ago, I was trying to track down the information again for project for my day job.   After searching a bit, I was unable to find the original tutorial, but I found one that was a little better.  The newer tutorial pointed me toward a much better way to handle databases.&lt;br /&gt;&lt;br /&gt;In the Android SDK is a class called SQLiteOpenHelper.  This class has two methods that Eclipse will force you to implement.  The first is onCreate(), the second is onUpdate().&lt;br /&gt;&lt;br /&gt;The onCreate() method is automagically called when you instantiate your descendant class, and the target database doesn&#39;t exist.  In this method, you should issue all of the necessary SQLite commands to create the tables in your database.  But, hold on a second.  How can you put tables in the database when you didn&#39;t specify the database name?   Simple, when the class is instantiated, the database name is passed in.  The SQLiteOpenHelper class then takes care of creating the database for you, before the onCreate() method is called.&lt;br /&gt;&lt;br /&gt;The onUpdate() method is also really handy and cool.  When you instantiate the descendant class, you also pass in a database version number.  If the version number you pass in is higher than the version number when the database was created, the onUpdate() method is called with version number stored in the database, and the version number presented when the class is instantiated.  onUpdate() is responsible for issuing the correct SQLite commands needed to bring the database up to the schema version specified when the class was instantiated.&lt;br /&gt;&lt;br /&gt;Okay, so blah, blah, blah..  Sample code!?&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;public class DBOpenHelper extends SQLiteOpenHelper {&lt;br /&gt;&lt;br /&gt;    private final String MY_DATA_TABLE = &quot;t_Data&quot;;&lt;br /&gt;    private final String MY_DATA2_TABLE = &quot;t_Data2&quot;;&lt;br /&gt; &lt;br /&gt; public DBOpenHelper(Context context, String name, CursorFactory factory,&lt;br /&gt;   int version) {&lt;br /&gt;  super(context, name, factory, version);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onCreate(SQLiteDatabase myDB) {&lt;br /&gt;&lt;br /&gt;  /* Create a Table in the Database. */&lt;br /&gt;  myDB.execSQL(&quot;CREATE TABLE IF NOT EXISTS &quot;&lt;br /&gt;      + MY_DATA_TABLE&lt;br /&gt;      + &quot; (mystring1 VARCHAR, mystring2 VARCHAR);&quot;);&lt;br /&gt;  &lt;br /&gt;  myDB.execSQL(&quot;CREATE TABLE IF NOT EXISTS &quot;&lt;br /&gt;    + MY_DATA2_TABLE&lt;br /&gt;    + &quot; (mystring3 VARCHAR);&quot;);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {&lt;br /&gt;  // We don&#39;t use this just yet.&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Great!   So the database gets created, but how do we actually use it?&lt;br /&gt;&lt;br /&gt;Well, I am glad you asked.  The SQLiteOpenHelper has methods that will return a handle to the database in either read only, or read/write flavors.   So, if we wanted to use our open helper to create the database, and add a record to the second table, it would look something like this :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;public void addDbData()&lt;br /&gt;{&lt;br /&gt;     DBOpenHelper dbHelper = new DBOpenHelper(this, &quot;my_database&quot;, null, 1);&lt;br /&gt;     SQLiteDatabase myDb = dbHelper.getWriteableDatabase();   // Open for write.&lt;br /&gt;&lt;br /&gt;     // Now, use the normal SQLiteDatabase methods to work with the DB.&lt;br /&gt;     myDb.execSQL(&quot;insert into &quot; + MY_DATA2_TABLE + &quot; set mystring3=&#39;Foo!&#39;;&quot;);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;After you call addDbData(), you will now have a new database created with the name &#39;my_database&#39;, with schema version 1.  The MY_DATA2_TABLE will also contain a single record containing the string &quot;Foo!&quot;.&lt;br /&gt;&lt;br /&gt;Two things worth pointing out in the addDbData() method.  First, if you only want to read data from your database, you can change &quot;getWriteableDatabase()&quot; to &quot;getReadableDatabase()&quot;.   Second, always be sure you close your database after you are finished with it!  The Java garbage collector won&#39;t do it for you, and you will get leak errors sent to your logcat console.&lt;br /&gt;&lt;br /&gt;I am not going to get in to the update method of the SQLiteOpenHelper.  I leave that as an exercise for you.</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/5075352952407208492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2010/07/right-way-to-do-databases-in-android.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/5075352952407208492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/5075352952407208492'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2010/07/right-way-to-do-databases-in-android.html' title='The right way to do databases in Android'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-5464759255176971223</id><published>2010-06-09T11:55:00.000-07:00</published><updated>2010-06-09T12:12:47.777-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="ListView"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>Something simple.  Get text from a ListView.</title><content type='html'>Perhaps this topic is considered too simple for most people, which is why there aren&#39;t more postings about it.  But, it seems like a useful thing to know.  Specifically, when you are using a ListView with the android.R.layout.simple_list_item_1 view, how the heck do you get the text from the item clicked in the OnItemClickListener class?&lt;br /&gt;&lt;br /&gt;It is pretty simple.  The second parameter of the onItemClick is a View that contains just the item that was clicked.  (Or tapped, whatever.)  If you used Eclipse to automagically generate the callback method for you, the variable will be named &quot;arg1&quot;, which is what we will assume for this example.&lt;br /&gt;&lt;br /&gt;Inside of the onItemClick method, you can figure out the text using the following code :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;String s = ((TextView)arg1.findViewById(android.R.id.text1)).getText().toString();&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Pretty simple, huh?  But, the code doesn&#39;t quite explain itself.  So, I&#39;ll take a stab at it.&lt;br /&gt;&lt;br /&gt;A ListView is exactly what the name says.  It is a list of views.  When you create the ArrayAdapter&lt;String&gt; that you will use to display the data, you also tell the ArrayAdapter what view it should use.  In our case, we chose &quot;android.R.layout.simple_list_item_1&quot; so we could use a simple array for the data.  What we are doing is referencing a very simple layout that only displays a single line of text.  I am sure if you Google around you can find the XML definition. &lt;br /&gt;&lt;br /&gt;Inside the layout is a single definition.  It is a TextView named &quot;text1&quot;.  Since it is a built-in layout, we will find the layout information under &quot;android.R&quot;, instead of just &quot;R&quot; where our layout definitions show up.&lt;br /&gt;&lt;br /&gt;So, by executing findViewById() on the view that was clicked, and passed in as &quot;arg1&quot;, we can get the text that the user clicked on.  &lt;br /&gt;&lt;br /&gt;Pretty simple huh?</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/5464759255176971223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2010/06/something-simple-get-text-from-listview.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/5464759255176971223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/5464759255176971223'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2010/06/something-simple-get-text-from-listview.html' title='Something simple.  Get text from a ListView.'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-3528497051537909526</id><published>2010-05-31T15:49:00.000-07:00</published><updated>2010-05-31T16:54:43.087-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="graphics"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="views"/><title type='text'>Basic graphics with Android</title><content type='html'>I have been working on a small game, and come across a real lack of useful information on how to develop a non-real time game.  (i.e.  A game that is entirely event driven.)&lt;br /&gt;&lt;br /&gt;I started with the usual route, attempting to use existing UI objects to create the look that I wanted.  However, I was unable to get the look and behavior that I wanted.  So, I looked closer at the Lunar Lander sample in the Android SDK.  The problem is that the Lunar Lander sample was perfect if you wanted to develop a real-time game.  But, I didn&#39;t.&lt;br /&gt;&lt;br /&gt;So, what to do?  After much Googling, I found suggestions that what I really wanted to do was create a specialized view that would contain my game board.  Doing this turned out to be easier than I thought it would.   Using the Eclipse wizards, I created a new class that would be my game board view.  The class was derived from the View class.   The simplistic class would look something like this :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;package com.example.simplegame;&lt;br /&gt;&lt;br /&gt;public class BoardView extends View {&lt;br /&gt; public BoardView(Context context) {&lt;br /&gt;  super(context);&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public BoardView(Context context, AttributeSet attrib)&lt;br /&gt; {&lt;br /&gt;  super(context, attrib);&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now, let me save you some time and pain.  When I started this effort, I used &quot;super(context)&quot; inside the second constructor.  Doing that will prevent you from using findViewById() to get a pointer to the view in your form.&lt;br /&gt;&lt;br /&gt;Okay, so now we have a basic class set up.  But, it doesn&#39;t actually do anything useful.   What we really wanted to do is have a small blue box drawn on our view.  So how do we do that?&lt;br /&gt;&lt;br /&gt;Simple.  We add an onDraw() method to our class.  onDraw() takes a single parameter, with is of type Canvas.  The canvas is what we will draw on, and what will ultimately be shown on the screen.  As previously stated, we want to draw a simple blue square on the screen, so our onDraw method should look something like this :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onDraw(Canvas canvas) {&lt;br /&gt;  super.onDraw(canvas);&lt;br /&gt;  &lt;br /&gt;  Paint p = new Paint();&lt;br /&gt;                p.setAntiAlias(true);&lt;br /&gt;                p.setARGB(255, 0, 0, 255);&lt;br /&gt;&lt;br /&gt;                canvas.drawRect(0, 0, 10, 10, p);&lt;br /&gt;         }&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt; &lt;br /&gt;&lt;br /&gt;Before we move on to talk about how to use our new View in a form, I want to point out a little bit more information on how onDraw() works.   According to the Android documentation, you should assume that the canvas passed in to onDraw() is blank.  (That is, you should never rely on anything you have previously drawn to still exist on the canvas.)  Because of this, you will need to redraw your entire view each time onDraw() is called.   In our sample, we draw the blue square each time onDraw() is called.&lt;br /&gt;&lt;br /&gt;Now that we have a new view class set up, we need to figure out how to put it in a form, and use it.  To make things easy, I first created a simple form with a generic View that fills the entire screen.  It looks something like this :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout&lt;br /&gt;  xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;&lt;br /&gt;  android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;fill_parent&quot;&amp;gt;&lt;br /&gt;&amp;lt;View android:id=&quot;@+id/View01&quot; android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;fill_parent&quot;&amp;gt;&amp;lt/View&amp;gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now that we have our layout, we need to modify it to include our custom view.  To do this, we change the &amp;lt;View&amp;gt; tags to be &amp;lt;com.example.simplegame.BoardView&amp;gt;.  If you then take this class, and this form and wrap it in some boiler plate code that would display the form, you will get a form with a small blue square in the top left corner of the screen.&lt;br /&gt;&lt;br /&gt;If you do some experimenting, you will find that you get the blue square on the screen even if you don&#39;t establish a pointer to the BoardView object in the form.  While it may seem strange at first, if you think about it you will realize that all of the objects on a form exist as soon as the form is inflated.   The findViewById() call is simply giving you a pointer to the object that already exists in memory.  Therefore, the onDraw() method is called, even if your main program doesn&#39;t have a pointer to the view.</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/3528497051537909526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2010/05/basic-graphics-with-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/3528497051537909526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/3528497051537909526'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2010/05/basic-graphics-with-android.html' title='Basic graphics with Android'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-5815529549137192651</id><published>2010-05-19T18:41:00.000-07:00</published><updated>2010-05-19T18:42:45.100-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="802.11"/><category scheme="http://www.blogger.com/atom/ns#" term="Meru"/><category scheme="http://www.blogger.com/atom/ns#" term="Wifi"/><category scheme="http://www.blogger.com/atom/ns#" term="wireless"/><title type='text'>Meru configuration, part 1</title><content type='html'>As promised, I am going to give the QuickPhones phone a shot with the Meru gear.  But first, I need to get the gear set up.&lt;br /&gt;&lt;br /&gt;A quick rundown of what my configuration will look like :&lt;br /&gt;1 - Meru MC 500 controller running version 3.4-103 software&lt;br /&gt;1 - Meru MN-AP320&lt;br /&gt;1 - Meru MN-AP201RH&lt;br /&gt;&lt;br /&gt;I powered up the unit, and plugged in to it via a USB-&gt;Serial dongle.  As the instructions indicated, I set up the serial port to 115200,8,N,1.  I watched as the controller booted some flavor of Linux, and then hung on the &quot;Starting Meru 3.4-103 wireless LAN services ...&quot;.  After sitting for a while, I figured something was wrong, so I power cycled the box to see if it would come up a little quicker.  (It didn&#39;t.)&lt;br /&gt;&lt;br /&gt;I figured there was something wrong with my unit, so I pulled up a text editor to start writing my blog entry about how much I would have loved to write the entry about the QuickPhones with Meru.  While I was getting everything together, the console spit out an error message, and then prompted me for a login.&lt;br /&gt;&lt;br /&gt;I went ahead and put the default admin/admin username and password and got the console prompt back.  At the console prompt, I ran the &quot;setup&quot; process.  After answering the normal questions (ip address, gateway, netmask, etc.) the unit asked if it could reboot.  (So I let it.  Shocking, huh?)&lt;br /&gt;&lt;br /&gt;Fortunately, it rebooted a lot faster than the initial boot.  After a minute, I was able to log in and was back at the command prompt.&lt;br /&gt;&lt;br /&gt;Normally, I am the kind of person that hates to configure gear with the web interface.  But, in this case I decided to make an exception since the goal is not to evaluate the Meru gear, but rather to see if the phone works better on it.   I fired up Firefox, and hit the web page.  At this point, I was informed that I needed to use Internet Expoliter to access the UI on the box.  (As an aside, I am sure that the version of code I am using is older.  But, I still have to say, REALLY!?  *sigh*)&lt;br /&gt;&lt;br /&gt;Since I am already inflicting punishment on myself, I figured I would give IE 8 x64 a shot.  When I hit the web site, I was first told that the certificate on the unit was suspicious (which is normal on gear like this), and after telling IE it was okay to continue, I was prompted for the username and password.&lt;br /&gt;&lt;br /&gt;The UI that was displayed is reasonably clean, but doesn&#39;t show any useful information initially.  (Probably because I don&#39;t have any APs it can talk to.)  So, I pulled out the AP201RH.  The first thing I noticed is that the AP appeared to want power over ethernet (PoE).  So, I tried plugging it in to port 2 on the controller in hopes that it would power on.   But, it seems that either port 2 doesn&#39;t do PoE, or there is some configuration setting that I need to enable before it will do it.   Again, since I really want to get to the QuickPhones testing, I just took the AP in to another room that had a PoE port that I knew would work.&lt;br /&gt;&lt;br /&gt;I managed to get the AP201RH up and running easily enough.  So I plugged in the AP-320 so I could get it configured and ready to rock.  Unfortunately, the AP-320 is running a different version of code, and try as I might, I am unable to upgrade, or downgrade it.   Since the controller sees the AP as an AP-100, I am guessing this is a good thing.&lt;br /&gt;&lt;br /&gt;Unfortunately, this is a dead end for this effort.  I&#39;ll have to see if I can track down my friend at Meru to see if I can get some help.  (The gear I have is test gear, so I don&#39;t have a maintenance contract to get the latest versions of code.)&lt;br /&gt;&lt;br /&gt;I hope to have more in the coming weeks, assuming I can reconnect with an old friend.</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/5815529549137192651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2010/05/meru-configuration-part-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/5815529549137192651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/5815529549137192651'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2010/05/meru-configuration-part-1.html' title='Meru configuration, part 1'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7211139912294788986.post-2392824984346163582</id><published>2010-05-17T18:39:00.000-07:00</published><updated>2010-05-17T18:45:25.918-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="ListView"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>Stupid Android ListView tricks</title><content type='html'>I recently made some major changes to the Movie Track app that I put out.  What started as an app that I did for my own use seems to have gained a few users.  So, I decided to upgrade the look and feel a bit.  In the process of this, I changed several of the screens from using a ListActivity to using a normal XML layout that contained a ListView.   After mucking around with all of the settings to get things looking the way I wanted, I ran in to an interesting snag.&lt;br /&gt;&lt;br /&gt;Everything displayed the way I wanted it to, but to &quot;click&quot; on an item that was in the ListView, you had to actually &quot;click&quot; on the text of the ListView, and not just on the row in the ListView.   Perhaps I am a perfectionist at some level, but this annoyed me to no end.&lt;br /&gt;&lt;br /&gt;Much Google later, I couldn&#39;t find the answer on how to do it.  So, I started to mess with settings.  A hair-brained idea or two later, I decided to try changing the ListView&#39;s layout-width from &quot;wrap_content&quot; to &quot;fill_parent&quot;.  Amazingly enough, that did exactly what I wanted!&lt;br /&gt;&lt;br /&gt;Sure, this was a bit of a &quot;duh&quot; experience, and a newbie mistake.  But, I figured I would publish it here in case some other developer runs across the same thing, and gets as frustrated as I was getting!</content><link rel='replies' type='application/atom+xml' href='http://geektaco.blogspot.com/feeds/2392824984346163582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://geektaco.blogspot.com/2010/05/stupid-android-listview-tricks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/2392824984346163582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7211139912294788986/posts/default/2392824984346163582'/><link rel='alternate' type='text/html' href='http://geektaco.blogspot.com/2010/05/stupid-android-listview-tricks.html' title='Stupid Android ListView tricks'/><author><name>FBA</name><uri>http://www.blogger.com/profile/18446659532234557419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>