Subscribe: Martin Vidner
Added By: Feedage Forager Feedage Grade B rated
Language: English
android  app  build  code  dbus  device  don  error  fcoe  file  interface  network  opensuse  part  ruby dbus  ruby  usb 
Rate this Feed
Rate this feedRate this feedRate this feedRate this feedRate this feed
Rate this feed 1 starRate this feed 2 starRate this feed 3 starRate this feed 4 starRate this feed 5 star

Comments (0)

Feed Details and Statistics Feed Statistics
Preview: Martin Vidner

Martin Vidner

openSUSE. Linux. computers.

Updated: 2017-10-27T12:13:54.243+02:00


Fibre Channel over Ethernet: Basics of FCoE in SUSE Linux


I had to apply a fix for a FCoE module in YaST, and I had no idea.

After learning a couple of things I still only have a vague idea, but I am writing it down to help my future self, my team mates, and perhaps you too.

FCoE stands for "Fibre channel over Ethernet". Apparently if you have some disk on a Fibre Channel SAN (storage area network), you can use FCoE to extend the reachability of that disk to the ethernet parts of your network. It still needs to be a kind of special ethernet (10Gb, with special network cards) but that seems less special than FC hardware.

For a better overview, including a diagram, see: SUSE Linux Enterprise Server Documentation / Storage Administration Guide / Fibre Channel Storage over Ethernet Networks: FCoE.

FCoE typically uses a virtual LAN, (VLAN, IEEE 802.1Q).

There needs to be a Fibre Channel Forwarder (FCF) between the FC and ethernet parts. It has a MAC address. Note a difference from iSCSI which works on the IP level, one layer up.

YaST helps you set things up. The rest of this article could be useful if you cannot use YaST for some reason.

SLES uses open-fcoe. On SLES-12 the package is called fcoe-utils.

fipvlan (stands for FCoE Initialization Protocol VLAN discovery) shows FCFs and which interface and VLAN they are reachable with:

# fipvlan --auto
Fibre Channel Forwarders Discovered
interface | VLAN | FCF MAC
eth1 | 500 | 00:0d:ec:b3:ca:00

It can also --create the VLAN interface and --start up the FCoE connection, but it won't make that permanent for the next boot

To make it permanent you need to

  1. enable the FCoE service (SLE11:/etc/init.d/boot.fcoe, SLE12: fcoe.service). Under the hood it uses two programs: fcoemon is the daemon, fcoeadm is a front end (fcoeadm -p shows the pid of fcoemon).
  2. write a config file, /etc/fcoe/cfg-*IFACE*, where IFACE is
    • eth1.500 if AUTO_VLAN is no; in this case, you also need /etc/sysconfig/network/ifcfg-eth1.500, see man ifcfg-vlan.
    • eth1 if AUTO_VLAN is yes; in this case, the interface is named eth1.500-fcoe. Note the unusual -fcoe suffix!

With the config files in place, rcfcoe start (and ifup eth1.500, unless AUTO_VLAN). Then you should see the disk devices:

# fcoeadm --target
Interface: eth1.500
Roles: FCP Target
Node Name: 0x50060160BB600160
Port Name: 0x500601663B600160
Target ID: 0
MaxFrameSize: 2048
OS Device Name: rport-2:0-2
FC-ID (Port ID): 0x710D00
State: Online

LUN ID Device Name Capacity Block Size Description
------ ----------- ---------- ---------- ----------------------------
0 /dev/sdb 16.00 GiB 512 DGC VRAID (rev 0430)

People who actually know their way around FCoE will note that I have omitted many important details. Let me know in the comments whether I should come back to this and expand on some topics.


Getting Started in Android Development: Part 3: Reducing Bloat


So far we have seen Part 1: Building the First App, and Part 2: Publishing the first App.That Feeling When you build a brilliant piece of software and the users are ripping it from your fingers to the sound of raving reviews:dad: I'm home! Have you seen my first app I've e-mailed you about?kid: Hi. So?? Do you like it? Have you given it any stars?kid: Just one. It can do almost nothing and it takes up too much space.And the kid is right. App description: Press a button and get a random number between 1 and 6. App size: 6MB. Six. Megabytes.In this post we will reduce that over a hundred times to 44KB.Thanks to SUSE, my employer, for sponsoring a company-wide Hack Week which this project was a part of!Debug or Release Build?I did not manage to make a release build in the Android Studio IDE. So I tried from the command line. (J. Reidinger has pointed out that I should read Configure Build Variants.)$ sudo zypper install java-1_8_0-openjdk-devel # to provide javac$ ./gradlew assemble[downloads some deps at first... 280MB][lots of output for normal build too]$ (cd app/build/outputs/apk; stat -c "%'9s %n" *.apk)1,443,734 app-debug.apk1,337,890 app-release-unsigned.apkApparently my hopes that a release build would be significantly smaller were unfounded. The APK has 1.5MB and takes up 6MB when installed.Shrink Your Code and ResourcesFirst I searched the web for "minify android app" and eventually arrived at Shrink Your Code and Resources in the IDE manual.Using minifyEnabled true in build.gradle shrunk the signed release build from 1,347,038 bytes to 786,674, which results in 2.39MB installed size. (Did not find a way to install this build from the IDE, used adb install -r ./app/app-release.apk.)Changing proguardFiles from proguard-android.txt to proguard-android-optimize.txt slightly shrinks the APK to 771,406 bytes.Adding shrinkResources true: 745,490 bytes, 2.21MB installed.Code Bloat: Activity Base ClassIt seems that now the main reason for bloat is the sheer amount of included code: 5 methods of mine vs 4823(!) methods from the android.* classes.Changed the base class of the main activity from to but then adb install says "Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]". adb uninstall net.vidner.justrollonedie solved it. But I wonder what would happen if my users on the app store wanted to update. Fortunately I have none :DThe base class change improved the sizes to 661,870 APK, 1.62MB installed.Code Bloat: API VersionI thought a 4x reduction in installed size was good enough, even if still bloated. I decided to fix one more thing before pushing an update to the store: the minimal required Android platform. (In the process of tinkering with a demo OpenGL app I discovered that android-8, supporting my old 2.2 Froyo phone, gets automatically downloaded if I declare it in the app manifest.)So I did, and the side effect was perfect: all boilerplate code was gone and I ended up with a 17,282 byte APK, 44KB (kilobytes!) installed. Still too much for a microcontroller ;-) but good enough for Android.Figuring out how to downgrade my code and layout and styles to still run on the older API seemed tricky at first, but then I simply generated a scratch project for android-9 and copied the differences. Then I changed one style name with the help of the API version filter (see screenshot).Get the App, Get the SourceThe source code for Just Roll One Die is on GitHub under a MIT license. You can try out Just Roll One Die on Google Play.[...]

Getting Started in Android Development: Part 2: Publishing the First App


Here I simply describe what it takes to publish an Android application that I described in the previous part, Building the First App.Thanks to SUSE, my employer, for sponsoring a company-wide Hack Week which this project was a part of!I will only deal with free apps: no cost for the user and no advertisements. I guess it would be easy to slap an advertisement module on it or put a minimal price tag on the app. But then it would be morally wrong for me to keep the profits without giving SUSE a cut, and the organizational and accounting process would quickly turn this into a lawyer's Hack Week. Scratch that.Registering a Publisher Account: $25I started with the instructions at Get Started with Publishing.I could have reused my existing Google account but decided to create a new one. The next step may put you off: a 25 USD registration fee is needed.Then a fair amount of legalese, which I did skim through, and I was rewarded by the knowledge that Google apparently does not like developers to publish web browsers or search engines.Publishing the AppWhen I thought my application was good enough to be published I went to the Developer Console to make a Store Listing.Entered the app name, summary, long description; no surprise there, I had expected that from openSUSE RPM packaging. Then came the innovation: screenshots are required! In fact,Two screenshotsa high-resolution icon (512x512 pixels)a feature graphic (1024x500 px) which appears as the heading of the app listing pageReportedly the new standard way to take a screenshot is Power + Volume Down. But that did not work for my Xperia phone. I had to enable the following setting, after which a Screenshot option appeared in the menu that appears after holding Power.Settings, thenDevice / Buttons, thenPower button / Power menu, thereenable Screenshot ☑.For a moment I feared I would need to hire a designer for the icon, but then I told LibreOffice to write a 6 in a 360pt big font and used that. whew!More form items to fill: App type: Applications (not Games); Category: Entertainment (I guess); Pricing and distribution: Free, All countries, No ads.We do not process any user data so we check a box that we're Not submitting a privacy policy.Now we are at a point in the form where it says that we need to submit a content rating, but it won't let us do it. I think it only allows to rate after the app has been uploaded.Are we ready to upload the app code? Upload APK... bzzzt, wrong! must not upload a debug build. Did not find a way to make a production build in the GUI so used the CLI for a change: ./gradlew assemble... bzzzt, wrong! must not upload an unsigned build.Signing software makes sense. Except the signing mechanism is unfamiliar to me, something involving a Java KeyStore. So I followed the manual: Sign Your App. Ended up with a file in my home directory and needing to enter two passwords each time I build a signed APK. At least no certification authority needed to be involved.Content Rating: Category: Utility, No violence, No sexuality, No offensive language, No controlled substances (illegal drugs), No communication with other users, No sharing of personal information, No sharing of location, No digital goods purchasing, No Nazi symbolism, Not a browser or search engine.Finally all information was there, I hit Publish, and I wondered how long the review process would take. It took about 3 hours on a European Tuesday noon.You can try out Just Roll One Die on Google Play. The source code for Just Roll One Die is on GitHub under a MIT license.NextIn the next part we will deal with software bloat. Because an app that can roll a 6 is justified in taking up 6MB on your kid's tablet, right? Right??[...]

Getting Started in Android Development: Part 1: Building the First App


Getting Started in Android Development: Part 1: Building the First AppDo you know programming and want to start with the Android platform? Just like me! Read on.Thanks to SUSE, my employer, for sponsoring a company-wide Hack Week which this project was a part of!In case you wonder why Android: it is a good balance of work and play. Android is not the coolest toy to play with at the moment, but it is the most versatile device that people are likely to have at hand, especially when traveling. And Android already outnumbers openSUSE and all other OSs in my household.This is a three part series: 1) building an app, 2) publishing it on Google Play, 3) trimming it down. In this part, we'll set up the development environment, follow the official tutorial to build a trivial app, then build a trivial yet useful app of our own.a screenshot of my first appInstalling the SDKI am using openSUSE Leap 42.1 (x86_64). You will notice that I keep tallying the disk space taken. This is because I am a bit short of space on one of my machines, and need to have an idea how much cleanup is needed.Went to Android Studio (2.2.3 for Linux, 438 MiB, unpacks to 785 MiB), followed the instructions, unpacking to /opt (getting /opt/android-studio).Ran /opt/android-studio/bin/ Was greeted by an "Android Studio Setup Wizard": chose a Standard setup. Additional download of 890MB (1412MB unpacked) to ~/Android/Sdk.Got a slightly confusing notice about KVM emulator acceleration. It seems that if you have used KVM before on your machine, the SDK will use it out of the box. But even with acceleration, don't expect the emulator to be fast. If you have a real device, use that."Building Your First App"For the most part I simply followed the tutorial for building, installing, and running a trivial app that asks for a message and then displays it. The documentation feels excellent!The one non-obvious part was choosing which Android version, in other words, which API level, to target. in the Target Android Devices dialog, the preselected option is API 15: Android 4.0.3 (IceCreamSandwich). That is presumably based on the current active device statistics which result in the app being compatible with 97% of devices. The oldest one is API 9: Android 2.3 (Gingerbread), which was a bit disappointing since my older phone from 2010 runs API 8, 2.2 (Froyo). (Don't worry, I eventually solved that in part 3.) Fortunately my newer phone has API 22: Android 5.1.1. Installed the API 22 platform too, to match the phone, about 100MB.Connected my phone with a USB cable, pressed Run, and there it was! Don't worry, a buggy app will just crash and not affect the rest of your phone.Just Roll One DieNow it looked like I knew enough to make a useful app, so I did: Once my family was on a train with a board game table but we had no dice. So my first actual app is Just Roll One Die. A totally simple application that can just roll one ordinary six-faced die. Six faces ought to be enough for anybody. No pictures, just digits.The source code for Just Roll One Die is on GitHub under a MIT license. You can try out Just Roll One Die on Google Play. (The details of how to get an app there are described in Part 2: Publishing the First App.)How about you?I was amazed how easy it was and I can't believe that it took me so long to try this. Wy don't you too give it a try and let me know how you are doing.[...]

Text to Speech with eSpeak and Epos


A humanoid robot should be able to talk. So I looked around for some open source speech synthesis software. width="560" height="315" src="" frameborder="0" allowfullscreen>(The above video does feature a talking robot (and a multilingual dolphin) but that's where similarities with the following content end.)eSpeakHello world:espeak 'Hello, world!'Standard input works too:espeak < ahoj.wavOther systems?The thing that reminded me of epos was this summary written by a small Czech phone operator.Have you tried text-to-speech software? Which one sounds the best?[...]

Jenkins as Code


I saw a couple of talks last week, and learned about several ways of automating Jenkins CI.

The problem being solved is: if you automate your builds and tests, why still click the Jenkins web UI by hand? Script it instead.

Jenkins Job DSL, which is based on Groovy (a JVM language). Another topic was Jenkins Pipeline which helps managing many jobs that depend on each other.

In Test Driven Infrastructure, Yury Tsarevpresents, among many other things, Jenkins Job Builder. JJB takes descriptions written in YAML or JSON and translates them to Jenkins API with Python.


Capturing and Decoding Lego Mindstorms EV3 Bluetooth Communication


The Lego Mindstorms EV3 robots can be controlled with an Android app (Lego Mindstorms Commander) communicating with the brick via Bluetooth. The command protocol is documented by Lego in the EV3 Communication Developer Kit and the commands themselves in the EV3 Firmware Developer Kit (get them from Mindstorms Downloads). I wondered what exactly goes on and I decided to capture the communication and decode it, to learn both about Bluetooth and about the details of the EV3 protocol. I succeeded and made a couple of useful tools along the way: extract the RFCOMM data from a btsnoop HCI logdecode the EV3 command protocol See also the previous post about sending data (EV3 commands) over USB. Outline Enable Android Bluetooth loggingRun the Commander app and exercise the robot a bit Transfer the log to a PCExtract the serial data (RFCOMM) from the Bluetooth dumpDecode the EV3 protocolDisassemble the EV3 instructions 1. Enable Android Bluetooth Logging Open SettingsIn the System section, choose Developers(this needs to be enabled first by tapping Build number 7 times)Enable Bluetooth HCI Log 2. Run the Commander app and exercise the robot a bit 3. Transfer the log to a PC On the phone/tablet: Open SettingsSystem > DevelopersDisable Bluetooth HCI Log Connect to the PC with a USB cable. My older Android phone offered to mount its storage as a USB disk drive, but the newer one no longer has that option, offering MTP instead. I transfered the log file with a KDE tool: $ kioclient cp 'mtp:/Xperia Z3/Interní úložiště/btsnoop_hci.log' . 4. Extract the serial data (RFCOMM) from the Bluetooth dump The tool I made for this is btsnoop-decode.rb. I learned the bare minimum needed about Bluetooth so it is very likely the tool only works for this specific use case. Originally I opened the btsnoop log with Wireshark and guessed my way through the BT protocol layers. In the end the RFCOMM length field was harder than usual to guess and half of my packets were wrong. So I resorted to finding the appropriate part of the Linux kernel source to find out the format. 5+6. Decode the EV3 protocol and dissassemble the EV3 instructions The people of the ev3dev project have already produced a disassembler which we will use in the next step. But that one assumes you start with a program file (RBF). Here we have a log containing not only the usual RBF instructions but also System Commands. I made an ugly hack of the lmsdisasm tool and arrived at a version that disassembles the log produced by the RFCOMM extractor. Play time The above experiments enabled me to put together a little script that can control the robot from a Linux terminal, having it ride around and even speak a custom sound file: lethargic-ministers/[...]

Git: Single Line History


Say we have a robotwith a USB connection and command documentation. The only thing missing is knowing how to send a command over USB. Let's learn the basic concepts needed for that. Installing the Library We'll use the pyusb Python library. On openSUSE we install it from the main RPM repository: sudo zypper install python-usb On other systems we can use the pip tool: pip install --user pyusb Navigating USB Concepts To send a command, we need an Endpoint. To get to the endpoint we need to descend down the hierarchy of DeviceConfiguration InterfaceAlternate settingEndpoint First we import the library. #!/usr/bin/env python2import usb.core The device is identified with a vendor:product pair included in lsusb output. Bus 002 Device 043: ID 0694:0005 Lego Group VENDOR_LEGO = 0x0694PRODUCT_EV3 = 5device = usb.core.find(idVendor=VENDOR_LEGO, idProduct=PRODUCT_EV3) A Device may have multiple Configurations, and only one can be active at a time. Most devices have only one. Supporting multiple Configurations is reportedly useful for offering more/less features when more/less power is available. EV3 has only one configuration. configuration = device.get_active_configuration() A physical Device may have multiple Interfaces active at a time. A typical example is a scanner-printer combo. An Interface may have multiple Alternate Settings. They are kind of like Configurations, but easier to switch. I don't quite understand this, but they say that if you need Isochronous Endpoints (read: audio or video), you must go to a non-primary Alternate Setting. Anyway, EV3 has only one Interface with one Setting. INTERFACE_EV3 = 0SETTING_EV3 = 0interface = configuration[(INTERFACE_EV3, SETTING_EV3)] An Interface will typically have multiple Endpoints. The Endpoint 0 is reserved for control functions by the USB standard so we need to use Endpoint 1 here. The standard distinguishes between input and output endpoints, as well as four transfer types, differing in latency and reliability. The nice thing is that the Python library nicely allows to abstract all that away (unlike cough Ruby cough) and we simply say to write to a non-control Endpoint. ENDPOINT_EV3 = 1endpoint = interface[ENDPOINT_EV3]# make the robot beepcommand = '\x0F\x00\x01\x00\x80\x00\x00\x94\x01\x81\x02\x82\xE8\x03\x82\xE8\x03'endpoint.write(command) Other than Robots? Robots are great fun but unfortunately they do not come bundled with every computer. Do you know of a device that we could use for demonstration purposes? Everyone has a USB keyboard and mouse but I guess the OS will claim them for input and not let you play. What Next PyUSBPyUSB tutorialUSB in a nutshell goes deeper, and is aimed more at firmware developers for the devices, but still is much shorter than the 650 page USB 2.0 specificationEV3 documentation at Mindstorms Downloads The Full Script [...]

Arabic Text Bugfix


Can you spot the difference?

If this rings a bell but you can't quite remember why, here's an English version of the screen, and the spoiler for the puzzle is below it:
Spoiler: The line containing "passwd" is clipped at the (left) end, showing only "المحا" instead of "المحلي۔". This bug got popular in the YaST team because the localization testers dutifully reported every instance of a truncated label so the bug accumulated 22 duplicates. It only happened for the Arabic script which made it a bit more challenging to work with, but luckily I know the script and a few words.

Thanks to Max Lin who pointed me to a problem between the Qt UI library and the HarfBuzz text shaping engine, the problem is now fixed.(image)

YaST in Ruby


As already announced on Factory, yast-devel, and by Lukáš: YaST, the SUSE installation and configuration tool, has been automatically translated from YCP, an in-house custom language, to Ruby. In the past 6 months, we have built a tool to translate 600.000 lines of code developed over the course of 12 years.

My role in the project was mainly shedding light on ancient details of the YCP language and its interpreter. Stop pulling my beard, kids! Also, knowing Bison (the tool used to implement the YCP parser in C++) I designed a part that transfers the comments. Mind you, not only at the function or statement level, but from inside of expressionstoo. Fun!

Thanks to the team, it was great working on the project with you!(image)

ruby-dbus 0.7.0 works with 1.9.2 again


I have made a new release of ruby-dbus, a Ruby language binding for the D-Bus IPC system.
  • Added ASystemBus and ASessionBus, non-singletons useful in tests and threads.
  • Fixed handling of multibyte strings (Issue#8, by Takayuki YAMAGUCHI).
  • Allow reopening of a dbus_interface declaration (Issue#9, by T. YAMAGUCHI).
  • Fixed ruby-1.9.2 compatibility again (Issue#12).
  • Fixed authentication on BSD (Issue#11, by Jonathan Walker).
  • Fixed exiting a nested event loop for synchronous calls (reported by Timo Warns).
  • Fixed introspection calls leaking reply handlers.
  • "rake test" now works, doing what was called "rake env:test"
Get a gem from or an rpm from the openSUSE Build Service.

    LinuxTag 2011 Pictures


    After a problem with the organizers' equipment, kobliha's openSUSE laptop was used to watch the live stream from Skynet I/O Chrome keynote.
    "Rule 1: Stay calm." Ralph Angenendt talks about problem solving.
    (image) (image)

    network-autoconfig: Find a connected eth interface and create an ifcfg for it


    Use case: I want to create an appliance image for a build farm worker machine. I don't know its hardware configuration beforehand; in particular, it may have multiple network interfaces and I don't want to bother figuring out which is which. I will simply include network-autoconfig.rpm and plug the cable into any socket before booting.

    network-autoconfig helps setting up machines with multiple network interfaces. At the first boot, all available Ethernet interfaces are cycled until one is successfully configured with DHCP.

    I have submitted it to openSUSE:Factory now. Enjoy it in the upcoming openSUSE 11.4!

    It is referenced as Feature#311012. You are welcome to improve it on Gitorious.(image)



    dbus-dump is a tool to capture D-Bus messages in a libpcap capture file.

    It takes an idea from dbus-scrape, which processes a strace output of dbus-monitor, and takes it further by stracing dbus-daemon, thus not relying on any eavesdropping (mis)configuration.

    The intended purpose is to establish the libpcap capture format as a base for debugging tools like

    Thanks to Will Thompson for mentioning the pcap idea.


    $ sudo strace -p `pgrep -f 'dbus-daemon --system'` \
    -s 3000 -ttt -xx -o foo.strace
    $ ./dbus-dump foo.strace foo.pcap
    $ ./dbus-pcap-parse foo.pcap
    Tue Nov 16 12:56:47 +0100 2010 # @body_length=0,
    Tue Nov 16 12:56:47 +0100 2010 # @body_length=4,


    It is written in Ruby. The pcap format is handled by a small bundled module. dbus-dump has no other dependencies. dbus-pcap-parse uses ruby-dbus.


    This is an early proof-of-concept release, serving to introduce the libpcap format.

    The main problem of dbus-dump is duplicating the messages, seeing them both when the daemon receives them and when it sends them (multiple times, for the signals).

    The other tools haven't caught up yet:

    $ /usr/sbin/tcpdump -r foo.pcap
    reading from file foo.pcap, link-type 231
    tcpdump: unknown data link type 231

    ruby-dbus 0.5.0 is a Gem with Errors


    I have made a new release of ruby-dbus, a Ruby languagebinding for the D-Bus IPC system.
    The main feature is a better binding of Ruby Exceptions to D-Bus Errors. See below for an excerpt of the documentation.
    Perhaps more importantly, the library is now primarily packaged as a RubyGem (Issue#6). Also I converted the tutorial from Webgen to Markdown.
    Bug fixes:
    • Don't pass file descriptors to subprocesses, they would not let go of the service name.
    • Fixed InterfaceElement::validate_name (Ticket#38, by Herwin Weststrate).
    • Fixed a typo in InvalidDestinationName description (Ticket#40).
    RPMs can be found via openSUSE Build Service Search.


    D-Bus calls can reply with an error instead of a return value. An error is translated to a Ruby exception.
    rescue DBus::Error => e
    puts e unless == "org.freedesktop.NetworkManager.AlreadyAsleepOrAwake"

    Replying with an error

    To reply to a dbus_method with a D-Bus error, raise a DBus::Error, as constructed by the error convenience function:
    raise DBus.error("org.example.Error.SeatOccupied"), "Seat #{seat} is occupied"
    If the error name is not specified, the generic org.freedesktop.DBus.Error.Failed is used.
    raise DBus.error, "Seat #{seat} is occupied"
    raise DBus.error

    n2n package improved

    2010-08-29T10:23:19.962+02:00 recently ran an article (in Czech) about the n2n virtual private network sofware, an open alternative to Hamachi. I intend to use it to cross the NAT in my mom's DSL modem so that I can connect to her computer with ssh and VNC.
    Thanks to happyman_eric and Grief, openSUSE Build Service already contained a package. I have made an improved version, adding an init script and a sysconfig file. Get the sources in my home project, or the binaries.


    ruby-dbus 0.4.0 with TCP Transport


    I have made a feature release of ruby-dbus, a Ruby language binding for the D-Bus IPC system.
    • TCP transport which pangdudu coded a year ago. At that time I did not feel familiar enough with the library, and the test suite was much smaller too, so that's why it took me so long.
    • Enabled test code coverage report (rcov)
    • Classes should not share all interfaces (Ticket#36/Issue#5)
    • Ruby 1.9 compatibility (Ticket#37, by Myra Nelson)
    RPMs can be found via openSUSE Build Service Search(image)

    Who does not want such a gift


    This post is showing naked women packaged as a present (for openSUSE's 5th birthday) and asks Ah... who does not want such a gift, eh.

    I believe that the female users and contributors of openSUSE don't. It reduces them to pretty things, judged on their looks instead of their contribution.

    Raul, please stop such sexist postings. Your blog is your own, but keep it out from Planet openSUSE.

    Just in case common sense is not enough, let me quote for reference the relevant section of the openSUSE Guiding Principles:

    We value... respect for other persons and their contributions, for other opinions and beliefs. We listen to arguments and address problems in a constructive and open way. We believe that a diverse community based on mutual respect is the base for a creative and productive environment enabling the project to be truly successful. We don't tolerate social discrimination and aim at creating an environment where people feel accepted and safe from offense.
    and the activities in order to excel in our goals: Emphasize the value of communication and recognize cultural diversity within our community.(image)

    Upgraded to openSUSE 11.3


    I have upgraded my office workstation to openSUSE 11.3 today. Here I document the migration so that you don't have to repeat my mistakes.

    I went via the command line and ventured to keep all additional repos enabled. So switching the repos was done simply by sed -i "s/11\.2/11.3/g" /etc/zypp/repos.d/*

    The KDE session crashed after kdelibs4-core had been updated. No big deal, so I ran zypper dup again.
    The /home directory is mounted via NFS, so filesystem.rpm failed when it wanted to reset the permissions of /home. Updating it explicitly after unmounting /home was easy, only unmounting it was harder because the crashed session left processes still accessing the home. fuser -v /home found them.

    The NFS mount is also authenticated by Kerberos and there is a bug so I got
    mount.nfs: access denied by server while mounting
    I had to rebuild and update a package and tweak a config file. See bnc#614293 for the details (thanks to mcaj for the reference).(image)

    ruby-dbus 0.3.1


    I have made a bug-fix release of ruby-dbus, a Ruby language binding for the D-Bus IPC system.
    • Many on_signal could cause DBus.Error.LimitsExceeded (bnc#617350).
      Don't add a match rule that already exists, enable removing match rules. Now only one handler for a rule is called (but it is possible for one signal to match more rules). This reverts the half-fix done to fix Issue#3.
    • Re-added InterfaceElement#add_param for compatibility.
    • Handle more ways which tell us that a bus connection has died.
    RPMs can be found via Webpin.(image)

    Helping Newcomers


    Since the discussion (do check out the linked paper, BTW) and the opensuse-women announcement, I've been thinking about how to make the openSUSE community more friendly to women.

    I think one good way is to make sure that new people feel welcome when they join a conversation, be it on the forums, on IRC or on the mailing lists. Now this would be easier if we all had infinite time to read and answer all questions, but as we don't, I decided to focus somehow.

    The forums provide a handy shortcut for the focus, labeling a user who made few posts as a "Puzzled Penguin". So I've made a simple service, a feed of showing only the posts by newcomer users:

    (Actually right now it does not show Puzzled Penguins only but instead excludes the 100 most-posting users until I learn how to optimize the PHP code.)(image)