Tuesday, September 10, 2013

What The Fuck, Australia (Federal election 2013)

The previous Labor government did a lot of good things:

Gonski reforms 

I have spoken to three teachers, all of whom are strongly in favour -- they must be good.

Carbon pricing and the Tax Cuts

Labor introduced a carbon price, yes, but at the same time they increased the tax-free threshold from $6000 to $18200. Since the tax rate on this was previously 19%, this is a cut of $2318 for everyone who earns more than $18000.  That's nearly a whole baby bonus, every year, for every worker.

But I didn't see it mentioned once during the election.  A $2300 tax cut for everyone. Not once.

Also, fuckers, electricity prices are going up because the state governments are allowing the electricity infrastructure companies to charge whatever they like for maintenance. Guess what's happening there: per-kwh prices for electricity are pretty stable but the connection fee is getting enormous.

The National Broadband Network

The fourteen people I have spoken to are all in favour of fibre to the home.

Here are my earlier thoughts:
It is worth building the NBN just for television's sake. iView on ADSL sucks.
It is also worth building the NBN just for video calling's sake. I want to be able to see my grandchildren clearly on Skype.
It is also worth building the NBN just for education's sake. I want to chat with teachers and use highly interactive applications.
It is also worth building the NBN just for e-Health's sake. I want my GP to be able to call on other doctors if necessary and be able to keep my shared file updated.
It is also worth building the NBN just for small business's sake. I want to be able to work remotely and transfer large files quickly when it is necessary.
It is also worth building the NBN just for a whole lot of other reasons we don't know about yet.
It is also worth building the NBN just to avoid having to maintain all the copper.
Any single one of the above reasons justifies building the NBN. All of them together makes an overwhelming case.

With regards to the price: it's fucking $40 billion over 8 years. That is 0.3% of our national GDP. Civilisations survive and flourish partly based on how good their communications are -- is 0.3% really too much?

The Coalition NBN is an intentionally hobbled piece of crap, because Abbott sold Australia out and became Murdoch's little bitch. It is a shame Howard sold off Telstra because building the NBN is much more expensive as a result, to the point that the Telstra sale was a net loss.

Disability Care

I don't know much about this but I've heard three people in favour and no-one against.

The Mining Tax

Fucking hell, I thought that this sounded like a great idea. Those resources are in the ground and getting taken out. Once gone, they're gone. I want businesses to have to fight tooth and nail to make a profit from them. All these lucky rich idiots spouting self-serving crap about how they deserve more money makes me angry.



All this aside, perhaps the worst part is that the coalition had almost no policies. When I see their supporters on facebook spouting empty lines like "end the waste" or "restore the economy", I want to ask what the fuck they are talking about, because I'm damn sure they don't have a clue, and are parroting echoes, as though they were at a football game. I enjoy turning my brain off as much as the next guy, but seriously, this is our future. Is a few minutes' critical thinking really too much to ask?

The only real policy I heard about was the paid parental leave scheme, which was ironicially very similar to something the Greens had suggested. Except that it was a bigger waste.

While it is true that the Coalition has historically had a positive impact on the budget's bottom line, it is almost always in a short-term way that is bad in the long term. The sale of Telstra is an example, as are the usual cuts to education and health spending.  America's economic management leaves a lot to be desired, guys, don't copy them too much.


So basically, Australian voters, fuck you.

Of course, it wasn't all bad.

Saturday, July 20, 2013

Message queues: a pattern in server software design

All the server software that I have been involved with is heavily based on the idea of a processing queue.  Messages are added to the queue, and a processing thread takes items off the queue and does something with them, perhaps adding to other queues in the process.  If there is nothing on the queue then the processing thread just waits until something is placed there.

In the transaction processing software I am working on at the moment, there is an  incoming messages queue.  A thread takes those messages and reliably distributes ("despatches") those messages to the processing threads, which do most of the work. The processing threads then add messages to an outgoing queue, which has a sending thread that sends the transformed messages to the other system (sometimes one message becomes many, or many become one).

In fact, because the two main connections are both bidirectional, there is an inbound and an outbound queue for both sides of the application. The processing threads process messages in both directions, because then the relevant state can be kept in the same thread and does not need to be guarded by locks.

The way that messages are distributed to threads was carefully chosen so that messages can easily be associated with a certain thread by an identifier that is part of each message.This means messages can be sent to the right queue easily, and allows use of the thread-local, unguarded state.

This concept is so important that Erlang is based on it. So is Go. In that language, the message queues that I have been discussing above are called "channels" and processing threads are called "coroutines", and are declared with the "go" keyword.

Tuesday, July 16, 2013

Why code reviews are awesome

Improve skills

Getting feedback on your code makes you a better developer.  So does reading others' code.

Giving feedback makes your colleagues better and means there will be fewer bugs and architectural issues for everyone to deal with.

Learn other systems

Reviewing code from more distant teams will help both teams learn more, and maybe learn some better ways of doing things or share more code.

Less Maintenance

Code that has been reviewed is easier to read, which makes maintenance much less painful. 

Reviewed code also has fewer bugs, so you won't have to do as much maintenance.

Monday, June 10, 2013

Shape hashing

Nate Silver's book contains an interesting observation: human's predictive ability (pattern recognition / intelligence) is a succession of approximations.

how do humans recognise a cat? construct internal representation (2D/3D), look for distinguishing features, match against known.

What about a software library that does this? 
Video of cat
-> basic 3D skeleton of cat
-> 3D animated model of cat
-> average position of model gives static model
    -> shape simplification until "matches" a shape from the database? hash? similarity tree?
    -> choose a part (e.g. head) then simplify until matches a hash?






Test on pictures of clouds.

Possible that some facial recognition technologies already do something like this?

Friday, April 19, 2013

Myki still sucks

There have been a lot of people complaining about Myki -- overcharging or just not working at all.  I haven't had any serious problems... up until now.

I clicked through the barrier yesterday, said $8.?? remaining. Went home, said $2.?? remaining. it's $3.50 each way now. This morning, tried to get on train. Nope, balance $-2.??. What? Tried to check balance on machine; result history shows balance yesterday was $0.00.  Ha ha, funny joke, everybody laugh.  Oh well, I'll try to refill. No, machine broken.  It's been broken for a month.  I can't catch the train.

It's well past time for the state government to dump Myki. It's never going to work properly.  Tell Kamco to shove it, stop giving them money, and charge Vivian Miners with corruption.  Choose a local company to build a functional system. Hell, I'll do it.

Wednesday, April 03, 2013

hash-breaking difficulty

XKCD's Externalities comic includes a hash-breaking competition. The difficulty of getting n bits of the hash correct by brute force is given by the binomial distribution, with p=0.5 and n = 1024.

For the current leaders, here's how many combinations they had to try:

(number of wrong bits, 2**(this value) combinations tried)
 (329, 100.79292584868568),
 (330, 99.71264744849057),
 (331, 98.6387726772389),
 (332, 97.57129092599011),
 (333, 96.51019166667069),
 (334, 95.45546445125278),
 (335, 94.40709891093776),
 (336, 93.36508475534453),
 (337, 92.32941177170228),
 (338, 91.30006982404753),
 (339, 90.27704885242493),
 (340, 89.26033887209208),
 (341, 88.24992997272764),
 (342, 87.24581231764267),
 (343, 86.24797614299497),
 (344, 85.25641175700605),
 (345, 84.27110953918066),
 (346, 83.29205993952827),
 (347, 82.31925347778665),
 (348, 81.35268074264687),
 (349, 80.39233239097973),
 (350, 79.43819914706322),
 (351, 78.49027180181061),
 (352, 77.54854121199908),
 (353, 76.61299829949846),
 (354, 75.68363405049972),
 (355, 74.76043951474304),
 (356, 73.84340580474498),
 (357, 72.93252409502446),
 (358, 72.02778562132734),
 (359, 71.12918167984901),
 (360, 70.2367036264548),
 (361, 69.35034287589781),
 (362, 68.47009090103367),
 (363, 67.59593923203211),
 (364, 66.72787945558447),
 (365, 65.86590321410733),
 (366, 65.01000220494126),
 (367, 64.16016817954464),
 (368, 63.31639294268198),
 (369, 62.478668351606096),
 (370, 61.64698631523403),
 (371, 60.82133879331581),
 (372, 60.00171779559586),
 (373, 59.188115380966224),
 (374, 58.380523656611395),
 (375, 57.57893477714383),
 (376, 56.7833409437298),
 (377, 55.993734403204826),
 (378, 55.21010744717815),
 (379, 54.432452411125524),
 (380, 53.66076167346958),
 (381, 52.89502765464724),
 (382, 52.135242816163206),
 (383, 51.38139965962892),
 (384, 50.63349072578612),
 (385, 49.891508593514146),
 (386, 49.1554458788202),
 (387, 48.42529523381158),
 (388, 47.70104934564894),
 (389, 46.98270093547969),
 (390, 46.27024275735042),
 (391, 45.56366759709728),
 (392, 44.862968271213305),
 (393, 44.168137625691415),
 (394, 43.47916853484186),
 (395, 42.79605390008302),
 (396, 42.11878664870401),
 (397, 41.44735973259787),
 (398, 40.78176612696386),
 (399, 40.12199882897727),
 (400, 39.46805085642528),
 (401, 38.81991524630716),
 (402, 38.17758505339709),
 (403, 37.54105334876775),
 (404, 36.91031321827288),
 (405, 36.285357760986756),
 (406, 35.66618008759846),
 (407, 35.0527733187589),
 (408, 34.44513058337816),
 (409, 33.84324501687082),
 (410, 33.24710975934681),
 (411, 32.65671795374506),
 (412, 32.07206274390717),
 (413, 31.49313727258834),
 (414, 30.919934679402296),
 (415, 30.352448098697213),
 (416, 29.790670657359072),
 (417, 29.2345954725391),
 (418, 28.68421564930143),
 (419, 28.139524278187103),
 (420, 27.6005144326904),
 (421, 27.067179166643008),
 (422, 26.5395115115016),
 (423, 26.017504473534007),
 (424, 25.501151030898914),
 (425, 24.990444130613774),
 (426, 24.48537668540544),
 (427, 23.9859415704375),
 (428, 23.492131619908193),
 (429, 23.003939623512416),
 (430, 22.521358322760847),
 (431, 22.04438040714901),
 (432, 21.572998510168617),
 (433, 21.10720520515314),
 (434, 20.646993000949116),
 (435, 20.192354337404257),
 (436, 19.743281580662888),
 (437, 19.299767018258787),
 (438, 18.861802853994963),
 (439, 18.429381202599185),
 (440, 18.002494084143756),
 (441, 17.58113341821703),
 (442, 17.165291017833827),
 (443, 16.754958583070945),
 (444, 16.35012769441337),
 (445, 15.950789805795873),
 (446, 15.556936237323976),
 (447, 15.168558167657284),
 (448, 14.785646626037295),
 (449, 14.40819248394085),
 (450, 14.036186446339345),
 (451, 13.669619042542726),
 (452, 13.308480616606237),
 (453, 12.952761317276634),
 (454, 12.602451087453419),
 (455, 12.2575396531393),
 (456, 11.918016511852795),
 (457, 11.583870920474457),
 (458, 11.2550918824968),
 (459, 10.931668134646431),
 (460, 10.613588132845397),
 (461, 10.300840037477135),
 (462, 9.993411697920738),
 (463, 9.691290636315607),
 (464, 9.394464030516776),
 (465, 9.10291869619951),
 (466, 8.816641068069963),
 (467, 8.535617180136963),
 (468, 8.259832644998154),
 (469, 7.989272632092106),
 (470, 7.723921844866229),
 (471, 7.4637644968087855),
 (472, 7.20878428629177),
 (473, 6.958964370170051),
 (474, 6.71428733608102),
 (475, 6.474735173387996),
 (476, 6.2402892427099665),
 (477, 6.01093024397988),
 (478, 5.786638182973767),
 (479, 5.567392336253507),
 (480, 5.3531712144671495),
 (481, 5.143952523952513),
 (482, 4.939713126592324),
 (483, 4.740428997872683),
 (484, 4.5460751831011645),
 (485, 4.356625751746641),
 (486, 4.172053749870079),
 (487, 3.9923311506242825),
 (488, 3.817428802811137),
 (489, 3.647316377497421),
 (490, 3.481962312705135),
 (491, 3.3213337562096426),
 (492, 3.1653965064990928),
 (493, 3.014114951971893),
 (494, 2.867452008475686),
 (495, 2.7253690553216456),
 (496, 2.587825869942336),
 (497, 2.4547805614000517),
 (498, 2.3261895029957964),
 (499, 2.2020072642771202),
 (500, 2.0821865427960415),
 (501, 1.966678096026371),
 (502, 1.8554306739129727),
 (503, 1.748390952593668),
 (504, 1.6455034699074478),
 (505, 1.5467105633799099),
 (506, 1.4519523114577648),
 (507, 1.3611664788479745),
 (508, 1.274288466902354),
 (509, 1.1912512700738427),
 (510, 1.1119854395541857),
 (511, 1.0364190552822286)