<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8861470730700525370</id><updated>2012-02-02T09:21:47.663-06:00</updated><category term='halloween'/><category term='pc'/><category term='apple mac appletv'/><category term='joost tv'/><category term='apple mac iphone ipod'/><category term='php'/><category term='iphone sdk'/><category term='pcre'/><category term='apple'/><category term='development'/><category term='poker'/><category term='amiga'/><category term='ipad'/><category term='keno'/><category term='universe'/><category term='osx'/><category term='delegates'/><category term='cocoa'/><category term='objective-c'/><category term='hot sauce'/><category term='iphone'/><category term='xcode'/><category term='windows xp'/><category term='sound'/><category term='sdk'/><category term='google background image wallpaper remove'/><category term='mac mini'/><category term='mac'/><category term='fcg'/><category term='hard disk'/><category term='regular expressions'/><category term='flying crank ghost'/><category term='iphone mac'/><category term='gmail thunderbird'/><title type='text'>Fifty Outs</title><subtitle type='html'>This is the random ramblings of a programming geek, poker player, trumpet player, fast car nut, and billiards player.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>63</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-6615517748633812268</id><published>2011-10-05T09:43:00.002-05:00</published><updated>2011-10-05T09:44:14.243-05:00</updated><title type='text'>Why all the disappointment?</title><content type='html'>I keep seeing all these blogs/threads about how Apple blew it by not putting out a iPhone 5. But honestly, what would the iPhone 5 consist of that the 4S does not already cover? I can think of one thing: some new spiffy form factor with a slightly bigger screen.&lt;br /&gt;&lt;br /&gt;As for form factor, the iPhone4 is already quite good. Is it just because we want something different, and not necessarily better? I don't think they could make things thinner with all the new guts they stuffed into the same case. A bigger screen, but same resolution... I'm not convinced that this would be all that much of an improvement. I certainly don't want a bigger phone, the iPhone 4 fits perfectly in the hand.&lt;br /&gt;&lt;br /&gt;We know LTE would not be in the cards. It just isn't ready yet, and Apple isn't big on adopting technologies preemptively (unless they are innovating it themselves.)&lt;br /&gt;&lt;br /&gt;So as for the 4S, let's list the highlights:&lt;br /&gt;&lt;br /&gt;* A5 chip, x7 graphics&lt;br /&gt;* longer battery life&lt;br /&gt;* new antenna design&lt;br /&gt;* 2x data speed over 3G&lt;br /&gt;* enhanced camera&lt;br /&gt;* CDMA/GSM in same phone&lt;br /&gt;* iOS5/iCloud&lt;br /&gt;* Find my Friends / Cards&lt;br /&gt;* iTunes Match&lt;br /&gt;* Siri&lt;br /&gt;&lt;br /&gt;Ok, that is a pretty solid list of improvements. This really is a new phone, but just in the same form factor. Had we wrapped all this up in a new form factor and called it iPhone 5, would it suddenly get the praise and glory?&lt;br /&gt;&lt;br /&gt;I think it's mostly perception. As a matter of fact, if Steve Jobs would have been the one on stage, I think things would have been perceived differently. He has a way of wowing the audience. "We started from scratch. We took the already beautiful iPhone 4 form factor, gutted it, and replaced every single component with something better."&lt;br /&gt;&lt;br /&gt;[note] this is a copy of my post &lt;a href="http://forums.macrumors.com/showthread.php?t=1240182"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-6615517748633812268?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/6615517748633812268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=6615517748633812268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6615517748633812268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6615517748633812268'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2011/10/why-all-disappointment.html' title='Why all the disappointment?'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-6068209377047301221</id><published>2011-02-04T09:09:00.005-06:00</published><updated>2011-02-04T09:32:49.709-06:00</updated><title type='text'>Objective-C Semi-Singleton Class</title><content type='html'>Sometimes when building an iOS application, you will have a class you will want to access from anywhere. Such as, a controller with any number of child controllers (navigation, tab, etc.) and some of them need simple access back to the root controller.&lt;br /&gt;&lt;br /&gt;Apple provides their own solution to creating a full-blown singleton class, but this can be a daunting task for a simple need. A semi-singleton is much easier to create but has two caveats:&lt;br /&gt;&lt;br /&gt;1) semi-singletons only work if there is ever only one instance of the class&lt;br /&gt;2) the singleton cannot be used to initialize itself&lt;br /&gt;&lt;br /&gt;So, here is how to make a simple "HelloWorld" class into a semi-singleton.&lt;br /&gt;&lt;br /&gt;In the HelloWorld.m file, create a static property to hold the singleton instance:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// put just after @implementation line&lt;br /&gt;static HelloWorld* helloWorldInstance;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;in the init method, assign the instance (self) to the static property:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;-(id) init&lt;br /&gt;{&lt;br /&gt; if ((self = [super init]))&lt;br /&gt; {&lt;br /&gt;                // assign the semi-singleton&lt;br /&gt;                helloWorldInstance = self;&lt;br /&gt;                // do other init stuff here ...&lt;br /&gt; } &lt;br /&gt; return self;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;create the shared static method for accessing the semi-singleton:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;+(HelloWorld*) sharedInstance {&lt;br /&gt;         return helloWorldInstance;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Lastly, be sure to dealloc the property to avoid crashes:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;-(void) dealloc&lt;br /&gt;{&lt;br /&gt;          helloWorldInstance = nil;&lt;br /&gt;          [super dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And now from any class, we can access a pointer to the instance:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#import HelloWorld.h&lt;br /&gt;&lt;br /&gt;HelloWorld *helloWorld = [HelloWorld sharedInstance];&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And there you have it. Thanks to Steffen Itterheim and his book about cocos2d programming for the original tip!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-6068209377047301221?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/6068209377047301221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=6068209377047301221' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6068209377047301221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6068209377047301221'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2011/02/objective-c-semi-singleton-class.html' title='Objective-C Semi-Singleton Class'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-1349363004164867471</id><published>2010-12-22T09:06:00.004-06:00</published><updated>2010-12-22T09:23:24.288-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apple mac appletv'/><title type='text'>Apple TV: A perfect replacement for digital picture frames</title><content type='html'>I never really liked the idea of digital picture frames. At first they were overpriced and very poor picture quality. Now they are getting better with higher resolution, more options for getting photos to them (SD card slot, USB, Wifi), but there is still a problem with them. They are single purpose devices, and Grandma doesn't want to fidget with loading images.&lt;br /&gt;&lt;br /&gt;Along comes the AppleTV (Gen 2) from Apple for $99. A black hockey puck with one HDMI cable, power cable, and very simple remote. Now here is a perfect replacement for digital picture frames. I have a MobileMe account where I keep all of my photo albums up to date. Now Grandma can flip on her AppleTV and view all the new photo albums I put onto MobileMe with no work on her part. The slideshow viewer is absolutely gorgeous, and quite configurable. Now Grandma can view the photos on her TV in a much larger format instead of a dinky digital picture frame, and I manage the albums.&lt;br /&gt;&lt;br /&gt;Not only is the AppleTV a good slideshow viewer, but you can watch Netflix, rent movies and tv shows, use airplay to push content to the TV from another iOS device, and you know an app store is in the works... but the picture viewer alone is worth the price to purchase for Grandma.&lt;br /&gt;&lt;br /&gt;Although MobileMe is $99 bucks a year, it's well worth it for the automated syncing of addresses, bookmarks, passwords, etc. between all your Mac devices. And of course, simple management of shared photo/video galleries for the family.&lt;br /&gt;&lt;br /&gt;So if you plan on getting a digital picture frame for a gift, spend the dollars on an AppleTV instead. It's a much better investment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-1349363004164867471?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/1349363004164867471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=1349363004164867471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1349363004164867471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1349363004164867471'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2010/12/apple-tv-perfect-replacement-for.html' title='Apple TV: A perfect replacement for digital picture frames'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-1385074653191789345</id><published>2010-11-09T17:02:00.002-06:00</published><updated>2010-11-09T17:05:10.637-06:00</updated><title type='text'>PHP5 References Explained Visually</title><content type='html'>If you are having trouble wrapping your head around PHP5 References, especially how objects are now handled, have a look at this handy guide.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.phpinsider.com/download/PHP5RefsExplained.pdf"&gt;PHP 5 References Explained Visually&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-1385074653191789345?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/1385074653191789345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=1385074653191789345' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1385074653191789345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1385074653191789345'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2010/11/php5-references-explained-visually.html' title='PHP5 References Explained Visually'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-8112210645850131083</id><published>2010-09-08T15:48:00.003-05:00</published><updated>2010-09-08T15:51:54.255-05:00</updated><title type='text'>Compress/GZip CSS the easy way with Apache and PHP</title><content type='html'>So you need a way to automatically compress CSS and GZIP to the browser without any complicated work on the development end? This script is for you.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.ohrt.com/download/compress.php.txt"&gt;http://www.ohrt.com/download/compress.php.txt&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just access the .css files from the browser as per usual.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-8112210645850131083?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/8112210645850131083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=8112210645850131083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8112210645850131083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8112210645850131083'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2010/09/compressgzip-css-easy-way-with-apache.html' title='Compress/GZip CSS the easy way with Apache and PHP'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-3039712290681093691</id><published>2010-07-19T19:54:00.002-05:00</published><updated>2010-07-19T20:01:43.800-05:00</updated><title type='text'>First thoughts on Droid</title><content type='html'>So my wife got a Droid. Not because she even wanted one, but because she was tired of messaging on her ancient Motorola Razor. She was going to get a non-droid phone on the cheapo data plan, but she eventually settled on a Droid, mainly for me to tinker with.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, my first impressions are not so good. I've been using the iPhone for a few years, and the inconsistency on this phone just baffles me. The first thing I wanted to do was unlock the phone. I couldn't even figure that out, until I saw the sales guy slide his finger over the green button on the screen. There was absolutely no visual cue of how that worked. Then as I started browsing through the pages of icons, it really reminded me of the smartphones I tried before the iPhone was around: inconsistent and clumsy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm not even going to discuss features, because to me they really don't matter as much as the user experience. Bottom line, the user experience has to be good, and Apple has nailed that down. I could go on, but I found a good article that pretty much sums it all up.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://scottworldblog.wordpress.com/2010/03/12/iphone-vs-droid/"&gt;http://scottworldblog.wordpress.com/2010/03/12/iphone-vs-droid/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-3039712290681093691?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/3039712290681093691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=3039712290681093691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/3039712290681093691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/3039712290681093691'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2010/07/first-thoughts-on-droid.html' title='First thoughts on Droid'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-2173987372559262240</id><published>2010-06-10T11:13:00.005-05:00</published><updated>2010-06-10T11:18:07.893-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google background image wallpaper remove'/><title type='text'>Remove the google background image</title><content type='html'>It seems Google has decided to put a background image on its home page, without your consent. It will probably go away by tomorrow, but you can get rid of it by using the secure version of the google site (and consequently, get your search results securely.)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Visit here: &lt;a href="https://www.google.com/"&gt;https://www.google.com/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That will get rid of the annoying background image, at least for now.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-2173987372559262240?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/2173987372559262240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=2173987372559262240' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/2173987372559262240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/2173987372559262240'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2010/06/get-rid-of-google-background-image.html' title='Remove the google background image'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-42894484065177143</id><published>2010-05-10T11:03:00.013-05:00</published><updated>2010-05-10T17:00:24.818-05:00</updated><title type='text'>Everything-in-a-box MAME Arcade Cabinet</title><content type='html'>&lt;span class="Apple-style-span"   style="  ;font-family:verdana, sans-serif;font-size:small;"&gt;This is a project started around 2004, and sat for 5 years, then I finally finished up the cabinet this past year. So what is it? MAME (Multi Arcade Machine Emulator) is an arcade emulation system. &lt;/span&gt;&lt;span class="Apple-style-span"  style=" ;font-family:verdana, sans-serif;"&gt;The machine can play over 6,000 old-school arcade games (Pac-Man, Donkey Kong, Centipede... yeah all of them) true to their original form, and also many retro game consoles such as Atari 2600, Nintendo, Super Nintendo, Nintendo 64, SEGA Genesis, Playstation, etc.&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_1w2YP-_RXfs/S-guscGFuVI/AAAAAAAAACM/6Tmlu_NlGaQ/s1600/mame_cabinet.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://1.bp.blogspot.com/_1w2YP-_RXfs/S-guscGFuVI/AAAAAAAAACM/6Tmlu_NlGaQ/s320/mame_cabinet.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469673088432322898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_1w2YP-_RXfs/S-gutjNl5oI/AAAAAAAAACk/0gAbywJHqDQ/s1600/under_cp_3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_1w2YP-_RXfs/S-gutjNl5oI/AAAAAAAAACk/0gAbywJHqDQ/s320/under_cp_3.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469673107522709122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_1w2YP-_RXfs/S-gutMleDQI/AAAAAAAAACc/VVErOFdUVok/s1600/under_cp_2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_1w2YP-_RXfs/S-gutMleDQI/AAAAAAAAACc/VVErOFdUVok/s320/under_cp_2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469673101448842498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_1w2YP-_RXfs/S-gusmS2fcI/AAAAAAAAACU/A-Gvf6oe34g/s1600/under_cp_1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_1w2YP-_RXfs/S-gusmS2fcI/AAAAAAAAACU/A-Gvf6oe34g/s320/under_cp_1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469673091170205122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_1w2YP-_RXfs/S-huRFFu8rI/AAAAAAAAAFk/sJdfrekFDso/s1600/DSCF0031.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_1w2YP-_RXfs/S-huRFFu8rI/AAAAAAAAAFk/sJdfrekFDso/s320/DSCF0031.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742987144524466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_1w2YP-_RXfs/S-huQzsAO6I/AAAAAAAAAFc/W7saKga1mNg/s1600/arcade+043.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_1w2YP-_RXfs/S-huQzsAO6I/AAAAAAAAAFc/W7saKga1mNg/s320/arcade+043.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742982473202594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1w2YP-_RXfs/S-huQZgA66I/AAAAAAAAAFU/mAkgWrwW3w8/s1600/arcade+042.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_1w2YP-_RXfs/S-huQZgA66I/AAAAAAAAAFU/mAkgWrwW3w8/s320/arcade+042.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742975443594146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1w2YP-_RXfs/S-huPsAX-II/AAAAAAAAAFM/bf38WFVW0VU/s1600/arcade+041.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_1w2YP-_RXfs/S-huPsAX-II/AAAAAAAAAFM/bf38WFVW0VU/s320/arcade+041.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742963231291522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_1w2YP-_RXfs/S-huEOSbLUI/AAAAAAAAAFE/99_QuippiHI/s1600/arcade+040.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_1w2YP-_RXfs/S-huEOSbLUI/AAAAAAAAAFE/99_QuippiHI/s320/arcade+040.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742766275374402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_1w2YP-_RXfs/S-huDN3vBNI/AAAAAAAAAE0/y0mK18Yu558/s1600/arcade+038.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_1w2YP-_RXfs/S-huDN3vBNI/AAAAAAAAAE0/y0mK18Yu558/s320/arcade+038.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742748983559378" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_1w2YP-_RXfs/S-huCmcCnfI/AAAAAAAAAEs/iHBsVw1yOKI/s1600/arcade+037.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_1w2YP-_RXfs/S-huCmcCnfI/AAAAAAAAAEs/iHBsVw1yOKI/s320/arcade+037.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742738398420466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_1w2YP-_RXfs/S-ht_8J9z5I/AAAAAAAAAEk/x-AGSkzlUE0/s1600/arcade+036.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_1w2YP-_RXfs/S-ht_8J9z5I/AAAAAAAAAEk/x-AGSkzlUE0/s320/arcade+036.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742692688580498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_1w2YP-_RXfs/S-ht1Kwoc8I/AAAAAAAAAEc/SLc-k8gu0qU/s1600/arcade+035.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_1w2YP-_RXfs/S-ht1Kwoc8I/AAAAAAAAAEc/SLc-k8gu0qU/s320/arcade+035.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742507630293954" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_1w2YP-_RXfs/S-ht0-hnCKI/AAAAAAAAAEU/wKROoi5t8kQ/s1600/arcade+034.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_1w2YP-_RXfs/S-ht0-hnCKI/AAAAAAAAAEU/wKROoi5t8kQ/s320/arcade+034.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742504346060962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_1w2YP-_RXfs/S-htzkMFCeI/AAAAAAAAAEE/Ijtkn0ABNJI/s1600/arcade+032.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_1w2YP-_RXfs/S-htzkMFCeI/AAAAAAAAAEE/Ijtkn0ABNJI/s320/arcade+032.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742480096561634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1w2YP-_RXfs/S-htzDtJYlI/AAAAAAAAAD8/OIy-tJB3pDg/s1600/arcade+031.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_1w2YP-_RXfs/S-htzDtJYlI/AAAAAAAAAD8/OIy-tJB3pDg/s320/arcade+031.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742471376888402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_1w2YP-_RXfs/S-hthid-StI/AAAAAAAAADk/6CwGiPrX8Zg/s1600/arcade+028.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_1w2YP-_RXfs/S-hthid-StI/AAAAAAAAADk/6CwGiPrX8Zg/s320/arcade+028.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742170397100754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_1w2YP-_RXfs/S-hthFJMSfI/AAAAAAAAADc/vQdkjMuuUa8/s1600/arcade+027.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_1w2YP-_RXfs/S-hthFJMSfI/AAAAAAAAADc/vQdkjMuuUa8/s320/arcade+027.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742162525309426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1w2YP-_RXfs/S-htgW5g7PI/AAAAAAAAADU/so8-FADs200/s1600/arcade+026.jpg"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1w2YP-_RXfs/S-htgW5g7PI/AAAAAAAAADU/so8-FADs200/s1600/arcade+026.jpg"&gt;&lt;img style="text-align: left;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; width: 320px; height: 240px; " src="http://4.bp.blogspot.com/_1w2YP-_RXfs/S-htgW5g7PI/AAAAAAAAADU/so8-FADs200/s320/arcade+026.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5469742150111522034" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:verdana, sans-serif;"&gt;This is a custom built cabinet (started with a plan found on the internet, I forget where) and custom design control panel. Wells Garner 27" monitor with VGA out, trackball/spinner, 4 8-way joys. Happ arcade controls, spinner, keyboard, trackball boards and Ultimarc Opti-PAC, ArcadeVGA, IPac 4 Interface, LED Harness, HAPP 3" trackball. The joy in the middle is 4-way, with asteroid button layout around it. Buttons on the sides for pinball simulators. It's a beast, and a blast to play. Panel disconnects with a couple latches. Everything starts up/shuts down with one button (computer, marquee, monitor, etc.)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-42894484065177143?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/42894484065177143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=42894484065177143' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/42894484065177143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/42894484065177143'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2010/05/everything-in-box-mame-cabinet.html' title='Everything-in-a-box MAME Arcade Cabinet'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_1w2YP-_RXfs/S-guscGFuVI/AAAAAAAAACM/6Tmlu_NlGaQ/s72-c/mame_cabinet.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-8911352640124219639</id><published>2010-03-13T16:07:00.002-06:00</published><updated>2010-03-14T22:06:52.606-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>iPad sales on Amazon</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_1w2YP-_RXfs/S5wMwcdLufI/AAAAAAAAACE/bNin2vgWKtU/s1600-h/kindle_ipad.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 189px;" src="http://3.bp.blogspot.com/_1w2YP-_RXfs/S5wMwcdLufI/AAAAAAAAACE/bNin2vgWKtU/s320/kindle_ipad.png" alt="" id="BLOGGER_PHOTO_ID_5448243675623307762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So do you think we'll be seeing this? (take note of the text below the kindle)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-8911352640124219639?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/8911352640124219639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=8911352640124219639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8911352640124219639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8911352640124219639'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2010/03/so-do-you-think-well-be-seeing-this.html' title='iPad sales on Amazon'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_1w2YP-_RXfs/S5wMwcdLufI/AAAAAAAAACE/bNin2vgWKtU/s72-c/kindle_ipad.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-2938263607140393812</id><published>2010-02-02T11:33:00.001-06:00</published><updated>2010-02-02T11:34:29.771-06:00</updated><title type='text'>Where the iPad is going</title><content type='html'>I think this guy sums it up nicely.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://digg.com/d31HCrc"&gt;I need to talk to you about computers.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-2938263607140393812?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/2938263607140393812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=2938263607140393812' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/2938263607140393812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/2938263607140393812'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2010/02/where-ipad-is-going.html' title='Where the iPad is going'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-7541532514999053132</id><published>2010-01-28T10:59:00.009-06:00</published><updated>2010-01-28T12:07:03.527-06:00</updated><title type='text'>Initial thoughts about the Apple iPad</title><content type='html'>The hype storm is over, the iPad has been introduced. In a nutshell, you can say it was underwhelming. We didn't see anything that we haven't seen before. Is the iPad as "magical" as they claim it to be? The gut reaction is no, but it may be more than you think.&lt;br /&gt;&lt;br /&gt;We can safely say that the iPhone stole the iPad thunder. The iPhone was the introduction of a GUI that was designed for touch-screen, and the iPad merely carried this idea over to a bigger device. If the iPhone had not existed before, the iPad would have had the same revolutionary first-impressions that the iPhone had. But there is another key ingredient to the whole concept of the iPad.&lt;br /&gt;&lt;br /&gt;For decades, desktop computers have had an interface that is designed for keyboards and mice. There are files and folders, and a pointing cursor that moves around the screen. You can have layers of windows running any number of processes. This is all fine and dandy when you have ample screen real-estate and processing power.&lt;br /&gt;&lt;br /&gt;Netbooks and PC tablets have not changed this concept one bit. The GUI is still based on keyboard-mouse entry. There have been attempts to marry the touch-screen idea to this GUI, but with limited success.&lt;br /&gt;&lt;br /&gt;Smartphones (before the iPhone) still tried to carry the same concept to the phones. Files, folders, windows, etc. The screen got so small they had to use a stylus to keep it functional. It was to say the least, difficult to use.&lt;br /&gt;&lt;br /&gt;The iPhone changed all of that. The notion of files and folders was thrown out. Visible layers of windows were also thrown out. Instead, a whole new GUI was designed with the fingers in mind. A single window is presented at any one time, with instinctive visual cues as you slid between them. The iPhone made it easy for anyone to pick up and use the phone, they "just got it."&lt;br /&gt;&lt;br /&gt;Now bring in the iPad. What the iPad accomplishes is mobile desktop power coupled with the iPhone touch-screen interface. Now that we have more screen real-estate we can do a few more things, such as split-pane views and fancier menus. But for the most part, the concepts are the same. Everything is designed with the fingers in mind. No stylus, no mouse or keyboard necessary. That makes specific tasks (email, web, video, etc.) quick and easy, on a device smaller than most netbooks.&lt;br /&gt;&lt;br /&gt;So what does that mean? I think this ushers in a new era of how we think about computing. There will always be a place for keyboard-mouse computing for more complicated tasks (ie. design/illustration, video editing, desktop publishing.) But for the everyday use and mobility, this is a big step toward a new way of thinking. My dad for instance, has never used a computer. He is just not interested in learning it all. However, I think he could pick up an iPad and "get it" very quickly. No files/folders/styles/keyboard/mice things to deal with. Just intuitive interactive elements that do what you expect when you touch them.&lt;br /&gt;&lt;br /&gt;You recall the funny tech-support stories about people trying to use the mouse as a foot pedal, or tapping the mouse against the screen trying to "click" on something. You laugh, but maybe this was a big clue into computing intuition, and how it should have worked in the first place. Now that we have the technology to do it, the iPad is simply leading the way.&lt;br /&gt;&lt;br /&gt;Of course, the first version of any device is always going to have shortcomings. It just takes time for things to work themselves out. I have no clue why Apple skipped out on a camera, but you can bet that iPad 2 will have one. You can also bet that iPhone OS 4.0 will have multitasking. These things just come with time.&lt;br /&gt;&lt;br /&gt;The importance of the iPad is an intuitive finger-controlled interface married to a mobile device with the power/size of a desktop, without the typical complexities of desktop computing as we know it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-7541532514999053132?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/7541532514999053132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=7541532514999053132' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/7541532514999053132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/7541532514999053132'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2010/01/initial-thoughts-about-apple-ipad.html' title='Initial thoughts about the Apple iPad'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-4567934914588324708</id><published>2010-01-26T14:20:00.002-06:00</published><updated>2010-01-26T14:26:42.492-06:00</updated><title type='text'>One iPhone 4.0 wish</title><content type='html'>I've seen a lot of feature wishes, but one I have not seen that would be really useful. That would be backup over Wi-Fi. But more precisely, give me the option to backup when I plug in the charger.&lt;br /&gt;&lt;br /&gt;My phone rarely gets backed up because I'm not in front of my Mac every day (it sits in the basement.) I typically use my iPhone or netbook upstairs for daily use. I do however, charge my iPhone every night.&lt;br /&gt;&lt;br /&gt;Backups over Wi-Fi would be a battery drainer, so it would be preferable to happen while plugged in. Therefore when I plug in the charger, it could pop up an option to backup the phone over Wi-Fi. Then the phone gets backed up and synced every night, without the hassle of visiting the dock.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-4567934914588324708?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/4567934914588324708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=4567934914588324708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/4567934914588324708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/4567934914588324708'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2010/01/one-iphone-40-wish.html' title='One iPhone 4.0 wish'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-7341635054307411878</id><published>2010-01-24T11:56:00.018-06:00</published><updated>2010-04-16T09:33:12.326-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delegates'/><category scheme='http://www.blogger.com/atom/ns#' term='sdk'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Cocoa and Delegates</title><content type='html'>Delegates are probably one of the toughest concepts for iPhone/OSX developer newcomers to grasp. I'm going to try to keep it simple, and demonstrate how to build your own delegate protocol into your classes.&lt;br /&gt;&lt;br /&gt;A delegate is merely a design pattern in Objective-C. Simply put, it provides a way for objects to "listen" for interesting things happening in your object and act on them &lt;i&gt;without your object knowing anything about the object(s) listening&lt;/i&gt;. Delegates are used heavily in the Cocoa environment. Most often you will see delegates used to trigger methods on a UIViewController, although they can be implemented on anything.&lt;br /&gt;&lt;br /&gt;Let's think for a moment what type of problem this solves. Let's say we have a UIViewController which has a UITableView in its view. When a table row is tapped, we want to slide a new view onto the screen. We don't want UITableView handling this task, so how do we accomplish this?&lt;br /&gt;&lt;br /&gt;The UIViewController needs to handle the new view (thus it's name.) So the UITableView needs to somehow inform the UIViewController that a row was tapped so it can take action. Therefore, the UIViewController needs to be the delegate of the UITableView. So we need to setup two things: We need to inform the UITableView what it's delegate object is, and we need to inform the delegate object what delegate protocol(s) it conforms to.&lt;br /&gt;&lt;br /&gt;We begin by setting the delegate property of the UITableView to the UIViewController object. If you are using Interface Builder, you can simply connect the delegate  property of the UITableView to the UIViewController (typically the File's Owner.) Otherwise you might handle this in the viewDidLoad{} of the UIViewController,  something like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;self.tableView.delegate = self;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You will also want to tell the view controller that it  understands the UITableViewDelegate protocol, so you would put this in the UIViewController  .h interface declaration:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;@interface MyViewController : UIViewController&lt;br /&gt;&amp;lt;UITableViewDelegate&amp;gt; {}&lt;/pre&gt;(Note: if your view controller is an extension of UITableViewController, you will not need to declare the UITableViewDelegate protocol.)&lt;br /&gt;&lt;br /&gt;And you are set! Now when you implement a method of the UITableViewDelegate in the UIViewController, this method will trigger when something happens in the table view for that delegate method. So for instance, you put this in your UIViewController .m file:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;- (void)tableView:(UITableView *)tableView&lt;br /&gt;didSelectRowAtIndexPath:(NSIndexPath *)indexPath {&lt;br /&gt;// push the new view onto the stack here&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;When a row is selected in the table, this method will get triggered.&lt;br /&gt;&lt;br /&gt;So now begs the question, how do you add your own delegate protocol to your custom classes? Here is an example. Let's say you want to be able to trigger methods of other classes when interesting things happen in your class. The first thing you need to do is define what delegate methods are available to the delegate object. You would first put something like this at the top of your class .h file, above the implementation declaration:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@protocol MyCustomClassDelegate &amp;lt;NSObject&amp;gt;;&lt;br /&gt;- (void)didClickDone:(UIButton *)button;&lt;br /&gt;@optional&lt;br /&gt;-(void)didClickCancel:(UIButton *)button;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Where &lt;span style="font-weight: bold;"&gt;MyCustomClassDelegate&lt;/span&gt; is the name of your class delegate protocol (your class name appended with "Delegate"), and &lt;span style="font-weight: bold;"&gt;didClickDone&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;didClickCancel&lt;/span&gt; are the names of your two delegate methods. You can add as many methods as you wish. You not need to implement these methods in your class, that is up to the delegate to do. Notice the line with&lt;span style="font-weight: bold;"&gt; @optional&lt;/span&gt;. This means that the following methods are optional for the delegate to implement.&lt;br /&gt;&lt;br /&gt;Now we need to setup the delegate property:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@interface MyCustomClass : NSObject {&lt;br /&gt;id &amp;lt;MyCustomClassDelegate&amp;gt; delegate;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@property (nonatomic, assign)&lt;br /&gt;id &amp;lt;MyCustomClassDelegate&amp;gt; delegate;&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;And finally in the .m file, synthesize the delegate:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@synthesize delegate;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note we do not need to release the delegate in the dealloc method, as this is not a retained object, it is just an assigned id.&lt;br /&gt;&lt;br /&gt;Ok, for the final part of your class, you need to fire off the delegate method when something interesting happens. For instance, someone clicks the done button. In your IBAction for the done button, you do just that:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-(IBAction)done:(UIButton *)button {&lt;br /&gt;[self.delegate didClickDone:button];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And so on, for each delegate method. Ok, that is it for the class. Now, for the delegate class. To be the delegate of MyCustomClass, you need to declare that you implement the MyCustomClassDelegate protocol (.h file):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@interface MyViewController:&lt;br /&gt;UIViewController &amp;lt;MyCustomClassDelegate&amp;gt; { }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And then, we implement the delegate methods (.m file):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-(void)didClickDone:(UIButton *)button {&lt;br /&gt;// do something here!&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;One last thing to note, a class can be the delegate for several objects, just comma-separate the delegates:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@interface MyViewController:&lt;br /&gt;UIViewController &amp;lt;MyCustomClassDelegate,SomeOtherDelegate&amp;gt; { }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I hope that helps clear up delegates a bit! Please leave your comments below.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-7341635054307411878?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/7341635054307411878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=7341635054307411878' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/7341635054307411878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/7341635054307411878'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2010/01/cocoa-and-delegates.html' title='Cocoa and Delegates'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-1982539172441620456</id><published>2010-01-02T22:19:00.005-06:00</published><updated>2010-01-02T23:29:49.060-06:00</updated><title type='text'>Winning one million from the casino, guaranteed (nearly)</title><content type='html'>So you want to beat the casino for a cool million. Ok, here is a system on the roulette table. It's theoretical, it will take awhile, and you had better have some deep pockets. Here is how it works.&lt;br /&gt;&lt;br /&gt;1) bet $1 on red (or black, whatever you prefer)&lt;br /&gt;2) if you lose, bet $2 on red/black&lt;br /&gt;3) if you lose, bet $4 on red/black&lt;br /&gt;... continue this pattern until you win...&lt;br /&gt;4) you win $1. Start over on step 1.&lt;br /&gt;&lt;br /&gt;Continue the above step system 1,000,000 times. At the end, you should end up $1,000,000 ahead. Now there is a couple of things to consider. Although it is highly unlikely you will win/lose more than, say, 20 times in a row, it is quite possible to happen in 1,000,000 runs of the above system. In that case, you could be wagering a lot once in a while. In a computer simulation of running the system 1000 times, There was a bet of 134 million touched. That's quite a bit to hope for a dollar.&lt;br /&gt;&lt;br /&gt;So to be able to run this system, you have to have DEEP pockets. That, and find a casino that will let you play this way. Good luck with that :)&lt;br /&gt;&lt;br /&gt;From the simulation, here is the breakdown of wagers, # of times encountered, and % chances of happening:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;wager: $1 # of times: 47363291 (47.363291000%)&lt;br /&gt;wager: $2 # of times: 24927507 (24.927507000%)&lt;br /&gt;wager: $4 # of times: 13121947 (13.121947000%)&lt;br /&gt;wager: $8 # of times: 6908653 (6.908653000%)&lt;br /&gt;wager: $16 # of times: 3637176 (3.637176000%)&lt;br /&gt;wager: $32 # of times: 1915725 (1.915725000%)&lt;br /&gt;wager: $64 # of times: 1007786 (1.007786000%)&lt;br /&gt;wager: $128 # of times: 528916 (0.528916000%)&lt;br /&gt;wager: $256 # of times: 278835 (0.278835000%)&lt;br /&gt;wager: $512 # of times: 147026 (0.147026000%)&lt;br /&gt;wager: $1024 # of times: 77406 (0.077406000%)&lt;br /&gt;wager: $2048 # of times: 40696 (0.040696000%)&lt;br /&gt;wager: $4096 # of times: 21300 (0.021300000%)&lt;br /&gt;wager: $8192 # of times: 11167 (0.011167000%)&lt;br /&gt;wager: $16384 # of times: 5988 (0.005988000%)&lt;br /&gt;wager: $32768 # of times: 3215 (0.003215000%)&lt;br /&gt;wager: $65536 # of times: 1609 (0.001609000%)&lt;br /&gt;wager: $131072 # of times: 840 (0.000840000%)&lt;br /&gt;wager: $262144 # of times: 417 (0.000417000%)&lt;br /&gt;wager: $524288 # of times: 246 (0.000246000%)&lt;br /&gt;wager: $1048576 # of times: 126 (0.000126000%)&lt;br /&gt;wager: $2097152 # of times: 67 (0.000067000%)&lt;br /&gt;wager: $4194304 # of times: 35 (0.000035000%)&lt;br /&gt;wager: $8388608 # of times: 13 (0.000013000%)&lt;br /&gt;wager: $16777216 # of times: 7 (0.000007000%)&lt;br /&gt;wager: $33554432 # of times: 6 (0.000006000%)&lt;br /&gt;wager: $67108864 # of times: 4 (0.000004000%)&lt;br /&gt;wager: $134217728 # of times: 1 (0.000001000%)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-1982539172441620456?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/1982539172441620456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=1982539172441620456' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1982539172441620456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1982539172441620456'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2010/01/winning-one-million-from-casino.html' title='Winning one million from the casino, guaranteed (nearly)'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-5954496155435167296</id><published>2009-12-17T10:38:00.003-06:00</published><updated>2009-12-17T10:43:12.134-06:00</updated><title type='text'>What will happen in 2110?</title><content type='html'>Here is a very interesting article posting predictions for year 2000 made in 1900. Many predictions were quite good!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bunchofnerds.com/2008/10/retro/predictions-for-the-year-2000-from-the-year-1900/"&gt;http://bunchofnerds.com/2008/10/retro/predictions-for-the-year-2000-from-the-year-1900/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So lets start a new prediction thread. What do YOU think the world will consist of in 2110? Comments will be open until the end of 2010.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-5954496155435167296?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/5954496155435167296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=5954496155435167296' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5954496155435167296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5954496155435167296'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/12/what-will-happen-in-2110.html' title='What will happen in 2110?'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-5835480062442919399</id><published>2009-11-12T11:08:00.009-06:00</published><updated>2009-11-12T11:47:57.361-06:00</updated><title type='text'>AJAX and PHP sessions</title><content type='html'>One thing that trips up AJAX development is how to persist your PHP session through your AJAX calls. In a browser, the session persists through a cookie that passes the session id upon each request. However with an AJAX call, the browser cookies are not passed and the session is lost.&lt;br /&gt;&lt;br /&gt;There are a couple of easy ways around this. First, if your AJAX library supports cookies, you can just set the PHP session id cookie before the call. If you don't have cookie support, then the following "manual" method works quite well.&lt;br /&gt;&lt;br /&gt;What you will want to do is pass the session id as a POST or GET variable in your AJAX request. We'll call our variable name "sid".&lt;br /&gt;&lt;br /&gt;Here is a jQuery example for passing the sid through as a POST value (in a PHP script):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;code&gt;$.post("test.php", { sid: "&amp;lt;?php echo session_id(); ?&amp;gt;" } );&lt;/code&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This will POST the current session id through the form. Next on the PHP side, you must set the session id with this posted value:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;// set session to value from ajax post&lt;br /&gt;session_id($_POST['sid']);&lt;br /&gt;// we now have $_SESSION data!&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;As for security, be aware that you don't have the same restrictions that come with cookies (domain, date, etc.)  so once you pass the session id to javascript, be careful what can be manipulated through javascript code. It's pretty much the same as being aware of javascript getting/setting cookie values themselves.&lt;br /&gt;&lt;br /&gt;Hope that helps!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-5835480062442919399?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/5835480062442919399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=5835480062442919399' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5835480062442919399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5835480062442919399'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/11/ajax-and-php-sessions.html' title='AJAX and PHP sessions'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-4688514538801842722</id><published>2009-10-24T15:04:00.005-05:00</published><updated>2009-11-06T15:45:04.623-06:00</updated><title type='text'>Being a winning online poker player</title><content type='html'>You know you are capable of playing great poker, but you continuously lose your bankroll playing online poker. How do you get over this hurdle? What is the secret? There are two important factors.&lt;br /&gt;&lt;br /&gt;Factor 1: Don't play on tilt&lt;br /&gt;&lt;br /&gt;Winning poker is not about focusing on how much you've won or lost. It's how you handle losing. How often do you get bad beat, then jump right back in and lose more and more? How often do you make a big win, only to lose it all over the course of days or weeks?&lt;br /&gt;&lt;br /&gt;So to overcome factor 1: If you get a bad beat or get on a losing streak, force yourself to take a break before playing again. How long or what this is depends on what it takes to get your mind free of the past. Maybe it's a nap. Maybe it's a walk around the house. Maybe it's a jog around the block. The important element is that you are not playing the next game with the predisposition of steaming. Get over it first, then continue playing.&lt;br /&gt;&lt;br /&gt;Factor 2: Bankroll management&lt;br /&gt;&lt;br /&gt;Losing is a fact of the game, it will happen. To stay alive, you must manage your bankroll. This sounds easy, but it can take a considerable amount of discipline. If you don't want to buy in again, you *must* manage your bankroll, no matter how good you are.  A rule of thumb for sit-and-goes and MTTs: Take the buy-in multiplied by # of players. If that amount is greater than your bankroll, move down.&lt;br /&gt;&lt;br /&gt;If you get on a losing streak, just stick to the plan. Take a break, and move down in stakes until you can recover.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Follow these rules, and the only way you can lose is by playing bad poker. Hopefully you've gotten past that part :) Good Luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-4688514538801842722?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/4688514538801842722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=4688514538801842722' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/4688514538801842722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/4688514538801842722'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/10/being-winning-online-poker-player.html' title='Being a winning online poker player'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-1224744128198695719</id><published>2009-08-09T16:12:00.004-05:00</published><updated>2009-08-24T12:06:05.311-05:00</updated><title type='text'>Basecamp PHP API</title><content type='html'>I needed a &lt;span style="font-style:italic;"&gt;complete&lt;/span&gt; PHP class for the Basecamp API with a project I'm working on at REBEL. Finding nothing that would fit the bill, I wrote one.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/basecamp-php-api/"&gt;http://code.google.com/p/basecamp-php-api/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-1224744128198695719?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/1224744128198695719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=1224744128198695719' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1224744128198695719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1224744128198695719'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/08/basecamp-php-api.html' title='Basecamp PHP API'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-5108090111253209125</id><published>2009-07-26T15:58:00.015-05:00</published><updated>2009-07-26T16:27:31.795-05:00</updated><title type='text'>A rant on PHP, quotes and variables</title><content type='html'>Here are 3 ways to display some text with some PHP variables:&lt;br /&gt;&lt;br /&gt;single quotes interspersed with vars:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;echo 'My name is ' . $user&lt;br /&gt;. ' and I eat ' . $food['favorite'] . '.';&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;double quotes interspersed with vars:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;echo "My name is " . $user&lt;br /&gt;. " and I eat " . $food['favorite'] . ".";&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;double quotes with embedded vars:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;echo "My name is {$user} and I eat {$food['favorite']}.";&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The vast majority of PHP code I come across uses the first two methods, breaking in and out of quotes for each variable. IMHO the third way much easier to read and maintain. Granted there are slight performance differences between them, but not enough to be concerned about. I think the reason that version 3 isn't so popular is because most PHP developers don't learn this type of curly-brace syntax (enabling you to embed complex variables into quoted strings) right away, and therefore rarely think to use it.&lt;br /&gt;&lt;br /&gt;Of course you can take things a step further with sprintf and really keep things tidy. Let's take a SQL query for a common example.&lt;br /&gt;&lt;br /&gt;Here is the "messy" way:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$sql = "select * from MYTABLE where id=" . (int)$info['id'] . " and firstname = '" . mysql_real_escape_string($info['firstname']) . "' limit " . (int)$limit;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And the much cleaner way:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$sql = sprintf("select *&lt;br /&gt;                from MYTABLE&lt;br /&gt;                where id=%d&lt;br /&gt;                and firstname = '%s'&lt;br /&gt;                limit %d",&lt;br /&gt;        (int)$info['id'],&lt;br /&gt;        mysql_real_escape_string($info['firstname']),&lt;br /&gt;        (int)$limit&lt;br /&gt;        );&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I hope I brought some ideas to light, happy coding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-5108090111253209125?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/5108090111253209125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=5108090111253209125' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5108090111253209125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5108090111253209125'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/07/rant-on-php-quotes-and-variables.html' title='A rant on PHP, quotes and variables'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-7002586884666926269</id><published>2009-05-14T11:38:00.005-05:00</published><updated>2009-05-14T11:45:58.019-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone sdk'/><category scheme='http://www.blogger.com/atom/ns#' term='xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Camera image orientation</title><content type='html'>I was having a confusing problem where images taken from the iPhone camera were being displayed in the wrong orientation. I would take a photo in portrait and save the data to disk. Later when I retrieved the photo it would show up rotated 90 degrees.&lt;br /&gt;&lt;br /&gt;The iPhone knows what orientation a photo is taken, and this orientation depends on how the camera is being held when you snap the photo. You can get the orientation value on a UIImage from the property imageOrientation.&lt;br /&gt;&lt;br /&gt;When you save the photo, it is possible that this information could get lost, depending on the way you save it. If it does get lost, the UIImageView will assume the photo was taken as a left-side landscape photo, and display it with that orientation.&lt;br /&gt;&lt;br /&gt;I ran into a problem when trying to save the camera image with UIImagePNGRepresentation(). For some reason this loses the orientation info. I switched to UIImageJPEGRepresentation() and all is well now.&lt;br /&gt;&lt;br /&gt;So basically if you run into the problem, you have 2 choices: Be sure you use a format that preserves orientation data, or rotate the UIImage data directly before saving it to a file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-7002586884666926269?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/7002586884666926269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=7002586884666926269' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/7002586884666926269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/7002586884666926269'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/05/camera-image-orientation.html' title='Camera image orientation'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-6592830370746426272</id><published>2009-05-13T20:46:00.008-05:00</published><updated>2009-05-13T21:02:02.221-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone sdk'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Rotating view around arbitrary point the easy way</title><content type='html'>I have a UIImageView that I want to rotate around a given point. By default, the layer will rotate around the center of the UIImageView. Trying to change this anchor point involves a bit of work, either move at the beginning and reposition all the view elements, or translating the view, rotating, and translating back. The last option works fine, unless you are trying to use core animation to smoothly rotate the view.&lt;br /&gt;&lt;br /&gt;I found out a much easier solution to the whole problem. You could call it a workaround, but it works well without disturbing the view you want rotated.&lt;br /&gt;&lt;br /&gt;Basically, you create a new UIView. Place the center point where you want the rotation to occur. Change the size of the view so that the view you want rotated will fit inside. Make your view (you want rotated) a subview of the new view. Now, just rotate the new view, and your subview will be rotated correctly.&lt;br /&gt;&lt;br /&gt;Example: lets say we have a UIImageView that is 320x480 (the size of the whole iPhone screen). We want it to rotate from the bottom center instead of its middle. Create a new UIView that is 0,0,320,960. This is basically double the height of the screen, positioned so the bottom half is off the screen, which places the center point right where we want it. Now place your UIImageView inside the new UIView in the top half (visible on the screen.) Now when you rotate the UIView, it will pivot on the bottom center of the screen, and your UIImageView will rotate along with it, as expected.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-6592830370746426272?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/6592830370746426272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=6592830370746426272' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6592830370746426272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6592830370746426272'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/05/rotating-view-around-arbitrary-point.html' title='Rotating view around arbitrary point the easy way'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-479811730289031064</id><published>2009-05-01T09:55:00.005-05:00</published><updated>2009-05-18T11:55:37.132-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>OS X "burning" image to USB flash drive</title><content type='html'>I recently downloaded an Ubuntu image for netbooks, and I needed to install this onto a USB flash drive so I could boot it. This is pretty simple with OS X and Disk Utility and dd from the command line. Be sure your flash drive is large enough to hold the disk image.&lt;br /&gt;&lt;br /&gt;* Plug the flash drive into a USB port and launch Disk Utility.&lt;br /&gt;* Select the flash drive and press apple+i to bring up the info&lt;br /&gt;* remember the device id, it will be diskN where N is a number, such as disk4&lt;br /&gt;* select the volume (not the device) and click unmount.&lt;br /&gt;* open a terminal window, and type:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo dd if=/path/to/file.img of=/dev/disk4 bs=1024&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Be sure to use your path to the image file, and the device id you got from disk utility in place of "disk4". You can drag the .img file into the terminal window if you don't want to type the full path to it.&lt;br /&gt;&lt;br /&gt;Now wait a bit for the image to be written. When its done you will get something similar to this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;969568+0 records in&lt;br /&gt;969568+0 records out&lt;br /&gt;992837632 bytes transferred in 521.666371 secs (1903204 bytes/sec)&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-479811730289031064?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/479811730289031064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=479811730289031064' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/479811730289031064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/479811730289031064'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/05/burning-img-to-usb-flash-drive.html' title='OS X &quot;burning&quot; image to USB flash drive'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-9145026484446765419</id><published>2009-04-01T16:08:00.007-05:00</published><updated>2009-04-01T17:00:21.893-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hard disk'/><category scheme='http://www.blogger.com/atom/ns#' term='pc'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='amiga'/><title type='text'>Prediction: First Consumer Petabyte Hard Drive?</title><content type='html'>The first hard drive I owned came with my Amiga 1200, circa 1990. It held 40 megabytes of data, and I believe it was a $500 option. Yes, I said option. The computer happily ran on floppy disks alone, if you so desired. You had to load the OS off of floppy first, then load your programs from other disks. The A1200 came with 2MB of ram, but I loaded it up with an additional 16MB of RAM, costing a healthy $800. That is just sick.&lt;br /&gt;&lt;br /&gt;Back to the subject of hard drives. Here is a rough time line for the consumer hard drive. By "consumer", I mean something that fits in a desktop PC form factor that is in the price range for an average consumer.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;1980  5MB  ~$1,000.00&lt;br /&gt;1992  1GB  ~$1,000.00  (1 gigabyte  ~ 1000 megabyte)&lt;br /&gt;2007  1TB  ~$300.00    (1 terabyte  ~ 1000 gigabyte, or 1 million megabyte)&lt;br /&gt;????  1PB  ????        (1 petabyte  ~ 1000 terabyte, or 1 million gigabyte)&lt;br /&gt;????  1EB  ????        (1 exabyte   ~ 1000 petabyte, or 1 million terabyte)&lt;br /&gt;????  1ZB  ????        (1 zetabyte  ~ 1000 exabyte,  or 1 million petabyte)&lt;br /&gt;????  1YB  ????        (1 yottabyte ~ 1000 zetabyte, or 1 million exabyte)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The timeline between 5MB and 1GB drives was 12 years.&lt;br /&gt;The timeline between 1GB and 1TB drives was 15 years.&lt;br /&gt;Notice the price drop!&lt;br /&gt;&lt;br /&gt;So let's hear the predictions. When will the first consumer-ready petabyte drive be available, and what will the average cost be? How aboute exabyte? Zetabyte? Yottabyte?&lt;br /&gt;&lt;br /&gt;A Yottabyte is a tough one to grasp. That is ONE TRILLION terabytes. Do you think storage space, or personal computing as we know it, will end at some point, long before these outrageous sizes are a reality?&lt;br /&gt;&lt;br /&gt;If history is any indication, the petabyte drive should arrive in 12-15 years, and average $300 or less. I think it will much sooner, cut that time down to about 8 years. The $300 price is probably close.&lt;br /&gt;&lt;br /&gt;I also think solid-state disk storage will become the norm, seeing hard drive platters die like the video tape did.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-9145026484446765419?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/9145026484446765419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=9145026484446765419' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/9145026484446765419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/9145026484446765419'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/04/prediction-first-consumer-petabyte-hard.html' title='Prediction: First Consumer Petabyte Hard Drive?'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-5892610234734053445</id><published>2009-03-29T19:14:00.002-05:00</published><updated>2009-03-30T08:25:04.639-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone sdk'/><category scheme='http://www.blogger.com/atom/ns#' term='xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>iPhone 2.2.1 available fonts</title><content type='html'>Here is a list of the fonts available to the iPhone as of SDK 2.2.1:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Family: Courier&lt;br /&gt;  Font:   Courier&lt;br /&gt;  Font:   Courier-BoldOblique&lt;br /&gt;  Font:   Courier-Oblique&lt;br /&gt;  Font:   Courier-Bold&lt;br /&gt;Family: AppleGothic&lt;br /&gt;  Font:   AppleGothic&lt;br /&gt;Family: Arial&lt;br /&gt;  Font:   ArialMT&lt;br /&gt;  Font:   Arial-BoldMT&lt;br /&gt;  Font:   Arial-BoldItalicMT&lt;br /&gt;  Font:   Arial-ItalicMT&lt;br /&gt;Family: STHeiti TC&lt;br /&gt;  Font:   STHeitiTC-Light&lt;br /&gt;  Font:   STHeitiTC-Medium&lt;br /&gt;Family: Hiragino Kaku Gothic ProN&lt;br /&gt;  Font:   HiraKakuProN-W6&lt;br /&gt;  Font:   HiraKakuProN-W3&lt;br /&gt;Family: Courier New&lt;br /&gt;  Font:   CourierNewPS-BoldMT&lt;br /&gt;  Font:   CourierNewPS-ItalicMT&lt;br /&gt;  Font:   CourierNewPS-BoldItalicMT&lt;br /&gt;  Font:   CourierNewPSMT&lt;br /&gt;Family: Zapfino&lt;br /&gt;  Font:   Zapfino&lt;br /&gt;Family: Arial Unicode MS&lt;br /&gt;  Font:   ArialUnicodeMS&lt;br /&gt;Family: STHeiti SC&lt;br /&gt;  Font:   STHeitiSC-Medium&lt;br /&gt;  Font:   STHeitiSC-Light&lt;br /&gt;Family: American Typewriter&lt;br /&gt;  Font:   AmericanTypewriter&lt;br /&gt;  Font:   AmericanTypewriter-Bold&lt;br /&gt;Family: Helvetica&lt;br /&gt;  Font:   Helvetica-Oblique&lt;br /&gt;  Font:   Helvetica-BoldOblique&lt;br /&gt;  Font:   Helvetica&lt;br /&gt;  Font:   Helvetica-Bold&lt;br /&gt;Family: Marker Felt&lt;br /&gt;  Font:   MarkerFelt-Thin&lt;br /&gt;Family: Helvetica Neue&lt;br /&gt;  Font:   HelveticaNeue&lt;br /&gt;  Font:   HelveticaNeue-Bold&lt;br /&gt;Family: DB LCD Temp&lt;br /&gt;  Font:   DBLCDTempBlack&lt;br /&gt;Family: Verdana&lt;br /&gt;  Font:   Verdana-Bold&lt;br /&gt;  Font:   Verdana-BoldItalic&lt;br /&gt;  Font:   Verdana&lt;br /&gt;  Font:   Verdana-Italic&lt;br /&gt;Family: Times New Roman&lt;br /&gt;  Font:   TimesNewRomanPSMT&lt;br /&gt;  Font:   TimesNewRomanPS-BoldMT&lt;br /&gt;  Font:   TimesNewRomanPS-BoldItalicMT&lt;br /&gt;  Font:   TimesNewRomanPS-ItalicMT&lt;br /&gt;Family: Georgia&lt;br /&gt;  Font:   Georgia-Bold&lt;br /&gt;  Font:   Georgia&lt;br /&gt;  Font:   Georgia-BoldItalic&lt;br /&gt;  Font:   Georgia-Italic&lt;br /&gt;Family: STHeiti J&lt;br /&gt;  Font:   STHeitiJ-Medium&lt;br /&gt;  Font:   STHeitiJ-Light&lt;br /&gt;Family: Arial Rounded MT Bold&lt;br /&gt;  Font:   ArialRoundedMTBold&lt;br /&gt;Family: Trebuchet MS&lt;br /&gt;  Font:   TrebuchetMS-Italic&lt;br /&gt;  Font:   TrebuchetMS&lt;br /&gt;  Font:   Trebuchet-BoldItalic&lt;br /&gt;  Font:   TrebuchetMS-Bold&lt;br /&gt;Family: STHeiti K&lt;br /&gt;  Font:   STHeitiK-Medium&lt;br /&gt;  Font:   STHeitiK-Light&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-5892610234734053445?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/5892610234734053445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=5892610234734053445' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5892610234734053445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5892610234734053445'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/03/iphone-221-available-fonts.html' title='iPhone 2.2.1 available fonts'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-9219526447443492217</id><published>2009-03-25T21:18:00.014-05:00</published><updated>2009-03-30T09:30:19.929-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='pcre'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>Perl Compatible Regular Expressions with Cocoa</title><content type='html'>If you want Perl Compatible Regular Expressions with Cocoa, Christopher Bess has created &lt;a href="http://sourceforge.net/projects/objpcre"&gt;ObjPCRE&lt;/a&gt;, a library that makes PCRE easy in Cocoa.&lt;br /&gt;&lt;br /&gt;However, there isn't much for documentation, so I thought I'd at least show how to get started. Implementation is pretty straight forward. First, you need to add the following files to your XCode project:&lt;br /&gt;&lt;br /&gt;libpcre.a&lt;br /&gt;pcre.h&lt;br /&gt;objpcre.h&lt;br /&gt;objpcre.m&lt;br /&gt;&lt;br /&gt;You can find the libpcre.a file in the pcre static lib download, and the other three files are in the source file download. I created a new "PCRE" group folder in my XCode project and dropped them all in there.&lt;br /&gt;&lt;br /&gt;Now, its just a matter of using it. So first, lets create a one-liner that search/replaces text in a string. We'll search for "string" and replace it with "foobar".&lt;br /&gt;&lt;br /&gt;&lt;code&gt;#import "objpcre.h"&lt;br /&gt;&lt;br /&gt;NSString *myText = @"This is my string of text.";&lt;br /&gt;NSLog(@"text before: %@", myText);&lt;br /&gt;[[ObjPCRE regexWithPattern:@"string"] replaceAll:&amp;myText replacement:@"foobar"];&lt;br /&gt;NSLog(@"text after: %@", myText);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;There you go, your first one-line to search/replace a string of text inline with perl regular expressions. Now this isn't very interesting, as no regular expressions were used. So now, let's try something useful. How about a regular expression that removes all HTML tags from the string. Lets try to think of a regex that will match every HTML tag:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;.*&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ok that one is pretty basic. It says match &amp;lt;, followed by zero or more of ANY character, followed by &amp;gt;. This could cause a problem because it can match too much, such as multiple html tags along with any text between them. So we'll go with something a bit more restrictive:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;\w+[^&amp;gt;]*&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now we will only match &amp;lt;, followed by one or more word characters (letter, number, underscore), followed by zero or more characters that are NOT &amp;gt;, followed by &amp;gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We still have a problem though, this will not match closing HTML tags.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;/?\w+[^&amp;gt;]*&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;There, now we match tags with 0 or 1 "/" after the opening tag.&lt;br /&gt;&lt;br /&gt;Notice that backslashes must be escaped inside &lt;span style="font-weight:bold;"&gt;@"double quotes"&lt;/span&gt;, so we use two of them in the string.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;#import "objpcre.h"&lt;br /&gt;&lt;br /&gt;NSString *myText = @"&amp;lt;title&amp;gt;This is my &amp;lt;b&amp;gt;string&amp;lt;/b&amp;gt; of &amp;lt;class name="foo"&amp;gt;text&amp;lt;/class&amp;gt;.&amp;lt;/title&amp;gt;";&lt;br /&gt;NSLog(@"text before: %@", myText);&lt;br /&gt;[[ObjPCRE regexWithPattern:@"&amp;lt;/?\\w+[^&amp;gt;]*&amp;gt;"] replaceAll:&amp;myText replacement:@""];&lt;br /&gt;NSLog(@"text after: %@", myText);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And now for something a bit trickier. Let's try extracting all words within [brackets] in the text. This is where ObjPCRE could use some more features! But for now, here is how we accomplish this task. First the regular expression that matches the tags:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;\[\w+\]&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The brackets have special meaning to PCRE, so we have to escape them. This matches [, followed by one or more word characters, followed by ]. But, lets say we want to capture just the text, without the brackets. We put parenthesis around each subpattern we want to capture. These will have no affect on the regex.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;\[(\w+)\]&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And now we put this into code. Remember to escape backslashes.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;NSString *myText = @"This is [some] more [text] to parse.";&lt;br /&gt;&lt;br /&gt;ObjPCRE *pcre = [ObjPCRE regexWithPattern:@"\\[(\\w+)\\]"];&lt;br /&gt;&lt;br /&gt;int start = 0;&lt;br /&gt;int len = 0;&lt;br /&gt;int offset = 0;&lt;br /&gt;int i = 0;&lt;br /&gt;while([pcre regexMatches:myText options:0 startOffset:offset]) {&lt;br /&gt; for(i=0; i&lt;[pcre matchCount]; i++) {&lt;br /&gt;   NSLog(@"match %d: %@",i,[pcre match:myText atMatchIndex:i]);&lt;br /&gt; }&lt;br /&gt; [pcre match:&amp;start length:&amp;len atMatchIndex:0];&lt;br /&gt; offset = start + len;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;We call regexMatches for each [bracket] pattern it finds. For each of those we loop over the subpatterns and echo them. The first subpattern is the entire match, followed by each parenthesized subpattern (which we have only one.)&lt;br /&gt;&lt;br /&gt;Alright, so that's a start! To continue, check all the functions available in objpcre.h, and also see the documentation on &lt;a href="http://www.pcre.org/"&gt;PCRE&lt;/a&gt; for all the good regex stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-9219526447443492217?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/9219526447443492217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=9219526447443492217' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/9219526447443492217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/9219526447443492217'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/03/perl-compatible-regular-expressions.html' title='Perl Compatible Regular Expressions with Cocoa'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-7614940315323002931</id><published>2009-03-24T09:55:00.011-05:00</published><updated>2009-03-24T11:36:56.638-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Reset a UIScrollView</title><content type='html'>This has to be the most puzzling thing I've come across in iphone app building thus far. I wanted to "reset" a UIScrollView after pinch zooming and scrolling. It turns out, there is no way to reset the zoom factor on the contentView in a UIScrollView. At least not in the current SDK. You must completely replace the subview of the scroll view to work around it.&lt;br /&gt;&lt;br /&gt;I wanted this transition to happen smoothly, so I used some core animation. Here is some working code to get the scroll view to "reset". In my app, I implemented this after a double tap, and after an orientation change.&lt;br /&gt;&lt;br /&gt;self.scrollView is the UIScrollView, and self.imageView is the UIImageView subview.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;- (void) resetImageZoom {&lt;br /&gt;&lt;br /&gt;// animate the transition&lt;br /&gt;[UIView beginAnimations:nil context:NULL];&lt;br /&gt;[UIView setAnimationDelegate:self];&lt;br /&gt;[UIView setAnimationDidStopSelector:@selector(resetAnimFinish:finished:context:)];&lt;br /&gt;[UIView setAnimationDuration:0.4];&lt;br /&gt;&lt;br /&gt;// reset the scrollview and the current image view&lt;br /&gt;self.scrollView.transform = CGAffineTransformIdentity;&lt;br /&gt;self.scrollView.contentOffset = CGPointZero;&lt;br /&gt;self.imageView.frame = self.scrollView.frame;&lt;br /&gt;self.imageView.center = self.scrollView.center;&lt;br /&gt;self.scrollView.contentSize = self.imageView.frame.size;&lt;br /&gt;&lt;br /&gt;[UIView commitAnimations];&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void)resetAnimFinish:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {&lt;br /&gt;&lt;br /&gt;// make a copy of the image view&lt;br /&gt;UIImageView *copy = [[UIImageView alloc] initWithImage:self.imageView.image];&lt;br /&gt;copy.autoresizingMask = self.imageView.autoresizingMask;&lt;br /&gt;copy.contentMode = self.imageView.contentMode;&lt;br /&gt;copy.frame = self.imageView.frame;&lt;br /&gt;copy.center = self.imageView.center;&lt;br /&gt;&lt;br /&gt;// replace the current image view with our copy&lt;br /&gt;[self.imageView removeFromSuperview];&lt;br /&gt;self.imageView = copy;&lt;br /&gt;[self.scrollView addSubview:copy];&lt;br /&gt;[copy release];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;If you wanted, you could extend UIImageView an implement the NSCopying protocol, then just use the copy convenience method. I chose to copy the object a bit more manually here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-7614940315323002931?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/7614940315323002931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=7614940315323002931' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/7614940315323002931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/7614940315323002931'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/03/reset-uiscrollview.html' title='Reset a UIScrollView'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-119230783592130980</id><published>2009-03-22T15:38:00.012-05:00</published><updated>2009-03-24T11:37:14.924-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>stripping HTML with objective-c/cocoa</title><content type='html'>I was looking for a simple way to strip HTML from an NSString. Since NSString has no native regular expression support, I had to resort to other means. I found many posts requiring regex support libs and/or libxml2 support. Bleh. Then I found this simple solution using NSScanner. It worked well for me.&lt;br /&gt;&lt;br /&gt;It's not super smart though. I'm guessing it will bork on any stray &amp;lt; or &amp;gt; tags in the text that are not part of HTML markup. Make sure they are escaped.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rudis.net/content/2009/01/21/flatten-html-content-ie-strip-tags-cocoaobjective-c"&gt;http://www.rudis.net/content/2009/01/21/flatten-html-content-ie-strip-tags-cocoaobjective-c&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I made my own small addition, optionally trimming whitespace too.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;- (NSString *)flattenHTML:(NSString *)html trimWhiteSpace:(BOOL)trim {&lt;br /&gt;&lt;br /&gt;  NSScanner *theScanner;&lt;br /&gt;  NSString *text = nil;&lt;br /&gt;&lt;br /&gt;  theScanner = [NSScanner scannerWithString:html];&lt;br /&gt;&lt;br /&gt;  while ([theScanner isAtEnd] == NO) {&lt;br /&gt;   &lt;br /&gt;      // find start of tag&lt;br /&gt;      [theScanner scanUpToString:@"&lt;" intoString:NULL] ;                 &lt;br /&gt;      // find end of tag         &lt;br /&gt;      [theScanner scanUpToString:@"&gt;" intoString:&amp;amp;text] ;&lt;br /&gt;   &lt;br /&gt;      // replace the found tag with a space&lt;br /&gt;      //(you can filter multi-spaces out later if you wish)&lt;br /&gt;      html = [html stringByReplacingOccurrencesOfString:&lt;br /&gt;              [ NSString stringWithFormat:@"%@&gt;", text]&lt;br /&gt;                   withString:@" "];&lt;br /&gt;   &lt;br /&gt;  } // while //&lt;br /&gt;&lt;br /&gt;  // trim off whitespace&lt;br /&gt;  return trim ? [html stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] : html;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-119230783592130980?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/119230783592130980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=119230783592130980' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/119230783592130980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/119230783592130980'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/03/stripping-html-with-objective-ccocoa.html' title='stripping HTML with objective-c/cocoa'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-4305742132227183319</id><published>2009-02-17T10:53:00.004-06:00</published><updated>2009-03-22T15:37:54.222-05:00</updated><title type='text'>The World's Hardest iPhone Game</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1w2YP-_RXfs/SZruarQBbUI/AAAAAAAAAA8/AHvrMSb8IUY/s1600-h/IMG_0028.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_1w2YP-_RXfs/SZruarQBbUI/AAAAAAAAAA8/AHvrMSb8IUY/s320/IMG_0028.PNG" alt="" id="BLOGGER_PHOTO_ID_5303813653236116802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;If you've ever played NIM, you know what I'm talking about. It's a game that has been played for centuries with a mathematical strategy to winning. This version places you on a space ship with an on-board computer that loves to insult. Good luck beating him, you'll spend hours trying :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=303603482&amp;amp;mt=8"&gt;Mind Nimmer&lt;/a&gt;, $0.99 on the iTunes store.&lt;a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=303603482&amp;amp;mt=8"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-4305742132227183319?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/4305742132227183319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=4305742132227183319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/4305742132227183319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/4305742132227183319'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/02/worlds-hardest-iphone-game.html' title='The World&apos;s Hardest iPhone Game'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_1w2YP-_RXfs/SZruarQBbUI/AAAAAAAAAA8/AHvrMSb8IUY/s72-c/IMG_0028.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-5727809217370730465</id><published>2009-01-28T17:04:00.004-06:00</published><updated>2009-01-28T17:18:40.787-06:00</updated><title type='text'>1TB mirrored NAS for $377</title><content type='html'>I wanted to see how cheaply I could build a mirrored Network Attached Storage (NAS) server, yet keep a balance of quality with the build price. Using all Newegg components, I came up with this list:&lt;br /&gt;&lt;a href="http://secure.newegg.com/WishList/PublicWishDetail.aspx?WishListNumber=14505367"&gt;&lt;br /&gt;Wish List&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This gets you a decent looking, quiet system with mirrored storage. After formatting, usable space should come in a little under 1TB, as you would expect with 1TB drives. As for OS, I would recommend Solaris 10 and ZFS. All free and very easy to setup a pool of disks with no hardware RAID required (JBOD). Since there are only two drives in this configuration, I'd opt for mirroring. If you add 3 or more drives, then RAIDZ1 would be the better choice (similar to RAID5, 1 drive for parity.)&lt;br /&gt;&lt;br /&gt;My basic specs are:&lt;br /&gt;&lt;br /&gt;* 4GB RAM (ZFS likes lots of RAM for optimal speed)&lt;br /&gt;* SATA 3.0Gb/s&lt;br /&gt;* GB ethernet&lt;br /&gt;* Firewire&lt;br /&gt;&lt;br /&gt;The power supply I chose has 2x12v rails for plenty of power to the hardware. The AMD X2 CPU is very inexpensive, and more than adequate for a file server. Everything in this package has decent prices and overall good reviews from newegg customers.&lt;br /&gt;&lt;br /&gt;The system is easily expandable, and it is trivial to setup Samba for network sharing, or NFS, or even plug in Firewire for direct data access. See &lt;a href="http://breden.org.uk/2008/03/02/a-home-fileserver-using-zfs/"&gt;here&lt;/a&gt; for a detailed walk through of the process.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-5727809217370730465?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/5727809217370730465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=5727809217370730465' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5727809217370730465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5727809217370730465'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/01/1tb-mirrored-nas-for-377.html' title='1TB mirrored NAS for $377'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-8925384465568598581</id><published>2009-01-27T13:43:00.003-06:00</published><updated>2010-04-29T07:41:52.652-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Renaming an XCode Project from Command Line</title><content type='html'>&lt;span style="font-weight: bold;"&gt;UPDATE: As of Xcode 3.2 you can rename  projects from the Projects-&gt;Rename dropdown.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Earlier I had posted how to &lt;a href="http://mohrt.blogspot.com/2008/12/renaming-xcode-project.html"&gt;manually rename an XCode project&lt;/a&gt;. I have now written a BASH shell script to handle everything automatically. You can find it &lt;a href="http://www.phpinsider.com/xcode/renameXcodeProject.sh.txt"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-8925384465568598581?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/8925384465568598581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=8925384465568598581' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8925384465568598581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8925384465568598581'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/01/renaming-xcode-project-from-command.html' title='Renaming an XCode Project from Command Line'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-7022378861708069142</id><published>2009-01-22T09:30:00.009-06:00</published><updated>2009-01-22T10:18:41.865-06:00</updated><title type='text'>Winning A Pinewood Derby Race</title><content type='html'>A post about this came across Facebook that made me recall my Pinewood Derby experience, so I thought I'd share it. When I was a young cub scout I participated in one Pinewood Derby race and I won first place. Not by a nose, but by over a car length. Here was my strategy (thanks dad.)&lt;br /&gt;&lt;br /&gt;First and foremost is weight placement. You want to put as much weight as you possibly can on TOP and CENTER of the car (between the wheels.) That means, do NOT add fancy fenders and whatnot. Only carve away from the block of wood, do not add to it! Doing this, you can keep any and all extra weight directly on top center. I used a simple round fishing weight, drilled a hole through it and screwed it on. I didn't bury it in the body of the car, it sat perched right on top. It didn't look super pretty, but it worked. Keep that weight on top. It's even better to put too much weight on top, and remove wood from the bottom center to correct it! Don't add screws or any weight to the bottom! Of course, make sure your car is exactly the weight maximum, usually 5oz. Add this weight once you get your car all carved up and sanded and looking how you want.&lt;br /&gt;&lt;br /&gt;Second tip, make sure the axles are straight, and use graphite if allowed. Make sure there are no burrs or spots on your axle that may slow you down. Some people like to sand and polish the axles. It will probably help, although I didn't do it for my car. (Put the axle in a drill and let it spin as you hold sand paper on it. Go finer and finer, then go to steel wool to polish it.) Most important, make sure they are straight and clean. Give them a spin holding the wheel and axle nailhead-side down, see if it spins freely (30+ secs) and doesn't wobble as it slows up. (A young cub scout had dropped my car before the race, and one of my wheels broke half of the plastic away right on the axle and it wobbled as it slowed up. But my car STILL won by a landslide with this broken wheel!)&lt;br /&gt;&lt;br /&gt;Those are the two most critical tips. As for the shape of the car, mine was a pretty simple wedge shape. People talk about aerodynamics, but really these cars aren't moving fast enough to figure in downforce and other crazy engineer talk. You certainly don't want to add anything that will cause an air pocket, so just make sure the car slopes front to back.&lt;br /&gt;&lt;br /&gt;Next, clear a spot in your trophy case. Have fun :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-7022378861708069142?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/7022378861708069142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=7022378861708069142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/7022378861708069142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/7022378861708069142'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2009/01/winning-pinewood-derby-race.html' title='Winning A Pinewood Derby Race'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-2979312057389147777</id><published>2008-12-17T10:20:00.025-06:00</published><updated>2010-04-29T07:41:13.872-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Renaming an XCode project</title><content type='html'>&lt;span style="font-weight: bold;"&gt;UPDATE: As of Xcode 3.2 you can rename projects from the Projects-&gt;Rename dropdown.&lt;br /&gt;&lt;br /&gt;UPDATE: Be sure to see my post about the &lt;a href="http://mohrt.blogspot.com/2009/01/renaming-xcode-project-from-command.html"&gt;shell script&lt;/a&gt; I wrote to rename from the command line.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For those wanting to rename their XCode project, here how you do it manually:&lt;br /&gt;&lt;br /&gt;1) copy your project to a new folder, rename the folder to your new project name, delete the &lt;span style="font-weight: bold;"&gt;build&lt;/span&gt; directory in the new folder.&lt;br /&gt;&lt;br /&gt;2) drag the entire new project folder onto the TextMate text editor&lt;br /&gt;&lt;br /&gt;3) &lt;span style="text-decoration: line-through;"&gt;In TextMate, remove (delete references) to anything non-text such as images and sounds.&lt;/span&gt; [UPDATE: TextMate will ignore the non-text files, so step 3 is unnecessary.]&lt;br /&gt;&lt;br /&gt;4) &lt;span style="font-weight: bold;"&gt;Replace in Project&lt;/span&gt; (old project name) with (new project name), save all files. Close TextMate.&lt;br /&gt;&lt;br /&gt;5) Now drag the (project name).xcodeproj file into Text Mate, repeat &lt;span style="font-weight: bold;"&gt;Replace in Project&lt;/span&gt; processm, save all files. Close Text Mate. If you have spaces in your project name, look for all instances of your project with spaces replaced with underscores too.&lt;br /&gt;&lt;br /&gt;6) Rename all files containing (old project name) to (new project name). Be sure to check the Classes directory too. If your project name contains spaces, look for all instances of filenames with spaces replaced with underscores too.&lt;br /&gt;&lt;br /&gt;That's it! Your new project should be good to go. I don't think cleaning of targets is necessary, since the build directory is removed (correct me if I'm wrong though!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-2979312057389147777?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/2979312057389147777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=2979312057389147777' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/2979312057389147777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/2979312057389147777'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/12/renaming-xcode-project.html' title='Renaming an XCode project'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-4672406639970769607</id><published>2008-12-09T17:07:00.002-06:00</published><updated>2008-12-09T17:14:52.735-06:00</updated><title type='text'>iDVD with a PC burner</title><content type='html'>So you have a Mac with iDVD, but no superdrive (DVD burner.) However, you have this trusty old PC with a DVD burner. Wouldn't it be nice to burn your iDVD projects on the PC's burner? Well you can, and here is how:&lt;br /&gt;&lt;br /&gt;1) Once your iDVD project is ready for burning, go to File-&gt;Save as disc image. This will save the project as an .img file.&lt;br /&gt;&lt;br /&gt;2) In the finder, double click the .img file. This will mount the image.&lt;br /&gt;&lt;br /&gt;3) Open Disc Utility. Click on your mounted image on the left pane and click "Convert". Choose the "CD Master .cdr" option. This will create a .cdr file.&lt;br /&gt;&lt;br /&gt;4) Copy the .cdr file to a place where you can access it from your PC. Rename *.cdr to *.iso.&lt;br /&gt;&lt;br /&gt;5) On the PC, Use your favorite DVD burner software to burn the .iso image to a DVD. I like ImgBurn, it's free and easy to use.&lt;br /&gt;&lt;br /&gt;That's it, hope that helps!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-4672406639970769607?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/4672406639970769607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=4672406639970769607' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/4672406639970769607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/4672406639970769607'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/12/idvd-with-pc-burner.html' title='iDVD with a PC burner'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-722052482768481784</id><published>2008-11-06T11:13:00.013-06:00</published><updated>2008-11-06T13:50:06.691-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac mini'/><title type='text'>New Mac Mini to combine features of AppleTV?</title><content type='html'>&lt;div style="text-align: right;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_1w2YP-_RXfs/SRMphfa74uI/AAAAAAAAAA0/rshCIaAUdv8/s1600-h/newmini.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 58px;" src="http://2.bp.blogspot.com/_1w2YP-_RXfs/SRMphfa74uI/AAAAAAAAAA0/rshCIaAUdv8/s320/newmini.jpg" alt="" id="BLOGGER_PHOTO_ID_5265598044673139426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;So what is to become of the new mac mini? Some say it's dead, but I think it's way too purposeful to kill it. In many ways, it duplicates the functionality of the apple tv, so it may become a combination of the two: A small mac computer with HDMI (or MiniDP.) Couple that with the slimmer "brick" aluminum case design, the new video capabilities and speed of the current mackbook,  and you have a pretty hellish HTPC.  No Blu-ray for sure, it is counter productive in both cost and purpose. Maybe get rid of the optical drive altogether, and go with air drives and streaming content. Your thoughts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-722052482768481784?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/722052482768481784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=722052482768481784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/722052482768481784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/722052482768481784'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/11/new-mac-mini-to-replace-appletv.html' title='New Mac Mini to combine features of AppleTV?'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_1w2YP-_RXfs/SRMphfa74uI/AAAAAAAAAA0/rshCIaAUdv8/s72-c/newmini.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-1820060325127280389</id><published>2008-10-30T17:05:00.010-05:00</published><updated>2008-10-30T17:30:48.168-05:00</updated><title type='text'>Chances of quad aces against royal flush?</title><content type='html'>In the WSOP 2008, a royal flush beat out quad aces. What are the chances of that happening? I know they gave a result and I'm not sure how that was calculated, but I did my own calculation with my own handy online odds calculator. Let me know if I screwed it up :)&lt;br /&gt;&lt;br /&gt;Here is a link to the calculation:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ohrt.com/odds/index.php?t[]=52&amp;d[]=2&amp;o[]=4&amp;c[]=2&amp;t[]=50&amp;d[]=1&amp;o[]=8&amp;c[]=1&amp;t[]=49&amp;d[]=1&amp;o[]=3&amp;c[]=1&amp;t[]=48&amp;d[]=5&amp;o[]=4&amp;c[]=4&amp;&amp;s=all&amp;p=12"&gt;link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll step through the process I took:&lt;br /&gt;&lt;br /&gt;The first player needs pocket aces. So of the 52 cards, we have 4 outs, we need 2, and we are drawing 2 cards.&lt;br /&gt;&lt;br /&gt;For the second player, first he needs any one of the KQJT that is not the same suit of the other players hole cards. 50 cards left, there are 8 outs in the deck, we are drawing 1 card and we need 1 of the outs.&lt;br /&gt;&lt;br /&gt;For the other hole card , we need one of the remaining KQJT of the same suit. 49 cards left, there are 3 outs, we are drawing 1 and need 1.&lt;br /&gt;&lt;br /&gt;On the board (don't care what order or where), we need exactly 4 outs from the 5 cards: the other two aces, and the other two cards KQJT of the same suit. 48 cards left, drawing 5, 4 outs, we need all 4.&lt;br /&gt;&lt;br /&gt;Answer, this happens in 877,963,124:1, or 0.000001139% of the time.&lt;br /&gt;&lt;br /&gt;I think they came up with 2.x billion? I'm curious how they figured it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-1820060325127280389?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/1820060325127280389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=1820060325127280389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1820060325127280389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1820060325127280389'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/10/chances-of-quad-aces-against-royal.html' title='Chances of quad aces against royal flush?'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-7970165292232369310</id><published>2008-10-28T15:45:00.008-05:00</published><updated>2009-03-24T11:38:35.520-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone sdk'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Getting URL from UIWebView</title><content type='html'>It thought I'd post how to get the current URL string from a UIWebView object. Here you go:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;code&gt;&lt;br /&gt;NSString *currentURL&lt;br /&gt;= myWebView.request.URL.absoluteString;&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That is assuming myWebView is your UIWebView object.&lt;br /&gt;&lt;br /&gt;To open a web page in Safari from a UIWebView, do this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;code&gt;&lt;br /&gt;[[UIApplication sharedApplication]&lt;br /&gt;openURL:myWebView.request.URL];&lt;br /&gt;&lt;/code&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-7970165292232369310?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/7970165292232369310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=7970165292232369310' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/7970165292232369310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/7970165292232369310'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/10/getting-url-from-uiwebview.html' title='Getting URL from UIWebView'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-8113844927441394693</id><published>2008-10-17T21:49:00.004-05:00</published><updated>2008-10-28T16:01:57.426-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='halloween'/><category scheme='http://www.blogger.com/atom/ns#' term='fcg'/><category scheme='http://www.blogger.com/atom/ns#' term='flying crank ghost'/><title type='text'>Flying Crank Ghost</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1w2YP-_RXfs/SPlPEp1qnpI/AAAAAAAAAAU/aG_QSxz7FMA/s1600-h/ghost.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_1w2YP-_RXfs/SPlPEp1qnpI/AAAAAAAAAAU/aG_QSxz7FMA/s320/ghost.jpg" alt="" id="BLOGGER_PHOTO_ID_5258320981300780690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I put up my first Flying Crank Ghost for Halloween. Here it is. I also posted a &lt;a href="http://www.youtube.com/watch?v=qPjZRZ0P9TM"&gt;video&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-8113844927441394693?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/8113844927441394693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=8113844927441394693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8113844927441394693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8113844927441394693'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/10/flying-crank-ghost.html' title='Flying Crank Ghost'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_1w2YP-_RXfs/SPlPEp1qnpI/AAAAAAAAAAU/aG_QSxz7FMA/s72-c/ghost.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-6443519969165396963</id><published>2008-10-16T14:57:00.027-05:00</published><updated>2010-12-11T13:20:36.246-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Objective-C Crash Course for PHP developers</title><content type='html'>I've been dabbling around in Objective-C lately, and I thought I'd share some of my experiences with it. It took some time to get my head around a lot of the basic programming syntax. I thought I'd share some things I've learned, and how it compares to PHP.&lt;br /&gt;&lt;br /&gt;First and foremost, Objective-C is a compiled language, whereas PHP is a scripted language. Objective-C requires compiling into a binary before it is executed. There is no need to compile PHP, as the script is interpreted at run-time.&lt;br /&gt;&lt;br /&gt;PHP was once strictly a procedural language, but over time many object-oriented language features have been added. Objective-C is an Object-Oriented programming language structure that is built on top of C, which is a procedural language. You can freely mix C with Objective-C (as well as C++), much the same that you can mix PHP procedural functions with PHP objects and classes.&lt;br /&gt;&lt;br /&gt;Objective-C is foremost an Object-Oriented language. That means, everything is an object. Even a simple string is an object of NSString. And yes, you can mix C code and use plain procedural functions if you wish. Normally you can do everything you need with objects.&lt;br /&gt;&lt;br /&gt;First, a "Hello World" application in PHP, then the same one in Objective-C.&lt;br /&gt;&lt;br /&gt;The PHP version:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;// HelloWorld.class.php&lt;br /&gt;class HelloWorld&lt;br /&gt;{&lt;br /&gt;// instance variables go here&lt;br /&gt;&lt;br /&gt;// methods go here&lt;br /&gt;public function printHelloDate()&lt;br /&gt;{&lt;br /&gt;  printf("Hello World! at %s",&lt;br /&gt;     strftime('%Y-%m-%d %H:%M:S %Z'));&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// hello.php&lt;br /&gt;include_once('HelloWorld.class.php');&lt;br /&gt;$hw = new HelloWorld;&lt;br /&gt;$hw-&gt;printHelloDate;&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The Objective-C version:&lt;br /&gt;&lt;br /&gt;HelloWorld.h header file:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;&lt;br /&gt;@interface HelloWorld : NSObject {&lt;br /&gt; // instance vars go here&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// class methods go here&lt;br /&gt;- (void)printHelloDate;&lt;br /&gt;&lt;br /&gt;@end&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;HelloWorld.m implementation file:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;#import "HelloWorld.h"&lt;br /&gt;&lt;br /&gt;@implementation HelloWorld&lt;br /&gt;&lt;br /&gt;- (void)printHelloDate&lt;br /&gt;{&lt;br /&gt; NSLog(@"Hello world! at %@",&lt;br /&gt;   [NSCalendarDate calendarDate]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;main.m file:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;#import "HelloWorld.h"&lt;br /&gt;&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;br /&gt; NSAutoreleasePool * pool =&lt;br /&gt;     [[NSAutoreleasePool alloc] init];&lt;br /&gt;&lt;br /&gt; HelloWorld *hw = [[HelloWorld alloc] init];&lt;br /&gt; [hw autorelease];&lt;br /&gt;&lt;br /&gt; [hw printHelloDate];&lt;br /&gt;&lt;br /&gt; [pool release];&lt;br /&gt; return 0;&lt;br /&gt;}&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you have had any experience programming in C, much of this will look familiar. Objective-C is after all, just an extension of the C programming language, adding in all the OO goodness of Objective-C to the already existing C syntax. I'm going to refer to Objective-C as OC from here on out.&lt;br /&gt;&lt;br /&gt;Notice that comments are identical in PHP, OC, and C. // for single line comments, and /* */ for multi-line comments. Easy enough. Now, lets take a look at the OC code, starting with the header file:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;#import is much the same as include_once() in PHP. If a file gets imported more than once, it is ignored.&lt;br /&gt;&lt;br /&gt;OC is made up of header files (.h) and source files (.m) Typically, each header file is paired with a source file. The header file declares the instance variables and methods of your classes, whereas the methods are implemented in the source (.m) file. You need only import the .h file, as the .m file is compiled by XCode automatically.&lt;br /&gt;&lt;br /&gt;Foundation.h is an existing OC framework of classes. It includes much of the fundamental objects you will want when developing Objective-C. There are many other frameworks to choose from too. The core of PHP is procedural code, so there is no "foundation" to include. All of the basic PHP functionality is available at the outset of any PHP script (excluding special extensions and libraries of your own.)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;@interface HelloWorld : NSObject {&lt;br /&gt; // instance vars go here&lt;br /&gt;}&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The @interface line describes the name of your class, and also describes what object it is inherited from. Here we have a class named "HelloWorld" and it inherits NSObject, which is the most basic of objects. It is the top object of the inheritance tree. In PHP, there is no need to declare what object an non-extended class is inherited from.&lt;br /&gt;&lt;br /&gt;In the curly braces of the @interface line, you declare what instance variables your class will contain. In our example, we have none declared.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;// class methods go here&lt;br /&gt;- (void)printHelloDate;&lt;br /&gt;&lt;br /&gt;@end&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;After the curly brace and before the @end symbol, you declare your class methods, and the arguments they may take. The minus "-" at the beginning of the line declares that this is an instance method. If it began with a "+" it would be a class method. In PHP the "+" methods would be referred to as static methods. That is, a method called directly from the class, not from an object instance.&lt;br /&gt;&lt;br /&gt;(void) is the value that is returned from the method. This method does not return a value.&lt;br /&gt;&lt;br /&gt;@end defines the end of the method declarations.&lt;br /&gt;&lt;br /&gt;And now the implementation (.m) file:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;#import "HelloWorld.h"&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;We import our HelloWorld.h header file.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;@implementation HelloWorld&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Between the @implementation and @end lines, we implement the methods of our class.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;- (void)printHelloDate&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is an instance method, denoted by the "-" at the beginning. A "+" would have denoted a class method, or "static" method in PHP jargon. This method does not return anything, so (void) is used as the return declaration.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;{&lt;br /&gt; NSLog(@"Hello world! at %@",&lt;br /&gt;    [NSCalendarDate calendarDate]);&lt;br /&gt;}&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is the body of our method. NSLog is the OC equivalent to the PHP's and C's printf function. %@ is a placeholder for our string object. NSCalendarDate is a class from the Foundation.h framework, and we are calling the calendarDate method of the class. It will return a string object containing a date for our NSLog.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;@end&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This marks the end of our implementation methods.&lt;br /&gt;&lt;br /&gt;And now for the main.m file:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;#import "HelloWorld.h"&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here we import our Foundation.h file. (Note we could have left this out, since the HelloWorld.h file imports it already.) Then we import the header file of our HelloWorld class.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As in C, every OC program must have a main() function. This is where the compiled binary will begin its execution, passing in any arguments given from the command line. In PHP, arguments to a script are captured in the $argv variable.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;NSAutoreleasePool * pool =&lt;br /&gt; [[NSAutoreleasePool alloc] init];&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is part of the memory management of OC. Every object in OC retains a count of how many references are attached to it. When an object is first instantiated, a reference count of 1 is placed on the object. Each time the object is retained, its reference count is incremented. Each time it is released, it is decremented. Once the ref count reaches zero, the object is destroyed. The autorelease pool is an OC convention used for memory management. When you autorelease an object (as opposed to just releasing it), it gets added to the pool of objects to be released at a later time. This way if something else needs to pick up your object before it is destroyed, it can, and you don't have to remember to release it again. OC 2.0 also has garbage collection features that help automate the tedious task of memory management. In PHP, memory management is automagically handled for you.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;HelloWorld *hw = [[HelloWorld alloc] init];&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is where your object is instantiated. [HelloWorld alloc] means we are calling the static method "alloc" of the HelloWorld class (a special method available to all OC classes.) alloc does the memory allocation for your object. Then, the init method is called of the instantiated object. This is much like the __construct() method of PHP objects, where initialization is handled, as well as initialization of any superclasses. The object is then given a pointer (of type HelloWorld) named *hw. Now we reference our object with hw from here onward. Note that in OC all objects require pointers to reference them.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;[hw autorelease];&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here we hand our object to the autorelease pool. Now I don't have to remember to release it later, and it's still available for me to use. The autorelease pool is kind of pointless for our HelloWorld app, but since the autorelease pool is an integral part of OC programming, I left it in. (I could have just did [hw release] after I was done with it.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;[hw printHelloDate];&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is where we call the printHelloDate method of our class. In OC jargon, they call this a "message". I don't know exactly why, it's just calling a method of the object. When you see [object message] in OC, that is exactly what it is. The object is on the left, the message (method name) is on the right.&lt;br /&gt;&lt;br /&gt;While we're on the subject of calling methods, You may see methods with parameters, but in OC they are named. Here is an example:&lt;br /&gt;&lt;br /&gt;PHP:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;$rectangle-&gt;setSize(10,20,true);&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Objective-C:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;[rectangle setX:10 Y:20 visible:YES]&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here you see exactly what the parameters are for. In PHP I may have guessed that the first two params were X and Y, but the third would be a mystery without digging into the class. In OC, I can plainly see the first arg is X, the second is Y, and the third is setting the visiblity. Also in OC, you will typically see YES and NO used for booleans, not true and false.&lt;br /&gt;&lt;br /&gt;One other tidbit: in Objective-C, the parameter names are part of the method name. So in PHP, the above method name is &lt;span style="font-weight: bold;"&gt;setSize()&lt;/span&gt;, whereas in Objective-C, the method name is &lt;span style="font-weight: bold;"&gt;setX:Y:visible&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;[pool release];&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And here we are releasing the autorelease pool, which will inevitably clean up our object from memory.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;return 0;&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Our main function is expecting an integer to be returned, so we'll return a zero.&lt;br /&gt;&lt;br /&gt;That's about it. If there are errors, send me a comment and I'll get them corrected. Thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-6443519969165396963?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/6443519969165396963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=6443519969165396963' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6443519969165396963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6443519969165396963'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/10/objective-c-crash-course-for-php.html' title='Objective-C Crash Course for PHP developers'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-1528688404179587758</id><published>2008-10-14T14:10:00.005-05:00</published><updated>2008-10-14T15:09:49.531-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac mini'/><category scheme='http://www.blogger.com/atom/ns#' term='sound'/><category scheme='http://www.blogger.com/atom/ns#' term='windows xp'/><title type='text'>Sharing speakers with Windows XP</title><content type='html'>I have a mac mini that I want to share the computer speakers on my PC with. No problem, just run a 1/8 inch male-male stereo cable from the line-out (headphone jack) on the mini to the line-in on the PC (usually a blue colored jack, check your PC/motherboard manual.)&lt;br /&gt;&lt;br /&gt;Once that is in place, pull up the volume controls in XP (double click the speaker in the system tray), go to options-&gt;properties, check the "Line In" option. This enables line-in and places the input controls on your volume control panel. Now adjust your line-in volume. I left mine all the way up.&lt;br /&gt;&lt;br /&gt;That's it, your sound card should pass the line-in sound through to your line-out.&lt;br /&gt;&lt;br /&gt;Some instructions I found online say to get a Y-splitter and run both computers line-out to the speakers. Not only can this create unwanted line-noise, but you can easily damage the sound cards of your computers. Passing the sound through one of the computers is the safest way to go, and only requires one cable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-1528688404179587758?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/1528688404179587758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=1528688404179587758' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1528688404179587758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1528688404179587758'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/10/enabling-line-in-in-xp.html' title='Sharing speakers with Windows XP'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-3528055521771043502</id><published>2008-09-27T13:44:00.003-05:00</published><updated>2008-09-27T13:49:09.454-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Enter text by swiping?</title><content type='html'>This is a very interesting idea, maybe apple could implement it?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.swypeinc.com/product.html"&gt;http://www.swypeinc.com/product.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The idea is to enter words by swiping your finger over the letters on the keyboard. You type a word by running your finger over the letters in one motion, and the phone figures out the word. It seems this would be a very quick way to type, so long as the word recognition is accurate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-3528055521771043502?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/3528055521771043502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=3528055521771043502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/3528055521771043502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/3528055521771043502'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/09/enter-text-by-swiping.html' title='Enter text by swiping?'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-1077338722285969960</id><published>2008-09-15T16:56:00.004-05:00</published><updated>2008-09-15T17:08:57.621-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poker'/><title type='text'>Poker Stars for the iPhone?</title><content type='html'>&lt;span&gt;Can you play Poker Stars on an iPhone? The short answer is yes, but with some setup and a bit of effort. This is a proof of concept, using the VNC viewer to display the poker table on the phone. As you can see, I had a bit of trouble trying to change my raise amount, as the pointer didn't quite line up. The VNC buttons were in the way too, but the screen could be moved. With a little effort, it could work. This requires a computer setup and running the PS client before you can view it on the phone. Obviously, a native poker app would be best. Poker Stars, are you watching? &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="left: 0px ! important; top: 0px ! important;" title="Click here to block this object with Adblock Plus" class="abp-objtab-06973666262802675 visible ontop" href="http://www.youtube.com/v/gOPNatP5GPU&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/a&gt;&lt;a style="left: 0px ! important; top: 0px ! important;" title="Click here to block this object with Adblock Plus" class="abp-objtab-06973666262802675 visible ontop" href="http://www.youtube.com/v/gOPNatP5GPU&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/a&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/gOPNatP5GPU&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;embed src="http://www.youtube.com/v/gOPNatP5GPU&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-1077338722285969960?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/1077338722285969960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=1077338722285969960' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1077338722285969960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1077338722285969960'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/09/poker-stars-for-iphone.html' title='Poker Stars for the iPhone?'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-6965543317419194858</id><published>2008-09-07T15:55:00.006-05:00</published><updated>2008-09-07T20:06:55.090-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poker'/><title type='text'>Buy-in for the mininum or maximum?</title><content type='html'>You sit down at the 2-5 No-Limit table. The buy-in is $200 minimum, and $500 maximum. What should you buy in for? Does it make any difference?&lt;br /&gt;&lt;br /&gt;For a long time I thought that buying in for the max was the best choice, as this gives you an opportunity to put the most money into a hand when you hold the nuts. It makes sense. But lets look at this from another perspective.&lt;br /&gt;&lt;br /&gt;Hypothetical situation: let's say you are heads up, you have $200 and the other guy has $800 (or more.) You both go all-in BLIND 2 hands in a row. Who comes out ahead on average?&lt;br /&gt;&lt;br /&gt;Here are the 3 possible outcomes:&lt;br /&gt;&lt;br /&gt;You lose the first hand, game over. He profits $200.&lt;br /&gt;&lt;br /&gt;You win the first hand, lose the second. Game over, he profits $200.&lt;br /&gt;&lt;br /&gt;You win the first and second hand. You profit $600.&lt;br /&gt;&lt;br /&gt;Even though you only win 1 of 3 situations, the amount you make is $200 more than the other guy's winnings combined.&lt;br /&gt;&lt;br /&gt;This observation alone makes a clear choice that there is an advantage to buying in short. A good strategy (online or live play) is to buy in for the minimum, and stand up and leave as soon as you double up your bankroll. There is no sense in gambling your winnings back, just leave and buy-in short again later (live), or on another table (online.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-6965543317419194858?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/6965543317419194858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=6965543317419194858' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6965543317419194858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6965543317419194858'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/09/buy-in-for-mininum-or-maximum.html' title='Buy-in for the mininum or maximum?'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-4247720625965245176</id><published>2008-07-23T16:55:00.013-05:00</published><updated>2008-12-11T02:56:39.609-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apple mac iphone ipod'/><title type='text'>The days to come with Apple</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1w2YP-_RXfs/SIfxo4372jI/AAAAAAAAAAM/eHgoPNW5wms/s1600-h/iTube.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_1w2YP-_RXfs/SIfxo4372jI/AAAAAAAAAAM/eHgoPNW5wms/s320/iTube.jpg" alt="" id="BLOGGER_PHOTO_ID_5226411577350806066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;What is coming next from Apple? One can only speculate. There has been a lot of talk about a tablet computer. That makes sense, take your iPhone and blow it up to a bigger version, using the same multi-touch interface.&lt;br /&gt;&lt;br /&gt;So let's take a step back and see what Apple has done so far, and how that can be applied to what is coming.&lt;br /&gt;&lt;br /&gt;Apple was strictly a computer company. Then one day, they decided to take a new direction and created the iPod. This was not a traditional computer per se, but a digital music box in your pocket. Not only did Apple break away from it's normal business operations, but they encroached on the music business. They made hardware for listening to music, they created iTunes, and now control a large portion of the sale of music. Obviously, a huge success.&lt;br /&gt;&lt;br /&gt;Then they started making other hardware gadgets to compliment the personal computer, such as wireless routers. Again, stretching their business tactics beyond the PC. Then comes AppleTV, a hardware solution to watching digital video media. Then of course, the iPhone. A cell phone from Apple. So now they directly compete with the cell phone industry.&lt;br /&gt;&lt;br /&gt;You get the idea... the Apple technology keeps spilling over into new technologies. What is going to happen next? Here are some fun speculations:&lt;br /&gt;&lt;br /&gt;* Apple personal communication (phone?) service. Instead of partnering with cell phone providers, they create their OWN personal communication network. Maybe this won't be cellular technology, but it will certainly directly compete with it. Maybe this will be purely online, via something like Skype? Once everyone is wired in, this will certainly be viable. Or maybe they will do something on their own frequency. Who knows?&lt;br /&gt;&lt;br /&gt;* Apple Digital Television. No, I'm not talking about the AppleTV that hooks to your TV set, I'm talking about the TV ITSELF. We'll call it iTube. Imagine a 60" Apple branded TV in your living room. Integrated internet access, iPhone/iTablet remote controlled, jacked into your Apple network via bonjour services. Again, encroaching on the TV industry, but why not? They already make 30" monitors. This leads to...&lt;br /&gt;&lt;br /&gt;* Apple Digital Home Theater. Maybe this will be combined with the iTube? Full digital home stereo, speakers, the works. Every component of your home theater with the Apple brand. Goodbye Onkyo, Harmon Kardon, Sony... Hello Apple! Why go through the pain of figuring out what components to buy? Just get Apple... you know it will be excellent quality, it will be compatible with your other Apple hardware, and certainly look fantastic like everything else Apple makes. Not to mention, one cable coming off the back instead of the horrendous tangle of wires in your current system.&lt;br /&gt;&lt;br /&gt;* Apple Home Automation. Imagine controlling everything in your home with your Apple computer. Grab your iPhone and turn down the lights. Turn up the furnace. View the camera at the front door. Open the garage door. Warm up the car. Set your alarm. Preheat the oven. Re-program your sprinkler system. Listen in on any room in the house. All of this from in the living room, or from any remote location. Think of the possibilities!&lt;br /&gt;&lt;br /&gt;* Apple Home Security. Yep, secure your home with Apple. Motion detectors can alert you from afar, you can instantly view any room in your house and notify the police. The police can then monitor with you, and know exactly what course of action to take from outside.&lt;br /&gt;&lt;br /&gt;Now we really start thinking out of the box:&lt;br /&gt;&lt;br /&gt;* The iCar. (My business partner and I dreamt this up, I can't take all the credit.) I can hear Steve introducing it at a keynote: "We looked at all of the existing cars out there. The wheels. The suspension. The drive train. The engine. We decided to get rid of ALL of it and start over! Introducing the iCar." A cover slips off of a very simple looking contraption, similar to an egg with a seamless door. The car is hovering over the ground. The door silently glides open and Steve hops in. "We've decided that the iCar needs to magnetically levitate. Therefore, it can only travel on iRoads. Have no fear, we are already working on an infrastructure of iRoads, to be spanning the globe over the next several years." The dash is conspicuous... just one single button. Steve gives it a press, and the entire dash lights up, like a big seamless iPhone interface.&lt;br /&gt;&lt;br /&gt;You can use your own imagination from there. What's next? Homes? Buildings? Cities? (I'm from Apple City, USA!), world domination? You decide in the comments!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-4247720625965245176?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/4247720625965245176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=4247720625965245176' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/4247720625965245176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/4247720625965245176'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/07/days-to-come-with-apple.html' title='The days to come with Apple'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_1w2YP-_RXfs/SIfxo4372jI/AAAAAAAAAAM/eHgoPNW5wms/s72-c/iTube.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-5588656974198626596</id><published>2008-07-22T11:21:00.005-05:00</published><updated>2008-07-22T12:07:52.739-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone mac'/><title type='text'>Reasons why people buy the iPhone</title><content type='html'>So how many blogs have written "10 reasons why the iPhone sucks." I've seen them, I've read them, they have their points. But the point they are missing, is the reasons why people DO buy the iPhone. The good things far outweigh the bad. Here is my list of the good things.&lt;br /&gt;&lt;br /&gt;* Multi-touch. This has to be the biggest breakthrough in mobile usability. Pinch and squeeze the items to zoom in and out, flick or swipe your finger across the interface to effortlessly move through your contacts and photo albums. Nothing comes close to the response and feel of an iPhone.&lt;br /&gt;&lt;br /&gt;* Safari. The mobile browser that really does it all. And I don't have to convince you of this, the statistics speak for themselves. Give them a web browser they can use, and they will use it. Pinch zooming, double-tap focus, finger slide panning... hands down, no other mobile browser comes close to it's usability.&lt;br /&gt;&lt;br /&gt;* The iPod. Let's face it, Apple built the iPhone with iPod users in mind. You don't need to carry two things around, and the iPod interface on the iPhone is easiest and most feature-rich thus far. For those already tapped into the iTunes ecosystem, the iPhone is an easy choice.&lt;br /&gt;&lt;br /&gt;* The App Store. One place to get apps, available to every iPhone. Browse through applications and install them with ease. If you have ever gone through the gauntlet of installing and maintaining apps on platforms such as Windows Mobile, you will deeply appreciate the simplicity of the app store. For developers, you don't need hosting, and you get an instant world-wide audience!&lt;br /&gt;&lt;br /&gt;* multi-lingual. This may not apply to individual phone owners, but being a touch-screen oriented device, the available languages are limitless, which is a very good thing for Apple supplying other countries with iPhones, and app developers can write their applications for any number of languages.&lt;br /&gt;&lt;br /&gt;* The development platform. Cocoa and OS X have rave reviews on it's easy-to-use development tools (free with OS X), and the iPhone is no exception. Quickly and easily deploy applications on the iPhone that adhere to the apple user interface guidelines.&lt;br /&gt;&lt;br /&gt;Of course there are shortcomings of the iPhone (You can read other blogs to get the juice.) But realize, the iPhone is in its infancy. After one year, Apple has completely changed the face of the mobile industry. IMHO, there are only better things to come.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-5588656974198626596?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/5588656974198626596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=5588656974198626596' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5588656974198626596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5588656974198626596'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/07/reasons-why-people-buy-iphone.html' title='Reasons why people buy the iPhone'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-1943699227084559360</id><published>2008-06-03T21:08:00.004-05:00</published><updated>2008-06-03T21:19:27.084-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gmail thunderbird'/><title type='text'>Setup Thunderbird 2.0 for Gmail</title><content type='html'>I thought I'd share how I setup Thunderbird 2.0 to handle Gmail accounts so the folders match up. First follow the install instructions from the Gmail website for Thunderbird 2.0. Then, apply the following:&lt;br /&gt;&lt;br /&gt;*) Go to Account Settings -&gt; &lt;span style="font-weight: bold;"&gt;Server Settings&lt;/span&gt;&lt;br /&gt;*) in the box that says &lt;span style="font-weight: bold;"&gt;Server Settings&lt;/span&gt;, click &lt;span style="font-weight: bold;"&gt;Advanced...&lt;/span&gt;&lt;br /&gt;*) For the IMAP Server Directory, type &lt;span style="font-weight: bold;"&gt;[Gmail]&lt;/span&gt; (with the brackets)&lt;br /&gt;*) click &lt;span style="font-weight: bold;"&gt;OK&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;*) Go Account Settings -&gt; &lt;span style="font-weight: bold;"&gt;Copies &amp;amp; Folders&lt;/span&gt;&lt;br /&gt;*) check &lt;span style="font-weight: bold;"&gt;Place a copy in:&lt;/span&gt;&lt;br /&gt;*) select the &lt;span style="font-weight: bold;"&gt;Other&lt;/span&gt;: radio button&lt;br /&gt;*) select the &lt;span style="font-weight: bold;"&gt;Sent Mail&lt;/span&gt; folder under your Gmail account in the dropdown&lt;br /&gt;&lt;br /&gt;*) Repeat the above process for &lt;span style="font-weight: bold;"&gt;Drafts &amp;amp; Templates&lt;/span&gt;, choosing the &lt;span style="font-weight: bold;"&gt;Drafts&lt;/span&gt; folder on Gmail&lt;br /&gt;*) Go to Account Settings -&gt; &lt;span style="font-weight: bold;"&gt;Junk Settings&lt;/span&gt;&lt;br /&gt;*) Repeat the above process for the &lt;span style="font-weight: bold;"&gt;Junk&lt;/span&gt; folder, choosing the &lt;span style="font-weight: bold;"&gt;Spam&lt;/span&gt; folder on Gmail&lt;br /&gt;&lt;br /&gt;Thats it! You will no longer see a [Gmail] subfolder, and your Sent, Drafts, and Spam folders will match up to the correct Gmail folders.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-1943699227084559360?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/1943699227084559360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=1943699227084559360' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1943699227084559360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/1943699227084559360'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/06/setup-thunderbird-for-gmail-best-way.html' title='Setup Thunderbird 2.0 for Gmail'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-156414086458863089</id><published>2008-05-29T20:05:00.003-05:00</published><updated>2008-05-29T21:00:54.883-05:00</updated><title type='text'>Winning No Limit Hold-Em</title><content type='html'>It's been awhile since I've played some live poker, but I went to the casino an hour up the road over the weekend. I turned $100 into $850 at the $1-3 NL table in about six hours. Not bad! Although I'll have to admit, there were some frustrated people at the table, and I'll tell you why.&lt;br /&gt;&lt;br /&gt;To several of the players, I seemingly played junk cards most of the time, and took down some very large pots with them. I can see how this can be frustrating when you have solid preflop cards, raise with them, get called and get taken by a lucky flop. But there is a method to the madness, and I'll try to explain.&lt;br /&gt;&lt;br /&gt;First of all, I like to show down a big bluff somewhere in the beginning of my game. I'll raise preflop with junk, bet the flop, bet the turn, bet the river and turn up next to nothing. Now they have a perception of a loose foolish player at the table. It works even better if I get lucky and hit two pair or something. I just make sure my betting made no sense. I'll do this now and then, especially if the table is changing players often. I like to keep the loose image. This helps my strong hands make more, and also keeps them guessing.&lt;br /&gt;&lt;br /&gt;Now, in my observation of the game of No-Limit (especially at these smaller stakes,) cards like pocket aces or pocket kings will typically win a small pot or lose a large one. On the other hand, cards like small suited connectors, small pairs, small one gappers are the opposite: they will typically lose a small pot, or win a large one.&lt;br /&gt;&lt;br /&gt;One reason is the difference in starting strength of the hand. If pocket aces gets no help on the flop, it's going to be hard to fold that hand in any event. Whereas something like 56, if the flop isn't strong, it's an easy fold.&lt;br /&gt;&lt;br /&gt;Another is deception. You call preflop with 56 and the flop comes 56T rainbow, the aces aren't going to be too concerned about losing with that texture of a flop and they'll likely pay you off nicely. Whereas the flop comes 9TJ, the aces will be a bit more cautious if they get re-raised.&lt;br /&gt;&lt;br /&gt;Holding small cards, the flop that helps you is not likely going to be helping another player in the hand. When you call a preflop raise, you are typically going to be up against stronger starting hands, and that helps when you hit the flop right. You don't have to guess if you have 2nd best, such as a hand like TJ might be doing with a flop of TJQ.&lt;br /&gt;&lt;br /&gt;If you are going to try playing this style, remember implied odds, that is the most important thing. That is, if you are going to call a preflop raise with little cards, make sure you have a bankroll to back it up, as well as the guy you are calling. You want sufficient implied odds so when you hit the flop, you get paid off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-156414086458863089?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/156414086458863089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=156414086458863089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/156414086458863089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/156414086458863089'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/05/winning-no-limit-hold-em.html' title='Winning No Limit Hold-Em'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-8753844255890928283</id><published>2008-04-17T20:14:00.004-05:00</published><updated>2008-04-19T22:53:58.568-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poker'/><title type='text'>Poker Tells Database</title><content type='html'>Poker tells are one of the most fascinating an fun elements of poker. It's always great to hear about a new tell that someone has examined on a player. However, there is no convenient place to browse through poker tells and contribute your own. So, I built one.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.pokertellsdb.com/"&gt;&lt;br /&gt;www.pokertellsdb.com&lt;/a&gt; is an online poker tells database, where anyone can contribute poker tells, as well as rate and comment on them. I'll consider this in "beta" since I built the entire system in the course of a couple of days.  Let me know what you think, and what features it could use. It's fairly sparse since I only added a few tells I could think of right off hand. Please contribute!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.pokertellsdb.com/"&gt;&lt;br /&gt;http://www.pokertellsdb.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-8753844255890928283?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/8753844255890928283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=8753844255890928283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8753844255890928283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8753844255890928283'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/04/poker-tells-database.html' title='Poker Tells Database'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-8511502132620307966</id><published>2008-02-05T17:35:00.002-06:00</published><updated>2008-04-19T22:54:37.853-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poker'/><title type='text'>Playing Pocket Aces</title><content type='html'>Sitting at the local poker room, you take a look at your hole cards and see pocket aces. A rush goes through your body. Now, what is the best course of action? How do you maximize your profit, and minimize your bad beats?&lt;br /&gt;&lt;br /&gt;Generally speaking, raise with them. Raise and re-raise. If you are first to act, a good starting point is roughly 3-4 times the big blind. If you are behind a raiser, raise 2-3 times what he raised. The key here is to minimize callers. You don't want more than one or two. On the flop, no matter what comes out, put out a continuation bet. I like to mix it up from 75-100% of the pot. Usually you can take the hand down right here. If you get called or re-raised, then it is time to analyze your position, your opponent and stack sizes. Usually you aren't going to get out of the hand unless you are really sure you are beat. If your opponent out-flopped you then that is the breaks. But, the important thing is that you make them pay to see the flop. This will keep your aces on the winning side in the long run.&lt;br /&gt;&lt;br /&gt;Some like to slow-play the aces. Although it is nice to mix up your play, typically you will have a chance at more money by raising. Let's take an example, and play the hand two different ways.&lt;br /&gt;&lt;br /&gt;Let's say you hold aces, and a player across the table holds queens. You limp in with hopes that someone behind you will raise. The queens raise 3xbb, and you re-raise to 3x that amount. Now you have the queens suspicious. Your hand looks very strong from an early position check-raise, and they are right! You've basically given away the strength of your hand, and now the astute player may fold the queens right here.&lt;br /&gt;&lt;br /&gt;Now lets rewind. This time we raise with our aces 4xbb. The queens re-raise 3x your raise. Now your re-raise again 2-3x his raise. At this point the queens have a LOT more money in the middle before they have determined the strength of your hand. Many times they will be committed, and call your raise, or move all-in. This is exactly the situation you want with your aces.&lt;br /&gt;&lt;br /&gt;Regarding this whole raising strategy, it applies to most all of your poker play. Look for reasons to raise, and keep check-raises to a minimum. If you flop a straight, raise. If you flop a set, come out betting! You are likely to get more money out of those hands betting/raising than check-raising. Raising is a big part of winning poker, so don't miss that opportunity. About the only time you don't want to raise is if you have the board completely crippled, such as flopping quads or the nut boat. In that case, you may want to check and give your opponents a chance to catch a card or bluff at you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-8511502132620307966?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/8511502132620307966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=8511502132620307966' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8511502132620307966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8511502132620307966'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/02/playing-pocket-aces.html' title='Playing Pocket Aces'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-6931108714814958619</id><published>2008-01-22T16:29:00.000-06:00</published><updated>2008-01-22T17:11:06.032-06:00</updated><title type='text'>The Truth about Slot Machines</title><content type='html'>This is a follow-up to my blog post about KENO playing. There are many misconceptions about how slot machines work, and I'd like to clear them up. Some people that play slots tend to think a slot machine is "hot", or "due to hit soon" because it hasn't hit in awhile. Hopefully I can make it clear why that isn't so.&lt;br /&gt;&lt;br /&gt;Firstly, a slot machine works on pure probability. Every spin has the same chance to win. Let's say we have a slot machine that has a 100,000 in 1 chance to hit the jackpot. That means that every time you spin the reels, you have a 100,000 in 1 chance of hitting the jackpot. So what happens if you spin the reels exactly 100,000 times in a row? Will the jackpot hit once somewhere in those spins? The odds predict this, but it's not necessarily so. It might hit once, or it might not hit at all. Or, it might hit several times. You might hit two in a row! Or it might go a million pulls in a row without ever hitting one jackpot.&lt;br /&gt;&lt;br /&gt;Since every pull has an equal chance to win, they are completely independent of each other. That means, if the slot hasn't hit in 90,000 consecutive spins, that does NOT mean it has 10,000 spins left before the jackpot hits. The last 90,000 spins have zero influence on what is yet to come. You can pretty much figure that any time you sit down at this slot machine, it will probably hit the jackpot sometime in the next 100,000 spins, regardless of what has happened in the past.&lt;br /&gt;&lt;br /&gt;If you are playing on a slot machine with a progressive jackpot, you can keep a rough estimate on how long it has been since it hit. The higher the progressive, the longer it has been since the last time it hit. But, your odds of winning never change. Whether the jackpot just hit, or it has been a year since it hit, your chances of winning on each spin of the reel are exactly the same.&lt;br /&gt;&lt;br /&gt;Some say they've never seen a jackpot hit early, but it does hit a very short time after the progressive gets very big. Why is that?&lt;br /&gt;&lt;br /&gt;Well, if the jackpot hit very early, you probably wouldn't even notice. Say the jackpot hits and starts over at $1,000. You come back a week later at the jackpot has progressed to $1800. What you don't realize is that the jackpot may have hit again at $1200 and reset to $1000, then climbed it's way back to $1800. When the jackpot hits early, you can't really see any consequences of it.&lt;br /&gt;&lt;br /&gt;So why does it seem to hit soon after it gets very big? It's a matter of sheer numbers: the more spins that happen, the more chances there are to hit the jackpot. Every single spin of the reels still has a 100,000 to 1 chance to hit, but if the slot gets a whopping 100,000 spins in one week, it is likely that the jackpot will hit sometime during that week. But again, it might not hit at all, or might hit several times in that week. After the jackpot is hit, the volume of spins will most certainly die down to a trickle again, at least until it builds up again.&lt;br /&gt;&lt;br /&gt;Now you might be inclined to play the slot machine with the big progressive, and that makes sense: if you are lucky enough to hit the jackpot, it pays out better than a machine that hit recently with low progressive. But your odds of winning are no different than playing a slot machine that hit one minute ago.&lt;br /&gt;&lt;br /&gt;This logic can be carried over to the roulette wheel. Casino's have started posting the recent numbers that have hit. But, those numbers have zero influence on future spins of the reel. You can play the same number all night, or switch numbers every spin, it really doesn't matter.&lt;br /&gt;&lt;br /&gt;Keno is very much the same. The numbers that have hit recently have no influence on the upcoming numbers. You can play the same numbers all night, or switch numbers every ticket. It doesn't make a bit of difference in your chances to win.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-6931108714814958619?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/6931108714814958619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=6931108714814958619' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6931108714814958619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6931108714814958619'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2008/01/truth-about-slot-machines.html' title='The Truth about Slot Machines'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-96343039937007400</id><published>2007-12-21T10:22:00.001-06:00</published><updated>2008-01-10T08:43:01.000-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poker'/><title type='text'>It's never easy...</title><content type='html'>How often are you in this position: You are all in preflop against a dominated hand, say AQ vs AJ. You figure him for 3 outs. The flop comes 89T. No jacks, but now he is open ended. Then the turn comes and doesn't hit, but gives him a four card flush.&lt;br /&gt;&lt;br /&gt;It just seems that more often than not, if the flop doesn't hit them perfect to beat you, they end up with more and more outs. Very seldom is the flop, turn and river dead for them. Doyle says "It's never easy..." and boy is he right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-96343039937007400?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/96343039937007400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=96343039937007400' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/96343039937007400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/96343039937007400'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2007/12/its-never-easy.html' title='It&apos;s never easy...'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-5543410912492610942</id><published>2007-12-12T22:09:00.002-06:00</published><updated>2009-03-25T16:41:25.146-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='universe'/><title type='text'>What is beyond our Universe?</title><content type='html'>This is always a fascinating question to think about. What is beyond the universe as we know it? If we perceive our universe to be constantly expanding, what is it expanding into? Nothing? How do you describe nothing?&lt;br /&gt;&lt;br /&gt;Is there life beyond our planet? If the universe is infinitely big, it would seem impossible that we are the only living thing in the vastness of space.&lt;br /&gt;&lt;br /&gt;Interesting things to think about. Here are links to three things that are fun to take a look at:&lt;br /&gt;&lt;br /&gt;From the Milkyway to Quarks. Zoom in from the largest to the smallest of things.&lt;br /&gt;&lt;a href="http://micro.magnet.fsu.edu/primer/java/scienceopticsu/powersof10/index.html"&gt;http://micro.magnet.fsu.edu/primer/java/scienceopticsu/powersof10/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Imagining the 10th dimension. It's hard to grasp.&lt;br /&gt;&lt;a href="http://video.google.com/videoplay?docid=-97057222894136590"&gt;http://video.google.com/videoplay?docid=-97057222894136590&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;They're made out of meat, by Terry Bison. This gives you one man's hilarious imagination regarding how aliens may perceive us.&lt;br /&gt;&lt;a href="http://www.terrybisson.com/meat.html"&gt;http://www.terrybisson.com/meat.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-5543410912492610942?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/5543410912492610942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=5543410912492610942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5543410912492610942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5543410912492610942'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2007/12/what-is-beyond-our-universe.html' title='What is beyond our Universe?'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-5800158127869105596</id><published>2007-12-12T09:52:00.000-06:00</published><updated>2008-01-10T08:46:22.302-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>TinyMVC</title><content type='html'>I had started on a PHP MVC framework many months ago. I got it working but never released it to the public. I think it is finished enough to let some people try it out.&lt;br /&gt;&lt;br /&gt;TinyMVC is quite possibly the smallest, fastest and featureless ;) MVC framework for PHP. It's a perfect starting point for your application if you are starting from scratch, and want to adhere to the MVC design principle. It uses PDO as the model by default. It requires PHP5.&lt;br /&gt;&lt;br /&gt;TinyMVC does not require a template engine, it uses PHP as it's view layer. However, you are free to bolt on any template engine of your liking, and there is an example for Smarty in the docs.&lt;br /&gt;&lt;br /&gt;To try out TinyMVC, go to &lt;a href="http://www.tinymvc.com/"&gt;http://www.tinymvc.com/&lt;/a&gt; (passwords have been removed.)&lt;br /&gt;&lt;br /&gt;Read through all the documentation before you begin, it doesn't take but a few minutes. Let me know what you think. Feel free to report bugs. The framework is tiny (16k download), so they should be easy to find.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-5800158127869105596?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/5800158127869105596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=5800158127869105596' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5800158127869105596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5800158127869105596'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2007/12/tinymvc.html' title='TinyMVC'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-6947067507665677259</id><published>2007-12-02T19:03:00.000-06:00</published><updated>2008-01-10T08:47:01.640-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pc'/><title type='text'>Build your own $200 PC</title><content type='html'>I saw the $199 gPC at Wal-Mart, and wondered if I could build a better system for the same cost. So, here goes my attempt. This PC was designed for typical use: email, internet, word processing, etc. This is NOT meant for hard core gaming. I looked for the best bargain for the buck. No junk, just acceptable hardware for the extreme budget in mind.&lt;br /&gt;&lt;br /&gt;Everything was put together from Newegg.com. For $203.93 (yes, I went over by a mere 3.93), I ended up with:&lt;br /&gt;&lt;br /&gt;2.0GHz AMD Athlon CPU / Motherboard combo ($69.99)&lt;br /&gt;Nvidia GForce 6100 (built into Motherboard)&lt;br /&gt;512MB DDR RAM (2x256) ($29.99)&lt;br /&gt;Black tower case with 430W power supply ($19.99)&lt;br /&gt;160GB IDE hard disk ($45.99)&lt;br /&gt;black keyboard/mouse ($6.99)&lt;br /&gt;20x DVD +/- burner ($27.99)&lt;br /&gt;black speakers (2.99)&lt;br /&gt;&lt;br /&gt;All that for $203.93. Not bad!&lt;br /&gt;&lt;br /&gt;Here is the parts list:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16827106228"&gt;LITE-ON 20X DVD±R DVD Burner&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16811164057"&gt;Linkworld 3230-02C2222U Black Steel ATX Case 430W PS&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16822210004"&gt;EXCELSTOR  160GB 7200 RPM SATA Hard Drive&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16823157013"&gt;SpecResearch SP-250 2.0 Speakers&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16820141433"&gt;SpecResearch PS/2 Standard Multi-Media Keyboard/Mouse&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16813135057"&gt;Kingston 512MB (2 x 256MB) 184-Pin DDR SDRAM&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16836170004"&gt;ECS C51G-M754 A 3200+ AMD Athlon 3200+ 754 NVIDIA GeForce 6100&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I could have saved even more by excluding some luxuries such as DVD burning, less hard disk space and less RAM. I did put myself on a budget of $200, so I gave myself the most I could get.&lt;br /&gt;&lt;br /&gt;Now lets compare this to the$199 Green PC available at Wal-Mart:&lt;br /&gt;&lt;br /&gt;1.5GHz CPU&lt;br /&gt;80GB hard disk&lt;br /&gt;DVD ROM (no DVD burning)&lt;br /&gt;VIA UniChrome Pro&lt;br /&gt;Linux/OpenOffice (you can download for free)&lt;br /&gt;Fax-Modem (who needs that? add $5.99 to my cost if you need it.)&lt;br /&gt;&lt;br /&gt;So, it seems my home-build system is faster, has double the hard disk capacity, a DVD burner, and better video capability. Not to mention the Linkworld case looks better, and better built IMHO.&lt;br /&gt;&lt;br /&gt;So there you go, build it yourself (or have your kid do it, it's not hard), and you can get a lot more computer for the same cost.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-6947067507665677259?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/6947067507665677259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=6947067507665677259' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6947067507665677259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6947067507665677259'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2007/12/build-your-own-200-pc.html' title='Build your own $200 PC'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-7292602779626308459</id><published>2007-11-13T10:38:00.000-06:00</published><updated>2008-01-10T08:43:21.287-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poker'/><title type='text'>poker programs steal window focus</title><content type='html'>One very annoying "feature" of most poker clients (such as PokerStars) is that they constantly steal the focus of your currently active window. How often have you accidentally typed a password or a private conversation to everyone at the table? Fortunately, there is an easy way to fix this for Windows (I'm using XP, I haven't tried Vista.) The instructions are &lt;a href="http://pcsupport.about.com/od/windowsxp/ht/stealingfocus01.htm"&gt;here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-7292602779626308459?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/7292602779626308459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=7292602779626308459' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/7292602779626308459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/7292602779626308459'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2007/11/poker-programs-steal-window-focus.html' title='poker programs steal window focus'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-310731599768634125</id><published>2007-10-17T09:01:00.000-05:00</published><updated>2008-01-10T08:43:38.978-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poker'/><title type='text'>How to not go broke playing on-line poker</title><content type='html'>You consider yourself a good poker player, better than most. But, it seems like you relentlessly go broke. Bad beats seem to consume you. You can't overcome the inevitable sucks-outs that eventually deplete your bankroll. How do you survive?&lt;br /&gt;&lt;br /&gt;Typically the problem is bankroll management, and this is coupled with self discipline. Even if you are the best player, you will get bad beats, and gambling too much of your bankroll is a big mistake. What is even worse, many players will gamble an even bigger chunk of their bankroll to recover, play on tilt, and lose the whole thing. That is self discipline that needs corrected. So instead of just preaching about it, I'm going to give you three discreet rules to follow.&lt;br /&gt;&lt;br /&gt;Rule 1. Never gamble more than 5% of your entire bankroll. Don't sit down at any table, any game for more than 5%. One exception is if you only have $10 or less. You could stick to penny poker, or just gamble a bit more (10%) until you are lucky enough to reach at least $50. Once you hit $50, lock in this rule.&lt;br /&gt;&lt;br /&gt;Rule 2. If you decide to play a no-limit or pot-limit cash game for 5%, leave as soon as you double up your stake. Why is that you say? If you are gambling 5% and you double that to 10% or more, you don't want to open yourself to the opportunity of getting busted for 10% of your bankroll. Leave and start over. If you like playing a monster stack, just play lower limits so that stack is 5% or less of your entire bankroll.&lt;br /&gt;&lt;br /&gt;Rule 3. If you enter a large tournament, don't gamble more than 3% of your bankroll. Large tournaments are going to be more difficult to cash, and the payback may not be so much unless you get really deep. If you are entering a rebuy tournament, estimate your rebuy/add-on total into that 3%.&lt;br /&gt;&lt;br /&gt;Now, about self discipline. If you end up on a losing streak (and you WILL), you must drop down to lower stakes until you recover. Sometimes that means dropping down two, or even three levels of stakes if the going gets tough. What you have to overcome is the frustration of moving down, and this is just a part of playing poker. You will get bad runs, and temporarily moving down to lower limits is just part of the journey. It is also possible that you are playing limits that you are not yet profitable at. Even so, moving down, then back up when you regain your bankroll is going to keep you alive while you learn those higher limits.&lt;br /&gt;&lt;br /&gt;That's it. If you try these three rules, let me know how it goes!&lt;br /&gt;&lt;br /&gt;Oh and by the way, these rules apply to live poker too. Keep yourself a bankroll set aside just for poker. The vast majority of poker players just take whatever money they have. Sometimes they win, sometimes they lose. They really have no concept of how much they win or lose overall. But with a bankroll set aside, all of a sudden you are faced with the realization of whether or not you actually win or lose playing poker. Good for you! If you can't keep that bankroll alive without a constant feed from the paycheck, you might want to try these rules :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-310731599768634125?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/310731599768634125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=310731599768634125' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/310731599768634125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/310731599768634125'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2007/10/how-to-not-go-broke-playing-on-line.html' title='How to not go broke playing on-line poker'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-8904000345065298973</id><published>2007-09-27T09:07:00.000-05:00</published><updated>2008-01-10T08:47:17.899-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone mac'/><title type='text'>first iPhone app</title><content type='html'>I wrote my first web-based iPhone app. It's ridiculously simple yet useful, a car lease calculator. Now when you're haggling for that payment price, you can look it up yourself :) It works in normal browsers too, have a look.&lt;br /&gt;&lt;br /&gt;[edit: moved to motortopia.com]&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.motortopia.com/mobile/lease"&gt;http://www.motortopia.com/mobile/lease&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-8904000345065298973?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/8904000345065298973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=8904000345065298973' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8904000345065298973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8904000345065298973'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2007/09/first-iphone-app.html' title='first iPhone app'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-8902613791417486656</id><published>2007-09-23T15:58:00.000-05:00</published><updated>2008-01-10T08:47:30.265-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone mac'/><title type='text'>The iphone drama</title><content type='html'>Yes, the iphone. It has been the talk of the town since June. Although I had not seen one in person, I wanted one. I never bought a PDA. I wanted to wait until the day I could easily do everything on one device, most notably:&lt;br /&gt;&lt;br /&gt;* talk on the phone&lt;br /&gt;* surf the web&lt;br /&gt;* read email&lt;br /&gt;* listen to music&lt;br /&gt;&lt;br /&gt;I stress the word &lt;span style="font-style:italic;"&gt;easily&lt;/span&gt;. The iphone is the first thing I've seen that lives up to this dream. I tried a few of the Smart phones such as the 8525 and 3125 from Cingular. They were, to say the least, difficult to work with. The 8525 sucked as a phone, and pretty bulky. The 3125 just wasn't too usable except as a phone, and it was sluggish.&lt;br /&gt;&lt;br /&gt;Now that the price came down considerably, I ordered my iphone. It will be arriving next week. Also, I got a hold of a friend's iphone a few days ago and played with it. Although you could nitpick about a few things (3G, GPS, replaceable battery), even as a version 1.0 product it is MILES ahead of the pack. This has to be, by far, the most profound gadget in history.&lt;br /&gt;&lt;br /&gt;I gave it the girlfriend test. She uses a Mac for Safari, Mail, and Microsoft Word. By no means is she a gadget user. I handed her the iphone and said, "Go to catster, look up your cat." She did it on her own, and quite easily. No coaching, no prior use or guidance of the iphone. Then I gave her my 3125 and said do the same thing. It took her at least a couple minutes to figure out how to use the soft-keys. Then she found the web browser, I had to help her a bit to get the URL prompt up. She did know how to punch in letters, she must have SMS'd before. But she couldn't figure out how to type a period "." without some help. Now as far as viewing the page in mobile IE, well let's just stop there.&lt;br /&gt;&lt;br /&gt;No, I'm not a mac geek. I've used Macs, and I like them. I have a Mac at home. But I still use Ubuntu and Windows primarily. Why? A few reasons, but mostly because the poker clients I use are not available on a Mac. Poker Stars, are you listening?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-8902613791417486656?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/8902613791417486656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=8902613791417486656' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8902613791417486656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/8902613791417486656'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2007/09/iphone-drama.html' title='The iphone drama'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-5148155476052322427</id><published>2007-04-19T10:53:00.000-05:00</published><updated>2007-04-20T08:58:51.174-05:00</updated><title type='text'>Getting weather in PHP</title><content type='html'>Just a quick tip how to get weather from weather.gov using their SOAP WSDL weather service. You will need to know the latitude and longitude of the place you are getting weather for.&lt;br /&gt;&lt;br /&gt;First, make sure you have the --enable-soap extension installed.&lt;br /&gt;&lt;br /&gt;Then it is just two lines of code:&lt;br /&gt;&lt;br /&gt;$client = new SoapClient('http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl#NDFDgen');&lt;br /&gt;&lt;br /&gt;$result = $client-&gt;NDFDgen(40.7893,-96.6938,'glance','2007-04-20T00:00','2007-04-21T00:00',NULL);&lt;br /&gt;&lt;br /&gt;More information here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nws.noaa.gov/forecasts/xml/"&gt;http://www.nws.noaa.gov/forecasts/xml/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-5148155476052322427?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/5148155476052322427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=5148155476052322427' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5148155476052322427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5148155476052322427'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2007/04/getting-weather-in-php.html' title='Getting weather in PHP'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-4096705772715621129</id><published>2007-03-26T22:03:00.000-05:00</published><updated>2008-01-10T08:43:56.745-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poker'/><title type='text'>controlling tilt</title><content type='html'>I went up to the Horseshoe casino Saturday evening and played some 2-5 No Limit. I bought in for $300 and walked out with $800 about six hours later. It was a pretty successful night of poker. I thought I'd mention one interesting hand regarding tilt.&lt;br /&gt;&lt;br /&gt;There was a guy at the table talking a lot most of the night. It seemed he wanted everyone to know he's quite the seasoned player. Good for him. At one point during the night he decided he was buying the blinds from the small blind, and raised a pot-size raise with four limpers. One caller from the button, the flop came 89J, rainbow. The small blind makes a comment "Well, if you out-flopped me, you got me." (weakness?), and moved all in for about the size of the pot. The button called and turned up TJs. The small-blind scoffed and turned up K9o. He didn't catch up, and started ridiculing the button's play. "Interesting play. You'll go broke playing like that. Just keep it up." Then someone at the table shook their head, and then he decided to get in their face about it.&lt;br /&gt;&lt;br /&gt;The guy is shaking his head because Mr. brilliant raised out of position with K9 and lost his bankroll. Obviously he picked the wrong hand and the wrong time, and it was unsuccessful. But my question, why ridicule the winner?&lt;br /&gt;&lt;br /&gt;To be honest, I can't think of a good reason to ridicule another player. If he outplayed you, you make yourself look even worse. If the other guy make a horrible play and got lucky, so what? You &lt;span style="font-style: italic;"&gt;want&lt;/span&gt; those players at the table! A &lt;span style="font-style: italic;"&gt;nice hand sir!&lt;/span&gt; is in order! Make him feel good about his chase, he'll give up his money sooner or later. Are you trying to teach something? What for?&lt;br /&gt;&lt;br /&gt;OK, we know the most probable reason: tilt. You have to learn to control your emotions. Getting a bad beat can be a tough thing to deal with. The other players know what happened, you don't need to explain anything to them. But the better they see you control yourself, the more respect you'll gain from them. And, it makes you feel better about yourself, and thats a little something that goes a long way to making you a stronger player.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-4096705772715621129?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/4096705772715621129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=4096705772715621129' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/4096705772715621129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/4096705772715621129'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2007/03/controlling-tilt.html' title='controlling tilt'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-933668181899922268</id><published>2007-02-26T12:02:00.000-06:00</published><updated>2008-01-10T08:48:07.701-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hot sauce'/><title type='text'>The hottest hot sauces</title><content type='html'>You like hot sauce? This is a comprehensive list of hot sauces and their "scoville" ratings. I personally own a Dave's ultimate insanity (90,000 scoville) and Mad Dog 357 special edition (600,000 scoville), both too hot to take straight on. I couldn't imagine 16 million scoville. Use at your own risk.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://scottrobertsweb.com/scoville-scale.php"&gt;Sauces and their scoville ratings&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-933668181899922268?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/933668181899922268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=933668181899922268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/933668181899922268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/933668181899922268'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2007/02/hottest-hot-sauces.html' title='The hottest hot sauces'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-5750762814424506207</id><published>2007-02-23T16:17:00.000-06:00</published><updated>2008-01-13T19:57:30.894-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poker'/><title type='text'>Poker Odds Calculator</title><content type='html'>This is a project I worked on last year. It is pretty useful for a lot of odds calculations such as poker, keno, etc. It has a very raw interface, but at the same time very flexible. You can also do simple Binomial Coefficient calculations, which is what the poker calculator is based on.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ohrt.com/odds/"&gt;Monte's Poker Odds Calculator&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-5750762814424506207?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/5750762814424506207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=5750762814424506207' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5750762814424506207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/5750762814424506207'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2007/02/poker-odds-calculator.html' title='Poker Odds Calculator'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-2224326410184489880</id><published>2007-02-22T22:37:00.000-06:00</published><updated>2008-01-10T08:48:20.883-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='joost tv'/><title type='text'>Joost: The future of TV?</title><content type='html'>I just got myself a beta invite to joost.com. Its an IPTV startup, created by the makers of Skype. So far, I'm very impressed with it. Think streaming TV, full screen. Think TV shows, without the need to torrent.&lt;br /&gt;&lt;br /&gt;Currently it seems to be on-demand content only. Fifth Gear, Worlds strongest man competition, cooking shows, etc. I'm sure this will only get better as they make more deals with large broadcasting companies. This should quickly become a good alternative to cable or satellite TV!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-2224326410184489880?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/2224326410184489880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=2224326410184489880' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/2224326410184489880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/2224326410184489880'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2007/02/joost-future-of-tv.html' title='Joost: The future of TV?'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8861470730700525370.post-6534886094679531076</id><published>2007-02-16T18:01:00.000-06:00</published><updated>2008-01-10T08:48:38.139-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='keno'/><title type='text'>The truth about KENO</title><content type='html'>Over the years, I hear people talk about playing KENO now and then. Many claim to make money at the game, know someone who is a professional KENO player, or have some sort of number choosing system to help them win. There aren't too many sites that lay out the plain truth about this gambling game. Hopefully I will be able to change that, and make this crystal clear :)&lt;br /&gt;&lt;br /&gt;So, lets start out by getting right to the point. KENO is a lottery game. That is, it is a game of chance. A game of luck. Much like BINGO, there isn't any specific strategy or number picking "system" that is going to enable you to beat the odds. KENO may give the illusion of your control by picking numbers, but the odds are always going to be against you no matter how you place your bets. The ONLY way you are going to win at this game is with luck. On any one given night, you may be lucky and win. That's why it is played. But over the course of time, the odds will almost inevitably catch up to you. I say &lt;span style="font-style: italic;"&gt;almost&lt;/span&gt; because you could strike a big payout, like in the tens of thousands. But not likely. You have a better chance of being struck by lightning!&lt;br /&gt;&lt;br /&gt;On average, playing KENO will pay back about .69 cents for every $1 you gamble. That means, if you gamble $1000.00, say, over the course of a year, your expected return will be somewhere around $690.00, or you lose $310.00 total. Those are some grim numbers. The house has a 31% advantage! You are much better off playing slots, where the house may have a 1% or 2% advantage. Blackjack and Craps, the house has around a 1% advantage assuming you play "by the book", no mistakes. Even Roulette is somewhat better, with the house having a 5% advantage. So if you have a choice, play something else!&lt;br /&gt;&lt;br /&gt;So why do we play this game with such a terrible odds against us? Probably because of the allure of making one dollar into thousands with one ticket. These chances are extreme, but they are there. Unlike a game such as Blackjack, where the wins and losses are pretty linear with your bets.&lt;br /&gt;&lt;br /&gt;Now for a couple of analogies to clear up exactly why number picking systems do not work.&lt;br /&gt;&lt;br /&gt;Lets say we have a bowl of marbles, 7 black and 3 white. If we pull a random marble out, we have a 70% of getting a black one, and a 30% of getting a white one. Let say we bet a dollar, and we win a dollar when we draw a white marble, and lose it when we draw a black one. After 1000 games, you are very likely going to lose about 70% of them, therefore losing a lot of money. I suppose it is possible to come out ahead, but the odds are pretty astronomical.&lt;br /&gt;&lt;br /&gt;Now we can compare that analogy to KENO. At any one night of playing we can win, just as we can draw a white marble from the bowl now and then. But if you keep playing, keep putting your money in, you will see in the long run that the odds of coming out ahead are pretty slim.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;But KENO lets me pick which numbers to play!&lt;/span&gt; OK, lets play out this analogy. Lets say instead of 7 black balls and 3 white, we have 10 balls, numbered 1 through 10. Each time you play, you get to pick 3 numbers out of 10. If you draw one of your numbers, you win a dollar. If not, you lose. It should be fairly clear that whether you pick 3 numbers, or just color them black and white, the odds of drawing 1 of the 3 balls out of 10 are always the same, about 30%. So although it may seem to help by picking numbers, the odds don't change at all.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Well, I can play the same numbers until they don't come in four times in a row, then choose different ones. Or, I can keep track of the numbers that are hot or cold, and base my choices on this information!&lt;/span&gt; Alright, lets try another analogy. Lets say we flip a coin. 50/50 shot of getting heads or tails. One day, we flip head 10 times in a row. Amazing! Now tell me, what are the chances of flipping heads again on the 11th toss? If you said 50/50, you are exactly right. The last 10 flips have no influence on what is coming next. Taking this knowledge to the KENO game, whether you stay with the same numbers all night, pick different numbers every ticket, or some other sort of number picking system, it really isn't going to matter one bit. The odds are the same, you are just as likely to win with anything you pick.&lt;br /&gt;&lt;br /&gt;Now, I'm not going to say you can't make any influence on your chances to win. You can, but not much. The pick-3 is the best game to play for the player, whereas the pick-10 is about the worst. But, the difference between these two are negligible, less than 1% to be honest. So, it really doesn't matter what you play, just keep in mind that you are only playing to have fun and expect to lose your money.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8861470730700525370-6534886094679531076?l=mohrt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mohrt.blogspot.com/feeds/6534886094679531076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8861470730700525370&amp;postID=6534886094679531076' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6534886094679531076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8861470730700525370/posts/default/6534886094679531076'/><link rel='alternate' type='text/html' href='http://mohrt.blogspot.com/2007/02/truth-about-keno.html' title='The truth about KENO'/><author><name>mohrt</name><uri>http://www.blogger.com/profile/12160903071209543914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry></feed>
