Slowly getting frustrated with Qtopia

Slowly getting frustrated with Qtopia

So I have been working on this Qtopia integration. Being a good Free Software citizen I report the issues (most of the time with patches) upstream. Because I don’t like non public tasks and prefer discussions on patches I had to decide to use the qtopia-interest mailinglist (note the increased volume since february). The amount of feedback, even on obvious issues is kind of low, admitingly disappointing. I understand creating a generic framework which is easy to customize for very different kind of devices is very hard. But this is what Trolltech decided to do with Qtopia, so I ask for advice how I can achieve my customisation as it is currently not possible, the feedback is zero, none, nada. This is something that engineers, creators of frameworks should love to discuss, use cases, approaches to API… no interest at all from Trolltechs side.

But where the frustration starts is copy and paste. Their approach to platform integration is, copy an existing platform, sed -i s/THEIR_NAME/YOUR_NAME/g, hack on it until it is working, copy code from the Qtopia libraries and change one line, add device specific code to the core Qtopia libraries, have five copies of yuv blending code (unaccelerated, bytewise…, we had to call the ambulance for raster…). So I have had to fix bugs/asserts/crashes on copy and pasted code where someone fixed the original code in qmodemsiminfo.cpp but forgot to update all places where they copy and pasted the whole class to. In this case certain modems send different responses when no simcard is inserted, a perfect example for abstraction (removal of copy and paste, fix without copy and paste).

With C and C++ you have languages where you can change/extend the behavior of so called “objects” (coming from Object Orientated Programming) with something called “subclassing”. You do not need to copy the sourcecode to achieve that.

With Linux we have gained generic input systems (started in 2.4, really used in 2.6), sysfs (2.6) and I’m specially proud that a couple of device classes (battery, backlight, led…) originated from our handhelds community and found their way into mainline. So instead of writing one class for one battery, you can create one class that is going to work for every battery, with a stable userspace interface. When raster saw that, he read the battery class specification and implemented it. And it doesn’t look like Qtopia will gain support for these ‘classes’ of devices anytime soon, instead you, as an integrator, have to manually parse your special device, no help is coming.

When doing hardware development, you don’t follow the waterfall model. You create hardware, write drivers, work on GUI stuff, have iterations on everything (new hardware, new kernel, new GUI). The kernel gets better suspend resume handling, the initialisation order of drivers change. The input device numbering in userspace change as well (/dev/input/eventX). Because the kernel developers knew that these numbers in userspace will be random, they added ioctl’s to get the vendor id, product id, version and name. So sane code would have a class/factory where you create an input device handler for a given Vendor and Product ID, or name of the device (e.g. “Neo1973 keyboard”), I would hide this behind a nice API where you only have to deal with the actual handling of keyboard data. Qtopia’s approach to this is… Right, Copy and Paste and using hardcoded device numbers. So in the neo case you have four copies of this code, they don’t include linux/input.h but duplicate the struct and use magic numbers instead of the defines..

You have to rush, you do mistakes, you do stupid things and this is kind of acceptable but what really frustrates me is that they justify their behavior. They justify copy and pasting the same code to four places (and changing the class name) as a way to avoid bloat (which the abstraction would add) and that hardcoding the random device number is the right thing to do and that finding the right device is bloat and not needed.

So dear people can someone explain me where the world of someone who has grown up in the Free Software world, started to program here, getting review and comments, creating patches, polishing them, reworking them due feedback is disjunct with the world of copy and paste. As a buddhist I know that my world is not better than their world, only different. So please can some one help me to understand how their world is different, how I could understand them, how one can help them to recognize that copy and paste and layering violations create more problems than they solve?

Qtopia progress

Qtopia progress

I safely returned from Taipei and was almost in time. As I don’t have a hitchhiker guide to transatlantic traveling I had to learn it the hard way. Don’t take the arrival time for granted and plan the evening. If anyone knows how to legally get a rental copy of I’m a Cyborg but that’s ok. please tell me.

Taipei is great and I hope this was my first visit in many to come. It was a pleasure to see the Openmoko offices, catch up with the local engineers (too many to name them and I would forget one and would feel really bad about it). My short-term goal for tick and jeremy is to make them start a blog, take videos of their apps (assassin, diversity) and expose themselves to the public. It was a pleasure to meet the other foreign engineers and I’m specially honored to have met Werner Almesberger, received a talk on kboot, and rasterman and enjoyed the training on the graphic pipeline, state of XRender and general musings on object orientated programming.

I have finally a result of the automatic build of Qtopia/X11 that is not segfaulting (yeah!) and the experience feels like wasting time. I think I have spent almost of the last week on this thing as the turnaround times are so heavy. E.g. I managed to compile Qt for the target without fontconfig and the apps were only able to display numbers but not any glyphs. So I had to pass -fontconfig and the includepath for fontconfig to the configure script. This results in a five hour penalty as Qt for the desktop (totally unrelated), Qt for the target (not only the two classes knowing of fontconfig) and then the full Qtopia stack (I assume the Qt with and without fontconfig is binary compatible… so another waste of time). Anyway I have a GTA02/Freerunner (with GPS, WiFi, GSM, without a working bluetooth) that is powered by enlightenment, which is of importance for buddhists, and Qtopia/X11. We need to polish the packages and configuration, make sure that qpe is launched as part of the Xsession start and then let our “black team”, allan, do the testing and secure my job by finding bugs. The modem gets powered on, Qtopia finds it, I see the PIN Dialog and once raster is finishing his keyboard we can enter stuff. Pal hurry up!

What is so cool about Openmoko? In contrast to many other companies, specially in the hardware industry, is that the relevant stuff is public, our failures with hardware, our stupidity, our brilliancy, our success, our progress, our vision. This allows you to track it and be part of it and contribute. We are open, and mean it, and this commitment to openness is important. This is showing with our platform strategy. We are not only a Gtk+ company, we are not only an EFL company, we are not only a Qt/Qtopia company. We have enough flash to make it possible for you to carry your favorite toolkit and language in your pocket, show it to your friends. So our platform strategy is different, it is toolkit and language neutral, in the current age this implies DBus and yes we are interested in reusing and creating DBus Interfaces around GSM/SIM, Networking, PIM, Journal, Location, Communication,… This effort is lead by former Opie colleague and close friend Dr. Michael ‘mickeyl’ Lauer who currently enjoys the sun in Recife and is attending the Bosa Conference with a bunch of other Openmoko people (raster, stefan, daniel).

So consider contributing, your open phone is waiting for you. And remember warranty is void when NOT opened.

QtWebKit, Illume and Diversity

QtWebKit, Illume and Diversity

I’m writing this on one of these roundtrips when waiting for the Qtopia buildsystem to finish. I changed the mediaengine from helix to gstreamer, this means in one library another implementation gets compiled and the library is linked, maybe the other part of Qtopia needs relinking after it and that would be fine. The truth is, I switch the engine now configure of Qt desktop, Qt target and Qtopia is ran and I’m compiling Qt for the desktop, Qt for the desktop and the Qtopia libraries and applications from scratch. If anyone knows how to stop these stupidity and get me acceptable roundtrips times for such minor changes please comment.

To everyone that say QWebKit, the Qt WebKit integration is called QtWebKit and please use that when referring to this module. As communication is done by blogs these days I have seen this workaround. If you experience a crash on exit with QWebView, please tell us, there is no need to add a workaround to your application, Qt4.4 is not final. So please write a small application that is crashing on exit and the Qt WebKit inside and outside of Trolltech will take a look and fix it. What did you make believe this is an bug in amarok and is needing fixing there? The cool thing with the Free Software world is you can fix the stuff where it has to be fixed and we should utilize this, so please show us the problem.

Urs, I’m glad you had a go at the QtWebKit KPart and yes QNetworkInterface is not present if you compile QtWebKit with Qt4.4. You want to look into the QNetworkManager and provide an implementation using KIO. If you need any help, I’m here to help and I’m sure Simon and thiago will help you too.

raster left taipei yesterday, he is probably packing and leaving to the bossa conference soon, he has been busy working on illume, our window manager module for the GTA02/Freerunner, tick has created a project for our EFL based installer application (using PackageKit) and last, but certainly not the least application we are going to develop in our GForge is diversity. This application is combining GPS, GeoClue, Jabber, your Journal with each other and providing a bling-bling interface using EFL. When walking around in a foreign city you can see where you friends are, were, where they haven taken their cool pictures that you have seen on flickr, get routing with OpenStreetmap to find your way, see people with the same interests as you, take a city tour people like you have enjoyed, let your Freerunner guide you through the city, go sight-seeing or just chat with your relatives back home (and certainly be able to control your privacy). I hope we will have some more videos up in the next couple of weeks.

I have been enjoying my time in Taipei, I’m definitely coming back soon and if we work hard Openmoko can have a bright future, we can start a Software Industry in Taiwan solely based around the concepts of Freedom and Free Software, this is really exciting!

Taipei, Qtopia on X11, and tracing memory allocations

Taipei, Qtopia on X11, and tracing memory allocations

I moved into the OpenMoko apartment yesterday and right to the backside of the apartment we have some kind of hill and I could not resist and had to walk up to get this city view:
03020055.JPG

raster has been working on a new launcher, window decoration and application navigation for the OpenMoko device, some things are pretty hot about it. It is called illume and can be found here. This launcher is using EFL, actually it is a module for e and the cool thing is edje. With this little file you define objects, their look and their behavior, e.g. if it gets clicked a signal is emitted, you can write mini programs, so on click you can get a transition, like sliding out the menu. edje is pretty powerful.

WebKit related I’m spending my spare time tracking allocations, stale data and memory fragmentation. I use spiegel.de as my test site and monitor heap usage and address space growing (due fragmentation?) and somehow lacked a good application for profiling. raster kindly pointed me to memprof and now I can do this (well memprof has some performance issues with WebKit when getting the profile, but it is performing better than Instruments.app for this job):

memprof

I see most of the memory was allocated by QImageData::create, when clicking on the create method I can see the callers and navigate through the backtraces. It is working with C++ and you can easily add qMalloc,qCalloc,qRealloc,WTF::fastMalloc to the list of functions to ‘ignore’.

QtWebKit in action

QtWebKit in action

Following up Simon’s QtWebKit in Action and to answer some comments from previous blog posts. Yes with QtWebKit you can embed QWidgets into HTML, you can control their position, size, etc. with JavaScript and apply CSS, invoke slots and such things. Lars, Simon and Girish created a demo for the DevDays it can be seen in action on the site Simon mentioned and you can grab the source from svn://labs.trolltech.com/svn/webkit/demo.

Picking (a) Company

Picking (a) Company

Many people don’t know what my nickname means even german speaking ones. The direct translation would be tick, these animals that sit on leaves, bite people and suck the blood, the ones that can cary scary deseases. But there is another side to the word, a political one. In my youth this word was used to refer to punks and similar associates by right wing people, I was labeled this way. And this is nothing to be ashamed off, the view of kids with weird haircuts (or none), not washed hairs, broken and dirty clothes probably disrupted their lovely right wing world, but their world deserves disruption, change.

When joining irc I had to pick a nick and the most often used word for me not equal to holger or freyther was zecke so I settled with that. And looking at it now, as a discordian pope, it was a good choice.

Like many hackers I started to work from home, communiciated through irc, started to work on projects, collaborated, learned (thanks to a guy named tronical willing to answer any question), grew, got better, continued to make stupid mistakes. Saw Mr. Eilers and Lauer finishing their PhD. I believed an ideal FLOSS career would be to work remotely from home, little did I know, little do I know.

I started university, joined the RoboCup team, started internships and got hooked to the power of teams in one physical place. Having many brilliant people at the same place working together, sharing success and helping each other to recover from failure is the best way of working. At least I have not witnessed something better than an awesome team.

In december I decided to resign from my current part time job, we/they are an awesome team, because I wanted to work on FLOSS again. So my constraints for finding a new job are now FLOSS + awesome team.

I had the opportunity to visit the Oslo trolls (they do not live caves, in contrast they are close to the sky, the 5th floor to be exact) and it is an awesome team. Brilliant, international people, there is little more you can ask for. And even if you do ask, there are soft drinks (no Club Mate though), food and vegetables, and some people have chocolate… I started to verify if the requirements of FLOSS and awesome team are fulfilled and oh my god, they are. The only downer was. Oslo trolls live in Oslo, and I’m in Berlin (at least 2 to 4 more terms). After a lot of flirting, tears and counseling (or eating spaghetti at Berlin based usability experts) I was forced to accept that Oslo trolls live in Oslo and even with the power of the mind of fooling myself applied, Oslo is not another name for Berlin and is really not referring to the same place. Looking at the size of the universe the difference from Berlin to Oslo is really minor, but if you happen to be in one of the two cities you recognize that even this minor difference is significant. Specially working with simon would have been ueber cool, it looks like it has to wait some more years. So yes Trolltech has the simon factor and its weight is really really heavy.

To keep a long story short, there are two other companies that I really like because of doing FLOSS and having an awesome team and these are o-hand.com and OpenMoko. To stop the flirting and crying tears I’m going to do a project for OpenMoko, I want to see them finish the GTA02, ship it to the people and want to see OpenVG capable hardware with open drivers coming.

Harald Welte helped in drafting the NDA of OpenMoko and at no surprise there are exceptions for FLOSS. I agree with rms that NDAs have victims, like he was victim of a donated Xerox printer and not able to fix the driver for ITS (awesome book, a must read), this NDA is going to have victims as well, victims that need to know the pricing of hardware, business plans, and all the stuff I do not care about. There is no doubt that the software I write will be FLOSS, will be released on day one and I can talk and discuss about it as much as I want as it is definately not covered by the NDA! You certainly know when not to argue. Oh and on to the team. I had the pleasure to listen to a discussion of Werner Almesberger and raster yesterday, a bit disturbing but totally awesome! I’m looking forward to meet some of you after FOSDEM in Taipei! So let there be Qtopia, Qtopia on X11, next to Java,Gtk+,FLTK+,EFL,FooToolkit and any other Free Toolkit all buildable from OpenEmbedded!

Let us be productive, innovative and provide prior art for mobile computing for years to come! With all the cool people working at OpenMoko it is a pleasure to say… “Hello Moko” as well.

PS: Ironically almost one year after I considered joining initially.

QtWebkit Status update

QtWebkit Status update

  • Simon and Jasmin went through the API of QtWebKit. Most of the changes where changing names and parameters of methods, signals and slots. And some minor but important behaviour changes. The Plugin API is probably the only remaining feature for Qt4.4 and Lars and Simon have already progressed nicely.
  • Simon went ahead and integrated QtWebKit into the Assistant on the way finding/marking of text was added to the QWebView and QWebPage API.
  • Benjamin (icefox) continues adding the basic features to our demo browser. It is an awesome testbed to test QtWebKit, see what APIs is missing and what pages need work.
  • We (this means mostly Simon) have fixed some rendering bugs of control/form elements with certain styles. Interesting remark. QCommonStyle::drawComplex is drawing PE_FrameLineEdit if you ask it to draw PE_PanelLineEdit, but only if your lineedit has a frame. Most of the styles assume a pristine/virgin QPainter when painting. In QtWebKit this is not true so we have created a StylePainter which will set a Qt::NoBrush and probably other things in the future. We know that painting scrollbars need a tweak when topLeft() is not equal to (0,0) on some styles. Note to myself if you see a drawRect call, the rect will be filled with the brush…
  • We (see above for the actual meaning of we) have enabled the PageCache. The result is that you can go back and forth without waiting minutes. At least I had to wait minutes as I’m on a GPRS line. For other the effect is not too noticable as they will have broadband and because we are likely to not properly cache the ResourceRequest/ResourceHandle and do a real request on going back. More investigation is needed.
  • I have been doing some cosmetic changes, I liked the Safari3 feature to resize multiline text edits. I made sure that it is working in QtWebKit as well. I didn’t see the sizegrip icon and started to poke WebCore, RenderLayer and wondered why I can’t resize. After a while I found a call to WebCore::Settings (each WebCore::Page has a WebCore::Settings and we wrap around it with QWebSettings) in the CSSParser which defines if certain things are resizable, so I set this to true in QWebSettings and still didn’t see the icon (after adding a bunch of them to our WebKit qrc). It turned out that the way we used BitmapImage to show PlatformResources wasn’t too clever, we stuffed a QPixmap in there but didn’t use the size or the content of it.
  • I have started to look into image usage, both QPixmap and QImage in WebKit and started to look for other areas where we leak, keep a reference too many and such things. Candidates of memory waste are keeping both a QPixmap and QImage of the same image, caching the downloaded data (in the WebCore::DocumentLoader). At this point I would like to find a guide to script gdb, I want to print the last three frames everytime ::ref and ::deref of a DocumentLoader or SharedBuffer gets called. Alternatively I will have to toy with VirtualBox to install Solaris, or get OSX Server and try to legally run it in a VM to get access to DTrace.
  • Memory usage. I have started to profile QtWebKit. I have used examp console of o-hand.com and massif a valgrind tool. I have to get used to the new reporting of massif. It is not generating a postscript file anymore but you have to use a tool called ms_print to look at the snapshots. I hope some one is writing a cool gui for it soon(tm).
maemo’s Scratchbox and how I feel about it

maemo’s Scratchbox and how I feel about it

The last month I have been toying with a nokia tablet and specially gstreamer and to develop the software I have used scratchbox and would like to share some feelings.

What I like:

  • Easily get the patched source of a package
  • Easily rebuild packages using dpkg-buildpackage
  • But these are attributes of the Debian system and not scratchbox

What I can’t stand with scratchbox:

  • Taking 8GB of my disk space not having ping or mc installed.
  • Not having mc in their repository!
  • Using scratchbox takes away my tools, my vimrc, I actually have two setups and I don’t see the difference between /scratchbox/login and ssh into a qemu, bochs, virtualbox, vmware…
  • DNS stoppped working inside the scratchbox environment, even if the resolv.conf are the same
  • I can not do git-init and then do dpkg-buildpackage
  • I have to reboot and use an older kernel (VDSO is not enabled in the Ubuntu hardy kernel) to use scratchbox
  • The Nokia maemo install shell script is proprietary…
  • Scratchbox is not rebuildable, I tried many times
  • and the list continues
  • it requires root privileges to install

To summarize: What I really like is the exposure of debian, easily rebuild and patch the packages! What I don’t like is probably the rest and what makes scratchbox up. So instead of getting my work done I have to reboot my computer, copy files in and out of the cloned home directory of scratchbox, have to setup my GDB, vim and other configs and find out why networking stopped working in my scratchbox login.

With one sentence: I love the Debian tools, Scratchbox is a PITA and I can specify –build, –host and -.target.

(written after another reboot to be able to call /scratchbox/login)

The Joys of debugging WebKit

The Joys of debugging WebKit

When working on WebKit and the platform layer you come to a point where your primary browser is going to be WebKit based (or already is because you use Safari, OmniWeb,…). If you happen to use a platform that is not developed by Apple (Qt, Gtk+, Wx) you are going to be the first to see certain issues. I’m currently in this fantastic situation and have issues to see, understand and resolve.

This is a brief summary of two issues Simon and me were looking into at the wonderful 24C3 this year. We have looked into GMail and Yahoo Mail.

The Yahoo issue started with the attempt to sign into my ancient account, and this time the issue wasn’t to remember my password. Our Qt Demo Browser went into a infinite loop of redirections. So what was wrong? The obvious thing to blame is our networking implementation and the brand new QNetworkAccessManager and related classes. And yes some issues were found in our networking implementation. For redirections we have told WebCore more than once that a redirection is happening, we have missed one redirection code. To cut a long story short, this didn’t fix the issue. Cookies are always important so we checked them, fall victim of wireshark as it is truncating the decoded HTTP header and it looked like we didn’t send the full cookie string. It fooled us for a second or two and then we remembered our HTTP and Cookie implementation must be perfect as Thiago wrote most of it. So I started to find out where this redirection gets triggered, joy it came from a timer, so who started it? And we saw that it was coming from JS, so it was something embedded into the site. We signed in with https://mail.yahoo.com, got redirectred to a US server, then to a German one and then sent back to http://mail.yahoo.com. Note that the last redirection is going from http to https. So once again the WebKit Web Inspector came to rescue and we searched for “http://mail.yahoo.com” in the sourcecode view and two hits where revealed, after not starting the redirection timer when it is going to http://mail.yahoo.com. The second hit was interesting as it pointed to a piece of javascript code that was asking the DOM for cookies. Our CookieJar implementation was a bit selfish as it didn’t want to share all relevant cookies with the DOM but only one, after convincing it to return all relevant Cookies the login and sending mails finally worked!

The Gmail issue. You can sign in to Gmail as we pass the google cookie test, you see the full version of Gmail and we were not able to click any links. The JS Code google is sending is highly obfusicated so debugging is no fun at all, we went for the easy solution and updated our User Agent string, magic happened and we were served another version of it and it made our browser terminate in an assert in WebCore::FrameLoader. The next easy thing was to git merge the Safari-3-Branch into QtWebKit, recompiling, login, ASSERT, *joy*. With the usual and fantastic help of the apple folk I got pointed to #15765 and yes we were hitting this bug. I can tell you reducing Gmail to a test case that is actually exposing the bug is no fun, actually it is because it is challenging and something totally new for me. So after understanding and proposing a solution for this common issue, I have to fix the DumpRenderTool/run-webkit-tests relationship and I can then probably land this fix as well. With it you can go to gmail, browser your mail, see your chat logs but we still have some unimportant issues left like being able to send mails…

So QtWebKit is improving day by day, we mostly implement and fix code in the platform layer, sometimes go to other parts of WebCore and do fixes there.I think it is only a matter of time before we start doing fixes and improvements in the HTML, SVG and rendering implementation.

WebKit is highly addictive, try it out 🙂

PS: I’m going to leave my friends at GMIT at the end of the month, do the math.

WebKit Demos for Qt4.4

WebKit Demos for Qt4.4

The Qt4.4 Technology Preview 1 is out and webkit is integrated into it. It is the same code as on the public WebKit.git repository, actually the copy in Qt is always a bit behind as we do the development in the public git repository.

After integrating QtWebKit into Qt we needed a small demo application. So we wrote a small browser and the result can be found in demos/browser, an older snapshot can be seen below, and the rsync copy of Qt has a newer and better version. It makes a really good test case for our API and implementation. We see what bits are missing when doing interesting stuff, when trying to login and use webservices we see what is broken. So we started eating our own dog food and most of us enjoy it. This post gets written using this browser and a fully working gmail, flickr is quite near.

I hope you enjoy this small demo application and we will continue to improve this browser, QtWebKit and our Qt4.4 networking stack. So make sure to watch the rsync versions of Qt as it is highly addictive.

Old Demo Browser