ownCloud Client Release 1.4.1
I am happy to announce that we today were able to release version 1.4.1 of the ownCloud Desktop Client on the three platforms Linux, MacOS and Windows.
You find suitable download links as usual at: http://owncloud.org/sync-clients/
Version 1.4.1 is a bugfix release for the 1.4.0 version released a few of weeks ago which brought a lot of new features. This one solves a couple of problems that were coming up during the last few weeks. For example, the problem that the client lost its configuration (at least) on the Win32 platform when the machine was shut down is fixed. Also a lot of redundant uploads wont happen any more. And there are even more fixes, as the detailed Changelog rules out.
We thank you for your ongoing support and the good work on bugs that came up. As usual we are looking forward to your feedback. Please work with us in the Github bugtracker if you experience issues.
Olé to you nonetheless
http://www.ted.com/playlists/11/the_creative_spark.html
"If your job is to dance, do your dance. If the divine, cockeyed genius assigned to your case decides to let some sort of wonderment be glimpsed, for just one moment, through your efforts, then "Olé!". And if not, do your dance anyhow. And "Olé!" to you nonetheless."
The talk is about how artists can get broken because of the anxiety of thinking they may not be able to do a great creation but I think that can actually be applied to any aspect of your life.
In ancient times, people used to believe there was a God that was ruling our lifes and what was happening was because of his plans. This was a way of managing uncertainty in their lifes, since there were a plan and rules designed for some higher entity, despite people was not able to understand them.
Then, people started to think that we are the center of the universe, ... and then we killed God when we tried to demonstrate every single thing through science and rules that are understandable by humans (well, not by all of them, but a set of humans). And we started believing we are in control and so we are responsibles of our own future (don't get me wrong, I think science has bring very very good things to humanity).
However, believing we can control, brings great responsability on our lifes, new rules (to avoid damages we can avoid because WE are in control), and at the end anxiety and stress. Then ... should we go back to believe in unnatural things?
Well, why not go back to believe we are not in control and that we do our best and then, because of "Gods", coincidences or other unnatural "things" that we don't know, don't understand and can't control, things will go in a way or in another, thus leaving us living with some uncertainty? Is this the next step?
Introducing Find Many Strings v2 - A chrome extension
Some of you might remember my chrome extension to search and highlight multiple strings simultaneously. I made an update to it recently and gave the ability to input multiple strings in one click. Here is an introductory video of the extension in action. Recommended to be watched in full screen.
The video along with the full subtitle support (so as to help a11y) was made Tharkuri. A big thanks for this strenuous job. If you are looking for someone to do [online] marketing / professional writing work in India, I highly recommend Tharkuri.
You can get the extension from the chrome store and the sources from the github repository. Please report any bugs / features to the github page and any feedback in the extension page or by mail.
Xamarin.iOS 7 : iBeacons - Part 1: Advertizing
iBeacons is a protocol on top of Bluetooth LE (Low Energy, also advertised as Bluetooth Smart, and part of the Bluetooth 4.0). It doesn't require any new hardware and is nothing really new by itself. What's new and exciting is its position in iOS: first-class citizen, integrated with CoreLocation, working in the background, ...
The recipe: advertising your position
1. Initialize a CLBeaconRegion
var beaconId = new NSUuid ("5a2bf809-992f-42c2-8590-6793ecbe2437"); //uuidgen on MacOS, nguid in VS
var beaconRegion = new CLBeaconRegion (beaconId, "yourOrg.yourBeacon");
2. Initialize a CBPeripheralManager
var peripheralManager = new CLPeripheralManager (new PeripheralManagerDelegate(beaconRegion), DispatchQueue.DefaultGlobalQueue, new NSDictionary ());
class PeripheralManagerDelegate : CBPeripheralManagerDelegate
{
CLBeaconRegion beaconRegion;
public CBPeripheralManager (CLBeaconRegion beaconRegion)
this.beaconRegion = beaconRegion;
}
public override void StateUpdated (CBPeripheralManager peripheralManager)
{
//State will be Unsupported on devices like iPhone4 and prior, PoweredOff if BT is down
if (peripheralManager.State != CBPeripheralManagerState.PoweredOn)
return;
var options = beaconRegion.GetPeripheralData (null);
peripheralManager.StartAdvertizing (options);
}
}
Notes and further reading
- As devices BT ids changes from time to time, your device will be sometimes advertised twice. That won't happen with real iBeacons.
- If you want to advertize in the Background, enable "Acts as Bluetooth LE accessory" in your info.plist
- Read Region Monitoring if you need more details.
Kraft Release 0.51
I am happy to release Kraft 0.51 today. Kraft is the KDE solution to handle daily business documents like quotes and invoices in your small business.
This is a bugfix release which brings a handful of useful fixes against bugs which were reported by Kraft users since the last release.
In the catalog view, now drag and drop is working to sort templates. Removing of sub chapters is also working now. A bug in the unit handling was fixed that picked wrong units in some cases. The path to document templates is not utf8 save.
As a new feature the address of the own company now can be picked from Kraft’s settings dialog also after first setup routine.
A source tarball can be downloaded from the Sourceforge Project, binary packages are on the way. Please also report bugs on SF.
Thanks for your interest and contribution to Kraft. If you want to support Kraft, please give feedback, spread the word or buy cool stuff.
Time for a rant on mime parsers...
Warning: Viewer discretion is advised.
Where should I begin?
I guess I should start by saying that I am obsessed with MIME and, in particular, MIME parsers. No, really. I am obsessed. Don't believe me? I've written and/or worked on several MIME parsers at this point. It started off in my college days working on Spruce which had a horrendously bad MIME parser, and so as you read farther along in my rant about shitty MIME parsers, keep in mind: I've been there, I've written a shitty MIME parser.
As a handful of people are aware, I've recently started implementing a C# MIME parser called MimeKit. As I work on this, I've been searching around on GitHub and Google to see what other MIME parsers exist out there to find out what sort of APIs they provide. I thought perhaps I'll find one that offers a well-designed API that will inspire me. Perhaps, by some miracle, I'd find one that was actually pretty good that I could just contribute to instead of writing my own from scratch (yea, wishful thinking). Instead, all I have found are poorly designed and implemented MIME parsers, many probably belong on the front page of the Daily WTF.
I guess I'll start with some softballs.
First, there's the fact that every single one of them were written as System.String parsers. Don't be fooled by the ones claiming to be "stream parsers", because all any of those did was to slap a TextReader on top of the byte stream and start using reader.ReadLine(). What's so bad about that, you ask? For those not familiar with MIME, I'd like for you to take a look at the raw email sources in your inboxes particularly if you have correspondence with anyone outside of the US. Hopefully most of your friends and colleagues are using more-or-less MIME compliant email clients, but I guarantee you'll find at least a few emails with raw 8bit text.
Now, if the language they were using was C or C++, they might be able to get away with doing this because they'd technically be operating on byte arrays, but with Java and C#, a 'string' is a unicode string. Tell me: how does one get a unicode string from a raw byte array?
Bingo. You need to know the charset before you can convert those bytes into unicode characters.
To be fair, there's really no good way of handling raw 8bit text in message headers, but by using a TextReader approach, you are really limiting the possibilities.
Next up is the ReadLine() approach. One of the 2 early parsers in GMime (pan-mime-parser.c back in the version 0.7 days) used a ReadLine() approach, so I understand the thinking behind this. And really, there's nothing wrong with this approach as far as correctness goes, it's more of a "this can never be fast" complaint. Of the two early parsers in GMime, the pan-mime-parser.c backend was horribly slow compared to the in-memory parser. Of course, that's not very surprising. More surprising to me at the time was that when I wrote GMime's current generation of parser (sometime between v0.7 and v1.0), it was just as fast as the in-memory parser ever was and only ever had up to 4k in a read buffer at any given time. My point is, there are far better approaches than ReadLine() if you want your parser to be reasonably performant... and why wouldn't you want that? Your users definitely want that.
Okay, now come the more serious problems that I encountered in nearly all of the mime parser libraries I found.
I think that every single mime parser I've found so far uses the "String.Split()" approach for parsing address headers and/or for parsing parameter lists on headers such as Content-Type and Content-Disposition.
Here's an example from one C# MIME parser:
string[] emails = addressHeader.Split(',');
Here's how this same parser decodes encoded-word tokens:
private static void DecodeHeaders(NameValueCollection headers)
{
ArrayList tmpKeys = new ArrayList(headers.Keys);
foreach (string key in headers.AllKeys)
{
//strip qp encoding information from the header if present
headers[key] = Regex.Replace(headers[key].ToString(), @"=\?.*?\?Q\?(.*?)\?=",
new MatchEvaluator(MyMatchEvaluator), RegexOptions.IgnoreCase | RegexOptions.Multiline);
headers[key] = Regex.Replace(headers[key].ToString(), @"=\?.*?\?B\?(.*?)\?=",
new MatchEvaluator(MyMatchEvaluatorBase64), RegexOptions.IgnoreCase | RegexOptions.Multiline);
}
}
private static string MyMatchEvaluator(Match m)
{
return DecodeQP(m.Groups[1].Value);
}
private static string MyMatchEvaluatorBase64(Match m)
{
System.Text.Encoding enc = System.Text.Encoding.UTF7;
return enc.GetString(Convert.FromBase64String(m.Groups[1].Value));
}
Excuse my language, but what the fuck? It completely throws away the charset in each of those encoded-word tokens. In the case of quoted-printable tokens, it assumes they are all ASCII (actually, latin1 may work as well?) and in the case of base64 encoded-word tokens, it assumes they are all in UTF-7!?!? Where in the world did he get that idea? I can't begin to imagine his code working on any base64 encoded-word tokens in the real world. If anything is deserving of a double facepalm, this is it.
I'd just like to point out that this is what this project's description states:
A small, efficient, and working mime parser library written in c#.
...
I've used several open source mime parsers before, but they all either
fail on one kind of encoding or the other, or miss some crucial
information. That's why I decided to finally have a go at the problem
myself.
I'll grant you that his MIME parser is small, but I'd have to take issue with the "efficient" and "working" adjectives. With the heavy use of string allocations and regex matching, it could hardly be considered "efficient". And as the code pointed out above illustrates, "working" is a bit of an overstatement.
Folks... this is what you get when you opt for a "lightweight" MIME parser because you think that parsers like GMime are "bloated".
On to parser #2... I like to call this the "Humpty Dumpty" approach:
public static StringDictionary parseHeaderFieldBody ( String field, String fieldbody ) {
if ( fieldbody==null )
return null;
// FIXME: rewrite parseHeaderFieldBody to being regexp based.
fieldbody = SharpMimeTools.uncommentString (fieldbody);
StringDictionary fieldbodycol = new StringDictionary ();
String[] words = fieldbody.Split(new Char[]{';'});
if ( words.Length>0 ) {
fieldbodycol.Add (field.ToLower(), words[0].ToLower().Trim());
for (int i=1; i<words.Length; i++ ) {
String[] param = words[i].Trim(new Char[]{' ', '\t'}).Split(new Char[]{'='}, 2);
if ( param.Length==2 ) {
param[0] = param[0].Trim(new Char[]{' ', '\t'});
param[1] = param[1].Trim(new Char[]{' ', '\t'});
if ( param[1].StartsWith("\"") && !param[1].EndsWith("\"")) {
do {
param[1] += ";" + words[++i];
} while ( !words[i].EndsWith("\"") && i<words.Length);
}
fieldbodycol.Add ( param[0], SharpMimeTools.parserfc2047Header (param[1].TrimEnd(';').Trim('\"', ' ')) );
}
}
}
return fieldbodycol;
}
I'll give this guy some credit, at least he saw that his String.Split() approach was flawed and so tried to compensate by piecing Humpty Dumpty back together again. Of course, with his String.Trim()ing, he just won't be able to put him back together again with any level of certainty. The white space in those quoted tokens may have significant meaning.
Many of the C# MIME parsers out there like to use Regex all over the place. Here's a snippet from one parser that is entirely written in Regex (yea, have fun maintaining that...):
if (m_EncodedWordPattern.RegularExpression.IsMatch(field.Body))
{
string charset = m_CharsetPattern.RegularExpression.Match(field.Body).Value;
string text = m_EncodedTextPattern.RegularExpression.Match(field.Body).Value;
string encoding = m_EncodingPattern.RegularExpression.Match(field.Body).Value;
Encoding enc = Encoding.GetEncoding(charset);
byte[] bar;
if (encoding.ToLower().Equals("q"))
{
bar = m_QPDecoder.Decode(ref text);
}
else
{
bar = m_B64decoder.Decode(ref text);
}
text = enc.GetString(bar);
field.Body = Regex.Replace(field.Body,
m_EncodedWordPattern.TextPattern, text);
field.Body = field.Body.Replace('_', ' ');
}
Let's pretend that the regex pattern strings are correct in their definitions (because they are god-awful to read and I can't be bothered to double-check them), the replacing of '_' with a space is wrong (it should only be done in the "q" case) and the Regex.Replace() is just evil. Not to mention that there could be multiple encoded-words per field.Body which this code utterly fails to handle.
Guys. I know you love regular expressions and that they are very very useful, but they are no substitute for writing a real tokenizer. This is especially true if you want to be lenient in what you accept (and in the case of MIME, you really need to be).
Strengths Finder 2.0
I was at an Agile Roundtable not too long ago and someone was talking up Strengths Finder 2.0, so I decided to pick up the book off of Amazon:
The book has a short introduction, which is a quick read, details about the strengths, and a code to take the test on their website. The test is timed and probably takes about 35 minutes. After the series of questions are answered it calculates your strengths and gives you your top five strengths. Once you have your five strengths the site and the book gives you an explanation of the strength as well as “Ideas for Action” for that strength.
According to the test these are my top five strengths.
- Adaptability
- Input
- Learner
- Communication
- Achiever
What are yours?
Magic: It is now possible to use MS Silverlight based websites via pipelight
It has long been a challenge to use MS Silverlight based websites on linux systems. Especially in The Netherlands this is a big hurdle as many (>80%) of the secondary school websites that pupils must use to communicate with their school (for homework, marks, etc) are equipped with Silverlight. Yes, really… 
Fortunately at the end of August 2013 I discovered pipelight, a very smart idea to use MS Silverlight based website natively on Linux. The problem was however to find a working pipelight package for openSUSE. As there was none, I decided to build one myself using the incredible openSUSE Build Service. It was quite a quest to obtain a working package, but due to very good cooperation with the pipelight developers, I’m now able to present a working pipelight package to the openSUSE community. Oh, and while working on the package I reported a bug via the bug report system, that was solved and published via an rpm package within 1 hour after reporting it (that was during out of office hours). Indeed within 1 hour after reporting the problem it was; accepted, investigated, analysed, fixed, tested, handed over to me, packaged, tested and published! The amazing world of Open Source Software!
Pipelight works okay for the following sites (among many others): arte, LOVEFiLM, Netflix, Magister based NL schoolwebsites, WATCHEVER, etc. View the complete list on the pipelight website.
The installation instructions are on the pipelight website. Be aware though, that pipelight requires the wine package that is provided via the home:rbos:pipelight repository. With any other wine package, pipelight will (very likely) not work. If you rely on your currently installed wine package and installed MS applications and are unsure that the wine package provided via the home:rbos:pipelight repository will leave your currently in use MS applications untouched: don’t install pipelight (or only after making very good backups). You can always start by installing pipelight in a virtual machine.
Have fun with pipelight.
KDE in openSUSE: repository and maintainership changes!
Summer is ending soon (at least for those living in the northern hemisphere) and while usually cleaning is done during spring, the KDE team decided to do what I’d call… autumn cleaning of repositories.
You may know that the KDE presence in openSUSE, aside being the default desktop, is quite a long one. In the past years different repositories were created by the members of the openSUSE KDE team (at the time mostly made up by KDE people hired by Novell) in order to review and test packages, like newer Qt versions, KDE software, and so on. Fast forward to the present: nowadays the members of the KDE team are almost completely from the openSUSE community, and quite a number of changes went by the repositories as well. For example, newer releases of KDE software are submitted as maintenance updates for the latest available version of the distribution, and there are the KDE:Release:xy repositories for those who want the latest and greatest KDE software.
That also meant that a lot of repositories were unused, and were left bitrotting (and consuming the OBS’s precious build power). But no more! Recently, thanks to the input from Raymond (tittiatcoke on IRC), a rather large cleaning of repositories is taking place.
The following repositories are going to be deleted:
-
KDE:Qt45
-
KDE:Qt46
-
KDE:Qt47
-
KDE:Qt:Stable
-
KDE:Netbook
-
KDE:Qt50
In the (unlikely) case you are using them, you should remove them ASAP.
This repository instead will be **moved **(thanks kdepepo for reminding me):
- KDE:Frameworks → KDE:Unstable:Frameworks
As with repository cleaning, there was also a reorganization of the maintainership, because a number of former maintainers had moved on. In practice this will mean that notifications and reports will get to the right people instead of just clogging the mailboxes of unrelated people. ;) Of course, the present KDE team stands on the shoulders of giants, and is extremely thankful for the work done by those people in the past.
That’s all, now we’re back to our regularly scheduled programs.
binary blobs to C structures
Sometimes you don’t have access to vim’s wonderful xxd
tool, and you need to use it to generate some .c code based on
a binary file.
This happened to me recently when packaging up the EFI signing tools for Gentoo.
Adding a build requirement of vim for a single autogenerated file was
not an option for some users, so I created a perl version of the
xxd -i command line tool.
This works because everyone has perl in their build systems, whether they like it or not. Instead of burying it in the efitools package, here’s a copy of it for others to use if they want/need it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
|
Yes, I know I write perl code like a C programmer, that’s not an insult to me.


