<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>Thoughts from Mads Sülau Jørgensen &#187; Python</title> <atom:link href="http://madssj.com/blog/tag/python/feed/" rel="self" type="application/rss+xml" /><link>http://madssj.com/blog</link> <description>Various articles about programming and systems administration.</description> <lastBuildDate>Mon, 27 Jun 2011 08:54:43 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>Converting a south 0.7 migration back to 0.6</title><link>http://madssj.com/blog/2010/09/27/converting-a-south-0-7-migration-back-to-0-6/</link> <comments>http://madssj.com/blog/2010/09/27/converting-a-south-0-7-migration-back-to-0-6/#comments</comments> <pubDate>Mon, 27 Sep 2010 13:16:23 +0000</pubDate> <dc:creator>Mads Sülau Jørgensen</dc:creator> <category><![CDATA[Django]]></category> <category><![CDATA[Programming]]></category> <category><![CDATA[Python]]></category> <category><![CDATA[Work]]></category> <category><![CDATA[0.6]]></category> <category><![CDATA[0.7]]></category> <category><![CDATA[convert]]></category> <category><![CDATA[south]]></category> <guid
isPermaLink="false">http://swag.dk/blog/?p=230</guid> <description><![CDATA[I had a minor fight with south earlier today, where someone had created a migration with south 0.7, and I needed it to work with south 0.6. Needless to say that it would be a pain to manually convert it &#8230; <a
href="http://madssj.com/blog/2010/09/27/converting-a-south-0-7-migration-back-to-0-6/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>I had a minor fight with <a
href="http://south.aeracode.org/">south</a> earlier today, where someone had created a migration with south 0.7, and I needed it to work with south 0.6.</p><p>Needless to say that it would be a pain to manually convert it from the better 0.7 format back into 0.6, so I wrote a fairly small python script, that does the job.</p><p><span
id="more-230"></span> Don&#8217;t blame me if the script causes your data to be erased or tables to be dropped. It&#8217;s ment as a guideline, although it worked for me out of the box.</p><p>YMMV.</p><p>Usage: python &lt;south_07to06.py> &lt;path/to/migration.py></p><div
class="wp_syntax"><div
class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span>
&nbsp;
create_table_re = <span style="color: #dc143c;">re</span>.<span style="color: #008000;">compile</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;db.create_table('([^']+)',&quot;</span><span style="color: black;">&#41;</span>
field_name_re = <span style="color: #dc143c;">re</span>.<span style="color: #008000;">compile</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;^(s*)('([^']+)', self.gf&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
cur_model = <span style="color: #008000;">None</span>
&nbsp;
<span style="color: #008000;">input</span> = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">input</span>.<span style="color: black;">readlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    line = line.<span style="color: black;">rstrip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    match = create_table_re.<span style="color: black;">search</span><span style="color: black;">&#40;</span>line<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> line.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;class Migration&quot;</span><span style="color: black;">&#41;</span>:
        line = <span style="color: #483d8b;">&quot;class Migration():&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">elif</span> line.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;from south.v2&quot;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">continue</span>
    <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #483d8b;">'Meta'</span> <span style="color: #ff7700;font-weight:bold;">in</span> line <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #483d8b;">'object_name'</span> <span style="color: #ff7700;font-weight:bold;">in</span> line:
        line = <span style="color: #dc143c;">re</span>.<span style="color: black;">sub</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">&quot;(?:, )?'object_name': '[^']+'&quot;</span>, <span style="color: #483d8b;">&quot;&quot;</span>, line<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> cur_model <span style="color: #ff7700;font-weight:bold;">and</span> match:
        cur_model = match.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">elif</span> cur_model <span style="color: #ff7700;font-weight:bold;">and</span> line.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">'))'</span>:
        cur_model = <span style="color: #008000;">None</span>
    <span style="color: #ff7700;font-weight:bold;">elif</span> cur_model:
        field_match = field_name_re.<span style="color: black;">search</span><span style="color: black;">&#40;</span>line<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> field_match:
            spaces = field_match.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
            field_name = field_match.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
            line = <span style="color: #483d8b;">&quot;%s('%s', orm['%s:%s']), &quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>spaces, field_name, cur_model.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;_&quot;</span>, <span style="color: #483d8b;">&quot;.&quot;</span><span style="color: black;">&#41;</span>, field_name<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">print</span> line</pre></div></div> ]]></content:encoded> <wfw:commentRss>http://madssj.com/blog/2010/09/27/converting-a-south-0-7-migration-back-to-0-6/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Figuring out largest/smallest/median filesizes</title><link>http://madssj.com/blog/2010/02/04/figuring-out-largestsmallestmedian-filesizes/</link> <comments>http://madssj.com/blog/2010/02/04/figuring-out-largestsmallestmedian-filesizes/#comments</comments> <pubDate>Thu, 04 Feb 2010 14:00:52 +0000</pubDate> <dc:creator>Mads Sülau Jørgensen</dc:creator> <category><![CDATA[Uncategorized]]></category> <category><![CDATA[Python]]></category> <category><![CDATA[Work]]></category> <guid
isPermaLink="false">http://swag.dk/blog/2010/02/04/figuring-out-largestsmallestmedian-filesizes/</guid> <description><![CDATA[I had to get some statistics about file sizes today, but couldn&#8217;t really find a tool for the job, so naturally, I wrote one. import os, sys, re from os.path import join, getsize, exists &#160; def median&#40;numbers&#41;: s = sorted&#40;numbers&#41; &#8230; <a
href="http://madssj.com/blog/2010/02/04/figuring-out-largestsmallestmedian-filesizes/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>I had to get some statistics about file sizes today, but couldn&#8217;t really find a tool for the job, so naturally, I wrote one.</p><p><span
id="more-189"></span></p><div
class="wp_syntax"><div
class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>, <span style="color: #dc143c;">sys</span>, <span style="color: #dc143c;">re</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span> <span style="color: #ff7700;font-weight:bold;">import</span> join, getsize, exists
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> median<span style="color: black;">&#40;</span>numbers<span style="color: black;">&#41;</span>:
    s = <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span>numbers<span style="color: black;">&#41;</span>
    l = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>numbers<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> l <span style="color: #66cc66;">%</span> <span style="color: #ff4500;">2</span> == <span style="color: #ff4500;">0</span>:
        a, b = s<span style="color: black;">&#91;</span>l / <span style="color: #ff4500;">2</span> - <span style="color: #ff4500;">1</span> : l / <span style="color: #ff4500;">2</span> + <span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> a <span style="color: #66cc66;">!</span>= b:
            <span style="color: #ff7700;font-weight:bold;">return</span> a + b / <span style="color: #ff4500;">2.0</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> a
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> s<span style="color: black;">&#91;</span>l / <span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>
&nbsp;
sizes = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
req_re = <span style="color: #008000;">None</span>
target = <span style="color: #483d8b;">'.'</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">1</span>:
    target = <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">3</span>:
    req_re = <span style="color: #dc143c;">re</span>.<span style="color: #008000;">compile</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> root, dirs, files <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">walk</span><span style="color: black;">&#40;</span>target<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">for</span> name <span style="color: #ff7700;font-weight:bold;">in</span> files:
        absp = join<span style="color: black;">&#40;</span>root, name<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> exists<span style="color: black;">&#40;</span>absp<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> req_re <span style="color: #ff7700;font-weight:bold;">or</span> req_re.<span style="color: black;">search</span><span style="color: black;">&#40;</span>absp<span style="color: black;">&#41;</span>:
                sizes.<span style="color: black;">append</span><span style="color: black;">&#40;</span>getsize<span style="color: black;">&#40;</span>absp<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
num = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>sizes<span style="color: black;">&#41;</span>
total = <span style="color: #008000;">sum</span><span style="color: black;">&#40;</span>sizes<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Num files: %d&quot;</span> <span style="color: #66cc66;">%</span> num
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Average  : %0.2f KB&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>total / num<span style="color: black;">&#41;</span> / <span style="color: #ff4500;">1024.0</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Median   : %0.2f KB&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>median<span style="color: black;">&#40;</span>sizes<span style="color: black;">&#41;</span> / <span style="color: #ff4500;">1024.0</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Min      : %0.2f KB&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #008000;">min</span><span style="color: black;">&#40;</span>sizes<span style="color: black;">&#41;</span> / <span style="color: #ff4500;">1024.0</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Max      : %0.2f KB&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #008000;">max</span><span style="color: black;">&#40;</span>sizes<span style="color: black;">&#41;</span> / <span style="color: #ff4500;">1024.0</span><span style="color: black;">&#41;</span></pre></div></div><p>Usage should be self-explanatory.</p> ]]></content:encoded> <wfw:commentRss>http://madssj.com/blog/2010/02/04/figuring-out-largestsmallestmedian-filesizes/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Python http_head method</title><link>http://madssj.com/blog/2009/05/15/python-http_head-method/</link> <comments>http://madssj.com/blog/2009/05/15/python-http_head-method/#comments</comments> <pubDate>Fri, 15 May 2009 10:30:28 +0000</pubDate> <dc:creator>Mads Sülau Jørgensen</dc:creator> <category><![CDATA[Uncategorized]]></category> <category><![CDATA[HEAD]]></category> <category><![CDATA[HTTP]]></category> <category><![CDATA[Python]]></category> <category><![CDATA[Work]]></category> <guid
isPermaLink="false">http://swag.dk/blog/2009/05/15/python-http_head-method/</guid> <description><![CDATA[Seeing as there is no really easy way to do a HTTP HEAD request from python, I wrote up the following small method: In advance I&#8217;d like to apologize for the method that assemblies the request path. Update: Added handling &#8230; <a
href="http://madssj.com/blog/2009/05/15/python-http_head-method/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Seeing as there is no really easy way to do a HTTP <code>HEAD</code> request from python, I wrote up the following small method:</p><p>In advance I&#8217;d like to apologize for the method that assemblies the request path.</p><p><strong>Update:</strong> <em>Added handling of redirects.</em></p><div
class="wp_syntax"><div
class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> http_head<span style="color: black;">&#40;</span>url<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">httplib</span>
    <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urlparse</span>
&nbsp;
    redirects = <span style="color: #ff4500;">0</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">while</span> redirects <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">10</span>:
        scheme, netloc, path, query, fragment = <span style="color: #dc143c;">urlparse</span>.<span style="color: black;">urlsplit</span><span style="color: black;">&#40;</span>url<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> scheme == <span style="color: #483d8b;">'https'</span>:
            conn = <span style="color: #dc143c;">httplib</span>.<span style="color: black;">HTTPSConnection</span><span style="color: black;">&#40;</span>netloc<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            conn = <span style="color: #dc143c;">httplib</span>.<span style="color: black;">HTTPConnection</span><span style="color: black;">&#40;</span>netloc<span style="color: black;">&#41;</span>
&nbsp;
        conn.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;HEAD&quot;</span>, <span style="color: #483d8b;">&quot;%s%s%s%s%s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>path, query <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #483d8b;">&quot;?&quot;</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #483d8b;">&quot;&quot;</span>, query,
                                             fragment <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #483d8b;">&quot;#&quot;</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #483d8b;">&quot;&quot;</span>, fragment<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        res = conn.<span style="color: black;">getresponse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> res.<span style="color: black;">status</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#40;</span><span style="color: #ff4500;">301</span>, <span style="color: #ff4500;">302</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> res.<span style="color: black;">getheader</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'location'</span><span style="color: black;">&#41;</span>:
            url = res.<span style="color: black;">getheader</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'location'</span><span style="color: black;">&#41;</span>
            redirects += <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> res.<span style="color: black;">status</span>, res.<span style="color: black;">reason</span></pre></div></div> ]]></content:encoded> <wfw:commentRss>http://madssj.com/blog/2009/05/15/python-http_head-method/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Very simple email sending method in python</title><link>http://madssj.com/blog/2009/05/11/very-simple-email-sending-method-in-python/</link> <comments>http://madssj.com/blog/2009/05/11/very-simple-email-sending-method-in-python/#comments</comments> <pubDate>Mon, 11 May 2009 17:30:24 +0000</pubDate> <dc:creator>Mads Sülau Jørgensen</dc:creator> <category><![CDATA[Uncategorized]]></category> <category><![CDATA[Email]]></category> <category><![CDATA[Python]]></category> <category><![CDATA[SMTP]]></category> <category><![CDATA[Work]]></category> <guid
isPermaLink="false">http://swag.dk/blog/2009/05/11/very-simple-email-sending-method-in-python/</guid> <description><![CDATA[I needed to send an email, so I came up with this: &#160; def send_plain_mail&#40;subject, body, from_mail, to&#41;: import smtplib from email.MIMEText import MIMEText from email.Encoders import encode_quopri &#160; msg = MIMEText&#40;body, 'plain', 'iso-8859-1'&#41; &#160; msg&#91;'Subject'&#93; = subject msg&#91;'From'&#93; = &#8230; <a
href="http://madssj.com/blog/2009/05/11/very-simple-email-sending-method-in-python/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>I needed to send an email, so I came up with this:</p><div
class="wp_syntax"><div
class="code"><pre class="python" style="font-family:monospace;">&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> send_plain_mail<span style="color: black;">&#40;</span>subject, body, from_mail, to<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">smtplib</span>
    <span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">email</span>.<span style="color: black;">MIMEText</span> <span style="color: #ff7700;font-weight:bold;">import</span> MIMEText
    <span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">email</span>.<span style="color: black;">Encoders</span> <span style="color: #ff7700;font-weight:bold;">import</span> encode_quopri
&nbsp;
    msg = MIMEText<span style="color: black;">&#40;</span>body, <span style="color: #483d8b;">'plain'</span>, <span style="color: #483d8b;">'iso-8859-1'</span><span style="color: black;">&#41;</span>
&nbsp;
    msg<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Subject'</span><span style="color: black;">&#93;</span> = subject
    msg<span style="color: black;">&#91;</span><span style="color: #483d8b;">'From'</span><span style="color: black;">&#93;</span> = from_mail
    msg<span style="color: black;">&#91;</span><span style="color: #483d8b;">'To'</span><span style="color: black;">&#93;</span> = to
&nbsp;
    s = <span style="color: #dc143c;">smtplib</span>.<span style="color: black;">SMTP</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    s.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    s.<span style="color: black;">sendmail</span><span style="color: black;">&#40;</span>from_mail, <span style="color: black;">&#91;</span>to<span style="color: black;">&#93;</span>, msg.<span style="color: black;">as_string</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    s.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div><p>Not rocket science, but it gets the job done.</p> ]]></content:encoded> <wfw:commentRss>http://madssj.com/blog/2009/05/11/very-simple-email-sending-method-in-python/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Fun with mod_macro and django</title><link>http://madssj.com/blog/2008/03/19/fun-with-mod_macro/</link> <comments>http://madssj.com/blog/2008/03/19/fun-with-mod_macro/#comments</comments> <pubDate>Wed, 19 Mar 2008 19:36:06 +0000</pubDate> <dc:creator>Mads Sülau Jørgensen</dc:creator> <category><![CDATA[Apache]]></category> <category><![CDATA[Django]]></category> <category><![CDATA[Python]]></category> <category><![CDATA[Work]]></category> <category><![CDATA[coniuro aps]]></category> <category><![CDATA[mod_macro]]></category> <guid
isPermaLink="false">http://swag.dk/blog/2008/03/19/fun-with-mod_macro/</guid> <description><![CDATA[At work we yestoday decided to update our internal url structure for our client test sites, issue management systems and such arround a bit. Seeing as we decided on purchasing a genuine signed ssl wildcard certificate, we needed to change &#8230; <a
href="http://madssj.com/blog/2008/03/19/fun-with-mod_macro/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>At <a
href="http://www.coniuro.dk/" title="Coniuro ApS - we code">work</a> we yestoday decided to update our internal url structure for our client test sites, issue management systems and such arround a bit. Seeing as we decided on purchasing a genuine signed ssl wildcard certificate, we needed to change our url&#8217;s a bit.</p><p><span
id="more-12"></span></p><p>We used to have a url schema consisting of the following components:</p><pre><code>    [dev.|test.]&lt;project-name&gt;.&lt;client-name&gt;.companyname.tld
</code></pre><p>That made for very long url&#8217;s, and furthermore, the url&#8217;s would not be supported by a <code>*.companyname.tld</code>. Based on this infomation, and wanting to create a more generelized, nicer url schema, we choose to cross over to the following schema:</p><pre><code>   [dev-|test-]&lt;project-name&gt;.companyname.tld
</code></pre><p>Which besides from supporting a wildcard ssl certificate just fine, just, well, looks nicer.</p><p>Either way, me beeing in charge of the contents in <code>/etc/</code>, and getting a little sick of growing apache configuration files, I chooose to write some macros to configure our project sites.</p><p>We generally have 2 types of project sites. <a
href="http://www.djangoproject.com/" title="Django - a python web framework for very rapid development, love it!">django</a> based sites, and PHP based sites.</p><p>A typical django apache configuration consists of a VirtualHost and some mod_python settings inside a Location block. Lot&#8217;s of configuration, very little actual diffrence between the configration projects in between.</p><p>An example of a django based application running inside a apache VirtualHost, could look like this:</p><pre><code>    &lt;VirtualHost *:80&gt;
        ServerName test-project.company.tld
        &lt;Location /&gt;
            SetHandler python-program
            PythonHandler django.core.handlers.modpython
            PythonPath "['/path/to/project', '/other/path/to/inject']"
            SetEnv DJANGO_SETTINGS_MODULE project.settings
        &lt;/Location&gt;
        &lt;Location /media/&gt;
            SetHandler none
        &lt;/Location&gt;
        Alias /media/admin/ /path/to/django/contrib/admin/media/
        Alias /media/ /path/to/project/media/
    &lt;/VirtualHost&gt;
</code></pre><p>And the on top of that comes SSL configuration, auth and such. 25 lines of configuration per django site. Now, I really wanted to acomplish two things.</p><ul><li>Make the configuration easier to maintain</li><li>Enable other users to setup sites without knowing the depths of django and <code>mod_python</code></li></ul><p>Now, apache configuration, meet <a
href="http://www.cri.ensmp.fr/~coelho/mod_macro/" title="mod_macro - a configuration macro module for apache2">mod_macro</a>. The solution to my problem was very simple. Create a macro that handles all the django configuration, given 4 parameters. A server name (i.e. the url), the parent directory of the django site and the module name of the site.</p><p>So i started building my macro.</p><pre><code>    &lt;Macro DjangoSite $servername $root $module&gt;
        &lt;VirtualHost *:80&gt;
            ServerName $servername
            &lt;Location /&gt;
                SetHandler python-program
                PythonHandler django.core.handlers.modpython
                PythonPath "['/common/path/to/inject', '$root']"
                SetEnv DJANGO_SETTINGS_MODULE $modulename.settings
            &lt;/Location&gt;
            &lt;Location /media/&gt;
                SetHandler none
            &lt;/Location&gt;
            Alias /media/admin/ /path/to/django/contrib/admin/media/
            Alias /media/ $root/$module/media/
        &lt;/VirtualHost&gt;
    &lt;/Macro&gt;
</code></pre><p><code>mod_macro</code> is really simple, it will do a longest-match search and replace on the macro&#8217;s content. So, if we had a django site in <code>/path/to/djangosite/testsite/</code> the above macro could be used as:</p><pre><code>    Use DjangoSite www.example.org /path/to/djangosite/ testsite
</code></pre><p>Which would expand to:</p><pre><code>    &lt;VirtualHost *:80&gt;
        ServerName www.example.org
        &lt;Location /&gt;
            SetHandler python-program
            PythonHandler django.core.handlers.modpython
            PythonPath "['/common/path/to/inject', '/path/to/djangosite/']"
            SetEnv DJANGO_SETTINGS_MODULE testsite.settings
        &lt;/Location&gt;
        &lt;Location /media/&gt;
            SetHandler none
        &lt;/Location&gt;
        Alias /media/admin/ /path/to/django/contrib/admin/media/
        Alias /media/ /path/to/djangosite/testsite/media/
    &lt;/VirtualHost&gt;
</code></pre><p>Hope you find this infomation a little useful. I actually like looking at our apache configuration file now.</p> ]]></content:encoded> <wfw:commentRss>http://madssj.com/blog/2008/03/19/fun-with-mod_macro/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Asynchronous socket server in python</title><link>http://madssj.com/blog/2008/02/21/asynchronous-socket-server-in-python/</link> <comments>http://madssj.com/blog/2008/02/21/asynchronous-socket-server-in-python/#comments</comments> <pubDate>Thu, 21 Feb 2008 14:39:52 +0000</pubDate> <dc:creator>Mads Sülau Jørgensen</dc:creator> <category><![CDATA[Programming]]></category> <category><![CDATA[Python]]></category> <category><![CDATA[Work]]></category> <category><![CDATA[asynchat]]></category> <category><![CDATA[asyncore]]></category> <category><![CDATA[server]]></category> <category><![CDATA[socket]]></category> <guid
isPermaLink="false">http://swag.dk/blog/2008/02/21/asynchronous-socket-server-in-python/</guid> <description><![CDATA[The code for a very simple asynchronous socket server written in python utilizing the asynchat module. It&#8217;s all in good fun. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 &#8230; <a
href="http://madssj.com/blog/2008/02/21/asynchronous-socket-server-in-python/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>The code for a very simple asynchronous socket server written in python utilizing the asynchat module. It&#8217;s all in good fun.</p><p><span
id="more-8"></span></p><div
class="wp_syntax"><table><tr><td
class="line_numbers"><pre>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
</pre></td><td
class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">asyncore</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">asynchat</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">socket</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Lobby<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">clients</span> = <span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> leave<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, client<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">clients</span>.<span style="color: black;">remove</span><span style="color: black;">&#40;</span>client<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> join<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, client<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">clients</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span>client<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> send_to_all<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> client <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">clients</span>:
            client.<span style="color: black;">push</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Client<span style="color: black;">&#40;</span><span style="color: #dc143c;">asynchat</span>.<span style="color: black;">async_chat</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, conn, lobby<span style="color: black;">&#41;</span>:
        <span style="color: #dc143c;">asynchat</span>.<span style="color: black;">async_chat</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, sock=conn<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">in_buffer</span> = <span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">set_terminator</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;n&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">lobby</span> = lobby
        <span style="color: #008000;">self</span>.<span style="color: black;">lobby</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> collect_incoming_data<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">in_buffer</span> += data
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> found_terminator<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">in_buffer</span>.<span style="color: black;">rstrip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">&quot;QUIT&quot;</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">lobby</span>.<span style="color: black;">leave</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">close_when_done</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">lobby</span>.<span style="color: black;">send_to_all</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">in_buffer</span> + <span style="color: #008000;">self</span>.<span style="color: black;">terminator</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">in_buffer</span> = <span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Server<span style="color: black;">&#40;</span><span style="color: #dc143c;">asynchat</span>.<span style="color: black;">async_chat</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #dc143c;">asynchat</span>.<span style="color: black;">async_chat</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">create_socket</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">socket</span>.<span style="color: black;">AF_INET</span>, <span style="color: #dc143c;">socket</span>.<span style="color: black;">SOCK_STREAM</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">set_reuse_addr</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">bind</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;127.0.0.1&quot;</span>, <span style="color: #ff4500;">12345</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">listen</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">lobby</span> = <span style="color: #008000;">None</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> set_lobby<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, lobby<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">lobby</span> = lobby
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> handle_accept<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        sock, addr = <span style="color: #008000;">self</span>.<span style="color: black;">accept</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        client = Client<span style="color: black;">&#40;</span>sock, <span style="color: #008000;">self</span>.<span style="color: black;">lobby</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    lobby = Lobby<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    server = Server<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    server.<span style="color: black;">set_lobby</span><span style="color: black;">&#40;</span>lobby<span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">asyncore</span>.<span style="color: black;">loop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div><p>Booting the server is a matter of <code>python echoserver.py</code>.</p><p>After that, telnet can be used to induce messages, as such:<pre>
$ telnet localhost 12345
foo
foo</pre>The same will be true for any amount of clients. This is so simple. Love it.</p> ]]></content:encoded> <wfw:commentRss>http://madssj.com/blog/2008/02/21/asynchronous-socket-server-in-python/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> </channel> </rss>
