Much more text.
|
@ -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()
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
41
rules.mege
|
@ -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/
|
||||
|
|
|
@ -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
|
||||
#+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
|
||||
|
||||
|
|
|
@ -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=.
|
||||
|
||||
Quote and cite: ={metanohi exists}&cite=http://metanohi.org/=.
|
||||
Quote and cite: ={metanohi exists}&cite=http://metanohi.name/=.
|
||||
|
||||
HTML equivalent:
|
||||
#+BEGIN_SRC html
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
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.
|
||||
|
|
|
@ -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:
|
||||
|
||||
#¶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]]
|
||||
+ [[code][Code]]
|
||||
+ [[video][Video]]
|
||||
+ [[audio][Audio]]
|
||||
|
||||
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,
|
||||
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
|
||||
|
||||
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 |
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
#+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)
|
||||
|
|
|
@ -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 |