"Incursões violinísticas" - Mark O'Connor
KIELUX / Teilnehmer für 13. Kieler Open Source und Linux Tage gesucht
Für die „13. Kieler Open Source und Linux Tage“ am 18. und 19. September 2015 suche ich Freiwillige, die mit mir den openSUSE-Stand in Kiel betreuen. Somit wäre openSUSE zum ersten Mal in Norddeutschland auf der KIELUX vertreten. Daher brauche ich eure Mithilfe. ![]()
Welche Fähigkeiten und Kenntnisse sollte man mitbringen? Klasse wäre, wenn man sich gut in openSUSE auskennt, um die Fragen (oft auch Anwenderfragen) der interessierten Besucher beantworten zu können und den potenziellen Anwender openSUSE schmackhaft zu machen und mögliche Ängste beim Umstieg abnimmt. Auch Fragen über persönliche Erfahrungen mit openSUSE und die tägliche Arbeit mit dem System kommen vor. Es ist nicht schlimm, wenn man sich in einem Gebiet nicht auskennt, die anderen Standteilnehmer helfen gerne untereinander aus. Ganz wichtig ist, dass der Spaß nicht auf der Strecke bleibt!
Was sollte mitgebracht werden? Für eine Live-Präsentation ist ein Notebook, Tablet-PC oder ein Desktop-PC mit openSUSE sinnvoll. Je mehr Geräte vor Ort sind, um so mehr kann man sie für verschiedene Anwendungszwecke z.B. für Video-Präsentationen einsetzen.
Wieviele Teilnehmer wird für den openSUSE-Stand benötigt? Aus der Erfahrung von den anderen Veranstaltungen werden mindestens 3 Teilnehmer für den Stand benötigt. Erstens um die Stoßzeiten besser abzufedern und zweitens das jeder die Möglichkeit erhält, auch die gewünschten Vorträge zu besuchen, wenn man schon mal dort ist. ![]()
Auf der Veranstaltung werden auch Vorträge und Workshops gehalten. Es wäre super, wenn jemand einen Vortrag zu openSUSE halten kann, um mehr Menschen für openSUSE zu begeistern. Ggfs. werde ich ein Workshop ausarbeiten.
Wie kann ich mitmachen? Einfach unten im Kommentar eine Nachricht mit gültiger E-Mailadresse im E-Mailfeld hinterlassen oder eine E-Mail direkt an
mail@sebastian-siebert.de
senden. Ich werde mich dann mit weiteren Informationen bei dir melden.
Wieso auf einmal „Kieler Open Source und Linux Tage“?
Die Vorgeschichte geht so: In einem Gespräch mit dem Standkollegen Marcel Richter (openSUSE Mitglied und Befürworter) habe ich auf der CLT2015 (Chemnitzer Linux-Tage) erfahren, dass die openSUSE Community nie mit einem Stand auf der KIELUX vertreten war.
Damit lag die Vor-Ort-Präsenz von openSUSE in Norddeutschland so ziemlich brach.
Als ich unseren Partnerstand Invis-Server, dessen Projekt auf openSUSE aufsetzt, nach dieser Veranstaltung in Kiel fragte, bekam ich als Antwort zu hören, dass das Team schon immer auf die KIELUX geschielt hat. Jedoch wegen dieser Umstände nicht nach Norddeutschland kamen. ![]()
Woran hat es gelegen, dass in der Vergangenheit niemand mit einem Stand für openSUSE in Kiel vertritt? Einige Standteilnehmer konnten wegen fehlender Zeit und/oder Geld nur die Ausstellungen in Wohnortnähe aufsuchen. ![]()
Die openSUSE-Community sollte nicht nur in West-, Ost- und Süddeutschland auf Open-Source-Veranstaltungen vertreten sein, sondern auch in Norddeutschland. Genau das sollte sich in diesem Jahr ändern und suche ab sofort weitere Standteilnehmer für unseren openSUSE-Stand in Kiel. ![]()
Als openSUSE Mitglied (Member) wie auch Befürworter (Advocate) war ich nahezu auf jeder Veranstaltung der ORR (OpenRheinRuhr) dabei. Es hat mir bisher immer Spaß gemacht, mit den Menschen in Kontakt zu treten, die gerne über openSUSE in Erfahrung bringen möchten oder auch Hilfe bei einem speziellen Problem gesucht haben. In diesem Jahr habe ich sogar die CLT2015 (Chemnitzer Linux-Tage) mitgenommen. Jedes Mal freue ich mich, wenn ich Bekannte Gesichter auf der Ausstellung sehe und mit ihnen ins Gespräch komme und auch neue Leute kennenlerne. ![]()
High Contrast Refresh

One of the major visual updates of the 3.16 release is the high contrast accessible theme. Both the shell and the toolkit have received attention in the HC department. One noteworthy aspect of the theme is the icons. To guarantee some decent amount of contrast of an icon against any background, back in GNOME 2 days, we solved it by "double stroking" every shape. The term double stroke comes from a special case, when a shape that was open, having only an outline, would get an additional inverted color outline. Most of the time it was a white outline of a black silhouette though.
Fuzzy doublestroke PNGs of the old HC theme
In the new world, we actually treat icons the same way we treat text. We can adjust the best contrast by controlling the color at runtime. We do this the same way we've done it for symbolic icons, using an embedded CSS stylesheet inside SVG icons. And in fact we are using the very same symbolic icons for the HC variant. You would be right arguing that there are specific needs for high contrast, but in reality majority of the double stroked icons in HC have already been direct conversions of their symbolic counterparts.
Crisp recolorable SVGs of the post 3.16 world
While centralized theme that overrides all application never seemed like a good idea, as the application icon is part of its identity and should be distributed and maintained alongside the actual app, the process to create a high contrast variant of an icon was extremely cumbersome and required quite a bit of effort. With the changes in place for both the toolkit and the shell, it's far more reasonable to mandate applications to include a symbolic/high contrast variant of its app icon now. I'll be spending my time transforming the existing double stroke assets into symbolic, but if you are an application author, please look into providing a scalable stencil variant of your app icon as well. Thank you!
KDE Plasma 5 und die Windowstaste
Ich arbeite beruflich mit Windows 7 und habe mich daher an das Verhalten der Windowstaste (Startmenü öffnet sich, ich dann durch Tippen nach Programmen suchen) gewöhnt. Unter KDE Plasma 5 lässt sich das mit einem kleinen Programm von Hans Chen recht einfach nachbauen:
ksuperkey biegt kurz gesagt das durch Super ausgelöste Signal so um, dass sich das Plasma Startmenü öffnet.
Installation
ksuperkey gibt es in manchen Distributionen (Arch, ROSA, OpenMandriva) direkt aus den Paketquellen. Für OpenSUSE existiert ein OBS-Repo.
Für Debian/Ubuntu/Mint führt leider kein Weg am Kompilieren vorbei:
- Abhängigkeiten installieren:
sudo apt-get install gcc make libx11-dev libxtst-dev pkg-config - Auf manchen Debian-basierten Systemen braucht es wohl auch build-essentials, die sollte man aber eh installiert haben.
- Code holen und bauen:
git clone https://github.com/hanschen/ksuperkey.git
cd ksuperkey
make
Einrichten
Mit ./ksuperkey kannst du das Programm schon mal starten. Wichtig ist, dass Alt + F1 als Tastenkürzel für das Startmenü festgelegt ist.
Einfach überprüfen und gegebenenfalls beheben:

Jetzt noch mit folgenden Schritten ksuperkey automatisch starten lassen:
Systemeinstellungen → Starten und Beenden → Autostart → Programm hinzufügen– → ksuperkey suchen oder auswählen
Das war’s schon!
Изменение размера раздела
Сначала отмонтируем все разделы и проверим файловую систему.
# swapoff /dev/sda2 # umount /dev/sda1 # e2fsck /dev/sda1 e2fsck 1.42.6 (21-Sep-2012) /dev/sda1: clean, 49/14056 files, 47157/56196 blocks
Используем parted для того, чтобы сначала уменьшить и передвинуть второй раздел, а затем расширить первый на освободившееся место. Так как второй раздел - swap, то его мы просто передвинем, не заботясь о содержимом. Иначе говоря, сначала мы совсем сломаем, а потом заново её разметим.
# parted /dev/sda GNU Parted 2.4 Using /dev/sda Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) unit s (parted) print Model: ATA QEMU HARDDISK (scsi) Disk /dev/sda: 120103200s Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 63s 112454s 112392s primary ext2 boot, type=83 2 112455s 1686824s 1574370s primary linux-swap(v1) type=82 3 1686825s 120101939s 118415115s primary reiserfs type=83
Для изменения раздела используется команда resize номер_раздела начало конец
(parted) resize 2 224973 1686824 WARNING: you are attempting to use parted to operate on (resize) a file system. parted's file system manipulation code is not as robust as what you'll find in dedicated, file-system-specific packages like e2fsprogs. We recommend you use parted only to manipulate partition tables, whenever possible. Support for performing most operations on most types of file systems will be removed in an upcoming release. (parted) print Model: ATA QEMU HARDDISK (scsi) Disk /dev/sda: 120103200s Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 63s 112454s 112392s primary ext2 boot, type=83 2 224973s 1686824s 1461852s primary linux-swap(v1) type=82 3 1686825s 120101939s 118415115s primary reiserfs type=83
К сожалению в этот момент оно само подмонтировало всё назад, поэтому нужно снова отмонтировать первый раздел. Раздел swap в данный момент уже должен быть работоспособен, потому-что mkswap на нем выполнился сам автоматически. К сожалению, я не нашел способа отключить всю эту самодеятельность.
# umount /dev/sda1 # e2fsck -p /dev/sda1
Снова идем в parted:
# parted GNU Parted 2.4 Using /dev/sda Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) unit s (parted) print Model: ATA QEMU HARDDISK (scsi) Disk /dev/sda: 120103200s Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 63s 112454s 112392s primary ext2 boot, type=83 2 224973s 1686824s 1461852s primary linux-swap(v1) type=82 3 1686825s 120101939s 118415115s primary reiserfs type=83 (parted) resize 1 63 224972 WARNING: you are attempting to use parted to operate on (resize) a file system. parted's file system manipulation code is not as robust as what you'll find in dedicated, file-system-specific packages like e2fsprogs. We recommend you use parted only to manipulate partition tables, whenever possible. Support for performing most operations on most types of file systems will be removed in an upcoming release. (parted) quit Warning: You should reinstall your boot loader before rebooting. Read section 4 of the Parted User documentation for more information. Information: You may need to update /etc/fstab.
Готово, parted не только изменил размер раздела, но еще и молча расширил для нас файловую систему, а теперь предупреждает о необходимости обновить загрузчик.
Изменение размера раздела
Сначала отмонтируем все разделы и проверим файловую систему.
# swapoff /dev/sda2
# umount /dev/sda1
# e2fsck /dev/sda1
e2fsck 1.42.6 (21-Sep-2012)
/dev/sda1: clean, 49/14056 files, 47157/56196 blocks
Используем parted для того, чтобы сначала уменьшить и передвинуть второй раздел, а затем расширить первый на освободившееся место. Так как второй раздел - swap, то его мы просто передвинем, не заботясь о содержимом. Иначе говоря, сначала мы совсем сломаем, а потом заново её разметим.
# parted /dev/sda
GNU Parted 2.4
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s
(parted) print
Model: ATA QEMU HARDDISK (scsi)
Disk /dev/sda: 120103200s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 63s 112454s 112392s primary ext2 boot, type=83
2 112455s 1686824s 1574370s primary linux-swap(v1) type=82
3 1686825s 120101939s 118415115s primary reiserfs type=83
Для изменения раздела используется команда resize номер_раздела начало конец
(parted) resize 2 224973 1686824
WARNING: you are attempting to use parted to operate on (resize) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs. We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
(parted) print
Model: ATA QEMU HARDDISK (scsi)
Disk /dev/sda: 120103200s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 63s 112454s 112392s primary ext2 boot, type=83
2 224973s 1686824s 1461852s primary linux-swap(v1) type=82
3 1686825s 120101939s 118415115s primary reiserfs type=83
К сожалению в этот момент оно само подмонтировало всё назад, поэтому нужно снова отмонтировать первый раздел. Раздел swap в данный момент уже должен быть работоспособен, потому-что mkswap на нем выполнился сам автоматически. К сожалению, я не нашел способа отключить всю эту самодеятельность.
# umount /dev/sda1
# e2fsck -p /dev/sda1
Снова идем в parted:
# parted
GNU Parted 2.4
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s
(parted) print
Model: ATA QEMU HARDDISK (scsi)
Disk /dev/sda: 120103200s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 63s 112454s 112392s primary ext2 boot, type=83
2 224973s 1686824s 1461852s primary linux-swap(v1) type=82
3 1686825s 120101939s 118415115s primary reiserfs type=83
(parted) resize 1 63 224972
WARNING: you are attempting to use parted to operate on (resize) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs. We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
(parted) quit
Warning: You should reinstall your boot loader before rebooting. Read section 4 of the Parted User documentation for more
information.
Information: You may need to update /etc/fstab.
Готово, parted не только изменил размер раздела, но еще и молча расширил для нас файловую систему, а теперь предупреждает о необходимости обновить загрузчик.
Code Review: Microsoft's System.Net.Mail Implementation
MailAddress and MailAddressCollection
address = mailbox / group
mailbox = name-addr / addr-spec
name-addr = [display-name] angle-addr
angle-addr = [CFWS] "<" addr-spec ">" [CFWS] / obs-angle-addr
group = display-name ":" [mailbox-list / CFWS] ";"
[CFWS]
display-name = phrase
word = atom / quoted-string
phrase = 1*word / obs-phrase
addr-spec = local-part "@" domain
local-part = dot-atom / quoted-string / obs-local-part
domain = dot-atom / domain-literal / obs-domain
obs-local-part = word *("." word)
Now consider the following email address: "Joe Example" <joe@example.com>
The first token you read will be "Joe Example" and you might think that that token indicates that it is the display name, but it doesn't. All you know is that you've got a 'quoted-string' token. A 'quoted-string' can be part of a 'phrase' or it can be (a part of) the 'local-part' of the address itself. You must read at least 1 more token before you'll be able to figure out what it actually is ('obs-local-part' makes things slightly more difficult). In this case, you'll get a '<' which indicates the start of an 'angle-addr', allowing you to assume that the 'quoted-string' you just got is indeed the 'display-name'.
If, however, you parse the address in reverse, things become a little simpler because you know immediately what to expect the next token to be a part of.
That's pretty cool. Kudos to the Microsoft engineers for thinking up this strategy.
Unfortunately, the parser does not handle the 'group' address type. I'll let this slide, however, partly because I'm still impressed by the approach the address parser took and also because I realize that System.Net.Mail is meant for creating and sending new messages, not parsing existing messages from the wild.
Okay, so how well does it serialize MailAddress?
Ugh. You know that face you make when you just see a guy get kicked in the nuts? Yea, that's the face I made when I saw line #227:
encodedAddress = String.Format(CultureInfo.InvariantCulture, "\"{0}\"", this.displayName);
The problem with the above code (and I'll soon be submitting a bug report about this) is that the displayName string might have embedded double quotes in it. You can't just surround it with quotes and expect it to work. This is the same mistake all those programmers make that allow SQL-injection attacks.
For an example of how this should be done, see MimeKit's MimeUtils.Quote() method.
I had such high hopes... at least this is a fairly simple bug to fix. I'll probably just offer them a patch.
ContentType and ContentDisposition
Their parser is decent but it doesn't handle rfc2231 encoded parameter values, so I'm not overly impressed. It'll get the job done for simple name="value" parameter syntax, though, and it will decode the values encoded with the rfc2047 encoding scheme (which is not the right way to encode values, but it is common enough that any serious parser should handle it). The code is also pretty clean and uses a tokenizer approach, so that's a plus. I guess since this isn't really meant as a full-blown MIME parser, they can get away with this and not have it be a big deal. Fair enough.
Serialization, unsurprisingly, leaves a lot to be desired. Parameter values are, as I expected, encoded using rfc2047 syntax rather than the IETF standard rfc2231 syntax. I suppose that you could argue that this is for compatibility, but really it's just perpetuating bad practices. It also means that it can't properly fold long parameter values because the encoded value just becomes one big long encoded-word token. Yuck.
Base64
Amusingly, Microsoft does not use their Convert.FromBase64() decoder to decode base64 in their System.Net.Mail implementation. I point this out mostly because it is the single most common problem users have with every one of the Open Source .NET mail libraries out there (other than MimeKit, of course) because Convert.FromBase64() relies on the data not having any line breaks, white space, etc in the input stream.
This should serve as a big hint to you guys writing your own .NET email libraries not to use Convert.FromBase64() ;-)
They use unsafe pointers, just like I do in MimeKit, but I'm not sure how their performance compares to MimeKit's yet. They do use a state machine, though, so rock on.
I approve this base64 encoder/decoder implementation.
SmtpClient
One thing they do which is pretty cool is connection pooling. This is probably a pretty decent win for the types of things developers usually use System.Net.Mail's SmtpClient for (spam, anyone?).
The SASL AUTH mechanisms that they seem to support are NTLM, GSSAPI, LOGIN and WDIGEST (which apparently is some sort of IIS-specific authentication mechanism that I had never heard of until now). For those that were curious which SASL mechanisms SmtpClient supported, well, now you know.
The code is a bit hard to follow for someone not familiar with the codebase (not nearly as easy reading as the address or content-type parsers, I'm afraid), but it seems fairly well designed.
It does not appear to support PIPELINING or BINARYMIME like MailKit does, though. So, yay! Win for MailKit ;-)
They do support SMTPUTF8, so that's good.
It seems that if you set client.EnableSsl to true, it will also try STARTTLS if it isn't able to connect on the SSL port. I wasn't sure if it did that or not before, so this was something I was personally interested in knowing.
Hopefully my SmtpClient implementation review isn't too disappointing. I just don't know what to say about it, really. It's a pretty straight-forward send-command-wait-for-reply implementation and SMTP is pretty dead simple.
Conclusion
Overall the bits I was interested in were better than I expected they'd be. The parsers were pretty good (although incomplete) and the serializers were "good enough" for normal use.
Of course, it's not as good as MimeKit, but let's be honest, MimeKit sets the bar pretty high ;-)
Quicktipp: Firefox und die Adressleiste: Wie man Wort für Wort markiert
Was mich auf meiner aktuellen OpenSUSE-Installation genervt hat, war das Verhalten beim Markieren von Text in der Firefox Adressleiste. Ich bin es gewohnt mit Strg+Shift und den Cursortasten Teile der eingegebene Adresse Wort für Wort auswählen zu können.
Scheinbar hat man das beim Paketieren für OpenSUSE jedoch nicht gemacht, sondern lässt immer die komplette Zeile markieren.
Kurz und gut, du kannst das Problem recht einfach in den Anwendungseinstellungen beheben:
1. about:config aufrufen und – falls nötig – den Warnhinweis bestätigen
2. Nach layout.word_select.stop_at_punctuation und den Wert durch Doppelklick auf “true” setzen.
2b. Wenn du Leerzeichen mit dem nächstgelegenen Wort zusammen markieren möchtest, noch layout.word_select.eat_space_to_next_word ebenfalls auf “true” umstellen.
Fertig!
KDE Plasma 5 und OpenSUSE Tumbleweed
KDE Plasma 5.2 ist seit kurzem veröffentlicht und in den Repositories von OpenSUSEs rolling release Zweig “Tumbleweed” bereits verfügbar. Der einfachste Weg um beides installiert zu bekommen ist wie folgt:
1. NetInstall ISO holen und Live-Stick (oder CD) erstellen.
- Für 64bit:
$ wget -c http://download.opensuse.org/tumbleweed/iso/openSUSE-Tumbleweed-NET-x86_64-Current.iso - Für 32bit:
$ wget -c http://download.opensuse.org/tumbleweed/iso/openSUSE-Tumbleweed-NET-i686-Current.iso
2. Vom Installationsmedium starten und ein minimales grafisches System installieren. Hierzu bei der Desktopauswahl zuerst “Weitere” (oder “Other”) und dann “Minimal X Window” auswählen. Als entscheidenden Punkt noch “KDE Plasma 5” aktivieren.
3. Nachdem die Installation durch ist (dauert etwas, selbst über einen 100Mbit-Leitung musste ich ca. 45 Minuten warten) startest du das System zum ersten Mal – und boom! – landest in einem hässlichen twm Loginfenster. Und wenn du dich einloggst, bekommst du twm als Windowmanager gestartet.
Um das zu beheben änderst du Folgendes:
$ sudo vim /etc/sysconfig/displaymanager
Hier die Variable DISPLAYMANAGER auf kdm oder sddm (falls installiert) setzen.
$ sudo vim /etc/sysconfig/windowmanager
Hier änderst du den Wert für DEFAULT_WM auf “plasma5”.
Jetzt einfach neu booten oder den Displaymanager neu starten:
$ sudo service display-manager restart
Das war’s!
How do you upgrade your distro? A tale of two workarounds
Every classic Linuxer would know why it's very handy to dedicate a separate partition for the /home folder of your tree: you could in theory share it between multiple OSs that you installed in your box (which you choose to run when you start your computer).
Now, I'm guessing that many people reading and nodding to the above, will also know that sharing /home/ is one thing, sharing $HOME (/home/yourUserName) is a completely different beast.
For example: you have a stable distro installed in your box; you decide to install a new version of that distro along the old one, in the same box. You run the new distro with a new account tied to the old /home/yourUserName folder: KABOOM!!! Weird things start happening. Among these:
- The newer versions of your desktop or desktop programs don't run properly with the settings saved in your .dotDirectories (they are to blame because they didn't probably have a settings-conversion feature).
- The newer versions of your desktop or desktop programs have a buggy settings-conversion feature; because your program does not run properly, or as well as it would have run if it had been ran for the first time with no settings saved at all.
- The newer versions of your non-buggy desktop or desktop programs convert your settings to a new format. Then when you go back and run your old distro again, your old-versioned programs stop working because they see settings in a new format which they don't understand. (This is impossible to fix, or very hard.) It's very important that this scenario works, because the migration to the new version of your distro may not be immediate, it may take you some days to figure everything out, and until that happens, you want to still be able to run the stable version of your desktop and desktop programs
- Etc.
To workaround these problems, I have a strategy: I use a different /home/ sub-directory for each distro installed in my system. For example, for distro X version A.B I use /home/knocteXAB/, for distro Y version C.D I use /home/knocteYCD/. The advantage about this is that you can migrate your settings manually and at your own pace. But then, you may be asking, how to really take advantage of sharing the /home folder when using this technique?
Easy: I keep non-settings data (mainly the non-dotfiles) in a different /home/ folder with no associated account in any of the distros. For example: /home/knocte/ (no version suffix). Then, from each of the suffixed /home/ subfolders, I setup symlinks to this other folder, setting the appropriate permissions. For instance:
- /home/knocteXAB/Music -> /home/knocte/Music
- /home/knocteXAB/Documents -> /home/knocte/Documents
- /home/knocteYCD/Music -> /home/knocte/Music
- /home/knocteYCD/Documents -> /home/knocte/Documents
- Etc.
- Debugger not stopping on breakpoints.
- Builds breaking with obscure error messages.
- Debugger opening file in the IDE which was already open, duplicating two tabs for the same file.
- Etc.
So I had to use a workaround for my workaround: clone all my projects in $HOME instead of /home/knocte/Documents/Code/OpenSource/ (yah, I'm this organized ;) ).
I've been trying to fix these problems for a while, without much time on my hands.
But the last weeks a magical thing happened: I decided to finally sit down and try to fix the last two remaining, and my patches were all accepted and merged last week! (at least all the ones fixing symlink-related problems), woo!!!
So the lessons to learn here are:
- Even the slickest workarounds have problems. Try to fix or report settings-conversion bugs!!
- Don't ever quit trying to fix a problem. Some day you'll have the solution and you will realize it was simpler than you thought.
- realpath is your friend.
- MonoDevelop (master branch) is now less buggy and as amazing as (or more than) ever (</PUBLIC_SERVICE_ANNOUNCEMENT>).