<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;Ak8DRnc9eCp7ImA9WhRUFkw.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213</id><updated>2012-01-26T15:01:17.960-08:00</updated><title>Mailinator(tm) Blog</title><subtitle type="html">I'm in your Internetz, protectin' yer emailz!</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://mailinator.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/MailinatorBlog" /><feedburner:info uri="mailinatorblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;C0YHRXw4cSp7ImA9WhRVFEo.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-7561150135294166420</id><published>2012-01-13T08:12:00.000-08:00</published><updated>2012-01-13T08:12:14.239-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-13T08:12:14.239-08:00</app:edited><title>Mailinator now supports POP3</title><content type="html">POP3 support means that you can now subscribe to Mailinator inboxes and get the email in your existing email client (i.e. Gmail, Yahoo Mail, Outlook, Thunderbird, etc.).&lt;br /&gt;
&lt;br /&gt;
Of course you can subscribe to any inbox you like and unsubscribe at will. A big use-case for Mailinator is for people to sign-up for newsletters and daily deal websites like GroupOn or LivingSocial. They can get those great deal emails without giving out their real email addresses, and by quickly switching addresses, effectively (and definitively) "unsubscribe" if they wish.&lt;br /&gt;
&lt;br /&gt;
Until now, they needed to use RSS or be prompt about checking the Mailinator inboxes. Now, instead you can simply point your POP3 enabled email client at the Mailinator inbox of your choice and you'll never lose an email. It comes right into your regular inbox!&lt;br /&gt;
&lt;br /&gt;
We'll be putting up an FAQ and some helpful instructions but here's the simple configuration information for the initiated:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;

&lt;b&gt;username&lt;/b&gt;: &amp;nbsp;anything you want! This is mailinator remember?&lt;br /&gt;
&lt;b&gt;password&lt;/b&gt;: &amp;nbsp;8char random password. Can be anything, but must be there&lt;br /&gt;
&lt;b&gt;server&lt;/b&gt;: &amp;nbsp;pop.mailinator.com&lt;br /&gt;
&lt;b&gt;port&lt;/b&gt;: 110&lt;br /&gt;
&lt;b&gt;encryption&lt;/b&gt;: off&lt;br /&gt;

&lt;br /&gt;
The system is for now in beta but has been working out pretty well so far. Enjoy!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-7561150135294166420?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/eCXC5inZEFc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/7561150135294166420/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=7561150135294166420" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/7561150135294166420?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/7561150135294166420?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/eCXC5inZEFc/mailinator-now-supports-pop3.html" title="Mailinator now supports POP3" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2012/01/mailinator-now-supports-pop3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cESHs5eip7ImA9WhRQEU0.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-7783390547760705560</id><published>2011-12-05T07:31:00.001-08:00</published><updated>2011-12-05T09:10:09.522-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-05T09:10:09.522-08:00</app:edited><title>RickRolling 1000 people  a day</title><content type="html">I &lt;a href="http://www.blogger.com/%3Ca%20href=%22http://mailinator.blogspot.com/2011/05/how-to-get-gmailcom-banned-not-that-i.html%22%3Ehttp://mailinator.blogspot.com/2011/05/how-to-get-gmailcom-banned-not-that-i.html%3C/a%3E"&gt;wrote previously&lt;/a&gt; about the voracity of some folks to discover Mailinator's list of alternate domains. &amp;nbsp;If you recall, the point of alternate domains are, to me anyway, to alleviate the worry that websites might 'ban' email addresses ending in the mailinator.com domain.&lt;br /&gt;
&lt;br /&gt;
People use Mailinator when they want to use a website but not give out their primary email for fear of future spam. Preventing that use is asking the customer to reassess a decision they've already made (not wanting to give out their real email) which of course might result in their answer being "nah".&lt;br /&gt;
&lt;br /&gt;
Or, of course they could decide to simply go create a fake yahoo account. That takes a few minutes and before Mailinator, when I tried that I often found myself losing interest in the whole idea before I was done.&lt;br /&gt;
&lt;br /&gt;
In my last blog post I mentioned we get emails similar to this from time to time:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Hi! Love your service. Can you send me the exhaustive, comprehensive, and complete list of alternate domains so I can pick a nice one that suits my individual personal style? kThxBai&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
And when I say from "time to time", I mean like last week too. &amp;nbsp;Giving out that list of course would be completely counterproductive to the point of having the alternate domains.&lt;br /&gt;
&lt;br /&gt;
I did some minor front-page spruce-ups this weekend (like the dinosaur eating spam?) including giving a relatively real-time count of the amount of email Mailinator gets in the last day &amp;nbsp;(15 million when I just glanced at the homepage), I made the randomly-generated names more readable, and matched them up with alternate domains as examples.&lt;br /&gt;
&lt;br /&gt;
In addition, &amp;nbsp;I added a bunch more alternate domains. Also if you recall, you can &lt;a href="http://mailinator.blogspot.com/2008/01/your-own-private-mailinator.html"&gt;point your own&lt;/a&gt; spare domains at Mailinator &amp;nbsp;and send email to those - then you have your own Mailinator alternate domain!&lt;br /&gt;
&lt;br /&gt;
At this &amp;nbsp;time there are literally several hundred (maybe over 1000, have to check) alternate domains.&lt;br /&gt;
&lt;br /&gt;
It occurred to me though, that &amp;nbsp;I might be able thwart some of the people emailing asking for a full alternate-domain list by actually giving them a link where they can see the only version of the full list I'm willing &amp;nbsp;to publish. &amp;nbsp;You'll see it on the homepage as: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background-color: white; color: #333333; font-family: verdana, helvetica, ariel; font-size: 12px; text-align: center;"&gt;
&lt;span style="font-size: 0.8em;"&gt;Want to see a&amp;nbsp;&lt;a href="http://mailinator.com/alt222.jsp" style="color: #2554c7; cursor: pointer; text-decoration: none;"&gt;list of ALL&lt;/a&gt;&amp;nbsp;Mailinator alternate domains?&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-size: 0.8em;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-size: 0.8em;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
I made the link small and didn't expect many people to click it. Maybe just the curious few. Well, to my surprise, the curious few turned out to be about 1000 a day. Nice. I surely underestimated the number of curious people out there.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Feel free to click yourself, but don't expect to actually see a list of any domains &amp;nbsp;Oh, and enjoy the video. :)&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-size: 0.8em;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-size: 0.8em;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-7783390547760705560?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/rs_yQZn2qAk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/7783390547760705560/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=7783390547760705560" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/7783390547760705560?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/7783390547760705560?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/rs_yQZn2qAk/rickrolling-1000-people-day.html" title="RickRolling 1000 people  a day" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2011/12/rickrolling-1000-people-day.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UGQ3Y9fCp7ImA9WhZaFUg.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-8426665025224456434</id><published>2011-07-01T16:40:00.000-07:00</published><updated>2011-07-01T14:20:22.864-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-01T14:20:22.864-07:00</app:edited><title>How to get gmail.com banned - not that I did this</title><content type="html">Sorry I haven't posted in awhile - I've been heads down working on our new (free) ad-trading network &lt;a href='http://www.clickochet.com'&gt;Clickochet&lt;/a&gt;. If you like Mailinator, you'll love Clickochet - give it a try!&lt;br /&gt;&lt;br /&gt;When I started Mailinator, a LOT of people told me it wouldn't work because websites would ban it right away. Ban it with reckless abandon. Ban it like the new thing on the internet was to just sit around and ban Mailinator all darn day long.&lt;br /&gt;&lt;br /&gt;As it turns out, that didn't happen. Sure, some sites do ban Mailinator and some are even really (really) excited about the idea, but in the grand scheme of things, it's not really very many. Thousands of people use Mailinator everyday, so clearly, its a useful tool that many sites accept.&lt;br /&gt;&lt;br /&gt;Back in the day however, I sadly fell prey to the words of doom that I was being fed. I mean, holy mackerel - what if sites DO ban it? What then? &lt;br /&gt;&lt;br /&gt;So I drew up a plan. A plan, that at this time I can say I may not be fully proud of. A plan that involved guile, wit, a few domain names, and some rate-limiting (thread-safe) data structures.&lt;br /&gt;&lt;br /&gt;I write this now because, well, for the most part the war is over and Gotham has grown past needing Batman anymore. Mailinator is not really the rogue tool it once was. Heck, &lt;a href='http://www.slashgear.com/hotmail-disposable-email-would-you-throw-away-gmail-for-this-04130860/'&gt;hotmail supports disposable email now&lt;/a&gt;. It's mainstream.&lt;br /&gt; &lt;br /&gt;Typically there are two reasons people want to ban Mailinator. A few years ago, people really had some sort of notion that your email somehow equated to your identity. Given the radically insecure setup of email in general, that was really a ridiculous technical assumption. Nonetheless it was pervasive.&lt;br /&gt;&lt;br /&gt;Secondly, people banned Mailinator for fear of people abusing their website. Now keep in mind, anything you can do with Mailinator, you can also do with YahooMail or Hotmail. Its just that Mailinator lets you do it faster, but Yahoo is plenty happy to let you sign-up for 100 email accounts.&lt;br /&gt;&lt;br /&gt;I get occasional emails from people asking me to have Mailinator stop accepting email from their site. Usually for the reason of stopping abuse. If they're nice and it makes sense, I almost always do it. But in my experience, usually when the existence of Mailinator is pinpointed as a cause of abuse, it is in truth merely an avenue that is already inherent to the internet or your website. Even shutting Mailinator down wouldn't solve the problem. The bad-guys just go somewhere else and keep on abusing.&lt;br /&gt;&lt;br /&gt;Any sort of abuse is needless to say, no fun for anyone. Mailinator has specific code built-in to detect scripts and stop them. &lt;br /&gt;&lt;br /&gt;In truth, Mailinator's system for detecting and shutting-down scripts and abuse really only serves one purpose. Its like that silly metal bar people put on the steering wheels of their cars. Let's be real, if a thief really wants your car, some dinky metal bar on the steering wheel isn't going to do diddly to stop him.&lt;br /&gt;&lt;br /&gt;Same with Mailinator's anti-abuse code - it won't stop a determined person - but it does make it more of a pain than simply using something else. &lt;br /&gt;&lt;br /&gt;So -Dear hacker bad-guy abuser dudes - other disposable email sites probably don't have that sneaky anti-script pain-in-the-butt hacker-stop code like Mailinator. Go use them.&lt;br /&gt;&lt;br /&gt;There....&lt;br /&gt;&lt;br /&gt;1) Solved hacking and abuse on the internet ?   --&gt; &lt;b&gt;Not even maybe&lt;/b&gt;&lt;br /&gt;2) Solved a little of the hacking and abuse on the internet possibly for me?  ---&gt;  &lt;b&gt;DING!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ok, back to the story - as I said, in the beginning, the idea of wide-spread Mailinator banning scared me a lot. So what did I do?  I bought some additional domains for Mailinator.&lt;br /&gt;&lt;br /&gt;To this day, you can email &lt;b&gt;bob@thisisnotmyrealemail.com&lt;/b&gt; and it will end up at mailinator (in the bob inbox) just like &lt;b&gt;bob@mailinator.com&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Cool. Alternate domains. Problem solved.&lt;br /&gt;&lt;br /&gt;Wait a second. How exactly do I tell the world about the alternate domains without telling the people that want to ban them all?&lt;br /&gt;&lt;br /&gt;Every few weeks I get an email like:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;Hi!  Love your service.  Can you send me the exhaustive, comprehensive, and complete list of alternate domains so I can pick a nice one that suits my individual personal style?  kThxBai&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;At first, I was like "Neat! People love Mailinator and want to...heeeyy.. waaiiit a second".&lt;br /&gt;&lt;br /&gt;If I give them the whole list, then they will, um, have the whole list. And then they can &lt;b&gt;ban&lt;/b&gt; the whole list.&lt;br /&gt;&lt;br /&gt;Ok. I know. I'll list one random alternate domain on the homepage every time you visit. No one will have the whole list. Just one here, one there. Perfect !&lt;br /&gt;&lt;br /&gt;There problem solved. Again.  Well, sort of.&lt;br /&gt;&lt;br /&gt;Soon after I put up this "one random alternate domain per homepage load" system - the scrapers started.  Every now and then I'd notice several hundred homepage loads from the same IP in a very short period of time.&lt;br /&gt;&lt;br /&gt;They were scripts; scripts that were loading the homepage over and over and scraping out the random alternate domain that was shown. Sneaky. By doing this they could eventually formulate the entire list of alternate domains.&lt;br /&gt;&lt;br /&gt;Drat. Now what.  For awhile, nothing. I just let them go. A few months later however, I got an email from a Russian guy (sorry Russian guy, I don't remember your name).&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;You are dumb.  Your homepage is easy to scrape and doesn't change so its easy to scrape your alternate domain. You are dumb.&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;He was right. Well, I'm not sure about the dumb part, but my homepage was easy to scrape. Someone could probably write a script to scrape it in short order. Probably just took a few minutes.&lt;br /&gt;&lt;br /&gt;Could I make it harder to scrape? Well, I could, but wouldn't really slow anyone down much.&lt;br /&gt;&lt;br /&gt;It was then however, I had a flash. An idea of simply epic proportions. A thought so crazy - that dad-burn-it, it just might work.&lt;br /&gt;&lt;br /&gt;Let's not make the page scraping harder - let's make it EASIER.&lt;br /&gt;&lt;br /&gt;I removed the bit of code that displayed the alternate domain and put it in its own (teensy) webpage. That "webpage" had absolutely nothing in it, except the text for the randomly chosen alternate domain itself. &lt;br /&gt;&lt;br /&gt;Then, I embedded my new tiny webpage into the homepage (so it showed as before). Basically, to the viewer of the homepage - nothing was different. You saw the homepage and a randomly generated alternate domain, just where it was.&lt;br /&gt;&lt;br /&gt;But to the folks that had been scraping my site, things looked plenty different. In fact, I probably broke all their scrapers (Sorry nice people trying to get all my alternate domains just to ban them! (ok, not really)). &lt;br /&gt;&lt;br /&gt;Now here is a finer point of semantics. If you go to the Mailinator homepage, there is some text that says "Here is an alternate domain" followed, by, well, a randomly chosen alternate domain. &lt;br /&gt;&lt;br /&gt;However, now that I split off that tiny little webpage with JUST the alternate domain in it - you could go there too by typing in the url directly. And you'd see nothing BUT the alternate domain. No surrounding text. No text saying "this is an alternate domain". That little page showed a domain, but made no claim about what it was displaying. &lt;br /&gt;&lt;br /&gt;For your browsing pleasure, here's the only direct link to that page that I know of:  &lt;a href='http://mailinator.com/randomdomain.jsp' target='_other'&gt;Go ahead&lt;/a&gt;, reload the page a few times.  (You can see this also on the &lt;a href='http://www.mailinator.com'&gt;Mailinator&lt;/a&gt; homepage on the lower left).&lt;br /&gt;&lt;br /&gt;After the script guys got over the minor annoyance of their scripts breaking because o f my new setup, I'm sure there were office parties across the nation. Mailinator! Now even easier to scrape!&lt;br /&gt;&lt;br /&gt;Now for the record, the rest of this post is hypothetical. An unimplemented idea if you will. Who knows - I'll bet nothing you read here on out ever happened. Just random thoughts. Musings. One big theory. Consider it random daydreams of guy who runs a fun email service.&lt;br /&gt;&lt;br /&gt;Remember all that script-detecting code from the anti-abuse system? Well, what if I put that in here too I thought. Let's "detect" when a script is hitting our weensy alternate-domain page. &lt;br /&gt;&lt;br /&gt;And, what if we also detected when the little web page is being viewed but not "in" the homepage - but by itself (just like the link above). And what if after about 30 page hits from the same script (or so), stop displaying actual alternate domains and start sprinkling in some other things. Hmm... but what other things?&lt;br /&gt;&lt;br /&gt;I know - how about "gmail.com". Or, um "hotmail.com". Or maybe, "yahoo.com".&lt;br /&gt;&lt;br /&gt;What, in our completely and totally hypothetical situation, would that do?&lt;br /&gt;&lt;br /&gt;Well, let's see. There are these folks out there running scripts against Mailinator collecting all my alternate domains. Those scripts probably put results in a database or something and connects to their website. When one of their users tries to sign-up on their site using one of my alternate domains, it's in their database as a banned site and its immediately rejected.&lt;br /&gt;&lt;br /&gt;Now imagine the wacky fun if somehow, some way, (totally theoretically speaking) some silly person snuk "gmail.com" in that list. I'd guess banning your users trying sign-up with "gmail.com" addresses is probably not what you want.&lt;br /&gt;&lt;br /&gt;And, hypothetically speaking if you had code that would sneak in these non-alternate-domains in the page they weren't supposed to accessing anyway, when would be the best time to set it into action?&lt;br /&gt;&lt;br /&gt;Well, those scripts ran at many different times, but just after midnight seemed like a popular time-slot.&lt;br /&gt;&lt;br /&gt;If such code existed, making it active Sunday morning from Midnight to 2am seems nice.  I mean heck, if my website stopped accepting signups from "gmail.com" on some Sunday morning, I'm sure I'd be downright chipper to hop into the office and find out why.&lt;br /&gt;&lt;br /&gt;Boy. If all that stuff happened - I wonder what kind of email conversations I'd have on that Sunday afternoon? I bet they'd be like:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Your alternate domain list displayed 'gmail.com'!&lt;/i&gt;&lt;br /&gt;Hi Fred, no it doesn't. Just reloaded the homepage 10 times, nothing like that. all the best.&lt;br /&gt;&lt;br /&gt;or I bet another would be like:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Yahoo.com? What is this some kind of joke?&lt;/i&gt;&lt;br /&gt;Sorry, did you mean to email this to Carol Bartz? Not sure what you're talking about.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Phew. Well, that's surely a fun thought experiment. As you can see from the link above however, it surely doesn't do anything like that. Honestly these days, most of the scrapers are gone. I think simply that the internet evolved and more of them simply lost interest in the fight.&lt;br /&gt;&lt;br /&gt;Every now and then I'm still asked what I think about banning Mailinator. I've mellowed a lot since the early days and I pretty much always give the same answer. If you think banning Mailinator going to solve your problem, go ahead. In my experience, it won't. And by asking I am guessing that you are making some assumptions in your site that will surface as issues in other ways.&lt;br /&gt;&lt;br /&gt;And of course, script writers, you now have the direct link to the alternate domain page above. Scrape away. But keep in mind, the best way not to trigger any Mailinator abuse systems is to not do anything "too fast". Those script detectors are pretty fickle little beasts. It's not a bad idea to try and stay on their good side.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-8426665025224456434?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/ISiEcwecp9Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/8426665025224456434/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=8426665025224456434" title="41 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/8426665025224456434?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/8426665025224456434?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/ISiEcwecp9Q/how-to-get-gmailcom-banned-not-that-i.html" title="How to get gmail.com banned - not that I did this" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>41</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2011/05/how-to-get-gmailcom-banned-not-that-i.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YBQ3c-fyp7ImA9WhZbEUs.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-4213388775849866114</id><published>2011-06-15T11:05:00.001-07:00</published><updated>2011-06-15T11:05:52.957-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-15T11:05:52.957-07:00</app:edited><title>Why you see the Ads you see</title><content type="html">Since we've launched Clickochet (as in "Click Ricochet", an &lt;a href=http://www.clickochet.com&gt;Ad Trading Network&lt;/a&gt;), I get a rather constant flow of questions about how we do ad targeting.&lt;br /&gt;&lt;br /&gt;Honestly, I've never been a person to use an Ad-blocker and the reason is that if I go to a website that brings me value, it's a small price to pay to see ads in exchange. The value that Google search brings me EVERY day is immense - and all I have to do is view ads that once in awhile are actually what I was looking for anyway? Deal. &lt;a href='http://www.reddit.com'&gt;Reddit&lt;/a&gt; actually thanks its users for not using ad-block.&lt;br /&gt;&lt;br /&gt;The trick here however is to bring people "good", "quality" and "relevant" ads. And it is of course, our goal at Clickochet is to try to bring you the most relevant ads to you as we can. &lt;br /&gt;&lt;br /&gt;So, after writing a few responses to nice Clickochet users about how our ad-targeting works, I've decided instead to simply - let you see for yourself. At least for now, let you into the belly of the beast.&lt;br /&gt;&lt;br /&gt;After spending a good number of months staring at ads, I'm a bit obsessed with them now. It's rather rare that I don't go to a page with Clickochet ads and push my nose to the screen wondering "Why is THAT ad showing THERE?!"&lt;br /&gt;&lt;br /&gt;I usually (usually) then continue that self-conversation with, "oh. oh. ok. that makes sense." But to be able to answer that for myself, Clickochet uses some diagnostic cookies to turn on extra information about why you see the ads you see. And actually - more important for me - it has facilities to tell me &lt;i&gt;why you don't see the ads you don't see&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;A few disclaimers about what you're about to see. Pretty much, 100% of this stuff will change. Ad targeting is an exercise in perpetual tweaking and change - and given the infancy of our network, you can count that statement as double. Also, keep in mind that Clickochet is a new network. We're working furiously to build the best network for our customers that we can - but our targeting mechanisms are relatively boilerplate at this time. Finally, this stuff isn't for general consumption - in other words, it's not meant to be "pretty" nor am I guaranteeing it works across browsers (so use firefox or chrome). &lt;br /&gt;&lt;br /&gt;So to begin, in a separate browser window or tab, hop over to one of Clickochet's favorite yoga sites, Qi-Yoga.&lt;br /&gt;&lt;br /&gt;&lt;a href='http://www.qi-yoga.com'&gt;http://www.qi-yoga.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nice ads huh? And chances are you'll see an ad like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-n-V0Ih53GZY/Tfiqo2_1zUI/AAAAAAAAC4w/sF7Y5OypTsI/s1600/yogaad.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/-n-V0Ih53GZY/Tfiqo2_1zUI/AAAAAAAAC4w/sF7Y5OypTsI/s400/yogaad.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5618428154079464770" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I guess you'll see that particular ad because:&lt;br /&gt;&lt;br /&gt;1) I chose "yoga" specifically because we have a few, but not too many yoga sites in the system (at the moment) so that determinism helps writing a semi-predictable blog post.&lt;br /&gt;2) This ad is contextually relevant to qi-yoga and our contextual system realizes that. (the two sites are not otherwise related)&lt;br /&gt;3) I don't know the fine folks over at HealthAndYogaRetreats.com but I slipped them a nice pile of extra impression credits so that their ad won't "run out" in the middle of my examples.&lt;br /&gt;&lt;br /&gt;Ok - keep qi-yoga.com up in a browser window and open yet another browser window (welcome to my world). This time go here:&lt;br /&gt;&lt;br /&gt;&lt;a href='http://www.clickochet.com/pages/diag'&gt;http://www.clickochet.com/pages/diag&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You don't have to sign-up or be logged in. Again, this is arguably an internal page.  Press the "Turn On" button for both options. Note: &lt;b&gt;The 2nd option CAUSES A POPUP&lt;/b&gt; for every page you load that has Clickochet ads. Again, this is a diagnostic page no one sees unless the turn on that cookie. And incidentally, to follow along, you'll need to tell your browser to "allow popups" from qi-yoga.com I'd guess.&lt;br /&gt;&lt;br /&gt;Great. Now refresh the qi-yoga.com page.&lt;br /&gt;&lt;br /&gt;Welcome to the diagnostic view. Ad titles are now color coded and have been suffixed by a single character. That character signifies the targeting mechanism used that turned that ad "on".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-tT_8-u67FgM/TfiwSp-u2sI/AAAAAAAAC44/rLRe0VUMeYA/s1600/ad1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 52px;" src="http://3.bp.blogspot.com/-tT_8-u67FgM/TfiwSp-u2sI/AAAAAAAAC44/rLRe0VUMeYA/s400/ad1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5618434369697798850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The popup window is a list of most of the ads that were considered for showing on this page. (I say "most" because some might have been short-circuited once we found 3 acceptable ones.)&lt;br /&gt;&lt;br /&gt;The popup you see should look something like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-teNGrqItOMM/TfjoH0ml92I/AAAAAAAAC5A/mMdsErLfjPM/s1600/diag.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 375px;" src="http://3.bp.blogspot.com/-teNGrqItOMM/TfjoH0ml92I/AAAAAAAAC5A/mMdsErLfjPM/s400/diag.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5618495756221937506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The first 3 ads in the diagnostic ad window are the ones that were shown. The rest (and sometimes the list is long, are the ones that were rejected). The lists will perpetually change as you hit refresh (the system knows when you hit refresh over and over and no one is charged or awarded credits for that behavior). Also, keep in mind that refreshing the page a few times will help our examples here but aren't a normal ad viewer use-case. People typically see one set of ads and then leave the page. So you'll likely start getting less relevant ads the more refresh.&lt;br /&gt;&lt;br /&gt;So, what are the title suffixes you might see? The represent the different ad targeters and specifically which ad targeter decided to show you that particular ad.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(C)&lt;/b&gt; - A "contextual" ad, for some broad definition of "contextual". Back to my theme that "everything will change", the contextual engine is finding its sea legs. It sometimes expands its search and sometimes contracts it to find ads that could be relevant (it then keeps track and hopefully finds a happy place). Hence, you might see "contextual" ads you don't think are all that contextual. Don't worry - if that's true, they'll cycle themselves out eventually. Again, I chose the yoga theme here because of the median set size of what the contextual targeting finds.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(A)&lt;/b&gt; - A "site affinity" ad. Refresh the page a few times if needed to see HealthAndYogaRetreats again. You'll notice it is an affinity site. Yes its contextual, but more importantly, people have clicked from qi-yoga to healthAndYogaRetreats a few times. One click won't do much - but a pattern of clicking and the system takes notice. Those sites become (spiritually) linked in the system.&lt;br /&gt;&lt;br /&gt;This is a very important feature beyond contextual advertising. The classic example is that "Budweiser" ads might do very well on a "Nascar" website. But contextual analysis might not determine that (in fact, drinking and driving might be a negative contextual correlation!). But of course let's hope the budweiser drinkers are watching the races, not participating. So when they click the budweiser ads, the system realizes "huh, for some reason these two very unrelated things have an affinity for each other".&lt;br /&gt;&lt;br /&gt;Affinity relationships perpetually degrade and require, again, a pattern of clicking to keep them alive.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(U)&lt;/b&gt; - An underserved ad. Simply put, there are ads in the system that haven't found a solid niche to display in. These ads can be pretty non-relevant at times but the idea is that they won't individually show up all that often on any given site. And showing them serves two purposes - &lt;br /&gt;&lt;br /&gt;1) to get underserved ads some impressions, and &lt;br /&gt;2) remember site affinities from above? How do we 'discover' site affinities if we only show direct contextual ads. Showing ads from a larger pool gives the affinity system a chance to discover unexpected affinities.&lt;br /&gt;&lt;br /&gt;You'll see more underserved ads if you refresh the page a lot - which again, isn't the "normal" use case.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(1)&lt;/b&gt; - actually, any numerical digit you see means we're running an experiment. Again, every last thing here is subject to change, but experiments are even more transient than that. One experiment we're working on is transitive relationships between site affinities. So if Budweiser ads are good on Nascar sites, and then we discover Nascar ads are good on fishing sites - are Budweiser ads good on fishing sites? (I'm guessing that's an affirmative)&lt;br /&gt;&lt;br /&gt;If you'll notice, none of the targeting above has to do with YOU (or more specifically your browser since we never know about "you"). All those targeting mechanisms have to do with the sites, ads, and contexts involved. Site affinity is based off clicks but it's really about all clicks in the system - not really about you.&lt;br /&gt;&lt;br /&gt;That being said - it's purely possible that although you like both budweiser and nascar - you might like yoga too. And although you are an awesome beer-drinking race-car-driving yogi - that's probably not a common combination. Showing a yoga ad on a nascar site as a general rule is probably wrong - but for you specifically, it might be right.&lt;br /&gt;&lt;br /&gt;So, what we can do for you specifically is try to find things that you like. This is of course where people get worried about advertisers finding out private information about users. Clickochet does not keep personally identifiable information about anyone who views the ads (please see our privacy policy on the site). We keep a cookie noting where a browser goes (and note that if people share a browser, that browser becomes a collection of all browsing destinations, regardless of any given user).&lt;br /&gt;&lt;br /&gt;The goal again is to show you the most relevant ads possible. That brings the most value to people viewing ads and the most value to people showing ads. Of course, Clickochet has an opt-out cookie (see the front page of Clickochet for a link or go directly to &lt;a href='http://www.clickochet.com/pages/optout'&gt;http://www.clickochet.com/pages/optout&lt;/a&gt; to turn it on). But! Don't turn it on just yet or the rest of this blog article won't work!&lt;br /&gt;&lt;br /&gt;Ok. Let's go to another Clickochet ad site - oh, wait, you're already on one. This blog has come Clickochet ads on it in the right-hand side-bar.  Ok, note the ads you see there and .. hit refresh.  Here, I'll bookmark this blog entry for you so you can pick up reading here.&lt;br /&gt;&lt;br /&gt;BOOKMARK FOR WHEN YOU REFRESH THIS BROWSER WINDOW TO SEE RETARGETING&lt;br /&gt;&lt;br /&gt;Ok .. hit refresh.&lt;br /&gt;&lt;br /&gt;BOOKMARK FOR WHEN YOU REFRESH THIS BROWSER WINDOW TO SEE RETARGETING&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ok.. great.  Now.. what ads shown? There's a high probability (note: EVERYTHING involved here is a probability) that you'll see a red ad for Qi-yoga followed by the suffix: (R).  (if not refresh the page once or twice)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(R)&lt;/b&gt; retargeting. It seems almost counter-intuitive but the ad industry has plenty of documentation that people will click on things they already have seen - and/or simply want to see again.  The system now knows you went to qi-yoga.com (because I told you to earlier in this case). And thinks, "Hey.. this person likes that site" - so it gives a reasonable probability to show ads for qi-yoga to get you to go there again.&lt;br /&gt;&lt;br /&gt;There's surprising advantages to this. If you liked qi-yoga and saw it last week, you might be interested in seeing if the site is updated. Qi-yoga likes this because as with all websites, there is a lot of bounce - people come, go, and never come again, This reminds you of that great site you saw. Clickochet likes this because it keeps you within our community of sites that are helping each other exchange traffic. &lt;br /&gt;&lt;br /&gt;And then.. we can run experiments based off that correlation. Maybe there is a site affinity between this blog and qi-yoga. Or, maybe its simply a personal preference of yours and maybe we can help you discover other yoga sites. The possibilities are endless.&lt;br /&gt;&lt;br /&gt;If this all seems odd that all this is happening in the background, I'll note that Clickochet is a newbie in this arena. Every ad system out there does this and more (goto zappos.com, browse some shoes and then browse around the web - see how many zappos ads you then see).&lt;br /&gt;&lt;br /&gt;As I said - you can opt out of this type of browser-based targeting on our opt-out page if you like. But there's nothing more nefarious there than simply trying to show you ads for things you might be interested in.&lt;br /&gt;&lt;br /&gt;Again, our goal is help our community of sites trade traffic for traffic. As we say in our FAQ - give an ad, get a few - the system really does work. And it will work better and better with the more value we can bring to everyone involved including publishers, advertisers, and web-passers-by.&lt;br /&gt;&lt;br /&gt;Sign-up (it's free!) at http://www.clickochet.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-4213388775849866114?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/shmtByFbYLw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/4213388775849866114/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=4213388775849866114" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/4213388775849866114?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/4213388775849866114?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/shmtByFbYLw/why-you-see-ads-you-see.html" title="Why you see the Ads you see" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-n-V0Ih53GZY/Tfiqo2_1zUI/AAAAAAAAC4w/sF7Y5OypTsI/s72-c/yogaad.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2011/06/why-you-see-ads-you-see.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMCSHc6fSp7ImA9WhZWEEk.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-8398469097937227885</id><published>2011-05-10T12:12:00.000-07:00</published><updated>2011-05-10T08:14:29.915-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-10T08:14:29.915-07:00</app:edited><title>Introducing Clickochet: A (free) Ad trading community</title><content type="html">I have a lot of ideas for apps/websites/start-ups. No seriously - I mean a lot. Some of them aren't all that bad either. And some are too - really bad, like "waking up in the morning and thinking 'what the heck were you thinking'"-bad too. I mean really. &lt;br /&gt;&lt;br /&gt;Alas, usually even with ones I think are awesome - I typically end up finding some fatal flaw. It could be business model or timing or ... who knows.&lt;br /&gt;&lt;br /&gt;There's a lot of factors that make me consider an idea for more than a few minutes much less actually work on it:&lt;br /&gt;&lt;br /&gt;1) Is it in my skillset&lt;br /&gt;2) Is it the right scope - too small and its a weekend project, if its too big, am I the right guy to assemble the infrastructure (team, investors, etc) to bring it together.&lt;br /&gt;3) How hard will customer acquisition be?&lt;br /&gt;4) Does it have a viable business model?&lt;br /&gt;&lt;br /&gt;There's a lot more subtle questions, but these are some of the bigger disqualifiers.&lt;br /&gt;&lt;br /&gt;Once in awhile however I get one that sticks. One that I say "why didn't &lt;b&gt;I&lt;/b&gt; think of that !" - and then I say "Oh. I did!". Mailinator was one. And this - this is another.&lt;br /&gt;&lt;br /&gt;Last fall my girlfriend started a celebrity news blog. I'm not much into celebrities but she was pretty passionate about it and it was exciting to share her enthusiasm. &lt;br /&gt;&lt;br /&gt;As with any new site, she was trying to gain traffic. So to help with that effort, I bought her $100 worth of adwords.  I've bought adwords for many different companies and projects, but I was still rather surprised with the results. For $100 I got a 3-day (or so) ad campaign that yielded 100 visitors.&lt;br /&gt;&lt;br /&gt;The interesting part was that all this time, she was running Adsense - that is, ads to make money on the site. Now, ask anyone trying to make money with Adsense why they don't "buy" ads to gain traffic and they'll tell you, it's losing proposition. And no wonder - that's the crux of how ad networks make money.&lt;br /&gt;&lt;br /&gt;Sure, they sell ads. But for a moment, consider a website that does both - it's both an advertiser and a publisher. In that scenario, ad networks sell you ad impressions for money - and then trade you money for ad impressions. Simply put, there is an exchange rate on ad-impressions to money and just like the kiosk at the airport which changes currency, they take a "cut" in both directions. &lt;br /&gt;&lt;br /&gt;And the cut can be pretty big. In the case of my girlfriend's site, I successfully managed to convert $100 into 15cents by changing it into ad-impressions and back again (Actually its even worse because the girlfriend gets to keep the 15cents, but we don't bring that up).&lt;br /&gt;&lt;br /&gt;Now my assumption above is for sites that are both advertisers and publishers. Many small sites are publishers, but not so many are advertisers. So my assumption is, well, rather assumptive.&lt;br /&gt;&lt;br /&gt;But why aren't they advertisers? They want traffic too right? Advertising is a way to get it right?&lt;br /&gt;&lt;br /&gt;The answer is that those sites would do both, but its non-economical to do so. Buying ads to show ads makes no sense. Even just buying ads is a very expensive method of traffic acquisition - but what if ads were really (really) cheap. Then everyone would buy them wouldn't they? I mean, it would be a cheap method of traffic acquisition.&lt;br /&gt;&lt;br /&gt;Ad networks (BTW, I don't mean to pick on Google above, I just had been using their service because they &lt;b&gt;are&lt;/b&gt; one of the most accessible ad networks for small sites) provide a valuable service. Clearly - the ad industry is highly alive - they are bringing value to lots of people.&lt;br /&gt;&lt;br /&gt;But it occurred to me - how do I make an ad system that brings value to smaller sites. The under-served billions of websites where buying ads makes no sense today. How about I make a system where you trade ad-impressions for ad-impressions. That simple. And, instead of making it where you give something and get a lot less back, what if we fliped that. That is, give one ad impression and get a few back?&lt;br /&gt;&lt;br /&gt;I call it &lt;a href='http://www.clickochet.com'&gt;Clickochet&lt;/a&gt;. Like "Click Ricochet" because that's what it is.&lt;br /&gt;&lt;br /&gt;So how do you get &lt;b&gt;more&lt;/b&gt; back than you put in? Well, consider your normal banner text ad. In reality, its one ad impression on your website, but it contains ads for 3 different websites within. When you show one "ad", three other sites benefit.&lt;br /&gt;&lt;br /&gt;Clickochet is built as a community. We connect it closely with social networks that encourage social interaction and membership. A Social Ad Trading Network. This is key - you're not trading money and ads with a big company, but you're trading ads with each other. Other website owners looking for traffic just like you. Of course we strictly filter out porn and malicious sites, but being a good community member becomes an important factor on how much you get out of the system. &lt;br /&gt;&lt;br /&gt;So, in a perfect world, you'd give one banner (keep in mind smaller ad creatives have less ads inside) and get 3 ad impressions. But it became quickly apparent, the world isn't perfect. If someone puts your ad at the bottom of their page, I doubt you'd be happy giving them an ad at the top of your page in return. Or what if their ad quality was low? Or conversely, what if their website had a huge click-through profile? In other words, not all ad impressions are created equal.&lt;br /&gt;&lt;br /&gt;All these factors matter. So instead converting ad-impressions to real currency, we convert them to virtual currency. An exchange rate exists, but its minimal and its based on a lot of things - much of it tied to people showing good ads. If you show a banner ad, you won't get 3 ad impressions for it, but that isn't a far off guess either. You'll very likely get more out than you put in.&lt;br /&gt;&lt;br /&gt;You are the publisher - you show ads on your site and earn credits.&lt;br /&gt;&lt;br /&gt;And you are the advertiser - you spend credits and your ads show all across the network. &lt;br /&gt;&lt;br /&gt;You can spend your virtual "impression credits" the instant you make them. Or you could bank them and save them for your new site's impending launch 6 months later. Or take your impressions (from a site like Mailinator) and spend them on your friend's site (like my girlfriend's).&lt;br /&gt;&lt;br /&gt;This isn't about replacing existing ad networks. There's no need for that. If you're making money running ads - don't stop.&lt;br /&gt;&lt;br /&gt;But unlike buying an ad campaign which costs a lot and lasts a few days (which you surely can still do), you simply give up whatever amount of page real estate you want for Clickochet ads and leave them there. And every day, from here on out, all across the network your page views are giving your a multiple of ad impressions on other sites.&lt;br /&gt;&lt;br /&gt;To "prime the pump" I'm giving this virtual economy a boost - an "economic stimulus" if you like. I'm injecting all of Mailinator's ad impressions into the economy without taking them back out. Active users (i.e. you must be earning your own credits somewhat) will get lots of free ad impressions.  (note: when I say "all" ad impressions, I mean "most" as I plan to advertise Clickochet on the Clickochet network somewhat).&lt;br /&gt;&lt;br /&gt;Of course, it's free to sign up. Free to use. We may introduce a premium service at some point, but you can count on being a member of this community staying free.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-8398469097937227885?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/DT6VnQKofos" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/8398469097937227885/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=8398469097937227885" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/8398469097937227885?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/8398469097937227885?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/DT6VnQKofos/introducing-clickochet-free-ad-trading.html" title="Introducing Clickochet: A (free) Ad trading community" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2011/05/introducing-clickochet-free-ad-trading.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8CSXo5fCp7ImA9WhZXEks.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-4675395008669230663</id><published>2011-05-01T08:09:00.000-07:00</published><updated>2011-05-01T08:31:08.424-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-01T08:31:08.424-07:00</app:edited><title>Notes from "The Programming Leap to Multithreading"</title><content type="html">I gave a (techinical) keynote at the ICIS conference in Shanghai a year or two ago. It was a fun talk and I was recently asked for the notes so I thought I'd post them.&lt;br /&gt;&lt;br /&gt;When I was at Google I spent some of my 20% time simply surfing through the Java code base looking for race conditions. It was a lot of fun and often I was patching code that was stuff that hadn't been changed in forever or was completely out of my normal stomping grounds.&lt;br /&gt;&lt;br /&gt;After submitting the code changes with the comment 'Fix a race condition', I can remember at least one code reviewer responding, "Approved. Cool. But, what race condition?"&lt;br /&gt;&lt;br /&gt;This talk covers a bunch of the common cases I encountered.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mailinator.com/TymaLeapToMultithreading.pdf"&gt;LeapToMultithreading.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-4675395008669230663?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/voycymPZ5ys" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/4675395008669230663/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=4675395008669230663" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/4675395008669230663?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/4675395008669230663?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/voycymPZ5ys/notes-from-programming-leap-to.html" title="Notes from &quot;The Programming Leap to Multithreading&quot;" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2011/05/notes-from-programming-leap-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8ERH46eyp7ImA9WhZVEEo.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-3927830103689827097</id><published>2010-06-02T08:57:00.000-07:00</published><updated>2011-05-22T08:40:05.013-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-22T08:40:05.013-07:00</app:edited><title>How I sped up my server by a factor of 6</title><content type="html">(with one linux command)&lt;br /&gt;&lt;br /&gt;Subtitle: IO-bound and CPU-bound applications are common - here's maybe a "memory contention bound" app&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I've written a lot of servers. If you've read &lt;a href=http://mailinator.blogspot.com/2007/01/architecture-of-mailinator.html&gt;the architecture of mailinator&lt;/a&gt; or &lt;a href=http://mailinator.blogspot.com/2008/08/benchmarking-talkinator.html&gt;benchmarking talkinator&lt;/a&gt; or &lt;a href=http://mailinator.blogspot.com/2008/02/kill-myth-please-nio-is-not-faster-than.html&gt;"blocking faster than non-blocking"&lt;/a&gt; you probably already have that idea.&lt;br /&gt;&lt;br /&gt;I was working on a new server infrastructure recently I needed for a new product. The server has a novel internal architecture to me that seeks to never voluntarily block threads or cause context switches - but at the same time is highly multi-threaded and creates new ones whenever it needs to.&lt;br /&gt;&lt;br /&gt;The server's nature isn't totally important but you can think of it along the lines of a twitter server. It gets messages from one place, collates them, and sends them to  (potentially many) other places. I suppose it could be used directly as a "twitter server" but of course, they already have those and my start up focus is rather orthogonal to that.&lt;br /&gt;&lt;br /&gt;I usually write servers in Java on linux so keep that in mind for the ideas raised here. At Google, I worked on servers in C++ and Java. And especially after that experience, I'll stay with Java. To hopefully avoid language wars, the #1 reason I write in Java is that I'm way better at Java than I am at C++ or Ruby or Python or whatever. In other words, it was a practical (and definitely reasonable) choice in this case.&lt;br /&gt;&lt;br /&gt;Also, the benchmarking here isn't contrived - I'll save the details, but I truly am asking the server to do precisely what it would do in the wild except at a higher rate. &lt;br /&gt;&lt;br /&gt;Now, given the nature of the server, I needed 2 things to help benchmark. A "producer" (a system that produces messages) and a "consumer" (a system that consumes them). The producer produces a  sequenced message set, and the consumer verifies it receives every message intact *and* in-order.&lt;br /&gt;&lt;br /&gt;I chose message sizes at somewhat less than twitter size (msg size = 100 bytes) to induce a reasonable amount of activity in the server (server purpose is not necessarily large messages and large messages tend to just start saturating bandwidth without causing contention or server cpu activity). My custom protocols add a few bytes and TCP has a 40byte header - so overall I'm guessing that I'm using an average 200 byte messages counting everything.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Producer&amp;nbsp;&amp;nbsp;-&gt;&amp;nbsp;&amp;nbsp;Server&amp;nbsp;&amp;nbsp;-&gt;&amp;nbsp;&amp;nbsp;Consumer&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The server system is pretty flexible and in effect, location transient. That is, a server process might live on one machine today and find itself on another machine tomorrow. Or a few new server processes may join the mesh. Needless to say, the idea is to create a scalable, flexible system.&lt;br /&gt;&lt;br /&gt;One ramification of that is that it's possible and even very likely that some producers, servers, and consumers could be on the exact same machine. Socket communication over localhost changes a lot of assumptions. Firstly, TCP fusion can occur to reduce overhead significantly. Secondly, there is not an effective bandwidth limitation - there isn't a real network involved, it's a virtual (and fast) one.&lt;br /&gt;&lt;br /&gt;Running all on the same server, I would expect this benchmark to be CPU-bound given that I/O is now virtual and effectively a CPU operation. Like I said, loopback is a real scenario I need but I initially think I benchmarked on a single machine mostly as a matter of convenience.&lt;br /&gt;&lt;br /&gt;So, with all 3 processes running on the same machine, I ran the test. The CPU was a Intel Core I7 920. It has 4 hyperthreaded cores that act like 8. (note: I've tested all of this on a Core2Quad (non-I7) cpu and CoreDuos and results are effectively the same)&lt;br /&gt;&lt;br /&gt;Here's the image of htop during the test with all 3 processes running. (if you run linux and use top, upgrading to htop is highly recommended).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wdOYAcPCMJE/TAW1rVRp-nI/AAAAAAAACiA/UUqCSU03vSY/s1600/htop8cpu.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 88px;" src="http://2.bp.blogspot.com/_wdOYAcPCMJE/TAW1rVRp-nI/AAAAAAAACiA/UUqCSU03vSY/s400/htop8cpu.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5477984277816277618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Don't get hung up on reading the numbers or text. The graph in the upper left gives you a sense of how busy the CPUs are. In this picture, they're all at least a little busy. That's no surprise given we're running many tens of threads.&lt;br /&gt;&lt;br /&gt;Notice that none of the cores are "maxed". This benchmarked showed the server to receive and re-send about 120,000 messages per second (that's 120k from producer to server and the same 120k from server to consumer - so 240k "messages transmissions" but only 120k messages - this would be analogous to queries-per-second for a webserver).&lt;br /&gt;&lt;br /&gt;Why aren't the active cores maxed?&lt;br /&gt;&lt;br /&gt;It occurred to me that I was running 3 CPU-bound processes on the same machine and that the processes might be stepping on each other's toes. It's possible that if the server is running on core 4 one second and the producer is running there the next, the level 1 cache of that core could be ruined for the server the next time it ambles over there.&lt;br /&gt;&lt;br /&gt;The simple solution was to assign cores to the processes. In linux, you do this with command: &lt;span style="font-weight:bold;"&gt;taskset&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Taskset is followed by a bitmask value to assign CPUs - so I ran (in separate xterms):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:75%;"&gt;&lt;br /&gt;taskset 0x3F java manyfeedServer&lt;br /&gt;taskset 0x40 java theProducer&lt;br /&gt;taskset 0x80 java theConsumer&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and off they went. The server is highly multithreaded so I gave it 6 cores. The producer and consumer each got one.&lt;br /&gt;&lt;br /&gt;The result? 270,000 messages/second! Wow. If my cache assumption was right (and I'm not claiming to know if it was) - it REALLY worked. One way or another though - something worked - we got better than a 2x speedup.&lt;br /&gt;&lt;br /&gt;So you might be thinking the moral of this story is:&lt;br /&gt;&lt;br /&gt;1) If you're in linux, install HTOP&lt;br /&gt;2) If you're sharing a computer amongst CPU-bound processes, isolating the processes might (and very well "might not") be beneficial.&lt;br /&gt;&lt;br /&gt;And ok, those are fine ideas. But what bugged me was that htop showed me that no CPUs were maxed yet. Again, what was slowing my application down ahead of CPU power?&lt;br /&gt;&lt;br /&gt;I then tried limiting the server to 2 (hyperthreaded) cores. (I also tried keeping the producer and consumer on the same hyperthreaded "core" and given that I had cores to spare, also tried separating them, but the result was the same).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:75%;"&gt;&lt;br /&gt;taskset 0x03 java manyfeedServer&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, we get 530,000 messages/second. Nice. Reducing the cores from 6 to 2 nearly doubles our msgs/sec again. Here's the htop now:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wdOYAcPCMJE/TAW0TbHsN_I/AAAAAAAAChw/VDubkopB2zk/s1600/htop2core.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 176px;" src="http://1.bp.blogspot.com/_wdOYAcPCMJE/TAW0TbHsN_I/AAAAAAAAChw/VDubkopB2zk/s400/htop2core.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5477982767556605938" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can see that cores 1 &amp; 2 are plenty busy. Cores 3,4,5,6 are idle as expected. Core 7 (the producer) is pretty busy and so is Core 8 (the consumer).&lt;br /&gt;&lt;br /&gt;530k msgs/second is nothing to sneeze at but.. um.. again, no core is maxed.  Why - not?  What's the bottleneck?&lt;br /&gt;&lt;br /&gt;Obviously.. the last test is to throw the whole server on ONE cpu. Apart from the fact that I very purposely and meticulously coded this server be highly multi-threaded, fewer CPUs seem to make it happier. I am a conservative thread-safety-inducer. That is, I'm only really dangerous with firearms and synchronized blocks. But I'm by no means afraid to use the latter when needed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:75%;"&gt;&lt;br /&gt;taskset 0x01 java manyfeedServer&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And finally, we hit 100% utilization on CPU 1 at 790,000 messages per second. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wdOYAcPCMJE/TAW1TT-QQII/AAAAAAAACh4/mXb_HJTdAFw/s1600/htop1cpu.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 113px;" src="http://1.bp.blogspot.com/_wdOYAcPCMJE/TAW1TT-QQII/AAAAAAAACh4/mXb_HJTdAFw/s400/htop1cpu.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5477983865149603970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's the &lt;span style="font-weight:bold;"&gt;TL;DR&lt;/span&gt; of this blog post:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Some multi-threaded java applications apparently run faster on 1 core than on multiple cores&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Note the very non-committal phrasing in an attempt to make this a rather defensible statement. A graph showing the ManyFeed server's performance per number of cores:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wdOYAcPCMJE/TAaKQ7sDwUI/AAAAAAAACiQ/sH2ahTXFdsk/s1600/msgsec.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 214px;" src="http://3.bp.blogspot.com/_wdOYAcPCMJE/TAaKQ7sDwUI/AAAAAAAACiQ/sH2ahTXFdsk/s400/msgsec.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5478218020247814466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So.. if you are a CPU or JVM guru and want to tell me your thoughts on what's going on, I'd love to hear it. &lt;br /&gt;&lt;br /&gt;A long time ago, I &lt;a href=http://mailinator.blogspot.com/2008/03/how-fast-is-java-volatile-or-atomic-or.html&gt;benchmarked&lt;/a&gt; a bunch of different CPU types on doing contended memory stores. To my surprise, a little single-core Dothan processor did amazing in a few tests and I had no idea why. The discussion above is really the same idea. (I've retested that benchmark by the way on the Core I7 - and it has very different characteristics - probably a testament to the I7's new memory architecture).&lt;br /&gt;&lt;br /&gt;Note that if you have a pre-I7 Intel multi-core cpu, you can reproduce my "1 core runs faster" results here using the &lt;a href=http://www.mailinator.com/VariableStorage.java&gt;code in that blog post&lt;/a&gt; (note: this code *is* a micro-benchmark, built to create a situation that causes extreme and unrealistic threading competition - for more details read that blog post). This gives a clearer picture of what's going on. My theory is that with 2 cores and 2 threads - each gets a core and every store operation competes for the memory bus in order to do its operation. Threads spend lots of time "competing" and less time doing real work. On one core (and 2 threads) - only one thread runs at a time - so every time it tries to store in memory, it can.&lt;br /&gt;&lt;br /&gt;The Core-I7 is different (and maybe AMD cpus too) - it doesn't suffer from this memory contention problem at all. (Although - given that my server still runs (way way) better on 1 cpu even on I7, then maybe the contention is elsewhere in my server).&lt;br /&gt;&lt;br /&gt;Here's that benchmark running for Static Volatile Store on a Core Duo CPU with 2 cores and again with 1 core. No performance loss on just one core, otherwise same exact run.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wdOYAcPCMJE/TAXNzq_-qgI/AAAAAAAACiI/e54-f_YVWLs/s1600/chartx.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 213px;" src="http://4.bp.blogspot.com/_wdOYAcPCMJE/TAXNzq_-qgI/AAAAAAAACiI/e54-f_YVWLs/s400/chartx.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5478010809365735938" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(numbers along the bottom are the number of threads in that run - it's not until we have 2 threads that contention creeps in and hurts us).&lt;br /&gt;&lt;br /&gt;Oh.. and how does my little nifty manyfeed server do on a real network?  Testing on 1 CPU on my local 1Gbps LAN I get about 300,000 messages per second.&lt;br /&gt;&lt;br /&gt;With some quick (and hopefully not silly) math, this looks about right.&lt;br /&gt;&lt;br /&gt;1Gbps = 1,000,000,000 bits/sec = 125,000,000 bytes/sec&lt;br /&gt;&lt;br /&gt;125,000,000 bytes/sec divided by 200 bytes/message = 625,000 messages.&lt;br /&gt;&lt;br /&gt;half for producer send and half for the server send (to consumer) = 312,500 each&lt;br /&gt;&lt;br /&gt;On a real LAN, the server saturates bandwidth (i.e. becomes IO-bound) and that's no surprise (i.e. until I have access to 10Gbps networks, I don't need to speed up my server any more).&lt;br /&gt;&lt;br /&gt;Interestingly I tested this idea of "1-core'ing-it" using apache tomcat and apache bench and saw no improvement. I also saw far fewer qps (loading a single, tiny, web-page over and over) and 100% core utilization even on multi-core. It'd be my guess that tomcat isn't contention-bound but truly cpu-bound.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In other words, don't follow this path without testing this yourself. The good news is that its extremely easy to try and you don't even have to change a line of code. Just try "1-core'ing" it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-3927830103689827097?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/Gso5NmdeJSo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/3927830103689827097/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=3927830103689827097" title="53 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/3927830103689827097?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/3927830103689827097?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/Gso5NmdeJSo/how-i-sped-up-my-server-by-factor-of-6.html" title="How I sped up my server by a factor of 6" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_wdOYAcPCMJE/TAW1rVRp-nI/AAAAAAAACiA/UUqCSU03vSY/s72-c/htop8cpu.png" height="72" width="72" /><thr:total>53</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2010/02/how-i-sped-up-my-server-by-factor-of-6.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAASXYzfSp7ImA9WxBUFEs.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-2893947593654941022</id><published>2010-03-01T09:11:00.000-08:00</published><updated>2010-03-01T10:39:08.885-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-01T10:39:08.885-08:00</app:edited><title>Mailinator and (not) Death-by-Popularity</title><content type="html">As far as I know, Mailinator was the first website of its kind. A website to accept any email at all, no sign-up, no registration. Obviously, email websites surely existed before but not with this "no one owns any account" twist. And what a twist it turned out to be. Check out the original web page in 2003 at the  &lt;a href='http://web.archive.org/web/20030801072958/www.mailinator.com/mailinator/Welcome.do'&gt;Wayback Machine&lt;/a&gt; (including the "its like flicking a booger at spam!" original tagline!)&lt;br /&gt;&lt;br /&gt;Needless to say, copycat websites showed up fast. And that's a decent indicator that a new idea is a good one. Or at least an interesting one. As I've (and many others have) said &lt;a href='http://paultyma.blogspot.com/2005/12/idea-about-ideas.html'&gt;before&lt;/a&gt; ideas by themselves are basically worth nothing. And any good idea is destined be copied, stolen, and taken credit for. Execution is the key.&lt;br /&gt;&lt;br /&gt;If you don't believe me - here is part of Mailinator's terms of service present on every inbox page:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;"You agree to hold ManyBrain, Inc./Mailinator harmless from any damages caused by loss of emails, content within emails, damage to your &lt;span style="font-weight:bold;"&gt;computer or innocence&lt;/span&gt; from viewing emails, direct or indirect use of this system, or anything else you can think of. Use at your own risk."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I wrote those words a bunch of years ago. I'm no lawyer so I tried to come up some simple words to get the message across.&lt;br /&gt;&lt;br /&gt;Now. Go to google and search on (quoted) "computer or innocence". Here's a screen shot of what I got.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wdOYAcPCMJE/S4v_quBG97I/AAAAAAAACfA/FJ3oyVTlwjc/s1600-h/innocence.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 600px; height: 460px;" src="http://2.bp.blogspot.com/_wdOYAcPCMJE/S4v_quBG97I/AAAAAAAACfA/FJ3oyVTlwjc/s400/innocence.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5443725683979646898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Almost all entries on this page are Mailinator copycat services that not only "borrowed" the idea of Mailinator - a few even "borrowed" its terms of service !!  Talk about uncreative copying.  :)&lt;br /&gt;&lt;br /&gt;For the public record - again, I'm no lawyer so if you unauthorizedly copied my terms of service and get in trouble - you can't blame me.&lt;br /&gt;&lt;br /&gt;Now keep in mind here - theft of ideas is all part of the game. It is, for better or worse, part of human nature. And as I outlined &lt;a href='http://paultyma.blogspot.com/2005/12/idea-about-ideas.html'&gt;here&lt;/a&gt; - the execution and evolution of Mailinator was mine, but the idea of no-sign-in email wasn't. It was my old roommate's (who at times, has helped out on Mailinator copy and such). &lt;br /&gt;&lt;br /&gt;Google didn't invent the idea of internet search. Facebook didn't start the social web. They just made it better or more usable - or something.  But they won. Sometimes taking a great idea and twisting it just a little, turns it into something great.&lt;br /&gt;&lt;br /&gt;Mailinator however is an interesting beast. It is a hard business to monetize. And that's just fine, so long of course, it doesn't cost a ton to run.&lt;br /&gt;&lt;br /&gt;But therein lies the rub. &lt;br /&gt;&lt;br /&gt;There's a strong sentiment in the web industry that performance, at many levels, doesn't matter. That you simply can "buy another server" and solve many performance problems. And that's true. And generally that's a good idea. I mean, wasting a lot of developer time (who could instead be creating new features) on performance optimization is dubious. Especially if you can throw down 2 or 3 thousand dollars and simply buy another machine to solve the problem.&lt;br /&gt;&lt;br /&gt;I wrote &lt;a href='http://mailinator.blogspot.com/2007/01/architecture-of-mailinator.html'&gt;here&lt;/a&gt; that the initial incarnation of Mailinator started to die at around 800,000 emails per day. If you want to make a Mailinator copy - its really not very hard. You can do it with almost all off-the-shelf (and free) software. Sendmail to receive and some sort of webmail front-end to view. &lt;br /&gt;&lt;br /&gt;That's it. And that's largely what Mailinator was when it started and it took about a weekend to setup.&lt;br /&gt;&lt;br /&gt;But then... I ran into that 800,000 a day problem. This was a performance problem of epic proportions. That is, the site was perpetually crashing. I needed a solution.&lt;br /&gt;&lt;br /&gt;One solution, as I pointed out was to "buy another server" but that would have cost the 2 grand plus the ongoing monthly cost to pay for it. And Mailinator was not making enough to cover that at all. I would have had to start paying for Mailinator out-of-pocket to keep it going.&lt;br /&gt;&lt;br /&gt;And maybe worse - that would have just solved the problem temporarily until I needed yet another server.&lt;br /&gt;&lt;br /&gt;So instead, I did the wrong thing. I rewrote the system from scratch. Threw out the off-the-shelf stuff and built a software system that was customized for Mailinator. Again, financially this was a poor decision (i.e. cost of my development time) but luckily Mailinator is a hobby too so I wrote it off as just that.&lt;br /&gt;&lt;br /&gt;As soon as I brought up the new software email jumped to 3,000,000 a day. The old system was not only choking at 800,000 it was refusing connections. I then upgraded the network at the time from 10mbs to 100mbs and the email again leaped to 6,000,000 a day. That is, the new software was fast enough to expose that we were now saturating bandwidth.&lt;br /&gt;&lt;br /&gt;(Mailinator has now seen &gt;25,000,000 emails per day)&lt;br /&gt;&lt;br /&gt;So that's all fun stuff - but remember those copycat services? Over the years, I've seen 3 of them rise in popularity - and then die (as in literally, site gone, blog explaining it became too expensive to run).&lt;br /&gt;&lt;br /&gt;That's what I meant when I said Mailinator is an interesting beast. Its a paradigm that's extremely easy to reproduce - so long as you don't actually get popular (or you find a great way to monetize).&lt;br /&gt;&lt;br /&gt;Seems like the web has a lot of opportunity for services like this. Cool ideas that in many senses are just too costly to keep running. Then again, the price of tech comes down - and performance increases. &lt;br /&gt;&lt;br /&gt;A Sendmail/Webmail Mailinator today on a modest machine could probably handle a fair bit more than 800,000 a day. &lt;br /&gt;&lt;br /&gt;Every few years I try to re-evaluate every old idea I dropped because I felt it wasn't technically/financially feasible. There's a perpetual convergence of faster tech and cheaper prices. &lt;br /&gt;&lt;br /&gt;New things become feasible every day that weren't feasible yesterday. &lt;br /&gt;&lt;br /&gt;Got any ideas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-2893947593654941022?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/ncFxsr9spf8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/2893947593654941022/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=2893947593654941022" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/2893947593654941022?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/2893947593654941022?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/ncFxsr9spf8/mailinator-and-not-death-by-popularity.html" title="Mailinator and (not) Death-by-Popularity" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_wdOYAcPCMJE/S4v_quBG97I/AAAAAAAACfA/FJ3oyVTlwjc/s72-c/innocence.png" height="72" width="72" /><thr:total>11</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2010/03/mailinator-and-not-death-by-popularity.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQCRXs6eip7ImA9WxNUGUs.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-2502378411995767520</id><published>2009-11-11T11:10:00.001-08:00</published><updated>2009-11-11T11:22:44.512-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-11T11:22:44.512-08:00</app:edited><title>Mailinator for Testing</title><content type="html">Recently I implemented a captcha system in Mailinator.&lt;br /&gt;&lt;br /&gt;If you're a normal user - you've probably never seen it. That's because it doesn't get activated until emails with the same subject get read more than like 10 times in a minute. Needless to say, if you're using Mailinator to sign-up for something here and there, that's not a normal use case.&lt;br /&gt;&lt;br /&gt;But if you're a script - or a person signing up for some website over and over and over (and over) - you hit this pretty fast. It has done a fantastic job of stopping scripts pretty succinctly and slowing down humans zealously working over some site. The main problem with the latter is that many of those sites don't like that and may then ban Mailinator. That's not good for anyone.&lt;br /&gt;&lt;br /&gt;What surprised me about the captcha system is how many people emailed me that I broke their test scripts. That is, they had email system tests (i.e. "Thanks for registering!") that use Mailinator as an end point. Their test then (with variation per user of course) checks the Mailinator inbox that their system correctly sent the email. &lt;br /&gt;&lt;br /&gt;ManyBrain, Inc. (the company that owns Mailinator) has offered for a long time testing packages that completely bypass Mailinator's abuse system for high-volume testing or other emailing. &lt;br /&gt;&lt;br /&gt;I'd be interested in however in improving this service and making it more mainstream. If you use Mailinator for testing - or would like to - I'd like to hear from you.&lt;br /&gt;&lt;br /&gt;How would you use it? What kind of volume? I can't believe anyone is excited about scraping HTML (that wasn't particularly designed to be scraped) to get test results. Mailinator already has a (secret, shhh) JSON interface thats not public. That would seem to be the way to go.&lt;br /&gt;&lt;br /&gt;My thoughts is a JSON-based SOAP/REST/whatever API that allows testing scripts to read emails. Whats a reasonable method and threshold of use to start charging? Possibly a sister site to Mailinator itself would be a better home for the testing service.&lt;br /&gt;&lt;br /&gt;If there's enough interest to support the development, I'd be excited to get this up and running.&lt;br /&gt;&lt;br /&gt;Email me at paul@manybrain.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-2502378411995767520?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/kmZcIIw5NMg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/2502378411995767520/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=2502378411995767520" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/2502378411995767520?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/2502378411995767520?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/kmZcIIw5NMg/mailinator-for-testing.html" title="Mailinator for Testing" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2009/11/mailinator-for-testing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QCQ3s7fCp7ImA9WxNQFUw.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-3709615047508610893</id><published>2009-09-21T00:45:00.000-07:00</published><updated>2009-09-21T00:49:22.504-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-21T00:49:22.504-07:00</app:edited><title>More Alternate Domains !</title><content type="html">I've added a few more alternate domains. If you've never used them, they are simply other domains (for example, sogetthis.com) that forward all email to Mailinator.&lt;br /&gt;&lt;br /&gt;Simply, if you send email to fred@mailinator.com  - or - fred@sogetthis.com it works exactly the same way and your email will arrive in the "fred" inbox at Mailinator both ways.&lt;br /&gt;&lt;br /&gt;You can find alternate domains (including the new ones mixed in) on the front page of Mailinator on the left column.&lt;br /&gt;&lt;br /&gt;I'll be sneaking more into the rotation soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-3709615047508610893?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/bbtYPNZXlb8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/3709615047508610893/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=3709615047508610893" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/3709615047508610893?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/3709615047508610893?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/bbtYPNZXlb8/more-alternate-domains.html" title="More Alternate Domains !" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>11</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2009/09/more-alternate-domains.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUBRXc8fSp7ImA9WxBWE00.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-6164665296772570477</id><published>2009-06-09T05:53:00.000-07:00</published><updated>2010-02-04T08:17:34.975-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-04T08:17:34.975-08:00</app:edited><title>A Beautiful Race Condition</title><content type="html">I recently gave a keynote at the ICIS 2009 conference in Shanghai. The topic was why multithreaded programming seemed so easy, yet turned out to be so hard. The fun part was I investigated (per my last post and this one) several old, personal concurrency demons I knew existed but wanted to know more about.&lt;br /&gt;&lt;br /&gt;One of those was, indeed, my favorite race condition. It doesn't escape me that its probably wholly unhealthy to even *have* a favorite race condition (akin to having a favorite pimple or something) - but nonetheless, the elegance of this one still makes my heart aflutter.&lt;br /&gt;&lt;br /&gt;The scenario of this race is that we assume, not terribly inaccurately, that race conditions at times, can cause corrupted data. However, what if we have a situation where we sort of don't mind some corrupted data? A "good enough" application as it were.&lt;br /&gt;&lt;br /&gt;The dangerous part of all this is if we assume (without digging in) what kind of data corruption can happen. As you'll see, you might just not get the type of data corruption you were hoping for (which is one of the sillier sentences I've ever written).&lt;br /&gt;&lt;br /&gt;The particular instance of this kind of happy racing I've encountered is where someone   uses a java.util.HashMap as a cache. I've never done such a thing myself, but I heard about this race and thus this analysis. They may use it with a linked-list or maybe just raw, but the baseline is that they figure a synchronized HashMap will be expensive - and in their case, a race condition inside the HashMap will just lose (or double up on) an entry now and then.&lt;br /&gt;&lt;br /&gt;That is - a race condition between two (or more) threads might accidentally drop an entry causing an extra cache miss - no biggie. Or, it may cause one thread to re-cache an entry that didn't need it. Also no biggie. In other words, a slightly imprecise, yet very fast cache is ok by them. (of course, this assumption is dead wrong - don't do that - read on for why!)&lt;br /&gt;&lt;br /&gt;So they setup a HashMap in some global manner, and allow any number of nefarious threads bang away on it. Let them put and get to their hearts content.&lt;br /&gt;&lt;br /&gt;Now if you happen to know how HashMap works, if the size of the map exceeds a given threshold, it will act to resize the map. It does that by creating a new bucket array of twice the previous size, and then putting every old element into that new bucket array.&lt;br /&gt;&lt;br /&gt;Here's the core of the loop that does that resize:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:75%;"&gt;&lt;br /&gt;&lt;b&gt;1:&lt;/b&gt;&amp;nbsp;&amp;nbsp;// Transfer method in java.util.HashMap -&lt;br /&gt;&lt;b&gt;2:&lt;/b&gt;&amp;nbsp;&amp;nbsp;// called to resize the hashmap&lt;br /&gt;&lt;b&gt;3:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b&gt;4:&lt;/b&gt;&amp;nbsp;&amp;nbsp;for (int j = 0; j &lt; src.length; j++) {&lt;br /&gt;&lt;b&gt;5:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry&lt;K,V&gt; e = src[j];&lt;br /&gt;&lt;b&gt;6:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (e != null) {&lt;br /&gt;&lt;b&gt;7:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;src[j] = null;&lt;br /&gt;&lt;b&gt;8:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do {&lt;br /&gt;&lt;b&gt;9:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry&lt;K,V&gt; next = e.next; &lt;br /&gt;&lt;b&gt;10:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i = indexFor(e.hash, newCapacity);&lt;br /&gt;&lt;b&gt;11:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.next = newTable[i];&lt;br /&gt;&lt;b&gt;12:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newTable[i] = e;&lt;br /&gt;&lt;b&gt;13:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = next;&lt;br /&gt;&lt;b&gt;14:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} while (e != null);&lt;br /&gt;&lt;b&gt;15:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;b&gt;16:&lt;/b&gt;&amp;nbsp;} &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Simply, after line 9, variable &lt;span style="font-family: courier new;font-size:85%;"&gt;e&lt;/span&gt; points to a node that is about to be put into the new (double-wide) bucket array. Variable &lt;span style="font-family: courier new;font-size:75%;"&gt;&lt;br /&gt;next&lt;/span&gt; holds a reference to the  next node in  the existing table (because in line 11, we'll destroy that relation). &lt;br /&gt;&lt;br /&gt;The goal is that nodes in the new table get scattered around a bit. There's no care to keep any ordering within a bucket  (nor  should there be). HashMap's don't care about ordering, they care about constant time access.&lt;br /&gt;&lt;br /&gt;Graphically, let's say we start with the HashMap  below. This one only has 2 buckets  (the default of java.util.HashMap is 16) which will suffice for explanatory purposes (and save room).&lt;br /&gt;&lt;br /&gt;As our loop starts, we assign &lt;span style="font-family: courier new;font-size:85%;"&gt;e&lt;/span&gt; and &lt;span style="font-family: courier new;font-size:85%;"&gt;next&lt;/span&gt; to A and B, respectively. The A node is about to be moved,  the B node is next.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wdOYAcPCMJE/Si5j5YJz7lI/AAAAAAAAB3k/oxnIwWL8vdk/s1600-h/originalmap.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 118px;" src="http://1.bp.blogspot.com/_wdOYAcPCMJE/Si5j5YJz7lI/AAAAAAAAB3k/oxnIwWL8vdk/s400/originalmap.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5345319645122653778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We have created  a double-sized bucket array (in this case size=4) and migrate node A  in  iteration 1.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wdOYAcPCMJE/Si5klTGlUJI/AAAAAAAAB3s/nzKz7jpnymw/s1600-h/iteration1.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 217px; height: 374px;" src="http://3.bp.blogspot.com/_wdOYAcPCMJE/Si5klTGlUJI/AAAAAAAAB3s/nzKz7jpnymw/s400/iteration1.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5345320399681179794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Iteration 2 moves node B and Iteration 3 moves node C. Note that next=null  is the ending condition of our while loop for migrating any given bucket (read that again, its important  to the end of the story).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wdOYAcPCMJE/Si5lku8IzkI/AAAAAAAAB30/NlbmTFfaOSk/s1600-h/iteration2.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 344px; height: 238px;" src="http://3.bp.blogspot.com/_wdOYAcPCMJE/Si5lku8IzkI/AAAAAAAAB30/NlbmTFfaOSk/s400/iteration2.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5345321489485319746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also important to the story, note that the  migration inverted the  order of  Node's A  and B. This was incidental to the smart idea  of  inserting  new nodes at the  top of the list instead of traversing  to  find the end each time and plunking them there. A normal put operation would  still have  to  check that its inserting  (and not replacing) but given a resize can't replace, this  saves us  a lot of "find the end" traversals.&lt;br /&gt;&lt;br /&gt;Finally, after iteration 3, our new HashMap looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wdOYAcPCMJE/Si5l3LIJgRI/AAAAAAAAB38/_BjK6cHX_KA/s1600-h/iteration3.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 393px; height: 292px;" src="http://2.bp.blogspot.com/_wdOYAcPCMJE/Si5l3LIJgRI/AAAAAAAAB38/_BjK6cHX_KA/s400/iteration3.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5345321806289535250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Our resize accomplished precisely the mission  it  set out to. It  took  our 3-deep bucket and morphed it into a 2-deep and 1-deep one. &lt;br /&gt;&lt;br /&gt;Now, that's all well and good, but this article isn't about HashMap resizing (exactly),  its  about a race condition.&lt;br /&gt;&lt;br /&gt;So, let's assume  that in our original happy HashMap (the one above with just 2 buckets) we  have two threads. And both of those threads enter the map for some operation. And both of those threads simultaneously realize the map needs a resize. So, simultaneously they  both go  try  to do that.&lt;br /&gt;&lt;br /&gt;As an aside, the fact that this HashMap is unsynchronized opens it up to a scary  array  of unimaginable visibility  issues  but that's another story. I'm sure that using an unsynchronized HashMap in this fashion can wrack evil in ways unlike man has ever seen, I'm just addressing one possible race in one possible scenario.&lt;br /&gt;&lt;br /&gt;Ok.. back to the story.&lt;br /&gt;&lt;br /&gt;So two threads, which we'll cleverly name Thread1 and Thread2 are off to do a resize. Let's say Thread1 beats Thread2 by a moment. And  let's say  Thread1 (by the way, the fun part about analyzing race conditions is that nearly anything can happen - so you can say "Let's say" all darn day long and you'll  probably be right!) gets to line 10 and stops. Thats right, after executing line 9, Thread1 gets kicked out of the (proverbial) CPU.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:75%;"&gt;&lt;br /&gt;&lt;b&gt;1:&lt;/b&gt;&amp;nbsp;&amp;nbsp;// Transfer method in java.util.HashMap -&lt;br /&gt;&lt;b&gt;2:&lt;/b&gt;&amp;nbsp;&amp;nbsp;// called to resize the hashmap&lt;br /&gt;&lt;b&gt;3:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b&gt;4:&lt;/b&gt;&amp;nbsp;&amp;nbsp;for (int j = 0; j &lt; src.length; j++) {&lt;br /&gt;&lt;b&gt;5:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry&lt;K,V&gt; e = src[j];&lt;br /&gt;&lt;b&gt;6:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (e != null) {&lt;br /&gt;&lt;b&gt;7:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;src[j] = null;&lt;br /&gt;&lt;b&gt;8:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do {&lt;br /&gt;&lt;b&gt;9:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry&lt;K,V&gt; next = e.next; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt; // Thread1 STOPS RIGHT HERE&lt;/b&gt;&lt;br /&gt;&lt;b&gt;10:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i = indexFor(e.hash, newCapacity);&lt;br /&gt;&lt;b&gt;11:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.next = newTable[i];&lt;br /&gt;&lt;b&gt;12:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newTable[i] = e;&lt;br /&gt;&lt;b&gt;13:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = next;&lt;br /&gt;&lt;b&gt;14:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} while (e != null);&lt;br /&gt;&lt;b&gt;15:&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;b&gt;16:&lt;/b&gt;&amp;nbsp;} &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since it passed line 9,  Thread1 did get to set its &lt;span style="font-family: courier new;font-size:85%;"&gt;e&lt;/span&gt; and &lt;span style="font-family: courier new;font-size:85%;"&gt;next&lt;/span&gt; variables. The situation looks like this (I've renamed &lt;span style="font-family: courier new;font-size:85%;"&gt;e&lt;/span&gt; and &lt;span style="font-family: courier new;font-size:85%;"&gt;next&lt;/span&gt; to &lt;span style="font-family: courier new;font-size:85%;"&gt;e1&lt;/span&gt; and &lt;span style="font-family: courier new;font-size:85%;"&gt;next1&lt;/span&gt; to keep them straight between the two threads as both threads have their own &lt;span style="font-family: courier new;font-size:85%;"&gt;e&lt;/span&gt; and &lt;span style="font-family: courier new;font-size:85%;"&gt;next&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wdOYAcPCMJE/Si5olSzF2_I/AAAAAAAAB4E/zZ7_blOpKuU/s1600-h/e1next1.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 122px;" src="http://3.bp.blogspot.com/_wdOYAcPCMJE/Si5olSzF2_I/AAAAAAAAB4E/zZ7_blOpKuU/s400/e1next1.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5345324797645937650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Again, Thread1 didn't actually get to move any nodes (by this time in the code, it did allocate a new bucket array).&lt;br /&gt;&lt;br /&gt;What happens next? Thread2, that's what. Luckily, what Thread2 does is simple - let's say it runs  through the full  resize. All the  way.  It completes.&lt;br /&gt;&lt;br /&gt;We get this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wdOYAcPCMJE/Si5pbiDeonI/AAAAAAAAB4M/LDLIjceSEjU/s1600-h/thread2done.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 241px;" src="http://1.bp.blogspot.com/_wdOYAcPCMJE/Si5pbiDeonI/AAAAAAAAB4M/LDLIjceSEjU/s400/thread2done.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5345325729454137970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note that &lt;span style="font-family: courier new;font-size:85%;"&gt;e1&lt;/span&gt; and &lt;span style="font-family: courier new;font-size:85%;"&gt;next1&lt;/span&gt; still point to the same nodes. But those nodes got shuffled around. And &lt;b&gt;most importantly&lt;/b&gt; the next relation got reversed.&lt;br /&gt;&lt;br /&gt;That is, when Thread1 started, it had node A with its next as node B. Now, its the opposite, node B has its next as node A.&lt;br /&gt;&lt;br /&gt;Sadly (and paramount to the plot of this story) is that Thread1 doesn't know that. If you're thinking that the invertedness of Thread1's &lt;span style="font-family: courier new;font-size:85%;"&gt;e1&lt;/span&gt; and &lt;span style="font-family: courier new;font-size:85%;"&gt;next1&lt;/span&gt; are important, you're right.&lt;br /&gt;&lt;br /&gt;Here's Thread1's next few iterations. We start with Thread2's bucket picture because thats really the correct "next" relations for our nodes now.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wdOYAcPCMJE/Si5rwdS02tI/AAAAAAAAB4U/OZJsfnKYow8/s1600-h/thread1-1.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 209px;" src="http://2.bp.blogspot.com/_wdOYAcPCMJE/Si5rwdS02tI/AAAAAAAAB4U/OZJsfnKYow8/s400/thread1-1.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5345328287976839890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wdOYAcPCMJE/Si5r9eZF4qI/AAAAAAAAB4c/gDcJMcwKjSc/s1600-h/thread1-2.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 331px; height: 301px;" src="http://3.bp.blogspot.com/_wdOYAcPCMJE/Si5r9eZF4qI/AAAAAAAAB4c/gDcJMcwKjSc/s400/thread1-2.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5345328511609856674" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wdOYAcPCMJE/Si5sLrrwh0I/AAAAAAAAB4k/1lK6serDlaY/s1600-h/thread1-3.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 255px;" src="http://3.bp.blogspot.com/_wdOYAcPCMJE/Si5sLrrwh0I/AAAAAAAAB4k/1lK6serDlaY/s400/thread1-3.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5345328755695978306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Everything sort  of looking ok.. except  for our &lt;span style="font-family: courier new;font-size:85%;"&gt;e&lt;/span&gt; and &lt;span style="font-family: courier new;font-size:85%;"&gt;next&lt;/span&gt; at this  point. The next iteration will plunk A into the front of the bucket 3 list (it is after all, next). And will assign its next to whatever happens to already be there - that  is, node B.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wdOYAcPCMJE/Si5skScRmnI/AAAAAAAAB4s/k7djpnVbcqU/s1600-h/thread1-4.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 192px;" src="http://3.bp.blogspot.com/_wdOYAcPCMJE/Si5skScRmnI/AAAAAAAAB4s/k7djpnVbcqU/s400/thread1-4.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5345329178416880242" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Woah. Thar she blows.&lt;br /&gt;&lt;br /&gt;So right about now  Thread1 goes into, what we like to call in the biz, an "infinite loop". Any subsequent get operations that  hit this bucket start searching down the list and, go into, yep - an infinite loop.  Any put operation that first needs to scan the nodes to see if its going to do a replace, will, you guessed it, go into an infinite loop. Basically, this map is a pit of infinite loopeness.&lt;br /&gt;&lt;br /&gt;If you remember we noted that race conditions cause data corruption. Well, yeah, thats what we have here  - just very unlucky data corruption on pointer structures. I'm the  first to admit this stuff is  tricky - if you found errors in my analysis I'll happily fix this post.&lt;br /&gt;&lt;br /&gt;Now I  had the happy fortune for a time of sharing an office with Josh Bloch who wrote java.util.HashMap. When I innocently mentioned he had a bug in his code given this behavior, he did indeed (to use Josh's word's) go non-linear on me.&lt;br /&gt;&lt;br /&gt;And he was right. This is not a bug. HashMap is built specifically for its purpose and this implementation is not intended as threadsafe.  There's a gaggle of ways to make it threadsafe, but in plain, vanilla,  (and very  fast)  form  - its not. And needless to say, you shouldn't be using it that way.&lt;br /&gt;&lt;br /&gt;Race conditions are nothing to  mess with and the worst ones are the  ones that don't crash your program but let it wander down some unintended path. Synchronization isn't just for fun you know.&lt;br /&gt;&lt;br /&gt;And nefarious uses of HashMap aside, I still attest  -  this is, indeed, a beautiful race.&lt;br /&gt;&lt;br /&gt;Addendum: I've been yelled at a few times  for calling any race condition "beautiful". I'll defend myself by our apparently human nature to generally call intricate complexity beautiful (i.e. waves crashing on a shore, nature in general). &lt;br /&gt;&lt;br /&gt;Most races end  up being about data-corruption. This one is data-corruption that manifests as control-flow-corruption. And it does so  fantastically without an error (infinite loops notwithstanding).&lt;br /&gt;&lt;br /&gt;As the evolution analogy goes, if you drive a needle into a pocket watch - chances are you'll simply destroy it. But there's a tiny chance you'll actually make it a better watch (clearly, not the case here). And another tiny chance you'll simply make it  something "different" - but  still, per se, functioning.  &lt;br /&gt;&lt;br /&gt;Again, my use  of "beautiful" might be more  appropriate as "a complex mutation with surprising non-destruction"  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-6164665296772570477?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/CrUZoZWfwIM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/6164665296772570477/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=6164665296772570477" title="14 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/6164665296772570477?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/6164665296772570477?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/CrUZoZWfwIM/beautiful-race-condition.html" title="A Beautiful Race Condition" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_wdOYAcPCMJE/Si5j5YJz7lI/AAAAAAAAB3k/oxnIwWL8vdk/s72-c/originalmap.gif" height="72" width="72" /><thr:total>14</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2009/06/beautiful-race-condition.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4AQHo-fyp7ImA9WxJXFEQ.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-4097908200161572929</id><published>2009-06-08T08:00:00.000-07:00</published><updated>2009-06-08T13:29:01.457-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-08T13:29:01.457-07:00</app:edited><title>On Java Visibility</title><content type="html">A semi-famous example of broken Java synchronization is this:&lt;br /&gt;&lt;span style="font-family: courier new;font-size:85%;"&gt;&lt;br /&gt;class SomeClass {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;private boolean keepGoing = true;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public boolean get() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return keepGoing;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public synchronized boolean set(boolean x) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;keepGoing =  x;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;I believe this example is in Josh Bloch's book "Effective Java" (which I now notice I  somehow lost my copy in my most recent move - don't tell Josh).&lt;br /&gt;&lt;br /&gt;The idea is here that someone (ostensibly) thought that they'd save some performance by not synchronizing a getter and just synchronizing the setter. There definitely is a cost to synchronization and needless to say, getting doesn't change anything - so why bother paying that cost for gets?&lt;br /&gt;&lt;br /&gt;As has been pointed out long before this post, without a synchronize on a getter, there is no guarantee of visibility when doing the get. That is, if one thread calls set(false), there's no guarantee that any other thread will know it happened.&lt;br /&gt;&lt;br /&gt;Consider code that might use the code above:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:85%;"&gt;&lt;br /&gt;class SomeOtherClass {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;SomeClass keepGoing = new SomeClass();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;class Thread1 implements Runnable {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void run() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (keepGoing.get()) x++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("done1");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;class Thread2 implements Runnable {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void run() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;keepGoing.set(false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let's say you start a Thread1 running. And of course, keepGoing.get() is true, so it just keeps looping along.  Then lets say an eternity (or maybe 2 seconds) later you start Thread2.&lt;br /&gt;&lt;br /&gt;If we had reliable visibility, Thread1 would end the moment after Thread2 sets keepGoing to false.&lt;br /&gt;&lt;br /&gt;If you've read Josh's book, its no surprise that it doesn't. Specifically, Thread1 doesn't end. It keeps going. Thread2 ends happily and Thread1 never ends.&lt;br /&gt;&lt;br /&gt;The only interesting part to me was that this always worked. Always. Adding to the complexity of visibility concerns is that memory is "leaky". That is, even without guaranteed visibility you often get unreliable visiblity. &lt;br /&gt;&lt;br /&gt;So, I dug a little deeper. If you're adventurous enough to grab a debug-version of the JDK and run it with the -XX:+PrintOptoAssembly option. You get to see the optimizations the JIT are making. That is, you see the assembly code version of your Java code - post-optimization. Check out &lt;a href=http://weblogs.java.net/blog/kohsuke/archive/2008/03/deep_dive_into.html&gt;Koshuke Kawaguchi's Blog&lt;/a&gt; for some instructions.&lt;br /&gt;&lt;br /&gt;So here's Thread1's loop code after JIT optimization at runtime:&lt;br /&gt;&lt;span style="font-family: courier new;font-size:75%;"&gt;&lt;br /&gt;02c     movq    R10, precise klass manybrain/test/Main: 0x0000000040a50968:Constant:exact *     # ptr&lt;br /&gt;036     movsbl  R8, [R10 + #596 (32-bit)]       # byte ! Field manybrain/test/Main.keepGoing&lt;br /&gt;03e     testl   R8, R8&lt;br /&gt;&lt;b&gt;041     je,s   B4  P=0.000000 C=147944.000000&lt;/b&gt;&lt;br /&gt;041&lt;br /&gt;&lt;b&gt;043   B2: #     B3 &lt;- B1  Freq: 1&lt;/b&gt;&lt;br /&gt;043     movl    R8, [R10 + #592 (32-bit)]       # int ! Field manybrain/test/Main.x&lt;br /&gt;043&lt;br /&gt;04a   B3: #     B3 &lt;- B2 B3  top-of-loop Freq: 1e-35&lt;br /&gt;04a     incl    R8      # int&lt;br /&gt;04d     movl    [R10 + #592 (32-bit)], R8       # int ! Field manybrain/test/Main.x&lt;br /&gt;054     testl   rax, [rip + #offset_to_poll_page]       # Safepoint: poll for GC        # manybrain.test.Main$Thread1::run @ bci:14  L[0]=_&lt;br /&gt;        # OopMap{r10=Oop off=84}&lt;br /&gt;&lt;b&gt;05a     jmp,s   B3&lt;/b&gt;&lt;br /&gt;05a&lt;br /&gt;05c   B4: #     N53 &lt;- B1  Freq: 4.76837e-07&lt;br /&gt;05c     movl    RSI, #27        # int&lt;br /&gt;061     nop     # 2 bytes pad for loops and calls&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you're old school, welcome home.&lt;br /&gt;&lt;br /&gt;If you're not, then this might look like a lot of goop. So let's parse out just the interesting parts.&lt;br /&gt;&lt;br /&gt;Line 41 is an conditional jump. Basically, if keepGoing (per the comment in line 36) is false, we jump to line 5C (label B4) and end the code segment. You and I know that keepGoing started true, so basically that jump isn't followed.&lt;br /&gt;&lt;br /&gt;Lines 43-5a are the loop that does x++.&lt;br /&gt;&lt;br /&gt;And checkout line 5a. That is an unconditional jump back to the top of the loop. So what does all this mean? That the JIT did some very aggressive optimization. In fact, remember our original loop from Thread1?&lt;br /&gt; &lt;br /&gt;&lt;span style="font-family: courier new;font-size:85%;"&gt;&lt;br /&gt;while (keepGoing.get()) x++&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The JIT has optimized this to:&lt;br /&gt;&lt;span style="font-family: courier new;font-size:85%;"&gt;&lt;br /&gt;if (keepGoing.get()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;while (true) x++;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No wonder  the loop never ends. You've got bigger problems now than a little leaky visibility issue. I'm positive I'm oversimplifying, but effectively the JIT saw your get method wasn't synchronized and made the assumption that it could optimize as such. If you didn't guarantee visibility, it didn't need to either. Obviously, add the synchronization modifier to the get method and all this badness won't happen.&lt;br /&gt;&lt;br /&gt;Moral of the story is much like the inevitable topics discussed at a lunch with &lt;a href=http://jeremymanson.blogspot.com&gt;Jeremy Manson&lt;/a&gt; - you can't optimize away correct synchronization; as all you'll probably do is optimize the "correctness" part away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-4097908200161572929?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/6n13xapVNnU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/4097908200161572929/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=4097908200161572929" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/4097908200161572929?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/4097908200161572929?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/6n13xapVNnU/on-java-visibility.html" title="On Java Visibility" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2009/06/on-java-visibility.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04CQnkzfSp7ImA9WxVRGUQ.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-5266434126738542841</id><published>2009-01-26T10:38:00.000-08:00</published><updated>2009-01-26T10:52:43.785-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-26T10:52:43.785-08:00</app:edited><title>How long before an email is removed from the system?</title><content type="html">I get this question a fair bit.  How long, exactly, is an email available to be read after it enters the system?&lt;br /&gt;&lt;br /&gt;Its hard to answer because its literally dependent upon the incoming rate at which email arrives. In effect, new email "pushes out" old email. That's a bit simplified as some email is thrown away based upon spam rules (if you get 100,000 emails with the same subject, you can probably say they aren't all going to be read). &lt;br /&gt;&lt;br /&gt;So, whats the average?  This weekend, email was lasting around 10 hours before getting "pushed out" of memory.  I've seen that jump down to an hour - but mostly its around 5-7 hours. &lt;br /&gt;&lt;br /&gt;I'll note that the primary Mailinator use case is that people tend to read email soon after it arrives. In other words, if email only lasted 15 minutes, we'd actually fill the needs of many users.&lt;br /&gt;&lt;br /&gt;(I'd be *very* interested in hearing ways you use Mailinator that need mail to stick around longer.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-5266434126738542841?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/TqV0d1anxFo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/5266434126738542841/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=5266434126738542841" title="12 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/5266434126738542841?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/5266434126738542841?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/TqV0d1anxFo/how-long-before-email-is-removed-from.html" title="How long before an email is removed from the system?" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>12</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2009/01/how-long-before-email-is-removed-from.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMAQX89eip7ImA9WxVSFkw.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-7902337155998939941</id><published>2009-01-08T22:04:00.000-08:00</published><updated>2009-01-10T12:14:00.162-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-10T12:14:00.162-08:00</app:edited><title>No, Mailinator didn't spam you</title><content type="html">I must say, it's rare these days but I still now and then get emails from folks that think Mailinator spammed them. As it says on our contact page, this is pretty unlikely. I say that because Mailinator is custom software and that software contains no specific way to actually have a user "send" email.  There's no chance of Mailinator being an open-relay as it stands. And of course, there is no place at all on the site to accept an email for sending.&lt;br /&gt;&lt;br /&gt;I suppose its possible, but it would involve a hacker breaking into the server, installing some other email server (which would likely conflict with mailinator itself), configuring it, and then start pummeling it for their nefarious purposes. Given that any self-respecting spammer has a billion zombies at their disposal and that this would definitely be discovered very quickly (my colo vendor loves to watch my bandwidth), it doesn't seem like an efficient way to spam. &lt;br /&gt;&lt;br /&gt;In any case, I still get accused of spamming at times. And all that accusation takes is for a spammer to forge the return address as a mailinator address. Let me tell you, forging a return address is stunningly easy.  Here's &lt;a href=http://www.google.com/search?q=email+forging+websites&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:en-US:official&amp;client=firefox-a&gt;3 million or so guides&lt;/a&gt; how to do it if you're wondering.&lt;br /&gt;&lt;br /&gt;Below is an actual email header someone sent me. &lt;br /&gt;&lt;br /&gt;The interesting parts are really the first two lines. As you see the forged return path is ronb@mailinator.com. Now if you know mailinator, you know ANYONE can check that box. It belongs to no one and everyone (as outlined in the FAQ - Mailinator guarantees NO PRIVACY. All emails are viewable by ANYONE).&lt;br /&gt;&lt;br /&gt;The 2nd line (i.e. Received:) shows the IP (and dns) of the server that actually sent the email. Something at abac.net.  That looks like a hosting company somewhere. One thing I can tell you though is that that server has zero to do with mailinator. The spam email never ever touched the mailinator server. So even if I devoted my life to stopping this email, there's nothing I could do.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:85%;"&gt;&lt;br /&gt;Return-Path: ronb@mailinator.com&lt;br /&gt;Received: from 216.55.169.94 (216-55-169-94.dedicated.abac.net&lt;br /&gt;216.55.169.94)&lt;br /&gt;by smtpin4.mail.de.uu.net (8.14.1/8.14.1) with SMTP id n083RPV6001157;&lt;br /&gt;Thu, 8 Jan 2009 03:27:26 GMT&lt;br /&gt;Message-Id: 200901080327.n083RPV6001157@smtpin4.mail.de.uu.net&lt;br /&gt;From: "RON" ronb@mailinator.com&lt;br /&gt;Reply-To: "RON" ronb@mailinator.com&lt;br /&gt;To: xxxxxxxxxxxxxx --&gt; &lt;i&gt;edited&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This is sort of similar to a phishing attack. Someone gets an email from their bank, then goes to the phish site, then loses all their money. In truth their bank had nothing to do whatsoever with any of that but the bank still gets blamed.&lt;br /&gt;&lt;br /&gt;The saddest part for me is that even after I respond to people showing them the real culprit, its not uncommon for them to stay mad at me. I suppose its because they then don't know who they're going to yell at now and I'm still available for the job.&lt;br /&gt;&lt;br /&gt;Mailinator is about letting you protect your real email address. It might be to prevent spam but at times it might even be to receive spammy email they really want (just not at their primary address).&lt;br /&gt;&lt;br /&gt;Regardless what you use it for, it won't email you. It just doesn't do that.&lt;br /&gt;&lt;br /&gt;Plenty of people threaten to blacklist Mailinator from ever sending them email again. Yes, please do! As I've said in the past, feel free to put mailinator.com on the tippy-tippy-top of all your spam blacklists. Mailinator doesn't send any email at all - so you can be sure any email that looks like it came from a mailinator address is forged. And I'll sleep just fine if such email gets blacklisted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-7902337155998939941?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/fb4MUQ03yYU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/7902337155998939941/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=7902337155998939941" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/7902337155998939941?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/7902337155998939941?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/fb4MUQ03yYU/no-mailinator-didnt-spam-you.html" title="No, Mailinator didn't spam you" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2009/01/no-mailinator-didnt-spam-you.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUBR389cSp7ImA9WxRbGE0.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-5149447360505851565</id><published>2008-12-08T15:34:00.000-08:00</published><updated>2008-12-08T21:57:36.169-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-08T21:57:36.169-08:00</app:edited><title>Dear World, email addresses are not identity</title><content type="html">Its no secret that part of putting up any website or service is the consideration of security measures to stop people from abusing the system. And as you can imagine, those particular issues are probably doubled or tripled with a site like &lt;a href=http://www.mailinator.com&gt;Mailinator&lt;/a&gt; (and of course &lt;a href=http://www.talkinator.com&gt;Talkinator&lt;/a&gt;). Needless to say, I've gotten pretty good at unorthodox security.&lt;br /&gt;&lt;br /&gt;Anonymity does indeed breed bravery. &lt;br /&gt;&lt;br /&gt;The normal Mailinator use case is that you have a need for a quick email address to sign-up for some web service. Some people however, use Mailinator as an actual primary email repository. With the RSS feed, it acts as a convenient dropbox for newsletters or other semi-private email needs.&lt;br /&gt;&lt;br /&gt;Unfortunately, there are some wacky funsters out there that think it might be fun to sign-up for some website over and over and over and over (and over). Often this is for some site that has "vote for your favorite band" or "sign up for a free gift" or some such thing.&lt;br /&gt;&lt;br /&gt;The primary flaws of these systems is not Mailinator - its that these websites equate the idea of identity with email addresses. Seriously, long before Mailinator existed I had 3 or 4 email accounts that I actively used and another 10 I had probably abandoned. I'm not sure what those site designers were thinking - Mailinator or not, email addresses are FREE.&lt;br /&gt;&lt;br /&gt;If you give someone something that has any value at all in exchange for free email addresses, they're going to ask for lots. I'm probably in a unique position to view this, but I see this idea as incredibly broken.&lt;br /&gt;&lt;br /&gt;One option I had was to simply ignore this idea. Let crafty script-writers create systems that sign up for Wink accounts 1000 times an hour. (As I write this, I'm watching some automated system using several hundred IPs trying to sign-up for wink.com using Mailinator - and watching the Mailinator system dutifully send each request to the abuse page).&lt;br /&gt;&lt;br /&gt;The problem with this is that someday, wink.com will catch on. And they'll ban Mailinator. This is sadly, a wonderfully broken solution to a still existing broken site design.&lt;br /&gt;&lt;br /&gt;The problem for me is that I likely have legitimate users that want to sign up for Wink - and I want them able to do so (and I imagine Wink might want more users too, so by extension they'll lose some or all of the ones I lost). What's insanely broken for sites banning Mailinator is that there are tens of Mailinator-copy-cat disposable web services out there. Or even worse, someone with access to a server and a domain, who can install sendmail and create a few thousand accounts. Simply put, banning mailinator is like catching a single mouse and thinking you've solved the mouse problem. &lt;br /&gt;&lt;br /&gt;You stop the bad guys, but for about a day until they implement a new system.&lt;br /&gt; &lt;br /&gt;I had an interesting discussion with an acquaintance recently. During the conversation I described Mailinator to him. His mouth gaped open and told me he would look into it and probably ban it from his site. I asked what he would be banning it "from". He said he had a trial piece of software that people could sign-up for and download. And he wanted their real information to email them later (i.e. I did my best not to say that he was sending "spam") to see if they wanted to buy.&lt;br /&gt;&lt;br /&gt;I noted that sometimes when I download software to try, I do want to enter my real email. I'm interested enough to want to be registered. But other times, I'm just in browsing mode. If given the chance I'd download and check it out, but if you give me too much impedance I'll probably just go check out his competitor. &lt;br /&gt;&lt;br /&gt;In those cases when I'm just browsing, I'll use mailinator.&lt;br /&gt;&lt;br /&gt;In other words, there are 3 types of potential customers. Those that don't care about his software. Those who really love the idea of trying his software and will do anything to do so. And those who are on the fence.&lt;br /&gt;&lt;br /&gt;For obvious reasons, Mailinator is my "on-the-fence" tool of choice. If he banned it, he'd be refusing some subset of those potential customers. So it basically comes down to the question - whats better? &lt;br /&gt;&lt;br /&gt;1) Definitely get user information you can spam later - or &lt;br /&gt;2) get your product in front of as many eyeballs as possible. &lt;br /&gt;&lt;br /&gt;Also noting the fact that NO email insures any relation to an actual person whatsoever (including yahoo, gmail, hotmail, etc.) - whats the point?&lt;br /&gt;&lt;br /&gt;We continued our discussion and agreed that from a marketing perspective, you actually don't want to remove the email sign-up altogether. It actually brings value to some customers. If you remove it or make it optional, most everyone will skip it just to get to the goodies. But by leaving it and knowing that some people, using Mailinator or Yahoo or whatever, will give you temporary email addresses, you're maximizing your potential customer base. &lt;br /&gt;&lt;br /&gt;It didn't hurt my argument to mention a few other disposable email services that he'd have to ban too. I sure don't know them all - they seem to come and go a lot. And that surely doesn't count ones that run semi-privately. Basically, it would be a fulltime job to keep up.&lt;br /&gt;&lt;br /&gt;Oh. So, back to our script kiddies above. Mailinator includes a system to stop scripts from signing up for websites over and over. I love fun algorithms/data-structures so your homework can be to design something like Mailinator's abuse trigger system - a key-value datastruct that ages with time and is refreshed by lookups that come in at some notable (and tweaked) rate (in the same ballpark as a LRU cache, but definitely more dynamic).&lt;br /&gt;&lt;br /&gt;Its unlikely a human will set-off the triggers but its possible. The sad part (for script writers) is that the algorithm doesn't trigger until their script gets going, so its probably a bit heart-breaking to spend a few hours perfecting a script to scrape Mailinator and then have Mailinator detect it only once it gets going and shut it down hard.&lt;br /&gt;&lt;br /&gt;The first level is the &lt;a href=http://www.mailinator.com/stinky.jsp&gt;Abuse Page&lt;/a&gt;. If you push it, Mailinator will ban IP addresses - but only under certain conditions. That's rather an imprecise way of stopping abuse. In addition, it looks for patterns of mailbox usage regardless of IP. An obvious one is that if one subject "Welcome to Wink!" shows up a lot in the read emails. Sadly, its difficult to distinguish valid users trying to sign-up for wink amongst the botnet hitting right now - so they'll probably get the abuse page too for the time being.&lt;br /&gt;&lt;br /&gt;Potential site abusers taught me a lot and hardened the site considerably. Abuse attempts are still a common occurrence but far less normal than a few years ago. I assume many scripters went to less caring disposable services.&lt;br /&gt;&lt;br /&gt;I often get asked if I care if sites ban Mailinator. I don't really. In some cases its prudent if you really do need to email people that use your service. In most cases however, its simply a knee-jerk reaction attempting to patch an otherwise flawed system. Not only is it a sure way to eliminate some potential customers, the flaw will show up again soon when the abusers shift to another method - and probably another method without Mailinator's facilities to stop scripts. &lt;br /&gt;&lt;br /&gt;In the end, there is no real identity on the Internet. At least none past an IP address and a subpoena. At best, email is optional identity. And prudently, it should probably be treated that way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-5149447360505851565?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/3UFhJNrMppA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/5149447360505851565/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=5149447360505851565" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/5149447360505851565?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/5149447360505851565?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/3UFhJNrMppA/dear-world-email-addresses-are-not.html" title="Dear World, email addresses are not identity" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2008/08/dear-world-email-addresses-are-not.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUCRHg8fCp7ImA9WxRbFEw.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-4194485010606376631</id><published>2008-12-04T10:04:00.000-08:00</published><updated>2008-12-04T10:11:05.674-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-04T10:11:05.674-08:00</app:edited><title>Reserved Names in Talkinator</title><content type="html">Talkinator now includes a beta feature (ok, all features are beta) to allow reserved names. Each room can have only one and the person owning the site (and cut and pasting the code) designates the reserved name and the password to access it.&lt;br /&gt;&lt;br /&gt;If you already have a Talkinator in your site, just click the &amp;lt;/&amp;gt; icon (i.e. get the code!) in the upper right of any talkinator chatbox and create your Talkinator with your reserved name!&lt;br /&gt;&lt;br /&gt;Please let us know how it works and especially if you find any bugs!  (email to support@manybrain.com)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-4194485010606376631?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/wkkcTmSjKw0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/4194485010606376631/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=4194485010606376631" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/4194485010606376631?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/4194485010606376631?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/wkkcTmSjKw0/reserved-names-in-talkinator.html" title="Reserved Names in Talkinator" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2008/12/reserved-names-in-talkinator.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UBRXc4eSp7ImA9WxRVFEk.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-7837892926454551160</id><published>2008-11-11T15:55:00.000-08:00</published><updated>2008-11-11T16:20:54.931-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-11T16:20:54.931-08:00</app:edited><title>So, Mailinator's core-duo server now gets 3 Terabyte a month</title><content type="html">Its been awhile since I've updated my article &lt;a href="http://mailinator.blogspot.com/2007/01/architecture-of-mailinator.html"&gt;The Architecture of Mailinator&lt;/a&gt;. That was a long time ago and really and tons has changed. To save you reading that article if you're in a hurry, the crux was that Mailinator was originally based on the unix email program sendmail, which pretty much died at around 800,000 emails a day. And then it discusses the design of the fully custom SMTP server designed for mailinator.&lt;br /&gt;&lt;br /&gt;In that article, Mailinator was running on a single AMD cpu and processing 3 million emails a day or so. Well, somewhere in there I got a deal with my &lt;a href="http://www.serverbeach.com/catalog/index.php?REF=BA83A6U6H2"&gt;hosting company&lt;/a&gt; and was running a dual dual-core opteron machine. Mailinator ran on that for about a year as our email load doubled a time or two.&lt;br /&gt;&lt;br /&gt;Eventually I needed a server for another project and realized that giving Mailinator that dual-opteron was pretty overkill. So I "downgraded" the machine to a core-duo. Which is where it runs now. In the aforementioned article we were getting 3 million emails a day - now I sometimes see 2 million an &lt;span style="font-weight:bold;"&gt;hour&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;For the geeks out there, this is still of course a highly-multithreaded java implementation often running 4000 simultaneous threads. Pure Java I/O  (not that stinky and slow &lt;a href="http://mailinator.blogspot.com/2008/02/kill-myth-please-nio-is-not-faster-than.html"&gt;NIO&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Today I got an email from my hosting server that I "surpassed my allotted bandwidth". I'm pretty used to getting subpoena's and such, but not so many of these. &lt;br /&gt;&lt;br /&gt;Apparently, Mailinator received 3.1 Terabytes of email in the last 4 weeks. &lt;br /&gt;&lt;br /&gt;Thats (ballpark) 480 million emails or so in that 4 weeks. As I've said before, that doesn't compare to any bigger email service, but then again, I bet they have more than one server :)  I'll also emphasize that numbers I usually throw up here were measured or calculated by me - that 3T number comes from my provider so I hope its accurate as they want money for it !&lt;br /&gt;&lt;br /&gt;Thats a LOT of spam (sure there's web traffic in there which might be hefty in other circumstances, but it doesn't hold a candle against the mail traffic).&lt;br /&gt;&lt;br /&gt;I've priced things out and although my server still has plenty of computing capacity left, I'm clearly hitting an artificial (i.e. pay for more) bandwidth limit. It makes far more economical sense to simply get another server (per all pricing schemes I find) than to buy more bandwidth on this one.&lt;br /&gt;&lt;br /&gt;So, someday I'll get around to writing the next "Architecture of Mailinator" article and although it almost sounds funny to me after all this time, I'll likely be talking about "both" Mailinator servers. Not just our trust little core duo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-7837892926454551160?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/vXTqxJfOc04" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/7837892926454551160/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=7837892926454551160" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/7837892926454551160?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/7837892926454551160?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/vXTqxJfOc04/so-our-core-duo-server-now-gets-3.html" title="So, Mailinator's core-duo server now gets 3 Terabyte a month" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2008/11/so-our-core-duo-server-now-gets-3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIFQX46eSp7ImA9WxRVFUw.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-2184012266225007668</id><published>2008-11-03T07:52:00.000-08:00</published><updated>2008-11-12T10:28:30.011-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-12T10:28:30.011-08:00</app:edited><title>The Revolutionary Fuzzy-Logical Super-Duper Mailinator Captcha System(tm)</title><content type="html">So, after many years of resistance for various reasons, Mailinator has finally implemented a &lt;font color=red&gt;&lt;b&gt;DELETE&lt;/b&gt;&lt;/font&gt; button. That's right. The number one frequently-asked-question that isn't in the &lt;a href=http://www.mailinator.com/faq.jsp&gt;FAQ&lt;/a&gt; has been answered.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wdOYAcPCMJE/SQ8gh-5Qa3I/AAAAAAAABI0/Jjlb6pCIFbA/s1600-h/captcha1.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 80px; height: 24px;" src="http://1.bp.blogspot.com/_wdOYAcPCMJE/SQ8gh-5Qa3I/AAAAAAAABI0/Jjlb6pCIFbA/s400/captcha1.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5264462257610320754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The reasons for its delay are many. In the early days I was too worried that someone would write a script that would attack the system and delete every email out there. Then after a year or two of people writing scripts to attack Mailinator in every other way - I had enough AI built into the system to stop most of it. (As always, I define "attack" as something that could bring the system down or ruin its use for other users - spamming Mailinator is really not on the radar, its not our place to define what is spam in this context).&lt;br /&gt;&lt;br /&gt;Subsequently, I looked at implementing it a few times but tended to back off. If you've read this blog awhile you know that Mailinator and Talkinator at least partially existed as a testbed for implementing server ideas (some earlier articles: &lt;a href=http://mailinator.blogspot.com/2007/01/architecture-of-mailinator.html&gt;The Architecture of Mailinator&lt;/a&gt; and &lt;a href=http://mailinator.blogspot.com/2008/08/benchmarking-talkinator.html&gt;Benchmarking Talkinator&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;And while implementing a delete function might sound simple - it had some interesting complexities in the architecture. In any case I'm happy to say - its finally here.&lt;br /&gt;&lt;br /&gt;And here's the best news. To thwart all those rascally script-kiddies (who probably have seen the rather hidden but sometimes funny &lt;a href=http://www.mailinator.com/stinky.jsp&gt;Mailinator Abuse Page&lt;/a&gt;) we're proud to announce the &lt;span style="font-weight:bold;"&gt;"Revolutionary Fuzzy-Logical Super-Duper Mailinator Captcha System(tm)"&lt;/span&gt; !!!!!&lt;br /&gt;&lt;br /&gt;Thats right. The great service and ironclad spam (fighting/loving/tolerating, your call) abilities of Mailinator are now in a REVOLUTIONARY captcha system!  We could have used a pre-written captcha system but that would have been sadly inferior and very non-mailinatory!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wdOYAcPCMJE/SQ3abQybIjI/AAAAAAAABIs/cx7HSG7gnTM/s1600-h/screenie.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 109px;" src="http://4.bp.blogspot.com/_wdOYAcPCMJE/SQ3abQybIjI/AAAAAAAABIs/cx7HSG7gnTM/s400/screenie.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5264103701363761714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Just look at it and you'll know that this is going to take some major AI, image processing and statistical analysis to crack past this sucker.&lt;br /&gt;&lt;br /&gt;Oh. And one more thing.... (got that from Steve Jobs)&lt;br /&gt;&lt;br /&gt;We at Mailinator are happy to announce that this Captcha system is just &lt;span style="font-weight:bold;"&gt;TOO GOOD&lt;/span&gt; not to share with the world. So, you guessed it, we're releasing it as a web service !&lt;br /&gt;&lt;br /&gt;You can now include The Revolutionary Fuzzy-Logical Super-Duper Mailinator Captcha System(tm) in your websites too !!!&lt;br /&gt;&lt;br /&gt;Here's the highly-technical, low-level URL:&lt;br /&gt;&lt;br /&gt;(edit: url momentarily removed due to immense user respo.. ok.. just a bug... be bak soon)&lt;br /&gt;&lt;br /&gt;(where yourDestination.html is where you want the captcha to go after very securely and precisely verifying the humanness (and also non-computerness) of your user).&lt;br /&gt;&lt;br /&gt;Put this in your web pages and sleep well! &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(Disclaimer: This captcha system, although highly-advanced and chock-full of the latest advances in modern artificial intelligence does a better-than-expected job of verifying humans are humans.  However we've noticed an eensy bug that seems to prevent it from sometimes (or "usually" really (actually its probably more like "mostly" (sometimes its pretty "always" tho))) figuring out that computers aren't humans. So consider this and "alpha" release.. or maybe "pre-alpha" or something like that. A "prototype", yeah, its a "prototype").&lt;br /&gt;&lt;br /&gt;PS: Have your own idea for a captcha? Make the image 80x24 pixels and send it to support@manybrain.com !&lt;br /&gt;&lt;br /&gt;PPS: The delete function is in beta. Please let us know of any bugs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-2184012266225007668?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/Rx2F5xTgKME" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/2184012266225007668/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=2184012266225007668" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/2184012266225007668?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/2184012266225007668?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/Rx2F5xTgKME/revolutionary-fuzzy-logical-super-duper.html" title="The Revolutionary Fuzzy-Logical Super-Duper Mailinator Captcha System(tm)" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_wdOYAcPCMJE/SQ8gh-5Qa3I/AAAAAAAABI0/Jjlb6pCIFbA/s72-c/captcha1.gif" height="72" width="72" /><thr:total>8</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2008/11/revolutionary-fuzzy-logical-super-duper.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEHSHc4eyp7ImA9WxRXF0U.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-7183778299091005492</id><published>2008-10-23T10:17:00.000-07:00</published><updated>2008-10-23T10:23:59.933-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-23T10:23:59.933-07:00</app:edited><title>The Developer's Mailinator</title><content type="html">I get a surprising number of emails from developers testing some sort of emailing system and wondering if its "ok" to send those emails to Mailinator.&lt;br /&gt;&lt;br /&gt;Of course - the answer is yes!&lt;br /&gt;&lt;br /&gt;In fact, thanks to an email from one of those developers named Dave, I've actived port 587 on Mailinator to be an active receiving port (in addition to port 25).&lt;br /&gt;&lt;br /&gt;Mailinator has always accepted email addressed to any domain - (i.e. have a domain name? point your MX record to the mailinator server and it will arrive just fine) so it really is a pretty solid testbed. Remember, you can see the raw email (headers and all) by clicking the "text" link on any mailinator show-email page.&lt;br /&gt;&lt;br /&gt;The only caveat here is that Mailinator's defenses don't come down ever - even for testing. If you want to send a few thousand emails to Mailinator, it very well might start throwing emails away.  As is sort of our goal - we don't mind spam (actually - given the nature of Mailinator - who are we to even define what spam is?). But we ARE interested in the Mailinator service staying up and running. Any legal (and nice - please read terms of service) use is fine by us - but if Mailinator thinks you're being overzealous, we'll probably side with it :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-7183778299091005492?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/5ZMsyyjAmRw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/7183778299091005492/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=7183778299091005492" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/7183778299091005492?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/7183778299091005492?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/5ZMsyyjAmRw/developers-mailinator.html" title="The Developer's Mailinator" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2008/10/developers-mailinator.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8GRXY6eip7ImA9WxRXF0U.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-7929685856633073886</id><published>2008-09-02T08:12:00.000-07:00</published><updated>2008-10-23T11:00:24.812-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-23T11:00:24.812-07:00</app:edited><title>Mailinator for your IGoogle Homepage</title><content type="html">Frank Ellermann has created a very pretty integration of Mailinator into the iGoogle homepage. It now installs with just a click!&lt;br /&gt;&lt;br /&gt;Thanks Frank!&lt;br /&gt;&lt;br /&gt;See it here: &lt;a href=http://www.googleminiapps.com/tools/mailinator-mobile-reader-gadget/#&gt;Mailinator iGoogle&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-7929685856633073886?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/Ur4MxCDjL98" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/7929685856633073886/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=7929685856633073886" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/7929685856633073886?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/7929685856633073886?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/Ur4MxCDjL98/mailinator-for-you-igoogle-homepage.html" title="Mailinator for your IGoogle Homepage" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2008/09/mailinator-for-you-igoogle-homepage.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEGQXk6eSp7ImA9WxdUFE4.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-4497452454785002572</id><published>2008-07-30T09:12:00.000-07:00</published><updated>2008-07-30T09:17:00.711-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-30T09:17:00.711-07:00</app:edited><title>Bob Cringely on Talkinator</title><content type="html">Bob Cringely, well-known computer industry guy wrote a nice &lt;a href=http://www.pbs.org/cringely/pulpit/2008/pulpit_20080728_005308.html&gt;article&lt;/a&gt; about the "Five percent solution". He uses Talkinator as prime example!&lt;br /&gt;&lt;br /&gt;I like this idea - I remember many years ago someone telling me about Google and I thought they were nuts - "I have Altavista - why do I need this Google thing? (silly name by the way)". Or even a bigger one for me was when I first heard of YouTube - so some little guy is going against an already established Google Video with their only real distinguishing feature is that they only allow "short videos"?&lt;br /&gt;&lt;br /&gt;Bob's right - sometimes a very established idea simply needs a 5% twist to take it to the next level.&lt;br /&gt;&lt;br /&gt;Thanks Bob !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-4497452454785002572?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/m-Ehxha5Olg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/4497452454785002572/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=4497452454785002572" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/4497452454785002572?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/4497452454785002572?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/m-Ehxha5Olg/bob-cringely-on-talkinator.html" title="Bob Cringely on Talkinator" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2008/07/bob-cringely-on-talkinator.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYMSHw7eip7ImA9WxdVGUk.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-448848722723660508</id><published>2008-07-24T18:06:00.001-07:00</published><updated>2008-07-24T18:09:49.202-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-24T18:09:49.202-07:00</app:edited><title>Talkinator notes</title><content type="html">When Mailinator came out, people simply couldn't get over the fact that there was no login - I mean, how can you have email that doesn't have a login and password?  It was a very strong paradigm shift for some folks.&lt;br /&gt;&lt;br /&gt;For Talkinator, this paradigm shift has so far been the shock of "all of a sudden" being in a live discussion in a Talkinator room. Again, they didn't sign in or realize it would happen.  Its rather  common for people to not believe its actually live (often they assume its some sort of advertisement).&lt;br /&gt;&lt;br /&gt;It took awhile for people to get-it as far as how Mailinator works. Paradigm shifts come slow - but they're often a lot of fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-448848722723660508?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/rycePnc5k_A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/448848722723660508/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=448848722723660508" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/448848722723660508?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/448848722723660508?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/rycePnc5k_A/talkinator-notes.html" title="Talkinator notes" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2008/07/talkinator-notes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UBQHY4fSp7ImA9WxZUGUU.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-6414596267881295467</id><published>2008-04-12T01:33:00.000-07:00</published><updated>2008-04-12T01:34:11.835-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-12T01:34:11.835-07:00</app:edited><title>Mobile Mailinator</title><content type="html">Great idea - a nice write-up on how to use Mailinator on your mobile phone!   &lt;br /&gt;&lt;br /&gt;http://ergo.rydlr.net/?p=63&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-6414596267881295467?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/6HpIbM2knsw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/6414596267881295467/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=6414596267881295467" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/6414596267881295467?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/6414596267881295467?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/6HpIbM2knsw/mobile-mailinator.html" title="Mobile Mailinator" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2008/04/mobile-mailinator.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIESX86eCp7ImA9WxRbGEg.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-7486689174746338786</id><published>2008-03-30T14:18:00.001-07:00</published><updated>2008-12-09T13:35:08.110-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-09T13:35:08.110-08:00</app:edited><title>How fast is Java Volatile? or Atomic? or Synchronized?</title><content type="html">This is a question I've wondered awhile.  And I've gone ahead and made a stab at finding out. One question that I had was I had always heard that AMD chips have an on-cpu memory controller and Intel's don't (at  least not until they're upcoming Nehalem line). Now I'm first to admit I'm talking above my knowledge (please correct profusely).&lt;br /&gt;&lt;br /&gt;But the idea was that some operations (notably I've heard volatile reads which I didnt test here) are very similar regardless of volatility.&lt;br /&gt;&lt;br /&gt;I spent a few hours making up a benchmark. I'm publishing the benchmark below for one important reason - to get it right. This is big disclaimer: Don't trust these results - at least with any precision. I do conclude that contended synchronization is expensive - thats a pretty expected result so hopefully we're somewhere on the right track.&lt;br /&gt;&lt;br /&gt;However, Java benchmarks are very hard to right. So hard in fact that they do a hardness-overflow and end up looking easy - which is precisely what makes them so hard to get right. Hence - given that only I have seen this benchmark, its pretty likely to be broken some (and hence why its published here for public review to help fix).&lt;br /&gt;&lt;br /&gt;With all that...&lt;br /&gt;&lt;br /&gt;What I've tested here are storage operations. Specifically:&lt;br /&gt;&lt;br /&gt;Storage to a local variable (mostly used as a control)&lt;br /&gt;Storage to an instance variable&lt;br /&gt;Storage to a static variable&lt;br /&gt;Storage to a static volatile variable&lt;br /&gt;Storage to a static AtomicLong variable&lt;br /&gt;Storage to a static variable protected by syncrhonization&lt;br /&gt;&lt;br /&gt;I tested this on 3 different CPUs, all with JDK1.6 and variously on Linux and Windows. One very important point is do *not* compare the absolute numbers in the graphs directly. In no case are comparing the same CPU across 2 operating systems. The CPUs are wildly different in capability.&lt;br /&gt;&lt;br /&gt;So we can explain more with a graph:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wdOYAcPCMJE/R_AEwsFQNBI/AAAAAAAAA8k/G0p9UwcEqpw/s1600-h/opteronall.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_wdOYAcPCMJE/R_AEwsFQNBI/AAAAAAAAA8k/G0p9UwcEqpw/s400/opteronall.jpg" alt="" id="BLOGGER_PHOTO_ID_5183648405616866322" border="0" /&gt;&lt;/a&gt;This is the run on a dual-core dual-Opteron machine. Note the blue-bar is local variable storage. As you'd expect it simply destroys everything else. This is very probably because the smart JVM went in and realized it could optimize the assignment out of the loop. Note the blue-bar just gets happier and happier as we add cores. The threads are completely unaffected by each other and we get actual linear increases in power. Even at 5 threads (note we have 4 cores) we get some speedup.&lt;br /&gt;&lt;br /&gt;The orange and yellow bars are instance variable and static variable stores respectively. Some level of indirection or inability to optimize jumps in and makes things a bit more sane.  Surprising we get little or no improvement as we add threads.&lt;br /&gt;&lt;br /&gt;The three thread-visible methods of store are so slow they barely show up. This brings up an important point, let's assume you wrote an application and made it  correctly thread safe. Using synchronization or volatiles or whatever. You *cannot* optimize away synchronization in the name of performance. It simply can't be done. (conversely, if you could then it wasn't correctly thread-safe to start). You can however, at times, replace one type of synchronization primitive with another.&lt;br /&gt;&lt;br /&gt;That being said, lets take a closer look at the same graph with just the barrier memory store operations.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wdOYAcPCMJE/R_AExMFQNCI/AAAAAAAAA8s/0nuE0i5yJKM/s1600-h/opteronbarrier.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_wdOYAcPCMJE/R_AExMFQNCI/AAAAAAAAA8s/0nuE0i5yJKM/s400/opteronbarrier.jpg" alt="" id="BLOGGER_PHOTO_ID_5183648414206800930" border="0" /&gt;&lt;/a&gt;Volatile and Atomic are neck-and-neck. Synchronization is still a big loser, especially after we contend giving it two threads.&lt;br /&gt;&lt;br /&gt;One other anecdote - while running the non-memory-barrier benchmarks, my CPU meter showed 100% user space usage. With these benchmarks however, it went to 30-40% kernel cpu usage.&lt;br /&gt;&lt;br /&gt;Ok, jumping to the Core2Quad Extreme CPU. Definitely a faster processor but with a different memory architecture.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wdOYAcPCMJE/R_AExcFQNDI/AAAAAAAAA80/ImaQFqsMjiY/s1600-h/corequadall.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_wdOYAcPCMJE/R_AExcFQNDI/AAAAAAAAA80/ImaQFqsMjiY/s400/corequadall.jpg" alt="" id="BLOGGER_PHOTO_ID_5183648418501768242" border="0" /&gt;&lt;/a&gt;Local store again goes flying. Oddly the instance store doesn't do much but the static store increases nicely with the cores.  And, once again, we can't even fricken see the barriered writes.. so here they are.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wdOYAcPCMJE/R_AExcFQNEI/AAAAAAAAA88/C4FX1-gB230/s1600-h/corequadbarrier.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_wdOYAcPCMJE/R_AExcFQNEI/AAAAAAAAA88/C4FX1-gB230/s400/corequadbarrier.jpg" alt="" id="BLOGGER_PHOTO_ID_5183648418501768258" border="0" /&gt;&lt;/a&gt;Look how great the JVM does knowing that just one thread is out there. It can really optimize the code to elide or at least marginalize the impact. Surprisingly, synchronization still gets nailed across the board.&lt;br /&gt;&lt;br /&gt;Note that according to what I have so far, a synchronized static store is something 50 times slower than a simple static store. And 10 or so times slower than a volatile static store.&lt;br /&gt;&lt;br /&gt;One more.. and its a fun one. Windows XP running on a Dothan. (Funny, I realized I hadn't directly known that Dothan was single core, but I just assumed it after I saw the graphs.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wdOYAcPCMJE/R_AExsFQNFI/AAAAAAAAA9E/ZA0Noi6XZhI/s1600-h/dothanall.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_wdOYAcPCMJE/R_AExsFQNFI/AAAAAAAAA9E/ZA0Noi6XZhI/s400/dothanall.jpg" alt="" id="BLOGGER_PHOTO_ID_5183648422796735570" border="0" /&gt;&lt;/a&gt;Crazy. Add a few threads and performance doesn't even budge. Of course, with only one core a system can completely avoid all the complex architecture keeping cores in sync. Why its local writes are worse as compared to instance beats me.&lt;br /&gt;&lt;br /&gt;Also, although I said don't compare graphs, this little single core Dothan beats the Core2Quad in all barrier-ed writes after 2 threads. Note that on the local writes, the Core2Quad is something like 50 time faster. But even on the simple static volatile store - at 2 threads, the Dothan is now twice as fast.&lt;br /&gt;&lt;br /&gt;So. Pardon my informalness here - I'm actually quite expecting feedback to break this code in grand ways and force me to redo all the runs and rewrite all the text (which I'll be happy to do if we get a clean bench out of this).  I have no intention of making very specific claims once this benchmark is firmed up - but I would like to have a "sense" of the costs of these different operations.&lt;br /&gt;&lt;br /&gt;Source code for the &lt;a href="http://www.mailinator.com/VariableStorage.java"&gt;Benchmark&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-7486689174746338786?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/Vda739KLqeA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/7486689174746338786/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=7486689174746338786" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/7486689174746338786?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/7486689174746338786?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/Vda739KLqeA/how-fast-is-java-volatile-or-atomic-or.html" title="How fast is Java Volatile? or Atomic? or Synchronized?" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_wdOYAcPCMJE/R_AEwsFQNBI/AAAAAAAAA8k/G0p9UwcEqpw/s72-c/opteronall.jpg" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2008/03/how-fast-is-java-volatile-or-atomic-or.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YFQXo4eip7ImA9WxZVF0o.&quot;"><id>tag:blogger.com,1999:blog-8523046672726455213.post-8601749959190789236</id><published>2008-03-27T22:26:00.000-07:00</published><updated>2008-03-28T23:11:50.432-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-28T23:11:50.432-07:00</app:edited><title>Introducing: Alternate Inbox Names</title><content type="html">Mailinator helps thousands of people every day avoid spam. It's been a great success.&lt;br /&gt;&lt;br /&gt;One point that always sort of bothered me however was that by giving out a Mailinator address, you were basically telling people not only how to email you, but also how they can check *your* email. If I say "Email me at binkypop@mailinator.com", the whole world knows where to send and &lt;b&gt;read &lt;/b&gt; my email!&lt;br /&gt;&lt;br /&gt;Well, this is no longer a problem.  Today we added "Alternate Inboxes" to Mailinator. We've always had alternate domains, but this is quite different.&lt;br /&gt;&lt;br /&gt;Now, if you check any inbox on Mailinator (say, binkypop), listed on the page is the alternate inbox name. All alternate inbox names start with "M8R-".  For example, for binkypop, the alternate inbox name is &lt;span class="small"&gt; &lt;span style="color:red;"&gt;M8R-yg1hkn&lt;/span&gt;@mailinator.com.&lt;br /&gt;&lt;br /&gt;So simply put, if you email binkypop@mailinator OR M8R-yg1hkn@mailinator.com it doesn't matter. Both emails would end up in the binkypop inbox (and nothing in the &lt;/span&gt;&lt;span class="small"&gt; &lt;span style="color:red;"&gt;M8R-yg1hkn&lt;/span&gt; inbox).  The only way to find out an alternate inbox name is to check the inbox here first - thus if you give out the alternate address, there is no way for anyone to guess that it actually goes to binkypop.&lt;br /&gt;&lt;br /&gt;So.. pick yourself a favorite Mailinator inbox name (make it big, long, and hard-to-guess please!), go check the inbox to find out the alternate inbox name, and hand it out all over the web (of course, alternate domains work on alternate inboxes too!).&lt;br /&gt;&lt;br /&gt;Then check the box (or RSS it) knowing only you know thats the real destination. Also, keep in mind - you don't have to remember the alternate inbox name ever - you just have to remember the real destination address. You can always go to Mailinator and get the alternate anytime just by checking the inbox. And of course, the regular think-up-on-the-fly-and-use Mailinator you know and love hasn't changed a bit. This feature is purely optional (I'm surprised how fast people started using it!)&lt;br /&gt;&lt;br /&gt;(This feature is in beta and we might end up changing the alternate address scheme some)&lt;br /&gt;&lt;br /&gt;This is cool. Alternate inboxes really do up the ante in Mailinator's spam fighting abilities. Enjoy !&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="small"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8523046672726455213-8601749959190789236?l=mailinator.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MailinatorBlog/~4/WNjXESQkX0w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mailinator.blogspot.com/feeds/8601749959190789236/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8523046672726455213&amp;postID=8601749959190789236" title="96 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/8601749959190789236?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8523046672726455213/posts/default/8601749959190789236?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MailinatorBlog/~3/WNjXESQkX0w/introducing-alternate-inbox-names.html" title="Introducing: Alternate Inbox Names" /><author><name>Paul Tyma</name><uri>http://www.blogger.com/profile/11412172362500455307</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://photos1.blogger.com/blogger/1228/848/1600/paulnew.1.jpg" /></author><thr:total>96</thr:total><feedburner:origLink>http://mailinator.blogspot.com/2008/03/introducing-alternate-inbox-names.html</feedburner:origLink></entry></feed>

