<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8699851592369026373</id><updated>2011-07-28T21:18:44.155-05:00</updated><category term='buildbot'/><category term='gtk'/><category term='drive-genius'/><category term='fail'/><category term='leopard'/><category term='finally'/><category term='xhost'/><category term='googlefu'/><category term='calculator'/><title type='text'>sugarbot</title><subtitle type='html'>sugarbot's aim is to provide testing and automation facilities for the OLPC Project's Sugar GUI. The project must first identify and evaluate possible implementation options, and then implement the best choice. Although it has a Sugar focus, sugarbot should be easily extensible to other Python-based GUI's.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>91</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-3026854806273478209</id><published>2008-12-16T21:01:00.002-06:00</published><updated>2008-12-16T21:04:15.731-06:00</updated><title type='text'>Un-kludging Code</title><content type='html'>&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;With my new-found free time, I'm going to be going back through Sugarbot with some "fresh" eyes, and hopefully un-kludging some of the code.  One top of that, here is the "short list" of To-Dos:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1.) Test execution inside sugar-jhbuild as a stand-alone activity that emulates other activities.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2.) Enable synchronous execution and GUI updating.  The current model waits for the GUI to initialize and then performs all of the manipulation while the actual drawn GUI is frozen.  All of the behind-the-scenes stuff still works, but you can't see progress as it's happening.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3.) Implement full-auto mode with sugar-jhbuild, so that it can be integrated into the build process.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-3026854806273478209?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/3026854806273478209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=3026854806273478209' title='41 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3026854806273478209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3026854806273478209'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/12/un-kludging-code.html' title='Un-kludging Code'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>41</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-3254771523345655183</id><published>2008-09-01T10:17:00.003-05:00</published><updated>2008-09-01T10:20:11.084-05:00</updated><title type='text'>Screencast, 0.1 Release</title><content type='html'>I've managed to finally get the screencast and 0.1 release published.  You can find it in the usual place, on the &lt;a href="http://code.google.com/p/sugarbot/"&gt;sugarbot Google Code site&lt;/a&gt;.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This screencast showcases a lot of the automation of sugar/sugarbot, with a small demonstration of how Python is used inside of sugarbot.  There is also emphasis on catching errors when they occur, and how those errors are reported/displayed.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The example scripts provide a better demonstration of how the scripting works than the video could have, so I left most of the scripting details out (it is just Python anyways, so it's not very exciting).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-3254771523345655183?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/3254771523345655183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=3254771523345655183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3254771523345655183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3254771523345655183'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/09/screencast-01-release.html' title='Screencast, 0.1 Release'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-2275647777006020763</id><published>2008-08-18T00:11:00.003-05:00</published><updated>2008-08-18T00:12:09.299-05:00</updated><title type='text'>Finalizing...</title><content type='html'>I am trying to get the final screencast properly edited and dubbed, and will be putting the 0.01 package online soon.  It has been quite the day for me, as Murphy's Law would have it, everything decided to go more then slightly haywire when I decided to record video :-\&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-2275647777006020763?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/2275647777006020763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=2275647777006020763' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2275647777006020763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2275647777006020763'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/08/finalizing.html' title='Finalizing...'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-5973722270447923660</id><published>2008-08-13T11:16:00.003-05:00</published><updated>2008-08-13T11:23:25.686-05:00</updated><title type='text'>Combo boxes working, wrapping up</title><content type='html'>Got the combo-boxes working the way I want them to.  I realized that convenience-handling for each and every Widget type is not something that is [1] perhaps not entirely necessary and [2] certainly not entirely necessary &lt;i&gt;right this instant&lt;/i&gt;.  With that in mind, I'll be wrapping up/documenting the code for an initial 0.1 release on Friday.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll be working on another screencast that will demonstrate integration with buildbot, automated launching of sugarbot and Sugar, as well as the new Python scripting abilities.  Overall, I'm very pleased with where I am right now.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's been a lot of fun developing for GSoC/the Python Org/One Laptop Per Child, and I'm sad to see the summer come to an end (less free time to work on it) in the next few weeks.  Hopefully I'll be able to keep my motivation up to keep development going.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once I have the GSoC-final screencast up, I plan on publishing it to all of the mailing lists.  Thanks to Grig and Titus for providing me with guidance and advice throughout the summer, you guys are really great.  Also, thanks to those of you on the mailing lists and IRC channels that also provided tips, insight, and advice that made those obscure API problems so much simpler.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Zach&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-5973722270447923660?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/5973722270447923660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=5973722270447923660' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5973722270447923660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5973722270447923660'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/08/combo-boxes-working-wrapping-up.html' title='Combo boxes working, wrapping up'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-7189488546712550178</id><published>2008-08-11T00:52:00.000-05:00</published><updated>2008-08-11T00:53:31.577-05:00</updated><title type='text'>ComboBox'es</title><content type='html'>Working on select capability of ComboBox and similar widgets tonight.  It isn't a problem in itself, but trying to keep the code as flexible and clean as possible is making it into a problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-7189488546712550178?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/7189488546712550178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=7189488546712550178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7189488546712550178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7189488546712550178'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/08/comboboxes.html' title='ComboBox&apos;es'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-5032698197920341457</id><published>2008-08-05T17:55:00.007-05:00</published><updated>2008-08-05T18:11:38.526-05:00</updated><title type='text'>Cleaning up logging functionality</title><content type='html'>&lt;p&gt;Cleaning up a bit of the logging functionality on the RPC-server side of stuff.  Most of it has to do with better correlation of individual clients with given status messages.  A small side-effect of this is that pinpointing errors should be easier.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Old Output:&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;sbRpcServer : INFO     Listening on port 54321&lt;br /&gt;sbRpcServer : INFO     Kill: True Restart: True&lt;br /&gt;sbRpcServer : INFO     Added script sbpython_script.py [Activity Calculate]&lt;br /&gt;sbRpcServer : INFO     Serving script sbpython_script.py to client Zach&lt;br /&gt;sbRpcServer : ERROR    sugarbot client disconnected prematurely.&lt;br /&gt;sbRpcServer : ERROR    Reason: Execution failed: Traceback (most recent call last):&lt;br /&gt;File "/home/zach/Activities/sugarbot.activity/sbexecutionengine.py", line 92, in executePy&lt;br /&gt; sugarbot_main(self.widgets)&lt;br /&gt;File "[string]", line 7, in sugarbot_main&lt;br /&gt;AssertionError&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;New Output:&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;sbRpcServer : INFO     Listening on port 54321&lt;br /&gt;sbRpcServer : INFO     Kill: True Restart: True&lt;br /&gt;sbRpcServer : INFO     Added script sbpython_script.py [Activity Calculate]&lt;br /&gt;Zach        : INFO     Starting sbpython_script.py&lt;br /&gt;Zach        : INFO     Success (sbpython_script.py)&lt;br /&gt;Zach        : INFO     Disconnected [1\1\1]&lt;br /&gt;Zach        : INFO     Starting script sbpython_script.py&lt;br /&gt;Zach        : ERROR    Execution failed:&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;File "/home/zach/Activities/sugarbot.activity/sbexecutionengine.py", line 92, in executePy&lt;br /&gt; sugarbot_main(self.widgets)&lt;br /&gt;File "Sugarbot Script: 'sbpython_script.py'", line 7, in sugarbot_main&lt;br /&gt;AssertionError&lt;br /&gt;&lt;br /&gt;Zach        : INFO     Disconnected [0\1\1]&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-5032698197920341457?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/5032698197920341457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=5032698197920341457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5032698197920341457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5032698197920341457'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/08/cleaning-up-logging-functionality.html' title='Cleaning up logging functionality'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-5602201384350424435</id><published>2008-08-05T14:32:00.001-05:00</published><updated>2008-08-05T14:34:10.932-05:00</updated><title type='text'>Hurricane</title><content type='html'>Supposedly there's a decent-sized tropical storm/hurricane coming through right now, but it just looks like a bunch of regular old rain.  Anyways, campus is shut down today, so I get some time to work on Sugarbot.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next Tuesday I fly back out to the [Government Agency] to take my polygraph tests again.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-5602201384350424435?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/5602201384350424435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=5602201384350424435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5602201384350424435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5602201384350424435'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/08/hurricane.html' title='Hurricane'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-8662333955279182944</id><published>2008-08-04T00:01:00.002-05:00</published><updated>2008-08-04T20:05:36.383-05:00</updated><title type='text'></title><content type='html'>With the half-hour runs, everything is still running fine with Buildbot.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Update&lt;/b&gt;: Looks like there were about 30 half-hour runs of Buildbot that went by just fine.  I don't know why it was crashing at the 6-hour mark and thereafter.  Must have been something weird.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-8662333955279182944?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/8662333955279182944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=8662333955279182944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/8662333955279182944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/8662333955279182944'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/08/with-half-hour-runs-everything-is-still.html' title=''/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-2933756744232678562</id><published>2008-08-03T21:20:00.003-05:00</published><updated>2008-08-03T21:23:28.622-05:00</updated><title type='text'>DBUS problem time-related?</title><content type='html'>I changed the buildbot master.cfg to have the slave run every minute... so far I've got 10 runs in a row without issues.  However, the last time buildbot was started (using the same SVN revision) it ran correctly the first time, then DBUS went crazy when it ran again 6 hours later.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll change it to 30 minutes and see how it fares overnight.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hmm.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-2933756744232678562?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/2933756744232678562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=2933756744232678562' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2933756744232678562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2933756744232678562'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/08/dbus-problem-time-related.html' title='DBUS problem time-related?'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-9111136341965434857</id><published>2008-08-03T20:53:00.005-05:00</published><updated>2008-08-03T21:13:17.448-05:00</updated><title type='text'>DBUS Flaking Out</title><content type='html'>It looks like DBUS starts flaking out after a few runs inside of buildbot.  No idea what's causing the issue, as the trace doesn't involve my code at all.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ERROR:dbus.proxies:Introspect error on org.laptop.ActivityRegistry:/org/laptop/ActivityRegistry:&lt;br /&gt;dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NoReply: Did not receive a reply. Possible causes include:&lt;br /&gt;the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout&lt;br /&gt;expired, or the network connection was broken.&lt;br /&gt;DEBUG:dbus.proxies:Executing introspect queue due to error&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt; File "/usr/share/sugar/shell/view/Shell.py", line 98, in _start_journal_idle&lt;br /&gt;   if registry.get_activity('org.laptop.JournalActivity'):&lt;br /&gt; File "/usr/lib/python2.5/site-packages/sugar/activity/registry.py", line 114, in get_activity&lt;br /&gt;   info_dict = self._registry.GetActivity(service_name)&lt;br /&gt; File "/var/lib/python-support/python2.5/dbus/proxies.py", line 68, in __call__&lt;br /&gt;   return self._proxy_method(*args, **keywords)&lt;br /&gt; File "/var/lib/python-support/python2.5/dbus/proxies.py", line 140, in __call__&lt;br /&gt;   **keywords)&lt;br /&gt; File "/var/lib/python-support/python2.5/dbus/connection.py", line 607, in call_blocking&lt;br /&gt;   message, timeout)&lt;br /&gt;dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NoReply: Did not receive a reply. Possible causes include:&lt;br /&gt;the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout&lt;br /&gt;expired, or the network connection was broken.&lt;br /&gt;ERROR:dbus.proxies:Introspect error on org.laptop.Clipboard:/org/laptop/Clipboard: dbus.exceptions.DBusException:&lt;br /&gt;org.freedesktop.DBus.Error.NoReply: Did not receive a reply. Possible causes include: the remote application did not&lt;br /&gt;send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network&lt;br /&gt;connection was broken.&lt;br /&gt;DEBUG:dbus.proxies:Executing introspect queue due to error&lt;br /&gt;ERROR:root:Error getting activities async: org.freedesktop.DBus.Error.NoReply: Did not receive a reply. Possible&lt;br /&gt;causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the&lt;br /&gt;reply timeout expired, or the network connection was broken.&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-9111136341965434857?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/9111136341965434857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=9111136341965434857' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/9111136341965434857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/9111136341965434857'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/08/dbus-flaking-out.html' title='DBUS Flaking Out'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-7569869190037249006</id><published>2008-08-02T17:25:00.004-05:00</published><updated>2008-08-02T18:08:58.764-05:00</updated><title type='text'>Latest Changes</title><content type='html'>When Buildbot is allowed to run for an extended period of time (read: more than a few runs), I get a pretty cryptic error message (if you have the slightest clue what this means, please do tell):&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Times;"&gt;&lt;pre style="word-wrap: break-word; white-space: pre-wrap; "&gt;/bin/sh: /usr/share/sugar/shell/sugarbot-launcher.py: Host is down&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Buildbot is now available here: &lt;a href="http://zachriggle.is-a-geek.org:8010/" style="text-decoration: none;"&gt;http://zachriggle.is-a-geek.org:8010/&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-7569869190037249006?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/7569869190037249006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=7569869190037249006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7569869190037249006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7569869190037249006'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/08/latest-changes.html' title='Latest Changes'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-7812733023363892830</id><published>2008-07-31T23:35:00.002-05:00</published><updated>2008-07-31T23:39:36.661-05:00</updated><title type='text'>Crunchtime</title><content type='html'>The profs are really coming down hard on us at UH, as we are soon to enter the last week.  Today I was writing code/debugging for UH for about 14 hours... didn't have time for Sugarbot.  Yesterday was slightly more productive, but nothing pronounced.  I don't expect that this weekend/next week will allow me to put in the number of hours I'd like to, but I'll be able to make up for that in the last week or so (I fly home on the 9th).  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even though there is a "pencils down" the week after that, I don't really intend to stop developing for Sugarbot anytime in the immediate future.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(Go figure, Google's whole plan of getting people involved in the FOSS community worked.)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-7812733023363892830?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/7812733023363892830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=7812733023363892830' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7812733023363892830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7812733023363892830'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/crunchtime.html' title='Crunchtime'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-3419000417325172125</id><published>2008-07-28T22:44:00.002-05:00</published><updated>2008-07-28T22:46:17.777-05:00</updated><title type='text'>Trying to keep it pretty...</title><content type='html'>I'm working on the sbpython.py code, trying to implement more functionality (manipulating the title explicitly, the selected entries in a ComboBox, focus, delete/backspace).  Keeping the code coherent is kind of a pain, since there isn't an obvious way to keep some of the code from being duplicated.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hmm.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-3419000417325172125?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/3419000417325172125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=3419000417325172125' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3419000417325172125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3419000417325172125'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/trying-to-keep-it-pretty.html' title='Trying to keep it pretty...'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-5838959356574511666</id><published>2008-07-27T20:38:00.004-05:00</published><updated>2008-12-10T14:26:58.156-06:00</updated><title type='text'>It's Alive!!!</title><content type='html'>&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Sugarbot/buildbot integration is complete.  I only have one port opened on the box that it's running on, but you can access it here: &lt;a href="http://129.7.243.13:22"&gt;http://129.7.243.13:22&lt;/a&gt;.  To access that with Firefox, you need to &lt;a href="http://kb.mozillazine.org/Network.security.ports.banned.override"&gt;change a setting&lt;/a&gt;.  I'm working on getting a different port opened.&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_A95zAiNZLCo/SI0kwl71QOI/AAAAAAAAAHU/XZDSyOxykZc/s1600-h/Picture+2.png"&gt;&lt;img src="http://3.bp.blogspot.com/_A95zAiNZLCo/SI0kwl71QOI/AAAAAAAAAHU/XZDSyOxykZc/s200/Picture+2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5227875159682400482" style="cursor: pointer; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-5838959356574511666?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/5838959356574511666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=5838959356574511666' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5838959356574511666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5838959356574511666'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/its-alive.html' title='It&apos;s Alive!!!'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_A95zAiNZLCo/SI0kwl71QOI/AAAAAAAAAHU/XZDSyOxykZc/s72-c/Picture+2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-427156345971690672</id><published>2008-07-23T15:37:00.003-05:00</published><updated>2008-07-23T15:41:49.124-05:00</updated><title type='text'>Mutliple Clients, Return Status</title><content type='html'>Sugarbot's XML-RPC server should now support multiple clients.  Clients are identified by either an integer or string, which is supplied by an environment variable.  This way, failing clients can easily be identified.  Alternatively, they can be assigned a random number for the session ID.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The sugarbot-launcher script also works the part, and grabs the completion status from the XML-RPC server and returns whatever value it should (0 if there were no failures, 1 if there were).  This &lt;i&gt;should&lt;/i&gt; allow sugarbot to be used with buildbot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Update&lt;/b&gt;: The code will be on SVN shortly.  Looks like Google is doing maintenance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-427156345971690672?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/427156345971690672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=427156345971690672' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/427156345971690672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/427156345971690672'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/mutliple-clients-return-status.html' title='Mutliple Clients, Return Status'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-4551118629025527868</id><published>2008-07-22T23:27:00.003-05:00</published><updated>2008-07-22T23:30:17.668-05:00</updated><title type='text'>Multiple Clients</title><content type='html'>Trying to get the RPC-server set up to handle multiple clients.  This will allow me to request return statuses from the RPC-server to return via the sugarbot-launcher... which in turn allows the whole sugarbot/buildbot thing to work.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yaaay! &lt;/sarcasm&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-4551118629025527868?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/4551118629025527868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=4551118629025527868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4551118629025527868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4551118629025527868'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/multiple-clients.html' title='Multiple Clients'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-6239287788064471777</id><published>2008-07-20T20:16:00.009-05:00</published><updated>2008-07-20T20:26:38.758-05:00</updated><title type='text'>Big Changes</title><content type='html'>Some extremely large changes today.  The old system has been completely removed (all of the manual-parsing stuff) and replaced with the native Python stuff.  I have most of the stuff for buildbot reporting in place, but have not finished it yet.  I need to re-do a bunch of the nose-testing stuff tonight before I get too far along.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For comparison, here is the first demo script.  Much easier to use, less error-prone, and is overall &lt;b&gt;&lt;i&gt;actually useful&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;sugarActivityName = 'Calculate'&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;def sugarbot_main(widgets):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;one &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;= widgets['1']&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;plus &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;= widgets['+']&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;enter &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;= widgets['enter']&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;one.click()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;plus.click()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;one.click()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;enter.click()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;widgets['TextEntry'].text = "1+5"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;assert widgets['TextEntry'].text == '1+5'&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;enter.click()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-6239287788064471777?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/6239287788064471777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=6239287788064471777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6239287788064471777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6239287788064471777'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/big-changes.html' title='Big Changes'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-6200506892976657357</id><published>2008-07-20T13:51:00.002-05:00</published><updated>2008-07-20T13:51:54.754-05:00</updated><title type='text'>Inheritance</title><content type='html'>Evidently, for properties to work ... properly ... the class has to inherit from the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;object&lt;/span&gt; base class.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-6200506892976657357?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/6200506892976657357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=6200506892976657357' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6200506892976657357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6200506892976657357'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/inheritance.html' title='Inheritance'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-5915359316366092808</id><published>2008-07-19T22:18:00.004-05:00</published><updated>2008-07-19T22:20:23.156-05:00</updated><title type='text'></title><content type='html'>Somebody please tell me why the following code does not work as one would expect (that is, printing out text when setting/getting someASDF.text):&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;div&gt;class asdf:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;def click(self):&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;print "click"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;def getText(self):&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;print "getText"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;def setText(self, val):&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;print "setText"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;text = property(lambda self: self.getText(), lambda self, v: self.setText(v))&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-5915359316366092808?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/5915359316366092808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=5915359316366092808' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5915359316366092808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5915359316366092808'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/somebody-please-tell-me-why-following.html' title=''/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-6064060319126590821</id><published>2008-07-18T11:39:00.003-05:00</published><updated>2008-07-18T11:41:18.293-05:00</updated><title type='text'>So Close!</title><content type='html'>So very, very close.  Just trying to get the text-setting/getting properties to work.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For comparison purposes, here is a script that uses native Python:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;one &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;= widgets['1']&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;plus &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;= widgets['+']&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;enter &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;= widgets['enter']&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;one.click()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;plus.click()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;one.click()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;enter.click()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;textEntry = widgets['TextEntry']&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;textEntry.text = "1+5"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;assert textEntry.text.beginswith('1')&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;enter.click()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-6064060319126590821?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/6064060319126590821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=6064060319126590821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6064060319126590821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6064060319126590821'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/so-close.html' title='So Close!'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-681876031177399204</id><published>2008-07-18T01:40:00.002-05:00</published><updated>2008-07-18T01:40:59.191-05:00</updated><title type='text'>Missing Something</title><content type='html'>In the process of transitioning from the custom-parsed sugarbot scripts to a &lt;b&gt;much &lt;/b&gt;simpler system using the native Python parser.  A few hiccups, but I should have things sorted out soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-681876031177399204?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/681876031177399204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=681876031177399204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/681876031177399204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/681876031177399204'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/missing-something.html' title='Missing Something'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-6263498872519106866</id><published>2008-07-16T16:08:00.003-05:00</published><updated>2008-07-16T16:09:54.106-05:00</updated><title type='text'>Sugarbot Diagram</title><content type='html'>I created a small diagram that shows most of the high-level functionality of Sugarbot today for a friend, and thought it would be beneficial to share it with all interested parties.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.flickr.com/photos/zachriggle/2675458896/sizes/o/"&gt;&lt;img src="http://farm4.static.flickr.com/3259/2675458896_064de9e2da_o_d.png" border="0" alt="" style="cursor: pointer; width: 200px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-6263498872519106866?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/6263498872519106866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=6263498872519106866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6263498872519106866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6263498872519106866'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/sugarbot-diagram.html' title='Sugarbot Diagram'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-4843220693061822638</id><published>2008-07-15T17:59:00.003-05:00</published><updated>2008-07-15T18:01:57.421-05:00</updated><title type='text'>Stateful XML-RPC Server</title><content type='html'>Ironed out some bugs with the instantiation of the sugarbot activity in some corner cases.  Now I'm working on the XMLRPC server implementation to be able to handle sessions.  Looking for a graceful way to do it so that I can just use a mix-in with the ServerProxy class and not have to do any modification beyond that.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Essentially, I want to be able to automate do the following&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;someObject.setValue(foo)&lt;/div&gt;&lt;div&gt;someObject.someMethod(bar) === someObject.someMethod(foo,bar)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It looks like the __call__ property may be able to help me out with this.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-4843220693061822638?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/4843220693061822638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=4843220693061822638' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4843220693061822638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4843220693061822638'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/stateful-xml-rpc-server.html' title='Stateful XML-RPC Server'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-8498597815962712654</id><published>2008-07-12T21:37:00.001-05:00</published><updated>2008-07-12T21:38:31.633-05:00</updated><title type='text'>Full automation</title><content type='html'>When launching sugar-emulator with environment variable SUGARBOT_EMULATOR set, automatically launches Sugarbot.  When the Sugarbot activity closes, it is re-launched if there are other scripts that still need to be executed.  Once execution of the scripts are complete, the Sugar shell is killed (SIGTERM).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SVN revision 81 has the goods. (modded-main.py is the replacement for shell/main.py)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-8498597815962712654?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/8498597815962712654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=8498597815962712654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/8498597815962712654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/8498597815962712654'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/full-automation.html' title='Full automation'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-4062963537340291379</id><published>2008-07-12T18:22:00.006-05:00</published><updated>2008-07-12T20:18:29.543-05:00</updated><title type='text'>Automated Launching: Go!</title><content type='html'>Using just about the most obscure Python code I have &lt;b&gt;ever &lt;/b&gt;written, I have just made sugarbot fully automatable.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It requires a small patch to main.py in the main Sugar directory (/usr/share/sugar/shell/main.py), and adding a file to the same directory.  It launches sugarbot by simulating a click on the sugarbot icon in the frame.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Will put the code up on SVN later, it's Pizza time now!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Important Code:&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;# &lt;hack&gt;=========================================================&lt;/hack&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;# The magnitude of this hack compares favorably with the&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;# current national debt.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;boxChildren = self.shell.get_frame()._bottom_panel._bg.get_children()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;tray = [k for k in boxChildren if isinstance(k,ActivitiesTray)]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;if tray:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;  &lt;/span&gt;children = tray[0]._tray.get_children()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;else:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;  &lt;/span&gt;return&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;activities = [k for k in children if isinstance(k, ActivityButton)]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;sbList = [k for k in activities if k._activity_info.name=="sugarbot"]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;# ========================================================&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;if len(sbList) &gt; 0:   sbList[0].emit('clicked') &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;main.py patch:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;model = ShellModel()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;shell = Shell(model)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;service = ShellService(shell)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;if os.environ.has_key("SUGARBOT_EMULATOR"):&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;  from sugarbotlauncher import SugarbotLauncher&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;  sbLauncher = SugarbotLauncher(model,shell,service)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;try:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  gtk.main()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;except KeyboardInterrupt:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  print 'Ctrl+C pressed, exiting...'&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-4062963537340291379?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/4062963537340291379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=4062963537340291379' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4062963537340291379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4062963537340291379'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/automated-launching-go.html' title='Automated Launching: Go!'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-3909310936070346371</id><published>2008-07-12T13:11:00.001-05:00</published><updated>2008-07-12T13:11:01.870-05:00</updated><title type='text'>Launching Activities Automatically
</title><content type='html'>Haven't found a hooking point yet, but I've gound out the API call to launch the activities.&lt;br /&gt;&lt;br /&gt;sugar.activity.activityfactory.create(...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-3909310936070346371?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/3909310936070346371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=3909310936070346371' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3909310936070346371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3909310936070346371'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/launching-activities-automatically.html' title='Launching Activities Automatically&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-6863685380972283614</id><published>2008-07-11T17:36:00.004-05:00</published><updated>2008-07-11T18:12:02.707-05:00</updated><title type='text'>Mid-Summer Screencast</title><content type='html'>The screencast is up &lt;a href="http://code.google.com/p/sugarbot/downloads/detail?name=Screen%20Cast.mp4&amp;amp;can=2&amp;amp;q=#makechanges"&gt;here&lt;/a&gt; [mp4] and &lt;a href="http://code.google.com/p/sugarbot/downloads/detail?name=Screen%20Cast.avi&amp;amp;can=2&amp;amp;q="&gt;here&lt;/a&gt; [avi].&lt;div&gt;The SVN repo has been updated to use the same code as the screencast (r77).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Accomplishments thus far:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Masquerading as any Activity while retaining all functionality&lt;/li&gt;&lt;li&gt;Hooks into PyGTK library to intercept GDK Events to catalog widgets&lt;/li&gt;&lt;li&gt;Intelligent identification of widgets based on widget class to give each widget a unique identifier&lt;/li&gt;&lt;li&gt;Manipulation of many types of widgets using generic commands like 'click' and 'type'&lt;/li&gt;&lt;li&gt;Multithreaded execution routine prevents hang-ups (prior versions would stall once the calls to the GTK handler stopped due to inactivity)&lt;/li&gt;&lt;li&gt;Custom scripting language with support for advanced string manipulation [will soon be replaced by native Python code]&lt;/li&gt;&lt;li&gt;XML-RPC client/server interface allows the scripts to be stored on a central machine, while sugarbot may be run on any number of slaves.&lt;/li&gt;&lt;li&gt;Per-command status reporting and graceful error handling&lt;/li&gt;&lt;li&gt;Does not rely on any libraries or modules outside those already provided by Sugar and Python&lt;/li&gt;&lt;li&gt;Automated testing provided via &lt;a href="http://buildbot.net/trac"&gt;buildbot&lt;/a&gt; and &lt;a href="http://code.google.com/p/python-nose/"&gt;python-nose&lt;/a&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have fun!&lt;/div&gt;&lt;div&gt;Questions, comments, and rants are welcome and appreciated.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-6863685380972283614?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/6863685380972283614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=6863685380972283614' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6863685380972283614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6863685380972283614'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/mid-summer-screencast.html' title='Mid-Summer Screencast'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-6937129465782451468</id><published>2008-07-10T21:13:00.001-05:00</published><updated>2008-07-10T21:14:32.739-05:00</updated><title type='text'>WTFBBQ</title><content type='html'>So the problem is absolutely, 100% NOT with my code.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Running the example Activity &lt;a href="http://cartwheel.idyll.org/wiki/SugarStuffForUSC"&gt;here&lt;/a&gt; does NOT produce the "Hello World" output when the button is clicked.  Changing the 'log.info' statement to a 'print' statement makes it work just fine.  The logging module is broken or otherwise not functioning with the latest sugar packages on Ubuntu 8.04.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-6937129465782451468?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/6937129465782451468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=6937129465782451468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6937129465782451468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6937129465782451468'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/wtfbbq.html' title='WTFBBQ'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-4375335296288897734</id><published>2008-07-10T19:12:00.003-05:00</published><updated>2008-07-10T19:21:51.966-05:00</updated><title type='text'>ScreenFlick</title><content type='html'>With the upcoming mid-summer review, it's time to throw together a screencast and show off all that sugarbot can do.  I've found a piece of software, &lt;a href="http://www.araelium.com/screenflick/"&gt;ScreenFlick&lt;/a&gt;, which allows me to do just that, and to do so pretty easily.  It's only for Mac OS X, and keeps the interface simple (just the way I like it).  It supports some nifty features, standard stuff following the mouse, variable framerate, lossless video compression, as well as some nicer options (a visual indicator for mouse-clicks, visual indicators for keyboard activity).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some screenshots...&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.araelium.com/screenflick/screenshots/screen_tran_75.png"&gt;&lt;img src="http://www.araelium.com/screenflick/screenshots/screen_tran_75.png" border="0" alt="" style="cursor: pointer; width: 200px; " /&gt;&lt;/a&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px;" src="http://www.araelium.com/screenflick/screenshots/prefs_interf_tran_75.png" border="0" alt="" /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.araelium.com/screenflick/screenshots/selection-fit.jpg"&gt;&lt;img src="http://www.araelium.com/screenflick/screenshots/selection-fit.jpg" border="0" alt="" style="cursor: pointer; width: 200px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The software is pretty self-explanatory, and saves the videos in .MOV format, so you can easily edit things together in Quicktime Pro.  Once I'm all done, I'll probably convert the files into MP4 with &lt;a href="http://www.techspansion.com/visualhub/"&gt;VisualHub&lt;/a&gt;, another nice utility (which I generally use to convert videos to be iPod-compatible).&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-4375335296288897734?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/4375335296288897734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=4375335296288897734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4375335296288897734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4375335296288897734'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/screenflick.html' title='ScreenFlick'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-5994684076904056547</id><published>2008-07-08T19:33:00.000-05:00</published><updated>2008-07-08T19:34:31.875-05:00</updated><title type='text'>O ya</title><content type='html'>It's my (20th) birthday.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-5994684076904056547?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/5994684076904056547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=5994684076904056547' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5994684076904056547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5994684076904056547'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/o-ya.html' title='O ya'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-6391087603242778102</id><published>2008-07-08T17:18:00.001-05:00</published><updated>2008-07-08T17:18:41.148-05:00</updated><title type='text'>Wierd logging issue...
</title><content type='html'>When I was doing the screencast today, I went to show that the logs were cataloging all of the identifiable Widgets... but for whatever reason, the logs were mostly empty.  I reverted to r59 (my demo version), and the logs were *still* empty.  So I deleted ~/.sugar/*... *still* no logs.  Dunno what's going on, just kind of bizarre.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-6391087603242778102?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/6391087603242778102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=6391087603242778102' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6391087603242778102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6391087603242778102'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/wierd-logging-issue.html' title='Wierd logging issue...&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-7692919831983096858</id><published>2008-07-08T00:20:00.006-05:00</published><updated>2008-07-08T00:24:48.410-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='googlefu'/><category scheme='http://www.blogger.com/atom/ns#' term='xhost'/><category scheme='http://www.blogger.com/atom/ns#' term='finally'/><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><title type='text'>Woot?</title><content type='html'>sudo xhost +&lt;br /&gt;&lt;br /&gt;Well that was pretty friggin simple.  Only a few *hours* of Googling for that one.  The buildbot is not yet publicly accessible, but it now runs all 70 tests just fine.  My Google-fu has truly failed me :-(.  In my defense, I did find the solution earlier, but the prior finds didn't mention that the "xhost +" command had to be run as root.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Zach's to-do list:&lt;/div&gt;&lt;div&gt;[x] Fix issue with current buildbot&lt;/div&gt;&lt;div&gt;[ ] Screencast&lt;/div&gt;&lt;div&gt;[ ] Start sugarbot automatically&lt;/div&gt;&lt;div&gt;[ ] Automated testing using buildbot/scripted sugarbot&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-7692919831983096858?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/7692919831983096858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=7692919831983096858' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7692919831983096858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7692919831983096858'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/woot.html' title='Woot?'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-6107206630412178826</id><published>2008-07-07T23:10:00.004-05:00</published><updated>2008-07-08T00:21:35.160-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='buildbot'/><title type='text'>Buildbot is [almost] working</title><content type='html'>So I got buildbot up-and-running last night, and have been troubleshooting a few problems with importing some of the Sugar functionality.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is what I get: &lt;a href="http://pastebin.com/f3a9a3a21"&gt;link&lt;/a&gt; (don't want to clutter the blog with a huge output).  Essentially, test_sugarbot, test_sbgui, and test_widgetIdentifier are totally skipped.  What is unique to these files is that the files they import from rely on Sugar (for example, importing sugar.activity.Activity or sugar.graphics).  The issue is the same line in each case:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  File "/usr/lib/python2.5/site-packages/sugar/graphics/style.py", line 38, in _get_screen_dpi&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    xft_dpi = gtk.settings_get_default().get_property('gtk-xft-dpi')&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;AttributeError: 'NoneType' object has no attribute 'get_property'&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unfortunately, that doesn't tell me much.  I can speculate that the issue is that the buildbot-user does not have an actual X display allocated, and that Sugar is choking trying to figure out the DPI of the screen.  This is pretty evident when looking above the errors:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;/var/lib/python-support/python2.5/gtk-2.0/gtk/__init__.py:72: GtkWarning: could not open display&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  warnings.warn(str(e), _gtk.Warning)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unfortunately, my Google-fu fails me finding anything that is relevant regarding gtk-xft-dpi, and there are way too many results for "GtkWarning: could not open display".&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-6107206630412178826?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/6107206630412178826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=6107206630412178826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6107206630412178826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6107206630412178826'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/buildbot-is-almost-working.html' title='Buildbot is [almost] working'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-7310286545298167931</id><published>2008-07-06T17:17:00.001-05:00</published><updated>2008-07-06T17:17:08.978-05:00</updated><title type='text'>Buildbot Up and Running
</title><content type='html'>Buildbot is up and running, although not all of the tests will run (yet they run fine when executed manually).  I believe that it has something to do with the fact that Sugar expects a display to be present, even when you just do:&lt;br /&gt;&lt;br /&gt;from sugar.graphics import Palette&lt;br /&gt;&lt;br /&gt;I don't have a machine that I can put the buildbot on that can be accessed remotely (yet), but I should have a shiny new Dell any day now (it was ordered ~3 weeks ago) for my work with Univ. of Houston that I can throw a buildbot on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-7310286545298167931?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/7310286545298167931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=7310286545298167931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7310286545298167931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7310286545298167931'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/buildbot-up-and-running.html' title='Buildbot Up and Running&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-6210804347418698084</id><published>2008-07-03T20:36:00.001-05:00</published><updated>2008-07-03T20:36:12.423-05:00</updated><title type='text'>Ideas???  Buildbot complains...
</title><content type='html'>Following twistd.log until startup finished..&lt;br /&gt;2008/07/03 20:26 CDT [-] Log opened.&lt;br /&gt;2008/07/03 20:26 CDT [-] twistd 2.2.0 (/usr/bin/python 2.5.2) starting up&lt;br /&gt;2008/07/03 20:26 CDT [-] reactor class: twisted.internet.selectreactor.SelectReactor&lt;br /&gt;2008/07/03 20:26 CDT [-] Loading buildbot.tac...&lt;br /&gt;2008/07/03 20:26 CDT [-] Loaded.&lt;br /&gt;2008/07/03 20:26 CDT [-] loading configuration from /home/buildmaster/APP/master.cfg&lt;br /&gt;2008/07/03 20:26 CDT [-] error while parsing config file&lt;br /&gt;2008/07/03 20:26 CDT [-] error during loadConfig&lt;br /&gt;2008/07/03 20:26 CDT [-] Traceback (most recent call last):&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;  File "/usr/lib/python2.5/site-packages/twisted/scripts/twistd.py", line 182, in startApplication&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;    app.startApplication(application, not config['no_save'])&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;  File "/usr/lib/python2.5/site-packages/twisted/application/app.py", line 298, in startApplication&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;    service.IService(application).startService()&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;  File "/usr/lib/python2.5/site-packages/twisted/application/service.py", line 196, in startService&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;    service.startService()&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;  File "/usr/lib/python2.5/site-packages/buildbot/master.py", line 407, in startService&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;    self.loadTheConfigFile()&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;--- &lt;exception caught="" here=""&gt; ---&lt;/exception&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;  File "/usr/lib/python2.5/site-packages/buildbot/master.py", line 462, in loadTheConfigFile&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;    self.loadConfig(f)&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;  File "/usr/lib/python2.5/site-packages/buildbot/master.py", line 480, in loadConfig&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;    exec f in localDict&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;  File "/home/buildmaster/APP/master.cfg", line 4, in &lt;module&gt;&lt;/module&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;    from buildbot.process import step, factory&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;&lt;type exceptions.importerror'=""&gt;: cannot import name step&lt;/type&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;&lt;br /&gt;2008/07/03 20:26 CDT [-] The new config file is unusable, so I'll ignore it.&lt;br /&gt;2008/07/03 20:26 CDT [-] I will keep using the previous config file instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-6210804347418698084?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/6210804347418698084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=6210804347418698084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6210804347418698084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6210804347418698084'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/ideas-buildbot-complains.html' title='Ideas???  Buildbot complains...&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-1307098476322010402</id><published>2008-07-03T13:26:00.004-05:00</published><updated>2008-07-03T20:34:22.660-05:00</updated><title type='text'>Next Step</title><content type='html'>Looks like my next step is to automate the Sugar interface itself, so that I can automate launching of the sugarbot application.  If there is a way to automatically launch a specific Activity via command-line, &lt;i&gt;please&lt;/i&gt; let me know.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This will ultimately allow me to write example tests for the Calculate and Terminal activity, as suggested by Grig.  Those will be the first real test of sugarbot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've also been toying with the idea of using the Python interpreter to do the bulk of the parsing work for me.  It would require some restructuring, but would ultimately be the most flexible.  For example, I can think of many instances where it would be very beneficial to implement complex logic into an automated GUI test.  However, re-inventing the proverbial wheel (Python interpreter) seems rather non-trivial :-).  [Update: Note that I don't intend to to make my own interpreter, but rather make the current code use the interpreter]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, I still have to tackle the issue of automatically &lt;i&gt;launching&lt;/i&gt; sugarbot in the first place.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-1307098476322010402?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/1307098476322010402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=1307098476322010402' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1307098476322010402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1307098476322010402'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/next-step.html' title='Next Step'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-454478059780680190</id><published>2008-07-03T13:19:00.002-05:00</published><updated>2008-07-03T13:22:48.696-05:00</updated><title type='text'>Feels good</title><content type='html'>&lt;div&gt;How well documented should tests be?  It seems like they ought to be pretty self-explanatory, otherwise they are probably too complex and are prone to breakage themselves.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On another note, this is kind of nice to see...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;zach@zriggle-desktop:~/Desktop/OLPC/sugarbot/trunk/sugarbot$ nosetests test*.py&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;......................................................................&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;Ran 70 tests in 0.581s&lt;br /&gt;&lt;br /&gt;OK&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-454478059780680190?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/454478059780680190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=454478059780680190' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/454478059780680190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/454478059780680190'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/feels-good.html' title='Feels good'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-7380237333156520379</id><published>2008-07-02T19:14:00.001-05:00</published><updated>2008-07-02T19:14:41.135-05:00</updated><title type='text'>More difficult than it needed to be...
</title><content type='html'>I don't know why I was so stuck on the idea of *actually* using the XML-RPC interface to test the functionality exposed by XML-RPC, when I can just call all of the methods directly.&lt;br /&gt;&lt;br /&gt;Unless something in xmlrpclib or SimpleXMLRPCServer breaks (which isn't something I can do much about), you end up with the same results.  I can't believe I wasted this much time on the problem!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-7380237333156520379?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/7380237333156520379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=7380237333156520379' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7380237333156520379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7380237333156520379'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/07/more-difficult-than-it-needed-to-be.html' title='More difficult than it needed to be...&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-3258889420073844654</id><published>2008-06-29T22:28:00.001-05:00</published><updated>2008-06-29T22:28:42.925-05:00</updated><title type='text'>Issues Testing XML Server
</title><content type='html'>Running into some issues getting the XML Server issues to work properly.  The problems stem from the connections not wanting to persist, or not wanting to close/open fast enough, in addition to some other oddities.&lt;br /&gt;&lt;br /&gt;Committed several new files to SVN, lots of tests for most of the other functionality.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-3258889420073844654?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/3258889420073844654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=3258889420073844654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3258889420073844654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3258889420073844654'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/issues-testing-xml-server.html' title='Issues Testing XML Server&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-5423641393602752260</id><published>2008-06-27T23:35:00.001-05:00</published><updated>2008-06-27T23:35:57.906-05:00</updated><title type='text'>So wait...
</title><content type='html'>You mean I can make changes now, and not have to worry that much that 13,000 things just broke?&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;AND I can find bugs in the process?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-5423641393602752260?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/5423641393602752260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=5423641393602752260' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5423641393602752260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5423641393602752260'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/so-wait.html' title='So wait...&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-2073953331622600738</id><published>2008-06-27T20:58:00.001-05:00</published><updated>2008-06-27T20:58:12.516-05:00</updated><title type='text'>zomg
</title><content type='html'>I founded a bug.  While writing nose tests.&lt;br /&gt;&lt;br /&gt;(I tried to find a fitting lolcat picture, but couldn't.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-2073953331622600738?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/2073953331622600738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=2073953331622600738' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2073953331622600738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2073953331622600738'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/zomg.html' title='zomg&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-1653712832657507141</id><published>2008-06-27T11:38:00.001-05:00</published><updated>2008-06-27T11:38:54.444-05:00</updated><title type='text'>sugar-emulator
</title><content type='html'>I'm fed up with sugar-jhbuild (building xulrunner causes the compiler to *segfault*) for the time being.  I'm just going to use sugar-emulator, even though it's an older version of Sugar.  I would imagine most of the internals will still work the same, and I'll be able to get my tests written and... tested.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-1653712832657507141?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/1653712832657507141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=1653712832657507141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1653712832657507141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1653712832657507141'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/sugar-emulator.html' title='sugar-emulator&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-3700103636733779285</id><published>2008-06-26T23:02:00.001-05:00</published><updated>2008-06-26T23:02:16.880-05:00</updated><title type='text'>Not cooperating...
</title><content type='html'>Ubuntu, sugar-jhbuild, and Vmware Fusion are not cooperating.  And it's pissing me off.&lt;br /&gt;&lt;br /&gt;First, I tried to use the old sugar-jhbuild from before the drive corruption, because I had the actual files stored on the Mac filesystem (accessed in Ubuntu via the Shared Folders featured in VMWare).  For whatever reason, that didn't work.  Okay, I can accept that.&lt;br /&gt;&lt;br /&gt;Next, I tried to simply './sugar-jhbuild update' and './sugar-jhbuild build' on the existing installation.  I let that run overnight.  No dice.&lt;br /&gt;&lt;br /&gt;So I started out with a fresh copy, via git.  After 'update' passed, 'build' decided that it would freeze the VM, resulting in me having to hard-reboot (because the VMWare process would not quit via Force Quit or sudo kill).&lt;br /&gt;&lt;br /&gt;Now I am rebuilding sugar-jhbuild *again*, and it's deciding that it's going to take its dandy time.  Literally.  I've given the VM 512MB of RAM and access to both processors, and it's sitting at about 20% utilization.  In addition to that, the VM is completely unresponsive -- which is intereseting, because it is supposedly (according to Activity Monitor in OSX) -- not really doing anything.&lt;br /&gt;&lt;br /&gt;This whole incident is becoming very frustrating.  I can't test any of the 'nose' code that I've written, because none of the Sugar libraries are available/working under Leopard, which means that anything that's Sugar-dependent (read: everything) refuses to run on Python under OSX.&lt;br /&gt;&lt;br /&gt;In order to see if I could expedite things, I went the 'apt' route with precreated Sugar packages and emulator.  I figured I'd just run the sugar-jhbuild process in the background, and work around it until it was done building.  As I mentioend before, the VM is completely unresponsive... to the point that I'm considering just creating a new VM (yet again...).  Of course, I know that won't really solve anything, because Ubuntu runs just fine until it gets a few minutes into the sugar-jhbuild process.&lt;br /&gt;&lt;br /&gt;I should very shortly have access to a shiny new Dell workstation (as part of my UH project) that will have Ubuntu on it.  Hopefully that will yield better results.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-3700103636733779285?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/3700103636733779285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=3700103636733779285' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3700103636733779285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3700103636733779285'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/not-cooperating.html' title='Not cooperating...&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-2217313653588412345</id><published>2008-06-23T23:49:00.001-05:00</published><updated>2008-06-23T23:49:20.330-05:00</updated><title type='text'>Documentation Effort
</title><content type='html'>Documentation of the source code has been going fairly well.  I've also knocked off a few items on my todo.txt.&lt;br /&gt;&lt;br /&gt;Tomorrow night will kick off the nose'ing of sugarbot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-2217313653588412345?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/2217313653588412345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=2217313653588412345' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2217313653588412345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2217313653588412345'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/documentation-effort.html' title='Documentation Effort&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-8370964488361778199</id><published>2008-06-23T11:46:00.002-05:00</published><updated>2008-06-26T23:04:52.059-05:00</updated><title type='text'>Ubuntu is running</title><content type='html'>The Ubuntu VMware machine is up and running again, and sugar-jhbuild finished last night &lt;b&gt;(Update: Haha, just kidding!)&lt;/b&gt;.  I've got to do some updates for 10.5.3, and the obligatory Ubuntu updates, but everything should be working now (of course, Safari is exhibiting some weird behavior but I think 10.5.3 will fix that).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-8370964488361778199?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/8370964488361778199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=8370964488361778199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/8370964488361778199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/8370964488361778199'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/ubuntu-is-running.html' title='Ubuntu is running'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-6320545656174084049</id><published>2008-06-22T18:31:00.003-05:00</published><updated>2008-06-22T18:34:54.222-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><category scheme='http://www.blogger.com/atom/ns#' term='leopard'/><category scheme='http://www.blogger.com/atom/ns#' term='drive-genius'/><title type='text'>Drive Genius</title><content type='html'>Do not use it!  It may decide to hose your entire filesystem, resulting in you needing do a completely fresh installation of OS X.  Thank Steve Jobs for Time Machine (and WD for making 250GB of storage available in a pocket-size form factor for $120).&lt;br /&gt;&lt;br /&gt;After my Time Machine backup finishes restoring (looks like about 45 minutes left on that), I have to re-install my Ubuntu VM, as my VM's are the only thing I didn't have Time Machine back up (because they would chew up disk space).  I'm hoping to be back up and running before the night is over.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-6320545656174084049?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/6320545656174084049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=6320545656174084049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6320545656174084049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6320545656174084049'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/drive-genius.html' title='Drive Genius'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-2326268360424423275</id><published>2008-06-21T23:00:00.002-05:00</published><updated>2008-06-21T23:02:07.914-05:00</updated><title type='text'>New Wiki Pages</title><content type='html'>There are two new Wiki pages.  This needed to be done eventually, so I thought I'd take a break from coding to write up some documentation.  It's pretty basic, but better than no documentation at all :-).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/sugarbot/wiki/SupportedCommands"&gt;Sugarbot Script Syntax&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/sugarbot/wiki/RunningSugarbot"&gt;Running Sugarbot&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-2326268360424423275?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/2326268360424423275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=2326268360424423275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2326268360424423275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2326268360424423275'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/new-wiki-pages.html' title='New Wiki Pages'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-3659612010447795845</id><published>2008-06-21T19:16:00.001-05:00</published><updated>2008-06-21T19:16:57.020-05:00</updated><title type='text'>Refactoring
</title><content type='html'>By the way, I am also going to do some refactoring on the sbGUI class.  It has had some functionality embedded in it that it should not be responsible for, and some of the methods are kludges as a result of the recent restructuring of the "command pipeline" (dunno what else to call it).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-3659612010447795845?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/3659612010447795845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=3659612010447795845' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3659612010447795845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3659612010447795845'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/refactoring.html' title='Refactoring&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-6682142768438917418</id><published>2008-06-21T19:14:00.001-05:00</published><updated>2008-06-21T19:14:23.487-05:00</updated><title type='text'>Not going well today...
</title><content type='html'>Today has been an interesting day so far (about 6 work-hours left to go today) in that there have been multiple small bugs all conspiring against me.  (Yes, I think the Python interpreter is sentient.)&lt;br /&gt;&lt;br /&gt;I think/hope I have FINALLY gotten things sorted out.  Maybe.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-6682142768438917418?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/6682142768438917418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=6682142768438917418' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6682142768438917418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6682142768438917418'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/not-going-well-today.html' title='Not going well today...&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-9027026757584572289</id><published>2008-06-20T21:59:00.001-05:00</published><updated>2008-06-20T21:59:37.990-05:00</updated><title type='text'>Now Launching
</title><content type='html'>I have re-restructured most of the code, and I can now send commands over XML-RPC as text, and everything works fine (so far).  I have to change some of the execution code, but the issues should be minor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-9027026757584572289?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/9027026757584572289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=9027026757584572289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/9027026757584572289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/9027026757584572289'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/now-launching.html' title='Now Launching&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-5550223217283241210</id><published>2008-06-19T23:27:00.001-05:00</published><updated>2008-06-19T23:27:34.225-05:00</updated><title type='text'>Parsing Server-side
</title><content type='html'>Parsing commands server-side may run into a few issues, the first of which is that returning an object over XML-RPC does not work the way that I imagined it would.  While it provides the objects' members as a dictionary, it does not provide any information about the instance of the object -- for example, whether it is an sbInitCmd object or a sbClickCmd object.&lt;br /&gt;&lt;br /&gt;I can make a work-around for this (for example, by making the class name a member, and then passing that to another function that re-instantiates the object) but it seems like a giant kludge.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-5550223217283241210?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/5550223217283241210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=5550223217283241210' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5550223217283241210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5550223217283241210'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/parsing-server-side.html' title='Parsing Server-side&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-4452954984597811845</id><published>2008-06-19T23:09:00.001-05:00</published><updated>2008-06-19T23:09:36.344-05:00</updated><title type='text'>Bug Hunting
</title><content type='html'>'self.currentScript' is not equivalent to 'currentScript'.&lt;br /&gt;&lt;br /&gt;The fact that the error was being reported via the xmlrpc library only made it that much harder to realize my mistake.&lt;br /&gt;&lt;br /&gt;Wasted time, bah.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-4452954984597811845?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/4452954984597811845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=4452954984597811845' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4452954984597811845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4452954984597811845'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/bug-hunting.html' title='Bug Hunting&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-1876527878363270653</id><published>2008-06-18T23:54:00.001-05:00</published><updated>2008-06-18T23:54:14.051-05:00</updated><title type='text'>Moving
</title><content type='html'>I've had to do some restructuring to get the Parser to play nice with the RPC Server, and for the Commands to still work the way they should.  &lt;br /&gt;&lt;br /&gt;Played around with the logger functionality tonight.  Very nifty.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-1876527878363270653?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/1876527878363270653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=1876527878363270653' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1876527878363270653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1876527878363270653'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/moving.html' title='Moving&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-7017227941998263561</id><published>2008-06-17T00:26:00.002-05:00</published><updated>2008-06-17T07:21:30.429-05:00</updated><title type='text'>That's it, really?</title><content type='html'>I took the path of least resistance, and provide the path to the script file via XML-RPC.&lt;br /&gt;&lt;br /&gt;After an hour of struggling with it, only to finally notice that I have to restart the server script (in addition to the Sugar Activity) if I actually want my changes to propagate, I have to say... that was pretty freaking easy.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By the way, why did nobody tell me about XML-RPC and its awesomeness &lt;i&gt;sooner?&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-7017227941998263561?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/7017227941998263561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=7017227941998263561' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7017227941998263561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7017227941998263561'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/that-it-really.html' title='That&amp;#39;s it, really?'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-7734776837726481153</id><published>2008-06-15T16:15:00.001-05:00</published><updated>2008-06-15T16:15:53.142-05:00</updated><title type='text'>Timout problem
</title><content type='html'>I tried the threading route... that didn't work so well due to Python's GIL.  What a pain.&lt;br /&gt;&lt;br /&gt;Good news is that the problem was solved with -- drumroll -- changing an 'if' into a 'while' and adding a little bit more hackery.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-7734776837726481153?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/7734776837726481153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=7734776837726481153' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7734776837726481153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7734776837726481153'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/timout-problem.html' title='Timout problem&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-7442967364424290404</id><published>2008-06-15T15:15:00.001-05:00</published><updated>2008-06-15T15:15:51.204-05:00</updated><title type='text'>XML-RPC
</title><content type='html'>Ha! I may just go with my networking idea for telling Sugarbot what to do. Usage of XML-RPC had been discussed before, and it solves at least one problem, of how to get Sugarbot to execute different scripts without swapping out script files.&lt;br /&gt;&lt;br /&gt;A separate XML-RPC server can feed it the commands.  Bingo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-7442967364424290404?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/7442967364424290404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=7442967364424290404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7442967364424290404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/7442967364424290404'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/xml-rpc.html' title='XML-RPC&#xA;'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-4594699412631120323</id><published>2008-06-14T23:23:00.001-05:00</published><updated>2008-06-14T23:23:50.469-05:00</updated><title type='text'>Temporary Diversion</title><content type='html'>I just realized how convoluted the current logging mechanism was.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fixing that pronto.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-4594699412631120323?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/4594699412631120323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=4594699412631120323' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4594699412631120323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4594699412631120323'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/temporary-diversion.html' title='Temporary Diversion'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-8934995919499461968</id><published>2008-06-14T14:03:00.003-05:00</published><updated>2008-06-14T14:36:01.729-05:00</updated><title type='text'>Brick Wall</title><content type='html'>Just hit a brick wall today.&lt;br /&gt;&lt;br /&gt;Turns out that I might need to create a separate thread in order to launch the commands, as the method that I am currently using is only good until things are done initializing.  After that, no new gdk.Event's are issued, which means that the place that I use as a callback to launch sbCommand objects never gets called.&lt;br /&gt;&lt;br /&gt;For an example of what I mean, check out r41 (just committed it) and run the sugarbot activity.  No modification &lt;span style="font-style:italic;"&gt;should&lt;/span&gt; be necessary, and it should launch the Terminal activity (which you need to have installed for this to work properly, obviously).  After/during the "sleep '2'" statement, everything finishes initializing, which means there are no more Events flying around.  That means that all of the 'type' commands will not execute until some event is created.  To see this, launch the activity, and do not touch your mouse or keyboard for a few seconds.  Then move the mouse, and the 'type' commands should execute shortly thereafter.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ideas:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Multithreading.  Just have a thread that sits and does what the hooked code would otherwise do.  This would allow me to separate the &lt;i&gt;sbgui&lt;/i&gt; functionality from the execution of commands, which is a &lt;i&gt;Good Thing&lt;sup&gt;TM&lt;/sup&gt;&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;Find a way to generate some kind of empty gdk.Event after executing a sbCommand, if there are no other gdk.Event's waiting for processing.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-8934995919499461968?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/8934995919499461968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=8934995919499461968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/8934995919499461968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/8934995919499461968'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/brick-wall.html' title='Brick Wall'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-1141280011093429813</id><published>2008-06-13T20:30:00.008-05:00</published><updated>2008-07-10T19:03:45.091-05:00</updated><title type='text'>Reorganizing, issues with a few Widgets</title><content type='html'>&lt;div&gt;Well, it's been a few days since I've had a serious blog post. I was in Maryland for Tuesday afternoon through Thursday night (got back around midnight) for interviews with the [government]. I think things went well, and hope to hear back from them (although it's a "hurry up and wait" mentality, that may be up to a month).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As far as sugarbot goes, I got a bit done on Tuesday evening at the airport, but didn't have any time to work Wednesday or Thursday. I've made a few additions so that sugarbot now reads from an actual configuration file (located in the sugarbot.activity directory for now), and can load any arbitrary activity. From the activities that I've tested (Write, Terminal, and Browse), there may be some issues getting some of the more specialized Widgets to respond properly. I need to do some research into the AbiWord widget, for example. Although they are unique to their Activity, I would like to have support for the more common ones. Unfortunately as far as a simple demo goes, Calculate.activity is a poor candidate since it [1] requires modification to be able to check the input field and [2] stores the answers along with the output. So instead of:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;click '1'&lt;/div&gt;&lt;div&gt;click '+'&lt;/div&gt;&lt;div&gt;click '1'&lt;/div&gt;&lt;div&gt;click 'enter'&lt;/div&gt;&lt;div&gt;text 'calculateAnswerField'=='2'&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;the required script might instead read:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;text 'calculateAnswerField=='1+1\n\t2' [or however a gtk.TextBuffer stores the text internally]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have also moved some functionality around, but it is mostly just a matter of what is initialized where. For example, the sugarbot Activity instance class needed access to the parser, which means that the parsed commands had to be passed down to the sbgui object, etc. I also spent a little bit of time on the IRC channel (#pygtk) and found out a more convenient/likely to work with other kinds of widgets method for simulating clicks and typing (via Signals). Nifty.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Currently, I do not have any ideas on how to tell sugarbot which file to read from, aside from some hard-coded value. I would greatly prefer to not use the GUI to do this, so that it would be easier to automate. A few things off the top of my head that might work...&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;A script file that actually contains multiple scripts. With each subsequent execution, the next 'script' is run. sugarbot keeps track of where it needs to read from next with some other file, and resets that data once it reaches the end.&lt;/li&gt;&lt;li&gt;Use the network to connect to some separate 'server' application that tells sugarbot what to do. This other application would have unlimited flexibility, since it is not bounded by the Sugar environment.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;As far as automating the process of starting sugarbot in the first place, that's another problem to tackle. I need to find some way to hook into the PyGTK calls of the Sugar process, in a similar manner that I've used to automate activities. Again, I'd prefer to find a way to do this without modifying any code in the Sugarbot base.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-1141280011093429813?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/1141280011093429813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=1141280011093429813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1141280011093429813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1141280011093429813'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/reorganizing-issues-with-few-widgets.html' title='Reorganizing, issues with a few Widgets'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-945697572734781885</id><published>2008-06-11T22:45:00.002-05:00</published><updated>2008-06-11T22:48:02.662-05:00</updated><title type='text'>In Maryland</title><content type='html'>In Maryland right now.  Got done with my polygraph and first operational interview today.  Psych battery, psych eval, second op. interview, and HR interview tomorrow.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Added some parser functionality, and moved some functionality around in regards to the commands and parser while I was at the airport/on the plane.  More updates on Friday.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-945697572734781885?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/945697572734781885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=945697572734781885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/945697572734781885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/945697572734781885'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/in-maryland.html' title='In Maryland'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-4620391290099890480</id><published>2008-06-08T13:41:00.005-05:00</published><updated>2008-06-08T14:28:51.440-05:00</updated><title type='text'>Multiple-Initialization</title><content type='html'>&lt;p&gt;A commenter (Michael Stone) asked for a bit more information on the multiple-initialization issues that I r&lt;span style="font-family: georgia;"&gt;an into. The issue first appeared when I first started the project, and I resolved the issue with a runtime inheritance hack. The general idea is:&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: georgia;font-family:Courier;" &gt;The sugarbot object makes itself inherit from the other class, then calls __&lt;/span&gt;&lt;strong style="font-family: georgia;"&gt;&lt;span style="font-weight: normal;"&gt;init__&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: georgia;"&gt;(self, self.handle) so that the Activity gets initialized the way that it normally would. This was not how it was originally set up (because it did not &lt;/span&gt;work the way it was originally set up). At first, I just assumed that I could do the following:&lt;br /&gt;&lt;pre&gt;self.parentClass = someOtherActivityClass&lt;br /&gt;sugarbot.bases = (self.parentClass,)&lt;br /&gt;self.parentClass.init(self,self.handle)&lt;/pre&gt;…and have everything work. Unfortunately, certain calls (calling activity.Activity.__&lt;strong&gt;&lt;span style="font-weight: normal;"&gt;init__&lt;/span&gt;&lt;/strong&gt; explicitly, to initialize the activity being one of those) only like to be called by the Activity instance that it expects the call to come from. Otherwise, the excrement comes into contact with the rotary cooling device.&lt;br /&gt;&lt;pre&gt;launchedActivity = someOtherActivity(self,handle)&lt;/pre&gt;An issue that I’m facing is that, with the current way of instantiating Activities, it is not possible (to my knowledge) to terminate the spawned activity without causing the whole process to terminate. I think the way to resolve this is going to (ultimately) be to automate the Sugar GUI itself, so that I can re-launch the &lt;span style="font-style: italic;"&gt;sugarbot&lt;/span&gt; Activity after it terminates. It will somehow know (or perhaps have this information provided to it) to run the next automation script or the like.&lt;br /&gt;&lt;br /&gt;Example Activity:&lt;br /&gt;&lt;pre&gt;from sugar.activity import activity&lt;br /&gt;import sys, os&lt;br /&gt;import gtk&lt;br /&gt;class exampleActivity(activity.Activity):&lt;br /&gt; def init(self, handle):&lt;br /&gt;   # With or without the following call, everything freaks out.&lt;br /&gt;   activity.Activity.init(self,handle)&lt;br /&gt;   # Add the path to the activity&lt;br /&gt;   sys.path.append(pathToCalculateActivity)&lt;br /&gt;   # Import and instantiate the activity&lt;br /&gt;   from calculate import Calculate&lt;br /&gt;   launchedActivity = Calculate(self,handle)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-4620391290099890480?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/4620391290099890480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=4620391290099890480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4620391290099890480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4620391290099890480'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/multiple-initialization.html' title='Multiple-Initialization'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-899003163162589288</id><published>2008-06-07T20:26:00.003-05:00</published><updated>2008-06-07T20:30:35.082-05:00</updated><title type='text'>Re-factoring mood?</title><content type='html'>Moved a bunch of classes to their own individual files.  Nothing too exciting.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Debating what my next-step is:&lt;/div&gt;&lt;div&gt;1.) Go through each object type and make sure the various commands work (e.g. "click algebra-ln" when the "algebra-ln" button is not exposed).&lt;/div&gt;&lt;div&gt;2.) Finish the parser so that it can read from command.&lt;/div&gt;&lt;div&gt;3.) Build a GUI so that you can select various activities (this is probably a no-no, as it messes with the GUI state, and Sugar seems pretty finicky about certain things if they get set-up twice -- which screws up spawning other activities).   Also have considered implementing this functionality in the parser (e.g.  a command with the syntax "activity Calculate").  However, that has implications of its own, since actions are only called after some Gtk events are thrown around... which only happens after the Activity has been started.  You get the idea (chicken-egg).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-899003163162589288?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/899003163162589288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=899003163162589288' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/899003163162589288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/899003163162589288'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/re-factoring-mood.html' title='Re-factoring mood?'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-2684727914819442570</id><published>2008-06-07T20:03:00.003-05:00</published><updated>2008-06-07T20:09:57.661-05:00</updated><title type='text'>Widget Identifier Refactor</title><content type='html'>The widget identification code was getting to be a bit messy... and was in a place that it really didn't fit.  All of that code has been refactored into a seperate class (and subclasses).  The code is much cleaner now.  Ideally, widget identification would be simple if the set_name() method was called on each and every widget --- but that's a bit much to expect.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That aside, sugarbot can now identify every individual widget in Calculate.activity.  Unfortunately, there are multiple ways of naming some of the widgets.  For example, Calculate.activity's toolbars.py is responsible for drawing all of the toolbar widgets.  However, some of these have (potentially) multiple names.  In the below example, there are five identifiers that could potentially be used (the five strings used).  Currently, the first one is used, but only because I have not found a way to get at the second one.  It is probably better that the second one is not used, as internationalized text could cause issues with widget identification (the "_()" operator is used in lieu of gettext()).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;toolbars.py excerpt:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;        self.insert(IconToolButton('algebra-square', _('Square'),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;            lambda x: calc.button_pressed(calc.TYPE_OP_POST, '^2'),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;            lambda x: calc.button_pressed(calc.TYPE_TEXT, 'help(square)'),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;            alt_html='x&lt;sup&gt;2&lt;/sup&gt;'), -1)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Log excerpt showing identified widgets:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 146431428 by identifier sugarbot Activity&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 146431748 by identifier sugar+graphics+toolcombobox+ToolComboBox&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 146431908 by identifier Keep&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 146474524 by identifier Stop&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 146475644 by identifier edit-copy&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 146476964 by identifier edit-paste&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 146482316 by identifier edit-cut&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 146483516 by identifier x2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 146483636 by identifier √x&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 146484876 by identifier x-1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 146484916 by identifier ex&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147261556 by identifier xy&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147262876 by identifier algebra-ln&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147262916 by identifier algebra-fac&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147272364 by identifier trigonometry-sin&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147273604 by identifier trigonometry-cos&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147274964 by identifier trigonometry-tan&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147285612 by identifier trigonometry-asin&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147286892 by identifier trigonometry-acos&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147286852 by identifier trigonometry-atan&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147297620 by identifier trigonometry-sinh&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147298900 by identifier trigonometry-cosh&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147300220 by identifier trigonometry-tanh&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147300180 by identifier boolean-and&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147310948 by identifier boolean-or&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147312228 by identifier boolean-eq&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147312268 by identifier boolean-neq&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147322876 by identifier π&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147324116 by identifier constants-e&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147330788 by identifier Deg&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147337740 by identifier enter&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147337660 by identifier )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147337580 by identifier /&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147337500 by identifier *&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147337420 by identifier (&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147332148 by identifier -&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147332228 by identifier +&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147333028 by identifier clear&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147332948 by identifier .&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147332868 by identifier 0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147332788 by identifier 3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147332708 by identifier 2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147332628 by identifier 1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147332548 by identifier 6&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147332468 by identifier 5&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147332388 by identifier 4&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147332308 by identifier 9&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147331988 by identifier 8&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147332188 by identifier 7&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147331828 by identifier calcMainEntry&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147332028 by identifier Label&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147337820 by identifier All equations&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 147337900 by identifier Show history&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Tracking widget id 139099748 by identifier SugarActivity&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-2684727914819442570?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/2684727914819442570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=2684727914819442570' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2684727914819442570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2684727914819442570'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/widget-identifier-refactor.html' title='Widget Identifier Refactor'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-2576904765717582319</id><published>2008-06-05T23:06:00.000-05:00</published><updated>2008-06-05T23:07:25.351-05:00</updated><title type='text'>Getting pretty sugar-specific</title><content type='html'>I'm getting into some of the nitty-gritty with Sugar here, trying to handle some of the Widget types that it defines itself.  Kind of a pain, but alas...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-2576904765717582319?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/2576904765717582319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=2576904765717582319' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2576904765717582319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2576904765717582319'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/getting-pretty-sugar-specific.html' title='Getting pretty sugar-specific'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-4938977826733678742</id><published>2008-06-04T13:18:00.003-05:00</published><updated>2008-06-09T18:12:06.618-05:00</updated><title type='text'>Bandwidth</title><content type='html'>Bahahahaha.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.speedtest.net/result/282007058.png"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://www.speedtest.net/result/282007058.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.speedtest.net/result/279866857.png"&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Unfortunately, this is only in the computer lab in one of the buildings.  In the dorm rooms, they regulate it to 384/128 kbps.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-4938977826733678742?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/4938977826733678742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=4938977826733678742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4938977826733678742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4938977826733678742'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/bandwidth.html' title='Bandwidth'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-8295553147625352505</id><published>2008-06-03T23:45:00.002-05:00</published><updated>2008-06-03T23:46:45.595-05:00</updated><title type='text'>Damnit, Python</title><content type='html'>Just spent two hours trying to figure out why some code wouldn't do what I wanted to.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;class sbTypeCmd(sbCommand):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;"""&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Types text into an Entry widget or similar widget with a set_text method.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;"""&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;def __init__(self, sbgui, widgetName, params=None):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;sbCommand.__init__(self, sbgui, widgetName, params)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;def run(self):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;print "sbTypeCmd"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;widget &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;= self.getWidget()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;methodName &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;= "set_text"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;if hasattr(widget, methodName):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;print "Hasattr"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;text&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;= (" ".join(self._params)).split("'")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;print "Text: " + text&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;if len(text) &lt;&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;return False&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;textToType&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;= "'".join(text[1:-2])&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;getattr(widget, methodName)(textToType)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;return True&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;return False&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Flipping indentation.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-8295553147625352505?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/8295553147625352505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=8295553147625352505' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/8295553147625352505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/8295553147625352505'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/damnit-python.html' title='Damnit, Python'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-1659053562552867431</id><published>2008-06-02T21:30:00.009-05:00</published><updated>2008-06-02T22:40:50.694-05:00</updated><title type='text'>Evaluating Entries, basic parsing</title><content type='html'>Basic strings such as:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;click '1'&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;click '+'&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;click '1'&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;click 'enter'&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;and complex strings such as&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;entryEval 'Entry'.split()[0] == '1'&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Are both parse-able AND should work the way that they're expected.  Pretty cool.  Source is on SVN.  [&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;edit&lt;/span&gt;]&lt;span class="Apple-style-span" style="font-style: italic;"&gt; I have also quickly implemented a feature that will allow the serialization of sbCommand objects -- so that not only can lines like the above be parsed, they can be un-parsed.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note: In order for Entry hooking to work properly, the gtk.Entry has to [&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;edit&lt;/span&gt;] &lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;be named&lt;/span&gt;&lt;/span&gt; properly.  For testing purposes, I named Calculate.activity's main entry "Entry".  I will include a patch to automate this process at a later point in time. [edit] Manual patch below, will upload a Diff to the sugarbot downloads area.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Underneath the line in Calculate.activity/layout.py:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  self.text_entry = gtk.Entry()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Enter the following (my personal tests use:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  self.text_entry.set_name('calcMainEntry')&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-1659053562552867431?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/1659053562552867431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=1659053562552867431' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1659053562552867431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1659053562552867431'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/evaluating-entires-basic-parsing.html' title='Evaluating Entries, basic parsing'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-4019281263580222557</id><published>2008-06-02T11:18:00.000-05:00</published><updated>2008-06-02T11:20:02.299-05:00</updated><title type='text'>Houston</title><content type='html'>In Houston right now, everything is going well so far.  I got a bit of sugarbot coding done last night on the plane, and in the Airport lobby.  Trying to come up with a framework that will allow flexibility in the commands, and I think I've got it.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Will have updates later.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-4019281263580222557?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/4019281263580222557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=4019281263580222557' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4019281263580222557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4019281263580222557'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/06/houston.html' title='Houston'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-858280060429665116</id><published>2008-05-29T13:39:00.002-05:00</published><updated>2008-05-29T13:48:07.168-05:00</updated><title type='text'>Automation, GO!</title><content type='html'>Got some button-press automation going.  It's a pretty simple implementation, actually.  Currently, it only handles one action ('click') and one Widget type (gtk.Button), but expanding it should be straightforward.  I ran into a problem where the user-defined action would attempt to execute before the corresponding Widget was instantiated, so I added a mechanism that will delay for 10 seconds (in .01 second increments) before giving up on an action.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The code is also on SVN now.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;self._commands = [sugarbotCmd(self,'1','click'),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;sugarbotCmd(self,'+','click'),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;sugarbotCmd(self,'1','click'),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;sugarbotCmd(self,'enter','click')]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-858280060429665116?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/858280060429665116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=858280060429665116' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/858280060429665116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/858280060429665116'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/automation-go.html' title='Automation, GO!'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-1587660029047145441</id><published>2008-05-29T09:47:00.002-05:00</published><updated>2008-05-29T09:49:30.823-05:00</updated><title type='text'>Simple Button Click</title><content type='html'>I have found a suitable place to inject commands (via use of gdk.event_peek()), and have successfully tested injecting commands (button-clicks) based on a Widget identifier (in this case, a button label).  Going to refactor the code so that it's more generic, and so that multiple actions can be queued.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-1587660029047145441?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/1587660029047145441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=1587660029047145441' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1587660029047145441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1587660029047145441'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/simple-button-click.html' title='Simple Button Click'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-2711545452715210717</id><published>2008-05-28T18:04:00.004-05:00</published><updated>2008-05-28T19:41:29.955-05:00</updated><title type='text'>Health Testing</title><content type='html'>&lt;div&gt;Once again, not related to sugarbot, but pertinent nonetheless: &lt;/div&gt;Went in for a preliminary test today, looks like diabetes.  Turns out that I am glycosuric (&lt;a href="http://en.wikipedia.org/wiki/Glycosuria"&gt;glycosuria&lt;/a&gt;), as the test came back at over 2000 mg/dL glucose, and it should be between 160-180.  Going tomorrow morning for blood work, and a follow-up on Friday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-2711545452715210717?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/2711545452715210717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=2711545452715210717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2711545452715210717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2711545452715210717'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/testing.html' title='Health Testing'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-2370883270469958440</id><published>2008-05-26T23:59:00.002-05:00</published><updated>2008-05-27T00:05:17.000-05:00</updated><title type='text'>Being too cautious</title><content type='html'>I've been dissecting the various layers of the Calculate.activity for the past few hours, trying to find out how little bits of it work, and how to be able to identify different parts of it by label/name/title/whatever, and being able to run a Widget through a method and have it hand me back a useful name (e.g. "9" for a button labelled "9").  However, this is proving to be difficult for some of the non-elementary types (for example, Widgets inside the tabs of a Gtk.Journal; and Gtk.Alignment containers).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Being that I think I spent more time than is necessary at this point, I'm shifting just dealing with buttons for the time being.  By just working with buttons, I can ignore a lot of the crap flying around inside GTK, and lay a framework for extended functionality.  I just feel the need to get something up-and-running that is automated.  I keep getting sidetracked by attempting to implement more than is necessary &lt;span class="Apple-style-span" style="font-style: italic;"&gt;right now&lt;/span&gt; (like handling Gtk.Journal's).  Need to stay focused.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-2370883270469958440?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/2370883270469958440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=2370883270469958440' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2370883270469958440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2370883270469958440'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/being-too-cautious.html' title='Being too cautious'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-2604852524197999724</id><published>2008-05-26T15:17:00.003-05:00</published><updated>2008-05-26T15:20:55.217-05:00</updated><title type='text'>Scheduling Bloodwork</title><content type='html'>Just thought that it was noteworthy, I am going to schedule an appointment tomorrow to get some blood work done, and get tested for diabetes.  I've been having most of the symptoms of Type I for about a week now (dry mouth, extreme thirst, excessive bathroom time, blurry vision, and lethargy) and have a family history of diabetes (paternal grandfather, two of my three cousins on my dad's side of the family), so it's pretty likely.  I've been holding off to see if some of the symptoms will go away, but it doesn't seem like they want to.  Most places are closed today, so I'll be making an appointment tomorrow, will probably be going on Wednesday (also getting dental work done on Wednesday)... so this is an interesting week.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Aside from the aforementioned complications, it looks like the University of Houston might be sticking me on a project that I have no interest in --- which will subsequently require me to not visit Texas this summer.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-2604852524197999724?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/2604852524197999724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=2604852524197999724' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2604852524197999724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2604852524197999724'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/scheduling-bloodwork.html' title='Scheduling Bloodwork'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-2910060595241259195</id><published>2008-05-21T22:59:00.000-05:00</published><updated>2008-05-22T00:29:49.349-05:00</updated><title type='text'>Enumerating Widgets</title><content type='html'>I'll just say that there are way more types of Widgets in use than I originally anticipated... and the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;hasattr() &lt;/span&gt;and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;isinstance() &lt;/span&gt;functions are godsends.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note: This post is actually being written at 1:30AM on Thursday, but I didn't want it to look like I didn't do anything on Wednesday the 21st.  This post includes information about work done on the 21st as well.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-2910060595241259195?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/2910060595241259195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=2910060595241259195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2910060595241259195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2910060595241259195'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/enumerating-widgets.html' title='Enumerating Widgets'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-258096882751181591</id><published>2008-05-20T21:35:00.003-05:00</published><updated>2008-05-20T21:56:28.635-05:00</updated><title type='text'>WOOOOOO</title><content type='html'>So... modifying inheritance at runtime is about the coolest thing EVER.  I have succeeded in getting Calculator.activity to run inside of my own activity, sugarbot.activity.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...mostly because it made my code work.  :-).  Most of what I've toyed around with the past two or so days is useless, so I'm stripping that code out.  Some other code doesn't quite mesh with the new stuff, but I'll get on that ASAP. [Code is now on SVN nder trunk/sugarbot]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To list my accomplishments today:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Figured out how to get another Activity's code running under my activity, via runtime inheritance.&lt;/li&gt;&lt;li&gt;Successfully identified button-presses in Calculator.activity.  Example output:&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Window sugarbot Activity created&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Button pressed: 3&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Button pressed: +&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Button pressed: 3&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Button pressed: enter&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Button pressed: 5&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Button pressed: -&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Button pressed: 5&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Button pressed: enter&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Button pressed: None&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:'courier new';font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Altogether, today was a pretty good day.  The example output above shows that there are definitely going to be some stumbling blocks with some portions of some Activities, as not all of the Widgets are named properly (the last 'None' press was the stop-sign icon to stop the Activity).&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-258096882751181591?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/258096882751181591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=258096882751181591' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/258096882751181591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/258096882751181591'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/woooooo.html' title='WOOOOOO'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-2261236135520908583</id><published>2008-05-19T23:46:00.004-05:00</published><updated>2008-05-25T22:49:31.917-05:00</updated><title type='text'>Which came first, the snake or the egg?</title><content type='html'>I've run into quite an interesting little debacle.  The only function that I can guarantee gets called when an activity is loaded is myActivity.__init__().  Unfortunately, if I create an instance of a different activity, its anotherActivity.__init__ function is called.  For whatever reason, Sugar wants to attach a few things to myActivity object.  However, myActivity.__init__ has not finished execution, so a TypeError exception is raise.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Maybe spawning a separate thread would solve the issue?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Update: Solved the issue by using runtime inheritance, by some nifty manipulation using __import__ and __bases__.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-2261236135520908583?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/2261236135520908583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=2261236135520908583' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2261236135520908583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2261236135520908583'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/which-came-first-snake-or-egg.html' title='Which came first, the snake or the egg?'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-2487074049977938207</id><published>2008-05-19T11:50:00.002-05:00</published><updated>2008-05-19T11:53:37.596-05:00</updated><title type='text'>Migrating to an Activity</title><content type='html'>As was suggested in the IRC channel last night, I'm going to create a small OLPC Activity wrapper for the time being.  All that the code will do is launch Calculate.activity inside itself (so technically not 'launching', but actually reading activity.info and calling the appropriate functions).  From there, I'll be able to check and see if I can intercept PyGTK messages.  I am assuming that I'll be able to, so that will be a great first step at actually working inside Sugar.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As far as this method goes, it removes the possibility of actually automating the Sugar GUI itself (but the functionality could be designed-in later), as far as the frame, ring, and Activity list go.  I doubt that these are aspects that will need in-depth testing, as their function is severely limited.  However, being severely limited in function, it should be easy to extend sugarbot to automate those features as well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hoping to have a copy that snoops on Calculate.activity and (potentially) automates a few basic operations done tonight/early tomorrow.  Will upload everything to SVN when that is done.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-2487074049977938207?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/2487074049977938207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=2487074049977938207' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2487074049977938207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2487074049977938207'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/migrating-to-activity.html' title='Migrating to an Activity'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-6579592186810654937</id><published>2008-05-18T20:55:00.007-05:00</published><updated>2008-05-18T22:52:52.683-05:00</updated><title type='text'>What is our scope?</title><content type='html'>In #olpc on Freenode, an individual by the name of 'homunq' suggested that the automation tool be rolled into its own Activity.  It could then be used to launch other Activities in its own process.  That would solve the problem of everything being in a separate process.   This would have to be done in a specific manner, since BitFrost prevents Activities from launching one-another, but does not prevent them from calling on one-another.  It would require some dynamic &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;import&lt;/span&gt;'s and class calling.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Transcript for my own personal reference, and yours if you'd like: &lt;a href="http://www.mediafire.com/?tjd99jyc1lc"&gt;link&lt;/a&gt; (mediafire.com).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-6579592186810654937?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/6579592186810654937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=6579592186810654937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6579592186810654937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/6579592186810654937'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/what-is-our-scope.html' title='What is our scope?'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-3300234071394184968</id><published>2008-05-17T20:02:00.002-05:00</published><updated>2008-05-17T20:08:27.915-05:00</updated><title type='text'>Roadblocks</title><content type='html'>So I've figured out how to intercept gtk.Event's, and then match them to various gtk.Window's or gtk.Widget's.  Easy peasy.  What I would like to be able to do, is given a gtk.Window, query it for its child widgets.  Unfortunately, that approach doesn't seem like it would be a good idea, given the big variety of ways to pack widgets into a window.  I might have to come up with a case for each and every type of widget-packing class.  Not cool.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What I think will work better is intercepting the gdk.MAP Events, and trying to relate a given Widget to its parent Window at that point in time.  I don't know how well this will work if there are pop-up dialogs or tool windows, or things like that.  I also don't know how well that will work with the Sugar interface, given that everything is effectively a big window.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What I think would be a good way to see how the Events get thrown around when running Sugar.  I think that with the class I've got, I can turn a few things off so that it just prints out all of the Events that are generated.  From there, I can find out which ones I care about, and which ones I don't.  That should give me a good idea of the kind of functionality that will be needed (hopefully).  That's all assuming that Sugar uses PyGTK (which I am 99% sure it does), and that when it launches activities, it keeps them running in the same process (which I am about 50% sure it does).  I'll know later tonight, I guess.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-3300234071394184968?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/3300234071394184968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=3300234071394184968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3300234071394184968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3300234071394184968'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/roadblocks.html' title='Roadblocks'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-1549065145236367785</id><published>2008-05-17T16:43:00.003-05:00</published><updated>2008-05-17T16:51:10.330-05:00</updated><title type='text'>Workin' It Out</title><content type='html'>Still having some issues figuring out how a few things work in kiwi.ui.test's common.py.  I think most of the confusion stems from the fact that some of the functionality implemented in common.py directly interferes with what I'm trying to do, and it takes me a while to catch on.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On a side note, it appears that I might run into some issues with gtk.Entry naming.  Being that Entries do not have any built-in labeling mechanism, the chances that developers are naming the entries properly are slim, I think.  I might have to create a mechanism to create names for entry-boxes.  This runs into the issue of how to reliably name the entries, such that they will receive the same name each time the program is run.  I think it might be better to require developers to give them a meaningful name (or perhaps I can go into the code and do that).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, got my Google 'gift' today.  It's actually a pretty nice book, titled "Beautiful Code" (and O'Reilly book).  Most of the examples are in C\PHP\Java syntax, with what might be Perl scattered here or there.  There is a chapter (Chapter 18: Python's Dictionary Implementation: Being All Things to All People) that is Python-centric, so I might find some useful stuff there.  Unfortunately, that chapter is under ten pages long.  Still, I do the vast majority of my work in C\C++, so this may come in handy :-).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-1549065145236367785?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/1549065145236367785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=1549065145236367785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1549065145236367785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1549065145236367785'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/workin-it-out.html' title='Workin&apos; It Out'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-4834702633156455421</id><published>2008-05-16T14:56:00.004-05:00</published><updated>2008-05-17T20:23:09.659-05:00</updated><title type='text'>It's hard to overstate my satisfaction</title><content type='html'>Small achievement, but it feels nice none-the-less.  Managed to subclass kiwi.ui.test.common.py's WidgetIntrospecter successfully*, and use it to detect button presses.  I should be able to use the same method to invert the processs -- to simulate button presses.\&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Whoops.  Understate != Overstate&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;*Which means that I was correct about my earlier deductions regarding what the code segments do.  Will post the code shortly.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-4834702633156455421?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/4834702633156455421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=4834702633156455421' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4834702633156455421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4834702633156455421'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/its-hard-to-understate-my-satisfaction.html' title='It&apos;s hard to overstate my satisfaction'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-4999767333401884030</id><published>2008-05-16T11:23:00.003-05:00</published><updated>2008-05-16T12:42:40.645-05:00</updated><title type='text'>More kiwi.ui.test</title><content type='html'>I've been looking through kiwi.ui.test since I woke up this morning, and I think I have a reasonable grasp on what a lot of the code does.  A kiwi.ui.test class, WidgetIntrospecter, seems to perform the bulk of the functionality that I'm interested in.  It looks like it's able to function like it does, because it [1] inherits from gobject.GObject, and [2] calls event_handler_set() on one of its methods.  That method then gets to see all of the events that fly around inside of GDK, and then it hands that event off to gtk.main_do_event().  According to the API documentation, that function allows you to force GTK to act on a single event.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The kiwi-specific code seems to be extremely minimal (in WidgetIntrospecter, anyways), so I'm going to play around with the class for a bit, and see if I can get it to run without any 'import kiwi' calls.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;*If anybody would care to explain when it is proper to use GDK versus GTK, it would be greatly appreciated.  I'd prefer to not look like an idiot when talking to someone more savvy :-). &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-4999767333401884030?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/4999767333401884030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=4999767333401884030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4999767333401884030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/4999767333401884030'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/more-kiwiuitest.html' title='More kiwi.ui.test'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-3556903296735100548</id><published>2008-05-15T21:42:00.004-05:00</published><updated>2008-05-15T21:59:13.765-05:00</updated><title type='text'>kiwi.ui.test</title><content type='html'>I was looking for a bit of advice regarding PyGTK in general, so I hopped on the IRC channel today.  I asked a few pretty general questions, and ended up talking to the guy who wrote &lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;a href="http://www.async.com.br/projects/kiwi/"&gt;kiwi&lt;/a&gt;.ui.test&lt;/span&gt;.  I talked a little bit about the implementation, and we agreed that our goals are "very much aligned".  Cool stuff :-)&lt;span class="Apple-style-span" style="font-style: italic;"&gt; (Grig had mentioned kiwi in an email, but I couldn't find any relevant material -- I guess I just didn't look hard enough)&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As far as actual development goes, I didn't do much today.  I spent a while poring through PyGTK API documentation, &lt;span class="Apple-style-span" style="font-style: italic;"&gt;kiwi&lt;/span&gt; source, and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;guitest&lt;/span&gt; source.  Still haven't heard back from the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;guitest&lt;/span&gt; writer.  The only other response I got from the IRC channel seemed to think that GUI automation from a separate process, without relying on accessibility information, wasn't quite sane.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've pretty much abandoned both &lt;a href="http://infinite-sushi.com/software/ecto/"&gt;ecto&lt;/a&gt; and &lt;a href="http://www.red-sweater.com/marsedit/"&gt;MarsEdit&lt;/a&gt;.  ecto wants to force arbitrary compliance on HTML, and MarsEdit provides no WYSIWYG.  Unfortunately, the Blogger WYSIWYG editor doesn't seem to like copy-and-pasting text, without using the right-click-paste method of pasting.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My sleep cycle has been off for the past week (sleep 3AM-Noon), which interferes with my ability to get work done and not be disturbed by my significant other.  I'm getting to sleep early tonight (sometime before midnight) so that I can get up at a reasonable time tomorrow (perhaps 8-9AM).  This should give me significantly increased productivity :-).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-3556903296735100548?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/3556903296735100548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=3556903296735100548' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3556903296735100548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3556903296735100548'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/kiwiuitest.html' title='kiwi.ui.test'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-517544865723059732</id><published>2008-05-15T11:40:00.001-05:00</published><updated>2008-05-15T11:40:19.755-05:00</updated><title type='text'>Dissecting guitest</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px; "&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;So, &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;dogtail&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt; is huge. Really, really &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;huge&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;. So huge, in fact, that I'm a little bit opposed to trying to wrap my mind around it, especially since it has a bit of a documentation problem.  &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;As such, I'm going to stick with playing around with &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;guitest&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt; until I get a response from the &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;GUITAR&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt; guys.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;Back to &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;guitest&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;, it would appear that a vast amount of functionality stems from this little nugget. It looks like the way &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;guitest&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt; works is by hooking pretty much any GTK call you could ever want to make.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span style="font-weight: normal; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;self._original&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;is simply a list of 3-tuples, which are [1] itself, [2] the path, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;gtk.Button&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;, and [3] the original class, e.g. &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;Button&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt; for &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;gtk.Button&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;. I don't understand why it's necessary to store it's own class name... hmm.&lt;br /&gt;&lt;br /&gt;By the way, if anyone knows of a way for me to copy code out of TextMate that retains the syntax coloring, please let me know (extra kudos if I get it in HTML format).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-517544865723059732?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/517544865723059732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=517544865723059732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/517544865723059732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/517544865723059732'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/dissecting-guitest.html' title='Dissecting guitest'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-2190622656531102976</id><published>2008-05-15T11:38:00.001-05:00</published><updated>2008-05-15T11:39:17.349-05:00</updated><title type='text'>GUITAR will have to wait</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px; "&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;div&gt;&lt;div&gt;From:&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;strecker@umd.edu&lt;/div&gt;&lt;div&gt;Subject:&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Re: GUITAR Source Code&lt;/div&gt;&lt;/div&gt;&lt;div&gt;To:&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;Zach Riggle&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Zach, &lt;br /&gt;&lt;br /&gt;Thanks for your interest in GUITAR. Currently, the University of Maryland's IP policy is changing, and we're still waiting to find out under what conditions we can provide the source code. I don't know when we'll find out, but I'll try to remember to notify you when we do. I encourage you to keep checking the project page periodically for updates. Sorry for the inconvenience. &lt;br /&gt;&lt;br /&gt;Jaymie&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-2190622656531102976?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/2190622656531102976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=2190622656531102976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2190622656531102976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/2190622656531102976'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/guitar-will-have-to-wait.html' title='GUITAR will have to wait'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-3803971700449596052</id><published>2008-05-15T11:27:00.004-05:00</published><updated>2008-05-15T11:40:06.127-05:00</updated><title type='text'>Underwhelmed</title><content type='html'>&lt;span class="Apple-style-span"   style="  ;font-family:'Trebuchet MS';font-size:12px;"&gt;&lt;div style="margin-top: 3px; margin-right: 6px; margin-bottom: 3px; margin-left: 6px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font: normal normal normal 12px/normal Helvetica; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); text-align: left; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; background-position: initial initial; "&gt;&lt;div id="ectocontent"&gt;&lt;div&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;After spending a little bit with &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;guitest&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;, I have to say that I am a little bit... underwhelmed at how it's implemented. Being that I haven't really used software that does GUI automation, I wasn't sure what to expect... but given the test examples that were included (along with the &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;complete&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; lack of documentation), I have higher hopes for &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;dogtail&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; and &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;GUITAR&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;I will have to take a close look at dogtail's &lt;/span&gt;&lt;/span&gt;&lt;a href="http://people.redhat.com/zcerza/dogtail/doc/procedural.html"&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;procedural API&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;. It looks like it resembles what I (and I think Titus, as well) have in mind for controlling &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;sugarbot&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&gt; Update: Looks like I spoke too soon. While their procedural API looks like something I'd like to look at a bit more closely, their documentation is &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;sorely&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; lacking.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&gt; Update 2: eMailed the creator of &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; "&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;guitest&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;. I didn't realize that it was 3 years out since it was actively maintained... but hopefully I'll get a response. It appears that he keeps an updated blog (&lt;/span&gt;&lt;/span&gt;&lt;a href="http://gintasm.blogspot.com/"&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;gintasm.blogspot.com&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;), so I'm fairly confident I will.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&gt; Really Not Related: Mail.app's Mailbox&gt;Rebuild command is amazing, if not entirely apparent. I had some duplicated emails that refused to be deleted.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-3803971700449596052?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/3803971700449596052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=3803971700449596052' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3803971700449596052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3803971700449596052'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/underwhelmed-dissecting-guitest.html' title='Underwhelmed'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-3285514271572818404</id><published>2008-05-14T19:12:00.002-05:00</published><updated>2008-05-15T11:26:37.354-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='calculator'/><title type='text'>Working calculator.py</title><content type='html'>&lt;p&gt;Just finished up 'calculator.py', which is available on the &lt;a href="http://code.google.com/p/sugarbot/downloads/list"&gt;downloads page&lt;/a&gt;. Took me a total of about 1 or 2 working hours, most of which was spent looking up API calls for GTK, and figuring out a little bit of calculator logic (particularly, how to handle repeated presses to '=' gracefully).&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic;"&gt;(Please understand that calculator.py is messy, and this is my first attempt at a Python app that wasn't copied-and-pasted or 20 lines long, and my first real GTK app. Kudos to &lt;a href="http://pygtk.org/"&gt;pygtk.org&lt;/a&gt; for having a &lt;a href="http://www.pygtk.org/pygtk2tutorial/" title="decent tutorial section"&gt;decent tutorial section&lt;/a&gt;.)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Setting it up to work with &lt;span style="font-style: italic;"&gt;peekaboo&lt;/span&gt; is trivial, and consists of adding a few lines in main(). I might do that, but leave it commented out if somebody wants to play with it for a few seconds, and doesn't have &lt;span style="font-style: italic;"&gt;figleaf&lt;/span&gt; installed, and &lt;span style="font-style: italic;"&gt;peekaboo&lt;/span&gt; handy.&lt;/p&gt;&lt;p&gt;Step two is going to be to automate a few keypresses using &lt;span style="font-style: italic;"&gt;guitest&lt;/span&gt;. I might play around with &lt;span style="font-style: italic;"&gt;dogtail&lt;/span&gt; as well, although it's been pretty well established that the method used by &lt;span style="font-style: italic;"&gt;dogtail&lt;/span&gt; would prove hard to adapt to Sugar, due to its reliance on accessibility information. I still want to take a peek, perhaps to see how they structured the API? Might be worth it. Still no info from the GUITAR guys at SF.net.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Ecto insists on screwing with my paragraph spacing. FFS&lt;/strong&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-3285514271572818404?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/3285514271572818404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=3285514271572818404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3285514271572818404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/3285514271572818404'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/working-calculatorpy.html' title='Working calculator.py'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-5275313068101832793</id><published>2008-05-13T23:51:00.002-05:00</published><updated>2008-05-15T11:27:00.369-05:00</updated><title type='text'>Playing with peekaboo</title><content type='html'>&lt;p&gt;Was playing around with basic PyGTK and peekaboo today. Nifty little utility, but I can't get it to auto-refresh for the life of me. Dunno what's up with that. The fact that you can do what (I assume) &lt;span style="font-style: italic;"&gt;figleaf/peekaboo&lt;/span&gt; does is amazing. Makes me want to take it apart to see how it works. But I've got other stuff to do in the meantime.&lt;/p&gt;&lt;p&gt;Being that I've devoured enough of &lt;span style="font-style: italic;"&gt;Dive Into Python&lt;/span&gt; (the first 60 pages or so?), I think I'm going to take up a prior recommendation and try to get a concoction of a self-made calculator app and &lt;span style="font-style: italic;"&gt;peekaboo&lt;/span&gt; running tomorrow. I wish that gtk.Widget was documented properly. All of gtk.Widget's function.__doc__ strings are the same crud. All that potential, and it doesn't get used. Oh well.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-5275313068101832793?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/5275313068101832793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=5275313068101832793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5275313068101832793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5275313068101832793'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/playing-with-peekaboo.html' title='Playing with peekaboo'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-8363916930721946412</id><published>2008-05-13T22:16:00.001-05:00</published><updated>2008-05-13T22:18:38.083-05:00</updated><title type='text'>Contacts and Krstić</title><content type='html'>On a note completely unrelated to sugarbot, I got my contacts today.  Not sure whether I like them better than my glasses or not.  I suppose now I can't look like an idiot with glasses slid halfway down my face.&lt;br /&gt;&lt;br /&gt;Grig sent me a link to a blog/notebook &lt;a href="http://radian.org/notebook/sic-transit-gloria-laptopi"&gt;entry&lt;/a&gt; by Ivan Krstić, which talks in a no-bullshit manner about OLPC XO laptops' potential use of Windows as an available operating system.  I share his view on the topic, which is, paraphrased: "BFD. The OS is not important.  What's important is kids learning."&lt;br /&gt;&lt;br /&gt;On a side note, I find it interesting that there is another individual that shares my interest in "breaking computers" that also enjoys "making computers harder to break even more" that &lt;em&gt;also&lt;/em&gt; likes road biking.  I should like to meet Ivan sometime, perhaps go for a ride.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-8363916930721946412?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/8363916930721946412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=8363916930721946412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/8363916930721946412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/8363916930721946412'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/contacts-and-krsti.html' title='Contacts and Krstić'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-5082061147615773271</id><published>2008-05-12T18:10:00.002-05:00</published><updated>2008-05-12T23:55:49.320-05:00</updated><title type='text'>How to Install VMware Tools on Ubuntu Hardy 8.04 under VMware Fusion</title><content type='html'>Well, after spending &lt;span class="Apple-style-span" style="font-style: italic;"&gt;far&lt;/span&gt; too much time trying to figure this all out, here is the cure: &lt;a href="http://peterc.org/2008/62-how-to-install-vmware-tools-on-ubuntu-hardy-804-under-vmware-fusion.html"&gt;peterc.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And on another note, I've got SVN working with TextMate.  &lt;br /&gt;&lt;br /&gt;All this reading has made me realize how badly I need my glasses.  I'm &lt;b&gt;soooo&lt;/b&gt; glad I'm getting contacts tomorrow.  And the "Mapping Lists" feature of Python is voodoo magic.  Why does this not exist in C++? (And how did I go for so long without it?&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; li = [1, 9, 8, 4] &lt;br /&gt;&gt;&gt;&gt; [elem*2 for elem in li] &lt;br /&gt;[2, 18, 16, 8] &lt;br /&gt;&gt;&gt;&gt; li &lt;br /&gt;[1, 9, 8, 4] &lt;br /&gt;&gt;&gt;&gt; li = [elem*2 for elem in li] &lt;br /&gt;&gt;&gt;&gt; li &lt;br /&gt;[2, 18, 16, 8]&lt;/pre&gt;!!!!!!&lt;br /&gt;&lt;br /&gt;So I've got &lt;pre&gt;li = [elem*2 for elem in li]&lt;/pre&gt; versus &lt;pre&gt;&lt;br /&gt;for(int i=0; i&lt; li.size(); i++) li[i]*=2;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-5082061147615773271?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/5082061147615773271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=5082061147615773271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5082061147615773271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/5082061147615773271'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/how-to-install-vmware-tools-on-ubuntu.html' title='How to Install VMware Tools on Ubuntu Hardy 8.04 under VMware Fusion'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699851592369026373.post-1364369206157184308</id><published>2008-05-11T23:34:00.001-05:00</published><updated>2008-05-12T20:39:34.758-05:00</updated><title type='text'>First Post</title><content type='html'>This is where you'll get all your news regarding the Google Summer of Code project, &lt;span class="Apple-style-span" style="font-style: italic;"&gt;sugarbot&lt;/span&gt;.&lt;div&gt;For more information in the meantime, check here: &lt;a href="http://code.google.com/p/sugarbot/"&gt;http://code.google.com/p/sugarbot/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699851592369026373-1364369206157184308?l=gsoc-sugarbot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gsoc-sugarbot.blogspot.com/feeds/1364369206157184308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8699851592369026373&amp;postID=1364369206157184308' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1364369206157184308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699851592369026373/posts/default/1364369206157184308'/><link rel='alternate' type='text/html' href='http://gsoc-sugarbot.blogspot.com/2008/05/first-post.html' title='First Post'/><author><name>Zach</name><uri>http://www.blogger.com/profile/03008329063902532712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_A95zAiNZLCo/SCfLLmt7EzI/AAAAAAAAAGw/wmGh6aY_T6k/S220/Photo+23.jpg'/></author><thr:total>0</thr:total></entry></feed>
