30 Nov 2015
Big update for this GPS Navigation for Ubuntu Phone :)
|uNav for Ubuntu Phone|
You'll find things like...
|History on Search, Favorites and Nearby pages|
- Sort results by distance... and show that distance.
- New popup for POIs/click on map:
|Click on map or POI|
- Map attributions.
- Show all POIs on map:
|Show all POIs on your route|
- A lot of new POIs with a search included.
- Click on arrive time will switch time to go:
- Click on distance will show the speed.
- Allow custom zoom.
- Integrated headers.
- No Cancel Route if there is not a route.
- New Italian & Spanish voices by Silvia Bindelli & Fernando Lanero.
- Show translators in About page.
- Updated translations.
- Another minor fixes.
Just search uNav into the Ubuntu Store. A rate is preciated :)
FYI, you'll new to update your phone to OTA8.
Look in system updates.
It's libre, as our your Ubuntu Phone! |o/
30 Nov 2015 7:58pm GMT
The Maker's Guide to the Zombie Apocalypse is a fun book. It uses a (fictional?) story of preparation for a coming zombie invasion to weave a narrative that presents a use case for an interesting set of electronic projects. The projects are all centered on survival; specifically, the things you are likely to find most useful in a situation where the electrical grid has failed and you find yourself surrounded by hostile forces. The progression of chapter topics is logical and each build upon the previous.
We start with a both fun and well-thought-out description of the problem, an overview of what a zombie apocalypse might look like. Here we learn what we are up against. Starting with chapter two, we work to mitigate against the various problems and threats to enhance our potential for survival.
Included topics include generating and storing electricity, building alarms and surveillance monitors, remote access and open door detection, environmental monitoring, and then wiring it all together into a control center. Additional topics include ways to distract the attention of zombies and different forms of confusion with other survivors.
This alone would make the book enjoyable and useful to anyone interested in these sorts of electronic projects. However, the book does not end here. Included are three useful appendices with information about acquiring and understanding electronic parts and tools, learning basic skills, and a primer on one of the two control modules used in projects in the book, the Arduino. The other, the Raspberry Pi, is less complicated and requires less instruction for the uses in this book.
I thoroughly enjoyed this book and think that anyone with similar interest in electronics would, too.
30 Nov 2015 3:20pm GMT
Marco has come over to the Netherlands to pay me a visit, and to hack a little bit together, in person. So with the weather clearly suggesting to stay inside, that's what we did over the weekend, and how better to entertain yourself than to work on mobile software?
Marco has been working for a while on components that follow Plasma's human interface guidelines and make it easy to implement applications with a common navigation pattern and look and feel. Obviously, these components use a lot of Plasma under the hood, so they get excellent integration at a visual and at a technical level. This high integration, however, comes at the price of having a non-trivial chain of dependencies. That's not a problem om Plasma Mobile, or other Plasma workspaces, since all that is already there, anyway.
We thought that an interesting exercise would be to find out what really defines a "Plasma application", and how we can make the concepts we engrained in their design available to application developers more easily. How hard could it be to use Plasma components in an Android app, for example? The answer is, not entirely trivial, but it just became a whole lot easier. So what did we do?
For those reading this article via a feed aggregator, hop over to youtube to watch the demo video.
We took Subsurface, which is a piece of Free software used for logging and analysing scuba dives. Subsurface is a mobile version, which is still in its infancy, so it's an excellent candidate to experiment with. We also took Marco's set of Plasma components that provide a reduced set of functionality, in fact, just enough to create what most applications will need. These components extend QtQuick components where we found them lacking. They're very light weight, carry no dependencies other than QtQuick, and they're entirely written in QML, so basically, you add a bunch of QML files to your app and concentrate on what makes your app great, not on overall navigation components or re-implementing for the n-th time a set of widgets.
So after solving some deployment issues, on Saturday night, we had the Plasma mobile components loading in an Android app. A first success. Running the app did show a number of problems, however, so we spent most of the Sunday to look into each problem one by one and trying to solve them. By early Monday morning, we had all of the glaring issues we found during our testing solved, and we got Subsurface mobile to a pretty solid appearance (pretty solid given its early state of development, not bug free by any means).
So, what to take a away from this? In a reduced form, Plasma can be a huge help to create also Android applications. The mobile components which we're developing with Plasma Mobile as target in mind have had their first real world exposure and a lot of fixes, we got very useful feedback from the Subsurface community which we're directly feeding back into our components.
A big thanks goes out to the Subsurface team and especially Dirk Hohndel for giving us excellent and timely feedback, for being open to our ideas and for willing to play guinea pig for the Plasma HIG and our components. The state you can see in the above video has already been reviewed and merged into Subsurface's master tree, so divers around the world will be able to enjoy it when the app becomes available for a wider audience.
30 Nov 2015 2:09pm GMT
Sabayon Linux 15.12 is an operating system designed for Linux enthusiasts who want the latest packages and the best performance. This is a system based on Gentoo, which is known for its reliability.
Let's face it, there aren't too many Gentoo-based operating systems out there, but Sabayon is proof that you can also use other bases than some of the big names like Debian, Fedora or Arch. It employs a rolling release model, which means that changes and improvement are pushed on a constant basis, and each month the ISO is regenerated with the latest packages.
Sabayon is also a system that provides the newest packages from the Gentoo repositories, making sure that it stays up to date. This way, users have the latest KDE, GNOME, or LibreOffice software. This makes Sabayon one of the few bleeding-edge Linux distributions that put emphasis on new and interesting rather than old and stable.
Submitted by: Arnfried Walbrecht
30 Nov 2015 9:23am GMT
For my example, I'm going to grab some review data from Ubuntu (API) which looks something like this:
"histogram": "[35, 13, 22, 42, 117]"
"histogram": "[17, 7, 17, 63, 442]"
The data is a single array of objects that contain the statistics for each package. For this example I'll print out the number of ratings for each package by getting the package_name and ratings_total members from each object.
Firstly, I need to download the data. The data is retrieved using a HTTP GET request; in libsoup you can do this with:
SoupSession *session = soup_session_new_with_options (SOUP_SESSION_USER_AGENT, "test-json", NULL);
SoupMessage *message = soup_message_new (SOUP_METHOD_GET, "https://reviews.ubuntu.com/reviews/api/1.0/review-stats/any/any");
soup_session_send_message (session, message);
Now I have the server text in message->response_body->data but it needs to be decoded. JSON-GLib can parse it with:
JsonParser *parser = json_parser_new ();
json_parser_load_from_data (parser, message->response_body->data, -1, NULL);
JsonNode *root = json_parser_get_root (parser);
Now I have an in-memory tree of the JSON data which can be traversed. After checking the root node is an array as expected I'll iterate over each object:
g_assert (JSON_NODE_HOLDS_ARRAY (root));
array = json_node_get_array (root);
for (i = 0; i < json_array_get_length (array); i++)
JsonNode *node = json_array_get_element (array, i);
/* do stuff... */
For each object, I extract the required data:
g_assert (JSON_NODE_HOLDS_OBJECT (node));
JsonObject *object = json_node_get_object (node);
const gchar *package_name = json_object_get_string_member (object, "package_name");
gint64 ratings_total = json_object_get_int_member (object, "ratings_total");
g_print ("%s: %" G_GUINT64_FORMAT "\n", package_name,
Combined into a program, I can print out the number of reviews for each package:
The full program:
// gcc -g -Wall example-json.c -o example-json `pkg-config --cflags --libs libsoup-2.4 json-glib-1.0`
int main (int argc, char **argv)
/* Get the data using a HTTP GET */
session = soup_session_new_with_options (SOUP_SESSION_USER_AGENT, "test-json", NULL);
message = soup_message_new (SOUP_METHOD_GET, "https://reviews.ubuntu.com/reviews/api/1.0/review-stats/any/any");
g_assert (message != NULL);
status_code = soup_session_send_message (session, message);
g_assert (status_code == SOUP_STATUS_OK);
/* Parse the data in JSON format */
parser = json_parser_new ();
result = json_parser_load_from_data (parser, message->response_body->data, -1, NULL);
/* The data should contain an array of JSON objects */
root = json_parser_get_root (parser);
g_assert (JSON_NODE_HOLDS_ARRAY (root));
array = json_node_get_array (root);
for (i = 0; i < json_array_get_length (array); i++)
const gchar *package_name;
/* Get the nth object, skipping unexpected elements */
node = json_array_get_element (array, i);
if (!JSON_NODE_HOLDS_OBJECT (node))
/* Get the package name and number of ratings from the object - skip if has no name */
object = json_node_get_object (node);
package_name = json_object_get_string_member (object, "package_name");
ratings_total = json_object_get_int_member (object, "ratings_total");
g_print ("%s: %" G_GINT64_FORMAT "\n", package_name, ratings_total);
/* Clean up */
And to show you can do the same thing with GIR bindings, here's the same in Vala:
// valac example-json.vala --pkg soup-2.4 --pkg json-glib-1.0
public int main (string args)
/* Get the data using a HTTP GET */
var session = new Soup.Session.with_options (Soup.SESSION_USER_AGENT, "test-json");
var message = new Soup.Message ("GET", "https://reviews.ubuntu.com/reviews/api/1.0/review-stats/any/any");
assert (message != null);
var status_code = session.send_message (message);
assert (status_code == Soup.Status.OK);
/* Parse the data in JSON format */
var parser = new Json.Parser ();
parser.load_from_data ((string) message.response_body.data);
catch (Error e)
/* The data should contain an array of JSON objects */
var root = parser.get_root ();
assert (root.get_node_type () == Json.NodeType.ARRAY);
var array = root.get_array ();
for (var i = 0; i
/* Get the nth object, skipping unexpected elements */
var node = array.get_element (i);
if (node.get_node_type () != Json.NodeType.OBJECT)
/* Get the package name and number of ratings from the object - skip if has no name */
var object = node.get_object ();
var package_name = object.get_string_member ("package_name");
var ratings_total = object.get_int_member ("ratings_total");
if (package_name != null)
stdout.printf ("%s: %" + int64.FORMAT + "\n", package_name, ratings_total);
from gi.repository import Soup
from gi.repository import Json
# Get the data using a HTTP GET
session = Soup.Session.new ()
session.set_property (Soup.SESSION_USER_AGENT, "test-json")
message = Soup.Message.new ("GET", "https://reviews.ubuntu.com/reviews/api/1.0/review-stats/any/any")
assert (message != None)
status_code = session.send_message (message)
assert (status_code == Soup.Status.OK)
# Parse the data in JSON format
parser = Json.Parser ()
parser.load_from_data (message.response_body.data, -1)
# The data should contain an array of JSON objects
root = parser.get_root ()
assert (root.get_node_type () == Json.NodeType.ARRAY)
array = root.get_array ()
for i in xrange (array.get_length ()):
# Get the nth object, skipping unexpected elements
node = array.get_element (i)
if node.get_node_type () != Json.NodeType.OBJECT:
# Get the package name and number of ratings from the object - skip if has no name
object = node.get_object ()
package_name = object.get_string_member ("package_name")
ratings_total = object.get_int_member ("ratings_total")
if package_name != None:
print ("%s: %d" % (package_name, ratings_total))
30 Nov 2015 7:55am GMT
29 Nov 2015
Viernes, 27 Noviembre
Llevaba tiempo con ganas de ir a la Ubucon de ParÃs, una de las mÃ¡s famosas :) AdemÃ¡s, para esta se animÃ³ Fernando Lanero :D asÃ que serÃ¡ nuestra segunda Ubucon (Â¡quÃ© recuerdos de Colombia!).
|Are you ready?|
Tras el vuelo y trenes de rigor, dejamos las cosas en el hotel y nos dirigÃmos al bar donde habÃan quedado algunos organizadores, despuÃ©s de montar todo el chiringuito para los prÃ³ximos dos dÃas.
AhÃ tuvimos la suerte de compartir unas pizzas y cervezas con parte de Ubuntu Francia; Olivier nos convenciÃ³ de por quÃ© el Lenovo X201 es el mejor portÃ¡til (Â¡quiero uno! ;P) y convencimos a Matthieu de que se quedara mÃ¡s tiempo gracias al lÃquido ambar ;P Llevaba mucho tiempo con ganas de conocer a Rudy, en persona se confirmÃ³ que es un hombre excepcional.
En la noche, el frÃo y la lluvia nos acompaÃ±Ã³ hasta el hotel.
SÃ¡bado, 28 Noviembre
Â¡Primer dÃa de Ubucon! Nos levantamos temprano para estar a primera hora en el edificio de la Ciudad de las Ciencias.
AllÃ estaba Vincent :)) Â¡QuÃ© alegrÃa verle! Pues no coincidÃamos desde el evento de Insiders en Londres. TambiÃ©n conocÃ a Simon, David CallÃ© y Nicolas, quedrÃa haber podido compartir mÃ¡s tiempo con ellos :)
Â¿Y quÃ© decir de la Ubucon? Â¡Impresionante! Nos sentimos como en casa, su hospitalidad fue extraordinaria. La organizaciÃ³n perfecta, el sitio genial, las conferencias y talleres muy interesantes y atiborrados de gente.
Me pasÃ© el dÃa de conferencia en conferencia, paseando por la zona de asociaciones como Mozilla, Wikipedia o Framasoft donde conocÃ a Genma, quien transmite muchÃsima pasiÃ³n hablando de la libertad.TambiÃ©n vÃ por primera vez la convergencia de Ubuntu :D Y os aseguro que es una pasada :D
Desde aquÃ quiero agradecer a Francis, muy majo, su ayuda con la traducciÃ³n de mi charla.
El dÃa se me pasÃ³ volando, tanto, que cuando me dÃ cuenta, estabamos en el bar para cenar juntos 46 compaÃ±eros ubunteros, sÃ, 46 :O nos adueÃ±amos del bar :P AhÃ conocÃ a Quest, quien graba los podcast de Ubuntu France.
La velada la finalizamos en otro bar, compartiendo Ãdeas para solucionar el mundo :)
Domingo, 29 Noviembre
Â¡Y segundo dÃa de la Ubucon! O mÃ¡s bien, nuestro segundo medio dÃa, pues el vuelo sale por la tarde. AÃºn asÃ, diÃ³ tiempo a ver un par de conferencias y volver a sorprendernos de la cantidad de personas que asisten a interesarse por Ubuntu. Y ademÃ¡s Matthieu nos enseÃ±Ã³ los talleres de Fablab, uf, ahÃ podrÃamos pasar dÃas enteros, una pasada.
Con mÃ¡s tiempo, experimentÃ© mÃ¡s con el ordenador de exposiciÃ³n que muestra la convergencia y pude probar uNav en modo escritorio :P
|and future :)|
|Lovely game and guy!|
Tienes mÃ¡s fotos de Ubuntu-FR aquÃ.
29 Nov 2015 10:04pm GMT
Elive 2.6 has been in development for quite some time now, and the 2.6.12 Beta release brings more bugfixes, especially for the graphical installer, which is now capable of handling certain scenarios. Additionally, the clock widget has been added and enabled by default on the desktop, and there are also various under-the-hood improvements.
The overall speed process of the installer has also been improved in Elive 2.6.12 Beta, although it still requires users to pay a certain amount of money for the installation. In the meantime, the developers are working on support for 64-bit hardware architectures, as well as on providing more reliable package updates and fixes.
Submitted by: Arnfried Walbrecht
29 Nov 2015 10:09am GMT
28 Nov 2015
This week I had a rather frustrating customer experience. Now, in these kinds of situations some folks like to take to their blogs to spew their frustration in the direction of the Internet and feel a sense of catharsis.
To be honest, what I found frustrating about this experience was less the outcome and more the way the situation was managed. The frustration then turned into an interesting little thought experiment about the psychology going on in this experience and how it could potentially be improved.
So, I sat down and thought about why the experience was frustrating and came away with some conclusions that I thought might be interesting to share. This may be useful for those of you building your own customer service/engagement departments.
A while ago I booked some flights to take my family to England for Christmas. Using an airline Erica and I are both big fans of, we managed to book the trip using miles. We had to be a little flexible on dates/times, but we figured this would be worth it to save the $1500+.
Like anyone picking flights, the times and dates were carefully considered. My parents live up in the north of England and it takes about four hours to get from Heathrow to their house (with a mixture of trains and taxis). Thus we wanted to arrive at Heathrow from San Francisco earlier in the day, and for our return flight to be later in the day to accommodate this four hour trip.
Recently I was sent an email that the airline had decided to change the times of our flights. More specifically, the return flight which was due to leave at 3.15pm was now shifted to closer to 12pm. As such, to get to Heathrow with the requisite few hours before our flight it would have mean't us leaving my parents house at around 5am. Ugh.
Now, to help illustrate the severity of this issue, this would mean getting a 3 year-old up at 4.15am to embark on a four hour journey to London and of course the 11 hour flight back to San Francisco. The early morning would make the whole trip more difficult.
Expected reaction of Jack when this happens (credit)
As you can imagine, we were not particularly amused by this. So, I went to call the airline to see if we could figure out a better solution.
I called the airline and politely illustrated the problem, complete with all the details of the booking.
I was then informed that they couldn't do anything to change the flight time (obviously), and there were no other flights that day (understandable).
So, I asked if they could simply re-book my family onto the same flight the following day. This would then mean we could head to the airport, stay in a hotel that evening near Heathrow, and make the noon flightâ€¦all without having to cut our holiday short by a day.
I was promptly informed that this was not going to work. The attendant told me that because we had purchased a miles-based ticket, they could only move us to miles-based ticketed seats the following day without a charge. I was also informed that the airline considers anything less than a 5 hour time change to be "insignificant" and thus are not obliged to provide any additional amendments or service. To cap things off I was told that if I had read the Terms Of Service this would have all been abundantly clear.
To explore all possible options I asked how much the change fees would be to move to the same flight the following day but in non-mileage based seats and the resulting cost was $1500; quite a number to swallow.
The airline's perception of my house (credit)
As I processed this information I was rather annoyed. I booked these tickets in good faith and the airline had put us in this awkward position with the change of times. While I called to explore a flexible solution to the problem, I was instead told there would be no flexibility and that they were only willing to meet their own defined set of obligations.
As you can imagine, I was not particularly happy with this outcome so I felt it appropriate to escalate. I politely asked to speak to a manager and was informed that the manager would not take my call as this was merely a ticket-related issue. I pressed further to ask to speak to a manager and after a number of additional pushbacks about this not being important enough for a manager and that they may not take my call, I was eventually put through.
When I spoke to the manager the same response was re-iterated. We finished the conversation and I made it clear I was not frustrated with any of the staff who I spoke to (they were, after all, just doing their job and don't set airline policy), but I was frustrated with the airline and I would not be doing business with them in future.
Now to be clear, I am not expecting to be treated like royalty. I just felt the overall situation could have possibly been handled better.
A Better Experience
Now, to be clear before we proceed, I am not an expert on customer service, how it is architected, and the methodology of delivering the best customer service while protecting the legal and financial interests of a company.
I am merely a customer, but I do think there were some underlying principles that exist in people and how we engage around problems such as this that the airline seems to be ignoring.
Let's first look at what I think the key problems were in this engagement:
Accountability and Assurance
At no point throughout the discussion did one of the customer service reps say:
"Mr Bacon, we know we have put you in an awkward situation, but we assure you we are going to do our level best to find a solution that you and your family are happy with."
A simple acknowledgement such as this serves three purposes. Firstly, it lets the customer feel the company is willing to accept responsibility. Secondly, it demonstrates a collaborative human side to the company. Finally, and as we will explore later, it equalizes the relationship between the customer and the company. This immediately gets the conversation off to a good start.
Obligations vs. Gestures Of Goodwill
Imagine your friend does something that puts you in an awkward position, for example, saying they will take care of part of a shared project which they then say they are not going to have time to deliver.
Now imagine the conversation looks like this:
You: you have kind of put me in an awkward situation here, friend. What do you think you can do to help resolve it?
Friend: well, based upon the parameters of the project and our friendship I am only obliged to provide you with a certain level of service, which is X.
This is not how human beings operate. When there is a sense that a shared agreement has been compromised, it is generally recommended that the person who compromised the agreement will (a) demonstrate a willingness to rectify the situation and (b) provide a sense of priority in doing so.
When we replace thoughtful problem-solving with "obligations" and "terms of service", which while legally true and accurate, it changes the nature of the conversation to be one that is more pedantic and potentially adversarial. This is not what anyone wants. It essentially transforms the discussion from a collaboration to a sense that one party is covering their back and wants to put in minimal effort to solve the problem. This neatly leads me toâ€¦
Trust and Favors
Psychology has taught us that favors play an important role in the world. When we feel someone has treated us well we socially feel a responsibility to repay the favor.
Consequently in business when you feel a company goes above and beyond, consumers will often repay that generosity significantly.
In this case the cost to me of reseating my family was $1500. Arguably this will be a lower actual cost to the airline, let's say $1000.
Now, let's say the airline said:
"Mr Bacon, as I mentioned it is difficult to move you to the seats on the flight the following day as you have a mileage ticket, but I have talked to my manager and we would be happy to provide a 30% discount."
If this happened it would demonstrate a number of things. Firstly, the airline was willing to step outside of their published process to solve the customer's problem. It demonstrates a willingness to find a middle-ground, and it shows that the airline wants to minimize the cost for the customer.
If this had occurred I would have come away singing the praises of the airline. I would be tweeting about how impressed I was, telling my friends that they are "different to the usual airlines", and certainly keeping my business with them.
This is because I would feel that they took care of me and did me a favor. As such, and as we see elsewhere in the world, I would feel an urge to repay that favor, both with advocacy and future business.
Unfortunately, the actual response of what they are obliged to do and that they are covered by their terms of service shows an unwillingness to work together to find a solution.
Thus, the optimal solution would cost them a $500 loss but assure future business and customer advocacy. The current solution saves them $500 but means they are less likely to get my future business or advocacy.
Relativity and Expectations
People think largely in terms of relativity. We obviously compare products and services but we also compare social constructs and our positions in the world too.
This is important because a business transaction is often a power struggle. If you think about the most satisfying companies you have purchased a product or service from, invariably the ones where you felt like an equal in the transaction was more rewarding. Compare for example the snooty restaurant waiter that looks down at you versus the chatty and talkative waiter who makes you feel at ease. The latter makes you feel more of an equal and thus feels like a better experience.
In this case the airline customer service department made it very clear from the outset that they considered themselves in a position of power. The immediate citing of obligations, terms of service, an unwillingness to escalate the call, and other components essentially put the customer in a submissive position, which rarely helps contentious situations.
The knock-on effect here is expectations: when a customer feels unequal it sets low expectations in the business relationship and we tend to think less highly of the company. The world is littered with examples of this sense of an unequal relationship with many cable companies getting a particularly bad reputation here.
Another interesting construct in psychology is the importance of choice. Choices provide a fulfilling experience for people and it makes people feel a sense of control and empowerment.
In this case the airline provided no real choices with the exception of laying down $1500 for full-price tickets for the non-mileage seats. If they had instead provided a few options (e.g. a discounted ticket, an option to adjust the flight time/date, or even choices for speaking to other staff members such as a manager to rectify the situation) the overall experience would feel more rewarding.
The Optimal Solution
So, based on all this, how would I have recommended the airline handled this? Well, imagine this conversation (this is somewhat paraphrased to keep it short, but you get the drift):
Me: Good afternoon. We have a bit of a problem where your airline has changed the time my family's return flights. Now, we have a 3 year-old on this trip and this is going to result in getting up at 4.15am to make the new time. As you can imagine this is going to be stressful, particularly with such a long trip. Is there anything you can do to help?
Airline: I am terribly sorry to hear this. Can you let me know your booking ID please?
Me: Sure, it is ABCDEFG.
Airline: Thank-you, Mr Bacon. OK, I can see the problem now. Firstly, I want to apologize for this. We know that the times of reservations are important and I am sorry your family are in this position. Unfortunately we had to change the time due to XYZ factors, but I also appreciate you are in an uncomfortable situation. Rest assured I want to do everything to make your trip as comfortable as possible. Would you mind if I put you on hold and explore a few options?
Airline: OK, Mr Bacon. So the challenge we have is that because you booked a mileage-based ticket, our usual policy is that we can only move you to mileage-based seats. Now, for the day after we sadly don't have any of these types of seats left. So, we have a few options. Firstly, I could explore a range of flight options across dates that work for you to see if there is something that works by moving the mileage-based seats free of charge. Secondly, we could explore a refund of your miles so you could explore another airline or ticket. Now, there are normal seats available the day after but the fee to switch to them would be around $1500. We do though appreciate you are in an uncomfortable position, particularly with a child, and we also appreciate you are a regular customer due to you booking mileage seats. Unfortunately while I am unable to provide these new seats free of chargeâ€¦I wish I could but I am unable toâ€¦I can provide a discount so we provide a 1/3 off, so you pay $1000. Another option is that I can put you through to my manager if none of these options will work for you. What would you prefer?
Me: Thanks for the options. I think I will go for the $1000 switch, thanks.
Airline: Wonderful. Again, Mr Bacon, I apologize for thisâ€¦I know none of us would want to be in this position, and we appreciate your flexibility in finding a solution.
If something approximating this outcome occurred, I would have been quite satisfied with the airline, I would have felt empowered, left with a sense that they took care of me, and I would be sharing the story with my friends and colleagues.
This would have also mitigated taking a manager's time and reduced the overall call time to around 10 - 15 minutes as opposed to the hour that I was on the phone.
To put the cherry on top I would then recommend that the airline sends an email a few days later that says something like this:
Dear Mr Bacon,
One of my colleagues shared with me the issue you had with your recent booking and the solution that was sourced. I want to also apologize for the change in times (we try to minimize this as best we can because we know how disruptive this can be).
I just wanted to follow up and let you know that if you have any further issues or questions, please feel free to call me directly. You can just call the customer service line and use extension 1234.
Jane Bloggs, Customer Service Team Manager
This would send yet another signal of clear customer care. Also, while I don't have any data on-hand to prove this, I am sure the actual number of customers that would call Jane would be tiny, thus you get the benefit of the caring email without the further cost of serving the customer.
Now, some of you may say "well, what if the airline can't simply slash the cost by a third for the re-seating?"
In actuality I think the solution in many cases is secondary to the handling of the case. If the airline in this case had demonstrated a similar optimal approach that I outline here (acknowledging the issue, sympathizing with the customer, an eagerness to solve the problem creatively, providing choices etc), yet they could not provide any workable solution, I suspect most people would be reasonably satisfied with the effort.
Eventually they never solved the problem in our case, so a 4.15am wake-up and a grumpy Jack it is. While rather annoying, in the scheme of things it is manageable. I just thought the psychology behind the story was interesting.
Anyway, sorry for the long post, but I hope this provides some interesting food for thought for those of you building customer service platforms for your companies.
28 Nov 2015 10:42pm GMT
I just had a shocking experience at a college football game and I feel the need to talk about it because if we don't talk about these things then we condone them.
I met Zia Combs today. He played for the University of Michigan as a defensive back. Hailing from MSU I was not familiar with his career. We kind of just do our thing, and move on. He was awesome, he came into the tent talking to people, and his assistant/friend was really great too. I don't know anything about this guy, so meeting him and knowing he was a thing at the U of M was really neat for me.
I met him because he stopped by a tailgate that I was invited to by my neighbor since and I had never been to a Michigan tailgate before. Everything was awesome all day; good food, good people, and a general camaraderie around football. I've never been to the Big House, and I really wanted to experience the UM tailgate experience. People from Ohio State stopped by and generally it was all around midwestern awesomeness. People laughed and joked about the teams that they were rooting for and I thought that was all a part of the atmosphere.
Then at some point it got nasty. Ohio State started to win and the "quirky Spartan who is here" turned into "that fucking asshole." At the third quarter I was asked to leave. Fair enough, you don't want me here, fine. We got bigger games to win.
On the way out it felt like I literally walked into an episode of The Walking Dead. I walk out of the golf field area where the tailgate was and some kid is in the middle of the field surrounded by U-M fans. He's clearly young and wasted in his OSU sweatshirt. He's surrounded by Wolverines, and they're not being friendly whatsoever. WTF am I supposed to do, he's outmatched and people were looking like they were pissed. I have no idea why.
So clearly I'm like "Well, welcome to the Big House, I've been here all morning and everything was fine, and I just got kicked out of a tailgate because ____."
Ends up it was not fine and I recognize Vincent Smith and his friend around the kid. So I walk up because I knew he saw me from earlier that morning. And he's like "You better get this kid out of here." People were literally standing around this kid about to beat him. I have no idea what this kid did to get himself into that kind of situation, and I'm sure he was annoying as hell in his OSU sweatshirt, but that's beside the point. I took it upon myself to take him across the street and found an aid station and dropped him off.
This bothers me for a few reasons:
- In the US we're very competitive, ribbing someone for sports is totally fine. It becomes totally not fine when people take it outside of bounds. There's a difference between friendly rivalries and being an asshole. It doesn't matter if OSU or U-M wins; as a Spartan, the entire outcome doesn't affect me at all.
- Zia Combs is awesome. Never really knew the guy but from talking to him and his friends, he's a class act all the way. I have no idea why U-M people wanted to beat the shit out of that kid, but he defused the situation and he was a geniunenly nice guy.
- I met a bunch of amazing fans today and they were great, and my experience was ruined by a loud minority of douchebags.
Overall, I am not impressed with my first experience tailgating at a University of Michigan football game. I respect what Jim Harbaugh has brought to the program, but from my experience today, you are still arrogant, entitled douchebags. It saddens me that my first experience at the Big House is watching Zia Combs stick up for some random kid being bullied.
42-13. Ohio State.
EDIT: My original comment said "beat him to death". I don't feel at any point that was going to happen. In hindsight that is way too hyperbolic. I have corrected my comment.
EDIT: My original post mentioned Vincent Smith as the U-M player; I was incorrect, it was Zia Combs.
28 Nov 2015 9:48pm GMT
In many travel-related web sites for airlines and hotels, there is some attempt to sting the customer with an extra fee by performing a currency conversion at an inflated exchange rate. Sometimes it is only about five percent and this may not appear to be a lot but in one case a hotel was trying to use a rate that increased the cost of my booking by 30%. This scheme/scam is referred to as Dynamic Currency Conversion (DCC). Sometimes the website says that they are making it "easy" for you by giving you a "guaranteed" exchange rate that "might" be better than the rate from your bank. Sometimes a hotel or restaurant in a tourist location insists that you have to pay in a currency that is not the same as the currency on your booking receipt or their menu card, this is also a DCC situation.
Reality check: these DCC rates are universally bad. Last time I checked, my own credit card only has a 0.9% fee for currency conversion. Credit card companies have become a lot more competitive but the travel industry hasn't.
Airbnb often claims that they want to help the little guy and empower people, at least that is the spin they were using when New York city authorities were scrutinizing their business model. Their PR blog tries to boast about the wonderful economic impact of Airbnb.
But when it comes to DCC, the economic impact is universally bad for the customer and good for Airbnb's bosses. Most sites just turn on DCC by default and add some little opt-out link or checkbox that you have to click every time you book. Airbnb, however, is flouting regulations and deceiving people by trying to insist that you can't manually choose the currency you'll use for payment.
Fortunately, Visa and Mastercard have insisted that customers do have the right to know the DCC exchange rate and choose not to use DCC.
What are the rules?
Looking at the Visa system, the Visa Product and Service Rules, page 371, s18.104.22.168 include the statement that the merchant (Airbnb) must "Inform the Cardholder that Dynamic Currency Conversion is optional".
The same section also says that Airbnb must "Not use any language or procedures that may cause the Cardholder to choose Dynamic Currency Conversion by default". When you read the Airbnb help text about currencies, do you think the language and procedures there comply with Visa's regulations?
What does Airbnb have to say about it?
I wrote to Airbnb to ask about this. A woman called Eryn H replied "As it turns out we cannot provide our users with the option to disable currency conversion."
She went on to explain "When it comes to currency converting, we have to make sure that the payments and payouts equal to be the same amount, this is why we convert it as well as offer to convert it for you. We took it upon ourselves to do this for our users as a courtesy, not so that we can inconvenience any users.". That, and the rest of Eryn's email, reads like a patronizing copy-and-paste response that we've all come to dread from some poorly trained customer service staff these days.
Miss H's response also includes this little gem: "Additionally, if you pay in a currency that's different from the denominated currency of your payment method, your payment company (for example, your credit or bank card issuer) or third-party payment processor may apply a currency conversion rate or fees to your payment. Please contact your provider for information on what rates and fees may apply as these are not controlled by or known to Airbnb." and what this really means is that if Airbnb forces you to use a particular currency, with their inflated exchange rate and that is not the currency used by your credit card then you will have another currency conversion fee added by your bank, so you suffer the pain of two currency conversions. This disastrous scenario comes about because some clever person at Airbnb wanted to show users a little "courtesy", as Miss H describes it.
What can users do?
As DCC is optional and as it is not clear on the booking page, there are other things a user can do.
At the bottom of the Airbnb page you can usually find an option to view prices in a different currency. You can also change your country of residence in the settings to ensure you view prices in the host currency. This allows you to see the real price, without the DCC steal.
People have been able to email or call Airbnb and have DCC disabled for their account. Not all their telephone staff seem to understand these requests and apparently it is necessary to persist and call more than once. In the long term, the cost savings outweigh the time it may take even if you spend 20 minutes on the phone getting it fixed.
Whatever you do, with any travel site, print a copy of the information page showing the price in host currency. After doing that for an Airbnb booking and before making any payment, send a message to the host quoting the total price in their currency and stating DCC is not authorized. If Airbnb does wrongly convert the currency, send a letter to the credit card company asking for a full refund/chargeback on the basis that the transaction in the wrong currency was not an authorized transaction. It is important to ensure that you do not agree to the payment using Verified-by-Visa or Mastercard Securecode and do not pay with a debit card as these things can undermine your chances of a successful chargeback.
The chargeback rules are very clear about this. On the Visa website, the Guide for the Lodging Industry describes all the chargeback reason codes. On page 46, reason code 76 is described for cases such as these:
- Cardholder was not advised that Dynamic Currency Conversion (DCC) would occur
- Cardholder was refused the choice of paying in the merchant's local currency
If you feel that Airbnb's web site was not operating in compliance with these rules, while many other web sites have made the effort to do so, why shouldn't you demand a correction by your bank? Once enough people do this, don't be surprised if Airbnb fixes their site.
28 Nov 2015 5:08pm GMT
Adolfo Jayme Barrientos: Ubuntu Font Family, version 0.84 (with Arabic and Hebrew) up for testing in Xenial
In case you've upgraded to the Xenial (16.04 LTS) development release, you'll have noticed that a new version of the Ubuntu Font Family has been uploaded to the archive (thank you, Laney and Canonical Design Team!)
Take a look at the changelog to learn about the bug fixes and other goodness contained in this release. Most importantly, this upload finally ships the Arabic and Hebrew glyphs that the Dalton Maag crew beautifully designed back in ~2011.
28 Nov 2015 9:17am GMT
27 Nov 2015
First, a big thank you to the fine folks at Limux for hosting the event. Second, a big thank you to the Ubuntu Community Donations fund for getting me there!
I successfully crammed a ton of work into this short trip! We (Kubuntu) first sorted (mostly) a plan
for Xenial LTS release. We are going to sync with Debian as much as we possibly can this release as
stability is of utmost importance. Don't fret, we (I) will still put newer KDE releases in a PPA for
those that want the newest of KDE, time permitting of course. We are still working out who will host our CI system, as we all agree that this is extremely important to our workflow. During the period that we are synced to debian will have time to fix our somewhat broken toolset so that we can function with less overhead. We bashed a few bugs, updated our to-dos.
On the KDE side, I worked on getting the docker workflow functioning on build-sandbox.kde.org. Unfortunately, ICU was updated so all of KDE will need a rebuild before this can go live. But the good news is we will have more than 2 slaves! And it will be fairly simple to extend in the future, fully clean builds, and we can utilize different OS version requirements. I also spent some time working on Phabricator permissions issues.
Overall this was an essential team building and work event that I could not have participated in without your help. So thank you to all of you that support Ubuntu community donations. Donate today!
With that said, my cry for help:
If you find any of my work useful, please consider a donation or become a patreon!
I can no longer sustain working without an income. If this works I can continue all of my
(K)ubuntu and KDE contributions ( a full time job in its current state + overtime!)
Patreon for Scarlett Clark (me)
27 Nov 2015 10:52pm GMT
A few weeks ago we started working again on Yokadi, our command-line oriented, todo list. We are now finally ready to release version 1.0. This new version fixes a few bugs but does not bring new features. This lack of new features is actually a conscious decision: we wanted to make changes under the hood, and doing changes under the hood at the same time as adding new features is often a recipe for disaster.
What happened under the hood? I hear you asking.
Well, we finally ported Yokadi to Python 3. Mind you, it was not a straightforward port. The main pain point was SQLObject, the ORM we have been using since we started Yokadi. At the time we wanted to start porting Yokadi to Python 3, SQLObject had not been ported (the port is still not ready, only an alpha has been released) so we had to first switch to another ORM - we went with SQLAlchemy - before actually porting the application to Python 3. In fact I suspect SÃ©bastien started the Python 3 port just to get rid of SQLObject, which he does not really like :)
The code is pretty much frozen by now, we have been using it for real-life todo-list work for quite some time: even if there are periods without active development, we still use and depend on Yokadi daily. We plan to get 1.0 out this weekend. Then we can start working on improvements and new features, a few of them are actually in progress, but I'll write more about them later.
27 Nov 2015 9:36pm GMT
That moment when the application "just works" after all your unit tests passâ€¦
A really nice experience after working on these low-level bits was firing up the kscreen systemsettings module configured to use my wayland test server. I hadn't done so in a while, so I didn't expect much at all. The whole thing just worked right out of the box, however. Every single change I've tried had exactly the expected effect.
This screenshot shows Plasma's screen configuration settings ("kscreen"). The settings module uses the new kwayland backend to communicate with a wayland server (which you can see "running" on the left hand side). That means that another big chunk of getting Plasma Wayland-ready for multi-display use-cases is falling nicely into place.
I'm working on this part of the stack using test-driven development methods, so I write unit tests for every bit of functionality, and then implement and polish the library parts. Something is done when all units tests pass reliably, when others have reviewed the code, when everything works in on the application side, and when I am happy with it.
The unit tests stay in place and are from then on compiled and run through our continuous integration system automatically on every code change. This system yells at us as soon as any of the unit tests breaks or shows problems, so we can fix it right away.
Interestingly, we run the unit tests live against a real wayland server. This test server is implemented using the KWayland library. The server runs headless, so it doesn't do any rendering of windows, and it just implements the bits interesting for screen management. It's sort of a mini kwin_wayland, the real kwin will use this exact same library on the server side, so our tests are not entirely synthetical. This wasn't really possible for X11-based systems, because you can't just fire up an X server that supports XRandR in automated tests - the machine running the test may not allow you to use its graphics card, if it even has one. It's very easy to do, however, when using wayland.
Our autotests fire up a wayland server from one of many example configurations. We have a whole set of example configurations that we run tests against, and it's easy to add more that we want to make sure work correctly. (I'm also thinking about user support, where we can ask to send us a problematic configuration written out to a json file, that we can then add to our unit tests, fix, and ensure that it never breaks again.
The wayland test server is only about 500 lines of relatively simple code, but it provides full functionality for setting up screens using the wayland protocol.
The real kwin_wayland will use the exact same library, on the server as we do in our tests, but instead of using "virtual screens", it does actually interact with the hardware, for example through libdrm on more sensible system or through libhybris on ones less so.
Kwin takes a more central role in our wayland story, as we move initial mode-setting there, it just makes to have it do run-time mode setting as well.
The next steps are to hook the server side of the protocol up in kwin_wayland's hardware backends.
In the back of my head are a few new features, which so far had a lower priority - first the core feature set needed to be made stable. There are three things which I'd like to see us doing:
- per-display scaling - This is an interesting one. I'd love to be able to specify a floating point scaling factor. Wayland's wl_output interface, which represents the application clients, only provides int-precision. I think that sucks since there is a lot of hardware around where a scaling factor of 1 is to small, and 2 is too high. That's pretty much everything between 140 and 190 DPI according to my eyesight, your mileage may vary here. I'm wondering if I should go ahead and add the necessary API's at least on our end of the stack to allow better than integer precision.
Also, of course we want the scaling be controlled per display (and not globally for all displays, as it is on X11), but that's in fact already solved by just using wayland semantics - it needs to be fixed on the rendering side now.
- pre-apply checks - at least the drm backend will allow us to ask it if it will be able to apply a new configuration to the hardware. I'd love to hook that up to the UI, so we can do things like enable or disable the apply button, and warn the user of something that the hardware is not going to like doing.
The low-level bits have arrived with the new drm infrastructure in the kernel, so we can hook it up in the libraries and the user interface.
- configuration profiles - it would make sense to allow the user to save configurations for different situations and pick between them. It would be quite easy to allow the user to switch between setups not just through the systemsettings ui, but also for example when connecting or disabling a screen. I an imagine that this could be presented very nicely, and in tune with graphical effects that get their timing juuuuust right when switching between graphics setups. Let's see how glitch-free we can make it.
27 Nov 2015 3:29am GMT
26 Nov 2015
the Community Council has been elected and the results can be viewed here:
On the CC for the next two years are going to be:
- Daniel Holbach
- Laura Czajkowski
- Svetlana Belkin
- Michael Hall
- Scarlett Clark
- C de-Avillez
- Marco Ceppi
Thanks to all the nominees and all the voters. Thanks a lot also to everyone who served on the CC the last two years.
Originally posted to the community-announce mailing list on Thu Nov 26 16:48:22 UTC 2015 by Daniel Holbach
26 Nov 2015 5:02pm GMT
We will soon push an update of the Suru icon theme that includes more device icons in order to support the Ubuntu convergence story.
Because the existing icon set was focused on mobile, many of the new icons are very specific to the desktop, as we were missing icons such as hard disk, optical drive, printer or touchpad.
When designing new mono icons, we need to make sure that they are consistent with the graphic style of the existing set (thin outlines, rare solid shapes, etc).
A device, like a printer or a hard disk, can be quite complex if you want to make it look realistic, so it's important to add a level of abstraction to the design. However the icon still has to be recognisable within the right context.
At the moment, if you compare the Suru icon theme to the symbolic mono icons in Gnome, or to the Humanity devices icons, a few icons are missing, so you should expect to see this set expand at some point in the future - but the most common devices are covered.
In the meantime, here is the current full set:
26 Nov 2015 1:42pm GMT