I’m moving to the Bay Area (Cupertino specifically) next week! I apologize for the radio silence – I’ve had about a month to get all my affairs in order and wrap up some pretty big commitments, so I wanted to wait until I had things nearly done and a place to live before I made any sort of public announcement.
Anyway, I’ll be going up there to join some good friends at a brand new secret startup working on mobile tech. It’s been a good run working on games full time over the past few years. I’ve met a lot of amazingly talented people, learned a ton about how games are made, and also picked up some useful skills and knowledge that are coming in pretty handy.
If you’re someone who enjoys the games I’ve released, don’t fear – I’ll still be supporting my work, and Goodhustle Studios will continue to exist. It won’t be my full time job though, and instead games will shift back to becoming more of a hobby for myself. If you actually read this blog, thanks for keeping tabs on me – and make sure to say hi if you’re up in the SF area too!
I’ve been working with Django a bit recently on a new project, and testing out 404/500 templates in the tutorial by switching to DEBUG=False was actually resulting in 500 errors on every page. Since it was a local tutorial installation, I didn’t care to set up emailing of errors. Luckily, this post on StackOverflow showed me how to set up a quick local error log, and I was able to find the issue right away.
The recent Django security release that clamped down ALLOWED_HOSTS to a whitelist approach hasn’t yet filtered down to become part of the Django tutorial. However, as of that release, setting ALLOWED_HOSTS is a required part of setup, and deploying a server with DEBUG=False will throw server errors if not set. If you’re working with the tutorials, set ALLOWED_HOSTS = ['localhost', '127.0.0.1'] in your site’s settings.py and you should be all set.
I like the analogy of the person who buys a $4 cup of coffee from Starbucks that lasts 20 minutes but wont buy a 3 dollar iphone game that would give them much more, not because it’s a valid comment about setting market expectations (and it is, when that trend started people thought they were “cooler” in the eyes of others if they drank expensive coffee instead of 7-11 and here we are 15 years later and “the herd” EXPECTS to pay 4 dollars for a cup of coffee, the same way only in reverse that .99 cents games is setting a bad expectation)…
It also inspires an intuitive insight into who that person really is. That person with Starbucks in hand, and 5 minutes to kill, that just started browsing games in the app store… Is not looking for a REAL GAME they don’t want to feel silly playing a REAL GAME that requires them figure out how to play, and to pay REAL attention to whats going on. They have a 5 minute subway ride where their signal sucks, or 4 minutes staring at the wall before their next meeting. They also don’t want to feel foolish or nerdy taking a game overly serious. Which is why you will find almost no seriously titled or art directed games in the app/google store, everything is inoffensive, cute and cuddly and/or whimsical. This means they don’t want IMMERSION OR SUSPENSION OF DISBELIEF, the game needs to be inoffensive to the point where they don’t feel uncomfortable buying it; And non-immersive to the point where they don’t lose track of time playing it.
Taking my first email / computer break since our beautiful baby girl Ellie was born! They say it’s a whirlwind at first, but I didn’t really understand until I was under a two-to-three hour feeding cycle. It kind of reminds me of that part of Lost where they have to push the button every so often or else nobody knows what will happen. My whole schedule has revolved around being available.
Since I’m in a mood for analogies, the first few days are truly about getting The Setup correct. Back when I was playing team Halo a lot with my friend Kazu, the initial goal is always to get all of your players into position so that you can support each other. Once you had everyone in place and in control of their surroundings, and communicating well, you’d dominate – and that’s what’s called The Setup. With parents, grandparents, and other helpers around, having a newborn requires that you get your system working so that you can make everything happen smoothly and never run out of stuff.
Thankfully, she’s been a great kid to have around, and super cute to play with when she’s awake! World, meet Ellie!
If your .htaccess password-protected directories “above” a wordpress install are not working correctly, there is potentially a problem with the webserver searching for a 401 error document and not finding it, thus passing control on to the wordpress catchall RewriteRule.
Try adding in the following line BEFORE the #BEGIN WordPress line:
ErrorDocument 401 /401_error.html
After a few hours of frustration, I didn’t actually believe that this would work, but it did!
The resemblance of this early enthusiasm to that of Vox is interesting. I wonder how much it has to do with suddenly liberating the same subset of people from their ties with the rest of the world, and allowing them a private playground once again. Although the circles control system is nice, I think the mental overhead of deciding which subgroup of people to share content with is something that will exist regardless of the smoothness of the tools used to carry out that decision.
The intentional selection of a highly connected group of educated internet users to launch the service with mitigates that overhead because the limited audience means that most of the stuff we’re currently posting probably has really strong appeal to the early users. FB suffers from that overhead pretty badly because of the extent to which we’re populated the social graph on it as a culture. For instance, I hesitate to post overly personal/technical things not because the tools to limit that to a subgroup are bad on FB, but just that the overhead of knowing that I have to make that decision as part of the sharing process is enough to stop me before I even begin to write. I expect that in the coming days/months, there will be a reduction in content sharing/engagement on G+ as the graph becomes more populated. It took my mom a few years to get on Facebook, but once she did (and through no fault of her own – Hi Mom!), it plugged up one potential outlet of personal expression for good.
It’s not a criticism of G+ per se, but instead a recognition of the fact that our old tools with a shiny layer on top are still subordinate to the relationship problems of social interactions, and these giant general-purpose social networks don’t want a subset of the people we know, but want the entire graph. Social software can help us communicate but social politics haven’t been modeled in a way that we can trust software to manage it… not that any of us would want that anyway. The general-purposeness of monolithic platforms are both valuable and gradually limiting, and maybe causes the population to hop from platform to platform (in engagement if not registration).
In real life, social links are temporal, fluid, and also vary in degrees and nature. When we add a friend on G+ or FB, we don’t do so with a time limit, but that’s implicitly what we used to do when we change jobs, schools, or locations. People grow, change, adapt, and to connect us all together again (at least, in my generation) makes for some awkward moments. The attempt to recapture all past social links and make them permanent sure seems like a great idea, but as the years go by, I can’t help but think that there are some natural flaws in this approach. However, it won’t stop further investment or growth because the temporary capture of our daily activity is too valuable to pass up.
I realize that Circles are intended to help us manage disparate, overlapping groups together, but I think it’s much more natural to have social context be at the granularity of physical location or metaphorical representation thereof. On the web, I’d say that the URL is at the proper granularity to associate with a social context, and Circles may just be buried too deeply. Operating on a purely adhoc basis is also interesting, and perhaps what makes Pool Party and similar photo-sharing apps appealing. Having adhoc groups expire would be an interesting interaction to play with, especially because it may manage to communicate an effective intention about these adhoc groups.
Anyway, Google+ is not a bad thing, as it will keep people working on big social networks, prevent any one from becoming “dominant”, and will keep the press employed writing about why X killed Y or why Z is dead now. It may be all tilting at windmills, but it sure keeps the money flowing! All kidding aside, there are many benefits from continuing to develop monolithic social networks, and I hope we don’t stop. I just feel heartened by the idea that by their nature, they won’t be able to completely replace more contextually narrow services that focus on just parts of the whole cultural graph. Long live social software!
If you’re not a web developer, please ignore this post, as it won’t make any sense to you.
It never occurred to me that 301 on-domain redirects might be a bad idea for passing along browsers/search indexers to new content URLs, but here’s a use case where it becomes a big problem: when the person in charge changes their mind and wants to revert anything that you modified with a 301. I felt like an idiot for getting stuck in this technical snafu, and the workaround feels horrible, so let me explain.
Let’s take a simple example. Say you’ve got a page with information about widgets, and your task is to redesign the widget page. You see that it’s called content_123.html. Obviously, this isn’t a good URL, so you would like to guide clients correctly to a new URL, like “/products/widgets”. You heard that 301 redirects pass along PageRank after a little delay, and it’s better than serving a 404, right?
Well, here’s where it gets hairy. A few weeks later, the person in charge changes their mind and instructs you to revert the site to its original form. Easy, right? Just remove the 301 redirect from .htaccess, restore the old files, and you should be good to go, right?
Wrong. 301 redirects are cached for certain browsers, such as Firefox 3.5+ and Chrome. That means that a large set of users that visited your site, along with search engines, cached that mapping of content_123.html to “/products/widgets”. Even though your webserver is no longer instructing clients about any 301 redirect, any browser (and likely all search engines) have now saved your 301 redirect. You can’t create the reverse mapping either, because browsers and search engines are usually smart enough to avoid infinite loops, so they’ll just ignore the new instructions. God forbid you redirected anything to “/”, too.
If you’re lucky, this is an intranet app and you can instruct all users to manually clear their browser caches. If it’s public and this was a big redesign, your users may never even be able to get to a valid page if you just dump the old files on the webserver and they’re all redirected via 301s.
The big issue is this: there is no way to tell a browser to clear out or undo a 301 redirect. You have to wait for a browser user to clear the cache, or have to wait for it to expire. This is totally unacceptable from a user’s point of view, so here’s a super-ugly way to workaround the problem.
Put legacy content back.
Eliminate all 301 redirects from your .htaccess / mod_rewrite config. Might as well stop causing damage first.
Rename legacy file (perhaps append something standard), like content-123-orig.html
Create new mod_rewrite rules to do 302 redirects from the original legacy URL to the new renamed URL. This will redirect all existing links from the legacy site to the old URLs, for any browsers without the cached 301 redirects, such as new visitors or users who clear caches.
Create more mod_rewrite rules that do 302 redirects from the 301 redirect targets (the “new” urls that are being moved away from). This will redirect clients that were using the new site, and also will serve the correct page for clients with a cached 301 redirect – for example, browser A cached the 301 redirect, and so when you type in /content-123.html in its address bar, it instead tries to load “/products/widgets.html”. Because of the new 302 rule, it will report that “/products/widgets.html” has been moved temporarily to “/content-123-orig.html” and the user will load the legacy page contents.
This is obviously a really horrible workaround, but changing your mind is something that normal humans do in the real world, and irreversible changes deserve more attention. It’s embarrassing to post a “solution” like this, but if you run into this problem I’d rather save you some time than save me some face.
If you’re considering going with 301 redirects in a move to a new URL structure, be aware that you’re moving down a one-way street. It makes HTTP 301 seem awfully out of place in a spec that is otherwise quite comprehensive about downstream caching of content. Caching redirects seems like a logical behavior when the spec says that the change is permanent, and I suspect the main reason that this hasn’t caused more visible problems yet is that the “permanent” part has been ignored by browsers until recently.
I haven’t made many updates to my blog lately because I’ve been working very hard with Khang Le to release our new game for iPhone and iPod Touch, Beast Boxing 3D. It came out last Thursday, and just today it was featured by Apple in their New & Noteworthy lists on both iTunes and the App Store on devices.
Hey, would you look at that!
Reviews have been excellent and we couldn’t be happier with all of the press coverage we’ve been getting. Gamers have been enjoying the game, and I’ve been working hard on iPhone game marketing to get the word out, while isolating my weekends to work on coding experiments and improvements for future updates.
If you haven’t gotten Beast Boxing 3D yet, it’s choice, and if you have the means, I would highly recommend it. Please visit our promotional website at beastboxing.com, and leave a comment to let me know what you think!
I’ve been drinking coffee for about ten years now, mostly taking breaks when the caffeine headaches start telling me that I’ve had too much. In that time, I’ve gone from drinking macchiatos from Starbucks to drinking black drip coffee. And now, I can impart some wisdom to you on how to brew a good cup of the same at home.
If you like to keep things simple like me, there are a couple things you really need to pay attention to, and most of the rest of the details give you marginal returns on investment. Oh, and I should mention – if you want to go down this road, start drinking coffee (or at least sip it at first) without cream or sugar. If you do use cream or sugar, at least give the cup a few sips first to get accustomed to the taste, because covering the taste up should only be necessary with truly horrid cups of coffee.
The most important thing (surprisingly) is the water you use. You want to use filtered water, not tap water. Tap water leaves a strange aftertaste in your mouth, and switching to filtered water produces a cleaner taste. Brita or Pur filters, filtered water from the fridge, or store bought filtered water all have worked for me in the past.
The second most important thing is to grind your coffee beans fresh. For drip, it doesn’t really make a gigantic difference whether you use a burr grinder or a cheapo blade grinder – the big payoff is just in grinding fresh beans every time you want a cup. Burr grinders with variable grind sizes should be set to medium – too small and the espresso-like grinds trap the water for too long, which can sometimes result in overflows in regular coffee makers or just really slow brew times.
After that, it’s a matter of your preparation tools. My current preference is to use a Chemex coffee maker, which pretty much just holds coffee grinds in a filter while you pour hot water in. To boil water, any stovetop kettle will do.
Chemex coffee makers look beautiful, are simple to use, and also produce smooth, delicious coffee with very low levels of bitterness. I bought one about six months ago after reading up on alternative coffee making systems, and it’s been one of my favorite additions to the home. In case the marketing materials confuse you like they did me, I made a simple video showing how the pour process works.
Normal coffee makers that vaporize the water tend to produce bitterness which I got used to over the years, but using a Chemex instead and boiling my own water makes the result much smoother, even for extra-bold coffee blends. A good cup should be like an ambrosia of flavors, deep and complex – kind of like the first sniff from a freshly opened bag of beans. It makes a lot more sense to drink coffee without cream or sugar once you’ve gotten rid of the bitterness and burnt tastes!
The result (if you follow these steps) should come kinda close to the general quality of high-end drip shops like Philz in SF, and even better than Starbucks or Peets drip, in my opinion. Actually, the Philz system is pretty much the same thing as the Chemex – just pouring hot, just-under-boiling-point water through regular filters held in place. The difference there is that they make some really incredible fresh ground blends with all sorts of interesting spices.
For extra credit, you can find zero-day beans from a local coffee roaster, and that will give you a coffee drink like nothing you’ve ever tasted, but that effect wears off in about a day, then you’re left with simple, delicious coffee.
That’s about all you really need for awesome drip coffee – good filtered water, fresh ground beans, and a good drip system like a Chemex. The fancy stuff is not really gonna help much more. You can get away with just fresh ground beans and good water in any case, but the Chemex is so much smoother that I think it really belongs in the list. Good luck in your search for coffee nirvana!
Roger Ebert’s recent article is strange, because you’d think in order to call something non-art, you’d have to experience the subject in its medium. His critique reads like an article about movies written by someone who maintains a disdain for them based on screenshots and trailers. Although I think he has a point about the oddness of the whole debate, it would lend more credibility to his argument if he actually played the games in question.