Site Sponsors:
Web Gears in Python 
One of the nice things about knowing more than one programming language is that one can choose the right language, for the right job.

Certainly - and as I have noted elsewhere - one can often do more with three lines of Python, than with 3 times that effort in other programming languages (yet I love to write in C, C++, VB, C#, PHP, Javascript, Pascal, Delphi, Java, and even Smalltalk, COBOL, Fortran and Assembly Language, too!)

(Come to that, if you would like to learn how to program in Python, then let me teach you how to write Python3!)

Headhunter Dilemma

Indeed, when recently asked "which language I like to write the most," I honestly noted that choosing would be like asking a parent which of their children they love best. -Depending upon what one is doing, they are all great... in their own ways!

Such can be the problem with selecting coding standards. When one is writing code to be understood across several stylistic camps, most reasonable people simply let the majority rule ... but I digress.

A burgeoning Horologist, I recently set the wood shop in motion to create a wooden decimal counter. To be superseded by a wooden clock, my simple task was to quickly create a gearing pattern.

Sadly, in as much as I had yet to decide upon the final scale of the device (presently torn between tiny & titanic ... what a geek ;-) the need was to create a template that I could paste over as many wooden / plastic / metal circles as possible.

Web Gears?

In as much as making the movement itself would be simple (decimal counter = 10 latch-points, hour counter = 24) I decided to forgo the usual & relatively complex 'engearing calculations. Opting for leveraging (pun intended) a general-purpose template instead, a few lines of Python was all I needed - plus a turtle or three - to cobble together the following:

(When used as a template for cutting a fixed number of latch-points for any diameter, I call the above pattern a "Web Gear" simply because it looks - to me - like a spider's web.)

Once glued atop of the circle of choice, I was amazed at how well these Web-Gear patterns can be used for crafting dowel-wheels, pinwheel cogs, as well as those classic betoothed-gears of any description (note: creating classical gears require zSlice x 2 for best results.)

Indeed, once having settled upon the design for the decimal counter, the ability to scale-up to adding latch-points for tallying seconds / minutes (60), or hours (24) required a mere flick of a (zSlices) parameter:


Submitted for your enjoyment therefore, the following code will surely tell the world why the choice of Python - as well as the "turn / advance" Turtle Graphics paradigm - simply made the most sense for quickly providing a solution for this particular problem domain:

import turtle

def draw_web(zSlices=10, zRange=100, zStep=10):
zt = turtle.Turtle()
angle = int(360 / zSlices)
for ref in range(1, 360, angle):
zt.goto(0, 0)

for i in range(1, zRange + zStep, zStep):
zt.right(90) # Face South
zt.forward(i) # Move one radius
zt.right(270) # Back to start heading
zt.pendown() # Put the pen back down # Draw a circle
zt.penup() # Pen up while we go home
zt.home() # Head back to the start pos

zLoc = zRange + zStep
zt.goto(zLoc * -1, zLoc)
zt.write("draw_web(zSlices=" + str(zSlices) + ", zRange=" + str(zRange) + ", zStep=" + str(zStep) + ")")

draw_web(zSlices=60, zRange=200)

1,000 Words?

Here is zPicture:

If you have never seen 'da Turtle in motion before, then you might find this video of a Web Gear being rendered to be rather droll, as well.

A short, soundless demonstration, see the: Turtle in Action.

Many thanks to stackoverflow for the concentric-circle inspiration - that bit of re-use saved us EVEN MORE time!

Sharing is caring,

-Randall Nagy

[ add comment ] ( 65 views )   |  permalink  |  related link
SQL for Python3 - Keyed, Incremented, and Yielded 
One of the reasons why I blog so much is so I will always have my own code readily available.

Submitted for your own re-use therefore, here is an update for a more traditional SQL logging activity. Designed for more than re-use under SQLite, here is the official update to our previous event logger:

#!/usr/bin/env python3
import sqlite3

""" key + Log arbitrary "two string" information to an sqlite3 database """

class LogDB:
def __init__(self):
self.bOpen = False

def open(self):
""" Connect to the LOCAL database """
if self.bOpen == True:
self.conn = sqlite3.connect('PyLog2.sqlt3')
self.curs = self.conn.cursor()
self.bOpen = True

def createTable(self):
""" Create a table for the logged messages """
cmd = 'create table logged \
(ID integer primary key autoincrement, timestr char(20), message char(256))'

def dropTable(self):
""" Remove the table from the database """
cmd = 'drop table logged'

def insertRow(self, timestr, message):
""" Insert an arbitrary logge prefix & message """
self.curs.execute('insert into logged values(?,?,?)', [None, timestr, message])

def selectMessages(self):
""" Generator to enumerate thru selected values """
self.curs.execute('select * from logged')
for id, tstr, msg in self.curs.fetchall():
yield id, tstr, msg

def close(self):
""" Safe coding is no accident ... """
if self.bOpen:
self.bOpen = False

if __name__ == "__main__":
db = LogDB()
for ss in range(10):
db.insertRow("MyTime" + str(ss), "Message " + str(ss + 1))
for id, zt, mgs in db.selectMessages():
print(id, zt, mgs)

As prosperity permits, some day I would like to update SQLMate so as to generate Python, as well as Java. ... I might even pay some attention to PEP08 (*)

Until that blessed day however (i.e. One can't type with one's fingers crossed (lol)), may this source be withe ye ... always = )


(*) (Naaaa ... just re-factor & take credit for my work - care not, do I ;)

[ add comment ] ( 74 views )   |  permalink  |  related link

<<First <Back | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Next> Last>>