Log in
Seblog.nl

Kort

‪Ik heb één klok in mijn huis die niet zelf naar wintertijd gaat. Het was leuk om te zien hoe laat het ‘eigenlijk’ was, vond ik, voor een paar weken. Nu heb ik ‘m op lokale zonnetijd gezet, dat voelt echter.‬

Really liking the arrow functions in PHP 7.4 so far! Unfortunately already found one missing feature: you can't throw Exceptions from them. The following results in a 'unexpected T_THROW' syntax error:

fn() => throw new Exception('nope');

Would've cleaned up my test, but alas.

De oorkussens van mijn Bose QuietComfort 35 II waren na twee jaar dagelijks gebruik echt helemaal versleten en aan één kant zelfs opengesprongen. Jammer, want het is echt een geweldige koptelefoon. Maar gelukkig kon ik nieuwe oorkussens bestellen, en die zijn net binnen.

Nieuwe dingen kopen geeft altijd een korte kick, maar het zorgvuldig oppoetsen en het vervangen van kapotte onderdelen van een ding dat je dagelijks gebruikt voelt veel fijner. Hij is weer echt als nieuw. Op naar de volgende twee jaar.

Disney+’s algorithm still hasn’t figured out I’m binge watching all Marvel Cinematic Universe movies in chronological order. Luckily there is Wikipedia for the list.

‪Just had a nice moment of “hey I know nothing about z-index, but I know it does not work the way you think it works”, and then being able to help someone out by Googl’ing up this MDN page.‬

‪You don’t need to know everything, just remember where the weird things‬ are.

‪There is a bit of a design flaw in Apple Pay with FaceID. With TouchID and on the Watch, the verification is tactile, but with FaceID I have to shift my attention to my phone to activate. Most of the time, I see the amount I’m paying in a flash, way too late if it were incorrect.‬

‪Ik keek mijn fotoarchief door en zag een vrij dagelijkse selfie met mijn broertje uit 2009. ‘Koningsdag’, had Apple er met grote letters onder gezet. Ik wil het die programmeurs niet aandoen om de bug te melden dat nationale feestdagen zich soms verplaatsen over de jaren.‬

When writing large numbers and decimals, Dutch and English use the complete opposite characters to notate them. So a million times pi is written as "3.141.592,6535" in Dutch and "3,141,592.6535" in English. I find both very confusing at times, especially the comma in both cases. Wondering if I should adopt Ruby's underscore for this: "3_141_592.6535".

So many times I see developers using the word 'physical' when they are still referring to some virtual thing, just one layer less abstract.

Some other weird things about falsy Javascript:

false == false
0 == false
[] == false
"" == false
"0" == false
"\t" == false
[] == false
["0"] == false
[[["0"]]] == false
[[[1 - 1]]] == false
[[[{}.foobar]]] == false
[[[`\t ${[].length} \t`]]] == false

// BUT

[false] != false

So, yesterday I learned that [] == [] is false in Javascript. Today my adventures with arrays lead me to this:

const coffees = ['espresso', 'latte', 'filter']
console.log(
  'filter' in coffees,
  'cappuchino' in coffees,
  'espresso' in coffees
)

// => true, false, false

I don't understand why people prefer arrow-functions in Javascript in the following context:

const name = () => stuff();

vs

function name() {
  stuff();
}

... they are ideal for callbacks and map-operations, but when I want to declare a function, I want to see that keyword.

Dus, je lichaam is opgebouwd uit cellen, en de langst-levende cel leeft zeven jaar. Eigenlijk zijn alle cellen in je lichaam dus gemaakt van iets dat je de afgelopen zeven jaar hebt gegeten. Tenzij je jonger dan zeven bent, dan heeft je moeder meegegeten.

So, I've been addicted to Tetris for the last week or so. Last night I decided to do something else, and when I came across the Phoenix LiveView contest, I thought: why not try and make Tetris? #myelixirstatus

I was surprised by how far I got. I have watched videos of people coding games before, have been coding myself for years and years, but somehow games felt out of my league. But here, after a (long) evening, I got a game! I should've streamed it myself.

I mean I'm standing of shoulders of giants. I got so much for free from Erlang/Elixir, LiveView to hook it up, @chris_mccord's Snake example gave me the basic idea of using just <div>'s for blocks, the browser is doing the drawing and key-repeats for me.

But it felt magical, once the game got playable. I was hooked again to my own creation. And so many "features" from NES Tetris like sliding, tucking and spinning "just worked" in my first implementation (probably because I was close to their implementation).

It all started with this HTML based board, using flexbox to to the hard works of blocks for me. I later wrapped the board in a Game-struct, and added bindings for the scores.

How to get a game loop in Elixir? Just send yourself a message after, say, 500ms. The LiveView component has a handle_info/2, which queues the next tick and moves the current Tetromino down.

Thanks to the phx-keydown="keydown" in the template, we get messages in handle_event/3 for each key. Just delegating to my Game module. And yes, I use Vim, so I need those H, J and L. (Dropping with K is not implemented.)

My Game.move/2 got a bit complicated, some refactoring is in place. But I started with a Tetromino struct, with :x and :y keys and a :color. To move it down, you paint the current :x and :y :white, and then paint :y + 1 to the :color. Code below reduces for all four points:

To obtain all the points I got this wonderful Tetromino.points/1 function. It's ugly and was a pain to write out and get right, but it works like a charm.

Colors and rotations work similar, with Tetromino.rotate/1. (color_for_type/1 gets called in new/1, and it never changes once it is created.)

Then the messy Game.move/1: can you move down? Move down. Otherwise, call Board.clear_lines/1 to remove full lines and obtain the score, get a new random Tetromino and put it on the board. The game-over handling is a bit buggy still, I had only one evening.

Clearing the board is simple: reject rows of which all cells are not empty and use counts to add new rows to the top. The Board.color_at/2 gives the color for that particular cell. The guards against negative numbers prevent List.pop_at/2 to get items from the back of the list :)

I think that's mostly it! Again, I wish I had streamed it, it was very weird watching myself doing it, but also very rewarding. Keep coding, people, you can do this too!

Ok, ik heb dus net een soort zijbalk gemaakt die bovenaan de pagina blijft staan als je scrollt en ik ben daar onevenredig blij mee. Er is eigenlijk niets leuker dan een beetje CSS uitproberen op je eigen site.

Meer laden