<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-69451</id><updated>2018-05-27T20:37:15.699-05:00</updated><category term="agile"/><category term="conference"/><category term="arduino"/><category term="code"/><category term="scrum"/><category term="tools"/><category term="altnetconf"/><category term="climbing"/><category term="electronics"/><category term="collaboration"/><category term="open-source software"/><category term="presentation"/><category term="refactoring"/><category term="unit testing"/><category term="C"/><category term="DDD"/><category term="agileaustinopenspace"/><category term="cooking"/><category term="designpatterns"/><category term="hacks"/><category term="kaizenconf"/><category term="language"/><category term="CodeMash"/><category term="JavaScript"/><category term="Resharper"/><category term="TDD"/><category term="ThatConference"/><category term="Visual Studio"/><category term="art"/><category term="astronomy"/><category term="book review"/><category term="books"/><category term="halloween"/><category term="painting"/><category term="rhino mocks"/><category term="shortcut"/><category term="watercolor"/><title type='text'>Girl Writes Code</title><subtitle type='html'>Sharon Cichelli: Developer. Analyst. Instigator.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1606</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-69451.post-7558160949790273806</id><published>2016-01-27T14:58:00.000-06:00</published><updated>2016-01-27T14:58:52.535-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="art"/><category scheme="http://www.blogger.com/atom/ns#" term="painting"/><category scheme="http://www.blogger.com/atom/ns#" term="watercolor"/><title type='text'>Happy Little Trees</title><content type='html'>I wanted to give my parents a drawing for Christmas, and while I pondered what subject to use, Mom happened to send an email with a request. She had a photo of the woods on their property, beautiful with Pennsylvania fall colors, and would I consider making a painting that looks like a Japanese print. I decided not to learn woodblock printing that week, but watercolor would probably fit the bill. Of course, that meant I needed to learn watercolor, but at least that didn&#39;t require sharp tools.&lt;br /&gt;&lt;br /&gt;These photos span December 6 to January 20. Watercolor painting involves a lot of watercolor waiting to dry.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-fm9YN1cPnFY/VqkM2js6SwI/AAAAAAAAAVE/eQX3NGZB6QU/s1600/IMG_2113.JPG&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-fm9YN1cPnFY/VqkM2js6SwI/AAAAAAAAAVE/eQX3NGZB6QU/s320/IMG_2113.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is my workspace. I taped a big piece of watercolor paper to my craft table, taped down to minimize the amount of warping as I applied paint. (I could have pre-wetted and stretched the paper, but I didn&#39;t really have the setup to do that well.) &lt;br /&gt;&lt;br /&gt;You can see my tablet computer with the photo for reference, off to my right. I&#39;ve laid in the sky visible above the hill, and the shorn corn field at the base of the hill. To capture the mottled look of the field, I scattered table salt on the wet paint, making the paint pull away from the salt.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-cNZAtNCE7ZU/VqkM2SDI_KI/AAAAAAAAAVI/Qsr4NsuH2Y8/s1600/IMG_2119.JPG&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-cNZAtNCE7ZU/VqkM2SDI_KI/AAAAAAAAAVI/Qsr4NsuH2Y8/s320/IMG_2119.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The yellow leaves that blanket the hillside and the green underbrush, plus the farthest-away layer of foliage. I worked back to front, imagining the scene sliced into layers and starting from the back. I also had to let each layer dry.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-LrpBkHEqAOg/VqkM2YZXqgI/AAAAAAAAAVU/VqVgVwvnVXk/s1600/IMG_2136.JPG&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-LrpBkHEqAOg/VqkM2YZXqgI/AAAAAAAAAVU/VqVgVwvnVXk/s320/IMG_2136.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The farthest-away trees, due to atmospheric perspective, are less saturated in color. I used a very dilute ink wash of sepia ink for the faintest trunks, then added a little more ink to that wash for the darker ones.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-FZ79SfjyIh8/VqkM3XvrvUI/AAAAAAAAAVY/q7-KRrtgVEI/s1600/IMG_2138.JPG&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-FZ79SfjyIh8/VqkM3XvrvUI/AAAAAAAAAVY/q7-KRrtgVEI/s320/IMG_2138.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The next layer of trees. Ink doesn&#39;t flow like paint, so I couldn&#39;t use the ink for the big trunks. I even struggled with it on the smaller trees from the previous layer. It got a little dicey, so I knew I&#39;d need paint for these big, close trees. Creating brown is stressful when your color vision is hampered by &lt;a href=&quot;http://www.testingcolorvision.com/tcv-anomalous-trichromacy.php&quot;&gt;tritanomaly&lt;/a&gt;; there&#39;s always a risk I&#39;m making purple. This is why I work in charcoal.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-BSJRhb-AooM/VqkM4FJ0YsI/AAAAAAAAAVk/MFLmrR0DQGs/s1600/IMG_2144.JPG&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-BSJRhb-AooM/VqkM4FJ0YsI/AAAAAAAAAVk/MFLmrR0DQGs/s320/IMG_2144.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The closest trunks need to be dark and opaque, so I used a &quot;burnt umber&quot; watercolor pencil to color them in. Watercolor pencils are labeled, so I could be confident that one was brown. Working from left to right, I&#39;ve done about half of the trunks here. Also in the middle, I tried a small experiment with very saturated paint to see if I could add leaves on top of the trunks that would really pop.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-iu6gkHDiBrs/VqkM4qtI4-I/AAAAAAAAAVs/z8OqFutMabY/s1600/IMG_2147.JPG&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-iu6gkHDiBrs/VqkM4qtI4-I/AAAAAAAAAVs/z8OqFutMabY/s320/IMG_2147.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I finished coloring in the trunks, and then activated the watercolor pencil by painting over it with water. It reminds me of those paint-with-water books I had as a kid.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-RSiahrCB34M/VqkM4_fZPoI/AAAAAAAAAV0/4SKAJyaUefs/s1600/IMG_2273.JPG&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-RSiahrCB34M/VqkM4_fZPoI/AAAAAAAAAV0/4SKAJyaUefs/s320/IMG_2273.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cast shadows give you information about the object casting the shadow (tree trunks) and the object onto which the shadow is cast (the undulating hillside). With the shadows, it&#39;s starting to finally &lt;em&gt;look&lt;/em&gt; like something.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-iAcDqTBRb_Q/VqkM5q_GaLI/AAAAAAAAAWE/vNXfrDuCDKk/s1600/IMG_2276.JPG&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-iAcDqTBRb_Q/VqkM5q_GaLI/AAAAAAAAAWE/vNXfrDuCDKk/s320/IMG_2276.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Leaves.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-jgGYD21bfF0/VqkM6PvCr9I/AAAAAAAAAWQ/eypJGti_pyQ/s1600/IMG_2277.JPG&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-jgGYD21bfF0/VqkM6PvCr9I/AAAAAAAAAWQ/eypJGti_pyQ/s320/IMG_2277.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Signed.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-U8TpxmM2R1o/VqkM6w7HJiI/AAAAAAAAAWg/CxuS4bTjKPQ/s1600/IMG_2284.JPG&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-U8TpxmM2R1o/VqkM6w7HJiI/AAAAAAAAAWg/CxuS4bTjKPQ/s320/IMG_2284.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Liberated.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-ADlJfD-2le8/VqkM7YdsEOI/AAAAAAAAAWk/DvRcgjXSRQk/s1600/IMG_2285.JPG&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-ADlJfD-2le8/VqkM7YdsEOI/AAAAAAAAAWk/DvRcgjXSRQk/s320/IMG_2285.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Framed.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-Htg6yJ7T584/VqkM7vlapjI/AAAAAAAAAWo/-9T3eIvHeNk/s1600/IMG_2286.JPG&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-Htg6yJ7T584/VqkM7vlapjI/AAAAAAAAAWo/-9T3eIvHeNk/s320/IMG_2286.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Shipped.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-L6yjnmkPn3k/VqkM6oUWX7I/AAAAAAAAAWU/F0eJWETTNF4/s1600/IMG_2283.JPG&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-L6yjnmkPn3k/VqkM6oUWX7I/AAAAAAAAAWU/F0eJWETTNF4/s320/IMG_2283.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Done.&lt;br /&gt;&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7558160949790273806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7558160949790273806'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2016/01/happy-little-trees.html' title='Happy Little Trees'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-fm9YN1cPnFY/VqkM2js6SwI/AAAAAAAAAVE/eQX3NGZB6QU/s72-c/IMG_2113.JPG" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-69451.post-7277746761020753565</id><published>2014-08-09T18:11:00.000-05:00</published><updated>2014-08-12T07:07:49.778-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="electronics"/><category scheme="http://www.blogger.com/atom/ns#" term="presentation"/><title type='text'>Hello, That Conference Scientists!</title><content type='html'>Did you join us for &lt;a href=&quot;https://www.thatconference.com/sessions/session/4439&quot;&gt;Circuits in Play Dough&lt;/a&gt;? I&#39;m glad you&#39;re here!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Keep in touch:&lt;/strong&gt; Let&#39;s use #thatCircuits to tie our posts together.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Post your pictures:&lt;/strong&gt; Please share your pictures from the workshop! You can use the #thatCircuits hashtag on your photo-sharing service. Add a comment here with the link to your photo set.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Review what we did:&lt;/strong&gt; Here are the &lt;a href=&quot;http://www.slideshare.net/girlwritescode/circuits-inplaydough&quot;&gt;Circuits in Play Dough hand-outs&lt;/a&gt; that we used. This whole endeavor was inspired by &lt;a href=&quot;https://www.ted.com/talks/annmarie_thomas_squishy_circuits&quot;&gt;AnnMarie Thomas&#39;s TED talk, &quot;Hands-on science with squishy circuits,&quot;&lt;/a&gt; and the &lt;a href=&quot;http://courseweb.stthomas.edu/apthomas/SquishyCircuits/&quot;&gt;Squishy Circuits&lt;/a&gt; project at St. Thomas University.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Keep learning:&lt;/strong&gt; If you want to understand why electronics work, chemistry is the science you want to explore. I learned so much from &lt;a href=&quot;http://www.amazon.com/The-Joy-Chemistry-Amazing-Familiar/dp/1591027713&quot;&gt;The Joy of Chemistry: The Amazing Science of Familiar Things&lt;/a&gt;. Ask your grown-up lab assistant to help you try out the experiments in this book.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Do more:&lt;/strong&gt; If you learned about &lt;a href=&quot;https://www.thatconference.com/sessions/session/165&quot;&gt;Scratch from Katelyn&lt;/a&gt;, you can apply programming to your electronics projects with the &lt;a href=&quot;http://www.hummingbirdkit.com/&quot;&gt;Hummingbird&lt;/a&gt; and &lt;a href=&quot;http://thomaspreece.com/resources.php&quot;&gt;Arduino&lt;/a&gt; microcontrollers. Make robots!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Give thanks:&lt;/strong&gt; Thanks to Amy and Lance Larsen for bringing the bowls and spoons I needed to mix up a bunch of play dough in a hotel room. Thanks to my mom for making fond memories of sculpting play dough while it was still warm, and for showing me that girls are good at programming. Thanks to the TSA for not balking at a bag containing LEDs, wire cutters, and 80 9-volt batteries.</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/7277746761020753565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=7277746761020753565' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7277746761020753565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7277746761020753565'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2014/08/hello-that-conference-scientists.html' title='Hello, That Conference Scientists!'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-7995743745821580500</id><published>2014-01-18T15:33:00.000-06:00</published><updated>2014-01-19T21:06:52.707-06:00</updated><title type='text'>A Life Less Encumbered</title><content type='html'>My latest performance art project is &quot;Discard Three Things.&quot; (You may have appreciated my previous pieces, &quot;Girl Makes Robot (with skitchy arms)&quot; and &quot;A Dop Ting Kittens.&quot;) Okay actually, it&#39;s a game I&#39;m playing with myself, and you&#39;re welcome to join in.&lt;br /&gt;&lt;br /&gt;On January 2nd I thought idly, &quot;I wonder if I can get rid of three things each day. When would that start to feel like progress?&quot; The answer was &quot;pretty much immediately.&quot;&lt;br /&gt;&lt;br /&gt;Here are the rules I set for myself:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Every day&amp;mdash;&lt;em&gt;every day&lt;/em&gt;&amp;mdash;choose three things and discard, donate, recycle, or give them away.&lt;/li&gt;&lt;li&gt;Not consumable stuff like &quot;the box my tv dinner came in,&quot; but stuff that has been Sitting Around Forever to the point where it has become scenery.&lt;/li&gt;&lt;li&gt;Merely earmarking something for donation does not count. &quot;Stuff to Donate&quot; has been its own kind of clutter.&lt;/li&gt;&lt;li&gt;I tweet about it, somewhat poetically, using the hashtag &lt;a href=&quot;https://twitter.com/search?q=%23d3t&quot; title=&quot;tweets tagged with d3t&quot;&gt;#d3t&lt;/a&gt;. This makes it a game, and it also makes me do it every day. I&#39;d be letting people down (even if no real people would notice, that imagined commitment keeps me honest).&lt;/li&gt;&lt;li&gt;Adjust the rules to suit your life and keep you motivated.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Amusingly, people are joining in! Friends on Twitter became intrigued and decided it would work for them, too. My Tweetdeck now has a #d3t column, and I&#39;m getting a kick out the sense of liberation their tweets convey. Do you want to try it, too?&lt;br /&gt;&lt;br /&gt;This is working for me because three things is nothing. It takes five minutes. It&#39;s not scary, in the way that &quot;I&#39;ll clean out the garage today&quot; is scary. Kinda fun. The unexpected thing is that it builds a good bit of momentum. I&#39;m usually pitching more than three&amp;mdash;but I don&#39;t &lt;em&gt;have&lt;/em&gt; to. I&#39;m just allowed to. Once I&#39;ve cleaned some stuff out of the way, it&#39;s then satisfying to carry on and neaten up the remaining stuff. Getting rid of clutter &lt;em&gt;makes room&lt;/em&gt; for being neat.&lt;br /&gt;&lt;br /&gt;It is not lost on me that &quot;too much stuff&quot; is the epitome of a First World Problem. But hoarding it doesn&#39;t help anybody, either. What I&#39;d really like is to build a habit of acquiring less.&lt;br /&gt;&lt;br /&gt;Folks have asked me when I&#39;ll stop. I haven&#39;t defined an end condition for myself. I could imagine people choosing something like &quot;for 30 days,&quot; &quot;when the kid&#39;s room is packed,&quot; &quot;when there&#39;s room for a pinball table.&quot; I expect there will come a point where it cuts too dear, where I have a purpose or a love for each thing in my home. (Or, given prior habits, I will have acquired &lt;em&gt;more&lt;/em&gt; crap to discard, and it will never really end.) If I ever do feel finished, there&#39;s plenty of drywall to patch and remodeling to do. Keep an eye out for my next art piece, &quot;Watch Me Fix This Thing.&quot;</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/7995743745821580500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=7995743745821580500' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7995743745821580500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7995743745821580500'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2014/01/a-life-less-encumbered.html' title='A Life Less Encumbered'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-1589286142114498956</id><published>2013-10-06T07:57:00.000-05:00</published><updated>2013-10-06T07:59:22.981-05:00</updated><title type='text'>This is a podcast from SignalLeaf</title><content type='html'>&lt;iframe src=&quot;http://www.signalleaf.com/embed/5250c70eec23950200000005/5250e3e14dfe8c0200000004/&quot; width=&quot;450&quot; height=&quot;55&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/1589286142114498956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/1589286142114498956'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2013/10/this-is-podcast-from-signalleaf_6.html' title='This is a podcast from SignalLeaf'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-3939113508930532551</id><published>2013-08-13T22:26:00.001-05:00</published><updated>2013-08-13T22:26:15.548-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="conference"/><category scheme="http://www.blogger.com/atom/ns#" term="electronics"/><category scheme="http://www.blogger.com/atom/ns#" term="ThatConference"/><title type='text'>You don&#39;t have to be an expert to be a teacher</title><content type='html'>Just in time for &lt;a href=&quot;http://www.thatconference.com/sessions/session_614&quot;&gt;my session at That Conference&lt;/a&gt;, benefit from my recent discovery: &lt;a href=&quot;http://lostechies.com/sharoncichelli/2013/08/13/pin-13-considered-harmful/&quot;&gt;Pin 13 Considered Harmful&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I&#39;ve heard folks tell me they&#39;re not ready to present at conferences, because they&#39;re not &lt;em&gt;experts&lt;/em&gt; yet. I look at it the opposite way: I barely know electronics, yet I built a robot. I built a robot, and you can, too! Take inspiration by what I&#39;ve achieved &lt;em&gt;despite&lt;/em&gt; my lack of expertise.&lt;br /&gt;&lt;br /&gt;You don&#39;t have to be an expert to inspire passion. You don&#39;t have to be an expert to teach. You just have to care.&lt;br /&gt;&lt;br /&gt;And you can fix things with a follow-up blog post. Eheh.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/3939113508930532551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/3939113508930532551'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2013/08/you-dont-have-to-be-expert-to-be-teacher.html' title='You don&#39;t have to be an expert to be a teacher'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-3390223711881684010</id><published>2013-03-19T14:11:00.001-05:00</published><updated>2013-03-19T14:11:31.188-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="halloween"/><title type='text'>Arduino-Powered Clank</title><content type='html'>I&#39;ve often said, incorporating an Arduino microcontroller into your costume can open up all new kinds of fun. For Halloween, I dressed as &lt;a href=&quot;http://www.girlgeniusonline.com/&quot;&gt;Agatha Clay, Girl Genius&lt;/a&gt; (seemed fitting). I just created a better video of my little clank:&lt;br /&gt;&lt;br /&gt;&lt;iframe width=&quot;420&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/Q3MQzUx9DPI&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/spyderella/sets/72157631897031070/&quot;&gt;Photos of the construction&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/scichelli/Arduino-Sketches/blob/master/GirlGeniusClank/GirlGeniusClank.ino&quot;&gt;Source code that drives it&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/3390223711881684010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=3390223711881684010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/3390223711881684010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/3390223711881684010'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2013/03/arduino-powered-clank.html' title='Arduino-Powered Clank'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/Q3MQzUx9DPI/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-7251702612206904925</id><published>2013-02-04T21:51:00.001-06:00</published><updated>2013-02-04T21:51:54.357-06:00</updated><title type='text'>Finding Faith in a Fish Sandwich</title><content type='html'>I just met C. J., the Silver Fox. He &quot;flies a sign&quot; under the Burnet/183 bridge.&lt;br /&gt;&lt;br /&gt;I was waiting for an inspection sticker at Sticker Stop, sitting outside because it was too nice to be confined in a gray box with other sullen mammals. He walked up, and my otherness detector pinged. Well, for one thing, he was at the Sticker Stop without a car.&lt;br /&gt;&lt;br /&gt;I blew a bug off the page of my book. He mimicked the gesture. &quot;There was a bug,&quot; I shrugged. &quot;At least you didn&#39;t kill the damn bug,&quot; he replied, and I had to agree. He set an unlit cigarette and a large beverage can on the picnic table and went inside. I considered my options: Go inside for the safety of crowds, or sit pat.&lt;br /&gt;&lt;br /&gt;When he returned, he sat on the table and asked if he could tell me a joke. I could use a little mirth these days, so I said yes. It was a good joke, and he told it well. I laughed. &quot;It was a pretty good joke, right?&quot; he asked. &quot;No swear words or nothing.&quot; I told him it was, and then we were talking.&lt;br /&gt;&lt;br /&gt;He holds a cardboard sign that says &quot;Wife and dog kidnapped by ninjas. Saving up for karate lessons. I really want the dog back!&quot; That one, he says, works better on women than on men. He told me, &quot;If there are two girls in the front seat, they see that sign and laugh, I&#39;m getting paid.&quot; His other sign says &quot;You may live in a $200,000 house. I live under a $2M bridge. Need money for repairs&amp;mdash;the roof leaks.&quot;&lt;br /&gt;&lt;br /&gt;He asked me if I knew God, and some questions are easier to just say yes to. God looks out for him, he said. God provides. C. J. is an alcoholic (He just said it, so matter-of-factly.), yet God helps him cross that street so many times a day, and sees him safely through the night when he&#39;s too drunk to remember how he ended up there. Then he asked me if he could tell me something, and here I expected the hard sell. But no, he just told me his story. &lt;br /&gt;&lt;br /&gt;Twelve years ago, his wife was killed by a drunk driver. &quot;That&#39;s what landed me under that bridge.&quot; After that, he became really angry at God. Then, about five years ago, he had a transformative experience. A minister, after serving a dinner that fed 300 homeless people, brought a bag of food to C. J. and said, &quot;This is for you. This is from God, for you.&quot; C. J. didn&#39;t want it, didn&#39;t want &lt;em&gt;anything&lt;/em&gt; from God, he was angry with God. &lt;br /&gt;&lt;br /&gt;Two hours elapsed before he grew hungry enough to look in the bag. It contained a fish sandwich, topped with a double serving of tartar sauce, plus an orange soda. It contained just what his childhood self would have called his favorite meal. How could that minister have known? He couldn&#39;t. This was God. C. J. told me, &quot;This was God saying, &#39;I still care about you. Even though you&#39;re mad at me, I am not mad at you.&#39;&quot;&lt;br /&gt;&lt;br /&gt;He said a friend chided him, &quot;You found God in a Happy Meal?&quot; We laughed together, me and C. J., and I thought maybe God could look out for me a little, too.&lt;br /&gt;&lt;br /&gt;Then he stood up, picked up his can and the cigarette which he&#39;d never lit, and shook my hand. I thanked him for talking with me, and he thanked me for being willing to listen, since most people aren&#39;t.</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/7251702612206904925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=7251702612206904925' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7251702612206904925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7251702612206904925'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2013/02/finding-faith-in-fish-sandwich.html' title='Finding Faith in a Fish Sandwich'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-4925005669670027824</id><published>2013-01-10T06:50:00.003-06:00</published><updated>2013-01-10T06:50:37.188-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="CodeMash"/><category scheme="http://www.blogger.com/atom/ns#" term="conference"/><title type='text'>Hello, Arduino. Let&#39;s get started.</title><content type='html'>Hi, &lt;a href=&quot;http://www.codemash.org/&quot;&gt;CodeMash&lt;/a&gt;! Here are resources to get you started with the Arduino microcontroller, a prototyping platform to build crafty electronics projects (electronicky craft projects?).&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/spyderella/8147810578/&quot; title=&quot;My clank&quot;&gt;&lt;img src=&quot;http://farm9.staticflickr.com/8048/8147810578_65183e9941.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;My clank&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You need the &lt;a href=&quot;http://arduino.cc/en/Main/Software&quot;&gt;Arduino IDE&lt;/a&gt;, the editor in which you&#39;ll write your sketches.&lt;br /&gt;&lt;br /&gt;You need the microcontroller board. There are &lt;a href=&quot;http://arduino.cc/en/Main/Products&quot;&gt;many form factors to choose from&lt;/a&gt;. I have an Arduino Uno, and that&#39;s a great default choice. You might want one with additional capabilities, such as Ethernet or the extra processing power of the Mega, or you might enjoy the LilyPad, designed for being incorporated into costumes and wearables. &lt;br /&gt;&lt;br /&gt;Note that a &quot;shield&quot; is a thing that &lt;em&gt;plugs into&lt;/em&gt; an Arduino, so it doesn&#39;t have any brains on its own. Feel free to pick up some shields, they&#39;re a hoot, but be aware that you still also need an Arduino board.&lt;br /&gt;&lt;br /&gt;Sources to buy from: &lt;a href=&quot;http://www.adafruit.com/&quot;&gt;AdaFruit Industries&lt;/a&gt;, &lt;a href=&quot;https://www.sparkfun.com/&quot;&gt;Sparkfun Electronics&lt;/a&gt;, &lt;a href=&quot;http://www.makershed.com/&quot;&gt;Maker Shed&lt;/a&gt;, &lt;a href=&quot;http://www.radioshack.com&quot;&gt;RadioShack&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;a href=&quot;http://www.slideshare.net/girlwritescode/hello-arduino-codemash&quot;&gt;slides from my talk&lt;/a&gt; are on SlideShare, and the &lt;a href=&quot;https://github.com/scichelli/Arduino-Sketches/blob/master/GirlGeniusClank/GirlGeniusClank.ino&quot;&gt;sketch for the robot&lt;/a&gt; is on GitHub (along with a number of other sketches).&lt;br /&gt;&lt;br /&gt;Pictures of &lt;a href=&quot;http://www.flickr.com/photos/spyderella/sets/72157631897031070/&quot;&gt;building the robot&lt;/a&gt;, &lt;a href=&quot;http://www.flickr.com/photos/spyderella/sets/72157627380791482/&quot;&gt;the video game&lt;/a&gt;, &lt;a href=&quot;http://www.flickr.com/photos/spyderella/sets/72157622382205116/&quot;&gt;my ambient clock&lt;/a&gt;, and &lt;a href=&quot;http://www.flickr.com/photos/spyderella/sets/72157622735987434/&quot;&gt;the thing under your bed&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;What are you going to make? Leave a comment here or send me a note on Twitter (@scichelli). I can&#39;t wait to hear about it!</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/4925005669670027824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=4925005669670027824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/4925005669670027824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/4925005669670027824'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2013/01/hello-arduino-lets-get-started.html' title='Hello, Arduino. Let&#39;s get started.'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-8553409419100006353</id><published>2012-11-11T08:21:00.000-06:00</published><updated>2012-11-11T08:22:48.958-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="open-source software"/><category scheme="http://www.blogger.com/atom/ns#" term="presentation"/><title type='text'>Showdown at Unobtanium—for SCIENCE!</title><content type='html'>Hello, my fellow mad scientists. If you attended my talk at&amp;nbsp;&lt;a href=&quot;http://showdownatunobtainium.com/&quot;&gt;Showdown at Unobtanium&lt;/a&gt;, thank you for being part of a fantastic audience—the enthusiasm you fed back to me was infectious and inspiring. Make things and tell me about it!&lt;br /&gt;&lt;br /&gt;Please join us at&amp;nbsp;&lt;a href=&quot;http://www.polyglotprogrammers.org/&quot;&gt;Polyglot Programmers of Austin&lt;/a&gt;, &amp;nbsp;our co-working study group for learning a new programming language (including your first). Breadboards are as welcome as keyboards. Also, I&#39;ll be there, happy to answer your Arduino questions.&lt;br /&gt;&lt;br /&gt;Some details about my small robot friend, to amuse you. My costume was an homage to Agatha Clay (and her clank) of the&amp;nbsp;&lt;a href=&quot;http://www.girlgeniusonline.com/&quot;&gt;Girl Genius&lt;/a&gt;&amp;nbsp;comic book. I posted some&amp;nbsp;&lt;a href=&quot;http://www.flickr.com/photos/spyderella/sets/72157631897031070/&quot;&gt;pictures of the clank&#39;s construction process&lt;/a&gt;. What makes it fidget is a servo motor on its back, driven by an Arduino in my purse, running an Arduino sketch I wrote (&lt;a href=&quot;https://github.com/scichelli/Arduino-Sketches/blob/master/GirlGeniusClank/GirlGeniusClank.ino&quot;&gt;source code&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;You might appreciate the&amp;nbsp;&lt;a href=&quot;http://www.girlwritescode.com/2012/09/hello-nerds-hello-world-hello-arduino.html&quot;&gt;Nerd Nite wrapup&lt;/a&gt;&amp;nbsp;from the last time I spoke on this topic. There are useful links in there, pertinent to the presentation you saw at the Showdown, specifically the &lt;a href=&quot;http://www.slideshare.net/girlwritescode/hello-arduino&quot;&gt;slide deck&lt;/a&gt;&amp;nbsp;that contains links to resources for learning more.&lt;br /&gt;&lt;br /&gt;Some of you talked to me about presenting to your students at your schools. Yes, please! Get in touch.&lt;br /&gt;&lt;br /&gt;Thanks for being awesome. Make fantastic things.</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/8553409419100006353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=8553409419100006353' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/8553409419100006353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/8553409419100006353'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2012/11/showdown-at-unobtanium-for-science.html' title='Showdown at Unobtanium&amp;mdash;for SCIENCE!'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-1525653756696636397</id><published>2012-09-12T23:42:00.000-05:00</published><updated>2012-09-12T23:42:32.142-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="hacks"/><category scheme="http://www.blogger.com/atom/ns#" term="open-source software"/><category scheme="http://www.blogger.com/atom/ns#" term="presentation"/><title type='text'>Hello, Nerds. Hello, World. Hello, Arduino.</title><content type='html'>Thank you to &lt;a href=&quot;http://austin.nerdnite.com/&quot;&gt;Nerd Nite Austin&lt;/a&gt; for a fantastic venue, and my thanks to all of you who were there, creating a palpable enthusiasm for Making Stuff! What a hoot. Resources for ya...&lt;br /&gt;&lt;br /&gt;The slidedeck: &lt;a href=&quot;http://www.slideshare.net/girlwritescode/hello-arduino&quot;&gt;Hello, Arduino&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/scichelli/Arduino-Sketches&quot;&gt;Samples of my Arduino code&lt;/a&gt; are on GitHub, because I like to think out loud in code.&lt;br /&gt;&lt;br /&gt;A description of the &lt;a href=&quot;http://lostechies.com/sharoncichelli/2009/11/08/happy-hack-o-ween-electronics-and-a-microcontroller-spice-up-the-haunt/&quot;&gt;blinky-eyeball Halloween costume&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That &quot;hang out and code with other people learning to code&quot; study group is &lt;a href=&quot;http://www.polyglotprogrammers.org/&quot;&gt;Polyglot Programmers of Austin&lt;/a&gt;, our next meeting is tomorrow, and you should totally join us.&lt;br /&gt;&lt;br /&gt;Lest you need some motivation for making nerd presentations of your own, check this out. Some months back, I presented at a Dorkbot meeting at the ATX Hackerspace. Afterwards, someone approached me with &quot;I don&#39;t know if you remember me, but...&quot; And kapow! Timewarp! Here was my friend from &lt;a href=&quot;http://en.wikipedia.org/wiki/Center_for_Talented_Youth&quot;&gt;nerd camp&lt;/a&gt;, whom I hadn&#39;t seen in 20 years! Wow! We&#39;ve had a blast catching each other up. &lt;em&gt;Then&lt;/em&gt;, I&#39;m presenting at Nerd Nite tonight, and after that, &lt;em&gt;another&lt;/em&gt; friend from nerd camp comes up and says hello. &lt;br /&gt;&lt;br /&gt;Dude, I&#39;m telling you. Take your awesome hobbies, go to nerdy things and present your awesomeness, and fantastic nerdy friends whom you miss will discover you and reconnect with your life. What a delightful unexpected benefit.</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/1525653756696636397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=1525653756696636397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/1525653756696636397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/1525653756696636397'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2012/09/hello-nerds-hello-world-hello-arduino.html' title='Hello, Nerds. Hello, World. Hello, Arduino.'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-8180290433344727162</id><published>2012-08-18T20:33:00.002-05:00</published><updated>2012-08-18T20:33:33.511-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cooking"/><title type='text'>How to Poach an Egg Without Specialty Tools</title><content type='html'>I got to talking on Twitter (as you do) with &lt;a href=&quot;https://twitter.com/garannm/&quot;&gt;Garann&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/cecycorrea/&quot;&gt;Cecy&lt;/a&gt; about that most satisfying of snacks, the poached egg. They lamented the hassle and the need for weird tools (molds and frames and whatnot). I offered an alternative.&lt;br /&gt;&lt;br /&gt;I&#39;ve made a study and a practice of the poaching of eggs, and I&#39;ve got it down. I also don&#39;t use anything more exotic than a slotted spoon. This wisdom is harvested from Alton Brown, &lt;i&gt;The Joy of Cooking&lt;/i&gt;, Martha Stewart, daytime television, lots of experimentation, and my dear friend Adam, who cooked eggs Benedict for me on a New Year&#39;s Day in someone else&#39;s co-op in Boston, using a rapidly melting plastic cup as a poaching mold.&lt;br /&gt;&lt;br /&gt;Photos and step-by-step instructions are all on Flickr: &lt;a href=&quot;http://www.flickr.com/photos/spyderella/sets/72157631134114690/&quot;&gt;How to Poach an Egg&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/spyderella/7811741176/in/set-72157631134114690&quot; title=&quot;How to Poach an Egg, on Flickr&quot;&gt;&lt;img src=&quot;http://farm9.staticflickr.com/8286/7811722500_4990ac0ce1.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Poached egg&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sorry for the delay, ladies. I had to wait until I wanted an egg and cleaned the stove.&lt;br /&gt;&lt;br /&gt;How about you: other tips for eggcellence?</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/8180290433344727162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=8180290433344727162' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/8180290433344727162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/8180290433344727162'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2012/08/how-to-poach-egg-without-specialty-tools.html' title='How to Poach an Egg Without Specialty Tools'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-4236702171580690862</id><published>2012-07-22T15:36:00.001-05:00</published><updated>2012-07-22T16:47:18.574-05:00</updated><title type='text'>Memo From My Future Self</title><content type='html'>&lt;blockquote style=&quot;font-style: italic; border: 1px solid gray;&quot;&gt;As a goal-setting exercise, I got a jump on my year-end holiday letters, writing this one five-and-a-half years early. Listen in on this missive from the future. And if Future You has some news of her own, I&#39;d love to hear from her.&lt;/blockquote&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/spyderella/7625028486/&quot; title=&quot;Memo from my future self&quot;&gt;&lt;img src=&quot;http://farm9.staticflickr.com/8168/7625028486_beb049a58f.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Memo from my future self&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;December 31, 2017&lt;br /&gt;&lt;br /&gt;Hello, my lovelies,&lt;br /&gt;&lt;br /&gt;Bright blessings to you as the annum odometer rolls over another year. I continue to be amazed at how lucky I am to be able to count you among my friends. I am energized and inspired each time I meet one of you in person. Your energy, your passion; your sadnesses, your triumphs; the small doubting voices and the quiet pride in an accomplishent; your fears, your hearts, your courage: These are all beautiful to me. Rock on with your excellent selves.&lt;br /&gt;&lt;br /&gt;I have so many stories to share with you. In no particular order...&lt;br /&gt;&lt;br /&gt;Downloads of &lt;i&gt;Fifty States, Fifty Stories&lt;/i&gt; continue at a moderate clip. Word is spreading, thanks to your help. Keep it up! As more people read it, more realize the strength and beauty of their own stories. Tell us your story. I&#39;d love it if you came over to the website and shared your voice. I want to hear from you.&lt;br /&gt;&lt;br /&gt;The most exciting outcome of the book for me, and it sounds like it was for many of you, too, is how much I learned writing &quot;Appendix A: Puerto Rico.&quot; One enterprising reader was so moved, she has set up a foundation to effect change. Melissa Emory has a place for you on her team. If you also think we have important work to do there, go to her site and get involved.&lt;br /&gt;&lt;br /&gt;The interview with Chana Joffe-Walt was too much fun. I even got to meet Ira Glass, and I can confirm: Yes, he is a nerd. I can&#39;t wait for you to hear the show. Look for This American Life episode 759, &quot;Stories of the Storytellers.&quot; You&#39;ll find I&#39;m in very good company, but that&#39;s all I&#39;ll say for now, terrible tease that I am.&lt;br /&gt;&lt;br /&gt;Cities for 2018&#39;s Socketwrench Series are filling up. These classes are a blast&amp;mdash;hands-on, high intensity coding, for those who want to truly understand what&#39;s going on. If you want me to teach a class in your town, get over there and tell me you&#39;re out there. And remember, computers are tools for our convenience. Don&#39;t let the robot overlords push you around. Come to a Socketwrench class and master the blighters.&lt;br /&gt;&lt;br /&gt;Remember that conversation I had with the AlphaSmart people, about responsive keyboards and blogging from the road? Exciting projects are afoot. I &lt;strong&gt;wish&lt;/strong&gt; I could tell you more, but I think this &lt;em&gt;prototype&lt;/em&gt; would self-destruct in my hands. Oops!&lt;br /&gt;&lt;br /&gt;Ha ha, guess that was okay. Not pushing my luck, though.&lt;br /&gt;&lt;br /&gt;It has been an exciting year, and I thank each of you for your part in it. Keep being awesome.&lt;br /&gt;&lt;br /&gt;See you on the flipside.&lt;br /&gt;Love,&lt;br /&gt;Sharon</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/4236702171580690862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=4236702171580690862' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/4236702171580690862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/4236702171580690862'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2012/07/memo-from-my-future-self.html' title='Memo From My Future Self'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-515802302876073946</id><published>2012-06-13T09:31:00.000-05:00</published><updated>2012-06-13T13:59:32.109-05:00</updated><title type='text'>On Thinking About Things</title><content type='html'>My house was burglarized last month. Thieves took pretty much anything I owned that could be sold via classified ad, plus a bunch of crap that is monetarily worthless and heart-rendingly irreplaceable. I&#39;ve run out of swear words for these people. But it&#39;s got me thinking about &lt;em&gt;things&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Some of it makes me laugh. For instance, the acoustic guitar, the electric bass and its amp, but not the French horn. Sheesh. Everybody&#39;s a critic. Or the smart phone that is actually a Windows Phone 7. Good luck with &lt;em&gt;that&lt;/em&gt;, suckers. Or the earring from Dad. I&#39;d lost one of a pair of earrings, and made the orphan into a necklace. The night before the break-in&amp;mdash;I kid you not, &lt;em&gt;the night before&lt;/em&gt;&amp;mdash;I found the missing earring. They took the necklace.&lt;br /&gt;&lt;br /&gt;Then there are the things that don&#39;t make me laugh. All my earrings. All my earrings that my grandmother had given me, a new pair for each play I performed in during high school, which she drove two hours to come up and see. All those. Not worth pennies to anybody, and memories I delighted in every morning as I got dressed. No hyperbole here; I knew who had gifted me each pair of earrings I had, and I thought of them as I selected something to complement my outfit. A little wave hello across time. These were hand-made by Leandra. Those were part of a set of five, owned by five different friends, all cut from the same tree branch. These were grown-up earrings entrusted to my young self by my mom&#39;s best friend. Those were Dad&#39;s way of saying I could get my ears pierced (finally!). These I made. Those were from the first boy I ever kissed.&lt;br /&gt;&lt;br /&gt;They were all Really. Damn. Important.&lt;br /&gt;&lt;br /&gt;So I&#39;m thinking about things. I&#39;m thinking, a bit frantically, what &lt;em&gt;else&lt;/em&gt; did Grandma Sandy give me? No, I mean, what that &lt;em&gt;can&#39;t be taken away&lt;/em&gt; did Grandma give me?&lt;br /&gt;&lt;br /&gt;I remember lying with her on the big bed, under the afghan she had crocheted, while she read to me: &lt;a href=&quot;http://www.amazon.com/Snipp-Snapp-Snurr-Buttered-Bread/dp/0807574910/ref=sr_1_7?s=books&amp;ie=UTF8&amp;qid=1339567728&amp;sr=1-7&quot;&gt;&lt;i&gt;Snipp, Snapp, and Snurr&lt;/i&gt;&lt;/a&gt;, with their buttered bread; &lt;i&gt;The Wizard of Oz&lt;/i&gt;; &lt;i&gt;Motherly Smith and Brother Bimbo&lt;/i&gt;, which I have since come to learn is the most boring book ever. I don&#39;t know how she put up with it, but I loved it, and I suspect she loved me.&lt;br /&gt;&lt;br /&gt;Of course I remember her sweaters. Early in my life, they were all hand made. I remember a full-color rendering of the Wizard of Oz in yarn. It had Dorothy and Toto and the Lion on the front, and the Scarecrow and the Tin Man on the back, with the Wizard&#39;s balloon on one side and the Emerald City on the other, and the Yellow Brick Road running around the hem. I&#39;m telling you: pictures in yarn. It was amazing. Later, as the family grew through marriages and children, the Christmas crunch became a drudgery, and she branched out into machine-assisted knitting. She designed the patterns on her computer.&lt;br /&gt;&lt;br /&gt;I remember Thanksgivings with &lt;em&gt;two&lt;/em&gt; pumpkin pies. One for the family, and one for me. Which I would also have for the following breakfast. With a mountain of Reddi-wip. &lt;br /&gt;&lt;br /&gt;I remember going for walks around Arden, where I learned that when I grew up I wanted to live in a neighborhood where people waved to each other, which I have now done. I remember her flower gardens.&lt;br /&gt;&lt;br /&gt;I also remember her work with the Civil Rights Movement, and raising my mom by herself in Philadelphia, and her pursuit of a Masters degree in sociology. She had a computer and an email address &lt;em&gt;and&lt;/em&gt; knew how to use them. She was strong and funny and patient.&lt;br /&gt;&lt;br /&gt;She taught me never to buy anything on credit. That right there is a hell of a gift.</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/515802302876073946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=515802302876073946' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/515802302876073946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/515802302876073946'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2012/06/on-thinking-about-things.html' title='On Thinking About Things'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-7800284190427056349</id><published>2012-06-05T21:32:00.000-05:00</published><updated>2012-06-05T21:32:04.248-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="astronomy"/><title type='text'>I stood in the shadow of Venus</title><content type='html'>I also stood in a stairwell for a really long time, but that was fun, too. The UT astronomy club opened its rooftop to the public and recruited an army of volunteers, who were completely astonished by the size of the crowd.&lt;br /&gt;&lt;br /&gt;I bumped into Brandon just as I arrived, and we entered the back of the line at the 7th floor. Luckily I was mistaken about how many floors there were&amp;mdash;the flier mentioned a gathering place on the 13th floor, and that didn&#39;t sound so bad. Part way up I learned that the roof is above the &lt;em&gt;17th&lt;/em&gt; floor, but at that point I was well invested.&lt;br /&gt;&lt;br /&gt;A stairwell full of people starts to smell like a stairwell full of people after a while. Each landing became a reprieve, a chance to catch some fresh air through the held-open doors (passed hand to hand, as we each climbed by) and, if you were quick, to dash out to a water fountain. An enterprising soul could set up a thriving business selling ball-park concessions to the people standing in line. It was the kind of line usually reserved for rock concerts. Which is why I love Austin.&lt;br /&gt;&lt;br /&gt;Brandon got a call from a friend a few floors below us, and actually ceded his place in line to go join her. That left me to... shrug, talk to the people around me.&lt;br /&gt;&lt;br /&gt;I met a bartender who said she received all kinds of verbal abuse as a bouncer but considerably more respect as a bartender. And no, people don&#39;t actually pour out their hearts to bartenders. I met a someday-med-student-but-currently-enterprise-support-agent who works at Dell. He camps under the awe-inspiringly dark skies in Big Bend, struck dumb by the sky-splitting blue gash of the Milky Way, and quieted by the realization that the mountains he could see from his cliff-side perch were in Mexico, 200 miles away. I met a photographer who got up at 2:30 this morning to capture time-lapse footage of the wheeling stars for his friends&#39; film about the Bastrop wild fires. He went to space camp when he was in high school, so many years ago, and practiced a simulated space walk repairing the optics in the Hubble telescope.&lt;br /&gt;&lt;br /&gt;So happy to burst out of the stairwell onto the 17th floor, and so resolved to stay chipper as we filed into a line that snaked down the hallway and back. We stood there for a while&amp;mdash;at least it was air conditioned&amp;mdash;until finally the mind starts to notice that the only movement is from the compression of the crowd. Cloud cover. They&#39;ve halted the line to wait for clouds to clear. I wonder if we could all get on the roof and wave our arms to push the offending wisps out of the way. But I think about terms like &quot;time invested&quot; and &quot;sunk cost,&quot; and waiting isn&#39;t so bad. Plus, we&#39;re talking about dark matter and SpaceX and deep-sky images, and I got to tell the story of visiting the Hobby Eberly Telescope, twice.&lt;br /&gt;&lt;br /&gt;There is a time limit, though. You can&#39;t see Venus transit the face of the sun if the sun has set. 7:00 ticks by, which, rationally, I know is plenty of time, but I start to rehearse making the decision that night has fallen and it&#39;s time to go, having missed the whole thing while inside a windowless spiral of concrete.&lt;br /&gt;&lt;br /&gt;But then the line moves, and we&#39;re up to the roof, and there are telescopes and people everywhere. And more lines, but at least there is air and sunlight. A volunteer with a basket of cardboard solar-viewing glasses gives me the chance to get my first look at Venus.&lt;br /&gt;&lt;br /&gt;And, there it is! Plain as day, a disc in front of the red face of the sun. A shadow, interposed. Cheeky girl.&lt;br /&gt;&lt;br /&gt;Spilling onto the sidewalk below, a fellow viewer said, &quot;See you in 105 years.&quot; I replied, &quot;I&#39;ll be there.&quot;</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/7800284190427056349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=7800284190427056349' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7800284190427056349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7800284190427056349'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2012/06/i-stood-in-shadow-of-venus.html' title='I stood in the shadow of Venus'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-7442869190917664926</id><published>2012-05-15T23:34:00.000-05:00</published><updated>2012-05-15T23:40:24.762-05:00</updated><title type='text'>The Future of Blogging*</title><content type='html'>Here&#39;s how this is going to work. I have technical blogs on &lt;a href=&quot;http://lostechies.com/sharoncichelli/&quot;&gt;Los Techies&lt;/a&gt; and &lt;a href=&quot;http://www.headspring.com/author/scichelli/&quot;&gt;Headspring&lt;/a&gt;, but this here blog is the one with the cute domain name. Wondering what to do with Girl Writes Code, I remind myself that I enjoy writing about cooking and climbing and travel as much as I enjoy writing about code.&lt;br /&gt;&lt;br /&gt;So I will continue to post technical content to those blogs, and this one will feature posts about the rest of my life, with pointers to the tech posts on the others. You can subscribe to either of those blogs, or to this one for the &lt;a href=&quot;http://feeds.feedburner.com/GirlWritesCode&quot;&gt;union of all three&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* on this blog</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/7442869190917664926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=7442869190917664926' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7442869190917664926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7442869190917664926'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2012/05/future-of-blogging.html' title='The Future of Blogging*'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-954019574581716031</id><published>2011-11-16T20:31:00.001-06:00</published><updated>2011-11-16T20:32:30.409-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><category scheme="http://www.blogger.com/atom/ns#" term="refactoring"/><title type='text'>Running JavaScript... With Sneakers!</title><content type='html'>&lt;p&gt;Code-review time. I haven&#39;t written significant JavaScript in &lt;em&gt;forevs&lt;/em&gt;, but I hit upon a use case well suited to it, had a blast coding it up, and am confident that I&#39;ll be completely mystified by it three months from now. That is, unless we refactor it for maintainability (this is where you come in).&lt;/p&gt; &lt;p&gt;I&#39;ll explain the use case. The &lt;a href=&quot;http://www.coolrunning.com/engine/2/2_3/181.shtml&quot;&gt;Couch-to-5K&lt;/a&gt; running plan is an excellent exercise regimen for learning to run. I followed it to successfully transform myself from sedentary software developer to 5K finisher. The runners among you know that five kilometers is a beginner-level distance; the sedentary software developers may find it as daunting as I once did. You train in intervals, alternating walking and running, gradually shifting the ratios to more running in successive workouts. If you can walk a moderate distance, following the program is totally doable (or modify it for easy walking/fast walking, if you&#39;re not up for jogging). Definitely check it out.&lt;/p&gt; &lt;p&gt;The thing is, timing the intervals&amp;mdash;especially at the beginning, where you&#39;re alternating a minute of running with 90 seconds of walking&amp;mdash;needs a complex timing device (a fancy runners watch), and if you&#39;re using a treadmill, it is &lt;em&gt;really annoying&lt;/em&gt; to your fellow gym users, as your watch is beeping every minute or two. Or, well, maybe gym people don&#39;t care, but it&#39;s really annoying to me, since the dang thing is on my own wrist. For running indoors, I want a C25K timer that is tactile or visual. I&#39;ve been thinking about an Arduino-powered timer that reads from a dip switch to determine which workout you&#39;re running and signals the changes with a vibration motor (like in a cell phone). Thinking, and not so much doing. Finally one Sunday I forced myself to focus on the problem: what do you have, with a visual display, that is really small and runs code?&lt;/p&gt; &lt;p&gt;My &lt;a href=&quot;http://en.wikipedia.org/wiki/Nokia_N810&quot;&gt;Nokia N810 internet tablet&lt;/a&gt; has a web browser that runs JavaScript, can open html files stored locally, and can do this while also playing a podcast. Win!&lt;/p&gt; &lt;p&gt;Here&#39;s what you &lt;em&gt;can&#39;t&lt;/em&gt; do with JavaScript, though: Thread.Sleep(walkInterval). Instead, you use setTimeout() to say &quot;execute this function &lt;em&gt;after&lt;/em&gt; this interval,&quot; asynchronously. That&#39;s the part that currently works but I daren&#39;t touch it. In other words, that&#39;s the part that needs your code review advice. Remember that the intended scenario is to rest the tablet on the treadmill&#39;s magazine lip, so the app flashes the background of the page to catch my eye when I&#39;m not looking directly at it. It&#39;s high-contrast because it isn&#39;t meant to be &lt;em&gt;watched&lt;/em&gt;, just kept at hand, in my periphery.&lt;/p&gt; &lt;p&gt;If you choose to use the app (in addition to reviewing it), please only use it on a treadmill. Stay safe; don&#39;t try to wrangle something you need to &lt;em&gt;look&lt;/em&gt; at while you&#39;re on the trail.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;https://github.com/scichelli/RunningTimer&quot;&gt;Running Timer code&lt;/a&gt; is on github. A representative sample is below. How would you make it better?&lt;/p&gt; &lt;pre class=&quot;code&quot;&gt;&lt;code&gt;var exercise = function(setup) {&lt;br /&gt; var workout = getWorkout(setup.week, setup.day);&lt;br /&gt; doExercise(workout, 0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var cooldown = function() {&lt;br /&gt; walk(&#39;Cool Down&#39;);&lt;br /&gt; window.setTimeout(function() { transition(function() { walk(&#39;Done!&#39;); })}, &lt;br /&gt;  minToMilli(RT.cooldownDuration));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var doExercise = function(workout, i) {&lt;br /&gt; workout[i].mode();&lt;br /&gt; if (i === workout.length - 1) {&lt;br /&gt;  window.setTimeout(function() { transition(cooldown) }, &lt;br /&gt;   minToMilli(workout[i].minutes));&lt;br /&gt; } else {&lt;br /&gt;  window.setTimeout(function() { transition(function() { doExercise(workout, i + 1); })}, &lt;br /&gt;   minToMilli(workout[i].minutes));&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var getWorkout = function(week, day) {&lt;br /&gt; return eval(&#39;C25K.W&#39; + week + &#39;D&#39; + day);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var transition = function(callback) {&lt;br /&gt; var indicatorDiv = $(&#39;.runCountdown&#39;);&lt;br /&gt; var body = $(document.body);&lt;br /&gt; transitionBlink(6, indicatorDiv, body, callback);&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/954019574581716031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/954019574581716031'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2011/11/running-javascript-with-sneakers.html' title='Running JavaScript... With Sneakers!'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-5619214847656106044</id><published>2011-08-22T09:34:00.010-05:00</published><updated>2011-10-20T12:49:41.798-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="open-source software"/><category scheme="http://www.blogger.com/atom/ns#" term="refactoring"/><title type='text'>An Object Lesson in Binary Compatibility</title><content type='html'>A riddle for you, friends: When is changing a method from &lt;code&gt;return void&lt;/code&gt; to &lt;code&gt;return Something&lt;/code&gt; a breaking change?&lt;br /&gt;&lt;br /&gt;If you already know the answer, then why hadn&#39;t you told me? Could&#39;ve saved me a fair bit of embarrassment. Ah well, maybe I missed your call.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;First, a story&lt;/h2&gt;&lt;br /&gt;I had the opportunity to contribute to the &lt;a href=&quot;https://github.com/DarthFubuMVC/htmltags&quot;&gt;HtmlTags&lt;/a&gt; open-source project&lt;super&gt;&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=69451#footnote1&quot;&gt;1&lt;/a&gt;&lt;/super&gt;. They needed some unit test coverage, and I &amp;lt;3 unit testing and wanted to try my hand at contributing to open-source software. As I got my bearings, I got more confident and started to reach beyond the unit test project into refactoring the application code.&lt;br /&gt;&lt;br /&gt;That&#39;s when I &lt;a href=&quot;https://github.com/scichelli/htmltags/commit/f8103728490297bec21d8ccc0e27d890ad39ec98&quot;&gt;found the AddStyle and AddJavaScript methods&lt;/a&gt;. Their friends returned an HtmlTag, but they returned void. They would be easier to test if they returned an HtmlTag, but that&#39;s not a good justification for changing a method. But they would be more &lt;em&gt;consistent&lt;/em&gt; if they behaved like their neighbors, and that is a sufficient justification to consider it.&lt;br /&gt;&lt;br /&gt;HtmlTags is a library meant to be consumed by other applications. It was already in use in the wild. Therefore, it was important not to change its API. It had to work like it always had, else we&#39;d cause considerable grief to the developers using our code. I&#39;ve been the consumer of a service that made breaking changes to its API, and I have choice things to say about the team that saddled me with that noise.&lt;br /&gt;&lt;br /&gt;I thought really carefully. I was contemplating changing the return type of a public method in an in-use API. But all those uses would be calling it as if it returned nothing, and you can invoke a method without using its return value. This would be just like that. I asked a coder-buddy for advice. We convinced each other:  What harm could it do?&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;What about the riddle?&lt;/h2&gt;&lt;br /&gt;Here we come to the answer to the riddle. If you&#39;re changing a library that will be called by other applications, then there are &lt;a href=&quot;http://stackoverflow.com/questions/1456785/a-definite-guide-to-api-breaking-changes-in-net&quot;&gt;&lt;em&gt;many&lt;/em&gt; seemingly harmless changes that are actually breaking changes&lt;/a&gt;, including &lt;a href=&quot;http://stackoverflow.com/questions/1456785/a-definite-guide-to-api-breaking-changes-in-net/1472967#1472967&quot;&gt;changing a method&#39;s return type&lt;/a&gt;. When the consuming assembly is compiled, it is built with instructions to find a method named &lt;code&gt;Whatever&lt;/code&gt; that returns void, but the changed &lt;a href=&quot;http://www.akadia.com/services/dotnet_assemblies.html#Assemblies&quot;&gt;assembly&#39;s manifest&lt;/a&gt; contains only a method named &lt;code&gt;Whatever&lt;/code&gt; that returns string. No match.&lt;br /&gt;&lt;br /&gt;Computers. They&#39;re so literal.&lt;br /&gt;&lt;br /&gt;To fix it, you merely need to recompile the consuming application, but you don&#39;t discover the problem until assemblies are loaded at run-time, an annoying time to discover exceptions. I coded up a simple example that illustrates the problem. Feel free to follow along at home.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;See the problem in action&lt;/h2&gt;&lt;br /&gt;Make two separate solutions, a class library called MessageOutputter and a console application called ConsoleMessager that references MessageOutputter. First, build MessageOutputter with a &lt;code&gt;return void&lt;/code&gt; method.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;namespace MessageOutputter&lt;br /&gt;{&lt;br /&gt;  public class Outputter&lt;br /&gt;  {&lt;br /&gt;    private string _message = &quot;This is the outputter, version 1.&quot;;&lt;br /&gt;&lt;br /&gt;    public string Emit()&lt;br /&gt;    {&lt;br /&gt;      return _message;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void UpdateVersion(string versionNumber)&lt;br /&gt;    {&lt;br /&gt;      _message = string.Format(&quot;I&#39;ve been altered by the UpdateVersion method. I am version {0}.&quot;, versionNumber);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;UpdateVersion modifies a private field but does not return a value. Compile that solution and put its dll into a lib folder from which you will reference it in ConsoleMessager. Open the ConsoleMessager solution and add a reference to the MessageOutputter.dll. Write a method that uses the MessageOutputter.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;namespace ConsoleMessager&lt;br /&gt;{&lt;br /&gt;  class Program&lt;br /&gt;  {&lt;br /&gt;    static void Main(string[] args)&lt;br /&gt;    {&lt;br /&gt;      var outputter = new MessageOutputter.Outputter();&lt;br /&gt;      Console.WriteLine(&quot;Calling the outputter:&quot;);&lt;br /&gt;      Console.WriteLine(outputter.Emit());&lt;br /&gt;      Console.WriteLine(&quot;Asking the outputter to update, then calling it again.&quot;);&lt;br /&gt;      outputter.UpdateVersion(&quot;Updated 1&quot;);&lt;br /&gt;      Console.WriteLine(outputter.Emit());&lt;br /&gt;      Console.Read();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The UpdateVersion method is called, not expecting a return value. Build and run the ConsoleMessager.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://4.bp.blogspot.com/--A7Dqr3hnRM/TlJqJnFJ33I/AAAAAAAAAB4/Amb6boyxcJM/s1600/RunWithVersion1.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5643689996390621042&quot; src=&quot;http://4.bp.blogspot.com/--A7Dqr3hnRM/TlJqJnFJ33I/AAAAAAAAAB4/Amb6boyxcJM/s320/RunWithVersion1.png&quot; style=&quot;cursor: hand; cursor: pointer; height: 72px; width: 320px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Return to the MessageOutputter solution and modify the UpdateVersion method to return the message after it modifies it.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;namespace MessageOutputter&lt;br /&gt;{&lt;br /&gt;  public class Outputter&lt;br /&gt;  {&lt;br /&gt;    private string _message = &quot;This is the outputter, version 2.&quot;;&lt;br /&gt;&lt;br /&gt;    public string Emit()&lt;br /&gt;    {&lt;br /&gt;      return _message;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public string UpdateVersion(string versionNumber)&lt;br /&gt;    {&lt;br /&gt;      _message = string.Format(&quot;I&#39;ve been altered by the UpdateVersion method. I am version {0}.&quot;, versionNumber);&lt;br /&gt;      return _message;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now UpdateVersion returns a string. Build the solution and copy its new dll back into the lib folder, and into the Debug or Release folder under ConsoleMessager/bin, so that the ConsoleMessager will run with your new version of the dll. Run ConsoleMessager and you will encounter the error:&lt;br /&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 3em;&quot;&gt;Unhandled Exception: System.MissingMethodException: Method not found: &#39;Void MessageOutputter.Outputter.UpdateVersion(System.String)&#39; at ConsoleMessager.Program.Main(String[] args)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-5sGPCq73v_Y/TlJqcD2MTQI/AAAAAAAAACA/1zqqDH1Lgkk/s1600/ErrorWithVersion2.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5643690313350139138&quot; src=&quot;http://1.bp.blogspot.com/-5sGPCq73v_Y/TlJqcD2MTQI/AAAAAAAAACA/1zqqDH1Lgkk/s320/ErrorWithVersion2.png&quot; style=&quot;cursor: hand; cursor: pointer; height: 87px; width: 320px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The MissingMethodException indicates that ConsoleMessager, when looking within the MessageOutputter library, could not find an UpdateVersion method that returns void. Reopen the ConsoleMessager solution. Before you even build, IntelliSense will tell you that UpdateVersion returns a string now. Build ConsoleMessager and run it again, to see that it works successfully.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-EvLuSX7jtn0/TlJqmU5oT2I/AAAAAAAAACI/8BEN82CHFrE/s1600/RunWithVersion2.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5643690489726652258&quot; src=&quot;http://2.bp.blogspot.com/-EvLuSX7jtn0/TlJqmU5oT2I/AAAAAAAAACI/8BEN82CHFrE/s320/RunWithVersion2.png&quot; style=&quot;cursor: hand; cursor: pointer; height: 64px; width: 320px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Wiser now&lt;/h2&gt;&lt;br /&gt;No one raked me over the coals—in fact, my intro-to-OSS experience was thoroughly positive, and I can&#39;t wait to do more—but I know I caused some time-consuming inconvenience to my fellow devs. I have now learned that &lt;a href=&quot;http://blogs.msdn.com/b/jmstall/archive/2008/03/10/binary-vs-source-compatibility.aspx&quot;&gt;Binary Compatibility is not the same as Source Compatibility&lt;/a&gt;. Conflating the two is like saying, &quot;Works on &lt;em&gt;my&lt;/em&gt; machine.&quot; I hope this write-up can help you avoid a similar goof.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;border-top: 1px solid #ccc; font-size: .8em;&quot;&gt;&lt;a href=&quot;&quot; name=&quot;footnote1&quot;&gt;&lt;/a&gt;&lt;super&gt;1&lt;/super&gt; The nice thing about open-source projects is that everyone has the opportunity to contribute. But I had the especially good fortune to have willing help from &lt;a href=&quot;http://lostechies.com/joshuaflanagan/&quot;&gt;Josh Flanagan&lt;/a&gt; in finding my way through my first OSS pull request.&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/5619214847656106044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/5619214847656106044'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2011/08/object-lesson-in-binary-compatibility.html' title='An Object Lesson in Binary Compatibility'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/--A7Dqr3hnRM/TlJqJnFJ33I/AAAAAAAAAB4/Amb6boyxcJM/s72-c/RunWithVersion1.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-69451.post-8574976263564780089</id><published>2011-06-20T18:25:00.010-05:00</published><updated>2011-10-20T12:50:40.849-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DDD"/><title type='text'>Using Syntax to Model the Domain</title><content type='html'>I&#39;m fascinated by the small syntactic decisions that bring code closer to representing the business domain. Never mind the class inheritance examples from text books (&quot;Dog IS-A Pet,&quot; which has nearly never been relevant), I mean using properties, methods, and constructors to let the compiler ensure your objects stay in a valid state. Linguistically, I think this is neat.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Not everything deserves a setter&lt;/h2&gt;&lt;br /&gt;Consider my Bacon class with an IsCooked property:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;public class Bacon&lt;br /&gt;{&lt;br /&gt;  public bool IsCooked { get; set; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;To cook some bacon, I set IsCooked to true. Sure. But what if I set it to false? I just defied physics and the space-time continuum. Shucks.&lt;br /&gt;&lt;br /&gt;IsCooked should be read-only, and I need a different way to change it in a one-way transition: I need a method. Bacon comes into my domain uncooked, so I&#39;ll set that property in its constructor.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;public class Bacon&lt;br /&gt;{&lt;br /&gt;  public bool IsCooked { get; private set; }&lt;br /&gt;&lt;br /&gt;  public Bacon()&lt;br /&gt;  {&lt;br /&gt;    IsCooked = false;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void Cook()&lt;br /&gt;  {&lt;br /&gt;    IsCooked = true;&lt;br /&gt;  }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The sanctity of thermodynamics is preserved. When the transitions get more interesting than a simple Boolean, you&#39;re looking at a &lt;a href=&quot;http://en.wikipedia.org/wiki/Finite-state_machine&quot;&gt;state machine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Polywhatism?&lt;/h2&gt;&lt;br /&gt;I encountered this example in the wild, but I&#39;ve changed the domain to protect the innocent.&lt;br /&gt;&lt;br /&gt;We&#39;re exploring a dungeon, and in our inventory we have items that affect our health:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;amulets add a small amount to our health each day;&lt;/li&gt;&lt;li&gt;granola bars give us a lump-sum boost to our health the moment we eat them; and&lt;/li&gt;&lt;li&gt;cursed rings sap away our health each day until the curse runs out. (Why keep a cursed ring? How else would you command your army of winged monkeys?)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Here&#39;s a display of our inventory:&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Item&lt;/th&gt;&lt;th&gt;Daily Boost&lt;/th&gt;&lt;th&gt;Total Remaining&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Obsidian amulet&lt;/td&gt;&lt;td&gt;150&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Luck ring&lt;/td&gt;&lt;td&gt;(25)&lt;/td&gt;&lt;td&gt;375&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Jasper amulet&lt;/td&gt;&lt;td&gt;253&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Granola of righteousness&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;400&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;This was implemented as a collection of IHealthItem objects. Here&#39;s what I found:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;public class Amulet : IHealthItem&lt;br /&gt;{&lt;br /&gt;  public int? DailyBoost { get; set; }&lt;br /&gt;&lt;br /&gt;  public int? Total&lt;br /&gt;  {&lt;br /&gt;    get&lt;br /&gt;    {&lt;br /&gt;      return null;&lt;br /&gt;    }&lt;br /&gt;    set&lt;br /&gt;    {&lt;br /&gt;      throw new NotSupportedException(&lt;br /&gt;           &quot;Amulets do not have a total&quot;);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;As if the cursed rings weren&#39;t bad enough, now there are properties we&#39;re not allowed to call, lurking, waiting to pounce on us with a run-time exception. The calling code, when working with an IHealthItem instance, is forced to make an &quot;Is&quot; check to determine the type, in order to know which properties are safe to use. Half the properties aren&#39;t relevant half the time. The DailyBoost property on CursedRing has an additional problem: Should you set it to a negative number, or assume it should be stored as an absolute value and multiplied by -1 when being used and displayed? The IHealthItem interface does not provide any abstraction.&lt;br /&gt;&lt;br /&gt;In fact, these are &lt;em&gt;not&lt;/em&gt; three variations of the same thing. The only quality they have in common is the user&#39;s desire to see them displayed in a table. (Further proof that they weren&#39;t related, in the real application, that table was labeled &quot;Amulets/Granola Bars/Cursed Rings.&quot;) These concepts should have been modeled as three independent entities, keeping it unambiguous in the business layer how to use them to increment and decrement the adventurer&#39;s health. Only at the presentation (UI) layer, they could be projected into a display-only DTO (Data Transfer Object) or &lt;a href=&quot;http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/&quot;&gt;view model&lt;/a&gt;, using strings for all three properties.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Don&#39;t let me be uninitialized&lt;/h2&gt;&lt;br /&gt;If a property must be set for an object to be in a valid state, the class&#39;s constructor should require that value as an argument instead. That way, it&#39;s impossible to construct the object without also putting it into a valid state.&lt;br /&gt;&lt;br /&gt;If a method, MethodB(), uses a private field and relies on another method, MethodA(), to be called first to set it, MethodB should take that value as a parameter instead. That way, MethodB can be called only after the result of MethodA has been determined; the correct order in which to call them is unambiguous.&lt;br /&gt;&lt;br /&gt;These types of temporal coupling are illustrated nicely with examples and remedies on Mark Seemann&#39;s blog in &quot;&lt;a href=&quot;http://blog.ploeh.dk/2011/05/24/DesignSmellTemporalCoupling.aspx&quot;&gt;Design Smell: Temporal Coupling&lt;/a&gt;.&quot; (He has a whole &lt;a href=&quot;http://blog.ploeh.dk/2011/05/24/PokayokeDesignFromSmellToFragrance.aspx&quot;&gt;series on encapsulation&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Too, meaning drives syntax&lt;/h2&gt;&lt;br /&gt;When I find myself compelled to &lt;em&gt;explain&lt;/em&gt; in comments, to write instructions (&quot;make sure you set this before you call that&quot;) in the xml summary, to incorporate usage notes into method names, I pounce on that as a candidate for refactoring. Finicky methods and classes that require secret knowledge to use correctly are invitations for bugs. It&#39;s like when I&#39;m editing the rules for one of Jon&#39;s games: every instance of the word &quot;except&quot; must justify its existence. Every special-case exception immediately draws my attention as a spot where the rules could be improved and streamlined. Similarly, when coding, certain behaviors draw my attention as opportunities for improvement. Hyper-explainy documentation is a big one.&lt;br /&gt;&lt;br /&gt;Semantics is the study of meaning, and syntax is the study of structure. That distinction makes them sound like separate domains, but the two interpretations of &quot;foreign car mechanic&quot; stem from &lt;em&gt;syntactic&lt;/em&gt; ambiguity. Each word still carries the same meaning, but in one case &quot;foreign&quot; modifies &quot;car,&quot; and in the other, &quot;foreign&quot; modifies &quot;mechanic.&quot; Syntax in natural languages certainly influences meaning, so why not in code, as well?&lt;br /&gt;&lt;script type=&quot;text/javascript&quot;&gt;custom_slug=&#39;http://lostechies.com/sharoncichelli/2011/06/20/using-syntax-to-model-the-domain/#comments&#39;; &lt;/script&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/8574976263564780089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/8574976263564780089'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2011/06/using-syntax-to-model-domain.html' title='Using Syntax to Model the Domain'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-3035937166107619979</id><published>2011-05-17T17:51:00.000-05:00</published><updated>2011-05-17T17:52:46.051-05:00</updated><title type='text'>Diffing Files to Avoid Easy Goofs</title><content type='html'>A good habit learned at my last job has saved me a lot of embarrassment and bugs (same thing): Before committing a set of changes to source control, I look at the diff of each file. &lt;em&gt;Look&lt;/em&gt; at the changes, read &#39;em over, look for misspellings and placeholder notes-to-self and files I hadn&#39;t intended to change; then make fixes and revert as needed. It&#39;s like proofreading. Polishing the fingerprints off a product before sending it into the world. &lt;a href=&quot;http://www.supertopo.com/climbers-forum/1359870/Check-Your-Knot-More-Accidents&quot;&gt;Checking your knot&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Shortcuts for diffing files:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In TFS, Shift&amp;ndash;double-click a file name in the Pending Changes window. (You can &lt;a href=&quot;http://blogs.msdn.com/b/jmanning/archive/2006/02/20/diff-merge-configuration-in-team-foundation-common-command-and-argument-values.aspx&quot;&gt;configure TFS&#39;s diff tool&lt;/a&gt;.)&lt;/li&gt;&lt;li&gt;In TortoiseSvn, double-click a file name in the &quot;Changes made&quot; panel of the Commit window.&lt;/li&gt;&lt;li&gt;In git and Hg... help me out here. I&#39;m too used to a visual side-by-side. Recommend a nice explanation of getting the most from those in-line diff reports?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;If that seems daunting because there are so many files to review, check in more often. I appreciate the mentors who have drilled into me: small, focused, atomic changes. It keeps me focused on what I&#39;m doing. Make this one change, and every other stray thought that leaps to mind (&quot;Ooh, I need to do &lt;em&gt;this&lt;/em&gt;, too!&quot;) gets tossed in a running text file, to be addressed later. How small is small enough? When it no longer feels onerous to diff all your files before checking in. ;-) In addition to keeping my thought process on-track, this habit makes it easy to review, fix, unwind, and selectively pick certain changes when I need to.&lt;br /&gt;&lt;br /&gt;Small check-ins are like the &lt;a href=&quot;http://www.refactoring.com/catalog/extractMethod.html&quot;&gt;extract-method refactoring&lt;/a&gt;. In code, when you have a collection of statements that &lt;em&gt;do&lt;/em&gt; something, you&#39;d extract them into a method so that you can &lt;em&gt;name&lt;/em&gt; the something. Similarly, a focused check-in can have a descriptive and useful check-in comment.&lt;br /&gt;&lt;br /&gt;The three habits fit together: small check-ins targeting a focused goal, with a useful commit message, reviewing the changes before checking them in. Reduces the number of times I have to think &quot;Who the heck did&amp;mdash;?! Oh, me. Heh.&quot;</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/3035937166107619979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=3035937166107619979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/3035937166107619979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/3035937166107619979'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2011/05/diffing-files-to-avoid-easy-goofs.html' title='Diffing Files to Avoid Easy Goofs'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-5361914762396925550</id><published>2011-03-09T21:10:00.000-06:00</published><updated>2011-03-09T21:12:11.281-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="electronics"/><title type='text'>Microcontroller Projects and Source Code</title><content type='html'>Welcome, &lt;a href=&quot;http://dorkbot.org/dorkbotaustin/2011/03/dorkbot-28-sxsw-2011-science-fair-pesenters/&quot;&gt;Ignite/Dorkbot Science Fair&lt;/a&gt; Party Goers. Here are details on the two projects I had with me at the Science Fair.&lt;br /&gt;&lt;br /&gt;I used the open-source &lt;a href=&quot;http://arduino.cc/&quot;&gt;Arduino microcontroller&lt;/a&gt;. Arduino programs are called &quot;sketches.&quot; I keep my Arduino sketches on the collaborative source-code repository &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;, in my &lt;a href=&quot;https://github.com/scichelli/Arduino-Sketches&quot;&gt;Arduino-Sketches repository&lt;/a&gt;. You can browse the code in a web browser without installing Git, so go check it out. And then learn Git and post your own sketches.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/spyderella/3924009165/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3516/3924009165_7e1bb7167f_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Ambient Clock&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Ambient Clock is an information radiator for the passage of time. It was written up on the &lt;a href=&quot;http://blog.makezine.com/archive/2009/10/ambient-led-flowerpot-clock.html&quot;&gt;Makezine blog&lt;/a&gt;. (&lt;a href=&quot;http://www.flickr.com/photos/spyderella/sets/72157622382205116/&quot;&gt;pictures&lt;/a&gt; | &lt;a href=&quot;https://github.com/scichelli/Arduino-Sketches/tree/master/AmbientClock&quot;&gt;program&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/spyderella/4085499113/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2737/4085499113_a04fefc4d7_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Blinky Eyeball Halloween Costume&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Blinky Eyeball Halloween Nightmare is, um, pretty self-describing. (&lt;a href=&quot;http://www.girlwritescode.com/2009/11/happy-hack-o-ween-electronics-and.html&quot;&gt;write-up&lt;/a&gt; | &lt;a href=&quot;http://www.flickr.com/photos/spyderella/sets/72157622735987434/&quot;&gt;pictures&lt;/a&gt; | &lt;a href=&quot;https://github.com/scichelli/Arduino-Sketches/tree/master/HalloweenEyeballs&quot;&gt;program&lt;/a&gt;)</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/5361914762396925550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=5361914762396925550' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/5361914762396925550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/5361914762396925550'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2011/03/microcontroller-projects-and-source.html' title='Microcontroller Projects and Source Code'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm4.static.flickr.com/3516/3924009165_7e1bb7167f_t.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-4028601229978357555</id><published>2010-12-29T15:24:00.001-06:00</published><updated>2011-07-01T08:47:36.473-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C"/><title type='text'>Hello World in C, Dev Setup</title><content type='html'>As mentioned, &lt;a href=&quot;http://www.girlwritescode.com/2010/12/dipping-into-c.html&quot;&gt;I&#39;m learning C&lt;/a&gt;, and I&#39;ve achieved hello-world, plus recursive calculations of factorials and some data structures. Whee. :) For those playing along at home, I&#39;ll describe my dev setup.&lt;br /&gt;&lt;br /&gt;But first, an unexpected discovery: Counter to my intuition, there&#39;s a beneficial synergy between learning a new editor and learning a new language at the same time. I had thought it would be too many new things to take on at once. I&#39;ve wanted to learn &lt;a href=&quot;http://www.vim.org/&quot;&gt;Vim&lt;/a&gt; for its beautiful efficiency, but its formidable learning curve repels all comers. I couldn&#39;t gain traction. When writing in a language with which I am comfortable (C#, English), my thoughts would run too fast, too far ahead of my rudimentary editor skills, ideas slipping out of my grasp as I stumbled around the text with j, k, h, and l (and never the one I meant). But in C, where I am carefully picking my way over unfamiliar terrain, my lines of code have slowed down to match my fingers. Because I am trying to hang onto only one edit at a time, I can spare a second to check that A will switch me to insert mode at the end of the current line. I recommend it: learning a new language is a good time to learn a new text editor.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Sandbox&lt;/h2&gt;&lt;br /&gt;I use &lt;a href=&quot;http://www.virtualbox.org/&quot;&gt;VirtualBox&lt;/a&gt; to run virtual machines. VMs are excellent for experiment-based learning; think of it: a nice clean server that you can start up, poke and abuse, throw away and start again. If you start with the right VM image&amp;mdash;for example, one &lt;a href=&quot;http://www.turnkeylinux.org/rails&quot;&gt;configured for Ruby on Rails&lt;/a&gt;&amp;mdash;you can jump right into the experimentation without all the installation hoop-jumping.&lt;br /&gt;&lt;br /&gt;For this endeavor I chose &lt;a href=&quot;http://www.turnkeylinux.org/core&quot;&gt;TurnKey Linux&#39;s Core appliance&lt;/a&gt; because it&#39;s just Linux and not much else, following their &lt;a href=&quot;http://www.turnkeylinux.org/docs/installation-appliances-virtualbox&quot;&gt;instructions for installing a TurnKey appliance&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To install a compiler (later), I needed my VM to connect to the internet. In VirtualBox Settings &amp;gt; Network, I set &quot;Attached to&quot; to &quot;Bridged Adapter,&quot; meaning the VM could use my laptop&#39;s connection, and the adapter&#39;s &quot;Name&quot; to my wireless card. (The other choice in the dropdown list is a PCI-E Fast Ethernet Controller, and that... didn&#39;t work.) With that set, I powered up the VM, which starts the webmin console. I let it automatically configure DHCP, and I was internet-ready.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Editor&lt;/h2&gt;&lt;br /&gt;Vim is already installed on the Core VM image, so I just needed to type &quot;vim helloworld.c&quot; to start stumbling around my new code file. I&#39;m relying on the TuXfiles &lt;a href=&quot;http://www.tuxfiles.org/linuxhelp/vimcheat.html&quot;&gt;Vim cheat sheet&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Compiler&lt;/h2&gt;&lt;br /&gt;I chose &lt;a href=&quot;http://gcc.gnu.org/&quot;&gt;GCC, the GNU Compiler Collection&lt;/a&gt; for my C compiler, and I needed to download and install it. Following TurnKey&#39;s &lt;a href=&quot;http://www.turnkeylinux.org/docs/apt-howto&quot;&gt;apt-get instructions&lt;/a&gt;:&lt;ul type=&quot;none&quot;&gt;&lt;li&gt;apt-get update (to update apt&#39;s list of modules)&lt;/li&gt;&lt;li&gt;apt-cache search gcc (to find modules for the gcc compiler - gcc-4.1 looked right.)&lt;/li&gt;&lt;li&gt;apt-cache show gcc-4.1 (to get info about it)&lt;/li&gt;&lt;li&gt;apt-get install gcc-4.1 (to install it)&lt;/li&gt;&lt;li&gt;gcc-4.1 myfile.c -o myexename (to compile and generate myexename executable)&lt;/li&gt;&lt;li&gt;./myexename (to run my program)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Hello World&lt;/h2&gt;&lt;br /&gt;I followed a &lt;a href=&quot;http://www.youtube.com/watch?v=_0_4yiD8_hk&quot;&gt;video that creates and compiles a C program using the GCC compiler&lt;/a&gt;. &quot;Hello, World!&quot; A simple phrase, profoundly satisfying.&lt;br /&gt;&lt;script language=&#39;text/javascript&#39;&gt;custom_slug=&#39;17 /blogs/sharoncichelli/archive/2010/12/29/hello-world-in-c-dev-setup.aspx&#39;;&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/4028601229978357555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=4028601229978357555' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/4028601229978357555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/4028601229978357555'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2010/12/hello-world-in-c-dev-setup.html' title='Hello World in C, Dev Setup'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-3057690064759816368</id><published>2010-12-03T08:11:00.001-06:00</published><updated>2010-12-03T08:12:56.041-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="C"/><title type='text'>Dipping into C</title><content type='html'>I decided on Monday that I should learn C. Cultivate a nodding acquaintance, at any rate. &lt;a href=&quot;http://www.lostechies.com/blogs/louissalin/&quot;&gt;Louis&lt;/a&gt; is always prodding me to become a better craftsman, to become more proficient with my tools. So I figured I should understand my roots.&lt;br /&gt;&lt;br /&gt;I picked up O&#39;Reilly&#39;s &lt;i&gt;&lt;a href=&quot;http://oreilly.com/catalog/9781565924536&quot;&gt;Mastering Algorithms with C&lt;/a&gt;&lt;/i&gt; at the library, and I&#39;m already having fun. It will get into recursion, Big O notation, linked lists, quicksorts, encryption, and all that jazz, but right off the bat, it starts with pointers. &lt;br /&gt;&lt;br /&gt;Immediately some aspects of C# become more clear, by understanding their precursors from C: the ideas behind reference types and passing parameters by reference, and the joys of automatic garbage collection and abstracted memory allocation.&lt;br /&gt;&lt;br /&gt;The syntax of pointers in C involves a lot of punctuation&amp;mdash;a subtle and nuanced application of asterisks and ampersands&amp;mdash;which the book assumes I would already know. My favorite search engine (code-named Sweetie, as in, &quot;Hey, Sweetie, can you find...&quot;) turned up an online edition of &lt;i&gt;&lt;a href=&quot;http://publications.gbdirect.co.uk/c_book/&quot;&gt;The C Book&lt;/a&gt;&lt;/i&gt;, containing this &lt;a href=&quot;http://publications.gbdirect.co.uk/c_book/chapter5/pointers.html&quot;&gt;excellent explanation of pointers&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here&#39;s my understanding so far. Please suggest corrections if I&#39;ve gotten it sideways.&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td style=&quot;border: 1px solid gray;&quot;&gt;int *mypointer;&lt;/td&gt;&lt;td style=&quot;padding-left:1em;&quot;&gt;mypointer&#39;s type is &quot;pointer that can point to an integer&quot;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border: 1px solid gray;&quot;&gt;mypointer = &amp;amp;myint;&lt;/td&gt;&lt;td style=&quot;padding-left:1em;&quot;&gt;mypointer is pointing to the location where myint is stored&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border: 1px solid gray;&quot;&gt;*mypointer = 7;&lt;/td&gt;&lt;td style=&quot;padding-left:1em;&quot;&gt;the place where mypointer is pointing now contains a 7, so myint now equals 7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border: 1px solid gray;&quot;&gt;myotherint = myint;&lt;/td&gt;&lt;td style=&quot;padding-left:1em;&quot;&gt;myotherint also equals 7 (but just a copy of 7, so changes to myint won&#39;t affect myotherint)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;So what? So now I&#39;m clearer about reference types in C#. In C, I can pass a &lt;em&gt;pointer&lt;/em&gt; as a parameter to a function, instead of passing a value. That means I&#39;m passing the function a reference to a location in memory. If the function uses the pointer to change the stuff in that location, when someone else accesses that location, they will receive the changed stuff. Contrast this with passing a value, such as an integer, to a function, which actually passes a copy of the value. Any changes to the value are scoped within the function and are not detectable from outside. It&#39;s something I&#39;ve known for a while, but now I know &lt;em&gt;why&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;If you no longer need the piece of memory that a pointer points to but you fail to de-allocate that memory, it will stay held in reserve forever&amp;mdash;voil&amp;agrave;, a memory leak. Different data types take up different amounts of memory, so writing a data type into a pointer of a differently sized data type will overwrite other pieces of memory in unpredictable ways. I feel like I&#39;ve been making peanut-butter sandwiches with a butter knife and just noticed that other people are wielding samurai swords: looks really powerful and flexible, but I&#39;m scared I&#39;d cut off a finger. Now I get what the big deal is about the CLR&#39;s garbage collector (and how in some contexts it would be too restrictive).&lt;br /&gt;&lt;br /&gt;I&#39;m having fun getting &quot;closer to the metal&quot; and realizing the reasons behind some things I&#39;ve taken for granted. I can&#39;t wait to get into the chapters on algorithms.</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/3057690064759816368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=3057690064759816368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/3057690064759816368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/3057690064759816368'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2010/12/dipping-into-c.html' title='Dipping into C'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-6329402014043200956</id><published>2010-08-30T12:16:00.001-05:00</published><updated>2010-08-30T12:21:27.785-05:00</updated><title type='text'>Three Simple Steps to Improve Your Writing</title><content type='html'>Technical books are longer than they ought to be. Most software books could be improved by shedding a tenth of their heft. It&#39;s a product of market pressures, of course: Tech books need to get to market &lt;em&gt;fast&lt;/em&gt;, which does not allow for the time-consuming labor of honing and refining a text until it is lean and tight. I have a few simple strategies, though&amp;mdash;simple tips that provide a disproportionately beneficial return on a trivial time investment. You can use the following tips to improve your blog posts, books, and presentations.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Replace &quot;basically&quot; with nothing.&lt;/h2&gt;&lt;br /&gt;This word never adds value. It is usually a manifestation of the author&#39;s or speaker&#39;s unconscious concern that what he is explaining is too complex. If time allows, revise the material until your readers don&#39;t need extra convincing that it is basic. At least get rid of the useless word.&lt;br /&gt;&lt;br /&gt;You could have some fun writing a regular expression to correct all instances with a global search-and-replace. If you&#39;re amused by the challenge, please feel free to post your regex in the comments. You&#39;d be helping all of us.&lt;br /&gt;&lt;br /&gt;Here are the replacements your regex would need to catch:&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;Find&lt;/th&gt;&lt;th&gt;Result&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span style=&quot;background-color:#cccccc;&quot;&gt;Basically, i&lt;/span&gt;t can start a sentence.&lt;/td&gt;&lt;td&gt;It can start a sentence.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span style=&quot;background-color:#cccccc;&quot;&gt;Basically p&lt;/span&gt;eople leave off the comma, too.&lt;/td&gt;&lt;td&gt;People leave off the comma, too.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;It can &lt;span style=&quot;background-color:#cccccc;&quot;&gt;basically&amp;nbsp;&lt;/span&gt;appear in the middle.&lt;/td&gt;&lt;td&gt;It can appear in the middle.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;It can&lt;span style=&quot;background-color:#cccccc;&quot;&gt;, basically,&lt;/span&gt; be set off with commas.&lt;/td&gt;&lt;td&gt;It can be set off with commas.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;It can end a sentence&lt;span style=&quot;background-color:#cccccc;&quot;&gt;, basically&lt;/span&gt;.&lt;/td&gt;&lt;td&gt;It can end a sentence.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;It might end without a comma&lt;span style=&quot;background-color:#cccccc;&quot;&gt;&amp;nbsp;basically&lt;/span&gt;.&lt;/td&gt;&lt;td&gt;It might end without a comma.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;h2&gt;Replace &quot;essentially&quot; with nothing.&lt;/h2&gt;&lt;br /&gt;As above.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Replace &quot;is nothing more than&quot; with &quot;is.&quot;&lt;/h2&gt;&lt;br /&gt;The &quot;is nothing more than&quot; construction falls in the category of noisy hedge words. It&#39;s a large category. Folks add words to forestall arguments. Even though it sounds romantically brash&amp;mdash;X is &lt;em&gt;nothing&lt;/em&gt; but Y, #wristforehead&amp;mdash;it actually weakens the association between the subject and its predicate nominative. Be clear; be bold. If you&#39;re trying to define X by saying that it is Y, say that X is Y.&lt;br /&gt;&lt;br /&gt;I wish the industry allowed more time for editing. I wish I were able to help more people express their ideas. Good editing is liberating, plucking the brambles and cruft off a passage until its central theme floats to the fore&amp;mdash;getting the &lt;em&gt;text&lt;/em&gt; out of the way of the &lt;em&gt;writing&lt;/em&gt;. &lt;br /&gt;&lt;br /&gt;I hope you find these tips helpful and easy to implement. Ruthlessly delete useless clutter like &quot;basically,&quot; &quot;essentially,&quot; and &quot;nothing more than.&quot; Let your ideas stand tall.</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/6329402014043200956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=6329402014043200956' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6329402014043200956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6329402014043200956'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2010/08/three-simple-steps-to-improve-your.html' title='Three Simple Steps to Improve Your Writing'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-5440015536542040910</id><published>2010-06-19T20:40:00.007-05:00</published><updated>2010-06-19T20:49:44.802-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Resharper"/><category scheme="http://www.blogger.com/atom/ns#" term="shortcut"/><category scheme="http://www.blogger.com/atom/ns#" term="unit testing"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><title type='text'>ReSharper Shortcut for Context-Sensitive Unit-Test Running</title><content type='html'>For a keyboard shortcut to the context-sensitive ReSharper unit test runner (otherwise available via right-click &amp;gt; Run Unit Tests), map:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;padding-left: 30px;&quot;&gt;ReSharper.ReSharper_UnitTest_ContextRun&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Thanks to &lt;a href=&quot;http://handcraftsman.wordpress.com/&quot;&gt;Clinton&lt;/a&gt; for mentioning it.)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;What This Solves&lt;/h2&gt;&lt;br /&gt;The slowest way to select and run unit tests is to click the green-yellow bubbles in the left margin and pick &quot;Run&quot; (or &quot;Append to Session&quot; to collect a bunch of them to run).&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_2t4fAGyHQn0/TB1zXfBRJXI/AAAAAAAAAAs/GKCjY0Zkxpw/s1600/ResharperTestRunner.png&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;width: 239px; height: 157px;&quot; src=&quot;http://2.bp.blogspot.com/_2t4fAGyHQn0/TB1zXfBRJXI/AAAAAAAAAAs/GKCjY0Zkxpw/s320/ResharperTestRunner.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5484666768508134770&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;From the right-click menu, the &quot;Run Unit Tests&quot; option will run a test if your cursor is in a test, all tests in a fixture if your cursor is outside a test but within the fixture, or all tests in a file if you&#39;re outside any fixtures.&lt;br /&gt;&lt;br /&gt;Mapping the ReSharper.ReSharper_UnitTest_ContextRun to a keyboard shortcut achieves the context-sensitive behavior, mouse free. I chose Alt-T for mine, since that wasn&#39;t in use for anything else. (Have a nice strategy for picking unique keyboard shortcuts and remembering them? Please share in the comments.)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;To Map the Shortcut&lt;/h2&gt;&lt;br /&gt;Tools &amp;gt; Options &amp;gt; Environment &amp;gt; Keyboard. In the &quot;Show commands containing&quot; textbox, enter some or all of the command, and select the command.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_2t4fAGyHQn0/TB1zlwnjyGI/AAAAAAAAAA0/ECpb1a7xuBg/s1600/MapResharperShortcut.png&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;width: 320px; height: 186px;&quot; src=&quot;http://2.bp.blogspot.com/_2t4fAGyHQn0/TB1zlwnjyGI/AAAAAAAAAA0/ECpb1a7xuBg/s320/MapResharperShortcut.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5484667013750311010&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Set your focus to the &quot;Press shortcut keys&quot; textbox and type your shortcut just as if you were invoking it. If a command shows up in the &quot;Shortcut currently used by&quot; list, life will be simpler if you pick a different shortcut. When you have one you like, click &quot;Assign&quot; and &quot;OK.&quot; Good to go!</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/5440015536542040910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=5440015536542040910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/5440015536542040910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/5440015536542040910'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2010/06/resharper-shortcut-for-context.html' title='ReSharper Shortcut for Context-Sensitive Unit-Test Running'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_2t4fAGyHQn0/TB1zXfBRJXI/AAAAAAAAAAs/GKCjY0Zkxpw/s72-c/ResharperTestRunner.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-69451.post-7087268201502074166</id><published>2010-03-18T22:17:00.002-05:00</published><updated>2010-03-18T22:25:09.354-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="rhino mocks"/><category scheme="http://www.blogger.com/atom/ns#" term="unit testing"/><title type='text'>Rhino Mocks Examples, with a fix</title><content type='html'>Jon Kruger created an excellent &lt;a href=&quot;http://jonkruger.com/blog/2010/03/12/how-to-use-rhino-mocks-documented-through-tests/&quot;&gt;explanation of Rhino Mocks, using unit tests&lt;/a&gt; to demonstrate and illuminate the syntax and capabilities. (Found via &lt;a href=&quot;http://twitter.com/gar3t&quot;&gt;@gar3t&lt;/a&gt;.) It needs one small correction, which I&#39;d like to write about here so that I can link to and support Jon&#39;s work, and because it gives the opportunity to clarify a subtle distinction between mocks and stubs and verified expectations.&lt;br /&gt;&lt;br /&gt;First, go check out &lt;a href=&quot;http://github.com/JonKruger/RhinoMocksExamples/raw/master/src/RhinoMocksExamples/RhinoMocksExamples/RhinoMocksTests.cs&quot;&gt;Jon&#39;s code&lt;/a&gt;, then come back here.&lt;br /&gt;&lt;br /&gt;The problem lies in the following test. I can comment out the part that looks like it is satisfying the assertions, yet the test still passes&amp;mdash;a false positive.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-family: Courier New; font-size: 8pt; color: black; background: white; border: 1px solid #ccc; overflow: auto; width:550px;&quot;&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;[&lt;span style=&quot;color: #2b91af;&quot;&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Another_way_to_verify_expectations_instead_of_AssertWasCalled()&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;{&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;var&lt;/span&gt; stub = &lt;span style=&quot;color: #2b91af;&quot;&gt;MockRepository&lt;/span&gt;.GenerateStub&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;ISampleClass&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// Here I&#39;m setting up an expectation that a method will be called&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; stub.Expect(s =&amp;gt; s.MethodThatReturnsInteger(&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;)).Return(5);&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;//Sneaky Sharon comments out the &amp;quot;Act&amp;quot; part of the test:&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;//var output = stub.MethodThatReturnsInteger(&amp;quot;foo&amp;quot;);&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;//Assert.AreEqual(5, output);&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// ... and now I&#39;m verifying that the method was called&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; stub.VerifyAllExpectations();&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;In translation, that test says: Create a fake ISampleClass; set up an expectation that a method will be called; &lt;s&gt;call that method&lt;/s&gt; do nothing; verify that your expectations were met (and flag the test as a failure if they weren&#39;t). Shoot. Worse than not having my expectations met is not realizing they&#39;re not being met. Reminds me of my college boyfriend.&lt;br /&gt;&lt;br /&gt;There are two things to fix here. The first is that this test is a little solipsistic. If you create a mock, tell the mock to act, and verify things about the mock... all you&#39;re testing are mocks. Instead, you want your tests to exercise &lt;em&gt;real&lt;/em&gt; code. The &quot;system under test,&quot; i.e., the class being tested, should be part of your production code. Its dependencies are what get mocked, so that you can verify proper interactions with those dependencies. Let&#39;s fix the solipsism before going on to the second issue.&lt;br /&gt;&lt;br /&gt;As originally written, the expectation would be satisfied by the &quot;Act&quot; (as in Arrange-Act-Assert) part of the test. It says, &quot;Call this method. Did I just call this method? Oh, good.&quot; Instead, you want to ensure the system under test correctly interacts with its friends, using Rhino Mocks&#39; AssertWasCalled and Expect methods. We need a real class that takes the stubbed class and calls a method on the stubbed class, and we&#39;ll write unit tests around the real class.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-family: Courier New; font-size: 8pt; color: black; background: white; border: 1px solid #ccc; overflow: auto; width:550px;&quot;&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MyRealClass&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;{&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; ActOnTheSampleClass(&lt;span style=&quot;color: #2b91af;&quot;&gt;ISampleClass&lt;/span&gt; sampleClass)&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; {&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; }&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Here&#39;s the re-written test, verifying how my real class interacts with the ISampleClass interface.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-family: Courier New; font-size: 8pt; color: black; background: white; border: 1px solid #ccc; overflow: auto; width:550px;&quot;&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;[&lt;span style=&quot;color: #2b91af;&quot;&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Another_way_to_verify_expectations_instead_of_AssertWasCalled()&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;{&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;var&lt;/span&gt; stub = &lt;span style=&quot;color: #2b91af;&quot;&gt;MockRepository&lt;/span&gt;.GenerateStub&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;ISampleClass&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;var&lt;/span&gt; systemUnderTest = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MyRealClass&lt;/span&gt;();&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// Here I&#39;m setting up an expectation that a method will be called&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; stub.Expect(s =&amp;gt; s.MethodThatReturnsInteger(&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;)).Return(5);&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// Tell the system to act (which, if it is working correctly, &lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// will call a method on the ISampleClass.&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; systemUnderTest.ActOnTheSampleClass(stub);&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// ... and now I&#39;m verifying that the method was called&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; stub.VerifyAllExpectations();&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;This test will still pass, despite the fact that my real class does not currently call any methods on the ISampleClass interface. This points to the second issue to fix. In Rhino Mocks, expectations on stubs are not verified; only mocks are verified. If an object is created with GenerateStub instead of GenerateMock, then its VerifyAllExpectations method doesn&#39;t do anything. This is non-obvious because the AssertWasCalled and AssertWasNotCalled methods on a stub &lt;em&gt;will&lt;/em&gt; behave the way you want them to.&lt;br /&gt;&lt;br /&gt;In Rhino Mocks, a stub can keep track of its interactions and assert that they happened, but it cannot record expectations and verify they were met. A mock can do both these things. &lt;br /&gt;&lt;br /&gt;That is how they are implemented in Rhino Mocks. If you were holding firm to the ideas in Fowler&#39;s &lt;a href=&quot;http://martinfowler.com/articles/mocksArentStubs.html&quot;&gt;Mocks Aren&#39;t Stubs&lt;/a&gt; article, I think stubs would implement neither VerifyAll nor AssertWasCalled. Semantically, verifying expectations and asserting interactions are synonymous, if you ask me; therefore, stubs shouldn&#39;t do either one.&lt;br /&gt;&lt;br /&gt;Back to Jon Kruger&#39;s tests. If we call GenerateMock instead of GenerateStub, the test will fail properly with an ExpectationViolationException.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-family: Courier New; font-size: 8pt; color: black; background: white; border: 1px solid #ccc; overflow: auto; width:550px;&quot;&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;[&lt;span style=&quot;color: #2b91af;&quot;&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Another_way_to_verify_expectations_instead_of_AssertWasCalled()&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;{&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;var&lt;/span&gt; stub = &lt;span style=&quot;color: #2b91af;&quot;&gt;MockRepository&lt;/span&gt;.GenerateMock&amp;lt;&lt;span style=&quot;color: #2b91af;&quot;&gt;ISampleClass&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;var&lt;/span&gt; systemUnderTest = &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MyRealClass&lt;/span&gt;();&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// Here I&#39;m setting up an expectation that a method will be called&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; stub.Expect(s =&amp;gt; s.MethodThatReturnsInteger(&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;)).Return(5);&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// Tell the system to act (which, if it is working correctly, &lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// will call a method on the ISampleClass.&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; systemUnderTest.ActOnTheSampleClass(stub);&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: green;&quot;&gt;// ... and now I&#39;m verifying that the method was called&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; stub.VerifyAllExpectations();&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Now that we&#39;re red, let&#39;s get to green. Change the system under test so that it does its job as expected.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-family: Courier New; font-size: 8pt; color: black; background: white; border: 1px solid #ccc; overflow: auto; width:550px;&quot;&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MyRealClass&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;{&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; ActOnTheSampleClass(&lt;span style=&quot;color: #2b91af;&quot;&gt;ISampleClass&lt;/span&gt; sampleClass)&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; {&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; sampleClass.MethodThatReturnsInteger(&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;&amp;nbsp; }&lt;/pre&gt;&lt;pre style=&quot;margin: 0px;&quot;&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Wahoo, a passing test that we can rely on.&lt;br /&gt;&lt;br /&gt;The two key points from this exercise are:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://jonkruger.com/blog/2010/03/12/how-to-use-rhino-mocks-documented-through-tests/&quot;&gt;Describing Rhino Mocks with unit tests&lt;/a&gt; is a cool way to explain a topic. Let&#39;s have more executable documentation, eh?&lt;/li&gt;&lt;li&gt;Expectations on stubs aren&#39;t verified, so beware of falsely passing tests.&lt;/li&gt;&lt;/ol&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.girlwritescode.com/feeds/7087268201502074166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=7087268201502074166' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7087268201502074166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7087268201502074166'/><link rel='alternate' type='text/html' href='http://www.girlwritescode.com/2010/03/rhino-mocks-examples-with-fix.html' title='Rhino Mocks Examples, with a fix'/><author><name>Sharon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>