diff --git a/macros/macros.py b/macros/macros.py index 762bd56..d1b74e9 100755 --- a/macros/macros.py +++ b/macros/macros.py @@ -15,14 +15,17 @@ def download_prog(root, fname): def list_pages(pathdir): dl = htmlfunc.DefList() - fs = [(os.path.join(pathdir, f), f) for f in filter( - lambda f: f.endswith('.org') and f != 'index.org', - os.listdir(pathdir))] + fs = [(p if os.path.isfile(p) else os.path.join( + p, 'index.org'), f, f[:-4] if os.path.isfile(p) else f + '/') for p, f in filter( + lambda pf: (os.path.isfile(pf[0]) and pf[0].endswith('.org') and + pf[1] != 'index.org') or ( + os.path.isdir(pf[0]) and os.path.isfile(os.path.join(pf[0], 'index.org'))), + ((os.path.join(pathdir, f), f) for f in os.listdir(pathdir)))] fs.sort(key=lambda pf: git.rr.get_last_modified_date(pf[0])[0] or misc.utcwhenmodified(pf[0])) - for p, f in fs[::-1]: + for p, f, l in fs[::-1]: a = htmlgen.org_to_abstract(p, isfile=True, only_metadata=True) - dl.add_item(htmlfunc.link(f[:-4], a.title), a.summary if a.summary + dl.add_item(htmlfunc.link(l, a.title), a.summary if a.summary else None) #'No summary.') return dl.generate_html() diff --git a/macros/macros.pyc b/macros/macros.pyc index e1ea3a3..1564941 100644 Binary files a/macros/macros.pyc and b/macros/macros.pyc differ diff --git a/prestatic/aesthetics.js b/prestatic/aesthetics.js index 79e17dd..e3a0508 100644 --- a/prestatic/aesthetics.js +++ b/prestatic/aesthetics.js @@ -35,7 +35,7 @@ set_min_height = function() { wh = ws[0]; ww = ws[1]; - h = metadiv.offsetHeight + 15; + h = metadiv.offsetHeight + 25; metadiv.style.position = 'absolute'; metadiv.style.bottom = '5px'; metadiv.style.width = (contentdiv.offsetWidth - 42) + 'px'; diff --git a/prestatic/screen.css b/prestatic/screen.css index ef80225..fae0e12 100644 --- a/prestatic/screen.css +++ b/prestatic/screen.css @@ -187,6 +187,7 @@ h1:first-child { h2 { margin: 14px 0 5px 0 ; font-size: 25px; + background-color: #ddd; } h3 { @@ -217,12 +218,16 @@ h6 { p { text-align: justify; - margin-bottom: 10px; + margin-top: 10px; +} + +p:first-child { + margin-top: 0; } div.caption { clear: both; - margin: 10px; + margin-bottom: 10px; } caption, div.caption > p { @@ -236,6 +241,10 @@ div.caption.center-float img { margin: 0 auto; } +div.caption.left-float img { + margin: 0; +} + div.caption.center-float { text-align: center; } @@ -248,9 +257,16 @@ tt, code, samp, pre, var { font-family: Inconsolata, 'Dejavu Sans Mono', monospace; } +pre { + margin-top: 10px; + white-space: pre-wrap; + word-wrap: break-word; +} + img { border: none; clear: both; + margin-bottom: 10px; } cite, quote { @@ -367,6 +383,24 @@ td, th { padding: 1px 3px; } +thead, tfoot { + font-weight: bold; +} + + +/* Math */ + +.math { + position: relative; + top: 14px; +} + +.block.math { + position: static; + top: 0; + margin: 10px auto 0 auto; +} + /* Formatting-related classes */ @@ -395,7 +429,8 @@ td, th { } .center-float { - margin: 0 auto; + margin-right: auto; + margin-left: auto; } .right-float { @@ -406,6 +441,14 @@ td, th { float: left; } +div.right-float, img.right-float, video.right-float, audio.right-float { + margin-left: 10px; +} + +div.left-float, img.left-float, video.left-float, audio.left-float { + margin-right: 10px; +} + .block { display: block; } @@ -414,6 +457,10 @@ td, th { display: inline; } +.noclear, div.caption.noclear { + clear: none; ! important +} + .huge, .huge * { font-size: 25px; ! important } @@ -423,15 +470,15 @@ td, th { } .medium, .medium * { - font-size: 12px; ! important + font-size: 14px; ! important } .small, .small * { - font-size: 10px; ! important + font-size: 11px; ! important } .tiny, .tiny * { - font-size: 8px; ! important + font-size: 9px; ! important } @@ -442,17 +489,27 @@ td, th { } .highlighttable { - margin-bottom: 10px; + margin: 5px 0 5px 0; +} + +.highlighttable pre { + margin-top: 0; } .highlighttable, .highlighttable .code { border-width: 0; } +.highlighttable .code { + width: 600px; +} + .linenos { border-width: 0 1px 0 0; border-style: solid; border-size: black; + vertical-align: top; + } @@ -465,3 +522,14 @@ td, th { border: 1px outset black; } +.note { + background-color: #c3cfcf; + font-weight: bold; + padding: 5px 5px 0 5px; + border: 1px outset black; +} + +.note p, .warning p { + margin-bottom: 5px; +} + diff --git a/prestatic/template.html b/prestatic/template.html index f439f9c..6792d40 100644 --- a/prestatic/template.html +++ b/prestatic/template.html @@ -33,7 +33,7 @@ page.summary = run_macros(page.summary) - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/site/img/licenses/gpl.png b/site/img/licenses/gpl.png new file mode 100644 index 0000000..3e9136e Binary files /dev/null and b/site/img/licenses/gpl.png differ diff --git a/site/img/licenses/lgpl.png b/site/img/licenses/lgpl.png new file mode 100644 index 0000000..012f011 Binary files /dev/null and b/site/img/licenses/lgpl.png differ diff --git a/site/projects/mege/docs/index.org b/site/projects/mege/docs/index.org index 7d38884..d0ae3d7 100644 --- a/site/projects/mege/docs/index.org +++ b/site/projects/mege/docs/index.org @@ -147,7 +147,7 @@ Quote without citing: =a^2+b^2=c^2"e=. Cite without quoting: =http://en.wikipedia.org/&cite=. -Quote and cite: ={metanohi exists}&cite=http://metanohi.org/=. +Quote and cite: ={metanohi exists}&cite=http://metanohi.name/=. HTML equivalent: #+BEGIN_SRC html diff --git a/site/projects/mege/index.org b/site/projects/mege/index.org index c3c7b8a..b5afaed 100644 --- a/site/projects/mege/index.org +++ b/site/projects/mege/index.org @@ -1,10 +1,10 @@ #+title: mege #&summary -mege the metanohi generator +mege is the generator used by metanohi #& #+license: bysa -* mege the metanohi generator +* mege + [[./tests/][Tests]] + [[./docs/][Documentation]] @@ -12,3 +12,9 @@ mege the metanohi generator Both are works in progress, like mege. Note that the author of mege does believe in good documentation. And while believing is not the same as doing, good mege documentation /will/ exist at some point in the near future. + +* Download + +No release is out yet. You can clone the current code with git: + +: $ git clone git://metanohi.name/mege diff --git a/site/projects/mege/tests/audio.org b/site/projects/mege/tests/audio.org new file mode 100644 index 0000000..d104361 --- /dev/null +++ b/site/projects/mege/tests/audio.org @@ -0,0 +1,9 @@ +#+title: Test of mege audio +#+license: bysa +#+summary: How to show audio in mege + +* Test of mege audio + +#&audio;url=test2.ogg + +([[http://commons.wikimedia.org/wiki/File:Polish_Tongue_twister_-_Korale.ogg]], CC BY-SA) diff --git a/site/projects/mege/tests/basics.org b/site/projects/mege/tests/basics.org index c59c8ca..fe98e13 100644 --- a/site/projects/mege/tests/basics.org +++ b/site/projects/mege/tests/basics.org @@ -18,7 +18,7 @@ This is a *paragraph* with the last word *strongly* /emphasized/. _This_ is underlined. _/*The effects*/ can /be/ combined_. Press -C-n- to scroll down if your web browser is Conkeror (-Ctrl+N- in non-emacs speak). -Type this: =$ echo echo=. +Type this: =$ echo echo= ** Extended inline formatting @@ -26,11 +26,11 @@ mege uses postfix operators for less essential inline formatting. More&strong strong text&samp. And even acronyms and abbreviations: GNU&acro="GNU's not UNIX" and MF&abbr="Medlem af Folketinget". {Other -colors}&color=red and {other sizes}&small as well, {{and also}&color=green -combinations}&large. +colors}&color=red and {other sizes}&small as well, {and {also +(really)}&color=green combinations}&large. Now subtract y&var from x&var - 2^{32}. And a definition: {An integer above 0 -is above -1_{a number}}&dfn. +is above -1_{a number}}&dfn. {Typewriter *text*}&tt. ** Lists @@ -158,6 +158,16 @@ introduction by the Master of Falsefulness x_{tallyho} = 33^{12}, escaped: x_\{tallyho} = 33^\{12} +** Math + +Inline: $2\neq3$, block: + +#&math +\begin{align*} +\frac{dy}{dx} = 2x +\end{align*} +#& + ** Code : ver *ba* tim @@ -195,3 +205,4 @@ Inline HTML: <@html strong text@>. Smiley: '_~ 41. 2+2=4 #+END_SRC +And more. diff --git a/site/projects/mege/tests/code.org b/site/projects/mege/tests/code.org index 527beef..d73fae6 100644 --- a/site/projects/mege/tests/code.org +++ b/site/projects/mege/tests/code.org @@ -9,3 +9,106 @@ Code in mege While the <@eval macros.titlelink('basics')@> does include code, this test contains more. And all of it's different. +** Shown, but not highlighted + +*** Without formatting + +Inline: =while [ 1 ] ; do echo y ; done=, simple. + +: echo Hello + +: if hello: +: print('Hello') + +: wget *url* + +#+BEGIN_SRC +cond = source and not highlighted +#+END_SRC + +*** With formatting + +#++pre +: wget *url* + +#&pre +*Preformatted* but still [[http://en.wikipedia.org/wiki/Monospace][monospace]] +{Escaped}&strong! +#& + +#++pre +#+BEGIN_SRC +*Preformatted* but still [[http://en.wikipedia.org/wiki/Monospace][monospace]] +{Escaped}&emph! +#+END_SRC + +Inline: =while [ 1 ] ; /do/ echo y ; done=&tt, messy. + +** Shown and highlighted + +#++sh +: x=32 +: echo $x + +#+BEGIN_SRC python +cond = source and highligted +print(cond) +#+END_SRC + +Inline: =

abc

=&html. + +** HTML + +#+BEGIN_SRC html +
au
+#+END_SRC +The above code equals: +#++show +#+BEGIN_SRC html +
au
+#+END_SRC + +Inline HTML: <@html strong text@>. + +** JavaScript, CSS + +#+BEGIN_SRC javascript + window.addEventListener('load', function(event){ + tempobj = document.getElementById('tempobj'); + tempobj.addEventListener( + 'click', function(event){tempobj.innerHTML += 'A';}, false); + }, false); +#+END_SRC + +# Make mege load it +#++show +#+BEGIN_SRC javascript + window.addEventListener('load', function(event){ + tempobj = document.getElementById('tempobj'); + tempobj.addEventListener( + 'click', function(event){tempobj.innerHTML += 'A';}, false); + }, false); +#+END_SRC + + +** Eval'd Code +Inline code: =<@eval 2 + 3@>= = <@eval 2 + 3@>. + +Inline code: +#&-eval +2 + 3 +#& + +Block code: + +#¶graph +#++eval +#+BEGIN_SRC python +2 + 3 +#+END_SRC + +#¶graph +#++dexec +#+BEGIN_SRC python +print('Date:', datetime.datetime.utcnow()) +#+END_SRC diff --git a/site/projects/mege/tests/index.org b/site/projects/mege/tests/index.org index 13201bb..fe630b9 100644 --- a/site/projects/mege/tests/index.org +++ b/site/projects/mege/tests/index.org @@ -16,6 +16,7 @@ have been created: + [[math][Math]] + [[code][Code]] + [[video][Video]] ++ [[audio][Audio]] Perhaps /mege/ will grow and come near to perfection one day. diff --git a/site/projects/mege/tests/math.org b/site/projects/mege/tests/math.org index b6e4e2f..a39d64f 100644 --- a/site/projects/mege/tests/math.org +++ b/site/projects/mege/tests/math.org @@ -9,3 +9,31 @@ Math in mege While the <@eval macros.titlelink('basics', page.pathdir)@> does include math, this test contains more. And all of it's different. +** Inline + +Blah: $2+2$ + +** Block, way #1 + +#&math +\begin{align*} +\sqrt{\sqrt{32x} + 14y} = 31 +\end{align*} +#& + +** Block, way #2 + +#+BEGIN_SRC latex +\begin{align*} +a^p \equiv a \mod p, a \in Z, p \text{ is prime} +\end{align*} +#+END_SRC + +** Block, way #2, highlighted + +#++high +#+BEGIN_SRC latex +\begin{align*} +a^p \equiv a \mod p, a \in Z, p \text{ is prime} +\end{align*} +#+END_SRC diff --git a/site/projects/mege/tests/tables.org b/site/projects/mege/tests/tables.org index a2ad980..54e9105 100644 --- a/site/projects/mege/tests/tables.org +++ b/site/projects/mege/tests/tables.org @@ -6,9 +6,66 @@ Tables in mege * Test of mege tables -While the <@eval macros.titlelink('basics', page.pathdir)@> does include +While the <@eval macros.titlelink('basics')@> does include tables, this test contains more. And they're all different. -* Basic table +** Basic table +| Name | Age | +| Xryurg | 300 | +| Bkrau | 2 | +** With header + +| Name | Age | +|--------+-----| +| Xryurg | 300 | +| Bkrau | 2 | + +** With header and footer + +| Name | Age | +|--------+-----| +| Xryurg | 300 | +| Bkrau | 2 | +|--------+-----| +| Name | Age | + +** Inline formatting in table + +| URL | Exists | +|-----------------+--------| +| [[example.com]] | *Yes* | +| [[abc.example.com]] | /No/ | + +** Complex table + +| Number | Target | Measured | Deviation | +|--------+--------+----------+---------------| +| 0 | 697 | 694 | 0.43 `percent | +| 1 | 697 | 694 | 0.43 `percent | +| 2 | 697 | 692 | 0.72 `percent | +| 3 | 770 | 764 | 0.78 `percent | +| 4 | 770 | 762 | 1.04 `percent | +| 5 | 770 | 762 | 1.04 `percent | +| 6 | 852 | 844 | 0.94 `percent | +| 7 | 852 | 844 | 0.94 `percent | +| 8 | 852 | 844 | 0.94 `percent | +| 9 | 941 | 930 | 1.17 `percent | +| A | 941 | 929 | 1.28 `percent | +| B | 941 | 929 | 1.28 `percent | +| C | 697 | 704 | 1.00 `percent | +| D | 770 | 776 | 0.78 `percent | +| E | 852 | 844 | 0.94 `percent | +| F | 941 | 946 | 0.53 `percent | +#+TBLFM: $4=abs($3-$2)/$2 %;%.2f `percent + +** Escaped table + +\| A | B | +| B | C | + +** Over-escaped tables +\\| O | + +\\\| P | diff --git a/site/projects/mege/tests/test1.ogv b/site/projects/mege/tests/test1.ogv new file mode 100644 index 0000000..5da8448 Binary files /dev/null and b/site/projects/mege/tests/test1.ogv differ diff --git a/site/projects/mege/tests/test2.ogg b/site/projects/mege/tests/test2.ogg new file mode 100644 index 0000000..b9651df Binary files /dev/null and b/site/projects/mege/tests/test2.ogg differ diff --git a/site/projects/mege/tests/video.org b/site/projects/mege/tests/video.org index 2dcf67a..b93ee5f 100644 --- a/site/projects/mege/tests/video.org +++ b/site/projects/mege/tests/video.org @@ -4,3 +4,6 @@ * Test of mege video +#&video;url=test1.ogv,width=640,height=480,autoplay + +([[http://films.metanohi.name/compufight][Compufight]], CC BY-SA) diff --git a/site/writings/bash-prompt-extras.tar.gz b/site/writings/bash-prompt-extras.tar.gz new file mode 100644 index 0000000..751d519 Binary files /dev/null and b/site/writings/bash-prompt-extras.tar.gz differ diff --git a/site/writings/bash-prompt.org b/site/writings/bash-prompt.org new file mode 100644 index 0000000..a991ae6 --- /dev/null +++ b/site/writings/bash-prompt.org @@ -0,0 +1,17 @@ +#+title: My BASH prompt +#&summary +What my prompt does and what it looks like. +#& +#+license: bysa + +* My BASH prompt + +I have my own bash prompt. To use it, first, copy this into your ~.bashrc~: + +#+BEGIN_SRC sh +PROMPT_COMMAND="EXCO=$?;pwdw=$(($COLUMNS-20))" +PS1='\[\033[00m\]$(if [ $EXCO == 0 ]; then echo -ne "\[\033[42m\]\[\033[01;30m\]"; else echo -ne "\[\033[41m\]\[\033[01;34m\]"; fi)$(length-extra-prepend $EXCO 3)\[\033[45m\] \[\033[44m\]\[\033[01;37m\]$(date +%H:%M)\[\033[45m\] \[\033[46m\]\[\033[01;33m\]$(length-too-much-shorten "$(pwd | sed s%$HOME%~%)" $(if (( $pwdw < 20 )); then echo -n 20; else echo -n $pwdw; fi))\[\033[00m\]\n\[\033[45m\]\[\033[01;33m\]\u\[\033[01;32m\]@\[\033[01;36m\]\h\[\033[43m\]\[\033[01;30m\]:\[\033[40m\]\[\033[01;33m\]\$\[\033[00m\] ' +#+END_SRC + +Second, download [[bash-prompt-extras.tar.gz]] and put the included programs +somewhere in =$PATH=&sh. diff --git a/site/writings/digital-sikring.org b/site/writings/digital-sikring.org new file mode 100644 index 0000000..f5c96ee --- /dev/null +++ b/site/writings/digital-sikring.org @@ -0,0 +1,210 @@ +#+title: Digital sikring mod gennemførsel af eksamen en realitet +#&summary +A text about the failings of digital education and "copy protection". In +Danish. +#& +#+license: bysa + +Jeg sendte denne besked til Undervisningsministeriet som så fortalte mig at de +skam nok var i gang med at gøre det nemmere for "Linus".. + +Sendt 8. marts. Se også <@eval macros.titlelink('stadig-digital-sikring')@>. + +* Digital sikring mod gennemførsel af eksamen en realitet + +At gennemføre en skriftlig eksamen som elev på en gymnasial uddannelse er ikke +nemt efter Undervisningsministeriet har indført låse uden nøgler på udleverede +cd'er. Problemet bag er dog meget dybere: Digitaliseringen er fejlet. + +Jeg går på htx (teknisk gymnasium) på 3. og sidste år[fn:nomore]. For ikke lang +tid siden var jeg til skriftlig terminsprøve i engelsk A hvor terminsprøven var +en kopi af eksamen fra juni 2010. Som elev er man ofte lidt nervøs før man skal +op til en eksamen. Har man forberedt sig godt nok? Har man glemt noget? Derfor +er det vigtigt for eleverne at eksamenen — eller her terminsprøven — er med så +få problemer som muligt, helst ingen overhovedet. Spild af tid kan være +frustrerende for alle parter. + +En eksamen eller terminsprøve i skriftligt engelsk består af to dele: en +grammatikdel, hvor man i en time sidder og løser opgaver i hånden, og en +stildel, hvor man har fire timer foran sin egen bærbare computer til at læse et +oplæg, læse baggrundsmateriale, se et par korte videoklip der følger med og så +skrive stilen. Alt materialet til stilen får man udleveret på en cd. At skrive +i hånden i en time kan vi — trods alt — godt formå, men man skulle tro at den +anden del, hvor vi bruger vores egen computer, skulle være nemmere for os da +mange af os er vant til at skrive på computer. Imidlertid har +Undervisningsministeriet valgt at indføre meningsløse begrænsninger der gjorde +at jeg skulle vente 35 minutter på at få oplægget og +baggrundsmaterialet. Grunden hertil var at cd'erne var kopisikrede på en sådan +måde at et af styresystemerne Microsoft Windows eller Apple Mac OS X var +krævet. Jeg bruger imidlertid et andet styresystem, kaldt GNU/Linux. Dette er +et frit system hvor det er brugeren der styrer computeren, og ikke computeren +der styrer brugeren, som det er tilfældet i fx Microsofts produkter og Apples +produkter — mere om det senere. Hovedsagen her var at jeg var nødt til at vente +til en af skolens it-hjælpere brød kopisikringen på en Windows-computer og gav +mig filerne i deres rå form på en usb-nøgle, så min computer kunne læse +dem. Problemet med cd'en var at vigtige dokumenter, såsom oplægget, var gemt i +et filsystem jeg ikke havde adgang til grundet mit bevidste valg om ikke at +bruge hverken Windows eller Mac. + +Da vi fik udleveret cd'erne, stod der rigtigt nok på dem at de kun virkede på +Windows og Mac. Jeg har siden været inde på Undervisningsministeriets +hjemmeside (se uvm.dk/Uddannelse/Gymnasiale uddannelser/Proever og +eksamen/Tekniske specifikationer.aspx), og det viser sig at dette fortsætter i +samme linje, bare værre. Kravene til skriftlig eksamen i fysik A i foråret 2011 +er mere eller mindre de samme som til engelsk A, men i fysik skal man også have +software installeret der understøtter Word 2003- og Excel 2003-filer. Begge +disse type computerfiler fra Microsoft er i formater hvis specifikationer ikke +er tilgængelige, og det er derfor endnu ikke lykkedes at få fuld support for +formaterne i programmer der ikke har været inde over Microsoft. Man vil altså +være tvunget til at bruge en variant af programmerne fra Microsoft Office for +at læse filerne fuldstændigt hvilket hverken er muligt eller ønsket når man er +bruger af et frit system. Desuden — og dette er ret så relevant — følger +Undervisningsministeriet her ikke nogen af de to obligatoriske standarder for +dokumentudveksling som alle offentlige myndigheder har skullet bruge +siden 2008. Pjecen "Sådan anvender du åbne standarder for software i det +offentlige" fra IT- og Telestyrelsen forklarer ellers disse standarder ret +tydeligt. Måske har Undervisningsministeriet indkøbt deres it-løsning +før 1. januar 2008, så de ikke er tvunget til at bruge de nye standarder, men +at bruge et 8 år gammelt programafhængigt dokumentformat, når et et +standardiseret et, som nemt kan læses af alle styresystemer, har været +anbefalet i over 3 år, burde ikke være acceptabelt. Undervisningsministeriet +har ikke fået nok undervisning. + +Jeg har ikke fysik A, men en fra min klasse der kører GNU/Linux ligesom mig +har, og hvis han skal op til eksamen til maj, kan han risikere ikke fuldt ud at +kunne læse opgaven — ikke kun fordi cd'en er kopibeskyttet, men også fordi +filerne kun kan læses helt korrekt af Microsoftrelaterede +programmer. Programmer, mange mennesker over hele verden har valgt ikke at +bruge af moralske årsager. + +Men hvad er alt dette softwarefrihed for noget? Nogen vil måske tænke at jeg jo +bare kunne skifte til Mac eller Windows og derefter installere alle de +computerprogrammer folk ville have jeg skulle installere. Dette er dog ikke en +holdbar løsning. Faktisk kommer problemet med de kopisikrede cd'er og de uåbne +formater fra noget meget dybere, noget meget værre og noget virkeligt udbredt: +proprietær software. Proprietær software er software som kun ophavsretholderen +bestemmer over, dvs. brugeren er begrænset af licensaftaler. Disse aftaler er +forskellige, men fælles er at man sjældent har mange softwarelaterede +rettigheder tilbage når man har sagt ok til en sådan aftale. Hvis man bruger +proprietær software, har man ikke kontrol over de programmer man kører, over +selve brugen af ens computer. Menneskerne der står bag programmet har +kontrol. Og de bruger den kontrol. + +Mange kan nok huske skandalen med e-bookreaderen Kindle (i visse kredse nu +kaldt "Swindle") hvor flere mennesker fik slettet bogen "1984" som de havde +købt. Dette kunne ske fordi styresystemet på Swindlen er proprietært og altså +ikke bliver styret af brugerne af det. Efter en retssag sagde Amazon.com, dem +bag sletningen, ok til i fremtiden kun at slette bøger under særlige +omstændigheder. Hvis dette ikke var uhyggeligt, ville det være grinagtigt: at +der skal en retssag til før en virksomhed vælger ikke at slette bøger fra +elektroniske dimser via internettet. Men sådan er proprietær software: +utilregneligt og ubrugeligt. + +Der er mange andre eksempler på proprietær software: Microsoft Windows sender +uforklarede beskeder til Microsoft en gang imellem, Adobe Photoshop kører kun +hvis man har indtastet en speciel nøgle, Facebook indsamler data, censurerer +noget, giver andet videre til annoncører, og har fuld mulighed for at gøre mere +med dataen, hvilket de nok også gør, og i Apples iPhone og iPad (i +"Swindle"-kredsene kaldt "iBad") er det Apple — og ikke forbrugeren — der +bestemmer hvilke programmer der må gøres tilgængelige og installeres. I alle +tilfælde handler det om kontrol. Virksomhederne, grupperne eller +enkeltpersonerne bag ønsker så meget magt som muligt, for de vil tjene mange +penge. + +Som computerbruger er man nødt til på et tidspunkt at tænke over hvad der er +vigtigst: softwareejernes velvære eller samfundets digitale frihed. For et par +år siden valgte jeg friheden fremfor fængslet og skiftede altså til +GNU/Linux. Mange før mig havde gjort dette, så det var nemt at komme i gang med +mit nye system på min computer. Det er nemt nok til at mine 50+-forældre kan +finde ud af det. Kernen i frie systemer såsom GNU/Linux er fri software. Fri +software er software der gør brugeren fri vha. disse fire friheder: + + 1. Friheden til at køre programmet for et hvilket som helst formål + 2. Friheden til at studere programmet og ændre i det. Kildekoden til + programmet skal være tilgængelig for at dette er muligt + 3. Friheden til at dele programmet med alle + 4. Friheden til at ændre i programmet og dele ens ændringer + +Fri software er altså det præcist modsatte af proprietært software. Her er +brugeren den vigtigste, for det er brugeren der skal køre programmet. Tilsammen +sørger de fire friheder, oprindeligt defineret i sammenhæng med begyndelsen af +organiseret udvikling af fri software i midten af 1980'erne, for at ens +computer ikke misbruger ens data og ikke begrænser adgangen til og brugen af +ens data. Fri software handler ikke om styrken af det tekniske kodestads der +ligger bag programmet. Det handler om friheden forbundet med det. I mange +tilfælde er fri software dog virkeligt funktionelt, og fx kører langt de fleste +hjemmesider netop på fri software. Det fungerer. + +Nogen vil måske opfatte nogle eller alle af de fire friheder for +irrelevante. Men går man gennem dem trin for trin, giver de god mening. Først +og fremmest: det giver ingen mening at have et program hvis skaber(e) har +bestemt du ikke må køre. Det er en bunke bytes som ikke kan fås til at bevæge +sig. Her vil nogen måske proteste med henblik på økonomi og påstå at det er +nødvendigt at begrænse ens brug af et program indtil man har købt en unik +nøgle, for at virksomheden bag kan tjene penge og udvikle nyt software. Dette +argument leder tråden væk fra hovedproblemet, nemlig at man skal kunne +kontrollere hvad der sker på ens egen computer. Det er dog sandt at det er +nemmere at tjene store penge ved at tvinge dem ud af folk — hvilket er det +kommercielt proprietær software gør — end ved at bede folk om dem. Der er +imidlertid intet galt med fri kommerciel software. Det er betydeligt sværere at +blive softwaremilliardær når man sælger fri software istedet for proprietær +software, men økonomiske modeller der respekterer softwarefrihed eksisterer +skam: man kan fx yde support eller lave skræddersyede løsninger. At have +kontrol nok over et program til at kunne køre det bør altså være et must, lige +meget om man går op i penge eller ej. + +Det giver heller ingen mening at have et program man ikke må dele. Det er +gavnende at dele, og dette gælder især for software. Software er noget man +bruger, noget der gør ikke-trivielle ting trivielle, så man kan fokusere på +andre, mere interessante ting. Og hvis ens ven har brug for at kunne gøre noget +på sin computer, og man har et program der kan gøre netop det, så ville det +være mærkeligt ikke at dele programmet med vennen. Programmet er immaterielt, +og man mister det ikke ved at dele det. Alt er bare kopier. Mange store +virksomheder har i lang tid spredt propaganda om at man er en "pirat" hvis man +deler software. Pladeselskaberne er med på denne magtjagt, men for dem handler +det om kulturelle værker. For folk der deler betyder det dog ikke så meget hvem +der står bag propagandaen. Det vigtigste er at protestere mod den og ikke +begynde at tro på den. Hvis man ikke må dele et program, må man lade være med +at bruge det. Folk der producerer fri software ønsker at folk kopierer fri +software til venner, bekendte og fremmede. + +Selv hvis man kan blive enig med de to forrige forklaringer, vil en del sikkert +stadig mene, at de to friheder angående ændring af programmer virker stort set +overflødige: almindelige mennesker er jo ikke programmører, og de vil derfor +ikke kunne ændre noget lige meget hvad. Disse to friheder handler dog ikke +nødvendigvis om at man skal ændre et program selv. Hvis man ikke kan, men har +brug for, at ændre et program, skal man kunne hyre nogen der har styr på +programmering til at gøre det for en. Frihederne har også et andet, lige så +vigtigt formål: når alle frit kan studere koden bag et program, er +sandsynligheden for at programmet ikke er ondskabsfuldt uendeligt større end +hvis koden ikke var tilgængelig. Hvis der er noget ondskabsfuldt i, kan en +eller anden programmør fjerne det og lave en ny version af programmet. Hvis +programmet ikke virker, kan en eller anden programmør få det til at virke. I +mange tilfælde samarbejder frivillige programmører på tværs af landegrænser i +decentraliserede grupper over internettet, og hvis ikke alle kunne studere +koden, forbedre den og sprede ideer om implementeringer af diverse algoritmer +mm., ville mange af de udbredte frie programmer der bruges i dag --- +OpenOffice.org, fx — ikke eksistere i deres udviklede tilstand. Der er dog også +rigtig meget fri software der udvikles af enkeltpersoner, men også her giver +alle fire friheder mening. + +Fri software er godt for samfundet, ligesom ytringsfrihed er godt, og det er +derfor bekymrende at fx Undervisningsministeriet har valgt at alliere sig med +virksomheder der producerer proprietær software. Der er sket meget siden GNU +(GNU's Not Unix, se gnu.org) og FSF (Free Software Foundation, se fsf.org), +henholdsvis et fri software-projekt og en fri software-organisation, begyndte +spredningen af fri software i '80'erne, men fri software er ikke færdigt med at +blive udbredt endnu. I Danmark virker det som om myndighederne ikke har fulgt +helt med udviklingen generelt hvilket bl.a. kom til udtryk ved terminsprøven +hvor vi fik udleveret noget så arkaisk som cd'er (i dag har cd'er lidt samme +status som disketter havde for 5 år siden). En del fra min klasse havde ikke +cd-drev i deres laptops, og de sad ligesom mig og ventede i en god halv time +før en usb-nøgle reddede os. Der er simple, tidsbesparende, snydsikre +alternativer til uddelinger af skiver — man kunne fx sætte et trådløst netværk +op hvor kun oplægget kunne hentes — men dem bruger man ikke. Desværre. + +I april er der en digitaliseringskonference i Aarhus. Jeg håber der kommer +noget godt ud af den. + + +[fn:nomore] Det er jeg ikke længere. Jeg blev student i juni. diff --git a/site/writings/index.org b/site/writings/index.org index af4befd..c61e695 100644 --- a/site/writings/index.org +++ b/site/writings/index.org @@ -1,5 +1,11 @@ #+title: Writings +#+summary: A list of my writings +#+license: bysa * Writings <@eval macros.list_pages(page.pathdir)@> + +** Old + ++ [[http://projects.metanohi.name/eonaton/?t=0&s=5][Eon Aton]] (both a story and an unfinished game) diff --git a/site/writings/pygame-pycairo.org b/site/writings/pygame-pycairo.org new file mode 100644 index 0000000..9fca6d0 --- /dev/null +++ b/site/writings/pygame-pycairo.org @@ -0,0 +1,113 @@ +#+title: Combining PyGame and PyCairo +#&summary +How to combine two Pythonic graphical frameworks +#& +#+license: wtf + +* Combining PyGame and PyCairo + +#&+classes=note +See [[http://pygame.org/wiki/CairoPygame]] for other examples. +#& + +This piece of code allows you to convert a Cairo surface to a PyGame +surface. It also includes a small example on how to make SVG loading work. It +works with Python 2.5+ and requires relatively recent versions of pygame, +pycairo and NumPy to work. For the SVG example to work, you must also have rsvg +installed. + +#+BEGIN_SRC python2 +#!/usr/bin/env python +# Copyleft 2010 Niels Serup, WTFPL 2.0. Free software. + +### Imports ### +import math +import pygame +import cairo +import numpy +import Image + +### Constants ### +width, height = 640, 480 + + +### Functions ### +def draw(ctx): + ctx.set_line_width(15) + ctx.arc(320, 240, 200, 0, 2 * math.pi) + + # r g b a + ctx.set_source_rgba(0.6, 0, 0.4, 1) + ctx.fill_preserve() + + # r g b a + ctx.set_source_rgba(0, 0.84, 0.2, 0.5) + ctx.stroke() + +def bgra_surf_to_rgba_string(cairo_surface): + # We use PIL to do this + img = Image.frombuffer( + 'RGBA', (cairo_surface.get_width(), + cairo_surface.get_height()), + cairo_surface.get_data(), 'raw', 'BGRA', 0, 1) + + return img.tostring('raw', 'RGBA', 0, 1) + + +### Body ### +# Init PyGame +pygame.display.init() +screen = pygame.display.set_mode((width, height), 0, 32) + +# Create raw surface data (could also be done with something else than +# NumPy) +data = numpy.empty(width * height * 4, dtype=numpy.int8) + +# Create Cairo surface +cairo_surface = cairo.ImageSurface.create_for_data( + data, cairo.FORMAT_ARGB32, width, height, width * 4) + +# Draw with Cairo on the surface +ctx = cairo.Context(cairo_surface) +draw(ctx) + + +##### SVG LOADING EXAMPLE ##### +# Using rsvg it is possible to render an SVG file onto a Cairo +# surface. Uncomment the following lines to make it work. +#import rsvg # This will probably not work in Windows. As far as I +# know, only GNU/Linux distibutions package this Python +# module. Nevertheless, it should be easy to create a small wrapper; +# see http://www.cairographics.org/cairo_rsvg_and_python_in_windows/ + +# Load the file +#svg_graphics = rsvg.Handle('path/to/file.svg') + +# Render the graphics onto your Cairo context +#svg_graphics.render_cairo(ctx) + +# To get the SVG file's dimensions before you create a Cairo surface, +# use the following function: +#print svg_graphics.get_dimension_data() +############################### + +# On little-endian machines (and perhaps big-endian, who knows?), +# Cairo's ARGB format becomes a BGRA format. PyGame does not accept +# BGRA, but it does accept RGBA, which is why we have to convert the +# surface data. You can check what endian-type you have by printing +# out sys.byteorder +data_string = bgra_surf_to_rgba_string(cairo_surface) + +# Create PyGame surface +pygame_surface = pygame.image.frombuffer( + data_string, (width, height), 'RGBA') + +# Show PyGame surface +screen.blit(pygame_surface, (0,0)) +pygame.display.flip() + +clock = pygame.time.Clock() +while not pygame.QUIT in [e.type for e in pygame.event.get()]: + clock.tick(30) +#+END_SRC + diff --git a/site/writings/stadig-digital-sikring.org b/site/writings/stadig-digital-sikring.org new file mode 100644 index 0000000..f299534 --- /dev/null +++ b/site/writings/stadig-digital-sikring.org @@ -0,0 +1,171 @@ +#+title: Stadig digital sikring mod gennemførsel af eksamen +#&summary +A text about the continuing failings of digital education and "copy +protection". In Danish. +#& +#+license: bysa + +Jeg sendte denne besked til Undervisningsministeriet som så forklarede at de +var nødt til at bruge kopisikring fordi de brugte tekst, billeder og video fra +eksterne kilder (såsom BBC). Det må være muligt for dem at lave bedre aftaler i +deres kraft af undervisningsministerium --- desuden er det ikke engang alle +skoler der bruger de kopisikrede cd'er, så i flere tilfælde er kopisikring +ligegyldig. Så fjern den dog! + +Sendt 31. maj. Se også <@eval macros.titlelink('digital-sikring')@>. + +* Stadig digital sikring mod gennemførsel af eksamen + +Hej UVM + +D. 8. marts sendte jeg jer en klage/ideer-til-forbedring-e-mail ved navn +"Digital sikring mod gennemførsel af eksamen en realitet" hvor jeg +forklarede jer at kopisikringer på cd'er forhindrede min computer, som +kører styresystemet GNU/Linux i stedet for fx Microsoft Windows eller +Apple Mac OS X, i at læse teksten på cd'en til skriftlig engelsk +terminsprøve (skriftlig engelsk eksamen 2010): videoklippene var +tilgængelige i filsystemet, men teksten var der ikke. I skrev tilbage at +I arbejdede på at det også skulle virke på GNU/Linux og at der +sandsynligvis ikke ville være nogle problemer ved eksamen --- hvilket +der så var. I går til skriftlig engelsk eksamen blev jeg endnu en gang +ramt af cd-krypteringen, og kun skolens beredskab med en usb-stick +reddede mig. Jeg kan acceptere at i sender cd'er ud, men vil I ikke nok +lad være med at kopisikre dem? Det er både bedre og nemmere at lave +ukrypterede cd'er. + +Jeg ved ikke om dette er den rette kanal, men jeg vil lige beskrive mit +problem på en teknisk måde og bevise min påstand om kopisikringen: + +Først og fremmest: kravet til en computer til en skriftlig engelsk +eksamen bør være at den understøtter basale standarder inden for tekst, +lyd, video og, da I har valgt at bruge et webinterface, webteknologier +såsom HTML, CSS og JavaScript. Dette betyder at computeren og det +operativsystem der kører på den, skal have support for læsning af +HTML-tekst m. CSS og JS der følger en HTML-standard, og systemet skal +kunne dekode og afspille lyd og video der er gemt i standardiserede +formater. Dette er alt. Man bør ikke stille flere krav. + +GNU/Linux understøtter alle disse nødvendige standarder. Det samme kan +ikke helt siges om MS Windows og Apple Mac, men det er muligt at få dem +til at understøtte de få nødvendige standarder relativt nemt (selv om +det er nemmere bare at skifte til GNU/Linux). + +Men hvilke lyd- og videostandarder? Jeg undersøgte den videofil der +fulgte med dette års eksamensoplæg, og jeg så at den brugte VP6 til +video og MP3 til lyd. Disse to codecs er begge patenterede, og VP6 er +tilmed proprietært. Dette betyder at folk ikke bare kan lave et nyt lyd- +eller videoformat uden først at undersøge om bare en lillebitte del af +deres format er en del af VP6, for hvis det er tilfældet, er der +retssager og pengekrav. Softwarepatenter kan stoppe nogle vakse +mennesker med at udvikle nye, revolutionerende computerprogrammer, +algoritmer og digitale multimedieformater. Indrømmet, dette er kun +direkte et problem i lande hvor softwarepatenter eksisterer, men i VP6's +tilfælde er det samtidig også svært at implementere en dekoder da en +fuld formatspecifikation med vilje ikke er gjort tilgængelig. Når folk +bliver ved med at bruge disse patenterede formater, kan virksomheder +føle sig tvunget til at bruge de samme formater, og de frie, bedre +formater bliver usynlige. Så selv om EU og Danmark heldigvis ikke har +softwarepatenter, bør vi stadig ikke bruger patenterede formater som VP6 +og MP3. Nogle hårdtarbejdene frivillige har sørget for at der er frie +dekodere tilgængelige for VP6 og MP3, så jeg kunne godt se videoen --- +det er bare ikke pointen. Formater man ikke kan kontrollere --- formater +der bliver kontrolleret af en privat organisation --- bør ikke bruges, +så digitalopfindere ikke begrænses af magtbaserede love. + +Alternativet er formater som Ogg Theora eller VP8 for video og Ogg +Vorbis, Ogg Speex eller FLAC for lyd. Funktionelt set er disse lige så +gode --- eller bedre --- som fx VP6 og MP3, og samtidig er de frie. WebM +er en ny "container" der består af VP8 for video og Vorbis for lyd. Den +er nem at bruge i webbrowsere, og selv YouTube er begyndt at understøtte +den. + +Hvis man brugte WebM men stadig ville gøre det muligt for computere uden +flere formater. Det har HTML5 fint support for. Og hvis ens browser ikke +understøtter HTML5 --- hvilket er helt ok --- kan man have en Java +fallback-player (ikke Flash). + +Og nu til beviset at cd'en var kopisikret: På en brændt cd er der rå +data. Denne rå data kan læses hvis man har en cd-læser. Den rå data er +den samme uafhængigt af operativsystem, for det samme bliver læst. Den +rå data kan dekodes som et filsystem hvor den rå data oversættes til +filer og mapper. Både Mac, Windows og GNU/Linux kan læse filsystemet på +cd'en, men på GNU/Linux læses ikke hele filsystemet. På GNU/Linux er det +let at læse den rå data, så jeg lavede en undersøgelse. Jeg kiggede den +rå data igennem for de filnavne GNU/Linux kunne dekode fra cd'en samt +det indhold der var i filerne. Cd'en burde bruge et simpelt +ISO9660-filsystem, så filnavnene og filindholdene burde bare være +direkte læselige, hvilket de også var. Derefter forsøgte jeg samme +søgemetode med nogle af de nye filer der var på den usb-stick jeg havde +fået udleveret: Jeg fandt intet indhold. Alt det jeg ikke fandt må altså +være krypteret på en eller anden Windows- og Mac-venlig måde. Der er +ingen grund til at kryptere det. + +Dette er de rodmapper og -filer (efter media/) som jeg har adgang til på +den krypterede cd: + +: error.html files/ index.html loading.html xit!.html + +Dette er de mapper og filer jeg har adgang til hvis jeg kunne dekryptere +cd'en (data fra usb-stick): + +: data/ files/ flashplayer/ images/ index.html js/ styles/ xit!.html + +Som eksempel på min filsystemssøgning kan vi tage filen 'index.html' som +var i den ukrypterede del af cd'en, og filen 'data/uvmXml.xml' som jeg +ikke kunne læse fra cd'en. + +Filen 'index.html' eksisterer: + +: $ grep -i index.htm engeks11cd.iso +: Binary file engeks11cd.iso matches + +Og indholdet eksisterer også ('' er unikt nok til kun at forekomme +i 'index.html'): + +: $ grep '' engeks11cd.iso +: Binary file engeks11cd.iso matches + +Vi ser at 'uvmXml.xml' faktisk også eksisterer: + +: $ grep -i uvmXml.xml engeks11cd.iso +: Binary file engeks11cd.iso matches + +Men hvad med dens indhold? Fra usb-sticken ved jeg at 'uvmXml.xml' har +mange ''-tags. Så: + +: $ grep -i '' engeks11cd.iso +: $ echo $? +: 1 + +Indholdet i 'uvmXml.xml' er altså ikke tilgængeligt uden dekryptering. + +Og så lige en anden teknisk ting: Jeg vil ikke blande mig så meget i +jeres måde at lave webinterfacet på, men er JavaScript virkelig +nødvendigt? Det føles som overkill at bruge jsQuery til at hente data +fra en XML-fil og så servere det som HTML. I oplægget fra skriftlig +engelsk 2010 var de forskellige ting pænt delt op i separate HTML-filer +uden voldsomt brug af scripting. Der er sikkert nogle få elever der har +slået JavaScript fra i deres browsere, så det er bedst at holde det +simpelt. + + + +Nå, bortset fra det var årets stilemne godt. + + +Relevante links: + ++ [[http://gnu.org/]] ++ [[http://fsf.org/]] ++ [[http://webmproject.org/]] ++ [[http://xiph.org/]] ++ [[http://theora.org/cortado/]] ++ [[http://w3.org/]] ++ [[http://w3.org/TR/html5/video.html]] + + +V.h. Niels Serup 3. E, HTX Hillerød (snart student)[fn:done] + + +[fn:done] Jeg blev student i juni. diff --git a/site/writings/tfr/index.org b/site/writings/tfr/index.org new file mode 100644 index 0000000..2f242ef --- /dev/null +++ b/site/writings/tfr/index.org @@ -0,0 +1,12 @@ +#+title: The Trasbexian Flow Regulator +#&summary +A story +#& +#+license: bysa + +* The Trasbexian Flow Regulator + +"The Trasbexian Flow Regulator" is a short story by Niels. It is available under CC +BY-SA 3.0+ as an A5-sized 12-paged pdf. + +<@html Download.
Front page
@> diff --git a/site/writings/tfr/p1.png b/site/writings/tfr/p1.png new file mode 100644 index 0000000..2a287bd Binary files /dev/null and b/site/writings/tfr/p1.png differ diff --git a/site/writings/tfr/tfr.pdf b/site/writings/tfr/tfr.pdf new file mode 100644 index 0000000..6b2701f Binary files /dev/null and b/site/writings/tfr/tfr.pdf differ