Archive for the 'Uncategorized' Category

Punctuation in Code

2016-02-18

After Calhoun’s «Punctuation in Novels» I thought I’d try punctuation in code.

Let’s render our code down by removing all the letters numbers and spaces.

Let’s choose a C file, more or less at random, and remove letters, numbers, and whitespace:

/**++++,,*-*(),,*..**,*,*:*.*,.*.*,*/.*.**.**``''*,,,**.*,,,,,*(,,*;,,;)*,,*,()*
,*.*-*().**,,,*,*,***,.**"".*,*.*,,,*,*,,*,*.*-*----*//*(..**)..,.*/#(_)&&!()[]=
"@(#)..()//";#/*_*/#</.>#</.>#</.>#</.>#</.>#</.>#<.>#<.>#<.>#<.>#<.>#<.>##_#_##
___/*-*/#()&&(>=)&&(_)#<.>#<.>##"..//."##(__)#<..//.>##_#()(/**/)##()((_))###[]=
"*.:\"%\",\"%\"";*__[+];;*_[];[*];__[];/**/*=;=;__(*,*)__;__(*,**,*)__;#(**,)__;
##>####/*.*/####{;_[];};{_;;};#__;##(*,){(_.&_){=;(,);___();}}##(,)/**/##_()\{\+
=;\(>){\____(_);\();\}\}()#_(,)\{\(()+()>){\____(_);\();\}\}()*(*,,*,){*;_*;;_*,
*;*,**,**;,,,,;,_;=;[];*;(*_)(*);=;._=;=->+;(){_:_:_=_;;_:_=_;;:();/*();*/}/***/
=&->;=(->);=(->);=;=;=->;_();(!=){____(_);();}=_(->,,,,);((<)||!(*_)()){____(_);
();}_(+);(==_||==_){/*_()*;*(..,-).*/=()+;/*\*/(>=){____(_);();}._=;+=;-=;/*,_.*
/=._;}=_;*=;._=_;=__;*=;.__=__;=;_=;(-->&&<&&!_){=_(->,,,,);((<)||!(*_)()){_++;;
}+=;/**/_(,*+);=_();+=;/**/=_();+=+;/*,*/=_();+=;/**/_(,);=+;(!=_){/*-??*/+=;;/*
-_++?*/}((==_||==_)&&==_){(>=&_[-]);=_(->,,,,);((<)||!(*_)()){_++;;}+=;(!=){____
(_);();}/*.*/*++=;=()+;/*\*/(>=){_++;;}+=;-=;/*.*/=()+;/*\*/(>||>=){_++;;}(,);._
=;+=;-=;;}(==_&&==_){=_(->,,,,);(<||!_()){_++;;}+=;(!=){____(_);();}/*.*/=()+;/*
\*/(>||>=){_++;;}(,);=;+=;-=;;}(!=){/**,**.*/((_.&__)==){(_|_,"*.:\"%%%\",\"%\""
,,_(_),_(),_());}+=;;/*-_++?*/}(){_:((,)!=){(_|_,,,);+=;;/*-_++?*/}=_(->,,,,);((
<)||!_()){_++;;}#___+=;(!=){____(_);();}(!)._=;(<&_[-])*++=;=-;(!=-){=()+;/*\*/(
>=){_++;;}+=;-=;};#._=;(_.&__){=()+;/*\*/(>=){_++;;}+=;-=;__(&,&,&);}____(_);(&)
;#_:_:((._,)!=){(_|_,,._,);+=;;/*-_++?*/}(!=._){+=;;}(!){;._=;=()+;/*\*/+=;-=;}/
*:,*--*/-=()-((_)%());+=()-((_)%());(+>=&[]){("(%)\",);_++;;}(>=&__[-]){(!++){("
(%)\",);}+=;;}(*++=,,);+=;-=;+=;(!=){____(_);();};:();}(!_)++;}(){*=;*=;#()/**:*
-""*,*/(_.&&>&&==_)(__,);#/**/(!._){=()+;/*\*/(>||>=)_;(,);._=;+=;-=;}(_.&__)__(
&,&,&);____(_);(&);}_:____(_);();}*(*,);__()*(*){*;(____(&_,)==-){____(_);();}(_
.&__){=(,_);()();}((,_));}*(*,){{*;_*;};*;*;*;,,,;*;(____(&_,)==-){____(_);();}(
){_:=;=_;;_:=;=_;;:____(_);___();();}._=;._=;/**',-.*_()*.*/(!(,'.')&&(=__()))=;
/**/,*.*/(([]))(=;;++){(!*){(*--=='.');/**-,.*'*.*/(_(,,_)<=){____(__);();}(,,);
[]='\';=+;=-;._=;._=_;_[]=;__[]=(*)_;__[]=;.__=__;(_.&__)__(&,&,&);____(_);(&);}
(!(*)&&*!='.');}((([])&&(,':')!=)||[]==':')(=;;++){(!*){(*--=='.');/**--,.*'*.*/
(_(,,_)<=){____(__);();}(,,);[]='\';=+;=-;._=;._=_;_[]=;__[]=(*)_;__[]=;.__=__;_
___(_);(&);}(!(*)&&*!=':'&&*!='.');}.==(*)();((=____(&_,,_,,.->,,&.,,,,))<){(.!=
)(.);("_(%)\",);(==)(_(,));();}=(.,,,);(.!=)(.);;}__()*(*,_,){_*=(_*);_[]={,,,,,
,,,,,,};_[]={,,,,,,,,,,,};;_;{*;_*;};*_;*;[+],*=;#*;**;__;[+];#/**/(____(&_,)==-
){____(_);();}(==_&&==&&(!(,,)||!(,,))){/*.*/+=;+=;=_;=;}(){_:=;;_:=;;:___();___
_(_);();}(!=){___();____(_);();}(){_:()(,"%.%.%.%.-.",([]&),([]&),([]&),([]&));;
_:=;(=-;>=;--){+=((,"%.%.",[]&,([]>>)&));}(,".");;:();}.=_=(*)();=____(&_,,_,_,.
->,,&.,,,,);(<&&==_&&(_.&_)==){(,".");=____(&_,,_,_,.->,.!=_?:,&.,,,,);}(<){(.!=
_)(.);("_(%)\",);(==)(_(,,));();}=(.,,,_);(.!=_)(.);(!)();/*_()*/#(==_){/**,*''*
/(,->_,);[]='\';_=_.;_.&=~_;_.|=_;(!(=())){(_|_,":%([%])",,_(*((_*))));_.=_;____
(__);();}_.=_;(=->__;*;++)(!(*,,));(!*){(_|_,":%!=[%]",,_(*((_*))));____(__);();
}}#/**/->_=;->_=;(_,,);__[]=(*)_;__[]=;(==_&&(_.&__)){__((*)_,(*)_);->_=_;->_=;}
____(_);();}_(){(!)=(__,"");();=;}__(_)_(){(&&!){()();=;}}*_(){*;*,**;,;(!&&!(=(
__,""))){____(_);();}:(!(=(,,))){____(__);();}(*=='#');(!(=(,"#\")));*='\';(!(=(
,"\")));*++='\';(_(_,,_)>){=_;=;}(_(_,,_)>){(_.&__){__((*)_,(*)_);=_;=;}{=_;=;}}
{;}__[]=(*)_;__[]=;.__=__;._=;._=;(*==''||*=='\')++;._=;=._=_;((=(,"\")))*++='\'
;(&&*){(*==''||*=='\'){++;;}(<&_[-])*++=;((=(,"\")))*++='\';}*=;____(_);(&);}__(
_)*_(*){*;(_.&__){=_(,_);()();}(_(,_));}*_(*,){*;**;_();((=_())){(->_!=);((->_,)
==);(=->_;*!=;++)((*,)==);}:_();();}__(_)*_(*,_,){*;_();((=_()))(->_==&&!(->_,,)
);_();();}__(_)__(*,*){_*=(_*);[];;/*.*/(,,);/*.*/(=;<;++)*++=;*++=;*++=;/*'.*/(
(*),,);}__(*,**,*){**;(->_!=_||->_!=);->_=_;->_=;(=->__;*;++){=()-((_)*%());(*<(
+)){/*..*/*=;;}*+=;*-=;__(*,*);*=*;*+=;*-=;}}#(**,){,;**;[];=;=;(=;<;++,++){(=;(
)<_.;++)(_._[].._==(((_*)(*))->_&_._[].));[]=;(==&&>&&<[-])=;}(!);(<){(=-;>=;--)
{([]>[+]){*;=[];[]=[+];[+]=;=[];[]=[+];[+]=;};}++;}}##(__)||()/*'()*/_(){_();}_(
){_();}*_(*){(_());}*_(*,_,){(_(,,));}*(){(_());}_(){;}#__(_,)_*_,*;{(___(_,));}
#/*-*/

A Python file:

#!///_____#.-/##().<@.>#()<@.>#()<@.>##..##()##,,##(""),,#,,,,#,,,/,#,#:###.##""
,,#,#,#.#,,#,,,##."""/(://..///--/).(////////):(////);,,()/;(///)..()():````,```
`,````.,``;()``.::``::``....,...,``.``().-`<://../>`_,.````.``.--``.------------
----------------------.'"""".','.():,,--,--.:,,,.:**;**,**,**,,,;**,(,,).-------
----------()()."","","".(),.,:::([,,,,,,,,],[,,,,,,,,]),.,.;(),().::[,,,,,,,,,,,
,,,,,,].(),.::([(,,),(,,),(,,)],[(,,),(,,),(,,)]),..,--.,---(---).,,,..,(),.;,;(
)(``).::`._`.',(,-,).,--------------------------"""____=".."#://..//..//-.#://..
//..//-.:#``:#.#,-#(`#`).:____=['','','','_','_']#.#://..///#--_=.('',,,,,,,,)_=
((,,,),(,,,),(,,,),(,,,),(,,,),(,,,),(,,,))(,):#://..//.//.#((*[()]*))():(,)():.
()_(,,,):"""(),..+=.````````.````,.."""=()=()=+=+##://..//..//-.#-=(.)#':-(.().(
)#():[::]=[::]():[+::]=[::]_():"""(::``).;."""#.:=()(<()<=):("")_=,():()(,):("%:
--."%)()==:_=_()==:("%:--"%):()!=(<=<=):("%::<=<="%)_(,,):""",,.(,).""":,()!=:("
(,)")!=[]:("[](%)(%)."%([],))!=[]:("[](%)(%)."%([],))_(,,):""".(,',""-).""":::()
:=(,)()!=:("%-"%)([]):("%"%):(()==([])([])([])):("%"%)():____():.____.____+':'+'
'.(.)():""".,."""()::"""."""____(,=,=,=,=,=,=,=,=,=,=,=,=,__=,#=,=,=,_=**,___=,_
__=,__=):""".:,,.(,),.,.().:.().(````).(````).(````).:()();:-.._````.___(``).___
(``).`__`,.__``(``).()````,``.``(**,**).````(),().``.``**-``.,-.,,,,.``,,````().
./,().:""(,,);.(,``)``:,,,.(````,;``.)``,,:;``;``;``;,,,.,``().--.-;-.----.````;
-````.````;````-,.-.,````,,,().,``(,``).````.,.``````.,""(,')..-````````().``(',
**).,....::``.`_`.,````."""#``;##``(,,**)``,``#..#``.,=_(,,)<=<=:("")()():("")#:
//..///#--->**->**-:("**-"):("")__:.('__',)__(.,.,.,,):(".,.,.,,")=(*__)__()<<:(
"(%)<="%).==_():(,,,):(",,,,"):(""):(""):(""):#,.:(,):=(,)[>].=(,)=:(,,,,):>:===
:=:(,,)=.=(,)=<():("<")>:("")=_(,,'')=_(,,'')#'(,,#,)'#..=.=.=.=.=.=().=().=().=
().=._=_.=().=.___=___.___=___.__=(__)._=*.+*()+*.._(,,,,)._=(,)[..].=._+.#::<.=
(./)*._():"""````````.(**,**).**````````."""=('')=('').:.([:])()>:.([])=()=():,,
(,,):""".``.,``.````.*.``.``(),.;...::.""".:=''[.>]=(,.(*))._(,)=._(,)!=.:("(%)(
%)"%(,.))_(,,,=):""".::``::`_`..,,.``.``````;``````."""#://..///#--.(_)#://..///
#_(,'',.("!",.,.,.,._,,,.))#::#://..///#.:_(,'',.("!",((.*))))#::#://..///#.:_(,
'',.('%'%.,*[.[]]*.))#:::(),#.,#.#://..///#.:,=._()_(,'',):#.#._(,'',)#://..///#
.:.:_(,'',.("!",*.)):_(,'',.("!",*.))#://..///#.:.:_(,'',.("!",*.)):_(,'',.("!",
*.))#://..///#.___.___:=(.___,.___,(.__))_(,'',.("!",*))#://..///#.:=.(.):=.()#.
#/#.=('').==:=..==:#():='!%'%().(('',.(,*))):#.<#=(/.)():=('',)##-.=(())=.(/())*
-.([]*())#=(,)=[(,:(<<.)+,)].().:==\(**.[]-)/(**.[]-)():([((*))])#,##(,#).#://..
////?==()#'..()#::``.()``#.#.,=():#...():#....#()#,,,""#.()::([()])=()(),:#"".,'
##;##"","",""..()()()>._:=.(())():_(,'',)#````,#,-````.#````,#().[:]():=.(()):='
'=.()()():_(,'',+)#://..///#_(,'')+_(,,):""".::``.""".:._(,.__()):._(,._())_(,,)
:"""``.``..,.,.;,,,,.""".:("_%"%.[])._(,,=)_(,,):""".(),,.""".:=('').(,(./)*._*.
*.)._(,.__()):._(,._())___(,,,):"""."""=('').(,(./)*._*.*.)=('').(,(./)*.*.)=_(,
,(./)*._,(./)).:._(,.__()):._(,._())_(,):""",``."-",.(``,``,``)``."""#=.*._=.>:.
==_*=='>%'%():('',.(,.(_))):():=('',.(_))(.):()_(,):"""()()."""#=.*.=(.):==+[:]_
_(,):""".``.,."""#://..///##.=''[.>]#=.*.,,,_:>=.:#()=(.((.-)/()))#._=*.(,.,):==
:=*[:+]:=()#'.([:_])=*+*._=(+)*=.*(.):[::.]=\[+:_:]_(,,=''):""",."""#://..///#-.
(.("!",())).().()=.()=.(,)&=**-.(.("!",))_(,):""".""".(_):_(,*)_(,,,=):""".``();
``();``().``;(),<(<)."""<=<#.,,-#().=('',[])():=-:>=:=(-[])&.()+=():,():=(-[])&.
()():=-,():>=:=(-(([]+[])>>))&:=(-([]>>))&.()+=():#://..///#---=-#,():==[]=>=:=[
]=[]=+-=(-)=(-)=(-)<=<=:=<=:=:==(-)&.()+=:#'.#""#."""";""#""(-,).""#.==:#""===:=
[]*()==:#""===:.()==:()==:()==:():#==()_(,=,={}):"""::``--.-:``._(,'').('.')``.*
*,'.;;..,``*``,-(*=).**-.:``''``()``''``()``''``()``''``()(,).``';'``;.-**,.````
,.,:``._([[,,],[,,]],'')``.:``()``,;``([])``;``([][])``,-.',..'(**).'``````.``.,
.,,,.**(::`.`).:**..(**).**,.,**``````''````''````''````''``."""#**..#(**).=()#.
=:#''''``..(''):=''=[:].(''):=''=[:]:().(''):+=''=[:]#';'.(';'):=[:]#::=()(,):()
:("''';'.")=#**.:.('')!=['']:("(%)(%)."%(,['']))['']=#/**.#.'':#,,.,[('',),('',)
]::[]!=[''][]:("[%][''][%]."%(,))[''],['']=['']''::=():("(),[''].")['']=#.'':(['
'])!=(''):("[''].")['']='''':([''])!=(''):("[''].")['']=''=()'':['']!=:("[''].")
##,.#.,=.()=():[][]==[](,):==''::=():=()//['']=:#=(.._())''::=.#":"..::#..=*.:#'

And Lisp:

;-*-:;:-;:_-*-;;;>;;;>().;;;>.;;;>;;;>,,;;;>,;;;>...;;;>;;;>."..."";;;>";;;>,;;;
>.;;;>......;;;>.;;;>"".;;;>;;;>;;;>;;;>,;;;>;;;>+---;;;>;;;>(),,,,.;;;>.;;;>;;;
>,,;;;>,;;;>;;;>;;;>."";;;>;;;>,.;;;>;;;>.;;;>."";;;>.;;;>;;;>,,,,,;;;>,.;;;>;;;
>,.;;;>,;;;>,;;;>;;;>+---;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;//--.;;;//----;;;
//--"";;;"[|]{}*";;;"{}*".;;;//((--(...)...)...);;;.;;;-------------.;;;//';;;-,
-,;;;;(-(:-:-:)("-/")("-/"))(-:-);;;.;;;;;;;;;;;;,,;;;'.;;;;;;,;;;-,;;;(,;;;).;;
;;;;""();;;,;;;.;;;,"";;;.;;;;;;;;;.,;;;.;;;,;;;.;;;.;;;;;;;;;,/.;;;,;;;,"":;;;;
;;(),;;;;;;;()"";;;,"";;;.,-,;;;-.;;;;;;();;;-,;;;(,,;;;).;;;;;;;;;.;;;#+('(-));
;;;;;;,;;;.;;;*,;;;,-,-;;;;;;-.(-*()`(-,))(*-*)(-(&('-))(*-*(())(())))(*---*')(-
-();;@@@@;;-(--).;;.';;#+---;;;;/.;;,-'-#+()#-((((-')))((((')))(((')))(((')))(((
'-)))((('))))));;;@@@@;;;,;;;.;;;,..;;;(()),;;;"""".;;;.,;;;,,;;;`(,(--'()'(+)))
.(--(-)((-)));;;@@@@,,;;;,;;;.;;;,..;;;(()),;;;"""".;;;.,;;;,,;;;`(,(--''(+))).;
;;"";;;.""().,;;;(-()...);;;"",;;;.,,;;;.;;;(;;;-,..);;;.(--(-)((-)));;;;(----((
--&--)&)((((--((--)))))`(*((,-())(,-,-),@),@)))(--(&(--&--))(())(((-()(())(()((<
=)(`(,((')(')(')(')),)))(`(,)(-)))))(((-)());;.(()(((()')((-(())));;@@@@,;;'-;;-
(;;).)((()'(*))((()((())'(')))((-(())))))))(((((()`(((,-),-)(,-((,-)))))((<)(---
))((=);;@@@@:;;((-));;((()-)).;;.`(,-(,-,-)))(`(,-,(-`((,-),-)))))));;';;,'...';
;,.(--(`(,(,--(,-)))))))))(--(-&--)(--(;;-,;;.;;.`(,-))));;;;#|"".,()().,,,.|#((
-(:---)(:)(:))----)(*----*'((----)))(--(-)(((-((*----*:#'))))(---:--::-(-'---):-
((-)(-'---))::--)))(---()(()(--))((((--))((---)))((---)(-'---))))(--(&)((((--(--
)))(((--)))(-(---))(-(---))(-(---))(-(---))((--)))(-`(((,-,)(,-,)(,-))((,,-,-)),
@)`(((,-,((')(-)(-)))(,-,))((,,-,-)),@))))(---()(*((-(---))(-(---))(-(---))((--(
---)`(,((')),-,-))))`((,-,)(,(-`((,-),))(,@(-`(,-)),-,-)))));;;;#|./"".--,-
,()""-.|#;;;;;;;"".*--*,;;;.(-()(()(=)))(-()(()(:#'=)))(-()(()(:#'=)))(--(-)((-)
(((--)))))(---()`(((-,),),))(-(:-:-:)(--()(())(((((--)(()"-")(()"")(:"-")((--)))
))(--(::)()))))((-(:---)(:)(:));,=(-.-).-;,=(-.-).-;,=(-.-).-;,=(-.-).-;,,=.-;,,
=.;,,:.--;--);;;"";;;..(*-*)(---(&-----)(-(:))(((()(*((())((--:((<)):#')))(()(((
-()))())))))(--:():-(-):-(-):-(-)::--(()):-(-):-(*(((-))((--:((;;;>().;;;>.;;;>;;;>,,;;;>,;;;>...;;;>;;;>."..."";;;>";;;>,;;;
>.;;;>......;;;>.;;;>"".;;;>;;;>;;;>;;;>,;;;>;;;>+---;;;>;;;>(),,,,.;;;>.;;;>;;;
>,,;;;>,;;;>;;;>;;;>."";;;>;;;>,.;;;>;;;>.;;;>."";;;>.;;;>;;;>,,,,,;;;>,.;;;>;;;
>,.;;;>,;;;>,;;;>;;;>+---;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;//--.;;;//----;;;
//--"";;;"[|]{}*";;;"{}*".;;;//((--(...)...)...);;;.;;;-------------.;;;//';;;-,
-,;;;;(-(:-:-:)("-/")("-/"))(-:-);;;.;;;;;;;;;;;;,,;;;'.;;;;;;,;;;-,;;;(,;;;).;;
;;;;""();;;,;;;.;;;,"";;;.;;;;;;;;;.,;;;.;;;,;;;.;;;.;;;;;;;;;,/.;;;,;;;,"":;;;;
;;(),;;;;;;;()"";;;,"";;;.,-,;;;-.;;;;;;();;;-,;;;(,,;;;).;;;;;;;;;.;;;#+('(-));
;;;;;;,;;;.;;;*,;;;,-,-;;;;;;-.(-*()`(-,))(*-*)(-(&('-))(*-*(())(())))(*---*')(-
-();;@@@@;;-(--).;;.';;#+---;;;;/.;;,-'-#+()#-((((-')))((((')))(((')))(((')))(((
'-)))((('))))));;;@@@@;;;,;;;.;;;,..;;;(()),;;;"""".;;;.,;;;,,;;;`(,(--'()'(+)))
.(--(-)((-)));;;@@@@,,;;;,;;;.;;;,..;;;(()),;;;"""".;;;.,;;;,,;;;`(,(--''(+))).;
;;"";;;.""().,;;;(-()...);;;"",;;;.,,;;;.;;;(;;;-,..);;;.(--(-)((-)));;;;(----((
--&--)&)((((--((--)))))`(*((,-())(,-,-),@),@)))(--(&(--&--))(())(((-()(())(()((<
=)(`(,((')(')(')(')),)))(`(,)(-)))))(((-)());;.(()(((()')((-(())));;@@@@,;;'-;;-
(;;).)((()'(*))((()((())'(')))((-(())))))))(((((()`(((,-),-)(,-((,-)))))((<)(---
))((=);;@@@@:;;((-));;((()-)).;;.`(,-(,-,-)))(`(,-,(-`((,-),-)))))));;';;,'...';
;,.(--(`(,(,--(,-)))))))))(--(-&--)(--(;;-,;;.;;.`(,-))));;;;#|"".,()().,,,.|#((
-(:---)(:)(:))----)(*----*'((----)))(--(-)(((-((*----*:#'))))(---:--::-(-'---):-
((-)(-'---))::--)))(---()(()(--))((((--))((---)))((---)(-'---))))(--(&)((((--(--
)))(((--)))(-(---))(-(---))(-(---))(-(---))((--)))(-`(((,-,)(,-,)(,-))((,,-,-)),
@)`(((,-,((')(-)(-)))(,-,))((,,-,-)),@))))(---()(*((-(---))(-(---))(-(---))((--(
---)`(,((')),-,-))))`((,-,)(,(-`((,-),))(,@(-`(,-)),-,-)))));;;;#|./"".--,-
,()""-.|#;;;;;;;"".*--*,;;;.(-()(()(=)))(-()(()(:#'=)))(-()(()(:#'=)))(--(-)((-)
(((--)))))(---()`(((-,),),))(-(:-:-:)(--()(())(((((--)(()"-")(()"")(:"-")((--)))
))(--(::)()))))((-(:---)(:)(:));,=(-.-).-;,=(-.-).-;,=(-.-).-;,=(-.-).-;,,=.-;,,
=.;,,:.--;--);;;"";;;..(*-*)(---(&-----)(-(:))(((()(*((())((--:((<)):#')))(()(((
-()))())))))(--:():-(-):-(-):-(-)::--(()):-(-):-(*(((-))((--:((()));;,-.;;.;;;;
.((()())(()()(())(())((())()))((`(,(*---*))))(`(,,(()),(()))-));;-();;(()()()(()
-)((())()))()))))))(--()(()((((--)))(());;@@@@(-');;;;.)))(*--*'(()()()()()()()(
)()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()))(*---*'(**--*----
))(-()(((())((+(-()))))(()(+(())))))(--()('--(---)))(---()(((-()((())(())(()((--
-))))));;@@@@????((-()))((())(()(--(--)(-)(-(----))))(());???-???((())(((())()()
)(()())((((&(-))`((+(,)((-,(-'())))))))(((('--))((())(())))(((*--*))(()))((')(((
))((-))()))((')(((()()))(())((+(-())(---())))))(('())(((()()))(())((+(---())))))
(('))((');;-;;.(((())((())(()')))('--)))(('--)((())()))(('-)(+(---())))(((--)(*-
--*))('--))((--(--)(-)(-(----)())))))))(('--)))));;;;(-()(((*--*())((())))(((*--
*))())))(-(-&-)(--"~?~%:~{~~}."--(-)))(-(-&-)("~?~%:~{~~}."--(-)))(---(--&(--))(
())((())())))))));;;;(*--*",:-,-,-.")(--()((--(()((())()`(,(),(--())))))))(--(--
)((--)((*--*(*--*)'--)--)))(*--*(-"--"))(--(&&--)(((--();;'-;;((())((()))((--())
())))(--(&);;(((();;'-((()');;.;;,-.;;.(#'(()(()(((()'))((()))(((()))))()))())`(
,))))((*((())(())(--(--))(--(--)))((----)(--(*((-)((*--*))(`(,@(--`(,))(,(,)),@(
--))))(-`(,@(()`((,,))),@)`((((,,)),@))));;(--`(,))))))((()`((,,)))))))((())((--
)((())()`(,@())))(((--(--)(--)))))));;;;-;;;"".(*--*);;;,;;;(*---*);;;*--*"".;;;
(-,-).(*--*);;;,.(*-*);;;.(*--*);;;.;;;--.(*--*);;;-.(*-*);;;;;;*-*.(*-*);;;,.;;
;--.(*--*);;;,,;;;;;;*-*....,;;;((--(;;;...))),;;;*-*(;;;).(*-*);;;*-*;;;,.;;;--
.(*--*);;;-();;;;;;().(*-*);;;,;;;.(*--*);;;,.(*-*)(*--*)(*-*)(*--*);;;,;;;.;;;*
-*,;;;""("";;;"").(*--*);;;(),;;;.(*-*);;;"";;;."";;;.;;;---,..(*--*);;;"".;;;--
-;;;.(*---*);;;,.;;;.(*--*);;;,;;;"""()".;;;.(*---*);;;,;;;;;;.;;;;;;.(*---*);;;
-.;;;---.(*--*);();;;;(----(&-)(((-)()(-))(((-))(-(-)))((-)((--)(-"~~,~."--)(-))
)(--)))(-()());;;;(*--*)(*---*(-"---"))(---()(--()(--)(+(*(-)))))(-(&---&)((=(-)
(-))(-"----."));;,:((-)(-))(((()((())(()(()((()(()'(-)))())))()))(()((())()`(,@)
))(()(((`(,@((()))-,@((-(`((-)))))-,@())))(`(((,)),)))))((*--*())(--()));;--;;'(
(((---)))()(());;--;;.(()((()((()()))))(()-)())((()));;&(;;),;;.;;,;;;;.,;;,;;,;
;.;;-;;.(((())(())()()())(()(--()));.((((()()))())(((((--())))(>()));;,-.;;.;;;;
.((()())(()()(())(())((())()))((`(,(*---*))))(`(,,(()),(()))-));;-();;(()()()(()
-)((())()))()))))))(--()(()((((--)))(());;@@@@(-');;;;.)))(*--*'(()()()()()()()(
)()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()))(*---*'(**--*----
))(-()(((())((+(-()))))(()(+(())))))(--()('--(---)))(---()(((-()((())(())(()((--
-))))));;@@@@????((-()))((())(()(--(--)(-)(-(----))))(());???-???((())(((())()()
)(()())((((&(-))`((+(,)((-,(-'())))))))(((('--))((())(())))(((*--*))(()))((')(((
))((-))()))((')(((()()))(())((+(-())(---())))))(('())(((()()))(())((+(---())))))
(('))((');;-;;.(((())((())(()')))('--)))(('--)((())()))(('-)(+(---())))(((--)(*-
--*))('--))((--(--)(-)(-(----)())))))))(('--)))));;;;(-()(((*--*())((())))(((*--
*))())))(-(-&-)(--"~?~%:~{~~}."--(-)))(-(-&-)("~?~%:~{~~}."--(-)))(---(--&(--))(

Implementation

cat ansi-loop.l | tr -d "$(printf 'A-Za-z0-9 \011\012\014')"

(who puts formfeed characters in their source code? Lisp programmers, that’s who!)

My Enbridge pipeline

2016-01-26

In April 2012 the town of Bella Bella, mostly Heiltsuk First Nation, were expecting to meet representatives of the Crown Canadian government to discuss Enbridge’s proposed Northern Gateway pipeline. This was to be a pipeline carrying diluted bitumen to a terminal in British Columbia. Where the Heiltsuk fish. The Heiltsuk are a community intimately connected to their land. The coast, the sea, the cedar and fir forest. And the sockeye salmon. The sockeye salmon is an emblematic species and it is connected to its regional ecology through a network of interactions, eating, being eaten, and of course the migration from freshwater to sea and back before spawning in the natal fresh waters. The sockeye salmon reaches out and connects all the elements together.

sockeye salmon migration

sockeye salmon migration (credit: Felex Liu)

The pipeline threatens all of this. Jess Housty, poet, librarian, and young leader, recalls to Naomi Klein their stance: “We were prepared to stand up with dignity and integrity to be witness for the lands and waters that sustained our ancestors—that sustain us”.

As it happened, the government delayed the hearings and moved them so that Jess had to travel for a day to make it to the hearing. Where they said “I respectfully disagree with the notion that there is any compensation to be made for the loss of our identity, for the loss of our right to be Heiltsuk.”

These words, as I was reading them in Naomi Klein’s «This Changes Everything», struck me. Powerfully.

The Heiltsuk are so intimately connected with their landscape and their ecosystem that a pipeline is not just a threat to their food or their way of life, it is a threat to their very identity. The pipeline threatens their identity and it is not surprising that they dig in, resist, and return the assault.

We all have identities that can be threatened.

I am from the internet. My ecosystem has components like computers, and online interactions, and networks, and data, and encryption. Encryption is a keystone species. Take it away and the network around it will collapse. Maybe not instantly, maybe gradually. Shopping will be less secure. My spending patterns just a little bit different. Our conversation less vibrant. Eventually the network will collapse, leaving nothing but sterile scorched earth.

When you attack encryption you attack my identity. And there is no compensation to be made.

Free discourse

2015-11-27

Inside your own head you have the freedom to think whatever you like. But we are social animals, discourse is human. We should be free to voice our thoughts to one another.

800px-TamTam

We are also tool makers. It’s natural that we extend discourse via our tools. First a slit drum, then WhatsApp. I don’t think our tools should change our expectations about discourse. I should be free to choose my conversational partners.

And by that, I mean you and I. I don’t mean, you and I, and the app maker, and the telecoms company, and the government, and the government’s international allies, and the government’s well-funded international enemies who are able to steal the backdoor key.

Discourse is part of our identity and our agency. Without free discourse our agency erodes (you can’t talk to your friends about X), when our agency erodes our identity erodes.

That’s why I support strong end-to-end encryption.

(image from wikipedia: https://commons.wikimedia.org/wiki/File:TamTam.jpg)

Return to PyCon UK

2015-09-20

PyCon UK 2015 is the UK’s Python conference. Held again in Coventry. I didn’t go last year, in fact I have missed a few years and this has been my first PyCon for a while.

This year we are without John Pinner. I was sad to hear of his death earlier this year. John brought me to the Python community. When I turned up to the first PyCon UK way back in 2007, 10 minutes before I was due to give a talk, John made me immediately feel welcome. The efforts of John Pinner and The Committee have always made PyCon UK a rewarding and invigorating experience. I’m drinking from the very splendid conference mug, which has a lovely quote from John Pinner back in 2006, before the first PyCon UK:

What we really need to do is set up a UK Python conference.

Thanks John.

PyCon UK 2015

For me the conference is about the community: the people attending, the committee, the “do”-ocracy spirit. Conferences can be stressful on a personal level what with new places, hundreds of people you don’t know, strange food. It didn’t take me long before I was relaxing a bit and chatting to new friends. I think the Python community is very welcoming, I know I’m not the only one who thinks that, and I hope everyone attending is able to share that spirit.

It was pleasing to see old friends (all a bit older!), and very pleasing to make new ones, particularly the Python Ireland people enthusing about the upcoming PyCon Ireland. Yet again there was not enough time to meet all the interesting people that I wanted to, but I think that will always be true.

One of the more endearing memories for me was when the daughter of Zeth, in a moment of inspired parenting, manged to get the microphone in the plenary session and was merrily shouting “MAC ADAPTER! MAC ADAPTER!”, clearly pleased to the moon and back to get the attention of 400 or so PyCon UK attendees :).

Thanks to the committee and the volunteers, past and future!

What you need to be a programmer

2015-03-09

You need, above all others:

1) to have dogged persistence in the face of failure.

2) to celebrate the utterly ordinary.

On 1. There is a reason why FAIL Blog is a thing. Failure represents 99% of what programmers do. Programmers do not sit down and write flawless code that works first time. We make mistakes. The compiler complains. The tests fail. It stops when something unexpected happens. Each failure requires the programmer to work out why it failed, fix it, and carry on. I’m talking about failures at every level from the “missing comma” and “expected string not int” type errors, through intermediate errors like using feet instead of metres, or using 100GB of RAM instead of 1GB, to higher level errors like designing a mobile phone app instead of a website.

Some people just cannot do this. They will type in their program, and it will fail to compile or run because of a missing comma or something like that, and they will just stop, and go and make a bacon butty instead. This is perfectly understandable.

Personally, as a programmer, it sometimes feels like it’s not that I want the program to run correctly, it’s that I have a curse where I cannot prevent myself from investigating every last failure and fixing it.

When programming, failure is entirely normal. It takes a certain personality type to be able to cope with this, several times a day.

On 2. The flip side is that when programmers succeed, most of the time we succeed in something entirely ordinary. We have calculated the amount of VAT correctly. We have displayed the user’s email address on the page correctly. Things that are entirely trivial and obviously should Just Work take sufficient effort, and involve overcoming several failures, that just achieving the entirely ordinary seems like it deserves a celebration.

Clearly it is not normal for someone to celebrate the fact that as a result of typing stuff into the CSS file, the dotted border between the header of a table and the next row now displays correctly. So remote are programmers from the rich celebrations that life has to offer that we have to make our own.

There is a horrific irony to all this. Computers only do what they are programmed to do. But it is incredibly difficult to program them (correctly). What they are programmed to do is only an impression of what we intend them to do. In this case it is like trying to take an impression of a fossil with only wet tissue. So, on the one hand everything a computer does it has been programmed to do, on the other it is a monumentally difficult task to get the computer to do anything at all that is useful and correct.

Lovelace grasps this subtle point: “It can do whatever we know how to order it to perform”. It’s the “know how” that’s the tricky bit.

Women of #movember

2013-11-05

In the interests of brevity the title says “women” but I mean to include all partners of people growing a mo’ this month.

I am growing a moustache to support a local prostate cancer group.

The reality is that growing a moustache is not hard. I just have to not shave a certain part of my face for a while. Most of the hardship is endured by my partner Philippa who has to put up with bristly kisses for a month.

Support is vital for success. Support for survivors of cancer, and support for sufferers of cancer. Support for people raising money.

I’d like to thank all the partners out there that are supporting their men growing a moustache. I would not be able to do this without the support of my family and friends, and I’m sure others feel similarly.

You can give your support here: https://www.justgiving.com/drj11.

Sunrise

2013-10-16

One of the benefits of getting the train from Sheffield to Liverpool is the beautiful views of the Peak District that I don’t pay enough attention to.

Winter is coming, consequently, it’s just the right time to see the sunrise:

copper bronze dashed across the sky
blots and streaks of morning’s blue
a speck of an aeroplane drifted lazily
the buildings of flats and industry were silhouetted
brick chimneys thrust industrially upward
we arrived in Manchester.

Let me start in a way that i

2013-06-07

Let me start in a way that i hope you find controversial.

I am against gay marriage. The state should not recognise the marriages of gay couples.

But fear not, I’m a nice liberal Guardian-reading libdem-labour-green swing voter. I am not about to join the UKIP. To expand upon my position:

I am against marriage. The state should not recognise the marriages of couples.

Marriage is a contract between 2 people (and god, if you choose to believe). I don’t see why the state needs to get involved.

There are various rights and responsibilities that come with marriage, but in all cases i think it would be better if these were separated:

– married fathers have more rights (for example, direction of medical care) over their children than unmarried ones. That’s just silly.

– married couples have various tax advantages (rarely, disadvantages) depending of the whims of the current government. It really depends what the policy is here. Is it to encourage people to form lasting bonds, or is it to recognise that people who stay at home to manage a household deserve a tax break to recognise their economic contributions and compensate for their lack of earnings? Two sisters share a home where one has a full-time job and the other looks after the house and does a few hours teaching a week (maybe they co-parent a child). Should they not be able to pool their tax-free allowance? Peoples lives are entangled in all sorts of ways that the “married couple” paradigm does not recognise.

– married couples have access to the divorce courts. Unmarried couples would benefit from the guidance and impartiality of the divorce courts too. Separation is stressful, messy, confusing thing to go through, and of course the divorce court does not wave a magic wand and make it all unicorns and ponies, but i think it is helpful, and it would be helpful to all couples.

– the estate is presumed to pass to the surviving widow when one of a married couple dies.

It’s not that i don’t think the state should be doing these things, in most cases i think they should. It’s that i don’t think these things should be bundled up in Marriage. Sharing your tax-free allowance should be a matter of filing a form with the tax office. Letting your estate pass to another on your death should again, just be a matter of filing a form.

Asserting paternal rights over a child is a lot more messy. Should it matter if you’re not the genetic father of a child, if you’re the one providing the home and investing in the child’s development? Should the mother be allowed to prevent access to a supposed father? I have no idea, but whether a couple is married or not should not matter.

Public recognition. Of course people should be allowed to marry and be married. Public recognition is one of the most important aspects of marriage. But this recognition comes from your peers, not from the state. Couples have been getting married for thousands of years, long before governments came along to record the marriages.

Marriage as a union for life between a man and a woman is a christian thing. Marriage as actually practiced over the last 5000 years or so is much more diverse. We should embrace that diversity (once again). Capturing this in leglisation would be a complicated nightmare.

The simplest thing the state can do is not get involved.

Date formats

2013-04-12

Hilary Mason on twitter bemoaned the fact that matplotlib appears to use a floating point number of days to represent datetimes and suggested that “any other standard format” would be better. It is a little bit odd that a Python library uses that format, but it’s presumably because matlab does, and matplotlib is betraying its matlab heritage.

What other standards are there? Well, there’s POSIX time_t which is either an integer or a floating-point type (but actual practice seems to favour integer), and stores the number of seconds since the Unix Epoch, 1970-01-01T00:00:00Z. Not counting leap seconds. Not counting leap seconds is convenient for some calculations, but means there are (recent) times that cannot be represented (namely, any moment during a leap second). That’s not a good representation of time.

There’s another time format in use which is confusingly similar to POSIX’s time_t: it counts time using the number of seconds since the Unix Epoch. Including leap seconds. The opportunities for mistakes in conversion are endless. A problem with this time format is that times in the future (more than a couple of years into the future XX) are ambiguous. Since we don’t yet know if there are going to be leap seconds between now and 2020 we don’t know whether 2020-01-01T00:00:00Z is 1577836800 or a few seconds more or less than that.

An example confusion: “man 2 time” on my Linux box claims that time_t is the number of seconds since Epoch, but “date –date=2013-01-01 +%s” ends in “00” so clearly leap seconds aren’t being accounted for.

That’s twice now that I’ve used ISO 8601: 2013-04-09T06:06:06Z is roughly when I’m writing this paragraph. As a format for representing this times this has obvious benefits and equally obvious drawbacks. The benefit is that it’s pretty clear, and almost human readable (by humans like me). A drawback is that it takes a lot of space: 20 characters as I’ve given it. If you were storing this in a file you could reasonably use the “compact” form: 20130409060606Z, which is 15 characters, or 14 without the ‘Z’. Space misers could encode this in BCD and fit it in 8 bytes, which is no more than a 64-bit time_t.

Another drawback with ISO 8601 is that calculations with times can be a bit trickier. But on the other hand, you’re more likely to get correct answers, and be able to represent all (recent and future) times.

I’ve been working with sea-level and tide data recently and Hilary’s floating point number of days is certainly pretty convenient for that. The calculations are concerned with the average rotation of the earth, and it nicely represents that. Practitioners of the art also seem to like a slightly different time scale which is Julian centuries. Basically the same but scaled by 36525. It’s not unusual for the 0-point to be something like 1900-01-01T00:00:00, or even a midday like 1899-12-31T12:00:00.

What about representing times with sub-second accuracy? When Unix time_t type is an integer type then you’re stuck. ISO 8601 times can be extended with a decimal point and have as many decimal places as you like. So that’s a good representation. Hilary’s floating point number of days is also pretty good, as long as you’re using double precision. If you’re using double precision then even counting Julian centuries is okay, you still get sub-nanosecond precision. JavaScript’s representation is basically a floating point number that is the Unix time_t but in milliseconds not seconds. That too is pretty good.

I think Hilary’s format is actually pretty reasonable. Some calculations (involving counting whole numbers of days between times) are easier, some are tricky (but no trickier than any other format really). All times are representable. There’s some ambiguity about times in the future (that 1200 appointment you make in the year 2020 might actually turn up in your calendar at 12:00:00.5 if there is a leap second, but at least your midnight appointments won’t be on the wrong day). Yes, it’s a litle bit funky that on days with leap seconds the step between consecutive seconds will be different (it will in 1/86359 or 1/86401 instead of 1/86400), but I’m sure you’ll cope.

After a while, you just get used to seeing a new file format, another new date representation. According to the xlrd documentation Excel uses a floating point number of days since 1899-12-30T00:00:00, but since they thought 1900 was a leap year, this is only reliable after 1900-03-01. Unless the Excel file was made on a Mac, in which case the Epoch is 1904-01-01. The TOPEX/Jason data for global mean sea level represents dates as a decimal fraction of years.

The bottom line is: There are all sorts of crazy date formats. Get over it.

I recommend:

1) using a good library.
2) for storage, use ISO 8601
3) for runtime/manipulation use double.

All I need to know to learn R

2012-10-05

I’ve been learning R, mostly because it’s been on my list of things to do for ages, and partly because I needed to draw a histogram.

All the tedious stuff about how you get started and how you install things is surprisingly difficult to get from the internets.

So to install on Ubunutu:

sudo apt-get install r-base

Then you run the command R:

$ R

Once you’re in R you can find things out by using Google. Once you’ve found a function you want to use, say sj.test, if it doesn’t seem to be installed, you can install it by noting the library name which is in curly brackets at the top of the man page. {lawstat} in this case. So you then go:

> install.packages("lawstat") # to install it
> library(lawstat) # to use it

(the package installer has a hilariously craptastic interface written in Tcl/Tk)

That’s it. Everything I need to know to learn R. Everything else is just bog standard programming language stuff (though it helps a bit that I learnt a bit of J).

Here’s the histogram:

And the R code is behind this link. The way the function png() implicitly makes hist() write into the PNG file is particularly bletcherous. It has all the elegance of writing JCL for IBM mainframes.