Much more text.

This commit is contained in:
Niels Serup 2011-08-01 22:39:41 +02:00
parent aae339084f
commit d1b8234f78
41 changed files with 1131 additions and 48 deletions

View File

@ -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()

Binary file not shown.

View File

@ -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';

View File

@ -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;
}

View File

@ -33,7 +33,7 @@ page.summary = run_macros(page.summary)
<meta name='DCTERMS.title' content='<!--@eval page.title@-->' />
<meta name='DCTERMS.description' content='<!--@eval page.summary@-->' />
<meta name='DCTERMS.creator' content='Niels Serup' />
<meta name='DCTERMS.format' content='application/xhtml+xml' />
<!-- <meta name='DCTERMS.format' content='application/xhtml+xml' />-->
<!--@exec
if page.created_rfc3339:
print(" <meta name='DCTERMS.created' content='{}' />".format(page.created_rfc3339))

View File

@ -1,11 +1,11 @@
wsgi nohi.wsgi
title metanohi
url http://metanohi.org/
url http://metanohi.name/
description 'This feed contains the newest pages on metanohi'
author Niels\ Serup
email ns@metanohi.org
aboutauthorurl http://metanohi.org/about/niels/
aboutauthorurl http://metanohi.name/about/niels/
feeditems 40
template template.html
@ -16,7 +16,8 @@ convert prestatic/template.html .
# Redirects (in site/)
redirect mege projects/mege/
redirect aboutme about/niels/
redirect aboutme about/niels
redirect about/img-licenses about/media-licenses
redirect 124 projects/wontofor/
redirect enigma projects/enigma
redirect simplechat projects/simplechat
@ -25,20 +26,22 @@ redirect {bito,bit} projects/bito
redirect {totxt,totext} projects/totxt/
redirect an[5s]w projects/an5w/
redirect projects/{bibbob,wikiaq} projects/
redirect {canvas,projects/canvas} http://projects.metanohi.org/canvas/
redirect {eonaton,projects/eonaton} http://projects.metanohi.org/eonaton/
redirect {evolution,projects/evolution} http://projects.metanohi.org/evolution/
redirect {snake,projects/snake} http://projects.metanohi.org/snake/
redirect {words,projects/words} http://projects.metanohi.org/words/
redirect {projects/{cln,cli},cln,cli} http://old.projects.metanohi.org/cln/
redirect {canvas,projects/canvas} http://projects.metanohi.name/canvas/
redirect {eonaton,projects/eonaton} http://projects.metanohi.name/eonaton/
redirect {evolution,projects/evolution} http://projects.metanohi.name/evolution/
redirect {snake,projects/snake} http://projects.metanohi.name/snake/
redirect {words,projects/words} http://projects.metanohi.name/words/
redirect {projects/{cln,cli},cln,cli} http://old.projects.metanohi.name/cln/
redirect writings/Na.html writings/na
redirect writings/digital-sikring.html writings/digital-sikring
redirect bsq http://old.projects.metanohi.org/bsq/
redirect gt3000 http://old.projects.metanohi.org/gt3000/
redirect {algo,algohol} http://old.projects.metanohi.org/algo/
redirect dsktp http://old.projects.metanohi.org/dsktp/
redirect jap http://old.projects.metanohi.org/jap/
redirect pedro http://old.projects.metanohi.org/pedro/
redirect snowman http://old.projects.metanohi.org/snowman/
redirect sq http://old.projects.metanohi.org/sq/
redirect webcli http://old.projects.metanohi.org/webcli/
redirect x http://old.projects.metanohi.org/x/
redirect bsq http://old.projects.metanohi.name/bsq/
redirect gt3000 http://old.projects.metanohi.name/gt3000/
redirect {algo,algohol} http://old.projects.metanohi.name/algo/
redirect dsktp http://old.projects.metanohi.name/dsktp/
redirect jap http://old.projects.metanohi.name/jap/
redirect pedro http://old.projects.metanohi.name/pedro/
redirect snowman http://old.projects.metanohi.name/snowman/
redirect sq http://old.projects.metanohi.name/sq/
redirect webcli http://old.projects.metanohi.name/webcli/
redirect x http://old.projects.metanohi.name/x/

8
scripts/commit.sh Executable file
View File

@ -0,0 +1,8 @@
#!/bin/sh
cd ~/www/meta/nohi
git commit -a
ssh webserverhost 'cd www/meta/nohi/scripts; ./hook_new.sh'

12
scripts/hook_new.sh Executable file
View File

@ -0,0 +1,12 @@
#!/bin/sh
cd ~/prog/mege
git pull
cd ~/www/meta/nohi
git pull
git feed
git restart

BIN
site/about/img/scr3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

View File

@ -1,5 +1,79 @@
#+title: About metanohi
#+summary: A short description of what metanohi is
#+license: bysa
#&toc
* About metanohi
This is metanohi.
Currently, metanohi resides on *metanohi.name*. Originally, it was on
*metanohi.org* which now redirects requests to .name. To contact [[./niels][Niels]] (the
creator), you should still use [[mailto:ns@metanohi.org][ns@metanohi.org]] instead of ns@metanohi.name&del.
metanohi is XHTML 1.1 and CSS 2 valid (probably).
** Copying
In general, text, images, and other media on metanohi is licensed under the
[[http://creativecommons.org/licenses/by-sa/3.0/][Creative Commons Attribution-Share Alike 3.0]] license, a *copyleft*
license. There may be cases with other licenses. The status of a page can be
seen in the bottom in a metadata box. If no license is specified in the box,
it's either because someone forgot to apply one to the page, or it's because
the page has almost no content (like the "Page not found" page) and does not
really require a license.
#+caption: Free content
#&img;url=/img/licenses/freecontent.png, float=right
Most of metanohi's content can be defined as free content, as defined by
[[http://freedomdefined.org/][freedomdefined.org]].
In all cases, you are free to redistribute content from metanohi, but please
don't set up a mirror for no reason (who would do that, anyway?).
External content is sometimes a different matter. [[./media-licenses][A list of licenses for media]]
is used for attributing in cases where it is impractical to attribute in-page.
If you take something from metanohi that is not under a public-domain-like
license, you are required to attribute Niels Serup and metanohi. When doing
that, write something like "Niels Serup, [[http://metanohi.name/][metanohi.name]]".
** Source
If you wish to use [[/projects/mege/][mege]] for a website, you may wish to use metanohi as a
template.
Get the main site:
: $ git clone git://metanohi.name/metanohi-metanohi
Get the subsites:
: $ git clone git://metanohi.name/metanohi-meta
** History
#+caption: This alien wonders why 'metanohi' was picked.
#&img;url=/img/aliens/makrh.png, float=right, width=100
metanohi was created in 2009 as a spinoff of earlier projects with equally
undefined purposes.
*** "Why the name?"
There are several reasons:
+ It's unique
+ It's simple
+ It has the meta prefix, which automatically transforms anything into
something cool
+ 'metanohi', or at least part of 'metanohi', has meanings in some languages
*** Screenshots of the old metanohi
Click to go to fullsize image.
#&img;url=img/scr1.png,width=300,float=left,noclear,medlink,caption=Start page
#&img;url=img/scr2.png,width=300,float=left,noclear,medlink,caption=Projects page
#&img;url=img/scr3.png,width=300,float=left,noclear,medlink,caption=CSS fun

View File

@ -0,0 +1,9 @@
#+title: Licenses of media
#+summary: A table of licenses of media not attributed in-page
* Licenses of media
| Path | License |
|------+---------|
| u | a |

104
site/about/niels.org Normal file
View File

@ -0,0 +1,104 @@
#+title: About Niels
#+summary: A short description of metanohi's creator
#+license: bysa
#&toc
* About Niels
Niels Serup is the creator of metanohi and [[/projects/mege/][mege]], metanohi's engine. He was born
in 1992 and lives in Denmark.
** Contact
Niels can be contacted at [[mailto:ns@metanohi.org][ns@metanohi.org]] (not ns@metanohi.name&del!).
** Software
*** Emacs
Emacs is a nice text editor. [[http://www.gnu.org/software/emacs/][Get it]].
Links: [[https://gitorious.org/nqpz-config/nqpz-config/blobs/raw/master/home/.emacs][my .emacs]] and [[https://gitorious.org/nqpz-config/nqpz-config/trees/master/home/.emacs.d][my .emacs.d]].
*** Conkeror
Conkeror is a nice webbrowser, somewhat similar in design to
Emacs. [[http://conkeror.org/][Get it]].
Links: [[https://gitorious.org/nqpz-config/nqpz-config/trees/master/home/.conkerorrc][My .conkerorrc]].
*** StumpWM
StumpWM is a nice tiling, Emacs-like window mananger. It has much fewer
features than e.g. XMonad (another tiling wm), and it's probably also less
stable, but it's simple and efficient. [[http://stumpwm.antidesktop.net/cgi-bin/wiki.pl][Get it]].
Links: [[https://gitorious.org/nqpz-config/nqpz-config/blobs/raw/master/home/.stumpwmrc][My .stumpwmrc]].
** Virtual existences
+ [[http://libreplanet.org/wiki/User:NqpZ][Libreplanet]]
+ [[http://identi.ca/nqpz][Identi.ca]]
+ [[http://en.wikipedia.org/wiki/User:NqpZ][Wikipedia]]
+ [[https://savannah.gnu.org/users/nqpz][GNU Savannah]]
+ [[https://gitorious.org/~nqpz][Gitorious]]
+ [[https://launchpad.net/~nqpz][Launchpad]]
+ [[http://uncyclopedia.wikia.com/wiki/User:Schabeindividuum][Uncyclopedia]] (don't take this one seriously)
Also, don't use Facebook (or Facebook-/like/ social notworks). Both your data
and your account is in Facebook's virtual hands. You have way too little
control. Use Identi.ca, GNU SOCIAL, Diaspora, or something else instead.
** Keys
*** SSH
#+BEGIN_SRC
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0JbXv5uILGhIWrY9695Djfx9ooQ/vBlhUxMe2yCqI645sWim8QvYNllc94jkKkOkNUGCurHlselXI+wribIKbbv2ZHr7exioZrlxwjVw9V9XeL+Rvewrbb1kBQFsuzsJVZzjfx3mggn+DOW0PN+qFfrjlh0jXGC0sYYQmYSBMCjemDhWv4WkbuH7fpqjY+wpoJpmtj1Ch+5rbxoTDdhNfk+WOtLQ9mAYYrAdBvajSzDuveoTQtTeJ66alT6ii+yyODuzsm46mlbLSfNKxy7a+1Do3ZYePiB6bhLf7+huC7OGjRZ3i+1zMHP5y3ypzQGKzcCU+5f+TpMfA+8A3Ep2qw== niels@gustace
#+END_SRC
*** PGP
#+BEGIN_SRC
pub 1024D/7C549146 2009-11-23
uid Niels Serup (nqpz) <ns@metanohi.org>
sub 2048g/AB324CAE 2009-11-23
#+END_SRC
#+BEGIN_SRC
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.10 (GNU/Linux)
mQGiBEsKkkYRBAC9bafUdK30MqoEyD+IByFwzXa6ndodErwT/WDpmMZ60JdOeT6t
IZPN1YpAepGYOOTy7/op/Qmjzztku0sYqkGeuOIlYlm950Zy1rOLoiJBB7UsC5at
AEnK7YTQqWG1dDhB61dFrLa9ClCMuLMJeWQdBr5xZSQppsX271h5LUbRqwCgg9pV
04IOe5NqRy3p+sf9qiqSzVUEAJWK6c2P6LZ58HNS1CpdJ9dCJdsOB34bXWxMe/Sa
+/gqpts7CGeAOPsqXMKfN30QyFJWwaFKsO3/Yfz4H8lXrNWGosAdccGry9WOAwO1
BudTTe+XOlJxUpG411IqNfgV4eo9hxg8T1VfXLeyp98bNu4TRddFjjAoBfUbFH7p
zz8BA/0UJOjuCnBKXTZl6Dou5843NlnDsL1Amc6V/jTPhY/IAcIk6euydAxLFHmq
07Dq71zIAzMvZGS3Nr+fBdXjG77s/0+a2eMHLHk2btPxVGQizBCQR+vBHEYTgYBD
NyTzKLL+o/sNfZFJ8Fm8G8CkSqrzRudrH3gkMzzzV1ewAe7eGLQkTmllbHMgU2Vy
dXAgKG5xcHopIDxuc0BtZXRhbm9oaS5vcmc+iGAEExECACAFAksKkkYCGwMGCwkI
BwMCBBUCCAMEFgIDAQIeAQIXgAAKCRCkZUvkfFSRRrQHAJ48avZXiKwoExTPTXlF
x/cyMKg4nwCeJ+a8di2nn9danWX5lW1c2fLGtfS5Ag0ESwqSShAIAM1uFusUmUjt
jyAOAOamGh/aT71Z6iYoa4ARcd+az/V4vJvpJKYrIWi4MCQTG9NzttTHAFx2LuBD
EyWRa/yD/qU18VSYFxYGcGjAfgNZzQar3RQNerQYpnkPAPezWdmO9cfCWZYUmo/G
KMvw9hNEgM4/ZogmDsdH/IsBoLMBRsyMrI8XJeD28wlpDlivdjPidiMCuCyI0QGA
Hsf+iaqpiEQqd2+pIBtqAQUV0MEETG9RpqCBlxlAwMd6G7OA7AIhtY62UKQ4ILxl
2KYTvu7uPs3aMFrp5FB9EPZg3LslbwWsFEdVS8YJJEObxwDxhLU8udTcQOh9V+nl
QKDX4h+KL6sAAwYH/0d/QShpxjsf9klBS9wG1SMC8lHz5GRd3l2fwOeDBPi9fJhF
V5AgdOILTl4QAvExwB6Yt1X/wLCvpBpEE3J7M10ZLI0X4eS0eMBUV8VSbN4yuybG
uv3m14FFVofhZNmA5U7rBbTjPim1xJLM9RCU43OeWqdxptYi/2BkMnfQEARKFiQD
aNiHpydBMmISJMw0USKpi9KQ5eg2SiDcivAn3rZoNnXT95vEcQOQoG7lczEJMmVR
NlKFHReFdWGnH6WvoVZEawZShrBUiAWMBq0pVfaWEr6VKhe1jU/DXqpDuf2uNDES
5SBE9jA4kSza/URnDtGv3S8vyUmkUBjduLXDWbCISQQYEQIACQUCSwqSSgIbDAAK
CRCkZUvkfFSRRmxtAJ9KlB8jS7eH+XavoTROA5mFMroo5wCcDJe2AxEbCJEqyl8g
YFvSXaEGu8s=
=ASfw
-----END PGP PUBLIC KEY BLOCK-----
#+END_SRC

View File

@ -1,6 +0,0 @@
#+title: About Niels
* About Niels
Niels Serup is the creator of metanohi and mege.

BIN
site/img/licenses/agpl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
site/img/licenses/cc0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="300" height="400" id="svg1513" sodipodi:version="0.32" inkscape:version="0.44" version="1.0" sodipodi:docbase="/home/moeller/Desktop" sodipodi:docname="freecontent-logo_mfalzon.svg">
<defs id="defs1515">
<linearGradient id="linearGradient25099">
<stop style="stop-color: rgb(101, 47, 153); stop-opacity: 1;" offset="0" id="stop25101"/>
<stop style="stop-color: rgb(80, 38, 121); stop-opacity: 0.651786;" offset="1" id="stop25103"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient25099" id="linearGradient25105" x1="126" y1="155" x2="57.340927" y2="115.35966" gradientUnits="userSpaceOnUse"/>
<linearGradient id="linearGradient21541">
<stop style="stop-color: rgb(38, 60, 206); stop-opacity: 1;" offset="0" id="stop21543"/>
<stop style="stop-color: rgb(38, 60, 206); stop-opacity: 0;" offset="1" id="stop21545"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient21541" id="linearGradient21547" x1="89" y1="155" x2="163" y2="155" gradientUnits="userSpaceOnUse"/>
<linearGradient id="linearGradient20648">
<stop style="stop-color: rgb(0, 160, 0); stop-opacity: 0.258929;" offset="0" id="stop20650"/>
<stop style="stop-color: green; stop-opacity: 1;" offset="1" id="stop20652"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient20648" id="linearGradient20654" x1="91.149223" y1="189.85078" x2="126" y2="155" gradientUnits="userSpaceOnUse"/>
<linearGradient inkscape:collect="always" id="linearGradient23319">
<stop style="stop-color: white; stop-opacity: 1;" offset="0" id="stop23321"/>
<stop style="stop-color: white; stop-opacity: 0;" offset="1" id="stop23323"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient23319" id="linearGradient23325" x1="149.80643" y1="178.80643" x2="92.016411" y2="121.01641" gradientUnits="userSpaceOnUse"/>
<linearGradient id="linearGradient18870">
<stop style="stop-color: rgb(255, 241, 141); stop-opacity: 1;" offset="0" id="stop18872"/>
<stop style="stop-color: rgb(255, 205, 1); stop-opacity: 1;" offset="1" id="stop18874"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient18870" id="linearGradient18876" x1="157.68582" y1="186.68582" x2="126" y2="155" gradientUnits="userSpaceOnUse"/>
<linearGradient id="linearGradient17969">
<stop style="stop-color: rgb(255, 183, 61); stop-opacity: 1;" offset="0" id="stop17971"/>
<stop style="stop-color: rgb(255, 160, 0); stop-opacity: 1;" offset="1" id="stop17973"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient17969" id="linearGradient17975" x1="89.626488" y1="191.40311" x2="126.02959" y2="155" gradientUnits="userSpaceOnUse"/>
<linearGradient id="linearGradient15296">
<stop style="stop-color: rgb(255, 89, 89); stop-opacity: 1;" offset="0" id="stop15298"/>
<stop style="stop-color: rgb(223, 0, 0); stop-opacity: 1;" offset="1" id="stop15300"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient15296" id="linearGradient15304" x1="89" y1="118" x2="126" y2="155" gradientUnits="userSpaceOnUse"/>
</defs>
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1" inkscape:cx="376.86644" inkscape:cy="68.720482" inkscape:document-units="px" inkscape:current-layer="layer1" inkscape:window-width="1272" inkscape:window-height="970" inkscape:window-x="0" inkscape:window-y="0"/>
<metadata id="metadata1518">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
</cc:Work>
</rdf:RDF>
</metadata>
<g inkscape:label="Calque 1" inkscape:groupmode="layer" id="layer1">
<g id="g25107" inkscape:export-xdpi="90" inkscape:export-ydpi="90" transform="translate(-105.5, -82.7755)" inkscape:export-filename="C:\Documents and Settings\INFA715\Bureau\mfalzon-freecontent_logo01--favicon.png">
<path inkscape:transform-center-y="123.63642" inkscape:transform-center-x="-39.999955" transform="matrix(2.91892, 0, 0, 2.91892, -112.284, -220.932)" sodipodi:end="4.712389" sodipodi:start="0" d="M 163,155 A 37,37 0 1 1 126,118 L 126,155 z" sodipodi:ry="37" sodipodi:rx="37" sodipodi:cy="155" sodipodi:cx="126" id="path11693" style="opacity: 1; fill: url(#linearGradient15304) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" sodipodi:type="arc"/>
<path inkscape:transform-center-y="34.28568" inkscape:transform-center-x="105.97409" transform="matrix(0, 2.50193, -2.50193, 0, 643.299, -83.7431)" sodipodi:end="4.712389" sodipodi:start="0" d="M 163,155 A 37,37 0 1 1 126,118 L 126,155 z" sodipodi:ry="37" sodipodi:rx="37" sodipodi:cy="155" sodipodi:cx="126" id="path10806" style="opacity: 1; fill: url(#linearGradient17975) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" sodipodi:type="arc"/>
<path transform="matrix(-2.08494, 0, 0, -2.08494, 518.203, 554.666)" sodipodi:end="4.712389" sodipodi:start="0" d="M 163,155 A 37,37 0 1 1 126,118 L 126,155 z" sodipodi:ry="37" sodipodi:rx="37" sodipodi:cy="155" sodipodi:cx="126" id="path8149" style="opacity: 1; fill: url(#linearGradient18876) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" sodipodi:type="arc"/>
<path transform="matrix(0, -1.66795, 1.66795, 0, -3.03274, 441.663)" sodipodi:end="4.712389" sodipodi:start="0" d="M 163,155 A 37,37 0 1 1 126,118 L 126,155 z" sodipodi:ry="37" sodipodi:rx="37" sodipodi:cy="155" sodipodi:cx="126" id="path13467" style="opacity: 1; fill: url(#linearGradient23325) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" sodipodi:type="arc"/>
<path transform="matrix(1.25096, 0, 0, 1.25096, 97.8786, 37.6005)" sodipodi:end="4.712389" sodipodi:start="0" d="M 163,155 A 37,37 0 1 1 126,118 L 126,155 z" sodipodi:ry="37" sodipodi:rx="37" sodipodi:cy="155" sodipodi:cx="126" id="path6377" style="opacity: 1; fill: url(#linearGradient20654) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" sodipodi:type="arc"/>
<path transform="matrix(0, 0.833976, -0.833976, 0, 384.767, 127.036)" sodipodi:end="4.712389" sodipodi:start="0" d="M 163,155 A 37,37 0 1 1 126,118 L 126,155 z" sodipodi:ry="37" sodipodi:rx="37" sodipodi:cy="155" sodipodi:cx="126" id="path3654" style="opacity: 1; fill: url(#linearGradient21547) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" sodipodi:type="arc"/>
<path transform="matrix(-0.416988, 0, 0, -0.416988, 308.041, 296.134)" d="M 163 155 A 37 37 0 1 1 89,155 A 37 37 0 1 1 163 155 z" sodipodi:ry="37" sodipodi:rx="37" sodipodi:cy="155" sodipodi:cx="126" id="path3660" style="opacity: 1; fill: url(#linearGradient25105) rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" sodipodi:type="arc"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

BIN
site/img/licenses/gpl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
site/img/licenses/lgpl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -147,7 +147,7 @@ Quote without citing: =a^2+b^2=c^2&quote=.
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

View File

@ -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

View File

@ -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)

View File

@ -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>strong text</strong>@>. Smiley: '_~
41. 2+2=4
#+END_SRC
And more.

View File

@ -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]]
<strong>{Escaped}&strong!</strong>
#&
#++pre
#+BEGIN_SRC
*Preformatted* but still [[http://en.wikipedia.org/wiki/Monospace][monospace]]
<em>{Escaped}&emph!</em>
#+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: =<p>abc</p>=&html.
** HTML
#+BEGIN_SRC html
<div style='margin-left: 20px' id='tempobj'>au</div>
#+END_SRC
The above code equals:
#++show
#+BEGIN_SRC html
<div style='margin-left: 20px' id='tempobj'>au</div>
#+END_SRC
Inline HTML: <@html <strong>strong text</strong>@>.
** 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:
#&paragraph
#++eval
#+BEGIN_SRC python
2 + 3
#+END_SRC
#&paragraph
#++dexec
#+BEGIN_SRC python
print('<em>Date</em>:', datetime.datetime.utcnow())
#+END_SRC

View File

@ -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.

View File

@ -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

View File

@ -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 |

Binary file not shown.

Binary file not shown.

View File

@ -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)

Binary file not shown.

View File

@ -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.

View File

@ -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.

View File

@ -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)

View File

@ -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

View File

@ -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å ('<body
onload="UVM.view.funcFitToScreen()">' er unikt nok til kun at forekomme
i 'index.html'):
: $ grep '<body onload="UVM.view.funcFitToScreen()">' 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 '<CONTENT>'-tags. Så:
: $ grep -i '<CONTENT>' 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.

View File

@ -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 <a href='tfr.pdf'>Download.<br /><img src='p1.png' alt='Front page' /></a>@>

BIN
site/writings/tfr/p1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
site/writings/tfr/tfr.pdf Normal file

Binary file not shown.