Version 0.9.8 of CRON-o-Meter was released today.
This version brings an update to the foods database (USDA sr23). It also includes the ability to upload your data to cronometer.com (Help Menu -> Export to cronometer.com).
Speaking of which, I’ve been doing quite a bit of work on the cronometer online website. If you haven’t checked it out in a while, have a gander at all the fancy new features!
On April 15th, the DOJ and FBI brought down the ban-hammer to online poker in the USA.
Prohibition is a crime against personal liberty. Just because a small percentage of people cannot responsibly handle something, is no reason to ban it for everyone. In the USA, you can still buy guns, cigarettes and alcohol, despite their proven dangers. You can drive motor vehicles, even though thousands of people are killed in traffic accidents every year. Some people are addicted to shopping and rack up massive personal debt, but shopping malls and credit cards have not been banned.
It is perfectly legal to gamble away your entire life savings in the stock market, but a responsible adult cannot deposit $10 and play a card game on the internet? This is ridiculous. It’s like banning peanut butter because some people are allergic to it.
There are many arguments the prohibitionists make against online poker. I think well designed regulation can solve all of the major problems raised by those supporting prohibition. If done right, good government regulation of online poker can prevent minors from playing, prevent problem gamblers from playing, prevent fraud and money laundering, ensure the game is fair, and generate a significant revenue stream from taxation.
Many countries in Europe have started to regulate online poker. While it is good to see countries like France and Italy now regulating online poker, I think they got a few things horribly wrong. Their regulations were clearly not drafted by anyone familiar with poker. They made a lot of decisions that were a the detriment to the quality of the game, ultimately hurting their players.
The following would be my recommendations for an ideal regulatory framework that would be in the best interests of all involved (poker players, site operators, and legislators).
Regulation should start with regular third party audits by professional security teams. This is already standard practice in the industry, and is required to get gaming licenses in each jurisdiction. This ensures operators are using secure systems that are compliant with the regulation, and correctly dealing a fair and unbiased game for the customers. Operators need to have theoretically sound random number generators, collusion detection systems, bot-detection systems, and anti-fraud systems in place to properly protect their customers.
Just as you need a license to operate a vehicle, buy a gun, or go fishing, citizens wishing to play poker should have an easy way to apply for their own gaming license. To obtain a license, a citizen must verify their identity and register their social insurance number. A player must be of age to obtain a license, and the license can be revoked by the government if there is reason to believe the person is a problem-gambler. Each license can have a maximum limit on how much the player may spend per month. Appropriate spending limits can be determined based on income tax returns. A janitor making $25,000 a year can clearly be labeled a problem gambler if they were losing $1000 a month playing poker. For a lawyer making seven figures, the same amount can simply be considered as an expensive hobby and not something hazardous to oneself and family.
Operators must communicate with a government system to authorize key events such as a player making a deposit or withdraw of funds from the site. This allows the government to have control over each player’s spending limits. Movement of funds is strictly tracked this way, making fraud and laundering very difficult.
Tax can be collected through two avenues; Profitable players will pay income tax on yearly poker income. Income tax can even be automatically deducted from withdrawals, just like is done with payroll. A poker site makes all of its revenue by charging fees to deal hands and run tournaments (respectively known as rake and juice). All fees collected from a player by the operator from rake and juice can also be taxed. This tax should not be too high. France made a big mistake here and taxed the game too heavily for a lot of good players to make a profit. Taking too much money and destroys the incentive to play. Don’t kill the goose that lays golden eggs!
The biggest mistake France and Italy made is that they made their systems closed-loop. French players can only play with other French players. Italians can only play with Italians. This limits the population of players in each jurisdiction, dramatically shrinking the available game selection and prize pools. Poker is a game where you play against other players. The more, the better. Size matters a great deal in the poker ecology. Players should be able to play a global game, but their respective governments can collect tax on the revenue generated by their players.
As a Canadian poker player, I really hope my government considers these recommendations if and when they decide to draft poker legislation.
I’m happy to announce that http://cronometer.com/ is up and running for beta testing. This is a web version of my popular diet tracking tool. The web version is now nearly identical in features to the stand-alone version. While it remains in beta, I can’t guarantee data won’t be lost or corrupted — but it’s been quite solid in testing so far.
Existing CRON-O-Meter users can import most of their data by going to the ‘Profiles’ tab of the web version and clicking the ‘Import Data’ button.
So check out my take on the most advanced free diet software for nutrition tracking and calorie counting!
Well, I’ve been in a deep-coding mindset lately and a lot of progress has been made. It’s a lot nicer looking than it used to be, and I’ve squished a lot of bugs. It has pretty much reached feature-parity with the stand-alone version. There’s still a fair bit of spit & polish needed, and further bug stomping to do. And most importantly, it still lacks an import tool for existing CRON-O-Meter users. Once I get through those bits, I’ll probably open up the site for beta testing (for any brave souls who like discovering bugs!).
Here’s a sneak peak at what it’s looking like today:
I haven’t consulted with a graphics designer yet, so while it doesn’t look too ugly, there’s not a consistent color palette in use yet. Those pastel chart colors don’t go so well with the bold orange theme… I’d appreciate constructive feedback on the design.
I’ve been getting more time lately to muck around with personal projects. One of those is ‘finishing’ my web version of CRON-o-Meter. Last week I finally got the food editor working. Now all that is left to bring it close to parity with the stand-alone version is the recipe system & editor.
I recently threw up a build onto Amazon’s new Elastic Beanstalk service to test it out. It worked quite fantastically well. The pricing for the MySQL instance is a little on the high side though (It looks like it would run close to $80/month just to sit there idle). It would still be a lot cheaper to rent a dedicated cloud server. But the simplicity of the Amazon solution is how it took virtually no configuration to get it all running and hosted. I’m impressed.
Today I got Facebook’s OAuth working, which means you can now log in using your facebook account, as an option. Surprisingly, their documentation was shit. It looked nice but it was repeatedly subtly wrong, and only intensive googling forums found the nips & tucks required to make it go.
Once the basics are all up and running, I’ll get a small private beta going. Longer term, I’ll have to see if it can be supported with ads, subscription fees, or a mix of both. That is, assuming there’s any sufficient interest in it. The market for web based diet sites is pretty crowded, so I’m pretty skeptical it can carve out much more than a small niche.
After moving to Ireland, I fell off CRON. I still managed to eat reasonably healthy, but a lot of factors in our lifestyle there made it difficult to count my calories. For one, my office provided free gourmet lunches every day. Being a life-nit, I could never pass up a free lunch, especially when it was such high quality deliciousness. While I tried to stick to the vegetarian and vegetable options, I’m pretty sure there was a lot of butter involved. The second factor was the frequent dinners out with friends and colleagues. We had a very active social life there, which meant eating out quite a lot. And lastly, and probably the biggest contributor to extra calories, was the drink. Jahy-zus, there were many a pint of frosty lagers and ciders consumed in those four years. I ended up coming back to Canada 30 pounds heavier than when I left.
Anyhow, I’m back now to preparing my own meals and living like a hermit with no friends, so I should have my calories reigned in on the old regime in no time. And to kick it all off, I’ve just pulled a steaming batch of mega muffins out of the oven — ahh that old familiar smell!
Besides diet, I’m also getting way more exercise than I’m used to. I’ve been out skiing quite frequently since my return and I don’t intend to stop!
Exactly four years ago today, we left for Dublin. Today we are moving back to Canada. How can I possibly summarize this chapter in my life? Quite an exciting chapter it has been. One of tremendous personal growth and experiences.
We did an incredible amount of traveling this past four years. A quick look at my pin-map of Europe shows we visited at least 13 countries while we were here. We visited London, Canterbury, Glasgow, Belfast, Paris, Lisbon, Barcelona, Amsterdam, Brussels, Prague, Berlin, Köln, Innsbruck, Rome, Malta, and Cyprus. And somehow in between all of that we managed to also squeeze in trips to Las Vegas, New York, and Hawaii, and several trips back to Canada. Wow. We need to buy some serious carbon offsets…
Speaking of which, Europe is sooo far ahead of North America in terms of sustainability. Small cars are normal, everyone uses public transit and there’s a great network of high speed rail. I paid a carbon tax on my natural gas, and alternative energy projects are widespread across Europe. The EU is on target to meet it’s Kyoto targets well in advance of the deadline. I feel ashamed at the current Canadian Government’s efforts in these areas, and downright embarassed at times. Canada has seemingly done nothing but regress while I’ve been away. Or perhaps it’s always been that way, and living over here has altered my perspective.
Career-wise, the past four years have been quite amazing. The recruiter told me it was going to be like being strapped to a rocket. He wasn’t kidding. This is one of those cases where the old adage rings true; That which does not kill you makes you stronger. In coming here I had to learn a huge complex system under extreme deadlines and serveral doublings of the peak load. It’s never been a dull moment, and it’s been a treat to have hands-on experience building a sophisticated real-time system that has to support hundreds of thousands of players. The previous software I worked on supported a peak load of less than 500 concurrent players. This one can now handle over 200,000. I arrived as a meek programmer and leave as a battle-weary, but confident architect.
As proud of those engineering accomplishments, I’m even prouder of my team. At times we’ve been a band-of-brothers sharing our foxhole while being shelled by server crashes, attacks from hackers, or the friendly fire shelling of insane deadlines. Much of the time, we’ve just been a merry bunch of good friends who laugh at each other’s farts and toss around the frisbee on fair-weather days. It’s been a treat serving with a bunch of top-guns.
Which brings me to the next highlight of the past four years…. all the friends! I’ve never had such a ridiculously full and busy social life. Part of it is the Irish culture. It is a very social place and centers around the (rather unhealthy) activity of going to the pub. As well, relocating here with a large group of co-workers was a major shared experience to bond around. In many situations, it’s not normal to socialize with your co-workers that much outside of work. Everyone has their own social lives anyways. But since we were all freshly transplanted to Dublin at the same time, we were all cut off from our normal social spheres. Naturally we all gravitated towards hanging out and exploring together.
There’s just never been a dull moment, with most evenings out for dinners or off to the pub with folks, or wild weekend parties, bbqs, concerts, trips to the west coast for surfing, or group ski trips in Austria, and so on… Every spare moment has been saturated with social activity. As typical anti-social computer geek, this has been pretty amazing, and at times overwhelming.
I’m gonna miss the hell out of ’em all.
And what lies ahead, in this next chapter? Well, we’re moving to the Canadian Rockies. Christine’s going to be a ski instructor. I’m going to do some consulting, maybe tinker on some projects of my own, or maybe just ski the winter away and try a change of pace. Probably all three. The next chapter is still just a fuzzy idea, so I guess it’s time to start writing…
I spent a little time this afternoon chiseling away on the CoM GWT app. CRON-o-Meter has very basic support for tracking several different types of things for each day. Each type (Servings, Exercises, Biometrics, and Notes) are shown in a separate tab. I’ve always found this annoying as you have to tab between them just to see if there are any entries for each type.
I’m playing around with the idea of showing them all in the main diary table. I had written all of the code to specifically use a Serving class, and so the first order of business was to refactor everything to use a more generic DiaryEntry class.
I’ve now got Measurements showing along side of Servings in the list, with all the plumbing to create, edit, and delete measurements in different units. It’s not the most exciting bit of coding as it is just a lot of grunt-work wiring up all the bits and pieces, but somebody’s gotta do it, so I guess that means me.
Notes will be next. I need a cute little post-it note icon. I don’t like that pencil.
I’ve been tinkering again. I’ve been working on a web app version of CRON-o-Meter. I’m using GWT (Google Web Toolkit) which lets you write your client & server portions in Java, and converts the client java code into native javascript to run in the browser. It’s a pretty slick hack. While web apps are not nearly as clean and responsive as a stand alone app, there are a few nice benefits. For starters, there’s no configuration or installation for anyone to do. It should ‘just work’. Secondly, all the data is kept server side which means you can log in from any machine (work, home, cafe) and update your data. It also makes it easier to share recipes and results.
It’s not fully functional yet, and I don’t have a hosting environment set up yet, but you can see from this screenshot that it’s looking pretty decent. I’ve written the whole codebase from scratch, although it’s design is obviously heavily patterned from the current CRON-o-Meter application. I haven’t done any serious web programming since about 2003, so things have changed quite a bit. The technologies have improved greatly, but one thing that hasn’t changed is that web programming is still a giant pile of ass. CSS sucks, browsers suck, SQL databases suck, and client/server communication over http sucks. GWT helps immensely at hiding much of this, but to do anything non-trivial means getting down and dirty into all of these niggle idiosyncrasies of web development. Ranting aside, it has still been fun and I have enjoyed getting back up to speed with the latest cutting edge web technologies.
A big design decision was that you can only log in using a google account (using a service called OpenId that lets other websites authenticate your identity). I had initially started building it with my own home-baked user authentication system, but decided that for now it is ultimately a huge time saver to just use OpenId. It removes a huge amount of hassle from developing a system to securely manage accounts. I can just piggyback off of google this way, which is just great. I don’t have to worry about account creation, secure password hashing, validating email addresses, resetting forgotten passwords, and so on. If I had to write this all myself, it would likely have bugs and security holes. Instead, I can just focus on the application core.
It’s hard to put together a serious application like this in my spare time, as coding generally needs long sessions of uninterrupted flow time to make progress. Most evenings I’m too burnt out from work to do more coding, or I’ve got all that pesky socializing to do. So generally it’s a little fit of progress each Sunday afternoon. Alas, don’t expect a finished product anytime soon.
It occurred to me the other day, that if one is to take a big picture view, it doesn’t matter so much if I leave that light on in the kitchen, or drive to work instead of taking the bus. As a software engineer for a large company with a huge customer base, I have desicions to make daily that have a much greater impact. If I can optimize the server code than we need less giant energy sucking servers in the data-center. If I can reduce the bandwidth used in the client-server communication that means less work for the millions of clients and all the internet routers in between them and our servers, and far less coal burned as a result. At this scale it means a single thoughtless line of code I write today could mean the addition or subtraction of hundreds of tonnes of CO2. Luckily, efficiencies in the software world are good for the bottom line. Less bandwidth, CPU, and data-center footprint brings down costs, and provides headroom for future growth. But I think it’s too easy to get caught up in personal footprint and not realize the incredibly large impact a lot of us can have in the workplace, where the sheer scale of an operation makes anything personal pale in comparison.