Knock-off apps: the sincerest form of flattery

As the developer of a relatively popular app, there are numerous things I have to worry about on a regular basis. One of these things, however, is something for which I was kind of unprepared, and still not sure how to deal with: the emergence of knock-off apps — apps that have a suspicious and often hilarious resemblance to the original.

There were, of course, counterfeit apps that were blatantly using my trademark in their name (“DiskDigger” is a registered trademark in the U.S.), or my graphics in their store listings, in which case the Google Play Store thankfully took them down upon request.

But then there are apps that don’t quite use my trademark, and don’t quite have the same icon and screenshots. But because they are close enough, they can take advantage of being near the top search results for this category of apps, and lead numerous unsuspecting users to install them and be greeted with a barrage of ads and spyware.

Most of these apps seem to come from Indian and Middle-Eastern developers, which makes the horribly broken English in their app verbiage even more amusing to read. A small part of me even applauds their enterprising spirit, and I don’t fault them for wanting to make a buck, but I wish they’d find ways of doing it more honestly.

Take a look! Can you tell the knock-off apps from the real ones?

The problem is that because these apps don’t explicitly violate my trademark, Google refuses to take them down, which is unfortunate because these apps do literally nothing except shove ads in the user’s face, and therefore actively harm the ecosystem of the Play Store. Shouldn’t Google care more about preventing the Play Store from becoming a cesspool of bottom-feeding cash grabbers?

The age of instant nostalgia

Nostalgia is an emotion that should be felt sparingly. At least for someone like me, it’s very easy to get lost in rabbit holes of nostalgia. On days when I’m feeling sentimental, I can spend hours browsing old photo albums and reflecting on past events that I’m powerless to change.

But nostalgia can go much deeper than that. With today’s technology, we can have experiences of nostalgia that were unheard of in previous generations. Remember those candies you loved as a child that were only available in the town where you grew up? Now you can buy them on Amazon and have them shipped in two days. Remember your trip to Stonehenge twenty years ago? Now you can see it in VR any time you like. Remember the games you used to play on your old Atari console? Now you can play them on your mobile phone while waiting for the train. Remember your old friends from elementary school with whom you haven’t connected in years? Now you can find them with a few clicks and talk to them instantly.

We’re living in an age when you can evoke feelings of nostalgia at a moment’s notice, and on demand. This fact is well-known to Hollywood, which capitalizes on nostalgia with abominations like Pixels which do nothing but literally tell the audience, “Remember Q*bert?” “Remember Pac-Man?” “Remember Galaga?”, or its endless obsession with sequels and prequels and reboots — anything to jog your memory of an old movie you used to love.  It’s also known in the literary world, with the success of novels like Ready Player One, where any semblance of a plot is merely an afterthought, and most of the book’s real purpose is to barrage the reader with a rapid-fire of pop culture references from the 1980s.

The problem with nostalgia is that it’s not a productive emotion, in the sense that it romanticizes the past, locks your thinking into it, as if your past experiences were somehow better than the present or future. This kind of thinking is counterproductive whether or not your past was in fact better than your present:  If your past really was better than the present, then you should be actively working to improve your present life instead of dwelling on past events. And if, instead, your life is better today than yesterday, then romanticizing the past cheapens the goodness of your life in the present day, and takes away time you could be spending enjoying the present and planning an even better future.

Nostalgia should be treated like a sweet, rich dessert — great in small quantities, but bad for you if you indulge in it too much.

Premature optimization of Android View hierarchies

In my day job, one of my responsibilities is to oversee the technical evolution of our product and to optimize its performance. I’ve even written a few guidelines that detail numerous recommendations for maximizing performance of Android apps in general.

One of the things I have always recommended is to reduce the complexity of View hierarchies, and try not to overcrowd or have too many nesting levels of your Views, since this can supposedly have a negative impact on performance.  However, I made these statements based on common sentiment on the web, and based on the Android documentation, instead of on actual hard evidence.  So I  looked into it from an interesting perspective:  I dug into View hierarchies as they are used by other major apps, and compared them with our own usage.  This isn’t a totally “scientific” analysis, and it only looks at a single facet of proper View usage. Nevertheless the findings are rather surprising, and are actually challenging my insistence on View minimalism.

I looked at the Twitter, Facebook, and Slack apps, and compared each of their “feed” screens to the feed screen of our own Wikipedia app. (The reason I chose these apps is that the “performance” of their feeds is nearly perfectly smooth, especially considering that some of their content includes auto-playing videos and animations.)  I used the superbly useful and little-known UI Automator Viewer tool, which is bundled with the Android SDK, to explore these view hierarchies.

For reference, the deepest nesting that I found in the feed of the Wikipedia app is seven (7) levels deep:

But get ready:  The deepest nesting in the Slack app is… eighteen (18) levels deep. And yet it performs perfectly smoothly:

The deepest nesting in the Facebook app is twenty (20) levels deep. And yet it works just fine:

The deepest nesting in the Twitter app is twenty three (23) levels deep, which includes eight (8) nesting levels for each item in their ListView (it’s not even a RecyclerView!). And yet I’m able to scroll the Twitter feed infinitely without a single hiccup.

Therefore I’m compelled to reevaluate the importance we should be placing on optimizing View hierarchies, at least from the perspective of “nesting.”  Indeed, this seems to be yet another case for balancing reasonable performance guidelines with more immediate product goals, or put more simply, avoiding premature optimization.

Higher-level illusions

Most of us have seen optical illusions, and witnessed firsthand how a simple but specially crafted illustration can completely trick our brain, whether it’s an illusion involving depth perception, motion perception, color perception, etc.  One of my favorites is this illusion involving checkered squares with alternating shades of gray (Is square A darker than square B?):

Credit: Wikimedia Commons.

When I first saw the above illusion, I found it unfathomable that squares A and B are actually the same color, and yet it’s true. The illusion is so powerful, I had to open the image in Photoshop and literally look at the pixel color values of the squares to convince myself that they are the same.

But actually, we don’t even need to resort to any specially contrived images to fool our visual circuits, since our eyes themselves have a built-in defect — a consequence of the eye’s evolutionary history — a blind spot that gets patched over in real time by the software of our consciousness.  This allows us to go on with our lives being completely oblivious of this defect (unless we consciously look for it), but it basically means that we experience this genuine illusion during every waking moment.

These kinds of illusions powerfully illustrate how a simple misfire of our sensory perceptions can send our understanding of the world completely astray, and how our consciousness has adapted to compensate for the laughable fallibility of our senses.

My question is the following:  If it’s this easy to fool our visual processing circuits, what kinds of illusions might be at work at higher levels of our consciousness?  What other blind spots are auto-filled by the software of our brain, making us oblivious to their true nature?

The key to uncovering and understanding illusions, I think, is cognitive effort.  It takes cognitive effort to realize that the illustration at the top of this article is, in fact, an illusion.  It takes cognitive effort to expose and become aware of the blind spot in your own eyes. What other illusions might we uncover if we keep building up the muscles of cognitive effort?

Perhaps we might discover that the Earth, instead of being a flat plane with a dome covering it, is actually a spheroidal mass that orbits the Sun, contrary to all of our intuition.

Perhaps we’ll discover that the Sun is actually one of billions of other suns, and is by no means unique among them, and that our galaxy is one of billions of other galaxies, with similarly little uniqueness about it.

We might also discover that the folk tales and mythologies of our ancestors are not literally true, but are merely expressions of the fears, aspirations, ideals, and desires that we all share, especially the desire to find meaning and purpose in a world that doesn’t grant us purpose on its own.

And perhaps we’ll discover that free will itself, far from being a gift bestowed on us by a creator or even a self-evident property that emerges from our consciousness, is actually the grandest illusion of all:  that all of our thoughts and actions are consequences of deterministic physical laws.

But all of these realizations need not lead us towards fatalism or nihilism, for these too are illusions.  If the universe doesn’t grant us a purpose ex nihilo, it shouldn’t stop us from being able to create our own purpose.  And if it really is true that the laws of physics underlie all of our choices, it doesn’t make our choices any less meaningful or consequential, and it doesn’t mean that we should stop striving to make better choices that improve the lives of current and future generations.

And of course, none of this takes into account the illusions of higher and higher order that we’re bound to uncover in the future, and all the consequences of those discoveries that we can’t even fathom in the present.  The one thing we must not stop doing is exerting our cognitive effort to keep discovering and untangling illusions, wherever we might find them. The immortal words of Stephen Jay Gould come to mind:

We are the offspring of history, and must establish our own paths in this most diverse and interesting of conceivable universes — one indifferent to our suffering, and therefore offering us maximal freedom to thrive, or to fail, in our own chosen way.

Hard hack: reading Soviet magnetic reel tapes

During my last visit to Russia a few years ago, I rummaged through my late grandmother’s old apartment and kept a few items, which included several magnetic reel tapes which I presumed my grandparents used for bootlegging and copying their favorite music from the sixties and seventies.

I’ve been wanting to listen to the contents of the tapes for a while now, but only recently have I found a bit of free time to actually do it. It’s still very much possible to buy a reel-to-reel player on eBay for less than $100, but I wanted to see if I could make use of existing components that I already have. And besides, I’m only looking for a rough rendering of the recordings, and don’t really need the precise original fidelity that an actual reel-to-reel player would provide.

I still have a relatively new cassette player that I’ve used previously to digitize some of my own cassettes from years ago, and I had a hunch that the “format” of the analog audio on the magnetic reels might be similar, if not the same, as the cassettes, meaning that I could theoretically use the cassette player to read the reel tapes!

The first step is to tear down the cassette player. As a side note, although this cassette player is quite cheap, it’s actually very useful because it has a USB port that powers it and simultaneously makes it become a generic USB audio input device, which makes it perfect for digitizing cassettes. Therefore, I wanted to tear it down in a way that would make it continue to be able to read cassettes, if that use case ever comes up again.

Anyway, I removed the front casing of the player, and tore away the plastic guides that kept the cassette tape in alignment, since these guides would interfere with the thicker reel tape. I then affixed the player onto a wooden board, and added two thick screws that will hold the reels. I also attached a thick metal post on either side of the player, which will act as tape guides and keep the tape horizontal across the player.

Also notice that I put some wire ties onto the metal posts, to serve as vertically-adjustable tape guides for experimenting with the precise alignment of the tape with the read head.

Another minor problem is that I didn’t have an empty reel onto which I would wind the current reel that I’m reading. For this purpose, I cut a circle out of some thick cardboard, and glued old CDs on either side of it. This would serve as my empty reel:

And finally the whole contraption is ready to go! There’s something poetic about using CDs to construct a reel onto which ancient magnetic tape will be wound…

I proceeded to connect the cassette player to my PC, and fire up Audacity, the trusty audio recording and processing software. I pressed “Record” in Audacity, pressed the “Play” button on the cassette player, and… to my amazement, the audio started to come through! At first I was only getting one of the two stereo channels, which meant that the tape wasn’t well-aligned with the head, but after a bit of adjusting of my wire-tie tape guides, I got a good stereo signal:

It turns out that the reel tapes are recorded at double the speed of cassette tapes, which means that the audio extracted by the cassette player sounds slowed-down by a factor of two. So, the final step was to use Audacity to boost the speed of the recording by 2x, and the final audio came out! The only slight issue is that the audio seemed to be lacking the higher-ish frequencies, so everything sounds a bit muffled. It’s difficult to tell whether this is because the cassette player head isn’t fully compatible with the reel tape, or because the tape itself has worn out or degraded over time. But again, I’m not looking for a perfect transfer of the audio, just a first-order approximation, so this is no big deal.

What’s on the tapes?!

The actual contents of the tapes are not particularly surprising, but still gave me a wonderful tiny new glimpse into the lives of my grandparents through their musical tastes. One of the tapes contains music from The Irony of Fate (Ирония судьбы), one of the most beloved films in the Soviet Union, and still watched today by a huge number of Russian people on New Year’s eve. I can attest that the film’s soundtrack, performed by Sergey Nikitin (Никитин) and Alla Pugacheva (Пугачёва) is worth saving on tape and listening on any occasion.

The second tape seems to contain random songs from radio broadcasts, including a few songs from the West. These include Seasons in the Sun by Terry Jacks and Mexico by the Les Humphries Singers. Presumably these songs were deemed innocuous enough by the Communist censors, who otherwise banned music that was seen as subversive, sexualized, or violent, such as Pink Floyd, Black Sabbath, and The Village People (that’s right).

And the third tape contains some songs by Vladimir Vysotsky (Высоцкий), another iconic figure in Soviet music, known for his biting use of slang and street jargon (known as blatnaya pesnya or the newly-coined Russian chanson) to deliver poignant, striking, thought-provoking, and often hilarious political messages. The same tape also contains songs by Konstantin Belyaev (Беляев), unknown to me until today, but apparently another minor figure in the same genre of blatnaya pesnya as Vysotsky. To be honest, I found Belyaev’s lyrics rather juvenile (more so than other блатняк), and probably better suited for drinking songs rather than music for thoughtful enjoyment. But then, perhaps that’s exactly what my grandparents used them for.

Well now, with a fresh insight into another facet of my grandparents’ lives, and a renewed appreciation for Soviet musical traditions, I think it’s time to give these tapes one more listen!

* If you’re very curious, here is a sample of the audio from one of the tapes.