I’ve added three new games to Trickster’s Table since I last wrote: 3 Tricky Pigs, Slot Machine Millionaire, and Stepping Stones. I also added the new official Stick ‘Em art by Weberson Santiago, which is a big upgrade for one of my favorite games in the app. Most of the games are now also playable in a web browser at tricksterstable.playagame.app, so you can try them without…
I’ve added two new games to Trickster’s Table since I last wrote: Trick or Bid and Cincos Verdes. In Trick or Bid by Jeremy Zero, once per round, you can choose a bid card from a trick you won and its face value becomes your bid. Trump is the suit of the first card that is bid. The rules are simple but they enable tactical depth and require careful planning.
Since I last posted my progress I’ve added two new games to Trickster’s Table. Pala is a modern classic with a color theme that incorporates a color-mixing mechanic and bidding. Otter (solo variant) is the first shedding game added to Trickster’s Table. It requires careful planning and hand management. Working on this side project has helped me learn Rust which I use to quickly…
Since I last posted my progress I’ve dropped two big updates for Trickster’s Table, my personal microtransaction-free and ad-free app that lets anyone play modern trick taking games against fairly competent AIs. I implemented Torchlit, a trick taking game by David Spalinski which features his crisp art and several distinct mechanics including a forgiving bidding mechanism. Torchlit is…
Since I last shared my progress here, I’ve added two new officially licensed games to Trickster’s Table (my weekend/free-time project for the past two years!): Six of VIII (designed by Carol LaGrow), and Kansas City: The Trick-Taking Game (designed by Chris Wray). I received permission to use the unique and appealing original game art from both Megan Russel for Kansas City and Daniel…
A lot has happened since I last posted about my hobby project Trickster’s Table over a year ago. The app has gotten some good press and very good reviews on Google Play and the Apple App Store. Dice Tower review by Chris Yi 4.9/5.0 rating on the Apple App Store 5.0/5.0 rating on Google Play Since my last post here I’ve added 5 new licensed games: Yokai Septet 4-player by Muneyuki…
I just launched a new game on the Trickster’s Table card game app: Magic Trick by Chris Wray. Magic Trick is a unique game where you can’t see any of your cards’ values - but you can see the suits and cards are ordered from lowest to highest so the values can be deduced as cards are revealed. Additionally, you bid whenever you want by playing a card from your hand without knowing…
First, I completely rewrote Dongsa, my Korean verb conjugation app, in Dart/Flutter. I added an offline dictionary and pronunciations. By switching to Flutter I was able to release an iOS version with no extra effort. Dongsa has now been downloaded over 100,000 times and it has a 4.5 rating on Google Play. iOS Android Second, I launched an app which helps learners of Korean learn Chinese roots.…
Over Memorial Day weekend I took my toy Euchre AI that plays using Information Set Monte Carlo Tree Search and ran it on a VPS with 20 CPUs and recorded the first level of child nodes (which presumably contained all the best moves). There are 42,504 (24 choose 5) Euchre hands. To cut down on computations required I actually skipped hands that had the same set of “outside” cards the…
React Native is pretty amazing. I started getting excited about frontend development again when React came out and now that you can use the same concepts to create native mobile interfaces. Here is a video from a puzzle game I’m working on: Your browser does not support the video tag.
Sooyeon and I have been playing the Castles of Burgundy (CoB) a lot recently. We play it in real life and also on online at Yucata. Sooyeon often beats me so I wanted to figure out what I was doing wrong by looking at some of the better players on Yucata and analyzing their games. I’m not going to spell out how the game works here. If you are unfamiliar with the game I would recommend…
Having worked on six e-commerce websites (half of which make millions of dollars in revenue every year) I can safely say that downtime is a sure fire way to upset the business side of any company. Time, after all, is money. I’ve worked with teams that have tried minimizing downtime incurred by releases in many different ways. Here are some of the extremes: On one end of the spectrum you can…
Sooyeon and I have been very busy for the past 7 months with our brand new baby daughter Haereen. When I get a few spare seconds I still work on my personal projects but it’s been pretty slow going as of late. I’m definitely not complaining since Haereen is totally worth it. Anyway, here is a summary of some of the things I’ve worked on in my free time. dongsa.net 2.
When I was pointed to Python Deployment Anti-Patterns by a colleague I was a little shocked to see that the way we had been deploying applications with fabric and git over the past two years (over 1500 deployments) with no problems was being called an Anti-Pattern. There are definitely many ways to deploy software applications and they all have their pros and cons. Our process is by no means…
Git has a lot of bells and whistles and there are a lot of different ways to achieve any given task. I’ve seen several workflow documents explaining how to use the staging area and git add –patch to only commit some of the changes in your working copy so you can keep nice clean logical commits. I love the idea of having a clean history and logical commits but I think there are some…
In Python (and most sane scripting languages) when something unexpected happens an exception is raised and execution stops. Damien Katz calls this the “Get the Hell out of Dodge” error handling method in his seminal “Error codes or Exceptions? Why is Reliable Software so Hard?” (link no longer available). In his article Damien explains several different ways of handling…
Disclaimer: Many readers have noted that this is a straw man argument and git was not designed to use this workflow. I wrote this blog post because I had seen people at two different companies working this way so it’s only addressed to people who find themselves working this way accidentally. When you have conflicts in the cherry-picking workflow you can lose track of what has been merged…
The iPhone port of dongsa.net (link no longer available) has had a native interface for several months now thanks to the work of Max Christian. The native interface for Android has been ready for a while but as I built it I added way too many new features. Instead of waiting until everything was fully polished I decided to strip back the new features and release an update to get the native UI out…
In my last post I wrote up a scheme to share structured information with friends that doesn’t require a central service like Facebook or Twitter. If you didn’t read that post this post will make very little sense to you. In this post I will explain how losing central control might not mean losing everything you are used to and I will revise a couple of the implementation details. Some…
There are companies making millions of dollars off of your personal information in exchange for giving you a way to easily share data with your friends. Facebook, Twitter and all the rest of these networks are all centralized services. You give them your data, they keep a copy and hopefully they share the data with only the people you told them to share it with. The funny thing is that for decades…
The state of Korean Romanization is a total disaster. After I learned Hahn.geul (the Korean script) I got rid of all of my textbooks that used Romanization because they were more confusing than they were helpful. Still, Korean needs a better Romanization system for foreigners visiting the country. There is a way to Romanize which is much closer to the way that words are actually pronounced in…
Thanks to the work of Max Christian (link no longer available) dongsa.net now has an iOS port which should work on your iPhone, iPad or iPod. You can download it from the App Store. Thanks Max! Here are some screenshots:
Way back in June someone contacted me and asked me if dongsa.net, an online Korean verb conjugator that I wrote, was available as an iPhone app. There wasn’t an app but the email inspired me to rewrite dongsa.net in Javascript so that it could be run offline on devices that support HTML 5. This is possible since dongsa.net uses an algorithm and not a database to conjugate Korean verbs. If…
Tired of slow web frameworks? Does your website need to scale? Are you sick of adding new servers to handle the load of your extremely popular website? Do you have a frozen feature set and no desire to maintain your code? If so, Some Assembly Required is the scaling solution you’ve been looking for. Upgrading from a scripting language Manually convert your program from the slow dynamic…
I have personally said some pretty harsh things about PHP over the years. It’s hard to say nice things about a language which doesn’t have namespaces (apparently they are going to be introduced in PHP 6). This has led to a standard library that eats up the global namespace. On my box at home there are over 1,345 functions defined globally when I run get_defined_functions(). The number…
I’ve implemented my favorite board and card games in many different technologies over the years. Several years ago I tried using a cutting-edge technology at the time named Comet, which is supposed to be a pun on AJAX. Since I chose Comet I got bogged down in testing on different browsers and wrote hack upon hack to make everything work. Comet is really just a hack to make bidirectional…
Which analytics services are most widely used? I wondered this a couple years ago and whipped up a script to check. The script checks 1000 random URLs and looks through the HTML for some strings that are known to be used by certain analytics engines. #Google Analytics is Winning After the last run it looks like Google Analytics is well ahead of the other analytics packages. The script checks for…
In the past 6 months dongsa.net has been used by 3412 unique visitors from 59 countries. As of today it has conjugated 8394 verbs. It’s great to see so many people all over the world learning Korean. Last night I updated the way that irregulars are handled and tried to make it more obvious when a verb is regular or irregular. If you ask for the conjugation of 쉽다 the site will now tell you…
Google’s new language, Go, isn’t as revolutionary as its designers would have you believe but it is an interesting language nonetheless. It is a systems language that has features that address the multicore trend. The future is parallel computation and who better to introduce a systems language with first-class concurrency primitives than the company that popularized MapReduce?…
For the past couple of years I have been playing around with Functional Programming (FP) but I still do a lot of my “real work” in imperative OOP in Python. There are pros and cons to each approach to solving problems. Since some people might not be familiar with FP so I will try to explain it briefly. Basically, in a purely functional language, functions are not allowed to produce…
After reading Tools of the Modern Python Hacker: Virtualenv, Fabric and Pip I updated my current Python project to take advantage of some of the techniques described. Some of the most important methodologies that developers can employ are isolation and automated duplication. Virtualenv makes it easy to isolate and run different programs using different Python and library versions on the same…
I have been working on a program that, when given an infinitive, can conjugate Korean verbs. You can see it in action at dongsa.net (Thanks for the great domain name recommendation Sangwhan!). My original attempt in Erlang never panned out (but it was good functional programming practice). I restarted a couple months ago using Python (a language that I’m much more familiar with) and…
I have been toying with the idea of writing my own blog engine in Python for a while. Yesterday I found a blog post written in a system called Weblog, checked it out and it looks like exactly what I would’ve written so I decided to migrate. Posts are stored in text files with very little metadata (just title, date and then a chunk of text that is interpreted with Markdown).
It’s hard to compete with Haskell’s QuickCheck when it comes to having random test cases generated for you from properties. QuickCheck in Haskell is aided by the fact that Haskell has a very rich type system. I wanted something similar when writing tests in Python, but Python is dynamically typed. Fortunately it’s not too much trouble, using decorators, to annotate methods in Python. Here’s an…
When I was much younger I wrote a program that took sentences that people had typed in and it would respond with a sentence that was formed by randomly selecting a word that had appeared previously in each position in the sentences it had received as input. Needless to say, talking to my program left a lot to be desired. But I thought it was really cool and I had stumbled upon AI all on my own.
When going through the changelog for the latest release of Erlang, I noticed that error messages have been improved. This is great news for people learning the language since the syntax is odd enough already. For example, here’s Erlang’s ever so friendly way of telling you that you’ve called an undefined function in 5.5.2: 1> good:error(). ** exited: {undef,[{good,error,[]}, {erl_eval,do_apply,5},…
Since I am interested in both linguistics and computer science, I occasionally dabble in natural language processing. Living in South Korea and having studied Korean for several years now I’m getting cocky enough to think that I can explain to a computer how to conjugate verbs in Korean. Actually, this is something that I have started over and over again in different languages but I just wasn’t…
I gave a presentation on Gears yesterday at KLDP’s annual meeting in Seoul, Korea. I had a great time and it was very good 듣기 연습 (listening practice) for my Korean. It was great to see so many people interested in Open Source Software in Korea. From what I understand the Korean market is 99.4% Microsoft (hopefully that’s just on the desktop). Thankfully, one of the presentations was about how to…
In my last entry, the code sample that I added to show how to get the best in breed was totally wrong. It was just picking a random organism in the population. This should do the trick: lists:nth(1, lists:keysort(1, lists:map( fun(Organism) -> {simple_gp:fitness(Organism), Organism} end, gerl:many_rounds(simple_gp, gerl:population(simple_gp, 100), 10)))). {1,{mul,[95,5]}} Also, added some simple…
I started a new Google Code project for my very young GP library written in Erlang: gerl (link no longer available). You can define a problem by defining the following hooks: -module(simple_gp). -compile(export_all). functions() -> [{add, 2, fun(V, [X, Y]) -> gerl:evaluate(?MODULE, V, X) + gerl:evaluate(?MODULE, V, Y) end}, …] terminals() -> lists:seq(1, 100). fitness(Organism) -> [run…
This article is a complete gem: http://www.defmacro.org/ramblings/fp.html That means that the only effect of evaluating a function is its return value and the only thing that affects the return value of a function is its arguments. This is a unit tester’s wet dream. [emphasis added -DB]
Subversion 1.5 will have much better built-in commands for merging. This is great news! It’s good to see features like this make it into subversion proper so that we can stop using wrapper scripts like sv (link no longer available), which I presented (link no longer available) at last week’s ChiPy meeting. I’d like to think that scripts like sv lead the Subversion team to realize that…
So, I’m reading the Erlang book by Joe Armstrong, and I just got to the chapter where he’s explaining how to extend Erlang in other languages. The preferred method is to communicate using bitstreams. Egads! This is both a good and a bad thing. Bad news is that it is non-trivial to extend Erlang. The good news is that buggy libraries can’t bring down the whole Erlang VM (unless you don’t take Joe’s…
Trac .11 is nearing completion! Only 16 active tickets are open out of 348 last I checked. Features I’m looking forward to: blame (finding out who broke stuff will be even more fun using Trac’s awesome source browser) jQuery integration (if Trac is using jQuery, you know it’s good! Go get the book!) workflow… (not actually looking forward to this… but some PMs out there are going to love this)
“I think actually Perl was immensely important to the development of programming languages. I don’t think programming languages, like Ruby, would look the way it does if we didn’t have Perl. Without offending anybody, I see it as a step on an evolutionary chain. Larry Wall tried out some cool stuff like hippies and LSD and we opened our minds somehow and that’s great because it’s opened our minds…
I remember the sheer amazement that I felt the first time I saw the Squeak programming environment. It is driven by one of the first object oriented languages: Smalltalk. The demo is quite impressive: a whole world of graphical components had been built up and it looked pretty easy to script them and make them work together. It is plagued by some problems though. Most people don’t have it, and are…
Debian isn’t perfect, but it is perfect for me (and I feel that a lot of other people would benefit from using it). Gentoo Linux is definitely something that every Linux user needs to try out. It’s a from source distribution. But I’m a here and now guy. I don’t want to wait overnight while software compiles to try it the next day and find out that I don’t like it (and my laptop overheats a lot…
Using Windows-based computers can be annoying due to the amount of adware installed on a machine. The Linux community needs to develop a way of making it hard for adware developers to find a home on someone’s Linux box. You might say, “but Dan, there’s no adware on my Linux box,” and you’d most likely be right, now, that is. But it truly is a matter of time before the market gets large enough and…