Much more text.
|
@ -15,14 +15,17 @@ def download_prog(root, fname):
|
||||||
|
|
||||||
def list_pages(pathdir):
|
def list_pages(pathdir):
|
||||||
dl = htmlfunc.DefList()
|
dl = htmlfunc.DefList()
|
||||||
fs = [(os.path.join(pathdir, f), f) for f in filter(
|
fs = [(p if os.path.isfile(p) else os.path.join(
|
||||||
lambda f: f.endswith('.org') and f != 'index.org',
|
p, 'index.org'), f, f[:-4] if os.path.isfile(p) else f + '/') for p, f in filter(
|
||||||
os.listdir(pathdir))]
|
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
|
fs.sort(key=lambda pf: git.rr.get_last_modified_date(pf[0])[0] or
|
||||||
misc.utcwhenmodified(pf[0]))
|
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)
|
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.')
|
else None) #'No summary.')
|
||||||
return dl.generate_html()
|
return dl.generate_html()
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ set_min_height = function() {
|
||||||
wh = ws[0];
|
wh = ws[0];
|
||||||
ww = ws[1];
|
ww = ws[1];
|
||||||
|
|
||||||
h = metadiv.offsetHeight + 15;
|
h = metadiv.offsetHeight + 25;
|
||||||
metadiv.style.position = 'absolute';
|
metadiv.style.position = 'absolute';
|
||||||
metadiv.style.bottom = '5px';
|
metadiv.style.bottom = '5px';
|
||||||
metadiv.style.width = (contentdiv.offsetWidth - 42) + 'px';
|
metadiv.style.width = (contentdiv.offsetWidth - 42) + 'px';
|
||||||
|
|
|
@ -187,6 +187,7 @@ h1:first-child {
|
||||||
h2 {
|
h2 {
|
||||||
margin: 14px 0 5px 0 ;
|
margin: 14px 0 5px 0 ;
|
||||||
font-size: 25px;
|
font-size: 25px;
|
||||||
|
background-color: #ddd;
|
||||||
}
|
}
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
|
@ -217,12 +218,16 @@ h6 {
|
||||||
|
|
||||||
p {
|
p {
|
||||||
text-align: justify;
|
text-align: justify;
|
||||||
margin-bottom: 10px;
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p:first-child {
|
||||||
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.caption {
|
div.caption {
|
||||||
clear: both;
|
clear: both;
|
||||||
margin: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
caption, div.caption > p {
|
caption, div.caption > p {
|
||||||
|
@ -236,6 +241,10 @@ div.caption.center-float img {
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.caption.left-float img {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
div.caption.center-float {
|
div.caption.center-float {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
@ -248,9 +257,16 @@ tt, code, samp, pre, var {
|
||||||
font-family: Inconsolata, 'Dejavu Sans Mono', monospace;
|
font-family: Inconsolata, 'Dejavu Sans Mono', monospace;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
margin-top: 10px;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
word-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
img {
|
img {
|
||||||
border: none;
|
border: none;
|
||||||
clear: both;
|
clear: both;
|
||||||
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
cite, quote {
|
cite, quote {
|
||||||
|
@ -367,6 +383,24 @@ td, th {
|
||||||
padding: 1px 3px;
|
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 */
|
/* Formatting-related classes */
|
||||||
|
|
||||||
|
@ -395,7 +429,8 @@ td, th {
|
||||||
}
|
}
|
||||||
|
|
||||||
.center-float {
|
.center-float {
|
||||||
margin: 0 auto;
|
margin-right: auto;
|
||||||
|
margin-left: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.right-float {
|
.right-float {
|
||||||
|
@ -406,6 +441,14 @@ td, th {
|
||||||
float: left;
|
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 {
|
.block {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
@ -414,6 +457,10 @@ td, th {
|
||||||
display: inline;
|
display: inline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.noclear, div.caption.noclear {
|
||||||
|
clear: none; ! important
|
||||||
|
}
|
||||||
|
|
||||||
.huge, .huge * {
|
.huge, .huge * {
|
||||||
font-size: 25px; ! important
|
font-size: 25px; ! important
|
||||||
}
|
}
|
||||||
|
@ -423,15 +470,15 @@ td, th {
|
||||||
}
|
}
|
||||||
|
|
||||||
.medium, .medium * {
|
.medium, .medium * {
|
||||||
font-size: 12px; ! important
|
font-size: 14px; ! important
|
||||||
}
|
}
|
||||||
|
|
||||||
.small, .small * {
|
.small, .small * {
|
||||||
font-size: 10px; ! important
|
font-size: 11px; ! important
|
||||||
}
|
}
|
||||||
|
|
||||||
.tiny, .tiny * {
|
.tiny, .tiny * {
|
||||||
font-size: 8px; ! important
|
font-size: 9px; ! important
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -442,17 +489,27 @@ td, th {
|
||||||
}
|
}
|
||||||
|
|
||||||
.highlighttable {
|
.highlighttable {
|
||||||
margin-bottom: 10px;
|
margin: 5px 0 5px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlighttable pre {
|
||||||
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.highlighttable, .highlighttable .code {
|
.highlighttable, .highlighttable .code {
|
||||||
border-width: 0;
|
border-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.highlighttable .code {
|
||||||
|
width: 600px;
|
||||||
|
}
|
||||||
|
|
||||||
.linenos {
|
.linenos {
|
||||||
border-width: 0 1px 0 0;
|
border-width: 0 1px 0 0;
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
border-size: black;
|
border-size: black;
|
||||||
|
vertical-align: top;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -465,3 +522,14 @@ td, th {
|
||||||
border: 1px outset black;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ page.summary = run_macros(page.summary)
|
||||||
<meta name='DCTERMS.title' content='<!--@eval page.title@-->' />
|
<meta name='DCTERMS.title' content='<!--@eval page.title@-->' />
|
||||||
<meta name='DCTERMS.description' content='<!--@eval page.summary@-->' />
|
<meta name='DCTERMS.description' content='<!--@eval page.summary@-->' />
|
||||||
<meta name='DCTERMS.creator' content='Niels Serup' />
|
<meta name='DCTERMS.creator' content='Niels Serup' />
|
||||||
<meta name='DCTERMS.format' content='application/xhtml+xml' />
|
<!-- <meta name='DCTERMS.format' content='application/xhtml+xml' />-->
|
||||||
<!--@exec
|
<!--@exec
|
||||||
if page.created_rfc3339:
|
if page.created_rfc3339:
|
||||||
print(" <meta name='DCTERMS.created' content='{}' />".format(page.created_rfc3339))
|
print(" <meta name='DCTERMS.created' content='{}' />".format(page.created_rfc3339))
|
||||||
|
|
41
rules.mege
|
@ -1,11 +1,11 @@
|
||||||
wsgi nohi.wsgi
|
wsgi nohi.wsgi
|
||||||
|
|
||||||
title metanohi
|
title metanohi
|
||||||
url http://metanohi.org/
|
url http://metanohi.name/
|
||||||
description 'This feed contains the newest pages on metanohi'
|
description 'This feed contains the newest pages on metanohi'
|
||||||
author Niels\ Serup
|
author Niels\ Serup
|
||||||
email ns@metanohi.org
|
email ns@metanohi.org
|
||||||
aboutauthorurl http://metanohi.org/about/niels/
|
aboutauthorurl http://metanohi.name/about/niels/
|
||||||
feeditems 40
|
feeditems 40
|
||||||
|
|
||||||
template template.html
|
template template.html
|
||||||
|
@ -16,7 +16,8 @@ convert prestatic/template.html .
|
||||||
|
|
||||||
# Redirects (in site/)
|
# Redirects (in site/)
|
||||||
redirect mege projects/mege/
|
redirect mege projects/mege/
|
||||||
redirect aboutme about/niels/
|
redirect aboutme about/niels
|
||||||
|
redirect about/img-licenses about/media-licenses
|
||||||
redirect 124 projects/wontofor/
|
redirect 124 projects/wontofor/
|
||||||
redirect enigma projects/enigma
|
redirect enigma projects/enigma
|
||||||
redirect simplechat projects/simplechat
|
redirect simplechat projects/simplechat
|
||||||
|
@ -25,20 +26,22 @@ redirect {bito,bit} projects/bito
|
||||||
redirect {totxt,totext} projects/totxt/
|
redirect {totxt,totext} projects/totxt/
|
||||||
redirect an[5s]w projects/an5w/
|
redirect an[5s]w projects/an5w/
|
||||||
redirect projects/{bibbob,wikiaq} projects/
|
redirect projects/{bibbob,wikiaq} projects/
|
||||||
redirect {canvas,projects/canvas} http://projects.metanohi.org/canvas/
|
redirect {canvas,projects/canvas} http://projects.metanohi.name/canvas/
|
||||||
redirect {eonaton,projects/eonaton} http://projects.metanohi.org/eonaton/
|
redirect {eonaton,projects/eonaton} http://projects.metanohi.name/eonaton/
|
||||||
redirect {evolution,projects/evolution} http://projects.metanohi.org/evolution/
|
redirect {evolution,projects/evolution} http://projects.metanohi.name/evolution/
|
||||||
redirect {snake,projects/snake} http://projects.metanohi.org/snake/
|
redirect {snake,projects/snake} http://projects.metanohi.name/snake/
|
||||||
redirect {words,projects/words} http://projects.metanohi.org/words/
|
redirect {words,projects/words} http://projects.metanohi.name/words/
|
||||||
redirect {projects/{cln,cli},cln,cli} http://old.projects.metanohi.org/cln/
|
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 bsq http://old.projects.metanohi.name/bsq/
|
||||||
redirect gt3000 http://old.projects.metanohi.org/gt3000/
|
redirect gt3000 http://old.projects.metanohi.name/gt3000/
|
||||||
redirect {algo,algohol} http://old.projects.metanohi.org/algo/
|
redirect {algo,algohol} http://old.projects.metanohi.name/algo/
|
||||||
redirect dsktp http://old.projects.metanohi.org/dsktp/
|
redirect dsktp http://old.projects.metanohi.name/dsktp/
|
||||||
redirect jap http://old.projects.metanohi.org/jap/
|
redirect jap http://old.projects.metanohi.name/jap/
|
||||||
redirect pedro http://old.projects.metanohi.org/pedro/
|
redirect pedro http://old.projects.metanohi.name/pedro/
|
||||||
redirect snowman http://old.projects.metanohi.org/snowman/
|
redirect snowman http://old.projects.metanohi.name/snowman/
|
||||||
redirect sq http://old.projects.metanohi.org/sq/
|
redirect sq http://old.projects.metanohi.name/sq/
|
||||||
redirect webcli http://old.projects.metanohi.org/webcli/
|
redirect webcli http://old.projects.metanohi.name/webcli/
|
||||||
redirect x http://old.projects.metanohi.org/x/
|
redirect x http://old.projects.metanohi.name/x/
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
cd ~/www/meta/nohi
|
||||||
|
|
||||||
|
git commit -a
|
||||||
|
|
||||||
|
ssh webserverhost 'cd www/meta/nohi/scripts; ./hook_new.sh'
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
cd ~/prog/mege
|
||||||
|
|
||||||
|
git pull
|
||||||
|
|
||||||
|
|
||||||
|
cd ~/www/meta/nohi
|
||||||
|
|
||||||
|
git pull
|
||||||
|
git feed
|
||||||
|
git restart
|
After Width: | Height: | Size: 335 KiB |
|
@ -1,5 +1,79 @@
|
||||||
#+title: About metanohi
|
#+title: About metanohi
|
||||||
|
#+summary: A short description of what metanohi is
|
||||||
|
#+license: bysa
|
||||||
|
#&toc
|
||||||
|
|
||||||
* About metanohi
|
* 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
|
||||||
|
|
||||||
|
|
|
@ -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 |
|
||||||
|
|
|
@ -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
|
|
@ -1,6 +0,0 @@
|
||||||
#+title: About Niels
|
|
||||||
|
|
||||||
* About Niels
|
|
||||||
|
|
||||||
Niels Serup is the creator of metanohi and mege.
|
|
||||||
|
|
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 4.8 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 9.7 KiB |
|
@ -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 |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 3.3 KiB |
|
@ -147,7 +147,7 @@ Quote without citing: =a^2+b^2=c^2"e=.
|
||||||
|
|
||||||
Cite without quoting: =http://en.wikipedia.org/&cite=.
|
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:
|
HTML equivalent:
|
||||||
#+BEGIN_SRC html
|
#+BEGIN_SRC html
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
#+title: mege
|
#+title: mege
|
||||||
#&summary
|
#&summary
|
||||||
mege the metanohi generator
|
mege is the generator used by metanohi
|
||||||
#&
|
#&
|
||||||
#+license: bysa
|
#+license: bysa
|
||||||
|
|
||||||
* mege the metanohi generator
|
* mege
|
||||||
|
|
||||||
+ [[./tests/][Tests]]
|
+ [[./tests/][Tests]]
|
||||||
+ [[./docs/][Documentation]]
|
+ [[./docs/][Documentation]]
|
||||||
|
@ -12,3 +12,9 @@ mege the metanohi generator
|
||||||
Both are works in progress, like mege. Note that the author of mege does
|
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,
|
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.
|
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
|
||||||
|
|
|
@ -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)
|
|
@ -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
|
underlined. _/*The effects*/ can /be/ combined_. Press -C-n- to scroll down if
|
||||||
your web browser is Conkeror (-Ctrl+N- in non-emacs speak).
|
your web browser is Conkeror (-Ctrl+N- in non-emacs speak).
|
||||||
|
|
||||||
Type this: =$ echo echo=.
|
Type this: =$ echo echo=
|
||||||
|
|
||||||
** Extended inline formatting
|
** 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:
|
More&strong strong text&samp. And even acronyms and abbreviations:
|
||||||
GNU&acro="GNU's not UNIX" and MF&abbr="Medlem af Folketinget". {Other
|
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
|
colors}&color=red and {other sizes}&small as well, {and {also
|
||||||
combinations}&large.
|
(really)}&color=green combinations}&large.
|
||||||
|
|
||||||
Now subtract y&var from x&var - 2^{32}. And a definition: {An integer above 0
|
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
|
** Lists
|
||||||
|
@ -158,6 +158,16 @@ introduction by the Master of Falsefulness
|
||||||
|
|
||||||
x_{tallyho} = 33^{12}, escaped: x_\{tallyho} = 33^\{12}
|
x_{tallyho} = 33^{12}, escaped: x_\{tallyho} = 33^\{12}
|
||||||
|
|
||||||
|
** Math
|
||||||
|
|
||||||
|
Inline: $2\neq3$, block:
|
||||||
|
|
||||||
|
#&math
|
||||||
|
\begin{align*}
|
||||||
|
\frac{dy}{dx} = 2x
|
||||||
|
\end{align*}
|
||||||
|
#&
|
||||||
|
|
||||||
** Code
|
** Code
|
||||||
|
|
||||||
: ver *ba* tim
|
: ver *ba* tim
|
||||||
|
@ -195,3 +205,4 @@ Inline HTML: <@html <strong>strong text</strong>@>. Smiley: '_~
|
||||||
41. 2+2=4
|
41. 2+2=4
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
|
And more.
|
||||||
|
|
|
@ -9,3 +9,106 @@ Code in mege
|
||||||
While the <@eval macros.titlelink('basics')@> does include code,
|
While the <@eval macros.titlelink('basics')@> does include code,
|
||||||
this test contains more. And all of it's different.
|
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:
|
||||||
|
|
||||||
|
#¶graph
|
||||||
|
#++eval
|
||||||
|
#+BEGIN_SRC python
|
||||||
|
2 + 3
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#¶graph
|
||||||
|
#++dexec
|
||||||
|
#+BEGIN_SRC python
|
||||||
|
print('<em>Date</em>:', datetime.datetime.utcnow())
|
||||||
|
#+END_SRC
|
||||||
|
|
|
@ -16,6 +16,7 @@ have been created:
|
||||||
+ [[math][Math]]
|
+ [[math][Math]]
|
||||||
+ [[code][Code]]
|
+ [[code][Code]]
|
||||||
+ [[video][Video]]
|
+ [[video][Video]]
|
||||||
|
+ [[audio][Audio]]
|
||||||
|
|
||||||
Perhaps /mege/ will grow and come near to perfection one day.
|
Perhaps /mege/ will grow and come near to perfection one day.
|
||||||
|
|
||||||
|
|
|
@ -9,3 +9,31 @@ Math in mege
|
||||||
While the <@eval macros.titlelink('basics', page.pathdir)@> does include math,
|
While the <@eval macros.titlelink('basics', page.pathdir)@> does include math,
|
||||||
this test contains more. And all of it's different.
|
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
|
||||||
|
|
|
@ -6,9 +6,66 @@ Tables in mege
|
||||||
|
|
||||||
* Test of mege tables
|
* 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.
|
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 |
|
||||||
|
|
|
@ -4,3 +4,6 @@
|
||||||
|
|
||||||
* Test of mege video
|
* Test of mege video
|
||||||
|
|
||||||
|
#&video;url=test1.ogv,width=640,height=480,autoplay
|
||||||
|
|
||||||
|
([[http://films.metanohi.name/compufight][Compufight]], CC BY-SA)
|
||||||
|
|
|
@ -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.
|
|
@ -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.
|
|
@ -1,5 +1,11 @@
|
||||||
#+title: Writings
|
#+title: Writings
|
||||||
|
#+summary: A list of my writings
|
||||||
|
#+license: bysa
|
||||||
|
|
||||||
* Writings
|
* Writings
|
||||||
|
|
||||||
<@eval macros.list_pages(page.pathdir)@>
|
<@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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
|
@ -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>@>
|
After Width: | Height: | Size: 11 KiB |