come on down to clug park and meet some geeks online

11 December 2018

Johann Botha (joe)

Quick Update

You may already be a member…

  • Hello WordPress 5.0 – the new editor sucks for editing HTML.
  • Week of 3-9 December.
  • Monday, office, management meeting, data fixing, got some new gym gloves, podcast walk home, nap, sunset promenade walk, more tinkering with Docker and Django – managed to get Django running in a container on my Mac.
  • Tuesday, work, gym, swim, sauna, Green Point Park walk, keto lunch, Rockpool, sunset podcast promenade walk, Hamiltons S2.
  • Subtract
  • Wednesday, walked to the office – but encountered some load shedding, joy, worked at Strolla, office, lots of email scrubbing, breakfast for supper, Campari at La Vie, podcast queue zero, long phone chat w Jacques in London.
  • The story of Go Your Own Way – Fleetwood Mac
  • Thursday, work, gym, swim, sauna, caught the tail end of Cape Town Startup Week – VIP drinks at ICIC in Green Point, walked home, watched Jodorowsky’s Dune – good movie.
  • CTSUW seems pretty cool. Fresh take on a mostly meh tech entrepreneur ecosystem, if you ask me.
  • “Have the greatest ambition possible, do it, try, if you fail, it’s not important.” — Alejandro Jodorowsky

  • Friday, office, lunch at the Mojo Market, after work drinks in the office, extended nap, joined Paul and Nicci at the opening of new wine bar in Bree Street – I thought it was a bit average, drinks with Claus and Jani at House of Machines – they make a great Old Fashioned, quick Hanks visit.
  • What happened to October and November?
  • “What is the purpose of life – well it’s an adventure.” — JP about the call to adventure

  • “Are you doing the most adventurous thing you can be doing?”

  • If you listen to enough JP, all you hear is: meaning, responsibility and adventure.
  • “He doesn’t mid invading countries as long as tea time is at 16:30.” — Claus

  • Learn, create, make notes.
  • Do a small number of things with excellence.
  • For all my anti Instagram Story ideas… I do actually watch two fairly regularly.
  • Saturday, walked to the Waterfront with Paul, watched Bohemian Rhapsody at the VIP cinemas – great movie – go watch it, Belgium beer at Den Anker, afternoon of Elgin chardonnay and a good catch up with Paul, 13 hour sleep.
  • Sunday, brunch at La Vie, nap, sunset promenade walk to the Mojo Market, almost finished Hamiltons S2.
  • Tune of the week: Queen – I Want To Break Free

Have a fun week, crazy kids.

by joe at 11 December 2018 03:52 AM

02 December 2018

Johann Botha (joe)

Quick Update

District 9 visit…

Guns n’ Roses

  • Week of 26 November to 2 December.
  • Monday, school run, gym, swim, sauna, keto breakfast, office, BIA machine visit, supplements shopping, swim, sauna, in bed early.
  • Tuesday, work, gym, swim, sauna, keto breakfast, office, Nu, in bed early.
  • We’re built for adventure not peace.
  • Wednesday, up early, flight to Joburg – read a book about Salt, dropped our bags at the Raddisson, Vodacom meeting, Cool Ideas meeting, catch up with Roelf and the team at their rooftop bar, big steak dinner at The Bull Run with Scott, Rob and Rory.
  • Thursday, Afrihost meeting, RocketNet meeting, hotel, burger at Craft in Parkhurst, watched the Guns n’ Roses concert with Trevor, Rob and Rory at the FNB Stadium (District 9 spaceship), big mission to find an Uber at 00:30 in JHB after a concert.
  • “Feed them some cat food.” — Michael

  • Friday, breakfast with Ernst at Tasha’s – nice to catch up – chats about flow stacking, Buddhism, the subconscious mind, the IDW, epigenetics – seems we’ve been listening to similar books, flight to Cape Town, long podcast flaneuring walk to Camps Bay – walked around Mainens Cove, dinner at The Raj with Georg, drinks with Adrian.
  • Saturday, managed to get a Salt python3 install working (but not with IPv6) – I can now do remote Debian package upgrades for a few VMs, afternoon on Clifton 1st, watched the original Girl with the Dragon Tattoo – good movie, 14 hour sleep.
  • Sunday, worked at La Vie with some Bodzin, a bloody mary and chicken skewers, played with Docker and Django, watched some Hamiltons Pharmacopeia, nap, sunset podcast promenade walk, photo processing and blogging.
  • Tune of the week: alt-J – Adeline – “A Tasmanian devil falls in love with a woman as he watches her swim. The song describes his feelings toward her as well as his realization that he cannot be with her.”

Have a fun week, crazy kids.

by joe at 02 December 2018 07:34 PM

26 November 2018

Johann Botha (joe)

Quick Update

Little universes…

Lions Head

  • Week of 19-25 November.
  • Health week 1/4 – warm-up week.
  • Monday, work, gym, swim, sauna, PS4 tinkering.
  • Video: ASICs For Network Engineers
  • Tuesday, office, hardware shopping, Cape Quarter meeting, gym, swim, sauna.
  • Make good art – including businesses, systems and software.
  • All I want for xmas is a John Oliver vs Jordan Peterson debate.
  • Wednesday, office, dev meeting, late lunch omelette, sauna, swim, sauna.
  • Had a quick look at my podcast app stats. 38 days of listening over the last ~two years. Around 55GB of data. Or, R8250 in Vodacom 1GB top-ups… would have been an expensive hobby if not for sensible internet sources.
  • Updated my list of groups to support: Fighting the Commies
  • Thursday, work, gym, swim, sauna, worked at Harveys, a Campari soda at La Vie – so much better than Aperol (who drinks that?), watched a bit of Hamiltons S2.
  • Some things pay in freedom.
  • Friday, office, net-ops meeting, shopping – figured I needed an external SSD for backups, biltong shopping, fetched Mia, Campari at Rockpool with Dan (and Dan’s little one), Fred, Daryn and Georg – nice to catch up, Mia and I watched The Play That Goes Wrong at The Theatre on the Bay – good show, Mia loved it, time well spent.
  • I got an email back from Derek Sivers this week.
  • “I wasn’t trying to make a big business. I was just daydreaming about how one little thing would look in a perfect world.

    When you make a business, you get to make a little universe where you control all the laws. This is your utopia.

    When you make it a dream come true for yourself, it’ll be a dream come true for someone else, too.” — Derek Sivers, Anything You Want

  • I kinda experienced something similar – not really knowing it at the time. I remember when we started Frogfoot we had “All rights reserved. The Sovereigns of Frogfoot” at the bottom of our website – 2003 days – yeah, php config is broken, but scroll down. I just wanted to play with routers and open source tools and we had the freedom to – build our own little world. It’s a struggle to keep these little universes independent and fun, but they can be lots of fun, many good memories.
  • Saturday, gym, swim, sauna, BIA machine visit, Waterfront, we watched Fantastic Beasts: The Crimes of Grindelwald at the VIP cinemas – I was a bit lost, but Mia seemed to know all the details, we shared a greek food platter at Mykonos Taverna – which was excellent, food coma nap, Kirstenbosch, we watched the James show – old music was good, new music was lame, time well spent.
  • I always liked the James : Pleased to Meet You album (2001). The album’s front cover features a composite image of all the band members’ faces.
  • Alt-J at Daisies 2013. Good memories.
  • Mia says the Aliens movies did not scare her.
  • Soda water vs mineral water? They seem to add salt to soda water.
  • Sunday, upgrades and backups, lazy brunch at Manna – the whitest place in Africa, Moro gelato, nap, swim, sauna, smoothie, Kloof corner hike with Mia, Glen Beach and Camps Bay beach sunset walk, burger in a bowl at Da Vinci’s, time well spent.
  • I’m still very happy with my hiking shoes.
  • I kinda have this sense that technology has happily stalled for a while, at least in the general computer tech world. I think it’s good – stable, simple, well understood, but not so exciting. Maybe slower moving tech gives people a bit more confidence to invest time in learning and building.
  • Which technologies are you excited about these days? I can come up with maybe: 5G, open networking hardware (routers and switches), 10G fibre to the home, 802.11ax wifi… hmm, after that it gets a bit hard to point at something – cheaper SSDs and memory would be nice. Even 5G mobile tech is not very exciting. Maybe machine learning, but it seems you need a lot of data to play that game.
  • On personal nerd tech, I can’t really think of anything exciting. We have all the screens, phones, solid state storage, cpu speeds, cameras, apps, watches, gigabit ftth etc – maybe arm64 based laptops.
  • I should probably add – maybe the stuff we should be getting excited about is: food, farming, health, smarter towns… robots and full unemployment.
  • Duncan Trussell on the Cacophony Society
  • Tune of the week: James – Getting Away With It

Have a fun week, crazy kids.

by joe at 26 November 2018 08:02 AM

29 October 2018

Christel Breedt (Pirogoeth)

How to say and do the right thing for someone struggling with chronic illness

If any of you have recently watched the first Deadpool movie, I'll refer you now to a the scene above in which Wade Wilson goes on a mini rant about cancer to his girlfriend Vanessa.

At the end of the scene he emphatically states: "And under no circumstances will I invite YOU to this (shit) show!"

That got me thinking about the role of isolation in Chronic illness.

It's generally well known that being socially isolated makes people more likely to develop mental and physical illness... so it's obviously a good idea for someone already prone to these things not to be left on their own for too long right?

So why do we have such a problem showing up for our Chronically ill friends?

I'm assuming it's not because we don't care. On the contrary I'm fairly certain the reason we don't show up is because we don't know HOW. But if we keep a level heald about it I figure it's pretty simple.

We all get taught to think about illness in a certain way. From childhood illness is described as follows:

1. Something that can be managed by consuming healing substances or getting procedures done and resting.
2. A state in which you should more often than not isolate yourself from others and withdraw for a time to heal.
3. It is thought of as a state of being less than a normal human. Something is WRONG with you. You're not fully at capacity.
4. You are only given a fixed period in which to convalesce. When you take too long to heal, others may judge you as being poor at caring for yourself or you are lying about how ill you are.

So lets take those four things apart a little more.

1. Something that can be managed by consuming healing substances or getting procedures done and resting

This is I think one of the main reasons why chronic illness perplexes healthy people. How do you interface with someone who cannot take something, or receive a procedure, convalesce a while and then heal? What is this voodoo you speak of in which you just STAY SICK?

This is because unlike normal illnesses, rule one of healing from chronic illness is that even when you take all the medicine and rest all the time and do all the are still going to have days when you are as sick as most people's worst day of the flu and this won't meaningfully alter based on anything YOU DO.

There is no control you have over whether or not you will continue to be chronically ill. There is only control over how you deal with being chronically ill.

This can be hard for people to accept. It's terrifying for healthy people to imagine such a thing. A sickness that doesn't heal? A damp in your performance that doesn't go away? That experience of rubbing up againsts such human frailty can make people feel a bit awkward and stressed. It might remind them of losing a grandparent and watching their decline for example, and bring them to a confrontation of their OWN mortality.

This can make being around a chronically ill person uncomfortable and even emotional for a well person. But it's really important that friends dig deep within themselves and GET OVER IT. You see, we have those same fears....but for us there isn't a way to avoid confronting them. It literally lives with us in our body. If we can live with it day by day, I'm pretty confident you will discover you have the strength if you challenge yourself.

By all means, if the feeling overwhelms you do something about it. We do. Speak to your own doctor or therapist about your fears. Talk to a parent or a priest. This is what we do as chronically ill people to find the strength so there's no reason you shouldn't do the same.

But do that work, if you love us, of getting over being afraid of being us.

2. A state in which you should more often than not isolate yourself from others and withdraw for a time to heal

Staying home and healing up and not making a nuisance of my sick self in public is totally a valid thing to do when I have a cold that passes in three days. But when you have a chronic illness there comes a point when like it or not, my sick self is going to need to be about my business. There's simply no way around that.

Being chronically ill means doing things while you are technically so sick you should be in bed, or in hospital. This is another one that hits healthy people in a hard way. Because they have never had to get up and keep going through terrible illness, many don't realise it's actually a thing people do who are chronically ill. They somehow naively believe that being chronically ill is like having your period. You're ill...for a few days a month every month. They often cannot fathom waking up deeply tired, crushingly in pain and emotionally wrecked....and still getting out of the house and doing a days work.

I would challenge anyone who is healthy but wants to understand the experience a little better. For a full month, you are not allowed to brush your teeth, comb your hair, or wash unless you have done an extra two hours in the gym.

This will serve two purposes. You'll be tired as hell. That's something chronically ill people understand well. You will feel stiff and sore all the time and everywhere. Check. You'll want to shower and brush your teeth but find yourself skipping it because the thought of those two hours in the gym will simply be too much some days. You'll discover that wet wipes, dry shampoo, hand sanitiser, and deodorant have off-label uses you never dreamed of. And you'll be RIPPED if you manage to keep it up.

IF you keep it up.

Because pulling an extra two hours in the gym each day is a lot like being chronically ill. The amount of extra energy, time and physical discomfort involved can be somewhat mimicked by doing a really hard workout.

If this thought experiment is sufficient to give you ample empathy for how not cool that might be, skip the gym if you want....but remember that I don't ever get to skip being chronically ill. If I don't "go to the gym" of dealing with my chronic illness, chances are I either land up in hospital, or lose mobility or the ability to speak or think straight,  or in some cases some people with chronic illnesses can even die if they skip a day of showing up to the work of their illness.

And there's generally not a point where caring for your chronic illness means you get FITTER. Unlike working out, you don't get buff from being chronically ill.

3. It is thought of as a state of being less than a normal human. You're not fully at capacity.  Something is WRONG with you.

When you have a chronic illness, you're never going to be at full capacity ever again. You're now forever going to be someone that is checking their daily capacity, and based on a few factors the most of which you do not control, you will wake with some fraction of the percentage of energy and ability that prior to chronic illness you'd have considered your best day. Having your best day is like having your birthday or winning the lottery.

So there is something here we need to address. People who are not at the same capacity for work as other people are not broken or lesser than or subhuman or WRONG. Your worth as a being isn't determined by your CAPACITY FOR WORK.

This is something that's become really entrenched in our capitalist industrialist society, and it's a dangerous belief. Being a good friend to a person with a chronic illness means leaving this limiting belief behind. Our lives have inherent worth, meaning and purpose even when we cannot work.

Not being able to work is not a form of weakness, or poor judgment, or a flawed character. Being chronically too ill to work a normal job or any job is just a reality of life with chronic illness.

There are many ways to be of value to your community even then. I run a 5000 person strong community support group online, and coordinate relief efforts for members of my community in dire straights. I support parents in rearing their children with chronic illnesses like Ehlers Danlos Syndrome and provide them with information and guidance towards resources and support for their families. I also write these blogs and articles and create lessons for people who use alternative means of communication to learn about topics like science or biology.

These are all things I do sitting in a chair in my room, or in bed. I do not work in the normal sense of the word. But because I do these helpful things when I can do them and  I have people who support my patreon page, or my paypal account or send me funds to my backabuddy page. These things all allow me to live despite no having a normal job. This is just as valid a way of living as having a 9 to 5er.

I'm not able to work...but my life has worth. I'm at full capacity for being ME.

4. You are only given a fixed period in which to convalesce. When you take too long to heal, others may judge you as being poor at caring for yourself or you are lying about how ill you are.

People keep expecting me to get better. This is...perplexing. I mean, many of them have known me for decades. Still...they keep expecting me to have another answer when they ask me "How are you?"

Don't ask people with chronic illness how they are. Ask them how they are TODAY. Or better yet, ask them what they are doing right now that's interesting and fun for them. But don't expect to get a different answer than the one you've been getting for the last week, or month, or year, or decade.

Chronic illnesses don't heal. There's no period of healing that will fix this. There's often no treatment or cure. Knowing how I'm really doing won't really help you be my friend right now. I know you don't really get it. You aren't' someone with a chronic illness. You need to accept that's a part of MY experience you cannot empathise with. GET OVER IT.

I have.

What does help me is you accepting that me not getting better and me still being a mess 6 months or 6 years or 60 years later is OK. Not getting better when you're chronically ill is perfectly valid. I don't need to perform wellness for people who accept my illness - and that takes enormous pressure off of me.

BE someone who accepts my illness as much as I do.

What can you do to help though? Well, there is actually a lot! And it's at all different levels of intimacy, commitment, effort, and cost to you so you can always find something nice and helpful to do to support a chronically ill friend no matter the circumstance. Sometimes it just takes being a little more thoughtful, asking the right questions, and thinking outside of the box:

1. Ask me how I'm doing with my daily regime, or whether there have been any new developments in my treatments or management. Understanding what I do to be well will help you find ways to pitch in, or help me do those things more easily. Chronically ill people often like to relate these sorts of things to each other, so they might be willing to tell you too.

2. There are great ways to engage and share in my journey of wellbeing. Talking about your own health is fine, and I do care to listen about what you're doing in your life too...Just remember not to pitch in with advice from your auntie who sells Herbalife or this cool article you read on Facebook. You aren't here to give me advice, you're here to get to know the things about my health that matter to me, and maybe help me do those things. Keep the backyard doctoring in the box. if I need your advice, I'll ask.

2. Share in that path by offering to support me with something. If I'm a forgetful person going through a rough patch, offer to check in on me for a while to help me remember to take my meds each day, or make a point of helping me catch up on difficult chores once every few months. This can just be a quick text message or coming round to take out my trash for all of five minutes once a week. Little things for you are sometimes big things to us.

3. Drop in once every two weeks to come to visit a housebound friend and bring them a treat. When you're finding it hard to go out or get fun things in your life, being visited can be amazing. Being visited regularly gives structure and a sense of security in a friendship that can be very comforting, especially for a chronically ill person who may feel depressed and isolated.

4. If you're flush, set up a weekly takeaway delivery to a sick friend's home. Not having to cook one night a week can be a real joy. Better yet, bring your sexy self over and come to watch a movie with us on Pizza night!

5. Check in from time to time with us whether we need any physical or mental support of a particular kind. Having another fruit basket or slab of chocolate is charming, but having a friend who will ask me what to get me or how to help me is GOLDEN.

6. Call me just to tell me about your shit. I mean I'm REALLY tired of talking about my shit all the time. I've got to deal with this thing 24/7 and I probably see my doctor more often than I see you. You don't have to talk about this illness of mine ALL THE TIME. I actually want to know what's up for YOU.

7. Make group outings accessible for me. If you're all doing a ladies night, choose a bar that has an access ramp. Or try going at a time of day or day in the month that I'm actually feeling up to going along - check in with me when that is and help me coordinate when this goes down so I can bring my best self to the party that day. Give me a lift if it's hard for me to drive, or be ready to jet me out of there fast if I pass out or feel ill and let me know you're prepared for those things and I'm totally still welcome. Because I'd just stay home and miss out before I put that on you without your say so. Give me permission to be a drag.

8. Help me prepare to go to places I need to go. Sometimes I don't need someone to do the thing, I just need someone to sit with me while I do it. Many people with cognitive issues like brain fog or executive function problems just need help from someone in the room offering them pointers on what they were doing and why they were doing it. It's a low maintenance way of giving invaluable support. If I've got a big appointment that's got me rattled, having someone there to ensure I am dressed and ready on time and geared to go takes enormous stress off me, even if they don't actually dress me, or do anything but talk me through the prep.

9. Carry emergency supplies for my care when we hang out. I know you're my true friend when you keep earplugs in your cubby that are there JUST for me, or you have a stash of tranqs in the glovebox that you keep around for in case I have a panic attack in public or you keep sachet of electrolytes in your bag in case my POTS hits, or you know where I keep my epipen or insulin shot. It's the little things...

10. Remind me often that canceling plans or rescheduling is ok. I live in fear that letting you down will mean you dump me as a friend. It's hard when I am often not able to share in adventures with you, or visit because I'm ill. Reminding me that you'll love me even when my being ill robs us of time together will help me feel safer making plans with you to go out and do fun things.

If I think of more ideas I'll add them on later, but that's my best for now.


by Whizper ( at 29 October 2018 12:35 PM

26 September 2018

Christel Breedt (Pirogoeth)

How do we best support our neurodivergent child?

The Amazing Adventure

It's natural for parents to feel at a loss for how to proceed once they become aware of the fact that they are raising a neurodivergent child. With the strong opinions the community holds about therapies that seek to conform neurodivergent children to be more neurotypical, parents often feel cornered and lost without a way forward.

 This is a blessing not a curse. This is a moment for you to pause and embrace the truth: Nothing is ever in control. We don't know where this is going and that is OK. There isn't necessarily a way you should be going.

The answer is as simple as it is profound and challenging: You control the way forward. You can make your own way, or follow a road well traveled. There isn't a right choice all made up for you yet. You get to DECIDE.

Don't shrink back in fear! Revel in this adventure before you! All those opportunities and possibilities yet to unfold which you will have the privilege of sharing with your child as they grow. Embrace this adventure!

A life yet unlived. A story yet unwritten.

It's important to acknowledge that parenting a neurodivergent child can be extremely challenging and that children who are neurodivergent often need unique support and intervention for reasons that vary as wildly as the colour of wildflowers.

Still, there is no set outcome we are sure of. There is no script that can tell you how your kid is going to develop going forward. You must discover this as you go along. That uncertainty is uncomfortable, but in its wide expanses lies a lot of freedom too.

Let's focus on the vastness of possibility instead of the narrowness that we are encouraged to experience when a diagnostic label is chosen for a child by the medical fraternity. We can acknowledge that the label informs us about possible needs our child may have in the future without growing attached to any of those hypothetical future stories for their lives.

Showing up is half the job

Understand that parenting was always going to be one of the the hardest things you will ever have to do. All parents experience despair or directionlessness at times. Don't get stuck in that. If you feel like you can't get out of it, you need to seek support for that struggle not just for your child but for yourself. Learning to meditate and ground ourselves so we can be mindful of what we are bringing into the world is a crucial part of being a more attuned parent.

One of the great ironies of life is that very often the answers we seek are already inside of us - we sometimes just need a way of unearthing them. Spend time tending our inner world, your subconscious wisdom, and seek therapy if you feel you may have some troubles that are not yielding to your earnest efforts to overcome them. There is no shame whatsoever in seeking guidance - every culture has the tradition of seeking the wisdom of a shaman or Oracle. In this culture, we often call them therapists, yogis, gurus, priests or even our own parents.

Asking for help is a sign of tremendous courage. Ignorance and complacency is a far easier path, so if you're out there beating the bushes for answers or opening yourself up to the advice of others you're already doing an amazing job just by showing up. Give yourself a cookie and a hug for passing good parenting 101: Showing up.

Give them a voice 

Carl Jung wrote, "Nothing has a stronger influence psychologically on their children than the unlived live of the parent." Often our own priorities as parents are not actually what is in the best interest of our children. Being able to hold space for our own anxieties and fears, both for ourselves and for their future but then returning to be present with the experience of reality is key to preventing our own agendas from dominating the lives of our children.

Furthermore, the relationship with our children needs to be divested of power struggles and violence even in it's subtlest forms such as manipulation and passive aggression, and it needs to be radically accepting of differences between you as individuals so that the vast freedom we are all born with is not constrained by the will of our parents for our lives or their ways of doing for themselves.

The more intimate and yet accepting your bond, and the less of your own ego you bring to your parenting, the more you will discover you are making headway with them. You may discover that your perception of what their problems are may not always reflect their experience and the best guide to what path is best will come from your child themselves.

Learning to hear their voices in a million ways is the most powerful thing you can do to raise them well. for many children, this may actually require some very active listening and some very active interventions such as augmentative communication strategies but in those cases, this becomes even MORE important as often the only person willing to hear them will be YOU.

Welcome to the revolution

Society projects an enormous number of expectations onto every living being. We are trained from our first to practice conformity. Especially for a generation of parents raised in institutions - schools, or universities, or churches or clubs - our agency was often denied from a young age. We were taught to passively accept a path that was proscribed for us. Walk in line. Sit here. Listen, do not speak. Obey your elders without argument.

In a culture of conformity, being an outlier is a radical act. Being willing to refuse to be conformed is a form of defiance in a culture that values people falling into line and sticking with the program. Neurodiversity is an involuntary form of defiance in the face of pressures of conformity.

We are not able to conform because we are not wired for it. We cannot fall into line without harming ourselves. We must be radical or die to self either literally or metaphorically. Our nonconformity isn't a choice, it is our nature and we cannot hide it without paying a devastating cost.

That cost is one that we frequently pay with by forfeiting our mental and physical health. The average lifespan on an autistic person is less than 40 years old. The suicide rate is 28 times higher than the average. It is obvious that the way that we have been caring for autistic people up to now has been causing them to die young. Similar statistics exist in other forms of neurodiversity like ADHD also. Protecting a neurodivergent child from the force of conformity that society is placing on us is the most powerful gift a parent can give.

To do so you must be willing to be a nonconformist yourself...and that can be terrifically hard and scary. But if our parents will not take on this challenge, who will? It is crucial to our survival that they find the courage. I believe that in the heart of every parent is a fire of love strong enough to fuel that courage if they let it, sometimes they just need a bit of help getting it going or directing that heat in the right way. We can never fail so long as we continue to try.

Give them somewhere to belong
As a child reared by radically nonconforming people who ended up being pretty messed up people themselves, I can say this: Even if you screw up terrifically as a parent, if you do so while trying to hold a space for me to thrive I will thank you for it anyway, from personal experience.

My parents were a pair of hot messes....but the one thing they nailed was making sure I knew that being neurodivergent wasn't something I needed to fear or feel ashamed about, or some curse or divine blessing or a calling or a duty or anything holy or unholy. It was natural, right, good and just as the world ought to be (When the world is as it ought to be - diverse and comfortable with difference. I was helped to understand that this was a world I would be called to BUILD).

My parents praised my gifts and achievements while reminding me I still poop like everyone else and that even if I need certain supports or accommodations to solve these problems, I could not avoid the necessities of life like eating, sleeping and keeping clean. To them, I was just like every other kid everywhere and that was AWESOME. I BELONGED to my parents. I wasn't a freak at home. Everywhere else, but never in my own home. Be that safe place for your kid.

Never forget that your child is a sentient being

Something radical you may need to consider is that some of the truth of what you need to do for your child lies ONLY WITHIN YOUR CHILD. Even while they are only able to wail and suckle, they are a sentient being. Even when they can only gurgle and eat things off the floor, they are a sentient being. Even when they are unable to speak or cannot regulate their emotions, they are a sentient being. Even when they are not engaging with you in the way you'd hope and expect, they are always a sentient being. Sentience takes MANY forms.

Don't miss out on seeing the truth of that because society has conditioned us to respect certain sentient beings over others. Don't underestimate their intelligence, their capacity, and do your utmost not to undermine their agency. Give them a chance to show you what they can do before you do it for them. Give them choices as often as you can and let them bear the consequences so far as you can bear to do so without harming their young and trusting souls. Be there, ready to assist, but always assume the possibility exists that they will do it themselves one day given time, patience, tutelage and when needed accommodations or interventions that support the independence they are capable of.

What specific tools you use to educate them, or healing you seek for them will be right for you at the time given what you observe and what you know and what you have to give. We do the best job we know how to do. Be sure you know as much as you can - not just in terms of outside education - but in terms of truly knowing the will of your child for their OWN lives. Parenting shouldn't be about a power struggle or parochial care or patronage. It should be a partnership.

Children are people too

Never desecrate that bond of partnership with cruelty, cowardice or needlessly controlling behaviour. Be able to apologize when inevitably do because you are human. Model that ability for them so they know how it looks and can learn by example to be kind and humble in turn. Having the courage to be vulnerable is a superpower. Be vulnerable, most of all, with your children. They want to see you. You are the center of their universe. The most powerful things my parents ever taught me were things they taught me in moments where I could see their inner selves and they were teaching me from their hearts.

Lessons about who we were as a family. Lessons about how we were. Lovesongs they sang to me in my crib as an infant, over and over, became the mantras that soothed my deepest fears. Those lessons became my religion during times that I lost my religion. Your words and actions are written on the tablet of your child's soul. Mind what you write there.

Show them how it's done

Learn to be deeply, profoundly honest both with them and with yourself. Don't create a division between parents and children when none need exists. You are people. Be consistent in how you treat PEOPLE, don't have dual standards for kids and adults. Do unto children as you would have done unto yourself. Your kids are going to notice your bullshit and it will never fly. Don't play games with your kids, try to be real. Often neurodivergent kids have an uncanny ability to unmask our subterfuge as parents. Be able to deal when they do.

If their behavior affects you, let them know. If you need space, say so. If you need something from them because you are scared or vulnerable, don't hide behind bluster or authority. Often a straight and honest explanation of the need for something, especially if it is personal for you, will be all they need to hear to comply. Give them all the information it is safe for them to have about why things are necessary to be done, and let them decide how to work with you to resolve the problems you face as a family and as individuals in that family.

Parents can negotiate with their children just like with anyone else. The older they get the easier and more effective this strategy becomes. Keep on trying to implement it as soon as possible until it starts working.

Know yourself, and embrace your roots
Knowing where you come from is as important as knowing where you are going. In fact, the one cannot proceed without the other. Understanding yourself, and your family roots help you make better decisions about how to go forward. Children without roots cannot anchor themselves and stand tall. Learn about your past and your history.

Share your culture and your identity with your child from a young age. Always remember that your child will be the maker of the new world you will spend your old age in. Teach them about the beautiful things you want to preserve in your world, and how to build beautiful worlds, and how to be beautiful people. You do so by teaching yourself first, and then showing them what you've learned by example. Learn first to be an ambassador for your own people, a leader, and do them proud, then teach your child about the sort of people they come from with pride.

Trust yourself

I have been taught that success is a combination of Chutzpah and Humility: Having the nerve to speak your truth, the humility to know you don't hold the whole truth in yourself. As a parent, you're going to need to find the Chutzpah to stand up to the whole wide world and draw a ring around your child's mental, emotional and physical safety. But you will also have to bring the humility to know that the only person who knows your child through and through is YOUR CHILD.

Get them in on this whole endeavor of rearing them. they are the primary stakeholder in this project after all, and they deserve a voice about the goals and outcomes the project aims to achieve. Even if the only decision they can make right now is whether or not to let their carrots touch their mash, let them have those decisions as far as it is possible to do so. They need that practice to learn to trust themselves in making decisions in the future.

Being given that freedom (and the opportunity to learn from our consequences) teaches us to be wiser and smarter. So give them that freedom as soon as you can. And never forget to give that freedom to yourself. Like. NOW. Start now to decide to make your OWN way going forward. The choice is YOURS.

by Whizper ( at 26 September 2018 09:17 PM

24 September 2018

Christel Breedt (Pirogoeth)

Treating Sensory Sensitivities with cheap supplements/lifestyle changes

Treating Sensory Sensitivities with cheap supplements/lifestyle changes
Today someone asked me a question about this in my autism group, and I didn't know how to easily answer it. I have this wild jumble of things in my head but no simple reply. I decided to write up something proper as my reply!

The thing is, many kinds of SPD are actually a result of certain physiological issues at a cellular level. 

Treating these issues with off the shelf really fairly cheap supplements can offer rapid relief at a fraction of the cost of other treatments. The catch?

Because there are so many different possible kinds of issues that need to be looking for it can be hard to know where to begin. This is because the chemistry of these problems look a little something like THIS:

First of all, one must grasp that sensory sensitivities are caused by misfirings or misprocessing within the brain or the nervous system. Many of these processes depend on ion pathways that operate across the cellular walls. Sometimes that pathway is dysfunctional in those with sensory sensitivity due to any number of factors, genetics, illness, and diet being notable factors.

When these problems occur due to a genetic proclivity towards such problems, they are known as ion-channelopathies

The issues lead to intracellular or extracellular deficiencies of potassium, magnesium, calcium, sodium or other needed ionic substances (see illustration above). Of these Potassium and magnesium deficiencies appear to be the most common in the autistic community.

Because of the codependence of Potassium on Magnesium, and Magnesium with Calcium and all of their entanglement with Sodium ( and a host of other substances too numerous to mention here) the others are often also not being absorbed or used as they should and may be out of balance. All kinds of drama ensues, so resolving this problem can often really support a lot of different health problems people didn't even originally connecto to sensory processing problems.

Many of autistic people's "weird" behaviours are actually ways of self-medicating these issues...but more on that later on in this piece.

How do we treat this thing?

Treatment consists of multiple steps. The first acute managment is through direct supplementation with the substances you are deficient in.

Secondary management involves dietary changes to address the poor ion channels and any other health issues that are contributing to the problem. Often a good supplement to take is an omega fatty acid supplement or adding coconut oil to your diet as this improves the structural integrity of the ion channels themselves as they are made of fatty acids.

Lastly exacerbating factors need to be addressed to support the weak ion channels, as direct supplementation is often of limited long-term efficacy, and must give way to more individualised management later on.  Examining your health and habits, in general, will be important. Lifestyle adjustments will need to be made that go beyond just diet or supplementation.

What's going on in there?

I am bad at this bit, but my friend Tania explains it better than I can using the example of our friend Benjine who first discovered these connections and brought them to our attention. She has a video about this HERE.

The long and the short of it is that you have problems with your nervous system as a result of your voltage gated ion channels being broken and you need to streamline the efficiency of this system to improve it's function. This can be done through diet, and through reducing "drag on the system in the form of other health problems that make the issue worse.

Managing other health issues that exacerbate symptoms: 

Some conditions that are involved in aggravating these issues are inflammatory or immune-mediated disorders like Endometriosis, Mast Cell activation disorders, or rheumatoid arthritis. This is due to the relationship between inflammation and it's effect on the cell's signaling and function.

Addressing the source of the inflammation must always be part of management. For those who have comorbid chronic illnesses like Mast Cell Activation Syndrome or Endometriosis, a broader program of management will be needed to control the issue, which will include management of inflammatory markers through dietary adaptations or supplements as well as other lifestyle alterations and treatments targeted at treating the underlying conditions. For those not familiar this is stuff like anti inflammatories, anti histamines, or allergy avoidance diets etc.

But be mindful that direct treatment with anti inflammatories like COX 2 inhibitors can cause bigger issues further on down the road. For more detailed information visit for a long discussion of complications that can arise due to inflammation and the impact of superoxides on the health of cells.

In these situations the work of my friend Benjine Gerber at comes into play - this website explores more deeply the relationship between inflammation and sensory issues. Since it is too much to cover here, I'll go into it another day, but keep in mind that making sure you have an ample supply of antioxidant-rich food in your diet is a good plan, and bumping up your arginine content might also be useful. Certain anti-inflammatory foods and foods with a low histamine content may also benefit many with these problems.

Here I'll pop in a note to those with gut problems that your gut issues may contribute to this, and on another day I'll do another post talking about salicylate and oxylate intolerances and how they tie into these issues....but that's another talk :)

Meditation is an important part of any management program for almost all health issues, and in this case, can make the difference between long-term success or failure, so don't keep meaning to take it up, start watching some videos by Tara Brach (my personal guru) TODAY.

How to know if you have an issue:

Those in the autism community frequently show a particular pattern of issues, and it's so common that anyone experiencing sensory sensitivities aught to try this out.

 We have a good shorthand first-line option for this that usually works for most (but not all) people. We normally start on a course of Trisalts or Multiforce alkaline powders for immediate relief within two or three days.

If you want to get testing beforehand, a blood test to assess your deficiencies in these substances may be useful, but be warned that intracellular potassium deficiencies cannot be detected by blood tests. As an example, I'll talk specifically about potassium/magnesium deficiencies.

Symptoms are: 

1. Fatigue, difficulty with sleep
2. Weakness, loss of muscle tone, spasticity, fasciculations
3. May be involved with blood sugar dysregulations ie. hypoglycemia
4. Muscle cramps, aching, stiffness and tenderness, touch sensitivity
5. Tingling or burning in the hands and feet, numbness, need to move, restless leggs.
6. Loss of coordination (if severe can lead to ataxia and paralysis)
7. Digestive problems, gastroparesis, gut cramping, upset tummy or constipation
8. Heart palpitations, feelings of anxiety
9. Difficulty breathing, "forget" to breathe, "weight on chest", poor circulation
10. Moodiness and emotional dysregulation
11. Light or sound sensitivities.

To recap: 

Step 1:Supplement with
 Tri-salts or Multiforce for about two weeks to establish if this benefits you. Other options include taking potassium supplements directly, such as switching to "low salt" (usually a potassium-based salt substitute) or take magnesium supplements directly, or bathe in Epsom salts regularly and take potassium tablets. Some people respond poorly to certain types of magnesium formulas or Epsom salts so your mileage may vary.

Step 2: Isolate the underlying cause of exacerbating issues such as inflammation, or gut problems etc., and address them. Figure out if you have one of the common dietary sensitivities oxalate intolerance which can markedly aggravate sensory issues. Learn about dietary support for inflammation at

Step 3:
Supplement with fatty acids to make cell walls supple. Coconut oil is good too, or flax seed, oily know the drill.

Step 4: Lifestyle changes to reduce stress such as reducing your commitments, getting supports or accommodations, changing careers etc. And MEDITATE. There's a joke Benjine makes about people who make you angry: "Don't let them steal your potassium!" Learning to be more relaxed, mindful and zen will reduce your sensory issues, I PROMISE :P

That's all! I hope this helps.


by Whizper ( at 24 September 2018 04:12 PM

20 June 2018

Jonathan Carter (highvoltage)

Plans for DebCamp18


I’m going to DebCamp18! I should arrive at NCTU around noon on Saturday, 2018-07-21.

My Agenda

  • DebConf Video: Research if/how MediaDrop can be used with existing Debian video archive backends (basically, just a bunch of files on http).
  • DebConf Video: Take a better look at PeerTube and prepare a summary/report for the video team so that we better know if/how we can use it for publishing videos.
  • Debian Live: I have a bunch of loose ideas that I’d like to formalize before then. At the very least I’d like to file a bunch of paper cut bugs for the live images that I just haven’t been getting to. Live team may also need some revitalization, and better co-ordination with packagers of the various desktop environments in terms of testing and release sign-offs. There’s a lot to figure out and this is great to do in person (might lead to a DebConf BoF as well).
  • Debian Live: Current live weekly images have Calamares installed, although it’s just a test and there’s no indication yet on whether it will be available on the beta or final release images, we’ll have to do a good assessment on all the consequences and weigh up what will work out the best. I want to put together an initial report with live team members who are around.
  • AIMS Desktop: Get core AIMS meta-packages in to Debian… no blockers on this but just haven’t had enough quite time to do it (And thanks to AIMS for covering my travel to Hsinchu!)
  • Get some help on ITPs that have been a little bit more tricky than expected:
    • gamemode – Adjust power saving and cpu governor settings when launching games
    • notepadqq – A linux clone of notepad++, a popular text editor on Windows
    • Possibly finish up zram-tools which I just don’t get the time for. It aims to be a set of utilities to manage compressed RAM disks that can be used for temporary space, compressed in-memory swap, etc.
  • Debian Package of the Day series: If there’s time and interest, make some in-person videos with maintainers about their packages.
  • Get to know more Debian people, relax and socialize!

by jonathan at 20 June 2018 08:32 AM

11 June 2018

Graham Poulter (verdant)

How to spring-clean your blog

(spring-cleaning your blog)
Here are ways I found to clean up a Blogger blog. I've found and fixed many things with content, images, navigation, theme, descriptions, and analytics. [4 minutes]

Spring-Cleaning Steps

Clean up the content

  • Remove old posts: delete old posts with no traffic and no usefulness to readers (some were Facebook-update type posts, from before Facebook was a thing). Also delete the comments.
  • Use headings: create proper headings and subheadings, since Blogger added support.
  • Remove cruft: remove broken links, outdated information and unhelpful asides.
  • Enhance clarity: clean up rambling bits, convert list-like paragraphs to bullets, add bold titles to bullets to aid readers in skimming the post.
  • Clean HTML: remove extra HTML elements that crept in over time, to be tidy.
  • Remove blank paragraphs: removing random white space improves post appearance.
  • Add read times: add [5 minutes] etc time estimates to help readers decide.
Some old posts I edited so extensively that I could republish them as new and redirect from the old URL, but I haven't bothered with that.

Clean up the images

  • Replace hotlinks: replace hotlinks with Blogger uploads of the images. Also helps prevent http resource on https page.
  • Design images: using Adobe Spark to create post images, it can dynamically reshape the image for each social network.
  • Replace old images: really old images may look low-res on new monitors, so pick a higher-resolution image.
  • Alt text: add a text description of the image. It overrides the page title for Pinterest description. Warning that if you don't set a Search Description (meta tag), description comes from first 140 characters of the post, which includes alt text from heading images.
  • Title text: optionally add text to show up on mouse-over. It overrides both page title and alt text to be the image description on Pinterest.

Clean up the navigation

  • Revise titles: rework post titles be more direct (8-12 words, under 60 characters) using one or more key phrases from top organic searches.
  • Make intro concise: write intro paragraph under 200 characters to avoid truncation in mobile post list or Pinterest description. Each sentence must be under 140 characters to avoid truncation when used in search result snippets or social shares.
  • Add Search Descriptions: enable under Settings:Search Preferences:Meta Description. Then add a Search Description to each post based off the 200-character intro.
  • Use broad labels: re-label using only a few categories, a category for each major audience, each post in 1 or 2 categories only.
  • Add internal links: add internal links to other posts a reader of this post might be interested in.

Clean up the blog

  • Pick theme: change from Contempo to Notable since images are not important in my posts.
  • Tweak timestamps: I removed the year from dates shown on the blog. My posts are so old 👴
  • Revise blog description: rewritten to sound better when sharing blog on social media.
  • Enable comments: switch from Google+ comments to Blogger comments, since commenting dropped off radically under Google+.
  • Tune AdSense fill rate: reduce fill rate from 60% to 5% to show fewer ads. I'm just playing with AdSense, only made €15 in 5 years anyway.

Clean up your discoverability

  • AdWords: run a campaign for niche posts that aren't ranking yet, with custom redirects for a short URL for the ad.
  • Set up HTTPS: enable HTTPS by default and HTTPS redirection.
  • Webmaster Tools: added https:// domain and sitemap.xml to Google Webmaster Tools, also register with Bing Webmaster Tools.
  • Google Analytics: add filter to exclude referrals from spam domains ("Campaign Source" filter), and exclude "m" in "Exclude URL Query Parameters" on the view, so you don't have two rows for each page.
  • Sharing + Follow Buttons: add proper sharing and follow buttons as Blogger built-in ones aren't great. Right now using Shareaholic with all the tracking and advertising crud turned off.

Things I should do

  • Social sharing: I should actually share my posts on Twitter, Facebook, Pinterest and Google+.
  • Pinterest Images: for Pinterest, best images have post title and nice photo, often a portrait.
  • Respond to comments: Many old comments I never replied to. I should spare time to reply to people soon after they comment.
  • Podcasts / Videos: I want to try creating companion podcasts and videos, now that it's much easier to create rich media with decent video and sound quality than a few years ago.

Q & A

Why the cleanup effort? After letting the blog languish for 5 years I checked Analytics and found it was getting a few hundred hits a month to a few popular posts. I'd recently started playing with AdWords out of interest, and began to see the blog from a whole new perspective of internet advertising, though I don't expect to make any money from it. So, I decided to clean things up.

What's the blog topic? There's no topic 😔 I post informational content - summaries, how-to's, reviews - on a wide range of subjects with mostly non-overlapping audiences. Wide-ranging helpful blogs do not gain a loyal followers, unlike niche-topic blogs or entertaining blogs. Were I more serious about wasting my time on blogging I'd have separate blogs on sub-domains for "books", "tech" and "lifestyle", instead of just labels.

Where do you get traffic? Mostly organic search for low-competition key phrases, and some referrals from attribution links for some of the how-to's. I usually write "niche posts" (not like this one) when I can't find what I want online, then I figure it out and post about, then other people find my post.

What'll you be doing next? I'm hoping to do more book summaries. Literature reviews were my strong point in academia. Probably mixing in random how-to's, but unlikely to be highly technical like some of the old ones (use only in-house tools now). I do want to try embedding companion podcasts into some posts.

P.S. After you've decluttered your blog, try decluttering your home with the outbox method.

Any more advice for cleaning up the blog? Drop me a comment.

by Graham Poulter ( at 11 June 2018 08:27 PM

28 May 2018

Graham Poulter (verdant)

How to extend the life of your clothes

How to extend the life of your clothes
Here are some tips on preserving your clothes! Ways to make the wash easier on the clothes, and increase the number of wears one can get between washes. [3 minutes]

Reduce the wear of washing

1. Wash clothes in laundry nets

Mesh laundry nets stop socks getting lost - they're all in a bag - and shield clothes from most of the friction-wear of laundering.

2. Choose the delicate wash cycle

The delicate cycle causes the least heat and friction damage. If animal fibers such as wool thermals are in the wash, use a non-bio detergent since the enzymes of bio detergents eat the proteins. Wool jumpers of course wash by hand with wool detergent.

3. Dry clothes on an airing rack

Air-drying causes less wear than tumble drying. The tumble-dried sheets and towels have visible wear over time.

Get more wears per wash

4. Air clothes on a rail after use

Airing worn clothes on a rail allows odors to disperse. One can cycle between shirts, with worn shirts airing on the rail instead of retaining odors in the wardrobe.

5. Air clothes outdoors

If otherwise clean pants or jackets fail the sniff test say due to spending the evening in a bar or restaurant, airing them outside for a day or two likely restores them without washing. Winter coats go years without dry-cleaning if aired properly.

6. Keep shoes on a shoe rack

Using a shoe rack keeps the smells of the city near the door instead of in the wardrobe, and helps keep the floor clean.

7. Shower in the evening

By showering in the evening the bed sheets can go 3 or even 4 weeks before feeling like they need a change. Showering in the morning, expect to wash the sheets every week.

Bonus tip: Down Jackets

Down jackets can be washed once a year after the cold season, with down detergent on a woolen cycle, then dried flat on an airing rack. To remove clumps from the down, follow with a 20-minute delicate-cycle tumble dry with tennis balls.


What do you think of these ways of making clothes last longer? Less wear from washing, more wears between washes. If you disagree or have more tips, comment below.

P.S. check out my my advice for removing smoke smells from waterproof jackets and decluttering your home with the outbox method.

by Graham Poulter ( at 28 May 2018 10:13 PM

16 May 2018

Jonathan Carter (highvoltage)

Video Channel Updates

Last month, I started doing something that I’ve been meaning to do for years, and that’s to start a video channel and make some free software related videos.

I started out uploading to my YouTube channel which has been dormant for a really long time, and then last week, I also uploaded my videos to my own site, It’s a MediaDrop instance, a video hosting platform written in Python.

I’ll still keep uploading to YouTube, but ultimately I’d like to make my self-hosted site the primary source for my content. Not sure if I’ll stay with MediaDrop, but it does tick a lot of boxes, and if its easy enough to extend, I’ll probably stick with it. MediaDrop might also be a good platform for viewing the Debian meetings videos like the DebConf videos. 

My current topics are very much Debian related, but that doesn’t exclude any other types of content from being included in the future. Here’s what I have so far:

  • Video Logs: Almost like a blog, in video format.
  • Howto: Howto videos.
  • Debian Package of the Day: Exploring packages in the Debian archive.
  • Debian Package Management: Howto series on Debian package management, a precursor to a series that I’ll do on Debian packaging.
  • What’s the Difference: Just comparing 2 or more things.
  • Let’s Internet: Read stuff from Reddit, Slashdot, Quora, blogs and other media.

It’s still early days and there’s a bunch of ideas that I still want to implement, so the content will hopefully get a lot better as time goes on.

I have also quit Facebook last month, so I dusted off my old Mastodon account and started posting there again:

You can also subscribe to my videos via RSS:

Other than that I’m open to ideas, thanks for reading :)

by jonathan at 16 May 2018 06:19 PM

24 December 2017

Jonathan Carter (highvoltage)

Hello, world! – Welcome to my Linux related videos

I’ve been meaning to start a video channel for years. This is more of a test video than anything else, but if you have any ideas or suggestions, then don’t hesitate to comment.

by jonathan at 24 December 2017 06:13 PM

22 November 2017

Graham Poulter (verdant)

The keys to doing long-form Narrative Improv

"Do it Now" book cover
Here are some key ingredients for full-length improvised plays known as Narrative Improv. Providing tips on story structure, normalcy, the protagonist, consequences and clarity. [4 minutes]

In Narrative Improv the group creates a full-length play with a more-or-less coherent story that runs all the way through from "once upon a time" through to the "happily ever after" (or not so happily). It's a flexible form that stands in contrast to both highly structured forms like the Armando or Harold, and to the unstructured "montage" improv of possibly-connected scenes with once-off characters.

The following tips are summarised from the excellent little book, Do It Now: Essays on Narrative Improv by Parallelogramophonograph ("Pgraph" for short), especially the "What comes next?" conclusion on page 73:

1. Build the story spine

The story spine is a generic story structure: "Once Upon A Time ... And Every Day ... Until One Day ... And Because Of That ... And Because Of That (repeat to taste) ... Until Finally ... And Ever Since Then". Virtually any plot can be arranged or rearranged into a story spine form, and you can practice making story spines in a group exercise where each person, in turn, adds an element to the story.

2. Invest in normalcy

It's almost impossible to spend too much time on the "once upon a time ... and every day" part of the show where everything that happens is stuff that always happens. Even if two characters start in a sword fight, that's just something they do every day. Normalcy builds the world, the characters, the relationships. Take up multiple scenes, a large fraction of your show, just showing different parts of the everyday world of these people. If someone brings in the plot too soon just act like their proposed plot is something that happens all the time. One day, when the "One Day" finally happens, you will have loads of material to work with!

3. Identify the protagonist

Around the "Until One Day" point, different characters will be making offers of goals and desires. As a group, you gradually home in with a "spotlight" on different characters to settle on one with a strong offer, who will become the protagonist for the rest of the story. Give the protagonist a strong and simple desire - even if it's just to get their rug back (it really tied the room together!). Then the rest of the story becomes scenes that either help or hurt the protagonist in pursuit of their goal.

4. Make scenes have clear consequences

More than "making bold choices", by giving actions and scenes clear, strong consequences, the "And Because Of That" will come naturally, and you get a feel for where the story is going. This frees you from "oh no, where are we going?" scrambling for the next step, giving you space to have playful moments in your scenes.

5. Be clunky but clear

Be overt and clear about the details of scenes and relationships, particularly early in your group's development. It's the opposite of being vague and hoping that the others figure out what you're getting at or fill in the gaps. "My dear brother Kevin, what a dank cave this is!" comes out clunky but makes the relationship and location clear! Subtlety will develop over time.

6. Use a range of acting styles and tones

Deliberately try out new genres, and new acting styles from everyday realism, to stage realism, to over-the-top stylized acting. Try out new character tropes from movies and theatre. These deepen your stories and make your shows distinct, taking your improv to new places.

Conclusion: PGraph advise us to "play, practice, enjoy getting it horribly wrong - that's how you learn! -and revel in getting it right." I hope this taste inspires you to get the book or take the class on Narrative Improv!

P.S. I bought and read "Do It Now" as preparation for a 6-week class on Narrative Improv facilitated by Neil Curran of Lower The Tone, and have no affiliation with Parallelogramophonograph.

Do you have some advice to share on doing Narrative Improv? Comment below!

by Graham Poulter ( at 22 November 2017 09:49 PM

08 August 2017

Adrian Frith (htonl)

Linguistic diversity map of South Africa

The linguistic diversity index measures the probability that two people selected at random from a population speak different home languages. The map below, which I produced, depicts the linguistic diversity index calculated on a 10-kilometre-wide hexagonal grid across South Africa.

A map of South Africa showing the linguistic diversity index calculated on a 10-kilometre-wide hexagonal grid Linguistic diversity; click to enlarge

08 August 2017 10:00 PM

25 September 2016

Michael Gorven (cocooncrash)

XBMC for Raspberry Pi

This page describes how to install XBMC on a Raspberry Pi running Raspbian. You can either install packages on an existing Raspbian installation, or you can download a prebuilt image and flash it to an SD card.

Installing packages on an existing installation

I've published a Debian archive containing packages for Kodi/XBMC and some dependencies which it requires. This can be setup on an existing Raspbian installation (including the foundation image).


The easiest way to install the package is to add my archive to your system. To do this, store the following in /etc/apt/sources.list.d/mene.list:

deb wheezy contrib

and import the archive signing key:

sudo apt-key adv --keyserver --recv-key 5243CDED

Then update the package lists:

sudo apt-get update

You can then install it as you would with any other package, for example, with apt-get:

sudo apt-get install kodi

The user which you're going to run Kodi as needs to be a member of the following groups:

audio video input dialout plugdev tty

If the input group doesn't exist, you need to create it:

addgroup --system input

and setup some udev rules to grant it ownership of input devices (otherwise the keyboard won't work in Kodi), by placing the following in /etc/udev/rules.d/99-input.rules:

SUBSYSTEM=="input", GROUP="input", MODE="0660"
KERNEL=="tty[0-9]*", GROUP="tty", MODE="0660"

The GPU needs at least 96M of RAM in order for XBMC to run. To configure this add or change this line in /boot/config.txt:


You will need to reboot if you changed this value.


To run XBMC, run kodi-standalone from a VT (i.e. not under X). XBMC accesses the display directly and not via Xorg.

If you want Kodi to automatically start when the system boots, edit /etc/default/kodi and change ENABLED to 1:


Run sudo service kodi start to test this.

Release history

  • 15.2-2: Isengard 15.2 release, and most PVR addons.
  • 14.2-1: Helix 14.2 release.
  • 14.1-1: Helix 14.1 release.
  • 14.0-1: Helix 14.0 release.
  • 13.1-2: Link to libshairplay for better AirPlay support.
  • 13.1-1: Gotham 13.1 release.
  • 12.3-1: Frodo 12.3 release.
  • 12.2-1: Frodo 12.2 release.
  • 12.1-1: Frodo 12.1 release. Requires newer libcec (also in my archive).
  • 12.0-1: Frodo 12.0 release. This build requires newer firmware than the archive or image contains. Either install the packages from the untested archive, the twolife archive or use rpi-update. (Not necessary as of 2013/02/11.)

Flashing an SD card with a prebuilt image

I've built an image containing a Raspbian system with the XBMC packages which you can download and flash to an SD card. You'll need a 1G SD card (which will be completely wiped).


Decompress the image using unx:

% unxz raspbian-xbmc-20121029.img.xz

And then copy the image to the SD card device (make sure that you pick the correct device name!)

% sudo cp xbmc-20121029-1.img /dev/sdb


The image uses the same credentials as the foundation image, username "pi" and password "raspberry". You can use the raspi-config tool to expand the root filesystem, enable overclocking, and various other configuration tasks.


Both Raspbian and Kodi can be updated using normal Debian mechanisms such as apt-get:

# sudo apt-get update
# sudo apt-get dist-upgrade

Release history

Unstable versions

I've started building packages for the upcoming Jarvis release. These are in the new unstable section of the archive. To install these packages update your source list to look like this:

deb wheezy contrib unstable

Release history

  • 16.1-1: Jarvis 16.1
  • 16.0-1: Jarvis 16.0
  • 16.0~git20151213.a724f29-1: Jarvis 16.0 Beta 4
  • 15.2-2: Isengard 15.2 with packaging changes to support PVR addons, and most PVR addons.
  • 15.2-1: Isengard 15.2
  • 15.1-1: Isengard 15.1
  • 15.0-1: Isengard 15.0
  • 15.0~git20150702.9ff25f8-1: Isengard 15.0 RC 1.
  • 15.0~git20150501.d1a2c33-1: Isengard 15.0 Beta 1.
  • 14.2-1: Helix 14.2 release.
  • 14.1-1: Helix 14.1 release.
  • 14.0-1: Helix 14.0 release.
  • 14.0~git20141203.35b4f38-1: Helix 14.0 RC 2
  • 14.0~git20141130.ea20b83-1: Helix 14.0 RC 1
  • 14.0~git20141125.4465fbf-1: Helix 14.0 Beta 5
  • 14.0~git20141124.ec361ca-1: Helix 14.0 Beta 4
  • 14.0~git20141116.88a9a44-1: Helix 14.0 Beta 3
  • 14.0~git20141103.d6947be-1: Helix 14.0 Beta 1. This requires firmware as of 2014/10/06 and libcec 2.2.0 (both included in the archive). There are also builds for Jessie but I haven't tested them. PVR addons are also updated.
  • 14.0~git20141002.d2a4ee9-1: Helix 14.0 Alpha 4

by mgorven at 25 September 2016 04:54 AM

06 January 2016

Michael Gorven (cocooncrash)

Memory optimised decompressor for Pebble Classic

TLDR: DEFLATE decompressor in 3K of RAM

For a Pebble app I've been writing, I need to send images from the phone to the watch and cache them in persistent storage on the watch. Since the persistent storage is very limited (and the Bluetooth connection is relatively slow) I need these to be as small as possible, and so my original plan was to use the PNG format and gbitmap_create_from_png_data(). However, I discovered that this function is not supported on the earlier firmware used by the Pebble Classic. Since PNGs are essentially DEFLATE compressed bitmaps, my next approach was to manually compress the bitmap data. This meant that I needed a decompressor implementation ("inflater") on the watch.

The constraint

The major constraint for Pebble watchapps is memory. On Pebble Classic apps have 24K of RAM available for the compiled code (.text), global and static variables (.data and .bss) and heap (malloc()). There is an additional 2K for the stack (local variables). The decompressor implementation needed to have both small code size and variable usage. I discovered tinf which seemed to fit the bill, and tried to get it working.

Initially, trying to decompress something simply crashed the app. It took some debug prints to determine that code in tinf_uncompress() wasn't even being executed, and I realised that it was exceeding the 2K stack limit. I changed the TINF_DATA struct to be allocated on the heap to get past this. At this stage it was using 1.2K of .text, 1.4K of .bss, 1K of stack, and 1.2K of heap (total 4.8K). I set about optimising the implementation for memory usage.

Huffman trees

Huffman coding is a method to represent frequently used symbols with fewer bits. It uses a tree (otherwise referred to as a dictionary) to convert symbols to bits and vice versa. DEFLATE can use Huffman coding in two modes: dynamic and fixed. In dynamic mode, the compressor constructs an optimal tree based on the data being compressed. This results in the smallest representation of the actual input data; however, it has to include the computed tree in the output in order for a decompressor to know how to decode the data. In some cases the space used to serialise the tree negates the improvement in the input representation. In this case the compressor can used fixed mode, where it uses a static tree defined by the DEFLATE spec. Since the decompressor knows what this static tree is, it doesn't need to be serialised in the output.

The original tinf implementation builds this fixed tree in tinf_init() and caches it in global variables. Whenever it encounters a block using the fixed tree it has the tree immediately available. This makes sense when you have memory to spare, but in this case we can make another tradeoff. Instead we can store the fixed tree in the same space used for the dynamic tree, and rebuild it every time it is needed. This saves 1.2K of .bss at the expense of some additional CPU usage.

The dynamic trees are themselves serialised using Huffman encoding (yo dawg). tinf_decode_trees() needs to first build the code tree used to deserialise the dynamic tree, which the original implementation loads into a local variable on the stack. There is an intermediate step between the code tree and dynamic tree however (the bit length array), and so we can borrow the space for the dynamic instead of using a new local variable. This saves 0.6K of stack.

The result

With the stack saving I was able to move the heap allocation back to the stack. (Since the stack memory can't be used for anything else it's kind of free because it allows the non-stack memory to be used for something else.) The end result is 1.2K of .text, 0.2K of .bss and 1.6K of stack (total 3.0K), with only 1.4K counting against the 24K limit. That stack usage is pretty tight though (trying to use app_log() inside tinf causes a crash) and is going to depend on the caller using limited stack. My modified implementation will allocate 1.2K on the heap by default, unless you define TINF_NO_MALLOC. Using zlib or gzip adds 0.4K of .text. You can find the code on bitbucket.

by mgorven at 06 January 2016 06:28 AM

31 October 2015

Adrian Frith (htonl)

Historical topographic maps of Cape Town

I’ve made an interactive website with six sets of topographic maps of Cape Town and surrounds covering the period from 1940 to 2010. You can zoom in and move around the maps, switching from one era to another.

31 October 2015 11:00 PM

03 October 2015

Simon Cross (Hodgestar)

Where to from here?

Closing speech at the end of PyConZA 2015.

We’ve reached the end of another PyConZA and I’ve found myself wondering: Where to from here? Conferences generate good idea, but it’s so easy for daily life to intrude and for ideas to fade and eventually be lost.

We’ve heard about many good things and many bad things during the conference. I’m going to focus on the bad for a moment.

We’ve heard about imposter syndrome, about a need for more diversity, about Django’s flaws as a web framework, about Python’s lack of good concurrency solutions when data needs to be shared, about how much civic information is locked up in scanned PDFs, about how many scientists need to be taught coding, about the difficulty of importing CSV files, about cars being stolen in Johannesburg.

The world is full of things that need fixing.

Do we care enough to fix them?

Ten years ago I’d never coded Python professionally. I’d never been to a Python software conference, or even a user group meeting.

But, I got a bit lucky and took a job at which there were a few pretty good Python developers and some time to spend learning things.

I worked through the Python tutorial. All of it. Then a few years later I worked through all of it again. I read the Python Quick Reference. All of it. It wasn’t that quick.

I started work on a personal Python project. With a friend. I’m still working on it. At first it just read text files
into a database. Slowly, it grew a UI. And then DSLs and programmatically generated SQL queries with tens of joins. Then a tiny HTML rendering engine. It’s not finished. We haven’t even released version 1.0. I’m quietly proud of it.

I wrote some games. With friends. The first one was terrible. We knew nothing. But it was about chickens. The second was better. For the third we bit off more than we could chew. The fourth was pretty awesome. The fifth wasn’t too bad.

I changed jobs. I re-learned Java. I changed again and learned Javascript. I thought I was smart enough to handle
threading and tons of mutable state. I was wrong. I learned Twisted. I couldn’t figure out what deferreds did. I wrote my own deferred class. Then I threw it away.

I asked the PSF for money to port a library to Python 3. They said yes. The money was enough to pay for pizza. But it was exciting anyway.

We ported another library to Python 3. This one was harder. We fixed bugs in Python. That was hard too. Our patches were accepted. Slowly. Very slowly. In one case, it took three years.

Someone suggested I run PyConZA. I had no idea how little I knew about running conferences, so I said yes. I asked the PSF for permission. They didn’t know how little I knew either, so they said yes too. Luckily, I got guidance and support from people who did. None of them were developers. Somehow, it worked. I suspect mostly because everyone was so excited.

We got amazing international speakers, but the best talk was by a local developer who wasn’t convinced his talk would interest anyone.

I ran PyConZA three more times, because I wasn’t sure how to hand it over to others and I didn’t want it to not happen.

This is my Python journey so far.

All of you are at different places in your own journeys, and if I were to share some advice from mine, it might go as follows:

  • Find people you can learn from
    • … and make time to learn yourself
  • Take the time to master the basics
    • … so few people do
  • Start a project
    • … with a friend(s)
  • Keep learning new things
    • … even if they’re not Python
  • Failure is not going to go away
    • … keep building things anyway
  • Don’t be scared to ask for money
    • … or for support
    • … even from people who aren’t developers
  • Sometimes amazing things come from one clueless person saying, “How hard can it be?”
  • Often success relies mostly on how excited other people are
  • Stuff doesn’t stop being hard
    • … so you’re going to have to care
    • … although what you care about might surprise you.

Who can say where in this complicated journey I changed from novice, to apprentice, to developer, to senior
developer? Up close, it’s just a blur of coding and relationships. Of building and learning, and of success and

We are all unique imposters on our separate journeys — our paths not directly comparable — and often wisdom seems largely about shutting up when one doesn’t know the answer.

If all of the broken things are going to get fixed — from diversity to removing the GIL — it’s us that will have to fix them, and it seems unlikely that anyone is going to give us permission or declare us worthy.

Go build something.

by admin at 03 October 2015 03:05 PM

17 September 2015

Brendan Hide (Tricky)

Setting up MikroTik QoS – for Home/Small Office – Part 1

  • Part 1 – Introduction – Setting up Simple Queues (This post)
  • Part 2 – Reliably Identifying traffic – Setting up Mangle Rules (Coming Soon TM)
  • Part 3 – Priorities and Limits – Setting up Queue Trees (Coming Soon TM)
  • Part 4 – Monitoring Usage – Redefining Queues – Limiting Abusive Devices (Coming Soon TM)
  • Part 5 – ??? Profit ???


The first problem one usually comes across after being tasked with improving an Internet connection is that the connection is overutilised. Typically nobody knows why, who, or what is causing the problem – except of course everyone blames the ISP. Sometimes it is the ISP – but typically you can’t prove that without having an alternative connection immediately available. I currently manage or help manage four “sites/premises” that use QoS to manage their Internet connectivity. One is my workplace, two are home connections, and the last one is a slightly variable one – usually just a home connection but alternatively, for a weekend every few months, it becomes a 140-man (and growing) LAN. Fun. 🙂

MikroTik and RouterOS

MikroTik‘s RouterOS is very powerful in the right hands. Many other routers support QoS but not with the fine-grain control MikroTik provides. Alternatively you could utilise other Linux-based router OS’s, such as DD-WRT, Smoothwall, Untangle, and so forth. Most of these typically require that you have a spare server lying about or a compatible hardware router. Mikrotik sells RouterBoards that have RouterOS builtin – and they are relatively inexpensive.

My experience with routers is primarily with Cisco and MikroTik – and my experience with QoS is primarily with Allot’s NetEnforcer/NetXplorer systems and MikroTik. The most popular MikroTik devices in my experience (other than their dedicated long-range wireless devices) have been their rb750 (new version named “hEX“) and rb950-based boards. They have many others available and are relatively inexpensive. In historical comparison with Cisco’s premium devices, I’ve tended to describe MikroTik’s devices as “90% the features at 10% the cost”. As this guide is aimed primarily at SME/Home use, inexpensive makes more sense. If you’re looking at getting a MikroTik device, note that MikroTik routers do not typically include DSL modems, thus your existing equipment is typically still necessary. Note also that this is not a tutorial on setting up a MikroTik device from scratch. There are plenty of guides available online for that already.

Theory into practice – first steps

To set up QoS correctly, you need to have an idea of a policy that takes into account the following:

  • The overall connection speed
  • How many users/devices will be using the connection
  • The users/devices/services/protocols that should be prioritised for latency and/or throughput

To achieve the above in my examples, I will assume the following:

  • The MikroTik is set up with the default network configuration where the local network is and the Internet connection is provided via PPPoE.
  • The connection speed is 10/2Mbps (10 Mbps download speed; 2 Mbps upload speed)
  • There will be 5 users with as many as 15 devices (multiple computers/tablets/mobile phones/WiFi etc)
  • Typical downloads require high priority with throughput but low-priority with latency
  • Gaming/Skype/Administrative protocols require high priority with both latency and throughput
  • No users are to be prioritised over others

The first and probably quickest step is to set up what RouterOS refers to as a Simple Queue.

I’ve made a short script that I have saved on my MikroTik devices to set up the simple queues. It is as follows:

:for x from 1 to 254 do={
 /queue simple add name="internet-usage-$x" dst="pppoe" max-limit=1900k/9500k target="192.168.88.$x"

What the above does is limit the maximum speed any individual device can use to “1900k” (1.9Mb) upload and “9500k” (9.5Mb) download.


  • The reason why the max limits are at 95% of the line’s maximum speed is that this guarantees no single device can fully starve the connection, negatively affecting the other users. With a larger userbase I would enforce this limit further. For example, with 100 users on a 20Mb service I might set this limit to 15Mb or even as little as 1Mb. This is entirely dependent on how “abusive” the users are and, as you figure out where and how much abuse occurs, you can adjust it appropriately.
  • The prefix “internet-usage” in the name parameter can be customised. Typically I set these to refer to the premises name. For example, with premises named “alpha” and “beta”, I will typically put “internet-alpha” and “internet-beta”. This helps with instinctively differentiating between sites.
  • The dst parameter has “pppoe” in the example. This should be substituted with the name of the interface that provides the Internet connection.

Ensure you customise the script to be appropriate to your configuration. Save the script to the MikroTik and run it – or paste it directly into the MikroTik’s terminal to execute it.

In my next post I will go over setting up what RouterOS refers to as Mangle rules. These rules serve to identify/classify the network traffic in order to make finer-grained QoS possible.


by Tricky at 17 September 2015 09:37 PM

Trust, Being in Control, Delegating that Trust, and Unexpected Heroes

Privacy, Time, Money

I don’t like debit orders. I’ve never liked the idea that another entity can, at will, take almost any amount of my money (well … whatever’s available). A colleague pointed out the issue with MTN would have been avoided had I been using a debit order. Maybe the “convenience” factor isn’t such a bad thing.

I suppose the penultimate question here is whether or not you want the convenience and can trust institutions (in this case with your money) – or if you can’t trust them and are willing to forgo that convenience. In my case, even though I still question the convenience, I learned the hard way with MTN that it doubly can be inconvenient to have your connected world reduced to “remote island” status. Almost everyone today goes with the convenience factor.


On the other hand, now a long time ago, I had a dispute with Planet Fitness where convenience was a double-edged sword. I reported their business practice to the Consumer Complaints Commission (since re-organised as the National Consumer Commission) and never got feedback from them. The gist of the issue is that Planet Fitness’s sales agent lied to me and a friend in order to get more commission/money out of my pocket.

I’m a Discovery Vitality member which gives many benefits, including reduced rates on Premium brands – mostly health-related of course, as Discovery is a Medical Aid/Health Insurance provider. To put it simply, Discovery is awesome. Vitality’s benefits cover gym memberships which further includes Planet Fitness. You still have to pay something, a small token of sorts, to Discovery, for the gym membership. But, after all, they WANT me to be healthy, so they don’t mind footing the bulk of the bill. But, apparently, this means Planet Fitness’ sales agents don’t get the commission!

So what does this result in? The result is that PF’s sales agent gave me an inflated figure for a “Vitality-based” membership. He lied. He then had me sign on the dotted line for an inflated price of a “regular” membership (yes, it was actually more than even a regular membership would have cost), ending up about 4 and 5 times as much as the Vitality-based membership.


Some time in 2011 I finally wisened up to the costs I was supposed to be paying. Discovery I am sure wouldn’t be too happy about this fiasco. I spoke to the Manager at the gym, and I was assured that the entire contract would be scrapped. I’m not one for violence … unless its for sport … in an Octagon … but after my 5th visit to the Manager to ask why the Debit Orders were still happening, he told me he was surprised I hadn’t brought weapons with me for the visit. After a few more visits, the Manager had actually left Planet Fitness and explained to me that the “contract” was between myself and Head Office and that the local gym, apparently a franchise-style operation, had little to no say about whether or not it could be cancelled. If Head Office said no, tough luck.

By this point I’d lost it. I had my bank put a stop to the debit orders. It was a huge schlep: I had to contact the bank every month because the debit order descriptions would change ever so slightly. It also cost me a little every couple of months to “reinstate” the blocking service. I can’t help but think the banking system supports regular expressions but the staff don’t necessarily know how to use it.

Technically I’m still waiting on the CCC to get back to me (never happened – and of course they were re-organised as mentioned above so the case probably fell through the cracks). Of course, by that point PF also wanted to blacklist me for not paying!

The Unexpected Hero

A haphazard mention of the issue to Discovery (I think I called them about a dentist visit) resulted in a callback by one of Discovery’s agents. They then asked me to describe the problem, in detail and in writing, to better explain from my perspective what had really happened. I obliged. It turns out I was right about them not being “too happy” about it. In fact they really didn’t like it. About three weeks later, Planet Fitness refunded me in FULL for all monies that had ever been paid to them.

Discovery is Awesome. 🙂


by Tricky at 17 September 2015 07:55 PM

16 August 2015

Simon Cross (Hodgestar)

So what is this roleplaying thing anyway?

I ran a roleplaying module [1] for some friends from work and after initially neglecting to explaining what roleplay is, I wrote this:

Roleplaying is a form of collaborative storytelling — a group of people gathering to tell a story together. This broad definition covers quite a range of things — one can tell very different kinds of stories and collaborate in very different ways.

What I’m planning to run is called “tabletop roleplaying” [2]. The stories told centre around a group of characters (the protagonists in a movie). Each person playing is in charge of one of these main characters, except for one person who has no character and instead handles everything that isn’t one of the main characters (they are a bit like the director of a movie).

Tabletop roleplaying is a little like a radio drama — almost everything is done by narrating or speaking in character. You’ll be saying things you want your character to say and describing the actions you want your character to take. Light acting, such as putting on accents or changing tone of voice or changing posture, can be quite fun, but is by no means a requirement.

The “director”, also called the “storyteller” or “DM” [3], describes the situations the main characters find themselves in, decides on the consequences of their actions and takes on the role of minor supporting characters and antagonists (often villains, because they’re exciting). The storyteller is also an arbitrator and a facilitator and attempts to maintain consensus and suitable pacing of the story.

Often you’ll want to have your character attempt an action that might not succeed [4]. For example, they might want to shoot a villain, charm their way past a bouncer, pick a lock or run across a burning bridge. In some cases success will be more likely than others. A character who is good looking or persuasive might find charming the bouncer easy. A character who has never picked up a gun might find shooting the villain hard.

The set of rules used to determine success or failure is called “the system”. The rules might be as simple as “flip a coin” or they might take up a whole book [5]. Dice are a commonly used way of randomly determining results with high numbers typically indicating more successful outcomes and lower numbers less successful ones.

Since the real world is very very complicated, the rules usually model different aspects of it in varying degrees of detail and this often sets the tone of the story to some extent. For example, a system for telling stories about bank robbers in the 1920s might have very detailed rules on vault locks, while a system for telling fantasy stories will likely have special rules for elves and dwarves.

All systems have shortcomings, and when these are encountered it’s usually the storyteller’s job to apply common sense and tweak the outcome accordingly.

The system I’m planning to use is an extremely simplified version of Dungeons & Dragons, 3rd Edition. The full rules run to many books. I’m hoping to explain the few rules we’ll be using in 10-15 minutes.

The story I’m planning to run focuses on a down-on-their-luck rock band about to enter a battle of the bands contest. The twist is that it’s a fantasy setting so there are elves and dwarves and, of course, in the hands of suitably skilled musicians, music is literally magical.

Some practical considerations

Someone has to supply the table to sit around. This is the person hosting the game. Ke can be a player or the storyteller or even uninvolved [6]. Traditionally the host also supplies a kettle and tea or coffee.

Everyone needs to show up and sit at the table, preferably roughly at the same time. This is surprisingly hard.

In order to remain at the table for prolonged periods, one needs things to nibble on. Traditionally people who are not the host bring snacks and drinks of various kinds. Roleplayers seem to take a perverse delight in bringing the unhealthiest snacks they can find, but this is perhaps a tradition best improved on.

Remembering the details of the story can be tricky, so it’s often useful to scribble short notes for oneself. A pen and paper come in handy.

I’ll give each player a couple of pages of information about their character. These are called the “character sheet”. The primary role of the character sheet is to supply margins to scribble notes and doodles in (see above).

It’s likely that time will fly remarkably quickly. If there are six of us, each person will get on average less than ten minutes of “screen time” per hour and probably a lot less given that the storyteller usually uses more than their fair share and there are always distractions and side tracks like discussing the rules or office gossip [7]. If we run out of time, we can always continue the story another day if we’re excited enough.

Lastly, the point is to have fun and tell an interesting story [8].


Host: Person who supplies the table, and usually warm beverages like tea and coffee.

Table: Thing one plays at.

Storyteller: The person managing the world the story takes place in, the consequences of players actions and playing the minor characters and antagonists.

Players: The people who are not the storyteller.

Player character: One of the protagonists of the story. Each player has their own player character to narrate.

NPC: Non-player character. All the characters in the story who are not player characters.

RPG: Roleplaying Game. Also rocket-propelled grenade.

System: The rules used to determine the outcomes of risky actions.

Dice: Things one rolls. Usually because one is required to do so by the rules, but often just for fun.

Fun: The point. :)


[1] The module was This is Vörpal Mace. If you’re keen to play it, you can download it from Locustforge.

[2] So called because it usually takes place around a table.

[3] “DM” stands for “Dungeon Master” and is a silly legacy term from the earliest tabletop roleplaying games which mostly focused on a group of heroes running around vast dungeons full of traps and monsters. The storyteller’s role was mostly to invent traps and monsters, hence the title.

[4] Because otherwise the story would be very boring. :)

[5] A whole book is far more common. :P

[6] Although letting six people invade your house for an evening for an activity you’re not involved in requires a special kind of friendship.

[7] One can avoid this time-divided-by-number-of-people limit by having multiple scenes running concurrently. This is a lot of fun, but hell on the storyteller. :)

[8] And it’s easy to lose track of this amongst all the details of playing your character, keeping track of what’s happening and figuring out the rules.

[9] This footnote is not related to anything.

by admin at 16 August 2015 11:06 PM

13 August 2015

Adrian Frith (htonl)

South African provinces as they might have been

The post-apartheid political map of South Africa might well have looked quite different. The Eastern Cape might have been divided into two provinces, with the Kat River and Great Fish River on the boundary. The Northern Cape might not have existed, with the Western Cape meeting North West at the Orange River. Gauteng might have been much bigger – or much smaller. The Western Cape might have stopped south of Citrusdal – or it might have incorporated all of Namaqualand.

13 August 2015 10:00 PM

07 June 2015

Tristan Seligmann (mithrandi)

Adventures in deployment with Propellor, Docker, and Fabric


After playing around with Docker a bit, I decided that it would make an ideal deployment platform for my work services (previously we were using some ad-hoc isolation using unix users and not much else). While Docker’s security is…suspect…compared to a complete virtualization solution (see Xen), I’m not so much worried about complete isolation between my services, as things like easy resource limits and imaging. You can build this yourself out of cgroups, chroot, etc. but in the end you’re just reinventing the Docker wheel, so I went with Docker instead.

However, Docker by itself is not a complete solution. You still need some way to configure the Docker host, and you also need to build Docker images, so I added Propellor (which I recently discovered) and Fabric to the mix.


Propellor is a configuration management system (in the sense of Puppet, Chef, Salt, et al.) written in Haskell, where your configuration itself is Haskell code. For someone coming from a systems administration background, the flexibility and breadth offered by a real programming language like Haskell may be quite daunting, but as a programmer, I find it far more straightforward to just write code that does what I want, extracting common pieces into functions and so on. Our previous incarnation of things used Puppet for configuration management, but it always felt very awkward to work with; another problem is that Puppet was introduced after a bunch of the infrastructure was in place, meaning a lot of things were not actually managed by Puppet because somebody forgot. Propellor was used to configure a new server from scratch, ensuring that nothing was done ad-hoc, and while I won’t go into too much detail about Propellor, I am liking it a lot so far.

The role of Propellor in the new order is to configure things to provide the expected platform. This includes installing Docker, installing admin user accounts, SSH keys, groups, and so on.


The Docker workflow I adopted is based on the one described by Glyph. I would strongly recommend you go read his excellent post for the long explanation, but the short version is that instead of building a single container image, you instead build three: A “build” container used to produce the built artifacts from your sources (eg. Python wheels, Java/Clojure JARs), a “run” container which is built by installing the artifacts produced by running the “build” container, and thus does not need to contain your toolchain and -dev packages (keeping the size down), and a “base” container which contains the things shared by the “build” and “run” containers, allowing for even more efficiency of disk usage.

While I can’t show the Docker bits for our proprietary codebases, you can see the bits for one of our free software codebases, including instructions for building and running the images. The relative simplicity of the .docker files is no accident; rather than trying to shoehorn any complex build processes into the Docker image build, all of the heavy lifting is done by standard build and install tools (in the case of Documint: apt/dpkg, pip, and setuptools). Following this principal will save you a lot of pain and tears.


The steps outlined for building the Docker images are relatively straightforward, but copy/pasting shell command lines from a README into a terminal is still not a great experience. In addition, our developers are typically working from internet connections where downloading multi-megabyte Docker images / packages / etc. is a somewhat tedious experience, and uploading the resulting images is ten times worse (literally ten times worse; my connection at home is 10M down / 1M up ADSL, for example). Rather than doing this locally, this should instead run on one of our servers which has much better connectivity and a stable / well-defined platform configuration (thanks to Propellor). So now the process would be “copy/paste shell command lines from a README into an ssh session” — no thanks. (For comparison, our current deployment processes use some ad-hoc shell scripts lying around on the relevant servers; a bit better than copy/pasting into an ssh session, but not by much.)

At this point, froztbyte reminded me of Fabric (which I knew about previously, but hadn’t thoughto f in this context). So instead I wrote some fairly simple Fabric tasks to automate the process of building new containers, and also deploying them. For final production use, I will probably be setting up a scheduled task that automatically deploys from our “prod” branch (much like our current workflow does), but for testing purposes, we want a deploy to happen whenever somebody merges something into our testing release branch (eventually I’d like to deploy test environments on demand for separate branches, but this poses some challenges which are outside of the scope of this blog post). I could build some automated deployment system triggered by webhooks from BitBucket (where our private source code is hosted), but since everyone with access to merge things into that branch also has direct SSH access to our servers, Fabric was the easiest solution; no need to add another pile of moving parts to the system.

My Fabric tasks look like this (censored slightly to remove hostnames):

def build_uat_documint():
    with settings(warn_only=True):
        if run('test -d /srv/build/documint').failed:
            run('git clone --quiet -- /srv/build/documint')
    with cd('/srv/build/documint'):
        run('git pull --quiet')
        run('docker build --tag=fusionapp/documint-base --file=docker/base.docker .')
        run('docker build --tag=fusionapp/documint-build --file=docker/build.docker .')
        run('docker run --rm --tty --interactive --volume="/srv/build/documint:/application" --volume="/srv/build/documint/wheelhouse:/wheelhouse" fusionapp/documint-build')
        run('cp /srv/build/clj-neon/src/target/uberjar/clj-neon-*-standalone.jar bin/clj-neon.jar')
        run('docker build --tag=fusionapp/documint --file=docker/run.docker .')

def deploy_uat_documint():
    with settings(warn_only=True):
        run('docker stop --time=30 documint')
        run('docker rm --volumes --force documint')
    run('docker run --detach --restart=always --name=documint --publish=8750:8750 fusionapp/documint')

Developers can now deploy a new version of Documint (for example) by simply running fab build_uat_documint deploy_uat_documint. Incidentally, the unit tests are run during the container build (from the .docker file), so deploying a busted code version by accident shouldn’t happen.

by mithrandi at 07 June 2015 10:57 PM

07 March 2015

Tristan Seligmann (mithrandi)

Axiom benchmark results on PyPy

EDIT: Updated version now available.

EDIT: Fixed the issue with the store-opening benchmark

Axiom conveniently includes a few microbenchmarks; I thought I’d use them to give an idea of the speed increase made possible by running Axiom on PyPy. In order to do this, however, I’m going to have to modify the benchmarks a little. To understand why this is necessary, one has to understand how PyPy achieves the speed it does: namely, through the use of JIT (Just-In-Time) compilation techniques. In short, these techniques mean that PyPy is compiling code during the execution of a program; it does this “just in time” to run the code (or actually, if I understand correctly, in some cases only after the code has been run). This means that when a PyPy program has just started up, there is a lot of performance overhead in the form of the time taken up by JIT compilation running, as well as time taken up by code being interpreted slowly because it has not yet been compiled. While this performance hit is quite significant for command-line tools and other short-lived programs, many applications making use of Axiom are long-lived server processes; for these, any startup overhead is mostly unimportant, the performance that interests us is the performance achieved once the startup cost has already been paid. The Axiom microbenchmarks mostly take the form of performing a certain operation N times, recording the time taken, then dividing that time by N to get an average time per single operation. I have made two modifications to the microbenchmarks in order to demonstrate the performance on PyPy; first, I have increased the value of “N”; second, I have modified the benchmarks to run the entire benchmark twice, throwing away the results from the first run and only reporting the second run. This serves to exclude startup/”warmup” costs from the benchmark.

All of the results below are from my desktop machine running Debian unstable on amd64, CPython 2.7.5, and PyPy 2.1.0 on a Core i7-2600K running at 3.40GHz. I tried to keep the system mostly quiet during benchmarking, but I did have a web browser and other typical desktop applications running at the same time. Here’s a graph of the results; see the rest of the post for the details, especially regarding the store-opening benchmark (which is actually slower on PyPy).

[graph removed, see the new post instead]

To get an example of how much of a difference this makes, let’s take a look at the first benchmark I’m going to run, item-creation 15. This benchmark constructs an Item type with 15 integer attributes, then runs 10 transactions where each transaction creates 1000 items of that type. In its initial form, the results look like this:

mithrandi@lorien> python item-creation 15
mithrandi@lorien> pypy item-creation 15

That’s about 165µs per item creation on CPython, and 301µs on PyPy, nearly 83% slower; not exactly what we were hoping for. If I increase the length of the outer loop (number of transactions) from 10 to 1000, and introduce the double benchmark run, the results look a lot more encouraging:

mithrandi@lorien> python item-creation 15
mithrandi@lorien> pypy item-creation 15

That’s about 159µs per item creation on CPython, and only 87µs on PyPy; that’s a 45% speed increase. The PyPy speed-up is welcome, but it’s also interesting to note that CPython benefits slightly from the changes to the benchmark. I don’t have any immediate explanation for why this might be, but the difference is only about 3%, so it doesn’t matter too much.

The second benchmark is inmemory-setting. This benchmark constructs 10,000 items with 5 inmemory attributes (actually, the number of attributes is hardcoded, due to a limitation in the benchmark code), and then times how long it takes to set all 5 attributes to new values on each of the 10,000 items. I decreased the number of items to 1000, wrapped a loop around the attribute setting to repeat it 1000 times, and introduced the double benchmark run:

mithrandi@lorien> python inmemory-setting
mithrandi@lorien> pypy inmemory-setting

That’s 486ns to set an attribute on CPython, and 129ns on PyPy, for a 74% speed increase. Note that this benchmark is extremely sensitive to small fluctuations since the operation being measured is such a fast one, so the results can vary a fair amount between benchmarks run. For interest’s sake, I repeated the benchmark except with a normal Python class substituted for Item, in order to compare the overhead of setting an inmemory attribute as compared with normal Python attribute access. The result was 61ns to set an attribute on CPython (making an inmemory attribute about 700% slower), and 2ns on PyPy (inmemory is 5700% slower). The speed difference on PyPy is more to do with how fast setting a normal attribute is on PyPy, than to do with Axiom being slow.

The third benchmark is integer-setting. This benchmark is similar to inmemory-setting except that it uses integer attributes instead of inmemory attributes. I performed the same modifications, except with an outer loop of 100 iterations:

mithrandi@lorien> python integer-setting
mithrandi@lorien> pypy integer-setting

That’s 12.3µs to set an attribute on CPython, and 3.8µs on PyPy, a 69% speed increase.

The fourth benchmark is item-loading 15. This benchmark creates 10,000 items with 15 integer attributes each, then times how long it takes to load an item from the database. On CPython, the items are deallocated and removed from the item cache immediately thanks to refcounting, but on PyPy a gc.collect() after creating the items is necessary to force them to be garbage collected. In addition, I increased the number of items to 100,000 and introduced the double benchmark run:

mithrandi@lorien> python item-loading 15
mithrandi@lorien> pypy item-loading 15

That’s 90µs to load an item on CPython, and 57µs on PyPy, for a modest 37% speed increase.

The fifth benchmark is multiquery-creation 5 15. This benchmark constructs (but does not run) an Axiom query involving 5 different types, each with 15 attributes (such a query requires Axiom to construct SQL that mentions each item table, and each column in those tables) 10,000 times. I increased the number of queries constructed to 100,000 and introduced the double benchmark run:

mithrandi@lorien> python multiquery-creation 5 15
mithrandi@lorien> pypy multiquery-creation 5 15

55µs to construct a query on CPython; 8µs on PyPy; 86% speed increase.

The sixth benchmark is query-creation 15. This benchmark is the same as multiquery-creation, except for queries involving only a single item type. I increased the number of queries constructed to 1,000,000 and introduced the double benchmark run:

mithrandi@lorien> python query-creation 15
mithrandi@lorien> pypy query-creation 15

15.5µs to construct a query on CPython; 1.6µs on PyPy; 90% speed increase.

The final benchmark is store-opening 20 15. This benchmark simply times how long it takes to open a store containing 20 different item types, each with 15 attributes (opening a store requires Axiom to load the schema from the database, among other things). I increased the number of iterations from 100 to 10,000; due to a bug in Axiom, the benchmark will run out of file descriptors partway, so I had to work around this. I also introduced the double benchmark run:

mithrandi@lorien> python store-opening 20 15
mithrandi@lorien> pypy store-opening 20 15

1.41ms to open a store on CPython; 2.02ms on PyPy; 44% slowdown. I’m not sure what the cause of the slowdown is.

A bzr branch containing all of my modifications is available at lp:~mithrandi/

by mithrandi at 07 March 2015 11:24 AM

Axiom benchmark results on PyPy 2.5.0

This is a followup to a post I made about 1.5 years ago, benchmarking Axiom on PyPy 2.1.0. Not too much has changed in Axiom since then (we fixed two nasty bugs that mainly affected PyPy, but I don’t expect those changes to have had much impact on performance), but PyPy (now at 2.5.0) has had plenty of work done on it since then, so let’s see what that means for Axiom performance!

Unlike my previous post, I’m basically just going to show the results here without much commentary:

Graph of Axiom performance

A few notes:

  • I didn’t redo the old benchmark results, but the hardware/software I ran the benchmarks on is not significantly different, so I think the results are still valid as far as broad comparisons go (as you can see, the CPython results match fairly closely).
  • The benchmark harness I’m using now is improved over the last time, using some statistical techniques to determine how long to run the benchmark, rather than relying on some hardcoded values to achieve JIT warmup and performance stability. Still could use some work (eg. outputting a kernel density estimate / error bars, rather than just a single mean time value).
  • There is one new benchmark relative to the last time, powerup-loading; PyPy really shines here, cutting out a ton of overhead. There’s still room for a few more benchmarks of critical functions such as actually running and loading query results (as opposed to just constructing query objects).
  • The branch I used to run these benchmarks is available on Github.
  • The horizontal axis is cut off at 1.0 so you can’t actually see how store-opening lines up, but the raw data shows that PyPy 2.1.0 took about 53% longer on this benchmark, whil PyPy 2.5.0 only takes about 2% longer.

by mithrandi at 07 March 2015 11:22 AM

28 February 2015

Andre Truter (Cacofonix)

Old software in business

One thing that I cannot understand is why a business that is not a one-man-show would use outdated software, especially something like Internet Explorer 6 or 7 or anything under 10.
I can understand if a very small business of private person who do not have an IT department of IT support can still be stuck with such old software, but a big business with branches all over the country should know that especially IE < 10 has security risks and do not support HTML5.

So if you then ask a supplier to write you a web application and the web application makes use of HTML5, then you should not wonder why it does not work with your IE 8 browser.

I can understand that it might not always be possible to upgrade all workstations to the latest operating system if you use expensive proprietary operating systems, but then you can at least standardise on an open source browser like Firefox or a free browser like Chrome. Both of them have very good track records for security and they support HTML5 and keeping them up to date does not cost anything.

So why are your staff stuck with an old, insecure browser that does not support HTML5? We are not living the the 90's anymore!

The same goes for office suites. LibreOffice is kept up to date and there are other alternatives like OpenOffice (Backed by Apache, Oracle and IBM). With a little training, you can move all your users over to LibreOffice or OpenOffice and never have to pay for an upgrade again and always have the latest stable and secure version of the software available, no matter what OS you run.

To me it just makes sense to invest some time and money once to get ensure a future of not being locked in. In the long run it saves money and if enough businesses does that, it might even force Microsoft to come to the Open Document Standards table and bring the price of it's Office suite down or even make it also free, which will benefit everybody as we will have a real open document format that everybody can use and nobody can be locked in.

Just my humble opinion.

Some links:
Firefox Web Browser
Google Chrome Web Browser
Best Microsoft Office Alternatives

by andre at 28 February 2015 03:35 PM

03 December 2014

Neil Blakey-Milner (nbm)

Starting is one of the hardest things to do

Just over six years ago I stopped posting regularly to my fairly long-lived blog (apparently started in April 2003), and just under four years ago I noticed it was not loading because the server it was on had broken somehow, and I didn't care enough to put it back up. (Astute readers will note how those two dates are roughly a few months in to my last two job start dates...)

I've written a number of blog posts over the last few years, but I haven't posted any of them. I don't even have most of them anymore, although a few are in the branches of git repos somewhere. I'll try dig some of them up - one of the things I enjoyed about my old blog was rereading what I was thinking about at various times in the past. (I guess I'll try get that back online.)

I've also written two different bits of blog software since then - since that's what one does whenever one contemplates starting a blog up again (although, to be fair, I also started setting up Wordpress and Tumblr blogs too).

The first used Hyde, a static blog generation tool (whose development seems to have halted a year ago). The second is what I'm using now - a collection of Flask modules and some glue code that constitutes gibe2, which I wrote just under a year ago. It uses Frozen-Flask to freeze a Flask app into an HTML tree that can be served by any static web server.

Putting something out there - let alone a first pass, a beginning with some implied commitment to continue - is quite scary. In my career, I've tended to be the joiner and sometimes the completer to a project, not the initiator. I find it easy to take something from where it is to where I think it should go, and hard to imagine what should exist.

I should mention that I have succeeded in posting a bit to about the occasional spurts of time I get to work on a little D language OpenGL someday-might-be-a-game. The minimum expended effort there is a lot higher - building a new feature or doing a major refactor, and then explaining it all in a post - in fact the posts are sometimes a lot harder to put together than the code, and the code is quite a bit further ahead than the posts now. It will probably be very sporadic with posts mostly coinciding with my long weekends and vacations. (And, unsurprisingly, I've just finished up a vacation where I finally got around to putting the final touches on this here blog.)

Connecting together starting up being scary and game programming: I've been watching Handmade Hero religiously since it started (the first few on Youtube the day after, the last few live). Talk about being a tough thing to contemplate starting - one hour a day of writing a game from scratch streaming to the public every weekday - every single little mistake in your code and in your explanations there for people to pick apart without any opportunity for editing. And having ~1000 streamers in your first few shows - no pressure!

That definitely put just putting together a few words a week with no implied time-bound commitment into perspective, so here we are.

I stopped reading blogs roughly when I stopped caring about mine. I hope to find a few interesting people to follow. A few of my friends used to post, albeit infrequently. I hope I can convince them to do so again as well.

by Neil Blakey-Milner at 03 December 2014 07:45 AM

22 August 2014

Adrianna Pińska (Confluence)

Yet another way to play videos in an external player from Firefox

I spent some time today trying to figure out how to get Firefox to play embedded videos using anything other than Flash, which is an awful, stuttering, resource-devouring mess. The internet is littered with old browser extensions and user scripts which allegedly make this possible (e.g. by forcing sites like YouTube to use the vlc media plugin instead), but I was unable to get any of them to work correctly.

Here’s a quick hack for playing videos from YouTube and any other site that youtube-dl can handle in an external mplayer window. It’s based on several existing HOWTOs, and has the benefit of utilising a browser extension which isn’t dead yet, Open With, which was designed for opening websites in another browser from inside Firefox.

I wrote a little script which uses youtube-dl to download the video and write it to stdout, and pipes this output to mplayer, which plays it. Open With is the glue which sends URLs to the script. You can configure the extension to add this option to various context menus in the browser — for example, I can see it if I right-click on an URL or on an open page. You may find this less convenient than overriding the behaviour of the embedded video on the page, but I prefer to play my videos full-screen anyway.

This is the script:

youtube-dl -o - $1 | mplayer -

Make it executable. Now open Open With’s preferences, add this executable, and give it a nicer name if you like. Enjoy your stutter-free videos. :)

(Obviously you need to have youtube-dl and mplayer installed in order for this to work. You can adapt this to other media players — just check what you need to do to get them to read from stdin.)

by confluence at 22 August 2014 02:41 PM

21 August 2014

Simon Cross (Hodgestar)

Character Creation 3000W

by Simon Cross, Mike Dewar and Adrianna Pińska

Your character creation skills have progressed far beyond writing
numbers on paper. Your characters have deftly crafted manerisms and
epic length backgrounds. They breathe emotion and seem more life-like
than many of your friends.

Yet, somehow, when you sit down at a table to play your beautiful
creations, things don’t quite work out.

Perhaps the story heads in an unexpected direction, leaving your
creation out of place and struggling to fit in? Or maybe they’re fun
to play initially but their actions begin to feel repetitive and

If any of this sounds familiar, read on.

Reacting to failure

It’s easy to spend all your time imagining a character’s successes —

their victories and their crowning moments — but what happens when
they fail? How do they respond to minor setbacks? And big ones?

Maybe they’re stoic about it? Perhaps it’s likely to cause a crisis of
faith? Maybe they react by doubling down and uping the stakes? Maybe
they see failure as an opportunity to learn and grow? Perhaps they’re
accustomed to failure? Perhaps they see failure as a sign that they’re
challenging themselves and pushing their abilities?

The dice and the DM are going to screw you. Make sure you have a plan
for how to roleplay your character when they do.


A character’s goals are things strongly tied to specific events. A
philosophy colours every situation. The two are often aligned, but a
philosophy is more broadly useful. It gives you a handle on how your
character might behave in circumstances where it is not otherwise
obvious what they would do.

To take a hackneyed example: your backstory might involve punishing an
old partner who screwed you. This goal could feed a number of
rather different philosophies:

  • “I always keep my word, and I promised Jimmy I’d get him back.”
  • “Any situation can be solved with enough violence.”
  • “Karma controls the universe. What goes around comes around.”

The goal is the same, but each philosophy implies very different
day-to-day behaviour.

There are going to be times when other characters’ plots and goals are
centre-stage, and it behooves us as roleplayers to have a plan for
these awkward (and hopefully brief) moments. A philosophy allows your
character to participate in others’ plots as a unique and distinct
individual, rather than as a bored bystander.

Your character’s philosophy becomes vitally important when paradigm
shifts occur in-game. Setting changes erode the importance of lesser
goals and past history and create a strong need for a philosophy that
guides your character’s immediate responses and further development.

It may be interesting to construct characters with goals that
contradict their philosophy. For example, a pacifist might wish to
exact revenge on the person who killed their brother. This creates an
interesting conflict that will need to be resolved.

Randomly fucking with people is not a philosophy.

Interacting with colleagues

Your character is going to spend a lot of time interacting with their

colleagues — the other player characters — so it’s worthwhile
thinking about how they do that.

It’s tempting (and a bit lazy) to think of characters as relating to
everyone else the same way. This leads to loners and overly friendly
Energizer bunnies, both of which get old very quickly.

Avoid homogenous party dynamics.

If your character’s interactions with the other player characters are
all the same, you have failed.

Varied interactions also help make party disagreements more
interesting. Without varied interactions, you have to resolve all
disagreements by beating each other over the head with the logic stick
until consensus (or boredom) is reached. Unique relationships and
loose factions make disagreements more interesting to roleplay and
help the party find plausible lines along which to unite for a given

If your character is part of a command structure, spend some time
thinking about how they respond to orders they disagree with. Remember
that the orders are likely issued by someone your character knows and
has an existing relationship with. What is that relationship?

Also keep in mind that your character has likely been given such
orders before, and since they appear to still be part of the command
structure, they’ve probably come to terms with this in some way that
both they and their immediate superiors can live with.

Obviously everyone has their limits, though — where are your
character’s? How much does it take for other player characters or
NPCs to cross the line?


Sometimes even if you do everything right you find yourself in a
situation where your character is no longer fun to play. Maybe the
campaign took an unexpected turn or you’ve just run out of ideas for
them as they are. It’s time for your character to change — to embark
on a new personal story arc.

Great characters aren’t static. They grow and react to events around
them. Perhaps a crushing defeat has made them re-consider their
philosophy — or made them more committed to it? Or maybe frustration
with their current situation has made them reconsider their options?

It helps to think broadly about how your character might develop while
you’re creating them. Make sure you’d still find the character
interesting to play even if their stance on some important issues
shifted. Don’t become too invested in your character remaining as they
are. Be flexible — don’t have only one plan for character

Your character’s philosophy and general outlook can be one of the most
interesting things to tweak. Small changes can often have big
ramifications for how they interact with others.

Don’t feel you have to leave character development for later in the
campaign! The start of a campaign is often when character changes are
most needed to make a character work well and it sets the stage for
further character development later on.


Think about how you convey who your character is to the other
players. They’re probably not going to get to read your epic
backstory, so they’re going to have to learn about who your character
is in other ways.

Likely the first thing people will hear about your character is his or
her name — so make it a good one. It’s going to be repeated a lot so
make sure it conveys something about who your character is. If they’re
an Italian mobster, make sure their name sounds like they’re an
Italian mobster. That way whenever the DM or another player says your
character’s name, it reminds everyone who your character is.

The second thing people hear will probably be a description of your
character. Take some time to write one. Don’t rely on dry statistics
and descriptions. Stick to what people would see and remember about
your character if they met him or her for a few minutes. Don’t mention
hair colour unless hair is an important feature.

After introductions are done, you probably won’t get another
invitation to monologue about your character. So do it in character
instead. Tell the NPC about that time in ‘Nam. Regale the party with
tales from your epic backstory. As in real life, try not to ramble on,
but equally, don’t shy away from putting your character in the
spotlight for a few moments. Continually remind the others at the
table who your character is.

Last but not least, remember that the most epic backstory is pointless
if no one finds out about it. The point of dark secrets is for them to
be uncovered and for your character to confront them.


Don’t fear failure. Have a philosophy. Have varied interactions with
others. Embrace change. Share who you are.


  • Kululaa dot COMMMM!
  • Mefridus von Utrecht (for a philosophy that involves others)
  • Attelat Vool (for starting life after failure)

This article was also published in the CLAWmarks 2014 Dragonfire edition.

by admin at 21 August 2014 09:36 AM

17 March 2014

Adrianna Pińska (Confluence)

Why phishing works

Let me tell you about my bank.

I would expect an institution which I trust to look after my money to be among the most competent bureaucratic organisations I deal with. Sadly, interactions which I and my partner H have had with our bank in recent years suggest the opposite.

Some of these incidents were comparatively minor: I once had to have a new debit card issued three times, because I made the fatal error of asking if I could pick it up from a different branch (the first two times I got the card, my home branch cancelled it as soon as I used it). More recently, when I got a replacement credit card, every person I dealt with had a completely different idea of what documents I needed to provide in order to collect it. When H bought a used car, it turned out that it was literally impossible for him to pay for it with a transfer and have the payment clear immediately — after he was assured by several employees that it would not be a problem.

Some incidents were less minor. H was once notified that he was being charged for a replacement credit card when his current card was years away from expiring. Suspicious, he called the bank — the employee he spoke to agreed that it was weird, had no idea what had happened, and said they would cancel the new card. H specifically asked if there was anything wrong with his old card, and was assured that everything was fine and he could keep using it. Of course everything was not fine — it suddenly stopped working in the middle of the holiday season, and he had to scramble to replace it at short notice. All he got was a vague explanation that the card had to be replaced “for security reasons”. From hints dropped by various banking employees he got the impression that a whole batch of cards had been compromised and had quietly been replaced — at customers’ expense, of course.

What happened last weekend really takes the cake. The evening before we were due to leave on a five-day trip, well after bank working hours, H received an SMS telling him that his accounts had been frozen because he had failed to provide the bank with some document required for FICA. This was both alarming and inexplicable, because we had both submitted documents for FICA well before the deadline years ago. The accounts seemed fine when he checked them online. When he contacted the bank, he was assured that he had been sent the SMS in error, everything was fine, and he didn’t need to provide any FICA documents.

So we left on our trip. I’m sure you can see where this is going.

On Thursday evening H’s accounts were, in fact, frozen. He tried unsuccessfully during the trip to get the bank to unfreeze them, but since it was closed for the weekend there was pretty much nothing he could do until we got back home.

Hilariously, although employees from the bank made a house call this morning to re-FICA him, he had to go to the branch anyway because they needed a photocopy of his ID (scanning and printing is magically not the same as photocopying).

Again, what actually happened is a mystery — the bank claims that they have no FICA documents on record for H (as an aside, why are customers not given receipts when they submit these documents to the bank? If there is no record of the transaction, the bank can shift blame to the customer with impunity if it loses vital documentation).

We’re very fortunate that none of these incidents had devastating consequences for us, since they only impacted one of us at a time. If we relied on a single bank account, we could easily have ended up without food, without electricity, or stranded in the middle of the Karoo with no fuel. This is pretty clearly not an OK situation.

The common thread running through all these incidents is a lack of communication: both between the bank and its customers, and within the bank. We rapidly discovered through our dealings that while the bank maintains the facade of a single, unified entity, it in fact comprises several more-or-less autonomous divisions, and communication between these divisions often resembles diplomacy in the Balkans.

I would not be surprised to discover that various aspects of customers’ information are distributed over several disconnected databases. There appears to be no way for certain types of information to be linked to accounts, which necessitates the use of bizarre hacks. When H’s credit card was disabled, this was in no way reflected in the online interface — he just had an enormous amount of money reserved on the card. When his accounts were frozen, this was again not apparent in the interface (which was recently updated) — his available credit balance was just zeroed, and he got a non-specific error whenever he tried to transfer funds. I believe that the back-end infrastructure for managing this information effectively and making it available to customers and employees simply does not exist.

As a result of this, I have learned not to believe a word that a bank employee says if there is any chance that the issue crosses some internal jurisdictional boundary. In the best case scenario they are aware of their own lack of information and are able to direct you to the appropriate department. In the worst case scenario, they dispense outright misinformation — something which can have devastating consequences (for you).

We live in an age with an abundance of instant communications methods. In spite of this, it appears to be beyond the bank’s abilities to inform people timeously about what is going on with their accounts. It has backed off from electronic communications presumably because of fears of phishing, and has fallen back to two obsolete and inefficient channels: voice phonecalls, which are prone to misunderstandings and human error and leave the customer with no written record, and SMSes, which have a character limit. Both these channels are vulnerable to blips in the cellphone network infrastructure, customers having no airtime, or customers just not being available to answer their phones at certain times (since voice phonecalls are synchronous). The bank also uses these channels as if it believes that they are intrinsically secure and trustworthy, which is ludicrous, as anyone who keeps getting calls from “the Microsoft Support Centre” can attest.

In order for this dysfunctional system to work, the bank appears to expect its customers to accept unexpected additional charges unquestioningly, and to follow instructions issued by unknown persons calling from unverified internal numbers, even if they are nonsensical or suspicious and cannot be corroborated by other bank employees contacted through more reputable public-facing channels. It is standard procedure for such callers to demand personal information from customers in order to verify their identities, but they offer no evidence of their own legitimacy.

In short, the bank expects us to be the kind of credulous chumps who fall prey to phishing scams. It’s easy to see why phishing works when genuine communications from the bank are so unprofessional and follow such laughable security practices that they are virtually indistinguishable from phishing.

I haven’t named my bank, although it’s pretty easy to find out what it is if you know where to look, because I’m sceptical that there are significant differences between the way South African banks operate; particularly the Big Four. I’ve certainly heard the same kinds of horror stories from customers of other banks.

This is the final straw which has led us to investigate other banking options. Whether the pastures we’re moving to are greener or just differently green remains to be seen.

If you feel strongly that there is a bank which is notably better or worse than the others, or you just want to share your own tale of banking woe, let me know in the comments. I’ll be over here, stuffing my money into a sock to hide under my mattress.

by confluence at 17 March 2014 12:10 PM

25 November 2013

Michael Gorven (cocooncrash)

Statically linked e2fsprogs binaries for Android

I needed to resize the ext4 filesystem of the /data partition on my Android phone and spent ages looking for a prebuilt binary of resize2fs (since it isn't included in ROMs or recovery). I didn't find one and so spent ages trying to build it myself. To save others the trouble, here are the binaries.

Just the main ones (mke2fs, resize2fs, tune2fs, fsck): tar.xz 630K or zip 1.5M
Everything tar.xz 1.6M or zip 5.8M

by mgorven at 25 November 2013 04:58 AM