I ate at a restaurant recently and used the Cover Android app. I actually think the app is pretty decent. However, now it demands I rate the restaurant for some sort of Zagat rating. Killing and restarting the app brings it back to the same rating screen. The app is effectively locked up until I express my opinion. Seriously? Rate it or else? The answer is: Or else. I’m tempted to rate every…
Sometimes, tech companies fuck up in a way that is just so obvious that it utterly baffles me. As far as I know, I’m a perfectly normal San Francisco resident with a perfectly normal Nexus 5. I’ve had my phone number for 15 years. Yet, after downloading Lyft’s Android app, it tells me that my 1-415-XXX-XXXX phone number is invalid. Every Single Time. Maybe they are rejecting…
It’s 2015, almost two years since the release of Jersey 2.0, and it still doesn’t play nicely with Guice. The Jersey/Glassfish team decided to write their own dependency injection system from scratch and made a mess of it (“Static globals? Check. Configuration files in META-INF directories? Check. J2EE locked and loaded, SIR!”). There have been a few attempts at Guice…
One of the issues that drove me out of Dropwizard was the inability to properly test code. I like deep tests that cut across a wide swath of code, with a minimum of mocking and stubbing. My favorite level to test code is the JAX-RS api itself! Unfortunately, because Dropwizard uses Jersey to implement aspects like transaction management, you can’t just casually fire up a test using an…
If you’ve been using Guice for a while, you probably can’t imagine how you could ever again live without dependency injection. At this point I pretty much “think in DI”. So it was with some trepidation that I started a client project using Dropwizard. Dropwizard is a fantastic idea - make some opinionated decisions (ones which I for the most part agree with) and cut out…
I keep having this problem over and over. I have a complex, interlinked object graph on my server and I need to transfer a representation to my (usually Javascript) client. This is a long-solved problem in RPC protocols from the 90s, but like the cure for survy , we seem to have forgotten something in progress towards JSON-based protocols. Consider this example graph of people and their secret…
Update: After over 8 hours of downtime, DNS authority is once again delegating properly. No response from support emails. Also: According to one HN commenter, other .st domains were affected. Every .com domain with remote phonetic value is held by a squatter looking for a $1m payout. So, like many other startups, we chose a clever domain for Voost: https://www.voo.st/. It was perfect - short,…
# first: grep '^......$' /usr/share/dict/words > words f = open('words') lines = f.readlines() lines = [line.strip().lower() for line in lines] letters = 'ecmlobkidepx' def hasall(line): llist = list(letters) for letter in list(line): try: llist.remove(letter) except: return False return True for line in lines: if hasall(line): print(line) Can you guess what game I’m playing?
As Jon and I prepared to launch Voost , we knew we needed an always-on SSL solution. In the age of Firesheep , it is simply no longer reasonable to provide any kind of authenticated service, no matter how trivial, over unencrypted channels. Even though our website hands off authentication (Facebook and BrowserID) and purchasing (WePay) to third parties, there are two good reasons why our online…
There are few APIs more painful to work with than the Facebook API. As the author of a couple deeply integrated Facebook applications and an opensource Java integration library , I suffer with it almost every day. The problem is not that the API is buggy and inconsistent. The problem is that Facebook doesn’t care if the API is buggy and inconsistent. I could pick from hundreds of examples…
I don’t work for Google, but I read the mailing lists and pay attention. Also, I show up at places where Google buys beer. Here’s what I’ve learned: What is changing? Google is changing the way it charges for App Engine. Previously, you were charged for three things: Bandwidth in/out Data stored in the datastore “CPU time” of all your programs The new billing model…