<?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>Sat, 04 Jul 2009 06:18:34 +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>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>
		<item>
		<title>PyCon 2009: Feel the Unity</title>
		<link>http://feedproxy.google.com/~r/Devchix/~3/m1X_dCUyPOc/</link>
		<comments>http://www.devchix.com/2009/03/28/pycon-2009-feel-the-unity/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 15:42:56 +0000</pubDate>
		<dc:creator>gloriajw</dc:creator>
		
		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://www.devchix.com/?p=227</guid>
		<description><![CDATA[This conference is great fun and incredibly informative. I&#8217;ve met just about everyone I&#8217;ve written to and for in this community, and that alone made my day.
Kudos to Catherine Devlin, who is quietly but heavily involved in the core Python community (are you on the PSF? Please brag, so we know what you&#8217;re doing). I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>This conference is great fun and incredibly informative. I&#8217;ve met just about everyone I&#8217;ve written to and for in this community, and that alone made my day.</p>
<p>Kudos to Catherine Devlin, who is quietly but heavily involved in the core Python community (are you on the PSF? Please brag, so we know what you&#8217;re doing). I&#8217;ve followed her Oracle/SqlAlchemy articles for a while, and saw her name on some organizers lists, and admired her tecchie effort from afar. It was awesome to actually meet her.</p>
<p>Many thanks to Desi and Hashrocket, for hosting the DevChix gathering tonight in Chicago. A Ruby project implementation company hosting a Python gathering, how cool is that? You can&#8217;t help but feel the DevChix unity.</p>
<p>Also, a personal thanks to Alex for essentially letting me live ather house for ten days, through late night work and code sprints, whistling tea pots at 2AM, and so forth. You rock.</p>
<p>Gloria</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Devchix?a=m1X_dCUyPOc:ark74t2jcD8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=m1X_dCUyPOc:ark74t2jcD8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Devchix?i=m1X_dCUyPOc:ark74t2jcD8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=m1X_dCUyPOc:ark74t2jcD8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Devchix?i=m1X_dCUyPOc:ark74t2jcD8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=m1X_dCUyPOc:ark74t2jcD8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=m1X_dCUyPOc:ark74t2jcD8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Devchix?i=m1X_dCUyPOc:ark74t2jcD8:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.devchix.com/2009/03/28/pycon-2009-feel-the-unity/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.devchix.com/2009/03/28/pycon-2009-feel-the-unity/</feedburner:origLink></item>
		<item>
		<title>Ada Lovelace Day - Finding Ada</title>
		<link>http://feedproxy.google.com/~r/Devchix/~3/oMJQ59gDbmg/</link>
		<comments>http://www.devchix.com/2009/03/24/ada-lovelace-day-finding-ada/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 15:38:48 +0000</pubDate>
		<dc:creator>desi</dc:creator>
		
		<category><![CDATA[Thoughts]]></category>

		<category><![CDATA[#ald09]]></category>

		<guid isPermaLink="false">http://www.devchix.com/?p=217</guid>
		<description><![CDATA[I made the pledge to post for Finding Ada and here it is.
One of the hardest things I had to do in preparation for this post (Ada Lovelace Day) was to decide who I wanted to post about. I am lucky enough to know so many intelligent, skilled, motivated and inspiring women in technology (and [...]]]></description>
			<content:encoded><![CDATA[<p>I made the pledge to post for <a href="http://findingada.com/blog/2009/01/05/ada-lovelace-day/">Finding Ada</a> and here it is.</p>
<p>One of the hardest things I had to do in preparation for this <a href="http://findingada.com/blog/2009/01/05/ada-lovelace-day/">post (Ada Lovelace Day)</a> was to decide who I wanted to post about. I am lucky enough to know so many intelligent, skilled, motivated and inspiring women in technology (and specifically software development) that it was extraordinarily difficult to narrow it down to just a handful. It bothers me that I can&#8217;t call out all the women who have had a positive impact on my life and career. To each and every one of you: know that I appreciate you and everything you have done for me. Finally, I would like to say a special thanks to all the ladies in <a href="http://www.devchix.com">DevChix</a> for their conversations, help, and encouragement to be the best at my job and in my life. As of today, DevChix has 167 members from all around the world. Our organization is comprised entirely of women devoted to software development. You are all my heros. </p>
<p>Okay, on to the few ladies I would like to call out specifically as role models for me:</p>
<p><a href="http://www.rubygeek.com/">Nola Stowe:</a>  Nola is a developer at Google and we have known each other for a few years now. She was one of the original cofounders of <a href="http://www.devchix.com">DevChix</a> and deserves the majority of credit for getting us off the ground because she did all the hard work to make it a reality. She has the ability to be involved in so much, both inside work and out, that she simply amazes me. Nola reads and writes reviews for tech books, learns new languages (or picks up old ones), and manages commitments with a myriad of organizations and activities, including <a href="http://www.devchix.com">DevChix</a>. She does all of this in addition to her full-time job. She is always caring and supportive of the ladies in our organization; always eager to help when someone has a question. Nola, thank you for all that you do.</p>
<p><a href="http://www.brighter.net/">Jacqui Maher:</a>  Jacqui is now a coworker of mine at <a href="http://www.hashrocket.com">Hashrocket</a> and I throughly enjoy working with her. She is by far one of the best developers I have ever met and is very respected within  <a href="http://www.hashrocket.com">Hashrocket</a>, <a href="http://www.devchix.com">DevChix</a> and the Ruby community. She is socially conscious and makes an effort to improve the world with every chance she gets. She is currently working on the <a href="http://openmrs.org/wiki/OpenMRS">OpenMRS</a> gem for Ruby and recently traveled to Africa to work as a Rails Developer for <a href="http://www.baobabhealth.org/tag/software">Baobab Health</a>. She is inspiring in just about every sense of the word.  Jacqui, thanks for teaching me that we can make time to use our skills for the greater good of the world. </p>
<p><a href="http://www.blogher.com/blog/liz-henry">Liz Henry:</a>  I just recently met Liz at the SFO <a href="http://shesgeeky.org/">She&#8217;s Geeky</a> Event and I have to say this woman is amazing. I know very little about her even though I have run into her at several events since then. Every encounter with her has been enjoyable and she has given me some wisdom each time I have seen her that I didn&#8217;t have before. In one of our last meetings, we actually discussed this post. We discussed how some women which we revere as heros would in fact rather not be publicly described as such. (For this reason, I am have asked permission from each of the ladies mentioned in this post before publishing this article.) In addition to being full of very useful information, Liz is also one of the best live bloggers I have ever seen. Liz is capable of capturing an entire session (through notes, tweets, etc.) while still maintaining full attention to the topic at hand; even participating in the actual conversation. She allows people to be present at events that for whatever reason they couldn&#8217;t be and for those of us who read her write ups I would just like to say; you rock that shit! Oh yeah and she works for <a href="http://www.blogher.com">BlogHer</a>, a community for women bloggers. (They have a great conference too!)</p>
<p><a href="http://www.carmelyne.com/">Carmelyne Thompson:</a>  Carm&#8230; Carm is one of the happiest designers/developers I know. She has a positive outlook on everything, all the time. She is always able to see the good in a situation, often times when no one else can. She is an incredible designer, but don&#8217;t take my word for it! Go <a href="http://www.carmelyne.com/work/">check Carmelyne&#8217;s work out for yourself</a>. Carmelyne can implement her designs as well. She has a great depth of knowledge across a wide range of topics within the software development world. Carmelyne is oftentimes one of the first people to respond to ladies on the list asking Ruby and Rails questions and is often one of the first to respond to new member requests making her one of the most active admins at DevChix. I am continually happy to see Carm greeting people to the our group. She is friendly and quick in getting them setup and running with the <a href="http://www.devchix.com">DevChix</a> organization. Carm, I look forward to working with you in the future!</p>
<p><a href="http://lifeofaudrey.com/">Audrey Eschright:</a> Audrey is highly involved with the OpenSource Community; doing everything she can to get more women involved with OpenSource initiatives. She is currently working on the <a href="http://opensourcebridge.org/">Open Source Bridge Conference</a> in Portland and she has been involved with several other events in the area, including: <a href="http://barcamp.org/BarCampPortland">BarCamp Portland</a>, <a href="http://www.igniteportland.com/">Ignite Portland</a>, and others. Audrey reminds me that it&#8217;s important to pick your passion and excel at it; that is exactly what she does. She is a very inspiring woman, encouraging others to get involved and speak at these events. Audrey, good job with the conference organizing and congrats on getting that off the ground!</p>
<p><a href="http://headrush.typepad.com/">Kathy Sierra:</a>  It would be impossible to write this post and omit Kathy. I don&#8217;t read many blogs on a day-to-day basis, mostly for lack of time; that is, except Kathy&#8217;s blog back when Kathy would post. Kathy was a role model for me and is partly responsible for the aggregated blog on <a href="http://www.devchix.com">DevChix</a>, representing the entire DevChix community. Unfortunately, she was on the receiving end of some nasty comments and threats causing her to discontinue her blog. </p>
<p>Many women don&#8217;t desire the attention they receive for putting their personal opinions out into the blogosphere. Kathy received more than just attention. But DevChix is a community, first and foremost; if you attack one of us then you are attacking all of us.</p>
<p>We still get some pretty nasty comments from time to time but we are fortunate that it hasn&#8217;t been too bad; certainly not to the degree that Kathy had. Kathy brought a unique viewpoint to software development and possessed a great voice for presenting it. The community certainly lost something special when she stopped blogging. Kathy, I understand your reason for leaving the blogsphere, I thank you for the time you gave us there, and I hope that one day you will return.  </p>
<p><a href="http://valerieaurora.org/">Val Anita Aurora (formerly Val Henson):</a> I have only had the opportunity to meet Val once (for a few hours) but in that brief span of time she helped me tremendously. She is a Linux Kernel developer and has been involved with the  <a href="http://www.linuxchix.org/">LinuxChix</a> organization for many years. </p>
<p>Val offered sound advice to me early on in the organization of <a href="http://www.devchix.com">DevChix</a>; advice that I cannot thank her enough for. She pointed me to a number of resources that would help me understand what I was getting into as well as things which would soon come my way. Additionally, she helped <a href="http://www.devchix.com">DevChix</a> by promoting us within <a href="http://www.linuxchix.org/">LinuxChix</a> and giving us some space on the LinuxChix IRC server. I continually look to the <a href="http://www.linuxchix.org/">LinuxChix</a> organization for guidance and can&#8217;t thank them enough for their support. Val, plain and simple, you are a personal hero to me and <a href="http://www.linuxchix.org/">LinuxChix</a> is an organizational hero to <a href="http://www.devchix.com">DevChix</a>.</p>
<p>NOTE: I was not able to get permission from Kathy Sierra but I am hoping since she is already in the public eye she doesn&#8217;t mind me calling her out as a role model. </p>
<p>Cheers and Thanks for reading my Ada Lovelace Day Post.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Devchix?a=oMJQ59gDbmg:PyTzg0Sttc8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=oMJQ59gDbmg:PyTzg0Sttc8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Devchix?i=oMJQ59gDbmg:PyTzg0Sttc8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=oMJQ59gDbmg:PyTzg0Sttc8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Devchix?i=oMJQ59gDbmg:PyTzg0Sttc8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=oMJQ59gDbmg:PyTzg0Sttc8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=oMJQ59gDbmg:PyTzg0Sttc8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Devchix?i=oMJQ59gDbmg:PyTzg0Sttc8:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.devchix.com/2009/03/24/ada-lovelace-day-finding-ada/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.devchix.com/2009/03/24/ada-lovelace-day-finding-ada/</feedburner:origLink></item>
		<item>
		<title>Love, Software, and Squeals of Delight</title>
		<link>http://feedproxy.google.com/~r/Devchix/~3/RYZteuL6X7g/</link>
		<comments>http://www.devchix.com/2009/03/23/love-software-and-squeals-of-delight/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 23:04:02 +0000</pubDate>
		<dc:creator>sarah g</dc:creator>
		
		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[Thoughts]]></category>

		<category><![CDATA[interaction design]]></category>

		<category><![CDATA[love and software]]></category>

		<category><![CDATA[skitch]]></category>

		<guid isPermaLink="false">http://www.devchix.com/?p=213</guid>
		<description><![CDATA[
Software does more than crunch your numbers or take your picture: it can make you angry or bring you joy.  And those are the things that we, as developers, have to tune in to if we want to make our products stand out.
Skitch is one of a handful of products I’ve used recently that [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://img.skitch.com/20090323-bwmgsbd6etcadnmp2kmn1s8gta.jpg" alt="Dock" width="400px"/></p>
<p>Software does more than crunch your numbers or take your picture: it can make you angry or bring you joy.  And those are the things that we, as developers, have to tune in to if we want to make our products stand out.</p>
<p><a href="http://www.skitch.com">Skitch</a> is one of a handful of products I’ve used recently that remind me what makes a product successful. Utility is important, of course, but the love and emotional connection it engenders in its users is where it&#8217;s going to live or die.  </p>
<p>Let&#8217;s start backwards, with the logo, since it&#8217;s the first thing you see.  Their logo says nothing about their product&#8217;s functionality. There&#8217;s no initial, no recognizable signifier (thanks for sparing us the paintbrush), or even an abstract swoop.  It&#8217;s, um, a <strong>heart</strong>. </p>
<p>And not just <strong>any</strong> heart, but a hot-pink, shimmering, pumping, overflowing, <strong>disco</strong> heart.  </p>
<p>They&#8217;re not saying, &#8220;You might like us&#8221;. Or even, &#8220;As you can see by the &#8216;<strong>S</strong>&#8216;, we&#8217;re Skitch&#8221;.  They&#8217;re saying, &#8220;This is LOVE, baby!&#8221;. <em>You and me!!!  </em> (How they&#8217;re managing to do that without coming across like <a href="http://en.wikipedia.org/wiki/Stanley_Roper">Mr. Roper</a>, though, is a mystery that is beyond the scope of this post.)</p>
<p>Now, this Love they offer, it&#8217;s not too intense. It&#8217;s not Valentines Day Red. It&#8217;s not a pushy &#8220;<em>when are you going to commit</em>&#8221; heart, a dreaded &#8220;<em>we have to talk</em>&#8221; heart,  or even an &#8220;<em>I&#8217;m complicated, but deep</em>&#8221; kind of heart. Just hey, <em>hearts</em>, baby, I&#8217;m an extrovert, let&#8217;s groove on the dance floor and take some snaps<em>!!!</em></p>
<p>I focus on this because right there in their identity they align themselves not with Software, but with Love and Play &#8212; a great gap to bridge.  If the product sucked, it would be one thing. But it doesn&#8217;t. It makes bold choices and executes them well.  They&#8217;re going for the whole tamale, not hiding behind industry-speak, and not afraid of a little heart and soul.  </p>
<p>So, they have a lot to live up to. Moving beyond the logo, what does Skitch do that works and how can we learn from that?  </p>
<p><strong>It&#8217;s makes it easy to get started. </strong><br />
I haven&#8217;t taken the time to figure out all the features &#8212; in fact, I was too ADD to even watch the whole 3 minute video.  But I didn&#8217;t need to. The critical 2 or 3 features are easy enough to get right away. Once someone commits, they&#8217;ll go deeper, but don&#8217;t make them wait, fiddle, or read a manual first. Make your learning curve the equivalent of 140 characters or less.</p>
<p><strong>It does the things you&#8217;d want it to do.</strong><br />
This may sound simple, but it&#8217;s worth repeating. I wanted to take screenshots, write on them in fun fonts with arrows, then upload them to the web. Bingo. No matter how fun an imagined feature is, the trick is matching it to the intuitive use of your product. If people wouldn&#8217;t naturally want to do that thing, drop it. It doesn&#8217;t matter how slick it is. </p>
<p><strong>It cuts out the middle steps.</strong><br />
In Skitch, you don&#8217;t have to select layers, like in Photoshop, to move items that are separate, such as text and arrows.  You don&#8217;t have to explicitly save the picture on your desktop and then FTP it to the web &#8212; the app does it for you in one click.   The designers have figured out your starting and ending points, then cut out all the excess steps in between.  Spend time here, trimming the middle.</p>
<p><strong>It makes it fun. </strong><br />
It understands that an application is not just about utility: you&#8217;re not just tediously trying to upload a picture to a website or share it with a friend &#8212; you&#8217;re having a moment in your life. Make that moment simple, and when you achieve that, make it fun. </p>
<p><strong>It makes common actions unexpectedly pleasurable to use.</strong><br />
There are tons of patterns we use all the time when interacting with web and desktop applications. For instance, copy and paste. Copy and paste is great and I love doing it, but the folks at Skitch saved me a couple keystrokes by giving me a fun copy button on the image detail page. It wasn&#8217;t necessary per se, but it genuinely improved my user experience.  So, don&#8217;t  try to think about new things you could add: find out what the most integral interactions with your product are. Improve those.   </p>
<p><strong>Squeals of Delight</strong><br />
That&#8217;s what I did when I first used that copy button.  That&#8217;s what I did when I clicked &#8220;webpost&#8221;, heard a whoosh, and saw that my screenshot was now on my very own Skitch web page.  Go for the squeals: it means, this feels JUST RIGHT.  If someone is squealing with delight (for Love or Software!) they are going to come back. </p>
<p>It&#8217;s not all paradise and apples of course.</p>
<p>There are confusing and frustrating interactions, just like in any product.  These stand out more, ironically, because they raised the bar so high.  So Skitchers, as you move forward, solve these problems for me :)</p>
<p>1. How do I get back to my home skitch page from a specific image page? You don&#8217;t really mean for me to click on the back button or delete the rest of the URL in the address bar after furrowing my brow looking for the obvious home link, do you?</p>
<p>2. Uploading. From my Skitch app window, I can&#8217;t click &#8220;webpost&#8221; right away because it first shows me &#8220;share&#8221;. Only after clicking on the &#8220;share&#8221;  is &#8220;webpost&#8221; exposed.  Since clicking &#8220;share&#8221; triggers a  browser window populated with the Share link that steals focus,  I have to tab back to Skitch to webpost.  Annoying. </p>
<p>Overall, It was great to look at Skitch because it&#8217;s so well done. I think it&#8217;s worth taking a product apart to see why it works and how we can use those lessons in our own applications.  </p>
<p>And finally, Full Disclosure: I have nothing to do with Skitch.  </p>
<p>I just <strong>heart</strong> them. </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Devchix?a=RYZteuL6X7g:Ww5znFf1FFo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=RYZteuL6X7g:Ww5znFf1FFo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Devchix?i=RYZteuL6X7g:Ww5znFf1FFo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=RYZteuL6X7g:Ww5znFf1FFo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Devchix?i=RYZteuL6X7g:Ww5znFf1FFo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=RYZteuL6X7g:Ww5znFf1FFo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=RYZteuL6X7g:Ww5znFf1FFo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Devchix?i=RYZteuL6X7g:Ww5znFf1FFo:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.devchix.com/2009/03/23/love-software-and-squeals-of-delight/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.devchix.com/2009/03/23/love-software-and-squeals-of-delight/</feedburner:origLink></item>
		<item>
		<title>I Love Python: Twitter Feed/Content Auth and Scrape in One HTTP Request</title>
		<link>http://feedproxy.google.com/~r/Devchix/~3/r_MTh41WXm8/</link>
		<comments>http://www.devchix.com/2009/02/21/i-love-python-twitter-feedcontent-auth-and-scrape-in-one-http-request/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 18:03:04 +0000</pubDate>
		<dc:creator>gloriajw</dc:creator>
		
		<category><![CDATA[Python]]></category>

		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://www.devchix.com/?p=202</guid>
		<description><![CDATA[This is some lingering code from a GrrlCamp project, written by Gaba. It is such a handy, great little nugget of code.  It logs into a Twitter account and scrapes either the content or the RSS feed (your choice), in one fell swoop, using Base64 encoding of the login and password in the HTTP [...]]]></description>
			<content:encoded><![CDATA[<p>This is some lingering code from a GrrlCamp project, written by Gaba. It is such a handy, great little nugget of code.  It logs into a Twitter account and scrapes either the content or the RSS feed (your choice), in one fell swoop, using Base64 encoding of the login and password in the HTTP request header. Very clever:</p>
<pre>
import urllib2, base64
import sys
import feedparser
#import configuration

class Page:

    def __init__(self):
        self.data = {}
        self.data["url"] = 'http://www.twitter.com/gloriajw'
        self.data["username"] = 'gloriajw'
        self.data["password"] = 'XXXXXXXXXX'

        self.data["urlrss"] = 'http://twitter.com/statuses/user_timeline/18107956.rss'

    def __getitem__(self, key):
        return self.data[key]

    def __setitem__(self,key, value):
        self.data[key] = value

    def getContent(self):
        base64string = base64.encodestring('%s:%s' % (self.data['username'], self.data['password']))[:-1]
        authheader =  "Basic %s" % base64string

        req = urllib2.Request(self.data["url"])
        req.add_header("Authorization", authheader)
        try:
            handle = urllib2.urlopen(req)
        except IOError, e:                  # here we shouldn't fail if the username/password is right
            print "It looks like the username or password is wrong."
            sys.exit(1)

        return handle.read()

    def getRSS(self):
        base64string = base64.encodestring('%s:%s' % (self.data['username'], self.data['password']))[:-1]
        authheader =  "Basic %s" % base64string

        req = urllib2.Request(self.data["urlrss"])
        req.add_header("Authorization", authheader)
        try:
            handle = urllib2.urlopen(req)
        except IOError, e:                  # here we shouldn't fail if the username/password is right
            print "It looks like the username or password is wrong."
            sys.exit(1)

        return handle.read()

    def getData(self):
        """auth = urllib2.HTTPBasicAuthHandler()
        auth.add_password('BasicTest', 'twitter.com', self.data['username'], self.data['password'])

        return feedparser.parse('http://www.twitter.com/statuses/user_timeline/18107956.rss', handlers=[auth])
        """

        return feedparser.parse('http://%s:%s@twitter.com/statuses/user_timeline/18107956.rss' % (self.data['username'], self.data['password']))
</pre>
<p>To invoke it:</p>
<pre>
class Data:
    def __init__(self, entries):
        self.entries = entries

    def save(self):
        pass

    def parse(self):
        pass

    def imprimir(self):
        for item in self.entries:
            print item.title
</pre>
<p>And this:</p>
<pre>
def main():
    page = Page()    

    statuses = page.getData().entries

    data = Data(statuses)
    data.save()

    data.imprimir()    

if __name__ == "__main__":
    main()
</pre>
<p>This code will also be attached, in case of copy/paste mangling.</p>
<p>In both getContent() and getData(), Gaba constructs the HTTP response header so that the encoded username and password are passed in the Authorization section of the header. This is easier and more secure than making two requests, and maintaining session cookies. Very nice indeed. This can be used to sign into any web site which accepts HTTP Basic authentication headers (there are different types of HTTP authentication (BASIC, DIGEST, FORM, and CLIENT-CERT).</p>
<p>It is left as an exercise for you to get the content (not the feed) and use BeautifulSoup to extract the data portions. If you want to try this, and need help, post questions here. </p>
<p>Enjoy,<br />
Gloria</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Devchix?a=r_MTh41WXm8:2umZttXXltE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=r_MTh41WXm8:2umZttXXltE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Devchix?i=r_MTh41WXm8:2umZttXXltE:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=r_MTh41WXm8:2umZttXXltE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Devchix?i=r_MTh41WXm8:2umZttXXltE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=r_MTh41WXm8:2umZttXXltE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Devchix?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Devchix?a=r_MTh41WXm8:2umZttXXltE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Devchix?i=r_MTh41WXm8:2umZttXXltE:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.devchix.com/2009/02/21/i-love-python-twitter-feedcontent-auth-and-scrape-in-one-http-request/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.devchix.com/2009/02/21/i-love-python-twitter-feedcontent-auth-and-scrape-in-one-http-request/</feedburner:origLink></item>
	</channel>
</rss>
