move pages/ -> sites/www.qmsk.net/pages/ sites
authorTero Marttila <terom@fixme.fi>
Sat, 07 Feb 2009 17:14:01 +0200
branchsites
changeset 35 79ea0e2a6cc2
parent 34 09196d5b2a39
child 36 02d4040d5946
move pages/ -> sites/www.qmsk.net/pages/
lib/map.py
pages/about.html
pages/debug.tmpl
pages/index.tmpl
pages/list
pages/projects/evsql.html
pages/projects/foo.html
pages/projects/index.html
pages/projects/kg.html
pages/projects/nr-ttd.html
pages/projects/qmsk.net.html
sites/irclogs.qmsk.net/urls.py
sites/www.qmsk.net/__init__.py
sites/www.qmsk.net/lookup.py
sites/www.qmsk.net/map.py
sites/www.qmsk.net/pages/about.html
sites/www.qmsk.net/pages/debug.tmpl
sites/www.qmsk.net/pages/index.tmpl
sites/www.qmsk.net/pages/list
sites/www.qmsk.net/pages/projects/evsql.html
sites/www.qmsk.net/pages/projects/foo.html
sites/www.qmsk.net/pages/projects/index.html
sites/www.qmsk.net/pages/projects/kg.html
sites/www.qmsk.net/pages/projects/nr-ttd.html
sites/www.qmsk.net/pages/projects/qmsk.net.html
--- a/lib/map.py	Sat Feb 07 17:10:06 2009 +0200
+++ b/lib/map.py	Sat Feb 07 17:14:01 2009 +0200
@@ -5,13 +5,13 @@
 import http
 import handler
 
-class MappingError (http.ResponseError) :
+class MapperError (http.ResponseError) :
     """
         URL could not be mapped
     """
 
     def __init__ (self, url) :
-        super(MappingError, self).__init__("URL not found: %s" % (url, ), status='404 Not Found')
+        super(MapperError, self).__init__("URL not found: %s" % (url, ), status='404 Not Found')
 
 class Mapper (handler.RequestHandler) :
     """
@@ -59,7 +59,7 @@
     def test (self, request) :
         xxx
 
-class StaticMapping (Mapper) :
+class StaticMapper (Mapper) :
     """
         Translates requests to handlers using a list of pre-determined Mapping's
     """
@@ -85,7 +85,7 @@
         
         if not handler :
             # fail, not found
-            raise MappingError(request.get_page_name())
+            raise MapperError(request.get_page_name())
         
         # passthrough
         return handler.handle_request(request)
--- a/pages/about.html	Sat Feb 07 17:10:06 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-<h1>About me</h1>
-
-<p>
-    My name is Tero Marttila. I'm a student at <a href="http://www.tkk.fi/">Helsinki University of Techonology</a>, living in Otaniemi.
-</p>
-
-<h1>Contact</h1>
-
-<p>
-    I am best reached via IRC, under the nickname of <em>SpComb</em> on any of IRCNet, freenode, OFTC.
-</p>
-
-<p>
-    Alternatively, I'm also reached via email: <em>terom@fixme.fi</em>
-</p>
--- a/pages/debug.tmpl	Sat Feb 07 17:10:06 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-
-<pre>
-${page_tree.dump() | h}
-</pre>
-
-<dl>
-    <lh>List of request env variables</lh>
-
-% for key, val in request.env.iteritems() :
-    <dt>${key}</dt> <dd>${val}</dd>
-% endfor
-</dl>
--- a/pages/index.tmpl	Sat Feb 07 17:10:06 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-<h1></h1>
-
-<div style="font-size: small">
-    <h2>What's <q>qmsk</q>?</h2>
-
-    <p>
-        I'm not sure, but it doesn't have any vowels.
-    </p>
-</div>    
--- a/pages/list	Sat Feb 07 17:10:06 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-
-            : Index
-projects        : Projects
-    qmsk.net        : qmsk.net
-    evsql           : evsql
-    nr-ttd          : Nr-TTD
-    kg              : Kišna Glista
-about           : About
-
--- a/pages/projects/evsql.html	Sat Feb 07 17:10:06 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-<h1>evsql</h1>
-    <p>Evsql is a C-language SQL library designed for use with libevent, and primarily PostgreSQL's libpq.</p>
-
-    <p>For more information, read the <a href="http://qmsk.net/static/evsql-doxygen/">Doxygen documentation</a>, or look at the <a href="http://hg.qmsk.net/evfuse.hg/file/tip/src/">Mercurial repo</a> (currently part of evfuse).</p>
-
--- a/pages/projects/foo.html	Sat Feb 07 17:10:06 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-The foo project
--- a/pages/projects/index.html	Sat Feb 07 17:10:06 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-<h1>Projects</h1>
-
-    <p>I've worked on a variety of projects over the years, leaving them in various stages of completion.</p>
-
-    <p>Some of the perhaps more noteworthy ones have their own project pages here (see menu to the left).</p>
-
-    <h2>Nr-TTD</h2>
-        
-        <p>A bunch of Microsoft batch-file code that functions as an installer for <a href="http://www.ttdpatch.net/">TTD Patch</a>, a third-party binary patch for an <a href="http://en.wikipedia.org/wiki/Transport_Tycoon">old game</a>.</p>
-
-    <h2>Kišna Glista</h2>
-
-        <p>An open-source Liero clone (the 985th one).</p>
-
--- a/pages/projects/kg.html	Sat Feb 07 17:10:06 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-<h1>Kišna Glista</h1>
-
-    <p><em>Kišna Glista</em> is a (yet another) Liero clone written in C++, with GPL source code, running on Linux platforms.</p>
-
-    <p>Visit the <a href="http://kg.qmsk.net/">project website</a> for more information</p>
-
--- a/pages/projects/nr-ttd.html	Sat Feb 07 17:10:06 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-<h1>Summary</h1>
-
-    <p><em>nr-TTD</em> (originally <q>No Registry - TTD</q>) is a batch file installer for TTD. It can download and install <a href="http://en.wikipedia.org/wiki/Transport_Tycoon#Transport_Tycoon_Deluxe">TTD</a>, <a href="http://ttdpatch.net/">TTD Patch</a>, <a href="http://www.tt-forums.net/viewtopic.php?t=26352">TTD Patch Configurator</a> as well as a (poor) selection of newgrf files.</p>
-
-    <p>Please note that the project is not under any form of active development anymore.</p>
-
-<h1>Install</h1>
-
-<ol>
-    <li>Download <a href="http://zapotek.paivola.fi/~terom/nr-ttd/get/nr-ttd_latest.zip">the latest version</a></li>
-    <li>Extract/unzip the file into the folder you want to install TTD into</li>
-    <li>Double-click <tt>install.bat</tt></li>
-    <li>Answer the questions, make the choices</li>
-    <li>Done</li>
-</ol>
-
-<h1>Playing</h1>
-
-    <p>Usually, you can play TTD by simply running <tt>ttdpatchw.exe</tt> in the folder that you unzipped Nr-TTD to. For added convenience you can create a shortcut to the <tt>ttdpatchw.exe</tt> file:</p>
-
-    <ol>
-        <li>Right-click <tt>ttdpatchw.exe</tt></li>
-        <li>From the <q>Send To</q> menu, select <q>Send to Desktop (create shortcut)</q></li>
-        <li>Rename the resulting shortcut on your Desktop (right click -&gt; Rename) to, say, <q>TTD Patch</q></li>
-    </ol>
-
-    <p>Then simply run this shortcut to play TTD.</p>
-
-<h2>Registry errors</h2>
-
-    <p>In case you get registry errors when running <tt>ttdpatchw.exe</tt> (as may be the case when installing on top of previous installs of TTD), you should simply use <tt>run-forcenoreg.bat</tt> instead of <tt>ttdpatchw.exe</tt>. This instructs TTD Patch to ignore the windows registry, which should solve all registry problems.</p>
-
-<h1>Configuring</h1>
-
-    <p>Nr-TTD also installs the <a href="http://www.tt-forums.net/viewtopic.php?t=26352">TTD Patch Configurator</a>, which can be used to change your TTD Patch configuration. This enables you to tweak your gameplay in many different ways, and it is highly recommended that you look through the available settings. Refer to the <a href="http://wiki.ttdpatch.net/tiki-index.php?page=Manual">TTD Patch Manual</a> for further information on the induvidual switches.</p>
-
-    <p>Simply run <tt>ttdpc.exe</tt> from the TTD folder.</p>
-
-<h1>Requirements</h1>
-    <p>Nr-TTD uses fairly new batch file syntax, and hence probably only works on Windows XP SP2 or later. Space requirements are about 20MB or so. Total download size is some 9 MB without newgrfs, and then a couple hundred KB per newgrf.</p>
-
-    <p>TTD Patch should work on Windows Vista as well, provided you have a <a href="http://nightly.ttdpatch.net/latest/">recent enough version</a> (grab the file called TTDPatch-nightly-rXXXX-win32.zip), which you may need to download yourself.</p>
-
-<h1>Problems? Suggestions?</h1>
-
-    <p>Not working? Cryptic error messages? Turned your default language into swahili? Unfortunately, there is nobody actively fixing bugs, but you can try asking for help.</p>
-
-    <p>Discuss Nr-TTD using the appropriate <a href="http://www.tt-forums.net/viewtopic.php?t=26742">TT-Forums topic</a>.</p>
-
--- a/pages/projects/qmsk.net.html	Sat Feb 07 17:10:06 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-<h1>qmsk.net</h1>
-    <p>This is the code that runs this website itself.</p>
-
-    <p>It's a relatively simple WSGI-based CGI script that renders various kinds of pages from the filesystem, along with a nice menu.</p>
-
-    <p><a href="http://hg.qmsk.net/qmsk.net">Mercurial repo</a></p>
--- a/sites/irclogs.qmsk.net/urls.py	Sat Feb 07 17:10:06 2009 +0200
+++ b/sites/irclogs.qmsk.net/urls.py	Sat Feb 07 17:14:01 2009 +0200
@@ -7,14 +7,14 @@
 import handlers
 
 # library stuff
-from lib.map import StaticMapping, map, mapre
+from lib.map import StaticMapper, map, mapre
 
 def build_mapper () :
     """
         Construct and return the Mapping object
     """
 
-    return StaticMapping([
+    return StaticMapper([
         map(    '/',                                        handlers.index                  ),
         map(    '/channel/%s',                              handlers.channel_view           ),
         mapre(  r'^/channel/(\w+)/last/(\d+)(\.\w+)?',      handlers.channel_last           ),
--- a/sites/www.qmsk.net/__init__.py	Sat Feb 07 17:10:06 2009 +0200
+++ b/sites/www.qmsk.net/__init__.py	Sat Feb 07 17:14:01 2009 +0200
@@ -3,8 +3,8 @@
 """
 
 from lib import template
-import map
+import lookup
 
 # global mapper attribute
-handler = map.FilesystemMapper("pages", template=template.TemplateLoader.load("sites/www.qmsk.net/templates/layout.tmpl"))
+handler = lookup.PageMapper("sites/www.qmsk.net/pages", template=template.TemplateLoader.load("sites/www.qmsk.net/templates/layout.tmpl"))
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sites/www.qmsk.net/lookup.py	Sat Feb 07 17:14:01 2009 +0200
@@ -0,0 +1,120 @@
+
+import os, os.path
+
+from lib import http, template, map
+
+import page, page_tree
+
+class PageMapper (map.Mapper) :
+    """
+        Translates requests to handlers based on a filesystem directory containing various kinds of files
+    """
+
+    # list of page handlers, by type
+    PAGE_TYPES = [
+        ('html',                    page.HTMLPage           ),
+        (template.TEMPLATE_EXT,     page.TemplatePage       ),
+    ]
+
+    def __init__ (self, path, template) :
+        """
+            Create, path is where the pages are stored. The list of pages is loaded from $path/list
+        """
+        
+        # store
+        self.path = path 
+        self.template = template
+
+        # load the page tree
+        self.tree = page_tree.PageTree(path + '/list')
+    
+    def _lookup_page_type (self, url, path, filename, basename, extension, tail) :
+        """
+            We found the file that we looked for, now get the correct type
+        """
+
+        # find appropriate handler
+        for handler_ext, type in self.PAGE_TYPES :
+            # match against file extension?
+            if handler_ext == extension :
+                # found handler, return instance
+                return type(self, url, path, basename, tail)
+
+        # no handler found
+        raise PageError("No handler found for page %r of type %r" % (url, extension))
+
+    def _lookup_page (self, name) :
+        """
+            Look up and return a Page object for the given page, or raise an error
+        """
+
+        # inital path
+        path = self.path
+        url_segments = []
+
+        # name segments
+        segments = name.split('/')
+
+        # iterate through the parts of the page segments
+        while True :
+            segment = None
+
+            # pop segment
+            if segments :
+                segment = segments.pop(0)
+
+                url_segments.append(segment)
+
+            # translate empty -> index
+            if not segment :
+                segment = 'index'
+
+            # look for it in the dir
+            for filename in os.listdir(path) :
+                # build full file path
+                file_path = os.path.join(path, filename)
+
+                # stat, recurse into subdirectory?
+                if os.path.isdir(file_path) and filename == segment :
+                    # use new dir
+                    path = file_path
+
+                    # break for-loop to look at next segment
+                    break
+     
+                # split into basename + extension
+                basename, extension = os.path.splitext(filename)
+
+                # ...remove that dot
+                extension = extension.lstrip('.')
+                
+                # match against requested page name?
+                if basename == segment :
+                    # found the file we wanted
+                    return self._lookup_page_type('/'.join(url_segments), file_path, filename, basename, extension, '/'.join(segments))
+                
+                else :
+                    # inspect next file in dir
+                    continue
+
+            else :
+                # did not find any dir or file, break out of while loop
+                break
+
+        # did not find the filename we were looking for in os.listdir
+        raise map.MapperError(name)
+
+    def handle_request (self, request) :
+        """
+            Looks up the appropriate Page, and then renders it
+        """
+
+        # determine the page name
+        page_name = request.get_page_name()
+
+        # get the page handler
+        page = self._lookup_page(page_name)
+        
+        # pass on
+        return page.handle_request(request)
+
--- a/sites/www.qmsk.net/map.py	Sat Feb 07 17:10:06 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-
-import os, os.path
-
-from lib import http, template, map
-
-import page, page_tree
-
-class FilesystemMapper (map.Mapper) :
-    """
-        Translates requests to handlers based on a filesystem directory containing various kinds of files
-    """
-
-    # list of page handlers, by type
-    PAGE_TYPES = [
-        ('html',                    page.HTMLPage           ),
-        (template.TEMPLATE_EXT,     page.TemplatePage       ),
-    ]
-
-    def __init__ (self, path, template) :
-        """
-            Create, path is where the pages are stored. The list of pages is loaded from $path/list
-        """
-        
-        # store
-        self.path = path 
-        self.template = template
-
-        # load the page tree
-        self.tree = page_tree.PageTree(path + '/list')
-    
-    def _lookup_page_type (self, url, path, filename, basename, extension, tail) :
-        """
-            We found the file that we looked for, now get the correct type
-        """
-
-        # find appropriate handler
-        for handler_ext, type in self.PAGE_TYPES :
-            # match against file extension?
-            if handler_ext == extension :
-                # found handler, return instance
-                return type(self, url, path, basename, tail)
-
-        # no handler found
-        raise PageError("No handler found for page %r of type %r" % (url, extension))
-
-    def _lookup_page (self, name) :
-        """
-            Look up and return a Page object for the given page, or raise an error
-        """
-
-        # inital path
-        path = self.path
-        url_segments = []
-
-        # name segments
-        segments = name.split('/')
-
-        # iterate through the parts of the page segments
-        while True :
-            segment = None
-
-            # pop segment
-            if segments :
-                segment = segments.pop(0)
-
-                url_segments.append(segment)
-
-            # translate empty -> index
-            if not segment :
-                segment = 'index'
-
-            # look for it in the dir
-            for filename in os.listdir(path) :
-                # build full file path
-                file_path = os.path.join(path, filename)
-
-                # stat, recurse into subdirectory?
-                if os.path.isdir(file_path) and filename == segment :
-                    # use new dir
-                    path = file_path
-
-                    # break for-loop to look at next segment
-                    break
-     
-                # split into basename + extension
-                basename, extension = os.path.splitext(filename)
-
-                # ...remove that dot
-                extension = extension.lstrip('.')
-                
-                # match against requested page name?
-                if basename == segment :
-                    # found the file we wanted
-                    return self._lookup_page_type('/'.join(url_segments), file_path, filename, basename, extension, '/'.join(segments))
-                
-                else :
-                    # inspect next file in dir
-                    continue
-
-            else :
-                # did not find any dir or file, break out of while loop
-                break
-
-        # did not find the filename we were looking for in os.listdir
-        raise PageError("Page not found: %s" % name, status='404 Not Found')
-
-    def handle_request (self, request) :
-        """
-            Looks up the appropriate Page, and then renders it
-        """
-
-        # determine the page name
-        page_name = request.get_page_name()
-
-        # get the page handler
-        page = self._lookup_page(page_name)
-        
-        # pass on
-        return page.handle_request(request)
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sites/www.qmsk.net/pages/about.html	Sat Feb 07 17:14:01 2009 +0200
@@ -0,0 +1,15 @@
+<h1>About me</h1>
+
+<p>
+    My name is Tero Marttila. I'm a student at <a href="http://www.tkk.fi/">Helsinki University of Techonology</a>, living in Otaniemi.
+</p>
+
+<h1>Contact</h1>
+
+<p>
+    I am best reached via IRC, under the nickname of <em>SpComb</em> on any of IRCNet, freenode, OFTC.
+</p>
+
+<p>
+    Alternatively, I'm also reached via email: <em>terom@fixme.fi</em>
+</p>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sites/www.qmsk.net/pages/debug.tmpl	Sat Feb 07 17:14:01 2009 +0200
@@ -0,0 +1,12 @@
+
+<pre>
+${page_tree.dump() | h}
+</pre>
+
+<dl>
+    <lh>List of request env variables</lh>
+
+% for key, val in request.env.iteritems() :
+    <dt>${key}</dt> <dd>${val}</dd>
+% endfor
+</dl>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sites/www.qmsk.net/pages/index.tmpl	Sat Feb 07 17:14:01 2009 +0200
@@ -0,0 +1,9 @@
+<h1></h1>
+
+<div style="font-size: small">
+    <h2>What's <q>qmsk</q>?</h2>
+
+    <p>
+        I'm not sure, but it doesn't have any vowels.
+    </p>
+</div>    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sites/www.qmsk.net/pages/list	Sat Feb 07 17:14:01 2009 +0200
@@ -0,0 +1,9 @@
+
+            : Index
+projects        : Projects
+    qmsk.net        : qmsk.net
+    evsql           : evsql
+    nr-ttd          : Nr-TTD
+    kg              : Kišna Glista
+about           : About
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sites/www.qmsk.net/pages/projects/evsql.html	Sat Feb 07 17:14:01 2009 +0200
@@ -0,0 +1,5 @@
+<h1>evsql</h1>
+    <p>Evsql is a C-language SQL library designed for use with libevent, and primarily PostgreSQL's libpq.</p>
+
+    <p>For more information, read the <a href="http://qmsk.net/static/evsql-doxygen/">Doxygen documentation</a>, or look at the <a href="http://hg.qmsk.net/evfuse.hg/file/tip/src/">Mercurial repo</a> (currently part of evfuse).</p>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sites/www.qmsk.net/pages/projects/foo.html	Sat Feb 07 17:14:01 2009 +0200
@@ -0,0 +1,1 @@
+The foo project
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sites/www.qmsk.net/pages/projects/index.html	Sat Feb 07 17:14:01 2009 +0200
@@ -0,0 +1,14 @@
+<h1>Projects</h1>
+
+    <p>I've worked on a variety of projects over the years, leaving them in various stages of completion.</p>
+
+    <p>Some of the perhaps more noteworthy ones have their own project pages here (see menu to the left).</p>
+
+    <h2>Nr-TTD</h2>
+        
+        <p>A bunch of Microsoft batch-file code that functions as an installer for <a href="http://www.ttdpatch.net/">TTD Patch</a>, a third-party binary patch for an <a href="http://en.wikipedia.org/wiki/Transport_Tycoon">old game</a>.</p>
+
+    <h2>Kišna Glista</h2>
+
+        <p>An open-source Liero clone (the 985th one).</p>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sites/www.qmsk.net/pages/projects/kg.html	Sat Feb 07 17:14:01 2009 +0200
@@ -0,0 +1,6 @@
+<h1>Kišna Glista</h1>
+
+    <p><em>Kišna Glista</em> is a (yet another) Liero clone written in C++, with GPL source code, running on Linux platforms.</p>
+
+    <p>Visit the <a href="http://kg.qmsk.net/">project website</a> for more information</p>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sites/www.qmsk.net/pages/projects/nr-ttd.html	Sat Feb 07 17:14:01 2009 +0200
@@ -0,0 +1,49 @@
+<h1>Summary</h1>
+
+    <p><em>nr-TTD</em> (originally <q>No Registry - TTD</q>) is a batch file installer for TTD. It can download and install <a href="http://en.wikipedia.org/wiki/Transport_Tycoon#Transport_Tycoon_Deluxe">TTD</a>, <a href="http://ttdpatch.net/">TTD Patch</a>, <a href="http://www.tt-forums.net/viewtopic.php?t=26352">TTD Patch Configurator</a> as well as a (poor) selection of newgrf files.</p>
+
+    <p>Please note that the project is not under any form of active development anymore.</p>
+
+<h1>Install</h1>
+
+<ol>
+    <li>Download <a href="http://zapotek.paivola.fi/~terom/nr-ttd/get/nr-ttd_latest.zip">the latest version</a></li>
+    <li>Extract/unzip the file into the folder you want to install TTD into</li>
+    <li>Double-click <tt>install.bat</tt></li>
+    <li>Answer the questions, make the choices</li>
+    <li>Done</li>
+</ol>
+
+<h1>Playing</h1>
+
+    <p>Usually, you can play TTD by simply running <tt>ttdpatchw.exe</tt> in the folder that you unzipped Nr-TTD to. For added convenience you can create a shortcut to the <tt>ttdpatchw.exe</tt> file:</p>
+
+    <ol>
+        <li>Right-click <tt>ttdpatchw.exe</tt></li>
+        <li>From the <q>Send To</q> menu, select <q>Send to Desktop (create shortcut)</q></li>
+        <li>Rename the resulting shortcut on your Desktop (right click -&gt; Rename) to, say, <q>TTD Patch</q></li>
+    </ol>
+
+    <p>Then simply run this shortcut to play TTD.</p>
+
+<h2>Registry errors</h2>
+
+    <p>In case you get registry errors when running <tt>ttdpatchw.exe</tt> (as may be the case when installing on top of previous installs of TTD), you should simply use <tt>run-forcenoreg.bat</tt> instead of <tt>ttdpatchw.exe</tt>. This instructs TTD Patch to ignore the windows registry, which should solve all registry problems.</p>
+
+<h1>Configuring</h1>
+
+    <p>Nr-TTD also installs the <a href="http://www.tt-forums.net/viewtopic.php?t=26352">TTD Patch Configurator</a>, which can be used to change your TTD Patch configuration. This enables you to tweak your gameplay in many different ways, and it is highly recommended that you look through the available settings. Refer to the <a href="http://wiki.ttdpatch.net/tiki-index.php?page=Manual">TTD Patch Manual</a> for further information on the induvidual switches.</p>
+
+    <p>Simply run <tt>ttdpc.exe</tt> from the TTD folder.</p>
+
+<h1>Requirements</h1>
+    <p>Nr-TTD uses fairly new batch file syntax, and hence probably only works on Windows XP SP2 or later. Space requirements are about 20MB or so. Total download size is some 9 MB without newgrfs, and then a couple hundred KB per newgrf.</p>
+
+    <p>TTD Patch should work on Windows Vista as well, provided you have a <a href="http://nightly.ttdpatch.net/latest/">recent enough version</a> (grab the file called TTDPatch-nightly-rXXXX-win32.zip), which you may need to download yourself.</p>
+
+<h1>Problems? Suggestions?</h1>
+
+    <p>Not working? Cryptic error messages? Turned your default language into swahili? Unfortunately, there is nobody actively fixing bugs, but you can try asking for help.</p>
+
+    <p>Discuss Nr-TTD using the appropriate <a href="http://www.tt-forums.net/viewtopic.php?t=26742">TT-Forums topic</a>.</p>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sites/www.qmsk.net/pages/projects/qmsk.net.html	Sat Feb 07 17:14:01 2009 +0200
@@ -0,0 +1,6 @@
+<h1>qmsk.net</h1>
+    <p>This is the code that runs this website itself.</p>
+
+    <p>It's a relatively simple WSGI-based CGI script that renders various kinds of pages from the filesystem, along with a nice menu.</p>
+
+    <p><a href="http://hg.qmsk.net/qmsk.net">Mercurial repo</a></p>