<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Blog-O! (Posts about drproject)</title><link>https://bwinton.github.io/weblog.latte.ca/</link><description></description><atom:link rel="self" href="https://bwinton.github.io/weblog.latte.ca/tags/drproject.xml" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Sat, 13 Apr 2019 21:03:25 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>How to start developing Basie</title><link>https://bwinton.github.io/weblog.latte.ca/blake/tech/basie/startingdevelopment/</link><dc:creator>Blake Winton</dc:creator><description>&lt;div&gt;&lt;p&gt;So, first off, I think Python developers these days need to use stuff
like virtualenv and zc.buildout in order to develop in a sane manner.
Yeah, this is the first project I’m using them on, but do what I say,
not what I do.&lt;/p&gt;
&lt;p&gt;Anyways, on to the instructions.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;sudo easy_install virtualenv
virtualenv --no-site-packages basie
cd basie/
. bin/activate
&lt;/pre&gt;


&lt;p&gt;Then, you’re gonna need a
&lt;a href="http://bwinton.latte.ca/Programming/Basie/buildout.cfg"&gt;buildout.cfg&lt;/a&gt;.
Mine looks like this:&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[buildout]&lt;/span&gt;
&lt;span class="na"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;django&lt;/span&gt;
&lt;span class="na"&gt;eggs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;ipython&lt;/span&gt;

&lt;span class="k"&gt;[django]&lt;/span&gt;
&lt;span class="na"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;djangorecipe&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;trunk&lt;/span&gt;
&lt;span class="na"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;development&lt;/span&gt;
&lt;span class="na"&gt;eggs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;${buildout:eggs}&lt;/span&gt;
&lt;span class="na"&gt;project&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;basie&lt;/span&gt;
&lt;span class="na"&gt;wsgi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;You’ll also need a
&lt;a href="http://bwinton.latte.ca/Programming/Basie/bootstrap.py"&gt;bootstrap.py&lt;/a&gt;,
which will look a little something like this:&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;##############################################################################&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Copyright (c) 2006 Zope Corporation and Contributors.&lt;/span&gt;
&lt;span class="c1"&gt;# All Rights Reserved.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# This software is subject to the provisions of the Zope Public License,&lt;/span&gt;
&lt;span class="c1"&gt;# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.&lt;/span&gt;
&lt;span class="c1"&gt;# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED&lt;/span&gt;
&lt;span class="c1"&gt;# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED&lt;/span&gt;
&lt;span class="c1"&gt;# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS&lt;/span&gt;
&lt;span class="c1"&gt;# FOR A PARTICULAR PURPOSE.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;##############################################################################&lt;/span&gt;
&lt;span class="sd"&gt;"""Bootstrap a buildout-based project&lt;/span&gt;

&lt;span class="sd"&gt;Simply run this script in a directory containing a buildout.cfg.&lt;/span&gt;
&lt;span class="sd"&gt;The script accepts buildout command-line options, so you can&lt;/span&gt;
&lt;span class="sd"&gt;use the -c option to specify an alternate configuration file.&lt;/span&gt;

&lt;span class="sd"&gt;$Id$&lt;/span&gt;
&lt;span class="sd"&gt;"""&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;shutil&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;tempfile&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;urllib2&lt;/span&gt;

&lt;span class="n"&gt;tmpeggs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tempfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mkdtemp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pkg_resources&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ImportError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;ez&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;exec&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'http://peak.telecommunity.com/dist/ez_setup.py'&lt;/span&gt;
                         &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ez&lt;/span&gt;
    &lt;span class="n"&gt;ez&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'use_setuptools'&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;to_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tmpeggs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;download_delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pkg_resources&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'win32'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'"&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;"'&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="c1"&gt;# work around spawn lamosity on windows&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;quote&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;

&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'from setuptools.command.easy_install import main; main()'&lt;/span&gt;
&lt;span class="n"&gt;ws&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pkg_resources&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;working_set&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spawnle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;P_WAIT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;executable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;executable&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'-c'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'-mqNxd'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmpeggs&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'zc.buildout'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;PYTHONPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
         &lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pkg_resources&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Requirement&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'setuptools'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;
         &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmpeggs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'zc.buildout'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;zc.buildout.buildout&lt;/span&gt;
&lt;span class="n"&gt;zc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buildout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buildout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'bootstrap'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;shutil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rmtree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmpeggs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;After you’ve got those, it’s basically:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;python bootstrap.py
buildout -v
django help
django runserver
&lt;/pre&gt;


&lt;p&gt;And when you’re done,
    deactivate&lt;/p&gt;
&lt;p&gt;Any comments on things that don’t work would be highly appreciated.&lt;/p&gt;&lt;/div&gt;</description><category>basie</category><category>django</category><category>drproject</category><category>python</category><guid>https://bwinton.github.io/weblog.latte.ca/blake/tech/basie/startingdevelopment/</guid><pubDate>Wed, 27 Aug 2008 21:03:24 GMT</pubDate></item><item><title>How to add Markdown to your PyBlosxom Blog.</title><link>https://bwinton.github.io/weblog.latte.ca/blake/tech/markdown/</link><dc:creator>Blake Winton</dc:creator><description>&lt;div&gt;&lt;p&gt;Hopefully this all just works.  Include A&amp;amp;B, and 4 &amp;lt; 5.&lt;/p&gt;
&lt;h2&gt;Headers&lt;/h2&gt;
&lt;h3&gt;Smaller headers&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Blockquotes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Lists&lt;/li&gt;
&lt;li&gt;of &lt;/li&gt;
&lt;li&gt;
&lt;p&gt;things&lt;/p&gt;
&lt;p&gt;Blocks of python code could be here.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;etc&lt;/em&gt;, &lt;strong&gt;etc&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Okay, so now that I’ve determined that it works, here’s how I did it:
I added a new entry parser, called pymarkdown.py, to my plugins
directory.  The content of the code looks like this:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;FILE_EXT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'md'&lt;/span&gt;

&lt;span class="n"&gt;__version__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'pymarkdown 0.1'&lt;/span&gt;
&lt;span class="n"&gt;__author__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Blake Winton &amp;amp;lt;bwinton+python@latte.ca&amp;amp;gt;'&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;markdown&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;Pyblosxom&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ImportError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cb_entryparser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entryparsingdict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
       &lt;span class="sd"&gt;"""&lt;/span&gt;
&lt;span class="sd"&gt;       Register self as markdown file handler&lt;/span&gt;
&lt;span class="sd"&gt;       """&lt;/span&gt;
       &lt;span class="n"&gt;entryparsingdict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FILE_EXT&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parse&lt;/span&gt;
       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;entryparsingdict&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""&lt;/span&gt;
&lt;span class="sd"&gt;    We just read everything off the file here, using the filename as&lt;/span&gt;
&lt;span class="sd"&gt;    title&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;
    &lt;span class="n"&gt;entrydata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"r"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readlines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# strip off the first line and use that as the title.&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;entrydata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'title'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;

    &lt;span class="c1"&gt;# absorb meta data lines which begin with a # and consist&lt;/span&gt;
    &lt;span class="c1"&gt;# of a name and a value&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"#"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;     &lt;span class="c1"&gt;# remove the hash&lt;/span&gt;
        &lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;entrydata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# join the rest of the lines as the story&lt;/span&gt;
    &lt;span class="n"&gt;story&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;story&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;markdown&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;story&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;entrydata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'body'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;story&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;entrydata&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;And you’re done.&lt;/p&gt;
&lt;p&gt;I guess you might be wondering why I would bother doing that, since
both Amy and I are obviously comfortable writing straight HTML.  Well,
&lt;a href="http://www.drproject.org/"&gt;DrProject&lt;/a&gt; is switching from a
custom-built Wiki-ish-syntax parser to a &lt;a href="http://www.freewisdom.org/projects/python-markdown/"&gt;third-party&lt;/a&gt; Markdown parser,
and I figured this would give me a bit of a headstart on getting used
to the new syntax, and also give me a bit of a playground for testing
out new features that I might want to add.&lt;/p&gt;&lt;/div&gt;</description><category>drproject</category><category>markdown</category><category>pyblosxom</category><category>python</category><guid>https://bwinton.github.io/weblog.latte.ca/blake/tech/markdown/</guid><pubDate>Wed, 27 Feb 2008 17:16:41 GMT</pubDate></item><item><title>Sprinting on DrProject.</title><link>https://bwinton.github.io/weblog.latte.ca/blake/tech/drproject/codesprint/</link><dc:creator>Blake Winton</dc:creator><description>&lt;p&gt;On Friday and Saturday afternoon this week, I took some time out of my
day to go down to the University of Toronto and participate in the &lt;a href="https://www.drproject.org/"&gt;DrProject&lt;/a&gt; &lt;a href="https://www.drproject.org/DrProject/mail/5059"&gt;Code Sprint&lt;/a&gt;.  It
was a lot of fun, and I managed to fix a couple of bugs, and get a better
understanding of one of &lt;a href="https://www.drproject.org/DrProject/browser/trunk/drproject?file=wiki"&gt;the hairier parts&lt;/a&gt; of DrProject.  At least I hope it’s one of the
hairier parts of DrProject, since if the whole codebase is as ugly as the
wiki parts, we’re in some serious trouble.  To be fair, it’s a
not-entirely-deterministic parser for a not-entirely-deterministic
language, so when something goes wrong, it’s kind of, uh, tricky to figure
out what’s just happened.  For example, after parsing a link surrounded in
square brackets, the following character seems to be &lt;a href="https://www.drproject.org/DrProject/ticket/1075"&gt;treated as
text&lt;/a&gt;.  Why?  Who knows.  As someone new to the wiki parser, I’ld love
to have the code be simpler to understand, but I’m starting to suspect that
the complexity is inherent in what it’s trying to do.&lt;/p&gt;

&lt;p&gt;The two bugfixes/feature additions I did, although they seem sort of unrelated, both work
together to let people create a bibliography/set of footnotes to pages,
which is something &lt;a href="http://pyre.third-bit.com/blog/"&gt;Greg&lt;/a&gt; said
that he’s been wanting for a while, so that was kind of cool.  It’s nice to
be able to go somewhere, be surrounded by smart people, and concentrate on
making something better without interruptions.&lt;/p&gt;

&lt;p&gt;Speaking of the bugfixes, they were:
  &lt;/p&gt;&lt;ul&gt;
    &lt;li&gt;&lt;a href="https://www.drproject.org/DrProject/ticket/870"&gt;adding
support for dl/dt/dd&lt;/a&gt; in the wiki syntax, which turned out to be
surprisingly hard, since it seemed to be the first bit of syntax that
wanted to either return more than one tag or insert a tag into the
already-generated stream, so I had to figure out which option to go with,
and how to get it working, and&lt;/li&gt;
    &lt;li&gt;coming up with and implementing a wiki syntax for &lt;a href="https://www.drproject.org/DrProject/ticket/1038"&gt;creating and referring to anchors&lt;/a&gt; in a page, which I think I did a
pretty decent job on.  The syntax uses [wiki:#foo] as an anchor, and
[wiki:MyPage#foo] as a link to that anchor&lt;/li&gt;
  &lt;/ul&gt;
</description><category>bugs</category><category>drproject</category><category>parser</category><category>sprint</category><category>wiki</category><guid>https://bwinton.github.io/weblog.latte.ca/blake/tech/drproject/codesprint/</guid><pubDate>Mon, 07 Jan 2008 02:14:42 GMT</pubDate></item><item><title>Installing DrProject.</title><link>https://bwinton.github.io/weblog.latte.ca/blake/tech/drproject/installingdrproject/</link><dc:creator>Blake Winton</dc:creator><description>&lt;p&gt;Just because that would be too easy by itself, I'm going to follow
&lt;a href="http://www.third-bit.com/drproject/drproject-dev/wiki/DrProjectOnCygwin"&gt;the instructions for Cygwin&lt;/a&gt;, and we'll see what happens.&lt;/p&gt;

&lt;p&gt;Okay, it's going fairly well so far...&lt;br&gt;
And then I get to step 3:&lt;br&gt;
&lt;/p&gt;&lt;pre&gt;Download, compile, and install sqlite from sources. Use version 3.3.5.&lt;/pre&gt;
To compile it, I use "./configure", "make",
"make install", but that gives me the following error:
&lt;pre&gt;&lt;code&gt;$ make install
tclsh ./tclinstaller.tcl 3.3
can't read "env(DESTDIR)": no such variable
    while executing
"set LIBDIR $env(DESTDIR)[lindex $auto_path 0]"
    (file "./tclinstaller.tcl" line 10)
make: *** [tcl_install] Error 1&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://www.sqlite.org/cvstrac/wiki/wiki?p=HowToCompile"&gt;This
page&lt;/a&gt; tells me to remove each occurance of "$(DESTDIR)" from
Makefile, so I did, and it still didn't work, so I tried commenting out
"HAVE_TCL = 1" and then it all seemed to work just fine.&lt;/p&gt;

&lt;p&gt;Until I got to the line:
&lt;/p&gt;&lt;pre&gt;chmod +x /lib/python2.4/site-packages/pysqlite-2.2.2-py2.4-cygwin-1.5.19-i686.egg/pysqlite2/_pysqlite.dll&lt;/pre&gt;
which failed, but it was easy enough to change it to:
&lt;pre&gt;chmod +x /lib/python2.4/site-packages/pysqlite-2.2.2-py2.4-cygwin-1.5.19-i686.egg/pysqlite2/_sqlite.dll&lt;/pre&gt;
which worked.


&lt;p&gt;Running
&lt;/p&gt;&lt;pre&gt;drproject-server --debug --port 8080 --auto-reload --create=/tmp/drproject&lt;/pre&gt;
gave me the error:
&lt;pre&gt;drproject-server: error: --create option does not take a value&lt;/pre&gt;

So I tried
&lt;pre&gt;drproject-server --debug --port 8080 --auto-reload --create&lt;/pre&gt;
which said:
&lt;pre&gt;drproject-server: error: incorrect number of arguments&lt;/pre&gt;

So I finally tried
&lt;pre&gt;drproject-server --debug --port 8080 --auto-reload --create /tmp/drproject&lt;/pre&gt;
and it seemed good.

&lt;p&gt;Finally, I ran
&lt;/p&gt;&lt;pre&gt;drproject-server --debug --port 8080 --auto-reload /tmp/drproject&lt;/pre&gt;
And it was good...

&lt;p&gt;So I created a script called "drproject-server-profile", to profile
it, containing the following lines
&lt;/p&gt;&lt;pre&gt;&lt;code&gt;
#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'DrProject==1.0dev-r2084','console_scripts','drproject-server'
__requires__ = 'DrProject==1.0dev-r2084'
import sys
from pkg_resources import load_entry_point

import profile
profile.run("sys.exit(load_entry_point('DrProject==1.0dev-r2084', 'console_scripts', 'drproject-server')())", 'profile.tmp')&lt;/code&gt;&lt;/pre&gt;
and &lt;a href="http://bwinton.latte.ca/profile.tmp"&gt;here&lt;/a&gt; is the data!</description><category>drproject</category><guid>https://bwinton.github.io/weblog.latte.ca/blake/tech/drproject/installingdrproject/</guid><pubDate>Wed, 09 May 2007 21:28:58 GMT</pubDate></item></channel></rss>