<?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-4087609146113640787</id><updated>2012-02-27T20:30:05.827-08:00</updated><category term='line wrapping'/><category term='west wing references'/><category term='java'/><category term='programming style'/><title type='text'>Technology Sufficiently Advanced</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://technologysufficientlyadvanced.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://technologysufficientlyadvanced.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Gary LosHuertos</name><uri>http://www.blogger.com/profile/12980387598844763141</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_LGiifFObGzU/TJsv7Q-LbZI/AAAAAAAACNc/yk1ocLvUC3M/S220/facebook+profile+photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4087609146113640787.post-2537787148225901869</id><published>2011-10-16T13:01:00.000-07:00</published><updated>2011-10-16T13:01:10.456-07:00</updated><title type='text'>Eclipse Indigo on OS X 10.6.8: Tuning eclipse.ini</title><content type='html'>Based on information from a lot of places (on stackoverflow &lt;a href="http://stackoverflow.com/questions/142357/what-are-the-best-jvm-settings-for-eclipse/1409590#1409590"&gt;here&lt;/a&gt;, &lt;a href="http://stackoverflow.com/questions/1046887/eclipse-3-5-switching-tab-is-very-slow"&gt;here&lt;/a&gt; and &lt;a href="http://stackoverflow.com/questions/2399084/horrible-eclipse-performance-on-macbook-pro-running-10-5-8"&gt;here&lt;/a&gt;; and various other parts of the Internet) I've cobbled together an eclipse.ini that doesn't hose my system. Note that I'm on a 4GB MacBook Pro from early 2011.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;-startup
../../../plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
../../../plugins/org.eclipse.equinox.launcher.cocoa.macosx.x86_64_1.1.100.v20110502
-product
org.eclipse.epp.package.java.product
--launcher.defaultAction
openFile
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
384m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Declipse.p2.unsignedPolicy=allow
-XX:MaxGCPauseMillis=1000
-XX:MaxHeapFreeRatio=70
-XX:+CMSIncrementalPacing
-XX:+UnlockExperimentalVMOptions
-XX:+UseFastAccessorMethods
-XX:+UseCompressedOops
-Dide.gc=true
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-XX:MaxPermSize=384m
-Xms512m
-Xmx2048m
-Xdock:icon=../Resources/Eclipse.icns
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
&lt;/pre&gt;&lt;br /&gt;
I'm running the 64-bit Cocoa version of Eclipse. You'll find the eclipse.ini in &lt;pre&gt;Eclipse.app/Contents/MacOS/eclipse.ini&lt;/pre&gt;.&lt;br /&gt;
I'd also highly recommend turning on "Show heap status" in the "General" preferences section; this shows how much heap space you're using and lets you request garbage collection.&lt;br /&gt;
&lt;br /&gt;
Aside from settings, I've also found that being diligent about keeping only the projects you need open is a big deal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4087609146113640787-2537787148225901869?l=technologysufficientlyadvanced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologysufficientlyadvanced.blogspot.com/feeds/2537787148225901869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologysufficientlyadvanced.blogspot.com/2011/10/eclipse-indigo-on-os-x-1068-tuning.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default/2537787148225901869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default/2537787148225901869'/><link rel='alternate' type='text/html' href='http://technologysufficientlyadvanced.blogspot.com/2011/10/eclipse-indigo-on-os-x-1068-tuning.html' title='Eclipse Indigo on OS X 10.6.8: Tuning eclipse.ini'/><author><name>Gary LosHuertos</name><uri>http://www.blogger.com/profile/12980387598844763141</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_LGiifFObGzU/TJsv7Q-LbZI/AAAAAAAACNc/yk1ocLvUC3M/S220/facebook+profile+photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4087609146113640787.post-8018279422571278787</id><published>2011-09-21T12:12:00.000-07:00</published><updated>2011-09-21T12:12:16.355-07:00</updated><title type='text'>thefacebook/WHARRGARBL</title><content type='html'>I joined thefacebook in early 2005. Since then, new features have been released, always met with a storm of criticism for "changing things." Yet in retrospect, almost all of these features have been widely embraced because they make the site better. &lt;br /&gt;
&lt;br /&gt;
Like Apple, the people at Facebook spend time thinking about their users' problems; they know what their users want better than their users do. The primary difference: Apple has managed to convince their customers this is true, whereas Facebook has not.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://theoatmeal.com/pl/state_web_winter/facebook_layout"&gt;Have some Oatmeal&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4087609146113640787-8018279422571278787?l=technologysufficientlyadvanced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologysufficientlyadvanced.blogspot.com/feeds/8018279422571278787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologysufficientlyadvanced.blogspot.com/2011/09/thefacebookwharrgarbl.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default/8018279422571278787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default/8018279422571278787'/><link rel='alternate' type='text/html' href='http://technologysufficientlyadvanced.blogspot.com/2011/09/thefacebookwharrgarbl.html' title='thefacebook/WHARRGARBL'/><author><name>Gary LosHuertos</name><uri>http://www.blogger.com/profile/12980387598844763141</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_LGiifFObGzU/TJsv7Q-LbZI/AAAAAAAACNc/yk1ocLvUC3M/S220/facebook+profile+photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4087609146113640787.post-3034295970273569590</id><published>2010-12-27T05:26:00.000-08:00</published><updated>2011-08-05T23:48:59.210-07:00</updated><title type='text'>Snowmageddon 2010</title><content type='html'>&lt;a href="http://www.flickr.com/photos/55192998@N06/5296103239/" title="IMG_9806 by gary.loshuertos, on Flickr"&gt;&lt;img src="http://farm6.static.flickr.com/5209/5296103239_c0c5cacabc.jpg" width="500" height="333" alt="IMG_9806"&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I woke up this morning around 5am and decided to brave the snow to take some photographs of the aftermath of the blizzard. &amp;nbsp;Despite having given my ankle a mild sprain while walking across the park on Christmas, I was able to trudge through the snow for about an hour.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.flickr.com/photos/55192998@N06/5296684948/" title="This taxi didn't move for an hour and a half. by gary.loshuertos, on Flickr"&gt;&lt;img alt="This taxi didn't move for an hour and a half." height="333" src="http://farm6.static.flickr.com/5128/5296684948_33034a4670.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
In my six months in New York, I've learned a lot about how people move around in the city. &amp;nbsp;New Yorkers jaywalk; if they didn't, nobody would ever get anywhere (traffic lights aren't timed for pedestrians). &amp;nbsp;But while walking across the street is normal, walking in the street is not. &amp;nbsp;With the snow mounds covering the sidewalks, the only viable route for pedestrians is to walk alongside motorists on the plowed streets.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.flickr.com/photos/55192998@N06/5296701306/" title="IMG_9867 by gary.loshuertos, on Flickr"&gt;&lt;img alt="IMG_9867" height="333" src="http://farm6.static.flickr.com/5047/5296701306_59134dbde6.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
On every street you could see evidence of drivers who had attempted to move their vehicles and failed. &amp;nbsp;Cars with their hazard lights on, pulled a few feet off the curb and then left behind a mound of snow. &amp;nbsp;I watched as a&amp;nbsp;limousine&amp;nbsp;driver attempted to pull onto Lexington Avenue, stuck in the pile of snow created by the plows. &amp;nbsp;I spoke to him briefly, offering half in jest to give him a push. &amp;nbsp;He was confident he'd be able to get through if he let the car rest for a minute. &amp;nbsp;He finally dislodged his car after ten or fifteen minutes.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.flickr.com/photos/55192998@N06/5296686014/" title="I had a chat with this driver for a few minutes.  It took him 20 minutes to get through the intersection. by gary.loshuertos, on Flickr"&gt;&lt;img alt="I had a chat with this driver for a few minutes.  It took him 20 minutes to get through the intersection." height="333" src="http://farm6.static.flickr.com/5164/5296686014_526e6a196b.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The flickr set:&lt;br /&gt;
&lt;a href="http://www.flickr.com/photos/55192998@N06/sets/72157625683038786/"&gt;http://www.flickr.com/photos/55192998@N06/sets/72157625683038786/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Videos from the snow last night:&lt;br /&gt;
&lt;a href="http://vimeo.com/18196656"&gt;http://vimeo.com/18196656&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://vimeo.com/18201205"&gt;http://vimeo.com/18201205&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://vimeo.com/18201358"&gt;http://vimeo.com/18201358&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4087609146113640787-3034295970273569590?l=technologysufficientlyadvanced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologysufficientlyadvanced.blogspot.com/feeds/3034295970273569590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologysufficientlyadvanced.blogspot.com/2010/12/snowmageddon-2010.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default/3034295970273569590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default/3034295970273569590'/><link rel='alternate' type='text/html' href='http://technologysufficientlyadvanced.blogspot.com/2010/12/snowmageddon-2010.html' title='Snowmageddon 2010'/><author><name>Gary LosHuertos</name><uri>http://www.blogger.com/profile/12980387598844763141</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_LGiifFObGzU/TJsv7Q-LbZI/AAAAAAAACNc/yk1ocLvUC3M/S220/facebook+profile+photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5209/5296103239_c0c5cacabc_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4087609146113640787.post-276058444731437536</id><published>2010-12-22T13:21:00.000-08:00</published><updated>2010-12-22T13:21:45.990-08:00</updated><title type='text'>The Open Internet</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.theopeninter.net/" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="235" width="300" src="http://1.bp.blogspot.com/_LGiifFObGzU/TRJrZA7U6HI/AAAAAAAACV0/KdcYPOU4NZA/s320/openinternet.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
In the wake of the recent FCC action on net neutrality, we're starting to see more mainstream coverage of the issues around the open Internet.  But most people don't understand how a failure to guarantee an open Internet directly affects their lives.  &lt;a href="http://www.theopeninter.net/"&gt;theopeninter.net&lt;/a&gt; provides a simple, visual to-the-point rundown of why we need net neutrality.&lt;br /&gt;
&lt;br /&gt;
While spending time with your family this holiday season, take a few minutes to share the importance of net neutrality with them -- so they won't be paying per holiday Facebook post next year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4087609146113640787-276058444731437536?l=technologysufficientlyadvanced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologysufficientlyadvanced.blogspot.com/feeds/276058444731437536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologysufficientlyadvanced.blogspot.com/2010/12/open-internet.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default/276058444731437536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default/276058444731437536'/><link rel='alternate' type='text/html' href='http://technologysufficientlyadvanced.blogspot.com/2010/12/open-internet.html' title='The Open Internet'/><author><name>Gary LosHuertos</name><uri>http://www.blogger.com/profile/12980387598844763141</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_LGiifFObGzU/TJsv7Q-LbZI/AAAAAAAACNc/yk1ocLvUC3M/S220/facebook+profile+photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LGiifFObGzU/TRJrZA7U6HI/AAAAAAAACV0/KdcYPOU4NZA/s72-c/openinternet.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4087609146113640787.post-5676468411530594928</id><published>2010-11-04T18:08:00.000-07:00</published><updated>2010-11-04T18:13:00.149-07:00</updated><title type='text'>Herding Firesheep: Addendum</title><content type='html'>&lt;p&gt;Following my previous post I found that out of brevity I'd omitted some information.  This serves as an addendum to &lt;a href="http://technologysufficientlyadvanced.blogspot.com/2010/10/herding-firesheep-in-new-york-city.html"&gt;my previous post&lt;/a&gt;.  This has been editorialized as little as possible.&lt;/p&gt;&lt;p&gt;The original message sent to the patrons was as follows:&lt;/p&gt;&lt;blockquote&gt;Because you are using Facebook at a Starbucks without encryption, your account has been compromised.  I'm just a friendly fellow Starbucks patron who felt you should know about the vulnerability.&lt;br /&gt;
&lt;br /&gt;
You can learn more by searching for "Firesheep".  There aren't readily available ways to protect your Facebook account while on a public network, so I'd recommend just staying off it at Starbucks.  This exploit also affects Twitter, Amazon.com, Google (not Gmail), and several other services.&lt;br /&gt;
&lt;br /&gt;
Your password has not been compromised; logging out of Facebook is all you need to do.&lt;/blockquote&gt;&lt;p&gt;As for the significance of &lt;i&gt;why&lt;/i&gt; leaving one's Facebook account unprotected: a compromised Facebook account doesn't just mean someone can view your photos, likes, wall posts.  A compromised Facebook account gives someone access to an identity, to perform social engineering attacks, and to potentially ruin relationships (both out of boredom and for gain).  While much of this can be corrected, the time and energy it takes to do so is significant, especially when someone has a large number of friends.  Someone sending a fake message to one of your friends may not seem like a big deal, but someone sending a fake message to 500 of them is - especially when that 500 may include colleagues, family, and clients.&lt;/p&gt;&lt;p&gt;As for the legality of my actions: such was not the point of the article.  While you're welcome to speculate as to whether or not I'll be thrown in jail, it's irrelevant to the threat that unprotected websites like Facebook and Twitter pose to their users.  I'd much rather you channel your energy into spreading the word rather than trolling the comments on my blog wishing for my incarceration.&lt;/p&gt;&lt;p&gt;As for what users can do, the best answer right now is nothing.  Stay off unprotected networks when using these websites, or use an application that does not use unprotected authorization cookies (from what I've heard, the Facebook for iPhone app does not).  Make sure your home network uses WPA or WPA2 encryption (WEP is trivially crackable).  If you use Facebook at work on a wireless connection, verify that the network uses WPA or WPA2 encryption.  &lt;b&gt;The threat does not just come from Firesheep, it comes from the lack of protection of the connection.&lt;/b&gt;  The larger threat is from automated tools that have already existed for years.&lt;/p&gt;&lt;p&gt;I've disabled comments for this post as it is intended as an addendum; if you'd like to leave comments, please do so on &lt;a href="http://technologysufficientlyadvanced.blogspot.com/2010/10/herding-firesheep-in-new-york-city.html"&gt;the original article&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4087609146113640787-5676468411530594928?l=technologysufficientlyadvanced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default/5676468411530594928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default/5676468411530594928'/><link rel='alternate' type='text/html' href='http://technologysufficientlyadvanced.blogspot.com/2010/11/herding-firesheep-addendum.html' title='Herding Firesheep: Addendum'/><author><name>Gary LosHuertos</name><uri>http://www.blogger.com/profile/12980387598844763141</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_LGiifFObGzU/TJsv7Q-LbZI/AAAAAAAACNc/yk1ocLvUC3M/S220/facebook+profile+photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4087609146113640787.post-6898905691857656543</id><published>2010-10-27T18:50:00.000-07:00</published><updated>2010-11-04T18:10:44.149-07:00</updated><title type='text'>Herding Firesheep in New York City</title><content type='html'>There's been a lot of talk about &lt;a href="http://codebutler.com/firesheep"&gt;Firesheep&lt;/a&gt; over the last few days.  The free Firefox extension collects cookies that have been broadcast over an unprotected WiFi network without using SSL.  You turn it on, it collects cookies for Facebook, Twitter, and 24 other sites (by default).  Then, you can sidejack the account and gain access under the acquired identity.&lt;p&gt;This extension isn't shocking.  If you're worth your weight as a developer, you've known this flaw has existed for a long time, right? But what about the rest of the world?  What about the people who haven't heard about the newly accessible threat through their friends, through &lt;a href="http://www.engadget.com/2010/10/25/firesheep-makes-stealing-your-cookies-accessing-your-facebook-a/"&gt;Engadget&lt;/a&gt;, through &lt;a href="http://news.slashdot.org/story/10/10/25/1031235/Firefox-Extension-Makes-Social-Network-ID-Spoofing-Trivial"&gt;Slashdot&lt;/a&gt;, or through &lt;a href="http://www.connectamarillo.com/news/story.aspx?id=532198"&gt;ABC ProNews7 in Amarillo&lt;/a&gt;?&lt;/p&gt;&lt;p&gt;I thought I'd spread the word and help some laymen out after work since there's a large Starbucks near my apartment.  I dropped in, bought some unhealthy food, opened my laptop and turned on Firesheep.  Less than one minute later, there were five or six identities sitting in the sidebar.  Three of them were from Facebook.&lt;/p&gt;&lt;p&gt;This wasn't at all surprising; Firesheep is not magical, and anyone that's been to a Starbucks knows that a lot of people mindlessly refresh Facebook while sipping on their lattes.   I thought I'd give it more time, so I listened to some music, talked to a few friends, and most importantly (and difficultly) did not navigate to anything sent over vanilla HTTP (including, of course, Facebook).&lt;/p&gt;&lt;p&gt;Around half an hour later, I'd collected somewhere between 20 and 40 identities.  Since Facebook was by far the most prevalent (and contains more personal information than Twitter) I decided to send the users messages from their own accounts to warn them of their accounts' exposure.  I drafted a friendly, generic message that stated the location of the Starbucks, what the vulnerability was, and how to avoid it.  I sent messages to around 20 people.&lt;/p&gt;&lt;p&gt;I cleared the sidebar, took off my headphones, and waited.  I heard one expletive muttered a few feet away, and wondered if my message was the cause.  Over the next 15 minutes, I didn't hear anyone talk about what had happened (and folks at Starbucks are usually not ones to keep their conversations private).  However, what I did see happen was a sharp decline in the number of identities I was collecting when I restarted Firesheep.&lt;/p&gt;&lt;p&gt;This was relieving -- these people got the message.  Hopefully they'll tell their friends, hide their kids, hide their wives.  I cleared the sidebar once again, and after another twenty minutes of mindless conversation I saw five familiar names had returned to my herd.&lt;/p&gt;&lt;p&gt;This was somewhat puzzling.  Did they receive the first message?  I logged into their accounts, and surely enough, they had.  One of them was even on Amazon.com, which I had warned about in my first message.  I targeted him first: I opened up his Amazon homepage, identified something he had recently looked at, and then sent him a "no, seriously" message on Facebook from his account including the fun fact about his music choices.&lt;/p&gt;&lt;p&gt;I cleared again, waited for ten minutes, and after resuming Firesheep's collection it appeared that he was gone.  Yet the other four remained persistent.  Perhaps, I thought, they thought the message was automatically generated and randomly targeted (despite mentioning their location within 100 feet).  So, one last message was in order.&lt;/p&gt;&lt;p&gt;I drafted a very short message (perhaps the first was too long?) and sent it to the four, once again from their own accounts:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;Really wasn't kidding about the insecurity thing.  I won't send another message after this -- it's up to you to take your security seriously.  You're at the [XYZ Street] Starbucks on an insecure connection, and absolutely anyone here can access your account with the right (free) tool.&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Twenty minutes passed, and all four were still actively using Facebook.  Again, I considered that they may not have received the second message, but after viewing their accounts it was clear that they had.&lt;/p&gt;&lt;p&gt;This is the most shocking thing about Internet security: not that we are all on a worldwide system held together with duct tape that has appalling security vulnerabilities; not that a freely available tool could collect authentication cookies; and certainly not that there are people unaware of either.  What's absolutely incomprehensible is that after someone has been alerted to the danger (from their own account!) that they would casually ignore the warning, and continue about their day.&lt;/p&gt;&lt;p&gt;But, I kept my word and did not send another message.  I packed my things, I walked around the store, and recognized several of the people I'd just introduced to their own vulnerability.  I included no clues as to my identity, less because of fear of retribution, and more because invasion of privacy is all the more frightening when it is committed by an absolute stranger with no chance of discovering their identity.&lt;/p&gt;&lt;p&gt;On my way home, I considered what the experience meant about our society.  No matter how many security measures we provide to the world, there will always be people who leave the door open, even after they've had an intruder.  The weakest link in security has been, and always will be, the user's judgement.&lt;/p&gt;&lt;p&gt;Back at my apartment, I began to settle in -- only to realize that throughout the entire night, my fly had been wide open.  Just another demonstration: we're all walking around with vulnerabilities we have yet to discover.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;
UPDATE: I've posted an &lt;a href="http://technologysufficientlyadvanced.blogspot.com/2010/11/herding-firesheep-addendum.html"&gt;addendum&lt;/a&gt; to this entry containing the first Facebook message, why leaving your Facebook account unprotected is a serious thing, and some guidance for users that aren't sure what to do to avoid the threat.&lt;/b&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4087609146113640787-6898905691857656543?l=technologysufficientlyadvanced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologysufficientlyadvanced.blogspot.com/feeds/6898905691857656543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologysufficientlyadvanced.blogspot.com/2010/10/herding-firesheep-in-new-york-city.html#comment-form' title='121 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default/6898905691857656543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default/6898905691857656543'/><link rel='alternate' type='text/html' href='http://technologysufficientlyadvanced.blogspot.com/2010/10/herding-firesheep-in-new-york-city.html' title='Herding Firesheep in New York City'/><author><name>Gary LosHuertos</name><uri>http://www.blogger.com/profile/12980387598844763141</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_LGiifFObGzU/TJsv7Q-LbZI/AAAAAAAACNc/yk1ocLvUC3M/S220/facebook+profile+photo.jpg'/></author><thr:total>121</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4087609146113640787.post-3625698424929657770</id><published>2010-04-21T15:27:00.000-07:00</published><updated>2010-09-23T04:08:39.869-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='programming style'/><category scheme='http://www.blogger.com/atom/ns#' term='west wing references'/><category scheme='http://www.blogger.com/atom/ns#' term='line wrapping'/><title type='text'>Parallel Structure: Programming Edition</title><content type='html'>&lt;p&gt;I was reflecting on some of the code that I've read over the last two years, and thinking about how unreadable a lot of it was.  I couldn't put my finger on the reason until I looked at it in the same way I look at (English) writing.&lt;/p&gt;&lt;h1&gt;What Parallel Structure Is&lt;/h1&gt;&lt;p&gt;Parallel structure makes writing easy to read.  You can read about parallel structure all over teh interwebs, but the gist is that a series of sentences that express similar ideas of equal importance should have the same (parallel) structure.  It helps readers tie the sentences together.  In the West Wing, Toby Ziegler brushes the topic (although not by name):&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;Food is cheaper, clothes are cheaper, steel is cheaper, cars are cheaper, phone service is cheaper. You feel me building a rhythm here? That's 'cause I'm a speechwriter and I know how to make a point... It lowers prices, it raises income. You see what I did with 'lowers' and 'raises' there? It's called the science of listener attention. We did repetition, we did floating opposites and now you end with the one that's not like the others. Ready? Free trade stops wars. And that's it. Free trade stops wars!&lt;/blockquote&gt;&lt;p&gt;Parallel structure introduces a rhythm, and breaking that rhythm signals something important.  The practice expands beyond writing -- in interior design, accent walls serve the same purpose.  Accent walls are typically a single wall in a room with a vibrant color that frames the focal point of the room.  They can also be used to delineate a separate space -- for example, painting two inset walls a different color where the dining table is placed to make it feel like a separate room.&lt;/p&gt;&lt;h1&gt;And Software&lt;/h1&gt;&lt;p&gt;So what about software?  How can parallel structure be applied to programming?  I found myself writing some simple code today to update a model object from a user interface component.  I later scrapped the code for something more object-oriented (just constructing a new Filter and returning it), but I thought it was a great illustration of the issue (the utility functions do exactly what you'd think they'd do):&lt;/p&gt;&lt;pre&gt; Date newStartDate = Util.parseDate(startDate.getText());
 Date newEndDate = Util.parseDate(endDate.getText());
 String newApplication = application.getText();
 boolean updated = false;
 updated |= !Util.equals(newStartDate, filter.getStartDate());
 updated |= !Util.equals(newEndDate, filter.getEndDate());
 updated |= !Util.equals(newApplication, filter.getApplication());
 filter.setStartDate(newStartDate);
 filter.setEndDate(newEndDate);
 filter.setApplication(newApplication);
 return updated;&lt;/pre&gt;&lt;p&gt;I think this is pretty easy to understand.  The code is too short to be split into separate methods, so it's organized into logical section, each of which contains statements with parallel structure.&lt;/p&gt;&lt;p&gt;This could have been written another way, the likes of which I have seem many times.  In the same number of lines, with identical statements, it looks like this:&lt;/p&gt;&lt;pre&gt; boolean updated = false;
 Date newStartDate = Util.parseDate(startDate.getText());
 updated |= !Util.equals(newStartDate, filter.getStartDate());
 filter.setStartDate(newStartDate);
 Date newEndDate = Util.parseDate(endDate.getText());
 updated |= !Util.equals(newEndDate, filter.getEndDate());
 filter.setEndDate(newEndDate);
 String newApplication = application.getText();
 updated |= !Util.equals(newApplication, filter.getApplication());
 filter.setApplication(newApplication);
 return updated;&lt;/pre&gt;&lt;p&gt;We can increase line count by inserting some spacing, which makes it a little more readable:&lt;/p&gt;&lt;pre&gt; boolean updated = false;
 
 Date newStartDate = Util.parseDate(startDate.getText());
 updated |= !Util.equals(newStartDate, filter.getStartDate());
 filter.setStartDate(newStartDate);
 
 Date newEndDate = Util.parseDate(endDate.getText());
 updated |= !Util.equals(newEndDate, filter.getEndDate());
 filter.setEndDate(newEndDate);
 
 String newApplication = application.getText();
 updated |= !Util.equals(newApplication, filter.getApplication());
 filter.setApplication(newApplication);
 
 return updated;&lt;/pre&gt;&lt;p&gt;I don't like this for several reasons.  While you can tell that each chunk performs a similar purpose, the chunks aren't short enough to make an obvious parallel structure.  In reading, you can easily pick up on parallel structure when the parallel elements are less than 10 words long.  That two 500-word passages are written in the same structure is not as obvious.&lt;/p&gt;&lt;p&gt;It's also not immediately obvious that each corresponding statement is identical.  A different statement could be an important functional difference, or it could be a defect.&lt;/p&gt;&lt;h1&gt;A Defect&lt;/h1&gt;&lt;p&gt;Spot the defect, first in the chunky code:&lt;/p&gt;&lt;pre&gt; boolean updated = false;
 
 Date newStartDate = Util.parseDate(startDate.getText());
 updated |= !Util.equals(newStartDate, filter.getStartDate());
 filter.setStartDate(newStartDate);
 
 Date newEndDate = Util.parseDate(endDate.getText());
 updated &amp;amp;= !Util.equals(newEndDate, filter.getEndDate());
 filter.setEndDate(newEndDate);
 
 String newApplication = application.getText();
 updated |= !Util.equals(newApplication, filter.getApplication());
 filter.setApplication(newApplication);
 
 return updated;&lt;/pre&gt;&lt;p&gt;And then in the more streamlined code:&lt;/p&gt;&lt;pre&gt; Date newStartDate = Util.parseDate(startDate.getText());
 Date newEndDate = Util.parseDate(endDate.getText());
 String newApplication = application.getText();
 boolean updated = false;
 updated |= !Util.equals(newStartDate, filter.getStartDate());
 updated &amp;amp;= !Util.equals(newEndDate, filter.getEndDate());
 updated |= !Util.equals(newApplication, filter.getApplication());
 filter.setStartDate(newStartDate);
 filter.setEndDate(newEndDate);
 filter.setApplication(newApplication);
 return updated;&lt;/pre&gt;&lt;p&gt;And again, if we add the same newlines to the streamlined code:&lt;/p&gt;&lt;pre&gt; Date newStartDate = Util.parseDate(startDate.getText());
 Date newEndDate = Util.parseDate(endDate.getText());
 String newApplication = application.getText();
 
 boolean updated = false;
 
 updated |= !Util.equals(newStartDate, filter.getStartDate());
 updated &amp;amp;= !Util.equals(newEndDate, filter.getEndDate());
 updated |= !Util.equals(newApplication, filter.getApplication());
 
 filter.setStartDate(newStartDate);
 filter.setEndDate(newEndDate);
 filter.setApplication(newApplication);
 
 return updated;&lt;/pre&gt;&lt;h1&gt;And Gestalt Psychology&lt;/h1&gt;&lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/Gestalt_psychology#Pr.C3.A4gnanz"&gt;law of Prägnanz&lt;/a&gt; illustrates why it's easier to spot the defect in the second excerpt: similar elements are grouped into a single entity.  The line prior to the defect forms a single entity with the lines above and below it, which makes the ampersand stick out.  Without this defect, the similarity extends to the first parameter of the utility method invocation.&lt;/p&gt;&lt;p&gt;&lt;b&gt;The takeaway: group similar lines together.&lt;/b&gt;  If you have to break lines for a control statement, the control statement should probably be in a separate method.&lt;/p&gt;&lt;p&gt;PS: The above is the reason I prefer long line lengths.  Lines longer than 80 characters are perfectly reasonable (especially if variables are properly named, i.e. "customerAccountNumber" instead of "a" or "can" or "acct"), and almost every developer uses an IDE or text editor that supports at least 100 columns of text.  When a line wraps, you lose the parallelism and it's more difficult to understand code at a glance.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4087609146113640787-3625698424929657770?l=technologysufficientlyadvanced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologysufficientlyadvanced.blogspot.com/feeds/3625698424929657770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologysufficientlyadvanced.blogspot.com/2010/04/parallel-structure-programming-edition.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default/3625698424929657770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4087609146113640787/posts/default/3625698424929657770'/><link rel='alternate' type='text/html' href='http://technologysufficientlyadvanced.blogspot.com/2010/04/parallel-structure-programming-edition.html' title='Parallel Structure: Programming Edition'/><author><name>Gary LosHuertos</name><uri>http://www.blogger.com/profile/12980387598844763141</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_LGiifFObGzU/TJsv7Q-LbZI/AAAAAAAACNc/yk1ocLvUC3M/S220/facebook+profile+photo.jpg'/></author><thr:total>3</thr:total></entry></feed>
