2012-08-22

[GNOME] GXml 0.3.1: Can't live in an alternate universe forever

Hello.  I received some feedback from the 0.3.0 release of GXml at the end of the Google Summer of Code.  Mainly that it wasn't compiling on another person's machine.  Changes to autotools to increment the version caused files to not install in a unusuaable configuration, but I didn't notice as I still had files installed from before I incremented the version. :D



I spent last night and today going through autotools files and libfolks to understand what was going wrong.  Then I rewrote a third of GXml's configuration.  I tried following the Vala tutorial's advice, only to discover it was base on GXml.  "make distcheck" now passes too, though I had to relocate some tests and fix a bug in caching deserialised objects.



Thus, 0.3.1:


Any more feedback would of course be welcome.

2012-08-20

[GNOME] GXml 0.3.0

update: thanks to Marcus Lundblad for pointing out issues with the examples

 

The Google Summer of Code 2012 now comes to a close, so to celebrate, GXml 0.3.0 has been tagged with GObject Serialization as its big feature.



The last few days have had been trying to find a clever way to reliably identify some types of collections, but that's not finished, so they're not being automatically serialized in this release.



I've also bravely fought against autotools to try to figure out how to minimise the number of places where I have to update a version number.  Too much of autotools remain a mystery to me, sadly, but I think I got it?  It works for me: hopefully someone will file a bug if something doesn't work for them.



Summary


  • Serialization class


    • that can automatically handle many types

    • that can deserialise to types known on the local system and distinguish multiple references to the same object.  I have some future plans to remove redundant XML that gets generated, too.


  • Serializable interface


    • allows classes to override default serialization and serialize non-public properties too.  Yay!

    • follows json-glib so that a common serialization interface can be defined in the future


  • Documentation


    • successfully got Valadoc to generate GtkDoc (and fixed a lot of documentation in GXml from before)


  • Testing


    • created test suites for serialization features


  • API breakage


    • namespaces were changed, in part to reduce the amount of code C programmers have to write.



Vala Example



Automatic serialization


GXml.DomNode xml = GXml.Serialization.serialize_object (banana);
...
banana = GXml.Serialization.deserialize_object (xml);



Implementing the interface: overriding how a property is serialized


public class Banana : GLib.Object, GXml.Serializable {
public int weight { get; set; }

public GXml.DomNode? serialize_property (string prop_name, GLib.ParamSpec spec,
GXml.Document doc) {
switch (prop_name) {
case "weight":
return doc.create_text_node ("%d".printf (weight * 1000));
default:
return null;
}
}

public bool deserialize_property (string prop_name, GLib.ParamSpec spec,
GXml.DomNode prop_node) {
GLib.Value outvalue = GLib.Value (typeof (int));

switch (prop_name) {
case "weight":
int64.try_parse (((GXml.Element)prop_node).content, out outvalue);
this.weight = (int)outvalue.get_int64 () / 1000;
return true;
default:
return false;
}
}
}



Implementing the interface: override view of properties


using GXml;

public class Plantain : GLib.Object, GXml.Serializable {
private int weight { get; set; }

private ParamSpec[] _props = null;
public unowned ParamSpec[] list_properties () {
if (this._props == null) {
this._props = new ParamSpec[1];
this._props[0] = new ParamSpecInt ("weight", "weight", "weight",
0, 200, 0, ParamFlags.READABLE);
}
return this._props;
}

private ParamSpec prop;
public unowned ParamSpec? find_property (string prop_name) {
ParamSpec[] props = this.list_properties ();
foreach (ParamSpec prop in props) {
if (prop.name == prop_name) {
this.prop = prop;
return this.prop;
}
}
return null;
}

public new void get_property (ParamSpec spec, ref Value str_value) {
Value value = Value (typeof (int));

if (spec.name == "weight")
value.set_int (this.weight);
else {
((GLib.Object)this).get_property (spec.name, ref str_value);
return;
}


value.transform (ref str_value);
return;
}

public new void set_property (ParamSpec spec, Value value) {
if (spec.name == "weight")
this.weight = value.get_int ();
else {
((GLib.Object)this).set_property (spec.name, value);
}
}
}

 

... 

Challenges



These are the greatest challenges I've dealt with



  • my masters: there's a lot of pressure to hurry up and finish; ideally, a GSOC should be the sole or primary focus of my summer, but I don't have much opportunity to take a summer off right now.  Going to GUADEC was amazing, but consequently made my masters a bigger part of these past two weeks.

  • autotools: a lot of feedback centred on people wanting autotools instead of WAF, so now you have and now I cry myself to sleep at night.  I just need to make it a bigger part of my life.

  • valadoc: I was having issues getting valadoc to correctly generate GtkDoc last year and this year until Philip Withnall directed me to libfolks.


Future


  • want to support automatic serialization of more complex types; I've been working on collections but there are problems with it that prevent me from committing it.

  • two projects approached me at GUADEC suggesting GXml for saving data to disk, so I am going to write patches for them. :D

  • examples in other languages


Download tar ball: http://ftp.gnome.org/pub/GNOME/sources/gxml/0.3/

2012-08-16

[Technology] A nuisance

One of my complaints about my Linux desktop is the lack of feedback I get when things aren't working.  If my firewall blocks something, I don't want it to do it silently, I want to know that the firewall is the reason this or that feature is currently not working.  When SELinux blocks an application from doing something, I want to know; apparently it's supposed to tell me, but setroubleshootd isn't running on my laptop by default, and I can't see where it's supposed to start.  When speech-dispatcher seems broken for a few months, I'd like to know that it's trying to emit audio but that the volume on its channel is muted with PulseAudio.  Sigh.

2012-08-15

[Technology] Transient Nausea


That sinking feeling when you notice Evolution is sending out mail that was supposed to go out over a year ago and you frantically try to "killall evolution sendmail" and disconnect in the hopes of avoiding disaster. O_O





[Technology] Double the factors, double the authentication, double mint





Awkward commercial concepts from the 80s. 



Today I enabled two-factor authentication for logging into Google.  I've been reluctant to because it feels a little overly complicated for what they're trying to achieve, but I had an issue with people accessing my account in the past, so I might as well try to be more secure for the future.  The idea is that you have your password and separate code to log in.  Your password you remember, the code is something Google gives you, generally by your phone.  The code expires after use (but you can let a machine/browser be trusted after using a code, so you won't need a code on it again), so someone would have to be able to get a new code to crack into your account.  The code is typically sent to you through a phone (they can even give it to you via a voice call to a landline instead of a text message to your phone).



One problem of course is that a lot of applications don't support it.  To that end, you can request unique passwords for each application that needs to authenticate to Google.  That has been the most annoying part.  As soon as I changed to two-factor authentication, three different applications popped up password dialogues on my machine complaining that the old one didn't work.  I presume I'll be generating one-time passwords for a little while now, but for now I have Empathy, Evolution Calendar and Evolution Mail working again.  I can finally send mail from my desktop again (broken for like a year), and for now, Empathy seems to not be randomly refusing to connect any more (only started with Fedora 17, but I think that was a problem with GNOME Keyring and old passwords saved there).

2012-08-14

[GNOME] GSOC, GNOME Documents/Tracker, and Tablets

GSOC "Pencils Down": GObject Serialization with GXml



Yesterday was pencil's down (joke with friends of yesterday: What's a pencil?  Is that like a stylus? O_O).  I pushed the changes I'd been working on.  It was a bit of a wrestling match with automake trying to get my devhelp pages to successfully generate via valadoc, but I prevailed in the end.  A hearty thanks goes to the Folks developers and Philip Withnall who have essentially been the template I followed.  In the end, the biggest obstacles seem silly in retrospect, though.  Sigh. I want to write up a quick guide for future people after my semester ends.  I want to do a lot of things.



Also, deserialisation handles multiple references to the same original object correctly now, hooray!  There is one issue with it in some cases, where there might be an ID collision on the serialised objects.  I have a few ideas for solutions, but for now, that's it.



I have work to push on automatically serialising collections, but it's a bit too buggy right now.  If I can't finish it this week, I'll put it in a branch and push that.



GNOME Documents and Tracker



Sam Thursfield the other day asked if I could try Tracker 0.14.2, after I noted that Tracker's subjective impact on interactivity was preventing me from using GNOME Documents.  I found a package in Fedora's koji for 0.14.2 (after vainly trying to install git to ~/.local/; I gave up on trying to get tracker to load from ~/.local/libexec/).  I'm not sure if it's any better?



It initially stalled twice.  (0.14.1 was stalling while mining the file system sometimes, according to tracker-control.)  The first time was just when it started, it got 2% of my file system done and just never progressed beyond that.  No CPU activity, though.  I restarted, and it made some more progress.  I then tried to preview a file it had indexed, and LibreOffice document, and then resulted in soffice consuming all my CPU for over 5 minutes before I killed it.  tracker-control indicated no further progress for a while, so I restarted again.   I don't feel I have enough reproducible information from either instance to file a bug, sadly.



It's been going for over an hour now.  Performance on my desktop is intermittently laggy while it runs while I'm trying to interact with it, sadly, but I think it's better than it used to be over a year ago?  It was slowing down my system for a while when I started using my browser and a terminal 15 minutes ago, but after about 5 minutes of sluggishness, it seems to have backed off, though still using a very small amount of CPU.  I hope it hasn't stalled again.  I will let it finish its initial indexing and then monitor its behaviour after that to see whether I can live with it turned on.  Heavy I/O and CPU use while I'm trying to interact will be a big no-no.



UPDATE: one of the issues seems to be large memory usage causing programs I'm interacting with (e.g. Firefox) to have to swap a lot.  I have 2GB RAM.  Hopefully when it's done it's initial indexing, that won't happen.



Can anyone else comment on Tracker 0.14.2 and up, and their experience with interactive performance while it's running?



GNOME on Tablets


"No auto-rotate, no swipe to scroll, no two-finger zoom or resize aren't
issues.

The real and only issue is that no part of GNOME is better on a tablet
than iOS or Android. So the issues you pointed out are really non-issues
since the product, by design, isn't a good one [for this form factor]."

This is a comment on my previous post about testing GNOME on my tablet.  I find it a bit weird.  Despite all the ways in which GNOME is not yet great for a tablet, there are several things I already prefer about it.  One is having a completely Free software stack operating my machine.  Another is familiar software and features.  Another is that by having a desktop-background, its applications have options and features available that aren't provided on other tablet systems and their apps that simplify UIs beyond what GNOME does even in 3.x; I don't have to compromise functionality.  I'm not sure, but do other tablets have things like user switching yet?  I also like having normal control of the system underneath, even if I have to use a terminal to access it: it makes running sshd and rsync a lot easier.



A nice thing about GNOME is its design can evolve and adapt.  GNOME 3 is much more touch-friendly than GNOME 2 was.  Having always used tablet PCs (the stylus variety) for laptops, I like having direct interaction with the screen, and look forward to many touch-enabled computers in the future.  A lot of the considerations that would go into making GNOME on a tablet a more enjoyable experience wouldn't subtract from using GNOME on a laptop, so I think the noted deficits are valid issues.



So, why should GNOME not be nicer to run on tablets?



2012-08-13

[GNOME] Tablet support testing

Hello Planet GNOME, and in particular those interested in seeing GNOME be tablet-friendly.  I have a question for you:




Is there any part of GNOME you'd like me to test on a tablet?



It occurred to me that I happen to have a development tablet that I could install GNOME on to and test software on, so I did (Fedora 17).  Initial issues have been:


  • no auto rotate.  Perhaps my device lacks a sensor for orientation, though.

  • no swipe to scroll

  • no two-finger zoom or resize


I kind of expected the above.  Here are some parts I thought would work, though, but didn't


  • after manually rotating the screen, the touch cursor gets confused so where I touch is no longer synced up with where the cursor goes.   I touch the top-left in portrait mode, and it goes to the top-left if it was in landscape.

  • clicks are weird.  I can successfully click many things on the interface and have them respond, but not folders in nautilus or buttons in Rhythmbox (UPDATE: sometimes they do, sometimes they don't).  A USB mouse works, though.

  • the on-screen keyboard will pop up when you focus a text field, but when a number of apps open, they have a text-field focused by default, resulting in the keyboard popping up, like System Settings.

  • display off after N minutes doesn't actually turn off the display (like "$ xset s activate" does but just gives it a black overlay) (NEW)

  • lock screen doesn't let you bring up the on-screen keyboard (I think that's fixed in a GSOC project this year though :D) (NEW)

  • on-screen keyboard has no arrow-keys (so trying to use it for a terminal where you want to navigate it's history is hard) (NEW)

  • the on-screen keyboard currently wants presses/mouse clicks
    to be exactly within a key, let alone on the right key.  It would be
    nice if it could accept presses next to the key nearest, or even get
    some intelligence. (NEW)


I'll try to file bugs for these next week.  (This week is too busy with the end of school and GSOC. :D)  I just thought I'd mention this so far and offer to test things while it was fresh in my  mind.

2012-08-08

[Technology] Autonomous vehicles

The future is nigh!


  • simTD networks cars and not-cars, sharing data to increase automobile awareness and hopefully reduce accidents.  In Frankfurt, Germany with 120 vehicles from different brands.

  • EU says that by November 2013, cars have to have autonomous breaking.  I wonder how they're dealing with liability when it causes a problem?  Requiring cars to have it so soon is a fascinating proposition.

  • Google expands their self-driving car project, with Googlers now to use going between home and work without a buddy in the car.  Also, adding a new model of car, and acknowledging the need to try out snow.


I look forward to self-driving cars.  My goal had been once to avoid driving in my life time.  I dislike its impact on the environment, car culture, the expense of car ownership, etc.  I'm actually in the process of getting my license, mostly because I don't want to be stranded if my father falls ill and I need to somehow visit him.  However, I still think of autonomous vehicles as helping address some of my issues.  Can we get an efficient network of pod cars that encourage car sharing, to reduce the inefficiency of per-family vehicles?  Intelligent driving to reduce accidents and marginally improve efficiency?  Make them naturally safer so we can reduce the cost of cars themselves and insurance?



I want one shaped as pumpkin.

2012-08-07

[GNOME] My proceedings of GUADEC 2012

As you may have noticed, I attended GUADEC 2012, the GNOME Users And Developers European Conference, in A Coruña, Spain, over the last couple of weeks.  This is my second GNOME Conference, after attending the Desktop Summit in Berlin last year.




Thank you GNOME for helping me get there

Talking

 

As mentioned in my GXml Serialization update last week, I got to give a lightning talk about my project.  My favourite part about that was having two developers approach me on the last day and give me ideas on possible users for my library.



Listening



Unfortunately, due to a delayed flight, I ended up missing most of the first of the conference.  This is unfortunate, as I was looking forward to the following missed talks


  • Xan Lopez and Juan José Sánchez Penas' talk "A bright future for GNOME" 

  • Debarshi Ray's talk "GNOME Online Accounts: for users and hackers".

  • Federico Mena Quintero's talk "Desktop systems based on Gnome technologies"


I look forward to when the videos are uploaded.  There were other talks I would have liked to go to, too, but these were the ones that felt more controversial to me and more important to have clarified.  (I have issues with how GOA is implemented, for instance, which I got to discuss with others there.)



Now for some notes on actual talks I found memory (or unmemorable),


  • "Beyond dead reckoning":
    I actually only stayed for the beginning and the end; while GNOME design is a popular topic right now, the presenters seemed a little ... tired, so I took the opportunity to catch another talk of personal interest on OCR...

  • Joaquim Rocha's "OCRFeeder: OCR Made Easy on GNOME":
    this was pleasant to see one of the more complex features you might want on a desktop available.  It was mostly a demonstration of what was currently possible. I'd be happy if it was seamlessly integrated into my scanning and image viewing experience (it would be great if I could go from Shotwell photo manager and scan text in an image I took).

  • Lennart Poettering's "The UI and the OS":
    This ties for my favourite talk of the conference, as did Lennart's talk last year.  I appreciate it for its grand technical vision of the future driving the lower levels into a state that makes the desktop-level much simpler, secure, efficient, etc.  My favourite idea is adding the concept of an application to the kernel which will be useful to things like GNOME Online Accounts (and hopefully resolve my problem with it) among others.

  • Cosimo Cecchi's "Documents - one year after":
    I wrote previously about Documents and problems I was having with it, and Meg Ford's reply to that post was very welcome and helpful.  This talk also highlighted what my problem had been: Documents' local functionality is dependent on Tracker running and Tracker causes notable subjective performance loss when running.  It is unable to stay out of my way, and so it ends up disabled, and Documents becomes completely useless.  Hopefully, Tracker will one day be able to address its issues and I'll be able to actually use Documents.

  • Yorba's keynote "Crowdfunding GNOME Application Development":
    This concerned various possible fund raising models for app development.  Yorba wants to spend more time working on GNOME apps and less time working on contract work needed to fund the GNOME work.  I find funding open source a bit difficult, because if you do it at a high level, it's hard to tell where the money should be allocated (to apps, to subsystems, etc).  In some ways I think it's better to let fund raising be done per module, but I don't think we have a large enough community to pull off something like KickStarter's level of funding.  Hmm.

  • Philip Withnall's "Folks of the future: more contacts everywhere":
    This talk highlighted one of my problems with folks: that it mostly just aggregates contacts from other services rather than syncing and modifying them.  However, I've enjoyed following folks as an example of a good vala library, which has been useful to my own project.

  • Owen Taylor's "Smooth animations for applications":
    This was pretty to watch, though in the end it seemed the benefits would not be quite as revolutionary as I had hoped when it started.  It was great to learn more about how the UI is rendered and where its latency and lag comes from.  I had at one moment hoped it would address the inability of GNOME Shell to extend the width of my two monitors while GNOME Panel+metacity can.  Sigh.

  • Jean-François Fortin Tam's "PiTiVi and the GStreamer Editing Services: state of the onion":
    This talk tied with Poettering's talk for my favourite.  PiTiVi is an application I'd really like to use, but I've yet to successfully edit a video with it, even trying to accomplish relatively simple tasks.  Half of the problems I've attributed to it being written in Python, in that I get TypeErrors about None types when I click buttons because code changed once and some variable that no longer exists is still being referenced, problems static compilation catches.  I'll try to be quite thorough in filing bugs the next time I attempt to use it.  There appears to be a wonderful amount of improvements (including GES in C) so hopefully the next released version will be the start of something beautiful for me and PiTiVi.

  • GNOME's keynote "The History of GNOME":
    This was wonderful to watch.  It was weird learning about things I didn't know, and then having the talk reach the point where I started following GNOME, and then hear much-the-same view I had of events over the past ... almost a decade!


Working



In getting to interact directly with other developers, I also discovered new things about GtkDoc, Valadoc, and automake that let me spend some time on my project making things Work the way I originally wanted to.



Collaborating



My favourite part has to be the people.  I got to meet a lot of people I met last year, better acquaint myself with some, and meet new people.  One of the best parts was learning how GNOME mattered to others and what they wanted out of it.  There were a lot of conflicting visions going around, but lots of enthusiasm for GNOME.  I hear that's how it is every year.



The Venue and A Coruña



The organising team did an amazing job.  I only have the Desktop Summit 2011 to compare it too, which was good, but this was amazing.  I really appreciated the care that went into looking after my vegan dietary requirements, even though there was some comic confusion with language barriers.  I felt a bit bad for not learning more Spanish before arriving, to which my friend Ed has replied, "Don't feel bad -- I didn't learn any Australian before leaving for Australia."



The organised accommodations and the university were great.  Internet was available (unlike last year) and there was a lot of space to collaborate and to conspire with others over bananas.



Also, the social activities were reasonable and enjoyable, though the attempt to give a value-added experience to the professionals may need some fine tuning (note: I was not a professional, I just heard that a separate cocktail event ultimately didn't seem like the best idea). 



GNOME



The future is always a bit scary but promising.  Sponsors come and go, the market and users' needs change.  However, being at GUADEC proves to me that these are my people, and where they go, I must follow.  It's one of the best things in the world, to be with a group of people who also value quality, excellence, and good ideas, so positively and with such great encouragement.



See you next year!

2012-08-02

[GNOME] GXml Serialisation update

As Daniel Siegel kindly pointed out to me in person a couple hours ago, I've missed an update last week.  That's because I was busy preparing for GUADEC, the GNOME Users and Developers European Conference, in A Coruña, Spain this past week.  I'll write about the conference separately, but now I'll give an update on the current status of GXml.  


  • Gave a 3-minute lightning talk about GXml Serialisation at GUADEC


  • The namespace has changed from GXmlDom to GXml.  Last year it was GXml.Dom.  This should make it more appealing just for writing.  Most of the DOM classes don't conflict with future GXml plans for SAX or XPath.  This also let me change GXmlDom.XNode to GXml.DomNode.  (It's not simply Node because higher level languages will get namespace conflicts with GNode in GLib.

  • Speaking with Philip Withnall gave me a basis to use Valadoc after all and still generate GtkDocs.  I'm following libfolks' autotool magic to manage this.  It's not particularly esoteric, but I'm no autotools master.


    • Speaking of which, the GXmlSerialization class and the GXmlSerializable interface are both well documented now.


  • A solution was picked to deal with multiple references to the same object when serialising.  It's the simple obvious solution: assign objects a deterministic ID as they're serialised, and let references after the first one just refer to it.  That lets us easily deserialise it without erroneously duplicating objects and separating their references.

  • I've spoken with developers who want to use it for data storage on disk.  I also received recommendations for systems to try to port to it.  Someone suggested GNote, but I believe they're trying to stay compatible with Tomboy.  I have to look into what their current situation is.  If you're involved in software that currently manages saving data to disk in XML (or something uglier than json) by itself, and would like to rely on something clean and simple, let me know, and I can prototype a patch and make sure your usage case is taken into account as I stabilise serialisation.

  • Support for automatic serialisation of collections is coming along.  Someone asked me to supported GBoxed types like json-glib does, so I will pursue that too.


[Technology] Two wishes


  1. A better web site creation solution from Google.  They currently have two partial solutions that overlap with Google Sites and Blogger.  Both cater to different audiences but both incorporate reduced functionality of the other.  Sites has simple blog-like features that Blogger does better, and Blogger offers better control over aesthetics.  Blogger's ability to host static pages is more limited, though.


    1. Then perhaps I could embed Google Docs into my blog posts like you can with Sites (yeah, browsing a presentation or spreadsheet directly within the post, no plug in necessary: that's some beautiful integration).


  2. That Google Drive could upload ODP (OpenDocument Presentations) and convert them to Google Docs Presentations.


As a fellow conspirator just said, the obvious solution is to deploy or build my own platform.  Sigh.

Blog Archive

Dieses Blog durchsuchen

Labels

#Technology #GNOME gnome gxml fedora bugs linux vala google #General firefox gsoc security GUADEC android bug xml fedora 18 libxml2 programming web blogger encryption fedora 17 gdom javascript git libgdata memory mozilla open source serialisation upgrade API Spain design evolution fedora 16 fedora 20 fedora 22 fedup file systems friends future glib gnome shell internet luks music performance phone photos preupgrade tablet testing web development yum #Microblog Network Manager adb art automation bash brno catastrophe css data loss deja-dup disaster emacs emusic errors ext4 facebook fedora 19 gee gir gitorious gmail gobject google talk google+ html libxml mail microsoft mtp namespaces nautilus php picasaweb ptp resizing rpm school selinux sms speech dispatcher technology texting time management uoguelph usability video web design youtube #Tech Air Canada C Empathy Europe GError GNOME 3 GNOME Files Go Google Play Music Grimes IRC Mac OS X Mario Kart Memento Nintendo Nintendo Switch PEAP Selenium Splatoon UI VPN Xiki accessibility advertising ai albums anaconda anonymity apache apple ask asus eee top automake autonomous automobiles b43 backup battery berlin bit rot broadcom browsers browsing canada canadian english cars chrome clarity comments communication compiler complaints computer computers configuration console constructive criticism customisation dataloss dconf debug symbols debugging design patterns desktop summit development discoverability distribution diy dnf documentation drm duplicity e-mail efficiency email english environment estate experimenting ext3 fedora 11 festival file formats flac forgottotagit freedom friendship fuse galaxy nexus gay rights gdb german germany gimp gio gitlab gjs gnome software gnome-control-center google assistant google calendar google chrome google hangouts google reader gqe graphviz growth gtest gtg gtk gvfs gvfs metadata hard drive hard drives hardware help hp humour identity instagram installation instant messaging integration intel interactivity introspection jabber java java 13 jobs kernel keyboard language languages law learning lenovo letsencrypt libreoffice librpm life livecd liveusb login macbook maintainership mario memory leaks messaging mounting mouse mysql netflix new zealand nodelist numix obama ogg oggenc oh the humanity open open standards openoffice optimisation organisation package management packagekit paint shedding parallelism pdo perl pipelight pitivi privacy productivity progress progressive web apps pumpkin pwa python quality recursion redhat refactoring repairs report rhythmbox scheduling screenshots self-navigating car shell signal sleep smartphones software software engineering speed sql ssd synergy systemd tabs test tests themes thesis tracker travel triumf turtles tv tweak twist university update usb user experience valadoc volunteering vpnc waf warm wayland weather web apps website wifi wiki wireless wishes work xinput xmpp xorg xpath
Powered by Blogger.