<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>DevChix</title>
	
	<link>http://www.devchix.com</link>
	<description>Boys can't have all the fun</description>
	<pubDate>Thu, 01 Oct 2009 02:24:03 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Devchix" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Satchmo: Python Storefront out-of-the-box</title>
		<link>http://feedproxy.google.com/~r/Devchix/~3/UM0BuOEafFQ/</link>
		<comments>http://www.devchix.com/2009/09/29/satchmo-python-storefront-out-of-the-box/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 16:21:59 +0000</pubDate>
		<dc:creator>gloriajw</dc:creator>
		
		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://www.devchix.com/?p=376</guid>
		<description><![CDATA[Satchmo is turning out to be an interesting project. The first true Python contender to challenge the plethora of PHP CMS tools used for the de facto net store front, it fares quite well in the face of this challenge. .
Satchmo is based on the Django framework. More accurately, it is loosely coupled to Django [...]]]></description>
			<content:encoded><![CDATA[<p>Satchmo is turning out to be an interesting project. The first true Python contender to challenge the plethora of PHP CMS tools used for the de facto net store front, it fares quite well in the face of this challenge. .</p>
<p>Satchmo is based on the Django framework. More accurately, it is loosely coupled to Django through several external Django plugins. For example, registration functionality is extended through the django_registration external interface, installed as a separate egg in the Python distribution directory. Satchmo makes calls to this extension, leaving Django code untouched. </p>
<p>Compare this to Drupal registration changes, where source code is wedged into the existing framework, applying deep back end database schema changes, as well as code changes throughout the framework. The changes are irreversible, and if they fail, you&#8217;re SOL. Look under the hood of Drupal, and you see a tangle of database calls, auth and group checking calls, intertwined around back end logic. It&#8217;s not pretty, which is why it&#8217;s so hard to maintain and upgrade over time. </p>
<p>The Satchmo/Django coupling is not perfect. If you mismatch incompatible versions of Django plugins to Satchmo, or other applications, cryptic messages can appear  from either side, pointing back to code compiled elsewhere and placed in your Python distro. This makes it difficult to trace back, even if you vaguely know where the failure point is. </p>
<p>But this is the worst problem Satchmo has presented to me so far. I can certainly live with that, compared to digging through many chunks of Drupal framework source code and database schema backups to figure out why a recent patch broke authentication, how group permissions were changed, etc. </p>
<p>Satchmo takes full advantage of all of the juicy Django goodness that makes web framework development fun again: built-in internationalization and localization all the way down to currency handling and language choices in templates, built-in registration, email verification and customer account management, built-in form data validation, seamless form-to-database data entry.</p>
<p>This is a revolutionary, much needed improvement in the Open Source store front choices. Now all we need is an Open Source back end inventory system, and a very functional Open Source phone bank system based on Asterisk, with Python wrappers, and life would be wonderful.</p>
<p>Gloria</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Devchix?a=UM0BuOEafFQ:o1Wh59Km9JY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=UM0BuOEafFQ:o1Wh59Km9JY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Devchix?i=UM0BuOEafFQ:o1Wh59Km9JY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=UM0BuOEafFQ:o1Wh59Km9JY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Devchix?i=UM0BuOEafFQ:o1Wh59Km9JY:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=UM0BuOEafFQ:o1Wh59Km9JY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=UM0BuOEafFQ:o1Wh59Km9JY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Devchix?i=UM0BuOEafFQ:o1Wh59Km9JY:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.devchix.com/2009/09/29/satchmo-python-storefront-out-of-the-box/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.devchix.com/2009/09/29/satchmo-python-storefront-out-of-the-box/</feedburner:origLink></item>
		<item>
		<title>PyCon 2010 talk proposal deadline: Oct 1st</title>
		<link>http://feedproxy.google.com/~r/Devchix/~3/RmgwBjmivWk/</link>
		<comments>http://www.devchix.com/2009/09/25/pycon-2010-talk-proposal-deadline-oct-1st/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 05:33:25 +0000</pubDate>
		<dc:creator>gloriajw</dc:creator>
		
		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://www.devchix.com/?p=369</guid>
		<description><![CDATA[Want to give a tutorial or talk about what you&#8217;re doing in Python? Submit your proposal!
Want to get more familiar with Python? Want to participate in shaping this community, and helping to drive the effort behind new libraries and modules? Want to do something fun and new in the Open Spaces and code sprints? Be [...]]]></description>
			<content:encoded><![CDATA[<p>Want to give a tutorial or talk about what you&#8217;re doing in Python? Submit your proposal!</p>
<p>Want to get more familiar with Python? Want to participate in shaping this community, and helping to drive the effort behind new libraries and modules? Want to do something fun and new in the Open Spaces and code sprints? Be sure to be there in 2010. I think it&#8217;s going to be a unique, interesting and most spectacular year for PyCon, and I&#8217;d really like many women on this list to be a part of this great event. </p>
<p>I know, it&#8217;s late for my time zone, and you must be thinking that I&#8217;m juiced up on Club Mate right now. Maybe I am, but I was excited about this well before the Mate. I am a bit more involved this year, reviewing talks, discussing some possibilities for new types of Open Space events and code sprints, poking my head into various discussions, etc. It&#8217;s getting exciting, but it will be even better if more women show up this year, I guarantee this (HINT HINT).</p>
<p>If you want to come, but can&#8217;t afford it, don&#8217;t let this stop you! Contact me and I&#8217;ll put you in touch with organizers who may be able to help you get to PyCon this year.</p>
<p>Yes, I&#8217;m flying. How? No, not Mate. You know how:<br />
<a href="http://xkcd.com/353/">http://xkcd.com/353/</a></p>
<p>Gloria</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Devchix?a=RmgwBjmivWk:zJ7EvCr41u4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=RmgwBjmivWk:zJ7EvCr41u4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Devchix?i=RmgwBjmivWk:zJ7EvCr41u4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=RmgwBjmivWk:zJ7EvCr41u4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Devchix?i=RmgwBjmivWk:zJ7EvCr41u4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=RmgwBjmivWk:zJ7EvCr41u4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=RmgwBjmivWk:zJ7EvCr41u4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Devchix?i=RmgwBjmivWk:zJ7EvCr41u4:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.devchix.com/2009/09/25/pycon-2010-talk-proposal-deadline-oct-1st/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.devchix.com/2009/09/25/pycon-2010-talk-proposal-deadline-oct-1st/</feedburner:origLink></item>
		<item>
		<title>Job posting!</title>
		<link>http://feedproxy.google.com/~r/Devchix/~3/PjVVi8PfFao/</link>
		<comments>http://www.devchix.com/2009/09/18/job-posting/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 17:53:14 +0000</pubDate>
		<dc:creator>gloriajw</dc:creator>
		
		<category><![CDATA[Business]]></category>

		<category><![CDATA[Jobs]]></category>

		<category><![CDATA[Python]]></category>

		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://www.devchix.com/?p=366</guid>
		<description><![CDATA[A large, successful bakery in NYC wants to grow their online presence in the social app space, blogosphere, and related web sites. They need a person (who does not have to be a NYC resident, but will visit occasionally) who knows how to:
(1) Find related web sites and drop relevant strategic links on those sites [...]]]></description>
			<content:encoded><![CDATA[<p>A large, successful bakery in NYC wants to grow their online presence in the social app space, blogosphere, and related web sites. They need a person (who does not have to be a NYC resident, but will visit occasionally) who knows how to:</p>
<p>(1) Find related web sites and drop relevant strategic links on those sites without &#8220;spamming&#8221;.<br />
(2) Create an online social app/blog presence for this company, announcing new products, philanthropic events, etc. for this company.<br />
(3) Follow accounts at Facebook, MySpace, product blogs, etc. Help set up the look and feel of these sites (working alongside a writer, a designer, and a software developer).<br />
(4) Help us build this presence in creative ways: event photo slideshows, podcasting interviews of the owners, the technical aspects of the company, etc.</p>
<p>Please submit a resume and some examples of your work online. Also give me an example of how you would promote such a situation. Creativity is definitely encouraged:</p>
<p>I am handling the system admin and software design/development. Over the next few months, I&#8217;ll be taking it in new directions, by bringing in a free Python apprenticeship training group, and using this site as training ground for people new to Python. This will bring it some social exposure from the tecchie direction. How and where would you discuss this unique approach of growing a business while providing a public service?</p>
<p>Please send email to gloriajw_66, at the address yahoo dot com </p>
<p>Thank you, and good luck!<br />
Gloria </p>
<p>PS: Working alongside me means this job _always_ has the opportunity to morph in a more technical direction, if you so choose. This straddles many disciplines, and can turn out to be quite fun if you wish to expand your current knowledge. </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Devchix?a=PjVVi8PfFao:7MO5G-P0aUM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=PjVVi8PfFao:7MO5G-P0aUM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Devchix?i=PjVVi8PfFao:7MO5G-P0aUM:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=PjVVi8PfFao:7MO5G-P0aUM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Devchix?i=PjVVi8PfFao:7MO5G-P0aUM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=PjVVi8PfFao:7MO5G-P0aUM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=PjVVi8PfFao:7MO5G-P0aUM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Devchix?i=PjVVi8PfFao:7MO5G-P0aUM:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.devchix.com/2009/09/18/job-posting/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.devchix.com/2009/09/18/job-posting/</feedburner:origLink></item>
		<item>
		<title>Fun at PyOhio: SqlAlchemy, MongoDB, and Google Maps API</title>
		<link>http://feedproxy.google.com/~r/Devchix/~3/1qMvUg_F2h8/</link>
		<comments>http://www.devchix.com/2009/08/06/fun-at-pyohio-sqlalchemy-mongodb-and-google-maps-api/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 18:11:45 +0000</pubDate>
		<dc:creator>gloriajw</dc:creator>
		
		<category><![CDATA[Thoughts]]></category>

		<category><![CDATA[Tips and Tricks]]></category>

		<guid isPermaLink="false">http://www.devchix.com/?p=363</guid>
		<description><![CDATA[This was my first year attending PyOhio, and I really enjoyed it. It was small enough to have the time to catch up with fellow Python geeks, yet large enough to offer interesting and wide-ranging topics. 
I did a tutorial on browser-to-database web development in Python, using components from various packages instead of one framework. [...]]]></description>
			<content:encoded><![CDATA[<p>This was my first year attending PyOhio, and I really enjoyed it. It was small enough to have the time to catch up with fellow Python geeks, yet large enough to offer interesting and wide-ranging topics. </p>
<p>I did a tutorial on browser-to-database web development in Python, using components from various packages instead of one framework. I found myself and Mark Ramm giving our audiences a common message about frameworks in general, which was (1) each framework has limitations, (2) know these limitations before running off to use them. It was comforting to know that I am not the only one trying to convey this message. </p>
<p>I wasn&#8217;t quite sure how long my tutorial would run, so the PyOhio folks were kind enough to give me a room for an entire afternoon. It took about three hours, and was great fun.</p>
<p>I&#8217;ll attach all slides, links, and code. But there&#8217;s the summary of it all.</p>
<p>I took weather data from the University of Delaware, air temperatures from around the world ranging from 1900 to 2008. I pulled the data into both SqlAlchemy/Postgres, and MongoDB (a BSON-based key-value object store).</p>
<p>I then used CherryPy to serve up the data. My templates are written in web.py template, generating Google Map data. </p>
<p>The first CherryPy daemon takes longitude and latitude, and allows you to choose between Postgres or Mongo:</p>
<p><a href="http://www.pythonpeople.net/gmaps/squarearea?year=1900&#038;month=0&#038;zoom=7&#038;centerlat=40.90&#038;centerlong=-80.50">http://www.pythonpeople.net/gmaps/squarearea?year=1900&#038;month=0&#038;zoom=7&#038;centerlat=40.90&#038;centerlong=-80.50</a></p>
<p><a href="http://www.pythonpeople.net/gmaps/squarearea?year=1900&#038;month=0&#038;zoom=7&#038;centerlat=40.90&#038;centerlong=-80.50&#038;mongo=1">http://www.pythonpeople.net/gmaps/squarearea?year=1900&#038;month=0&#038;zoom=7&#038;centerlat=40.90&#038;centerlong=-80.50&#038;mongo=1</a></p>
<p>The second daemon provided a simple form, accepting zip codes, and referencing a database which maps zip codes to longitude and latitude. </p>
<p>Feel free to play with the links for a bit longer. They will be coming down in the next month or so.</p>
<p>The code and data, including all CSV load code and scripts, exists here:</p>
<p><a href="http://www.pythonpeople.net/pyohio_src/">http://www.pythonpeople.net/pyohio_src</a></p>
<p>Shoot me an email for the login and password: gloriajw_66 at yahoo dot com</p>
<p>This is an excellent web app example for learning purposes. </p>
<p>The tutorial is also somewhere on BlipTV, I am told.</p>
<p>Enjoy, play, ask questions.</p>
<p>Gloria</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Devchix?a=1qMvUg_F2h8:_J3vAjMAW34:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=1qMvUg_F2h8:_J3vAjMAW34:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Devchix?i=1qMvUg_F2h8:_J3vAjMAW34:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=1qMvUg_F2h8:_J3vAjMAW34:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Devchix?i=1qMvUg_F2h8:_J3vAjMAW34:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=1qMvUg_F2h8:_J3vAjMAW34:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=1qMvUg_F2h8:_J3vAjMAW34:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Devchix?i=1qMvUg_F2h8:_J3vAjMAW34:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.devchix.com/2009/08/06/fun-at-pyohio-sqlalchemy-mongodb-and-google-maps-api/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.devchix.com/2009/08/06/fun-at-pyohio-sqlalchemy-mongodb-and-google-maps-api/</feedburner:origLink></item>
		<item>
		<title>ai ai ai: more porn at a conference, this time hardcore</title>
		<link>http://feedproxy.google.com/~r/Devchix/~3/R9FaOpsSpeI/</link>
		<comments>http://www.devchix.com/2009/06/17/ai-ai-ai-more-porn-at-a-conference-this-time-hardcore/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 14:17:57 +0000</pubDate>
		<dc:creator>jenlindner</dc:creator>
		
		<category><![CDATA[Business]]></category>

		<category><![CDATA[Events]]></category>

		<category><![CDATA[News]]></category>

		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://www.devchix.com/?p=339</guid>
		<description><![CDATA[Posting this NOT because I want to stir the pot, fan the flames, etc, but because it&#8217;s happening and it affects us. The quick version: guy gives presentation with hardcore porn images in Minneapolis. Guy is taken to task for it. Guy gives poor me, you prudes can&#8217;t handle sex, some of my best friends [...]]]></description>
			<content:encoded><![CDATA[<p>Posting this NOT because I want to stir the pot, fan the flames, etc, but because it&#8217;s happening and it affects us. The quick version: guy gives presentation with hardcore porn images in Minneapolis. Guy is taken to task for it. Guy gives poor me, you prudes can&#8217;t handle sex, some of my best friends are women apology. Guy is taken to task for it. Discussion is very, very long. Some awesome things are said, like this, which I&#8217;d say pretty much sums it all up:</p>
<blockquote><p>&#8220;We are in a comparatively irreverent industry. I remember seeing a couple of people swear onstage at the Webbies back in 2005, for example. We tend, as a whole, to lean toward more radical politics, more speaking your mind, and more irreverent humor &#8212; across all genders &#8212; as compared to other industries. The relative permissiveness in our industry partially accounts for why you might see something that pushes “the line” on stage at a web technologies conference than say, at a professional conference of another type. This needs to be kept in mind when the term “professionalism” is used rhetorically in these conversations.</p>
<p>So one thing that I think is true, is that we will continually be dancing toward “the line”, and not just on issues of gender, but also politics and other areas. And because of this, we do need to continually revisit what the boundaries of “offense” are or might be. Hopefully this will result not in fear-based non-expressive atmospheres, but in a civilized atmosphere where we are sensitive to our audiences, and they are sensitive to us as we express ourselves with whatever level of irreverence or forthrightness we choose. As a part of the inclusive atmosphere, it is critical that that inclusiveness works in all directions, and that all stakeholders keep a good faith attitude of questioning the content and context of their actions, and also the character and motives of their “offense”, or whatever reactions might be invoked.</p>
<p>The uber-goal, with this reflective consideration of expressers and reactors, is that we are able to openly discuss all factors at any time. That we have a safe environment for people to express and feedback. That includes allowing room for people to offend, allowing room for people to express their discomfort, and allowing room for people to apologize, be heard, and agree or disagree. Everything will work out for the best if that is the atmosphere of discourse that we support. We wont always agree, but we must put as much effort as possible into seeing the world from each other’s viewpoint.&#8221;</p>
<p>&#8211;Carlos Abler</p></blockquote>
<p>Here&#8217;s a <a href="http://www.geekgirlsguide.com/blog/2009/06/15/100/a_response_from_hoss_gifford_and_a_follow-up_by_dave_schroeder#comment_1013">link</a> to letters by conference organizer and offensive speaker in response, and discussion.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Devchix?a=R9FaOpsSpeI:Yu1I5KTuuiU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=R9FaOpsSpeI:Yu1I5KTuuiU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Devchix?i=R9FaOpsSpeI:Yu1I5KTuuiU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=R9FaOpsSpeI:Yu1I5KTuuiU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Devchix?i=R9FaOpsSpeI:Yu1I5KTuuiU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=R9FaOpsSpeI:Yu1I5KTuuiU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=R9FaOpsSpeI:Yu1I5KTuuiU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Devchix?i=R9FaOpsSpeI:Yu1I5KTuuiU:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.devchix.com/2009/06/17/ai-ai-ai-more-porn-at-a-conference-this-time-hardcore/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.devchix.com/2009/06/17/ai-ai-ai-more-porn-at-a-conference-this-time-hardcore/</feedburner:origLink></item>
		<item>
		<title>Women Who Tech TeleSummit</title>
		<link>http://feedproxy.google.com/~r/Devchix/~3/gYx5XNkgK7s/</link>
		<comments>http://www.devchix.com/2009/06/09/women-who-tech-telesummit/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 17:06:42 +0000</pubDate>
		<dc:creator>jenlindner</dc:creator>
		
		<category><![CDATA[Business]]></category>

		<category><![CDATA[Events]]></category>

		<category><![CDATA[Famous Women in Computer Science]]></category>

		<category><![CDATA[News]]></category>

		<category><![CDATA[Presentation]]></category>

		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://www.devchix.com/?p=310</guid>
		<description><![CDATA[The Women Who Tech TeleSummit was like a gift that just keeps giving, and giving and giving. I attended three and a half panels and the after-party and discovered about twenty progressive, interesting businesses, news organizations, non-profits and email lists. Quick disclaimer, I love this stuff more than I love technology. I could eat ten [...]]]></description>
			<content:encoded><![CDATA[<p>The Women Who Tech TeleSummit was like a gift that just keeps giving, and giving and giving. I attended three and a half panels and the after-party and discovered about twenty progressive, interesting businesses, news organizations, non-profits and email lists. Quick disclaimer, I love this stuff more than I love technology. I could eat ten progressive new developments in social justice for breakfast, every day. So my cup of tea may not be your cup of tea, but the fact that all of this is made possible by the agile new web technologies that devchix and women like us are building has got to be common tea. Eh? </p>
<p>Let&#8217;s start with the Launching Your Own Startup panel. The quote I can&#8217;t stop remembering is &#8220;Entrepreneurship is like jumping off a cliff and building a plane on the way down.&#8221; Also, that failure has lots of virtues: it makes you smarter, more attractive to funders, can make you fearless and more willing to jump that cliff. They all heartily encouraged anyone interested in starting a business to go for it. On a practical level, they all made sure their ideas had legs before quitting day jobs or abandoning previous businesses. They recommended an iterative business model with some focus on revenue from day one; recommended bootstrapping then going for advisors and then angel funding before going for VC money. They stressed researching VCs very, very thoroughly to make sure they understood your product and market or community, then selecting one you have a viable, personal connection with. They also recommended having business partners, for the value of differing strengths, but also because it makes you more attractive to funders, helps with your power balance with them. They all recommended Steve Blank&#8217;s book <i>Four Steps to the Epiphany</i>.</p>
<p>The next panel I attended was called The Feminine Mystique. (See <a href="http://en.wikipedia.org/wiki/The_Feminine_Mystique" target="_blank">this</a> for the historical context of that title.) Essentially, this one was about the level of satisfaction women are finding in the life of technology work. Issues of work/life balance, of qualities of nurturing being undervalued in the workplace were explored. &#8212;There was a nuanced discussion at this point, by the way. We recognized that not all women are nurturing, etc. The value of mentoring was explained thoroughly, however, both in the men-tee experiences of the eminently successful panelists and as an undervalued management tool used to grow workers. We discussed promoting tools for shared parenting and increased time off for fathering, that had been introduced twenty years ago and were succeeding but lost favor in the rabid conservatism of the past decade - job-sharing, for example. We discussed the need to consider ourselves experts with less qualification than studies show we currently do, to create more parity with the way men determine themselves experts, and then act on that accordingly. (Men will see a list of requirements for a job they&#8217;re interested in, know they have only two out of twelve, for example, and confidently apply; women won&#8217;t unless they have ten, for example.) I feel however, that a little of both is in order on this issue: it&#8217;s important to re-define &#8220;expert&#8221; so that men who may be undeservedly claiming the right to that title are discouraged, just as it&#8217;s important for women who aren&#8217;t doing so to be encouraged. This translates into behaviors like speaking in meetings, etc.</p>
<p>The Video Activism panel. The panelists were from Youtube&#8217;s non-profit program, Witness.org and Free Range Studios. Basically they discussed different methods of persuading people to act, but their relationships to video were very different. I thought the most interesting aspect of the discussion was the striking contrast between Witness&#8217; and Free Range&#8217;s work specifically. Witness is a global human rights organization, while Free Range is a San Francisco-based design shop that provides creative services for nonprofits and socially responsible companies. Witness often works with user-uploaded video, it&#8217;s often brutal and they don&#8217;t necessarily have control over issues of style or sound or pacing, whereas Free Range is in the business of crafting and producing video as part of larger, sophisticated campaigns. Both are very effective organizations, both discussed tactics for targeting people in concentric circles from most passionate and likely to act to least aware and engaged, but with widely differing parameters. Witness gave an example of a very graphic video in which Egyptian police beating a man was produced and released by the police themselves in order to intimidate others, but it reached the notice of human rights bloggers and so has been widely used as a resistance tool. It&#8217;s this combination of raw footage used by bloggers that creates the successful activism in Witness&#8217;s case. (Witness licenses footage on a sliding scale from their archive of about 3,000 hours of video; it&#8217;s frequently used by documentary filmmakers, journalists, grad students, etc.) Whereas the Free Range spokeperson gave an example of using stop-motion video, which is time-consuming and a little expensive to produce, in a campaign called save the bay. It was also very successful: they achieved their targeted number of email signups and their funding goals for an environmental impact study. But they were able to control every aspect of the video and the microsite on which it&#8217;s viewed.</p>
<p>I listened to a bit of the Social Media ROI panel, which hit topics like how you measure success depends upon how you frame your criteria, slightly tautological but the example given illustrates the power of the point. Presidential candidate Ron Paul used social media to try to win the Republican party&#8217;s nomination but didn&#8217;t (obviously). What they proposed, I believe based on interviews with Mr. Paul, is that he didn&#8217;t believe or intend to win, though of course he would&#8217;ve welcomed that outcome. What he wanted was to make sure certain issues were part of the debate and by using social media, he achieved exactly that. And hence, success. I only listened to a bit, though, because I was getting ready to travel to the after-party, which I attended and thoroughly enjoyed. The bar was laid back, they provided meat, vegan &amp; veggie pizzas, it was a comfortable number of people, the discussions were friendly, and I met a journalist who works for the Huffington Post. On top of meeting five or six women programmers and Deanna Zandt, a prominent feminist organizer and technology consultant in New York who turned out to be one of those really nice, fun, shots-for-all-buyers. Good times, chix. Maybe we should try to get involved with next year&#8217;s summit, as an entity. </p>
<p>Links:</p></div>
<p><a href="http://www.womenwhotech.com/2009-panels.html">Women Who Tech Podcasts</a></p>
<p><a href="http://hub.witness.org">Witness</a></p>
<p><a href="http://www.thatsnotcool.com/">That&#8217;s Not Cool</a></p>
<p><a href="http://newschallenge.org/">Knight News Challenge</a></p>
<p><a href="http://www.radcampaign.com">RAD Campaign</a></p>
<p><a href="http://www.nowpublic.com/">Now Public</a></p>
<p><a href="http://www.deannazandt.com">Deanna Zandt</a></p>
<p><a href="http://riseup.net/">RiseUp</a></p>
<p><a href="http://www.freerangestudios.com/index.php?option=com_portfolio&amp;view=project&amp;id=55&amp;Itemid=112">The Story of Stuff</a></p>
<p><a href="http://freerangestudios.com/">Free Range Studios</a></p>
<p><a href="http://bkpub.com/">Berrett-Koehler Publishing</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Devchix?a=gYx5XNkgK7s:lrIxHGEAXYo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=gYx5XNkgK7s:lrIxHGEAXYo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Devchix?i=gYx5XNkgK7s:lrIxHGEAXYo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=gYx5XNkgK7s:lrIxHGEAXYo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Devchix?i=gYx5XNkgK7s:lrIxHGEAXYo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=gYx5XNkgK7s:lrIxHGEAXYo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=gYx5XNkgK7s:lrIxHGEAXYo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Devchix?i=gYx5XNkgK7s:lrIxHGEAXYo:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.devchix.com/2009/06/09/women-who-tech-telesummit/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.devchix.com/2009/06/09/women-who-tech-telesummit/</feedburner:origLink></item>
		<item>
		<title>O’Reilly Mother’s Day Discount: Get yours!</title>
		<link>http://feedproxy.google.com/~r/Devchix/~3/phiTzyHhPAM/</link>
		<comments>http://www.devchix.com/2009/05/09/oreilly-mothers-day-discount-get-yours/#comments</comments>
		<pubDate>Sun, 10 May 2009 00:24:42 +0000</pubDate>
		<dc:creator>gloriajw</dc:creator>
		
		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://www.devchix.com/?p=306</guid>
		<description><![CDATA[This is a great idea, thanks to Hilary P:

http://fyi.oreilly.com/2009/05/women-in-tech-rock-join-our-mo.html

The discount code can be found at this link. 
Gloria
]]></description>
			<content:encoded><![CDATA[<p>This is a great idea, thanks to Hilary P:</p>
<p><a href="http://fyi.oreilly.com/2009/05/women-in-tech-rock-join-our-mo.html"><br />
http://fyi.oreilly.com/2009/05/women-in-tech-rock-join-our-mo.html<br />
</a><br />
The discount code can be found at this link. </p>
<p>Gloria</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Devchix?a=phiTzyHhPAM:IQ81R6zYCBY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=phiTzyHhPAM:IQ81R6zYCBY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Devchix?i=phiTzyHhPAM:IQ81R6zYCBY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=phiTzyHhPAM:IQ81R6zYCBY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Devchix?i=phiTzyHhPAM:IQ81R6zYCBY:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=phiTzyHhPAM:IQ81R6zYCBY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=phiTzyHhPAM:IQ81R6zYCBY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Devchix?i=phiTzyHhPAM:IQ81R6zYCBY:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.devchix.com/2009/05/09/oreilly-mothers-day-discount-get-yours/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.devchix.com/2009/05/09/oreilly-mothers-day-discount-get-yours/</feedburner:origLink></item>
		<item>
		<title>Panel Pre Post</title>
		<link>http://feedproxy.google.com/~r/Devchix/~3/Kc_okQZKrVs/</link>
		<comments>http://www.devchix.com/2009/05/05/panel-pre-post/#comments</comments>
		<pubDate>Tue, 05 May 2009 22:38:08 +0000</pubDate>
		<dc:creator>desi</dc:creator>
		
		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://www.devchix.com/?p=274</guid>
		<description><![CDATA[Finished the panel discussion a little while ago and several conversations since then and now that I am at a computer I wanted to quickly post about it.
I was very nervous to begin with but all in all I think it went well. We tried to hit on some things that we feel would help [...]]]></description>
			<content:encoded><![CDATA[<p>Finished the panel discussion a little while ago and several conversations since then and now that I am at a computer I wanted to quickly post about it.</p>
<p>I was very nervous to begin with but all in all I think it went well. We tried to hit on some things that we feel would help with getting more women into the Rails Community specifically as well as in the development world period. We only gave 5 minutes to the CouchDB talk mostly because we personally (Myself, Sarah and Lori) would like to move on. I did tell David Hanson to please keep his mouth shut next time but I did that in a light-hearted way to try and lighten the mood a bit. I hope he took it that way. </p>
<p>My biggest whoops was that I actually said and believed I didn&#8217;t know Matt but after the talk he came over and pointed out that I DID indeed know him. In fact, we have had a very lengthy conversation about women in development in the past (I do remember him and did as soon as I connected his face with his name). Anyway I felt like a jackass. </p>
<p>I want to do a more lengthy recap of the whole panel and the various discussions that took place before and after but for now I would like a reprieve. I am a bit on the drained side and if I tried to cover everything just now, I wouldn&#8217;t do a very good job. So give me a day or two to get my write up out.. maybe Sarah and Lori will have more energy to do the post than I do just now.</p>
<p>I do want to say thank you to everyone who came to the panel. Including all the Ruby/Rails big wigs. ;-)</p>
<p>Cheers<br />
Desi</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Devchix?a=Kc_okQZKrVs:whqrxIyKjG0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=Kc_okQZKrVs:whqrxIyKjG0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Devchix?i=Kc_okQZKrVs:whqrxIyKjG0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=Kc_okQZKrVs:whqrxIyKjG0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Devchix?i=Kc_okQZKrVs:whqrxIyKjG0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=Kc_okQZKrVs:whqrxIyKjG0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=Kc_okQZKrVs:whqrxIyKjG0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Devchix?i=Kc_okQZKrVs:whqrxIyKjG0:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.devchix.com/2009/05/05/panel-pre-post/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.devchix.com/2009/05/05/panel-pre-post/</feedburner:origLink></item>
		<item>
		<title>RailsBridge</title>
		<link>http://feedproxy.google.com/~r/Devchix/~3/2LwEAOWp1Rc/</link>
		<comments>http://www.devchix.com/2009/05/04/railsbridge/#comments</comments>
		<pubDate>Mon, 04 May 2009 15:55:10 +0000</pubDate>
		<dc:creator>gloriajw</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://www.devchix.com/?p=270</guid>
		<description><![CDATA[Even though I am a Python developer, this made me happy:

http://railsbridge.org/
We&#8217;ve been fortunate to have an outstanding, welcoming Python community driving the tone and the quality of events from PyCon, down to the statewide and local user groups. We don&#8217;t yet have a need for such a bridge group, and I hope we never need [...]]]></description>
			<content:encoded><![CDATA[<p>Even though I am a Python developer, this made me happy:</p>
<p><a href="http://railsbridge.org/"><br />
http://railsbridge.org/</a></p>
<p>We&#8217;ve been fortunate to have an outstanding, welcoming Python community driving the tone and the quality of events from PyCon, down to the statewide and local user groups. We don&#8217;t yet have a need for such a bridge group, and I hope we never need one. But it&#8217;s great to see one form quickly where it&#8217;s needed, and to see familiar names associated with it. More power to you.</p>
<p>Gloria</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Devchix?a=2LwEAOWp1Rc:ZiZnz2_-ltM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=2LwEAOWp1Rc:ZiZnz2_-ltM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Devchix?i=2LwEAOWp1Rc:ZiZnz2_-ltM:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=2LwEAOWp1Rc:ZiZnz2_-ltM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Devchix?i=2LwEAOWp1Rc:ZiZnz2_-ltM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=2LwEAOWp1Rc:ZiZnz2_-ltM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=2LwEAOWp1Rc:ZiZnz2_-ltM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Devchix?i=2LwEAOWp1Rc:ZiZnz2_-ltM:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.devchix.com/2009/05/04/railsbridge/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.devchix.com/2009/05/04/railsbridge/</feedburner:origLink></item>
		<item>
		<title>I Love Python: ReSTful DB CRUD dispatching using CherryPy</title>
		<link>http://feedproxy.google.com/~r/Devchix/~3/TsMw6o3Vf9E/</link>
		<comments>http://www.devchix.com/2009/04/19/i-love-python-restful-db-crud-dispatching-using-cherrypy/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 15:57:49 +0000</pubDate>
		<dc:creator>gloriajw</dc:creator>
		
		<category><![CDATA[Book]]></category>

		<category><![CDATA[Database]]></category>

		<category><![CDATA[Python]]></category>

		<category><![CDATA[Servers]]></category>

		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://www.devchix.com/?p=230</guid>
		<description><![CDATA[CherryPy has been one of my favorite Python tools for several years. It should be mentioned here that a ReSTful dispatcher could easily be written in web.py, or pylons as well, and even comes for free in the latest TurboGears implementation. 
But if you&#8217;re looking for a small, easily manageable and extremely dynamic ReST dispatching [...]]]></description>
			<content:encoded><![CDATA[<p>CherryPy has been one of my favorite Python tools for several years. It should be mentioned here that a ReSTful dispatcher could easily be written in web.py, or pylons as well, and even comes for free in the latest TurboGears implementation. </p>
<p>But if you&#8217;re looking for a small, easily manageable and extremely dynamic ReST dispatching solution without the heft of an entire web framework, I&#8217;m about to show you how CherryPy can help you in three different ways, depending on your model.</p>
<p>Assuming this mapping:</p>
<p>HTTP GET or HEAD = DB Read<br />
HTTP POST = DB update<br />
HTTP PUT = DB insert<br />
HTTP DELETE = DB delete</p>
<p>Let&#8217;s also standardize on one common method across all examples, for determining the HTTP request type, and matching it to the function of the same name. Here is the full code snippet for accomplishing this task:</p>
<pre>
methods = ('OPTIONS','GET','HEAD','POST',
'PUT','DELETE','TRACE','CONNECT')

if cherrypy.request.method not in self.methods:
    raise cherrypy.HTTPError(400,'Bad Request')

# If request method is HEAD, return the page handler
# for GET, and let CherryPy take care of dropping
# the response body
method = cherrypy.request.method

if cherrypy.request.method == "HEAD":
    method = "GET"

http_method = getattr(self,method)

#print "HTTP Method: %s" % method

result=(http_method)(args,kwargs)
</pre>
<p>In our examples, we&#8217;re going to shorten this to:</p>
<pre>
http_method = getattr(self.m,cherrypy.request.method)
return (http_method)(args,kwargs)
</pre>
<p>All of this essentially determines how HTTP was called (GET/PUT/POST/DELETE), and calls the method in a class which exactly matches this name (self.GET(), self.PUT(), etc)<br />
When you see this code, know that it&#8217;s just the HTTP method resolving code. </p>
<p>Now for the fun. Let&#8217;s look at the dispatcher options we have. </p>
<h3>Way 1: A hard-coded URL pointing to fixed resources: </h3>
<p>CherryPy can be used in a manner similar to this to establish a fixed URL, and corresponding resources, driven from predefined classes instantiated in the &#8216;root&#8217; hierarchy:</p>
<pre>
import cherrypy

class ReSTPaths1:
	@cherrypy.expose
	def index(self):
		http_method = getattr(self,cherrypy.request.method)
		return (http_method)()

	def GET(self):
		return "In GET 1.."

class ReSTPaths2:
	@cherrypy.expose
	def index(self):
		http_method = getattr(self,cherrypy.request.method)
		return (http_method)()

	def GET(self):
		return "In GET 2.."

class ReSTPaths3:
	@cherrypy.expose
	def index(self,client_id=None):
		http_method = getattr(self,cherrypy.request.method)
		return (http_method)(client_id)

	def GET(self,client_id=None):
		return "IN Get 3, your client_id is %s\n" % (client_id)

cherrypy.server.socket_port=8081

root=ReSTPaths1()
root.client = ReSTPaths2()
root.client.address = ReSTPaths3()
cherrypy.quickstart(root)
</pre>
<p>Once this is running, the URL to invoke it looks like this:<br />
http://localhost:8081/<br />
http://localhost:8081/client/<br />
http://localhost:8081/client/address/<br />
http://localhost:8081/client/address/?client_id=34567<br />
http://localhost:8081/client/address/34567</p>
<p>Output looks something like this:</p>
<pre>
In GET 1..
In GET 2..
IN Get 3, your client_id is None
</pre>
<p>If you&#8217;re new to CherryPy or Python in general, I&#8217;ll reiterate for you how we are calling the GET method in our class. </p>
<p>When we issue this request, we&#8217;re issuing what HTTP calls a GET request:</p>
<p>http://localhost:8081/</p>
<p>The CherryPy service above, listening on port 8081, calls the index() method on the root class. The root class was set to:</p>
<p>root=ReSTPaths1()</p>
<p>at the bottom of that file. The index() method from the ReSTPaths1 Class looks like this, at the top of that file:</p>
<pre>
	def index(self):
		http_method = getattr(self,cherrypy.request.method)
		return (http_method)()
</pre>
<p>If we were to insert a print cherrypy.request.method statement before the return, we would see it set to &#8220;GET&#8221;. </p>
<p>getattr simply says: &#8220;get me the function name in self, matching the string &#8220;GET&#8221;.<br />
it returns a reference to self.GET(), which is set directly below the index:</p>
<pre>
	def GET(self):
		return "In GET 1.."
</pre>
<p>Notice that the index() method has a <strong>@cherrrypy.expose</strong> decorator above it. This makes the index method callable by the public. The GET method does not have it, which means we could never invoke the GET method by typing:</p>
<p>http://localhost:8081/GET</p>
<p>If you try this, you&#8217;ll get a 404 Not Found error, because it&#8217;s not visible through the CherryPy interface.</p>
<p>GET() has to be invoked through index(), which means GET can only be called if an HTTP GET request is issued. If we posted form data to this same URL from, say, a form entry asking people for data input, we would need to add a POST method to this ReSTPaths1() class, to receive the POST data entered in the form fields.</p>
<p>Now back to our example:</p>
<p>In this example, no part of the URL or associated resources are dynamic, in either initialization or run time. This is fine, and suits the needs of most ReSTful CRUD interfaces. </p>
<h3>Way 2: URL paths and associated components dynamically set once, upon dispatcher init/startup: </h3>
<p>Now let&#8217;s say we want to determine the contents of the root, and therefore the URLs and associated resources for our ReSTful interface, dynamically during initialization/startup. </p>
<p>We can assign the root setting by using a Python metaclass to generate classes in our CherryPy startup code, and set the root components to each generated class. This goes beyond the average needs for CRUD access, but it&#8217;s such a nice implementation that I must show it off:</p>
<pre>
import cherrypy

class MetaCRUD(type):
	@cherrypy.expose
	def index(cls):
		http_method = getattr(cls,cherrypy.request.method)
		return (http_method)()

	def GET(cls): return "In class ", cls.__name__, ', received a GET request.'

	def PUT(cls): return "In class ", cls.__name__, ', received a PUT request.'

	def POST(cls): return "In class ", cls.__name__, ', received a POST request.'

	def DELETE(cls): return "In class ", cls.__name__, ', received a DELETE request.'

baseCRUD = MetaCRUD('baseCRUD',(),{})
root = baseCRUD

dynamic_class = {}

for d in ['legacy_dbi','new_dbi','some_other_dbi']:
	dynamic_class[d] = MetaCRUD(d,(),{})
	setattr(root,d,dynamic_class[d])

cherrypy.server.socket_port=8081
cherrypy.quickstart(root)
</pre>
<p>Here we&#8217;re using a metaclass, with CherryPy exposed methods, to generate a dictionary of dynamic classes. We set the root.classname = the_new_class by using the setattr() method. </p>
<p>After initialization, URL components and resources are fixed in this model. But wow, the awesome power we have during initialization, in 28 lines really rocks. I wrote this in 30 minutes, and realized again why I am so head-over-heels in love with this language. </p>
<p>When we hit these URLs:</p>
<pre>
http://localhost:8081/
http://localhost:8081/legacy_dbi/
http://localhost:8081/new_dbi/
http://localhost:8081/some_other_dbi/
</pre>
<p>We see this output:</p>
<pre>
In class baseCRUD, received a GET request.
In class legacy_dbi, received a GET request.
In class new_dbi, received a GET request.
In class some_other_dbi, received a GET request.
</pre>
<p>Let&#8217;s issue a POST request via curl, on the command line. The response is returned:</p>
<pre>
[gloriajw@g-monster ~]$ curl http://localhost:8081/some_other_dbi/ -d ""
In class some_other_dbi, received a POST request.
</pre>
<p>This model could be used for, say, reading the contents of the Postgres template1 databases list or the mysql &#8217;show databases&#8217; command, and auto-generating a ReSTful CRUD interface for each. Access of each resources can be controlled via HTTP Auth methods. This is a great solution to providing, and restricting, legacy database access for new processes through a standard interface. </p>
<h3>Way 3: Live, ever-dynamic determination of URL and associated component: </h3>
<p>Some ReSTful URL models may need to be &#8216;run-time dynamic&#8217;, especially in the case where databases are dynamically created, and the associated resources per new database could vary. There is a simple example of a dynamic URL and resource model:</p>
<pre>
import cherrypy
import pprint

class ReSTPaths:
	@cherrypy.expose
	def __init__(self):
		pass

	@cherrypy.expose
	def client(self,*args,**kwargs):
		return "Your HTTP method was %s. Your args are: %s and your kwargs are: %s\n" \
		% (cherrypy.request.method, pprint.pformat(args), pprint.pformat(kwargs))

	@cherrypy.expose
	def address(self,*args,**kwargs):
		return "Your HTTP method was %s. Your args are: %s and your kwargs are: %s\n" \
		% (cherrypy.request.method, pprint.pformat(args), pprint.pformat(kwargs))

cherrypy.quickstart(ReSTPaths())
</pre>
<p>This allows for dynamic URLs such as:<br />
http://localhost:8080/client/address/34567<br />
http://localhost:8080/client/address?client_id=34567<br />
http://localhost:8080/address/client?client_id=34567<br />
http://localhost:8080/address/client/34567<br />
http://localhost:8080/address/anything/anything_else</p>
<p>The output from this code looks like this:</p>
<pre>
Your HTTP method was GET. Your args are: ('address', '34567') and your kwargs are: {}
Your HTTP method was GET. Your args are: ('address',) and your kwargs are: {'client_id': '34567'}
Your HTTP method was GET. Your args are: ('client',) and your kwargs are: {'client_id': '34567'}
Your HTTP method was GET. Your args are: ('client', '34567') and your kwargs are: {}
Your HTTP method was GET. Your args are: ('anything', 'anything_else') and your kwargs are: {}
</pre>
<p>Notice that we only have keyword args (kwargs) when we pass a named parameter, such as client_id=34567</p>
<p>Let&#8217;s try a POST request from curl, on the command line:</p>
<pre>
[gloriajw@g-monster ~]$ curl -d "something_else=whatever_i_want" http://localhost:8080/address/anything/anything_else
Your HTTP method was POST. Your args are: ('anything', 'anything_else') and your kwargs are: {'something_else': 'whatever_i_want'}
</pre>
<p>In this code, the sky is the limit. You can place whatever code you like in these methods, dynamically creating classes and resources as needed, letting them only persist until the result is returned. This may add some inefficiency, but in exchange offer more secure network resources.</p>
<p>Code is attached, Enjoy!</p>
<p>Gloria</p>
<p><a href="http://www.devchix.com/wp-content/uploads/2009/04/restfixedargs.py">http://www.devchix.com/wp-content/uploads/2009/04/restfixedargs.py</a></p>
<p><a href="http://www.devchix.com/wp-content/uploads/2009/04/restmeta.py">http://www.devchix.com/wp-content/uploads/2009/04/restmeta.py</a></p>
<p><a href="http://www.devchix.com/wp-content/uploads/2009/04/restvarargs.py">http://www.devchix.com/wp-content/uploads/2009/04/restvarargs.py</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Devchix?a=TsMw6o3Vf9E:0vC1Hltec5I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=TsMw6o3Vf9E:0vC1Hltec5I:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Devchix?i=TsMw6o3Vf9E:0vC1Hltec5I:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=TsMw6o3Vf9E:0vC1Hltec5I:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Devchix?i=TsMw6o3Vf9E:0vC1Hltec5I:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=TsMw6o3Vf9E:0vC1Hltec5I:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=TsMw6o3Vf9E:0vC1Hltec5I:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Devchix?i=TsMw6o3Vf9E:0vC1Hltec5I:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.devchix.com/2009/04/19/i-love-python-restful-db-crud-dispatching-using-cherrypy/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.devchix.com/2009/04/19/i-love-python-restful-db-crud-dispatching-using-cherrypy/</feedburner:origLink></item>
	</channel>
</rss>
