Skip to main content

a silhouette of a person's head and shoulders, used as a default avatar

GSoC Concluded


This week Google Summer of Code concluded. It was great learning experience working under openSUSE and getting to know people here especially my mentor Michal Hrusecky, whose brilliance helped me sail through GSoC. But unlike GSoC, the Karma plugin still has a long route to travel before it approaches completion. I have chalked out the following things to work upon in the coming weeks.

  1. Talk to the artwork team and improve upon the badges and come up with cooler and more creative ones. ;)
  2. Karma user rank Calculation does not fare well with current elgg and PHP version, so find out a better way to calculate ranks.
  3. Karma OBS implementation is not very clean. Run some tests to improve it. Also it takes a whole lot of time to complete searching for packages that have been updated latest, so, find out a better plan.
  4. The twitter implementation is not able to reward protected users on Twitter, try to fix that.
  5. Work on allowing people to iframe their karma stats on their blogs like on Ohloh suggested by Michal.

Till then you can review Karma on Connect and let me know how you feel about it. You can also find the documentation here.

the avatar of Agustin Benito Bethencourt

Last months

Last four months have gone fast, really fast:
  • Akademy-es in Zaragoza
  • Flying to Berling to work on KDE eV economic report and LinuxTag
  • Moving to Nuremebrg
  • Begin to work as openSUSE Team Lead at SUSE
  • Prepare my Akademy keynote and my talk about KDE Connect
  • Develop and present the economic report during KDE eV AGM plus Board elections
  • Complete the administrative work derived from relocation
  • Flying to GUADEC
  • Looking for a flat and moving.

and working, of course. All of them time consuming, but specially, vital energy consuming. So this August I've been trying to cool down a little and go back to routine, now that I have my flat (how important is this step, right?).

Meanwhile, at SUSE.....

the openSUSE Release team, together with the community, have managed to release 12.2 RC2 on time. This could be no news for openSUSE users and supporters. But for us means that we are delivering even tough we are in a transition phase, and despite the fact that we are reducing the pressure over the Release Team instead of increasing it. Delivering on time is always a good sign.

12.2 RC2 is usable so, if you are a developer or an openSUSE power user, consider installing it and giving us feedback. No major bugs should be expected but your reports are very valuable to us. I already have it in my laptop and, except for little details, it works as expected. If you prefer to wait until September 5th, you will be able to install the fresh 12.2. openSUSE Team at SUSE is finishing these days the last few tasks, specially related with generating the Gold Master and creating marketing material.

This month of August openSUSE Team is also putting energy into the openSUSE Conference organization. As you probably know, this is not a normal event. We host four events in one
  • Future Media
  • openSUSE Conference
  • Gentoo Conference
  • Linux Days

so there is a lot to do, as you can imagine. Organizing Free Software events is something that follows me in every job I take, no matter where that is. I'm kind of getting used to it. Don't know if that is a good sign though.

openSUSE community in America has an important milestone in September at openSUSE Summit, the community conference organized right after the SUSE Conference in Orlando, Florida, USA. So if you live in South, Central or North America and like openSUSE, don't miss it. More than 50 people have registered already so it looks like is going to be a good opportunity to give a push to our community in North America.

So September and October are going to be busy months for me and the Team.

the avatar of Andres Silva

openSUSE Release and openSUSE Summit

Once again our team meets for another release of our distribution of choice, openSUSE 12.2. As part of the artwork team, we focused on this release on going back to the strong greens that identify our distribution. We also added a few wallpapers with images of chameleons so that our mascot would be part of our distribution again.
On the subject of chameleons, I have been pondering recently about the variety of designs that can come from this reptile. It is one that changes colors to adapt to its environment, it also has a tongue that extends sometimes longer than its own body and it lives in trees eating insects. I own a chameleon myself and as I have lived with it, I have realized that it is a great design inspiration. Recently also, I found these images from Igor Siwanowics













These images are beautiful. Igor really knows how to get people closer to these chameleons, which are so small. I think they go along very well with our mascot and as part of a collection of wallpapers for openSUSE. That is why I contacted Igor to see if he would donate a chameleon image to our project. We are still working on something for us, but I am positive that he will be happy to contribute to our project. Stay tuned.

12.2 is now ad portas and we are working hard to finish working with the marketing materials.

openSUSE Summit 2012 is also coming up soon. We are all very excited in the US to have a mini openSUSE conference. I have now confirmed my participation to the gathering and also my presentation on openSUSE's contributions. I intend to gather more possible contributors to our artwork team. We are still lacking good coders that can make some of our ideas transpire from within the distribution. We want to have a stronger influence than simply selecting wallpapers. Stronger branding and stronger image for our users and new users. We have asked some of our community members to share their ideas about social apps on the desktop and also how they use their desktop environment. If you know someone who can code C++, please let us know. We will be eager to talk to him/her.

Thank you for reading.

Anditosan

the avatar of Vincent Untz

Month of birthdays

August is a busy month for birthdays!

This all starts with openSUSE, on August 9th. Seven years ago, the development of SUSE Linux opened up and openSUSE was born. The openSUSE project is actually pretty young, compared to the other projects delivering distributions. But it has 20-years old roots... I joined the project in February 2008, and I've seen the community grow and become more and more involved and, more importantly to me, in charge.

openSUSE is seven years old!

On August 15th, we celebrate the birthday of the GNOME project. Miguel announced the GNU Network Object Model Environment Desktop project fifteen years ago. I'm happy the letters in GNOME don't stand for anything anymore ;-) It's been a long ride, with the great GNOME 1.0 release in 1999 (let's be honest, it was crappy by today's standards — I tried GNOME back then, and quickly gave up), the GNOME 2.0 release in 2002 (I joined the project around that time, I still remember the excitement in the community) and the recent GNOME 3.0 release in 2011 (I can't believe I wrote the 3.0 plan more than three years ago already...). Even though I'm less involved nowadays, GNOME is my family.

GNOME is fifteen years old!

And finally, on August 16th, Debian reaches a new milestone. In 1993, the imminent release of the first version was announced, which makes the project nineteen years old now. I've always loved Debian, and I've long wondered whether I should become a Debian Developer, but I never made the jump as I chose to focus on upstream activities instead for my free time. And then I joined openSUSE. But it's never too late, so who knows, maybe one day...

Debian is nineteen years old!

I use what those three projects deliver daily, literally. Many thanks to everyone who made and still make this possible!

a silhouette of a person's head and shoulders, used as a default avatar

Karma weekly report and minor fixes.


This is my report for the last week, developing the Karma plugin for Connect.

There are 2 things I have added to karma in the last week. First off, Karma widget shows who all gave away kudos to you. For each kudo, there is one extra point added to your score. Also, each user can give away only a limited amount of kudos in a day, which is maximum of, 2 or whatever multiple of 500 your total score is.


Next, Karma widget also shows user rank. This is the rank of a user based on total karma score attained. This rank is purely score based irrespective of whether karma is developer or marketing type. I have kept the Rank calculation also a part of the cron script, so that means ranks are calculated every 5  minutes.


Also, during this time Marguerite Su, chinese wiki admin pointed out that wiki score calculated during karma score updation didn't include localed wikis. So I corrected the wiki and planet openSUSE part to include localed wiki and global posts.


I also fixed some minor bugs with wiki score calculation and kudos calculation.

I have started off with the documentation, though not much has been done, I  will now concentrate solely on that.
a silhouette of a person's head and shoulders, used as a default avatar

osc2: syntax update

Hi,

as I already I wrote in an earlier post the last week I worked on implementing osc2’s “request”
command. In order to create a new submit request the user has to run
osc request create --submit api://src_project/src_package api://tgt_project
What’s still needed is a way to specify a revision of the src_package. It isn’t possible
to introduce a “–revision ” option because it’s possible to specify multiple submit
actions for a request (so we can’t distinguish to which –submit action a revision
belongs to).
Finally I implemented darix’ cool idea: simply use a svn-like syntax:
osc request create --submit api://src_project/src_package@rev api://tgt_project

Marcus

a silhouette of a person's head and shoulders, used as a default avatar

[gsoc] osc2 client – summary of week 12

Hi,

here’s a small summary of the 12th (coding) week. The last week I continued
the work on the new user interface. As a result the “request” command is more
or less implemented. Yesterday I pushed the current code and it’s also possible
to play around with it:

  • checkout the code [1]
  • cd osc2/osc/cli
  • export PYTHONPATH=/path/to/osc2
  • python cli.py -h (for more information)

Example:
In order to list a request it is sufficient to run
“python cli.py request api://your_project” (Note: all https requests are
_insecure_ – so far the certificate etc. is not checked).

Some implementation details:
In my last mail/post I described how a new (sub)command can be specified
so I’ll leave out the details here.
In the following I’ll shortly explain how the arguments specified by the
user at the commandline are passed to a function (which does the actual
work – like listing the requests).


class RequestList(CommandDescription, Request):
    """
    ...
    """
    cmd = 'list'
    args = 'api://project?/package?'
    opt_user = Option('U', 'user', 'list only requests for USER')
    func = call(request.list)

As we can see the project and package parameters are optional. After
the parsing process a so called “info” object is returned which encapsulates
the specified arguments. Assume the user runs “request list api://test_prj”
then the info object has the following attributes:


    info.apiurl = the default apiurl
    info.project = 'test_prj'
    info.package = None

The question is how can we pass this data to the request.list function?
A simple (and naive) approach would be to simply pass the “info” object
to the request.list function that is “list” has the following signature
“def list(info)”. As a consequence inside the method we always have to
use “info.project”, “info.package” etc. which is a bit awkward – at least
for parameters which are quite frequently used in the method definition.

So it would be nice if there’s a way to pass frequently used parameters
directly to the method (that is they’re declared as formal parameters
in the method definition) and infrequently used parameters can still be
accessed via the info object. Exactly like this it is currently
implementend in osc2.

So the following signatures would be correct for our example:


    def list(project, package, info)
    def list(project, package, user)
    def list(project, package, user, info)
    def list(project, info)
    def list(info, project)
    def list(project)  # using the info object is not mandatory
    def list()  # quite useless...
    ...

Invalid signatures:


    def list(prj, pkg, info)
    def list(foo, info)
    ...

So it is up to the developer how to define the signature of the
request.list function – it is not completely dictated by osc:)

Marcus

[1] https://github.com/openSUSE/osc2

a silhouette of a person's head and shoulders, used as a default avatar

[gsoc] osc2 client – summary of week 11

Hi,

here’s a small summary of the 11th (coding) week. Last week I worked on
implementing the new commandline interface. While doing so I faced several
“issues”:

  • How to combine argparse and our oscargs url-like syntax?
    Basically we have to run our oscargs parser on the result which is
    returned by argparse.ArgumentParser’s parse_args method. The problem is
    that both parsers have a different “syntax” that is using a naive approach
    will lead to some redundancies (we specify the ui twice: one time for
    argparse and one time for oscargs). In order to avoid this we need some
    “interface” to which the oscargs syntax is passed and which configures
    the argparse parser accordingly.
  • How to support custom commands?
    We also have to provide an “easy” way to specify custom commands.
    Additionally it might be handy if existing commands can be enhanced
    (either by adding additional options etc. or by adding a new subcommand
    etc.). The best would be if the user simply drop his/her plugins in a
    specific directory and osc will scan this directory and use the new
    plugins/commands.
  • Specifying the ui programmatically is somehow confusing/cluttered. It would
    be much better if the ui can be specified in a more “declarative” way
    without the syntactic “overhead” (well that’s a bit exaggerated) which
    is needed to configure the parser. Additionally it would be nice to have
    a convenient way to specify a multi line description for a command
    (hardcoding the str into the source makes the code “harder” to read).

Finally I ended up with a small DSL which can be used to specify the
ui in a “declarative” way (the initial idea + syntax is taken from the
django framework (see [1])).

Example:
Assume we want to implement a request command which consists (for the
sake of simplicity) of 2 subcommands “list” and “accept”. This can be
specified like the following:


# file: osc/cli/request/ui.py

class Request(CommandDescription, OscCommand):
     """Show and modify requests."""
     cmd = 'request'

class RequestList(CommandDescription, Request):
     """List requests.

     By default open requests for a specific project or package will be
     listed.

     Examples:
     osc request list api://
     osc request list api://project
     osc request list api://project/package

     """
     cmd = 'list'
     args = 'api://project?/package?'
     opt_user = Option('U', 'user', 'list only requests for USER')
     opt_group = Option('G', 'group', 'list only requests for GROUP')
     opt_state = Option('s', 'state', 'list only requests with state STATE',
                        choices=['new', 'review', 'accepted', 'revoked',
                        'declined', 'superseded'], action='append')
     func = request_list

class RequestAccept(CommandDescription, Request):
     """Accept a specific request.

     ...

     """
     cmd = 'accept'
     args = 'api://reqid'
     func = request_accept

In order to add the request command it is sufficient to add an

     import osc.cli.request.ui

statement to the main cli module. This produces the following output:

marcus@linux:~/osc2/osc/cli> python cli.py request -h
usage: cli.py request [-h] {list,accept} ...

Show and modify requests.

positional arguments:
  {list,accept}
    list         List requests.
    accept       Accept a specific request.

optional arguments:
  -h, --help     show this help message and exit
marcus@linux:~/osc2/osc/cli>


and

marcus@linux:~/osc2/osc/cli> python cli.py request list -h
usage: cli.py request list [-h]
                           [-s {new,review,accepted,revoked,declined,superseded}]
                           [-G GROUP] [-U USER]
                           api://project?/package?

List requests.

    By default open requests for a specific project or package will be
    listed.

    Examples:
    osc request list api://
    osc request list api://project
    osc request list api://project/package

positional arguments:
  api://project?/package?

optional arguments:
  -h, --help            show this help message and exit
  -s {new,review,accepted,revoked,declined,superseded}, --state {new,review,accepted,revoked,declined,superseded}
                        list only requests with state STATE
  -G GROUP, --group GROUP
                        list only requests for GROUP
  -U USER, --user USER  list only requests for USER
marcus@linux:~/osc2/osc/cli>

How does it work?
First of all each class which defines a command or subcommand has to inherit
from class “CommandDescription”. If a subcommand is to be defined it also
has to inherit from the “parent” command (that is in our example “RequestList”
and “RequestAccept” inherit from class “Request” (which in turn inherits from
class “OscCommand” (from this class all toplevel commands have to inherit))).
In short: with the help of the inheritance hierarchy it is possible to define
a command <- subcommand hierarchy.

Note: actually the classes "RequestList" and "RequestAccept" only inherit
from "CommandDescription". The "parent" command base class is only needed
for a "marking" purpose (it is filtered out with the help of a metaclass
when the concrete class is "constructed" – I'll leave out the details for
now and may write a dedicated blogpost about it).

Now the remaining task is to define and implement the commands (note: we will
definitely not finish the project on the "suggested pencils down" date and
use the week until the "firm pencils down" date for coding…).

Marcus

[1] https://docs.djangoproject.com/en/1.4/topics/db/models

Here’s a small example how to modify an existing command:

# plugins/myrequestaccept.py
from osc.cli.description import Option
import osc.cli.request.ui

class MyRequestAccept(osc.cli.request.ui.RequestAccept):
     # add a new option
     opt_foo = Option('f', 'foo', help='foo option')

This leads to

marcus@linux:~/osc2/osc/cli> python cli.py request accept -h
usage: cli.py request accept [-h] [-f FOO] api://reqid

positional arguments:
  api://reqid

optional arguments:
  -h, --help         show this help message and exit
  -f FOO, --foo FOO  foo option
marcus@linux:~/osc2/osc/cli>

the avatar of Carlos Gonçalves

New domain and migrating data between Google Apps

Short version


  • If you can't reach me at my @cgoncalves.info, use @cgoncalves.pt from now on.
  • Google Apps doesn't allow one to switch a primary domain with an alias. Had to migrate all data by myself...


A not so short version

Holding the cgoncalves.info domain since 2007, I had it associated to a free Google Apps account ever since.
Recently FCCN (Fundação para a Computação Científica Nacional) decided well it was time to liberalize the .PT TLD to everyone and not just to companies or trademarked brands. Now for ~17€/year any individual can get a .PT domain, no bureaucracy in the way. Hurray!

I did take the opportunity and acquired the cgoncalves.pt domain. It's simple, elegant and somewhat represents pride of being a Portuguese citizen. This domain's just what was pending to fulfill, as of now, the digital image of myself.

With this new domain I could add it to my existing Google Apps account and make it an alias of cgoncalves.info. Although as I'm so existed and convinced I'll keep this new domain till my death, I gave a thought (2 seconds, if much) and concluded I should settle with the domain as the primary one instead of the rather deprecated cgoncalves.info. "So what?" you ask. Well... Google doesn't allow their Google Apps users to switch a primary domain with an alias! Best chance to accomplish this is to create a new Google Apps account associated with the .PT domain and migrate all data from one account to the other, including emails, filters, contacts, calendars, feeds, etc. Moving contacts, calendars and feeds is a trivial action but hundred of thousands of emails from years?! No fun...

Once migration completed, delete the cgoncalves.info Google Apps account and add that domain to the new account as alias was the goal to achieve.

Migrating emails

I started migrating emails between the two Google Apps accounts using the POP3 fetcher GMail provides. Yes, it take ages and only fetches up to 200 emails at a time, but that was the faster way I know. The fetcher automatically retrieves for messages at different rates from accounts and depends on previous mail fetch attempts (the less mail retrieved, the less frequency it will check for new mail). Frustratedly even with thousands of messages yet to get, the intervals were set longer and longer (sometimes to two hours!)... Enabling "Refresh POP accounts" lab ("Fetch messages from your POP accounts on demand by using the refresh link on to of the inbox") would cut the time between fetches but was no usable solution as it required human interaction by clicking on the gear icon now and then.

I also tried this script and threw one dollar (minimum donation amount required) to let me unlock the fixed 8 minutes interval and empower me to set it to a higher rate (down to 3 minutes). It was working like a charm and the migration process was flying fairly decently. BUT NO! OH NO! GMail stopped successfully retrieving messages and started emailing me an unnumbered "Message left on server" messages. Perhaps the daily quota has been reached, or not as it kept that way the day after. This POP3-me thing was running for now a full week and I still had many messages left to migrate. I was doomed!

With the POP3 process discarded there was just one option left and that I was battling to avoid: transfer from IMAP. Don't get me wrong, I love and use IMAP in all my accounts. The side of the coin is I'd have to perform the migration on my end and reached the first 500 messages transferred, only 1 message per second is synced. Imapsync was just the application suited to do the job. It detects duplicated emails and all, great! I installed it on my VPS (so I can't put my laptop to sleep at will) and ran it as follows:

#!/bin/bash
imapsync \
--host1 imap.gmail.com \
--user1 account@old-domain.com \
--passfile1 ./passfile1 \
--ssl1 \
--host2 imap.gmail.com \
--user2 account@new-domain.com \
--passfile2 ./passfile2 \
--ssl2 \
--authmech1 LOGIN \
--authmech2 LOGIN \
--useheader 'Message-Id' \
--useheader 'X-Gmail-Received'

File passfile1 and passfile2 contains the respective email accounts passwords (plain text). And voilá! It might take several hours/days but I didn't know (and still don't) no better solution. And remember, POP3 mail fetcher doesn't copy sent mail, but imapsync does! Win!

Back to Google Apps drama

At last with data migrated I let things stabilize for a couple of days before taking any further action. Next step was ensuring I did not depend anymore on my @cgoncalves.info Google Apps account: check! Logged into the Google Apps administration panel of the new domain and tried to add cgoncalves.info as an alias. It failed with something like "The domain is currently associated to another account". That was right, I still had to purge the former account before proceeding: done! Retried once again hoping I got lucky but no... "This domain name has already been used as an alias or domain". It seems I will have to wait up to seven days before I can add the .INFO domain as an alias.

Conclusion

Update my contact record on your address book and replace everything ending with cgoncalves.info to cgoncalves.pt. I promise I'll keep using this domain for decades, unless someone steps in with a bag full of money and buys me off to concede the ownership of the domain. Starting bid is 1000€. I mean it! :-D

a silhouette of a person's head and shoulders, used as a default avatar

Karma statistics available through Connect's API


In my previous post, I mentioned about allowing karma statistics to be available through Connect's API.  So, that is done. The method karma.details which requires a GET call, passing the username of the user, called only after authenticating with the api, returns user score in each respect, i.e score on fixinng bugs, making posts, tweeting, build service commits and wiki edits. It also returns user badge and the last karma update time of the user.


I plan to deploy the second version of the Karma plugin as soon as my mentor Michal Hrusecky, who is away currently, gets back. Also, if you have any ideas to give across or want to comment on how you liked or disliked the karma plugin, do leave a comment, I will work on it and improve it in the second version itself.


Next, I am starting off with the documentation. Hope to finish this asap, not much time left for the pencils down date.