[00:53]  * hggdh is away: walking the dogs
[05:00] <Socceroos_work> date -u
[05:02] <techno_freak> Socceroos_work, in your terminal
[05:03] <Socceroos_work> :D
[05:18] <techno_freak> :)
[05:20] <techno_freak> .
[06:08] <hempal> date -u
[06:12] <persia> :)
[06:58] <Socceroos_work> date -me
[08:18] <raps> hello : )
[09:25] <adibdimitri> -u
[10:53] <azmodie>                                                                                                                                                                                                                                                                                                                                                                                                                                
[15:09] <Zentux> sorry, wrong window :-) annd the pw is changed for sure.
[16:55] <sebner> ~o~ \o/ ~o~
[16:56] <dholbach> Are you ready for   Ubuntu Developer Week    - Day 2?
[16:56] <tacone> no
[16:56] <techno_freak> yes!
[16:57] <sebner> huhu dholbach :D
[16:57] <dholbach> come on... who's here for another day of Ubuntu Developer action? :-)
[16:57] <tacone> uh, well, then
[16:57] <weefred> yay!
[16:57] <tacone> \o
[16:57] <techno_freak> \o/
[16:57] <Bijoy> hey
[16:57] <sebner> \o/
[16:57]  * balachmar is here
[16:57] <luis_lopez> o/
[16:58] <fabian23_> I am
[16:58] <fluteflute> me too! can we have a beijing olympics opening ceremony style countdown :)
[16:58] <palango> me too
[16:58]  * Volans I am too
[16:58] <emefarr_> me three?
[16:58] <dholbach> woohoo, excellent - grab something drink a snack, lean back and enjoy
[16:59]  * takdir too
[17:00]  * mruiz waves
[17:00] <dholbach> alright... let's get started - my name is Daniel Holbach, I've been working with the MOTU team since hoary and work for Canonical for quite a while, trying to make developing Ubuntu as fun as possible
[17:01] <dholbach> together we're going to grab some low-hanging fruit and fix a bug together
[17:01] <dholbach> questions please in #ubuntu-classroom-chat, prefixed with "QUESTION: ..."
[17:02] <dholbach> for those of you who are participating can you please just mention which Ubuntu release you are on and if you have a fast/slow connection to the net?
[17:02] <dholbach> in here is fine
[17:02] <Oli``> 8.10 - 8meg
[17:02] <mazaalai> hardy - 8meg
[17:02] <dholbach> just fast/slow is fine :-)
[17:02] <mruiz> 8.04 fast
[17:02] <tacone> 8.10 , 10meg
[17:02] <balachmar> 8.04 fast
[17:02] <mazaalai> fast :)
[17:02] <dholbach> I don't want you to start measuring now :-)
[17:02] <palango> 8.04 fast
[17:02] <Bijoy> hardy - medium
[17:02] <riot_le> 8.04 fast
[17:02] <Oli``> heh
[17:02] <fluteflute> intrepid, medium
[17:02] <takdir> 8.10 - slow
[17:03] <techno_freak> hardy - medium
[17:03] <Volans> 7.10 + pbuilder-intrepid - 7meg
[17:03] <hempal> 8.04 Medium (relative)//
[17:03] <gery> 8.10 - slow
[17:03] <dholbach> ok.. 8.04, 8.10 and 7.10 should be fine AFAIK - if you run into problems or have questions, please raise it on #ubuntu-classroom-chat
[17:03] <dholbach> we need to do some preparations first
[17:03] <sebner> 8.10 16mbit :P
[17:04] <dholbach> those of you who have a reasonably fast connection will install pbuilder
[17:04] <dholbach> please do the following:
[17:04] <dholbach>    sudo apt-get install pbuilder devscripts
[17:04] <dholbach> then edit    ~/.pbuilderrc
[17:04] <fabian23_> hardy slow
[17:04] <dholbach> and put
[17:04] <dholbach> COMPONENTS="main universe multiverse restricted"
[17:04] <dholbach> into it
[17:04] <dholbach> then run
[17:04] <dholbach>    sudo pbuilder create
[17:05] <dholbach> we'll let that run in the background as it will take some time
[17:05] <dholbach> everybody else please just install devscripts
[17:05] <dholbach> pbuilder is a tool with which we can test-build source packages in a minimal environment
[17:06] <dholbach> what I just mentioned was the short cut, https://wiki.ubuntu.com/PbuilderHowto has more information
[17:06] <dholbach> ok... while that's running, let's start looking for those low-hanging fruit :-)
[17:07] <dholbach> a while ago I started an effort called Harvest - it's basically a webpage that pulls data from various sources and displays that information per package
[17:07] <dholbach>   http://daniel.holba.ch/harvest
 QUESTION: which distro pbuilder should have created ?
[17:07] <dholbach> tacone: the ones that were mentioned before should all be fine
[17:08] <dholbach> if you click on the "Sourcepackage list" link it will present you with an awfully long list of "opportunities"
[17:08] <dholbach> let's fast-forward to http://daniel.holba.ch/harvest/handler.py?pkg=djvulibre
 QUESTION: how I can use local mirror server in pbuilder instead of archive.ubuntu.com
[17:09] <dholbach> mazaalai: please check out https://wiki.ubuntu.com/PbuilderHowto - it should have that information
[17:09] <dholbach>  MIRRORSITE="http://us.archive.ubuntu.com/ubuntu" I think
[17:10] <dholbach> ok, everybody at   http://daniel.holba.ch/harvest/handler.py?pkg=djvulibre   right now?
[17:10] <dholbach> it shows three opportunities
[17:10] <dholbach> 2 fedora patches
[17:10] <dholbach> and one from the "opportunities" list
[17:10] <dholbach> errr
[17:10] <dholbach> and one from the "patches" list
[17:10] <dholbach> please click on the  255695  link
[17:10] <dholbach> patches means: this is a bug with a patch attached
[17:11] <dholbach> as you can see, Harvest makes it easy to gather all that kind of information about packages that you're interested in
[17:11] <dholbach> amont them are: patches in Launchpad, upgrade requests, fedora patches, if the package does not build from source right now, etc etc
[17:12] <dholbach> sometimes it takes a bit to find something suitable to work on (because you don't know the package well enough or the bug is too complicated and so on), but Harvest is a good start to find those low hanging fruit
[17:12] <dholbach> ok... the bug report says something's wrong with the manpage of c44 (which is included in the package)
[17:13] <dholbach> let's see if that's true, please run
[17:13] <dholbach>    dget http://daniel.holba.ch/motu/djvulibre_3.5.20-7ubuntu1.dsc
[17:13] <dholbach> for those of you who attended  Packaging 101  yesterday, you already notice which files were downloaded and what they are their for
 QUESTION: do I want to do dget in a seperate folder, or does it put it into the pbuilder stuff?
[17:14] <dholbach> balachmar: as you like it, you can run it from a special directory if you like, no problemo
[17:14] <DarkSyranus> ls
[17:14] <dholbach> it downloaded a .orig.tar.gz a .dsc and a .diff.gz file
[17:15] <dholbach> short version: .orig.tar.gz is the unmodified tarball that the software authors released on their homepage, .diff.gz the compressed set of changes we need to apply to make it build "our way" and become a nice .deb package in the end, the .dsc file contains metadata like md5sum, etc
[17:16] <dholbach> alright
[17:16] <dholbach> please run    dpkg-source -x djvulibre_3.5.20-7ubuntu1.dsc
[17:16] <dholbach> this will extract the tarball, then apply the compressed patch
 QUESTION: it says "dscverify: can't find any Debian keyrings "?
[17:17] <dholbach> mitesh: it's a warning, you can safely ignore it
 QUESTION: I get dpkg-source: error: File ./djvulibre_3.5.20.orig.tar.gz has size 1359872 instead of expected 2426487 ?
[17:18] <dholbach> fluteflute: sorry for that, I'm just fixing the mistake
[17:19] <dholbach> sorry for that everybody, please run the commands again
[17:19] <dholbach> that is:
[17:19] <dholbach>   dget http://daniel.holba.ch/motu/djvulibre_3.5.20-7ubuntu1.dsc
[17:20] <dholbach>   dpkg-source -x djvulibre_3.5.20-7ubuntu1.dsc
[17:20] <dholbach> thanks for bearing with me :)
[17:20] <dholbach> OK
[17:20] <mruiz> :)
[17:21] <mitesh> :)
[17:21] <dholbach> let's try to find out if the problem that Mr Ralph Corderoy describes is still valid
[17:21] <dholbach> cd djvulibre-3.5.20/tools
[17:21] <dholbach> nroff -man c44.1 | less
[17:22] <dholbach> this will display the manpage
[17:22] <dholbach> and since he alread mentions that it's around the "PPM" bit in the text, we can run:
[17:22] <KennethVenken> ls
[17:22] <dholbach> nroff -man c44.1 | grep -a1 -b1 PPM
[17:22] <dholbach> you should see the ".SM" bit he is referring to in the bug report
[17:23] <dholbach> everybody can see that?
[17:23] <dholbach> let me rephrase: can you guys see that too? :)
[17:23] <riot_le> yes
[17:23] <techno_freak> yes
[17:23] <mitesh> yes
[17:23] <swingnjazz> yes
[17:23] <Oli``> yeehaw
[17:24] <balachmar> yes
[17:24] <chombium> yes
[17:24] <dholbach> great
[17:24] <tacone> I get  troff: fatal error: can't open `c44.1': No such file or directory
[17:24] <dholbach> just wanted to make sure I hadn't lost you on the way :)
[17:24] <dholbach> tacone: are you in djvulibre-3.5-20/tools ?
[17:24] <dholbach> djvulibre-3.5.20/tools
[17:24] <tacone> no ok, my fault, sorry
[17:24] <dholbach> alright, let's go on
[17:25] <dholbach> let's all download the patch that Ralph Corderoy is suggesting
[17:25] <dholbach> I'll assume you put it into ~ for now :)
[17:25] <dholbach> please run
[17:25] <dholbach>   patch -p0 < ~/c44.1.patch
[17:26] <dholbach> in my case it safely applied
[17:26] <dholbach> anybody got any problems?
[17:26] <mazaalai> it must be in djvulibre-3.5.20/tools, right?
[17:26] <dholbach> mazaalai: no, it doesn't matter where you put the patch, it's just important that you are in the directory, when you run the patch command
[17:27] <techno_freak> dholbach, successful == .PM shouldn't be there?
[17:27] <dholbach> techno_freak: I'm coming to that :)
 QUESTION : it says bash: /home/mitesh/c44.1.patch: No such file or directory
[17:27] <dholbach> mitesh: did you download the patch from the bug report to ~?
QUESTION: where can i download the patch from?
[17:27] <dholbach> https://bugs.launchpad.net/ubuntu/+source/djvulibre/+bug/255695
[17:28] <dholbach> the patch operation should take a second at best
[17:28] <techno_freak>  wget -c http://launchpadlibrarian.net/16614829/c44.1.patch
[17:28] <dholbach> ok... once you've applied the patch please run
[17:28] <dholbach>   nroff -man c44.1 | grep -a1 -b1 PPM
[17:28] <dholbach> again
[17:28] <dholbach> can you still the ".SM" bit there?
[17:29] <riot_le> no
[17:29] <mazaalai> nope
[17:29] <okar_> no :D
[17:29] <vishr> done...no
[17:29] <chombium> nope
[17:29] <swingnjazz> ok, it's gone
[17:29] <takdir> no
[17:29] <tacone> gone
[17:29] <dholbach> excellent, seems that Ralph Corderoy has done good work :)
[17:29] <dholbach> ok... now
[17:30] <dholbach> as we want to fix the bug in Ubuntu we need to add a changelog entry to explain what we changed and why
[17:30] <dholbach> this all happens in debian/changelog
[17:30] <dholbach> so please run:
[17:30] <dholbach>   cd ..
[17:30] <dholbach>   dch -i
[17:30] <dholbach> this will fire up an editor with a template changelog entry
[17:31] <dholbach> I won't go through all the specifics in it, read the Packaging 101 log from yesterday or check out the videos on http://youtube.com/ubuntudevelopers
[17:31] <dholbach> there's also https://wiki.ubuntu.com/PackagingGuide to find out more about it
[17:32] <dholbach> just make sure that the top entry says "intrepid" in the first line and that your mail address and name is correct
 QUESTION: how do you change the dhc template so it uses the correct email?
[17:32] <fabian23_> and for those running hardy and gutsy?
[17:32] <Volans> fabian23_:  dch -i -D intrepid
[17:33] <dholbach> Oli`` is right, I should have explained that before, for now just edit it manually, I'll tell you later how to fix it for the next times you're going to use the tool
[17:33] <dholbach> fabian23_ asks an important question: why not hardy, why intrepid?
[17:33] <dholbach> because we can just make changes in the current development release which is intrepid
[17:33] <dholbach> all the other releases have been closed
[17:34] <dholbach> there's the hardy-updates process which works differently, for now the link https://wiki.ubuntu.com/StableReleaseUpdates should be enough
[17:34] <dholbach> ok, let's document our changes
[17:34] <dholbach> that's the crucial step, because our fellow developers should not have to guess where our ideas came from
[17:34] <dholbach> I'll put in something like this:
[17:35] <dholbach>   * tools/c44.1: applied patch from Ralph Corderoy to fix the manpage markup. (LP: #255695)
[17:35] <dholbach> three things are worth noting:
[17:35] <dholbach>  1) explicitly named the files that were changed in the upload
[17:36] <dholbach>  2) I gave credit to the person who provided the fix
[17:36] <dholbach>  3) I mentioned which bug report in Launchpad this is all about
[17:36] <dholbach> in addition to that (LP: #<bugnumber>) will automatically close the bug once it got uploaded to the build daemons
 QUESTION: shouldn't we use a patch system ?
[17:36] <dholbach> tacone: good question
[17:37] <dholbach> there's going to be another session on Sep 3rd at 20:00 UTC about patch systems
[17:37] <dholbach> this package does not use a patch system itself and directly applies changes to the source, so we'll do the same
[17:38] <dholbach> once we're done with that, please save the file
[17:38] <dholbach> and run     debuild -S
[17:39] <dholbach> this will rebuild the source package (not build the package itself) and refresh the .diff.gz
[17:39] <dholbach> if you run
[17:39] <dholbach>   ls ..
[17:39] <dholbach> you will notice that there are two .diff.gz files now
[17:39] <dholbach> the one we downloaded and the second one we created ourselves
[17:40] <dholbach> since the question about patch system comes up again in #ubuntu-classroom-chat:
[17:40] <dholbach> if the Debian package we're attempting to fix does not add a patch system itself and patches the source inline (as opposed to adding patch files in debian/patches) we will do the same
 dholbach:  running debsign failed
 QUESTION: why dosen't debuild -S find my private gpg key?
[17:40] <dholbach> that's to be expected, I'll enlighten you about it in a bit - it's safe to ignore right now
QUESTION: /bin/bash: dh_testdir: command not found where can i find it? which package?
[17:41] <dholbach> chombium: sorry.....    sudo apt-get install debhelper
[17:41] <chombium> tx
[17:41] <dholbach> ok
[17:41] <dholbach> now please run:
[17:42] <dholbach>   cd ..; debdiff djvulibre_3.5.20-7ubuntu{1,2}.dsc > djvulibre.debdiff
[17:42] <dholbach> debdiff is a great utility that will compare the two revisions of debian source packages and print out the diff
[17:43] <dholbach> can you all please go to http://paste.ubuntu.com and paste the contents of your djvulibre.debdiff into it and give the link to your sourcepackage here?
[17:44] <techno_freak> fluteflute, ^^
[17:44] <dholbach> who managed to produce a  djvulibre.debdiff ?
[17:45] <Coper> dholbach: http://paste.ubuntu.com/42746/
[17:45] <dholbach> can you please post the contents of that file on http://paste.ubuntu.com and give the link here?
[17:45] <tacone> dholbach: http://paste.ubuntu.com/42747/
[17:45] <riot_le> http://paste.ubuntu.com/42748/
[17:45] <dholbach> Coper: looks good!
[17:45] <vishr> http://paste.ubuntu.com/42752/
[17:45] <dholbach> tacone: looks good
[17:45] <palango> http://paste.ubuntu.com/42749/
[17:46] <KennethVenken> http://paste.ubuntu.com/42750/
[17:46] <balachmar> http://paste.ubuntu.com/42754/
[17:46] <dholbach> riot_le: looks good too
[17:46] <swingnjazz> http://paste.ubuntu.com/42753/
[17:46] <Oli``> http://paste.ubuntu.com/42755/
[17:46] <Bijoy> http://paste.ubuntu.com/42756/
[17:46] <techno_freak> http://paste.ubuntu.com/42757/
[17:46] <dholbach> vishr: looks good as well, I'd just indent the 2nd line of the changelog entry a bit
[17:47] <dholbach> palango: the same goes for yours
[17:47] <palango> ok
[17:47] <dholbach> balachmar: yours is OK, I'd just wrap the line in the changelog entry
[17:47] <dholbach> KennethVenken: same as balachmar
[17:47] <takdir> http://paste.ubuntu.com/42758/
[17:47] <chombium> http://paste.ubuntu.com/42759/
[17:48] <dholbach> swingnjazz: please the contents of the file, not the command line output
[17:48] <dholbach> Oli``: same as balachmar
[17:48] <balachmar> @dholbach the famous 60 characters or something?
[17:48] <dholbach> Bijoy: was that the whole file?
[17:48] <swingnjazz> uuh, sorry for that
[17:48] <dholbach> balachmar: yeah, editors like vi make it easier for you
[17:48] <dholbach> techno_freak: same as balachmar's :)
[17:49] <dholbach> takdir: your changelog entry is a bit short
[17:49] <dholbach> chombium: your changelog entry is empty
[17:49] <techno_freak> dholbach, ok
[17:49] <dholbach> other than that:  W E L L   D O N E
[17:49] <dholbach> I mean...
[17:49] <dholbach>               _ _       _
[17:49] <dholbach> __      _____| | |   __| | ___  _ __   ___
[17:49] <dholbach> \ \ /\ / / _ \ | |  / _` |/ _ \| '_ \ / _ \
[17:49] <dholbach>  \ V  V /  __/ | | | (_| | (_) | | | |  __/
[17:49] <dholbach>   \_/\_/ \___|_|_|  \__,_|\___/|_| |_|\___|
[17:49] <dholbach>                                            
[17:49] <dholbach> everybody!
 QUESTION: I see that in the debdiff there are entries also for autogenerated files, we should leave them or use filterdiff?
[17:50] <dholbach> Volans: good question
[17:50] <Bijoy> sorry, my bad, I'll paste again
[17:50] <dholbach> config.guess and config.sub are build helpers that were automatically updated and can be filtered out - it makes reviewing a lot easier
 QUESTION: Is there a reason why there's a ~200 line difference in diff size between some of ours?
[17:50] <dholbach> Oli``: that's due to what I just said above
 REMARK: But the command dch -i started nano not vi
[17:50] <dholbach> balachmar: you're right
[17:51] <dholbach> so let's fix all the GPG, Name, Email address, Editor issues you all saw before
[17:51] <dholbach> if you all use bash as your shell (the default), then please edit ~/.bashrc
[17:51] <swingnjazz> http://paste.ubuntu.com/42762/
[17:51] <Bijoy> http://paste.ubuntu.com/42761/
[17:51] <dholbach> and add something like this at the end of it:
[17:51] <dholbach> export DEBFULLNAME='Daniel Holbach'
[17:51] <dholbach> export DEBEMAIL='daniel.holbach@ubuntu.com'
[17:51] <dholbach> export EDITOR=vim
[17:51] <dholbach> then save the file and run:
[17:52] <dholbach>   source ~/.bashrc
[17:52] <dholbach> swingnjazz: better, I'd just wrap the line of the changelog entry
[17:52] <dholbach> Bijoy: I'd indent the second line of the changelog entry a bit
[17:52] <dholbach> other than that: GREAT
 QUESTION: So what to do now we have patched it?
[17:53] <dholbach> that's the good question :-)
[17:53] <dholbach> let's build the package and see if after our changes it still builds
[17:53] <dholbach> if your pbuilder command has finished, please run
[17:53] <dholbach>   sudo pbuilder build djvulibre_3.5.20-7ubuntu2.dsc
[17:53] <dholbach> this is going to take a while
[17:54] <dholbach> in the meantime, I'm going to explain once you've found that:
[17:54] <dholbach>  1) the package still builds
[17:54] <dholbach>  2) once you installed the new package, your system still works
[17:54] <dholbach>  3) all is good
[17:54] <dholbach> (testing is crucial, but we don't do it in the 6 remaining minutes)
[17:55] <dholbach> what happens once all tests passed and you're happy with everything?
[17:55] <dholbach> you'll follow the sponsoringship process
[17:56] <dholbach> Sponsoring means: somebody who has upload privileges already will review your debdiff (you'll attach it to the bug in question) and if they're happy with what you've done, sign the source package with their GPG key and upload it
[17:56] <dholbach> https://wiki.ubuntu.com/SponsorshipProcess has more information about that
[17:56] <dholbach> (all the links I mentioned before are on https://wiki.ubuntu.com/MOTU/GettingStarted <- that's the one you should bookmark)
 QUESTION: Is there a way to mark a bug as being worked upon?
[17:56] <dholbach> very important question
[17:56] <dholbach> yes, there is
[17:57] <dholbach> you will click on the little arrow on the yellow bar in the middle of the bug report
[17:57] <dholbach> and set yourself as the assignee and set it to in progress
[17:58] <dholbach> as you can see: fixing Ubuntu is not always rocket science, but more a matter of detective skills and careful testing and asking questions
[17:58] <dholbach> the door to #ubuntu-motu is always open and you can ask questions there
[17:59] <dholbach> please read the sponsorship page carefully when asking for sponsorship
[17:59] <dholbach> any more, maybe general questions? :)
[17:59] <dholbach> we have a minute left :)
[17:59] <dholbach> OK, we'll have a nother session on thursday
[17:59] <dholbach> fixing bugs again :-)
[18:00] <dholbach> thanks everybody, you really ROCK
[18:00] <riot_le> do you publish this HowTo in the Wiki too?
[18:00] <sebner> but important ones since FF is here :P
[18:00] <techno_freak> thanks a lot dholbach :)
[18:00] <riot_le> +1
[18:00] <balachmar> thanks!
[18:00] <mazaalai> thanks dholbach
[18:00] <tacone> \o/
[18:00] <vishr> thanks a lot dholbach
[18:00] <dholbach> I'll repeat what I said yesterday: I'd like to see your names connected to Ubuntu Development soon, so make me proud! :-)
[18:00] <swingnjazz> thanks to you
[18:00] <balachmar> I am going to find some fruit straight away!
[18:01] <Bijoy> Thank you Daniel!
[18:01] <dholbach> next up is the unstoppable David Futcher (bobbo) who is going to introduce you to bzr
[18:01] <dholbach> thanks everybody!
[18:01] <charliecb> thx dholbach
[18:01] <dholbach> bobbo: the stage is yours :-)
[18:01] <bobbo> thanks dholbach !
[18:01] <bobbo> Hey! My name is David Futcher and today I'll be giving you a simple introduction to the Bazaar (BZR) Distributed Version Control system (dont worry if you dont know what that means, we'll get to that a bit later on).
[18:02] <bobbo> I like to answer questions, so, if you have any, please do not hesitate to ask. Prefix your question with QUESTION: and ask it in #ubuntu-classroom-chat.
[18:02] <bobbo> I have never done a UDW session before, so this session may be quite short or even run over, but we will cross that bridge when we come to it. If I am going too fast at any point, please shout and #-chat and I'll slow down :)
[18:02] <bobbo> So who is all here? Raise your hand in #-chat so I can see it!
[18:02] <sebner> \o/
[18:03] <pdragon> o/
[18:03] <bobbo> wahey, we have some people!
[18:03]  * palango raises his hand
[18:03] <bobbo> Before we get started we need to install some packages. Run sudo apt-get install bzr bzrtools to make sure you have everything we will need. It would also be handy if you have a Launchpad account (I guess most of you do), though its not absolutely necessary, but you might have to skip out some of the session later on.
[18:03] <bobbo> shout when you have all this installed and we can get started :)
[18:04] <bobbo> Awesome, everyone seems to be ready, lets get started!
[18:05] <bobbo> ## What is BZR?
[18:05] <bobbo> (This section is a bit heavy on reading, but we will get to some practical examples soon)
[18:05] <bobbo> azaar is a tool for helping people collaborate on open-source software. It tracks the changes that you and other people make to a group of files - such as software source code - to give you snapshots of each stage of their evolution.
[18:05] <bobbo> Using that information, Bazaar can effortlessly merge your work with other people's.
[18:06] <bobbo> Tools like Bazaar are called version control systems (VCS) and have long been popular with software developers.
[18:06] <bobbo> Bazaar's ease of use, flexibility and simple setup make it ideal not only for software developers but also for other groups who work together on files and documents, such as technical writers, web designers and translators. (I used Bzr when writing this session)
[18:07] <bobbo> Many traditional VCS tools require a central server which provides the change history or repository for a tree of files.
[18:07] <bobbo> To work on the files, users need to connect to the server and checkout the files. This gives them a directory or working tree in which a person can make changes.
[18:07] <bobbo> To record or commit these changes, the user needs access to the central server and they need to ensure they have merged their work with the latest version stored before trying to commit. This approach is known as the centralized model and its not too great.
[18:08] <bobbo> The centralized model has proven useful over time but it can have quite a few drawbacks. It makes it harder for new developer to come to the project and make more than a few small patches, while with Bzr, a developer can easily create a branch that adds large new features or massive code changes.
[18:08] <bobbo> Distributed VCS tools (like bzr) let users and teams have multiple repositories rather than just a single central one. In Bazaar's case, the history is normally kept in the same place as the code that is being version controlled.
[18:08] <bobbo> This allows the user to commit their changes whenever it makes sense, even when offline. Network access is only required when publishing changes or when accessing changes in another location.
[18:08] <bobbo> Everyone with me so far?
[18:09] <palango> yes
[18:09] <takdir> yup
[18:09] <pdragon> yep
[18:09] <Tindor> yep
[18:09] <swingnjazz> yes
[18:09] <bobbo> great!
[18:09] <jpds> ANSWER: Yep.
[18:09] <chienchouchen> yes
[18:09] <bobbo> Thats the end of the boring reading stuff, now onto some examples
[18:10] <bobbo> OK, so now you what what BZR is, and what it allows us to do, lets try it out. We are going to create a branch of GNU Hello. We need to grab the programs tarball and extract it:
[18:10] <bobbo> Open up a terminal and run:
[18:10] <bobbo>     wget http://bobbo.me.uk/ubuntu/udw/hello-2.3.tar.gz
[18:10] <bobbo>     tar -xvf hello-2.3.tar.gz
[18:10] <bobbo>     cd hello-2.3
[18:10] <bobbo> QUESTION: What are the differences between bzr and git?
[18:11] <bobbo> nemphis: I am not too sure (I have never used Git), but reading http://bazaar-vcs.org/BzrVsGit should tell you all you need to know :)
[18:11] <bobbo> Running 'ls' in your newly extracted hello-2.3 dir should show you the whole source tree for GNU Hello
[18:12] <bobbo> now we need to tell bzr to look after this source for us
[18:12] <bobbo>     bzr init
[18:12] <bobbo> (everything indented with 4 spaces should be run in a terminal :)
 QUESTION: what does ubuntu/cannonical use bazaar for?
[18:13] <bobbo> okar_: Ubuntu/Canonical use it for quite a few things
[18:13] <bobbo> mainly just for storing source code to applications we maintain
[18:13] <bobbo> but it is also used for storing documentation and for application packaging for the MOTU team
[18:14] <bobbo> bzr init will create all the files and directories that bzr needs to be able to add revisions in ./.bzr. You normally wont need to touch anything in that directory, but its good to know it is there so you dont accidentally hose it and lose all your revision history, which isnt too awesome.
[18:15] <bobbo> OK, now we have told Bzr to setup revision control in the directory, we need to tell it where all out files are:
[18:16] <bobbo>     bzr add
[18:16] <bobbo> This should recurse through all the directories and add all the files it can find to bzr.
[18:16] <bobbo> You will need to do this whenever you add a file to your source code (or whatever else you are making).
[18:17] <bobbo> Now bzr knows where your files are, we are ready to make our first "commit"
[18:18] <bobbo> This basically takes a 'snapshot' or 'version' (hence version control system) of the current code:
[18:18] <bobbo>     bzr commit -m "Initial commit of GNU Hello"
[18:18] <bobbo> The -m flag supplies a little message that you should use to explain what you have changed in this revision. You will see a bit more about that in a second.
[18:20] <bobbo> Now we are going to make a little edit to the GNU Hello source.
[18:20] <bobbo>     cd src
[18:20] <bobbo>     sed -i 's/world/universe/g' hello.c
[18:20] <bobbo>     cd ..
[18:21] <bobbo> We can now use bzr to generate a diff of the changes we just made (note: we dont need to do this all the time, just generating a diff is really useful):
[18:21] <bobbo>     bzr diff
[18:21] <bobbo> This is handy for creating a patch in order to fix a bug. Just pull the branch down, make the changes and attach the output of bzr diff to the bug.
[18:22] <bobbo> Oli``: QUESTIONS: Do bzr commands always have to be in the same dir as you ran the init? Or can you run them from child dirs?
[18:22] <bobbo> Oli``: They can be run from any child directory :)
[18:23] <Oli``> Superawesome
[18:23] <bobbo> Now we can commit our changes to the branch. We will use the -m flag to describe what we have done to the code: "Replace 'world' with 'universe' in hello.c"
[18:23] <bobbo>     bzr commit -m "Replace 'world' with 'universe' in hello.c"
[18:25] <bobbo> Now we can look at our branches history:
[18:25] <bobbo>     bzr log
[18:26] <bobbo> Each time you commit to a branch an entry is added to the log. This is handy so you can check back and see where and when you might have introduced a bug and what you changed to introduce it. This is obviously much easier than blindly hunting for a way to fix a bug.
[18:27] <bobbo> Everyone ready to move on?
[18:27] <pdragon> i am
[18:27] <Tindor> me too
[18:27] <palango> yes
[18:27] <bobbo> ## Launchpad Integration
[18:27] <bobbo> Bzr integrates with Launchpad.net quite easily (both Bzr and Launchpad are developed or at least sponsored by Canonical). Launchpad provides free code hosting for bazaar branches, which I am going to show you just now.
[18:28] <bobbo> This bit will require you to have your LP account setup correctly with SSH keys, which can be fiddly, but I'll try to help you if you get any problems :)
[18:29] <bobbo> Jump onto Launchpad.net and log into your account.
[18:31] <bobbo> Now you should hit the "Code" tab, which will take you to a page showing all the branches that you have registered before or are watching etc. (If you havent used Launchpad code hosting at all before, this page will be pretty empty).
[18:32] <bobbo> Hit the "Register Branch" button in the top right corner and it should take you to a form where we can setup hosting for a bzr branch.
[18:32] <bobbo> You can skip the owners box as this branch is just for demonstration purposes, but in the future you can use this to register branches under team names etc. (Useful for when you need to give more than one person access to branch, you setup a team, get your fellow devs to join and they will automatically be able to push to branches hosted under that team name).
[18:33] <bobbo> We dont need to give a project name (Launchpad puts any branch that doesnt belong to a project in a pseudo-project called '+junk'. See the branch location in bold at the very top of the form).
 QUESTION: not really a question. But bzr seems to have svn import facility. How reliable is this? does it import all change histories and every other detail ?
[18:35] <bobbo> I am not completely sure (I have never used SVN, jumped straight in with bzr), but http://bazaar-vcs.org/BzrForeignBranches/Subversion#limitations should tell you any problems you will have
[18:35] <bobbo> The name is just a short name for the branch, so in this case we could use something like 'gnu-hello' or 'bzr-example'.
[18:35] <tuxmaniac> thanks bobbo
[18:35] <bobbo> For branch type we want "Hosted", so that Launchpad does all the hosting for us (we dont need to setup our own servers to host the code, though this is perfectly possible and very handy if you are using Bzr at work, where you can have a server sitting, controlling your version control).
[18:36] <bobbo> For title put something like "GNU Hello Branch to Demonstrate BZR's Awesomeness" and set the description to "UDW Demonstration branch to show how to use BZR".
[18:36] <bobbo> Check it all looks ok and hit submit. We should now be on a summary page for your branch.
[18:37] <bobbo> shout in #-chat when you are there!
[18:37] <bobbo> In the right hand bar it will show you who owns the branch (in this case it is you) and who subscribes to the branch (it is possible to subscribe to a branch, so you get emailed everytime someone pushes some new revisions).
[18:38] <bobbo> On the top it has the branch name and description you specified, but the really useful part of this page for us is the bit in bold underneath the description. The bzr command next to "Update this branch" (which should look something like "bzr push lp:~bobbo/+junk/bzr-example". This command can just be copied and pasted into a terminal and should upload all your new changes to the branch.
[18:39] <bobbo> but dont paste it in just yet!
[18:39] <bobbo> first of all we need to tell bzr we will be working with Launchpad
[18:40] <bobbo>     bzr launchpad-login
[18:40] <bobbo> sorry:
[18:40] <bobbo>     bzr launchpad-login <your_lp_id>
[18:41] <bobbo> *now* run the command Launchpad just generated for you
[18:41] <bobbo>  This should ask you for your Launchpad SSH key password and then upload your branch to launchpad.
[18:43] <bobbo> sorry!
[18:43] <bobbo> we need to push with the --use-existing-dir flag because this is the first push we are doing of this branch
[18:43] <bobbo> bzr push <location_lp_gave_you> --use-existing-dir
[18:44] <bobbo> tuxmaniac> QUESTION: Is it because no project name was given and everybody is using the same branch or some such?
[18:44] <bobbo> nope, I dont think so, Launchpad just has hissy fits if you dont do things the way it wants to :P
[18:45] <bobbo> Right everyone managed to upload their branch?
[18:46] <pdragon> worked for me
[18:47] <bobbo> Great, seems to have worked for most people
[18:47] <bobbo> Ok now to check on your Launchpad hosted branch. Refresh the page in your browser (or surf back to it if you closed the tab/window).
 What is meant by ﻿ <your_lp_id> in the ﻿bzr launchpad-login?
[18:48] <bobbo> swingnjazz: Just your normal launchpad username
[18:49] <bobbo> Has everyone managed to get that to work?
[18:50] <bobbo> Success everybody. Well done!
[18:50] <bobbo> We have about ten minutes left, I was going to talk about the concept of branching and merging, but if I start now we will probably run out of time...
 QUESTION: how would you go about maintainiing a package in bzr?
[18:52] <bobbo> mok0: I havent personally done it yet, but james_w (Resident Ubuntu BZR Guru) is hosting a session on Thursday that will cover exactly that
[18:52] <mok0> Cool
[18:52] <bobbo> Anyone that is interested in packaging with bzr, I would highly recommend you go along to that
[18:53] <bobbo> Correction: I messed up, James_w's session is on Wednesday
 QUESTION at one time I had the branch revision # in my prompt, how is that done?
[18:53] <mok0> ... tomorrow
[18:54] <bobbo> you can view the current revision number by running "bzr revno"
 QUESTION: how can I plug another abbreviation like lp: in bzr ? like work: or dev: or..
[18:54] <bobbo> I think this is all handled from within Bzr's codebase itself
[18:55] <bobbo> but BZR is highly modular, so it probably wouldnt be impossible to plug in other prefixes
[18:56] <bobbo> Has anyone got any more questions?
[18:57] <tuxmaniac> bobbo: you missed mine
[18:57] <bobbo> tuxmaniac: sorry!
 question: what if i want to use a hosting service other than LP? how do I indicate that to bzr. (like we do bzr launchpad-login <userid>)
[18:58] <bobbo> Bzr servers can be setup fairly easily, but of course (as I said above) you will lose out on being able to use the lp: quick prefixes
[18:59] <bobbo> so instead of bzr push lp:name/project/branch it would be "bzr push bzr+ssh://server/branch_location" or something similar
[18:59] <bobbo> ktenney> ﻿QUESTION can you run bzr commands from outside the checkout tree?
[19:00] <superm1> i think time is up on the last talk, bobbo could you wrap up so I would be able to get started?
[19:00] <bobbo> No, you have to run bzr commands from within the directory you ran 'bzr init' in, or any of its child directories
[19:00] <bobbo> superm1: sorry!
[19:00] <bobbo> OK, I'll be happy to answer anymore questions in /msg
[19:00] <bobbo> now for Kernel module packaging with DKMS -- MarioLimonciello (superm1)
[19:01] <superm1> thanks :)
[19:01] <superm1> Hi everyone, my name is Mario Limonciello.  You may know me from things such as Mythbuntu & Ubuntu development.  I'm here today to talk to you a little bit about a project that I maintain called DKMS.
[19:01] <superm1> I assume that most of the people here have heard about DKMS, so I'll try to be brief in my overview of it.  DKMS stands for Dynamic Kernel Module System (http://linux.dell.com/dkms/).
[19:01] <superm1> It's original purpose was to allow the ability to ship updated versions of kernel modules without necessarily having to rebuild the kernel or needing to rebuild the kernel modules themselves again every time the kernel was upgraded.  Timing of new kernel releases and seeing patches get upstream don't always mesh well with release schedules, so it was intended to be an interim solution, not a substitute for submitting things upstream..
[19:02] <superm1> This original purpose has worked very well for Dell and the different distributions shipped on pre-installed laptops (RHEL, SuSE, & Ubuntu).  Fortunately, the way the DKMS framework was assembled, it has gained several other very useful purposes.
[19:02] <superm1> Starting with Intrepid, all users of proprietary graphics kernel modules will be using DKMS to maintain the kernel module that ships with the driver.  This means it will be significantly easier to add newer drivers to Ubuntu releases and less of a maintenance overhead for the kernel team that was previously maintaining linux-restricted-modules and it's 150MB+ source package.
[19:03] <superm1> Also, it ends up being a useful debug tool.  DKMS allows the creation of packages with both the source and binary modules self contained.  This means that users will be able to install a package and then be able to test it on a variety of kernels other than the original intended kernel.
[19:03] <superm1> So, now that you have a pretty basic idea of what DKMS has been used for thus far, I'll give you an example of how to use it.
[19:04] <superm1> The first example we're going to go into is the basic updated ethernet driver.  As you may have heard, Dell is going to be shipping Ubuntu on it's Vostro line of laptops.
[19:04] <superm1> There unfortunately was a very bad bug that was encountered shortly after 8.04 was released preventing the ethernet adapter from working.  A patch was developed that is now included in 8.04.1.  Users will be able to upgrade to 8.04.1 after receiving their machines, but performing the upgrade without an ethernet driver is a little bit difficult.  Here's an overview of how we got around that issue.
[19:04] <superm1> Ideally i'd like people to follow along
[19:05] <superm1> i'll try to give the steps as generically as possible so that you can try this on the last few ubuntu releases
[19:05] <superm1> 1) Install DKMS on your machine.  The version in hardy is a little bit old, but the version in Intrepid is up to date.  Until the backport is ready, I'd recommend grabbing the latest version from http://linux.dell.com/dkms/.  This is the same package that is in Intrepid.
[19:06] <superm1> 2) Grab the realtek ethernet driver that shipped with 8.04 from http://kernel.ubuntu.com/git?p=ubuntu/ubuntu-hardy.git;a=blob_plain;f=drivers/net/r8169.c;hb=46d798f10f53bf6814cb6b429f45e660b0a9aee4 .  Save this file as r8169.c
[19:06] <superm1> 3) Grab the patch(es) that needed to be applied to make the card function: http://pastebin.com/m5fed36a7 .  Save this as r8169-8.04.1.patch
[19:06] <superm1> 4) Create two directories, /usr/src/r8169-2.2LK/ and /usr/src/r8169-2.2LK/patches.  I'll explain a little bit later why this naming scheme was chosen.
[19:07] <superm1> 5) Copy r8169.c into /usr/src/r8169-2.2LK
[19:07] <superm1> 6) Copy r8169-8.04.1.patch into /usr/src/r8169-2.2LK/patches
[19:07] <superm1> 7) Create a basic kernel Makefile in /usr/src/r8169-2.2LK/Makefile.  You can grab the one I've made from http://pastebin.com/f2ed728e2 . This Makefile just lists the different objects that get linked together.  Some modules won't have very complex Makefile's (such as this one)
[19:08] <superm1> 6) Now, we'll craft a DKMS control file to explain what to do with these pieces.  This file explains to DKMS exactly what we will be doing, what the packages is called, what the modules are named etc.  Take a look at http://pastebin.com/f5bea78be
[19:08] <superm1> so, first the obvious ones:
[19:08] <superm1>  a) The PACKAGE_NAME field describes the name of the DKMS package we are making
[19:09] <superm1>  b) The PACKAGE_VERSION field describes the version of the package we are making.
[19:09] <superm1>  c) the CLEAN line explains exactly what needs to be cleaned up and how to do it
[19:09] <superm1> you'll find these 3 in all packages dkms control files
[19:09] <superm1>  d) BUILT_MODULE_NAME[0] is for the first kernel module we are creating.
[19:10] <superm1> this is listed as a vector because you can build many modules from a single dkms packages
[19:10] <superm1> *package
[19:10] <superm1> e) PATCH[0] lists the patches that get applied to the pristine module prior to the build
[19:10] <superm1> f) DEST_MODULE_LOCATION[0] describes where we will be installing the module to on the system.  By default updates/ is higher priority than the normal kernel driver locations when module dependencies are calculated
[19:11] <superm1>  g) AUTOINSTALL describes whether we will automatically rebuild and reinstall on newer kernel releases.  I'll talk more about this later.
[19:11] <superm1> There are a lot of other very complicated things you can do with DKMS, so this is a very basic example only listing the above options.
[19:11] <superm1> so now that you have an idea of what's in the control file
[19:11] <superm1> 7) Place this DKMS control file in /usr/src/r8169-2.2LK/dkms.conf
[19:13] <superm1> well I suppose i should have asked for questions sooner, so i'll interrupt this and answer quickly before carrying on:
[19:13] <superm1> QUESTION: what are we doing precisely ?
[19:14] <superm1> so what this is doing is replaying how a DKMS package was created a few months ago in a real life situation
[19:14] <superm1> this example actually happened, so this is how we (Dell) got around it
[19:15] <superm1> okay i'll pick back up then - feel free to interject as necessary as i keep going
[19:15] <superm1> 8) Add the package to the DKMS build system.  All the pieces are ready now, so this registers the package on  the system.
[19:15] <superm1> sudo dkms -m r8169 -v 2.2LK add
[19:15] <superm1> 9) Install the headers for your current running kernel so that we can build against it.
[19:16] <superm1> sudo apt-get install linux-headers-`uname -r`
[19:16] <superm1> 9) Build the module.  Once you've added a module, bash-completion will allow you to tab complete a lot of these fields.
[19:16] <superm1> sudo dkms -m r8169 -v 2.2LK build
[19:17] <superm1> the build process should complete without any error
[19:17] <superm1> this means that the kernel modules are "available" on your system, but not in use anywhere
[19:17] <superm1> 10) Now our module is built and ready to use.  We can build for additional kernel versions by specifying the -k field.  If we were looking for some widespread testing of this module, we may want to put it on our PPA.  The latest version of DKMS has support to build debian source packages just for this purpose.
[19:18] <superm1> sudo dkms -m r8169 -v 2.2LK mkdsc
[19:18] <superm1> those familiar with packaging (or at least have attended recent talks), should know that this is the file that describes your package
[19:18] <superm1> 11) You will have a dsc and tar.gz.  You will just need to create a .changes file that you can dput (outside the scope of this howto) and sign it with your GPG key.
[19:19] <superm1> 12) If you wanted to distribute this without a PPA, you could issue this command to build a binary deb for users to use:
[19:19] <superm1> sudo dkms -m r8169 -v 2.2LK mkdeb
[19:19] <superm1> similar functionality is available for creating driver disks, and packages for other distributions.  of course this is an ubuntu centric talk, so I'll only talk about mkdeb/mkdsc
[19:20] <superm1> Either way, you will have files in /var/lib/dkms/r8169/2.2LK that can be distributed.  Now the thing that I didn't talk about here was that AUTOINSTALL directive.
[19:20] <superm1> If you know that this is only necessary for a single kernel release, you may want it to not AUTOINSTALL.
[19:20] <superm1> If you know exactly when the support is available, there is functionality to indicate when the package is marked OBSOLETE_BY.  This and other advanced features are discussed a bit more in detail on the man page.
[19:21] <superm1> For our case we knew that the support was available in the next kernel ABI, so we were able to define OBSOLETE_BY to be 2.6.24-18.  This means that the DKMS package will remain on the system, just dormant.  Users will be able to remove it themselves or let it sit around without doing any harm
[19:21] <superm1> Now, For some other examples of how DKMS is used, I'd recommend taking a look at the source for fglrx-installer, nvidia-drivers-*, lirc, and qemu.
[19:22] <superm1> the intrepid versions of each of these packages uses DKMS to rebuild kernel modules independently of the running kernel
[19:22] <superm1> hey each adapt DKMS into their packaging quite well.
[19:22] <superm1> *they
[19:23] <superm1> there is also a video and a thorough wiki page describing some more about DKMS usage at https://help.ubuntu.com/community/Kernel/DkmsDriverPackage and http://blog.phunnypharm.org/2008/07/dkms-presentation.html respectively.
[19:24] <superm1> That's about what I wanted to walk through.  The biggest take away is that by using DKMS, the hardest part of delivering fixed modules should be coming up with the fixes, not necessarily figuring out the right way to package them and keep them maintained
[19:24] <superm1> so, does anyone have any questions?
[19:26] <superm1> well then i suppose i'll end up wrapping up a bit early :)  Feel free to send any questions that you may come up with later to the DKMS mailing list or to poke me on IRC if it's something small/quick
[19:27] <mok0> thanks, superm1
[19:28] <superm1> well since there was one more question, "<tacone> giving a little overview on what dmks precisely is"
[19:28] <superm1> so i'll try to go a little more in detail
[19:29] <superm1> so it's a Dell developed framework for situations just like these.  Before we were dealing with Ubuntu, getting some very large patches into RHEL kernels w/ stable ABIs was very difficult
[19:30] <superm1> often to enable things like audio, you would have very invasive patches that would be rolled into the next RHEL release, but the schedule for releases fit well outside the schedule for launching the workstation or laptop
[19:31] <superm1> working closely with Ubuntu, this is a lot easier and not necessary for those particular purposes.  Ubuntu does have a stable release update policy, so rather than shipping a lot of DKMS'ified drivers, it's just when the corner cases come about that we really use it
[19:32] <superm1> in trying to be good netizens, this is one of the things that we try to contribute outside of simple hardware enablement
 Q: what's the point of DKMS ? to compile a new driver against a new kernel release automatically ?
[19:33] <superm1> yeah, that's the biggest advantage that can get taken away with it
[19:34] <superm1> since it's an extendable framework, you can even include patches in your dkms package so that newer kernels that would normally prevent compiling due to ABI changes don't fail.
[19:34] <superm1> alberto added a patch to the nvidia-glx 177 package for this purpose on the 2.6.27 kernel
[19:34] <superm1> also to my knowledge, Sun has started to use it for virtualbox modules
[19:35] <superm1> Q: <tacone> you can prevent a compile from failing ? <tacone> vodoo ?
[19:36] <superm1> yes, and yes.  well actually no.  but if you know that this will be used with other kernels, and know where it will be breaking, you can include patches directly in the DKMS patch for those different kernels.  This means that lets say RHEL had 2.6.18 and we had 2.6.24.  If you wanted to use this same package on both systems, you could create a patch that allows it to compile against 2.6.18 that only gets applied when the user tries to u
[19:36] <superm1> se it on 2.6.18
 QUESTION: can I use DKMS to build an i386 deb on amd64?
[19:37] <superm1> Hum.  That's an interesting question.  I can't say I've experimented personally on doing this.  I would think so, but you will have to modify your build line and/or Makefile to be sure to choose a 32 bit compiler
[19:38] <superm1> i'd be more confident of it finishing properly if you were to do it in an i386 chroot
[19:38] <superm1> Q: <tacone> so DKMS allows you to distribute patches for different kernels into just 1 package, right ?
[19:39] <superm1> Yes.  Of course if there is a newer kernel that was released needing a new patch, you can't predict the future in the package.  You'll have to release a new package that includes that new patch.  You don't have to worry about breaking earlier kernels though since it's conditionally applied
[19:40] <superm1> this is why there are systems like the PPA system available though. you'll just need to publish a newer source package with that patch included
[19:40] <superm1> in the cases of the more widespread use (like  fglrx and nvidia), such patches would be done in formal stable release updates
[19:41] <superm1> OK, any more questions?
[19:43] <superm1> OK, well i'll wrap up once more then.  Thanks again for everyone who listened in!
[19:58] <leonardr> tap tap
[19:58] <barry> apologies: my wife injured her foot over the weekend and i have to pick up my son from school.  i'm going to miss the first 10-15 minutes of this class
[20:00] <leonardr> we'll see you soon, barry
[20:00] <leonardr> hi, everybody
[20:00] <leonardr> My name is Leonard Richardson. I'm on the Launchpad Foundations team and I'm the co-author of the O'Reilly book "RESTful web Services".
[20:01] <leonardr> I'm here to talk about the Launchpad web service API that we released a few weeks ago.
[20:01] <leonardr> I'll do a slow infodump and then take some questions. if you have questions in the meantime just put them in #u-c-c
[20:01] <leonardr> 1. Intro
[20:02] <leonardr> First, we've got docs talking about the API here: https://help.launchpad.net/API
[20:02] <leonardr> Put simply, we've created an easy way for you to integrate Launchpad into your own applications.
[20:02] <leonardr> If you perform the same tasks on Launchpad over and over again, you can now write a script that automates the tasks for you.
[20:02] <leonardr> You don't have to rely on fragile screen-scraping.
[20:02] <leonardr> If you're a developer of an IDE, testing framework, or some other program that has something to do with software development, you can integrate Launchpad into the program to streamline the development processes.
[20:03] <leonardr> If you run a website for a project hosted on Launchpad, you can get project data from Launchpad and publish it on your website.
[20:03] <leonardr> And so on. You'll eventually be able to use the API to do most of the things you can do through the Launchpad web site.
[20:03] <leonardr> 2. Tools
[20:03] <Yasumoto> ls
[20:04] <leonardr> The simplest way to integrate is to use launchpadlib, a Python library we've written.
[20:04] <leonardr> (see https://help.launchpad.net/API/launchpadlib)
[20:04] <leonardr> This gives you a Pythonic interface to the Launchpad API, so you don't have to know anything about HTTP client programming:
[20:04] <leonardr> >>> launchpad.me.name
[20:04] <leonardr> u'leonardr'
[20:04] <leonardr> >>> launchpad.bugs[1].title
[20:04] <leonardr> u'Microsoft has a majority market share'
[20:04] <leonardr> But it's also easy to learn the API's HTTP-based protocol and write your own client in some other language.
[20:05] <leonardr> (see https://help.launchpad.net/API/Hacking for that)
[20:05] <leonardr> 3. Roadmap
[20:05] <leonardr> Right now the web service publishes information about people, bugs, and the Launchpad registry (the projects, milestones, etc.).
[20:05] <leonardr> We've divided up the remaining work by team. The bugs team is in charge of publishing bugs through the web service, the code team is in charge of publishing branches, and so on.
[20:06] <leonardr> I got information from the team leads about where this, publication of their data through the web service, fits in their priorities for the next 3-4 months.
[20:07] <leonardr> I think it's important to tell you this to set expectations--you might have a cool idea for a program but you won't be able to write it until we publish the objects you need
[20:07] <leonardr> Bugs: A top priority. Bugs are almost completely published right now. The big thing missing is bug search, which should come online within a few days.
[20:07] <leonardr> Registry (projects, milestones, etc.): A top priority. We're working on this in the Foundations team now.
[20:07] <leonardr> Code: Branches will be published soon.
[20:08] <leonardr> Soyuz: There will be some basic objects published to help with the Ubuntu workflow.
[20:08] <leonardr> The translations, answers, and blueprints teams don't plan to work on this in the next 3-4 months.
[20:08] <leonardr> That's my infodump, so i'll take questions now.
 QUESTION: are there plans for 'official' bindings for other languages?
[20:09] <leonardr> no, we're only writing an official client in Python
[20:09] <leonardr> oh, actually
[20:09] <leonardr> flacoste reminds me that we'll probably also write a javascript client for use in Ajax applications
[20:10] <leonardr> and because we publish the capabilities of our web service in WADL documents, it'll be easier to write a client in some other language than if you were writing the whole client from scratch
 I couldn't find a good WADL library for PHP...
[20:11] <leonardr> that's a good point. WADL support itself isn't very good in a lot of languages, because it's a new standard
 leonardr: QUESTION: What is WADL ?
[20:16] <leonardr> good question
[20:16] <leonardr> first, here's the url
[20:17] <leonardr> https://wadl.dev.java.net/
[20:17] <leonardr> it's an XML vocabulary, the name stands for Web Application Description Language
[20:17] <leonardr> i think of it as a kind of super-enhanced version of HTML forms
[20:18] <leonardr> when you get an HTML form in your browser, you know that you can send data to a certain URL, formatted a certain way, and something will happen
[20:18] <leonardr> WADL is a way of talking about which HTTP requests you can send to URLs. it lets you specify what the data should look like, in more detail than HTML forms allow
[20:19] <leonardr> and it also lets you specify what's likely to come back in response to the HTTP request
[20:19] <leonardr> if you look at the reference documentation
[20:19] <leonardr> https://edge.launchpad.net/+apidoc
[20:19] <leonardr> (which is out of date, but that'll be fixed soon)
[20:19] <leonardr> that document is generated from the WADL document using an XSLT transform
[20:20] <leonardr> you can see that it talks about what kinds of objects there are on the web service, what data they contain, and what you can do to them
[20:20] <leonardr> you can use that information to generate docs, or you can use it to go from your mental picture of what you want to do to launchpad, to an HTTP request that will have that effect
 ﻿﻿leonardr: QUESTION: How can i delete a branch over the web-api ? and can i delete a project over the web-api ?
[20:21] <leonardr> i don't think the web service publishes branches yet
[20:22] <leonardr> give me a minute to look into the project question
[20:23] <leonardr> well, there's no way to delete projects right now, but it's likely that there will be something of that kind later, even if it's only to help admins delete unapproved spam projects
[20:24] <leonardr> assuming we did publish branches now, and you could delete them
[20:24] <leonardr> in launchpadlib, you would probably call a method on the branch object .delete()
[20:24] <leonardr> this would translate into an HTTP request that invoked a POST operation on the branch object
[20:25] <leonardr> i hope that answers your question--i can come back to it if now
 QUESTION: Does an API request user more or less bandwidth?
[20:25] <leonardr> it depends on what you're doing
[20:25] <leonardr> if you want the details of your user account, or a bug, it'll be a lot less bandwidth
[20:26]  * leonardr runs a quick test
[20:26] <leonardr> yeah, about 2-3k for a bug in the API versus 25k on the website
[20:27] <leonardr> it's about the same size for a bug in the API as for the textual representation of a bug at /+bug/[number]/+text
[20:27] <leonardr> but if you get a huge list of bugs it's going to be 75 * the size of a bug
[20:27] <leonardr> and you probably wouldn't make that kind of request on the website
[20:28] <leonardr> so depending on usage, you could use a lot more, even though individual objects take less data
[20:28] <leonardr> to represent
 QUESTION: Is there a page (or trunk) where you can watch the new API changes in detail?
[20:29] <leonardr> API changes land on Launchpad trunk, and sometimes on launchpadlib trunk. There's no page listing the changes in detail, but every week i write a summary of the week's progress on the launchpad news blog
[20:29] <leonardr> http://news.launchpad.net/category/api
[20:30] <leonardr> flacoste points out that you can also diff the wadl file to see what's new, because the wadl file gives a complete description of the web service
 QUESTIONS: when will attachment sending be implemented ?
[20:32] <leonardr> (this is attachments to a bug)
[20:32] <leonardr> I'm pretty sure the bugs team is working on that now. I may change the way it works in the future because I think it's a little hacky. But if I'm right it should be in sometime this week.
 QUESTION(2): is it possible to delete a comment from your project, using the api ?
[20:34] <leonardr> In general, if it's possible in Launchpad, it's likely that we will eventually add it to the web service.
[20:34] <tacone> it's not possible in launchpad, or hidden :)
[20:35] <leonardr> Nothing will show up in the web service that's not already present in Launchpad first.
[20:35] <leonardr> It sounds like flacoste in #chat is saying that that's a feature the bugs team is working on.
[20:35] <leonardr> They'll get it into Launchpad and then they'll export it through the web service.
 QUESTION: What are some nifty things the API can do and everyone should know about?
[20:36] <leonardr> Right now the coolest thing is probably the scriptable access to bugs
[20:37] <leonardr> I think that's the most interesting part of Launchpad that's been exposed to far.
[20:37] <leonardr> For me most of the excitement is behind the scenes. We have a design that makes it very easy for the bugs, code, etc. programmers to publish their objects through the web service without having to learn a lot about how the web service works.
[20:38] <leonardr> And our design also makes it easy to write a loosely-coupled client like launchpadlib
 QUESTION: to understand this right, the functionallity of the API will always be a sub-set of the functionallity provided by the web interface?
[20:39] <leonardr> I never like to say "always", but it's pretty likely that we won't publish features through the web service that aren't present in the web site
[20:39] <leonardr> Certainly not generally useful things like hiding spam comments.
[20:39] <leonardr> But we do have _architectural_ features on the web service, like caching, that aren't on the website.
[20:40] <leonardr> And in the future the line between the two might blur: we might have some special way of performing batch operations through the API that wouldn't make sense to expose through the website.
[20:40] <leonardr> (that's just an example, we're not actually planning that)
 QUESTION: What are things you should watch out for when using the API?
[20:41] <leonardr> If you're using launchpadlib, make sure you have a cache directory that you reuse between runs of your program. This will save you a huge amount of time.
[20:41] <leonardr> But also note that launchpadlib's cache is not thread-safe. If you're running multiple incarnations at once, you'll need to give each one a separate cache directory.
[20:42] <leonardr> Be careful when iterating over lists, because the list might be enormous.
[20:42] <leonardr> It's usually safer to slice a list and iterate over the slice
[20:43] <leonardr> If you're writing your own client you'll need to follow some good HTTP practices so you don't waste time and bandwidth. I talk about most of those in the hacking document.
[20:43] <barry> leonardr: isn't launchpadlib's cache based on httplib2?
[20:43] <leonardr> hi, barry
[20:43] <leonardr> yes, launchpadlib is based on httplib2, and httplib2's FileCache is also not thread-safe
[20:44] <barry> thx
 QUESTION: launchpadlib: why is the no default directory set for caching but a temp dir is used
[20:44] <leonardr> If I understand your question correctly, it's because I didn't want to dictate a directory structure to launchpadlib users
 QUESTION: how does one develop and test code without doing weird stuff to Launchpads bug database?
[20:45] <leonardr> I believe you can make your code run against the staging server, which gets wiped every night. barry, is that right?
[20:45] <barry> leonardr: right
[20:45] <flacoste> and it's the default
[20:45] <leonardr> You can specify which server to run against when you create a Launchpad object
[20:45] <mok0> thx
[20:45] <barry> you also don't need to worry about spamming the world when testing against staging, since it doesn't send emails
[20:46] <leonardr> The example in https://help.launchpad.net/API/launchpadlib shows how to run against staging
 QUESTION: Why does running: ./setup.py install on lp:launchpadlib try to download and install a ton of stuff I have installed: http://paste.ubuntu.com/42817/
[20:51] <barry> jpds: that's the way setuptools works by default
 QUESTION: How does launchpadlib relate to the older launchpadbugs module?
[20:52] <leonardr> i think that's thekorn's module, and he's working on making it use launchpadlib
[20:54] <leonardr> ok, any other last-minute questions?
[20:56] <mok0> leonardr: thanks, great lesson
[20:56] <leonardr> mok0, my pleasure
 Question: one quick one: is there any update on updating ubuntu's python-httplib2
[20:57] <thekorn_> thanks leonardr great session, great API and launchpadlib
[20:57] <leonardr> no, i don't know any more than you do on that
[20:58] <leonardr> thekorn_, thanks for your support and your help
[21:00] <charliecb> leonardr: thx for the sesion!!
[21:03] <bdmurray> Hi, I'm Brian Murray and Ubuntu's Bugmaster.
[21:03] <bdmurray> As a member of Ubuntu's QA team I tend to use Launchpad quite a lot and sometimes I want to perform actions or see things that aren't currently available in the user interface.
[21:04] <bdmurray> Or maybe shouldn't be available.
[21:04] <bdmurray> Subsequently, I maintain a couple of projects, python-launchpad-bugs and launchpad-gm-scripts, for hacking Launchpad.
[21:05] <bdmurray> I want to start off talking about launchpad-gm-scripts as it is relatively new and there is some exciting stuff going on there.  So much exciting stuff I might not make it to python-launchpad-bugs.
[21:05] <bdmurray> The launchapd-gm-scripts project, https://launchpad.net/launchpad-gm-scripts, is a collection of Greasemonkey scripts that modify the look and behavior of Launchpad.
[21:06] <bdmurray> In case you don't know greasemonkey is a Firefox extension that allows scripts to make changes to how HTML web pages are rendered.
[21:06] <bdmurray> In some cases you can actually see the changes happen as the page will load, the script will run and then the page will change.
[21:06] <bdmurray> Greasemonkey has been available as a package, firefox-greasemonkey, since Feisty.
[21:07] <bdmurray> The scripts in launchpad-gm-scripts are available via bzr, bzr branch lp:launchpad-gm-scripts, or it is possible to browse the project's code and install scripts without getting the whole project.
[21:07] <bdmurray> For example, going to http://bazaar.launchpad.net/~gm-dev-launchpad/launchpad-gm-scripts/master/files we can click on the green arrow on the far right of the lp_hide_tags.user.js row and be presented with a Greasemonkey dialog to install the script.
[21:08] <bdmurray> All the scripts end with 'user.js' and are written in javascript.
[21:08] <bdmurray> As you can see we have collected quite a few of these scripts!
[21:08] <bdmurray> Therefore, I'll just briefly go over their features.
[21:08] <bdmurray> More information is available in the README file of the bzr tree.
[21:08] <bdmurray> Are there any questions so far?
[21:10] <bdmurray> I recently added, well it was today, the lp_activity_comments script from Markus Korn.
[21:10] <bdmurray> This script is incredibly useful as it displays information from a bug's activity log directly on the bug report and avoids your having to click the "Activity log" link and wait for another page to load.
[21:10] <bdmurray> This allows you to view information about who changed a bug's status or importance and when they changed it.
[21:11] <bdmurray> The activity shows up either in the comment the change happened in or as a separate pseudo-comment.
[21:11] <bdmurray> A screenshot of the change is visiable at http://people.ubuntu.com/~brian/greasemonkey/screenshots/lp_activity_comments.png.
[21:11] <bdmurray> Notice in the first comment that Markus changed the bug's status from Confirmed to In Progress and in the last one I changed it from In Progress to Fix Released.
[21:12] <bdmurray> For quite a while we've had the lp_button_tags script, written by Bryce Harrington, which allows you to add tags to a bug report without loading the "+edit" page for the bug report.
[21:12] <bdmurray> A screenshot is at http://people.ubuntu.com/~brian/greasemonkey/screenshots/lp_buttontags.png near the cursor there is the text "Add tag:" followed by a list of tags.
[21:12] <bdmurray> These tags are statically set in the script itself, however they are in a section surrounded by a "User settable data" comment so they are easily modified.
[21:13] <bdmurray> Additionally, when you mouse over a tag you are presented with a tip regarding when to use the tag.
[21:14] <bdmurray> Does anyone want to know how to modify that the tags in that script?
[21:14] <chombium> QUESTION: Can the the tags be read/loaded from some global launchpad tag set?
[21:15] <chombium> if there is any
[21:15] <bdmurray> chombium: I haven't looked at that.  We do have https://wiki.ubuntu.com/Bugs/Tags, however that list is quite long.
[21:16] <bdmurray> One thing we'd like to do with this script is have the tags be package specific, so if you were looking at an openoffice bug it would show openoffice tags.
[21:17] <chombium> that would be great
[21:17] <bdmurray> Okay, I'll look at that again
[21:17] <bdmurray> < stefanlsd> QUESTION: What would be the best way to watch bzr  for updates to the scripts?
[21:18] <bdmurray> stefanlsd: It is possible to subscribe to the master branch https://code.launchpad.net/~gm-dev-launchpad/launchpad-gm-scripts/master.
[21:18] <bdmurray> So you'd get e-mail announcements when something is committed.
[21:18] <bdmurray> Additionally, I also try to blog about new scripts.
[21:19] <bdmurray> Moving on we have one of the first greasemonkey scripts in the project was lp_karma_suffix by Kees Cook.
[21:19] <bdmurray> With this script enabled three things are appened to a Launchpad user's name in various places.  1) Their launchpad id 2) Their current value of their karma and 3) The icons of select teams of which they are a member.
[21:20] <bdmurray> This infomration is appended to the reporter, assignee and commenters.
[21:20] <bdmurray> in a bug report.
[21:20] <bdmurray> It is particularly useful when viewing a bug report with lots of comments as guide to distinguish specific comments.
[21:21] <bdmurray>  You can see what it looks like at http://people.ubuntu.com/~brian/greasemonkey/screenshots/lp_karma_suffix.png.
[21:21] <bdmurray> In case you aren't intimately familiar with the team icons you can find out the team name by mousing over the icon.
[21:22] <bdmurray> Looking at the screenshot you'll notice Sebastien Bacher is a member of quite a few teams including ubuntu-dev.
[21:22] <bdmurray> This script is also modifiable and you can easily change which team's icons appear.
[21:22] <bdmurray> Another script that modifies bug comments is lp_reporter_comments written by me.
[21:23] <bdmurray> This script changes the heading of a comment to a light grey color if it is from the bug's reporter.
[21:23] <bdmurray> I also find this quite useful when looking at bug reports with lots of comments.
[21:23] <bdmurray> Screenshot - http://people.ubuntu.com/~brian/greasemonkey/screenshots/lp_reporter_comments.png.
[21:23] <bdmurray> Notice how David's comments have a grey header and mine is the standard color.
[21:24] <bdmurray> It's quite easy to change the color in that too if you want something more obvious.  I went with subtle for the generic script.
[21:24] <bdmurray> A script I think you'll find useful as a developer or potential developer is the lp_patches script which I also wrote.
[21:25] <bdmurray> This script checks every attachment of a bug report to see whether it is flagged as an attachment.
[21:25] <bdmurray> Without this script you'd have to click on the "edit" link next to an attachment and look to see if the "This is attachment is a patch" is checked.
[21:25] <bdmurray> This script will do that for you and modify the icon next to the attachment, normally a green down arrow, to a star.
[21:25] <bdmurray> A screenshot of this change is at http://people.ubuntu.com/~brian/greasemonkey/screenshots/lp_patches.png.
[21:26] <bdmurray> You can see both in the first comment and the attachments portlet on the right hand side that add_assignment_counting.diff is flagged as patch.
[21:26] <bdmurray> because it has the star icon.
[21:27] <bdmurray> Occasionally, people will mark attachments as patches when they are not.
[21:27] <bdmurray> If you find one of these please help by clicking the "edit" hyperlink next to the attachment and unset the flag.
[21:28] <bdmurray> Quite a few people and workflows rely on Launchpad's ability to search for patches and these false positives are disruptive.
[21:28] <bdmurray> < stefanlsd> QUESTION: I love alot of this functionality - but  shouldnt some of it be offered by LP? Does LP plan  on using some of these ideas?
[21:29] <bdmurray> Yes, some of these scripts have bug reports about Launchpad associated with them - for example lp_karma_suffix.
[21:30] <bdmurray> However, it is hard to determine which teams to display and in which context. We, the launchpad-gm-scripts developers, just made an arbitrary decision based off what was useful to us.
[21:31] <bdmurray> Some things like lp_reporter_comments haven't been submitted as bugs about Launchpad but probably should be.
[21:31] <bdmurray> The launchpad-gm-scripts can be a useful testing ground for some of these features and a way to gauge interest in them.
[21:32] <bdmurray> If there is a particular script you feel should be implemented in Launchpad please ping me and as I might know if there is already a bug about it.
[21:33] <bdmurray> Back to the scripts
[21:33] <bdmurray> The first greasemonkey script I'm aware of is lp_stockreplies originally written by Tollef Fog Heen.
[21:33] <bdmurray> The one in the current branch is Kees's and it  provides a system for storing standard responses and actions to bug reports and reusing those responses.
[21:34] <bdmurray> You can add as many responses as you want (I think) and by clicking on a pseudo-url have the comment field prefilled, and modify the bug's status, importance, assignment or package.
[21:34] <bdmurray> You can see what it looks like at http://people.ubuntu.com/~brian/greasemonkey/screenshots/lp_stockreplies.png.
[21:34] <bdmurray> This information is presented to you when you click on the downward cheveron next to a bug's package, status, importance or assignment.
[21:35] <bdmurray> If the bugs you deal with have some patterns to them (where certain actions are repeated) I can't recommend this enough - it is a phenomenal time saver.
[21:36] <bdmurray> Iif you look at all the Ubuntu bug reports (https://bugs.launchpad.net/ubuntu/) quite a lot have been used at one point in time or another by very few bugs.
[21:36] <bdmurray> Subsequently, the "Tags portlet" on the right hand side may not be that useful.  I have good news though!
[21:36] <bdmurray> Markus wrote another greasemonkey script that sorts the list by quantity of appearances and limits the number of tags that appear in the portlet.
[21:37] <bdmurray> Again, this is configurable by directly editing the script and reinstalling it.
[21:37] <bdmurray> A screen shot of what the "Tags portlet" looks like with the script enabled is at http://people.ubuntu.com/~brian/greasemonkey/screenshots/lp_hide_tags.png.
[21:37] <bdmurray> You can see the tags applet near my cursor.
[21:38] <bdmurray> With it enabled it is much easier to discover that 200! bugs are tagged likely-dup.
[21:39] <bdmurray> We even have a script that was contributed by a Launchpad developer (Gavin Panella) - lp_highlight_me.
[21:39] <bdmurray>  This script helps you identify milestones that are assigned to you for a project which is quite useful when you have a project, like Ubuntu, with a lot of bugs milestoned.
[21:39] <bdmurray> Screenshot - http://people.ubuntu.com/~brian/greasemonkey/screenshots/lp_highlight_me.png.
[21:40] <bdmurray> Okay, that covers the majority of the scripts in the launchpad-gm-scripts project.  Are there any questions?
[21:41] <bdmurray> In addition to subscribing to the bzr branch - I'll also try and use Launchpad's announcement feature, https://launchpad.net/launchpad-gm-scripts/+announcements, to talk about new scripts or features.
[21:41] <bdmurray> If you have any bugs with these scripts we use Launchpad as our bug tracker so please submit a bug via https://bugs.launchpad.net/launchpad-gm-scripts/+filebug.
[21:41] <bdmurray> Also feel free to submit a bug if you have an idea of a new greasemonkey script that'd be useful.
[21:44] <bdmurray> QUESTION: How do i add paragraphs to the  stock-replies-script? Escape-Sequences don't seem to  work.
[21:44] <bdmurray> from Ampelbein
[21:44] <bdmurray> Uh, well you caught me!  I don't actually use that one but will find out for you.
[21:45] <bdmurray> You might try '\n' though
[21:46] <bdmurray> So I also work on python-launchpad-bugs.
[21:46] <bdmurray> python-launchpad-bugs is a collection of classes for reading and modifying bug reports in Launchpad, it predates the Launchpad API so currently utilizes screenscraping and can be somewhat fragile.
[21:47] <bdmurray> However, it has a large user base is quickly updated to deal with changes.
[21:47] <bdmurray> py-lp-b provides some features that don't currently exist in Launchpad.
[21:47] <bdmurray> The project is hosted on Launchpad, https://launchpad.net/python-launchpad-bugs/, and its code is availabe via a bzr tree and it is packaged for Ubuntu.  There isn't enough time to cover everything you can do with it but I did want to share a couple of features.
[21:48] <bdmurray> I was on holiday the past four days and have a lot of e-mail to deal with, but let's say I'm interested in which xserver-xorg-video-ati bugs were recently set to a status of Confirmed or Triaged.
[21:48] <bdmurray> There happens to be a script in the examples directory of python-launchpad-bugs that searches for package bugs confirmed since a specific date.
[21:49] <bdmurray> Executing it via 'python dateconfirmed_filter.py xserver-xorg-video-ati 2008-08-28' I find out that bug 261929 was confirmed while I was away.
[21:49] <bdmurray> There is also a script for filtering on date triaged.
[21:49] <bdmurray> I think these are both quite handy as Launchpad doesn't provide a way of searching by date yet.
[21:50] <chombium> really handy indeed
[21:51] <chombium> QUESTION: when can we expect this functionality to be implemented in LP?
[21:52] <bdmurray> With python-launchpad-bugs you can do a phenomenal number things including filtering on bugs and modifying bugs quickly and easily.  We've recently done some calls for testing via py-lp-b and commented on large quantities of bugs.
[21:52] <bdmurray> chombium: The Launchpad team is actively developing there list of goals for 3.0 and I'm not certain where date searching fits in exactly.
[21:53] <bdmurray> However, I do belive it is on the list.
[21:53] <bdmurray> Another project for hacking Launchpad is bughelper.
[21:53] <bdmurray> Bughelper  uses python-launchpad-bugs and provides many other types of searches.
[21:53] <bdmurray> Using 'bugnumbers -p python-launchpad-bugs --branch --parsemode=html' I can find the bug numbers of the py-lp-b bug reports that have a branch attached to them, which can be quite handy.
[21:54] <bdmurray> For easily identifying bugs to fix and merges to make.
[21:55] <bdmurray> I'm running short on time though...
[21:55] <bdmurray> This is really just a small sampling of what you can do with bughelper and python-launchpad-bugs though and you can find out from the logs of the last class Markus and I gave on it at https://wiki.ubuntu.com/MeetingLogs/devweek0802/Bughelper.
[21:56] <bdmurray> I've covered some ways that Launchpad is currently being hacked and I hope that you find some of these hacks useful in your day to day usage of Launchpad.
[21:56] <bdmurray> Are there any more questions?
[21:58] <bdmurray> Well, thank you everyone for coming and happy hacking.
[21:58] <thekorn_> thanks brian
[21:59] <mok0> thanks!!
[21:59] <bobbo> thanks bdmurray
[21:59] <chombium> thanks brian, very useful tips
[22:32] <Markopotamus> Hi peeps. Where'd be a suitable place to find help with a screen resolution problem I'm having in Xubuntu?
[22:46] <Ampelbein> Markopotamus: if its a bug: #ubuntu-x, otherwise #xubuntu