May 04, 2016

The Hatch Act, such as it is, makes it difficult for me to say much about politics under disability of being a federal civil servant in the United States. I can say that recent political wrangling at the federal level has resulted in many co-workers talking about running away from the current posts to seek duty stations abroad or private sector work abroad. Regardless of their political affiliation, many mandarins are not exactly looking forward to what is to come based upon the current political news.

For a while there has been development of an "Abandon Ship!" plan. Prior versions of this included myself and more than few co-workers seeking to leave the federal civil service. Time has passed and some people managed to carry out their parts of the plan on their own by moving onward and upward.

With some of the lunatic things being tossed about today concerning the death of former US President John F. Kennedy piled on top of other madness over the past eight months, I've come to the point of having to accelerate the single-person version of the "Abandon Ship!" plan. I've written and conducted research in information science and information policy. After putting together a two year program of work, I think it is time to return to that instead of helping move the federal bureaucracy forward.

A fundraising effort via Indiegogo's "Generosity" platform has been set up. Considering the cost for two years of operations, the need to lease office space and pay for the overhead of that since municipal laws say I cannot work from home, regulatory compliance costs such as taxes, and hardware acquisition it isn't really a lot of money. I would not be a rich man from this.

What's the Ubuntu angle? For fans of The Big Bang Theory, they might remember the episode in which Howard, Leonard, and Sheldon try to patent an invention. Howard gets shot down as he is a federal civil servant from NASA on a loan back arrangement to the school so the government owns his intellectual property developed or thought of while on-duty. Simply avoiding my massive commute to and from my "Post of Duty" would leave me more time to make contributions before even getting to who controls my IP output.

on May 04, 2016 06:00 AM

May 03, 2016

Sorry for the short notice, but I’m happy to announce that the Ubuntu Membership Board will be hosting a “meet and greet” session at the UOS this week.  We encourage these who seek out getting their membership to come with questions and drafts of your Ubuntu Wiki page .  At least two of the board members will be there and ready to help.  The session is on Thursday at 16:00 – 16:55 UTC .

See you there!

EDIT TO ADD:  It’s a text-based only session.

on May 03, 2016 01:51 PM

We made a tech preview release of KDE neon User Edition 10 days ago and I made up a survey to get results for how people’s experiences were.  We got 59 responses, here’s a summary:

Location?

Most people from Europe, a number from the US, the rest spread around the usual parts of the world.

How did you make the installable drive/disk?

First past the post is people who used a Virtual Machine, sensible enough for a testing release.

Next is ROSA which I discovered recently and seems to work on most OSes.  Then people who use dd and risk wiping out their hard disk with a 1 letter typo.  Surprisingly there are still people who write to a DVD to install, I’ve no idea why.

In the other category is:
rufus (Windows only)
usb-image-creator (Ubuntu only)
suse imagewriter (unmaintained)
gnome multiwriter (Linux only and why would you want to write multiple at once?)
using: sudo cp neon-useredition-20160426-1028-amd64.iso /dev/sdb + sync (err, does this even work?)

Problems which occurred during booting of the live system

no problems for most

several people reported the black bar in the isolinux/syslinux theme.  these themes are spooky voodoo.

people commented on UEFI not being supported, UEFI is even more spooky voodoo and secureboot is evil voodoo.

“The GRUB splash is practically blank. Pressing the arrow keys opened a dropdown list for language selection. Then I pressed the Esc key to get to the GRUB splash. The “Install” option isn’t any different from the “Try without installing” option.”

“Select the language Spanish, and half the options were translated.”

Problems which occurred running the live system

Lots of “none” here too.  Mostly querying the lack of applications, that’s a feature for now, we’ll add apps soon.

“klipper in menu? Im-config in menu? Panel icons wrong size/blurry”

“Upon mouse click in kicker panel consistently resulted in black screen with no recovery. Possible issue with Plasma 6 and AMD GPUs.”

“Baloo crashed immediately (notification in system tray), but did not seem to affect system function.”

Problems which occurred running the installer

‘The “Continue” button is available even after all the steps.’

“You do not ship with open-vm-tools-desktop, so my virtual desktop was smaller than the Ubiquity window”

“the installer was unable to install some packages: (although the provided list was blank), so i couldn’t install the system”

“Does not recognize UEFI partitions/System. Only legacy boot possible.”

“1. On the second page of the installer is a non replaced variable: “$(RELEASE)” 2. While installing there is no teaser how awesome kde is :-), just a blank page.”

‘Text “$(RELASE)” is displayed in german version of “Download updates while installing neon” * Checkbox “Download updates while installing neon” cannot be checked’

“Can’t continue installation in second step (prepare) due continue button is non-functional. Improvement: Install-Program should be in favorites”

There’s bugs in here that come from Ubuntu and bugs that come from not having various bits installed.  I don’t think there’s much point spending much time on this as I expect to change to Calamares soon.

Problems which occurred on the installed system:

Quite a few without problems

Lots complain about missing icons, this is a cache issue “On the kicker menu, there were no icons, but they appeared after a re-boot.” we’ve fixed this, I hope.

“Can not start system, just weird colors after install. ”

“After install of guest additions on VirtualBox desktop panel would load but then disappear.”

“Wanted to install it on dualboot with win 10. Grub does not appear so I cannot boot kde neon which I prefere as primary OS.”

“got a grub shell after install”

“Text garbage on the light blue loading screen after the GRUB menu.”

“if a display goes to sleep plasma partly crashes (same happens on kubuntu) it’s a qt problem as far as i know”

“Illegible characters till NVIDIA driver loaded ”

“Unable to use software-properties-kde : Error: could not find a distribution template for neon/xenial” (known bug this one)

“System boots to console login prompt. X can be started after login. ”

Problems which occurred when installing new software

“Plasma Discover crashed” I have this too and it’s a priority to look into

“There was a problem installing kde-l10n because of conflict with plasma-desktop-data”
Problems which occurred when updating the system to latest packages:

No problems for most people but some issues:

  • The updater applet didn’t seem to work for some reason. Had to use Discover.
  • * First boot after “apt-get update” and “upgrade”: the system boots to graphical login screen, but after login only the “x” pointer ist visible. –> Hard reset
  • * After reboot only console login is visbile, X does not start “Timeout locking .Xauthority”
  • Could not find repos
  • ANOTHER – using Discover, added Gwenview – it installed but closed Discover on completion?

Thanks a lot to everyone who tested and gave feedback.  That gives me a good idea of the priority areas to work on.  Keep on testing and reporting bugs and of course any help welcome :)

 

facebooktwittergoogle_pluslinkedinby feather
on May 03, 2016 11:27 AM

April’s reading list

Canonical Design Team

Here are the best links shared by the design team over the last month:

  1. Framer – Design tool for creating interactive designs, interfaces and animations
  2. Cinematic Continuity in User Interface Design
  3. The Design Issue 2016 – Bloomberg Businessweek
  4. Improving your UX and UI with phantom guides
  5. Still thinking you don’t need HTTPS?
  6. Your kids might live on Mars. Here’s how they’ll survive
  7. Clarity. A conference about style guides and design systems
  8. Best Front-end frameworks to try in 2016
  9. Welcome to the Invisible Revolution
  10. Bruce Springsteen singing Purple Rain to honor Prince
  11. The Making of “The Aviator”: Animating a Basic 3D Scene with Three.js
  12. A revolutionary new way to access all your files
  13. Magic happens with the Ubuntu tablet

Thank you to Andrea, Barry, Femma, James, Jamie, Joe, Luca, Richard and Robin for the links this month!

on May 03, 2016 09:38 AM

My monthly report covers a large part of what I have been doing in the free software world. I write it for my donators (thanks to them!) but also for the wider Debian community because it can give ideas to newcomers and it’s one of the best ways to find volunteers to work with me on projects that matter to me.

Debian LTS

I handled a new LTS sponsor that wanted to see wheezy keep supporting armel and armhf. This was not part of our initial plans (set during last Debconf) and I thus mailed all teams that were impacted if we were to collectively decide that it was OK to support those architectures. While I was hoping to get a clear answer rather quickly, it turns out that we never managed to get an answer to the question from all parties. Instead the discussion drifted on the more general topic of how we handle sponsorship/funding in the LTS project.

Fortunately, the buildd maintainers said they were OK with this and the ftpmasters had no objections, and they both implicitly enacted the decision: Ansgar Burchardt kept the armel/armhf architectures in the wheezy/updates suite when he handled the switch to the LTS team, and Aurélien Jarno also configured wanna-build to keep building armel/armhf for the suite. The DSA team did not confirm that this change was not interfering with one of their plans to decommission some hardware. Build daemons are a shared resource anyway and a single server is likely to handle builds for multiple releases.

DebConf 16

This month I registered for DebConf 16 and submitted multiple talk/BoF proposals:

  • Kali Linux’s Experience of a Debian Derivative Based on Testing (Talk)
  • 2 Years of Work of Paid Contributors in the Debian LTS Project (Talk)
  • Using Debian Money to Fund Debian Projects (BoF)

I want to share the setup we use in Kali as it can be useful for other derivatives and also for Debian itself to help smooth the relationship with derivatives.

I also want to open again the debate on the usage of money within Debian. It’s a hard topic but we should really strive to take some official position on what’s possible and what’s not possible. With Debian LTS and its sponsorship we have seen that we can use money to some extent without hurting the Debian project as a whole. Can this be transposed to other teams or projects? What are the limits? Can we define a framework and clear rules? I expect the discussion to be very interesting in the BoF. Mehdi Dogguy has agreed to handle this BoF with me.

Packaging

Django. I uploaded 1.8.12 to jessie-backports and 1.9.5 to unstable. I filed two upstream bugs (26473 and 26474) for two problems spotted by lintian.

Unfortunately, when I wanted to upload it to unstable, the test suite did not ran. I pinned this down to a sqlite regression. Chris Lamb filed #820225 and I contacted the SQLite and Django upstream developers by email to point them to this issue. I helped the SQLite upstream author (Richard Hipp) to reproduce the issue and he was quick to provide a patch which landed in 3.12.1.

Later in the month I made another upload to fix an upgrade bug (#821789).

GNOME 3.20. As for each new version, I updated gnome-shell-timer to ensure it works with the new GNOME. This time I spent a bit more time to fix a regression (805347) that dates back to a while and that would never be fixed otherwise since the upstream author orphaned this extension (as he no longer uses GNOME).

I have also been bitten by display problems where accented characters would be displayed below the character that follows. With the help of members of the GNOME team, we found out that this was a problem specific to the cantarell font and was only triggered with Harfbuzz 1.2. This is tracked in Debian with #822682 on harfbuzz and #822762 in fonts-cantarell. There’s a new upstream release (with the fix) ready to be packaged but unfortunately it is blocked by the lack of a recent fontforge in Debian. I thus mailed debian-mentors in the hope to find volunteers to help the pkg-fonts team to package a newer version…

Misc Debian/Kali work

Distro Tracker. I started to mentor Vladimir Likic who contacted me because he wants to contribute to Distro Tracker. I helped him to setup his development environment and we fixed a few issues in the process.

Bug reports. I filed many bug reports, most of them due to my work on Kali:

  • #820288: a request to keep the wordpress package installable in older releases (due to renaming of many php packages)
  • #820660: request support of by-hash indices in reprepro
  • #820867: possibility to apply overrides on already installed packages in reprepro
  • #821070: jessie to stretch upgrade problem with samba-vfs-modules
  • #822157: python-future hides and breaks python-configparser
  • #822669: dh_installinit inserts useless autoscript for System V init script when package doesn’t contain any
  • #822670: dh-systemd should be merged into debhelper, we have systemd by default and debhelper should have proper support for it by default

I also investigated #819958 that was affecting testing since it has been reported to Kali as well. And I made an NMU of dh-make-golang to fix #819472 that I reported earlier.

Thanks

See you next month for a new summary of my activities.

No comment | Liked this article? Click here. | My blog is Flattr-enabled.

on May 03, 2016 07:13 AM

Welcome to the Ubuntu Weekly Newsletter. This is issue #464 for the week April 25 – May 1, 2016, and the full version is available here.

In this issue we cover:

The issue of The Ubuntu Weekly Newsletter is brought to you by:

  • Elizabeth K. Joseph
  • Simon Quigley
  • Chris Guiver
  • Chris Sirrs
  • And many others

If you have a story idea for the Weekly Newsletter, join the Ubuntu News Team mailing list and submit it. Ideas can also be added to the wiki!

Except where otherwise noted, content in this issue is licensed under a Creative Commons Attribution 3.0 License BY SA Creative Commons License

on May 03, 2016 01:39 AM

May 02, 2016

Welcome to this second article in the "Reordering a Qt Quick ListView via drag'n'drop" series. If you haven't read it already, I suggest you start with the first article.

In this article we are going to add a handy feature to our ListView: the ability to automatically scroll the ListView when dragging an item to its top or bottom edge. This is nice when you want to drag an item to a place which is not currently visible.

Here is this new behavior in action:

Drag scrolling

We are going to implement this by using the MouseArea of the DraggableItem introduced in the first article. When the mouse cursor in this MouseArea is close enough to the borders of the ListView we will trigger scrolling animations. This is a bit less elegant than adding MouseAreas at the top and bottom of the ListView, but has the nice advantage of not requiring any change in the ListView.

The first thing we are going to do is add a few properties to our component:

// Size of the area at the top and bottom of the list where drag-scrolling happens
property int scrollEdgeSize: 6

// Internal: set to -1 when drag-scrolling up and 1 when drag-scrolling down
property int _scrollingDirection: 0

// Internal: shortcut to access the attached ListView from everywhere.
// Shorter than root.ListView.view
property ListView _listView: ListView.view

Now we can declare two animations to scroll the list:

SmoothedAnimation {
    id: upAnimation
    target: _listView
    property: "contentY"
    to: 0
    running: _scrollingDirection == -1
}

SmoothedAnimation {
    id: downAnimation
    target: _listView
    property: "contentY"
    to: _listView.contentHeight - _listView.height
    running: _scrollingDirection == 1
}

These two animations operate on the ListView and will make it scroll by animating its contentY property, depending on the value of _scrollingDirection. All that remain is to update _scrollingDirection when dragging to the top or bottom edge of the ListView. We do this by changing the binding of scrollingDirection when we enter the "dragging" state:

_scrollingDirection: {
    var yCoord = _listView.mapFromItem(dragArea, 0, dragArea.mouseY).y;
    if (yCoord < scrollEdgeSize) {
        -1;
    } else if (yCoord > _listView.height - scrollEdgeSize) {
        1;
    } else {
        0;
    }
}

Here we define a complex expression for scrollingDirection: first we compute the y coordinate relative to the ListView. Then we check its value to see if we are on either the top or bottom edge, and update the value accordingly.

We can now scroll the ListView by dragging items to its top or bottom edge. You might notice an annoying bug though: when you drop an item below the last item the dropped item does not become visible. To workaround this, we need a little hack: once the ListView has moved the dropped item at its final position, we can call the ListView.positionViewAtIndex() method to ensure our item is visible. The trick is, even if the code connected to the moveItemRequested moves the Item synchronously, we cannot call positionViewAtIndex right after the signal has been emitted: we need to wait until the ListView has actually adjusted itself after the move. To do so, we can use a Timer object to delay the call to positionViewAtIndex. This is what emitMoveItemRequested now looks like:

function emitMoveItemRequested() {
    var dropArea = contentItemWrapper.Drag.target;
    if (!dropArea) {
        return;
    }
    var dropIndex = dropArea.dropIndex;
    if (model.index < dropIndex) {
        dropIndex--;
    }
    if (model.index === dropIndex) {
        return;
    }
    root.moveItemRequested(model.index, dropIndex);
    makeDroppedItemVisibleTimer.start();
}

And this is our Timer:

Timer {
    id: makeDroppedItemVisibleTimer
    interval: 0
    onTriggered: {
        _listView.positionViewAtIndex(model.index, ListView.Contain);
    }
}

An interval of 0 means the timer will be triggered as soon as we are back to the event loop. Note that this only works because in our example the code connected to the DraggableItem.moveItemRequested signal is synchronous: it does not delay the move of the dropped item. If the code were asynchronous, you would have to find a way to call ListView.positionViewAtIndex after the move is done, which most likely would require calling it outside of DraggableItem.

We are done with drag-scrolling, the user can now scroll long lists to find the place to drop the dragged item. The source code for this article is available in the associated GitHub repository, under the "2-drag-scroll" tag.

on May 02, 2016 05:52 PM
Mi primer post desde una tablet con Ubuntu, la bq M10.

M10
Podría hablar de su hardware o de sus especificaciones, podría decir su precio, podría contar cuantas versiones hay de la tablet, podría especificar la versión de cada aplicación, podría contar qué es la convergencia...
Pero toda esa información está disponible en Internet desde que salió al mercado. Por lo que mejor os cuento la experiencia de usar una tablet con Ubuntu durante un par de semanas ;)

¿Mi escritorio? No ;)
Primer punto que quiero aclarar: no me gustan las tablets. Prefiero mil veces la precisión del teclado y ratón.

Segundo punto: adoro Ubuntu Phone. Cuando estoy AFK sigo disponiendo de un autentico Ubuntu en mi bolsillo.

Tercer punto: No tengo monitores con entrada HDMI, por lo que la convergencia que puedo esperar es la basada en la futura Miracast.



Centrémonos en la tablet del mercado que mas se asemeja a un SO real de escritorio.

El sistema operativo es Ubuntu, pero Ubuntu Touch con Unity 8, no el Unity 7 del escritorio actual.

¡Legendario! :)
Dicho esto, las aplicaciones son las mismas que las del móvil, pero sorpresa, están preinstaladas unas cuantas como LibreOffice, GIMP, Gedit, Firefox, XChat...
Lo mejor es que son aplicaciones reales que con teclado y ratón se comportan como tal. Lo malo es que no es fácil instalar otras aplicaciones de escritorio (llamadas legacy). Tengo entendido que a corto plazo, se podrá, y entonces la tablet ganara muchos enteros.

Mientras tanto, yo no uso LibreOffice, GIMP esporádicamente, Gedit nunca y al final lo que tengo es un móvil de 10", es decir, poco útil y productivo para mi uso diario.

Pero lo que para mi es malo, para otros es la perfección. Conozco profesores y alumnos para los que esta tablet es perfecta: Con su 1/2kg de peso es muy portable, su tarea principal es usar LibreOffice y les permite trabajar con el mismo dispositivo en casa, en la escuela e incluso proyectar presentaciones. Sin duda, ante esas necesidades, sólo esta tablet o un ultrabook carísimo cubriría esa casuística.
El potencial nicho de mercado es muy grande.

La tablet que estoy probando es la FHD, al igual que los móviles con Ubuntu de mucha resolución de pantalla tiene un pequeño lag incómodo.

Choosing app

bq M10 se maneja igual que un bq E4.5 Ubuntu Edition en todos los sentidos. Si conectamos un ratón por Bluetooth se transforma en modo ventana, con Unity mostrándose al acercar el ratón. Podemos minimizar, maximizar, mover, anclar ventanas... realmente aparenta un Ubuntu de escritorio y es aquí donde Ubuntu Touch gana enteros.

keyboard + mouse = PC

Respecto a la convergencia, como comenté, yo no dispongo de monitores HDMI. Si tú sí tienes, puedes trabajar de varios modos:

  • Táctil como cualquier otra tablet.
  • Añadirle teclado y ratón y tener un pequeño netbook.
  • Añadirle teclado y ratón y conectarla por HDMI a un monitor y tener un PC, siendo la tablet la CPU.
Convergencia :))

    La batería dura unas ~8 horas trabajando.

    En modo ventana (con ratón conectado) todas las aplicaciones corren a la vez con multitarea real. En modo touch, sólo está en ejecución la que está en primer plano.

    ¿¿Netbook??

    Es una pasada usarla con el teclado, podemos copiar, pegar (incluso entre aplicaciones), cambiar de aplicación con Alt+Tab, Win+número para seleccionar aplicación en Unity... etc.

    Dispone de un navegador de ficheros con la apariencia de Nautilus.

    Y muy útil el dividir la pantalla viendo 2 aplicaciones simultáneamente en modo touch. Para ello arrastramos cualquier aplicación con 3 dedos.





    Puedes comprar esta tablet aquí. Imágenes CC.
    on May 02, 2016 04:43 PM

    Ubuntu Core at UOS 16.05

    Daniel Holbach

    Ubuntu 16.04 LTS is out of the door, we started work on the Yakkety Yak already, now it’s time for the Ubuntu Online Summit. It’s all happening 3-5 May 14-20 UTC. This is where we discuss upcoming features, get feedback and demo all the good work which happened recently.

    If you want to join the event, just head to the registration page and check out the UOS 16.05 schedule afterwards. You can star (☆) sessions and mark them as important to you and thus plan your attendance for the event.

    Now let’s take a look on the bits which are in one way or another related to Ubuntu Core at UOS:

    • Snappy Ubuntu 16 – what’s new
      16.04 has landed and with it came big changes in the world of snapd and friends. Some of them are still in the process of landing, so you’re in for more goodness coming down the pipe for Ubuntu 16.04 LTS.
    • The Snapcraft roadmap
      Publishing software through snaps is super easy and snapcraft is the tool to use for this. Let’s take a look at the roadmap together and see which exciting features are going to come up next.
    • Snappy interfaces
      Interfaces in Ubuntu Core allow snaps to communicate or share resources, so it’s important we figure out how interfaces work, which ones we’d like to implement next and which open questions there are.
    • Playpen – Snapping software together
      Some weeks ago the Community team set up a small branch in which we collaborated on snapping software. It was good fun, we worked on things together, learnt from each other and quickly worked out common issues. We’d like to extend the project and get more people involved. Let’s discuss the project and workflow together.
    • How to snap your software
      If you wanted to start snapping software (yours or somebody else’s) and wanted to see a presentation of snapcraft and a few demos, this is exactly the session you’ve been looking for.
    • Snappy docs – next steps
      Snappy and snapcraft docs are luckily being written by the developers as part of the development process, but we should take a look at the docs together again and see what we’re missing, no matter if it’s updates, more coherence, more examples or whatever else.
    • Demo: Snaps on the desktop
      Here’s the demo on how to get yourself set up as a user or developer of snaps on your regular Ubuntu desktop.

    I’m looking forward to see you in all these sessions!

    on May 02, 2016 03:43 PM

    May 01, 2016

    Goals for Y Cycle

    Svetlana Belkin

    It’s that time again when I write up goals for the next Ubuntu release cycle!  But as a side thought, I noticed that I started to think in Ubuntu release cycles when planning my goals for the next six months.  I guess it’s my new measure of time since I’m out of school…  Anyhow, these are my goals for the Y (16.10) cycle:

    • See the Tweets below:

    I don’t know yet if I will remix Red Notebook because at the moment, it’s the closest thing that I see to a electronic lab notebook. I will have post when I start this project (Week of May 1st to Week of May 8th)

    EDIT TO ADD: I’m also thinking of writing one in Qt and calling it Qt ELN (Electronic Lab Notebook).

    • Hack around my favorite, net hack game, Stone Soup’s Dungeon Crawl! My main idea/hack is to add zealots of every god instead of just a select few.  But I may expend on that…  Again, I will have a post when I start this project.
    • Do more with Linux Padawan’s community.  I don’t know what yet though…

    Hopefully, I can complete these projects or at least learn from working on them.  I will work on updating you all at least once a month.

    Wish me luck!

    on May 01, 2016 05:01 PM

    Full Circle Magazine

    Just a quick look at GIMP on the BQ Aquaris M10 Ubuntu Edition tablet.

    on May 01, 2016 03:32 PM

    I haven’t seen anyone else trumpeting this online. So I guess I will. 🙂

    Since Ubuntu Touch’s OTA 10 update, apps can offer in-app purchases! Yay!

    Besides allowing someone to write the next Candy Crush, this also means that app authors can stop providing separate “donation” versions of their app. Which means less busywork for authors, reviews are all on the same app, and less confusion for users.

    Documentation is available from the QtPurchasing module docs. And remember to update your app’s framework to 15.04.4 (OTA 10).

    If you want to see it in action, I’ve enabled a donation button in my “Lone Wolf” game app. No need to actually donate, it just might be interesting to see how it looks to the user (hit the “night mode” button in the upper right to see it — donating turns on the night mode feature).

    Speaking of which, if you actually do something based on a purchase (like enabling a feature), the QtPurchasing docs recommend saving purchase information in “persistent storage.” I’ve just stuffed a boolean in a Settings object. But that’s easy for a user to modify themselves on disk. I don’t care about donation fraud, but I’m curious how I should better protect against that, in case I do something more interesting with IAP.

    on May 01, 2016 02:07 PM

    Hello world,

    Oh yes, here we are again with yet another new cycle and this time, it’s the “YY” cycle – Yakkety Yak – please see the official announcement.

    We would like to announce that testing Ubuntu GNOME Yakkety Yak (16.10) is open and we encourage those who would like to have fun to actually start testing even though we have just started and nothing new yet but you never know when you could find a new bug?!

    Whether you are new to testing or not, here is your reference:

    https://wiki.ubuntu.com/UbuntuGNOME/Testing

    And as always, if you need any help or have any question, please contact us!

    Thank you 🙂

     

    on May 01, 2016 01:39 AM

    April 29, 2016

    So you have a new Ubuntu application, you've built it in QML with the Ubuntu SDK and now you're going to give your app a brand shiny new icon? But you go and visit the official documentation and you go "where do I start? How do I make an icon?" Well, you're kind of out of luck.

    When I started designing app icons for folks, I (too) felt the official specification was lacking detailed instructions and explanations for the Suru design –not to mention it's woefully out of date– which isn't much help. My only recourse was to follow updates to the official icons themselves and to dissect the icons to determine the elements and visual principles that make up the Suru style and updates to it.

    Now, that information or course of action may only be useful to someone like myself who does icon design and can see the cogs behind the images, so what is Jane or Joe app developer to do?

    Not to worry, some time ago I wrote a guide that is an extension of sorts to the official documentation, breaking down the Suru-style a bit and showing how you can make an icon your self as well as provide a few resources.

    Ubuntu Icon Design Guide

    So if you use & find my guide useful, feel free to contact me if you would like me critique your icon or give feedback. 😊

    on April 29, 2016 08:30 PM

    LTS 16.04 Review roundup!

    Ubuntu Insights

    xerus_orange_300px_hex (1)

    What a month! We had the release of Ubuntu 16.04 LTS that allowed us to bring out newer software for desktop in the form of snap packaging formats and tools.

    By bringing snap packages to Ubuntu 16.04 LTS we are unifying the experience for Ubuntu developers, whether they are creating software for PC, Server, Mobile, and/or IoT Devices. This means greater security and reliability as it allows the two packaging formats – snap packages and traditional deb packages – to live comfortably next to one another which enables us to maintain our existing processes for development and updates to the OS. This reinforces our relationship with the Debian community and it enables developers and communities to publish either debs or snaps for the Ubuntu audience.

    To celebrate the release, we’ve collated a range of reviews that shed light on what the LTS means. Happy reading!

    Who said Ubuntu’s boring? From Infoworld >

    Great slideshow of all the key features from IDG on Network World >

    ‘Ubuntu 16.04 LTS gives fans new reasons to love this popular linux desktop’ via PC World

    And one of our favourite titles! ‘A perfect marriage between you and Ubuntu’ thanks The Register!

    on April 29, 2016 01:00 PM

    April 28, 2016


    We (Joerg Berroth, Nekhelesh Ramananthan, Marcos Costales) donated all the money of this quarter from the uNav donate version to OpenStreetMap project.

    We love OSM!

    Donation

    We're happy that the 20% of the purchases are going to Ubuntu already :))
    on April 28, 2016 08:57 PM

    The next Ubuntu Online Summit (UOS) is going to be from 3-5 May 2016 with sessions happening from 14:00 – 20:00 UTC.

    If you are planning to attend, please register here:

    http://summit.ubuntu.com/uos-1605/registration/

    If you and your team need to discuss something at UOS, please get your sessions in as soon as possible:

    http://summit.ubuntu.com/getinvolved/propose-a-session/

    Getting them in earlier will mean that others can plan their attendance accordingly and you will have better turnout. Please note that we are not only keen to have discussion and planning sessions, but also workshops and presentations.

    Originally posted to the community-announce mailing list on Wed Apr 27 08:06:53 UTC 2016 by Daniel Holbach

    on April 28, 2016 03:53 PM

    S09E09 – Solitary Confinement - Ubuntu Podcast

    Ubuntu Podcast from the UK LoCo

    It’s Episode Nine of Season Nine of the Ubuntu Podcast! Alan Pope, Mark Johnson, Laura Cowen and Martin Wimpress are connected and speaking to your brain.

    We’re here again, although one of us is in Prague!

    In this week’s show:

    That’s all for this week! If there’s a topic you’d like us to discuss, or you have any feedback on previous shows, please send your comments and suggestions to show@ubuntupodcast.org or Tweet us or Comment on our Facebook page or comment on our Google+ page or comment on our sub-Reddit.

    on April 28, 2016 02:00 PM

    April marks the release of Xerus 16.4 and with it we bring a new design of our iconic wallpaper. This post will take you through our design process and how we have integrated our Suru visual language.

    Evolution

    The foundation of our recent designs are based on our Suru visual language, which encompasses our core brand values, bringing consistency across the Ubuntu brand.

    Our Suru language is influenced by the minimalist nature of Japanese culture. We have taken elements of their Zen culture that give us a precise yet simplistic rhythm and used it in our designs. Working with paper metaphors we have drawn inspiration from the art of origami that provides us with a solid and tangible foundation to work from. Paper is also transferable, meaning it can be used in all areas of our brand in two and three dimensional forms.

    Design process

    We started by looking at previously released wallpapers across Ubuntu to see how each has evolved from each other. After seeing the previous designs we started to apply our new Suru patterns, which inspired us to move in a new direction.

    Ubuntu 14.10 ‘Utopic Unicorn’’

    wallpaper_unicorn

    Ubuntu 15.04 ‘Vivid Vervet’

    suru-desktop-wallpaper-ubuntu-vivid (1)

    Ubuntu 15.10 ‘Wily Werewolf’

    ubuntu-1510-wily-werewolf-wallpaper

    Step-by-step process

    Step 1. Origami animal

    Since every new Ubuntu release is named after animal, the Design Team wanted to bring this idea closer to the wallpaper and the Suru language. The folds are part of the origami animal and become the base of which we start our design process.

    Origarmi

    Step.2 Searching for the shape

    We started to look at different patterns by using various techniques with origami paper. We zoomed into particular folds of the paper, experimented with different light sources, photography, and used various effects to enhance the design.

    The idea was to bring actual origami to the wallpaper as much as possible. We had to think about composition that would work across all screen sizes, especially desktop. As the wallpaper is a prominent feature in a desktop environment, we wanted to make sure that it was user friendly, allowing users to find documents and folders located on the computer screen easily. The main priority was to not let the design get in the way of everyday usage, but enhance it aesthetically and provide a great user experience.

    After all the experiments with fold patterns and light sources, we started to look at colour. We wanted to integrate both the Ubuntu orange and Canonical aubergine to balance the brightness and played with gradient levels.

    We balanced the contrast of the wallpaper color palette by using a long and subtle gradient that kept the bright and feel look. This made the wallpaper became brighter and more colorful.

    Step.3 Final product

    The result was successful. The new concept and usage of Suru language helped to create a brighter wallpaper that fitted into our overall visual aesthetic. We created a three-dimensional look and feel that gives the feeling of actual origami appearance. The wallpaper is still recognizable as Ubuntu, but at the same time looks fresh and different.

    Ubuntu 16.04 Xenial Xerus

    Xerus - purple

    Ubuntu 16.04 Xenial Xerus ( light version)

    Xerus - Grey

    What is next?

    The Design Team is now looking at ways to bring the Suru language into animation and fold usage. The idea is to bring an overall seamless and consistent experience to the user, whilst reflecting our tone of voice and visual identity.

    on April 28, 2016 01:39 PM

    For the past nine months, I have done a couple forms of QA for the Ubuntu project and flavors. In this blog post, I plan on highlighting some common practices and how I contributed.

    ISO QA Test

    Download the image

    For demonstration purposes, I'll grab the Lubuntu daily image, which as I'm writing this, is the Yakkety daily image. First, navigate to cdimage.ubuntu.com, it should look similar to the below screenshot:

    Since in this case we are testing Lubuntu, select lubuntu/, the page should look like this after loading:

    Lubuntu is a special case. They have desktop images and alternate images1. The desktop image is the same across all flavors, while the alternate image uses the Debian installer and requires less RAM to run. In this case, let's test the alternate image, so select daily/, the page should look like this after loading:

    In the above screenshot, I have noted a few things, here is the purpose of each directory2:
    20160425/ - I am writing this on April 26, 2016 (20160426), but this directory exists to ensure we have an image from the previous day for testing purposes and in the odd case that something gets messed up.
    20160426/ - These are today's images
    current/ - All of the images go through some automatic testing before proceeding to this directory, these are the last images that passed these tests.
    pending/ - This is the directory that holds the images that are either currently testing or that haven't passed the tests, and this is usually the same files as 20160426/.

    We are going to grab the image from the current/ directory. The page for current/ should look like the following screenshot3:

    Scroll down and you should see the following:

    Listed are three architectures: amd64 (which is 64-bit), i386 (which is 32-bit), and PowerPC (old Macintosh machines). Other Ubuntu flavors usually have only amd64 and i386, but Lubuntu has a PowerPC image as well. We have six (6) files for each architecture:

    1. *.OVERSIZED - irrelevant right now, you do not need to worry about it.
    2. *.iso - the image file.
    3. *.iso.zsync - the zsync file for the image.
    4. *.jigdo - the Jigdo file.
    5. *.list - the list file.
    6. *.template - the jigdo template file.

    I will show you how to utilize two (2) of the six (6) files in this directory to download the images. Ensure the zsync package is installed on your system before continuing. To download the image, yes, you can use your web browser to download the image. But there is a better way, using zsync. zsync allows you to download the image, but when the image changes, it will automatically merge the changes with the existing image that you have. Since it is the same directory and image name for the whole development cycle, you can safely use one link until the development release gets released. I'll create a directory to put the images:
    $ mkdir daily-images && cd daily-images
    Copy the zsync link for your architecture and paste it into the terminal, for example:
    $ zsync http://cdimage.ubuntu.com/lubuntu/daily-live/current/yakkety-desktop-amd64.iso.zsync
    When you press Enter, the image will download. When this is done, you should have the image ready to go.

    Getting set up with the ISO QA Tracker

    Navigate to iso.qa.ubuntu.com in your browser, you should see the following:

    On the left side, click the Log in button. You should be brought to a page that looks like this:

    If you already have an Ubuntu One account, log in with your credentials and press the Log In button. If you don't have an account, create one. I don't plan on going much into detail on this, so let's move on. You should be brought to a screen that looks similar to this:

    Click the Yes, log me in button. You should be brought to the following screen, if you have a black bar at the top like in the image, you have logged in correctly:

    Towards the bottom, you should see the Yakkety Daily suite3. Click on that and you should get to a screen with various options for images. Scroll down and you should get a screen similar to this:

    Since I downloaded the amd64 desktop image earlier, I will select Lubuntu Desktop amd64. You should get to a screen that looks like this:

    Here we have four test cases to choose from:

    • Install (auto-resize) - requires an existing installation.
    • Install (entire disk) - very generic.
    • Install (manual partitioning) - same as entire disk except you get to manually partition everything.
    • Live Session - testing the live instance.

    Because it's the most generic, I'll select Install (entire disk). When you click on that, you should get a screen similar to this:

    If you scroll down to the bottom, you should see something similar to this:

    Filling it out will be covered in a bit, but it's good to know what the submission form looks like.

    Executing the test case

    A lot of the test cases are done in virtual machines, but if you have hardware to spare, that's better, but it's not essential. I'm not going to cover how to use a virtual machines, but you can find good guides below. I prefer KVM because the Linux kernel has built-in support for it, it's a lot more integrated, and it's completely free software. I've used VirtualBox in the past, it's a great program, but it's proprietary, and the kernel modules can be a bit fidgety to get working after a kernel upgrade.

    Before you begin, read over the test case you plan on executing, there may be some important instructions that you need to watch out for. When you are ready to start, on the test case, select the In Progress radio box and press the Submit result button. Complete the test exactly how the test case says it should be done.

    During the installation, if you encounter an error that is critical enough that you cannot proceed, first look at the Bugs to look for. Is there a bug that describes your problem? If not, search Launchpad for the bug. If it's not there, identify the culprit package and file a bug against it. If you have trouble doing this, join the #ubuntu-quality channel using your IRC client or the IRC client provided below and ask for help.

    When you are done, on the test case page, click the button to edit your test case result:

    You should be brought to a page similar to this:

    If you had no trouble installing it using the instructions, select the Passed radio box. For the bugs, from what I have seen, any bugs in the system, NOT just the installation bugs, should be reported. So look at the release notes of the most recent milestone for the flavor you are testing, and go through bug reports. Confirm as much as you can, when you do, mark the bug as Me too and list the bugs under the Bugs header in the following format:

    XXXXX, YYYYY, ZZZZZ

    Be careful, the tracker likes to insert extra commas and sometimes mangle this a bit. Always check this field before updating your result.

    When you have all the bugs cited on this page, select the Update result button. If you then scroll down to the bottom, you should see your Launchpad ID with a green checkmark beside it and links to the bugs you listed. Congrats! You now completed that test case!

    Package QA Test

    The package QA tests exist to ensure that all packages are thoroughly tested for the release. Ensure you have an installation of the daily image for that flavor. Before you begin, ensure you have an Ubuntu One account set up. Also ensure you have read the previous section as I will not repeat some information that is explained above.

    Navigate to packages.qa.ubuntu.com in your browser, you should see the following:

    Click on Yakkety Daily3 and you should be brought to a screen similar to this:

    Since as of the time of writing, Xubuntu is the only flavor with package test cases, click on Xubuntu Desktop and you should be brought to a screen similar to this:

    At this point, open the test case and complete like normal, making sure to follow instructions exactly how they are listed. Instead of checking the release notes, go to the Launchpad bugs page for each package and check against all of the bugs. You can find the bugs for each package at the following URL, replacing PACKAGE with the respective package name:

    https://bugs.launchpad.net/ubuntu/+source/PACKAGE

    After this is done, congrats! You just completed a Package QA test!

    Write a manual test case

    The manual test cases are not automatically generated, they are hand-written for that application. I will tell you how to write a test case but I'm not actually going to write one because that would be too tedious for me to put in this article.

    To keep track of the manual test cases that need writing, we have bugs for each test case and details on what to do to it. I've done this a few times before, so I know these already, but read over the instructions for writing a test case before you begin. First, assign the bug to yourself and mark it as In Progress. Then read over the bug report and responses to ensure you know what you are doing. Next, ensure the program is installed by default in the flavor the bug report specifies. If this is not the case, mark the bug as Incomplete and state that it is not in the flavor you specified. If it is there, you can continue.

    After that, grab the source for the Ubuntu Manual Test Cases. Ensure you have bzr installed and run:

    $ bzr branch lp:ubuntu-manual-tests

    Then cd into the ubuntu-manual-tests directory just created. Go into the testcases/packages/ directory and another subdirectory if applicable. Open your favorite text editor and create a file with the name of the package you are creating a test case for, no need for any numbers. Using the guide above, write the test case and verify it. Below I have embedded a video by Nicholas Skaggs if you prefer to view a video:

    When you are done, make sure you are directly in the ubuntu-manual-tests directory, and execute the following command4:

    $ bzr add * && bzr commit --fixes lp:BUG#

    Then push to a Bazaar branch in Launchpad:

    $ bzr push lp:~/ubuntu-manual-tests/bugfix#####

    Then go to the Bazaar page for the Ubuntu Manual Testcases project and find your branch. Then submit a merge request detailing your test case. Congrats! You wrote a manual test case!

    Further questions?

    Below if you are on my website, I have linked an IRC client for you to use if you do not have your own. Type in a nickname, press start, and press Enter to speak in the channel. If you have an IRC client, go to #ubuntu-quality on irc.freenode.net. If you prefer not to use IRC, we have a mailing list that you can use if you wish. Good luck and I hope to see you around! ☺

    1. We also have a preinstalled image, but I will not cover that in this tutorial.
    2. Even though the directory names will have changed, the information is still accurate.
    3. This information will still be valid after we move on from Yakkety images.
    4. Make sure Bazaar is set up properly before doing this
    If you have questions/comments/concerns/suggestions about this article, my email is tsimonq2@ubuntu.com or I am tsimonq2 on Freenode (PMs and pings welcome).
    on April 28, 2016 03:45 AM

    April 27, 2016

    uNav 0.59

    The uNav team is proud to announce the release of uNav 0.59 code named Beauty and the Beast. In my opinion, this is truly one of the best releases we have pushed out. The code name should give you a hint of what we focused on for 0.59 ʘ‿ʘ

    User Testing

    We started doing user testing early in the development cycle with friends and colleagues which revealed several interesting issues that new users found to be confusing and detrimental to the uNav experience. I suppose the first step in solving a problem is acknowledging we have a problem. Internally we found it difficult to accept the fact that certain features like the NearBy, Menu Navigation and Search that we spent hours building was not as intuitive as we thought it would be.

    I am thankful to the volunteers who joined our user testing sessions which resulted in a brand new navigation structure described in the next section.

    Brand new navigation structure

    User testing revealed that our menu (route page) was inefficient and misleading. While it did present a nice launch pad from which users can perform actions, it took longer to perform basic actions like search and navigate.

    So we took a step back and looked at the bigger picture and asked ourselves,

    What is uNav? What do users really use uNav for?

    The answer is simple, uNav is a navigation app which helps users to get from Point A to Point B. It is critical that we make this feature the highlight of our app and easy to use.

    That meant bringing the ability to search for locations to the forefront of the app rather than burying it inside menus.

    uNav 0.59

    The search page provides quick access to various search sources (Address, Coordinates & Favorites).

    uNav 0.59

    Visual Revamp

    As you may have guessed from our code name, we have a beast of an app uNav..this release we focused on turning that beast into a princess ;). We injected some brand color into the app to make it more lively.

    The interface also guides the user and prevents them from making a mistake. I have talked about this in my past posts about the best interface being one which actively prevents the user from making a mistake rather than just showing a error dialog after they make a mistake.

    Here is a small example of it in action,

    uNav 0.59

    The zoom buttons got a bit of design love to improve their contrast against the map background.

    uNav 0.59

    POI Details

    This is my personal favorite feature in this release. It shows all available information about a POI. This feature is heavily dependent on the OpenStreeMap database. However, I have found that adding details about a POI (restaurant, shop etc) is super easy using OSM's web editor. By taking a few moments to fill them out, you help out the community as well.

    uNav 0.59

    Reverse Geocode

    You can long-press on any point in the map to get its address. If that point turns out to be a POI, then we show you its details.

    uNav 0.59

    Performance Improvements

    There are some massive improvements to the calculate route time with speed camera alerts features enabled. In our tests, a 500 Km road-trip would take 2-3 minutes before uNav displays the route and the speed camera. Now it only takes 2-3 seconds!

    Pinch Zoom

    Did you just read pinch-zoom? Yes you did! uNav 0.59 finally brings pinch-zoom feature and also an improved long-press feature.

    Well that's all from me. Hopefully I didn't bore you with my long blog post. Loving uNav? Be sure to let us know with your reviews in the app store.

    Next up, Chameleonic uNav!

    on April 27, 2016 06:26 PM
    I'm delighted to share the slides from our joint IBM and Canonical webinar about Ubuntu on IBM POWER8 and LinuxOne servers.  You can download the PDF here, or tab through the slides embedded below.  The audio/video recording should be available tomorrow.



    Cheers,
    :-Dustin
    on April 27, 2016 06:07 PM
    This post is the third in a series about snappy interfaces. Knowledge presented in posts one and two is assumed.

    Today we will look at what makes an interface. This post might be a bit heavier on the programming side so feel free to skip over the code fragments if that is not your thing. Note that we will not build an actual interface just yet. The goal of this article is to set the stage for that to be meaningful, at least in part.

    The Interface interface

    From the point of view of snappy, an Interface is a bit of code with specific APIs. In go's terms it is an interface (note the lower case i). If you are familiar with other languages it is just a way to describe a class with a specific set of methods.

    In go, this is spelled out as:

    type Interface interface {
    ...
    }


    This can be read as "the go type Interface is an object with the following methods ..."

    Interface name

    At a very basic level each interface has a name.

    type Interface interface {
    Name() string
    ...
    }

    That is, having an arbitrary interface you call the Name method to obtain the name of that interface. Interface name must be unique and is something that other developers will refer to so plan ahead and pick a good, descriptive name. You cannot just change it later.

    Validating plugs and slots

    Two of the methods in an Interface are used to verify if a plug or slot definition is correct.

    type Interface interface {
    ...
    SanitizePlug(plug *Plug) error
    SanitizeSlot(slot *Slot) error
    ...
     
    Remember that plugs and slots can hold arbitrary attributes. A particular interface, say, one that allows access to a GPIO pin, can use an attribute to describe which particular pin is exposed. As an interface author you should check if the pin is specified correctly (e.g. that it is a number, that it has a sensible value, etc).

    Both methods take an object to sanitize (a plug or a slot) and return an error if the object is incorrect. If you don't need to check anything just return nil and carry on.

    Interfaces and snippets

    Having a valid plug and slot, the main thing that interfaces do is to influence the various security systems. This is implemented as a set of four methods. Before I will spill the beans on the code I will explain this informally.

    Small digression, when you see a security system below think of things like apparmor and seccomp. I will focus on security systems in a dedicated instalment. For now they are simply a part of the overall security story. 

    Each security system is responsible for setting up security for each app of each snap. By default all apps get the same treatment, there is nothing unique about any particular app. Interfaces allow to pass extra information to a particular security system to let a particular app do more than it could otherwise.

    This extra information is exchanged as snippets. Snippets are just bits of untyped data, blobs, sequences of bytes. In practice all current snippets are just pieces of text that are easy to read and understand.

    Interfaces can hand out snippets for each of the four distinct cases:
    1. the mere fact of having a plug of a given interface
    2. the fact of having a particular plug connected to a particular slot
    3. the mere fact of having a slot of a given interface
    4. the fact of having a particular slot connected to a particular plug
    Note that there is a pattern. Applications can get extra permission by simply having a specific plug or a specific slot. Applications can also get extra permission by making an interface connection between a plug and a slot.

    Typically most permissions will be based around a plug connected to a slot. Apps bound to the plug will be allowed to talk to a specific socket, to a specific DBus object, to a specific device on the system. All such permissions will be expressed through a snippet provided by case 2 in the list above.

    For applications providing services to other snaps (e.g. bluez, network-manager, pulseaudio, mir, X11) the mere fact of having a slot will grant permissions to create the service (to configure network, manage GPUs, etc). Applications like this will use the mechanism provided by case 3 in the list above.

    The meaning of the snippets is almost opaque to snappy. Snappy collects them, assembles them together and hands them over to security backends to process. At the end of the day they end up as various configuration files.

    So how does the method definition look like? Like this:

    type Interface interface {
    ...
    PermanentPlugSnippet(plug *Plug, securitySystem SecuritySystem) ([]byte, error)
    ConnectedPlugSnippet(plug *Plug, slot *Slot, securitySystem SecuritySystem) ([]byte, error)
    PermanentSlotSnippet(slot *Slot, securitySystem SecuritySystem) ([]byte, error)
    ConnectedSlotSnippet(plug *Plug, slot *Slot, securitySystem SecuritySystem) ([]byte, error)
    ...
    }

    Note that each method gets the name of the security system as an argument. A single interface can influence all security systems if that is required for it to operate correctly.

    Connecting interfaces automatically

    The one last thing an interface can do is say it wants to automatically connect plugs to viable slots under certain conditions. This is expressed as the following method:

    type Interface interface {
    ...
    AutoConnect() bool
    }

    This feature was designed to let snappy automatically connect plugs in snaps being installed if there is a viable, unique slot on the OS snap that satisfies the interface requirements. If you recall, the OS snap exposes a number of slots for things like network, network-bind and so on. To make the user experience better, when a snap wants to use one of those interfaces the user does not have to connect them explicitly.

    Please note that we're going to be conservative in what can be connected automatically. As a rule of thumb auto-connection is allowed if this is a reasonable thing to do and it is not a serious security risk (the interface doesn't hand out too much power).

    The complete picture

    You can check the complete interface code, with documentation, here. The key thing to take out of this whole article is that interfaces are bits of code that can validate plugs and slots and hand out security snippets.

    How this actually gets used and how the snippets should look like, that is for the next post.
    on April 27, 2016 12:50 PM

    So about two years ago, I put together the shortest x86-64 shellcode for execve("/bin/sh",...); that I could. At the time, it was 25 bytes, which I thought was pretty damn good. However, I’m a perfectionist and so I spent some time before work this morning playing shellcode golf. The rules of my shellcode golf are pretty simple:

    • The shellcode must produce the desired effect.
    • It doesn’t have to do things cleanly (i.e., segfaulting after is OK, as is using APIs in unusual ways, so long as it works)
    • It can assume the stack pointer is at a place where it will not segfault and it will not overwrite the shellcode itself.
    • No NULLs. While there might be other constraints, this one is too common to not have as a default.

    So, spending a little bit of time on this, I came up with the following 22 byte shellcode:

    BITS 64
    
    xor esi, esi
    push rsi
    mov rbx, 0x68732f2f6e69622f
    push rbx
    push rsp
    pop rdi
    imul esi
    mov al, 0x3b
    syscall
    

    Assembled, we get:

    char shellcode[] = "\x31\xF6\x56\x48\xBB\x2F\x62\x69\x6E\x2F\x2F\x73\x68\x53\x54\x5F\xF7\xEE\xB0\x3B\x0F\x05";
    

    This is shorter than anything I could find on shell-storm or other shellcode repositories. If you know of something shorter or think you can do better, let me know!

    on April 27, 2016 07:00 AM

    April 26, 2016

    LOWREZJAM reviews

    Stuart Langridge

    A few weeks ago, the LOWREZJAM kicked off on itch.io. It’s a game jam; the idea is to build a computer game. This one had an interesting restriction: the game had to be 64x64 pixels. So, we’re going old-school.

    I thought I’d enter. So did about four hundred other people. It turns out that a jolly good way to get people to rate your game is for you to rate theirs and comment on it; then, your comment gets decorated with a link saying “see their submission” and they tend to follow it and rate you in turn. So, I wrote a bunch of short reviews. There doesn’t seem to be a way to link to all my reviews in a given jam on itch.io (although it would be good if there were!), so I’ve collected them here for posterity. Note that these make no attempt to be comprehensive or fair or balanced; they’re basically comments on what I thought of the games I played and why I didn’t like them, if indeed I didn’t.

    A few games got a rating but not a comment; those aren’t included. I also haven’t included the actual ratings I gave, because those don’t matter as much. The comments are mainly designed to be helpful to the game’s developer, if anything.

    I only played in-browser games, because they’re easiest to play, and I don’t have the Unity web player so those games which require it didn’t get played. It’s good to see that a pretty high proportion of “Unity” games are using the Unity WebGL export so they can be played without the plugin! I also didn’t play everything; with 188 games just in-browser, I was never going to get through them all. Pro-tip: this is one good reason to give your game nice imagery, so it looks interesting in a big list.

    In essence, this was a lot of fun. There were an awful lot of things which were clearly only part-finished (didn’t have sound, didn’t have a way to win, didn’t have title screens, and so on), but there were some really accomplished entries in here; things that I can absolutely imagine being a released game that one could play and have fun with. Nice work, indie game dev community.

    You can also watch Jupiter Hadley play all the games on her YouTube channel; at time of writing mine isn’t done yet, but it should be over the next few days.

    So! Reviews!


    MatchMerchant

    The extra challenge provided by trying to match 4 (to get a potion) while not matching 3 (so the things disappear) adds an interesting extra wrinkle to this. The scene — a potion seller, wizards — adds some meaning to the game mechanic, and the graphics are good. Dragging is a little awkward, and unlike most match-3 games you can drag to swap any two pieces, which I didn’t at first realise.


    Time Scale

    I appreciate the idea of slowing down time. But I’m not sure why I wouldn’t play just with my finger on the shift key the whole entire time, thus turning the game into Bullet Time All The Time? Some puzzles which require performing them with time at normal speed would be nice, although maybe there are plenty and I just didn’t get that far….

    (also, the sound made by the “fire dots into the air” triangles is not perfectly synchronised with actually firing dots into the air, which makes jumping over them considerably harder; this may have been a deliberate thing, but it’s over the line between “maliciously confusing” and “just annoying”, for me at least)


    r

    Ouch, the ponderous music is quite painful to endure.


    Kulten

    Great graphics — the text is a little hard to read at times, especially distinguishing D and O, or similar — but the feel of the game is marvellous. It really misses sound!


    micro-society

    Interesting concept, although the 64px limitation maybe makes the representation a bit too abstract! Having new children get born just by walking into other players feels a bit weird, too. But there are some quite complex game mechanics underlying this!


    Star Shield

    Obviously simple graphics, but easy to play. The white UFOs are terribly hard to kill! I’m not sure what “shield” does; it certainly doesn’t stop you being killed by bullets or collisions :-)


    Castle Storm

    Really nicely put together; a complete and well-implemented fun game. The font is, as noted, a little hard to read, and it’s sometimes hard to know why you’re not allowed to buy a thing — is it because you haven’t bought one of the pre-requisites, or because you don’t have enough money, or because you’ve bought it already — and that does break the immersion somewhat. Watching a Lord attacking the enemy castle is highly amusing. Nice work!


    Fast Escape LowRez

    Maze gameplay boiled down to its simplest possible form. :) Agreed with bonus1up that some framing device and music and sounds would help it feel more like a game rather than a demo of the technique. The maze generator seems to generate some pretty tangled messes at times, and I roamed pretty aimlessly until I discovered the green exit block. A score or some method of assessing progress would be nice, perhaps.


    Gummy Turbo Tunnel

    I see the idea, but I assume that the deadline landed before gameplay could be added. Nice start on an idea, though!


    FRST FIRE

    Sadly, the game crashed with an error (screenshot at imgur) when I tried to increase the growth rate; I think I may have pressed “right” and Z at the same time. I love the concept; it would be nice to see a version of this which wasn’t constrained to 64x64 and the Pico, as an art piece and less clunky to fiddle with the parameters!


    Dungeon Shifter

    Interesting concept, and the graphics are nice (blocky, but nice). I don’t think I understood what most of the “control panel” is actually for, though, and needing to control that by clicking while simultaneously either clicking arrows or using the arrow keys to go up and down means that the challenge is not “playing the game” but “managing the controls”, which I don’t think is meant to be the challenging part :)


    64s Resistance

    I don’t think I understand what the score is actually scoring, here. Button-mashing, once I started being “attacked” from all sides, got me up to 70 or so, but I didn’t really have much of an idea what I was doing, and then my score reset to 0 and I didn’t know what I’d done wrong. It feels like there might be a good idea in here for twitch gameplayers and people who like Super Hexagon, but I think more feedback as to what’s going on and why is needed.


    LZRS

    The try-and-die-iest of try-and-die games :) Fun! The controls feel a little bit wonky; sometimes I wouldn’t be able to jump and it wasn’t clear why. Fun, though, and I won after only forty (!) deaths.


    Ghost

    Seems fun — it’s a tiny 64x64 Gunpoint, sorta! Really short, though; maybe more levels would be good.


    Duck Quest

    As you say, an in-progress demo rather than a complete game, but what’s there is pretty good. I like the single-colour palette; I can imagine this being a working game (once completed) on something like a watch or a single-use handheld game.


    Marble Incline Redux

    I don’t think the text display fits the 64px grid, does it? Also, it would be useful if continuing to the next level and starting that level were controlled with a keypress you’re already using, such as up arrow, as well as restarting after death, rather than having to wait or press R.


    Wall Defender

    Simple, and basic graphics, but easy to play and understand, and the two offset guns provide a modicum of strategy when trying to shoot two different attackers at once. I won first time out, so the difficulty curve probably needs a bit of tweaking :)


    The Forest

    Smooth movement, and I like that running into a shadow is not an instakill. Attempting to find the key is very frustrating!


    In’Out

    Elegantly done graphics. I didn’t realise for quite some time that you can jump :) Sound effects would be good to go along with the music, perhaps?


    Hyper Racing

    The car handles excellently — the first level is so easy to pass that I was already thinking of recommending more realistic movement (rather than being able to turn instantly), and then the second level (which is just the same idea, with a larger oval) is much much harder to pass in the time! So I think the difficulty curve is just about right, and the graphics are good; nice work!


    Memoblox

    The skull and its laugh makes me laugh in turn. I didn’t really realise that I was supposed to be remembering the colours until after the first playthrough; maybe some minimal instructions, or a slide saying “REMEMBER” before the colours start?


    Postal Panic

    Oh goodness me the voice commentary is so annoying. My game went out of its way to mock failure and have annoying voices and it’s not a patch on this; I kept missing parcels because I wanted to punch the screen. Excellently done. Also, nice graphics, good sound work, and slick; a complete game. Only a weakling such as myself would rate it down because it’s just too hard :)


    Monty Norman’s James Bond Theme

    I didn’t realise that I was meant to shoot without being able to see Bond! Once I worked that out, and that the “gunsight” was actually moving even though it doesn’t appear to be because the background is all white, I was able to shoot at and hit 007. I like the music loudness approach (reminiscent of Find the Invisible Cow).


    Sk8Skull

    A good start; nice pixel art. The game obviously needs work, as you know; as far as I can tell it’s not possible to jump over two sets of spikes next to one another. You’ll also not want to make the “restart the game” keypress also count as a “jump” keypress. But this could grow to be something good with more work!


    Terracell

    I suspect this is a demo that never got finished? The graphics are surprisingly impressive — I particularly liked the realism of the rain — but there doesn’t seem to be a purpose to the game (nor any sound), and walking through an elephant means that the elephant sticks right with you and flickers on and off, weirdly. Could be the nucleus of something impressive with lots more development, though; a good start.


    The Sheriff

    Sadly, the game doesn’t cancel keypresses when they’re not used, which means that every time I’m walking downwards and I walk into something, the down arrow is ignored by the game and passes on to the web page and the page scrolls downwards, taking the game out of vision! This made it really hard to play, I’m afraid! Opening the frame in its own tab helps, though.


    BuggyBall

    Nice art, and the car is surprisingly controllable. The low resolution meant that I didn’t realise for quite a while that my car could be turned upside down and that’s why I couldn’t drive anywhere, though, and if you leave the AI alone for three seconds it scores a goal :-)


    Useless Clicker

    Impeccably implemented simple joke. It gets a smirk, which I’m sure is all its little heart desires :)


    Mogee

    I think I got trapped in a corner and couldn’t get out, even after I died and the game restarted. Simple mechanic, and it’d benefit from some sound, but playable!


    Cat Herder 9000

    The cats slide around not on the 64x64 grid, which makes them look smooth but breaks the rules :) As noted, there’s not much of a sense of agency here; I don’t feel like I have much control over the cats (arguably, because they’re cats), but that does mean that the game feels like making a succession of random moves until you win by accident, rather than by superior play. I can’t see how anyone could become an expert at this game rather than merely winning by luck…


    Circle Pong

    Quite a clever mechanic — that I get confused when I’m atop the circle and the “left” button is actually going to the right is not the game’s fault :) It’s very easy to overshoot or undershoot, though, which is frustrating; it might be nice if this were made less punishing, although maybe the idea of having to get it dead on right is a deliberate part of gameplay!


    Intents: Man to Man (v1.01a)

    The description calls this “weird”, which I don’t think is fair, but it is detailed. As noted, paying attention to the manual is pretty important to work out what’s going on. Choosing the squares to move to feels unusually clumsy, by comparison with the rest of the UI which actually flows pretty well once you’ve got the hang of what you’re doing. This feels like the video equivalent of what “proper” wargames (measure the hexes, spend time with books of tables calculating precise angles and damage for mortars, etc) are to Risk, and there’s definitely an audience for that.

    (also, as @phantomax says… it’s not meant to be called “intense”, is it? :))


    Cat’s Trophy!

    Cute but rather bare graphics. The game’s actually surprisingly hard. Instadeath for going off screen seems a bit harsh, rather than just locking the player to the screen.


    Dexno

    I found it useful to apply a changed style to the canvas in the game: canvas { height: 60vh; } makes it much bigger and easier to see, which may help with the issue you were having with the HTML viewport.


    SQUARE SQUARE

    Interesting idea. It’s really, really difficult though; maybe start slower and speed up over time? Otherwise it leads less to attempts to do better and more to just table-flipping annoyance and a move on to another game :)


    Mini Prix

    Ninth out of nine, but this was good fun!


    Zerwol the Wizard

    I don’t have any very clear idea of what I’m meant to do — just wander around and kill everything?


    FusionSpace

    The music kept making me think it was going to be the Game of Thrones theme :)


    Of A Forgotten Earth

    Hard to see what’s going on when most of the screen is obscured (although maybe that’s the point). The cutscene at the beginning is interesting the first time through the game but has to be manually skipped through every time you die, which is rather frustrating.


    Air War 64x64

    Looks really good! but it’s sometimes hard to see exactly where the Red Baron is when he’s just three or four red pixels :) Also, it’s a little hard to tell whether I won or lost when we end up flying directly at one another firing. (Perhaps it’s just that I’ve never won and so I’ve never seen a win screen!)


    Cave 64

    Basic graphics, but has potential to be developed into something!


    Battle Box (LowRezJam)

    I’m not sure I wholly understand what I’m doing, here. I can roll around, shoot white blocks (which moves them), and shoot the enemy (which moves them but doesn’t kill them, to my surprise), but… then what? I like the conceit of the rolling cube which fires in a particular direction, much like a bunch of single-player puzzles of this kind. The time limit on a move makes it all feel rather rushed, which is a little unfortunate because it makes the game feel like a very low rez arena deathmatch, rather than like a carefully thought-out chess game.


    Endless Burger

    I wish there were some sound in this. That the merest touch of a burger bap on my mostly-complete burger counts as instadeath means that I end up playing the game by merely fleeing from burger tops like a gluten-free lunatic with a flour phobia, but that’s perhaps part of the skill of the game.But without sound, it feels half-finished. This wouldn’t take much to be turned into a really challenging game, I think!


    GhostShi

    Sadly, the “up” and “down” abilities didn’t seem to work for me, so all I could seem to do is walk off the edge into the first water pool and die. Maybe there’s something I missed, but a little tutorial level might have helped if there’s an action I didn’t know to do. Nice graphics and feel.


    Total Devotion

    This is alarmingly creepy. It also shamelessly violates the 64x64 pixel grid :)


    Forms II : Hero Of the Office

    An interesting concept. After the first day, the screen went red and I didn’t seem to be able to do anything else, sadly. I like the graphical approach and the idea behind it, though!


    Gravimine

    Took me some time to realise that collisions with (a) the rocks you’re trying to mine and (b) the bottom of the tractor beam (?) are fatal and I’m supposed to avoid that. Once I’d got it, there is potential here; it’s Thrust, but with the added attraction that the rock follows you around and you mustn’t collide with it. Obviously it’s just a prototype and therefore doesn’t have music or backstory or anything, but I think this could be quite entertaining once it becomes a game!


    Big Sword

    Nice feel, especially the squelch on hitting something. It does lend itself a bit to button mashing, but that’s part of the old-school fun :)


    babelburger

    I don’t think I’d eat a burger which had a burger bun, a slice of lettuce, another slice of lettuce, and two more burger buns. Might be a bit bland :) That aside, the game takes real advantage of its low resolution and is rather fun! The logo’s delightful, too. It’s a little hard in initial play, perhaps; softening the difficulty curve just a tiny bit might be useful, so people can get beyond about two burgers without having to be the Flash. I suspect this might be easier with a touchscreen…


    Bring Your Wedge

    Yay! 64 points! I still don’t think I’ve quite grasped what the perfect tempo is, but I like the game a lot; quite a compelling challenge, and getting a hole in one is lovely :)


    Snakoban

    Surprisingly difficult for such a simple game mechanic! It would be worth cancelling the keypresses after you’ve trapped them, so that up/down arrows don’t navigate up and down the page.


    Looping Zip

    Simple gameplay and easy to grasp, but rather hard to master! It may be worth prohibiting space bar presses from changing direction if they’re pressed after the game has “started” but before the ship has actually started moving, because a few times I hit space to start when I thought my previous press hadn’t been registered, only to discover that it had been registered but the ship is slow to get started.


    QWER

    Needs, I think, a little tutorial bit or similar to explain the mechanics? I managed to have two of my shapes completely disappear but I don’t know whether that was a good thing or a bad…


    A Leader

    Hard to work out what to do to pick up people and avoid losing them; it feels like this might be a good twitch game, or a good puzzle game, but trying to solve the puzzle of how to bypass each impediment and pick up each person while also trying to manage the twitch element of doing it all at the right time is overwhelming my poor brain…


    Lament

    The controls are… a bit difficult to get one’s head around, but once mastered they’re OK. That you can’t stop on a wall (you can either climb or slide, but not stay still) is a touch weird, but getting to grips with that is the required skill, perhaps. The music is a cool track but maybe a bit overdramatic for the actual gameplay. This is the kernel of a good idea, I think; could be good with work.


    1985

    Nicely done. Feels very old-school, in a good way; I can absolutely imagine this being a released game back in the day.


    bitbout

    Was driven nuts by the lack of friction on the platforms, at which I’m sure the author was cackling and rubbing their hands in glee because that’s the point. Having a computer enemy would be good for practice, although I fell off enough all by myself…


    PRTs

    Delightful graphics; the limited palette really helps! Sailing around does feel a bit aimless, especially since I don’t seem to be able to re-visit an island where I died (does it sink back into the sea when the crabs make a kill or something?). Once I’d worked out that the combat relied on me hitting the arrow keys in time with those on screen rather than just as fast as possible, I never lost another battle, so that was nice :)


    Dual Wielded

    Flinging myself around by firing guns is interesting; reminds me of the XKCD What If article about flying by building a platform of AK-47s! Nice low-res graphics, too, and choice of protagonist.


    H4LF L1F3

    Nice effects on the title screen. Game seems smooth but occasionally the framerate drops. I killed a monster but then wasn’t sure what to do; shooting the “cells” seems to make them react, but they don’t die, and shooting the big “cell” in the middle makes the screen flash and we get a “gasp!” sound effect but that doesn’t die either.


    The Legend of Fangury

    Classic, indeed, but well implemented. I particularly appreciate that inadvertently touching an enemy is not instadeath! I do occasionally find myself leaping a bit into the unknown because it’s hard to see what’s coming up, but perhaps that’s a feature rather than a bug.


    Swarm

    I think this is hurt by the 64x64 limitation; it feels like I’m frantically moving my tiny letterbox around the map searching for a flower under attack as pointed to by the indicators. Of course, that’s part of the game, but it’s probably a bit far over the frustrating-vs-fun line for me. I also spent almost the whole first playthrough thinking that the little darker green “grass” things were flowers and failing to understand why nothing worked :) The swarming effect is really nice!


    OR-BIT

    Avoiding things is really, really hard. Not, like, “I must get expertise” hard, but “solid wall of unavoidable rocks” hard. I like the slightly drifty slow uncontrollable nature of the astronaut, which fits with the low-gravity backstory, but combining that with the sheer volume of rocks makes survival pretty much impossible…


    Potion Guesser

    It’s very hard to know which ingredient is currently selected, and it’s possible to select the “right arrow” even when you’re at the end of the list, meaning that I spent half the time baffled that mouse clicks weren’t doing anything. Other than that, the UI seems quite smooth and nice. The game’s a lot harder because you can’t use the same ingredient twice! I expected the “troll’s eye” to do something special because I was especially given it in the opening cutscene, but maybe that’s just misinterpretation.


    Pixel Eater

    Obviously very minimal in graphics (and no sound at all), but the idea is reasonable. Interestingly, I expected red berries to be an instakill and was pleased to see that they drop you a size category instead. The game is very easy, though; I won on the second and all subsequent tries :-)


    BNOD

    Agreed with other comments; I don’t get the rules. I don’t see what FRIENDS? or SPACE actually mean. Possibly the whole game is to work that out, but the hurdle makes me turn away rather than puzzle to figure it out :(


    Oort

    (no sound, though?) Obviously unfinished, as mentioned in the description. That said, I like that the jumps are absurdly high by comparison with other platforms (and in addition to this absurdly high jump we have a double jump which is doubly absurdly high); it changse the way I think about the game a surprising amount for such a nominally small change. Being followed about by the nasty things with red eyes and being unable to shake them off is also an interesting mechanic, and I like their hammers. As noted, the space-to-“attack” thing doesn’t actually do anything other than draw a dotted circle around me and freeze the game, so i suspect that’s not yet implemented. But there’s the core of a good thing here; interesting graphics, interesting divergence from standard platforming rules with the high jump, and I’d like to see more.

    And the game I thought was best…

    Slumber Knight

    Great fun game; graphics are well done, sound matched, good feel to the game. Nice one! Full marks.

    I really liked Slumber Knight. Delightful graphics and feel. I confessed to the developer on Twitter that I ended up hacking the game a bit so I could see how it ended, by making myself immune to collisions, but that’s not a bad thing about the game, it’s a bad thing about my impatience. It’s excellent work.

    And… what I did

    I did, of course, enter a game myself. It’s called “Have You Seen This Image?“, and you can play it. It was deliberately simple — I didn’t want to devote much time to writing it — but I really enjoyed the experience of building a complete game, releasing it, and seeing people rate it. A pretty common theme in the comments was that it doesn’t _quite_ explain exactly what you need to do, but I think everybody gets it after one playthrough, and playthroughs are very quick indeed. (I put some effort into making sure that you can start again without having to wait as soon as you die.) The juxtaposition of the abusive failure messages with the marvellously jaunty music still makes me laugh every time I play it. (The music is Pixelland from the incomparable Kevin MacLeod.) Images were from Wikipedia; after some help from the #wikimedia-tech IRC channel, I discovered Quarry which allows you to run arbitrary SQL queries against the Wikimedia databases from inside the browser, and is a very excellent thing indeed. So I wrote a query to return all 64x64 images from Wikimedia Commons and then picked a bunch of them. In order to make the game more difficult, I then made three copies of each image, tinted blue, red, and green respectively, so you’d see images that you might have seen before but in different colours. And that was that. There’s a bug in there somewhere which causes two success sounds to play at once (so you get the game saying “Awesome!” _and_ “Fantastic!” when you get it right sometimes), but after trying and failing to work out why, I’ve reclassified it as a feature because it amuses me to hear the sounds anyway. So, conclusion: writing a game is fun; hanging out with the game jam community is fun; thank you to popey for nudging me into doing it; and I came 72nd for game feel, which I am perfectly happy with. Must do this again at some point.

    on April 26, 2016 05:12 PM

    This is a question raised quite quite often, the last time in a blogpost by Thomas, so I thought it is a good idea to give a slightly longer explanation (and also create an article to link to…).

    There are basically three reasons for using XML as the default format for metainfo files:

    1. XML is easily forward/backward compatible, while YAML is not

    This is a matter of extending the AppStream metainfo files with new entries, or adapt existing entries to new needs.

    Take this example XML line for defining an icon for an application:

    <icon type="cached">foobar.png</icon>

    and now the equivalent YAML:

    Icons:
      cached: foobar.png

    Now consider we want to add a width and height property to the icons, because we started to allow more than one icon size. Easy for the XML:

    <icon type="cached" width="128" height="128">foobar.png</icon>

    This line of XML can be read correctly by both old parsers, which will just see the icon as before without reading the size information, and new parsers, which can make use of the additional information if they want. The change is both forward and backward compatible.

    This looks differently with the YAML file. The “foobar.png” is a string-type, and parsers will expect a string as value for the cached key, while we would need a dictionary there to include the additional width/height information:

    Icons:
      cached: name: foobar.png
              width: 128
              height: 128

    The change shown above will break existing parsers though. Of course, we could add a cached2 key, but that would require people to write two entries, to keep compatibility with older parsers:

    Icons:
      cached: foobar.png
      cached2: name: foobar.png
              width: 128
              height: 128

    Less than ideal.

    While there are ways to break compatibility in XML documents too, as well as ways to design YAML documents in a way which minimizes the risk of breaking compatibility later, keeping the format future-proof is far easier with XML compared to YAML (and sometimes simply not possible with YAML documents). This makes XML a good choice for this usecase, since we can not do transitions with thousands of independent upstream projects easily, and need to care about backwards compatibility.

    2. Translating YAML is not much fun

    A property of AppStream metainfo files is that they can be easily translated into multiple languages. For that, tools like intltool and itstool exist to aid with translating XML using Gettext files. This can be done at project build-time, keeping a clean, minimal XML file, or before, storing the translated strings directly in the XML document. Generally, YAML files can be translated too. Take the following example (shamelessly copied from Dolphin):

    <summary>File Manager</summary>
    <summary xml:lang="bs">Upravitelj datoteka</summary>
    <summary xml:lang="cs">Správce souborů</summary>
    <summary xml:lang="da">Filhåndtering</summary>

    This would become something like this in YAML:

    Summary:
      C: File Manager
      bs: Upravitelj datoteka
      cs: Správce souborů
      da: Filhåndtering

    Looks manageable, right? Now, AppStream also covers long descriptions, where individual paragraphs can be translated by the translators. This looks like this in XML:

    <description>
      <p>Dolphin is a lightweight file manager. It has been designed with ease of use and simplicity in mind, while still allowing flexibility and customisation. This means that you can do your file management exactly the way you want to do it.</p>
      <p xml:lang="de">Dolphin ist ein schlankes Programm zur Dateiverwaltung. Es wurde mit dem Ziel entwickelt, einfach in der Anwendung, dabei aber auch flexibel und anpassungsfähig zu sein. Sie können daher Ihre Dateiverwaltungsaufgaben genau nach Ihren Bedürfnissen ausführen.</p>
      <p>Features:</p>
      <p xml:lang="de">Funktionen:</p>
      <p xml:lang="es">Características:</p>
      <ul>
        <li>Navigation (or breadcrumb) bar for URLs, allowing you to quickly navigate through the hierarchy of files and folders.</li>
        <li xml:lang="de">Navigationsleiste für Adressen (auch editierbar), mit der Sie schnell durch die Hierarchie der Dateien und Ordner navigieren können.</li>
        <li xml:lang="es">barra de navegación (o de ruta completa) para URL que permite navegar rápidamente a través de la jerarquía de archivos y carpetas.</li>
        <li>Supports several different kinds of view styles and properties and allows you to configure the view exactly how you want it.</li>
        ....
      </ul>
    </description>

    Now, how would you represent this in YAML? Since we need to preserve the paragraph and enumeration markup somehow, and creating a large chain of YAML dictionaries is not really a sane option, the only choices would be:

    • Embed the HTML markup in the file, and risk non-careful translators breaking the markup by e.g. not closing tags.
    • Use Markdown, and risk people not writing the markup correctly when translating a really long string in Gettext.

    In both cases, we would loose the ability to translate individual paragraphs, which also means that as soon as the developer changes the original text in YAML, translators would need to translate the whole bunch again, which is inconvenient.

    On top of that, there are no tools to translate YAML properly that I am aware of, so we would need to write those too.

    3. Allowing XML and YAML makes a confusing story and adds complexity

    While adding YAML as a format would not be too hard, given that we already support it for DEP-11 distro metadata (Debian uses this), it would make the business of creating metainfo files more confusing. At time, we have a clear story: Write the XML, store it in /usr/share/metainfo, use standard tools to translate the translatable entries. Adding YAML to the mix adds an additional choice that needs to be supported for eternity and also has the problems mentioned above.

    I wanted to add YAML as format for AppStream, and we discussed this at the hackfest as well, but in the end I think it isn’t worth the pain of supporting it for upstream projects (remember, someone needs to maintain the parsers and specification too and keep XML and YAML in sync and updated). Don’t get me wrong, I love YAML, but for translated metadata which needs a guarantee on format stability it is not the ideal choice.

    So yeah, XML isn’t fun to write by hand. But for this case, XML is a good choice.

    on April 26, 2016 04:20 PM

    sdc2016_full_logo

    It’s arrived! Samsung’s big yearly developer event kicks off from April 27th – 28th in SF. A place where developers, creators and builders alike come together to discuss the latest technologies and future innovations.

    This year, IOT will be one of the big focuses, especially around smart home and ARTIK – their new chipset for IOT. We’ll be there presenting via our developer evangelist – Didier – who’ll be showcasing a demo, plus a mention by ARTIK’s head of division within his talk.

    Our demo will be an app enabled home gateway on which we can deploy several applications. We’ll show you how your smart home could interact with a home robot to serve you. The robot will use the camera you have in the house to recognise that you’ve arrived, then use a microphone in the house to take orders from you (!)

    There are also other apps that can be deployed on the home gateway too, including an access point (home wifi), video service, local communication server (imagine a Skype or google hangout where data stays in your home), home automation etc. to name a few.

    In the build-up to the event we’ve written a few pre-event blogs on their website, including this one here!

    on April 26, 2016 03:45 PM

    My better half is a junior doctor. She works insanely long hours and cares completely for her patients. When you can see how much it costs somebody as conscientious as she is to walk out on strike, it's all the more frustrating that press coverage so spotty, confusing and often insulting.

    The underlying issue is so simple: There aren't enough doctors.

    Ignore everything you've been told. The situation in the NHS is simple to explain:

    • Doctors are a finite resource. We have 55,000 doctors in training in the NHS in England.
    • These 55,000 only barely cover existing shifts for full service regular 9-5ish Monday to Friday and emergency care 24/7. In many smaller hospitals there are already dangerous rota gaps from understaffing, but they just scrape by.

    The contract being imposed in August —the one doctors are striking against— was designed to make it affordable and legally possible for hospitals to spread these 55,000 doctors from 5 days full service, to 7 days full service.

    You can't safely do 7 days work with 5 days people.

    The Government's maths to make this "work": you take some doctors from midweek and move them to the weekend. That's what this contract allows, one way or the other. Fewer doctors in the week, and dangerously long shifts to cover the existing workload with fewer concurrent staff.

    And that isn't safe. The level of cover in some places is already dangerous. You can't spread doctors any thinner and expect anything but a diminished service. The NHS needs more doctors, not the same number spread over more days. And that's the only thing you need to consider when you're wondering why doctors are striking and whose fault that is.


    That's not to say that there aren't also other issues here. There are and they are significant but all of that can be boiled into the same argument. The NHS is already haemorrhaging doctors to countries with better working conditions and the cost to become a doctor here is huge. While we need the number of 55,000 junior doctors to grow substantially, everything about this contract and the treatment of existing doctors up to now will mean it likely shrinks away.

    I don't want to conflate the issue. Your doctors aren't striking over a 30% pay cut or additional weekends they'll be pulled in for, they're striking because they're being told that starting August they will be doing unsafe amount of work with a unsafe number of doctors. The rest is just distracting gravy.

    This contract is dangerous to patients, present and future. It must be resisted.

    on April 26, 2016 03:18 PM

    Forum Staff Additions

    Forums Council

    A healthy team is able to renew itself and integrate new members. It is always a refreshing and exciting process, to look for new people to add to a team.

    The following Ubuntu Forums users have accepted to be part of the Staff team, which now consists of 21 Moderators, 3 Super-Moderators and 5 Admins. In addition, 4 forums users have Moderator status in a specific sub-forum (UWN, Catalan and Argentina LoCo teams forums we host). You can find a complete list of the forums leaders here.

    The new Forums Moderators are :

    Congratulations from the Ubuntu Forums Council.


    on April 26, 2016 03:02 PM

    Prince

    Rhonda D'Vine

    Last week we lost another great musician, song writer, artist. It's painful to realise that more and more of the people you grew up with aren't there anymore. We lost Prince, TAFKAP, Symbol, Prince. He wrote a lot of great music, even some you wouldn't attribute to him, like Sinead O'Connor's Nothing Compares To You, Bangles' Manic Monday or Chaka Khan's I Feel For You. But I actually would like to share some songs that are also performed by himself, so without further ado here are the songs:

    Rest in peace, Prince. And you, enjoy.

    /music | permanent link | Comments: 0 | Flattr this

    on April 26, 2016 12:32 PM

    Two weeks ago was the GNOME Software hackfest in London, and I’ve been there! And I just now found the time to blog about it, but better do it late than never 😉 .

    Arriving in London and finding the Red Hat offices

    After being stuck in trains for the weekend, but fortunately arriving at the airport in time, I finally made it to London with quite some delay due to the slow bus transfer from Stansted Airport. After finding the hotel, the next issue was to get food and a place which accepted my credit card, which was surprisingly hard – in defence of London I must say though, that it was a Sunday, 7 p.m. and my card is somewhat special (in Canada, it managed to crash some card readers, so they needed a hard-reset). While searching for food, I also found the Red Hat offices where the hackfest was starting the next day by accident. My hotel, the office and the tower bridge were really close, which was awesome! I have been to London in 2008 the last time, and only for a day, so being that close to the city center was great. The hackfest didn’t leave any time to visit the city much, but by being close to the center, one could hardly avoid the “London experience” 😉 .

    Cool people working on great stuff

    towerbridge2016That’s basically the summary for the hackfest 😉 . It was awesome to meet with Richard Hughes again, since we haven’t seen each other in person since 2011, but work on lots of stuff together. This was especially important, since we managed to solve quite some disagreements we had over stuff – Richard even almost managed to make me give in to adding <kudos/> to the AppStream spec, something which I was pretty against supporting (it didn’t make it yet, but I am no longer against the idea of having that – the remaining issues are solvable).

    Meeting Iain Lane again (after FOSDEM) was also very nice, and also seeing other people I’ve only worked with over IRC or bug reports (e.g. William, Kalev, …) was great. Also lots of “new” people were there, like guys from Endless, who build their low-budget computer for developing/emerging countries on top of GNOME and Linux technologies. It’s pretty cool stuff they do, you should check out their website! (they also build their distribution on top of Debian, which is even more awesome, and something I didn’t know before (because many Endless people I met before were associated with GNOME or Fedora, I kind of implicitly assumed the system was based on Fedora 😛 )).

    The incarnation of GNOME Software used by endless looks pretty different from what the normal GNOME user sees, since it’s adjusted for a different audience and input method. But it looks great, and is a good example for how versatile GS already is! And for upstream GNOME, we’ve seen some pretty great mockups done by Endless too – I hope those will make it into production somehow.

    Ironically, a "snapstore" was close to the office ;-)

    Ironically, a “snapstore” was close to the office ;-)

    XdgApp and sandboxing of apps was also a big topic, aside from Ubuntu and Endless integration. Fortunately, Alexander Larsson was also there to answer all the sandboxing and XdgApp-questions.

    I used the time to follow up on a conversation with Alexander we started at FOSDEM this year, about the Limba vs. XdgApp bundling issue. While we are in-line on the sandboxing approach, the way how software is distributed is implemented differently in Limba and XdgApp, and it is bad to have too many bundling systems around (doesn’t make for a good story where we can just tell developers “ship as this bundling format, and it will be supported everywhere”). Talking with Alex about this was very nice, and I think there is a way out of the too-many-solutions dilemma, at least for Limba and XdgApp – I will blog about that separately soon.

    On the Ubuntu side, a lot of bugs and issues were squashed and changes upstreamed to GNOME, and people were generally doing their best to reduce Richard’s bus-factor on the project a little 😉 .

    I mainly worked on AppStream issues, finishing up the last pieces of appstream-generator and running it against some sample package sets (and later that week against the whole Debian archive). I also started to implement support for showing AppStream issues in the Debian PTS (this work is not finished yet). I also managed to solve a few bugs in the old DEP-11 generator and prepare another release for Ubuntu.

    We also enjoyed some good Japanese food, and some incredibly great, but also suddenly very expensive Indian food (but that’s a different story 😉 ).

    The most important thing for me though was to get together with people actually using AppStream metadata in software centers and also more specialized places. This yielded some useful findings, e.g. that localized screenshots are not something weird, but actually a wanted feature of Endless for their curated AppStore. So localized screenshots will be part of the next AppStream spec. Also, there seems to be a general need to ship curation information for software centers somehow (which apps are featured? how are they styled? added special banners for some featured apps, “app of the day” features, etc.). This problem hasn’t been solved, since it’s highly implementation-specific, and AppStream should be distro-agnostic. But it is something we might be able to address in a generic way sooner or later (I need to talk to people at KDE and Elementary about it).

    In summary…

    It was a great event! Going to conferences and hackfests always makes me feel like it moves projects leaps ahead, even if you do little coding. Sorting out issues together with people you see in person (rather than communicating with them via text messages or video chat), is IMHO always the most productive way to move forward (yeah, unless you do this every week, but I think you get my point 😀 ).

    For me, being the only (and youngest ^^) developer at the hackfest who was not employed by any company in the FLOSS business, the hackfest was also motivating to continue to invest spare time into working on these projects.

    So, the only thing left to do is a huge shout out of “THANK YOU” to the Ubuntu Community Fund – and therefore the Ubuntu community – for sponsoring me! You rock! Also huge thanks to Canonical for organizing the sponsoring really quickly, so I didn’t get into trouble with paying my flights.

    Laney and attente walking on the Millennium Bridge after we walked the distance between Red Hat and Canonical's offices.

    Laney and attente on the Millennium Bridge after we walked the distance between Red Hat and Canonical’s offices.

    To worried KDE people: No, I didn’t leave the blue side – I just generally work on cross-desktop stuff, and would like all desktops to work as well as possible 😉

    on April 26, 2016 07:50 AM

    Keep OpenStack Weird

    Dustin Kirkland



    The OpenStack Summit in Austin has already kicked off, and this time, Ubuntu is the official lanyard sponsor at OpenStack Summit Austin.

    The sponsorship contract for the OpenStack Summit explicitly states that only the official lanyard sponsor may distribute lanyards. Whilst we understand the reason that clause is there, we don't agree with it. It just doesn't seem very "open" nor in the spirit of OpenStack.

    Freedom of choice is an important aspect of all open source communities and one that we certainly champion, so attendees should be free to wear whatever branded lanyard they want with pride at the OpenStack Summit in Austin and we at Canonical will celebrate it.  My hometown here, Austin, prides itself on diversity, where we like to Keep Austin Weird!


    So please -- partners, customers, competitors, other OpenStack Sponsors: if you want to distribute your own lanyards then please go ahead safe in the knowledge that Canonical will not complain to the conference organizers.  Let's Keep OpenStack (a little bit) Weird, too!



    See you there!
    :-Dustin
    on April 26, 2016 04:39 AM

    April 25, 2016

    This is the ninth blog post in this series about LXD 2.0.

    LXD logo

    Introduction

    One of the very exciting feature of LXD 2.0, albeit experimental, is the support for container checkpoint and restore.

    Simply put, checkpoint/restore means that the running container state can be serialized down to disk and then restored, either on the same host as a stateful snapshot of the container or on another host which equates to live migration.

    Requirements

    To have access to container live migration and stateful snapshots, you need the following:

    • A very recent Linux kernel, 4.4 or higher.
    • CRIU 2.0, possibly with some cherry-picked commits depending on your exact kernel configuration.
    • Run LXD directly on the host. It’s not possible to use those features with container nesting.
    • For migration, the target machine must at least implement the instruction set of the source, the target kernel must at least offer the same syscalls as the source and any kernel filesystem which was mounted on the source must also be mountable on the target.

    All the needed dependencies are provided by Ubuntu 16.04 LTS, in which case, all you need to do is install CRIU itself:

    apt install criu

    Using the thing

    Stateful snapshots

    A normal container snapshot looks like:

    stgraber@dakara:~$ lxc snapshot c1 first
    stgraber@dakara:~$ lxc info c1 | grep first
     first (taken at 2016/04/25 19:35 UTC) (stateless)

    A stateful snapshot instead looks like:

    stgraber@dakara:~$ lxc snapshot c1 second --stateful
    stgraber@dakara:~$ lxc info c1 | grep second
     second (taken at 2016/04/25 19:36 UTC) (stateful)

    This means that all the container runtime state was serialized to disk and included as part of the snapshot. Restoring one such snapshot is done as you would a stateless one:

    stgraber@dakara:~$ lxc restore c1 second
    stgraber@dakara:~$

    Stateful stop/start

    Say you want to reboot your server for a kernel update or similar maintenance. Rather than have to wait for all the containers to start from scratch after reboot, you can do:

    stgraber@dakara:~$ lxc stop c1 --stateful

    The container state will be written to disk and then picked up the next time you start it.

    You can even look at what the state looks like:

    root@dakara:~# tree /var/lib/lxd/containers/c1/rootfs/state/
    /var/lib/lxd/containers/c1/rootfs/state/
    ├── cgroup.img
    ├── core-101.img
    ├── core-102.img
    ├── core-107.img
    ├── core-108.img
    ├── core-109.img
    ├── core-113.img
    ├── core-114.img
    ├── core-122.img
    ├── core-125.img
    ├── core-126.img
    ├── core-127.img
    ├── core-183.img
    ├── core-1.img
    ├── core-245.img
    ├── core-246.img
    ├── core-50.img
    ├── core-52.img
    ├── core-95.img
    ├── core-96.img
    ├── core-97.img
    ├── core-98.img
    ├── dump.log
    ├── eventfd.img
    ├── eventpoll.img
    ├── fdinfo-10.img
    ├── fdinfo-11.img
    ├── fdinfo-12.img
    ├── fdinfo-13.img
    ├── fdinfo-14.img
    ├── fdinfo-2.img
    ├── fdinfo-3.img
    ├── fdinfo-4.img
    ├── fdinfo-5.img
    ├── fdinfo-6.img
    ├── fdinfo-7.img
    ├── fdinfo-8.img
    ├── fdinfo-9.img
    ├── fifo-data.img
    ├── fifo.img
    ├── filelocks.img
    ├── fs-101.img
    ├── fs-113.img
    ├── fs-122.img
    ├── fs-183.img
    ├── fs-1.img
    ├── fs-245.img
    ├── fs-246.img
    ├── fs-50.img
    ├── fs-52.img
    ├── fs-95.img
    ├── fs-96.img
    ├── fs-97.img
    ├── fs-98.img
    ├── ids-101.img
    ├── ids-113.img
    ├── ids-122.img
    ├── ids-183.img
    ├── ids-1.img
    ├── ids-245.img
    ├── ids-246.img
    ├── ids-50.img
    ├── ids-52.img
    ├── ids-95.img
    ├── ids-96.img
    ├── ids-97.img
    ├── ids-98.img
    ├── ifaddr-9.img
    ├── inetsk.img
    ├── inotify.img
    ├── inventory.img
    ├── ip6tables-9.img
    ├── ipcns-var-10.img
    ├── iptables-9.img
    ├── mm-101.img
    ├── mm-113.img
    ├── mm-122.img
    ├── mm-183.img
    ├── mm-1.img
    ├── mm-245.img
    ├── mm-246.img
    ├── mm-50.img
    ├── mm-52.img
    ├── mm-95.img
    ├── mm-96.img
    ├── mm-97.img
    ├── mm-98.img
    ├── mountpoints-12.img
    ├── netdev-9.img
    ├── netlinksk.img
    ├── netns-9.img
    ├── netns-ct-9.img
    ├── netns-exp-9.img
    ├── packetsk.img
    ├── pagemap-101.img
    ├── pagemap-113.img
    ├── pagemap-122.img
    ├── pagemap-183.img
    ├── pagemap-1.img
    ├── pagemap-245.img
    ├── pagemap-246.img
    ├── pagemap-50.img
    ├── pagemap-52.img
    ├── pagemap-95.img
    ├── pagemap-96.img
    ├── pagemap-97.img
    ├── pagemap-98.img
    ├── pages-10.img
    ├── pages-11.img
    ├── pages-12.img
    ├── pages-13.img
    ├── pages-1.img
    ├── pages-2.img
    ├── pages-3.img
    ├── pages-4.img
    ├── pages-5.img
    ├── pages-6.img
    ├── pages-7.img
    ├── pages-8.img
    ├── pages-9.img
    ├── pipes-data.img
    ├── pipes.img
    ├── pstree.img
    ├── reg-files.img
    ├── remap-fpath.img
    ├── route6-9.img
    ├── route-9.img
    ├── rule-9.img
    ├── seccomp.img
    ├── sigacts-101.img
    ├── sigacts-113.img
    ├── sigacts-122.img
    ├── sigacts-183.img
    ├── sigacts-1.img
    ├── sigacts-245.img
    ├── sigacts-246.img
    ├── sigacts-50.img
    ├── sigacts-52.img
    ├── sigacts-95.img
    ├── sigacts-96.img
    ├── sigacts-97.img
    ├── sigacts-98.img
    ├── signalfd.img
    ├── stats-dump
    ├── timerfd.img
    ├── tmpfs-dev-104.tar.gz.img
    ├── tmpfs-dev-109.tar.gz.img
    ├── tmpfs-dev-110.tar.gz.img
    ├── tmpfs-dev-112.tar.gz.img
    ├── tmpfs-dev-114.tar.gz.img
    ├── tty.info
    ├── unixsk.img
    ├── userns-13.img
    └── utsns-11.img
    
    0 directories, 154 files

    Restoring the container can be done with a simple:

    stgraber@dakara:~$ lxc start c1

    Live migration

    Live migration is basically the same as the stateful stop/start above, except that the container directory and configuration happens to be moved to another machine too.

    stgraber@dakara:~$ lxc list c1
    +------+---------+-----------------------+----------------------------------------------+------------+-----------+
    | NAME |  STATE  |          IPV4         |                     IPV6                     |    TYPE    | SNAPSHOTS |
    +------+---------+-----------------------+----------------------------------------------+------------+-----------+
    | c1   | RUNNING | 10.178.150.197 (eth0) | 2001:470:b368:4242:216:3eff:fe19:27b0 (eth0) | PERSISTENT | 2         |
    +------+---------+-----------------------+----------------------------------------------+------------+-----------+
    
    stgraber@dakara:~$ lxc list s-tollana:
    +------+-------+------+------+------+-----------+
    | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
    +------+-------+------+------+------+-----------+
    
    stgraber@dakara:~$ lxc move c1 s-tollana:
    
    stgraber@dakara:~$ lxc list c1
    +------+-------+------+------+------+-----------+
    | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
    +------+-------+------+------+------+-----------+
    
    stgraber@dakara:~$ lxc list s-tollana:
    +------+---------+-----------------------+----------------------------------------------+------------+-----------+
    | NAME |  STATE  |          IPV4         |                     IPV6                     |    TYPE    | SNAPSHOTS |
    +------+---------+-----------------------+----------------------------------------------+------------+-----------+
    | c1   | RUNNING | 10.178.150.197 (eth0) | 2001:470:b368:4242:216:3eff:fe19:27b0 (eth0) | PERSISTENT | 2         |
    +------+---------+-----------------------+----------------------------------------------+------------+-----------+

    Limitations

    As I said before, checkpoint/restore of containers is still pretty new and we’re still very much working on this feature, fixing issues as we are made aware of them. We do need more people trying this feature and sending us feedback, I would however not recommend using this in production just yet.

    The current list of issues we’re tracking is available on Launchpad.

    We expect a basic Ubuntu container with a few services to work properly with CRIU in Ubuntu 16.04. However more complex containers, using device passthrough, complex network services or special storage configurations are likely to fail.

    Whenever possible, CRIU will fail at dump time, rather than at restore time. In such cases, the source container will keep running, the snapshot or migration will simply fail and a log file will be generated for debugging.

    In rare cases, CRIU fails to restore the container, in which case the source container will still be around but will be stopped and will have to be manually restarted.

    Sending bug reports

    We’re tracking bugs related to checkpoint/restore against the CRIU Ubuntu package on Launchpad. Most of the work to fix those bugs will then happen upstream either on CRIU itself or the Linux kernel, but it’s easier for us to track things this way.

    To file a new bug report, head here.

    Please make sure to include:

    • The command you ran and the error message as displayed to you
    • Output of “lxc info” (*)
    • Output of “lxc info <container name>”
    • Output of “lxc config show –expanded <container name>”
    • Output of “dmesg” (*)
    • Output of “/proc/self/mountinfo” (*)
    • Output of “lxc exec <container name> — cat /proc/self/mountinfo”
    • Output of “uname -a” (*)
    • The content of /var/log/lxd.log (*)
    • The content of /etc/default/lxd-bridge (*)
    • A tarball of /var/log/lxd/<container name>/ (*)

    If reporting a migration bug as opposed to a stateful snapshot or stateful stop bug, please include the data for both the source and target for any of the above which has been marked with a (*).

    Extra information

    The CRIU website can be found at: https://criu.org

    The main LXD website is at: https://linuxcontainers.org/lxd
    Development happens on Github at: https://github.com/lxc/lxd
    Mailing-list support happens on: https://lists.linuxcontainers.org
    IRC support happens in: #lxcontainers on irc.freenode.net
    Try LXD online: https://linuxcontainers.org/lxd/try-it

    on April 25, 2016 08:25 PM

    xenial-facebook

    The brave fearless volunteers behind Ubuntu GNOME are very happy to announce
    the official release of Ubuntu GNOME 16.04 LTS supported for 3 years and
    this is our 2nd official Long Term Support (LTS) version.

    Before you upgrade or download, kindly make sure to read:
    https://wiki.ubuntu.com/XenialXerus/ReleaseNotes/UbuntuGNOME

    You may want to download from:
    http://cdimage.ubuntu.com/ubuntu-gnome/releases/16.04/release/

    We highly suggest to download via torrent.

    Ubuntu 16.04 LTS release announcement:
    https://lists.ubuntu.com/archives/ubuntu-release/2016-April/003720.html

    Special thanks to each and everyone who made it happen. You’re the best, no
    doubt about it.

    Yet another achievement 😀

    If you have any questions, please don’t hesitate to contact us.

    Thank you for choosing and using Ubuntu GNOME!

    Ali Jawad
    Ubuntu GNOME Release and Community Manager

    on April 25, 2016 12:58 PM

    The wisest words spoken

    Stuart Langridge

    If all the world’s a stage
    Then light my way
    Because out, out your brief candle is not
    Four centuries past, yet I still cannot grasp
    That undiscovered country that makes words immortal
    If the good that men do is interred with their bones
    Then this precious stone is a beauty too rich
    Methinks it’s a jewel in the ear of us all
    As the wisest words spoken are spoken by fools

    from This Gives Life To Thee, performed by Akala, Nitin Sawhney, and Dane Hurst, as part of the BBC’s Shakespeare Live! From the RSC, 23rd April 2016.

    on April 25, 2016 08:09 AM

    To replace my aging and broken ThinkPad E Series (the cheaper and plastic-er ThinkPad), getting the latest and greatest in ThinkPad was decidedly the best course to go. After much deliberation, the T460s was my choice. So after a couple weeks with it, here is my review.

    It's definitely a ThinkPad

    The T460s like all ThinkPads is an understated, matte black box with minimal branding. To give this box some toughness, Lenovo uses a combination of magnesium-alloy for the chassis plus carbon-fibre-reinforced plastic to surround the display for the lid, all of which feels very nice. The T460s is also much thinner and lighter than most of the other laptops Lenovo's ThinkPad lineup (save the X1 series) at 1.88 cm (0.74 in) tall and weighing just 1.36 kg (3.0 lb).

    Performance & Hardware

    While this model is configured with a dual-core Intel Skylake Core i5 chip at 2.80 GHz, it is configurable up to a Core i7, also dual-core, at 3.40 GHz, which isn't spectacular but is comparable with many other laptops in this class.

    Fortunately, the magnesium case isn't a unibody design and the innards are easily accessible by unscrewing a few Phillips screws in the base. Memory-wise, the T460s comes with either 4GB or 8GB integrated with the motherboard, but there is a single slot for up to 16GB of additional DDR4 RAM which allows for some upgradeability. The same goes for the removable solid-state (and only solid-state) drive.

    All this makes the T460s very quick to boot, but not necessarily a powerhouse. For me, it has enough performance for most tasks –it handles my graphics workload without a hitch.

    Battery Life, Heat & Noise

    The thinness of the T460s comes with a trade-off: you lose the swappable battery you find on most ThinkPads which is a good trade-off in my view. Instead the T460s has two 3-cell internal batteries (23Wh & 26Wh each) which gives it a purported max 10.5 hours of battery life however under pretty intensive use I've gotten more in the range of 7-8 hours.

    While it's plugged-in and charging the underside of the T460s does get a little warm, but not significantly, which is likely a side effect of the laptop being thin and it using its metal enclosure to passively disperse heat.

    Speaking of heat: fans. It has one, but not so you'd notice. Most of the time the T460s is dead silent thanks to its SSD and passive cooling, even on the rare occasion when the fan is running, it's so quiet you'd never know.

    Ports & Connectivity

    Keeping with ThinkPads' usefulness, Lenovo has crammed a tonne of ports into the sides of the T460s. The left hosts a single USB 3.0 port, a headphone jack and an SD card slot –the AC adapter plugs into this side as well. On right side you'll find 2 more USB 3.0 ports one of which is powered, HDMI out, a Mini DisplayPort, GigaBit Ethernet, a Kensington lock slot plus a SIM card & Smart card reader slot (regardless if you have either of those options).

    You also get the usual assortment of the latest connectivity hardware in this Thinkpad: Intel 802.11ac wireless, Bluetooth 4.1 and optionally a WWAN module, with all the latest wireless standards.

    Display

    The display is a 14" IPS non-touch display at 1920x1080, but you can upgrade to a 2K (2560x1440) display with or without multi-touch.

    Even at lowest configuration (1080p) the display is great, it's sufficiently bright and crisp with 250 nits and a 700:1 contrast ratio. Nearly all sane viewing angles are covered, as well a few insane ones since the display can open to a full 180° –why one would do this is beyond me– and the hinge its on is very rigid.

    Keyboard & Input

    The chiclet-style keyboard is an excellent typing experience, as you would expect from a ThinkPad, with ample travel on each key and a satisfying click. There are a few nice details like LED indicators for the FnLock and CapsLock keys as well as the Mute key, and I've opted to have the entire keyboard LED backlit as well. My only keyboard grievance is the Windows-specific keys in the function row, instead of more generic items –alas, this is a symptom of the Microsoft monopoly.

    Now the touchpad in this ThinkPad isn't best-in-class, but it's sufficiently large and sports multitouch support –software-permitting–. But many ThinkPad users, like myself, go in for the requisite TrackPoint and if you like it, then great, if not, it's never in the way and if anything the addition buttons above the trackpad are still useful regardless if you use the nub. And in my view the little bit of red among all the black is a nice aesthetic touch.

    Aside from the keyboard, nub and touchpad, the only other things on this side of the T460s are the power button and a fingerprint reader (which I haven't used, more on that later).

    Camera & Audio

    The 720p camera is a pretty standard webcam, which is paired with a dual-array microphone. The speakers, however, leave a bit to be desired. They're pretty much devoid of bass and at higher volumes things start to sound tinny. Also, being on the bottom of the laptop they will be slightly muffled if you happen to have the T460s on your lap or another soft surface. So stick to hard surfaces for the best sound or pack some headphones.

    (One audio-related annoyance that I can't really fault Lenovo for overlooking is that at some volumes certain frequencies will vibrate the anti-static plastic tape that is on the inside of the laptop covering parts of the motherboard. That's my theory at least, I haven't removed the tape to test it.)

    Does it run Linux?

    Since I and probably many of you care about Linux support, I'm glad to say it does. However, since the T460s is brand new hardware, there may be issues running distros that ship older kernels (but I haven't tested that so don't hold me to it). But I'm all about using the latest and greatest, and Ubuntu 16.04 installs and works without a hitch. Driver-wise, the only thing that has no support at all is the fingerprint reader –which is no big loss– but everything else works great. That being said, that painlessness is due to the fact that Ubuntu ships proprietary drivers, if you care about that sort of thing.

    The T460s comes with Windows 10, obviously, which is authenticated for Secure Boot (no entering license keys!) so you shouldn't have a problem reinstalling Windows 10 if you chose to do so.

    Bottom Line

    If you like the ThinkPad aesthetic (as I do) and don't mind the battery losses in exchange for a new thinner body and are looking for a great (Linux) laptop, then I'd very much recommend the T460s. The drawbacks it does have, lie mostly in with its mediocre speakers.

    In my view, the best ThinkPads are and always will be machines for getting stuff done without compromising performance, durability or productivity. If you'd prefer a laptop with a flashier design and higher specs for the sake of higher specs, or if you value things like brushed aluminum and pounding bass, look elsewhere. But know that none of those other laptops are a ThinkPad.

    • Hardware & Design9
    • Keyboard10
    • Touchpad8
    • Display9
    • Speakers7
    • Battery8
    • Heat & Noise8
    • Performance8
    • Linux Compatibility10
    on April 25, 2016 05:00 AM

    April 24, 2016

    It is common in user interfaces to provide the user with a list of elements which can be reordered by dragging them around. Displaying a list of elements with Qt Quick is easy, thanks to the ListView component. Giving the user the ability to reorder them is less straightforward. This 3 article series presents one way to implement this.

    The goal of this first article is to create a list which can be used like this:

    Reordering elements in a ListView

    Architecture

    The approach I used was to do all the work in a DraggableItem, leaving the ListView untouched. DraggableItem is used as the delegate of the ListView, and wraps the real QML item responsible for showing the details of the list element.

    Lets start with main.qml. Nothing fancy at the beginning, we create a Window and a ListModel defining our elements:

    import QtQuick 2.6
    import QtQuick.Window 2.2
    import QtQuick.Controls 1.4
    import QtQuick.Layouts 1.1
    
    Window {
        visible: true
        width: 500
        height: 400
    
        ListModel {
            id: myModel
            ListElement {
                text: "The Phantom Menace"
            }
            ListElement {
                text: "Attack of the Clones"
            }
            ListElement {
                text: "Revenge of the Siths"
            }
            ListElement {
                text: "A New Hope"
            }
            ListElement {
                text: "The Empire Strikes Back"
            }
            ListElement {
                text: "Return of the Jedi"
            }
            ListElement {
                text: "The Force Awakens"
            }
        }
    

    Now comes the main Item. It contains a ColumnLayout which holds a Rectangle faking a toolbar and our ListView, wrapped in a ScrollView:

    Item {
        id: mainContent
        anchors.fill: parent
        ColumnLayout {
            anchors.fill: parent
            spacing: 0
    
            Rectangle {
                color: "lightblue"
                height: 50
                Layout.fillWidth: true
    
                Text {
                    anchors.centerIn: parent
                    text: "A fake toolbar"
                }
            }
    
            ScrollView {
                Layout.fillWidth: true
                Layout.fillHeight: true
                ListView {
                    id: listView
                    model: myModel
                    delegate: DraggableItem {
                        Rectangle {
                            height: textLabel.height * 2
                            width: listView.width
                            color: "white"
    
                            Text {
                                id: textLabel
                                anchors.centerIn: parent
                                text: model.text
                            }
    
                            // Bottom line border
                            Rectangle {
                                anchors {
                                    left: parent.left
                                    right: parent.right
                                    bottom: parent.bottom
                                }
                                height: 1
                                color: "lightgrey"
                            }
                        }
    
                        draggedItemParent: mainContent
    
                        onMoveItemRequested: {
                            myModel.move(from, to, 1);
                        }
                    }
                }
            }
    

    We can see DraggableItem used as a delegate of the ListView. Its API is simple: it wraps another item which shows the content (here it is a rectangle with a text and a one-pixel border at the bottom).

    DraggableItem has one property: draggedItemParent, which defines which item becomes the parent of our content item while it is being dragged around. Setting this to the main content of your window gives a more natural feeling when you drag the item below or above the ListView: the item is not clipped to its view and appears on top of the other UI elements.

    It also has a signal: moveItemRequested, which is emitted when the user dragged an item from one place to another. In this example we use ListModel.move to react to this but if you use a custom model you could call any other method.

    DraggableItem implementation

    DraggableItem contains a contentItemWrapper item, which is the parent of the DraggableItem child. When we start dragging, contentItemWrapper is reparented to the item specified in the draggedItemParent property of DraggableItem.

    This is the beginning of DraggableItem.qml, it shows how contentItem is wrapped inside contentItemWrapper:

    import QtQuick 2.0
    
    Item {
        id: root
    
        default property Item contentItem
    
        // This item will become the parent of the dragged item during the drag operation
        property Item draggedItemParent
    
        signal moveItemRequested(int from, int to)
    
        width: contentItem.width
        height: contentItem.height
    
        // Make contentItem a child of contentItemWrapper
        onContentItemChanged: {
            contentItem.parent = contentItemWrapper;
        }
    
        Rectangle {
            id: contentItemWrapper
            anchors.fill: parent
    

    Lets finish the definition of contentItemWrapper and continue with the code necessary to start the drag:

    //
            Drag.active: dragArea.drag.active
            Drag.hotSpot {
                x: contentItem.width / 2
                y: contentItem.height / 2
            }
    
            MouseArea {
                id: dragArea
                anchors.fill: parent
                drag.target: parent
                // Keep the dragged item at the same X position. Nice for lists, but not mandatory
                drag.axis: Drag.YAxis
                // Disable smoothed so that the Item pixel from where we started the drag remains
                // under the mouse cursor
                drag.smoothed: false
    
                onReleased: {
                    if (drag.active) {
                        emitMoveItemRequested();
                    }
                }
            }
        }
    
        states: [
            State {
                when: dragArea.drag.active
                name: "dragging"
    
                ParentChange {
                    target: contentItemWrapper
                    parent: draggedItemParent
                }
                PropertyChanges {
                    target: contentItemWrapper
                    opacity: 0.9
                    anchors.fill: undefined
                    width: contentItem.width
                    height: contentItem.height
                }
                PropertyChanges {
                    target: root
                    height: 0
                }
            }
        ]
    

    A few things are worth noting here:

    To create a draggable area, we use a MouseArea with the drag.target property set to the Item we want to drag.

    In contentItemWrapper, we set Drag.active to dragArea.drag.active. If we did not do this, we would still be able to drag our Item, but DropArea would not notice it moving hover them (DropArea.containsDrag would remain false). We also define Drag.hotspot to the center of the dragged item. The hotspot is the coordinate within the dragged item which is used by DropArea to determine if a dragged item is over them.

    When we start dragging, we change to the "dragging" state. In this state contentItemWrapper is reparented to draggedItemParent and the DraggableItem height is reduced to 0, completely hiding it.

    Unless you associate data to your drag, for example to implement dragging from an application to another, the DropArea won't emit the dropped signal. This is why we trigger the move in the handler of the MouseArea released signal.

    Dropping

    Now that we have the "drag" part, we need to take care of the "drop" part.

    Each DraggableItem contains a DropArea which is the same size as the DraggableItem and is positioned between its DraggableItem and the one next to it. This way when the user drops an item on a DropArea, we know we have to insert the dragged item after the item which owns the DropArea.

    There is a special case though: we also want the user to be able to drop an item before the first item. To handle this, the first DraggableItem of the list is going to be special: it will have another DropArea, with its vertical center aligned to the top edge of the DraggableItem.

    This diagram should make it clearer:

    DropArea positions

    As you can see, "Item 0" has two DropArea, whereas the other items only have one. Here is the code which adds the DropAreas:

    Loader {
        id: topDropAreaLoader
        active: model.index === 0
        anchors {
            left: parent.left
            right: parent.right
            bottom: root.verticalCenter
        }
        height: contentItem.height
        sourceComponent: Component {
            DraggableItemDropArea {
                dropIndex: 0
            }
        }
    }
    
    DraggableItemDropArea {
        anchors {
            left: parent.left
            right: parent.right
            top: root.verticalCenter
        }
        height: contentItem.height
        dropIndex: model.index + 1
    }
    

    We use a Loader to create the special DropArea for the first item of the list. DraggableItemDropArea is just a DropArea with a dropIndex property and a Rectangle to show a drop indicator. Before showing its code, lets finish the code of DraggableItem. The only remaining part is the function responsible for emitting the moveItemRequested signal:

    function emitMoveItemRequested() {
        var dropArea = contentItemWrapper.Drag.target;
        if (!dropArea) {
            return;
        }
        var dropIndex = dropArea.dropIndex;
    
        // If the target item is below us, then decrement dropIndex because the target item is
        // going to move up when our item leaves its place
        if (model.index < dropIndex) {
            dropIndex--;
        }
        if (model.index === dropIndex) {
            return;
        }
        root.moveItemRequested(model.index, dropIndex);
    }
    

    That's it for DraggableItem.

    DraggableItemDropArea

    Not much complexity here, we will actually remove this component later in the series. Here is the code:

    import QtQuick 2.0
    
    DropArea {
        id: root
        property int dropIndex
    
        Rectangle {
            id: dropIndicator
            anchors {
                left: parent.left
                right: parent.right
                top: dropIndex === 0 ? parent.verticalCenter : undefined
                bottom: dropIndex === 0 ? undefined : parent.verticalCenter
            }
            height: 2
            opacity: root.containsDrag ? 0.8 : 0.0
            color: "red"
        }
    }
    

    DraggableItemDropArea adds a dropIndex property and a Rectangle to draw the 2 pixel red line indicating where the item is going to be dropped, with a small hack to position the Rectangle correctly for the special case of the top DropArea of the first DraggableItem.

    That's it for this first article in the series. You can find the source code in the associated GitHub repository, under the "1-base" tag. You can now continue to the next article of the series.

    on April 24, 2016 04:28 PM
    The Raspberry Pi 2 version of Lubuntu has been updated to Lubuntu 16.04 LTS. Now it’s available at the downloads section. Grab it while it’s hot!
    on April 24, 2016 01:18 PM
    Xenial development

    Having recently relieved myself of various Ubuntu related commitments I've now become somewhat of a "floating contributor." Over the last few months I've spent a lot of time submitting and commenting on bug reports, testing ISOs and generally keeping abreast of what has been happening amongst various Ubuntu flavours especially Xubuntu. I continue to be very impressed by the hard work and enthusiasm of the "flavour" development teams who are of course all  unpaid volunteers.

    Xubuntu 16.04 LTS
    Xubuntu 16.04 LTS
    During the latter stages of the Xenial development cycle I tried to bring certain bugs to the attention of the developers and also provided the Xubuntu team with feedback about bugs specific to their flavour. I wish I could have done a lot more but I do have other interests and commitments especially at weekends when the sun is shining and I decide I'd rather be outdoors.

    An annoying Ubuntu bug

    Back in May 2015, Charles Profitt wrote a blog post entitled "Ubuntu Trash Bug", in which he stated that he would not upgrade to Ubuntu 15.04 because a bug bothered him so much.

    I recently remembered reading his post and thought that after working with the development version of Ubuntu 16.04 LTS for several months I've also seen a number of trivial bugs that have also bothered me greatly. They've been reported on Launchpad, added to the ISO Tracker numerous times yet Xenial Xerus has been released with a number of these bugs still very evident.

    For me, the most annoying bug in Ubuntu Xenial Xerus is bug #1521302 where gnome terminal windows that have been maximised in a Unity session cannot be restored to their original size. As a keen user of the command line I really hope that this bug, which of course is affecting many more users now that 16.04 has been released, will be fixed by the time of the first point release later in the year. Sadly the bug report is starting to attract adverse comments from users who just wish to express their opinion about the general usability, as they see it, of the latest release.

    My recommended alternative for now is terminator which isn't affected by this bug.

    Yakkety Yak

    I'm sure that I was not alone in thinking that that next release of Ubuntu might be called Yakkety Yak but then thought that there's no way that Mark Shuttleworth would ever chose such an obvious codename. Of course I was wrong.

    However, Yakkety Yak, or however you might want to spell it, will always remind me of this:


    on April 24, 2016 11:28 AM

    Over the coming week, there are a vast number of free software events taking place around the world.

    I'll be at the LinuxWochen Vienna and MiniDebConf Vienna, the events run over four days from Thursday, 28 April to Sunday, 1 May.

    At MiniDebConf Vienna, I'll be giving a talk on Saturday (schedule not finalized yet) about our progress with free Real-Time Communications (RTC) and welcoming 13 new GSoC students (and their mentors) working on this topic under the Debian umbrella.

    On Sunday, Iain Learmonth and I will be collaborating on a workshop/demonstration on Software Defined Radio from the perspective of ham radio and the Debian Ham Radio Pure Blend. If you want to be an active participant, an easy way to get involved is to bring an RTL-SDR dongle. It is highly recommended that instead of buying any cheap generic dongle, you buy one with a high quality temperature compensated crystal oscillator (TXCO), such as those promoted by RTL-SDR.com.

    Saturday, 30 April is also Linux Presentation Day in many places. There is an event in Switzerland organized by the local local FSFE group in Basel.

    DebConf16 is only a couple of months away now, Registration is still open and the team are keenly looking for additional sponsors. Sponsors are a vital part of such a large event, if your employer or any other organization you know benefits from Debian, please encourage them to contribute.

    on April 24, 2016 06:23 AM