| CARVIEW |
Select Language
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 16 Jan 2026 01:56:58 GMT
Content-Type: text/xml; charset=utf-8
Content-Length: 30587
Connection: keep-alive
Keep-Alive: timeout=50
Referrer-Policy: no-referrer-when-downgrade
X-AWS-Id: kr-bulkws03
X-LJ-Flow-ID: aWma6nYwzzDFk3PLT2OE3wAAAAM
Cache-Control: private, proxy-revalidate
Content-Encoding: gzip
Content-MD5: Td8NB4LC1cV/p3NAq35N3A
Vary: Accept-Encoding,ETag
Content-Security-Policy: default-src 'self' *.livejournal.com *.livejournal.net *.dsp-rambler.ru *.google.com google.com *.rambler-co.ru rambler-co.ru *.rambler.ru rambler.ru *.tiktok.com tiktok.com *.youtube.com youtube.com; script-src 'self' *.livejournal.com *.livejournal.net *.24smi.net *.adfox.ru *.adlooxtracking.com adlooxtracking.com *.adlooxtracking.ru adlooxtracking.ru ad.mail.ru api.giphy.com bs.serving-sys.ru cdn.ampproject.org cdn.jsdelivr.net cdnjs.smi2.ru *.cdn-vk.ru content.adriver.ru *.criteo.com *.criteo.net *.doubleclick.net *.dropbox.com dsp-rambler.ru *.dsp-rambler.ru embed.bsky.app *.exelator.com *.facebook.com *.facebook.net gist.github.com googleads.g.doubleclick.net *.google-analytics.com *.googleapis.com *.google.com google.com *.google.ru *.googlesyndication.com *.googletagmanager.com googletagmanager.com *.googletagservices.com *.gstatic.com id.sber.ru *.instagram.com js.mamydirect.com *.lj.ru mc.yandex.com mc.yandex.ru *.newrelic.com *.nr-data.net *.ok.ru openstat.net pingback.giphy.com *.pingdom.com *.pingdom.net *.pinterest.com *.plista.com privacy-cs.mail.ru *.rambler-co.ru rambler-co.ru *.rambler.ru rambler.ru rb.infox.sg r.mradx.net *.rnet.plus *.rubiconproject.com r.webturn.ru *.scorecardresearch.com sdk.canva.com *.services.livejournal.com smi2.ru ssl.p.jwpcdn.com static.smi2cdn.ru static.smi2.net static.xx.fbcdn.net stat.media telegram.org tiktokcdn-us.com *.tiktok.com tiktok.com tns-counter.ru *.top100.ru top-fwz1.mail.ru tpc.googlesyndication.com *.ttwstatic.com twemoji.maxcdn.com *.twimg.com *.twitter.com *.videos.livejournal.com vk.com *.vk.com vk.ru *.vk.ru *.weborama.fm weborama.fm *.weborama.fr weborama.fr *.weborama.ru weborama.ru *.weborama-tech.ru weborama-tech.ru *.webturn.ru *.webvisor.org *.yahooapis.com *.yandex.ru yandex.ru yastatic.net ymetrica.com *.youtube.com youtube.com z.moatads.com 'unsafe-inline' 'unsafe-eval'; style-src http: https: data: 'unsafe-inline'; img-src blob: http: https: data:; frame-src http: https:; font-src http: https: data:; connect-src 'self' *.livejournal.com *.livejournal.net ad.adriver.ru ad.mail.ru *.ad-tech.ru api.giphy.com bs.serving-sys.ru cdn.ampproject.org *.criteo.com csi.gstatic.com data00.adlooxtracking.com dsp-rambler.ru *.dsp-rambler.ru *.eaglecdn.com event.top100.su export-download.canva.com ext.clickstream.sberbank.ru sdk.canva.com *.g.doubleclick.net googleads.g.doubleclick.net *.google-analytics.com *.googleapis.com *.google.com google.com *.googletagmanager.com googletagmanager.com graph.facebook.com gstatic.com id.sber.ru *.lj.ru lj.stat.eagleplatform.com mc.yandex.by mc.yandex.com mc.yandex.md mc.yandex.ru pingback.giphy.com *.pingdom.net privacy-cs.mail.ru *.rambler-co.ru rambler-co.ru *.rambler.ru rambler.ru rb.infox.sg *.rnet.plus *.services.livejournal.com *.ssp.rambler.ru ssp.rambler.ru static-mon.yandex.net static.xx.fbcdn.net stat.media stats.g.doubleclick.net smi2.net smi2.ru sve.online.sberbank.ru *.tiktok.com tiktok.com top-fwz1.mail.ru *.twitter.com *.webturn.ru *.webvisor.org wss://mc.yandex.ru wss://www.livejournal.com yandexmetrica.com yandexmetrica.com:29010 yandexmetrica.com:30103 *.yandex.net *.yandex.ru yandex.ru yastatic.net ymetrica1.com ymetrica.com *.youtube.com youtube.com; report-uri https://www.livejournal.com/csp_reports; report-to livejournal; media-src http: https: blob: data: storage.mds.yandex.net; frame-ancestors 'self'; worker-src 'self' blob:; object-src 'self' blob: *.livejournal.net youtube.com *.youtube.com; child-src 'self' blob:;
Reporting-Endpoints: livejournal="https://www.livejournal.com/csp_reports"
Last-Modified: Sat, 17 Nov 2012 16:30:35 GMT
X-Varnish: 843907568
Age: 0
X-VWS-Id: kr-varn01-new.lj.rambler.tech
ETag: GgZzTd8NB4LC1cV/p3NAq35N3A
Accept-Ranges: bytes
X-SplitTest: none
Permissions-Policy: browsing-topics=()
Set-Cookie: luid=URNKAGlpmupPryZ3ThRhAgB=; expires=Thu, 31-Dec-37 23:55:55 GMT; domain=.livejournal.com; path=/; secure; samesite=none
P3P: CP="NON DSP NID ADMa DEVa TAIa PSAa PSDa OUR IND UNI COM NAV"
totherme
https://totherme.livejournal.com/
totherme - LiveJournal.com
Sat, 17 Nov 2012 16:30:35 GMT
LiveJournal / LiveJournal.com
totherme
10407961
personal
https://l-userpic.livejournal.com/77582186/10407961
totherme
https://totherme.livejournal.com/
100
84
-
https://totherme.livejournal.com/11654.html
Sat, 17 Nov 2012 16:30:35 GMT
Programming Languages Mentoring Workshop: a POPL Workshop
totherme
https://totherme.livejournal.com/11654.html
If you're interested in programming languages, and especially if you might want to make a career in programming languages research, you may wish to attend <a href="https://www.doc.ic.ac.uk/~gds/PLMW" target="_blank" rel="nofollow">PLMW - the POPL programming languages mentoring workshop</a>. <br /><br />We've got a whole bunch of <a href="https://www.doc.ic.ac.uk/~gds/PLMW/schedule.html" target="_blank" rel="nofollow">great speakers</a>, who will be talking about cool research, and about how to make it in the research community. If you're a student, we've also got <a href="https://www.doc.ic.ac.uk/~gds/PLMW/grants.html" target="_blank" rel="nofollow">funding</a> for you to attend - so come to Rome and find out what it's all about!
https://totherme.livejournal.com/11654.html?view=comments#comments
#proglang
#plmw
#popl
#rome
#haskell
public
0
-
https://totherme.livejournal.com/10554.html
Thu, 15 Apr 2010 13:20:37 GMT
Election Geekery
totherme
https://totherme.livejournal.com/10554.html
I've been offline for a bit while I panic about thesis stuff - but an election's happening here in the UK, so I thought I'd take a moment to link to a couple of handy tools:<br /><br /><a href="https://voteforpolicies.org.uk" target="_blank" rel="nofollow">Vote For Policies</a><br /><br /><a href="https://www.whoshouldyouvotefor.com/" target="_blank" rel="nofollow">Who should you vote for?</a><br /><br />Both of these sites anonymise the policies of our major parties, to allow you to see how well your tribal instincts match up with your policy beliefs. If you're interested then it's worth using both tools, since they present the data in different ways - which may affect your results.<br /><br />I think the whole concept of these things is fascinating. Firstly, it's worth noting that if a party were to promise "magic" - for example simultaneous tax cuts and spending increases - then they'd do well in these systems. By anonymising the policies, we remove some of our ability to judge how sincere and/or practical the promises are.<br /><br />Also, I was a little surprised at how mind numbingly dull the process of wading through all those policies is. I mean, I expected it to be dull, but I found wading through all the options at the <a href="https://voteforpolicies.org.uk" target="_blank" rel="nofollow">Vote For Policies</a> site really quite hard. I may have been almost random in my choices by the time I got to the end. I think this is interesting, because I know that I'm well educated and very well placed to read and understand that kind of policy statement. It seems that voting rationally is <b>hard</b>. This leads me to wonder what we actually expect from our democratic system. Do we want the majority of the population to vote tribally (as I suspect I do)?<br /><br />Are there any students of politics or anthropology out there who can give me some hint as to what it might all be about? :)
https://totherme.livejournal.com/10554.html?view=comments#comments
election
thinking
geek
rational
public
8
-
https://totherme.livejournal.com/10399.html
Wed, 17 Feb 2010 15:10:30 GMT
Facebook worm.
totherme
https://totherme.livejournal.com/10399.html
I just got hit by a facebook app worm :)<br /><br />For those of you that aren't on facebook - here are some key things about it.Facebook sends you a "notification" when something interesting happens - like someone "liking" a photo of you, or commenting on something you did or said. Facebook also has a system of third party "apps", that can also send notifications and generally do anything that you can do, in your name. Usually these apps are things like "Farmville" and so on - silly little games that make use of the social network. They're very popular - but I tend to ignore them. <br /><br />Today, I got a facebook notification that said "$FRIENDSNAME likes your photo". Only, you know, with a real friends name...<br /><br />This is normal - I have some photos on facebook, and it's not unusual for my friends to like them. The usual procedure on being notified that someone likes your photo is to click on the hyperlink "your photo" to see which photo it was that they liked. I did that, and was asked if I wanted to give the "Like" app permission to access my profile.<br /><br />Well, facebook used to have a bunch of built in functions that they later abstracted out into apps - I remember the transition. One of those functions was what is now the "photos" app. And they've just upgraded the whole UI again, so it seemed plausible that "like" had previously been a builtin, and had now been abstracted into an app that I needed to give permission to. Stupid, but plausible.<br /><br />As it turned out, the app "Like" wasn't written by facebook at all- it was a third party app. The hyperlink in the notification wasn't a hyperlink to a photo, but to the app install page. Giving permission<br />on that page allowed the app to install and run, whereupon it spammed 27 of my friends with identical notifications "Totherme likes your photo", and then redirected my browser to some commercial webpage. (does anyone know if 27 is some kind of limit placed on the number of notifications an app can send out simultaneously? To prevent spam, perhaps?)<br /><br />Of course, I immediately backtracked to facebook, and posted a status update warning others not to give permissions to the Like app. And then I went and removed its permissions from the app in my settings. I<br />also reviewed the app in question, giving it the minimum possible score and the review "It's a worm". There may be other apps doing essentially the same thing - I've seen friends post about "my_virtual_a" among other things, but it seems that the folk that were notified from my account have seen the same notification I saw - the "Like" app.<br /><br />In the meantime, it may have harvested some of my personal data. There's nothing of real value in there, because I always suspected that facebook might be a bit insecure. I suppose I might get some more spam to one<br />or two of my email addresses now. On the other hand, I believe that some people store some kind of payment information in there, for buying silly valentines and things. So, the problem's potentially a bit more serious than just a new vector for some annoying spam.<br /><br />So, what's the security hole? Is it my fault for giving permission to the app? Or is it to do with the software? Or with the whole concept of social networks generally? You could partially plug it by having the permissions page prominently say who wrote the app - I like to think that I personally would be less likely to give perms to an app that was obviously not written by facebook. But not everyone would get that. Maybe the problem is partially that I expect facebook to be just a bit crap - it didn't surprise me that I had to grant perms to something I already used. Maybe the problem is that the app name "like" was free for a third party to use? But would you like to come up with the list of banned app-names? Maybe apps should have less freedom in the notifications they can send out? "$FREINDSNAME likes your photo" looks the same whether it's FB or some third party sending the notification. And the URL is a hashed and pretty anonymous facebook-redirect rather than an obvious photo URL - so my usual safe-browsing habits don't help at all there. Maybe the mechanism for sending notifications should always involve a dialog box popping up which makes clear what's being sent, and who to? That'd make doing normal things on facebook quite a bit more clunky - people might well just get in the habit of clicking "yes" to every single one, leaving us back where we are now.<br /><br />I think it's a fun set of questions anyhow. Any of you lot got any interesting thoughts?<br /><br /><b>ETA:</b> Or perhaps we really just want to remove consequential things like money from facebook, and live with an insecure system that worms occasionally navigate? I mean, people still hang around in forums where rickrolling and other annoyances are rife - it's just less annoying to those users than the alternatives. What do you think? Are you willing to live with the occasional facebook worm if it means you can have a social network that looks like the one we're all familiar with (without any of the more irritating security measures I'm suggesting here) ? How annoying or damaging do the worms have to get before you'd rather avoid facebook altogether?
https://totherme.livejournal.com/10399.html?view=comments#comments
social networks
security
research
facebook
public
12
-
https://totherme.livejournal.com/10063.html
Mon, 01 Feb 2010 23:47:31 GMT
Random 11pm thought: Privacy through insecurity.
totherme
https://totherme.livejournal.com/10063.html
If you haven't considered the potential for (and potential dangers of) total lack of privacy in the information age, go watch <a href="https://www.openrightsgroup.org/blog/2009/Bruce-Schneier-video-and-book-giveaway" target="_blank" rel="nofollow">this</a> before reading the rest of this post.<br /><br />I've met a whole bunch of cool new people in the last year, and I keep "in touch" with many of them primarily using facebook. You know how this story goes - you go to a conference or take a short course of gardening classes or something ; you meet new folk ; you spend a lot of time with them for a few weeks ; then you go your separate ways and communicate for a year or two only through the medium of broadcast "status updates" that can be read by anyone you've ever met.<br /><br />One of the folk I met last year has been getting increasingly facebook-eccentric. They've been posting increasingly embarrassing and personal status updates, starting their own fan club, joining the support groups for controversial political parties, and most recently, writing long essays defending their strange and cultish religious views. Of course, none of that stuff was <em>actually</em> my new friend - all they're really guilty of is forgetting to log out of facebook after using a public terminal. Repeatedly.<br /><br />So now, any time I see anything embarrassing on my new friend's facebook page, I'll just assume that they've left themselves logged in again, and someone's having a laugh at their expense. I don't know what's actually going on - I haven't seen or spoken to them in months. I'll just assume that anything "normal" is the truth, and anything out of the ordinary is a practical joke. And so will anyone else who knows them. If they run for the presidency of the US in 20 years time, and some journalist finds something juicy in the old digital records, the spin doctors will be able to laugh it all off. <q>That wasn't our candidate - that was a well documented series of attacks by notorious hackers of the time.</q><br /><br />Of course, this is just a special case of increasing the signal to noise ratio on the net - which you can do any number of ways. It's fairly well known that companies will post <a href="https://www.google.com/search?q=fake+product+review" target="_blank" rel="nofollow">fake product reviews</a> if they can get away with it. Perhaps we could all open large numbers of facebook accounts, and use each of them to communicate with 1/n of our friends. Perhaps spin doctors should spend their time inventing implausible stories about their candidates, and filling the net with them, so the real stories get lost in the mess. Perhaps they already do. I'm sure none of this is a new idea, but it tickled me that forgetting to log out, or having an easy to guess password might offer my friend more privacy in the long run, not less.<br /><br /><small>Also: I decided to try using the plural in this note - if anyone has an opinion on that vs <a href="https://en.wikipedia.org/wiki/Gender-neutral_pronoun" target="_blank" rel="nofollow">GNP</a>s or any other way of writing what I wanted to write, then feel free to comment.</small>
https://totherme.livejournal.com/10063.html?view=comments#comments
gnp
information control
random
public
5
-
https://totherme.livejournal.com/9734.html
Mon, 04 Jan 2010 06:21:24 GMT
Random 6am Thought
totherme
https://totherme.livejournal.com/9734.html
If the economy is like an ecosystem; then perhaps pushing your company into an aggressive monopoly is kinda like being such a dominant species that you can wipe out other species with impunity, and significantly alter planetary ecosystem. Good medium term strategy, potentially quite bad long term strategy.<br /><br />This train of thought began with a vague memory of <a href="https://www.theregister.co.uk/2009/12/02/google_hiring_practrices/" target="_blank" rel="nofollow">this</a> old reg snippit.
https://totherme.livejournal.com/9734.html?view=comments#comments
random
public
0
-
https://totherme.livejournal.com/9434.html
Tue, 07 Apr 2009 23:12:18 GMT
Temporary email addresses
totherme
https://totherme.livejournal.com/9434.html
<a href="https://news.bbc.co.uk/1/hi/technology/7985339.stm" target="_blank" rel="nofollow">ISPs are now keeping records of everyone you email</a> <small>(if you live in the EU)</small><br /><br />Not the contents of the mail yet - so perhaps it's not quite time to break out the PGP ubiquitously (and it's not a lot of use if you only use it for suspicious things, so it's pretty well got to be all or nothing). But what if you wanted to make your email flist just a little bit harder to automatically snoop and mine?<br /><br />Well, it seems to me that the answer is in randomly generated throwaway webmail accounts. Swap contact details with a person (using the same system) for the first time - this involves picking and registering a new webmail address.<br /><br />Each time you email them (or they, you), pick a new randomly generated address for both of you, and include the username and password of their new throwaway address in the email.<sup>1</sup><br /><br />With a bit of standard markup for including the new throwaway address and password in the email, this should be relatively easy to automate... Though it might involve typing a couple of capchas when you send a mail.<br /><br />Anyone fancy starting on a mutt or sup plugin? Some kind of uber-greasemonkey script might do something cool too.... Bonus points if you can make it work nicely with your threading engine of choice ;)<br /><br /><small><br /><sup>1</sup> Of course, if only suspicious people use it, and if the syntax for describing a new address is easy to mine for, then we're back where we started. So we may have to present a new randomly generated presentation syntax in each email too. But that's doable :) Especially if you do it in the middle of a markov chain generated signature, where it won't get on anyone's nerves,<br /></small>
https://totherme.livejournal.com/9434.html?view=comments#comments
email
privacy
tech
public
3
-
https://totherme.livejournal.com/8041.html
Thu, 15 May 2008 16:34:18 GMT
Functional Reactive (web) Programming
totherme
https://totherme.livejournal.com/8041.html
I just saw a talk by <a href="https://www.cs.brown.edu/~sk/" target="_blank" rel="nofollow">Shriram Krishnamurthi</a>.<br /><br />He showed us something live - essentially the thing I'm doing in this sub-one-minute <a href="https://www.totherme.org/frtime.swf" target="_blank" rel="nofollow">video</a>.<br /><br />From some of the questions asked afterwards, I gather that the concept may not be a new one, but I don't care - I'd not seen it before, and the idea blew me away.<br /><br />In the video, I show the <a href="https://www.drscheme.org" target="_blank" rel="nofollow">scheme</a> setup. The good folks at Brown have also seen fit to furnish us with a <a href="https://www.flapjax-lang.org/" target="_blank" rel="nofollow">web programming setup</a> which works on all the main browsers right now.
https://totherme.livejournal.com/8041.html?view=comments#comments
public
1
-
https://totherme.livejournal.com/7741.html
Fri, 15 Feb 2008 15:19:31 GMT
False Positives and Security.
totherme
https://totherme.livejournal.com/7741.html
Bruce Schneier continues to document the increasingly ridiculous <a href="https://www.schneier.com/blog/archives/2008/02/latest_news_on.html" target="_blank" rel="nofollow">war on the unexpected</a>:<br /><blockquote><br />Offshore oil rig evacuated after someone <a href="https://news.scotsman.com/scotland/Rig-worker39s-39dream39-sparked-bomb.3763123.jp" target="_blank" rel="nofollow">dreamed</a> <a href="https://www.timesonline.co.uk/tol/news/uk/article3346196.ece" target="_blank" rel="nofollow">of</a> <a href="https://www.guardian.co.uk/uk/2008/feb/11/uksecurityandterrorism" target="_blank" rel="nofollow">a</a> <a href="https://www.metro.co.uk/news/article.html?in_article_id=98289&in_page_id=34" target="_blank" rel="nofollow">bomb</a>.<br /><br />Sheridan College under lock-down because someone <a href="https://video.msn.com/?mkt=en-ca&brand=sympatico&fg=rss&vid=1e18560e-eab4-4cd7-a1e3-d2e45e2f465f&from=37" target="_blank" rel="nofollow">notices</a> <a href="https://blogto.com/city/2008/02/tripod_prompts_lockdown_at_sheridan_college/" target="_blank" rel="nofollow">a</a> <a href="https://www1.sheridaninstitute.ca/corporate/news/2008/post_lockdown.cfm" target="_blank" rel="nofollow">tripod</a>.<br /><br />Man arrested for posession of an <a href="https://www.dailymail.co.uk/pages/live/articles/news/news.html?in_article_id=513875&in_page_id=1770" target="_blank" rel="nofollow">MP3 player</a>.<br /></blockquote><br /><br />While reading, I found myself thinking about the fire service. I remember being taught in school how prank 112/999/911 calls cost lives. While all the fire engines are out entertaining the prank caller, a real fire elsewhere may be killing people.<br /><br />One of the characteristics of those real fires though, is that they're almost certainly not consciously trying to kill people. Except in extremely rare cases of premeditated arson, the probability of a real fire is independent of the probability of a prank call. That's not going to be the case with terrorists though - unlike accidental fires, terrorists actually want to hurt and frighten people. They're quite capable of calling the police to one place, and doing bad things in another. So surely our safeguards against false-positive terror alerts should be significantly stronger than our safeguards against false-positive fire alerts?<br /><br />The War on the Unexpected: Not just annoying - downright dangerous.
https://totherme.livejournal.com/7741.html?view=comments#comments
politics
security
system
public
0
-
https://totherme.livejournal.com/6707.html
Sun, 02 Dec 2007 14:05:01 GMT
Traditional Link Blogging
totherme
https://totherme.livejournal.com/6707.html
<a href="https://www.bbc.co.uk/mediaselector/check/player/nol/newsid_7120000/newsid_7123500?redirect=7123547.stm&news=1&bbram=1&nbwm=1&nbram=1&bbwm=1&asb=1" target="_blank" rel="nofollow">Biped Robot Wars</a><br /><br />Or, if you're in linux:<br /><tt><pre>
mplayer mms://wm-acl.bbc.co.uk/wms/news/media_acl/mps/fix/news/science_nature/video/136000/bb/136685_16x9_bb.wmv
</pre></tt><a name='cutid1-end'></a><br /><br />Very cool. Particularly the projectile weapon - which I think wouldn't have been allowed under the old televised robot wars rules...
https://totherme.livejournal.com/6707.html?view=comments#comments
robots!
public
0
-
https://totherme.livejournal.com/5129.html
Mon, 20 Aug 2007 18:10:15 GMT
Stop. Moshertime.
totherme
https://totherme.livejournal.com/5129.html
Run the following script in the same directory as a copy of "Killing in the name of" by Rage Against The Machine.<br /><br /><br /><tt><pre>
#!/usr/bin/env perl
$maxtime = 2700;
unless (@ARGV == 0) { # For testing volume, etc
#print "Dude!\n";
`mplayer -ss 41.7 -endpos 48.3 rage.mp3`;
}
while(1) {
$num = rand $maxtime;
sleep $num;
# print "Dude!\n";
`mplayer -ss 41.7 -endpos 48.3 rage.mp3`;
}
</pre></tt><br /><a name='cutid1-end'></a><br /><br />Whenever the music's playing, everyone has to mosh. That's the Rule.<br /><br />Other track/activity pair suggestions are welcome. Particularly if they happen to work nicely with the existing timestamps ;)
https://totherme.livejournal.com/5129.html?view=comments#comments
anti-angst
perl
hacking
meedja
Killing in the name of
Killing in the name of
better :)
public
1
-
https://totherme.livejournal.com/4154.html
Mon, 07 May 2007 13:32:57 GMT
Xmonad and KDE on kubuntu feisty
totherme
https://totherme.livejournal.com/4154.html
I've not been spending nearly as much time as I'd like to on <a href='https://www.livejournal.com/rsearch/?tags=%23haskell'>#haskell</a> recently, so I almost managed to completely miss the <a href="https://xmonad.org/" target="_blank" rel="nofollow">xmonad</a> phenomenon. Luckily for me, <a href="https://cgi.cse.unsw.edu.au/~dons/blog" target="_blank" rel="nofollow">dons</a> was good enough to <a href="https://cgi.cse.unsw.edu.au/~dons/blog/2007/05/01#xmonad_part1_model" target="_blank" rel="nofollow">write about it</a>, so I haven't missed out completely.<br /><br />Last year, I spent a few months running <a href="https://www.suckless.org/wiki/wmii" target="_blank" rel="nofollow">wmii</a> - which was fantastic. Since then I've been playing around with <a href="https://www.ubuntu.com/products/WhatIsUbuntu/desktopedition" target="_blank" rel="nofollow">Gnome</a> and <a href="https://kubuntu.org/" target="_blank" rel="nofollow">KDE</a>, which have advantages like <a href="https://www.konqueror.org/" target="_blank" rel="nofollow">konqueror</a> (as a file manager - I prefer FF as a browser), <a href="https://amarok.kde.org/" target="_blank" rel="nofollow">amarok</a> and <a href="https://www.kde-apps.org/content/show.php/KNetworkManager?content=46395" target="_blank" rel="nofollow">knetworkmanager</a>. I have been kinda missing the dynamic window management model though - so obviously I wanted to try out xmonad.<br /><br /><br />I pulled the source from the darcs repo rather than downloading the "stable" tarball, because my experiences playing around with <a href="https://www.cse.unsw.edu.au/~dons/lambdabot.html" target="_blank" rel="nofollow">lambdabot</a> had convinced me that the <a href='https://www.livejournal.com/rsearch/?tags=%23haskell'>#haskell</a> guys tend to keep their bleeding edge development repos as stable as many packaged binaries from elsewhere (so long as you have the latest dev tools on your system to build with, that is - which I would like to ^_^). Now this is fairly standard boring stuff, but I thought it worth mentioning in passing, because the obvious thing didn't work right away. xmonad (as mentioned in the readme) has some <a href="https://hackage.haskell.org/packages/hackage.html" target="_blank" rel="nofollow">hackage</a> dependancies which you have to satisfy before anything'll build. This is simple enough - you just download the packages mentioned from the URLs listed, and it should all work - but one of them (<a href="https://hackage.haskell.org/cgi-bin/hackage-scripts/package/X11-1.2" target="_blank" rel="nofollow">X-11-1.2</a>) didn't build:<br /><br /><tt><pre>
gds@air:~/hackage/X11-1.2$ ls
cbits config.mk.in configure configure.ac Graphics include LICENSE Setup.hs X11.buildinfo.in X11.cabal
gds@air:~/hackage/X11-1.2$ runhaskell Setup.hs configure
Configuring X11-1.2...
configure: /usr/bin/ghc-pkg
configure: Dependency base-any: using base-2.0
configure: Using install prefix: /usr/local
configure: Binaries installed in: /usr/local/bin
configure: Libraries installed in: /usr/local/lib/X11-1.2/ghc-6.6
configure: Private binaries installed in: /usr/local/libexec
configure: Data files installed in: /usr/local/share/X11-1.2
configure: Using compiler: /usr/bin/ghc
configure: Compiler flavor: GHC
configure: Compiler version: 6.6
configure: Using package tool: /usr/bin/ghc-pkg
configure: Using ar found on system at: /usr/bin/ar
configure: No haddock found
configure: No pfesetup found
configure: Using ranlib found on system at: /usr/bin/ranlib
configure: Using runghc found on system at: /usr/bin/runghc
configure: No runhugs found
configure: No happy found
configure: No alex found
configure: Using hsc2hs: /usr/bin/hsc2hs
configure: No c2hs found
configure: No cpphs found
configure: No greencard found
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking how to run the C preprocessor... gcc -E
checking for X... no<a name='cutid2-end'></a>
configure: creating ./config.status
config.status: creating config.mk
config.status: creating X11.buildinfo
config.status: creating include/HsX11Config.h
gds@air:~/hackage/X11-1.2$ runhaskell Setup.hs build
Setup.hs: Package X11-1.2 can't be built on this system.
gds@air:~/hackage/X11-1.2$
</pre></tt><br /><br />A quick google revealed the problem in an IRC log - my system (a default kubuntu feisty install, with a couple of things like GHC added after) didn't have the X11 development headers installed. I had a quick look (using the KDE prettification of the package manager - <a href="https://kde-apps.org/content/show.php?content=44909" target="_blank" rel="nofollow">adept</a>) for anything obviously called "X11-headers" or "X11-devel", but saw nothing. Rather than spend time searching, I decided to just click on a couple of things that looked like they had a lot of development dependancies, and hope that the package manager would install what I wanted while it resolved them. The packages I installed were called "libxmu-headers" and "libxmu-dev". I may have gotten away with just libxmu-headers, but I forgot to run "runhaskell Setup.hs configure" before trying "build", and so blindly got the same error message as before. Anyway, after installing those two packages, doing configure, build and install worked fine - though there were a load of warnings during the build stage. They looked pretty harmless, so I ignored them. I have so far suffered no nasal daemons as a result. There were similar warnings in building the mtu package.<br /><br />When I ran configure on the "X11-extras" package, I got the warning:<br /><tt><pre>WARNING: Xinerama headers not found. Building without Xinerama support</pre></tt><br /><br />...so I installed the ubuntu package "libxinerama-dev", and retried. That sorted everything fine :)<br /><br />Tangent:<br />Every time I installed anything from hackage during this process, I searched with adept to make sure that there wasn't already an ubuntu package that would likely make my life easier in the long run. Wouldn't it be great if hackage could be accessed as an ubuntu package repo? Or a debian repo, or whatever. I know that there's some froody "haskell layer" that the gentoo guys can put over their package manager to get stuff like this with the interface they usually use, but a debian one would be nice too. In fact, it would be <em>really</em> nice if hackage could present itself to any distro's package management system - if all the interfaces were well defined... I realise that to do this properly just for ubuntu would mean someone trawling through all the packages in hackage and noting down what debian/ubuntu packages they all depend on, and that this isn't likely to happen any time soon - but hey, I'm allowed to dream :)<br /><br />Anyway - dependancies aside, the build was simple - I had a binary ready to run in ~/bin<br /><a name='cutid2-end'></a><br /><br /><br /> Something's changed in the last few months though - I'm now doing most of my work on a laptop, rather than a desktop. This means I need to have easy access to battery information, and I need to be able to quickly and easily connect to any wireless networks that happen to be around. KDE does this wonderfully - and I've also gotten to quite like amarok ;) I'd rather not give up these luxuries...<br /><br />There are better solutions - one of which I'll come back to in a mo, but the first thing I wanted was something quick that worked, involved xmonad, and let me keep using knetworkmanager, etc. <br /><br />So, I opened up .bashrc and added:<br /><tt><pre>export KDEWM=~/bin/xmonad</pre></tt><br /><br />I was quite surprised to find how well this worked :) On logging in to X, with this new setting, I saw something like <a href="https://www.totherme.org/startup.png" target="_blank" rel="nofollow">this</a>.<br /><br /><br />So, the KDE systray isn't working - I guess it needs the window manager to pass it the windows it's supposed to manage - and the kicker is being managed like a window rather than being left to its own devices to place itself at the bottom of the screen. <br /><br />What I wasn't expecting to work, was <a href="https://www.totherme.org/notification.png" target="_blank" rel="nofollow">these things</a>.<br /><br /><br />But they do! :) See the notification in the top-left? Those work fine - don't get messed about by the WM at all. This means I get friendly warnings before my power dies, and neat little track name notifications when I'm playing music :)<br /><a name='cutid3-end'></a><br /><br /><br />I could ditch KDE altogether fairly quickly, I think. Most of the things I'd miss can be provided by <a href="https://www.suckless.org/wiki/tools/xlib" target="_blank" rel="nofollow">dmenu</a>, and a couple of command line invocations like "date" and "acpi -b" (though I might need to tweak something in the xmonad source to free up the screen real estate that dmenu would claim, but that doesn't look hard). There's even a dmenu ubuntu package, so that's lovely :)<br /><br />I don't want to do quite that though, because I'm so addicted to knetworkmanager. I think maybe my ideal setup at the moment would be xmonad, dmenu (with a clock, maybe a couple of buttons for frequently used apps and a battery meter on it) plus a systray of some kind, into which I could put knetworkmanager, klipper and amarok. Apparently the little mini-window things that go into systrays are implemented in X as a special kind of window - which is why they're handled as windows by xmonad. Maybe all that's required is to decide exactly what to do with them, and tell xmonad about the mini-window flag? Dons was good enough to talk us all through the data structure behind xmonad in his <a href="https://cgi.cse.unsw.edu.au/~dons/blog/2007/05/01#xmonad_part1_model" target="_blank" rel="nofollow">recent blog entry</a>, and he said that next time he'd tell us about the IO... So perhaps that'll give me all the knowledge I need to hack together an xmonad systray...?<br /><a name='cutid4-end'></a>
https://totherme.livejournal.com/4154.html?view=comments#comments
wm
xmonad
kde
ui
haskell
feisty
public
5
-
https://totherme.livejournal.com/3845.html
Fri, 27 Apr 2007 15:57:40 GMT
"Thinking in types" or "The mind of a programmer"
totherme
https://totherme.livejournal.com/3845.html
In a <a href="https://totherme.livejournal.com/3674.html" target="_blank">previous post</a>, <span class="ljuser i-ljuser i-ljuser-type-P " data-ljuser="pozorvlak" lj:user="pozorvlak" ><a href="https://pozorvlak.livejournal.com/profile/" target="_self" class="i-ljuser-profile" ><img class="i-ljuser-userhead" src="https://l-stat.livejournal.net/img/userinfo_v8.png?v=17080&v=905.1" /></a><a href="https://pozorvlak.livejournal.com/" class="i-ljuser-username" target="_self" ><b>pozorvlak</b></a></span> and I wondered about the differences between the thought processes that goes into writing good static code, and those that go into good dynamic code. We figured that there wasn't a lot out there to help dynamic programmers get the hang of static style thinking, so what follows is a simple little toy example, solved in what I think is probably a fairly static typey style.<br /><br />This is not a beginners haskell tutorial - I'm going to assume that you know about lists, higher order functions and fold in particular. This is for people that understand functional programming, but are frustrated by strongly statically typed functional programming. Actually, if there's anyone other than <span class="ljuser i-ljuser i-ljuser-type-P " data-ljuser="pozorvlak" lj:user="pozorvlak" ><a href="https://pozorvlak.livejournal.com/profile/" target="_self" class="i-ljuser-profile" ><img class="i-ljuser-userhead" src="https://l-stat.livejournal.net/img/userinfo_v8.png?v=17080&v=905.1" /></a><a href="https://pozorvlak.livejournal.com/" class="i-ljuser-username" target="_self" ><b>pozorvlak</b></a></span> reading this who's in that position, I'd appreciate a comment - I've no idea how many of you exist, or if this is the sort of thing that helps. <br /><br /><br />The problem is to write a function that works in a similar way to the perl "split" function. The one I choose to write behaves slightly differently from the perl one - I'll work with polymorphic lists rather than just strings of characters (there's no reason not to), and I'll restrict the argument I split on to being a singleton in the list. I appreciate that no true perl programmer would forego this functionality, but I think it makes this little toy far easier to understand, and the function is still useful even with that restriction.<br /><br />There are lots of ways to write this function, and this is how I happened to hack it together earlier today, when I needed to use use it for something. There are certainly better ways to write the function - my intention here is to try to give voice to as many as possible of the little subconscious thoughts that make programming happen.<br /><br />This is statically typed programming, so we start with the type we want:<br /><tt><pre>
split :: b -> [b] -> [[b]]
</pre></tt><br />It's clearly a list function, and map probably isn't going to do it because ther's no obvious relationship between the length of the output list and the length of the input list. Will fold work?<br /><tt><pre>
foldl :: (a -> b -> a) -> a -> [b] -> a
</tt></pre><br />In the case where <tt>a</tt> is equal to <tt>[[b]]</tt> we have:<br /><tt><pre>
foldl :: ([[b]] -> b -> [[b]]) -> [[b]] -> [b] -> [[b]]
</tt></pre><br />and I'll be able to do:<br /><tt><pre>
split x = foldl f y
</pre></tt><br />Which looks like it'll typecheck for some approproate <tt>f</tt> and <tt>y</tt>. <br />Let's choose the simplest thing first - <tt>y</tt>. This is the bounds case of the fold - the thing that gets returned of the final argument is just an empty list. <tt>""</tt> won't type check as <tt>[[b]]</tt>, so let's try <tt>[[]]</tt>, and see what happens. Now, can we find the <tt>f</tt>? If we can, it will certainly be of type:<br /><tt><pre>
f :: [[b]] -> b -> [[b]]
</pre></tt><br />If <tt>y</tt> is <tt>[[]]</tt>, then <tt>f</tt> doesn't need to worry about the <tt>[]</tt> case for the first arg, so we can have (remembering that <tt>x</tt> is in scope already):<br /><tt><pre>
f (acc@(y:ys)) z = if (z==x) then []:acc
else (z:y):ys
</pre></tt><br />Notice that we've used <tt>==</tt> in there, so we'll need our list elements to be in class <tt>Eq</tt>. The function as a whole, then, will look like:<br /><tt><pre>
split :: (Eq a) => a -> [a] -> [[a]]
split x = foldl f [[]] where
f (acc@(y:ys)) z = if (z==x) then []:acc
else (z:y):ys
</pre></tt><br />Let's try testing it :)<br /><tt><pre>
*Main> split ',' "a list, of, wordey thingies "
[" seigniht yedrow ","fo ","tsil a"]
*Main>
</pre></tt><br /><br />lol :)<br /><br /><tt><pre>
*Main> reverse $ map reverse $ split ',' "a list, of, wordey thingies "
["a list"," of"," wordey thingies "]
*Main>
</pre></tt><br />That's better.<br /><br />The behaviour on the empty list case is still slightly annoying:<br /><tt><pre>
*Main> reverse $ map reverse $ split ',' ""
[""]
*Main>
</pre></tt><br />...but at this stage I had what I needed for my own little hack, so I was happy. This isn't exercise-code that's being marked - it's not particularly pretty or general or fast. It's just a little snippit of something I wanted to run.<a name='cutid1-end'></a> If you've been coding in the same paradigm (scripts, OO, whatever) for a long time, then I imagine this thought process will seem like an awful lot of effort, for very little result. I don't think it's a lot of effort though - if I hadn't made the decision to self-analyse while I was writing this little function, I'd have done it in a few seconds without thinking about it. I think that all programmers do a comparable amount of work whenever they write a little function or procedure like this, but it's all subconscious, and we rarely talk or even think about it.<br /><br />I'd be interested to see how other people solve similarly simple problems. I'm not interested in the solution itself, I'm interested in the thoughts that lead you to that solution. How do the rest of you do it?
https://totherme.livejournal.com/3845.html?view=comments#comments
thought processes
hacking
typing
haskell
public
18
-
https://totherme.livejournal.com/3674.html
Mon, 09 Apr 2007 16:46:49 GMT
Development With Types
totherme
https://totherme.livejournal.com/3674.html
Lots of folk seem to agree that one of the nice things about having a blog is that you can use it as a public whiteboard, to help order your thoughts on any given subject. I don't post all that often myself, but this isn't because my thoughts are already ordered. It's because I've long been in the habit of using a different technology for ordering my thoughts - and when it comes to the sort of geeky code philosophy that might be most at home here, that technology is often <span class="ljuser i-ljuser i-ljuser-type-P " data-ljuser="pozorvlak" lj:user="pozorvlak" ><a href="https://pozorvlak.livejournal.com/profile/" target="_self" class="i-ljuser-profile" ><img class="i-ljuser-userhead" src="https://l-stat.livejournal.net/img/userinfo_v8.png?v=17080&v=905.1" /></a><a href="https://pozorvlak.livejournal.com/" class="i-ljuser-username" target="_self" ><b>pozorvlak</b></a></span>.<br /><br />Every so often, he'll encourage me to blog something from one of our email conversations and invite comment - and I should do so far more often than I do. I don't think he'd object to my describing him, for the purposes of this post, as a "recovering perl hacker". That is to say that he's fairly happy with the sensibilities of the perl hacker, and using them to produce Stuff. He's also aware that there are other ways of doing things, and wants to understand them. One of these ways is embodied by the Haskell language and community. The relationship between the language, the community and the development style are a frequent topic of our emails. I'll open then, by quoting a question he asked in a recent email:<br /><blockquote><br />...this led me to a question that I've been wondering about for a while: various Haskell bods (Cale, <a href="https://progtools.comlab.ox.ac.uk/members/duncan" target="_blank" rel="nofollow">Duncan</a>, <a href="https://en.wikibooks.org/wiki/Haskell/YAHT" target="_blank" rel="nofollow">YAHT</a>, etc) claim that Haskell code, once it compiles, is typically bug-free. YAHT says "most of the code I've written is not buggy, as most of the common sources of bugs in other languages simply don't exist in Haskell."<br /><br />This is not at all my experience. I haven't measured it properly or anything, but it feels like my Haskell code is approximately as buggy as my Perl code, with the added downsides that it takes a lot longer to get to the stage where you can test it, and a lot longer to find the bugs once you can :-( [Must get round to trying Hat.] But things like off-by-one-errors, infinite loops, and good old "not understanding the problem properly and writing the wrong thing" are all possible in Haskell, as I've discovered to my cost.<br /><br />There are two ways I can see to interpret their statements:<br /><br /><ol><li>They're talking about things like memory leaks, null pointer bugs, bugs caused by looping over array indices, etc, that don't exist in Perl either, but do exist in C.</li><br /><li>They're using l33t guarantee-oriented sk1llz to prove correctness of their code using the type system.</li></ol><br /><br />Do you know which one it is?<br /></blockquote><br /><br />Now, I certainly think there's a fair bit of (1) that goes on (for example, using the <tt>Maybe</tt> monad to <a href="https://blog.moertel.com/articles/2006/10/18/a-type-based-solution-to-the-strings-problem" target="_blank" rel="nofollow">solve the strings problem</a>), but I'm interested here in what <span class="ljuser i-ljuser i-ljuser-type-P " data-ljuser="pozorvlak" lj:user="pozorvlak" ><a href="https://pozorvlak.livejournal.com/profile/" target="_self" class="i-ljuser-profile" ><img class="i-ljuser-userhead" src="https://l-stat.livejournal.net/img/userinfo_v8.png?v=17080&v=905.1" /></a><a href="https://pozorvlak.livejournal.com/" class="i-ljuser-username" target="_self" ><b>pozorvlak</b></a></span> perceives as (2). In short, I don't think anyone's seriously going round proving all their code, using the type system or otherwise - but I do think he may have spotted a difference in the typical approach to a problem between average perl and haskell advocates. <br /><br />What follows is pretty well taken straight out of the reply I emailed back. In it, I sort of accidentally started using the word "Duncan" to mean "a mythical perfect haskell programmer". I hope he doesn't object.<br /><br />Do you remember that <a href="https://www.cs.utexas.edu/users/EWD/transcriptions/EWD10xx/EWD1036.html" target="_blank" rel="nofollow">Dijkstra rant</a> we both read some time ago?<br /><br />It included such gems as:<br /><br /><blockquote>The nice thing of this simple change of vocabulary is that it has such a profound effect: while, before, a program with only one bug used to be "almost correct", afterwards a program with an error is just "wrong" (because in error).</blockquote><br /><br />and:<br /><br /><blockquote>Right from the beginning, and all through the course, we stress that the programmer's task is not just to write down a program, but that his main task is to give a formal proof that the program he proposes meets the equally formal functional specification. ... we see to it that the programming language in question has not been implemented on campus so that students are protected from the temptation to test their programs.</blockquote><br /><br />I think this might be an indication that Dijkstra writes assembly the way that Duncan writes haskell - and vice versa... I'm not sure - but I think there might be something in the notion.<br /><br />Let's think about the two... In fact - I guess I'll start by thinking about Dijkstra, and wind back around to haskell in a second... When we read that rant for the first time (and exchanged emails about it), the impression I eventually came away with was that Dijkstra had an interesting idea, so far as it went. He would probably be able to produce a generation of students who could each take a formal specification of a problem (or a similarly clear exam-question style description of a problem), and produce correct code which satisfies it. This is a useful skill, but is only part of the job of the programmer, who also has to come up with that specification in the first place.<br /><br />You mention three classes of bugs (off by one errors, infinite loops, and not really understanding the problem) in your email - it's the third of these that I wasn't convinced that Dijkstra's methods would deal with for us.<br /><br />I am fairly convinced that the first two can be eliminated this way. I have an excellent book on my desk - a hang over from the Oxford course - called "<a href="https://www.amazon.co.uk/Programming-Derivation-Algorithms-Prentice-Hall-International/dp/0132041081/" target="_blank" rel="nofollow">Programming: The derivation of Algorithms</a>" by Anne Kaldewaij. It shows how to take a certain sort of specification and, almost entirely mechanically, derive the programme from the specification. There are points of choice - of creativity along the way, but they're limited to high level things. Low level details like off-by-one errors are eliminated by the system, so long as you're able to follow it (it can't guard against typos). Termination proofs are part of the thing too, so you're not going to get infinite loops either.<br /><br />I never actually write procedural code this way - it takes far too long. But I can see that a mechanical method exists which will eliminate those kinds of silly mistakes, and I guess I nod towards it when I write complex things (which isn't very often).<br /><br />I'm willing to take it on faith that Dijkstra could produce coders who could code in a way similar to that - which eliminated those sorts of bugs, and he could probably have them turn out code at a fairly professional rate. I think many of these sorts of problems can be eliminated by certain sorts of high level language. I think the memory errors you mentioned, and the <a href="https://blog.moertel.com/articles/2006/10/18/a-type-based-solution-to-the-strings-problem" target="_blank" rel="nofollow">strings problem</a> I mentioned are also in this class of errors. The difference between the solutions to those problems that we mentioned, and the solution that Dijkstra proposes, is that ours is packaged up - the proof of the java garbage collector is in the mind of some Sun engineer somewhere - and java programmers don't have to care. There doesn't happen to be a packaged up proof/method for the off by one error you came across, so the error caught you out. The advantage that Dijkstra's students would have, is that they'd be versed in that style from the beginning - they'd be able to use the garbage collector the same as you, but when they found a gap in the system (the space for an off-by-one bug), they'd be able to fill it in, and avoid the bug.<br /><br />So, for that class of what I'll call "silly mistake" bugs, I think that haskell's probably better than perl, is better than C, is better than assembly. None are perfect, because none of them produce proofs automatically, but someone versed in that particular skill can fill in those gaps.<br /><br />The interesting class of bugs is the "not understanding the problem" class. Having a specification eliminates this problem, so we can think of it as "producing a specification" or "describing the problem" or something like that. I know that Dijkstra has written big reliable code, so it seems to me that he has a solution to this problem, even if he doesn't bang on about it so much as he does about eliminating the "silly mistakes".<br /><br />So, back to the point in hand - haskell and Duncan's programming style. I suspect that both Duncan and Dijkstra may have hit upon a similar solution to the specification problem, namely, to explore the problem in a different intellectual space than the runtime-inspired one that imperative programmers (apart from Dijkstra) tend to use. A portion of that space may well be type-system inspired for Duncan. It may be quite a large portion, but I don't think that's all of it. I suspect that when he's writing a programme, he thinks about what he wants it to guarantee first (as distinct from what he wants it to do - as you spotted), then tries to express a portion of that as a series of function types... The programme isn't even in his head yet.. The specification (probably part formed at this stage) is in his head, and the silhouette of the specification on the type system is on the screen. Then, the interesting bit - the agile methods style cycle of prototyping, testing and refining the spec can happen using the type system and Duncan's mind. He's practised at knowing what can and can't be easily expressed in the type system, so he doesn't waste time trying to express things that aren't easily expressible - but there's enough of a silhouette for him to get a tangible grip on the programme. Dijkstra, of course, doesn't need this - he's a maths god, and can do this stage all in his head.<br /><br />Once the types of his functions are all written down, I'd guess that the spec is clear enough to him, that he can spend all his effort now on eliminating the "silly mistake" type bugs. He still hasn't written any code, but he already knows what the shadow of the code looks like, so he's free to concentrate on the detail as he refines the specification in his head to code on the screen. If he's chosen his types carefully, many silly mistakes will be eliminated by the type system. And since he's been thinking about the relationship between the spec, and the types he's written down, it'll be more obvious to him what guarantees he needs that the type system can't give him - so he'll be watching for those mistakes as he writes the function bodies, and possibly coming up with other abstractions to help guard against them on the way.<br /><br />So, I guess an advantage of this kind of method would be that one separates out the problem of understanding the problem, from the problem of silly mistakes in implementation... Tackle the first whole heartedly first, then you're free to tackle as much of the second as can't be done mechanically already with your full attention.<br /><br />Does that make any sense? It's kind of a stream of thought, and I'm probably projecting a whole load of random junk onto Duncan's image - but it seems plausible to me that such a theoretical Duncan might exist.<br /><br />Perhaps I/we should send him a copy of this, and ask how close it comes to what he does ;)
https://totherme.livejournal.com/3674.html?view=comments#comments
perl
hacking
codology
haskell
"I know what I know" by Paul Simon
"I know what I know" by Paul Simon
contemplative
public
6
-
https://totherme.livejournal.com/3417.html
Thu, 15 Feb 2007 11:25:53 GMT
Techno trousers!
totherme
https://totherme.livejournal.com/3417.html
I'm amazed I haven't been following <a href="https://www.youtube.com/watch?v=P6nX5q3gVUM" target="_blank" rel="nofollow">this</a> for some time. I mean, how could I fail to notice someone building working strength enhancing robot exo-suits? But no - the first I heard about it (about this team - I knew vaguely about some US folk having battery issues) was when I saw the BBC <a href="https://news.bbc.co.uk/player/nol/newsid_6350000/newsid_6352900/6352921.stm?bw=bb&mp=rm" target="_blank" rel="nofollow">video</a> yesterday.<br /><br />It's a whole body integrated suit, with a battery life of about 2 hours and 40 minutes. It uses skin patches to listen for nerve impulses, and follows your intended movements. It doesn't look all that bulky, and it seems pretty strong (the prof says in the video it can make you "like 5 times stronger"). The researchers who came up with it are <a href="https://sanlab.kz.tsukuba.ac.jp/HAL/indexE.html" target="_blank" rel="nofollow">these guys</a>, and they have an <a href="https://en.wikipedia.org/wiki/Cyberdyne_Systems" target="_blank" rel="nofollow">ominously named</a> <a href="https://www.cyberdyne.jp/English/index.html" target="_blank" rel="nofollow">spin off company</a> to market the thing :)<br /><br />Looks to me like a much cooler alternative to walking with a stick for the arthritic.
https://totherme.livejournal.com/3417.html?view=comments#comments
cool
robot suit
health
tech
geeky
public
3
-
https://totherme.livejournal.com/2942.html
Mon, 27 Nov 2006 15:50:29 GMT
Editor agnosticism in haskell examples
totherme
https://totherme.livejournal.com/2942.html
<span class="ljuser i-ljuser i-ljuser-type-P " data-ljuser="pozorvlak" lj:user="pozorvlak" ><a href="https://pozorvlak.livejournal.com/profile/" target="_self" class="i-ljuser-profile" ><img class="i-ljuser-userhead" src="https://l-stat.livejournal.net/img/userinfo_v8.png?v=17080&v=905.1" /></a><a href="https://pozorvlak.livejournal.com/" class="i-ljuser-username" target="_self" ><b>pozorvlak</b></a></span> recently <a href="https://pozorvlak.livejournal.com/34731.html" target="_blank">discovered</a> a bit of a gotcha in writing haskell examples:<br /><br />If I'm in emacs, and I write this:<br /><tt><pre>tick = do n <- get; put (n+1); return n;</pre></tt><br /><br />on three lines, it comes out like this:<br /><tt><pre>
tick = do n <- get
put (n+1)
return n
</pre></tt><br /><br />This is because emacs has a particularly smart indent mode - it notices the "do", and realises that I want the next line to line up with the first word after the "do" on the previous line.<br /><br />Vim doesn't do this. If I write it (using almost exactly the same keypresses) in vim, I get this:<br /><br /><tt><pre>
tick = do n <- get
put (n+1)
return n
</pre></tt><br /><br />That's because vim doesn't understand the "do". It just knows that I've hit the tab key, so I want it more indented than it was before. Note that there are no literal tabs in there (which I think we're probably all agreed would be bad) - it's just that there aren't the right number of spaces. The "put" doesn't line up with the "n <-", so haskell thinks that the "n <-" was the last statement in the do block. Which is illegal, so it won't compile.<br /><br />This could be particularly frustrating for a beginner (who might be using notepad for all we know), trying to copy a worked example from a web page.<br /><br />If anyone's out there writing docs for haskell libraries, or tutorials, or whatever, I would like to suggest the following form:<br /><br /><tt><pre>
tick = do
n <- get
put (n+1)
return n
</pre></tt><br /><br />Now it doesn't matter how much you indent your do block - it's obvious to all concerned that the "n <-" should line up with the "put" - so it'll compile first time - whichever text editor you type it in :)<br /><br />Of course, it may be that all the experienced haskellers out there are already doing this - but I didn't know about it, so I figured it couldn't hurt to mention it again.
https://totherme.livejournal.com/2942.html?view=comments#comments
docs
haskell
code
public
3
-
https://totherme.livejournal.com/2710.html
Tue, 07 Nov 2006 15:44:57 GMT
Quick musing...
totherme
https://totherme.livejournal.com/2710.html
We all know and love <a href="https://www.haskell.org" target="_blank" rel="nofollow">Lazy</a> <a href="https://en.wikipedia.org/wiki/Lazy_evaluation" target="_blank" rel="nofollow">Evaluation</a>[1]. Among other things, it allows us to do cool stuff like <a href="https://thread.gmane.org/gmane.comp.lang.haskell.general/13857/focus=13857" target="_blank" rel="nofollow">optimize away benchmarks</a>. It occurred to me today though, that the problem with laziness in life in general is that sometimes you get hit with 12 deadlines at once and wish you'd previously been a bit more eager. So I wonder if anything yet exists which might be called "opportunistic evaluation"? <br /><br />Such a thing could be thought of as a next logical step for giving lazy evaluation systems a kind of social conscience. A system running a single (potentially) lazy programme might be given a regular update of what resources are up for grabs. When the system's doing nothing else (particularly in a very parallel system if there are lots of free thread slots), it could go hyper-eager, speculatively calculating values which might be required depending on the future flow of the programme. When the system's very busy it could fall back to maximum laziness (reaping the harvest of the eager work that went before) until the spike has passed.<br /><br />I suppose this is <em>sort of</em> doable (or simulable) if you have many, many small unix progs, piped together (for laziness) and appropriately niced... But even that (increasingly unlikely) scenario doesn't allow for speculative evaluation while (for example) waiting for IO.<br /><br />At the moment, I'm thinking that the quickest route to such a system would involve some OS integration (either hacked into linux, or possibly built in to some sort of <a href="https://www.cse.ogi.edu/~hallgren/House/" target="_blank" rel="nofollow">research OS</a>), and some of the tricks of the <a href="https://en.wikipedia.org/wiki/Partial_evaluation" target="_blank" rel="nofollow">partial evaluation</a> crowd. But you might know better :) Is there another route? Has someone else already built it? I'd appreciate any links left in the comments :)<br /><br />[1] I'd also like to be able to hyperlink to two places at once - perhaps your browser would give you a little context menu when you click on the multi-link or something.
https://totherme.livejournal.com/2710.html?view=comments#comments
languages
os
research
haskell
unproductive
public
8
-
https://totherme.livejournal.com/2303.html
Mon, 02 Oct 2006 15:54:21 GMT
How to start a flame war...
totherme
https://totherme.livejournal.com/2303.html
A few posts <a href="https://totherme.livejournal.com/1052.html" target="_blank">back</a>, I mentioned that I was going to try switching from vim to emacs again (editor switching being something I do on a regular basis for a variety of reasons), so as to have a go at a new collaborative editing gadget.<br /><br />Well, I haven't managed that yet, but I have finally got the latest gnu emacs cvs snapshot running at college, and discovered another cool thing I'd previously been unaware of:<br /><br /><a href="https://www.gnu.org/software/auctex/preview-latex" target="_blank" rel="nofollow">preview-latex</a> mode, in combination with <a href="https://www.emacswiki.org/cgi-bin/wiki/AUCTeX" target="_blank" rel="nofollow">AUCTeX</a> is making mathematical document generation <em>so</em> much easier for me now than when I was using vim - it's unbelievable. Recently, I've been generally of the opinion that the two editors were pretty well as functional as one another (at least if you allow vim to delegate elisp-like stuff to the shell, and hence your scripting language of choice), but I'd not seen anything like this in vim... Is there actually a feature-difference in these editors after all?<br /><br />Well, <a href="https://vim-latex.sourceforge.net/" target="_blank" rel="nofollow">not really</a> - vim can't do the funky previews, but it does do a whole load of other cool stuff that I hadn't noticed, and wasn't using. It looks scarily like emacs and vim are actually constructively competing with each other - which is nice :)<br /><br />The moral for me, I guess, is that I should take <em>even more</em> time to read about cool things that might enhance my productivity - because they're appearing at a rate of knots ;)
https://totherme.livejournal.com/2303.html?view=comments#comments
editors
emacs
vim
latex
public
3
-
https://totherme.livejournal.com/1884.html
Sat, 09 Sep 2006 13:15:32 GMT
planet.haskell.org
totherme
https://totherme.livejournal.com/1884.html
I woke up this morning to discover that my name had been mentioned in the <a href='https://www.livejournal.com/rsearch/?tags=%23haskell'>#haskell</a> channel while I was asleep - I think of myself as a lurker in there, so this surprised me. Checking my scrollback, it was dons asking the lambdabot when was the last time it had seen me..<br /><tt><br /><blockquote><br /> 13:58 < gds> dons: You "@seen"ed ?<br /> 13:58 < dons> gds, ah let me think<br /> 13:58 < gds> (morning all ;) )<br /> 13:58 < dons> gds, I think it was to ask if you wanted to add your blog to planet.haskell.org ?<br /></blockquote><br /></tt><br /><br />So, yay :) Hello <a href="https://planet.haskell.org/" target="_blank" rel="nofollow">planet.haskell</a> :)
https://totherme.livejournal.com/1884.html?view=comments#comments
blogs
haskell
code
cheerful
public
0
-
https://totherme.livejournal.com/1705.html
Wed, 16 Aug 2006 14:24:16 GMT
Static typing...
totherme
https://totherme.livejournal.com/1705.html
Just a quick note about my last post... This fits somewhere into the great static vs dynamic typing war, and doesn't aim to be comprehensive - it's just one piece of ammo for one side.<br /><br />Writing <a href="https://totherme.livejournal.com/1477.html" target="_blank">this</a> took a lot longer than I expected. At the time, it felt like I was fighting haskell's type system - which is something I've heard a lot of people complain about. I'm interested in the issues around the usefulness of typing, so I paid attention to my thoughts for later reference.<br /><br />One of the tools I was using to write that little snippet was the <a href="https://www.cse.unsw.edu.au/~dons/lambdabot.html" target="_blank" rel="nofollow">lambdabot</a> - it provides a number of useful functions like generating point free code from arbitrary functions, and performing type inference and code evaluation. It's amazing how productive IRC can be as a development environment :)<br /><br />Back to the point - I was fighting the type system. The error I kept getting was:<br /><pre>
Couldn't match `[[Char]] -> [[Char]]' against `IO String'
Expected type: FilePath -> [[Char]] -> [[Char]]
Inferred type: FilePath -> IO String
In the expression: ((hGetContents =<<)) . (flip openFile ReadMode)
In the first argument of `map', namely
`(((hGetContents =<<)) . (flip openFile ReadMode))'
</pre><br /><br />This didn't feel very helpful to me - and it'll feel even less helpful to you, since you don't have the code that generated that error. You just have the working code I eventually produced when I figured out what was going on.<br /><br />I haven't given you the code that produced the error yet, because with the correct code to hand, the error in the broken stuff is obvious. And the point I want to make is that it's a real error - I'd misunderstood what one of the functions I wanted to use did. Not a complex, poorly documented function, but a (well actually a pair of) well written, basic function(s) that I'm very familiar with. It was basically a thinko, I guess - but one that it took me a while to spot. Luckily for me, the type checker spotted it before I tried to even run the code. I suspect it's arguable whether a dynamic system with a bit of testing would have produced a more readable error message, but in this instance, I suspect not.<br /><br />I guess I'll tell you the error now. In the working code, I do a <tt>foldr</tt> using the function <tt>liftM2 (++)</tt> - the error was caused by my thinking that <tt>(=<<) (++)</tt> meant the same thing. Of course, I didn't know about the function <tt>liftM2</tt> at the time (and how I discovered it is an excellent advert for the powers of the lambdabot, but is also, unfortunately, beyond the scope at the moment) - but that was my error. I thought that <tt>(=<<) (++)</tt> did what <tt>liftM2 (++)</tt> actually does. <br /><br />Why did I think such a silly thing in the first place? Well, I'd been prototyping parts of my function using the lambdabot. I'd done the following in IRC:<br /><pre>
14:55 gds : > foldr ((=<<) (++)) "" [return "Hello ", return "World"]
14:55 lambdabot : "Hello World"
</pre><br />Fantastic! It does exactly what I want :)<br /><br />Actually, it wasn't doing exactly what I wanted - I'd failed to specify that the list should be a list of IO String. The "return" statements and the literal strings allowed the interpreter to infer that they should be M Strings for some monad M, but in this instance, they could be for any monad at all. The monad it found, which my erroneous function could deal with was the Reader Monad.<br /><br />In my safe little testing environment, the bug could be worked around by a dynamic system choosing to evaluate the code using the Reader Monad. But once the code was deployed, it would be forced into using the IO Monad. If my code hadn't been statically checked, I believe it would have died at runtime with an error approximating to "IO does not equal Reader". I think that this is about as useful as the error message I did get - except it could well have been too late. <br /><br />So, all that time I thought I was fighting the type system, it turns out I was actually fixing a real runtime bug. How about that?<br /><br />Like I said up at the top, this isn't comprehensive or balanced. This is a single anecdote out of the uncountable number out there (some unknowable percentage of which are for each side), so you have to weight it according to your own prejudices and utility functions and see if it affects your existing working conclusion.<br /><br />For me, though - it was an experience, not an anecdote. One in which a static typechecker actively stopped me from delivering (in this case to an audience rather than a client) broken code.
https://totherme.livejournal.com/1705.html?view=comments#comments
types
haskell
code
thoughtful
public
0
-
https://totherme.livejournal.com/1477.html
Tue, 15 Aug 2006 13:18:27 GMT
Haskell for reformed perlmongers
totherme
https://totherme.livejournal.com/1477.html
Do you miss being able to type <tt>while (<>) { ... }</tt> ? If so, just slap the following in your local handyfunctions library:<br /><br /><pre>
import System
import IO
import Monad
perlGetContents :: IO String
perlGetContents = do
args <- getArgs
if (args == []) then getContents
else foldr (liftM2 (++)) (return "") $
map ((hGetContents =<<) . flip openFile ReadMode) args
</pre><br /><br />Now you can do things like:<br /><pre>
cat "main = putStr =<< perlGetContents" > cat.hs
</pre><br />:)<br /><br />UPDATE: Added a linebreak for all those narrow people out there ;)
https://totherme.livejournal.com/1477.html?view=comments#comments
haskell
hack
code
Great Big Sea
Great Big Sea
creative
public
0
-
https://totherme.livejournal.com/1052.html
Wed, 26 Jul 2006 11:36:13 GMT
Editor wars for the new millenium
totherme
https://totherme.livejournal.com/1052.html
Hm - this started out as an email to <span class="ljuser i-ljuser i-ljuser-type-P " data-ljuser="pozorvlak" lj:user="pozorvlak" ><a href="https://pozorvlak.livejournal.com/profile/" target="_self" class="i-ljuser-profile" ><img class="i-ljuser-userhead" src="https://l-stat.livejournal.net/img/userinfo_v8.png?v=17080&v=905.1" /></a><a href="https://pozorvlak.livejournal.com/" class="i-ljuser-username" target="_self" ><b>pozorvlak</b></a></span>, but it seems to have turned into more of a blog, so here it is.<br /><br />As I'm sure anyone bothering to read this will know, I'm a coder, and I like to be aware of what's going on in the market for the tools I might find myself using. There is of course one tool that we tend to hold pretty close to our hearts - chefs have their knives, musicians their instruments, we have our text editors. Laughable isn't it? But we do seem to get quite exited about them.<br /><br />In the last year or so, I've been getting less excited about the old ascii crunchers though - because it seemed to me that they weren't going anywhere. Vim and Emacs seem mostly functionally equivalent (and I do regularly use and customise them both) - IDE's can be fun - I tend to code java in netbeans now, but they can't yet offer the uniformity of interface or efficiency of use that the two old stalwarts do...<br /><br />Anyway - I was curious about what was going to happen next, and I was writing to pozorvlak about one big possibility.<br /><br />So, here's the next editor battleground: The Network.<br /><br />Obvious when you think about it - that's where everyone else is duking it out - why not the editors?<br /><br />Dramatis Personae:<br /><br /><dl><br /><dt>Vim</dt><dd>an old stalwart</dd><br /><dt>Emacs</dt><dd>another old stalwart</dd><br /><dt>Google</dt><dd>a network mogul, getting into editing</dd><br /><dt>Gobby</dt><dd>a new, network-centric editor and protocol</dd><br /></dl><br /><br />The story is easiest to tell if we start with google:<br /><br />Google bought a web-office company - last year I think it was. One of these groups of people who want to host your office apps, and have you access them through your web browser. The idea's not new - people have been trying it for almost as long as I've been on the web. Early ones were all forms and CGI - they sucked. Google just released <a href="https://spreadsheet.google.com" target="_blank" rel="nofollow">this</a>.<br /><br /><br />That absolutely does not suck - it is in fact, very cool indeed. Google store your data, so you can access it from anywhere, and you don't have to worry about backups. Google run the application, so you never have to worry about compatibility ever again (they can import and export excel and html, but those are only the edges of the system - users of google spreadsheet will trade google spreadsheets, and since they're all running the same programme, there're no versioning issues to worry about). That's a slight lie, since your browser has to be compatible, but if it's Firefox or IE, then it is compatible, so you're ok. Google manage your security as well as your bank manages your online money. They allow you to specify precisely who can see, and who can edit your document. They also allow you to concurrently edit with someone else - there's a chat window at the side of the screen to help. Concurrency just works - you're both editing the same thing at the same time. We no longer need to collaborate through clunky versioning systems like CVS.<br /><br /><br />Google didn't just buy (and finish) a spreadsheet though - they're working on the word processor. Once that's out, I have serious doubts<br />about the business sense of Office or OpenOffice.<br /><br />So, there's the first contender for the crown - business orientated rather than code orientated, but very definitely in the editing<br />documents world now. <br /><br />Next up, <a href="https://gobby.0x539.de/" target="_blank" rel="nofollow">gobby</a>:<br /><br /><br />A collaborative text editor and protocol. I haven't used it yet, but they're talking about it on <a href='https://www.livejournal.com/rsearch/?tags=%23haskell'>#haskell</a> as I type. From the web page, it<br />sounds cool, but early on in development. Looks a little more programmer orientated to me than the google stuff - and they don't insist on<br />holding all your data themselves. So, if google is the centralised approach, it looks like gobby is the decentralised version (looks like<br />it does need a server, but the server is lightweight enough that you can run them ad hoc wherever the documents happen to be - as you might<br />imagine). I'll write more when I've tried it. <br /><br />Next up: <a href="https://dev.technomancy.us/phil/wiki/ebby" target="_blank" rel="nofollow">emacs</a>:<br /><br />The oldest text editor still in common usage (yes, even older than vi - just). The link there is to a gobby implementation in emacs lisp. Seems like the emacsers are embracing and extending, adding gobby's collaboration stuff to their massive set of other editing tools and<br />widgets. This seems to me like a short term winner for coding, because emacs already has excellent support for every language out there - I<br />seriously doubt that the gobby editor can come close to matching that kind of support. <br /><br />(as it happens, the <a href='https://www.livejournal.com/rsearch/?tags=%23haskellers'>#haskellers</a> were using this, not vanilla gobby. Emacs has syntax highlighting and so on for haskell. Gobby, I suspect, does not)<br /><br />Finally, we have <a href="https://www.vim.org" target="_blank" rel="nofollow">vim</a>:<br /><br />Who, so far as I can tell, are missing the boat... This seems like a pity to me, since I'm writing this in vim - I quite like the thing...<br />I'll not count them out just yet though, because I know that vimscript is turing complete, so I can well imagine someone implementing the gobby protocol in it.<br /><br />So, at the moment, my money's on google for the business market, with Microsoft likely to come late to the party with a "Windows Live" product that does the same thing. Of course, the MS one will be integrated with windows and won't run on macs - there's a fair chance that they'll be able to shoehorn themselves into the market that way. But google are already good at integrating with windows - check out the google desktop. They're already pre bundled on some OEM machines, and MS are in increasing amounts of trouble with various courts for trying to stop that kind of thing from going on - so I'm still betting on google.<br /><br />I imagine many of the sort of people who might read this are likely to be quite posessive about their data, and pretty unwilling to just hand it over to either google or microsoft. Who gets the data, and what that means is beyond the scope of this post, I think. Maybe I'll write about that later if either the whim takes me, or there's some sort of demand. For now, I think it's enough to say that I think most office type data will be managed in this very centralised way pretty soon.<br /><br />For the coders, it looks like the gobby protocol's got it. It's already integrated in emacs, it'll probably be pulled into vim, netbeans,<br />eclipse, etc. I guess we'll not have a clear winner here - though the gobby editor might turn out to be cool enough to carve out a bit of a<br />following.<br /><br />Anyone know of any other players? Thoughts on why my predictions are wrong? ;)
https://totherme.livejournal.com/1052.html?view=comments#comments
editors
gobby
business
emacs
vim
google
coder
thoughtful
public
5
-
https://totherme.livejournal.com/908.html
Mon, 03 Jul 2006 11:18:39 GMT
Cool things.
totherme
https://totherme.livejournal.com/908.html
<a href="https://www.nintendo.com/channel/ds" target="_blank" rel="nofollow">This</a> is the <a href="https://www.nintendo.com/gamemini?gameid=a8jHMp37j0ImH8NuSYdx7DYmSwHbDGyz" target="_blank" rel="nofollow">coolest thing</a> ever.<br /><br />You may not see me for a while.
https://totherme.livejournal.com/908.html?view=comments#comments
public
0
-
https://totherme.livejournal.com/684.html
Fri, 23 Jun 2006 13:41:59 GMT
Marketing
totherme
https://totherme.livejournal.com/684.html
Just got a call from a random phone salesman...<br /><br /><dl><br /><dt>totherme</dt><dd>Are you in some way exempt from the <a href="https://www.tpsonline.org.uk/tps/" target="_blank" rel="nofollow">telephone preference service?</a></dd><br /><dt>salesman</dt><dd>Are you on that list? No - it doesn't always come up on our screens - see we auto generate the numbers we call from the Orange prefix and a random number generator...</dd><br /><dt>totherme</dt><dd>I reckon it might be worth fixing that...</dd><br /></dl>
https://totherme.livejournal.com/684.html?view=comments#comments
bug
system
random
amused
public
2
-
https://totherme.livejournal.com/290.html
Thu, 22 Jun 2006 11:07:08 GMT
Mechanisation of human beings.
totherme
https://totherme.livejournal.com/290.html
<p>
A scenario:
</p>
<p>
You're in Oxford, or Cambridge or some similar old school university town.
You're walking to your college. Outside is a small, friendly, lost dog. It
recognises you as a kindred spirit, comes over to say hello, and is reluctant
to let you leave it alone.
</p>
<p>
Obviously, you walk the 10 metres or so to your college lodge, and tell the porter:
</p>
<blockquote>
"There's a small, friendly, lost dog here."
</blockquote>
<p>
What do you expect to happen?
</p>
<p>
I asked <span class="ljuser i-ljuser i-ljuser-type-P " data-ljuser="elvum" lj:user="elvum" ><a href="https://elvum.livejournal.com/profile/" target="_self" class="i-ljuser-profile" ><img class="i-ljuser-userhead" src="https://l-stat.livejournal.net/img/userinfo_v8.png?v=17080&v=905.1" /></a><a href="https://elvum.livejournal.com/" class="i-ljuser-username" target="_self" ><b>elvum</b></a><a class="i-ljuser-badge i-ljuser-badge--pro" data-badge-type="pro" data-placement="bottom" data-pro-badge data-pro-badge-type="1" data-is-raw hidden href="#"><span class="i-ljuser-badge__icon"><svg class="svgicon" width="25" height="16" xmlns="https://www.w3.org/2000/svg" viewBox="0 0 33 24"><path fill-rule="evenodd" d="M19.326 11.95c0 2.01 1.47 3.45 3.48 3.45 2.02 0 3.49-1.44 3.49-3.45 0-2.01-1.47-3.45-3.49-3.45-2.01 0-3.48 1.44-3.48 3.45Zm5.51 0c0 1.24-.8 2.19-2.03 2.19-1.23 0-2.02-.95-2.02-2.19 0-1.25.79-2.19 2.02-2.19s2.03.94 2.03 2.19ZM7.92 15.28H6.5V8.61h3.12c1.45 0 2.24.98 2.24 2.15 0 1.16-.8 2.15-2.24 2.15h-1.7v2.37Zm1.51-3.62c.56 0 .98-.35.98-.9 0-.56-.42-.9-.98-.9H7.92v1.8h1.51ZM18.3802 15.28h-1.63l-1.31-2.37h-1.04v2.37h-1.42V8.61h3.12c1.39 0 2.24.91 2.24 2.15 0 1.18-.74 1.81-1.46 1.98l1.5 2.54Zm-2.49-3.62c.57 0 1-.34 1-.9s-.43-.9-1-.9h-1.49v1.8h1.49Z" clip-rule="evenodd"/><path fill-rule="evenodd" d="M2 8c0-2.20914 1.79086-4 4-4h20.5c2.2091 0 4 1.79086 4 4v7.9c0 2.2091-1.7909 4-4 4H6c-2.20914 0-4-1.7909-4-4V8Zm4-2.5h20.5C27.8807 5.5 29 6.61929 29 8v7.9c0 1.3807-1.1193 2.5-2.5 2.5H6c-1.38071 0-2.5-1.1193-2.5-2.5V8c0-1.38071 1.11929-2.5 2.5-2.5Z" clip-rule="evenodd"/></svg></span></a></span> this question. His reply was:
</p>
<blockquote>
"based on my idealistic notions of what porters should be like, the dog
gets invited in, food gets purloined from hall and heaven and earth get
moved to find the dog's owner."
</blockquote>
<p>
This is pretty well the answer I was looking for. I don't know about the rest
of you, but at the very least, I expect the porter to say "don't worry sir,
we'll look after it". They might then call the RSPCA or whatever - probably
while keeping an eye out for passing lost looking dog owners.
</p>
<p>
In a "modern" university however, it seems that one gets passed from the girl
on the desk, to a random security guard to (over the phone) "main control" who
say "Ah - we don't have a procedure for that. I'll ask my supervisor".
</p>
<p>
After a few minutes, the supervisor says "I don't have a procedure for that
either".
</p>
<p>
Take a deep breath, and a moment to observe your tormentors: You can see from the eyes of all of these folk (except the two over the phone,
who's eyes you can't see) that they're fine, upstanding, friendly people who
want to help. But they're also terrified, because this is a new situation, and
no-one's given them a rule for dealing with it.
</p>
<p>
You might now suggest a course of action: "How about, I call the RSPCA, and
leave the dog here. You keep an eye on it, discourage it from running in front
of a car or anything, and wait for the RSPCA to arrive." This attempt at
getting anything done will fail.
</p>
<p>
The poor folk you're talking to are
almost certainly explicitly banned from taking responsibility for anything.
They're not stupid - if they weren't in uniform, I believe they'd be much more
helpful. I believe that the reason there's that look of fear, jostling for
position with the one of humane sympathy and helpfulness in their eyes, is
because they <em>know</em> that if they do what they consider to be morally the
right thing, they'll get fired.
</p>
<p>
This is clearly a sorry state of affairs, which doesn't seem to benefit anyone.
The <em>obvious</em> explanation for it, is that we're living in an
increasingly litigious society, and everyone needs to cover their own back. A
sad consequence of a legal system which favours conflict over compromise and
places high value on the evidence that can be provided by impersonal
bureaucratic systems, rather than the testimony of the intent of individuals
(and there are many reasons why the system is like this, which are beyond the
scope of this little bloggy thing).
</p>
<p>
I, however, don't like this explanation. I think the <em>real</em> reason for
this state of affairs is that <em>They</em> are determined to facilitate the
Rise Of The Machines. All of society will be replaced, piece by piece, by
autonomous systems. At each stage, the human beings currently performing a
given function will be first encouraged to become as machine-like as possible, and then eliminated.
This way, when they are replaced by genuine machines, no one will notice. The
process will begin anew, unchallenged, with some other section of society. Before long,
humanity will be no more.
</p>
<p>
Only Kevin Warwick can save us now.
</p>
https://totherme.livejournal.com/290.html?view=comments#comments
rotm
bureaucracy
rant
amused
public
4