OSU Open Source Lab aggregator http://localhost:8080//aggregator/categories/1 OSU Open Source Lab - aggregated feeds in category Planet OSL en Deborah Bryant: Open Source Voting Systems On the Way http://www.bryantsblog.com/?p=272 <h4><a href="http://www.osdv.org" target="_blank"><img class="size-full wp-image-281 alignleft" style="margin-right: 5px; margin-left: 5px;" title="osvd" src="http://www.bryantsblog.com/wp-content/uploads/2009/02/osvd.jpg" alt="osvd" width="75" height="75" /></a></h4> <p>I&#8217;ve recently been asked to join as an adviser to the Open Source Digital Voting Foundation.  In my view, this is one of the most important open source projects around for the US system of democracy.  I was deeply impressed by their open standards specification,  public trust approach and the work they&#8217;ve done thus far - with little public fan fare - to establish the non-partisan initiative which has become known as &#8220;TrustTheVote!&#8221;.</p> <p>Recognizing a large, active OSS community exists in Oregon, the OSDV is coming to Portland on February 18th to introduce their project.  Although the meeting content is designed for a technical audience, the project overview and progress-to-date would be of interest to many.</p> <p>Here&#8217;s a description of the event.  You can also view details including a map to the event at Portland&#8217;s CubeSpace on <a href="http://tinyurl.com/OpenVoting">Yahoo</a> or <a href="http://calagator.org/events/1250456592">Calagator</a>.  If you&#8217;re in the area, hope to see you there!</p> <h4><span style="color: #000080;">TrustTheVote! intro in Portland, Oregon, Feb 18, 2009</span></h4> <p><span style="color: #000080;">Discover this imperative &#8220;public digital works project&#8221; of the Open Source Digital Voting Foundation. The OSDV Foundation is a Silicon Valley based public benefits corporation whose mission is to work to restore trust in how America votes through the design, development, and demonstration of open source digital voting technology.</span></p> <p><span style="color: #000080;">Join us to learn details about the &#8220;TrustTheVote Project,&#8221; a well funded non-profit effort which has been under the radar for 2 years. The OSDV Foundation is now raising public awareness, and expanding efforts including a planned development center in Portland, Oregon.</span></p> <p><span style="color: #000080;">Our guests are two executives of the Foundation including its Chief Technology Officer. Their presentation will:</span></p> <ul> <li><span style="color: #000080;">Introduce the project, its motivation, founding, and development efforts to date;</span></li> <li><span style="color: #000080;">Walk through the TrustTheVote technology road map and review major projects underway;</span></li> <li><span style="color: #000080;">Discuss development philosophies and approaches including experience-driven design and test-driven agile development;</span></li> <li><span style="color: #000080;">Review opportunities for systems architects, software developers, SDQA/test specialists, and user experience designers;</span></li> <li><span style="color: #000080;">Cover plans to expand the volunteer developer teams, future opportunities for senior members of technical staff, and opportunities for you to get involved.</span></li> </ul> <p><span style="color: #000080;">Presenters:<br /> Gregory Miller, Chief Development Officer</span><br /> <span style="color: #000080;"><span style="color: #000080;">E. John</span> Sebes, Chief Technology Officer</span></p> <p><a href="http://tinyurl.com/OpenVoting">event on: Yahoo</a> or <a href="http://calagator.org/events/1250456592">Calagator</a></p> <script type="text/javascript"> addthis_url = 'http%3A%2F%2Fwww.bryantsblog.com%2F%3Fp%3D272'; addthis_title = 'Open+Source+Voting+Systems+On+the+Way'; addthis_pub = ''; </script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script> Mon, 02 Feb 2009 17:20:25 +0000 Lance Albertson: Switched to WordPress and here’s why http://www.lancealbertson.com/2009/01/switched-to-wordpress-and-heres-why/ <p>In my first post on my new blog I mentioned that I decided to use <a href="http://www.drupal.org">Drupal</a> for my main blog site. As you can probably notice by the footers on this page I&#8217;m no longer using Drupal and decided to go back to <a href="http://www.wordpress.org">WordPress</a>. I noticed several people at the last <a href="http://corvallis.beerandblog.com">Corvallis Beer and Blog</a> asked me about it. That made me think I should write a blog post about my journey, or at least the short version of it.</p> <p>There were several reasons for this but it basically boiled down to using the right tool for the right job. Drupal is an amazing platform for managing and generating dynamic html content. Its plugin and theming system is one of the best out there. Unfortunately, I&#8217;m no Drupal guru (even though we host them at the <a href="http://osuosl.org">OSL</a>) and had several issues getting some things working like I wanted.</p> <p>So why WordPress? Well, it seems like everyone in my region raves about it plus I tried the 2.7 version and saw how simple it was to administrate and setup. The ability to install plugins without ssh&#8217;ing into the machine was  a key feature that I just loved. Here&#8217;s a few of the things that I really like about WP.</p> <ul> <li>Installing/Upgrading plugins easily</li> <li>Categories/Tags are easy to setup</li> <li>TinyMCE is installed and works flawlessly</li> <li>Comment spam is easier to handle</li> <li>The editing flow is less busy</li> <li>Found a theme that is simple, elegant, and easy to customize the header image</li> </ul> <p>While I agree Drupal can essentially do all the things above, it requires more researching, googling, tweaking, and trail and error to get it right. I spent a week or two combing the interwebs trying to find a defining site or blog post that explained everything. I found several sites that had decent information, but it wasn&#8217;t explained in a manner that made sense to me. The whole concept of taxonomy is just strange to me and in WP its stupidly simple. To me Drupal is like the <a href="http://www.gentoo.org">Gentoo</a> of blog software. It&#8217;s great and awesome if you know how to tweak it and use it properly, but for a blogging n00b like me, its just too much hassle for me to do deal with. I think Drupal has some great documentation, its in no comparison to the simple ones like Gentoo has (which is a large part of why people can install it).</p> <p>So what does Drupal need to do? A few simple things would have made my life easier:</p> <ul> <li>Create a page or site describing in detail how to setup similar features that modern blogs like WordPress have (categories, tags, etc)</li> <li>Implement module installation via Drupal</li> <li>Implement module upgrades via Drupal</li> <li>Create a Blog centric theme similar to K2</li> <li>Make it easier for people to use Drupal but keeping it simple for normal bloggers</li> </ul> <p>I may go back to Drupal someday but I need to understand it more. I really think Drupal is an awesome project and its ability is far superior than any other CMS out there. But for a blog its just a bit too hardcore for the average blogger. Hopefully that will change in a few years.</p> Fri, 30 Jan 2009 02:49:52 +0000 Frédéric Wenzel: 54 Percent Firefox Users http://fredericiana.com/2009/01/28/54-percent-firefox-users/ <p>Today I looked at this blog&#8217;s usage statistics and as it turns out, a whopping <strong>54 percent of my visitors use Firefox</strong>, followed by Internet Explorer, then Safari, Opera, Chrome.</p> <p><img src="http://fredericiana.com/wp-content/uploads/2009/01/fredericiana-browser-statistics.jpg" alt="fredericiana Browser Statistics" title="fredericiana Browser Statistics" width="327" height="261" class="alignnone size-full wp-image-2015" /></p> <p>It&#8217;s interesting to see how much difference the &#8220;clientele&#8221; of a page makes for its statistics. The overall market share of Firefox has <a href="http://blog.mozilla.com/metrics/2008/11/03/its-official-firefox-surpasses-20-worldwide-market-share/">topped 20%</a> a few months ago, but since this blog has a lot of tech content, a higher number of Firefox users is probably not surprising.</p> <p>By the way, almost 80% of my Firefox visitors surf with Firefox 3.0.5, followed by only 5% of 2.0.0.20 users and a long tail of various other, outdated, browser versions.</p> Wed, 28 Jan 2009 17:24:04 +0000 Jeff Sheltren: Blog Cloud http://sheltren.com/wordle <p>Here's the <a href="http://www.wordle.net">wordle</a> generated cloud of my blog posts. Seems pretty cool! I think I say "community" too much :)</p> <p><img src="http://sheltren.com/sites/default/files/blog_wordle.png" alt="Blog Word Cloud" /></p> Fri, 09 Jan 2009 23:24:43 +0000 Deborah Bryant: A trip to Matsue in February 2009 http://www.bryantsblog.com/?p=266 <p>I&#8217;m taking <a href="http://dplr.it/guest/1d3f5fc0557f61cad925">a trip to Matsue</a> between March 8th and March 14th 2009.</p> <p>Lecture, participate in Shimane University&#8217;Project: &#8220;Stabilization and Business Models for Open Source Software through the Cooperation of Industry, Government, Academia, and the Software Developers&#8217; Community&#8221;</p> <script type="text/javascript"> addthis_url = 'http%3A%2F%2Fwww.bryantsblog.com%2F%3Fp%3D266'; addthis_title = 'A+trip+to+Matsue+in+February+2009'; addthis_pub = ''; </script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script> Tue, 30 Dec 2008 00:55:44 +0000 Frédéric Wenzel: More Cloud! http://fredericiana.com/2008/12/14/more-cloud/ <p>There&#8217;s been a nice little meme going on in the <a href="http://planet.mozilla.org">Mozilla blogosphere</a> during this last week: Running your blog through the <a href="http://www.wordle.net/">wordle &#8220;word cloud&#8221; generator</a>, then posting it. Here is mine:</p> <p><a href="http://fredericiana.com/wp-content/uploads/2008/12/wordle-fredericiana.jpg"><img src="http://fredericiana.com/wp-content/uploads/2008/12/wordle-fredericiana-575x298.jpg" alt="Wordle on fredericiana" title="Wordle on fredericiana" width="575" height="298" class="alignnone size-medium wp-image-1870" /></a></p> <p>Comes to no surprise that &#8220;German&#8221; and &#8220;Germany&#8221; are two of the most-used words here &#8212; I sure hope I am not boring my readership to death by giving them intercultural lessons here <img src='http://fredericiana.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p> <p>Anyway, if you post yours, feel free to send a ping to this article, or leave a comment with the link to your blog. I am looking forward to seeing how others&#8217; <em>word clouds</em> look!</p> Mon, 15 Dec 2008 00:25:42 +0000 Greg Lund-Chaix: Moodle starting to catch on http://staff.osuosl.org/~gchaix/2008/09/12/moodle-starting-to-catch-on/ <p>Wow &#8230; the past six months have been interesting in Moodle-land. As of this morning we&#8217;re up to 10,850 users (both teachers and students), 1488 courses, and 173 Moodle instances. Clearly classes in Oregon&#8217;s K-12 public schools have started.</p> Fri, 12 Sep 2008 19:27:41 +0000 Lars Lohn: it’s a geeky meme http://staff.osuosl.org/~lohnk/blog/?p=30 <p>lars@bozeman:~$ history|awk &#8216;{a[$2]++} END{for(i in a){printf &#8220;%5d\t%s\n&#8221;,a[i],i}}&#8217;|sort -rn|head<br /> 133 cd<br /> 114 ls<br /> 44 svn<br /> 31 vi<br /> 28 python<br /> 24 ssh<br /> 21 ./ConfigurationManager.py<br /> 17 make<br /> 13 rsync</p> <p>It looks to me like I spend too much time moving around the file system. I should try to type more pathnames and stick around in one place&#8230;</p> Mon, 14 Apr 2008 02:46:07 +0000 Lars Lohn: Sanity Compromised by Firefox and ssh X Forwarding http://staff.osuosl.org/~lohnk/blog/?p=29 <p>Try this in Linux: open Firefox on your local machine. Then open a terminal window and ssh to another machine using the -X option for X forwarding. On the remote machine, start Firefox. The behavior I get is so bizarre that it cannot be a bug &#8212; somehow this looks intentional. The Firefox process on the remote machine sits for a few moments and then <em>dies.</em> Then a new <em>local</em> Firefox window opens. WTF?</p> <p>I thought I was going insane. The people at the OSL that I told about this thought I was insane. The Mozilla developers that I work with and tried to explain this to thought I was insane.</p> <p>Some research shows this: the remote Firefox actually starts and communicates with the X server running on the local machine. The X server tells the remote Firefox that there is already a process called Firefox running. The remote Firefox then sends a message to the local one to open a new window and then the remote Firefox dies. This protects a user from creating too many instances of a Firefox process on their machine. Clever, huh? But totally <em>WRONG</em> and counterintuitive!</p> <p>Apparently you can stop this behavior if you start the remote Firefox with the intuitively named &#8220;no-remote&#8221; switch. That prevents the remote Firefox from &#8220;connecting&#8221; to the local Firefox.</p> <p>Sigh, there goes an hour of my life that I&#8217;d like to have back&#8230;</p> Fri, 07 Mar 2008 03:48:08 +0000 Lars Lohn: Python Generators: Searching Java Jar Files http://staff.osuosl.org/~lohnk/blog/?p=26 <p>Here is an example of a utility that uses a recursive generator. It is a command line utility that assists Java programmers in finding missing classes. I wrote this script several pears ago when I was dragged kicking and screaming into a Java project.  The script recursively searches a directory tree for jar files. When it finds a jar file, it scans the file&#8217;s directory for the target Java class.</p> <pre> #!/usr/bin/python import sys, os, os.path import fnmatch def findFileGenerator(rootDirectory, acceptanceFunction): for aCurrentDirectoryItem in [ os.path.join(rootDirectory, x) for x in os.listdir(rootDirectory) ]: if acceptanceFunction(aCurrentDirectoryItem): yield aCurrentDirectoryItem if os.path.isdir(aCurrentDirectoryItem): for aSubdirectoryItem in findFileGenerator(aCurrentDirectoryItem, acceptanceFunction): yield aSubdirectoryItem if __name__ == "__main__": rootOfSearch = '.' if sys.argv[1:]: rootOfSearch = sys.argv[1] if sys.argv[2:]: classnameFragment = sys.argv[2].replace('.', '/') def anAcceptanceFunction (itemToTest): return not os.path.isdir(itemToTest) and fnmatch.fnmatch(itemToTest, '*.jar') and classnameFragment in os.popen('jar -tf %s' % itemToTest).read() else: def anAcceptanceFunction (itemToTest): return not os.path.isdir(itemToTest) and fnmatch.fnmatch(itemToTest, '*.jar') try: for x in findFileGenerator(rootOfSearch, anAcceptanceFunction): print x except Exception, anException: print anException</pre> <p>The focus is on the generator function findFileGenerator. It creates an iterator for the results of a recursive search through a directory tree. It accepts as parameters a path to begin the search and a function to determine if a given file satisfies the search parameters.</p> <p>Generators can be kind of confusing because even though they look like a function, they do not execute immediately when called. They return a reference to an object that works like an iterator. The code defined in the generator function is executed by that iterator object. The first time that the iterator&#8217;s &#8216;next&#8217; function is called, execution begins at the beginning of the code and goes until it encounters a &#8216;yield&#8217; statement. The &#8216;yield&#8217; statement returns the next value of the iterator. The next time the &#8216;next&#8217; function is called, execution resumes at the next statement after the &#8216;yield&#8217;.</p> <p>Let&#8217;s examine this example closely. Imagine that the first call to the iterator has happened and we&#8217;ve got the resultant iterator-like object. The first call on that object to &#8216;next&#8217; starts execution at this line:</p> <pre> for aCurrentDirectoryItem in [ os.path.join(rootDirectory, x) for x in os.listdir(rootDirectory) ]:</pre> <p>Here we&#8217;re getting our first directory listing of all the files in the current directory. Because the call to &#8216;os.listdir(rootDirectory)&#8217; returns a list of file names with their paths stripped off, we&#8217;re going to have to re-attach them. The list comprehension (the code between the [ &#8230; ]) welds the current directory path to each of the files in the list and returns a new list. The for loop then sets us up to iterate through that list.</p> <pre> if acceptanceFunction(aCurrentDirectoryItem): yield aCurrentDirectoryItem</pre> <p>Here&#8217;s where we decide if the current entry in this directory is interesting or not. We call the acceptance function on the item. Since the acceptance function is passed in when we originally called this generator, it could be anything the programmer desired. In the case of this particular utility, we&#8217;re looking for Java Jar files that meet a certain criteria. But it really could have been anything at all: find all files that have vowels in their name, or all files that have a specific type or content.<br /> If the acceptance function returns &#8216;True&#8217;, then we yield. The current file is returned by the iterator and execution stops until the &#8216;next&#8217; function is called.</p> <pre> if os.path.isdir(aCurrentDirectoryItem):</pre> <p>If the acceptance function rejected the item, this is immediately the next line to execute. If the acceptance function accepted the item, this line won&#8217;t be called until after the next call to &#8216;next&#8217;. In either case, our goal is to find the next item for the iterator to return.</p> <p>Since we&#8217;re iterating through a list of entries in a directory, some of those will be directories themselves. The item that we sent to the acceptance function could have been a subdirectory. Regardless of the outcome of the acceptance function, we need to recurse into subdirectories.</p> <pre> for aSubdirectoryItem in findFileGenerator(aCurrentDirectoryItem, acceptanceFunction): yield aSubdirectoryItem</pre> <p>Hang onto your hat, here&#8217;s where your brain may explode. We&#8217;ve got a sub-directory and we need to recurse into it and iterate through its entries. Well, we&#8217;ve got this handy generator that does exact that: it returns an iterator that will cycle through the contents of directory. &#8216;for&#8217; statements in Python have a special relationship with iterators. You can provide one instead of a list and the &#8216;for&#8217; loop will dutifully iterate through them for you. We recursively call the generator, passing in the subdirectory and the acceptance function. The generator returns an iterator to us and the for statement starts the iteration by silently calling the next function. Remember that the iterator returns only items that have passed the acceptance function, so each item that we get here we&#8217;re just going to pass on as the next item in our iterator. Hence, we yield every item that we get in this loop.</p> <p>The rest of the file is in the problem domain: a command line utility that will find Java Jar files with certain classes in them.</p> <pre> if __name__ == "__main__":</pre> <p>Perhaps someday in the future, we&#8217;ll want to use the generator in another application. By putting the code of the command line utility under this &#8216;if&#8217;, we&#8217;ll prevent it from executing when we use the &#8216;import&#8217; statement on this file.</p> <pre> rootOfSearch = '.' if sys.argv[1:]: rootOfSearch = sys.argv[1]</pre> <p>The root of the path that we&#8217;re to search is option on the command line. If no path is specified, we&#8217;ll assume that we&#8217;re to start in the current working directory.</p> <pre> if sys.argv[2:]: classnameFragment = sys.argv[2].replace('.', '/') def anAcceptanceFunction (itemToTest): return not os.path.isdir(itemToTest) and fnmatch.fnmatch(itemToTest, '*.jar') and classnameFragment in os.popen('jar -tf %s' % itemToTest).read()</pre> <p>The name of the class that we&#8217;re to search for is also optional. If the user does not provide one, then we&#8217;ll assume that we&#8217;re to just find all jar files regardless of their content.</p> <p>This code fragment is the other case: a fragment of a class name has been given. It is our task here to create an acceptance function that meets the criterion.</p> <p>First thing to do is cook the class name a bit. In Java, class names are qualifies with paths. Inside Java code, &#8216;.&#8217; is used as a separator. However, inside jar files, &#8216;/&#8217; is the separator. To be friendly, we want Java programmers to be able to use either notation. We make sure the command line argument is converted to the &#8216;/&#8217; notation and stored in &#8216;classnameFragment&#8217;. Next we define an acceptance function that receives a pathname as a parameter. All we have to do is subject that pathname to some tests and give it either a thumbs up or down. In this case, we test to see if the pathname represents a directory, then test to see if it is a jar file and finally we run the command line function &#8216;jar \-tf&#8217; to give us a listing of the jar to see if our class name fragment is in there. Since Python can do &#8220;short-circuit&#8221; expression evaluation, if any of the earlier tests fail in the boolean expression, the other tests do not get executed.</p> <pre> else: def anAcceptanceFunction (itemToTest): return not os.path.isdir(itemToTest) and fnmatch.fnmatch(itemToTest, '*.jar')</pre> <p>In the case where the user did not provide a class name fragment, we assume that we&#8217;re looking for all jar files. The acceptance function here just drops the additional criterion where we looking into the content of the jar file.</p> <pre> try: for x in findFileGenerator(rootOfSearch, anAcceptanceFunction): print x except Exception, anException: print anException</pre> <p>Finally, we &#8216;re ready to actually use the tools. We call the generator function with the path from which to start the search and our acceptance function. That returns an iterator that we loop through and print the matching jar files.</p> Mon, 03 Mar 2008 02:02:56 +0000