<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-524230429673765509</id><updated>2011-10-10T06:38:23.905-07:00</updated><category term='jython unicode unicodeblock'/><category term='python python3.1 UTF-8 Unicode Arabic'/><category term='#jython #java.util.Properties'/><category term='#regularexpressions #jython #ironpython #python #unicode'/><category term='openbsd python'/><category term='#polygonoffset #python'/><category term='python openbsd DoubleAssociation dictionarystructure'/><category term='#Python'/><category term='geology'/><category term='python pythonlogos'/><category term='#povray #python #pysanky'/><category term='#jython #unicode #regularexpressions #python'/><category term='Python Python3 Unicode Unicodenormalization Unicodedecomposition unicodedatamodule Umlaut PyconUS'/><category term='#jython #JTS #geometry'/><category term='#IronPython #unicode #python #.NET'/><category term='#jython #java #clone'/><category term='#jython #jts #voronoi'/><category term='BSDA'/><category term='#python #unicodeidentifiers #arabic #python3.1 #RTL'/><category term='#python3.1 #stringformatting #mining'/><category term='Python3.x Python unittest bytes'/><category term='python python3.1 UTF-8 Unicode'/><category term='#python2.6 #__future__ #python3.1 #stringformatting #transamerica'/><category term='pyconus python3 robots'/><category term='maintainablecode'/><category term='python'/><category term='IPv4'/><category term='netmask'/><category term='#Python3.1 #Unicode #UTF-8 #bytes #OrderedDict'/><category term='#polygonoffset #python #povray #pysanky'/><category term='freebsd python'/><category term='#Unicode'/><category term='#python #pythonlogos'/><category term='pyrite'/><category term='#PythonWiki'/><category term='#python #unicode #utf #armenian #russian #python3.1'/><category term='#2Dgeometry #python #infiniteslope'/><category term='#JavaScript #ZenofPython'/><category term='#jts #wkt #jython'/><category term='python python3 Unicode unicodedata normalization decomposition malayalam'/><category term='python python3 Unicode unicodedata Telugu Hindi virama'/><category term='#JavaScript #ZenofPython #W3Cvalidator'/><category term='#python #lao #unicode #python3.1'/><category term='#polygonbuffering #jts #jython'/><category term='#python #povray #pysanky'/><category term='#ArabicLanguage'/><category term='#python #java #jython #arabic #RTL'/><category term='#pyeuclid #polygonoffset #python'/><category term='#XMLcharactercodes'/><category term='#jython #joda-time'/><category term='python python3 foreignlanguage pythoncommunity'/><category term='#pycon-us #pycon #unicode #python #python3.1 #unicodedata'/><category term='Python #unicode #python3.1 #UnicodeDecodeError'/><category term='#inkscape #povray #svg #python #pysanky'/><category term='#pysanky #povray #python'/><category term='#svg #xml #pythonlogo #python'/><category term='#travel #pycon #pycon-us #conferences #foss'/><category term='#jython #python #java #regularexpressions'/><title type='text'>pyright</title><subtitle type='html'>Python programming language related posts.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-5340348472393325520</id><published>2011-07-03T15:00:00.000-07:00</published><updated>2011-07-03T15:00:16.685-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#pyeuclid #polygonoffset #python'/><title type='text'>pyeuclid, vector math, and polygon offset</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I had previously done a series of posts on polygon offset intended as a practical guide for accomplishing the task quickly.&amp;nbsp; Some kind folks pointed out that I was making things considerably harder than necessary by using trigonometric functions when vector math would be easier and less error prone.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;A coworker lent me his Java code that does polygon offset.&amp;nbsp; I translated it into python (2.5) using the &lt;a href="http://code.google.com/p/pyeuclid/"&gt;pyeuclid&lt;/a&gt; module:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import euclid as eu&lt;br /&gt;import copy&lt;br /&gt;&lt;br /&gt;OFFSET = 0.15&lt;br /&gt;&lt;br /&gt;# coordinates&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # PT 1&lt;br /&gt;MONASTERY = [(1.1, 0.75),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # PT 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1.2, 1.95),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . . .&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # PT 21&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1.1, 0.75)]&lt;br /&gt;&lt;br /&gt;def scaleadd(origin, offset, vectorx):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; From a vector representing the origin,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; a scalar offset, and a vector, returns&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; a Vector3 object representing a point&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset from the origin.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Multiply vectorx by offset and add to origin.)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; multx = vectorx * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return multx + origin&lt;br /&gt;&lt;br /&gt;def getinsetpoint(pt1, pt2, pt3):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Given three points that form a corner (pt1, pt2, pt3),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; returns a point offset distance OFFSET to the right&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; of the path formed by pt1-pt2-pt3.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt1, pt2, and pt3 are two tuples.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Returns a Vector3 object.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; origin = eu.Vector3(pt2[0], pt2[1], 0.0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v1 = eu.Vector3(pt1[0] - pt2[0],&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt1[1] - pt2[1], 0.0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v1.normalize()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v2 = eu.Vector3(pt3[0] - pt2[0],&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt3[1] - pt2[1], 0.0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v2.normalize()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v3 = copy.copy(v1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v1 = v1.cross(v2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v3 += v2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if v1.z &amp;lt; 0.0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; retval = scaleadd(origin, -OFFSET, v3)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; retval = scaleadd(origin, OFFSET, v3)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return retval&lt;br /&gt;&lt;br /&gt;polyinset = []&lt;br /&gt;lenpolygon = len(MONASTERY)&lt;br /&gt;i = 0&lt;br /&gt;poly = MONASTERY&lt;br /&gt;while i &amp;lt; lenpolygon - 2:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyinset.append(getinsetpoint(poly[i],&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; poly[i + 1], poly[i + 2]))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; i += 1&lt;br /&gt;polyinset.append(getinsetpoint(poly[-2],&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; poly[0], poly[1]))&lt;br /&gt;polyinset.append(getinsetpoint(poly[0],&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; poly[1], poly[2]))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The result:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-DYR16s3u0iY/ThDk6cjpMhI/AAAAAAAAAPA/LCBwlEAXxZQ/s1600/monasteryoffsetII.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-DYR16s3u0iY/ThDk6cjpMhI/AAAAAAAAAPA/LCBwlEAXxZQ/s320/monasteryoffsetII.png" width="298" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-5340348472393325520?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/5340348472393325520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/07/pyeuclid-vector-math-and-polygon-offset.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/5340348472393325520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/5340348472393325520'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/07/pyeuclid-vector-math-and-polygon-offset.html' title='pyeuclid, vector math, and polygon offset'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-DYR16s3u0iY/ThDk6cjpMhI/AAAAAAAAAPA/LCBwlEAXxZQ/s72-c/monasteryoffsetII.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-464026790529695395</id><published>2011-04-02T10:43:00.000-07:00</published><updated>2011-04-02T10:43:51.207-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#2Dgeometry #python #infiniteslope'/><title type='text'>2D geometry + infinite and zero slopes</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;My &lt;a href="http://pyright.blogspot.com/2011/03/polygon-offset-revisited.html"&gt;last post&lt;/a&gt; dealt with a similar subject, but it didn't quite tell the whole story.&amp;nbsp; No sooner had I posted it and attempted to implement it in a project, I ran into a problem.&amp;nbsp; Granted, it was on a Java GUI in Java code (not a Python project) - but the concept is universal.&amp;nbsp; When is a floating point number small enough that another mathematical operation on it will take it to zero or to the realm of infinity?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Python (I'm using CPython 2.5) is pretty forgiving in this sense.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; 1.0/1.0e-308&lt;br /&gt;1e+308&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; 1.0/1.0e-309&lt;br /&gt;inf&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;There comes a point when even a representable number equals zero.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; 0.0 == 1.0e-10000&lt;br /&gt;True&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;With some trigonometric functions from the math module:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; math.atan2(1.0, 0.0000000000000001)&lt;br /&gt;1.5707963267948966&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; 2 * _&lt;br /&gt;3.1415926535897931&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; _ == math.pi&lt;br /&gt;True&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; math.cos(1.0000000000000000001e-250)&lt;br /&gt;1.0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The equation for the slope of a line in the Cartesian plane is (y2 - y1)/(x2 - x1) where y2, y1, x2, and x1 are the x and y coordinates of the enpoints of the line.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;One way I've handled the infinite slope problem in the past is by setting a value as infinity:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# one million &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; INFINITY = 1.0e+6&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; slope = 1000000.0&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; slope == INFINITY&lt;br /&gt;True&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;This works sometimes, but it's not totally safe from error.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;What I ended up doing this time was checking for zero or near zero values in the numerator and denominator of the slope equation.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;NEARZERO = 1.0e-6&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;if math.abs(y2 - y1) &amp;lt; NEARZERO:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # set y2 == y1 or vice versa&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;nbsp; # and proceed with the calculations&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # for a zero slope&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;if math.abs(x2 - x1) &amp;lt; NEARZERO:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # set x2 == x1 or vice versa&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;nbsp; # and proceed with the calculations&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # for an infinite slope&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;This solved my problem in the sense that it gave reasonable results that served the problem domain well.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Lastly, you could use a similar method to check for duplicate points.&amp;nbsp; If both numerator and denominator of the slope equation are near zero, the line segment is too small and the point should be done away with:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;if (math.abs(y2 - y1) &amp;lt; NEARZERO and&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; math.abs(x2 - x1) &amp;lt; NEARZERO):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # duplicate point&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # delete it&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Disclaimer:&amp;nbsp; I am not a floating point math expert.&amp;nbsp; There may be better solutions out there.&amp;nbsp; These are a couple practical ones that have worked for me.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-464026790529695395?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/464026790529695395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/04/2d-geometry-infinite-and-zero-slopes.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/464026790529695395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/464026790529695395'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/04/2d-geometry-infinite-and-zero-slopes.html' title='2D geometry + infinite and zero slopes'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-4674268197242158112</id><published>2011-03-27T13:36:00.000-07:00</published><updated>2011-03-27T13:36:17.585-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#polygonoffset #python'/><title type='text'>Polygon Offset Revisited</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I had previously written a &lt;a href="http://pyright.blogspot.com/2011/02/simple-polygon-offset.html"&gt;post concerning polygon offset&lt;/a&gt; that was incomplete in its scope.&amp;nbsp; Specifically, it dodged the problem of horizontal and vertical lines in polygons.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Since then I've had to confront this problem again.&amp;nbsp; Shown below is the code I'm using for the more complete solution.&amp;nbsp; It's a bit verbose, but it works.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import math&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def calcoffsetpoint(pt1, pt2, offset):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get a point offset from the line&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; segment pt1-pt2 distance "offset".&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return two tuple of coordinates.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta = math.atan2(pt2[1] - pt1[1],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt2[0] - pt1[0])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta += math.pi/2.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (pt1[0] - math.cos(theta) * offset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt1[1] - math.sin(theta) * offset)&lt;br /&gt;&lt;br /&gt;def getoffsetintercept(pt1, pt2, m, offset):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; From points pt1 and pt2 defining a line&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; in the Cartesian plane, the slope of the &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; line m, and an offset distance,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; calculates the y intercept of&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; the new line offset from the original.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x, y = calcoffsetpoint(pt1, pt2, offset)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return y - m * x&lt;br /&gt;&lt;br /&gt;def getpt(pt1, pt2, pt3, offset):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Gets intersection point of the two&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lines defined by pt1, pt2, and pt3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset is the distance to offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; the point from the polygon.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Valid for lines with slopes other &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; than zero or infinity.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Returns a two tuple of coordinates.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # get first offset intercept&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m = (pt2[1] - pt1[1])/(pt2[0] - pt1[0])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; boffset = getoffsetintercept(pt1, pt2, m, offset)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # get second offset intercept&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mprime = (pt3[1] - pt2[1])/(pt3[0] - pt2[0])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; boffsetprime = getoffsetintercept(pt2, pt3, mprime, offset)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # get intersection of two offset lines&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; newx = (boffsetprime - boffset)/(m - mprime)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; newy = m * newx + boffset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return newx, newy&lt;br /&gt;&lt;br /&gt;def getslopeandintercept(pt1, pt2, offset):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Gets the slope and the intercept of the&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset line.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Result returned as a two tuple.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m = (pt2[1] - pt1[1])/(pt2[0] - pt1[0])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = getoffsetintercept(pt1, pt2, m, offset)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return m, b&lt;br /&gt;&lt;br /&gt;def getoffsetcornerpoint(pt1, pt2, pt3, offset):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Gets intersection point of the two&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lines defined by pt1, pt2, and pt3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset is the distance to offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; the point from the polygon.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Returns a two tuple of coordinates.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # starting out with horizontal line&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pt2[1] - pt1[1]) == 0.0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ycoord = pt1[1] - math.cos(math.atan2(0.0, pt2[0] - pt1[0])) * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # a vertical line follows&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pt3[0] - pt2[0]) == 0.0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xcoord = pt2[0] + math.sin(math.atan2(pt3[1] - pt2[1], 0.0)) * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # a sloped line follows&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m, offsetintercept = getslopeandintercept(pt2, pt3, offset)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # calculate for x with ycoord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xcoord = (ycoord - offsetintercept)/m&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # starting out with a vertical line&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pt2[0] - pt1[0]) == 0.0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xcoord = pt1[0] + math.sin(math.atan2(pt2[1] - pt1[1], 0.0)) * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # a horizontal line follows&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pt3[1] - pt2[1]) == 0.0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ycoord = pt2[1] - math.cos(math.atan2(0.0, pt3[0] - pt2[0])) * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # a sloped line follows&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m, offsetintercept = getslopeandintercept(pt2, pt3, offset)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # calculate for y with xcoord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ycoord = m * xcoord + offsetintercept&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # starting out with sloped line&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pt2[1] - pt1[1]) != 0.0 and (pt2[0] - pt1[0]) != 0.0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # if second line is horizontal&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pt3[1] - pt2[1]) == 0.0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ycoord = pt2[1] - math.cos(math.atan2(0.0, pt3[0] - pt2[0])) * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m, offsetintercept = getslopeandintercept(pt1, pt2, offset)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # calculate for x with y coord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xcoord = (ycoord - offsetintercept)/m&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # if second line is vertical&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif (pt3[0] - pt2[0]) == 0.0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xcoord = pt2[0] + math.sin(math.atan2(pt3[1] - pt2[1], 0.0)) * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m, offsetintercept = getslopeandintercept(pt1, pt2, offset)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # solve for y with x coordinate&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ycoord = m * xcoord + offsetintercept&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # if both lines are sloped&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xcoord, ycoord = getpt(pt1, pt2, pt3, offset)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return xcoord, ycoord&lt;br /&gt;&lt;br /&gt;def offsetpolygon(polyx, offset):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Offsets a clockwise list of coordinates&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyx distance offset to the inside of&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; the polygon.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Returns list of offset points.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyy = []&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # need three points at a time&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for counter in range(0, len(polyx) - 3):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # get first offset intercept&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt = getoffsetcornerpoint(polyx[counter],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyx[counter + 1],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyx[counter + 2],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # append new point to polyy&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyy.append(pt)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # last three points&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt = getoffsetcornerpoint(polyx[-3], polyx[-2], polyx[-1], offset)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyy.append(pt)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt = getoffsetcornerpoint(polyx[-2], polyx[-1], polyx[0], offset)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyy.append(pt)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt = getoffsetcornerpoint(polyx[-1], polyx[0], polyx[1], offset)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyy.append(pt)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return polyy&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I used this polygon to test it.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-zE_n9nI3Jds/TY-bwYhcqRI/AAAAAAAAAO8/Suoyxn4qplA/s1600/boxyoffset.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="246" src="http://1.bp.blogspot.com/-zE_n9nI3Jds/TY-bwYhcqRI/AAAAAAAAAO8/Suoyxn4qplA/s320/boxyoffset.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;This is a fairly simple geometric problem, but it can be confusing.&amp;nbsp; Hopefully this will save someone the trouble of working through a solution.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Notes:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1) If you're using Python 2.x, feed your coordinates in as floats.&amp;nbsp; This will ensure the absence of integer division, which often yields zeros, which in turn yields ZeroDivision errors.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;2) The polygon fed to the offsetpolygon function should not have a closing point.&amp;nbsp; The closing point will cause ZeroDivision errors.&amp;nbsp; Instead, append the point before drawing the polygon in gnuplot or some other plotting tool. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-4674268197242158112?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/4674268197242158112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/03/polygon-offset-revisited.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/4674268197242158112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/4674268197242158112'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/03/polygon-offset-revisited.html' title='Polygon Offset Revisited'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-zE_n9nI3Jds/TY-bwYhcqRI/AAAAAAAAAO8/Suoyxn4qplA/s72-c/boxyoffset.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-4514490802623488198</id><published>2011-03-24T19:39:00.000-07:00</published><updated>2011-03-24T19:39:24.578-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#jython #joda-time'/><title type='text'>jython + joda-time</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;a href="http://joda-time.sourceforge.net/index.html"&gt;joda-time&lt;/a&gt; is a date-time library written in Java.&amp;nbsp; It has advantages over Java's built in time utilities in terms of power and ease of use.&amp;nbsp; It has some functionality that Python's own datetime library does not.&amp;nbsp; Here is a sampling from within jython:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[OpenJDK Client VM (Sun Microsystems Inc.)] on java1.7.0-internal&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import sys&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; # make sure the jar is in the CLASSPATH&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; sys.path.append('/home/carl/Downloads/joda-time-1.6.2/joda-time-1.6.2.jar')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from org.joda import time as joda&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; rightnow = joda.DateTime()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; rightnow&lt;br /&gt;2011-03-24T19:54:45.544-06:00&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; rightnow.getZone()&lt;br /&gt;America/Edmonton&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; # I'm actually in New Mexico - close enough&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; rightnow.dayOfWeek().getAsText()&lt;br /&gt;u'Thursday'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; rightnow.monthOfYear().getAsText()&lt;br /&gt;u'March'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; rightnow.getDayOfMonth()&lt;br /&gt;24&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; # days are one indexed along with months&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; # a date from the past&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; declofindependence = joda.DateTime(1776, 7, 4, 0, 0, 0, 0)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The Period object allows you to count down to dates in the future of count from dates in the past in terms of years, months, and days:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; americasage = joda.Period(declofindependence, rightnow)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; americasage.getYears()&lt;br /&gt;234&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; americasage.getMonths()&lt;br /&gt;8&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; americasage.getWeeks()&lt;br /&gt;2&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; americasage.getDays()&lt;br /&gt;6&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;joda-time can handle dates far into the future as well as those in the far distant past:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; farfuture = joda.DateTime(10000, 1, 1, 1, 0, 0, 0)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; farfuture.getYear()&lt;br /&gt;10000&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; farfuture&lt;br /&gt;10000-01-01T01:00:00.000-07:00&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Like most things Java, joda-time can be a bit more verbose than its Python equivalent.&amp;nbsp; Still, the ability to get dates beyond 9999 and some of the functionality may make it well worth the trouble.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-4514490802623488198?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/4514490802623488198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/03/jython-joda-time.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/4514490802623488198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/4514490802623488198'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/03/jython-joda-time.html' title='jython + joda-time'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-1843853604028821774</id><published>2011-03-19T20:15:00.000-07:00</published><updated>2011-03-19T20:15:19.563-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#jts #wkt #jython'/><title type='text'>WKT (Well Known Text) + JTS Topology + jython</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The last few posts have dealt with the &lt;a href="http://www.vividsolutions.com/jts/jtshome.htm"&gt;JTS Topology library&lt;/a&gt;.&amp;nbsp; This one will wrap up that topic with a method for converting JTS's Geometry objects to and from text, WKT.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Well-known_text"&gt;WKT&lt;/a&gt; is a standard of the Open Geospatial Consortium (&lt;a href="http://www.opengeospatial.org/ogc"&gt;OGC&lt;/a&gt;).&amp;nbsp; Objects expressed in WKT are not much different than their string representations in JTS.&amp;nbsp; Below is a code example of working back and forth between JTS and WKT.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Jython 2.5.2 (Release_2_5_2:7206, Mar 2 2011, 23:12:06)&lt;br /&gt;[OpenJDK Client VM (Sun Microsystems Inc.)] on java1.7.0-internal&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import sys&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; sys.path.append('/home/carl/Downloads/jts/lib/jts-1.11.jar')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from com.vividsolutions.jts.geom import GeometryFactory&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from com.vividsolutions.jts.geom import Coordinate&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from com.vividsolutions.jts.geom import LinearRing&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from com.vividsolutions.jts.io import WKTWriter&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from com.vividsolutions.jts.io import WKTReader&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; coord1 = Coordinate(0, 0)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; coord2 = Coordinate(0, 1)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; coord3 = Coordinate(1, 1)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; coord4 = Coordinate(1, 0)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; coord5 = Coordinate(0, 0)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; coords = [coord1, coord2, coord3, coord4, coord5]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from com.vividsolutions.jts.geom.impl import CoordinateArraySequence&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; cas = CoordinateArraySequence(coords)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; gf = GeometryFactory()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; lr = LinearRing(cas, gf)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; asquare = gf.createPolygon(lr, None)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; f = open('wkttest.xml', 'w')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; wktwriter = WKTWriter()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; # this is just my own personal preference&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; # it is inefficient for storage, but&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; # sometimes easier on the eyes&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; wktwriter.setMaxCoordinatesPerLine(1)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; text = wktwriter.writeFormatted(asquare)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; f.write(text)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; f.close()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print text&lt;br /&gt;POLYGON ((0 0,&lt;br /&gt;&amp;nbsp; 0 1,&lt;br /&gt;&amp;nbsp; 1 1,&lt;br /&gt;&amp;nbsp; 1 0,&lt;br /&gt;&amp;nbsp; 0 0))&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; wktreader = WKTReader()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; f = open('wkttest.xml', 'r')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; text = f.read()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; asquare2 = wktreader.read(text)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; asquare2&lt;br /&gt;POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;It's fairly easy to store JTS Geometry objects in human readable (WKT) format and reuse them.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;There is a good bit more to WKT than what's shown here.&amp;nbsp; This was just a simple example for getting started.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;WKB (Well Known Binary) is also available in JTS - this is used for efficient storage of Geometry objects, mainly in databases.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;JTS also has a WKTFileReader class which can read in multiple geometries from a file.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-1843853604028821774?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/1843853604028821774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/03/wkt-well-known-text-jts-topology-jython.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/1843853604028821774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/1843853604028821774'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/03/wkt-well-known-text-jts-topology-jython.html' title='WKT (Well Known Text) + JTS Topology + jython'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-1063111018195923550</id><published>2011-03-18T19:45:00.000-07:00</published><updated>2011-03-18T19:49:51.985-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#polygonbuffering #jts #jython'/><title type='text'>Polygon Buffering with JTS Topology and jython</title><content type='html'>&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Previously, I had done a &lt;a href="http://pyright.blogspot.com/2011/02/simple-polygon-offset.html"&gt;post&lt;/a&gt; regarding polygon offset.&amp;nbsp; It turns out that &lt;a href="http://www.vividsolutions.com/jts/jtshome.htm"&gt;JTS Topology&lt;/a&gt; has polygon buffering capability.&amp;nbsp; I wanted to try this out and compare it to my results from the polygon offset post.&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;As with most things with a library like JTS, the software does most of the work for you:&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import sys&lt;br /&gt;# path to jar into CLASSPATH&lt;br /&gt;sys.path.append('/home/carl/Downloads/jts/lib/jts-1.11.jar')&lt;br /&gt;&lt;br /&gt;from com.vividsolutions.jts.geom import Coordinate&lt;br /&gt;from com.vividsolutions.jts.geom import GeometryFactory&lt;br /&gt;# LinearRing is for the creation of the Polygon&lt;br /&gt;from com.vividsolutions.jts.geom import LinearRing&lt;br /&gt;# CoordinateSequenceArray is for the&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# creation of the LinearRing&lt;br /&gt;from com.vividsolutions.jts.geom.impl import CoordinateArraySequence&lt;br /&gt;# CAP_ROUND is for the Polygon.buffer operation&lt;br /&gt;from com.vividsolutions.jts.operation.buffer.BufferOp import CAP_ROUND&lt;br /&gt;&lt;br /&gt;# coordinates&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # PT 1&lt;br /&gt;MONASTERY = [(1.1, 0.75),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # PT 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1.2, 1.95),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # PT 3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1.9, 1.96),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # PT 21&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1.1, 0.75)]&lt;br /&gt;&lt;br /&gt;gf = GeometryFactory()&lt;br /&gt;coords = [Coordinate(*coord) for coord in MONASTERY]&lt;br /&gt;cas = CoordinateArraySequence(coords)&lt;br /&gt;lr = LinearRing(cas, gf)&lt;br /&gt;polyx = gf.createPolygon(lr, None)&lt;br /&gt;&lt;br /&gt;# offset of 0.15 inward&lt;br /&gt;# rounded edges&lt;br /&gt;# 10 points per quarter circle of rounded edges&lt;br /&gt;polyinset = polyx.buffer(-0.15, 10, CAP_ROUND)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The result is shown below:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-2KX2li0VOaY/TYQUjkYOWXI/AAAAAAAAAO0/7O2H3Wc80wc/s1600/monasteryoffset.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://lh5.googleusercontent.com/-2KX2li0VOaY/TYQUjkYOWXI/AAAAAAAAAO0/7O2H3Wc80wc/s320/monasteryoffset.png" width="299" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The rounded edges give an entirely different look to the shape. My version is shown&lt;a href="http://pyright.blogspot.com/2011/02/simple-polygon-offset.html"&gt;&lt;/a&gt; below:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-WFXZToYKQBM/TYQVX7VXbrI/AAAAAAAAAO4/mGh0WJoNhbQ/s1600/monasteryeggsmooth.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-WFXZToYKQBM/TYQVX7VXbrI/AAAAAAAAAO4/mGh0WJoNhbQ/s1600/monasteryeggsmooth.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I'm glad I did the egg the way I did it (it looks more realistic).&amp;nbsp; Nonetheless, the polygon buffering capability of JTS is a useful tool, particularly for calculating offsets and distances for scientific or geographic purposes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Notes:&amp;nbsp; &lt;a href="http://pypi.python.org/pypi/Shapely"&gt;Shapely&lt;/a&gt; is a Python package (CPython) with much of the same functionality as JTS.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-1063111018195923550?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/1063111018195923550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/03/polygon-buffering-with-jts-topology-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/1063111018195923550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/1063111018195923550'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/03/polygon-buffering-with-jts-topology-and.html' title='Polygon Buffering with JTS Topology and jython'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-2KX2li0VOaY/TYQUjkYOWXI/AAAAAAAAAO0/7O2H3Wc80wc/s72-c/monasteryoffset.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-6442977405005108018</id><published>2011-03-17T19:43:00.000-07:00</published><updated>2011-03-17T19:43:44.907-07:00</updated><title type='text'>Clipping Voronoi Polygons with JTS Topology and jython</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Following up on the &lt;a href="http://pyright.blogspot.com/2011/03/jython-jts-topology-and-voronoi.html"&gt;last post&lt;/a&gt; on Voronoi diagrams and the &lt;a href="http://www.vividsolutions.com/jts/jtshome.htm"&gt;JTS topology library&lt;/a&gt;, I will show clipping of the Voronoi polygons with another polygon (a polygonal bounding region) in this post.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The plot below is what we have currently, a Voronoi diagram (with points) clipped along a rectangular boundary:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-V51EPZtELcE/TYLCTxd2MQI/AAAAAAAAAOo/c88I53Dgt80/s1600/voronoisnapshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="244" src="https://lh4.googleusercontent.com/-V51EPZtELcE/TYLCTxd2MQI/AAAAAAAAAOo/c88I53Dgt80/s320/voronoisnapshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Shown below is what I'd like to accomplish - clipping the red polygons with the blue surrounding one:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-H1-aqHifuBg/TYLC6qrfKVI/AAAAAAAAAOs/8k97F-uYbN4/s1600/voronoisnapshotwboundingpoly.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="243" src="https://lh4.googleusercontent.com/-H1-aqHifuBg/TYLC6qrfKVI/AAAAAAAAAOs/8k97F-uYbN4/s320/voronoisnapshotwboundingpoly.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Here is the code, continued from the &lt;a href="http://pyright.blogspot.com/2011/03/jython-jts-topology-and-voronoi.html"&gt;last post&lt;/a&gt;:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# because JTS can handle holes and "donuts", it&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# has a LinearRing structure for constructing&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# polygons&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;from com.vividsolutions.jts.geom import LinearRing&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# the LinearRing requires a CoordinateArraySequence&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# (it will not accept a list)&lt;br /&gt;from com.vividsolutions.jts.geom.impl import CoordinateArraySequence&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;boundingcoords = [(10, 0), (2, 0),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (-2, 4), (2, 12),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (10, 6), (10, 0)]&lt;br /&gt;boundingcoords = [Coordinate(*coord) for coord in boundingcoords]&lt;br /&gt;casboundingcoords = CoordinateArraySequence(boundingcoords)&lt;br /&gt;lr = LinearRing(casboundingcoords, geomfactx)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# None here fills in the spot where any inner rings&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# would be in the polygon&lt;br /&gt;boundingpoly = geomfactx.createPolygon(lr, None)&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;newpolygons = []&lt;br /&gt;numpolygons = diagramx.getNumGeometries()&lt;br /&gt;for numx in range(numpolygons):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; newpolygons.append(diagramx.getGeometryN(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numx).intersection(boundingpoly))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;And the result:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-Pw31INGVp40/TYLEL6bYMcI/AAAAAAAAAOw/8ojWaJHA3Mg/s1600/voronoisnapshotclipped.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="245" src="https://lh6.googleusercontent.com/-Pw31INGVp40/TYLEL6bYMcI/AAAAAAAAAOw/8ojWaJHA3Mg/s320/voronoisnapshotclipped.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Note:&amp;nbsp; it is possible to get more than one polygon as the result of each intersection.&amp;nbsp; Through visual inspection I determined there would only be one polygon per intersection with the bounding area and structured my list (newpolygons) accordingly.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-6442977405005108018?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/6442977405005108018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/03/clipping-voronoi-polygons-with-jts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/6442977405005108018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/6442977405005108018'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/03/clipping-voronoi-polygons-with-jts.html' title='Clipping Voronoi Polygons with JTS Topology and jython'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/-V51EPZtELcE/TYLCTxd2MQI/AAAAAAAAAOo/c88I53Dgt80/s72-c/voronoisnapshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-8195103055524734899</id><published>2011-03-15T19:48:00.000-07:00</published><updated>2011-03-16T14:52:34.411-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#jython #jts #voronoi'/><title type='text'>jython, JTS Topology, and Voronoi Diagrams</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;span id="goog_1749463605"&gt;&lt;/span&gt;Last time&lt;span id="goog_1749463606"&gt;&lt;/span&gt;&lt;/a&gt; I barely scratched the surface of the JTS library.&amp;nbsp; As it turns out, through ignorance I made a few things harder than they needed to be.&amp;nbsp; The GeometryFactory class is quite versatile and has a number of methods for creating objects from simple Coordinate objects.&amp;nbsp; In the example below, I've managed to create a clipped &lt;a href="http://en.wikipedia.org/wiki/Voronoi_diagram"&gt;Voronoi&lt;/a&gt; diagram without too much code or difficulty.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import sys&lt;br /&gt;# this line will be different depending on where&lt;br /&gt;# the jts jar is stored and may be unnecessary if&lt;br /&gt;# the jar is in your CLASSPATH&lt;br /&gt;sys.path.append('/home/carl/Downloads/jts/lib/jts-1.11.jar')&lt;br /&gt;&lt;br /&gt;from com.vividsolutions.jts.geom import Coordinate&lt;br /&gt;from com.vividsolutions.jts.geom import GeometryFactory&lt;br /&gt;from com.vividsolutions.jts.triangulate import VoronoiDiagramBuilder&lt;br /&gt;from com.vividsolutions.jts.geom import Envelope&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;# first some coordinates&lt;br /&gt;coord1 = Coordinate(5, 7)&lt;br /&gt;coord2 = Coordinate(3, 6)&lt;br /&gt;coord3 = Coordinate(1, 4)&lt;br /&gt;coord4 = Coordinate(2, 5)&lt;br /&gt;coord5 = Coordinate(4, 2)&lt;br /&gt;coord6 = Coordinate(7, 2)&lt;br /&gt;coord7 = Coordinate(5, 5)&lt;br /&gt;coord8 = Coordinate(2, 6)&lt;br /&gt;coord5 = Coordinate(4, 2)&lt;br /&gt;coords = [coord1, coord2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; coord3, coord4,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; coord5, coord6,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; coord7, coord8]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# the handy GeometryFactory&lt;br /&gt;geomfactx = GeometryFactory()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# a MultiPoint Geometry object&lt;br /&gt;mp = geomfactx.createMultiPoint(coords)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# the diagram builder class&lt;br /&gt;vdb = VoronoiDiagramBuilder()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# it would be nice to clip the&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# diagram with a rectangle;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# this is what the Envelope&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# object is for&lt;br /&gt;lowerleft = Coordinate(0, 0)&lt;br /&gt;upperright = Coordinate(8, 8)&lt;br /&gt;env = Envelope(lowerleft, upperright)&lt;br /&gt;vdb.setClipEnvelope(env)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# load our sites (points) from the&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# MultiPoint object&lt;br /&gt;vdb.setSites(mp)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# this is where the builder object clips the&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# the polygons with the Envelope rectangle&lt;br /&gt;diagramx = vdb.getDiagram(geomfactx)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;print 'Number of polygons = %d' % diagramx.getNumGeometries()&lt;br /&gt;polygonx = diagramx.getGeometryN(0)&lt;br /&gt;print 'One polygon:'&lt;br /&gt;for coordsetx in polygonx.getCoordinates():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print coordsetx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Output:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Number of polygons = 8&lt;br /&gt;One polygon:&lt;br /&gt;(-5.0, -4.0, NaN)&lt;br /&gt;(-5.0, 8.25, NaN)&lt;br /&gt;(0.5, 5.5, NaN)&lt;br /&gt;(2.7, 3.3, NaN)&lt;br /&gt;(-2.166666666666666, -4.0, NaN)&lt;br /&gt;(-5.0, -4.0, NaN)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;There's more that can be done here (for instance, clipping the polygons with a non-rectangular shape).&amp;nbsp; As was true of the last post, this is just a small fraction of what the JTS Topology library can do.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-8195103055524734899?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/8195103055524734899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/03/jython-jts-topology-and-voronoi.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8195103055524734899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8195103055524734899'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/03/jython-jts-topology-and-voronoi.html' title='jython, JTS Topology, and Voronoi Diagrams'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-920019964857367591</id><published>2011-03-13T18:52:00.000-07:00</published><updated>2011-03-13T18:52:33.227-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#jython #JTS #geometry'/><title type='text'>jython + the JTS geometry library</title><content type='html'>&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;My favorite library for dealing with two dimensional points, lines, and polygons is &lt;a href="http://www.j-raedler.de/projects/Polygon/"&gt;Polygon by Jörg Rädler&lt;/a&gt;.&amp;nbsp; In a Java/jython environment, though, that's not available.&amp;nbsp; This led me to try my hand at &lt;a href="http://www.vividsolutions.com/jts/JTSHome.htm"&gt;JTS&lt;/a&gt;.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;Greg Corradini has a &lt;a href="http://geoscriptblog.blogspot.com/2010/06/unwrapped-jts-with-python.html"&gt;post&lt;/a&gt; that highlights JTS use with jython and &lt;a href="https://github.com/jdeolive/geoscript-py"&gt;geoscript&lt;/a&gt;.&amp;nbsp; His overview was very helpful, but I wanted to get to know JTS more thoroughly.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;The first thing I came up against when using JTS was the documentation.&amp;nbsp; It's all javadocs.&amp;nbsp; This isn't necessarily a bad thing, but, along with the library's java-centric design, it takes a little getting used to.&amp;nbsp; If concepts like abstract class, iterface, extending, and implementing don't immediately ring a bell to the user, use of the javadocs will make them clear over time.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;That shouldn't discourage us, though.&amp;nbsp; Let's fire up the interpreter and try something simple.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;Jython 2.5.2 (Release_2_5_2:7206, Mar 2 2011, 23:12:06)&lt;br /&gt;[OpenJDK Client VM (Sun Microsystems Inc.)] on java1.7.0-internal&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import sys&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; sys.path.append('/home/carl/Downloads/jts/lib/jts-1.11.jar')&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;I usually store things I'm testing out in my Downloads folder (I'm using KDE on OpenBSD).&amp;nbsp; This may not be the best practice.&amp;nbsp; In any case, to import from jts I need access to the jar in my sys.path.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;Making a Point object in JTS in a bit complicated.&amp;nbsp; There are Coordinate objects and there are Point objects.&amp;nbsp; The Coordinate is a more basic class with less functionality than the Point class.&amp;nbsp; Point inherits from the abstract class Geometry.&amp;nbsp; This leads it to have a number of methods, some meaningless, like convexHull.&amp;nbsp; Shown below is the process required to make a Point object.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; from com.vividsolutions.jts.geom import Point&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from com.vividsolutions.jts.geom import GeometryFactory&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from com.vividsolutions.jts.geom.impl import CoordinateArraySequence&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; # get CoordinateArraySequence of size one&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; cas = CoordinateArraySequence(1)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; factoryx = GeometryFactory()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; ptx = Point(cas, factoryx)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;We have a Point object.&amp;nbsp; A couple explanatory notes:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;1) the documentation for the default GeometryFactory reads thus:&amp;nbsp; "&lt;/span&gt;&lt;/span&gt;Constructs a GeometryFactory that generates Geometries having a floating  PrecisionModel and a spatial-reference ID of 0."&amp;nbsp; For what I'm doing this is fine.&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;2) The preferred constructor for the Point object takes a CoordinateArraySequence of length one instead of a single Coordinate object.&amp;nbsp; This is analogous to a character in Python being a string of length one.&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;We don't know yet what our values are for our Point's coordinates.&amp;nbsp; Let's have a look.&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; ptx&lt;br /&gt;POINT (0 0)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;OK, zero-zero.&amp;nbsp; Let's assign something to those coordinates away from the origin.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; ptx.getCoordinates()[0].x = 44&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; ptx.getCoordinates()[0].y = 22&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; ptx&lt;br /&gt;POINT (44 22)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Even though the Point has only one coordinate, we still need to specify that with the index 0.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Well, that was a lot of work for just one point.&amp;nbsp; Let's try something more efficient and fun.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; cas2 = CoordinateArraySequence(6)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; somecoordinates = [(1, 5), (7, 14), (22, 44), (36, 12), (19, 1), (12, 4)]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for numx in range(len(somecoordinates)):&lt;br /&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cas2.getCoordinate(numx).x = somecoordinates[numx][0]&lt;br /&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cas2.getCoordinate(numx).y = somecoordinates[numx][1]&lt;br /&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; cas2&lt;br /&gt;((1.0, 5.0, NaN), (7.0, 14.0, NaN), (22.0, 44.0, NaN), (36.0, 12.0, NaN), (19.0, 1.0, NaN), (12.0, 4.0, NaN))&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from com.vividsolutions.jts.geom import LineString&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; ls = LineString(cas2, factoryx)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; ch = ls.convexHull()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; ch&lt;br /&gt;POLYGON ((19 1, 1 5, 22 44, 36 12, 19 1))&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;LineString is one of the classes that can be instantiated from a CoordinateArraySequence.&amp;nbsp; I went with that mainly for ease of use.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;There is a great deal more to JTS.&amp;nbsp; This post was mainly for getting started with the library.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-920019964857367591?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/920019964857367591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/03/jython-jts-geometry-library.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/920019964857367591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/920019964857367591'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/03/jython-jts-geometry-library.html' title='jython + the JTS geometry library'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-2151053913482480706</id><published>2011-03-02T19:51:00.000-08:00</published><updated>2011-03-02T19:51:57.431-08:00</updated><title type='text'>jython + Google Guava's base.CaseFormat</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I was trying to research Google Collections for use in jython and stumbled upon &lt;a href="http://blog.solidcraft.eu/2010/10/googole-guava-v07-examples.html"&gt;Solid Craft's blog&lt;/a&gt; and his description of &lt;a href="http://code.google.com/p/guava-libraries/"&gt;Guava&lt;/a&gt; base's CaseFormat utility.&amp;nbsp; Where I work we're a Java shop, and use of camelCase infiltrates all code, even jython code.&amp;nbsp; CaseFormat provides functionality for changing these variable names to a number of different formats.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ /usr/local/jdk-1.7.0/bin/java -jar jython.jar&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[OpenJDK Client VM (Sun Microsystems Inc.)] on java1.7.0-internal&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; import sys&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; # get downloaded jar into sys.path&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; sys.path.append('/home/carl/Downloads/guava-r08/guava-r08.jar')&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; from com.google.common.base import CaseFormat as cf&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; dir(cf)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;['LOWER_CAMEL', 'LOWER_HYPHEN', 'LOWER_UNDERSCORE', 'UPPER_CAMEL', . . .]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; varname = 'someVariable'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; cf.LOWER_CAMEL.to(cf.LOWER_UNDERSCORE, varname)&lt;br /&gt;u'some_variable'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; cf.LOWER_CAMEL.to(cf.UPPER_UNDERSCORE, varname)&lt;br /&gt;u'SOME_VARIABLE'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; cf.LOWER_CAMEL.to(cf.UPPER_CAMEL, varname)&lt;br /&gt;u'SomeVariable'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;For cycling through a file full of camel case or underscored variable names, even by hand in the interpreter, this could save some time and typing.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-2151053913482480706?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/2151053913482480706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/03/jython-google-guavas-basecaseformat.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/2151053913482480706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/2151053913482480706'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/03/jython-google-guavas-basecaseformat.html' title='jython + Google Guava&apos;s base.CaseFormat'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-8003553291531550974</id><published>2011-02-28T13:48:00.000-08:00</published><updated>2011-02-28T14:04:09.159-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jython unicode unicodeblock'/><title type='text'>jython + java.lang.Character.UnicodeBlock</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;In my &lt;/span&gt;&lt;a href="http://pyright.blogspot.com/2010/10/regular-expression-unicode-blocks-in.html"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;post on Unicode Blocks in regular expressions&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;, I mentioned there wasn't support for Unicode Blocks in CPython regular expressions.&amp;nbsp; Unicode Blocks are contiguous (by number) sections of the Unicode tables with some commonality among the characters.&amp;nbsp; There is another Java language feature that can be helpful for those interested in Unicode Blocks:&amp;nbsp; the java.lang.Character.UnicodeBlock object.&amp;nbsp; In jython:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54)&lt;br /&gt;[Java HotSpot(TM) 64-Bit Server VM (Sun Microsystems Inc.)] on java1.6.0_22&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from java.lang.Character import UnicodeBlock&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; UnicodeBlock.of(236)&lt;br /&gt;LATIN_1_SUPPLEMENT&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; UnicodeBlock.of('a')&lt;br /&gt;BASIC_LATIN&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; UnicodeBlock.of(738)&lt;br /&gt;SPACING_MODIFIER_LETTERS&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; UnicodeBlock.of(922)&lt;br /&gt;GREEK&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;gt;&amp;gt;&amp;gt; UnicodeBlock.of(0xffee)&lt;br /&gt;HALFWIDTH_AND_FULLWIDTH_FORMS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;The "of" method can accept either a character or a Unicode numeric identifier as it's argument.&amp;nbsp; It provides a shorthand method of finding out roughly where a character is in Unicode and what it might represent.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-8003553291531550974?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/8003553291531550974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/02/jython-javalangcharacterunicodeblock.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8003553291531550974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8003553291531550974'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/02/jython-javalangcharacterunicodeblock.html' title='jython + java.lang.Character.UnicodeBlock'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-796311507565885636</id><published>2011-02-24T21:18:00.000-08:00</published><updated>2011-02-25T08:11:54.505-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#inkscape #povray #svg #python #pysanky'/><title type='text'>More SVG - trace from bitmap with Inkscape and color editing</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I'm attempting to convert some of the &lt;a href="http://pyright.blogspot.com/2011/01/pov-ray-another-pysanky-egg.html"&gt;pysanky eggs I drew with POV-ray&lt;/a&gt; to SVG so that I can scale them freely.&amp;nbsp; Also, once they're converted, I would like to be able to edit their colors in the same way I did with the Python logo in my &lt;a href="http://pyright.blogspot.com/2011/02/svg-xml-and-python-logo.html"&gt;last post&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;To the best of my knowledge, &lt;a href="http://inkscape.org/"&gt;Inkscape&lt;/a&gt; (potrace) is the most readily available tool for converting the bitmap images from POV-ray to SVG.&amp;nbsp; There are a few things to look out for, but this is still really easy:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1) Remove all reflection and shading from the textures (colors) in the POV-ray scene.&amp;nbsp; Work on getting even lighting for the whole scene.&amp;nbsp; Generate the scene &lt;b&gt;without &lt;/b&gt;antialiasing (jagged edges are fine, and even desired).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/-3OW_FTNDkik/TWcaigZv8qI/AAAAAAAAAOc/oWMc8ekhfdY/s1600/pysankyeggnoantialias.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-3OW_FTNDkik/TWcaigZv8qI/AAAAAAAAAOc/oWMc8ekhfdY/s320/pysankyeggnoantialias.png" width="294" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;2) Follow the directions &lt;a href="http://confluence.concord.org/display/CCTR/Tracing+Color+Raster+Images"&gt;here&lt;/a&gt; for tracing the SVG drawing.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-3Xb6pop3N3A/TWcbzYuc0PI/AAAAAAAAAOg/2dyWSrgXd8Q/s1600/crossdroppulleggsvgoutput.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-3Xb6pop3N3A/TWcbzYuc0PI/AAAAAAAAAOg/2dyWSrgXd8Q/s320/crossdroppulleggsvgoutput.png" width="294" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Now to use the standard library's xml.etree.ElementTree package to get at the colors.&amp;nbsp; Before jumping in, I first removed any references to the old bmp image from POV-ray and checked on the three color values in the SVG file.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The three colors in the image are #fefefe (slightly off white), #000000 (black), and #00fd00 (light green).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# svgchangecolor.py&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;"""&lt;br /&gt;Manipulation of colors in an SVG image.&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;from xml.etree import ElementTree as ET&lt;br /&gt;&lt;br /&gt;def drilldown(nodex, oldcolor, newcolor):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Walk node of element tree in search&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; of oldcolor.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Replace oldcolor with newcolor where&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; oldcolor occurs.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; childrenx = nodex.getchildren()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if childrenx:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for childx in childrenx:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; drilldown(childx, oldcolor, newcolor)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itemsx = nodex.items()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for itemx in itemsx:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if itemx[1].find(oldcolor) &amp;gt; -1:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oldcolorstr = itemx[1]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newcolorstr = oldcolorstr.replace(oldcolor, newcolor)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nodex.set(itemx[0], newcolorstr) &lt;br /&gt;&lt;br /&gt;def changecolor(oldcolor, newcolor, filename):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Replaces oldcolor with newcolor in an&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SVG file named filename.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; All three arguments are strings.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; oldcolor and newcolor are hex strings&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; in the format #xxxxxx.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # the colors are at the lowest level&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # in the XML (SVG) file&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # drill down until they are reached &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; svgobj = ET.parse(filename)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rootx = svgobj.getroot()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; drilldown(rootx, oldcolor, newcolor)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; svgobj.write(filename)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ python2.5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Python 2.5.4 (r254:67916, Aug&amp;nbsp; 9 2010, 08:57:51)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[GCC 4.2.1 20070719 ] on openbsd4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; import svgchangecolor as svgcc&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; svgcc.changecolor('#00fd00', '#ffff00', 'crossdroppullegg.svg')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; svgcc.changecolor('#000000', '#00aa00', 'crossdroppullegg.svg')&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; svgcc.changecolor('#fefefe', '#000000', 'crossdroppullegg.svg')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-RJ1iFaZPMr0/TWc2IhDzuiI/AAAAAAAAAOk/jvnomoP6ocA/s1600/crossdroppulleggcolorschanged.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-RJ1iFaZPMr0/TWc2IhDzuiI/AAAAAAAAAOk/jvnomoP6ocA/s320/crossdroppulleggcolorschanged.png" width="276" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;There are only three elements with color in the file (the dark green one is doing all the "work" of filling in the pattern).&amp;nbsp; The script is really overkill in this case.&amp;nbsp; For a drawing with a number of separate paths with the same color, though, this could be very useful.&lt;/span&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-796311507565885636?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/796311507565885636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/02/more-svg-trace-from-bitmap-with.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/796311507565885636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/796311507565885636'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/02/more-svg-trace-from-bitmap-with.html' title='More SVG - trace from bitmap with Inkscape and color editing'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-3OW_FTNDkik/TWcaigZv8qI/AAAAAAAAAOc/oWMc8ekhfdY/s72-c/pysankyeggnoantialias.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-7926091013728275960</id><published>2011-02-21T15:04:00.000-08:00</published><updated>2011-02-21T15:04:54.150-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#svg #xml #pythonlogo #python'/><title type='text'>SVG, XML, and the Python logo</title><content type='html'>&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;i&gt;Legal notice:&amp;nbsp; &lt;a href="http://www.python.org/psf/trademarks/"&gt;the terms of use for the Python logo&lt;/a&gt; restrict the alteration or bastardization of the logo, including its colors.&amp;nbsp; I have contacted the Python Software Foundation and gotten permission to publish this blog entry.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;The logo restrictions I violate in this post, for purposes of demonstrating working with svg, are:&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; 1) changing the color of the logo&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; 2) removal of the trademark symbol&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;While people are encouraged to use the logo, they are also encouraged to &lt;a href="mailto:psf@python.org"&gt;contact the PSF trademarks committee&lt;/a&gt; regarding questions of alteration.&amp;nbsp; Thank you for your consideration in this matter.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;As a means of becoming more familiar with &lt;a href="http://en.wikipedia.org/wiki/Scalable_Vector_Graphics"&gt;SVG (scalable vector graphics)&lt;/a&gt; and XML, I wanted to see if I could change the colors of the Python logo in code.&amp;nbsp; Although this is neither encouraged nor permitted (see notice above), it &lt;a href="http://pyright.blogspot.com/2010/01/many-faces-of-python-logos.html"&gt;has been done&lt;/a&gt; on occasion in the past; I wanted to see how.&lt;br /&gt;&lt;br /&gt;Since SVG is a subset of XML, I'm going to use an XML tool from the standard library (xml.etree.ElementTree) to work with the SVG image.&lt;br /&gt;&lt;br /&gt;First, I &lt;a href="http://www.python.org/community/logos/"&gt;downloaded the logo&lt;/a&gt; from python.org. I'm using the Java based tool Batik/Squiggle to view the SVG images:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-GjpknArSadk/TWLX0eVJJJI/AAAAAAAAAOM/5ucpY3vEstI/s1600/fullpythonlogo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="176" src="http://3.bp.blogspot.com/-GjpknArSadk/TWLX0eVJJJI/AAAAAAAAAOM/5ucpY3vEstI/s320/fullpythonlogo.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;To simplify the SVG file I removed the gray parts (text, trademark character, and shadow).&amp;nbsp; This I did by hand by looking for any gray colors of the hex form #xyxyxy in the file.&lt;br /&gt;&lt;br /&gt;Also, I changed the name of the file I was referencing inside the SVG file to pythonlogochanged.svg.&amp;nbsp; This is important, otherwise the SVG file will continue to read whatever file is named inside it.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/-EHZ00NwcArk/TWLZYgyM6-I/AAAAAAAAAOQ/G0G51lXq2c8/s1600/pythonlogounaltered.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="176" src="http://1.bp.blogspot.com/-EHZ00NwcArk/TWLZYgyM6-I/AAAAAAAAAOQ/G0G51lXq2c8/s320/pythonlogounaltered.png" width="320" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;There are now six main elements to the file:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1) the two shapes in the logo&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2) the two gradients for color variation across each shape&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3) the two sets of colors for start and stop in the gradation (two yellows and two blues)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;It's number 3) that we're interested in.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I started out trying to use minidom from the xml standard library, but found ElementTree to be better suited to the task.&amp;nbsp; This &lt;a href="http://effbot.org/zone/element-index.htm"&gt;tutorial&lt;/a&gt; from Effbot was helpful.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;$ python2.5&lt;/div&gt;Python 2.5.4 (r254:67916, Aug&amp;nbsp; 9 2010, 08:57:51)&lt;br /&gt;[GCC 4.2.1 20070719 ] on openbsd4&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; # open file&lt;br /&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; svgobj = ET.parse('pythonlogochanged.svg')&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;gt;&amp;gt;&amp;gt; # get toplevel element&lt;/div&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; rootx = svgobj.getroot()&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Now it is time to drill down into the element tree.&amp;nbsp; I walked through this myself previously, so you'll have to trust that I know where the colors are in the tree.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;gt;&amp;gt;&amp;gt; elementsx = rootx.getchildren()&lt;/div&gt;&amp;gt;&amp;gt;&amp;gt; defsx = elementsx[2]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; elementsx = defsx.getchildren()&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;gt;&amp;gt;&amp;gt; yellowelement = elementsx[0]&lt;/div&gt;&amp;gt;&amp;gt;&amp;gt; blueelement = elementsx[1]&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;First we'll look at the yellow color definitions.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&amp;gt;&amp;gt;&amp;gt; yellowchildren = yellowelement.getchildren()&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;gt;&amp;gt;&amp;gt; yellowchildren[0].items()&lt;/div&gt;[('style', 'stop-color:#ffd43b;stop-opacity:1'), ('id', 'stop4673'), ('offset', '0')]&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;gt;&amp;gt;&amp;gt; yellowchildren[1].items()&lt;/div&gt;[('style', 'stop-color:#ffe873;stop-opacity:1'), ('id', 'stop4675'), ('offset', '1')]&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The yellow colors across the gradient are #ffd43b and #ffe873.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Now we'll look at the blue colors.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;gt;&amp;gt;&amp;gt; bluechildren = blueelement.getchildren()&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;gt;&amp;gt;&amp;gt; bluechildren[0].items()&lt;/div&gt;[('style', 'stop-color:#5a9fd4;stop-opacity:1'), ('id', 'stop4691'), ('offset', '0')]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; bluechildren[1].items()&lt;br /&gt;[('style', 'stop-color:#306998;stop-opacity:1'), ('id', 'stop4693'), ('offset', '1')]&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;#5a9fd4 and #306998 are the blue colors across the gradient.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Let's try taking the color gradients out first without changing the blue and yellow colors.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;gt;&amp;gt;&amp;gt; bluechildren[1].set('style', 'stop-color:#5a9fd4:stop-opacity:1')&lt;/div&gt;&amp;gt;&amp;gt;&amp;gt; yellowchildren[1].set('style', 'stop-color:#ffd43b;stop-opacity:1')&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Now the result needs to be written to disk.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;gt;&amp;gt;&amp;gt; svgobj.write('pythonlogochanged.svg')&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-XUL7RdN7WMs/TWLq8ZmLNjI/AAAAAAAAAOU/JdH6TvWdn90/s1600/pythonlogoflat.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="176" src="http://4.bp.blogspot.com/-XUL7RdN7WMs/TWLq8ZmLNjI/AAAAAAAAAOU/JdH6TvWdn90/s320/pythonlogoflat.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Still blue and yellow, but significantly different without the gradient.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Now let's make a black silhouette.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;gt;&amp;gt;&amp;gt; bluechildren[0].set('style', 'stop-color:#000000:stop-opacity:1')&lt;/div&gt;&amp;gt;&amp;gt;&amp;gt; bluechildren[1].set('style', 'stop-color:#000000:stop-opacity:1')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; yellowchildren[0].set('style', 'stop-color:#000000;stop-opacity:1')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; yellowchildren[1].set('style', 'stop-color:#000000;stop-opacity:1')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; svgobj.write('pythonlogochanged.svg')&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-FeoeOcmBfEU/TWLsoVmEKII/AAAAAAAAAOY/3_-UnYLU_To/s1600/pythonlogosilhouette.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="176" src="http://4.bp.blogspot.com/-FeoeOcmBfEU/TWLsoVmEKII/AAAAAAAAAOY/3_-UnYLU_To/s320/pythonlogosilhouette.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The hardest part of this excercise was finding the appropriate parts of the SVG file to edit.&amp;nbsp; ElementTree makes it easy from there.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-7926091013728275960?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/7926091013728275960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/02/svg-xml-and-python-logo.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/7926091013728275960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/7926091013728275960'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/02/svg-xml-and-python-logo.html' title='SVG, XML, and the Python logo'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-GjpknArSadk/TWLX0eVJJJI/AAAAAAAAAOM/5ucpY3vEstI/s72-c/fullpythonlogo.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-1070048792997565311</id><published>2011-02-16T19:42:00.000-08:00</published><updated>2011-02-18T16:54:20.898-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#polygonoffset #python #povray #pysanky'/><title type='text'>Simple Polygon Offset</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I was working on another POV-ray pysanky egg design and had to work with offsetting polygons.&amp;nbsp; Stack Overflow had a brief description of &lt;a href="http://stackoverflow.com/questions/1109536/an-algorithm-for-inflating-deflating-offsetting-buffering-polygons"&gt;how this could be done&lt;/a&gt;.&amp;nbsp; I chose to go with the simplest solution: drawing offset lines and connecting their intersection points.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Update:&amp;nbsp; &lt;a href="http://www.blogger.com/profile/07123532353472970521" target="_blank"&gt;&lt;span style="color: #0000cc;"&gt;ΤΖΩΤΖΙΟΥ&lt;/span&gt;&lt;/a&gt;&amp;nbsp;was kind enough to introduce me to the math.atan2 function, which correctly identifies the quadrant the angle theta falls in, and rewrote my verbose function(s) concisely:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;def calcoffsetpoint(pt1, pt2, offset):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta = math.atan2(pt2[1] - pt1[1],&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt2[0] - pt1[0])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta += math.pi/2.0 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (pt1[0] - math.cos(theta) * offset,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt1[1] - math.sin(theta) * offset)&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;getoffsetintercept gets the b in y = mx + b needed to calculate the new point:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def getoffsetintercept(pt1, pt2, m, offset):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; From points pt1 and pt2 defining a line&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; in the Cartesian plane, the slope of the &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; line m, and an offset distance,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; calculates the y intercept of&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; the new line offset from the original.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x, y = calcoffsetpoint(pt1, pt2, offset)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return y - m * x&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: 'Courier New',Courier,monospace;"&gt;The function that gets a single point along the polygon:&lt;/div&gt;&lt;div style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def getpt(pt1, pt2, pt3, offset):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Gets intersection point of the two&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lines defined by pt1, pt2, and pt3;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset is the distance to offset&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; the point from the polygon.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # get first offset intercept&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m = (pt2[1] - pt1[1])/(pt2[0] - pt1[0])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; boffset = getoffsetintercept(pt1, pt2, m, offset)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # get second offset intercept&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mprime = (pt3[1] - pt2[1])/(pt3[0] - pt2[0])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; boffsetprime = getoffsetintercept(pt2, pt3, mprime, offset)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # get intersection of two offset lines&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; newx = (boffsetprime - boffset)/(m - mprime)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; newy = m * newx + boffset&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return newx, newy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Lastly, the function that works the polygon offset:&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def offsetpolygon(polyx, offset):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Offsets a clockwise list of coordinates&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyx distance offset to the inside of&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; the polygon.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Returns list of offset points.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyy = []&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # need three points at a time&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for counter in range(0, len(polyx) - 3):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # get first offset intercept&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt = getpt(polyx[counter],&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyx[counter + 1],&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyx[counter + 2],&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # append new point to polyy&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyy.append(pt)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # last three points&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt = getpt(polyx[-3], polyx[-2], polyx[-1], offset)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyy.append(pt)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt = getpt(polyx[-2], polyx[-1], polyx[0], offset)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyy.append(pt)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt = getpt(polyx[-1], polyx[0], polyx[1], offset)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; polyy.append(pt)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return polyy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Shown below is the shape I was trying to offset.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-hcwkNhWUesI/TVyT5CugezI/AAAAAAAAAOE/Rs18Nb5WOkI/s1600/monastery.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-hcwkNhWUesI/TVyT5CugezI/AAAAAAAAAOE/Rs18Nb5WOkI/s1600/monastery.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;As the "Simple" in the entry's title suggests, this is a best case scenario:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;nbsp; 1) no degenerate polygons inside or outside&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2) no zero or infinite slopes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Actually, I should have some zero slopes, but I cheated and changed the coordinates.&amp;nbsp; The differences won't be seen by the naked eye, but are big enough for the computer to handle them.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Here is the egg I was working on; it's a &lt;a href="http://en.wikipedia.org/wiki/Hutsuls"&gt;Hutsul&lt;/a&gt; design from the &lt;a href="http://www.ukrainianbookstore.com/ProductInfo.aspx?productid=4820067"&gt;Sixty Score of Easter Eggs&lt;/a&gt; book:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-g5uPlE8ZGNo/TVyVMY0XJrI/AAAAAAAAAOI/ejGEoueqx78/s1600/monasteryeggsmooth.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-g5uPlE8ZGNo/TVyVMY0XJrI/AAAAAAAAAOI/ejGEoueqx78/s1600/monasteryeggsmooth.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Thanks for having a look. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-1070048792997565311?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/1070048792997565311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/02/simple-polygon-offset.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/1070048792997565311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/1070048792997565311'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/02/simple-polygon-offset.html' title='Simple Polygon Offset'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-hcwkNhWUesI/TVyT5CugezI/AAAAAAAAAOE/Rs18Nb5WOkI/s72-c/monastery.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-2671888316946511913</id><published>2011-02-08T14:42:00.000-08:00</published><updated>2011-02-09T01:53:44.636-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#jython #java #clone'/><title type='text'>jython copy versus clone</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;We're a Java shop&amp;nbsp;at work.&amp;nbsp; We do a lot of passing of Java objects back and forth through the jython API to our application.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The other day I had the need to copy a Java object.&amp;nbsp; It was a flat structure and my instinct was to use the object's clone method, which I did.&amp;nbsp; This got me thinking about the use of clone versus the copy module in jython and I gave it a look:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54)&lt;br /&gt;[Java HotSpot(TM) 64-Bit Server VM (Sun Microsystems Inc.)] on java1.6.0_22&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from java.util import ArrayList&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a = ArrayList()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a&lt;br /&gt;[]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a.add(1)&lt;br /&gt;True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a.add([2, 3])&lt;br /&gt;True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import copy&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b = a.clone()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b&lt;br /&gt;[1, [2, 3]]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b[1]&lt;br /&gt;[2, 3]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b[1][1]&lt;br /&gt;3&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b[1][1] = 22&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b&lt;br /&gt;[1, [2, 22]]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a&lt;br /&gt;[1, [2, 22]]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b = copy.deepcopy(a)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;&amp;nbsp; File "&amp;lt;stdin&amp;gt;", line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;SystemError: Automatic proxy initialization should only occur on proxy classes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;OK, clone works similar to copy.copy (shallow copy).&amp;nbsp; Not sure what's going on with deepcopy, but it doesn't appear to be available in the case of an ArrayList object.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Update:&amp;nbsp; as noted in the comments, the copy behavior on Java objects is a known bug and is scheduled to be fixed in jython version 2.5.2.&amp;nbsp; In the meantime, clone() would appear to be a decent option. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Let's test the shallow copy capability of clone():&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; a = ArrayList()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a.add(1)&lt;br /&gt;True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a.add(2)&lt;br /&gt;True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a.add(3)&lt;br /&gt;True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a&lt;br /&gt;[1, 2, 3]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b = a.clone()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b&lt;br /&gt;[1, 2, 3]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b[2] = 22&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b&lt;br /&gt;[1, 2, 22]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a&lt;br /&gt;[1, 2, 3]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Perfect - it works just like copy.copy() would.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-2671888316946511913?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/2671888316946511913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/02/jython-copy-versus-clone.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/2671888316946511913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/2671888316946511913'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/02/jython-copy-versus-clone.html' title='jython copy versus clone'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-8729600321139893623</id><published>2011-02-05T19:13:00.000-08:00</published><updated>2011-02-05T19:13:50.380-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#python #povray #pysanky'/><title type='text'>More POV-ray and Pysanky</title><content type='html'>&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Continuing with the series of pysanky eggs I've been working on with Python and POV-ray - another week, another egg.&amp;nbsp; This one is a &lt;a href="http://en.wikipedia.org/wiki/Lemkos"&gt;Lemko&lt;/a&gt; design.&amp;nbsp; The dots, I believe, represent stars.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/TU4OuR14hpI/AAAAAAAAAN4/7bgQK0h5gpk/s1600/spookydroppullsmooth.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/TU4OuR14hpI/AAAAAAAAAN4/7bgQK0h5gpk/s1600/spookydroppullsmooth.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Getting the crown and base was relatively easy, as it just required the correct positioning of a single stroke, then rotating it:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def makecrown(baseobj):&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; crownstrokes = [baseobj]&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta = STEP&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while theta &amp;lt; 360.0:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; crownstrokes.append(pov.Object(baseobj,&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rotate = (0.0, theta, 0.0)))&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta += STEP&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return pov.Union(*crownstrokes)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;In this case, step = 360.0/24.0.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Likewise, I have a function for the dots that made them easier to place:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def movedot(basedot, xtheta, ytheta):&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dot = pov.Object(basedot, rotate = (xtheta, ytheta, 0.0))&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return pov.Object(dot, translate = (0.0, 1.0, 0.0))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Ultimately, I'd like to get enough egg designs coded to put together some sort of scene in POV-ray dedicated to the eggs.&amp;nbsp; The following two scenes show what I have so far:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/TU4QvN3AleI/AAAAAAAAAN8/K5HQfFfj4wE/s1600/threediffernteggsfocalblur.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/TU4QvN3AleI/AAAAAAAAAN8/K5HQfFfj4wE/s1600/threediffernteggsfocalblur.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/TU4REVcCfdI/AAAAAAAAAOA/EZZcmctGqwc/s1600/droppulleggsonboardfocalblur.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/TU4REVcCfdI/AAAAAAAAAOA/EZZcmctGqwc/s1600/droppulleggsonboardfocalblur.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;If I can identify a few more attractive, computationally friendly designs, I should be able to come up with enough eggs for a decent POV-ray egg scene.&amp;nbsp; In the meantime, thanks for having a look.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-8729600321139893623?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/8729600321139893623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/02/more-pov-ray-and-pysanky.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8729600321139893623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8729600321139893623'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/02/more-pov-ray-and-pysanky.html' title='More POV-ray and Pysanky'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_27GcakEGOHc/TU4OuR14hpI/AAAAAAAAAN4/7bgQK0h5gpk/s72-c/spookydroppullsmooth.bmp' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-6070890756540937313</id><published>2011-01-29T09:30:00.000-08:00</published><updated>2011-01-29T09:30:54.193-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#pysanky #povray #python'/><title type='text'>POV-ray -another Pysanky Egg</title><content type='html'>&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;This is a continuation on a series of POV-ray posts all focused on the Pysanky decoration of egg shapes.&amp;nbsp; An attempt to represent the drop pull method of wax application to the egg is the subject of this post.&amp;nbsp; To represent this I've borrowed some work on flower shapes from a &lt;a href="http://pyright.blogspot.com/2011/01/prims-and-trigonometric-shapes-pov-ray.html"&gt;previous post&lt;/a&gt; and added a simple methodology for extending the flower in a simple V shape lengthwise:&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def cycleequation(step, start, stop, trigfunc, factorr, factortheta, startend):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Returns list of x, y coordinates that correspond&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; to the equation of the form&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; factorr * r * r = (trigfunc(factortheta * theta)) ** 2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta will be incremented by step.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; start is the first value of theta.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; stop is the last value of theta.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Shape starts and ends at startend, preferably a&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; coordinate along the POV-ray z axis in the &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; direction negative of the other points.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; coords = [startend]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta = start&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while theta &amp;lt; stop:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; coords.append(getcoords(theta, factorr, factortheta, trigfunc))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta += step&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; coords.append(getcoords(stop, factorr, factortheta, trigfunc))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; coords.append(startend)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return coords&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The head of the shape is formed by the equation&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;r ** 2 = (math.cos(2.0 * theta)) ** 2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;from &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;math.pi/4.0 + 0.2 to &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;3 * math.pi/4.0 - 0.2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;For a long drop pull shape, a start and end point of (0.0, -15.0) yields a shape like the one pictured below:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/TURI-f5rmwI/AAAAAAAAANo/4JtC8m4fIAQ/s1600/bigdroppulldrop.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/TURI-f5rmwI/AAAAAAAAANo/4JtC8m4fIAQ/s1600/bigdroppulldrop.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The head and the lengthwise extension are slightly slope discordant.&amp;nbsp; I did this intentionally to try to get the effect of the real life dropping of hot wax on the egg and pulling away from the drop to make the V shape.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;With a parameter of (0.0, -5.0) for the start-stop point, a shorter, stubby drop is formed:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/TURKf6FmxpI/AAAAAAAAANs/CPGo8zKy5l4/s1600/smalldroppulldrop.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/TURKf6FmxpI/AAAAAAAAANs/CPGo8zKy5l4/s1600/smalldroppulldrop.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Through a series of scaling and rotation operations, I was able to get the drop shapes positioned to decorate my egg:&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/TURLBchQLlI/AAAAAAAAANw/oU9FXWizZEM/s1600/smoothcrossegg.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/TURLBchQLlI/AAAAAAAAANw/oU9FXWizZEM/s1600/smoothcrossegg.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;It&lt;/span&gt; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;takes 41 different strokes to make this egg (the way I approached it).&amp;nbsp; I fell into the temptation briefly of naming the strokes 'stroke1', 'stroke2', etc.&amp;nbsp; This is bad.&amp;nbsp; Descriptive names are good.&amp;nbsp; Even with a deceptively simple design like this, it's impossible to figure out what's going on and mirror the strokes that can be mirrored without descriptive names like 'northeastcenter', 'northwestcenter', etc.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Once I get a chance to rework the code, I can shorten the names and eliminate repetitive code.&amp;nbsp; This pattern recognition/code refactoring exercise should keep me busy for a bit.&amp;nbsp; In the meantime, thanks for having a look. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-6070890756540937313?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/6070890756540937313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/01/pov-ray-another-pysanky-egg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/6070890756540937313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/6070890756540937313'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/01/pov-ray-another-pysanky-egg.html' title='POV-ray -another Pysanky Egg'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_27GcakEGOHc/TURI-f5rmwI/AAAAAAAAANo/4JtC8m4fIAQ/s72-c/bigdroppulldrop.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-7912882952118548451</id><published>2011-01-15T15:40:00.000-08:00</published><updated>2011-10-10T06:38:23.950-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#jython #java.util.Properties'/><title type='text'>jython and java.util.Properties</title><content type='html'>&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The other day my boss gave me an assignment to create a static properties file with stringified numeric mappings of file lookups.&amp;nbsp; Turns out this is really easy in jython (if you're used to Python instead of Java).&amp;nbsp; Hardly any Java is required:&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ /usr/local/jdk-1.7.0/bin/java -jar jython.jar&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[OpenJDK Client VM (Sun Microsystems Inc.)] on java1.7.0-internal&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; from java.util import Properties&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; filemappings = {'1':'numberone.py',&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '2':'numbertwo.py',&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '3':'numberthree.py'}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; props = Properties()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; for key in filemappings:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; props.setProperty(key, filemappings[key])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; fle = open('blah', 'w')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; props.store(fle, 'put comment here')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; fle.close()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; fle = open('blah', 'r')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; props = Properties()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; props.load(fle)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; props.getProperty('1')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;u'numberone.py'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; for prop in props:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print prop, props.getProperty(prop)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;3 numberthree.py&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;2 numbertwo.py&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1 numberone.py&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; fle.close()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The file itself looks like this:&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#put comment here&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#Sat Jan 15 16:24:57 MST 2011&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;3=numberthree.py&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;2=numbertwo.py&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1=numberone.py&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The value strings are stored in a manner that has them returned as Jython Unicode strings.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;My case is the simplest one, in that the properties file is static.&amp;nbsp; To update it dynamically and store it for the next use (for example, to maintain state), you would need a writable file object.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-7912882952118548451?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/7912882952118548451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/7912882952118548451'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/01/jython-and-javautilproperties.html' title='jython and java.util.Properties'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-8547293750317489867</id><published>2011-01-09T12:18:00.000-08:00</published><updated>2011-01-09T12:22:55.771-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#povray #python #pysanky'/><title type='text'>Prisms and Trigonometric Shapes - POV-ray</title><content type='html'>&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I was looking for a way to put a four petal flower shape on my Python-POV-ray generated egg.&amp;nbsp; As it turns out, this shape is a common geometric one called &lt;a href="http://curvebank.calstatela.edu/povray/pages/rose03.html"&gt;Pascal's Rose&lt;/a&gt;.&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;For expediency rather than efficiency's sake, I opted to generate the shape using individual x, y points (actually x, z in POV-ray):&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;def getcoords(theta, factorr, factortheta, trigfunc):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Returns two tuple of x and y values for&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; the equation in the form&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; factorr * r * r = trigfunc(factortheta * theta)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; r = math.sqrt((trigfunc(factortheta * theta)) ** 2 / factorr)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = r * math.cos(theta)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = r * math.sin(theta)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if abs(x) &amp;lt; ZEROLIMIT:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 0.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if abs(y) &amp;lt; ZEROLIMIT:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = 0.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print x, y, theta&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return x, y&lt;br /&gt;&lt;br /&gt;def cycleequation(step, start, stop, trigfunc, factorr, factortheta):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Returns list of x, y coordinates that correspond&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; to the equation of the form&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; factorr * r * r = trigfunc(factortheta * theta)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta will be incremented by step.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; start is the first value of theta.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; stop is the last value of theta.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; coords = []&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta = start&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while theta &amp;lt; stop:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; coords.append(getcoords(theta, factorr, factortheta, trigfunc))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta += step&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; coords.append(getcoords(stop, factorr, factortheta, trigfunc))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return coords&lt;br /&gt;&lt;br /&gt;math.cos creates Pascal's Rose for this equation.&amp;nbsp; I had to add a Prism object to the &lt;a href="http://code.activestate.com/recipes/205451-povray-for-python/"&gt;POV-ray recipe&lt;/a&gt; I am using.&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;class Prism(Item):&lt;br /&gt;&amp;nbsp; def __init__(self, base, top, numpts, *opts, **kwargs):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item.__init__(self,"prism",(base, top, numpts),opts,**kwargs)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;For me it was easiest to just translate the points of the prism into POV-ray SDL language prior to feeding them to Python:&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def translatetopovray(pts):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Returns string in povray format of list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; of points pts.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; stringpoints = []&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for pt in pts:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stringpoints.append('&amp;lt;%.8f, %.8f&amp;gt;' % pt)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return string.join(stringpoints, ',')&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;This allowed for generation of a prism:&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/TSoT9Pc8uII/AAAAAAAAANc/c6_vCnBow9s/s1600/prism.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/TSoT9Pc8uII/AAAAAAAAANc/c6_vCnBow9s/s1600/prism.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;This is just a rough representation of what I wanted.&amp;nbsp; The scene I was creating required a two colored flower, the outside as gold and the inside as orange.&amp;nbsp; Further, the outside edge needed to appear to be of constant width, as one would achieve by applying wax to an egg with the pysanky drawing tool, the kistka.&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;To get this effect I used a rough offset algorithm - get the centerpoint of the line segment on the outside edge of the "flower", offset a set distance along the normal to the outside line segment, then connect all the inner points.&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;def gettan(pt1, pt2):&lt;/div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Returns the tangent of the directional&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; angle formed by line segment pt1-pt2.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (pt2[1] - pt1[1])/(pt2[0] - pt1[0])&lt;br /&gt;&lt;br /&gt;def getmidpoint(pt1, pt2):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get the midpoint of the line segment&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt1-pt2.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = pt1[0] + (pt2[0] - pt1[0])/2.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = pt1[1] + (pt2[1] - pt1[1])/2.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return x, y&lt;br /&gt;&lt;br /&gt;def calcoffsetpoint(pt1, pt2, offset):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get point offset distance offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from the midpoint of line segment&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pt1-pt2 to the left.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; midpoint = getmidpoint(pt1, pt2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # get normal&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # quadrant I&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if pt2[0] &amp;gt;= pt1[0] and pt2[1] &amp;gt;= pt1[1]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta = math.atan(gettan(pt1, pt2)) + math.pi/2.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = midpoint[0] + math.cos(theta) * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = midpoint[1] + math.sin(theta) * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # quadrant II&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif pt2[0] &amp;lt;= pt1[0] and pt2[1] &amp;gt;= pt1[1]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta = math.atan(gettan(pt1, pt2)) + math.pi/2.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = midpoint[0] - math.cos(theta) * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = midpoint[1] - math.sin(theta) * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # quadrant III&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif pt2[0] &amp;lt;= pt1[0] and pt2[1] &amp;lt;= pt1[1]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta = 3.0 * math.pi/2.0 + math.atan(gettan(pt1, pt2))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = midpoint[0] + math.cos(theta) * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = midpoint[1] + math.sin(theta) * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # quadrant IV&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif pt2[0] &amp;gt;= pt1[0] and pt2[1] &amp;lt;= pt1[1]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta = 3.0 * math.pi/2.0 + math.atan(gettan(pt1, pt2))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = midpoint[0] - math.cos(theta) * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = midpoint[1] - math.sin(theta) * offset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print pt1, pt2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'error - theta undefined'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; theta = 0.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return x, y&lt;br /&gt;&lt;br /&gt;def getmiddle(step, start, stop, trigfunc, factorr, factortheta, offset):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return list of points for middle of 'petal'.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; startend = (0.0, 0.0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pts = [startend]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # need to offset by fixed distance along&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # normal to each line segment &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # need to get pts along original flower&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # but not near 0.0, 0.0 where they will&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # overlap&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; outsidepts = cycleequation(step, start, stop,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; trigfunc, factorr, factortheta)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; counter = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; maxcounter = len(outsidepts)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (counter + 1) &amp;lt; (maxcounter - 1):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pts.append(calcoffsetpoint(outsidepts[counter],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outsidepts[counter + 1], offset))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; counter += 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pts.append(startend)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return pts&lt;br /&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;My analytical geometry is a bit rough, but this works well enough for what I was trying to accomplish.&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/TSoWCK2SCzI/AAAAAAAAANg/qmsyWgBWKd8/s1600/flowersmooth.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/TSoWCK2SCzI/AAAAAAAAANg/qmsyWgBWKd8/s1600/flowersmooth.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Through some intersecting and positioning, I was able to get the effect I wanted.&amp;nbsp; This egg design, according to the Sixty Score of Easter Eggs book by Elyjiw, is from the Odessa region of the Ukraine.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/TSoWqwm7vWI/AAAAAAAAANk/DN5YG4R6iCI/s1600/flowerpysanky.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/TSoWqwm7vWI/AAAAAAAAANk/DN5YG4R6iCI/s1600/flowerpysanky.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Thanks for having a look.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-8547293750317489867?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/8547293750317489867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2011/01/prims-and-trigonometric-shapes-pov-ray.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8547293750317489867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8547293750317489867'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2011/01/prims-and-trigonometric-shapes-pov-ray.html' title='Prisms and Trigonometric Shapes - POV-ray'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_27GcakEGOHc/TSoT9Pc8uII/AAAAAAAAANc/c6_vCnBow9s/s72-c/prism.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-4460235902436146952</id><published>2010-12-26T11:42:00.000-08:00</published><updated>2010-12-26T11:42:47.032-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#povray #python #pysanky'/><title type='text'>POV-ray + Python - Scene Creation</title><content type='html'>Brief recap:&amp;nbsp; &lt;a href="http://code.activestate.com/recipes/205451-povray-for-python/"&gt;this recipe&lt;/a&gt; from the Python cookbook webpage is the basis for an api for POV-ray from Python.&amp;nbsp; I added an Object class to the api for more flexibility in manipulating pre-made POV-ray objects.&lt;br /&gt;&lt;br /&gt;This final post in the POV-ray series deals with an attempt to create a scene.&amp;nbsp; I want to draw some pysanky eggs on a board with pegs in it for the eggs to stand on.&lt;br /&gt;&lt;br /&gt;For the wood texture of the board I've used T_Wood10 from the POV-ray woods.inc library.&amp;nbsp; This requires the inclusion of the woods.inc library in the Python code:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;file = pov.File('test5.pov', 'colors.inc', 'woods.inc')&lt;/div&gt;&lt;br /&gt;test5.pov is my output file; colors.inc and woods.inc are my include files.&lt;br /&gt;&lt;br /&gt;Because the api deals exclusively with text, the wood texture will have to be put in as a string literal complete with POV-ray's curly brackets:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;testblock = pov.Box((-15, -6.50, -18), (15, -2.00, -3),&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; texture = '{T_Wood10}')&lt;/div&gt;&lt;br /&gt;As for the scene itself:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/TReR1tjoKbI/AAAAAAAAANQ/Vgcygk3OJhM/s1600/eggsonboardgoodpegs.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/TReR1tjoKbI/AAAAAAAAANQ/Vgcygk3OJhM/s1600/eggsonboardgoodpegs.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;This is good for illustrating the scene's design, but it's not very realistic.&amp;nbsp; The eggs look like they're wrapped in cellophane.&amp;nbsp; I tried introducing some focal blur:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;cam = pov.Camera(location = (0, 5, -35), look_at = (0, 0, 2),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; focal_point = (0, 2, -10), aperture = 0.4, blur_samples = 20)&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/TReS1jG5CfI/AAAAAAAAANU/y9b5teQa_14/s1600/eggsonboardgoodpegsfocalblur1.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/TReS1jG5CfI/AAAAAAAAANU/y9b5teQa_14/s1600/eggsonboardgoodpegsfocalblur1.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;This looks more realistic, but blurry.&amp;nbsp; It would probably serve a remote corner of a scene better rather than the main object.&lt;br /&gt;&lt;br /&gt;At this point it's really the nuances of POV-ray scene creation that will make a difference.&amp;nbsp; The purpose of this post and the last three was to show that you can do some fun things with POV-ray from Python.&lt;br /&gt;&lt;br /&gt;Lastly, and just for fun, some wooden eggs (textures textures.inc/Cork, woods.inc T_Wood10 and T_Wood14):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/TReaD7MVCRI/AAAAAAAAANY/HfEVLi4A4jw/s1600/woodeneggs.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/TReaD7MVCRI/AAAAAAAAANY/HfEVLi4A4jw/s1600/woodeneggs.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-4460235902436146952?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/4460235902436146952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/12/pov-ray-python-scene-creation.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/4460235902436146952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/4460235902436146952'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/12/pov-ray-python-scene-creation.html' title='POV-ray + Python - Scene Creation'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_27GcakEGOHc/TReR1tjoKbI/AAAAAAAAANQ/Vgcygk3OJhM/s72-c/eggsonboardgoodpegs.bmp' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-8965363490722152674</id><published>2010-12-21T17:43:00.000-08:00</published><updated>2010-12-22T04:00:50.031-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#python #povray #pysanky'/><title type='text'>Coding POV-ray in Python</title><content type='html'>My past two posts were basically on the same topic as this one.&amp;nbsp; The difference now is that I was able to write Python code as I would normally write it with functions, dictionaries, and loops and still come out with valid POV-ray code on the other end.&amp;nbsp; It's about a third of the length of the equivalent POV-ray code and, for me at least, easier to understand and read.&lt;br /&gt;&lt;br /&gt;Here is the last part of the code that resulted in the scene of the three eggs below:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;file = pov.File('test4.pov', 'colors.inc')&lt;br /&gt;cam = pov.Camera(location = (-2, 3, -12), look_at = (0, 0, 2))&lt;br /&gt;sorokolines = makesorokolines()testblock = makeredwedges()&lt;br /&gt;testblockred = pov.Object(testblock, RED)&lt;br /&gt;testblock = makeblackwedges()&lt;br /&gt;testblockblack = pov.Object(testblock, BLACK)&lt;br /&gt;test = pov.Union(testblockred, testblockblack, sorokolines)&lt;br /&gt;test1 = pov.Object(test, translate = (2, 2, 0))&lt;br /&gt;test2 = pov.Object(test, translate = (-2, -2, 0))&lt;br /&gt;test3 = pov.Object(test, translate = (-6, 2, 0))&lt;br /&gt;file.write(cam, test1, test2, test3, light1, light2, light3, light4, light5)&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/TRFW5ItxhwI/AAAAAAAAANI/Tq-_Z0rH0hI/s1600/threeeggs.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/TRFW5ItxhwI/AAAAAAAAANI/Tq-_Z0rH0hI/s1600/threeeggs.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;Now that I've proven to myself that I can code this in Python, I'd like to try something more involved like putting the eggs on a surface with a texture.&lt;br /&gt;&lt;br /&gt;Thanks for having a look.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-8965363490722152674?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/8965363490722152674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/12/coding-pov-ray-in-python.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8965363490722152674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8965363490722152674'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/12/coding-pov-ray-in-python.html' title='Coding POV-ray in Python'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_27GcakEGOHc/TRFW5ItxhwI/AAAAAAAAANI/Tq-_Z0rH0hI/s72-c/threeeggs.bmp' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-8611308235843118378</id><published>2010-12-13T18:52:00.000-08:00</published><updated>2010-12-14T07:53:36.514-08:00</updated><title type='text'>More POV-ray</title><content type='html'>Since &lt;a href="http://pyright.blogspot.com/2010/12/pov-ray.html"&gt;last time&lt;/a&gt; I've had some success porting POV-ray code to Python code based on this &lt;a href="http://code.activestate.com/recipes/205451-povray-for-python/"&gt;recipe&lt;/a&gt; by Simon Burton.&lt;br /&gt;&lt;br /&gt;To briefly recap, I'm trying to reproduce this egg with Python code:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/TQbUQBlbdvI/AAAAAAAAANA/4TV91xjNFTs/s1600/eggattempt2.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/TQbUQBlbdvI/AAAAAAAAANA/4TV91xjNFTs/s1600/eggattempt2.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Since my first attempt, this is how far I've gotten:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/TQbUgpbIY_I/AAAAAAAAANE/HuEUplMEG-k/s1600/sorokolines.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/TQbUgpbIY_I/AAAAAAAAANE/HuEUplMEG-k/s1600/sorokolines.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;Basically, the lines; I've made them a bit thicker to emphasize them.&amp;nbsp; I'm still working on getting the camera and look at values set to coincide with the main axes.&lt;br /&gt;&lt;br /&gt;The pictures are all well and good, but what's pretty exciting is that I made the second one using the API from the recipe.&amp;nbsp; Further, I was able to expand on the recipe by adding an Object class:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;class Object(Item):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; def __init__(self, *opts, **kwargs):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item.__init__(self, "object", (), opts, **kwargs)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This was really simple; I just copied what Simon Burton had done with the other classes.&amp;nbsp; Still, it opened up a lot of possibilities for twirling, flipping, and coloring elements once they're constructed.&amp;nbsp; For example, the code for the dividing lines above is (I've skipped the egg shape code for brevity):&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: 'Courier New',Courier,monospace;"&gt;white = pov.Texture(pov.Pigment(color = (1.0, 1.0, 1.0)), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pov.Finish(phong = redphng, reflection = redrflct))&lt;/div&gt;&lt;div style="font-family: 'Courier New',Courier,monospace;"&gt;horizontaldividingline = pov.Box((-3, 2.15, -3), (3, 2.25, 3), white)&lt;br /&gt;verticaldividingline = pov.Box((-0.05, -1, -3), (0.05, 7, 3), white)&lt;br /&gt;&lt;br /&gt;# vectors for dividing lines&lt;br /&gt;# down on y axis&lt;br /&gt;movedown = (0, -2.2, 0)&lt;br /&gt;# up on y axis&lt;br /&gt;mvup = (0, 2.2, 0)&lt;br /&gt;# flip right around z axis&lt;br /&gt;flprt = (0, 0, -52.5)&lt;br /&gt;&lt;br /&gt;# scale - same in all directions (2)&lt;br /&gt;scal = (2, 2, 2)&lt;br /&gt;&lt;br /&gt;# turn for display&lt;br /&gt;trn15back = (0, -15, 0)&lt;br /&gt;&lt;br /&gt;planes = [horizontaldividingline, verticaldividingline]&lt;br /&gt;&lt;br /&gt;# vertical planes&lt;br /&gt;EIGHTHTURN = 45&lt;br /&gt;turn = 45&lt;br /&gt;for counter in range(3):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plane = pov.Object(verticaldividingline, rotate = (0, turn, 0))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; planes.append(plane)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; turn += EIGHTHTURN&lt;br /&gt;&lt;br /&gt;# for dividing lines at angle to horizontal&lt;br /&gt;QUARTERTURN = 90&lt;br /&gt;flprtdivlinepre = pov.Object(horizontaldividingline,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; translate = movedown, rotate = flprt)&lt;br /&gt;flprtdivline = pov.Object(flprtdivlinepre, translate = mvup)&lt;br /&gt;&lt;br /&gt;planes.append(flprtdivline)&lt;br /&gt;turn = 90&lt;br /&gt;for counter in range(3):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plane = pov.Object(flprtdivline, rotate = (0, turn, 0))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; planes.append(plane)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; turn += QUARTERTURN&lt;br /&gt;&lt;br /&gt;sorokoplanes = pov.Union(*planes)&lt;br /&gt;&lt;br /&gt;eggwhite = pov.Object(unionegg, white, scale = scal)&lt;br /&gt;&lt;br /&gt;sorokolines = pov.Intersection(eggwhite, sorokoplanes)&lt;br /&gt;&lt;br /&gt;sorokotest = pov.Object(sorokolines, translate = (0, -2.75, 0), rotate = trn15back)&lt;/div&gt;&lt;div style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;span style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;The egg design is very symmetrical and lends itself to repetition.&amp;nbsp; I tried to use this to my advantage with the two loops.&amp;nbsp; The list unpacking also compresses the code a bit.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;span style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;Next on the agenda is placing code in functions and classes.&amp;nbsp; This would allow for making multiple eggs of different colors with a single code call.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-8611308235843118378?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/8611308235843118378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/12/more-pov-ray.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8611308235843118378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8611308235843118378'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/12/more-pov-ray.html' title='More POV-ray'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_27GcakEGOHc/TQbUQBlbdvI/AAAAAAAAANA/4TV91xjNFTs/s72-c/eggattempt2.bmp' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-3450420573927492151</id><published>2010-12-05T11:11:00.000-08:00</published><updated>2010-12-05T11:11:49.450-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#povray #python #pysanky'/><title type='text'>POV-ray</title><content type='html'>I messed around with POV-ray a bit about five years ago and recently tried to resurrect some of that code.&lt;br /&gt;&lt;br /&gt;There's a recipe for a &lt;a href="http://code.activestate.com/recipes/205451-povray-for-python/"&gt;POV-ray - Python API by Simon Burton out on ActiveState&lt;/a&gt; that I wanted to try.&lt;br /&gt;&lt;br /&gt;Here is the shape I was trying to re-create with the Python API:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/TPvVYFZZowI/AAAAAAAAAMw/GCk41wHUatc/s1600/eggattempt2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/TPvVYFZZowI/AAAAAAAAAMw/GCk41wHUatc/s1600/eggattempt2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Literally, an Easter egg, a bit involved, but not overly complex.&amp;nbsp; The egg shape is borrowed from &lt;a href="http://www.f-lohmueller.de/"&gt;Friedrich Lohmüller's POV-ray site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There is a simple example in the API which I've slightly modified to make a partially lit sphere:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# renamed recipe as pypov&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import pypov as pov&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;file = pov.File('test2.pov', 'colors.inc')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;cam = pov.Camera(location = (0, 1, -5), look_at = (0, -0.5, 2))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sphere = pov.Sphere((0, 0, 0), 1.5, pov.Texture(pov.Pigment(color = 'Blue')))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;light = pov.LightSource((2, 4, -3), color = 'White')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;file.write(cam, sphere, light)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This, after its output is run through POV-ray, yields this:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/TPvYCpH2H3I/AAAAAAAAAM0/meUt-GK4Yf8/s1600/partiallylitsphere.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/TPvYCpH2H3I/AAAAAAAAAM0/meUt-GK4Yf8/s1600/partiallylitsphere.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;It won't win any animation awards, but it's pretty nonetheless.&lt;br /&gt;&lt;br /&gt;The code for Lohmüller's egg shape looks like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# renamed recipe as pypov&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import pypov as pov&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;file = pov.File('test3.pov', 'colors.inc')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;cam = pov.Camera(location = (0, 1, -5), look_at = (0, -0.5, 2))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sphereupper = pov.Sphere((0, 0, 0), 1.0, pov.Texture(pov.Pigment(color = 'Blue')), scale = (1, 1.55, 1))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;slabupper = pov.Box((-1, -1.55, -1), (1, 0, 1))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;diffupper = pov.Difference(sphereupper, slabupper)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;spherelower = pov.Sphere((0, 0, 0), 1.0, pov.Texture(pov.Pigment(color = 'Blue')), scale = (1, 1.15, 1))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;slablower = pov.Box((-1, 0, -1), (1, 1.15, 1)) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;difflower = pov.Difference(spherelower, slablower)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;union = pov.Union(difflower, diffupper, translate = (0, 0.55, 0), scale = 1.0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;light = pov.LightSource((2, 4, -3), color = 'White')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;light2 = pov.LightSource((-2, -4, -3), color = 'White')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;file.write(cam, union, light, light2)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;and the output looks like this:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/TPvhTTYmBHI/AAAAAAAAAM8/UnBXHzgEbNw/s1600/blueegg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/TPvhTTYmBHI/AAAAAAAAAM8/UnBXHzgEbNw/s1600/blueegg.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;That is about as far as I got with the Python API.&amp;nbsp; The problems I was having were related to trying to shoehorn my POV-ray code into the API.&amp;nbsp; I added an Object class for the purpose of assigning attributes to predefined shapes.&amp;nbsp; The problem there is that you can't use the same keyword more than once (translate, then&amp;nbsp; rotate, then translate again).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Going forward I plan to work with simpler shapes (merging two parts instead of 50 or so).&amp;nbsp; Also, I'll need to leverage what the API offers against working within its limitations.&amp;nbsp; It will not be a one to one code translation between POV-ray and Python.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-3450420573927492151?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/3450420573927492151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/12/pov-ray.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/3450420573927492151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/3450420573927492151'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/12/pov-ray.html' title='POV-ray'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_27GcakEGOHc/TPvVYFZZowI/AAAAAAAAAMw/GCk41wHUatc/s72-c/eggattempt2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-3826044255043693685</id><published>2010-10-25T17:01:00.000-07:00</published><updated>2010-10-25T17:03:13.615-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#regularexpressions #jython #ironpython #python #unicode'/><title type='text'>Regular Expression Unicode Blocks in IronPython and jython</title><content type='html'>&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;One last thing that's available in jython and IronPython, but not in CPython regular expressions is Unicode Blocks.&amp;nbsp; Blocks are similar to Unicode Scripts, but do not correspond one to one with them.&amp;nbsp; Blocks, as the name implies, represent continuous sequences of Unicode code points.&amp;nbsp; &lt;a href="http://www.regular-expressions.info/unicode.html"&gt;This page&lt;/a&gt;, recommended to me by artisonian on twitter, has a good synopsis.&lt;br /&gt;&lt;br /&gt;Where Unicode Blocks are most useful (where they correspond best with Unicode Scripts) is in the South Asian languages (India and vicinity).&amp;nbsp; Here is some code written for the detection of Bengali characters in a string in IronPython and jython.&amp;nbsp; The syntax is similar. &lt;br /&gt;&lt;br /&gt;Iron Python&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/bin/mono /home/carl/IronPython-2.0.3/ipy.exe&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IronPython 2.0.3 (2.0.0.0) on .NET 2.0.50727.1433&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; from System.Text import RegularExpressions as regex&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; fle = open('bengalisnippet', 'r')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; linex = fle.readline()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; fle.close()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; rex = regex.Regex(r'\p{IsBengali}+')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; linex = linex.decode('utf-8')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; mtchx = rex.Match(linex)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; mtchx.ToString()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;u'\u0995\u09bf\u099b\u09c1'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; mtchx.Success&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;True&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;jython&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54)&lt;br /&gt;[OpenJDK Client VM (Sun Microsystems Inc.)] on java1.7.0-internal&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from java.util import regex&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; rex = regex.Pattern.compile(r'\p{InBengali}+')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; fle = open('bengalisnippet', 'r')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; linex = fle.readline()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; linex = linex.decode('utf-8')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; mtchx = rex.matcher(linex)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; mtchx&lt;br /&gt;java.util.regex.Matcher[pattern=\p{InBengali}+ region=0,5 lastmatch=]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; mtchx.find()&lt;br /&gt;True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; mtchx.start()&lt;br /&gt;0&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; mtchx.end()&lt;br /&gt;4&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; linex&lt;br /&gt;u'\u0995\u09bf\u099b\u09c1\n'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-3826044255043693685?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/3826044255043693685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/10/regular-expression-unicode-blocks-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/3826044255043693685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/3826044255043693685'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/10/regular-expression-unicode-blocks-in.html' title='Regular Expression Unicode Blocks in IronPython and jython'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-555236974162080153</id><published>2010-10-23T11:55:00.000-07:00</published><updated>2010-10-23T11:55:39.226-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#IronPython #unicode #python #.NET'/><title type='text'>IronPython, unicode, and regular expressions</title><content type='html'>&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;This is a quick follow on to my &lt;a href="http://pyright.blogspot.com/2010/10/jython-regular-expressions-and-unicode.html"&gt;last post&lt;/a&gt; on jython.&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The basic idea is that .NET has the capability to search for characters belonging to Unicode general categories (in this case Mn for non-spacing character).&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IronPython 2.0.3 (2.0.0.0) on .NET 2.0.50727.1433&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; import unicodedata&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; from System.Text import RegularExpressions as regex&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; nonspacingx = regex.Regex(r'\p{Mn}')&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; ns = unichr(0x9C1)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; ns&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;u'\u09c1'&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; nonspacingx.Match(ns)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;System.Text.RegularExpressions.Match object at 0x000000000000002B [?]&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; ns = u'a' + ns&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; ns&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;u'a\u09c1'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; mtchx = nonspacingx.Match(ns)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;System.Text.RegularExpressions.Match object at 0x000000000000002C [?]&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; mtchx.ToString()&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;u'\u09c1'&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; mtchx.Index&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; mtchx.Length&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; mtchx.Success&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;True&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Although the names are different, Java and .NET both provide a means of using general categories in regular expressions.&amp;nbsp; Match in .NET matches occurrences within the string, not just at the start.&amp;nbsp; Success is the boolean value indicating a match.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;As an aside, the unicodedata module referenced in the &lt;a href="http://pyright.blogspot.com/2010/10/jython-regular-expressions-and-unicode.html"&gt;jython post&lt;/a&gt; is available for IronPython.&amp;nbsp; It is not in the download for either IronPython or FePy, but is available as a &lt;a href="http://fepy.svn.sourceforge.net/viewvc/fepy/trunk/lib/unicodedata.py?view=log"&gt;separate download&lt;/a&gt; from the FePy site.&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-555236974162080153?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/555236974162080153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/10/ironpython-unicode-and-regular.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/555236974162080153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/555236974162080153'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/10/ironpython-unicode-and-regular.html' title='IronPython, unicode, and regular expressions'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-5511682599445261267</id><published>2010-10-23T09:01:00.000-07:00</published><updated>2010-10-23T09:05:42.084-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#jython #unicode #regularexpressions #python'/><title type='text'>jython, regular expressions, and unicode</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Jython enables access to Java's regular expression classes and methods.&amp;nbsp; One feature of Java's regular expression library that Python does not have is the ability to search on Unicode general categories (&lt;/span&gt;&lt;a href="http://unicode.org/Public/UNIDATA/PropertyValueAliases.txt" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;http://unicode.org/Public/UNIDATA/PropertyValueAliases.txt&lt;/a&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;).&amp;nbsp; These are abbreviations:&amp;nbsp; Mn = non-spacing character, Lu = uppercase letter, etc.&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Here is a quick example for Mn (non-spacing).&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ /usr/local/jdk-1.7.0/bin/java -jar jython.jar&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[OpenJDK Client VM (Sun Microsystems Inc.)] on java1.7.0-internal&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; from java.util import regex&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; nonspacingx = regex.Pattern.compile(r'\p{Mn}')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; import unicodedata&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; for charcode in range(0x900, 0xA00):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mtchx = nonspacingx.matcher(unichr(charcode))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if mtchx.matches():&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'match at character %X, %s' % (charcode, unicodedata.name(unichr(charcode)))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 901, DEVANAGARI SIGN CANDRABINDU&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 902, DEVANAGARI SIGN ANUSVARA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 93C, DEVANAGARI SIGN NUKTA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 941, DEVANAGARI VOWEL SIGN U&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 942, DEVANAGARI VOWEL SIGN UU&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 943, DEVANAGARI VOWEL SIGN VOCALIC R&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 944, DEVANAGARI VOWEL SIGN VOCALIC RR&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 945, DEVANAGARI VOWEL SIGN CANDRA E&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 946, DEVANAGARI VOWEL SIGN SHORT E&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 947, DEVANAGARI VOWEL SIGN E&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 948, DEVANAGARI VOWEL SIGN AI&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 94D, DEVANAGARI SIGN VIRAMA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 951, DEVANAGARI STRESS SIGN UDATTA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 952, DEVANAGARI STRESS SIGN ANUDATTA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 953, DEVANAGARI GRAVE ACCENT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 954, DEVANAGARI ACUTE ACCENT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 962, DEVANAGARI VOWEL SIGN VOCALIC L&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 963, DEVANAGARI VOWEL SIGN VOCALIC LL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 981, BENGALI SIGN CANDRABINDU&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 9BC, BENGALI SIGN NUKTA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 9C1, BENGALI VOWEL SIGN U&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 9C2, BENGALI VOWEL SIGN UU&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 9C3, BENGALI VOWEL SIGN VOCALIC R&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 9C4, BENGALI VOWEL SIGN VOCALIC RR&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 9CD, BENGALI SIGN VIRAMA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 9E2, BENGALI VOWEL SIGN VOCALIC L&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;match at character 9E3, BENGALI VOWEL SIGN VOCALIC LL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;That's nice, but how about a less contrived example.&amp;nbsp; I got a Bengali word off one of the links on the &lt;a href="http://wiki.python.org/moin/BengaliLanguage"&gt;BengaliLanguage page&lt;/a&gt; on the &lt;a href="http://wiki.python.org/moin/"&gt;Python Wiki&lt;/a&gt;.&amp;nbsp; The word is saved to a file bengalisnippet.&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;All I have to do is open the file, get the line and let my regex rip, right?&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; fle = open('bengalisnippet', 'r')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; linex = fle.readline()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; linex = linex.decode('utf-8')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; mtchx = nonspacingx.matcher(linex)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; mtchx.matches()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;False&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Um, no.&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Let's investigate and try this again.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; linex&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;u'\u0995\u09bf\u099b\u09c1\n'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; unicodedata.category(linex[0])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;'Lo'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; unicodedata.category(linex[1])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;'Mc'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; unicodedata.category(linex[2])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;'Lo'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; unicodedata.category(linex[3])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;'Mn'&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;OK, the character we're looking for is the last one (except for the return character).&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; mtchx.find()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;True&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; mtchx.start()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; mtchx.end()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I was using the wrong method (matches).&amp;nbsp; find is analogous to search in Python.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;For me the utility of this is being able to determine if characters are rendering correctly.&amp;nbsp; I can locate the trouble spots in an unfamiliar language's script and investigate them (combining and non-spacing characters don't always show up correctly).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Java regular expressions are a bit more involved than Python's.&amp;nbsp; This is one case where the extra effort required may be worth the trouble. &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-5511682599445261267?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/5511682599445261267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/10/jython-regular-expressions-and-unicode.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/5511682599445261267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/5511682599445261267'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/10/jython-regular-expressions-and-unicode.html' title='jython, regular expressions, and unicode'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-5567940382935322665</id><published>2010-10-18T18:50:00.000-07:00</published><updated>2010-10-18T18:50:39.972-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#jython #python #java #regularexpressions'/><title type='text'>java.lang.String.matches method</title><content type='html'>&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Recently I've been working on learning regular expressions.&amp;nbsp; Something about the Java implementation (in jython) I found curious.&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54)&lt;br /&gt;[OpenJDK Client VM (Sun Microsystems Inc.)] on java1.7.0-internal&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from java.lang import String&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; teststring = String('def hello():')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; teststring.matches(r'\s*def\s+\w*\(\):$')&lt;br /&gt;True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Python has the re.match and re.search methods.&amp;nbsp; C# has something similar.&amp;nbsp; This just seemed like a strange, less efficient construct (presumably the regular expression gets interpreted on the fly instead of compiled).&amp;nbsp; Go figure.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-5567940382935322665?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/5567940382935322665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/10/javalangstringmatches-method.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/5567940382935322665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/5567940382935322665'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/10/javalangstringmatches-method.html' title='java.lang.String.matches method'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-7240457584302480291</id><published>2010-10-03T16:32:00.000-07:00</published><updated>2010-10-03T16:32:31.776-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#JavaScript #ZenofPython #W3Cvalidator'/><title type='text'>Second Javascript Attempt - the Zen of Python (again)</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;Last time, in my enthusiasm, I published some not ready for prime time html/JavaScript code. &amp;nbsp;Since then the &lt;a href="http://validator.w3.org/"&gt;W3C validator&lt;/a&gt; has helped me to see the error of my ways. &amp;nbsp;This is my second shot at making the first part of the Zen of Python magically appear in a web browser:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/TKkSIsdpNSI/AAAAAAAAAMs/MdWdQJN1-Ug/s1600/zen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="295" src="http://2.bp.blogspot.com/_27GcakEGOHc/TKkSIsdpNSI/AAAAAAAAAMs/MdWdQJN1-Ug/s320/zen.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;        "http://www.w3.org/TR/html4/strict.dtd"&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;lt;HTML&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;lt;HEAD&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    &amp;lt;meta http-equiv="Content-type" content="text/html;charset=UTF-8"&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;lt;TITLE&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;The Zen of Python, by Tim Peters&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;lt;/TITLE&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;lt;SCRIPT TYPE="text/javascript"&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;// function to put keys into Array&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;getkeysx = function(hashx) {&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    var keysy = [];&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    for (keyz in hashx) {&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;        keysy.push(keyz);&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    }&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    return keysy;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;}&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;addheaderx = function(headerid) {&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    var dx = document.createElement("DIV");&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    dx.id = 'div' + headerid;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    var hx = document.createElement("H2");&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    hx.id = headerid;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    hx.style.textAlign = 'center';&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    hx.style.fontFamily = 'sans-serif';&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    document.getElementById('bodyx').appendChild(dx);&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    document.getElementById('div' + headerid).appendChild(hx);&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    document.getElementById(headerid).innerHTML = '';&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;}&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;var timex = new Date();&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;var objx = {timetowork:timex, &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;number1:'Beautiful is better than ugly.',&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;number2:'Explicit is better than implicit.', &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;number3:'Simple is better than complex.',&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;number4:'Complex is better than complicated.',&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;number5:'Flat is better than nested.',&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;number6:'Sparse is better than dense.',&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;number7:'Readability counts.'};&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;var INTERVALX = 3000;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;addheaders = function() {&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    var i = 1;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    for (keyn in objx) {&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;        addheaderx('header' + i);&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;        i++;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    }&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;}&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;var keysx = getkeysx(objx);&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;var keytracker = 0;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;var colortracker = 0;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;colorsx = ['red', 'green', 'blue', 'black', 'indigo', &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;           'deeppink', 'darkslategray', &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;           'darkmagenta', 'darkturquoise']&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;var counter = 1;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;// function to write key-value pair to text box&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;writeprop = function() {&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    objx.timetowork = Date();&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    if (keytracker &amp;gt;= keysx.length) {&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;        for (var j = 1; j &amp;lt; keysx.length + 1; j++) {&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;            document.getElementById('header' + j).innerHTML = '';&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;        }&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;        keytracker = 0;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    }&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    if (colortracker &amp;gt;= colorsx.length) {&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;        colortracker = 0;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    }&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    if (counter &amp;gt;= keysx.length + 1) {&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;        counter = 1;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    }&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    document.getElementById('header' + counter).innerHTML = objx[keysx[keytracker]];&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    document.getElementById('header' + counter).style.color = colorsx[colortracker];&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    setTimeout('writeprop()', INTERVALX);&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    keytracker++;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    colortracker++;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    counter++;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;}&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;doall = function() {&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    addheaders();&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    writeprop();&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;}&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;// --&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;lt;/SCRIPT&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;lt;/HEAD&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;lt;BODY ID = "bodyx" ONLOAD = "setTimeout('doall()', INTERVALX);"&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    &amp;lt;H1 ID = "zen" STYLE = "text-align:center;font-family:sans-serif"&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    THE ZEN OF PYTHON&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;    &amp;lt;/H1&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;lt;/BODY&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;lt;/HTML&amp;gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-7240457584302480291?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/7240457584302480291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/10/second-javascript-attempt-zen-of-python.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/7240457584302480291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/7240457584302480291'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/10/second-javascript-attempt-zen-of-python.html' title='Second Javascript Attempt - the Zen of Python (again)'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_27GcakEGOHc/TKkSIsdpNSI/AAAAAAAAAMs/MdWdQJN1-Ug/s72-c/zen.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-7820757777345643196</id><published>2010-10-01T17:57:00.000-07:00</published><updated>2010-10-01T17:57:19.793-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#JavaScript #ZenofPython'/><title type='text'>JavaScript attempt - the Zen of Python</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I just completed a JavaScript course and couldn't resist messing with a web page (html file).&amp;nbsp; This rotates through the first part of the Zen of Python at five second intervals (warning - newbish code): &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;HTML&amp;gt;&lt;br /&gt;&amp;lt;DOCUMENT&amp;gt;&lt;br /&gt;&amp;lt;HEAD&amp;gt;&lt;br /&gt;&amp;lt;TITLE&amp;gt;&lt;br /&gt;The Zen of Python, by Tim Peters&lt;br /&gt;&amp;lt;/TITLE&amp;gt;&lt;br /&gt;&amp;lt;SCRIPT LANGUAGE="JavaScript"&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;var STYLEX = "border-width:0px;";&lt;br /&gt;STYLEX += "border-style:solid;";&lt;br /&gt;STYLEX += "font-family:sans-serif;";&lt;br /&gt;STYLEX += "color:blue";&lt;br /&gt;&lt;br /&gt;// function to put keys into Array&lt;br /&gt;getkeysx = function(hashx) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var keysy = [];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (keyz in hashx) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; keysy.push(keyz);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return keysy;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;addbr = function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var brx = document.createElement("BR");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.formx.appendChild(brx);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;addx = function(idx) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; addbr();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var textx = document.createElement("INPUT");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; textx.type = ("TEXT");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; textx.value = "";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; textx.id = idx;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; textx.size = 50;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; textx.readonly = 'readonly';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; textx.style.borderWidth = '0px';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; textx.style.fontFamily = 'sans-serif';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; textx.style.fontSize = '2.75em';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; textx.style.color = 'blue';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; textx.style.textAlign = 'center';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.formx.appendChild(textx);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; addbr();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; addbr();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; addbr();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var timex = new Date();&lt;br /&gt;var objx = {timetowork:timex, &lt;br /&gt;number1:'Beautiful is better than ugly.',&lt;br /&gt;number2:'Explicit is better than implicit.', &lt;br /&gt;number3:'Simple is better than complex.',&lt;br /&gt;number4:'Complex is better than complicated.',&lt;br /&gt;number5:'Flat is better than nested.',&lt;br /&gt;number6:'Sparse is better than dense.',&lt;br /&gt;number7:'Readability counts.'};&lt;br /&gt;&lt;br /&gt;addtextboxes = function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var i = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (keyn in objx) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addx('text' + i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var keysx = getkeysx(objx);&lt;br /&gt;var keytracker = 0;&lt;br /&gt;var colortracker = 0;&lt;br /&gt;colorsx = ['red', 'green', 'blue', 'black', 'indigo', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'deeppink', 'darkslategray', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'darkmagenta', 'darkturquoise']&lt;br /&gt;&lt;br /&gt;var counter = 1;&lt;br /&gt;// function to write key-value pair to text box&lt;br /&gt;writeprop = function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objx.timetowork = Date();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (keytracker &amp;gt;= keysx.length) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var j = 1; j &amp;lt; keysx.length + 1; j++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.formx['text' + j].value = '';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; keytracker = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (colortracker &amp;gt;= colorsx.length) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; colortracker = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (counter &amp;gt;= keysx.length + 1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; counter = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.formx['text' + counter].value = objx[keysx[keytracker]];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.formx['text' + counter].style.color = colorsx[colortracker];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setTimeout('writeprop()', 5000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; keytracker++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; colortracker++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; counter++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;doall = function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; addtextboxes();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeprop();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// --&amp;gt;&lt;br /&gt;&amp;lt;/SCRIPT&amp;gt;&lt;br /&gt;&amp;lt;/HEAD&amp;gt;&lt;br /&gt;&amp;lt;BODY ONLOAD = "setTimeout('doall()', 3000);"&amp;gt;&lt;br /&gt;&amp;lt;FORM NAME = "formx"&amp;gt;&lt;br /&gt;&amp;lt;/FORM&amp;gt;&lt;br /&gt;&amp;lt;/BODY&amp;gt;&lt;br /&gt;&amp;lt;/DOCUMENT&amp;gt;&lt;br /&gt;&amp;lt;/HTML&amp;gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-7820757777345643196?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/7820757777345643196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/10/javascript-attempt-zen-of-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/7820757777345643196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/7820757777345643196'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/10/javascript-attempt-zen-of-python.html' title='JavaScript attempt - the Zen of Python'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-5453598955169460830</id><published>2010-08-23T12:44:00.000-07:00</published><updated>2010-08-23T12:44:01.055-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#python #java #jython #arabic #RTL'/><title type='text'>More RTL Python Editor</title><content type='html'>Last time I tried to introduce the idea of an RTL Python editor for RTL languages like Arabic, Persian, Urdu, and Hebrew.&lt;br /&gt;&lt;br /&gt;The idea is a little further along.&amp;nbsp; I've gotten some Arabic and Urdu fonts installed.&amp;nbsp; Also, the editor is capable of handling dictionaries, lists, tuples, and classes (there is code for brace type characters and an Arabic comma).&lt;br /&gt;&lt;br /&gt;Here is a screenshot for a function that is all in Arabic except for the Python keywords (apologies to the Arabic speaking readership - the words are probably nonsense, as I just cut and pasted them randomly from the Python wiki's Arabic page):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S6vv4V4CJ7I/AAAAAAAAAMU/uvpinqjSecA/s1600/backwardsfunction.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/_27GcakEGOHc/S6vv4V4CJ7I/AAAAAAAAAMU/uvpinqjSecA/s320/backwardsfunction.png" width="307" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The editor is written in Java.&amp;nbsp; I'm working on writing the transfer to and from interpretable Python code in jython.&lt;br /&gt;&lt;br /&gt;The approach I've taken is, if not a brute force one, definitely a forced one.&amp;nbsp; Trying to mix and match left to right with bidirectional and right to left is tricky.&amp;nbsp; To get around this I treat everything between whitespace and special characters (braces, colons, periods) as individual pieces of text.&amp;nbsp;&amp;nbsp; I further separate the text from whitespace and special characters through the use of the non-spacing, invisible Unicode character 200e.&amp;nbsp; That character forces the editor back into left to right mode between words.&amp;nbsp; Time will tell if this was a viable design decision.&lt;br /&gt;&lt;br /&gt;For now it's one more step away from vaporware and towards releasable open source software.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-5453598955169460830?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/5453598955169460830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/5453598955169460830'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/03/more-rtl-python-editor.html' title='More RTL Python Editor'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_27GcakEGOHc/S6vv4V4CJ7I/AAAAAAAAAMU/uvpinqjSecA/s72-c/backwardsfunction.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-8684076463982717372</id><published>2010-03-09T19:55:00.000-08:00</published><updated>2010-03-24T18:17:57.601-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#python #unicodeidentifiers #arabic #python3.1 #RTL'/><title type='text'>Attempt at an RTL Editor for Python</title><content type='html'>In previous posts, I've written about the possibilities offered by Python 3.1's Unicode identifier capability, as well as the new challenges posed when one tries to display them on screen.&lt;br /&gt;&lt;br /&gt;As the final project for my Java course, I set about trying to create an editor that would allow the user to enter text right to left, but save it as valid interpretable (is that a word?) Python 3.x code:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S5cOMH3ydTI/AAAAAAAAAMM/oqSFGeIXhZs/s1600-h/backwardseditor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="215" src="http://4.bp.blogspot.com/_27GcakEGOHc/S5cOMH3ydTI/AAAAAAAAAMM/oqSFGeIXhZs/s400/backwardseditor.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There's still a good deal of work to be done on this, but this is a start.&amp;nbsp; Hopefully I'll have something more robust next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-8684076463982717372?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/8684076463982717372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/03/attempt-at-rtl-editor-for-python.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8684076463982717372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8684076463982717372'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/03/attempt-at-rtl-editor-for-python.html' title='Attempt at an RTL Editor for Python'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_27GcakEGOHc/S5cOMH3ydTI/AAAAAAAAAMM/oqSFGeIXhZs/s72-c/backwardseditor.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-4546457991627153004</id><published>2010-02-24T18:16:00.000-08:00</published><updated>2010-02-24T18:16:57.438-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#pycon-us #pycon #unicode #python #python3.1 #unicodedata'/><title type='text'>Unicode Poster From Pycon 2010 Up</title><content type='html'>I posted my poster to &lt;a href="http://www.slideshare.net/infixum/pyconunicode2010"&gt;Slideshare &lt;/a&gt;in Open Office Presentation format.&amp;nbsp; The file is about 13 or 14 megs in size.&amp;nbsp; The embedded poster was in png format to preserve the shape of the foreign glyphs.&lt;br /&gt;&lt;br /&gt;A number of people asked me at the poster session for sources.&amp;nbsp; Here are the main ones:&lt;br /&gt;&lt;br /&gt;1) Wikipedia - perhaps not the ultimate authority on all things, but a good place to research foreign languages and scripts.&lt;br /&gt;&lt;br /&gt;2) the O'Reilly book &lt;i&gt;Fonts and Encodings&lt;/i&gt; by Haralambous.&amp;nbsp; If you know little about Unicode and fonts, this is the next best thing to Knuth.&lt;br /&gt;&lt;br /&gt;3) the Python 3.1 interpreter and the unicodedata module.&amp;nbsp; Once you get the basics of Unicode down, the unicodedata module has most of what you'll need.&lt;br /&gt;&lt;br /&gt;4) Google searches and language promotion websites - laoconnection is a site that comes to mind.&amp;nbsp; Most people are proud of their languages and culture and want to share them.&lt;br /&gt;&lt;br /&gt;Thanks to everyone who stopped by the poster.&amp;nbsp; That was fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-4546457991627153004?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/4546457991627153004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/02/unicode-poster-from-pycon-2010-up.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/4546457991627153004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/4546457991627153004'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/02/unicode-poster-from-pycon-2010-up.html' title='Unicode Poster From Pycon 2010 Up'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-7320161364554191453</id><published>2010-02-23T09:21:00.000-08:00</published><updated>2010-02-24T14:50:57.142-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#travel #pycon #pycon-us #conferences #foss'/><title type='text'>FOSS Conference Economics</title><content type='html'>Just got back from Pycon - great show.&lt;br /&gt;&lt;br /&gt;I've had some time to reflect on how to make conference going affordable, and where my money goes.&amp;nbsp; This year I was partially funded by my employer.&amp;nbsp; I was quite grateful, as I wasn't expecting anything.&lt;br /&gt;&lt;br /&gt;What has concerned me in the past is the amount of money put out on travel and hotels.&amp;nbsp; If you're inside the US, Pycon(US) will see the biggest chunk of your money going to the hotel.&amp;nbsp; This is where people (or at least me) say, "Hey, wait a second, all my monetary support for the Open Source Software movement is going to the hotel industry!"&amp;nbsp; Not so fast - actually, although your money doesn't support FOSS directly, it does keep it from *losing* money.&amp;nbsp; To secure a hotel/convention facility for more than 1000 people, there has to be a commitment on rooms.&amp;nbsp; I've seen other devs stay at cheaper hotels for conferences - this is a good approach, if it's done out of necessity.&amp;nbsp; I generally try to stay at the conference hotel in order to support the continued success of the conference - to make sure the conference doesn't lose money.&lt;br /&gt;&lt;br /&gt;The travel argument goes roughly the same way - you can't have a conference if people don't show.&amp;nbsp; Even though most of your money is going to the airlines (in the case of Pycon(US) for those outside the United States), your attendance is a plus.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-7320161364554191453?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/7320161364554191453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/02/foss-conference-economics.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/7320161364554191453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/7320161364554191453'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/02/foss-conference-economics.html' title='FOSS Conference Economics'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-1354930451647548585</id><published>2010-02-07T18:04:00.000-08:00</published><updated>2010-02-09T07:11:11.020-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python #unicode #python3.1 #UnicodeDecodeError'/><title type='text'>Handling UnicodeEncodeError in the Console (Python 3.1)</title><content type='html'>I've been working with a lot of different foreign scripts for the past six months or so. &amp;nbsp;Ideally I like to work in the console where possible. &amp;nbsp;An error that always comes up is the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;[carl@pcbsd]/home/carl(139)% python3.1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;Python 3.1.1 (r311:74480, Jan 17 2010, 23:15:26)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;[GCC 4.2.1 20070719 [FreeBSD]] on freebsd7&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; print('\u0400')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;Traceback (most recent call last):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;File "&lt;/span&gt;&lt;stdin&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;", line 1, in &lt;/span&gt;&lt;module&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;UnicodeEncodeError: 'ascii' codec can't encode character '\u0400' in position 0: ordinal not in range(128)&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/module&gt;&lt;/stdin&gt;&lt;br /&gt;&lt;br /&gt;After a while this can get pretty annoying. &amp;nbsp;There's a number of ways to get around the problem. &amp;nbsp;I don't know much about most of the languages I'm dealing with, so I prefer the Unicode code charts' capitalized ASCII descriptions to glyphs or empty boxes. &amp;nbsp;Fortunately the unicodedata module has all this information available.&lt;br /&gt;&lt;br /&gt;To get the output I wanted I came up with a little script:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;# mockprint.py - wrapper around print &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;# function to handle &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;# UnicodeEncoding errors&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;# python 3.1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;import unicodedata&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ERRORSTR = "'ascii' codec can't encode character "&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CHARIDX = 5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;POSITIDX = 8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;POSITIDX2 = 7&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;def mockprint(stringx):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; """&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; Wrapper for print() function that&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; replaces unprintable characters&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; with their Unicode names.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; """&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; try:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(stringx)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; except UnicodeEncodeError as e:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # main cases:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 1) one character can't be printed&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 2) multiple characters in a row can't be printed&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 3) unicode character is first or last in string&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 4) other ascii characters surround the unicode ones&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; reasonx = str(e)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; reasonx = reasonx.split(' ')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; idx = reasonx[POSITIDX]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # more than 1 char in a row can't be printed&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if idx == 'ordinal':&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; idx = int(reasonx[POSITIDX2][0])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if idx != 0:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(stringx[:idx])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(unicodedata.name(&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;stringx[idx]&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mockprint(stringx[(idx + 1):])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # offending character shows up after ascii chars&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elif len(stringx) &amp;gt; 1:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; charx = int(reasonx[CHARIDX][3:-1], 16)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; charx = chr(charx)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(unicodedata.name(charx))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mockprint(stringx[(int(idx[0]) + 1):])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # end of the line&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elif len(stringx) == 1:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; charx = int(reasonx[CHARIDX][3:-1], 16)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; charx = chr(charx)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(unicodedata.name(charx))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A quick demo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; import mockprint&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; mockprint.mockprint('hello\u0401\u0402\u0403\u0404world')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;hello&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC CAPITAL LETTER IO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC CAPITAL LETTER DJE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC CAPITAL LETTER GJE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC CAPITAL LETTER UKRAINIAN IE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;world&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And something a bit more challenging:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S29inwn_7TI/AAAAAAAAAL0/pd2TqrFuTb4/s1600-h/foreignlangbytes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S29inwn_7TI/AAAAAAAAAL0/pd2TqrFuTb4/s320/foreignlangbytes.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;A few foreign words in a number of different languages.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; fle = open('/home/carl/pythonblog/foreignbytestest', 'rt', encoding = 'UTF-8')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; import mockprint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; for linex in fle.readlines():&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mockprint.mockprint(linex)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CJK UNIFIED IDEOGRAPH-65E5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CJK UNIFIED IDEOGRAPH-672C&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CJK UNIFIED IDEOGRAPH-8A9E&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;abcde&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ETHIOPIC SYLLABLE GLOTTAL A&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ETHIOPIC SYLLABLE MAA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ETHIOPIC SYLLABLE RE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ETHIOPIC SYLLABLE NYAA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ARMENIAN CAPITAL LETTER HO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ARMENIAN SMALL LETTER AYB &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ARMENIAN SMALL LETTER YI&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ARMENIAN SMALL LETTER ECH &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ARMENIAN SMALL LETTER REH&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ARMENIAN SMALL LETTER ECH&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ARMENIAN SMALL LETTER NOW&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ORIYA LETTER O&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ORIYA LETTER DDA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ORIYA SIGN NUKTA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ORIYA VOWEL SIGN I&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;ORIYA LETTER AA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;LAO LETTER PHO TAM&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;LAO VOWEL SIGN AA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;LAO LETTER SO SUNG&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;LAO VOWEL SIGN AA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;LAO LETTER LO LOOT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;LAO VOWEL SIGN AA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;LAO LETTER WO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC SMALL LETTER ER&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC SMALL LETTER U&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC SMALL LETTER ES&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC SMALL LETTER ES&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC SMALL LETTER KA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC SMALL LETTER I&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC SMALL LETTER SHORT I&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC SMALL LETTER YA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC SMALL LETTER ZE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC SMALL LETTER YERU&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;,&amp;quot;Courier [Adobe]&amp;quot;,monospace;"&gt;CYRILLIC SMALL LETTER KA&lt;/span&gt;&lt;br /&gt;&lt;div align="left" class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Well, if that isn't beautiful, I don't know what is.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Seriously, this is a hack - parsing an error string and working backwards?&amp;nbsp; I've got to be joking.&amp;nbsp; Actually, no.&amp;nbsp; For as much time as I've spent remembering after the fact that I can't print Unicode in the console, this is worth it, even if it's only good for Python 3.1.&lt;/div&gt;&lt;div align="left" class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-1354930451647548585?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/1354930451647548585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/02/handling-unicodeencodeerror-in-console.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/1354930451647548585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/1354930451647548585'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/02/handling-unicodeencodeerror-in-console.html' title='Handling UnicodeEncodeError in the Console (Python 3.1)'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_27GcakEGOHc/S29inwn_7TI/AAAAAAAAAL0/pd2TqrFuTb4/s72-c/foreignlangbytes.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-1630142392226344388</id><published>2010-02-02T21:13:00.000-08:00</published><updated>2010-02-02T21:14:07.881-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python openbsd DoubleAssociation dictionarystructure'/><title type='text'>py-openbsd's DoubleAssociation</title><content type='html'>I briefly covered this structure last time, but didn't do it justice.&amp;nbsp; The idea of a two-way dictionary structure (keys and values are both keys) intrigued me. I wanted to give it a spin with a real world example.&lt;br /&gt;&lt;br /&gt;I've chosen a simple example with a few domain name (common names) and ip addresses:&lt;br /&gt;&lt;br /&gt;# dblassoc.py&lt;br /&gt;&lt;br /&gt;import openbsd&lt;br /&gt;&lt;br /&gt;# some ip addrsses paired with domains&lt;br /&gt;ips = {'google':(0x4a7d1393, 0xd8ef3d68),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'openbsd':(0x8ef40c2a,),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'freebsd':(0x45935321,),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'yahoo':(0xd1bf5d34, 0xd183249e)}&lt;br /&gt;&lt;br /&gt;# OK, we can now make the DoubleAssociation&lt;br /&gt;ipsbothways = openbsd.utils.DoubleAssociation(ips)&lt;br /&gt;&lt;br /&gt;print "ipsbothways['yahoo'] = " + str(ipsbothways['yahoo'])&lt;br /&gt;&lt;br /&gt;# fair enough, but nothing we couldn't get from the dictionary&lt;br /&gt;&lt;br /&gt;# try to query on an ip address to get a domain name&lt;br /&gt;print "ipsbothways[(0x8ef40c2a,)] = " + ipsbothways[(0x8ef40c2a,)]&lt;br /&gt;&lt;br /&gt;# unlike a normal dictionary, DoubleAssociation gives everything&lt;br /&gt;# back with the keys() method&lt;br /&gt;&lt;br /&gt;for keyx in ipsbothways.keys():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if 0xd183249e in keyx:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "domain is " + ipsbothways[keyx]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; except TypeError:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "TypeError:&amp;nbsp; " + keyx&lt;br /&gt;&lt;br /&gt;Python 2.5.4 (r254:67916, Jul&amp;nbsp; 1 2009, 11:37:21)&lt;br /&gt;[GCC 3.3.5 (propolice)] on openbsd4&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import dblassoc&lt;br /&gt;ipsbothways['yahoo'] = (3518979380L, 3515032734L)&lt;br /&gt;ipsbothways[(0x8ef40c2a,)] = openbsd&lt;br /&gt;TypeError:&amp;nbsp; google&lt;br /&gt;TypeError:&amp;nbsp; openbsd&lt;br /&gt;TypeError:&amp;nbsp; yahoo&lt;br /&gt;domain is yahoo&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;The one thing you have to look out for is the treatment of everything in the structure as a key - that's why I had to catch the TypeError.&amp;nbsp; Everything is a value, too.&amp;nbsp; The values and keys methods yield the same results.&lt;br /&gt;&lt;br /&gt;In real life, if you had 30 or 50 or 1000 ip addresses, this would come in handy.&amp;nbsp; Likewise for doctor-patient records, etc. (although the grouping of patients has to be unique, so that may not work after all - best to test both "sides" of the structure for exclusivity).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-1630142392226344388?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/1630142392226344388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/02/py-openbsds-doubleassociation.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/1630142392226344388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/1630142392226344388'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/02/py-openbsds-doubleassociation.html' title='py-openbsd&apos;s DoubleAssociation'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-2959724587257016983</id><published>2010-01-31T17:55:00.000-08:00</published><updated>2010-02-01T03:46:55.609-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openbsd python'/><title type='text'>OpenBSD and Python</title><content type='html'>&lt;a href="http://pyright.blogspot.com/2010/01/python-modules-for-bsds.html"&gt;Last time&lt;/a&gt; we covered FreeBSD's third party module, freebsd; this time we'll take a quick look at the equivalent openbsd package for the OpenBSD operating system.&lt;br /&gt;&lt;br /&gt;$ python2.5&lt;br /&gt;Python 2.5.4 (r254:67916, Jul&amp;nbsp; 1 2009, 11:37:21)&lt;br /&gt;[GCC 3.3.5 (propolice)] on openbsd4&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import openbsd&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; dir(openbsd)&lt;br /&gt;['__builtins__', '__doc__', '__file__', '__name__', '__path__', '_ifconfig', '_netstat', '_packetDescriptors', '_pcap', '_sysvar', 'arc4random', 'ifconfig', 'netstat', 'packet', 'pcap', 'utils']&lt;br /&gt;&lt;br /&gt;Let's see what all is hidden in that utils item:&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; dir(openbsd.utils)&lt;br /&gt;['DoubleAssociation', '__builtins__', '__doc__', '__file__', '__name__', 'cksum16', 'ethToBytes', 'ethToStr', 'findLongestSubsequence', 'getBlocks', 'ip6FromPrefix', 'ip6ToBytes', 'ip6ToStr', 'ipFromPrefix', 'ipToBytes', 'ipToStr', 'isIP6Addr', 'isIPAddr', 'isStringLike', 'multichar', 'multiord']&lt;br /&gt;&lt;br /&gt;OK, a fair number of network addressing related functions.&lt;br /&gt;&lt;br /&gt;help(openbsd.utils.ipFromPrefix)&lt;br /&gt;&lt;br /&gt;ipFromPrefix(prefix)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Produce an IPv4 address (netmask) from a prefix length.&lt;br /&gt;&lt;br /&gt;That sounds handy.&amp;nbsp; Let's give it a shot:&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; openbsd.utils.ipFromPrefix(24)&lt;br /&gt;'255.255.255.0'&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; help(openbsd.utils.DoubleAssociation)&lt;br /&gt;&lt;br /&gt;Help on class DoubleAssociation in module openbsd.utils:&lt;br /&gt;&lt;br /&gt;class DoubleAssociation(__builtin__.dict)&lt;br /&gt;&amp;nbsp;|&amp;nbsp; A double-association is a broadminded dictionary - it goes both ways.&lt;br /&gt;&amp;nbsp;|&lt;br /&gt;&amp;nbsp;|&amp;nbsp; The rather simple implementation below requires the keys and values to&lt;br /&gt;&amp;nbsp;|&amp;nbsp; be two disjoint sets. That is, if a given value is both a key and a&lt;br /&gt;&amp;nbsp;|&amp;nbsp; value in a DoubleAssociation, you get unexpected behaviour.&lt;br /&gt;&amp;nbsp;|&lt;br /&gt;&amp;nbsp;|&amp;nbsp; Method resolution order:&lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DoubleAssociation&lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __builtin__.dict&lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __builtin__.object&lt;br /&gt;&amp;nbsp;|&lt;br /&gt;&amp;nbsp;|&amp;nbsp; Methods defined here:&lt;br /&gt;&amp;nbsp;|&lt;br /&gt;&amp;nbsp;|&amp;nbsp; __init__(self, idict=None)&lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # FIXME:&lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp;&amp;nbsp; While DoubleAssociation is adequate for our use, it is not entirely complete:&lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Deletion should delete both associations&lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Other dict methods that set values (eg. setdefault) will need to be over-ridden.&lt;br /&gt;&lt;etc.&gt;&lt;br /&gt;&lt;/etc.&gt;&lt;br /&gt;&lt;br /&gt;This one is kind of interesting - let's have a look:&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; d = {1:'a', 2:'b', 3:'c'}&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; d.get(1)&lt;br /&gt;'a'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print d.get('a')&lt;br /&gt;None&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; da = openbsd.utils.DoubleAssociation(d)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; da.get(1)&lt;br /&gt;'a'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; da.get('a')&lt;br /&gt;1&lt;br /&gt;&lt;br /&gt;Just like the doc described it.&amp;nbsp; Both the keys and the values are keys, if that makes sense.&lt;br /&gt;&lt;br /&gt;Back up to the main modules of the openbsd package:&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; help(openbsd.arc4random)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NAME&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; openbsd.arc4random&lt;br /&gt;&lt;br /&gt;FILE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /usr/local/lib/python2.5/site-packages/openbsd/arc4random.so&lt;br /&gt;&lt;br /&gt;FUNCTIONS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; getbytes(...)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get some random bytes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And the result -&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; bytesx = openbsd.arc4random.getbytes(10)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; [bytex for bytex in bytesx]&lt;br /&gt;['\xb4', '\xd1', '\x86', '\xb7', 'g', '8', '\x10', '}', '\x8b', '\xe5']&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One last module on a more common theme:&lt;br /&gt;&lt;br /&gt;NAME&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; openbsd.ifconfig - A Python module for querying and manipulating network interfaces.&lt;br /&gt;&lt;br /&gt;FILE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /usr/local/lib/python2.5/site-packages/openbsd/ifconfig.py&lt;br /&gt;&lt;br /&gt;CLASSES&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __builtin__.int(__builtin__.object)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FlagVal&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __builtin__.object&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flags&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IFConfig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Interface&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MTU&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Media&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Metric&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; exceptions.Exception(exceptions.BaseException)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _ifconfig.IfConfigError&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class FlagVal(__builtin__.int)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&amp;nbsp; Method resolution order:&lt;br /&gt;(etc.) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;etc.&gt;&lt;/etc.&gt;&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; intx = openbsd.ifconfig.Interface('rl0')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print intx&lt;br /&gt;rl0: flags=8843&lt;up|broadcast|running|simplex|multicast&gt; mtu 1500&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; media: Ethernet autoselect&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; link: 00:30:bd:72:6a:a0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inet6: fe80:2::230:bdff:fe72:6aa0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inet: 192.168.100.100&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; dir(intx)&lt;br /&gt;['Iftype', 'Name', '__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_addrToStr', '_addrTypeLookup', '_getAddresses', '_getinfo', '_setflags', '_setmetric', '_setmtu', 'addAddress', 'addresses', 'delAddress', 'flags', 'media', 'metric', 'mtu', 'setAddress']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; intx.media&lt;br /&gt;media: Ethernet autoselect&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; intx.addresses&lt;br /&gt;[{'address': {'sa_family': 18L, 'iftype': 'ETHER', 'address': '00:30:bd:72:6a:a0'}}, {'netmask': {'sa_family': 24L, 'address': 'ffff:ffff:ffff:ffff::'}, 'address': {'sa_family': 24L, 'address': 'fe80:2::230:bdff:fe72:6aa0'}}, {'netmask': {'sa_family': 0L, 'address': None}, 'dstaddr': {'sa_family': 2L, 'address': '192.168.100.255'}, 'address': {'sa_family': 2L, 'address': '192.168.100.100'}}]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/up|broadcast|running|simplex|multicast&gt;&lt;br /&gt;&lt;br /&gt;ifconfig available within Python - sweet.&amp;nbsp; rl0 is the ethernet device on my old Dell tower.&lt;br /&gt;&lt;br /&gt;Examination of the openbsd package shows that it has quite a bit to offer.&amp;nbsp; If you're using OpenBSD, there's nothing stopping you from doing routine sysadmin tasks with Python.&amp;nbsp; If not, now you've got a reason to check it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-2959724587257016983?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/2959724587257016983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/01/openbsd-and-python.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/2959724587257016983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/2959724587257016983'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/01/openbsd-and-python.html' title='OpenBSD and Python'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-6936840571997044361</id><published>2010-01-31T14:42:00.000-08:00</published><updated>2010-08-23T12:49:12.753-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='freebsd python'/><title type='text'>Python Modules for the BSD's</title><content type='html'>&lt;span style="font-family: &amp;quot;Bitstream Vera Sans [bitstream]&amp;quot;, sans-serif;"&gt;Well, for FreeBSD and OpenBSD, at least. &amp;nbsp;I can't yet vouch for NetBSD and Dragonfly BSD.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans [bitstream]&amp;quot;, sans-serif;"&gt;First, FreeBSD - the port is named py-freebsd. &amp;nbsp;Once built, the module can be imported with "import freebsd".&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;[carl@pcbsd]/usr/local/lib/python2.6/site-packages(158)% python&lt;br /&gt;Python 2.6.2 (r262:71600, Jun 24 2009, 23:31:28)&lt;br /&gt;[GCC 4.2.1 20070719 [FreeBSD]] on freebsd7&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import freebsd&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; dir(freebsd)&lt;br /&gt;['__doc__', '__file__', '__name__', '__package__', '__version__', 'chflags', 'const', 'fchflags', 'fstatfs', 'geom_getxml', 'getfsent', 'getfsfile', 'getfsspec', 'getfsstat', 'gethostname', 'getloadavg', 'getlogin', 'getosreldate', 'getpriority', 'getprogname', 'getpwent', 'getpwnam', 'getpwuid', 'getquota', 'getrlimit', 'getrusage', 'ifstats', 'ipstats', 'jail', 'kevent', 'kqueue', 'ktrace', 'lchflags', 'quotaoff', 'quotaon', 'quotasync', 'reboot', 'sendfile', 'sethostname', 'setlogin', 'setpriority', 'setproctitle', 'setprogname', 'setquota', 'setrlimit', 'statfs', 'sysctl', 'sysctldescr', 'sysctlmibtoname', 'sysctlnametomib', 'tcpstats', 'udpstats']&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: cyan;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans [bitstream]&amp;quot;, sans-serif;"&gt;Not a bad collection of utilities. &amp;nbsp;Let's take a couple for a test drive:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; freebsd.gethostname() &lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'pcbsd'&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; freebsd.getprogname() &lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'python' &lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; help(freebsd.jail) &amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;Help on built-in function jail in module freebsd: &lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;jail(...)&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;jail(path, hostname, ip_number):&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;The jail() system call sets up a jail and locks the current process&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;in it. The ``path'' should be set to the directory which is to be &lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;the root of the prison. The ``hostname'' can be set to the hostname&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;of the prison. This can be changed from the inside of the prison. &lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;The ``ip_number'' can be set to the IP number assigned to the prison.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; # wow, you can set up a jail with python&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; freebsd.ifstats()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&amp;gt;&amp;gt;&amp;amp;gt&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a big="" dictionary="" href="http://www.blogger.com/post-edit.g?blogID=524230429673765509&amp;amp;postID=6936840571997044361" long=""&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; import pprint&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; pprint.pprint(_) &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;{'bge0': {'addrlen': 6, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'baudrate': 100000000L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'collisions': 0L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'flags': 34883, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'hdrlen': 14, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'hwassist': 7L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'ibytes': 19222590L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'ierrors': 0L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'imcasts': 577L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'ipackets': 19728L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'iqdrops': 0L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'metric': 0L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'mtu': 1500L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'name': 'bge0', &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'noproto': 0L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'obytes': 2009038L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'oerrors': 0L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'omcasts': 0L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'opackets': 13285L, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'pcount': 0, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'physical': 0, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'snd_drops': 0, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'snd_len': 0, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'snd_maxlen': 511, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: white; font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;'type': 6},&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;a big="" dictionary="" href="http://www.blogger.com/post-edit.g?blogID=524230429673765509&amp;amp;postID=6936840571997044361" long=""&gt;&lt;span style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;span style="background-color: white;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans [bitstream]&amp;quot;, sans-serif;"&gt;&lt;span style="color: black;"&gt;bge0 is the ethernet device on my Thinkpad&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;a big="" dictionary="" href="http://www.blogger.com/post-edit.g?blogID=524230429673765509&amp;amp;postID=6936840571997044361" long=""&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;&amp;gt;&amp;gt;&amp;gt; freebsd.getlogin() &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'carl' &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;&amp;gt;&amp;gt;&amp;gt; freebsd.tcpstats() &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a big="" dictionary="" href="http://www.blogger.com/post-edit.g?blogID=524230429673765509&amp;amp;postID=6936840571997044361" long=""&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;&amp;gt;&amp;gt;&amp;gt; pprint.pprint(_) &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;{'accepts': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'badsyn': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'cachedrtt': 147L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'cachedrttvar': 150L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'cachedssthresh': 4L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'closed': 495L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'connattempt': 360L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'conndrops': 20L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'connects': 340L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'delack': 277L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'drops': 22L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'keepdrops': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'keepprobe': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'keeptimeo': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'listendrop': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'mturesent': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'pawsdrop': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'persistdrop': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'persisttimeo': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'predack': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'preddat': 15226L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvackbyte': 1093284L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvackpack': 1848L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvacktoomuch': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvafterclose': 7L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvbadoff': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvbadsum': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvbyte': 16595286L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvbyteafterwin': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvdupack': 232L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvdupbyte': 88723L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvduppack': 77L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvoobyte': 1015050L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvoopack': 919L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvpack': 15882L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvpackafterwin': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvpartdupbyte': 525L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvpartduppack': 2L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvshort': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvtotal': 18489L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvwinprobe': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rcvwinupd': 3L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rexmttimeo': 118L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'rttupdated': 1817L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_aborted': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_added': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_badack': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_bucketoverflow': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_cacheoverflow': 0L, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_completed': 0L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_dropped': 0L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_dupsyn': 0L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_recvcookie': 0L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_reset': 0L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_retransmitted': 0L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_sendcookie': 0L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_stale': 0L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_unreach': 0L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sc_zonefail': 0L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'segstimed': 1688L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sndacks': 9261L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sndbyte': 1098259L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sndctrl': 697L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sndpack': 1252L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sndprobe': 0L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sndrexmitbyte': 2252L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sndrexmitpack': 2L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sndtotal': 12381L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sndurg': 0L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'sndwinup': 1169L,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;'timeoutdrop': 9L}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a big="" dictionary="" href="http://www.blogger.com/post-edit.g?blogID=524230429673765509&amp;amp;postID=6936840571997044361" long=""&gt;&lt;big dictionary=""&gt;&lt;br /&gt;&lt;/big&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;big dictionary=""&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: white;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans [bitstream]&amp;quot;, sans-serif;"&gt;22 drops, 9 of them timeouts, and a bunch of other stuff too.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: white;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans [bitstream]&amp;quot;, sans-serif;"&gt;Enough for today. &amp;nbsp;Next time we'll take a quick look at the Python module for OpenBSD.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/big&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;a big="" dictionary="" href="http://www.blogger.com/post-edit.g?blogID=524230429673765509&amp;amp;postID=6936840571997044361" long=""&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;big dictionary=""&gt;&lt;br /&gt;&lt;/big&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;a big="" dictionary="" href="http://www.blogger.com/post-edit.g?blogID=524230429673765509&amp;amp;postID=6936840571997044361" long=""&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;big dictionary=""&gt;&lt;br /&gt;&lt;/big&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;a big="" dictionary="" href="http://www.blogger.com/post-edit.g?blogID=524230429673765509&amp;amp;postID=6936840571997044361" long=""&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;big dictionary=""&gt;&lt;br /&gt;&lt;/big&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;a big="" dictionary="" href="http://www.blogger.com/post-edit.g?blogID=524230429673765509&amp;amp;postID=6936840571997044361" long=""&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;big dictionary=""&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="font-family: &amp;quot;Bitstream Vera Sans Mono [bitstream]&amp;quot;, &amp;quot;Courier [Adobe]&amp;quot;, monospace;"&gt;&lt;span style="background-color: white;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/big&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-6936840571997044361?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/6936840571997044361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/01/python-modules-for-bsds.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/6936840571997044361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/6936840571997044361'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/01/python-modules-for-bsds.html' title='Python Modules for the BSD&apos;s'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-3124826645239244182</id><published>2010-01-28T05:39:00.000-08:00</published><updated>2010-01-28T05:39:44.062-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#python #pythonlogos'/><title type='text'>Python Logos III: Pycon India 2009 contest</title><content type='html'>Just received an e-mail from Noufal this morning (actually it was a comment on one of the previous two logo posts) about the Indian Pycon logo contest last year. &amp;nbsp;I've already shown the winner in a previous post, but the entries are worth seeing in their own right. &amp;nbsp;Hats off to the contributors:&lt;br /&gt;&lt;br /&gt;** SPECIAL NOTE: &amp;nbsp;Some of the following logos do not comply with the Python Software Foundation's trademark rules for the use of the logo. &amp;nbsp;Although there was no harm intended through use in such manner, it's always good to keep the full logo intact (don't split the snakes or take one away!). &amp;nbsp;My very basic, and perhaps inaccurate understanding is that it's OK to use the logo and even change it's colors, but the shape should remain intact.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S2GQ9ksWrKI/AAAAAAAAAJM/yrwlww0QcyY/s1600-h/pyconindia1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S2GQ9ksWrKI/AAAAAAAAAJM/yrwlww0QcyY/s320/pyconindia1.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S2GRCTcDWXI/AAAAAAAAAJU/uDfW38PQYiM/s1600-h/pyconindia10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S2GRCTcDWXI/AAAAAAAAAJU/uDfW38PQYiM/s320/pyconindia10.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S2GRQsvHk8I/AAAAAAAAAJk/9-4vdMYQJ3A/s1600-h/pyconindia12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/S2GRQsvHk8I/AAAAAAAAAJk/9-4vdMYQJ3A/s320/pyconindia12.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S2GRW0rSlTI/AAAAAAAAAJs/Li-eahXQooM/s1600-h/pyconindia13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/S2GRW0rSlTI/AAAAAAAAAJs/Li-eahXQooM/s320/pyconindia13.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S2GRjHUEKGI/AAAAAAAAAJ0/adnb-k9aJiA/s1600-h/pyconindia14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S2GRjHUEKGI/AAAAAAAAAJ0/adnb-k9aJiA/s320/pyconindia14.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/S2GRrV0CHhI/AAAAAAAAAJ8/XCpqt7l7X9s/s1600-h/pyconindia15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/S2GRrV0CHhI/AAAAAAAAAJ8/XCpqt7l7X9s/s320/pyconindia15.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/S2GRzYJRF0I/AAAAAAAAAKE/KIXVaVI5fiU/s1600-h/pyconindia16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/S2GRzYJRF0I/AAAAAAAAAKE/KIXVaVI5fiU/s320/pyconindia16.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/S2GR9IEnMhI/AAAAAAAAAKM/aYZGRVIgM70/s1600-h/pyconindia17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/S2GR9IEnMhI/AAAAAAAAAKM/aYZGRVIgM70/s320/pyconindia17.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S2GSFreXGxI/AAAAAAAAAKU/KGygNZDegL0/s1600-h/pyconindia2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/S2GSFreXGxI/AAAAAAAAAKU/KGygNZDegL0/s320/pyconindia2.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/S2GSLXfG1qI/AAAAAAAAAKc/jMCC5rtYvM4/s1600-h/pyconindia3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/S2GSLXfG1qI/AAAAAAAAAKc/jMCC5rtYvM4/s320/pyconindia3.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S2GSQ4B93_I/AAAAAAAAAKk/-UkS0h7vufg/s1600-h/pyconindia4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S2GSQ4B93_I/AAAAAAAAAKk/-UkS0h7vufg/s320/pyconindia4.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S2GSWq2CYbI/AAAAAAAAAKs/TTBKZSOAbhg/s1600-h/pyconindia5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S2GSWq2CYbI/AAAAAAAAAKs/TTBKZSOAbhg/s320/pyconindia5.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S2GSb-sFXQI/AAAAAAAAAK0/OtVqRkfM6sY/s1600-h/pyconindia6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S2GSb-sFXQI/AAAAAAAAAK0/OtVqRkfM6sY/s320/pyconindia6.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S2GSjSpjnoI/AAAAAAAAAK8/06ol08PLbjo/s1600-h/pyconindia7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S2GSjSpjnoI/AAAAAAAAAK8/06ol08PLbjo/s320/pyconindia7.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/S2GS09H_fhI/AAAAAAAAALM/eNjFxvR5zz0/s1600-h/pyconindia8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/S2GS09H_fhI/AAAAAAAAALM/eNjFxvR5zz0/s320/pyconindia8.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/S2GS-_QoyzI/AAAAAAAAALU/KYUK9C4brAo/s1600-h/pyconindia9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/S2GS-_QoyzI/AAAAAAAAALU/KYUK9C4brAo/s320/pyconindia9.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-3124826645239244182?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/3124826645239244182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/01/python-logos-iii-pycon-india-2009.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/3124826645239244182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/3124826645239244182'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/01/python-logos-iii-pycon-india-2009.html' title='Python Logos III: Pycon India 2009 contest'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_27GcakEGOHc/S2GQ9ksWrKI/AAAAAAAAAJM/yrwlww0QcyY/s72-c/pyconindia1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-8749981361134117818</id><published>2010-01-23T04:51:00.000-08:00</published><updated>2010-02-05T14:29:51.789-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python pythonlogos'/><title type='text'>Python Logos Part II:  Free Form</title><content type='html'>&lt;b&gt;&lt;span style="font-size: large;"&gt;Free Form Python Logos&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/S1rwbeehoDI/AAAAAAAAAIU/mEwU2ABGw44/s1600-h/princeton.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/S1rwbeehoDI/AAAAAAAAAIU/mEwU2ABGw44/s320/princeton.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S1rvcxCJbuI/AAAAAAAAAGs/Tf5j8eiBtl8/s1600-h/argentina.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/S1rvcxCJbuI/AAAAAAAAAGs/Tf5j8eiBtl8/s320/argentina.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/S1rvhKaWXlI/AAAAAAAAAG0/fT4iu9qiOQw/s1600-h/austria.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/S1rvhKaWXlI/AAAAAAAAAG0/fT4iu9qiOQw/s320/austria.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S1rvkDFrKeI/AAAAAAAAAG8/0eTOP1w8s1s/s1600-h/baconpig.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S1rvkDFrKeI/AAAAAAAAAG8/0eTOP1w8s1s/s320/baconpig.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/S1rvoiVbCvI/AAAAAAAAAHE/YRitWFtVTws/s1600-h/baypigs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/S1rvoiVbCvI/AAAAAAAAAHE/YRitWFtVTws/s320/baypigs.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/S1rvscggNuI/AAAAAAAAAHM/VjaJt4wMxis/s1600-h/brasil1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/S1rvscggNuI/AAAAAAAAAHM/VjaJt4wMxis/s320/brasil1.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/S1rvwjhr1kI/AAAAAAAAAHU/QPybjF5YSG0/s1600-h/chipy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/S1rvwjhr1kI/AAAAAAAAAHU/QPybjF5YSG0/s320/chipy.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S1rv13Kwp6I/AAAAAAAAAHc/IFsfJ5KrR6g/s1600-h/cologne.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S1rv13Kwp6I/AAAAAAAAAHc/IFsfJ5KrR6g/s320/cologne.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/S1rv7HL9HMI/AAAAAAAAAHk/QdtgtC8DVFo/s1600-h/czech.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/S1rv7HL9HMI/AAAAAAAAAHk/QdtgtC8DVFo/s320/czech.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S1rv_-epZFI/AAAAAAAAAHs/x2Mhjo09vuA/s1600-h/grandrapids.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/S1rv_-epZFI/AAAAAAAAAHs/x2Mhjo09vuA/s320/grandrapids.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S1rwF11slDI/AAAAAAAAAH0/Zq97DmSt5Gk/s1600-h/grimpypers.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S1rwF11slDI/AAAAAAAAAH0/Zq97DmSt5Gk/s320/grimpypers.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/S1rwKLUl9GI/AAAAAAAAAH8/dm6wJF06iqw/s1600-h/hungary.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/S1rwKLUl9GI/AAAAAAAAAH8/dm6wJF06iqw/s320/hungary.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S1rwPGGjlMI/AAAAAAAAAIE/ggzIPRu30fc/s1600-h/peru.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S1rwPGGjlMI/AAAAAAAAAIE/ggzIPRu30fc/s320/peru.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S1rwVSrq8mI/AAAAAAAAAIM/tRMXj6n9_4M/s1600-h/poland2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S1rwVSrq8mI/AAAAAAAAAIM/tRMXj6n9_4M/s320/poland2.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/S1rwjjd8t8I/AAAAAAAAAIc/95an26EV1qg/s1600-h/pyjug.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/S1rwjjd8t8I/AAAAAAAAAIc/95an26EV1qg/s320/pyjug.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S1rwrEwDSRI/AAAAAAAAAIk/IBvvGjnEh4A/s1600-h/vancouver.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S1rwrEwDSRI/AAAAAAAAAIk/IBvvGjnEh4A/s320/vancouver.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S1rwycQr8JI/AAAAAAAAAIs/VymDQlbQTZQ/s1600-h/venezuela.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/S1rwycQr8JI/AAAAAAAAAIs/VymDQlbQTZQ/s320/venezuela.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S2e3nV1WCII/AAAAAAAAALc/1KRqjklVgFM/s1600-h/bangpypers.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" kt="true" src="http://1.bp.blogspot.com/_27GcakEGOHc/S2e3nV1WCII/AAAAAAAAALc/1KRqjklVgFM/s320/bangpypers.PNG" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S2yb2RxRLMI/AAAAAAAAALs/K2bqiMWkD8I/s1600-h/pyweek.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" kt="true" src="http://1.bp.blogspot.com/_27GcakEGOHc/S2yb2RxRLMI/AAAAAAAAALs/K2bqiMWkD8I/s320/pyweek.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-8749981361134117818?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/8749981361134117818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/01/python-logos-part-ii-free-form.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8749981361134117818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/8749981361134117818'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/01/python-logos-part-ii-free-form.html' title='Python Logos Part II:  Free Form'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_27GcakEGOHc/S1rwbeehoDI/AAAAAAAAAIU/mEwU2ABGw44/s72-c/princeton.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-5598132231715573883</id><published>2010-01-22T18:56:00.000-08:00</published><updated>2010-04-21T06:13:46.170-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#python #pythonlogos'/><title type='text'>The Many Faces of the Python Logo</title><content type='html'>&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&amp;nbsp;&lt;span style="font-size: large;"&gt;&lt;b&gt;Variations on Standard Python Logo&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S875uH-bX4I/AAAAAAAAAMc/s4_od_Byedk/s1600/turkishpys60.PNG" imageanchor="1" style="clear: left; cssfloat: left; cssfloat: right; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S875uH-bX4I/AAAAAAAAAMc/s4_od_Byedk/s320/turkishpys60.PNG" wt="true" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S1pjZOZbT3I/AAAAAAAAAEU/XD7_wGZmhaA/s1600-h/cambridge.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S1pjZOZbT3I/AAAAAAAAAEU/XD7_wGZmhaA/s320/cambridge.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S1pjsY4nRGI/AAAAAAAAAEk/DG9kGseqNYg/s1600-h/europycon.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/S1pjsY4nRGI/AAAAAAAAAEk/DG9kGseqNYg/s320/europycon.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/S1pjxLh65YI/AAAAAAAAAEs/Qn3n4lMyrFU/s1600-h/french.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/S1pjxLh65YI/AAAAAAAAAEs/Qn3n4lMyrFU/s320/french.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S1pj2jj6QaI/AAAAAAAAAE0/45v1Y2RH0Sk/s1600-h/greek.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/S1pj2jj6QaI/AAAAAAAAAE0/45v1Y2RH0Sk/s320/greek.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/S1pj-Xhl0yI/AAAAAAAAAE8/IkXRkGuz6EA/s1600-h/iran.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/S1pj-Xhl0yI/AAAAAAAAAE8/IkXRkGuz6EA/s320/iran.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S1pkIIeDcAI/AAAAAAAAAFE/ZqNamKEsKGI/s1600-h/israel.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S1pkIIeDcAI/AAAAAAAAAFE/ZqNamKEsKGI/s320/israel.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S1pkMmTFfQI/AAAAAAAAAFM/-L3qUIdSsyk/s1600-h/montreal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/S1pkMmTFfQI/AAAAAAAAAFM/-L3qUIdSsyk/s320/montreal.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/S1pkTGcJNDI/AAAAAAAAAFU/IWIWQQOxKoc/s1600-h/newyork.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/S1pkTGcJNDI/AAAAAAAAAFU/IWIWQQOxKoc/s320/newyork.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S1pkZJTonlI/AAAAAAAAAFc/6y-eErgB8K8/s1600-h/newzealand.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/S1pkZJTonlI/AAAAAAAAAFc/6y-eErgB8K8/s320/newzealand.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/S1pkd1i250I/AAAAAAAAAFk/4ZxDLCndv8o/s1600-h/pinoy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/S1pkd1i250I/AAAAAAAAAFk/4ZxDLCndv8o/s320/pinoy.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/S1pkin9XPmI/AAAAAAAAAFs/-Me2eqnW6F0/s1600-h/pyconindia.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/S1pkin9XPmI/AAAAAAAAAFs/-Me2eqnW6F0/s320/pyconindia.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/S1pkuyjPPfI/AAAAAAAAAF8/wVsyQpmLaPg/s1600-h/pyconpl.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/S1pkuyjPPfI/AAAAAAAAAF8/wVsyQpmLaPg/s320/pyconpl.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/S1pk0_TGzVI/AAAAAAAAAGE/YMXjlfSiNO4/s1600-h/pyconuk.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/S1pk0_TGzVI/AAAAAAAAAGE/YMXjlfSiNO4/s320/pyconuk.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/S1pk6UhR10I/AAAAAAAAAGM/EEngb3l2KEw/s1600-h/tunesia.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/S1pk6UhR10I/AAAAAAAAAGM/EEngb3l2KEw/s320/tunesia.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S1pk_Gv80nI/AAAAAAAAAGU/_MC9nY5CKr8/s1600-h/vietnam.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/S1pk_Gv80nI/AAAAAAAAAGU/_MC9nY5CKr8/s320/vietnam.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_27GcakEGOHc/S1qRRX6dgxI/AAAAAAAAAGc/G2Fosely_38/s1600-h/russianpycamp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_27GcakEGOHc/S1qRRX6dgxI/AAAAAAAAAGc/G2Fosely_38/s320/russianpycamp.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/S1rvTDfxwgI/AAAAAAAAAGk/0MaHhehrh9E/s1600-h/pythonrioregularlogo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/S1rvTDfxwgI/AAAAAAAAAGk/0MaHhehrh9E/s320/pythonrioregularlogo.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/S1tjvM3cBDI/AAAAAAAAAI0/ve4UXhGjFm4/s1600-h/pylule.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/S1tjvM3cBDI/AAAAAAAAAI0/ve4UXhGjFm4/s320/pylule.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S1uF_4Lok3I/AAAAAAAAAI8/6mRg-U0HwDo/s1600-h/pyconau.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_27GcakEGOHc/S1uF_4Lok3I/AAAAAAAAAI8/6mRg-U0HwDo/s320/pyconau.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/S19ysC2uONI/AAAAAAAAAJE/XHZh2bx83Ug/s1600-h/pythonlogoturkish.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" mt="true" src="http://4.bp.blogspot.com/_27GcakEGOHc/S19ysC2uONI/AAAAAAAAAJE/XHZh2bx83Ug/s320/pythonlogoturkish.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S2n3R7xCfiI/AAAAAAAAALk/MeO7Gd94SWU/s1600-h/pythonlogospolish.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" kt="true" src="http://1.bp.blogspot.com/_27GcakEGOHc/S2n3R7xCfiI/AAAAAAAAALk/MeO7Gd94SWU/s320/pythonlogospolish.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/S3GDFbbZJ9I/AAAAAAAAAL8/SIJTw4YvCDg/s1600-h/yinyangpython.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" kt="true" src="http://2.bp.blogspot.com/_27GcakEGOHc/S3GDFbbZJ9I/AAAAAAAAAL8/SIJTw4YvCDg/s320/yinyangpython.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_27GcakEGOHc/S4RHj7-_C8I/AAAAAAAAAME/UupQKp5AnVE/s1600-h/delrothlogo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ct="true" src="http://1.bp.blogspot.com/_27GcakEGOHc/S4RHj7-_C8I/AAAAAAAAAME/UupQKp5AnVE/s320/delrothlogo.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="left" class="separator" style="clear: both; text-align: center;"&gt;Free form logos next time . . .&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-5598132231715573883?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/5598132231715573883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/01/many-faces-of-python-logos.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/5598132231715573883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/5598132231715573883'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/01/many-faces-of-python-logos.html' title='The Many Faces of the Python Logo'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_27GcakEGOHc/S875uH-bX4I/AAAAAAAAAMc/s4_od_Byedk/s72-c/turkishpys60.PNG' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-6442845375048514962</id><published>2010-01-11T15:36:00.000-08:00</published><updated>2010-01-19T03:46:17.860-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#python3.1 #stringformatting #mining'/><title type='text'>Python 3.1 String Formatting - Positional Arguments</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;a href="http://pyright.blogspot.com/2010/01/fun-with-python-31s-new-string.html"&gt;Last time&lt;/a&gt; I did a goofy little trick with the new Python 3 string formatting.&amp;nbsp; This time I'd like to demo something a little more practical.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I had heard a lot about positional arguments being more flexible and easier in Python 3's string formatting.&amp;nbsp; The basic gist is that the positions being referred to are on the right side of the string's format method as opposed to the left.&amp;nbsp; This usually results in fewer positions, and, hopefully, less confusion.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Quickie example:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; class Foo:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self):&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pass&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; a = Foo()&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; a.foo = 24&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; a.bar = 33&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; a.baz = 6&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; # Python 2 string formatting&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; # print '%d %d %d' % (a.foo, a.bar, a.baz)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; print('{0.foo} {0.bar} {0.baz}'.format(a))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: Courier New;"&gt;24 33 6&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;It's true that the left side is a bit more involved now with the new string formatting.&amp;nbsp; There are more options for formatting, which I have omitted.&amp;nbsp; My main goal here is to understand the new formatting to the point where I can leverage it to my advantage in my work.&amp;nbsp; Let's see what, if anything, I've learned.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;In the mining industry I did a lot data tracking on various production metrics - flows through pipes, broken rock moved to its final location, explosive power, etc.&amp;nbsp; One of the most challenging things to track was production in the open pit.&amp;nbsp; It all centered around big multimillion dollar electric shovels.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Anyway, to make a long story longer, by the time you worked your way up the object hierarchy to the shovel, you ended up with about 20 or more "fields" in the database, or members of your shovel object.&amp;nbsp; Smithing csv output from these objects could get pretty hairy, because there were so many fields to track, and they changed frequently.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Out of reality - it's just too complex - back to the programming world.&amp;nbsp; This Python 3 string formatting could have helped out some in this situation.&amp;nbsp; Let's go back to the Foo object:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;UPDATE!&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I had made an error in the print statment below by mixing quotes.&amp;nbsp; It is now corrected.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Yet another example of why code must be tested :-\&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; # make two more Foo objects&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; b = Foo()&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; b.foo = 'hello'&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; b.bar = 'cruel'&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; b.baz = 'world'&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;c = Foo()&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; c.foo = '99.234'&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; c.bar = '23.715'&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; c.baz = '18.6'&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; for objx in a, b, c:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for strx in 'foo', 'bar', 'baz':&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(('{0} = {1.' + strx +&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '}').format(&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strx, objx))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: Courier New;"&gt;foo = 24&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: Courier New;"&gt;bar = 33&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: Courier New;"&gt;baz = 6&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: Courier New;"&gt;foo = hello&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: Courier New;"&gt;bar = cruel&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: Courier New;"&gt;baz = world&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: Courier New;"&gt;foo = 99.234&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: Courier New;"&gt;bar = 23.715&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc; font-family: Courier New;"&gt;baz = 18.6&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;Simple example, but it illustrates some of the utility of the new string formatting.&amp;nbsp; If I were trying to track a bunch of data, I would only have to redefine my "fields" once in a global constant ['foo', 'bar', 'baz'].&amp;nbsp; objx could be cycling (actually, iterating) through a list of objects.&amp;nbsp; Any writing or crunching could be done in a separate (small) function or method outside the loop (since ['foo', 'bar', 'baz'] is constant).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;Turns out this new string formatting is something I could get used to . . .&amp;nbsp;&amp;nbsp; ;-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-6442845375048514962?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/6442845375048514962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/01/python-31-string-formatting-positional.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/6442845375048514962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/6442845375048514962'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/01/python-31-string-formatting-positional.html' title='Python 3.1 String Formatting - Positional Arguments'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-7099545443732019156</id><published>2010-01-07T18:58:00.000-08:00</published><updated>2010-01-08T15:17:39.391-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='#python2.6 #__future__ #python3.1 #stringformatting #transamerica'/><title type='text'>Fun With Python 3.1's New String Formatting . . .</title><content type='html'>Or a totally unoriginal poor ASCII art rendition of the Transamerica building at night . . .&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;carl@L733rLinux:~$ python&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) &lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[GCC 4.3.3] on linux2&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; from __future__ import print_function&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; # saw this on Python-Dev (Stephen Bethard?) &lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; format('HEADER', '*^50')&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;'**********************HEADER**********************'&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# just for fun . . .&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; for x in range(30):&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print('{0:*^50}'.format(x * ' '))&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;... &lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;**************************************************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;************************ *************************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;************************&amp;nbsp; ************************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;***********************&amp;nbsp;&amp;nbsp; ************************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;***********************&amp;nbsp;&amp;nbsp;&amp;nbsp; ***********************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;**********************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ***********************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;**********************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; **********************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;*********************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; **********************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;*********************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *********************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;********************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *********************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;********************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ********************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;*******************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ********************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;*******************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *******************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;******************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *******************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;******************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ******************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;*****************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ******************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;*****************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *****************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;****************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *****************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;****************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ****************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;***************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ****************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;***************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ***************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;**************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ***************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;**************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; **************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;*************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; **************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;*************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;***********&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ************&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;***********&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ***********&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;**********&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ***********&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If that isn't beautiful, I don't know what is . . .&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br style="font-family: 'Courier New',Courier,monospace;" /&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-7099545443732019156?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/7099545443732019156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2010/01/fun-with-python-31s-new-string.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/7099545443732019156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/524230429673765509/posts/default/7099545443732019156'/><link rel='alternate' type='text/html' href='http://pyright.blogspot.com/2010/01/fun-with-python-31s-new-string.html' title='Fun With Python 3.1&apos;s New String Formatting . . .'/><author><name>Carl Trachte</name><uri>http://www.blogger.com/profile/12363048245012413049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://4.bp.blogspot.com/_27GcakEGOHc/S0tfqNSWp3I/AAAAAAAAADQ/Tmf7pqv3Ktk/S220/mugiv.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-524230429673765509.post-5781425202529307741</id><published>2009-12-26T10:23:00.000-08:00</published><updated>2010-02-12T12:26:58.078-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python python3 foreignlanguage pythoncommunity'/><title type='text'>Python Wiki Language Pages</title><content type='html'>&lt;a href="http://wiki.python.org/moin/Languages"&gt;This project&lt;/a&gt; started earlier this year with the goal of making Python more accessible to non-native speakers of English.&amp;nbsp; A personal goal of mine was to get a current survey of what is available in the way of Python information in languages other than English.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_27GcakEGOHc/SzZHFfi-8xI/AAAAAAAAAC0/84-98xpQ1DE/s1600-h/languagepage.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_27GcakEGOHc/SzZHFfi-8xI/AAAAAAAAAC0/84-98xpQ1DE/s320/languagepage.png" /&gt;&lt;/a&gt;&lt;/div&gt;The project is by no means original.&amp;nbsp; On the Python Wiki there were at least two other pages upon which this one was built:&amp;nbsp; PythonAroundTheWorld and CategoryLanguages.&amp;nbsp; The latter, to my recollection was the work of Andrew Kuchling and many others.&amp;nbsp; That base survey of knowledge to build upon made this project easy and fun.&lt;br /&gt;&lt;br /&gt;Christmas Day I received an autogenerated e-mail notifying me of changes to the ArabicLanguage page.&amp;nbsp; Anass Ahmed had built upon the work of Ahmed Youssef (author of &lt;a href="http://pypi.python.org/pypi/prayertime/1.0"&gt;Prayertime&lt;/a&gt;) and placed a Wikipedia-like general info on Python section into the page.&amp;nbsp; What didn't exist five months ago is now on par with the &lt;a href="http://wiki.python.org/moin/ThaiLanguage?highlight=%28CategoryLanguage%29"&gt;Thai&lt;/a&gt; and &lt;a href="http://wiki.python.org/moin/RussianLanguage?highlight=%28CategoryLanguage%29"&gt;Russian&lt;/a&gt; pages, both of which are pretty robust.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Update:&amp;nbsp; Ahmed Y. got with me and let me know there were some problems with the Arabic page and the Wikipedia-like entry.&amp;nbsp; @siah on twitter had previously tweeted that some of the direct translations (Python = Pybon) were a bit comical.&amp;nbsp; Well, all I can say is it's nice having some Arabic speakers covering your back. &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/SzZM-tJ_XWI/AAAAAAAAAC8/dCiLGxz1R-8/s1600-h/arabiclanguagepage.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/SzZM-tJ_XWI/AAAAAAAAAC8/dCiLGxz1R-8/s320/arabiclanguagepage.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I personally am intrigued by the possibilities that Python3 offers for unicode identifiers.&amp;nbsp; The coolest thing I've found on this end of things is a couple of PDF links on the &lt;a href="http://wiki.python.org/moin/KhmerLanguage?highlight=%28CategoryLanguage%29"&gt;Khmer&lt;/a&gt; (Cambodian) page.&amp;nbsp; Python 3.0 had hardly come out when an author or authors put together two quality pdf docs almost entirely in Khmer.&amp;nbsp; Python keywords and imported library names are the only English in the docs.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/_27GcakEGOHc/SzZPNj1jtyI/AAAAAAAAADE/hbFH9JkBUoE/s1600-h/khmerpdfexample.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_27GcakEGOHc/SzZPNj1jtyI/AAAAAAAAADE/hbFH9JkBUoE/s320/khmerpdfexample.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There are a few more nuggets in the language pages.&amp;nbsp; The definition of nugget will vary according to your interests, your skill level, and your programming tastes.&amp;nbsp; Please feel free to add to the pages; they are by no means complete.&lt;br /&gt;&lt;br /&gt;Thanks to Rami Chowdhury, vid svashka, Kirby Urner, and a host of others for their encouragement, advice, and ideas on this project.&amp;nbsp; Special thanks to the many bilingual pythonistas and friends of the Python community who contributed code snippets, texts, and links.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/524230429673765509-5781425202529307741?l=pyright.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyright.blogspot.com/feeds/5781425202529307741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pyright.blogspot.com/2009/12/python-wiki-l
