~mrlee/www.kamelasa.dev

95e9340eaa1d8a83bf5652e99f58c6adecb6c94f — Lee Meichin a month ago 7a7fc41
Fix footnote formatting
M posts/a-damn-good-listen.poly.pm => posts/a-damn-good-listen.poly.pm +3 -1
@@ 29,6 29,8 @@ To bring it back to now: the beauty of listening, the sheer magnificence of it, 

To wrap this up; sometimes the best, most enlightening conversations are the ones where you don't say anything.

◊footnotes{
  ◊^[1]{◊<>["https://coachingdevelopment.com/"]}
}

◊^[1]{◊<>["https://coachingdevelopment.com/"]}


M posts/a-decade-of-work.poly.pm => posts/a-decade-of-work.poly.pm +6 -5
@@ 37,8 37,9 @@ Now it's 2020, and not much has changed except that I enjoy the programming side

The world has changed ◊em{a lot} in all that time, and I now find myself in my thirties. Not once in my life did I ever think or believe I would be doing this kind of thing as a career, and I've grown to love it. If I were to tell my teenage self anything, knowing all of this... I would keep my mouth shut. He managed to figure it out just fine.


◊^[1]{◊<>["https://en.wikipedia.org/wiki/Dynamic_HTML"]}
◊^[2]{◊<>["https://www.albinoblacksheep.com/archive/"]}
◊^[3]{◊<>["https://www.youtube.com/watch?v=3AoNKGwBB74"]}
◊^[4]{◊<>["https://capistranorb.com/"]}
\ No newline at end of file
◊footnotes{
  ◊^[1]{◊<>["https://en.wikipedia.org/wiki/Dynamic_HTML"]}
  ◊^[2]{◊<>["https://www.albinoblacksheep.com/archive/"]}
  ◊^[3]{◊<>["https://www.youtube.com/watch?v=3AoNKGwBB74"]}
  ◊^[4]{◊<>["https://capistranorb.com/"]}
}
\ No newline at end of file

M posts/agile-lipstick.poly.pm => posts/agile-lipstick.poly.pm +7 -6
@@ 48,9 48,10 @@ Fuck that noise, just put the agile lipstick on your pig instead! Throw in a dai

Now ◊em{that} is easy.


◊^[1]{◊<>["https://www.coachingdevelopment.com/"] - if you're based in London or Ireland this is ◊em{so} worth it.}
◊^[2]{◊<>["https://en.wikipedia.org/wiki/Eternal_September"]}
◊^[3]{◊<>["https://uk.bookshop.org/a/6865/9780321934116"]}
◊^[4]{◊<>["https://uk.bookshop.org/a/6865/9781118127308"]}
◊^[5]{◊<>["https://agilemanifesto.org/"]}
◊footnotes{
  ◊^[1]{◊<>["https://www.coachingdevelopment.com/"] - if you're based in London or Ireland this is ◊em{so} worth it.}
  ◊^[2]{◊<>["https://en.wikipedia.org/wiki/Eternal_September"]}
  ◊^[3]{◊<>["https://uk.bookshop.org/a/6865/9780321934116"]}
  ◊^[4]{◊<>["https://uk.bookshop.org/a/6865/9781118127308"]}
  ◊^[5]{◊<>["https://agilemanifesto.org/"]}
}
\ No newline at end of file

M posts/blogging-in-haskell.poly.pm => posts/blogging-in-haskell.poly.pm +8 -7
@@ 59,10 59,11 @@ The result of adding this code, and then inserting it into the template context,

In any case, I've enjoyed playing around with Haskell in order to deploy this site, and I'm looking forward to seeing what else I can build with the language. It's truly fascinating.


◊^[1]{◊<>["https://gohugo.io"]}
◊^[2]{◊<>["https://www.gatsbyjs.org"]}
◊^[3]{◊<>["https://www.netlifycms.org"]}
◊^[4]{◊<>["https://jaspervdj.be/hakyll"]}
◊^[5]{◊<>["https://www.getzola.org"]}
◊^[6]{◊<>["https://terminalcss.xyz"]}
\ No newline at end of file
◊footnotes{
  ◊^[1]{◊<>["https://gohugo.io"]}
  ◊^[2]{◊<>["https://www.gatsbyjs.org"]}
  ◊^[3]{◊<>["https://www.netlifycms.org"]}
  ◊^[4]{◊<>["https://jaspervdj.be/hakyll"]}
  ◊^[5]{◊<>["https://www.getzola.org"]}
  ◊^[6]{◊<>["https://terminalcss.xyz"]}
}
\ No newline at end of file

M posts/can-you-crack-the-code.poly.pm => posts/can-you-crack-the-code.poly.pm +8 -7
@@ 270,10 270,11 @@ So ends 2020, so ends this post. Did your brain-grown answer match the one this 

Mad propz to the Prolog community on Reddit also, whose example solutions helped point me in the right direction◊^[6].


◊^[1]{◊<>["https://amzi.com/AdventureInProlog/a1start.php"] - (buy the book, srlsy...)}
◊^[2]{◊<>["https://swish.swi-prolog.org/p/KfdGtcJr.swinb"]}
◊^[3]{◊<>["https://uk.bookshop.org/books/the-art-of-prolog-advanced-programming-techniques/9780262691635"]}
◊^[4]{◊<>["https://www.swi-prolog.org/man/clpfd.html"]}
◊^[5]{◊<>["https://swish.swi-prolog.org/p/MgtEUnSv.swinb"]}
◊^[6]{◊<>["https://www.reddit.com/r/prolog/comments/fzww7m/cracking_this_puzzle_with_prolog/"]}
◊footnotes{
  ◊^[1]{◊<>["https://amzi.com/AdventureInProlog/a1start.php"] - (buy the book, srlsy...)}
  ◊^[2]{◊<>["https://swish.swi-prolog.org/p/KfdGtcJr.swinb"]}
  ◊^[3]{◊<>["https://uk.bookshop.org/books/the-art-of-prolog-advanced-programming-techniques/9780262691635"]}
  ◊^[4]{◊<>["https://www.swi-prolog.org/man/clpfd.html"]}
  ◊^[5]{◊<>["https://swish.swi-prolog.org/p/MgtEUnSv.swinb"]}
  ◊^[6]{◊<>["https://www.reddit.com/r/prolog/comments/fzww7m/cracking_this_puzzle_with_prolog/"]}
}
\ No newline at end of file

M posts/celebrate-each-other.poly.pm => posts/celebrate-each-other.poly.pm +7 -5
@@ 27,8 27,10 @@ What I'm saying in a pretty long-winded way is that we people make the success w

Celebrate each other, celebrate yourselves. 🥳

◊^[1]{◊<>["https://www.typeform.com"]}
◊^[2]{◊<>["https://bonus.ly"]}
◊^[3]{◊<>["https://en.wikipedia.org/wiki/HipChat"]}
◊^[4]{◊<>["https://www.kamelasa.dev/images/tc.jpg"]}
◊^[5]{◊<>["https://www.babylonhealth.com"]}
\ No newline at end of file
◊footnotes{
  ◊^[1]{◊<>["https://www.typeform.com"]}
  ◊^[2]{◊<>["https://bonus.ly"]}
  ◊^[3]{◊<>["https://en.wikipedia.org/wiki/HipChat"]}
  ◊^[4]{◊<>["https://www.kamelasa.dev/images/tc.jpg"]}
  ◊^[5]{◊<>["https://www.babylonhealth.com"]}
}
\ No newline at end of file

M posts/devops.poly.pm => posts/devops.poly.pm +3 -1
@@ 29,4 29,6 @@ Before I proselytise too much, I think this is really important because you can 

And if I had one suggestion for any budding project finding itself in the hands of real life users in production, consider what you want your devops culture to be like and, if you can, see how early you can encourage your team without depending on offering wide-scale production access. And maybe even consider what kind of internal tooling you can build to improve the productivity and efficacy of your engineers.

◊^[1]{◊<>["https://github.com/babylonhealth/shipcat"]}
◊footnotes{
  ◊^[1]{◊<>["https://github.com/babylonhealth/shipcat"]}
}
\ No newline at end of file

M posts/do-you-really-need-those-microservices.poly.pm => posts/do-you-really-need-those-microservices.poly.pm +5 -3
@@ 29,6 29,8 @@ I believe that's a lot easier to do when you start early, but if you come to it 

If I was to offer anybody advice about how to make all of this happen successfully, I'd say to stop thinking in terms of the existing monolith, and instead look at what individual products you could separate or extract, or even spin-off into their own businesses if the idea was unique enough to sell individually. And don't jump to solutions like Kubernetes until you're dealing with enough of these services that your existing deployment setup is too hard to manage.

◊^[1]{◊<>["https://en.wikipedia.org/wiki/Conway%27s_law"]}
◊^[2]{◊<>["https://en.wikipedia.org/wiki/Service-oriented_architecture"]}
◊^[3]{◊<>["https://en.wikipedia.org/wiki/Domain-driven_design"]}
\ No newline at end of file
◊footnotes{
  ◊^[1]{◊<>["https://en.wikipedia.org/wiki/Conway%27s_law"]}
  ◊^[2]{◊<>["https://en.wikipedia.org/wiki/Service-oriented_architecture"]}
  ◊^[3]{◊<>["https://en.wikipedia.org/wiki/Domain-driven_design"]}
}
\ No newline at end of file

M posts/enough.poly.pm => posts/enough.poly.pm +3 -1
@@ 55,4 55,6 @@ Am I enough? Certainly!

Do I behave like I am? Not at all.

◊^[1]{◊<>["https://en.wikipedia.org/wiki/Politician%27s_syllogism"]}
◊footnotes{
  ◊^[1]{◊<>["https://en.wikipedia.org/wiki/Politician%27s_syllogism"]}
}
\ No newline at end of file

M posts/floc-off.poly.pm => posts/floc-off.poly.pm +7 -5
@@ 19,8 19,10 @@ Anyway, every page here is served with the ◊code{Permissions-Policy: interest-

If you're curious, you can also check out the Security Headers report for this site◊^[5].

◊^[1]{◊<>["https://plausible.io/kamelasa.dev"]}
◊^[2]{◊<>["https://plausible.io/blog/google-floc"]}
◊^[3]{◊<>["https://developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript"]}
◊^[4]{◊<>["https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/DNT"]}
◊^[5]{◊<>["https://securityheaders.com/?q=www.kamelasa.dev&followRedirects=on"]}
\ No newline at end of file
◊footnotes{
  ◊^[1]{◊<>["https://plausible.io/kamelasa.dev"]}
  ◊^[2]{◊<>["https://plausible.io/blog/google-floc"]}
  ◊^[3]{◊<>["https://developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript"]}
  ◊^[4]{◊<>["https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/DNT"]}
  ◊^[5]{◊<>["https://securityheaders.com/?q=www.kamelasa.dev&followRedirects=on"]}
}
\ No newline at end of file

M posts/gettin-ziggy-with-it-pi-zero.poly.pm => posts/gettin-ziggy-with-it-pi-zero.poly.pm +20 -18
@@ 200,8 200,8 @@ Wow, actual Zig code! The formatting may look a little odd because that's what 
The recurring theme in all of these new functions is that the entire basis of their existence is to create an array of two bytes, and then write them to file descriptor we opened right at the start. The data structure looks something like this:

◊codeblock['c]{
buf[0] = 0x00; // the register to be written to
buf[1] = 0x??; // the value to assign to that register
  buf[0] = 0x00; // the register to be written to
  buf[1] = 0x??; // the value to assign to that register
}

The file opened in ◊code{main} isn't a traditional file as you know it, but it points to all of the devices connected to your GPIO header on the Pi. Therefore, if you know enough about the hardware at a low enough level, you can control all of them by writing the right bytes to the right register, at the right address.


@@ 266,19 266,21 @@ Once you're done, rebuild the binary and ◊code{scp} it over, like you did the 

Hopefully that worked, but if it didn't, get in touch with your feedback at wtf@mrlee.dev and help contribute to this post being a better, more informative read. After all, ◊em{works on my machine!} can only go so far.

◊^[1]{◊<>["https://ziglang.org"]}
◊^[2]{◊<>["https://thepihut.com/products/raspberry-pi-zero-w"]}
◊^[3]{◊<>["https://thepihut.com/products/adafruit-pioled-128x32-monochrome-oled-add-on-for-raspberry-pi-ada3527"]}
◊^[4]{◊<>["https://thepihut.com/products/gpio-hammer-header-solderless"]}
◊^[5]{◊<>["http://wiringpi.com"]}
◊^[6]{◊<>["https://www.kernel.org/doc/Documentation/i2c/dev-interface"]}
◊^[7]{◊<>["https://learn.adafruit.com/adafruits-raspberry-pi-lesson-4-gpio-setup/configuring-i2c"]}
◊^[8]{◊<>["https://github.com/mrleedev/stardust"]}
◊^[9]{◊<>["https://musl.libc.org"]}
◊^[10]{◊<>["https://github.com/ziglang/zig/issues/4875"]}
◊^[11]{◊<>["https://knowyourmeme.com/memes/how-to-draw-an-owl"]}
◊^[12]{◊<>["https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf"]}
◊^[13]{◊<>["https://github.com/owenosborn/SSD1306-OLED-WiringPi/blob/master/ssd1306.h"]}
◊^[14]{Possibly exaggerated for effect. Possibly.}
◊^[15]{◊<>["https://github.com/adafruit/Adafruit_CircuitPython_SSD1306/blob/master/adafruit_ssd1306.py"]}
◊^[16]{◊<>["https://kristoff.it/blog/what-is-zig-comptime/"]}
\ No newline at end of file
◊footnotes{
  ◊^[1]{◊<>["https://ziglang.org"]}
  ◊^[2]{◊<>["https://thepihut.com/products/raspberry-pi-zero-w"]}
  ◊^[3]{◊<>["https://thepihut.com/products/adafruit-pioled-128x32-monochrome-oled-add-on-for-raspberry-pi-ada3527"]}
  ◊^[4]{◊<>["https://thepihut.com/products/gpio-hammer-header-solderless"]}
  ◊^[5]{◊<>["http://wiringpi.com"]}
  ◊^[6]{◊<>["https://www.kernel.org/doc/Documentation/i2c/dev-interface"]}
  ◊^[7]{◊<>["https://learn.adafruit.com/adafruits-raspberry-pi-lesson-4-gpio-setup/configuring-i2c"]}
  ◊^[8]{◊<>["https://github.com/mrleedev/stardust"]}
  ◊^[9]{◊<>["https://musl.libc.org"]}
  ◊^[10]{◊<>["https://github.com/ziglang/zig/issues/4875"]}
  ◊^[11]{◊<>["https://knowyourmeme.com/memes/how-to-draw-an-owl"]}
  ◊^[12]{◊<>["https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf"]}
  ◊^[13]{◊<>["https://github.com/owenosborn/SSD1306-OLED-WiringPi/blob/master/ssd1306.h"]}
  ◊^[14]{Possibly exaggerated for effect. Possibly.}
  ◊^[15]{◊<>["https://github.com/adafruit/Adafruit_CircuitPython_SSD1306/blob/master/adafruit_ssd1306.py"]}
  ◊^[16]{◊<>["https://kristoff.it/blog/what-is-zig-comptime/"]}
}
\ No newline at end of file

M posts/hakyll-on-devops-pipelines.poly.pm => posts/hakyll-on-devops-pipelines.poly.pm +7 -12
@@ 176,15 176,10 @@ To solve the issue I first mentioned, ◊code{cleanTargetFolder} makes sure to d

To see the pipeline in full, you can check out the full YAML file◊^[5]. I've been using it with success for the past couple of weeks now.

◊^[1]{◊<>["https://docs.haskellstack.org/en/stable/README"]}
◊^[2]{◊<>["https://hackage.haskell.org"]}
◊^[3]{◊<>["https://dev.azure.com"]}
◊^[4]{◊<>["https://github.com/features/actions"]}
◊^[5]{◊<>["https://git.sr.ht/~mrlee/www.kamelasa.dev/tree/9decaf4732dc7bc4510fcf23979af8657bdb01bd/item/azure/pipeline.yml"]}

[^1]: </> 
[^2]: </>
[^3]: </>
[^4]: <>
[^5]: <>
[^6]: <>
\ No newline at end of file
◊footnotes{
  ◊^[1]{◊<>["https://docs.haskellstack.org/en/stable/README"]}
  ◊^[2]{◊<>["https://hackage.haskell.org"]}
  ◊^[3]{◊<>["https://dev.azure.com"]}
  ◊^[4]{◊<>["https://github.com/features/actions"]}
  ◊^[5]{◊<>["https://git.sr.ht/~mrlee/www.kamelasa.dev/tree/9decaf4732dc7bc4510fcf23979af8657bdb01bd/item/azure/pipeline.yml"]}
}
\ No newline at end of file

M posts/human-after-all.poly.pm => posts/human-after-all.poly.pm +5 -3
@@ 45,6 45,8 @@ Of course, it doesn't work out for everyone. It's not about protecting people or

Just, no reason to be so needlessly unkind to each other. We're all human, after all.

◊^[1]{◊<>["https://twentytentalent.com/8-types-of-toxic-managers/"]}
◊^[2]{◊<>["https://getvoip.com/blog/2015/02/24/toxic-employees/"]}
◊^[3]{◊<>["https://uk.bookshop.org/a/6865/9781849010986"]}
◊footnotes{
  ◊^[1]{◊<>["https://twentytentalent.com/8-types-of-toxic-managers/"]}
  ◊^[2]{◊<>["https://getvoip.com/blog/2015/02/24/toxic-employees/"]}
  ◊^[3]{◊<>["https://uk.bookshop.org/a/6865/9781849010986"]}
}
\ No newline at end of file

M posts/i-am-here.poly.pm => posts/i-am-here.poly.pm +7 -5
@@ 29,8 29,10 @@ To bring this back to the start, I would not change a thing as my place in this 

This isn't to say all my problems are solved, or I'm finished with my process. That's ◊strong{pure BS} as this stuff lasts an entire lifetime as you learn, grow and adapt to new situations. But the track record I have must be pretty good if I'm ◊em{here}, right?

◊^[1]{◊<>["https://en.wikipedia.org/wiki/Breathwork"]}
◊^[2]{◊<>["https://en.wikipedia.org/wiki/Cognitive_behavioral_therapy"]}
◊^[3]{◊<>["https://en.wikipedia.org/wiki/Somatic_experiencing"]}
◊^[4]{◊<>["https://en.wikipedia.org/wiki/Complex_post-traumatic_stress_disorder"]}
◊^[5]{◊<>["https://en.wikipedia.org/wiki/Posttraumatic_growth"]}
\ No newline at end of file
◊footnotes{
  ◊^[1]{◊<>["https://en.wikipedia.org/wiki/Breathwork"]}
  ◊^[2]{◊<>["https://en.wikipedia.org/wiki/Cognitive_behavioral_therapy"]}
  ◊^[3]{◊<>["https://en.wikipedia.org/wiki/Somatic_experiencing"]}
  ◊^[4]{◊<>["https://en.wikipedia.org/wiki/Complex_post-traumatic_stress_disorder"]}
  ◊^[5]{◊<>["https://en.wikipedia.org/wiki/Posttraumatic_growth"]}
}
\ No newline at end of file

M posts/my-favourite-thing-about-programming.poly.pm => posts/my-favourite-thing-about-programming.poly.pm +3 -1
@@ 64,4 64,6 @@ One thing I've noticed while writing this is that each language selected has lit

For as long as that remains true I think I'll always have new toys to play with.

◊^[1]{◊<>["http://raytracerchallenge.com"]}
\ No newline at end of file
◊footnotes{
  ◊^[1]{◊<>["http://raytracerchallenge.com"]}
}
\ No newline at end of file

M posts/on-sharing-vulnerability.poly.pm => posts/on-sharing-vulnerability.poly.pm +4 -2
@@ 25,5 25,7 @@ So, considering that we see ourselves becoming more distant as a result of the C


◊^[1]{◊<>["https://uk.bookshop.org/a/6865/9780241257401"]}
◊^[2]{◊<>["https://uk.bookshop.org/a/6865/9780091955038"]}
\ No newline at end of file
◊footnotes{
  ◊^[1]{◊<>["https://uk.bookshop.org/a/6865/9780241257401"]}
  ◊^[2]{◊<>["https://uk.bookshop.org/a/6865/9780091955038"]}
}
\ No newline at end of file

M posts/past-mistakes.poly.pm => posts/past-mistakes.poly.pm +0 -2
@@ 44,5 44,3 @@ These days I tell myself that it looks intimidating, but take it easy.
◊hr{}

Four is the magic number, so I'll leave it there. I'm not sure how sincere I felt when writing this to begin with, but it's all been part of the experience. I think next time I'll single one or two things out and go into more depth.

◊hr{}

M posts/permanent-solutions-to-temporary-problems.poly.pm => posts/permanent-solutions-to-temporary-problems.poly.pm +5 -3
@@ 57,6 57,8 @@ I'm aware that these options are very specific to the UK and you might not have 

Take care of yourself.

◊^[1]{◊<>["https://www.samaritans.org"]}
◊^[2]{◊<>["https://giveusashout.org"]}
◊^[3]{◊<>["https://www.papyrus-uk.org"]}
◊footnotes{
  ◊^[1]{◊<>["https://www.samaritans.org"]}
  ◊^[2]{◊<>["https://giveusashout.org"]}
  ◊^[3]{◊<>["https://www.papyrus-uk.org"]}
}
\ No newline at end of file

M posts/to-simpler-times.poly.pm => posts/to-simpler-times.poly.pm +11 -9
@@ 76,12 76,14 @@ kamelasa build

On another note, this site now also left GitHub for Sourcehut◊^[8] and, at risk of being a bit narcissistic, a comments section lives on a mailing list there◊^[9]. Should you feel that the stuff I post is worth talking about, of course. You don't need a Sourcehut account to get involved, although you'll need to join the list (without signing up for Sourcehut) if you want more than read-only access.

◊^[1]{◊<>["https://www.kamelasa.dev/programming/blogging-in-haskell"]}
◊^[2]{◊<>["https://www.kamelasa.dev/programming/hakyll-on-devops-pipelines"]}
◊^[3]{◊<>["https://plausible.io/kamelasa.dev"]}
◊^[4]{◊<>["https://caddyserver.com/v2"]}
◊^[5]{◊<>["I should probably sort out proper HTTP caching though..."]}
◊^[6]{◊<>["https://pkg.kamelasa.dev"]}
◊^[7]{◊<>["https://manpages.debian.org/buster/apt-utils/apt-ftparchive.1.en.html"]}
◊^[8]{◊<>["https://sourcehut.org"]}
◊^[9]{◊<>["https://lists.sr.ht/~mrlee/kamelasa.dev-discuss"]}
\ No newline at end of file
◊footnotes{
  ◊^[1]{◊<>["https://www.kamelasa.dev/programming/blogging-in-haskell"]}
  ◊^[2]{◊<>["https://www.kamelasa.dev/programming/hakyll-on-devops-pipelines"]}
  ◊^[3]{◊<>["https://plausible.io/kamelasa.dev"]}
  ◊^[4]{◊<>["https://caddyserver.com/v2"]}
  ◊^[5]{◊<>["I should probably sort out proper HTTP caching though..."]}
  ◊^[6]{◊<>["https://pkg.kamelasa.dev"]}
  ◊^[7]{◊<>["https://manpages.debian.org/buster/apt-utils/apt-ftparchive.1.en.html"]}
  ◊^[8]{◊<>["https://sourcehut.org"]}
  ◊^[9]{◊<>["https://lists.sr.ht/~mrlee/kamelasa.dev-discuss"]}
}
\ No newline at end of file

M posts/using-ruby-c-in-ruby.poly.pm => posts/using-ruby-c-in-ruby.poly.pm +5 -3
@@ 88,6 88,8 @@ How would you fix it? Well, now we've found out that we ◊code{can} write Ruby 

Until then, I'll see you further into the abyss.

◊^[1]{◊<>["https://github.com/ffi/ffi"]}
◊^[2]{◊code{`gem install ffi -- --enable-system-libffi`}}
◊^[3]{◊<>["https://ruby-doc.org/core-2.7.0/doc/extension_rdoc.html"]}
\ No newline at end of file
◊footnotes{
  ◊^[1]{◊<>["https://github.com/ffi/ffi"]}
  ◊^[2]{◊code{`gem install ffi -- --enable-system-libffi`}}
  ◊^[3]{◊<>["https://ruby-doc.org/core-2.7.0/doc/extension_rdoc.html"]}
}
\ No newline at end of file