
@ -1,6 +1,3 @@ |
|||
content |
|||
public |
|||
static/downloads |
|||
static/images |
|||
build.sh |
|||
deploy.sh |
|||
|
@ -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: |
|||
|
|||
 |
|||
|
|||
Here's one urging 'vegan chads' to rise up: |
|||
|
|||
 |
|||
|
|||
And here's one discussing whether veganism is inherently flawed: |
|||
|
|||
 |
|||
|
|||
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: |
|||
|
|||
 |
|||
|
|||
Vegan chads: |
|||
|
|||
 |
|||
|
|||
And the veganism discussion: |
|||
|
|||
 |
|||
|
|||
### 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) |
@ -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. |
@ -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 |
|||
--- |
|||
|
@ -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 |
|||
--- |
|||
|
@ -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. |
@ -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. |
|||
|
|||
|
@ -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! |
@ -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. |
@ -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. |
@ -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. |
|||
|
|||
 |
|||
|
@ -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. |
@ -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. |
|||
|
|||
 |
|||
|
|||
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. |
|||
|
|||
 |
|||
|
|||
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. |
|||
|
|||
 |
|||
|
|||
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. |
@ -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.** |
@ -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. |
@ -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? |
@ -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 |
@ -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. |
@ -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. |
After Width: | Height: | Size: 217 KiB |
After Width: | Height: | Size: 220 KiB |
After Width: | Height: | Size: 528 KiB |
After Width: | Height: | Size: 564 KiB |
After Width: | Height: | Size: 306 KiB |
After Width: | Height: | Size: 324 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 517 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 102 KiB |
After Width: | Height: | Size: 486 KiB |
After Width: | Height: | Size: 325 KiB |
After Width: | Height: | Size: 86 KiB |
After Width: | Height: | Size: 45 KiB |