7c0h

Bad App!

Random story from a random Android App: the "Photo Manager" app that I was using in my phone was updated a couple weeks ago. Opening my photos now requires the following steps:

  1. Tap the icon to open the app.
  2. Deny access to my location, because you don't need that to show me photos.
  3. Deny access to my calendar, because you don't need that either.
  4. Get sent back to the main screen, because the app will not run without this information.

This is a typical marketing tactic to try and sell my personal data for a higher price, but I was surprised at how brazen it was: most apps would still work, as selling me bad ads is better that selling none, but apparently the cost of me having their app installed is too high. Or maybe it was bad error handling. There's no way to know.

I was ready to uninstall it (which I did) and call it a day, but then I looked a bit deeper. It turns out that I was wrong, and the app is not developed by some obscure adware company in an effort to catch some low-hanging fruit. Instead, it was (probably) sold to a company first, which then repacked it with ads in an effort to catch some low-hanging fruit. Do you have an app you'd like to sell them? Here's a link. I'm willing to bet this specific app was sold around January 2019, as that would explain why they have gotten (almost) nothing but bad reviews for a year straight.

I don't really have a deeper point. I was just surprised at how quickly the app went to hell, and thought entrepreneurial people would appreciate it as a case study on what not to do.

What traveling every other week taught me

I travel a lot. In the last two years I've taken easily over 100 trains (with half of those trips lasting 7hs or more), 20 overnight buses (12hs in each direction), two intercontinental flights, and I even biked to work once.

I would have to be an idiot to travel this much without learning anything. And while the jury is still out on whether I'm an idiot, I did learn some tips and tricks that I'd like to share with you.

Mentality

Before you even leave your place, it is important to put yourself in the right state of mind. So close your eyes, breath deeply, and tell yourself:

"I don't know how, why, or when, but of this I am certain: someone is going to fuck it up. I have made my peace with this, and I will not let it ruin my day."

You would be surprised of how useful this mentality is. It will lower your blood pressure, make you less angry, and more importantly, will naturally lead you to "safer" choices: if you already assume your future plane will be delayed due to acts of nature, you won't book that risky 30-min airplane connection.

Bag

The secret to a good trip (or, at least, a less miserable one) is to be prepared, and your bag is where it's at. Unlike common wisdom, I'm going to suggest you get a small-ish one. How small? Enough to fit underneath the seat in front of you in a plane: boarding a plane is stressful enough without having to fight for overhead storage, and the last you want is traveling without your gear because the plane is full and your big bag was sent to cargo. And traveling light is always good.

A controversial opinion: check your allowed bag dimensions and weight, and stick to them. I know neither passengers nor airlines give a damn, but once in a blue moon an employee decides to check and it will probably happen in your trip (see previous section). I know of a bus company that makes a non-insignificant amount of extra money simply by enforcing their rules.

If you are traveling internationally and/or by plane, I recommend you also get a travel document holder like these ones. Keeping all of your documents in one place (plane tickets, ID, Passport, itinerary, emergency money, credit card, ...) will simplify your travel, and can be taken in and out of your bag in a second. I recommend one that fits A4 pages, since most tickets are printed nowadays at home.

Gear

If your have an overnight trip, then your list should start with...

  • Earplugs and sleep mask: they take almost no space, are very cheap, and are ridiculously helpful for overnight trips.
  • Water bottle: nothing fancy, just enough for when you wake up at night with a dry mouth thanks to the AC.
  • Good travel pillow: notice that I said a good pillow. Forget about that U-shaped garbage they sell in airports - if it doesn't close at the front, you'll wake up several times either when your head falls forward or when the pillow slides away. I got one from this list, and I'm quite happy with my choice.

For long trips in general, I also like to have a good set of headphones. Over-ear (and, even better, noise canceling) are my favorites because they block outside noise by default allowing me to use a lower volume setting, a small act for which my hearing will be thankful 20 years from now. They can be bulky, however, so I encourage you to shop around for the right model for you.

Seating

First-timers will always take the window seat. This is a perfectly reasonable choice: they want to enjoy the view. Veterans, on the other hand, know that the hallway seats are where it's at: windows lose their charm after about an hour, but standing up and walking whenever you want never gets old. And unless your plane/bus/train is full, other passangers would rather try other rows than voluntarily sitting between the wall and someone they don't know.

You should also seriously consider taking your shoes off. You can find some light slippers to bring along, but at this point a warning is mandatory: you must ensure (and I shouldn't even have to say it) that you are wearing clean socks and that your feet don't stink. Don't be that guy!

Finally, boredom is your enemy. Forget that difficult novel, your work notebook, and that expense report you've swearing you'll start once you have free time. Bring a book you like, that series you've been meaning to watch, or pretty much anything you already know you'll enjoy.

WhatsApp follows your links

This is not a secret, but I found it curious and thought about sharing it here: earlier today I needed to share a video file that I was hosting in my server, and I decided to send the link over WhatsApp. As I was looking at the log files at the time, I managed to catch this curious set of requests:

7c0h.com:443 203.0.113.19 - - [14/Nov/2019:20:02:49 +0100] "GET / HTTP/1.1" 200 5059 "-" "WhatsApp/2.19.305 A"
7c0h.com:443 203.0.113.19 - - [14/Nov/2019:20:02:51 +0100] "GET / HTTP/1.1" 200 1806 "-" "WhatsApp/2.19.305 A"
7c0h.com:443 203.0.113.19 - - [14/Nov/2019:20:02:53 +0100] "GET /fi HTTP/1.1" 404 549 "-" "WhatsApp/2.19.305 A"
7c0h.com:443 203.0.113.19 - - [14/Nov/2019:20:02:53 +0100] "GET /fil HTTP/1.1" 404 688 "-" "WhatsApp/2.19.305 A"
7c0h.com:443 203.0.113.19 - - [14/Nov/2019:20:02:54 +0100] "GET /file HTTP/1.1" 404 689 "-" "WhatsApp/2.19.305 A"
7c0h.com:443 203.0.113.19 - - [14/Nov/2019:20:02:54 +0100] "GET /files HTTP/1.1" 404 690 "-" "WhatsApp/2.19.305 A"
7c0h.com:443 203.0.113.19 - - [14/Nov/2019:20:02:55 +0100] "GET /files3 HTTP/1.1" 404 691 "-" "WhatsApp/2.19.305 A"
7c0h.com:443 203.0.113.19 - - [14/Nov/2019:20:02:57 +0100] "GET /files3.mpr HTTP/1.1" 404 695 "-" "WhatsApp/2.19.305 A"
7c0h.com:443 203.0.113.19 - - [14/Nov/2019:20:03:00 +0100] "GET /files3.mp HTTP/1.1" 404 694 "-" "WhatsApp/2.19.305 A"
7c0h.com:443 203.0.113.19 - - [14/Nov/2019:20:03:01 +0100] "GET /files3.mp4 HTTP/1.1" 200 219785 "-" "WhatsApp/2.19.305 A"

In simple terms: ever since WhatsApp identified that I was sending a link (that is, after I wrote https://7c0h.com/), WhatsApp generated a new request for every letter I typed (including the "mpr" typo). It's a good thing they only downloaded 215Kb of data too, because the request came straight from my phone. I guess there is no reason to optimize your code when you don't pay for the bandwidth.

Comics are unrealistic

I know this is not in the usual style of this Blog, but I found something so out of touch with reality in Batgirl #36 that I need to share it with you. Please follow me on this journey.

(Warning: spoilers for Batgirl #34–#36. Also, I'm assuming you know who Batgirl is.)

Our story starts in Batgirl #34 with Barbara Gordon (aka Batgirl) missing a meeting with her business partner Alysia and some of her company's investors due to bat-related obligations:

Batgirl talking to Alysia

As it turns out, the investors are not happy. They bought plenty of shares in the company, and want to use their position to push Barbara Gordon out:

Investors want to fire Barbara

Unfortunately for them, they don't have enough shares to kick her out. Even Alysia tells them so. But they wouldn't be important shareholders if they didn't have a backup plan, right?

Investors start their evil speech

You see: many issues ago, Barbara hired Pamela Isley (aka Poison Ivy, known eco-terrorist and occasional villain) to develop bee-friendly plant fertilizer for their company (it's a long story - see "Batgirl and the Birds of Prey" #12 for details).

The investors have now found out, and want to use this information to blackmail Alysia into kicking her friend out of the company. If Alysia does not agree to fire Barbara, they'll make this information public, tank the company, and put all their employees on the street:

Investors threaten to do what I just said

But here's the thing: those investors have acquired a lot of the company. That is, they own it because they paid for it. Do you know what would happen to that investment if they went along with their plan? Yup, you guessed it: gone. All of it. Millions of dollars lost just to spite one of the company's founders. And it's not like they can sell their stock either: doing so in this situation is a clear-cut case of insider trading. Barbara Gordon may end up on the streets, but those investors would end up in jail.

You would expect a smart executive like Alysia to thank the investors for their valuable input, promise to call them back, get a good night sleep, and (at worst) negotiate a good separation agreement for her friend. A less smart person (but smart nonetheless) would have called their bluff: Mutually Assured Destruction is a good stalling tactic, but only an idiot would actually follow through.

Of course, none of these perfectly reasonable suggestions occur to Alysia. She kicks Barbara out of the company instead, leaving her broke and homeless.

And here is where I draw the line. See, I'm fine with the idea of an early-20s super-genius with photographic memory jumping from rooftops and fighting crime without the Police Commisioner noticing that she looks exactly like his daughter. But now you want me to believe that executives from a million-dollar company wouldn't have the simplest grasp of economy? Hell, do you want me to believe that you can organize a hostile takeover, fire a company founder, and freeze their assets in less than 3 hours?! Talk about nonsense.

With that out of the way, and as a final point, I would like to call your attention to Alysia's last words to Barbara. I think you'll agree that her frustration is a little... misplaced.

Alysia blames Barbara for giving up

No, Alysia, Barbara isn't letting "them" take away her life's work. That one's entirely on you.

Lessons from EMNLP and INLG 2018

This post is a condensed version of a talk I gave at my research group.

I've been lucky enough to attend both EMNLP 2018 and INLG 2018, and I thought it would be useful to share my main impressions of which cool things happened during the conference. I've split them into four sections: General tendencies about the direction that modern NLG research is taking, Practical considerations to be aware of for your own daily research, Exciting research areas where interesting results are being produced, and Fun ideas that I stumbled upon while walking around.

General tendencies

For me, one of the most important aspects of going to conferences is getting a sense of what has changed and what is coming. In that spirit, this conference season taught me that...

It is now okay to make a presentation full of memes: Are you leading a half-day tutorial for over 1K researchers? Put some minions on your slides, it's cool.

The text produced by neural networks is fine: For the last years, computational linguists have been worrying that, while neural networks produce text that looks okay-ish, it is still far from natural. This year we have finally decided not to worry about this anymore. Or, as described in Yoav Goldberg's slides, "Yay it looks readable!".

BLEU is bad: It is not every day that you see presenters apologizing for the metric they've used in their paper. It's even less common when they do it unprompted, and yet here we are. BLEU is a poor fit for modern NLG tasks, and yet everyone is still waiting for someone to come up with something better.
Further reading: BLEU is not suitable for the evaluation of text simplification, and ChatEval: A tool for the systematic evaluation of Chatbots for a human-evaluation platform.

Need something done? Templates are your friends: We are all having a lot of fun with Neural this and Deep that. The companies that are actually using NLP, though? Templates, all of them. So don't discount them yet.
Further reading: Learning Neural Templates for text generation.

Practical considerations

Classical NLP is still cool, as long as you call it anything else: Everyone knows that real scientists train end-to-end neural networks. But did you know that tweaking your data just a bit is still fine? All you have to do is pick one of the many principles that the NLP community developed in the last 50+ years, call it something else, and you're done.
Further reading: Handling rare items in data-to-text generation.

Be up to date in your embeddings: It is now widely accepted that you should know what fastText and Glove embeddings are. And ELMO and BERT are here to stay too. So if you're not up to date with those (or, at the very least, my post on Word2Vec), then it's time to start reading.
Further reading: want to use fastText, but at a fraction of the cost? Generalizing word embeddings using bag of subwords.

Data is a problem, and transfer learning is here to help: Transfer Learning is a technique in which you take a previously-trained model and tweak it to work on something else. Seeing as how difficult it is to collect data for specific domains, starting from a simpler domain may be more feasible that training everything end-to-end yourself.

Exciting research areas

If you are working on NLG, which I do, then you might be interested in a couple specific research directions:

Understanding what neural networks do: This topic has been going on for a couple years, and shows no end in sight. With neural methods everywhere, it only makes sense to try and understand what is it exactly that our morels are learning.
Further reading: Want to take a look at the kind of nonsense that a neural network might do? Pathologies of Neural Models Make Interpretations Difficult.

Copy Networks and Coverage: The concepts of Copy Networks (a neural network that can choose between generating a new word or copying one from the input) and Coverage (mark which sections of the input have already been used) where very well put together in a summarization paper titled "Get to the point! Summarization with Pointer-Generator Networks. Those techniques are still being explored, and everyone working on summarization should be at least familiar with them.
Further reading: On the abstractiveness of Neural Document Summarization explores what are copy networks actually doing.

AMR Generation is coming: Abstract Meaning Representation (AMR) is a type of parsing in which we obtain formal representations of the meaning of a sentence. No one has managed yet to successfully parse an entire document (as far as I know), but once it's done the following steps are mostly obvious: obtain the main nodes on the text, feed them to a neural network, and obtain a summary of your document. Work on this has already began, and I look forward to it.
Further reading: Guided Neural Language Generation for Abstractive Summarization using AMR.

Fun ideas

I don't want to finish this post without including a couple extra papers that caught my eye: