May 16, 2012

New updates for the Fedora 17

Wow, its been a busy week for Fedora Audio.

I have finally updated the LV2 stack - this includes the new lv2 1.0.0 specification package containing all of the specification bundles and extensions. Previously it looked like we would have to package all of the extensions as separate packages, but after some gentle coercion from myself and others Dave Robillard has decided to release them together. This obsoletes the lv2core package, while providing access to all of the much needed extensions.

Along with the LV2, Dave has released updates to serd, sord, suil, lilv and the new packages sratom (required by the new lilv) and  jalv, a simple LV2 host. All now available in Fedora 17 updates testing. All of this makes Fedora a more attractive programming environment for LV2 developers.

I've also pushed updates to lv2-kn0ck0ut, rosegarden (12.04) and guitarix (0.22.3), with qtractor (minus MP3 support) to follow.

May 08, 2012

Google Summer of Fedora/Aeolus/Ruby

As some of you may know, Fedora was recently accepted, as a participating organization into the Google Summer of Code. Shortly after this was announced, Buddhika (our Fedora GSoC Admin and Coordinator) circulated a RFC for projects to improve the Fedora distribution as part of this effort. I submitted a few proposals to mentor myself, and am pleased to say there quite a bit of interest by various students, a few of which are now officially working on the various topics.

Specifically Samridh Srinath will be working on improving the Aeolus user experience on Fedora, implementing various aspect of the command line interface and core API features needed to drive it, and Zuhao Wan will be working on a site to highlight and promote the Fedora / Ruby experience, providing a simple one-stop-shop to query for Ruby related packages in Fedora and to assist in the migration process.

Unfortunately, not all of the students who applied were able to be accepted into the GSoC due to the limited number of slots we had available. Both Nitesh Narayan and Furhan Shabir are talented students who submitted strong proposals to work on Aeolus but weren't able to secure the official sponsorship. That being said, both have graciously volunteered to donate some time to assist with the project for which I would like to thank them greatly for.

All in all, I'm looking forward to working with these talented students over the course of the summer and beyond. Stay tuned for more updates as the projects progress and the proposals are implemented.

Until next time, happy hacking!

read more

May 06, 2012

JSON-RPC Presentation - Brno Ruby Users Group - 26.04.2012

On the Thursday before last I gave a presentation on the JSON-RPC protocol and my implementation of it to the Brno Ruby Users Group. You may find the slides here as well some code examples in Ruby and Javascript here.

RJR is a simple implementation of the JSON-RPC 2.0 standard, using eventmachine on the backend to serve JSON-RPC requests over a multitude of transport types including amqp, http, websockets, tcp/udp, and more. It permits method handlers to be registered and then invoked via any transport the end-user wishes (and the server admin permits access to).

The context of the request is made available to the handler when it is invoked, so that the developer can manage flow control accordingly and store any additional metadata in the requests and responses to extend the JSON-RPC protocol in any manner they desire.

The source code is freely available on github, any patches/issues/etc would be more than welcome. Happy hacking!

read more

May 01, 2012

LAC 2012 Conference Videos Online

The 10th anniversery of the Linux Audio Conference was held this year at CCRMA (Center for Computer Research in Music and Acoustics), Stanford University, California.Unfortunately I was unable to attend but have been still able to enjoy all of the presentations. You can view all of the slides and video presentations here. The topics on show are wide and vareid, so there should be something of interest for everyone. For a history of Linux audio, I recommend checking out Dave Phillips keynote address.

April 30, 2012

Brno Trip Update

How I've been busy in the past few weeks. Between working, sightseeing, and plenty of other activities, I've had no chance till now to sit down and write some content for the blog. Now that I'm approaching the 1/2 way point of my trip, I have to say I've had a phenominal time so far, my European collegues at Red Hat are a group of extremely talented guys who are also very fun to work and hang out with. I'm enjoying my stay in the Czech Republic, the people are friendly, there is plenty to do, and overall a pleasant experience. So far my trip over the last few weeks looked like (hover over the images for descriptions, to view full size right click and select 'view image'):

  • April 3rd/4th: Flight from Syracuse to Newark, NJ to Copenhagen, Denmark to Prague, CZ; Caught the train from Prague to Brno (overall about ~24hrs worth of traveling)
  • Met my coworker Tomas at the Brno train station (he's been a momumental help with the entire trip, a very friendly person and extremely talented engineer). Moved into my apartment here

  • Thu/Fri April 5th/6th: Started working out of the Brno office, met all the other Aeolus and Ruby developers working out of here (all around the same age as me, another +), found my way around town including using the public transports and grocery shopping


  • My first weekend I explored Brno on foot, I saw the historic old town, the Špilberk castle, the Cathedral of St. Peter and Paul, and got a general feel for the area. Brno is a great city, a good size, not too large that it feels crowded, but not too small that there is nothing todo. It is a university town though, so lots of students, but has plenty of great places to hang out, grab a bite or drink, or do various activities
  • The following week primarily consisted of work (it's refreshing to be back in an office working w/ my collegues in person), and attending Aikido class with my collegues Tomas and Petr, both who regularily go. The Sensai here is a city cop that focuses on practical self defense which is different than the more theoretical appoach Sensai Mehter teaches back in Syracuse. Both are good to practice, though I still prefer the dojo back home.
  • This week, we also celebrated Red Hat's Billion Dollar Bash in the Brno office. The facilities here arrainged a very fun scavenger hunt around the city, which culminated at the Brno Museum of Technology right by the RH office. The party there was great, lots of great food and treats, and was good to meet developers and other RH employees working on all sorts of projects @ the company.

  • I also visited the Brno Hackerspace, Base48 this week, which a few of my collegues are members of. It was great seeing yet another Hackerspace in person, and we all shared plenty of stories of our experiences so far. It seems like they're running into many of the same issues we had w/ the SIG, and I assume many others have had worldwide but overall are doing great and working on some cool projects.
  • Was thinking about going to Prague or Vienna on the weekend of the 14th, but ended up just hanging out and relaxing w/ my co-workers after the long week. When I book my flight back from Europe, I'm planning on booking a hotel in Prague for a few days to check out that city.
  • The next week was more work, on Wed 4/18 I decided to swing a last minute trip to Amsterdam in the Netherlands. I left via overnight train on the night of the 19th and arrived the morning of Friday 4/20/12. Stayed until Sunday evening when I caught another overnight train back (had reserved a bed in a couchette both ways). The whole experience was remarkable, Amsterdam truly is a magical city; a melting-pot of European cultures, there is a happy and laid back atmosphere in the air, and a "clock-work" feel to the city (think of those old antique clocks w/ lots of moving gears). There is just so much to see and do (I suggest exploring it on foot), between the canals and city parks, to the museums, to the restaurants, coffee-shops, and nightlife, Amsterdam has it all, and overall based on first impressions of the big cities I visited, Amsterdam takes the cake. I stayed in a hostel Friday and Saturday nights which was an interesting experience, the people I ended up staying with were all really friendly and nothing sketchy or bad happend, but I'm not sure if I'd want to do it again (similarily while I got lots of sleep on the train, it was a weird feeling having other passengers come and go from the cabin I was staying in in the middle of the night when I was sleeping). Unfortunately Amsterdam is a touristy city though, things are expensive and there are lots of tourist attractions (at several points I noticed a stark constast between the old and the new worlds, like a modern carnival which was operating in the plaze of one of the cities biggest / oldest churches). Also when you get down to it, it is a big city, which I can't ever see myself permenatly living in (I tend to prefer smaller cities, and areas with lots of nature and large state parks within a very short distance). All in all though, the weekend in Amsterdam was a great time, and I would eagerly jump at the opportuninty to visit again

  • On Monday of last week the team went go-karting which was a blast followed by ribs and beer :-) One of the best things about the Czech republic is how inexpensive everything is (that is to an American visitor), a good stack of ribs won't cost you more that $6 or $7 USD, tips included. Also a pint of good beer will only run you a dollar or two. Life is good in the Czech republic :-)

  • On the following Wednesday, my UK collegue left to fly back home, so saw him off before working. Had a great time hanging out with Martyn over the last few weeks, and it's good to put a face and memories behind an IRC handle. Work in general has been great, have been getting alot done both on the Aeolus and Ruby/Fedora side of things as well as on my side projects. There have been some exciting updates to everything I've been working on, I've pushed new additions to Snap, have been working with a few students on now-accepted proposals for the Google Summer of Code (which I am now a mentor of, more on this in the near future), have been learning a great deal as far as security and hardening a Rails application is concerned, and am putting a presentation together for the Brno Ruby Users Group (on JSON-RPC and my RJR project), and much more. Look for more details on alot of these in the near future
  • Also went rock climbing for the first time since high school on Thursday with some co-workers. Was a fun time and a great workout, a good whole body excercise (especially the upper body and shoulders). I'm looking forward to going again and perhaps trying to find a place back in Syracuse that I frequent and improve my technique
  • Furthmore I went for a long bike ride around the Brno Lake and Reservoir and then Ziplining nearby on Sunday with the same co-workers. All in all we ended up biking around 35 Kilometes, and saw Veveří Castle in the process, and while our initial attempts on the Zipline weren't all that successful, it was all a great workout and plenty of fun. Definetly more activities that I'm looking forward to doing again when I get the chance (quite possibly this week! :-) ).

All in all so far the trip has been a blast, I've met so many interesting people from many different places. From my collegues who come from all over Europe (the Czech Republic, Slovakia, Hungary, Italy, Russia, the UK, and more), to random people at all the various places I've visited / stayed at, people are genuently friendly and helpful and always willing to swap stories with a foreigner. There are places right out of the movies and yet places which seem unique in their own right and unlike anywhere else. I'm looking forward to the rest of my stay. Besides Prague, I'd like to visit at least one other European city and/or take in some of the country side (I was thinking about renting a car and just driving around the a bit).

Stay tuned for more updates coming soon! Until then, Chow!

read more

April 01, 2012

Roadmap Discussions #1

Today I announced on the mailing list a bunch of ideas I'd been kicking around for inclusion in the Audio spin. You could read the full thread here, but to summarize:

  • installation media requirements. I'm proposing a smaller Live CD (lite) and a full blown DVD installer.
  • default Desktop for both installations. I would like something with a really small size/footprint for the Live CD. Perhaps we can try LXDE for the smaller and KDE for the DVD?
  • default set of packages for both
  • revisit multimedia-menus package and determine which packages need additional Categories in the desktop file
  • how best to package the Musicians guide
  • how to achieve optimal RT performance from the stock kernel (adding threadirqs to the kernel command, assigning jackuser/pulse-rt group membership)
  • default pulse/jack setup with pulse->jack bridging 'out-of-the-box'
  • determine what packages from CCRMA and RPMFusion are must haves in the Fedora repos and can be rebuilt to comply with Fedora licensing.
  • desktop style and icons on install- darker themes are an obvious choice for audio (often poor lighting etc) but can be a pain for normal use. There are ways around this (Arch linux has some good tips for achieving this - perhaps we just need to document it somewhere)
  • and of course updating the Wikis

March 27, 2012

RubyConf India, 2012
This was my/the 3rd RubyConf, first time in Pune. Like last year, I couldn't/wouldn't submit a talk. But I did manage to buy a ticket in time, before they got sold out. My friends were over, and very dear to me that they are, we stayed up Friday night playing UNO, until it was 7am. 8am I was up and reached the Hyatt Regency venue by 9.

Day 1

After the Welcome speech, it was Charles @headius Nutter with his keynote on JRuby and other Ruby VMs. It was great to know how the other ruby VMs were coming along, and how IronRuby was dying. Next was a recorded video keynote by Matz. I started missing the first RubyConf India, where we had the opportunity of having Matz on a Skype video conference. Matz said one place Ruby lags behind Python is SciPy and NumPy, and they would focus on having that in Ruby in the next few years.

After a coffee-break I was attending Ruby CLI talk byNikhil Mungel and Shishir Das. I was a bit put off on having to see only slides in a talk which could have made more interesting by throwing in some cool CLI demos. Next I was attending Tejas Dinkar and Jasim A Basheer's talk on Sandboxing Ruby Code, where they discussed their experiences on developing rubymonk.com.

As usual, lunch was awesome. I met lots of people, unlike my previous RubyConfs, where I operated as a lone shark.

Post lunch (and a bit drowsy) I was attending the Everything Ruby talk by Ajay Gore. It wasn't very interesting. Next up during the Clojure talk by Steven Deobald, I was feeling a bit lost. Noticing nothing interesting lined up next, I headed home.

Day 2

Next morning's keynote was by Mikel Lindsaar. It was a motivational speech, which talked about purpose and value exchange in software development and life in general.

Post coffee, I attended Sou Sheong's talk on Sex, Money and Evolution. That was one of the most interesting talks I have ever seen. He took some virtual bots called roids, and simulated a culture of them after adding external parameters like energy (money), reproduction (sex) and natural selection (evolution). The result was a beautiful visualization of life. Most of it was written using Ruby and R, so I would have been a happy puppy has he demonstrated some of his code. But the source code is on github, so I could have a look at it later. The session was very interactive.

I tried attending the next talk titled "What lies beneath the beautiful code", but the sheer uninterestingness, and the fact that people started walking out ensured I followed suit.

Lunch, again, was full of #win.

Post lunch I attended "Smells and patterns in test/spec code", by Sidu Ponnappa and Aninda Kundu. It talked about the anti-patterns while writing tests. After that I spent some time in the Hack Room discussing some list archive crawler ideas with Anurag, and clicking photos, which I won't publish. No.
Later I found myself in the method_missing should be recursive talk by Matthew Kirk.

Post a couple_of_cutting_chai_and_sandwiches, I was attending the lighting talks. Highlights were nursery_rhymes.rb by Shakthi Kannan and Users == Bugs by Charles Nutter. And that was how RubyConf India 2012 ended.

Some observations

The quality of talks this time wasn't really upto the mark. Some talks were really great, but some were just downright bad. Most of the talks were unrelated to the Ruby language. And many failed to excite the audience. I know it's easy to criticize when I myself didn't submit a talk, but then I will make sure that doesn't happen in RubyConf India 2013.

March 19, 2012

A translation editor for DTD resources
Hi,

I am Shreyank and I will be mentoring the project "A translation editor for DTD resources" under Ankur India.
Since Ankur India has been accepted as a GSoC Organisation, I am hoping to get a lot of queries on what the project is really about. If you are reading this post, it is possible that you have asked me a query, the answer to which I have here.
<background></background>

<background>

Although Ankur India deals mostly with issues relating to the Bengali language, this project idea is not specific to Bengali.

A very common translation workflow consists of translating po files, which in turn are used within applications using gettext. One can use tools like lokalize, gtranslator etc which reads the po files, provides a GUI to help translate the strings and save them back to language specific po files. Thus a file relating to Bengali strings would go into a file called bn_IN.po.

<background\>

Although a lot of translation use cases are covered by po files, some aren't. For example, Mozilla uses DTD and properties files for the purpose. The idea is to extend the existing localisation tool(s) to cover these type of data files.

A logical first step would be to write an engine which is able to read dtd/properties files, take user input for translations and write a new language specific file. This program should be modular and API driven so that it can be quickly used to extend with any existing localisation tool, desktop or web based. On the other hand one should be able to quickly extend the engine to work with other similar data files.

Once that is ready it should be integrated with an existing translation tool, preferably a desktop app so that we have a proof of concept and a finished product which can be used by translators.

The application should be platform independent and can be written in the programmers choice of language, keeping in mind the scalability and portability.

With the above points clear, I'm open to any other suggestions on how to best approach the problem. In case you have any further doubts mail me at shreyankg AT gmail DOT com and I'll be happy to take up questions.

March 18, 2012

Working from Brno, CZ (04/12 - 06/12)

Starting next month I will be spending some time working onsite w/ my teammates at Redhat Brno in the Czech Republic. This will be my first trip to Europe and I am fully looking forward to going, not only have the previous times I spent working from the office (Raleigh, Boston, NYC) been great networking experiences, but this will be the furthest of my more recent adventures yet (I did visit Egypt on a few occasions during my youth) and I am looking forward to seeing the new culture first hand. During this trip I will be renting an apartment with fellow teammate Martyn from the UK who will also be visiting during the month of April.

I am also planning on visiting a few other cities during my stay, including Prague, Vienna, and Amsterdam. If anyone wants me to bring them back any souvenirs, just ask! And make sure to stay tuned for more updates!

read more

March 12, 2012

Audio Spin in the Media

Recently I was approached by www.Muktware.com, a Linux and Free Software magazine, to provide some more information about the Fedora Audio spin.

You can read more here: http://www.muktware.com/news/3445/fedora-audio-spin-creating-music-fedor....

March 10, 2012

Fedora Project Accepted as a GSoC Mentoring Organization

You can find the complete ideas page on the Fedora wiki here.

Fedora Audio Creation Spin

Status: Proposed

Summary of idea: To create a Fedora Audio spin showcasing the rich and diverse landscape of Linux Audio production.

The Fedora Audio Creation SIG is a collection of enthusiastic Fedora users driven by the common desire to make the best Linux distribution also the best for Music creation and Audio Production. We are looking for one or two candidates to assist us in the complete development cycle of this project. Tasks may include (but not limited to):

  • packaging open source audio projects
  • porting certain packages from the PlanetCCRMA repository into Fedora
  • working/communicating with the Fedora Audio community to determine the final make-up of the spin
  • help coordinate pushing the spin through the Spins Review process
  • creating/testing kickstart files
  • developing small applications/scripts to help solve hardware and audio system configuration requirements
  • communicating with Fedora Audio SIG, Fedora Desktop team and other Fedora teams
  • organizing QA testcases and test days

Ideally, interested candidates will have a passion for Music/Audio Production. Basic scripting knowledge and the ability to compile projects from source is a must. Sponsored packagers / knowledge of the Fedora Packaging Guidelines and/or the desire to continuing maintaining the packaged software post-project considered a plus.

Interested? Why wait, submit an audio package for review and get sponsored (Join_the_package_collection_maintainers).

Knowledge prerequisite: Scripting/programming (bash/python)

Skill level: Rudimentry

Contacts: Brendan Jones

Mentor(s): Brendan Jones

March 03, 2012

GTK Programming w/ Python

mmorsi-presentation

This Wednesday, I will be giving a talk at the March Syracuse Linux Users Group meeting on Programming GTK interfaces w/ PyGTK (along w/ Glade and GOBject Introspection). You can find my presentation here, which I made with showoff (source here, more on this in a subsequent blogpost) and is probably my most ahem interesting presentation to this date (at least I like to think so ;-) ).

As far as the $topic matter itself, cross-platform GUI development has never been easier due to a few simple tools. GTK is available on many platforms, and using Glade you can easily whip up an interface that suites your needs. Wiring up event handlers and the backend code is a cinch due to the gobject bindings which gtk provides that we are able to leverage from a Python app.

glade

Along w/ the presentation I'm planning on giving a quick demo on how to perform these steps, creating a simple Desktop based twitter client. You can download the glade xml file here and the python app itself (also see below). Simply run it with $ python syrlug_demo.py but note you will need to have the python twitter library installed (# sudo yum install python-twitter on Fedora).

demo interface

Of course this is just the beginning, you can easily expand the interface by editing the XML in Glade and adding new event handlers to the Python script to do whatever you would like.

import os
import time
import threading
import twitter
from gi.repository import Gtk, Gdk, GObject
 
INPUT_TEXT='twitter username'
 
GLADE_FILE = os.path.join(os.path.dirname( __file__ ), 'layout.glade')
 
# A worker thread to get twitter data
class WorkerThread(threading.Thread):
    terminate = False
    twitter_username = None
    twitter_text = ''
 
    def set_buffer(self, buffer):
      self.buffer = buffer
 
    def run(self):
       while(not self.terminate):
         api = twitter.Api()
         self.twitter_text = ''
         if self.twitter_username != None:
           try:
             for status in api.GetUserTimeline(self.twitter_username):
               self.twitter_text += status.text + "\n"
           except:
             pass
           Gdk.threads_enter()
           self.buffer.set_text(self.twitter_text)
           Gdk.threads_leave()
         time.sleep(5)
 
# The Main Window
class SyrlugDemoWindow:
    def __init__(self):
       self.builder = Gtk.Builder() 
       self.builder.add_objects_from_file(GLADE_FILE, ["syrlug_demo", "twitter_username", "twitter_text"])
       self.window = self.builder.get_object("syrlug_demo") 
       self.username_input = self.builder.get_object("twitter_username") 
 
       self.username_input.set_text(INPUT_TEXT)
 
       self.worker = WorkerThread()
       self.worker.set_buffer(self.builder.get_object("twitter_text").get_buffer());
       self.worker.start()
 
       self.builder.connect_signals(self)
       self.window.connect("destroy", self.close_window)
       self.window.show()
 
    def close_window(self, widget):
        self.worker.terminate = True
        Gtk.main_quit()
 
    def subscribe_button_clicked(self, widget):
        input_text = self.username_input.get_text() 
        if input_text != INPUT_TEXT and input_text != "":
            self.worker.twitter_username = input_text
 
    def twitter_username_focus_in(self, widget, param):
        if widget.get_text() == INPUT_TEXT:
            widget.set_text("")
            #widget.set_visibility(False)
 
    def twitter_username_focus_out(self, widget, param):
        if widget.get_text() == "":
            widget.set_text(INPUT_TEXT)
            #widget.set_visibility(True)
 
if __name__ == "__main__":
    # initialize window
    win = SyrlugDemoWindow()
 
    # start gtk loop
    Gdk.threads_init()
    GObject.threads_init()
    Gdk.threads_enter()
    Gtk.main()
    Gdk.threads_leave()

Now lets see some of those GTK apps!

read more

February 29, 2012

Updated Puppet Web Resource Module

Some of you may recall the Puppet Web Resource type and provider which I wrote for Aeolus a while back. The module has since undergone alot of improvment from various contributers, and was finally accepted and uploaded to the Puppet module forge. You may download it from there and simply drop it into your puppet module load path to access the resource in all its glory!

Some additional features since I last shared this include

  • support for http basic auth,
  • cookies support,
  • extended request invokation conditions (eg 'only invoke request if <condition> is true' and 'invoke request unless <prerequisite web request> is successful, etc),
  • extended response verifications ('contains', 'does not contain', xpath and response status verification),
  • extended logging,
  • and several various other features.

For reference here is the updated web resource type and provider:

lib/puppet/provider/type/web_request.rb

require 'uri'
 
# A puppet resource type used to access resources on the World Wide Web
Puppet::Type.newtype(:web_request) do
    @doc = "Issue a request to a resource on the world wide web"
 
    private
 
    # Validates uris passed in
    def self.validate_uri(url)
      begin
        uri = URI.parse(url)
        raise ArgumentError, "Specified uri #{url} is not valid" if ![URI::HTTP, URI::HTTPS].include?(uri.class)
      rescue URI::InvalidURIError
        raise ArgumentError, "Specified uri #{url} is not valid"
      end
    end
 
    # Validates http statuses passed in
    def self.validate_http_status(status)
      status = [status] unless status.is_a?(Array)
      status.each { |stat|
        stat = stat.to_s
        unless ['100', '101', '102', '122',
                '200', '201', '202', '203', '204', '205', '206', '207', '226',
                '300', '301', '302', '303', '304', '305', '306', '307',
                '400', '401', '402', '403', '404', '405', '406', '407', '408', '409',
                '410', '411', '412', '413', '414', '415', '416', '417', '418',
                '422', '423', '424', '425', '426', '444', '449', '450', '499',
                '500', '501', '502', '503', '504', '505', '506', '507', '508', ' 509', '510'
                ].include?(stat)
          raise ArgumentError, "Invalid http status code #{stat} specified"
        end
      }
    end
 
    # Convert singular params into arrays of strings
    def self.munge_array_params(value)
      value = [value] unless value.is_a?(Array)
      value = value.collect { |val| val.to_s }
      value
    end
 
    newparam :name
 
    newproperty(:get) do
      desc "Issue get request to the specified uri"
      validate do |value| Puppet::Type::Web_request.validate_uri(value) end
    end
 
    newproperty(:post) do
      desc "Issue post request to the specified uri"
      validate do |value| Puppet::Type::Web_request.validate_uri(value) end
    end
 
    newproperty(:delete) do
      desc "Issue delete request to the specified uri"
      validate do |value| Puppet::Type::Web_request.validate_uri(value) end
    end
 
    newproperty(:put) do
      desc "Issue put request to the specified uri"
      validate do |value| Puppet::Type::Web_request.validate_uri(value) end
    end
 
    newparam(:parameters) do
      desc "Hash of parameters to include in the web request"
    end
 
    newparam(:file_parameters) do
      desc "Hash of file parameters to include in the web request"
    end
 
    newparam(:follow) do
      desc "Boolean indicating if redirects should be followed"
      newvalues(:true, :false)
    end
 
    newparam(:store_cookies_at) do
      desc "String indicating where session cookies should be stored"
    end
 
    newparam(:use_cookies_at) do
      desc "String indicating where session cookies should be read from"
    end
 
    newparam(:remove_cookies) do
      desc "Boolean indicating if cookies should be removed after using them"
      newvalues(:true, :false)
    end
 
    newparam(:returns) do
      desc "Expected http return codes of the request"
      defaultto ["200"]
      validate do |value| Puppet::Type::Web_request.validate_http_status(value) end
      munge    do |value| Puppet::Type::Web_request.munge_array_params(value)   end
    end
 
    newparam(:does_not_return) do
      desc "Unexecpected http return codes of the request"
      validate do |value| Puppet::Type::Web_request.validate_http_status(value) end
      munge    do |value| Puppet::Type::Web_request.munge_array_params(value)   end
    end
 
    newparam(:contains) do
      desc "XPath to verify as part of the result"
      munge    do |value| Puppet::Type::Web_request.munge_array_params(value)   end
    end
 
    newparam(:does_not_contain) do
      desc "XPath to verify as not being part of the result"
      munge    do |value| Puppet::Type::Web_request.munge_array_params(value)   end
    end
 
    newparam(:log_to) do
      desc "Log requests/responses to the specified file or directory"
    end
 
    newparam(:only_log_errors) do
      desc "Boolean indicating if we should only log responses which did not pass validations"
      newvalues(:true, :false)
    end
 
    newparam(:if) do
      desc "Invoke request only if the specified request returns true"
    end
 
    newparam(:unless) do
      desc "Invoke request unless the specified request returns true"
    end
 
    newparam(:username) do
      desc "HTTP authentication username"
    end
 
    newparam(:password) do
      desc "HTTP authentication password"
    end
 
end

lib/puppet/provider/web_request/curl.rb

require 'fileutils'
 
# Provides an interface to curl using the curb gem for puppet
require 'curb'
 
# uses nokogiri to verify responses w/ xpath
require 'nokogiri'
 
class Curl::Easy
 
  # Format request parameters for the specified request method
  def self.format_params(method, params, file_params)
    if([:get, :delete].include?(method))
      return params.collect { |k,v| "#{k}=#{v}" }.join("&") unless params.nil?
      return ""
    end
    # post, put:
    cparams = []
    params.each_pair      { |k,v| cparams << Curl::PostField.content(k,v) } unless params.nil?
    file_params.each_pair { |k,v| cparams << Curl::PostField.file(k,v)    } unless file_params.nil?
    return cparams
  end
 
  # Format a url for the specified request method, base uri, and parameters
  def self.format_url(method, uri, params)
    if([:get, :delete].include?(method))
      url = uri
      url +=  ";" + format_params(method, params)
      return url
    end
    # post, put:
    return uri
  end
 
  # Invoke a new curl request and return result
  def self.web_request(method, uri, params = {})
    raise Puppet::Error, "Must specify http method (#{method}) and uri (#{uri})" if method.nil? || uri.nil?
 
    curl = self.new
 
    if params.has_key?(:cookie) && !params[:cookie].nil?
      curl.enable_cookies = true
      curl.cookiefile = params[:cookie]
      curl.cookiejar  = params[:cookie]
    end
 
    if params.has_key?(:username) && !params[:username].nil?
      curl.username = params[:username]
    end
 
    if params.has_key?(:password) && !params[:password].nil?
      curl.password = params[:password]
    end
 
    curl.follow_location = (params.has_key?(:follow) && params[:follow])
    request_params = params[:parameters]
    file_params    = params[:file_parameters]
 
    case(method)
    when 'get'
      curl.url = format_url(method, uri, request_params)
      curl.http_get
      return curl
 
    when 'post'
      curl.url = format_url(method, uri, request_params)
      curl.multipart_form_post = true if !file_params.nil? && file_params.size > 0
      curl.http_post(*format_params(method, request_params, file_params))
      return curl
 
    when 'put'
      curl.url = format_url(method, uri, request_params)
      curl.multipart_form_post = true if !file_params.nil? && file_params.size > 0
      curl.http_put(*format_params(method, request_params, file_params))
      return curl
 
    when 'delete'
      curl.url = format_url(method, uri, request_params)
      curl.http_delete
      return curl
    end
  end
 
  def valid_status_code?(valid_values=[])
    valid_values.include?(response_code.to_s)
  end
 
  def valid_xpath?(xpath="/")
    !Nokogiri::HTML(body_str.to_s).xpath(xpath.to_s).empty?
  end
 
end
 
# Puppet provider definition
Puppet::Type.type(:web_request).provide :curl do
  desc "Use curl to access web resources"
 
  def get
    @uri
  end
 
  def post
    @uri
  end
 
  def delete
    @uri
  end
 
  def put
    @uri
  end
 
  def get=(uri)
    @uri = uri
    process_params('get', @resource, uri)
  end
 
  def post=(uri)
    @uri = uri
    process_params('post', @resource, uri)
  end
 
  def delete=(uri)
    @uri = uri
    process_params('delete', @resource, uri)
  end
 
  def put=(uri)
    @uri = uri
    process_params('put', @resource, uri)
  end
 
  private
 
  # Helper to process/parse web parameters
  def process_params(request_method, params, uri)
    begin
      error = nil
      cookies = nil
      if params[:store_cookies_at]
        if File.exist?(params[:store_cookies_at])
          File.truncate(params[:store_cookies_at], 0)
        else
          FileUtils.touch(params[:store_cookies_at])
        end
        cookies = params[:store_cookies_at]
      elsif params[:use_cookies_at]
        cookies = params[:use_cookies_at]
      end
 
      # verify that we should actually run the request
      return if skip_request?(params, cookies)
 
      # Actually run the request and verify the result
      result = Curl::Easy::web_request(request_method, uri,
                                       :parameters => params[:parameters],
                                       :file_parameters => params[:file_parameters],
                                       :cookie => cookies,
                                       :follow => params[:follow],
                                       :username => params[:username],
                                       :password => params[:password])
 
      result_body = result.body_str.to_s
 
      verify_result(result,
                    :returns          => params[:returns],
                    :does_not_return  => params[:does_not_return],
                    :contains         => params[:contains],
                    :does_not_contain => params[:does_not_contain] )
 
      result.close
 
    rescue Exception => e
      error = e
      raise Puppet::Error, "An exception was raised when invoking web request: #{e}"
 
    ensure
      unless result.nil?
        log_response(:result => result_body,
                     :method => request_method, :uri => uri,
                     :puppet_params => params,  :error => error)
      end
      FileUtils.rm_f(cookies) if params[:remove_cookies]
    end
  end
 
  # Helper to determine if we should skip the request
  def skip_request?(params, cookie = nil)
    [:if, :unless].each { |c|
      condition = params[c]
      unless condition.nil?
        method = (condition.keys & ['get', 'post', 'delete', 'put']).first
        result = Curl::Easy::web_request(method, condition[method],
                                         :parameters => condition['parameters'],
                                         :file_parameters => condition['file_parameters'],
                                         :cookie => cookie, :follow => params[:follow])
        result_succeeded = true
        begin
          verify_result(result, condition)
        rescue Puppet::Error
          result_succeeded = false
        end
        return true if (c == :if && !result_succeeded) || (c == :unless && result_succeeded)
      end
    }
    return false
  end
 
  # Helper to verify the response
  def verify_result(result, verify = {})
    verify[:returns]          = verify['returns']          if verify[:returns].nil?          && !verify['returns'].nil?
    verify[:does_not_return]  = verify['does_not_return']  if verify[:does_not_return].nil?  && !verify['does_not_return'].nil?
    verify[:contains]         = verify['contains']         if verify[:contains].nil?         && !verify['contains'].nil?
    verify[:does_not_contain] = verify['does_not_contain'] if verify[:does_not_contain].nil? && !verify['does_not_contain'].nil?
 
    if !verify[:returns].nil? &&
       !result.valid_status_code?(verify[:returns])
         raise Puppet::Error, "Invalid HTTP Return Code: #{result.response_code},
                               was expecting one of #{verify[:returns].join(", ")}"
    end
 
    if !verify[:does_not_return].nil? &&
       result.valid_status_code?(verify[:does_not_return])
         raise Puppet::Error, "Invalid HTTP Return Code: #{result.response_code},
                               was not expecting one of #{verify[:does_not_return].join(", ")}"
    end
 
    if !verify[:contains].nil? &&
       !result.valid_xpath?(verify[:contains])
         raise Puppet::Error, "Expecting #{verify[:contains]} in the result"
    end
 
    if !verify[:does_not_contain].nil? &&
       result.valid_xpath?(verify[:does_not_contain])
         raise Puppet::Error, "Not expecting #{verify[:does_not_contain]} in the result"
    end
  end
 
  def log_response(params)
    method  = params[:method]
    uri     = params[:uri]
    result  = params[:result]
    error   = params[:error]
    puppet_params = params[:puppet_params]
 
    if puppet_params[:log_to]
      return if puppet_params[:only_log_errors] == :true && error.nil?
      logfile = puppet_params[:log_to].strip
      exists = File.exists?(logfile)
      isfile = File.file?(logfile) || (!exists && (logfile[-1].chr != '/'))
      if !isfile
        FileUtils.mkdir_p(logfile) if !exists
	      logfile += puppet_params[:name]
      end
 
      f = File.open(logfile, 'a')
      f.write("=====BEGIN=====\n")
      f.write(Time.now.strftime("%Y-%m-%d %H:%M:%S"))
      f.write(" #{method} request to #{uri}\n")
      f.write(result.to_s)
      f.write("\n=====END=====\n\n")
      f.close
    end
  end
end

As always, Happy Puppeteering!

read more

January 16, 2012

Fudcon Blacksburg Report

Just got back from Fudcon Blacksburg. As always, it was a great time. Arrived after driving down (10 hrs) Thursday evening and crashed quickly after checking into my accommodations (The Inn at Virginia Tech). Friday, the first day, was hackfests, I attended the Fedora Infrastructure meeting and held a few sessions around Aeolus where I talked with passer by's about the project, my Snap subproject and what people were looking for out of an open source IaaS cloud abstraction platform. Specifically at FUDCon I aimed to find out how people wanted to interface w/ the cloud on the Fedora desktop and how they wanted to use the Aeolus stack. We ended up modifying Snap a little to add some command line options and began
messing around w/ mycloud a c level cloud computing API I started throwing together to meet people's needs. Dinner that night was at a good indian place.

The second day was the barcamp sessions, I volunteered to do another session on Aeolus, which went well, there were plenty of newcomers interested in the projects and I was able to share what was in development and upcoming things on the platform. After lunch several of us from the ruby-sig met to hold the now traditional ruby-sig meeting at FUDCon (we held one in Toronto, one was held in Milan, and now this was the third at Blacksburg). We got alot done including:

  • tested out the new Ruby 1.9.3 repository (messed around w/ getting Aeolus working on MRI 1.9.3)
  • discussed updates to the new packaging guidelines, and updates to the the ruby stack
  • looked into possibly using macros to assist w/ building gems for multiple ruby interpreters on Fedora (jeroen volunteered to start investigating thing one, this would be a feature coming furthur down the pipeline)
  • discussed the rvm / bundler ecosystems, and again how to drive and market the Fedora philosophy of a single supported stack while delivering the ultimate development platform for the ruby-community
  • looked into continuing building tools and applications which to enhance the Ruby experience on Fedora, I volunteered to build a isitfedoraruby website (akin to itisruby19.org) to demo and highlight fedora on ruby and to start reaching out to the cloud-sig and other Fedora communities to promote and highlight the product/platform.
  • continuing to extend / expand / improve gem2rpm, polisher, and other gem/rpm interoperability tools

Next I attended the session on OpenStack, a popular build-your-own-cloud platform (one of the platforms supported by deltacloud) and learned a bit more about the internals and how it is constructed. Finally the lightning talks session was the last on Saturday, and a must for any FUDCon attendee. There were many pitches, including several for new fedora components including hosted instances of mock infra apps, a discussion on what motivates and how to drive open source contributions, a demonstration on how to inject code into running Python processes using "parasite" by lmacken, an overview of foss@rit by remmy dekaukusburg and the narcissus web visualizations by ralph bean. I ended up pitching mycloud and snap again as well as my own Nethack Encyclopedia project, inviting fellow explorers of the mazes of menace to bring the guide :-)

FUDPub was fun, as always a good time, featuring bowling and lots of tastey food and held at the Blacksburg student center this time around.

I'm writing this from my hotel room Sunday morning as I pack up and prepare for the 10hr drive hack. Overall a great time, have plenty to keep me busy going forward, and am looking forward to the next FUDCon!

read more

January 03, 2012

Forthcoming: MRI Ruby 1.9 in Fedora

The Fedora Ruby SIG is in the process of updating the main Ruby package in Fedora to Ruby 1.9. We hope to get it in by Fedora 17, while shipping a Ruby 1.8 compatability package for those who wish to continue using the older version (though more and more upstream projects are phasing this out). Alternatively, since JRuby is now in Fedora, end-users may opt to utilize that interpreter for both Ruby 1.8 and 1.9 support.

The Ruby 1.9 effort is being led by Vit Ondruch who has done alot of the packaging work and submitted the initial guidelines draft, which we are currently discussing/revising on the mailing lists. They are largely an extension of the existing guidelines to better nail things down and cover various issues that have come up over the years, but all are welcome to join the discussion and share their comments / opinions on the best way to move forward.

A Ruby 1.9.3 testing repository has been setup for those who wish to try the new packages out. Feel free to share any feedback or issues on list.

read more

January 01, 2012

Book Review: Altered Carbon

Having finished my long trek through Anathem a little while back, I was left craving for another epic sci-fi tale. Living up to his previous classic, Snow Crash, Neal Stephenson's Anathem is an amazing thrill-ride, full of intense action, profound philosophy (drawing on thousands of years of mathematics, science, and metaphysics), and overall an unbelievable story. Stephenson is truly a remarkable author, and while he deals with very-deep topics, there is a good chance that anyone will be able to find at least one of his worlds that draws them in. Surprisingly I couldn't get into Cryptonomicon when I tried not too long ago, but admittedly I didn't get terribly far into it before I gave up and might have to give it another go. There are plenty of reviews of Anathem online, so I will leave it up to my readers to read more about it through those, but needless to say I highly recommend the novel.

I ordered two books with relatively good reviews off of Amazon, Hyperion (a space opera) and the second being Altered Carbon by Richard K Morgan, a nitty gritty cyberpunk tale similar to Snow Crash. I tried the former first, but again try as I might I could not get into it, so I decided to give Altered Carbon a go, and was very pleasantly surprised.

Altered Carbon is the tale of Takeshi Kovacs as he investigates the 'murder' of Laurens Bancroft, a very rich and powerful business magnate in futuristic San Francisco, now called Bay City. By this point in time, actual real deaths are fairly uncommon, as it is a widespread practice to store one's identity, memories, and conscience 'on stack', which is able to be downloaded into temporary bodies known as 'sleeves' at any point in time after. Morgan's vivid and rich imagery paints a world that lives up to any cyberpunk setting portrayed to date, including perhaps the ultimate cyberpunk novel, Neuromancer by William Gibson. Chalk full of concepts such as virtual-realities, technology based augmentations, drug induced psychological and physiological alterations, interstellar travel, conspiring artificial intelligences, oriental philosophy, intense martial arts action, and much more, Kovacs' investigation keeps the reader glued to the edge of his/her seat and makes it hard to put the book down even for a second.

The novel is a good read, not so challenging that it will be lost on anyone (unlike Anathem and Snow Crash which are complete mind-benders), but also not too simplistic that it will bore. The chapters are fairly short and to the point, making for a good airplane or subway read, while the overall story fits together and flows nicely. Without spoiling any more, I highly suggest it to anyone that is into the genre, it won't disappoint!

read more

December 23, 2011

Messing around w/ HTML5: drag-n-drop

In my last html5 blog post we explored using the canvas to recreate a simple version of pong. This time around we'll be using the drag-and-drop features of HTML5 for a simple example. Note I'm pulling in the JQuery UI library to take care of alot of the details and provide a easy-to-use interface to use drag-and-drop.

In this example, we have a list of images which we'd like to pull into a common area. The thing is, the original list should be preserved, once dragged-in, an image should not disappear from its original location.

This is accomplished by using jquery to set the images in the list to being draggable (this registers the necessary event handlers), and to make the common area droppable, eg able to receive draggable objects. JQuery allows us to set the 'helper' attribute, which defines the element being dragged around, to the predefined 'clone' value which makes a copy of the original element. From there we expand the container div to accept only the elements we want to drag in, and override the 'drop' method to set various properties allowing us to position and style the dropped element any way we would like.

All in all the effect is the following:

<script type="text/javascript"> $(function(){ $('.jquery_drag_drop_example_img').draggable({ helper: 'clone', }); $('#jquery_drag_drop_example_container').droppable({ accept: '.jquery_drag_drop_example_img', drop: function(event, ui){ var newitem = $(ui.draggable).clone(); $(this).append(newitem); $(newitem).addClass("jquery_drag_drop_example_img_clone"); $(newitem).removeClass("ui-draggable jquery_drag_drop_example_img"); $(newitem).draggable({containment: 'parent'}); $(newitem).css('position', 'absolute'); $(newitem).css('top', ui.position.top ); $(newitem).css('left', ui.position.left); //alert(event.dataTransfer.getData('text')); } }); }); </script>

And the source producing this:

<div id="jquery_drag_drop_example_container"
     style="width: 300px; height: 300px; background: #C0C0C0; float:left;">
</div>
<div style="background: #FFFF99; float:left; width: 20%; margin-left: 10px;">
<ul style="list-style-type: none; list-style-position: inside;">
  <li><img class="jquery_drag_drop_example_img" src="example_0.png" /></li>
  <li><img class="jquery_drag_drop_example_img" src="example_1.png" /></li>
  <li><img class="jquery_drag_drop_example_img" src="example_2.png" /></li>
  <li><img class="jquery_drag_drop_example_img" src="example_3.png" /></li>
  <li><img class="jquery_drag_drop_example_img" src="example_4.png" /></li>
</ul>
</div>
<div style="clear: both;"></div>

<script type="text/javascript">
$(function(){
  $('.jquery_drag_drop_example_img').draggable({
    helper: 'clone',
  }); 
  $('#jquery_drag_drop_example_container').droppable({
    accept: '.jquery_drag_drop_example_img',
    drop: function(event, ui){
      var newitem = $(ui.draggable).clone();
      $(this).append(newitem);
      $(newitem).addClass("jquery_drag_drop_example_img_clone");
      $(newitem).removeClass("ui-draggable jquery_drag_drop_example_img");
      $(newitem).draggable({containment: 'parent'});
      $(newitem).css('position', 'absolute');
      $(newitem).css('top', ui.position.top ); 
      $(newitem).css('left', ui.position.left);
      //alert(event.dataTransfer.getData('text'));
    }   
  }); 
});
</script>

Thats it until next time. Hope everyone enjoys the holidays!

read more

December 20, 2011

Snap! Updates

Alot of great development on Snap! recently. Here are some updates (see the commit log for the full list):

- incorporated full test harness
- many documentation improvements / fixes
- many code cleanups / optimizations
- starting adding ability to migrate snapshots between OS's (for example Ubuntu to Fedora and vice-versa)
- pushed snap into Fedora! (simply install via 'yum install snap' on Fedora15+ and RHEL6, should be pushed into Debian / Ubuntu soon)

Stay tuned for more updates!

read more

December 19, 2011

Various Quick Tips

Just a bunch of random quick tips, posted together for conciseness

---------------------------

Passwordless SSH'ing as root

When writing the test harness for Snap I needed to setup a few vms which I could ssh into as root automatically, without being prompted for a password. True, I could've setup a ssh key and install that on the vms, but instead for simplicity I wanted to be able to ssh in w/out requiring any credentials (yes insecure, but these VMs are isolated and the test harness makes sure they are shutdown post-invocation).

On Fedora/Ubuntu this is accomplished by:
- editing /etc/ssh/sshd_config an setting 'PermitEmptyPasswords yes'
- Ubuntu requires one additional config change, to /etc/pam.d/sshd, namely comment out '@include common-auth' and replace with 'auth required pam_unix.so nullok'
- restarting ssh: 'sudo service sshd restart'
- setting sshd to come up automatically 'sudo chkconfig --levels 35 sshd on'
- finally delete the root user's password 'sudo passwd -d root'

Now you can ssh root@<ip_address> to login as root w/out a password (obviously use with caution).

Incidentally this is also a means to get a root shell on Ubuntu, which by default does not allow this, requiring the user to run all privileged commands through 'sudo'

---------------------------

xbacklight

I've run into a problem w/ the backlight not resuming normal operation after my laptop has been dock'd. This seems to be a common issue, even on the Linux friendly Lenovo Thinkpad laptops.

After some debugging I was able to resolve this by installing the 'xbacklight' package and running 'xbacklight -set 100'.

---------------------------

C Data Structure Visibility Practices

I've been getting back into C programming (more on this soon). Of course w/ a lower-level language (C is actually a high level language, though usually considered low-level, but I digress) there are many approaches / ways to do things, especially concerning data visibility. Studying the libvirt library header file, I found one useful standard is to:

- define public data structures, eg structures which can be manually instantiated by the user, as you normally would, eg

typedef struct _myData{
  ...fields...
} myData;
 
typedef myDataPtr *myData;

- define private data structures, or data which can only be instantiated by calling one of your methods, w/ forward declerations in the public header, with the private definitions residing in an internal-only header/implementation file, eg

typedef struct _privateData privateData;
typedef privateDataPtr *privateData;
 
privateDataPtr createPrivateData(...params...);

- define public data structures refering to data managed / manipulated by an external entity, as 'info' structures, (these will often be associated w/ private data in some way) eg

typedef struct _externalDataInfo {
  ...fields about data managed elsewhere...
} externalDataInfo;
 
typedef externalDataInfoPtr *externalDataInfo;
 
externalDataInfoPtr getExternalDataInfo(privateDataPtr private_data);

---------------------------

Per Host SSH Key

Many thanks to jkeating for this pro-tip. To set which ssh key to use on a per-host basis, simply create a ~/.ssh/config file (chmod'd to 600) containing the following contents:

Host <hostname>
IdentityFile <path-to-ssh-key>

Also optionally specify 'User <username>' to not have to prefix your remote username to the hostname when logging in w/ a username different than your local one.

---------------------------

Thats all folks!

read more

December 10, 2011

Plasma PackageKit integration approved as a Fedora 17 feature

I am proud to announce that my Plasma PackageKit Integration GSoC 2011 project has been approved as an official Fedora 17 feature.

In other news, I have recently laid the first stone for a port of my work to KDE Frameworks 5, by getting support for a plasma5 namespace into PackageKit.


December 05, 2011

libvirtd default network on a vm
I've run into this issue so many times that I figure I'd share the solution incase anyone else has a similar problem. If you are running libvirtd on a vm which was in itself started by libvirt, make sure you change the network address of the default libvirt network on the vm. Or alternatively simply run the following command to shut it down:

$ sudo virsh net-destroy default

This is because otherwise the addresses of the libvirt created networks running on the vm and your host machine will clash and cause conflicts / routing errors.

Hope this helps!

read more

October 18, 2011

Planning FUDCon Pune



I'm in charge of Wireless and Charging Points at FUDCon, Pune.

http://openetherpad.org/fudcon-pune-planning contains the ongoing planning details.

September 28, 2011

GSoC is over, but my code lives

The GSoC deadline is now over. I passed the final evaluation and got my payment, still waiting for the t-shirt and certificate though. But the fact that the deadline has passed doesn’t mean I stopped maintaining the code. This week, the telepathy-kde-presence-applet has landed in Rawhide, which made me find and fix a few issues in my GSoC work:

  1. The RPM auto-Provides script got confused by plasma-scriptengine-applet-declarative.desktop in kde-runtime, which has a X-KDE-PluginInfo-Name different from the X-Plasma-API (the name is qmlscript, the API is declarativeappletscript). The dependency extractor was preferring the X-KDE-PluginInfo-Name, but that name is not used for script engines, only the API is relevant. This is fixed by this kde-settings commit, in kde-settings-4.7-8.fc17.
  2. The data engine dependency extraction did not support declarativeappletscript QML code. I updated the patch to add support for that feature.
  3. The plasma-dataengine-depextractor was passing a relative path to KDesktopFile, which misinterpreted it as relative to applnk rather than to the current directory. I fixed the patch to use QDir::absoluteFilePath instead of QDir::filePath.
  4. The plasma-dataengine-depextractor was requiring the user or script calling it to explicitly pass the scripting API/language used through an --api argument. That information is already provided by the .desktop file, which is required anyway, so I dropped the useless parameter and changed the code to detect the scripting API automatically. (If anybody is already using the plasma-dataengine-depextractor: please just remove any -a language or --api language argument you’re passing, it is now all detected automatically.)

Unfortunately, I haven’t been able to build the updated data engine dependency extraction patch into Rawhide yet because the kdelibs build fails due to an unrelated issue with isnan.

UPDATE: glibc has been fixed in Rawhide, and kdelibs-4.7.1-4.fc17 was built successfully.


September 20, 2011

Pycon India 2011, Pune
So I attended Pycon India for the first time in three years it has existed. It was held in Bangalore the previous two years, and I was being lazy.
Ratnadeep was put up at my place. I had originally decided not to attend the tutorials, but then since Ratnadeep wanted to attend, I decided to show up as well.

Day 1

Tutorials on Friday was a bit boring, considering they were long, and I wasn't exactly the student types. Navin Kabra had a session about Web API Programming using Python where I lingered for a while. I did however attend a part of Anand Chitipothu's session on Functional Programming. I liked the slides he made using Landslide. Must check that out sometime.

Day 2

Raymond Hettinger had his keynote on why Python is awesome. His talk highlighted what makes Python different from other languages. Then Anand Chitipothu had a talk on pyjs, which is a way to compile python code into JS. The talk was good, especially the AST parts. After lunch I went to attend Sajjad's talk on developing Android apps using Python. Track 2 was jampacked with more people waiting outside, so the talk was moved to Track 1 which was more spacious. Noufal then took the stage with his talk on using Emacs as a Python IDE, which then got side tracked to org mode. The rest of the day I spent chit-chatting.

Day 3

Sunday meant, my talk had to be delivered soon, and my slides were somewhat ready. Nevertheless I spend some (a_lot_of) time retouching the slides and doing up code examples. I was there, half-attentive to Jace's talk on the LastUser Service. It looked interesting and I am planning to use it for the FUDCon COD installation. After lunch and coffee, (and an indecent where I mixed up my laptop with Anurag's, and spend multiple attempts trying to log-in into his system), I gave my talk, on developing Django Apps based on REST Architecture (slides| video). For what it's worth, it wasn't very well received by the audience. Also this was the largest audience I ever had. Met people and photographed then the rest of the day.

All in all a good conference. Kudos to the organising team.

Below are some of the pictures I took at the conference.

<object height="375" width="500"> <param name="flashvars" value="offsite=true&amp;lang=en-us&amp;page_show_url=%2Fphotos%2Fshreyankg%2Fsets%2F72157627711726378%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2Fshreyankg%2Fsets%2F72157627711726378%2F&amp;set_id=72157627711726378&amp;jump_to="/> <param name="movie" value="http://www.flickr.com/apps/slideshow/show.swf?v=107931"/> <param name="allowFullScreen" value="true"/> <embed allowfullscreen="true" flashvars="offsite=true&amp;lang=en-us&amp;page_show_url=%2Fphotos%2Fshreyankg%2Fsets%2F72157627711726378%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2Fshreyankg%2Fsets%2F72157627711726378%2F&amp;set_id=72157627711726378&amp;jump_to=" height="375" src="http://www.flickr.com/apps/slideshow/show.swf?v=107931" type="application/x-shockwave-flash" width="500"></embed></object>

August 20, 2011

Plasma/RPM/PackageKit GSoC work now in Rawhide

My GSoC 2011 work has now fully entered Rawhide, i.e. what will eventually become Fedora 17 and later.

The PackageKit portions of the work have already been in Rawhide for a while:

I have just imported the remaining portions of the work into Rawhide:

  • kde-settings-4.7-4.fc17 includes the RPM dependency generators.
  • I have rebuilt kdelibs, kdebase-runtime, kdebase-workspace and kdeplasma-addons to pick up the new Provides. Other packages will automatically pick up Provides and script engine Requires the next time they are rebuilt. (For data engine Requires, you will want to run the new plasma-dataengine-depextractor in kdelibs-devel during the build process, unless/until the upstream metadata.desktop includes an X-Plasma-RequiredDataEngines entry.)
  • kdelibs-4.7.0-3.fc17 includes all the libplasma portions of my GSoC project (as backported patches).

The new features should now be fully testable in Rawhide.

Update: I built kde-settings-4.7-5.fc17, which fixes showstopper bug #732271. (I also fixed a related issue in libplasma in kdelibs-4.7.0-4.fc17, but that fix should not be strictly required because the only thing I use Plasma::PackageMetadata::serviceType() for is to figure out the precise type of script engine to verify the presence of, and if I don’t have a service type, I just conservatively look for any script engine for the language, which should be fine as they tend to be packaged together anyway.)


August 17, 2011

Plasma + PackageKit: The last piece of the puzzle

I have just submitted a patch which implement automatic scanning of the source code of Plasma-related packages (e.g. widgets) for required data engines.

For packages in scripting languages and distributed through Open Collaboration Services (OCS), this is fully automatic and triggered from Package::installPackage. If an X-Plasma-RequiredDataEngines entry is present in the .desktop file (even if empty), the dependency extraction is not run and the explicitly provided information is trusted instead.

For native distribution packages, my patch adds a tool called plasma-dataengine-depextractor which can be run at any time during the build process and which adds the dependency information (the X-Plasma-RequiredDataEngines entry) to the relevant .desktop file.

Authors of plasmoids are encouraged to run plasma-dataengine-depextractor and/or fill in X-Plasma-RequiredDataEngines manually. (Please note that the list is expected to be comma-separated.)

Of course, the automatic scanning is not perfect; in particular, it will not detect convoluted ways to load data engines (e.g. if the name is a variable), and it may have false positives in some corner cases (commented-out use of a data engine, some other function called dataEngine and taking a string literal). However, I expect it to work well in practice, and if it doesn’t work, there’s always the possibility to explicitly add the X-Plasma-RequiredDataEngines entry.

This is the final portion of my GSoC 2011 project, so the project can now be considered 100% complete.


August 10, 2011

It works: Plasma now looks up missing components through PackageKit!

Sorry, I haven’t blogged for a while, but rest assured that I’m still alive and coding. :-) I passed the midterm evaluation, and the final evaluation is approaching. So what do we have in the store?

  • My patches to PackageKit, Apper and gnome-packagekit got pushed upstream. The changes to the PackageKit core even trickled down all the way to Fedora 15 (and of course Fedora 16 and Rawhide). I have backported the Apper changes to the Rawhide kpackagekit package.
  • I added support for Plasma to automatically prompt for the installation of missing script and data engines the first time something attempts to use them. This patch got pushed upstream.
  • I submitted another patch for review, which makes Plasma request the installation of required script engines (always, as this is covered by existing metadata) and data engines (if specified in the metadata through a new X-Plasma-RequiredDataEngines entry) as soon as a package (usually a widget) is installed through Open Collaboration Services (OCS), rather than only when the user attempts to add the widget to some containment (desktop, panel etc.). This patch is pending upstream feedback.
  • I also wrote an RPM auto-Requires script based on the same metadata as the above patch. This ensures script and data engine dependencies will be automatically detected in future Fedora packages.

Now the only remaining work item on my project plan is automatic scanning for required data engines. (Script engines are already completely handled by the above patches.)


June 26, 2011

Small API change to the PackageKit support for Plasma service lookup

Richard Hughes requested a small change to the PackageKit session API used to look up Plasma services before accepting the added function upstream: instead of a dedicated InstallPlasmaResources method, the org.freedesktop.PackageKit.Modify D-Bus interface got a generic InstallResources method, which allows installing all the existing resource types as well as Plasma services, and any other resource types added in the future. It takes a type parameter, which must be set to "plasma-service" in our case.

With those tweaks, the PackageKit change and the gnome-packagekit change are now committed to upstream git. For Apper (KPackageKit), which is our main target, there is a patch for Apper master on Review Board and a backport for KPackageKit 0.6.x on the packagekit mailing list. Hopefully, Daniel Nicoletti will have some time to review the patch soon. If not, he suggested on IRC that I can just commit the patch as is and he’ll refactor it later if needed, so that’s my fallback plan.


June 20, 2011

PackageKit support for Plasma service lookup

I just submitted patches to the packagekit mailing list which implement a new InstallPlasmaResources method in the org.freedesktop.PackageKit.Modify D-Bus interface. There are patches for PackageKit itself, as well as for Apper (both master and KPackageKit 0.6.x) and gnome-packagekit. See my post to the packagekit mailing list for more details.

This completes the next step in my GSoC 2011 project. Now I can start working on using the new interface in Plasma.


June 05, 2011

Automatic Plasma RPM Provides

This week, I worked on my first task in my GSoC project: automatically generating RPM Provides for Plasma services from Plasma’s metadata (in .desktop file format). This turned out to be much easier than I had initially expected, also because my mentor Rex Dieter already had a working proof of concept I was able to start from. I adapted the code to use RPM 4.9′s new plug&play dependency generation functionality and, after discussing this with my mentor, changed the format of the Provides to plasma4(servicetype-name).

My work on Provides and (later on) Requires can be found in the gsoc-2011-plasma-rpm branch of kde-settings on Fedora Hosted. It can be installed separately, but it might be merged into upstream RPM or Plasma once finished.

Today, I tested the script on the kdeplasma-addons package. The resulting Provides look like this:

[kevin@laptop64 x86_64]$ rpm -qp --provides kdeplasma-addons-4.6.3-1.fc15.x86_64.rpm
kcm_krunner_audioplayercontrol.so()(64bit)
kcm_krunner_charrunner.so()(64bit)
kcm_krunner_spellcheck.so()(64bit)
kcm_plasma_runner_events.so()(64bit)
krunner_audioplayercontrol.so()(64bit)
krunner_browserhistory.so()(64bit)
krunner_charrunner.so()(64bit)
krunner_contacts.so()(64bit)
krunner_converter.so()(64bit)
krunner_katesessions.so()(64bit)
krunner_konquerorsessions.so()(64bit)
krunner_konsolesessions.so()(64bit)
krunner_kopete.so()(64bit)
krunner_mediawiki.so()(64bit)
krunner_spellcheckrunner.so()(64bit)
plasma-applet_systemloadviewer.so()(64bit)
plasma-dataengine-comic = 4.6.3-1.fc15
plasma-dataengine-microblog = 4.6.3-1.fc15
plasma-dataengine-ocs = 4.6.3-1.fc15
plasma-dataengine-potd = 4.6.3-1.fc15
plasma-runner-events = 0.3.0-100
plasma4(applet-comic) = 1.0
plasma4(applet-dict) = 1.0
plasma4(applet-fileWatcher) = 1.0
plasma4(applet-frame) = 1.0
plasma4(applet-incomingmsg) = 1.0
plasma4(applet-kdeobservatory) = 0.2
plasma4(applet-knowledgebase) = 0.1
plasma4(applet-konqprofiles) = 1.0
plasma4(applet-konsoleprofiles) = 1.0
plasma4(applet-lancelot_launcher) = 1.9.5
plasma4(applet-lancelot_part) = 1.5
plasma4(applet-leavenote) = 1.0
plasma4(applet-life) = 0.8
plasma4(applet-magnifique) = 0.1
plasma4(applet-mediaplayer) = 0.1
plasma4(applet-nowplaying) = 1.0
plasma4(applet-opendesktop) = 0.1
plasma4(applet-opendesktop_activities) = 0.1
plasma4(applet-pastebin) = 1.0
plasma4(applet-plasma_applet_notes) = 1.0
plasma4(applet-plasma_applet_rtm) = 0.1
plasma4(applet-previewer) = 1.0
plasma4(applet-qalculate) = 0.7.2
plasma4(containment-org.kde.griddesktop) = 0.1
plasma4(containment-org.kde.groupingdesktop) = 0.1
plasma4(containment-org.kde.groupingpanel) = 0.1
plasma4(dataengine-comic)
plasma4(dataengine-kdeobservatory) = 0.1
plasma4(dataengine-microblog)
plasma4(dataengine-potd)
plasma4(dataengine-rtm) = 0.1
plasma4(packagestructure-comic) = pre0.1
plasma4(runner-CharacterRunner) = 1
plasma4(runner-audioplayercontrol) = 0.1
plasma4(runner-browserhistory) = 1.0
plasma4(runner-katesessions) = 1.0
plasma4(runner-konquerorsessions) = 1.0
plasma4(runner-konsolesessions) = 1.0
plasma4(runner-kopete_runner) = 0.1
plasma4(runner-krunner_spellcheck) = 1.0
plasma4(runner-org.kde.datetime) = 1.0
plasma4(runner-org.kde.events_runner) = 0.3.0
plasma4(runner-techbase) = 1.0
plasma4(runner-unitconverter) = 1.0
plasma4(runner-wikipedia) = 1.0
plasma4(runner-wikitravel) = 1.0
plasma_applet_bball.so()(64bit)
plasma_applet_binaryclock.so()(64bit)
plasma_applet_blackboard.so()(64bit)
plasma_applet_bookmarks.so()(64bit)
plasma_applet_bubblemon.so()(64bit)
plasma_applet_calculator.so()(64bit)
plasma_applet_charselect.so()(64bit)
plasma_applet_comic.so()(64bit)
plasma_applet_dict.so()(64bit)
plasma_applet_eyes.so()(64bit)
plasma_applet_fifteenPuzzle.so()(64bit)
plasma_applet_fileWatcher.so()(64bit)
plasma_applet_frame.so()(64bit)
plasma_applet_fuzzy_clock.so()(64bit)
plasma_applet_incomingmsg.so()(64bit)
plasma_applet_kdeobservatory.so()(64bit)
plasma_applet_knowledgebase.so()(64bit)
plasma_applet_kolourpicker.so()(64bit)
plasma_applet_konqprofiles.so()(64bit)
plasma_applet_konsoleprofiles.so()(64bit)
plasma_applet_lancelot_launcher.so()(64bit)
plasma_applet_lancelot_part.so()(64bit)
plasma_applet_leavenote.so()(64bit)
plasma_applet_life.so()(64bit)
plasma_applet_luna.so()(64bit)
plasma_applet_magnifique.so()(64bit)
plasma_applet_mediaplayer.so()(64bit)
plasma_applet_microblog.so()(64bit)
plasma_applet_news.so()(64bit)
plasma_applet_notes.so()(64bit)
plasma_applet_nowplaying.so()(64bit)
plasma_applet_opendesktop.so()(64bit)
plasma_applet_opendesktop_activities.so()(64bit)
plasma_applet_paste.so()(64bit)
plasma_applet_pastebin.so()(64bit)
plasma_applet_plasmaboard.so()(64bit)
plasma_applet_previewer.so()(64bit)
plasma_applet_qalculate.so()(64bit)
plasma_applet_rssnow.so()(64bit)
plasma_applet_rtm.so()(64bit)
plasma_applet_showdashboard.so()(64bit)
plasma_applet_showdesktop.so()(64bit)
plasma_applet_spellcheck.so()(64bit)
plasma_applet_timer.so()(64bit)
plasma_applet_unitconverter.so()(64bit)
plasma_applet_weather.so()(64bit)
plasma_applet_weatherstation.so()(64bit)
plasma_applet_webslice.so()(64bit)
plasma_comic_krossprovider.so()(64bit)
plasma_containment_griddesktop.so()(64bit)
plasma_containment_groupingdesktop.so()(64bit)
plasma_containment_groupingpanel.so()(64bit)
plasma_engine_comic.so()(64bit)
plasma_engine_kdeobservatory.so()(64bit)
plasma_engine_microblog.so()(64bit)
plasma_engine_ocs.so()(64bit)
plasma_engine_potd.so()(64bit)
plasma_engine_rtm.so()(64bit)
plasma_packagestructure_comic.so()(64bit)
plasma_potd_apodprovider.so()(64bit)
plasma_potd_epodprovider.so()(64bit)
plasma_potd_flickrprovider.so()(64bit)
plasma_potd_oseiprovider.so()(64bit)
plasma_potd_wcpotdprovider.so()(64bit)
plasma_runner_datetime.so()(64bit)
plasma_runner_events.so()(64bit)
plasma_wallpaper_mandelbrot.so()(64bit)
plasma_wallpaper_pattern.so()(64bit)
plasma_wallpaper_virus.so()(64bit)
plasma_wallpaper_weather.so()(64bit)
kdeplasma-addons = 4.6.3-1.fc15
kdeplasma-addons(x86-64) = 4.6.3-1.fc15

(The Provides starting with “plasma4(” are the new, automatically detected ones.)

The next task is going to be asking upstream Plasma for feedback on this work and on how to proceed, because my next tasks will require closer interaction with Plasma upstream.


April 25, 2011

GSoC 2011 Proposal Accepted

I have been notified today that my proposal was accepted! I’m looking forward to working on KDE Plasma Dependency Generation and PackageKit Integration during the summer. As posted in a previous blog post, my full proposal (minus telephone number) can be found in the Fedora Wiki.


April 08, 2011

Submission deadline passed

So the submission deadline has now passed. I proofread my proposal again today and decided it was fine as is.

Now I have to wait a little more than 2 weeks for the notification of the results (hopefully acceptance).


April 06, 2011

Proposal submitted

I submitted a first version of my proposal. The submitted proposal (without my telephone number ;-) ) can be found at:
https://fedoraproject.org/wiki/User:Kkofler/GSoC_2011_Proposal

The title of my proposal is: KDE Plasma Dependency Generation and PackageKit Integration.


April 04, 2011

Google Summer of Code 2011

I’m applying to participate as a student in the Google Summer of Code 2011, with Fedora as the mentoring organization.

If accepted, this blog will cover the progress of the project.

Expect more information (proposal etc.) to be posted soon.


March 11, 2011

Pondering why KDE, GNOME, ASF et al get so many GSoC projects

Back in the fall of 2009 I wrote a report that looked back on the Fedora Project’s five-years of involvement in Google Summer of Code (GSoC.) One glaring truth was that year-over-year we had not gotten any larger – eight students in 2005 to ten students in 2009. Similarly, our own Fedora Summer Coding had eleven funded students in 2010.

Is there a natural reason we have leveled off just shy of a dozen student projects? Is that all we really want done? All we are prepared to support?

The conclusion I’ve come to is that this is the level we get for the effort put in. Other projects that have more student slots simply have more people organizing as administrators, as well as mentors — more people making more smart decisions. They seem to be drawing from a common set of open roadmaps. Maybe the project-wide experience has made it so people actually watch out for opportunities to include students in the roadmap.

By contrast to what I’ve seen in Fedora, projects such as the Apache Software Foundation (ASF), GNOME, and KDE routinely have three to four times as many student slots. There are numerous reasons why, but I think a core part of it is this:

So we have fewer ideas out there on average, and they are jumbled on the page with no organization against project wide goals or a roadmap.

What part do idea pages play?

From what I’ve seen, Google assigns student slots based on the interest students show in a project. More ideas, more coordinated marketing across the teams, and more work to get students’ attention generates more applications. That seems to be an important factor in determining how big a project can scale for students.

To make that attention happen requires commitment from each mentor and sub-project team they are associated with. To get a winning application, an idea might get three or four or ten that don’t quite make it. Mentors have to work fairly with all the students, trying to improve applications (within reason), and making decisions in the end to pick three dozen from an original of perhaps two or five hundred applications. Not much problem though when you’ve got a hundred mentors reviewing.

I reckon that a well organized and large pool of ideas comes about best when there are enough people working on making that happen. Subsequently, that becomes enough people to actually manage the increased program size, the applications, the mentoring, and so forth. Thus, the ideas page becomes a fair representation of how ready a project is to scale to what size.

If some folks in Fedora would really like to see our GSoC program be two-times, three-times, or even four-times the size that it has been, I put all this out there in hopes that it helps.

(Numbers in this post that are not linked back to the source originated from queries to Melanage at http://code.google.com/soc for the year specified in the statistic.)

March 03, 2011

Your project idea is missing! Fedora & Google Summer of Code

All year long people say to me, “This or that project will be perfect for Google Summer of Code.”

Where are all those projects? Not on the Fedora ideas page.

Folks, check this out – your idea doesn’t have to be complete, or even contain much more than a few sketchy use cases. Sometimes you just need to spark an idea in the student, something to become passionate about.

If you aren’t sure if you can mentor, put your idea up anyway. If a strong student or three shows up, mentors can be found.

You may wonder why this matters so much to me? Quite simply, we missed our chance at being in last year’s Summer of Code because we didn’t have an ideas page.

I look at the page now, there are great ideas there, but not very many of them. I know that the Fedora Project and JBoss.org folks have many more ideas in them. A strong ideas page is an essential part of the application.

If you are interested in helping Fedora/JBoss.org to get in to this year’s Summer of Code, or want to help run the program after that, join up to the cross-project mentor list and ask what you can do.

February 16, 2011

Fedora Students Contributing – Live or let die?

Fedora Students Contributing is about to get ignored to death.

And maybe it should be, or at least put in to suspended animation. Let me explain why I think this might be the right option, if the program doesn’t get what it needs.

So what does the program need?

More sponsors who provide budget and people.

People to collaborate openly with the community to make a professional event occur. Students get reimbursed for what amounts to three months of hackfest during their time-off-school, so it’s potentially more complicated than an ordinary open project and benefits from staff time of the sponsors.

Without these additional sponsors, I’m not sure it is worth our continued investment. In this case, the us is both the Fedora Project and Red Hat. Here’s my thinking about the whole picture.

The way my team at Red Hat works is pretty simple. We look for ways to make relatively minor investments – a portion of one or a very few people’s time + some budget – in ideas that affect the fabric of community and help projects we think have the potential for a higher return through open collaborations. That reward/return goes many directions, and some of it will splash back at Red Hat. A tiny bit, it’s an OK investment but maybe not worth as much as the ones that show a much bigger splash back at Red Hat. Bigger splashes also mean more goodness for everyone else because of Red Hat’s commitment to sustainable free software upstreams.

Last summer running Fedora Summer Coding (later renamed to “Fedora Students Contributing”) took a large investment of time and energy from me. So far, my efforts to find others to invest by providing more budget and/or assistance haven’t turned out very well. The best I’ve been able to do is take existing Fedora contributors and stretch them even thinner. That is not sustainable and it’s not providing a greater return splash for the investment.

What we accomplished last year was to get ten to twelve projects through the process. It is likely they would have been the projects we tried to get through Google Summer of Code, were we in that program. Our previous years had seen that many projects, so we were successful at getting an equivalent set of projects and mentors paired with students. That’s pretty great to pull together in a few short months.

But in the end it wasn’t any better than we did under Google’s program, with a lot more investment from Red Hat. So, from a Red Hat perspective, not really worth continuing if we can participate in the Summer of Code instead. Similarly, for Fedora we had a lot of community effort put in to running a program from scratch, much more work than if we’d been in Summer of Code in the first place. From a Fedora Project perspective, it makes more sense to put energy in to GSoC.

By comparison, other communities were able to pull the sponsoring money together, and do it with a  nice connection to an ecosystem of sponsoring companies who also use the open source code being worked on. For example, the Ruby Summer of Code looked good. They were able to put together ten times the funding pool than we did, and I reckon there were a few people who devoted some time to making the administration and project management work. Something to aspire to and a nice example of the summer coding model.

So we proved it could be done in Fedora and there are mentors and students and administrators willing to do some of the hard work. We took care of the need for mentors and students in getting projects done for 2010. If some other organizations with budget and people’s time are interested, we’re here to start talking about doing it again.

Meanwhile, we can take our efforts and put them in to running our program for Google Summer of Code.

January 05, 2011

Time to start Fedora GSoC work

As I explained in a previous blog post, I am not going to participate in Fedora’s Google Summer of Code presence this coming year.  If Fedora is going to participate, some of you folks need to start organizing right away.

In particular, Fedora’s GSoC team needs some people to work as program administrators, or “admins”.  It’s about taking responsibility for making sure we get ourselves together before, during the event, and in follow-up.  Otherwise, it’s not a ton of work, and it’s very rewarding to see improvements for the Fedora Project and students gaining greater experience participating in free and open source software.

Step one is to create, publicize, and help manage a wiki page of ideas for students.  You can look at the past year’s pages to see how to do it.

If you want to be involved in running the program, join the discussion group where much of this is organized and introduce yourself.  Old hands such as myself are available to help you make the magic happen.  You just have to be enthusiastic and interested.

December 28, 2010

Seeking New Admins for Fedora and GSoC

I have really enjoyed my role as an administrator for Fedora’s participation in Google’s Summer of Code. It has been a very rewarding experience and I have been both grateful for and proud of all of the mentors and students that have participated.

Karsten Wade has been extremely helpful as a fellow administrator and has really helped Fedora’s participation succeed. Last week, he wrote that he would like to pass the reigns. His work on Fedora’s own student programs is extremely important, and I am pleased to see that he is focusing on that work.

As much as I enjoy working as an administrator for Fedora’s GSoC participation, I also have too much on my plate to give the time and attention to the program that it really needs and deserves. Therefore, I too must step aside and allow others to take a turn at the wheel.

Both the administrator and mentor roles in the Summer of Code are wonderful opportunities. Karsten lists the benefits and caveats of the administrator role in his post, and I think he sums them up perfectly, so I will not repeat them. There are some important points I would like to add about being an administrator with Fedora for the Summer of Code:

  • All projects chiefly sponsored by Red Hat are required to participate together, so administrators can come from the communities of Fedora, JBoss.org or other Red Hat-sponsored projects and must be prepared to coordinate efforts across communities.
  • This is not a full-time job. If you can spare a few hours a week and respond in a timely manner to communications, you can handle the workload. There are a few deadlines to be met, and you might have to make an IRC meeting or two.
  • Karsten and I will both be “around” to help by answering questions and offering guidance. I do not have the time to handle all of the administrative duties, but I will be happy to help as much as I can.
  • One of the biggest challenges in the past has been recruitment – gathering administrators, mentors, ideas and students. In some ways, this has gotten easier, but know that this is an important part of the job.
  • Fedora’s participation in GSoC 2011 is not guaranteed. The new administrators will need to ready the prerequisites and prepare the application when the application window opens.

If you might like to serve as an administrator for Fedora’s participation in Google’s Summer of Code, please contact me right away.

December 23, 2010

Summer of Code – time to do something, anything … but not by me

Folks:

For this coming year, if Fedora chooses to participate in the Google Summer of Code (and I think we should), I have decided that I am not going to be involved.

This is not complete abandonment.  In fact, this blog post is the first of potentially several that can be part of a package of mentoring-the-mentors as I pass on my mantle of leadership.

So if you care about the future of Fedora’s participation in Google Summer of Code (GSoC), for the love of all that you hold dear and then some beyond that, please read on.

There is always plenty of interest in bringing project ideas, being a mentor, and working as a student.  We’ve had some fair interest in the marketing and branding around the program. What is always a bit harder is getting enough administrators (admins).

Benefits of being an admin:

  1. A great way to contribute to Fedora’s participation in a program that benefits Fedora and a number of students.
    • The student’s learn how to participate in free/open source software projects, where making mistakes and improving are as much a part of the project as getting the coding done.
    • Fedora has shown some great benefits from participation in this program, as I covered in this five-year round-up report.
  2. Brief periods of activity, then you mostly get to watch the mentors and students do the real work.
  3. If you are available, you are equally in the pool to attend the GSoC Mentor Summit should Fedora get invited.
  4. You get the GSoC t-shirt and appreciation.
  5. The web tools are fairly advanced by this time, so your work is much easier than “in the old days.”

Downsides of being an admin:

  1. No downsides … unless someone else falls in a hole and you need to jump in to save them.  If a mentor disappears or has to go on vacation, you might have to fill in.  You need to be prepared to back-up everyone involved in whatever way they need.
  2. Time: you have to keep up with the project, make sure mentors (especially) and students are getting everything in to Google on time.  It is a bit of project management and whip-cracking.
  3. Money rides on the work, continuing participation in the program rides on it (for students all the way up to Fedora itself), sometimes our reputation rides on it.

There are several reasons I think this is the right time for me to step down from leading our GSoC participation:

  1. If there is a Fedora Students Contributing next summer, I expect to be too busy with that to have any presence for GSoC.
  2. Organization work needs to start immediately (or sooner), and I don’t have the breath to do it.  We need:
    1. A wiki page that lists project ideas from across the Fedora community.
    2. Some folks need to read the application requirements and put a schedule together to meet the deadlines.
    3. Work all the application process to completion.
  3. Why start now? We didn’t last year, we got goals and methods confused, didn’t read the rules and schedule carefully, and ended up not getting a slot for Fedora and JBoss Comunity.  I take direct and personal responsibility for that; not just for the nobility of it (“O! I fall on my sword!“) but because I actually am responsible.  I probably suggested, and certainly promoted, the idea that we would hold-off on writing up random lists of project ideas until we’d organized better between the Fedora and JBoss community members.  As it happens, the list of project ideas was an application requirement (added the previous year.)  When you start making basic mistakes like, “Didn’t read the application requirements for changes from year-to-year,” it’s time to let some fresh eyes, thinking, and energy get involved.

Having freshness on these problems will be good for all involved.  Also, it’s a basic tenet of the open source way, turn over project leaders regularly.

December 21, 2010

The rest of FOSS.IN (and some of noname.conf)
Last you heard me talk about day 1 at FOSS.IN, while day 2 was in progress.

Now I will talk about Day 2 and Day 3 and noname, way after they all got over.

Morning I was feeling fit and I found myself at FOSS.IN just in time to catch href="http://0pointer.de/blog">Lennart talking on Open Surround Sound and href="http://www.pulseaudio.org/">PulseAudio. After that we went Upstairs (that's the phrase I will use for each time I had no interesting talks to attend and I would sit with the others, laptops open and chat[i.e. not over network]). Oh wait, no, we set up the Fedora Booth, and were clicking pictures there, of the booth, and media, and buttons and the White Fedora Table Cloth and us. Two things which I noticed at the Fedora Booth:
1. Media was more popular than the buttons.
2. x86_64 media was in high demand, and we did not have any (maybe next time [not next FOSS.IN though{as maybe they wont have it next year}]).

Post lunch I went over to Hall 3 where the Fedora MiniConf was running.

While I was blogging about the previous day, Amit Shah talked about Virtualisation in Fedora, Aditya Patwari talked about Fedora Summer Coding and his experiences of it, Arun SAG talked about Emacs, its plugins and how to get them packaged, then he announced that he was doing the packaging workshop upstairs and he took most of my audience away with him(despite my protests), I talked about Four Seasons of Code(that went fast as there were very few people and I did not want to linger as they showed no interest), Neependra talked about using ftrace and Suchakra talked about using embedded linux via a web-browser(he mentioned he was a Soft Hacker). There was half an hour left so Rahul started with his famous Fedora Packaging from Scratch workout. All was well.

After that I went Upstairs. I guess.

No, I was in James Morris' talk on Linux Kernel Security. Later in the evening Fahrenheit (with guitarist being Gaurav Vaz's brother) performed, some covers and some own songs. I enjoyed the show.

After the show me, Saleem, Sheela and the group of foreigners ended up at a lounge called Don'tRememberWhat. Had fun talking to Olivier Crete of Collabra. The best part was when he asked me why weren't they playing Bollywood music and that he likes the song and dance sequences, and I told him those don't happen in real life. Suddenly the DJ started playing Bollywood music and then the family at the other table got up and started dancing. Sheela joined in, and so did the rest of us. Lennart preferred to remain seated though.

~ * ~


Next day, Day 3 I was early to catch Dimitris talking about scaling web apps. It was informative, I took a few notes (just a few?). For the next hour I was Upstairs though I managed to peek into Mahendra talking about CouchDB apps.

Post lunch I was generally lost, maybe Upstairs. I realised something must be happening in the Wikipedia miniconf, so I dropped in. Erik was talking about intresting wikipedia stuff, I was feeling drowsy, so I went to get a cup of coffee. By the time I returned, he was over with the talk. I went back to being lost, Upstairs. I was waiting for Aanjhan's keynote.

His keynote was titled "A Hackaer's Apology". It was an interesting collection of stories and stuff from Aanjhan's stint with FOSS. Atul Chitnis took the stage next. He talked for a long time and (among other things) thanked all the people associated with FOSS.IN over the years.

The Raghu Dixit Project came next with an awesome and mind-blowing performance. Having heard them for the first time last year FOSS.IN, I had listened to their songs over the year. I enjoyed the show a lot.

Me, Saleem, Rahul and Ram had dinner at Subway. We spend the entire night discussing about FOSS, Life, God, Human Beings and among other things, concluded that I was an anarchist. :-O

~ * ~


Next day I was at noname.conf at Jaaga. The place is a bit strange looking with plants growing on watery rotate-able walls, a metal structure with hardware hanging in a bunch in the middle. I met Roshan and Vignesh there. It was pleasant to see them. Saleem was also there. For the time I stayed at noname.conf, it seemed like a Barcamp of sorts with mainly startup crowd. I left with Roshan and Vignesh, had coffee at Cafe Coffee Day and visited UB City, with all it's grandeur. There I had the idea of XKCD on your wallpaper and dicussed it with Roshan and Vignesh. It works now.

Night till the next afternoon I stayed at Souvik's place, and met up with Gaurav, Rangeen and Saikat. By Sunday mid-night I was home.

December 20, 2010

XKCD on your GNOME background
Hi,

I wrote this little script which would download the latest XKCD comic and put it centred onto your GNOME Wallpaper.

It screenscraps the latest XKCD homepage and looks for the image URL, it then downloads it to /tmp and uses gconftool-2 to set it as your background.

Try it out and lemme know if you like it.

I have put a cron like
0 15 * * mon,wed,fri /path/to/xkcd.py
That will update my wallpaper at 3 p.m every Monday, Wednesday and Friday.

#TODO:
* Would like to make it Desktop independent.
* Would like to have the mouseover text below the comic.

#UPDATE:
Thanks to andy(see comments) this script uses JSON to get the data, and avoid screenscraping.

December 19, 2010

FOSS.in 2010 Day 2

Here was the day we were waiting for. The Fedora mini conf was supposed to be started at 02:00 pm. We were prepared quite well and so it began on time. Rahul went on the podium to welcome all the attendees and to announce our list of talks. We had a total of 6 talks and 2 workouts planned which was very nice. Mine was the second one, next to Amit’s talk on virtualization. Amit spoke about virtualization, more specifically about kvm, libvert and qemu. His talk was kinda cool and really reflected the amount of knowledge he has.

By the time his talk was about to end, I was getting a bit nervous. It always happens to me that I get a bit nervous before giving a talk or an interview but then when I am on stage the nervousness just vanishes and luckily that happened at foss.in too. I walked on the stage just to discover that my laptop is not connecting with the projector. Thanks to Amit I was able to give my talk using his laptop. I started out good and I am quite sure that what I said was quite good but I prepared a really small talk, just a 15 minute talk. Actually I was counting on QnA a lot (I realized that it was a mistake). When I walked down after telling everyone about Fedora Students Contributing program and Fedora KDE Netbook Spin I was a bit skeptical because unlike other speakers who at least talked for 40 minutes I was done in around 15-20 minutes. Though I was a relaxed somewhat after reading a tweet about my talk and a mention on Shreyank’s blog. Arun was next after me with an additional responsibility to make up for the time I saved. His original talk which was as small as mine was extended to some 40 minutes. He talked about Emacs, its plugins and packaging them. I really enjoyed his talk owing to the atmosphere he created. It was a perfect blend of knowledgeable content and some cool jokes.

After Arun’s talk both of us went upstairs at workout area to organize the Fedora For Kids workout which was converted into a packaging workshop due to not-so-good internet connectivity. We were followed by some 20 odd people ranging from students to professors and IT professionals, one of the largest workout strength on a single table. What I appreciated the most was that people were ready to sit on floor to learn packaging. That was some commitment and interest! Arun started to tell people about the basics of packaging and I started  to help the people who were stuck (yeah, packaging can be tricky at times).

In the mean while Rahul came up for a round and was quite happy with the interest of the people and decided to carry out a packaging session in the mini-conf hall itself. Rahul is an awesome packager and both me and Arun have learned packaging by reading the logs of Rahul’s IRC classrooms (and of course bugging him and Ankur when something gets screwed up). That was the last of Fedora mini-conf at foss.in. The day ended for me with the keynote about Kernel Security. I wasn’t there for the band performance because they were just too loud me (and Arun, Amit and Juan). We went for dinner with Hiemanshu at Chandni Chowk and it was fun. Now back to hotel.

PS: Thanks Juan for buying us dinner and Hiemanshu for picking a cool place. You guys rock! :)

December 16, 2010

Day 1 at FOSS.IN/2010 (and maybe some of Day 2)
(Yes, I am blogging after a long time.)

And I am blogging about FOSS.IN, Day - 1, while I am almost halfway though Day 2. Well that I because I am now sitting through Aditya Patwari's talk on Fedora Student's Contributing a.k.a Fedora Summer Coding, and waiting for my talk which would start soon. Yes, I am nervous, as I always am before my talks, and I wanted to do something to take the pressure off. ;-)

(Aditya is a surprisingly good speaker.)

Coming back to yesterday, I was sick. I took some medicines in the morning which kept me going through the day and I did enjoy a lot yesterday. I went in and met old friends from last FOSS.IN, and Ramkumar with his huge desktop-like-laptop with the heavy-expensive-doubleUSB-nonprinted-keyboard. With a cup of coffee we went to attend the talks.

(I see people leaving.)

Kishore Bhargava kicked-off with the opening ceremony (read lighting of diyas). Danese Cooper had her keynote on Wikipedia technologies. She started off with "Wikipedia != WikiLeaks". The talk was a good insight into the tools and practices that wikipedia uses to manage its backend. I took a few notes, for later reading.

(Arun SAG is telling the audience how to package emacs plugins. Arun is an engaging speaker.)

I had lunch. The queue was long, for the lunch and outside the men's. I had less food because I wasn't well. After lunch I went into Balbir Singh's talk on Operating System Caches in a Virtualised Environment. I wasn't very interested in the talk, I was waiting for Lennart's talk on systemd, hear from the horse's mouth. The talk was good (and the confetti dropping from the ceiling), I could understand most of what he was saying, and I even managed to ask a question. ;-)

(The hall always starts getting empty before I am to talk.)

I didn't want to know about hacking LibreOffice. So I spend the hour chatting. Next I went into Philip Tellis's talk on Boomerang, which was a client side JavaScript code that measured latency on the client side and send it back to a central server. The software looked good, but fishy.

(Arun is still going strong with the specfile for emacs-identica plugin)


Rahul
had his keynote next about the Failures of Fedora, and I was looking forward to that. It was informative, interesting at parts. After the talk they were starting off with a video interview of Julian Assange of WikiLeaks. We the Fedora Public decided to skip that and do a dinner party of our own.

(My talk of Four Seasons of Code is next, and I'm nervous)

The dinner party went good. Food was nice with all the beer (I did not drink) and the drunk brawls about git behaviour with pipes. Back at the hotel it was another war to get the wireless running with one faulty router.

(That's all, Arun is done with his talk, I'll go up now. Bye!)
(My talk's over, I'll just add a few links now and submit this.)

September 28, 2010

Copr final report

Fedora Summer Coding is now over for me and I’m really glad of what I learned and coded this summer.

Our initial goal was to develop a TurboGears2 Web app and JSON API for Fedora Copr. When finished, Copr should provide everyone with a place to build Fedora packages and host custom repositories for everyone to enjoy. This is a project that should prove quite popular in the Fedora Community when it gets released and I’m glad to have played a role in its development.

At first I worked on the web app, modeling the database and the relationship between coprs and repos and packages and then developing the JSON API. When the midterm came, my mentor and I decided that I should also contribute to the other parts of Copr. The original schedule had a simple command-line client planned, but we went further than that. In the end all of the functionality of the JSON API also got implemented in a client library (based on and very similar to python-fedora) and in a command-line client. I also got to dive into python-fedora’s and repoze.who’s internals in order to get basic HTTP authentication working for TurboGears2.

My latest work has been on the func module. This is the buildsystem part of Copr. Func minions running this module will be commanded by headhunter (Copr’s scheduler) to build packages in mock and then move them into repositories. The module also creates, updates and deletes package repositories and will check the built packages for Fedora conformance (e.g. licensing) – this last part is not yet implemented. I got to play with virtual machines and func and mock and createrepo.

There is a more synthethic overview of all the different things that got implemented on the wiki.

Overall, I’m really glad of what I learned this summer. This project really got me involved in a lot of different levels of the architecture of a web service and a lot of different technologies. Some of the things I worked on looked really scary at first, but as I went nearer and read more code the mist slowly vanished.

My mentor, Toshio Kuratomi was great as always. This isn’t the first project I’ve had him as my mentor. He was always there to talk to and always had great answers to all of my questions. He had great patience in answering and explaining anything I asked about. Our discussions were mostly about the architecture of the app we were building, but he also gave me great tips on the inner workings of python-fedora or on deploying the web app. I felt I had a lot of liberty to decide the way things will get implemented. Regardless of whether we will ever work together again, Toshio will always be a great inspiration for me as a programmer and as a person.

September 06, 2010

FSC: moving to the buildsystem

I started working on the buildsystem part of copr this week. Right now, I’m still getting familiar with func. That’s what we’ll be using to communicate with the builder machines: get them running errands and get back status reports at any time. I spent a lot of time getting a virtual machine setup with libvirt; networking especially was a pain (mostly because of my pppoe connection I think).

One nice feature of func that I think we’ll be using a lot is the async mode. A mock build takes a lot of time, what with all the yumming and compiling. So starting a task via one of the user interfaces and then choosing whether or not to keep watching it and what to watch for will probably be an essential part of the buildsystem’s functionality.

In the meantime, we’re slowly getting resources for the deployment of Copr. Toshio got a running instance of the current state of the TG app on publictest1. It looks just like a quickstarted TG app, because it doesn’t have any WebUI. But it can CRUD coprs, handle dependencies between them, handle permissions and CRD packages. Most of the functions require a FAS account, but you don’t need one to see a list of all the coprs, or a list of packages in a copr.

August 30, 2010

the Copr client part II

I spent this week finishing up the copr client. It now supports all the functionality that the Copr TG API supports. It’s not much, but it’s a starting point.

I spent a lot of time trying to understand the way repoze.who works and the authentication plugins that we’re using for the python-fedora FAS authentication plugin. I finally understood it, I think… The Fedora client library didn’t support basic HTTP Authentication for TG2 apps so I had to figure out how to integrate that into our authentication plugin. It was quite fun all in all, repoze.who has a very interesting way of doing authentication and writing wsgi middleware is always exciting ;). This patch will hopefully go upstream to python-fedora now.

This next week I’ll probably start working on the buildsystem part of Copr. There are a lot of new things to learn there.

August 25, 2010

It’s time to help organize the next session of Fedora Students Contributing aka Summer Coding

We haven’t formally picked a new name for Fedora Summer Coding, but we need to, and ‘Students Contributing’ has the advantages so far.  We’re not sticking to summer in one hemisphere and we’re already doing projects that are beyond code.  Students Contributing is descriptive of what we’re doing.

This post is about the upcoming session for Fedora Students Contributing, to cover September 2010 to February 2011.

We need organizing help and we need sponsors.  In fact, would you like to help find new sponsors?

This week we’ll get the list of known tasks updated (in our Trac instance) for anyone to work on.

We have a success on our hands.  For a relatively small chunk of budget, we were able to fund about a dozen students to work on an equal number of interesting projects.  As you read more about this successful program in the coming weeks, think about how you can be involved.

Are you willing to recommend that an organization make a bet of a few thousand dollars in budget to find out what they can gain from supporting and helping organize the Fedora Students Contributing program?

Read some more.  Think about it.  Join the mailing list and introduce yourself.  Then, let’s get to work.

August 24, 2010

Fedora Summer Coding Evaluation

I am very grateful for having been allowed to participate in Fedora Summer Coding 2010.  I have learned so much about music and audio software, about documenting software, about the Fedora community, and about doing things in an open-source way.

One particular sore point has been bugging me throughout the entire process, and I want to get that out of the way first.  The original intention was to offer USD$5,000 to each successful student participant, but this was later reduced to USD$1,000.  The reduction was announced after the application deadline, but before releasing the results of which applications were approved.  I still don’t know whether I made the right financial decision this summer, and the late announcement of the reduction makes the Summer Coding SIG seem sneaky and unfair.  While the reduction was almost certainly done with the intention of allowing a greater number of student participants, it also undermines the legitimacy and viability of a Summer Coding program.  Had the original intention been to offer USD$1,000, I would not have applied – I would have gone on to seek a different job.  That said, it was my own decision to continue with Summer Coding after the smaller award was announced, and the $5,000 estimate was clearly marked as only an estimate.  The problem is that there is a large difference between the original estimate and the final result.

This was the only negative aspect of my Summer Coding experience.

The application process was a little bit confusing, but nothing that some careful attention couldn’t overcome.  Looking at the other applications, and the origin of those which were approved, it seems that non-native English speakers were at a significant disadvantage.  There were certainly other factors involved.  Many of the Chinese applicants, for example, wanted to work on the Ailurus package manager, which is not available in the standard Fedora repository, and replicates functionality in the existing PackageKit package manager.  Furthermore, I’m not sure that it’s a bad thing for the application process to be a little bit confusing.  If you’re going to be doing open-source development work, you must be able to work through LOTS of confusing documentation and instructions.  That’s the nature of the beast!  Even as I whine about this, the “Four Seasons of Code” Summer Coding project developed a repeatable, quasi-standardized application application for summer coding-like events.

Another thing about the application process is that it was quite demanding, and not all applicants finished all of the required components.  The only reason I was able to complete my project is because I took the application’s requests very seriously, and filled it out in detail that I thought was excruciating.  Success comes with planning.  Enough said.

After the application process, the Summer Coding requirements simply vanished, and I was basically left on my own (with my mentors) to construct a meaningful result.  It wouldn’t work for some people, buy my preferred way to learn and do things is independently for as long as possible.  It seems that “independently” is how many open-source projects get started.  Once an initial version exists, collaboration can truly begin.

Twice-weekly blogging is a pain, but invaluable.  Not only does it help to spread the word about your project, but you record some of your thought-process for you and other people to review later.  The next time somebody wants to write a user guide, they might check out my blog posts, for example.  In retrospect, I could/should have designed the blog posts much better, to illustrate the decisions I had to make, and why I chose what I did.  There’s always next time.

My mentors have been very helpful in sorting out problems with me.  I appreciate that they have not (generally) solved anything for me, but instead point me to the right source for information on how to do it myself.  One notable exception to this is when I set up the git repository, following my mentor’s instructions exactly.  This isn’t really useful for most people in most situations, however, and I probably won’t set up another git repository in my life.

The Documentation Project holds weekly meetings on IRC, and it has been helpful for me to attend these.  If there is a relevant project or SIG in Fedora, I encourage future Summer Coding participants to attend their meetings.  You will get to know people who can help you, and also learn about the workflow and efforts that go into producing a viable Linux distribution.  Be careful at meetings and on IRC though, because you never know who might be there… Paul Frields, for example, frequents the #fedora-docs channel and Docs Project meetings, but nobody warned me.  I only found out I’d been talking to the Fedora Project Leader well after the fact!


August 23, 2010

Summer Coding Final Report for Musicians’ Guide

The Fedora Musicians’ Guide is now complete (as required by Fedora Summer Coding, at least – draft is available at this link).  In case you’ve missed my previous posts, here’s a brief description of the project, how it began, and how it has developed so far.

The Fedora Musicians’ Guide (or “FMG”) was designed specifically as a Fedora Summer Coding project.  The idea came to me when I saw the request for student applications to Fedora Summer Coding.  Because I have taken two Computer Science courses, I thought I would try to apply for something.  When I looked at the existing proposals, I realized that two terms of CS just wouldn’t cut it.  After thinking about what I can do, I realized that, as a university music student, I have a rather unique view of Linux.  In particular, I knew that the existing documentation for music software was woefully insufficient.  It still is, by the way.  Thankfully, the Fedora community came together and allowed me to write a brand-new user guide for some of the most popular music and audio software available in Fedora (and some less-popular things, too).

The proposal was quite specific about the Guide’s goals.  The target audience is people like my friends and me, who study (or have studied) music to a relatively high level.  The document has relatively few technical musical explanations; users are expected to already know music notation before they use the LilyPond chapter, for example.  Users are expected to know what they want to do, but not how to do it.  In a way, I wrote the FMG specifically for my friends, because I was tired of saying “you can use this program on Linux,” knowing full well that a lack of documentation would prevent them from figuring it out.

The approach to each chapter shows the minimum skills required to use the application or program.  It’s best to learn through independent experience, so I wanted to explain as little as possible, encouraging readers to learn and experiment by themselves.  At the same time, I want to provide enough information that readers can guess intelligently how to do things.  This was very difficult, and I was always debating with myself about how much detail to include, and how much to assume the user would already know.

It was also important for me to write something distinctly different from pre-existing documentation.  Ardour and Audacity already have excellent user guides available on the internet, and SuperCollider has a very extensive collection of help files.  The point of the FMG, as much as it can be, is to get users started with the software as quickly as possible, showing them how to use it with follow-along tutorials.  The tutorials have instructions to create a particular, real-world project, with instructions for the tools being used, and explanations of why those tools are being used in that particular way.

The FMG currently covers the following software: Audacity, Ardour, Qtractor, Rosegarden, FluidSynth/Qsynth, SuperCollider, LilyPond, Frescobaldi, GNU Solfege.  There are also chapters about audio recording, computer audio, and real-time Linux systems, for users who need them.

It’s difficult to know how well the Musicians’ Guide has met the goals I set for it.  As development progressed, I found that it was much easier to write about the best software, and much more difficult to write about the merely high-quality software.  I fear that this shows in the resulting document – that software like Audacity (because it’s not new to me, and it crashed often) and Rosegarden (because it’s quirky and difficult to guess) are in the greatest need of good documentation, but that I was unable to provide it.

GNU Solfege, in particular, is a project that needs help.  I included it in the FMG because aural skills software is one area that computers are most useful to musicians, but it is always neglected.  The real problem is not that GNU Solfege is bad software, but that it simply needs more exercises.  These exercises are easy to write, too!  I sincerely hope that the Musicians’ Guide helps people to discover Solfege, and encourages them to write more exercises, especially for melodic and harmonic dictation.

Looking back over the whole project, there are a few things that stand out in my mind:
* Writing documentation is a tedious task, but a very useful one.
* Some of this software is *very* difficult to use by guessing.
* Some of this software seems difficult to use, but is actually easy.
* Most of this software is very useful, comprehensive, and high quality.

The point of Fedora Summer Coding (I think… ) is to encourage new contributors to the Fedora Project.  I am very grateful for the general friendliness and helpfulness of members of the Fedora community, and I feel like, even after just two months, the community has welcomed me as a valued part of the team.  I cannot emphasize enough how important it is to receive encouragement from other community members.  And it worked!  As it stands now, I plan to remain with the Documentation Project, helping where I can.