Skip to main content

Posts

Showing posts from 2017

Blog has moved

From now on I will be posting on https://snorristurluson.github.io/ Most of my postings have code snippets in them and I've been using markdown, checking into a GitHub repo, then copying and pasting the contents. Using a static site generated with Jekyll just seems easier. Thanks, Blogger - I have moved on...

Waiting for an answer

I want to describe my first iteration of  exsim , the core server for the large scale simulation I described in my last  blog post . A  Listener  module opens a socket for listening to incoming connections. Once a connection is made, a process is spawned for handling the login and the listener continues listening for new connections. Once logged in, a  Player  is created, and a  Solarsystem  is started (if it hasn't already). The solar system also starts a  PhysicsProxy , and the player starts a  Ship . These are all GenServer processes. The source for this is up on GitHub:  https://github.com/snorristurluson/exsim Player The player takes ownership of the TCP connection and handles communication with the game client (or bot). Incoming messages are parsed in  handle_info/2  and handled by the player or routed to the ship, as appropriate. The player creates the ship in its  init/1  function. The sta...

Large scale ambitions

Learning new things is important for every developer. I've mentioned  this before, and in the spirit of doing just that, I've started a somewhat ambitious project. I want to do a large-scale simulation, using  Elixir  and Go , coupled with a physics simulation in C++. I've never done anything in Elixir before, and only played a little bit with Go, but I figure,  how hard can it be ? Exsim I've dubbed this project exsim - it's a simulation done in Elixir. Someday I'll think about a more catchy name - for now I'm just focusing on the technical bits. Here's an overview of the system as I see it today: exsim  sits at the heart of it - this is the main server, implemented in Elixir. exsim-physics  is the physics simulation. It is implemented in C++, using the Bullet physics library. exsim-physics-viewer  is a simple viewer for the state of the physics simulation, written in Go. exsim-bot  is a bot for testing exsim, written i...

Disappointment

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 ...

Mnesia queries

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 ...

Go, bots, go!

Earlier this year I started experimenting with the  Xmpp   protocol , 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: func main () { conn , err := net. Dial ( " tcp " , " localhost:5222 " ) if err != nil { fmt. Errorf ( " Couldn't connect " ) } messa...