Browse Source

Add content files

test
Linux User 2 years ago
parent
commit
4c9995f7c9
  1. 3
      .gitignore
  2. 91
      content/posts/4chan-json-converter.md
  3. 67
      content/posts/4chan-resilience.md
  4. 7
      content/posts/_index.md
  5. 7
      content/posts/all/_index.md
  6. 59
      content/posts/black-roofs.md
  7. 143
      content/posts/cant-police-hate.md
  8. 31
      content/posts/folding-nums.md
  9. 47
      content/posts/gbos.md
  10. 61
      content/posts/kakerlaken-math.md
  11. 84
      content/posts/muli.md
  12. 31
      content/posts/pdf-metadata-script.md
  13. 155
      content/posts/pfsense-vm.md
  14. 117
      content/posts/pizza-algorithm.md
  15. 33
      content/posts/postmaker.md
  16. 181
      content/posts/scratch-sucks.md
  17. 36
      content/posts/speeding-laws.md
  18. 74
      content/posts/they-found-us.md
  19. 14
      content/status/_index.md
  20. BIN
      static/downloads/flawed_veganism_thread.zip
  21. BIN
      static/downloads/lessons/01-intro_to_algos.pdf
  22. BIN
      static/downloads/lessons/02-intro_to_variables.pdf
  23. BIN
      static/downloads/lessons/03-conditionals.pdf
  24. BIN
      static/downloads/lessons/04-loops.pdf
  25. BIN
      static/downloads/lessons/05-challenge.pdf
  26. BIN
      static/downloads/the_gamechangers_thread_desuarchive.zip
  27. BIN
      static/downloads/vegan_chads_thread_desuarchive.zip
  28. BIN
      static/images/4chan_plots/flawed_veganism_thread_plot.png
  29. BIN
      static/images/4chan_plots/flawed_veganism_thread_sentiment.png
  30. BIN
      static/images/4chan_plots/the_gamechangers_thread_plot.png
  31. BIN
      static/images/4chan_plots/the_gamechangers_thread_sentiment.png
  32. BIN
      static/images/4chan_plots/vegan_chads_thread_plot.png
  33. BIN
      static/images/4chan_plots/vegan_chads_thread_sentiment.png
  34. BIN
      static/images/how_a_zoombini_is_made.png
  35. BIN
      static/images/indexed_baby.png
  36. BIN
      static/images/js_basic.png
  37. BIN
      static/images/muli.jpg
  38. BIN
      static/images/new_network_setup.png
  39. BIN
      static/images/old_network_setup.png
  40. BIN
      static/images/patrick_head_nail.jpg
  41. BIN
      static/images/pizza_troll_toll.jpg
  42. BIN
      static/images/reader_view.png
  43. BIN
      static/images/scratch_editor.png
  44. BIN
      static/images/zoombinis_reqs.png

3
.gitignore

@ -1,6 +1,3 @@
content
public
static/downloads
static/images
build.sh
deploy.sh

91
content/posts/4chan-json-converter.md

@ -0,0 +1,91 @@
---
title: "The wonderful world of graphing 4chan"
description: "A tool to assist social media analysis of 4chan threads."
date: 2019-09-20T12:05:40+11:00
status:
- finished
categories:
- projects
tags:
- 4chan
- python
- sna
- medium
recommended: true
---
### Why bother?
At university, I took an unusual path that weaved its way through sociology
and computer science. Okay, that's a fanciful way of saying I did a double
degree. Applaud whenever you're ready. Because I was intensely interested
in both halves of my academia, I tried to bring them closer together instead
of seeing them as separate specialisations. One way that happened was through
enrolling in somewhat unpopular courses like ones centered in online research
methods.
One of the assignments in that course was to analyse a web-based social medium
(i.e.: social media platform) and get some insight on it. The possible choices
were reddit, Twitter, or hyperlink networks (interconnected websites). Being
that I'm usually *that* student, I opted for option D, none of the above, and
went to 4chan. The problem with 4chan is that there aren't really any tools
to conduct SNA (social network analysis) on it. reddit, Twitter, and hyperlink
networks all have [VosonDASH](https://github.com/vosonlab/VOSONDash), the incredible tool the course convenor, Robert
Ackland, helped put together. VosonDASH does very useful things like make cool
graphs out of all those social media where you can see how individual commenters
or posters are linked to each other. To do that, VosonDASH creates a GraphML
file, which is basically a way of describing a graph in a computer-readable
way.
As they say, the best artists steal, so I took the same approach to make 4chan
threads into visualisable graphs, and wrote a 4chan JSON to GraphML converter
in Python. The converter uses the 4chan API to download all the information
and posts in a thread, then turns it into a graph where each post is a node,
and each edge or link is a reply.
In the interests of transparency, I don't think I'm the first to do this.
[Lessons of Dankness](https://danklessons.wordpress.com/2017/06/22/4chan-thread-graph-visualization/) was actually where I got my inspiration from, but unfortunately, they never made their code available (as far as I could see). I've got some example graphs made with the converter below, but for more of the same, you should absolutely check out Lessons in Dankness's post on visualising 4chan threads. It's based and redpilled.
### Some visualisations I've made
All documentation should include examples, so here ya go. These were made
using `R` and the `igraph` package. All of these threads were gathered as
part of the aforementioned assignment, so they all discuss similar topics.
Here's a plot of a thread discussing *The Gamechangers*, a vegan bodybuilding
documentary:
![Gamechangers visualisation](/images/4chan_plots/the_gamechangers_thread_plot.png)
Here's one urging 'vegan chads' to rise up:
![Vegan chads visualisation](/images/4chan_plots/vegan_chads_thread_plot.png)
And here's one discussing whether veganism is inherently flawed:
![Veganism sentiment visualisation](/images/4chan_plots/flawed_veganism_thread_plot.png)
In case you're interested, here are the same plots with each post (node)
coloured according to their 'sentiment score', which measures how nice or
naughty the words in the post are. Orange is nicer, blue is naughtier.
Here's the *Gamechangers* one:
![Gamechangers sentiment visualisation](/images/4chan_plots/the_gamechangers_thread_sentiment.png)
Vegan chads:
![Vegan chads sentiment visualisation](/images/4chan_plots/vegan_chads_thread_sentiment.png)
And the veganism discussion:
![Veganism discussion sentiment visualisation](/images/4chan_plots/flawed_veganism_thread_sentiment.png)
### This post brought to you by...
If you'd like to see the actual JSON and GraphML files, they're all available
by clicking or tapping these links:
[Gamechangers](/downloads/the_gamechangers_thread_desuarchive.zip)
[Vegan chads](/downloads/vegan_chads_thread_desuarchive.zip)
[Flawed veganism](/downloads/flawed_veganism_thread.zip)

67
content/posts/4chan-resilience.md

@ -0,0 +1,67 @@
---
title: "Why won't you leave?!"
date: 2020-03-14T20:46:21+11:00
status:
- written
tags:
- 4chan
- webculture
categories:
- sociology
recommended: true
---
Online communities die. No ifs, no buts, no digital coconuts.
Folks have started to get a good handle on why that happens,
but alas, knowledge doesn't prevent the inevitable.
Unless you're 4chan.
Unless you're asking an oldfag, 4chan's, \*ahem\*, *quality* has
so far stayed pretty constant. That is, it's always been an
outlandish place, and it hasn't changed a lick. Even the Something
Awful forums have become passe in their old age. What's going on?
### Cultural inoculation
A huge reason that communities die on the web (or probably anywhere)
is that they grow too big for their boots. When too many people
sign up and actively use a platform, the culture gets diluted and
slowly erased. At the very least, it fades.
One potential way 4chan has survived is that it actually pushes
people away from the site, rather than inviting them in. 4chan was,
is, and probably will continue to be, a bit of a web culture taboo.
"*Ew, you go to 4chan?*" may be responsible for driving people away
from the website and staving off that terrible tipping point of
cultural erosion.
### But we are the initiated, aren't we?
If you do ask an oldfag, you'll be treated to a full-length treatise
involving summer 4chan, Moot's abandonment of the site, and MOOOOODS,
the gist of which is that 4chan actually *does* have a lot more users
now. If we check the stats, the OF is right; 4chan is going uphill.
And yet, there's been no drop in the median shenanigans-per-month
measure. What gives?
I'll take a wild, flailing stab in the dark and suggest that this is
a result of 4chan's unique, and cryptic, culture. 4chan communication
is weird, man. Kek, BTFO, dubs and trips of truth, GIFs of George
Costanza, PNGs of fish being (or avoiding being) hooked by bait...
More than a little unintelligible to someone not in the know. That
right there is the key to 4chan's survival. In order to do something
more than lurk on the site, in order to actually participate and possibly
affect the culture of the place, you have to learn how to communicate
in the 4chan way. Then, even when you think you've got it under your
belt, you have to try to use it properly. May God help you if you fail.
This digital hazing is what drives away those that would dilute or
otherwise ruin the 4chan culture; if you can't do it, you'll get bullied
so hard that you never come back. If you can do it, welcome to the club.
Because of this, the culture never gets diluted when more people join
up, because they're well-versed in the old ways and pose no danger.
### *That's* your secret?
That was a lot more disheartening than expected. The main way to keep
culture alive is to be terribly exclusive? Kinda saddening, but an
unfortunate reality if you want your community to stay true to its
roots. Perhaps there are other ways, but for now, they remain undiscovered.
Our only hope is to tell newcomers to git gud, or get out.

7
content/posts/_index.md

@ -0,0 +1,7 @@
---
title: "Lists of pages with words"
date: 2020-02-08T10:40:09+11:00
updated: 2020-02-08T10:40:09+11:00
landing: true
---

7
content/posts/all/_index.md

@ -0,0 +1,7 @@
---
title: "All posts"
date: 2020-02-08T09:51:43+11:00
updated: 2020-02-08T09:51:43+11:00
landing: false
---

59
content/posts/black-roofs.md

@ -0,0 +1,59 @@
---
title: "Why are black roofs on cars fancy?"
description: "Don't you think it's a little strange?"
date: 2020-01-24T12:06:50+11:00
status:
- finished
categories:
- sociology
tags:
- crapitalism
- aesthetics
- medium
recommended: false
---
If you've had the good fortune to have the opportunity to buy a car
in the last few years, you may have noticed a trim option that seems
to have exploded in popularity - the black roof.
The automotive world first saw this happen with the introduction of
panoramic sunroofs. In these cases, a black roof actually made sense -
the roof was made of glass (as sunroofs usually are), and was tinted
so that the amount of sunlight entering wouldn't be overwhelming.
Lately, though, black roofs have begun to appear on cars that are
distinctly lacking a sunroof of any kind. Why? It's difficult to pin
down the exact reason, but my hypothesis is that sunroofs are expensive
(and therefore cool), so why not try to make people think you're cool
without having to spend (too much) extra money? And from then on, the
design broke off and became cool in its own right, and, because of
the extra price, it also became synonymous with quality and extravagance.
So, why not pay a little extra?
Because, we're being swindled. [An article from *Automotive News*](https://www.autonews.com/article/20171021/OEM03/171029971/two-tone-cars-are-back-in-vogue),
which interviews several figures in the automotive design industry, tells
us that having a differently-coloured roof is more expensive to produce,
leading to a higher price at the dealership. They say that painting a
part of the car a different colour means either needing to paint that
part on its own on a separate production line (meaning you need to actually
pay for or have a second production line), or it means needing to run
the car through the same production line a second time (meaning you
produce less cars because of the constant redos).
That seems a little fishy to me: I don't buy for an instant that the literal
namesake industry of [Fordism](https://en.wikipedia.org/wiki/Fordism) either
doesn't have production lines dedicated to jobs like these, or that they
would really be so unwise as to have multiple run throughs on the same
line. In fact, it would make sense that a black roof should be cheaper
than a regularly coloured roof! If everyone wants a black roof regardless
of the colour of the rest of their car, that's a lot less differently-coloured
paints a factory has to worry about for the roof, so they can just churn
out black roofs en masse and save a helluva lot of money.
So, to the automotive industry, I say phooey to your attempts at convincing
the public that expensive=good when the thing I'm actually paying for isn't
even expensive to make in the first place.
**TL;DR:** Black roofs are a scam. We're paying more for less, and we're
being convinced that it's cool to do so.

143
content/posts/cant-police-hate.md

@ -0,0 +1,143 @@
---
title: "We can't police online hate speech"
date: 2020-02-13T10:05:35+11:00
status:
- written
tags:
- terrorism
- policing
- webculture
- socialmedia
- long
categories:
- sociology
recommended: true
---
As mass shootings and acts of domestic terrorism become
tragically regular, authorities have started pointing
their fingers at social media and the broader internet.
They blame the rise of these atrocities on online hate
speech and [call for greater policing of online spaces](https://www.sbs.com.au/news/morrison-warns-social-media-giants-against-promoting-violence).
Among the strategies they've suggested, and in some
cases implemented, are automated removal of
comments, deplatforming particular individuals, and
[outright banning entire websites](https://arstechnica.com/tech-policy/2019/03/australian-and-nz-isps-blocked-dozens-of-sites-that-host-nz-shooting-video/).
What they're missing, though, is that policing hate
speech is far more complicated than banning a website.
### It's hard to define
Before you can start to police it, you first have to
define what hate speech is - it's a lot harder than
you expect. Intuitively, we understand it as speech
(or written words) that in some way attack an
individual or group. But what are the specifics?
Is it hate speech if it isn't intended to attack
someone? Is it hate speech if you're quoting
someone? What about sarcasm and satire? Is
it still hate speech if no one takes any offence?
The problem here is that hate speech falls into
the broader category of the taboo, and taboos
vary dramatically from subculture to subculture,
and even between individuals. Combine that with
the worldwide mixing pot that is the Internet,
which brings its own subsubcultures through
Facebook groups and forums and YouTube fandoms and subreddits,
and it becomes nearly impossible to say conclusively
whether a post or comment is hate speech; what may
be the funniest meme I've seen today might be
something completely heinous to you, and something
meaningless and trivial to someone else.
[This is what Internet sociologists refer to as
'ambivalence'](https://www.vice.com/en_us/article/mbam9a/the-triumph-of-the-shruggie-why-ambivalence-dominates-the-internet).
That's the idea that everything
on the Internet isn't just one side of the coin--
it's both sides of several coins, because a lot
of different people coming from a lot of different
cultures and subcultures are going to interpret
it in their own unique way. That makes it very
difficult to make rules about what is and isn't
okay, because at the end of the day, *it
depends*.
### It's hard to police
Even if we could make rules, it's tough to actually
enforce them. Either we have a human team who
interpret those rules and enforce them differently,
or we have a computer that fails spectacularly.
[It's incredibly difficult to write a program or AI
that understands meaning instead of just banning specific
words](https://blog.aimultiple.com/why-chatbots-fail/),
and doing that puts us back at square one
deciding which words to ban and why. Even then,
it's very easy to circumvent automated bans by
just rephrasing a little.
Alternatively, we could ban individuals or entire
websites, but that doesn't really work either.
There are a myriad of tools for individuals to
get around blocks to their profile or their
particular device, but in most cases they can
simply make a new profile and get right back
to it. Even if the website they're posting on
gets taken down, the sheer number of platforms
on the web makes it all too easy for individuals
or groups to just [migrate to a new space and take
root](https://theswamp.media/banning-8chan-won-t-work).
### Policing may actually make it worse
When individuals and groups do relocate and take
root on new platforms, their hateful ideologies and
rhetoric can actually spread as they 'recruit' from
their new homes.
Even supposing we could find a way to effectively
silence hate speakers on the web, we're not really
tackling the problem; just because people aren't
speaking hate, it doesn't mean they don't still
subscribe to it--it just means we aren't aware
of it anymore. In effect, by silencing the troublemakers, we also
silence the protestors. If we can't see or hear the
problem, we're blind to the very thing that we need
to be speaking out against.
### We need to try something new
As futile as it may seem, we can't sit idly by and
do nothing. We've identified that the main problems
in policing hate speech are out-of-touch rules made
by a governing body, the resources required, and the
problems that arise when hate speech is actually
hidden. So, what's our best way forward?
As repulsive as it might sound, our
best strategy may be to let hate speech be seen.
That doesn't mean allowing it to be normalised,
though. One proposal that works well is up or
downvoting: most prominently used on reddit,
this system lets users vote on content, with
more popular posts and comments being pushed to
the top, and unpopular posts being buried, but
still visible. This is a fantastic way of ensuring
that the rules being used for policing hate speech
are workable within a particular context and subculture,
because it's the members of that subculture that
are deciding whether it's okay. On top of that,
it's also a way of letting the hate speaker know
that they've gotten it wrong without actually
harming them or shaming them publically (they're
anonymous, and they only lose fake Internet points).
[That's crucial for letting them acknowledge they're
wrong, and reforming them](https://www.ted.com/talks/kathryn_schulz_on_being_wrong?language=en).
This is far from a perfect system, but it's a new
way forward. Above all else, the takeaway here isn't
that we can't police hate speech at all - it's that
we can't do it properly with our current top-down,
black-and-white mindset.

31
content/posts/folding-nums.md

@ -0,0 +1,31 @@
---
title: "Someone who's smart with encryption, check this..."
date: 2020-04-19T12:15:10+10:00
status:
- written
tags:
- encryption
- tiny
categories:
- math
recommended: false
---
I'm not dead, I swear.
## I am, however, an idiot
I was playing around with some numbers in my head the other day. Because I went to an all-boys school and stopped maturing at age 12, I pondered: *what kinds of ways can you get to the number 420?*
An infinite number of ways, of course, but let's rule out boring addition and multiplication. In fact, let's combine them so they're less boring. You can get to 420 by multiplying 120 by 3, then adding 20 multiplied by 3, then adding 0 multiplied by 3. Neat, right? Okay, I guess you had to be there.
I call these nifty little numbers **BARILARO NUMBERS TRADEMARK COPYRIGHT RESTRICTED PATENTED INCORPORATED**. Or, folding numbers, for short - cuz it reminds me of doing a list fold in functional programming languages (which is where you work down a list of stuff, doing some work on each individual thing, then combining it with the rest of the list of stuff).
## Maybe they're useful?
My amoebic knowledge of encryption only holds a few facts. One of those is that encryption is hard to crack because it works by sharing a little bit of information with someone which you both use to work out a big prime number. If someone else tries to work out the prime number (i.e.: tries to forge the key to your lock), it's really hard for them to do, because that little bit of information is crucial. Unfortunately, working out the big prime number, even if you have information, seems to be a bit of a pain. So much of a pain, infact, that there are special chips you can buy so your main computer doesn't have to deal with that.
Maybe the folding numbers could speed things up? They're super easy to work out, but seem to be super hard to work out if you don't have the right info (the base number and the thing to multiply it by).
## I don't know things!
This is purely conjecture, so you're not allowed to bully me! If any budding encryptionologistifiers want to do some math on this, please feel free to. Send me the link, though!

47
content/posts/gbos.md

@ -0,0 +1,47 @@
---
title: "GBOS: First steps"
description: "Why I've decided to develop an operating system for the original Nintendo Game Boy."
date: 2020-01-03T12:06:26+11:00
status:
- finished
categories:
- projects
tags:
- gbos
- medium
recommended: false
---
### Some backstory
Although most assuredly born after the original Game Boy's heyday, I'm still
in love with the thing. Actually, I never really had the hots for the original
grey brick - I was way more interested in its younger (Japanese-exclusive)
sister, the Game Boy Light. Let's, uh, not do this metaphor anymore.
My brother was the original owner of the Game Boy Light, which boasted not
only a smaller form factor than the original brick, but an *electroluminescent
backlight*. It fixed every flaw with the original and then some, and ever
since my brother handed me that tiny golden rectangle with a copy of Tetris
slotted in, I was enamoured with it. Years later, when I found out the
lengths my uncle had to go to in order to actually get the thing for my
brother, it only became even more precious.
### Why an OS?
Naturally, when you have a cool console, your first instinct is to write an
operating system for it. Okay, I'll admit, it's a little strange to not just
either sell the GB, display it, or play game on it. Unfortunately, it has way too much sentimental value to sell, but I really don't see any value in it as a
display piece. As much as I'm a fan of retro games, my Nintendo Switch can
run Tetris a lot better. Alas, it seemed the old thing was doomed to rot,
until I discovered that the thing has a variant of the Zilog Z80 chip as
its brain. Yes, the Zilog Z80 that powered an entire generation of hobbyist
computers. What's more, it's an incredibly simple system with a vibrant
development community (seriously, one of the most popular development
environments for it was updated 5 days ago at the time of writing this).
After taking a university course where I wrote in the CPU-speak that is
Assembly language, I was so wowed by the simplicity and elegance of telling
a computer exactly what to do with no frills that I vowed to find a project
where I could use Assembly for real. So, I put two and two together, and
the seed for the incredibly-creatively-titled GBOS (Game Boy Operating System)
took root.
Stay tuned, more posts will come soon.

61
content/posts/kakerlaken-math.md

@ -0,0 +1,61 @@
---
title: "How to win at Kaker Laken (Cockroach) Poker"
description: "See the mathematical way to a surefire win."
date: 2020-01-10T12:06:32+11:00
status:
- finished
categories:
- math
tags:
- boardgames
- probability
- medium
recommended: true
---
Before we get into the math of it, let me introduce Kaker Laken Poker -
that's Cockroach Poker to us English-speaking folk. It's a card game
that encourages lying to your friends and family, as all the best ones
do. Rules are simple; there are 8 kinds of cards, each depicting a certain
kind of critter on it. Everyone hides their hand. Whoever's turn it is
picks a card from their hand, places it face down on the table, and slides
it toward another player. When they do this, they *reveal* (ahem) which
critter is on that card. The player who receives the card can either agree
with them, disagree with them, or peek at the card and pass it to another
player and *reveal* what the card is to them. Let's say you hand me a
cockroach, but tell me it's a spider. I can either agree that it's a spider
(and lose, because I was wrong), disagree (and win, because you were wrong),
or pass it on and say it's actually a scorpion.
### Let's make it boring
Now that you understand the game, let's take a look at the best way to
win. To do that, we'll need to see what the chances of us winning and losing
are for every kind of action we can do. Table to the rescue:
| Action | Chance of winning | Chance of losing |
| --- | --- | --- |
| Agree | 50% | 50% |
| Disagree | 50% | 50% |
| Pass it on | 33% | 33% |
Okay, this all seems to check ou- wait a minute... What's going on with that
last row?! The first and second rows make sense - if you agree or disagree,
there's a 50/50 chance that you're either right or wrong about which critter
is on the card. So, why does the last row only have a 33/33 chance of winning
or losing? That's because when you pass a card on, there are now three possible
outcomes: the person you passed to can agree with what you reveal, they can
disagree, or they can also pass, meaning you've neither lost or won. Because
there are three outcomes and the odds have to be split evenly, there's a 33/33/33 chance of winning, losing, and neither. It can't be a 50/50/50, because that'd
be like saying something is half good, half bad, and half turkey - it just
doesn't make sense.
There we go! If you want to make sure you win a hand, always take a stand and
agree or disagree. Don't be a wuss, call out those lying scoundrels that you
thought you loved and march onwards to victory.
### But wait...
If you've ever played Cockroach Poker, you may have realised that all that
was wrong. See, the game doesn't end when someone wins, it ends when someone
loses. You don't win in this game, you just don't lose. In reality, we should
actually be picking the pass action because it's the one that has the lowest
chance of losing. Man, I bet you're glad you read this bit.

84
content/posts/muli.md

@ -0,0 +1,84 @@
---
title: "I will not forgive the man who killed my dog"
description: "A transcript of the moral debate I had in my head."
date: 2020-01-30T12:06:57+11:00
status:
- finished
categories:
- philosophy
tags:
- morality
- long
recommended: true
---
On Tuesday last week, someone killed my best friend. Muli (pronounced
moo-lee) was the gentlest, laziest, most caring friend I've ever had.
Most of his days were spent lounging on the most comfortable carpet
in the building, or at least the most comfortable one within 10 steps
of his food. That peaceful slumber belied how ferocious a guard dog he
was - it was common understanding in our house that Muli would bark
like a hellhound and defend us at all costs, until the robbers scratched
his chin or gave him a pat.
He never bit anyone, no matter how grumpy they were with him. He sat
by your side when you were sick, and all he asked for was some food
and a good nap.
Kids loved Muli. Adults loved Muli.
I loved Muli. And I always will.
9 days ago, the fuzzball trotted just outside the door to my father's
office because the butcher next door had thrown out a scrap for him.
We never worried about him doing that because he was possibly the most
traffic mindful dog in the world, and on top of that, the carpark was
private and small. While Muli was eating his steak, someone sped into
that small carpark, swerved at the last second to make a turn into a
carport, and killed Muli instantly.
An employee of my father's was the first to notice Muli lying in a pool
of blood, his tail wagging limply. He called my dad out of his office while
he himself ran to the man who was entering a neighbouring building. While
my dad held my dying dog, the man who hit him shrugged and said that he
didn't see Muli.
My dad called me immediately, and I was there in less than 10 minutes. The
man had already left. That is why I will never forgive him.
### How should we forgive?
Humans are a species of contradiction. Despite every evolutionary fibre
in our being telling us to look out for number one, we still care about
one another. It's difficult, though, to care and love without hurting
ourselves in the process. Some people solve that dilemma by always giving
second chances, some solve it by never giving second chances. I've lived
my life between those two. I give as many chances as I can because
I believe everyone is capable of growth and change, given the opportunity.
Sometimes, I don't have it in me to do that. When that happens, I tell those
around me, give myself time away, and then return healed and ready
to trek on through the ups and downs of life and relationships.
That forgiveness hinges upon the fact that each of us deserves an equal
shot in the world, and each of us is capable of being better.
When someone shrugs off killing something out of negligence, I can't see
any potential. When someone confronted with the fact that they could have
just as easily killed a child shrugs it off, I can't see any potential.
When someone fails to make even the most basic attempt at an apology, I
see nothing in them. The man who killed my dog left a grieving family
without any acknowledgement.
Moreover, he will never bear the pain I've had to bear over this. He'll
not even receive a traffic infringement. I don't believe in an eye for
an eye, but if we all deserve an equal shot in the world, then he deserves
to at least understand my pain, if not share it as we grieve together.
All I wanted to do to the man was ask that he volunteer with an animal
shelter, go vegetarian, never take his eye off the road again, or anything
to grow and learn from his mistake. That's the most important part of
earning forgiveness. But I'll never get to tell him that. I'll never even
see his face or know his name. Instead, I'll remember my father calling me,
sobbing, me asking what was wrong, and then finding out my best friend was dead.
![Picture of Muli](/images/muli.jpg)

31
content/posts/pdf-metadata-script.md

@ -0,0 +1,31 @@
---
title: "PDF metadata script"
description: "A small script to correctly set the title and author metadata in a PDF."
date: 2019-10-30T12:06:18+11:00
status:
- finished
categories:
- projects
tags:
- pdf
- bash
- short
recommended: false
---
After buying an ereader, I finally had a way to read all of my PDFs nicely.
Problem was, every time I sideloaded a PDF, the usually very nice listing
of all my ebooks and PDFs was filled with garbled filenames and non-existent
author names.
Ghostscript provided a way to fix this through its PDF-editing magic, but
manually changing the metadata of each PDF I sideloaded to my Kobo was
becoming a pain. Thus, I concocted this little script.
Using it is dead easy. Just throw in the name of the PDF(s)'s author, and
the filenames of all the PDFs they've written. The script will automagically
use Ghostscript to set the author name and title properly in each file's
metadata. I wrote the script to generate titles based on how I name my PDF
files, so it works by replacing underscores in filenames with spaces, and then
capitalising every word (e.g.: my_file.pdf gets the title My File). Feel free
to mess with the script so it works with however you name your files.

155
content/posts/pfsense-vm.md

@ -0,0 +1,155 @@
---
title: "How to use a pfSense virtual machine for a DMZ"
description: "Set up a DMZ with pfSense without needing an external machine."
date: 2020-01-13T12:06:38+11:00
status:
- written
categories:
- networking
tags:
- pfsense
- guide
- long
recommended: false
---
If you're starting out in the world of home servers and networking, you've
probably heard the folk ballads of pfSense the wise, and rightly so. It's
a very powerful, very flexible networking tool that nearly achieves panacea
status. It can handle your DNS, it can handle your firewalling, it can handle
your routing, and it can do it all for free. You've probably also heard that
it's important to have a DMZ (short for de-militarised zone) that separates
your web-facing stuff (servers that you want to access from the outside world)
from your private stuff (your mum/wife/dog's laptop, your smart fridge, and so
on). And you've probably come to the conclusion that you're going to need
to spend a lot of money, because how can you have a DMZ without a separate, dedicated
pfSense machine with your DMZ sitting off to one side of it, and your home
network sitting on the other?
Well, you know what? You're wrong. Luckily, I'm here to save you from
capitalism and tell you how I did exactly that.
### Pre-existing condition
Chances are you'll have a very basic, typical home network set up at the
moment. Something like a WiFi router which everything is connected to,
your hypervisor included. This was exactly my situation. For the visual
learners, here's how it looked.
![old network setup](/images/old_network_setup.png)
Also, before reading this guide, you should be comfortable with certain
terms and tasks. You should understand how LANs (and specifically DHCP)
work, and what a virtual bridge is (it's basically an Ethernet switch but
in software instead of hardware).
You should also be prepared to look up how to do certain menial
things in pfSense, like set DHCP up and edit what IP ranges it offers.
It's not that I'm lazy for not including those, but simply that including
them would make this guide even longer.
Finally, I set up all of the following with a 4-port Ethernet PCIe card
on my server. That made having a dedicated port for lots of separate
things drastically easier. I did say you wouldn't have to spend a lot
of money, and you don't - 4-port cards are only AU$50, which is way
cheaper than a dedicated pfSense box (usually $100+).
### VM'ing pfSense
pfSense is mainly configured through its web GUI, which is only accessible
if you're on the same network as it. That's an issue when you're trying to
set it up in a VM, because you'll often be moving things on and off different
sections of your home network and you may not have a connection when you
actually need it. To remedy this, I didn't actually change the layout of
my network until the very last second - I set pfSense up with all the settings
I wanted, but only actually moved the plugs and cables around when I was sure everything
would work. This meant that I could access the web GUI without any trouble.
To do that, I set up my pfSense VM in Proxmox with its own virtual bridge,
and assigned that to a separate Ethernet port on my physical server. I
then plugged a cable from my router (still running) into that port, and
this basically added the pfSense machine to my home network, meaning
I could start up the web configurator and actually access it from my
home network. I also added the virtual bridge that my hypervisor was
using to pfSense (which would eventually be my DMZ), and added another
virtual bridge on another dedicated Ethernet port (which would be where
I plugged in my actual Internet cable to the outside world).
Here's the diagram.
### pfSense settings
This bit is pretty easy. What you'll want to do here is to set up your
WAN connection (the actual Internety, ISP bit), your LAN, and your
DMZ.
#### WAN
Again, pretty easy. Just set up your WAN here the same way you did on
your home router. For me, that's a PPPoE login with a username and
password.
#### LAN
Here, you'll want to set up a regular network with DHCP. Make sure that
you add one static routing (under the DHCP menu in the web GUI) for
your WiFI router's MAC address.
#### DMZ
Again, this is a regular network with DHCP. Just make sure that you have
a different range of IPs being offered than your LAN. For me, I had my
LAN using the 192.168.x.x range, and my DMZ using the 10.0.0.x range.
You may want to add a static routing for your hypervisor's MAC address
so that you know where to go to access its web GUI.
### Router settings
Okay, now that you've set up pfSense, it's time to prepare your router
for the changeover. All you really need to do is to open your router's
settings (yet another web GUI) and *disable* DHCP, because DHCP is
going to be handled by pfSense now. Also, you'll want to disable your
router's WAN connection (because the Internet will be handled by pfSense),
and you'll want to assign your router the IP address that you reserved
for it in the LAN settings step.
### Move the cables
Okay, recall that our (my) network currently looks like this, but has
all its settings ready for a new layout.
![old network setup](/images/old_network_setup.png)
Because we've already set everything up, we don't need to worry about
having any weird spaghetti connections just so we can make sure we
can change settings on machines. We can just go straight ahead and
set up our new network.
To do that, you'll want to move your WAN (Internet) cable from your
router to the dedicated port on your server that you told pfSense
would be your WAN. You won't need to move the cable from the pfSense
LAN port to your router, because it's actually still useful. You
can just imagine that instead of running from the router to pfSense,
it now runs from pfSense to the router (because pfSense is now the
brains handling DHCP and WAN and such). You *will* want to remove
the cable running from your router to your hypervisor, because
otherwise that would put your hypervisor on your LAN. Remember,
we actually want it on our DMZ, and we already have a virtual bridge
connecting our hypervisor and pfSense which *is* our DMZ.
All in all, your (my) new setup should look something like this.
![new network setup](/images/new_network_setup.png)
Once you've done that, you don't actually need to worry about
creating firewall rules to stop traffic between your LAN and
your DMZ, because pfSense's default behaviour is to stop any
traffic without an explicit rule allowing that traffic to pass.
Naturally, if you have anything you want to expose to the web (like
SSH), just set up a NAT rule that opens the port of a machine on
your DMZ to the outside world, and voila - the web can talk to
your server without eavesdropping on your regular schtuff.
This is a pretty fiddly thing to do, so feel free to email me at
ciao dot barilaro dot me for help.
### TL;DR
**TL;DR:** To set up a DMZ with pfSense in a VM, give the VM two
virtual bridges (with a dedicated Ethernet port) and also add the
virtual bridge your hypervisor is using to it. Set up the former
two with a LAN (with DHCP) and WAN, and the latter as a DMZ (with
DHCP or static routing). Then, change your router's settings to
disable WAN and DHCP. Then, unplug your old cabling, and run
your WAN cable to the dedicated pfSense port, and run a cable
from the dedicated LAN port to your router. Your DMZ is already
connected by virtual bridge.

117
content/posts/pizza-algorithm.md

@ -0,0 +1,117 @@
---
title: "Passing the picky pizza trolls"
date: 2020-02-14T19:27:59+11:00
status:
- finished
tags:
- zoombinis
- algorithms
- gaming
categories:
- compsci
recommended: false
---
Wait a minute, do you feel that? It feels like
someone... Wants to ruin a childhood game with
math and computer science!
{{< youtube F0K5s7-k9cs >}}
Too late, you're stuck here now. Put on your best 'I'm
tolerating you' smile and settle in for the first in a
series of posts tackling the best strategies to beat a
decades-old childrens' computer game.
{{< figure src="/images/zoombinis_reqs.png" caption="It literally doesn't even run on new computers" >}}
### A history lesson
Back in the late 80s and early 90s, Broderbund was pumping out
hit after digital hit. They're the masterminds behind classics like the
[Carmen Sandiego series](https://www.youtube.com/watch?v=--q8Hd-NLIY),
the original [Prince of Persia](https://www.youtube.com/watch?v=zjR_AhxPnVM),
and the venerable [Kid Pix](https://www.youtube.com/watch?v=JCd8g6hFQiw).
In 1996, they released one of my favourite games of all-childhood-time;
the educational puzzle that was the
[Logical Journey of the Zoombinis](https://www.youtube.com/watch?v=lYInqFMcWWo&list=PL3B2758AD2BF9D7D0).
### The fuck is a Zoombini?
A Zoombini is a lil blue sphere adorned with a lil coloured nose, a pair
of lil eyes, some hair, and some adorable method of locomotion.
{{< figure src="/images/how_a_zoombini_is_made.png" caption="Does this count as asexual reproduction?" >}}
They've been the victims of a curiously-unmentioned race war with their cousins,
the Fleens, who are Zoombinis but tall and green. Driven from their
home, they're forced to journey across treacherous terrain filled with
sentient rock formations and several other cryptic bastards who force them to
complete puzzles in order to pass through unharmed.
I say force them, I really mean force *you*.
### Make me a pizza!
One of the puzzles you'll encounter (and no doubt the most iconic one)
is the task of [making a pizza for a very picky troll](https://www.youtube.com/watch?v=Q-b3XZic_wc). The specifics vary according to the difficulty settings,
but the basic idea is that you've been given a machine that can spit out
a pizza with various toppings, and you have to find the right combination
of toppings to ~~pay the troll toll~~ feed the troll and pass through.
{{< figure src="/images/pizza_troll_toll.jpg" caption="[Ya gotta pay the troll toll if you wanna save your Zoombini's soul](https://www.youtube.com/watch?v=a7wTNtlya2A)" >}}
#### Try everything
Arno the pizza troll (and his family, when you meet them at higher difficulties)
will always give you enough chances to try every topping available on its own.
To put that in maths, you'll always get `n + 3` pizza attempts, where `n` is the
number of toppings or sundae ingredients on a particular difficulty level.
After that magical number, he'll start punting your Zoombinis back from whence they
came.
Seeing as we get so much leniency from the arboreal *amante della pizza* (pizza lover,
in Italian for the sake of alliteration), making a separate pizza from every topping
and then assembling one final, correct pizza is definitely a viable strategy that'll
win every time. Unfortunately, it isn't quite a pedantic enough strategy, and it'll
offend every Italian you've ever met. Why? Cultural differences.
Oh, but also, you're wasting a pizza! Every good Italian will tell you that their
mother always instilled in them a compulsion to lick their plate clean of even the
tiniest slicks of sauce, because wasting food is tantamount to a slap to the face.
#### Build off your mistakes
No, dear reader, we can make sure that we never waste even a single pinch of flour
with a slightly different strategy; [dynamic programming](https://www.youtube.com/watch?v=vYquumk4nWw).
Dynamic programming tries to solve problems by breaking them up into smaller, overlapping
subproblems.
The big problem we're trying to solve is which toppings to put on the pizza. We can
break that up into smaller problems, one for each topping, where the small problem
is whether the troll likes that topping or not. What sets this apart from the
strategy above is something called *memoization*, which is a fancy way of saying
'remember the solutions to the previous subproblem'. Instead of checking each topping
individually, then, what we'll do is this:
1. Start with the first topping and see if the troll likes it
2. If they do, add it to the next pizza
3. Go back to step 1 and repeat with the next topping
By keeping the toppings the troll likes on our pizza when we're checking a new
topping, we can save on pizza dough because when we find the last topping they
like, we don't need to make a pizza with all the toppings on it; we've already
got them all on it!
Let's work through an example where Arno wants a pizza with olives and cheese.
We start at step 1, making a pizza with just olives. Arno says he likes it, great.
We then make a pizza with olives and capsicum. Arno says yuck, so we move on.
We make a pizza with olives and mushrooms. Arno says yuck again. We make a pizza
with olives and pepperoni. No dice. We make a pizza with olives and cheese.
Bingo! Arno likes cheese, he likes olives, and he's happy with the pie!
If we were using our other approach, we'd make one pizza for each individual
topping, which makes for 5 pizzas. Then we have to make one additional pizza
with all the toppings we know Arno likes, which makes 6 pizzas. That's a whole
pizza extra than our new method, which only uses 5 slabs of dough.
**Mamma would be so proud.**

33
content/posts/postmaker.md

@ -0,0 +1,33 @@
---
title: "postmaker"
description: "A dead simple site generator for people (including me) who don't want to learn anything except HTML."
date: 2020-01-23T12:06:43+11:00
status:
- finished
categories:
- projects
tags:
- web
- bash
- short
recommended: false
---
Ah, the site generator. Brilliant innovation in the website management sector,
but horribly complicated, don't ya think? When I was first putting this
site together, even the simplest generation software was not only
cumbersome to use, but inflexible. I could only use certain themes, I had
to learn new ways of marking up and templating my posts and site, and
the whole thing was so *heavy*.
I wanted to make a CMS that was really easy to use and only needed the bare
minimum work required. On top of that, whatever work the user *did* have to
do needed to be doable in good ol', no-frills, HTML. Out came postmaker.
postmaker (uncapitalised, because I forgot to capitalise the git repo when
making it and now I think it looks cool) is the Bash script that makes
generating an HTML site from posts easy. You can write your posts in
markdown, add in a little bit of metadata (like tags), write a few small
templates, and bam! Website up and running. postmaker even generates index
pages for each tag, as well as a big index page for every post on your
site. Even the configuration file is easy to write.

181
content/posts/scratch-sucks.md

@ -0,0 +1,181 @@
---
title: "Scratch sucks; teach kids BASIC"
date: 2020-02-29T12:36:01+11:00
status:
- written
tags:
- programming
- scratch
- BASIC
categories:
- teaching
recommended: true
---
**Nota bene:** If you'd just like to skip to my awesome (I think)
lesson plans for teaching kids programming, [click or tap here](#alright-give-me-some-lessons).
When I began teaching kids programming many moons ago, my colleague,
who had been teaching for a few years longer than me at that point,
gave me some resources to teach Scratch. Scratch is an environment
that takes all of the annoying words and typing out of programming
and makes it as simple as fitting together puzzle pieces. It also
sucks. Like, real bad.
### Ooh, shiny...
Technology has bludgeoned our attention spans to smithereens with
an old-timey club. Kids are already lacking in the virtues of
sitting down, shutting up, and paying attention, so lessons need
to hit the Goldilocks zone of interesting enough to engage, but
not interesting enough to flip your shit.
Let's put on our thinking caps and imagine how a kid who's never
even heard the words `if-else` might react to the following.
{{< figure src="/images/scratch_editor.png" caption="It looks like Windows and a rainbow had a baby and the baby crapped its pants and vomited." >}}
Scratch has (quite impressively missed) the Goldilocks memo, it seems.
From the get-go, you have the following things to keep track of:
* Programming and code blocks
* Sprite and sound design menus
* Sprite selection and animation options
* 14 trillion colours and shapes
Good luck!
### Uh, which way is up?
Each of those 14 trillion colours and shapes is a pathway forward,
and therein lies the problem with Scratch.
**Scratch makes things appear intuitive but the content fundamentally
isn't.**
Scratch gives kids just enough hinting that they can do a bunch
of different things, but it doesn't equip them with the tools to
do it. They can animate, they can draw, they can program a game
or they can program a mathematical problem solver, but as soon
as they try to step into the deep end they fall in completely
and flounder.
{{< figure src="/images/patrick_head_nail.jpg" caption="Actual footage from my early classes." >}}
This is a classic case of knowing what you don't know. That's
really frustrating to deal with as a teacher because you'll
have kids with a thousand different interests all vying for
their particular niche. You can plan a lesson for games, but
some will want to animate. What's more: they know they can
animate, they can get started on animating and ignore your
content, but they can't actually see it through without
your help. The end result is kids that will get bored and
fed up that their desires aren't being met.
See, an optimal learning environment is actually one where
kids don't know what they don't know, because then they
won't go gallavanting off in search of mystical treasure.
When they have absolutely no idea what the possibilities
are, and you drip-feed them judicially, they become a lot
more engaged with you and your content, because *you're*
they're only way through the wilderness. Their only
desires will be the ones you let them know are possible,
which means that you can fulfill their desires completely
before there are too many to handle.
To put it succinctly, the only way to cure choice paralysis
is to eliminate the choice.
### It's not just you...
The choice paralysis with Scratch also impacts you, the teacher.
It's hard to have a good trajectory mapped out with so many
possibilities. Scratch just doesn't have a good skill progression:
do you learn to animate first, so that future content is engaging
with cool sprites and visuals? Do you learn to program first? What
programming concepts do you teach first: the ones that will let
a kid make a game or the ones that will let them make a small
interactive movie?
Again, the cure for our choice paralysis here is to eliminate
the choice.
We have to keep it simple, stupid. We have to make things really...
### BASIC
You can applaud that segue any time you want, by the way.
After finding that my students were either rote-learning or
no-learning with umpteen different Scratch lessons I attempted,
I went back in time by 42 years. On my decade escapade, I found
a relic bearing untold pedagogical powers. I speak of the mythical
Applesoft BASIC language. More specifically, [this handy-dandy
online emulator](https://www.calormen.com/jsbasic/)
written in Javascript.
{{< figure src="/images/js_basic.png" caption="The only time you could tinker with Apple and not void your warranty." >}}
### Uh, why?
Because BASIC bears striking similarities to the only algorithmic
work most kids have ever done: step-by-step instructions for something.
In fact, that's exactly how I start my first lesson in my new lesson
series: the age-old exercise of pretending to be an extremely pedantic
robot whom the kids instruct to write something on the whiteboard.
On top of that, BASIC has a really rigorous yet simple structure to
its syntax: line number (analogous to which step you're on in your
instructions), command (what you're gonna do), parameters (description
or other helpful information for your command).
It also avoids all of the problems with Scratch by being *slightly* too
unintuitive to work out entirely on your own. That means the kids aren't
able to wander off and decide to do their own thing until I've taught them
enough to be able to fly free without issue.
### It's still fun!
The most important thing is that Applesoft has all the cool graphic
capabilities you'd want to keep things interesting. The Javascript
version even has examples of awesome games to show off as a goal for
your students.
Of course, you don't just have to rely on BASIC being fun for a good
lesson. In fact, because the syntax of BASIC is so easy to learn, I
actually spend most of my lessons teaching concepts with class and
group activities. Then, we just transfer the skills and concepts we've
learned into code on a computer.
### Alright, give me some lessons!
You know I'd never leave you hanging, dear reader. Just so you can
see what I'm doing, have a look at these lesson plans. I'll probably
upload more or even have a section of the site devoted to these eventually,
so stay tuned for more.
As always, they're licensed with a CC-BY-SA licence, so you can remix
and do whatever you want with them, just slap my name or a link to the
original work somewhere on your thang.
1. [Intro to algorithms](/downloads/lessons/01-intro_to_algos.pdf)
2. [Intro to variables](/downloads/lessons/02-intro_to_variables.pdf)
3. [Conditionals](/downloads/lessons/03-conditionals.pdf)
4. [Loops](/downloads/lessons/04-loops.pdf)
5. [Challenge/breather week](/downloads/lessons/05-challenge.pdf)
### One more thing...
If you were in school or university any time after 2010, you probably
had a laptop in class. You probably also wasted a significant amount of
time on that laptop, because there are a lot of games and other
cool things to waste your time with on the Internet. Fortunately, schools
can now stop that with web filters. Problem is, you've gotta unblock
Scratch if you want to teach it. But unblocking Scratch means unblocking
all of Scratch, which includes other people's projects, which includes
games like Geometry Dash.
Couple that just-a-click-away gaming with the fact that Scratch is hard,
and you get students that end up unfocused quite quickly. What's more,
they'll insist they're learning by pulling another project apart and
looking at its puzzle blocks. Sometimes, that's actually the case,
which means when you tell kids not to fool around like that, you're
stopping them from learning in a way that suits them. But if you let
them do it, some kids will abuse the privilege. You can't even do a
middle ground and only ban the practice if there's too much gaming
and not enough coding, because that means monitoring every kid like
a hawk.
Have I convinced you yet?

36
content/posts/speeding-laws.md

@ -0,0 +1,36 @@
---
title: "Speed limits are silly"
description: "Speed laws punish risk instead of danger, and they don't even do that well."
date: 2020-02-08T12:07:08+11:00
status:
- in progress
categories:
- sociology
tags:
- driving
- risk
- penology
recommended: true
---
Speeding laws are a failure.
Laws - traffic laws in particular - are enforced to keep us safe.
They prohibit behaviour that presents risk. By eliminating the risk,
they eliminate the danger by nipping it in the bud. In essence, traffic
law is the work of a mindset that says prevention is better than a cure.
Speeding laws operate on the assumption that drivers are homogenous (that is, that they're all the same) when they clearly aren't. An elderly individual whose reaction time has been greatly compromised by age is not on par with a person who races recreationally every weekend. Despite that, speed laws force them to work at the same pace. Whether you're grandpa or Schumacher, you're capped at 50. On paper, this works: even if Schumacher can drive safely at 100, he'll certainly be safer driving at 50. Our grandpa, who doesn't have it in him to go 100, is also safe at 50. Everyone wins. Unfortunately, speed limits rarely function as limits. In fact, they're almost always interpreted as a suggested speed, or even a speed minimum. This is where speeding laws become dangerous. Grandpa might not actually feel comfortable at 50 after all, but the sign in front of him (and everyone around him) are forcing his pedal closer to the metal. All that and I haven't even mentioned that here in Australia it's actually illegal to drive less than 20 under the limit.
Homogenous laws don't work for heterogenous (not the same) people. What might be an incredibly difficult speed for me to drive at could be the pace of your Sunday drives. That's why speeding laws aren't a great idea: they punish risk, but whose risk? Sure, you could say they punish being more risky than the average, and that might sound great, but in reality you're just going to leave average drivers content and piss the rest of the populace off.
Alternatives are difficult to find, though. At the opposite end of the spectrum is a completely heterogenous law where the speed limit is different for every driver on the road based on their skill, age, coffee intake, how distracting their car interior is, and so on. While that would be an ideal solution, it's somewhat (only somewhat) of a nuisance to implement. As much as I'm a fan of fencesitting, that won't help us here; a partially-heterogenous law where speed limits are applied based on general categories, rather than individual traits, is really just a slightly more specific version of the problem we already have. In fact, almost any solution you could think of for this problem poses some sort of barrier.
The solution, my dear readers, is to forgo a solution entirely. I've just spent a few paragraphs explaining why punishing risk is impossible to execute effectively, so why bother at all? But wait, won't that mean bad drivers get off scot free? Well, we *do* have laws for T-boning and gruesomely murdering an innocent family, so I would hazard a guess that no, they won't.
But won't that be less effective at stopping road tragedies? Also no. Apart from the research saying so, I'm sure we could agree that you'd have a challenge finding someone who drives around *trying* to get into accidents. See, we don't need to punish risk because taking a risk and failing *is* the punishment.
### To be added...
* Citations and evidence
* More on risk societies

74
content/posts/they-found-us.md

@ -0,0 +1,74 @@
---
title: "They found us..."
date: 2020-02-12T19:11:56+11:00
status:
- finished
tags:
- web
- short
categories:
- newz
recommended: false
---
### Under surveillance
Bad news... The Big G found us, and we're officially indexed and listed
by Google.
Okay, it's not actually the worst thing in the world to be listed by the
world's biggest search engine. I'll cope. At least now you can find me
by looking up *barilaro dot me*, or some variation thereof.
{{< figure src="/images/indexed_baby.png" caption="I pinky promise it isn't sponsored content" >}}
### Cleaning up under the hood
To celebrate, I thought I'd finally ~~cave in~~ explore the world of
[semantic HTML5](https://html.com/semantic-markup/). If you don't know,
HTML is what the web is written in. It's nothing too crazy, just some
things called tags (like `<p>`, for paragraph) that tells your browser
(Chrome, Firefox, Internet Explorer, etc.) how to make things look.
*Semantic* HTML5 is the latest version of HTML (numba fahv) and it tries
to also tell your browser what things *are*, not just how to slap 'em
onto a page. Using semantic HTML5, [Googlebot](https://en.wikipedia.org/wiki/Googlebot)
(the ~~soulless~~ friendly robot that helps Google build its ~~shit list~~ search results)
can actually understand what's on your webpage and how its laid out.
In the days of yore, web developers used to mark a section using a tag
like `<div>`. They also used to mark banners using a `<div>`. They
also used to mark sidebars with a `<div>`. They also used to mark their
sock drawer with a `<div>`, their storage boxes, and so on. Googlebot
had no idea how to treat a `<div>` because everyone used them in different
ways. Now that HTML5 is here, we can use a `<section>` to mark a section,
a `<header>` to mark a banner, a main content section with a `<main>`...
You name it, HTML5 has a tag for it. Googlebot can now understand a webpage -
even though it doesn't have eyes - just by seeing what tags are where.
Even better, something like Safaritron 3000 on your iPhone (or just Safari,
because Apple's CEO of naming hates fun) can put webpages into a really
nice [reader view](https://9to5mac.com/2019/10/18/how-to-use-reader-view-iphone-ipad-ios-13/)
with just the content, no buttons or other web-specific bits.
{{< figure src="/images/reader_view.png" caption="How distinguished." >}}
Pretty nifty, if you ask me.
### Too big for my own programming britches
And in addition to all that, it seems I outgrew [postmaker](/posts/postmaker/).
Rather, I wanted something a little more swanky for my website than just listing
my posts. After much lamenting (read the postmaker post to know why),
I decided to switch over to [Hugo](https://gohugo.io). I stand by the
fact that static site generators are a bit too complex for my liking, but now I
understand why; they're very powerful, very flexible, and quite a bit faster than
a hodge-podge Bash script. Making templates for my pages is a pain, but waiting
a full minute for my site to be put together is *just* painful enough that the
swap was worth it. If you're hand-rolling your HTML or have a similar workflow,
as much as it feels like a betrayal to say it, I think you'd be well-served by
a site generator like Hugo. You only have to learn a tiny templating language,
and you still get to use HTML, so it's not too horrible.
### That's a wrapper!
And so ends the newz. New look, new workflow, and new surveillance by the overlords
at Silicon Valley. Stay tuned, and see ya next post.

14
content/status/_index.md

@ -0,0 +1,14 @@
---
title: "Status"
date: 2020-02-12T19:06:48+11:00
---
In case you're wondering what these mean, they're basically an indicator of how
far along a post is towards completion. An in-progress post is in the middle of
being written. They'll often have a list of things that need to be added, like
citations or more actual content. A post that's written is pretty much complete,
but might leave a little to be desired in the readability department. They'll
often undergo a few minor editing changes to make them easier to digest. Finally,
a post that's finished is exactly what you'd suspect. It may be updated in the
future if I get any more ideas I think are worth adding to it, but the content
is pretty much final.

BIN
static/downloads/flawed_veganism_thread.zip

Binary file not shown.

BIN
static/downloads/lessons/01-intro_to_algos.pdf

Binary file not shown.

BIN
static/downloads/lessons/02-intro_to_variables.pdf

Binary file not shown.

BIN
static/downloads/lessons/03-conditionals.pdf

Binary file not shown.

BIN
static/downloads/lessons/04-loops.pdf

Binary file not shown.

BIN
static/downloads/lessons/05-challenge.pdf

Binary file not shown.

BIN
static/downloads/the_gamechangers_thread_desuarchive.zip

Binary file not shown.

BIN
static/downloads/vegan_chads_thread_desuarchive.zip

Binary file not shown.

BIN
static/images/4chan_plots/flawed_veganism_thread_plot.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

BIN
static/images/4chan_plots/flawed_veganism_thread_sentiment.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

BIN
static/images/4chan_plots/the_gamechangers_thread_plot.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 KiB

BIN
static/images/4chan_plots/the_gamechangers_thread_sentiment.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 KiB

BIN
static/images/4chan_plots/vegan_chads_thread_plot.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

BIN
static/images/4chan_plots/vegan_chads_thread_sentiment.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

BIN
static/images/how_a_zoombini_is_made.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
static/images/indexed_baby.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
static/images/js_basic.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
static/images/muli.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 517 KiB

BIN
static/images/new_network_setup.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
static/images/old_network_setup.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
static/images/patrick_head_nail.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
static/images/pizza_troll_toll.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB

BIN
static/images/reader_view.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 KiB

BIN
static/images/scratch_editor.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
static/images/zoombinis_reqs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Loading…
Cancel
Save