I am a software architect at CCP Games. Work on the launcher, Wine support, graphics engine and other random stuff for EVE Online, usually low level. This blog details some interesting things I run into at work, as well as new things I'm trying out in my spare time. Lately I've been picking up new programming languages - Erlang/Elixir, Go, Swift whereas most of my work in the past is in C++ and Python.

Subscribe to this blog

Follow by Email

Search This Blog

Posts

My employer laid a bunch off people yesterday. While I still have a job, this makes me really sad. I feel bad for those people that didn't have a job to go to this morning - some of them have worked here a long time, some of them are good friends, some acquaintances, some I can't really say I know.

I'm sure they will find good jobs elsewhere - unemployment here in Iceland is very low these days, but then again, there aren't that many game developers. For some, this will mean not only changing jobs, but moving to a different country, on a very short notice. While that can be exciting, it can also be very upsetting.

I mostly feel disappointed. I really believed this company had evolved past this sort of behavior. We've seen layoffs here before - it was painful, and we've really made an effort of avoiding getting ourselves into this situation. Or so I thought.

Shifting focus is sometimes - often, maybe - necessary. I just wish companies could do that without letti…

I've added search and trim to my expiring records module in Erlang. This started out as an in-memory key/value store, that I then migrated over to using Mnesia and eventually to a replicated Mnesia table.
The fetch/1 function is already doing a simple query, with match_object. Result=mnesia:match_object(expiring_records, #record{key=Key, value='_', expires_at='_'}, read)
The three parameters there are the name of the table - expiring_records, the matching pattern and the lock type (read lock).
The fetch/1 function looks up the key as it was added to the table with store/3. If the key is a tuple, we can also do a partial match: Result=mnesia:match_object(expiring_records, #record{key= {'_', "bongo"}, value='_', expires_at='_'}, read)
I've added a search/1 function the module that takes in a matching pattern and returns a list of items where the key matches the pattern. Here's the test for the search/1 function: search_partial_…

Earlier this year I started experimenting with the Xmppprotocol, and implemented bots in Python to communicate with an Xmpp server. I've now revisited those bots and reimplemented them in Go. I've been meaning to learn Go for quite a while, and this seemed like a reasonable first project to tackle.
The source code lives on GitHub: https://github.com/snorristurluson/xmpp-chatbot
If you are an experienced Go developer, I would appreciate any feedback and suggestions on how to improve the code - if you are just starting out with Go like myself, I hope this blog and the code is useful to you.
As before, I'm using Prosody to communicate with. Just like I did in Python, my first experiment is to simply open up a socket and poke the server to see where that takes us: funcmain() {
conn, err:= net.Dial("tcp", "localhost:5222")
if err != nil {
fmt.Errorf("Couldn't connect")
}
message:="<?xml version='1.0'?>…