Category Archives: Uncategorized

The end of the hacker era

After reading and contemplating the commentary of John Wu, the Magisk developer, on Google’s introduction of the Trusted Execution Environment to its SafetyNet platform, I am obliged to agree with him. Rooting is dead.

If it is possible to build a cryptographically secure platform, inside the chip, that verifies if the rest of the device has been untampered with, then there are no hardware modifications that can be made. Modchips are dead.

Today’s devices really are nothing more than a single immutable chip, with certain functionality burned into it. If we want to modify it, we try to exploit its current functionality. And if it doesn’t work and can’t be modified, then we throw it away.

Thanks to advancements in semiconductor technology, things work and can’t be modified.

I think that one of our greatest motivations as hackers during our formative years was being able to take something that works and tweak it ever so slightly. We played games, so we hacked our save data and modded our characters. So now we could play that same game, but with a touch of “us.” There was a sense of ownership, a sense of stake.

With the looming presence of an ever-connected Internet and the growing complexity of our computing machinery, it’s becoming impossible to make the machine just do what we want it to do.

There will always be “toys” to hack with – microcontrollers, game SDKs, breadboards – but the prized hardware and software, the computer we do our work with, might never be fully hackable again.

Reality

It’s Good Friday. In silence, I am met with the sobering reality of life, the fallout of the novel coronavirus, and my disconnection from everything I long for.

I look out the window for the thousandth time. It’s covered in pollen, as no one has cleaned it since the house’s construction twelve years ago.

I check my Facebook notifications, to see if anything has happened with my pokes. A post appears on my feed about a friend and his girlfriend and their celebration of their togetherness.

Without turning the light on, I look at myself in the mirror and gather up another summary of who I am. A man who sees life as it is at face value, unaltered and unblemished. But everyone knows too well what life really is: an endless struggle, a war for meaning. They want something supernatural, something magical that lets their minds run loose with imagination. To this effect, the stern look on my face has little new to offer.

I don’t think the market (the relationships market, the business market, the job market) is particularly interested in reality. Reality is static; it describes how things are right now. It imposes constraints on us. Though some choose to accept these constraints, while others blissfully ignore them, the constraints are there.

The sobering truth of human society is that we may never find an objective, universally accepted purpose for our existence – that is, a specific, concrete purpose that all of humanity will agree on. We tick like clockwork in our thought, though primitively we are animals influenced by feeling. In the mirror, my eyes reflect a dense emptiness, the result of a battle between this rational self and animal self. I know much about the world and its governance by mathematical processes, but my mind continues to wonder for what all of it is useful for.

But if people can be offered evidence to just believe in something, then they invest their mind into it accordingly. Apple products, at the time, were magical in the public eye – people were convinced they could do anything, and at every release they bought them religiously. Likewise, stock market prices reflect people’s beliefs on how successful a company will become. People enter relationships, believing that their partner is really the one person they need in their lives. Jurors write “guilty” or “not guilty,” believing that the verdict they have chosen is the most appropriate one. Chess players make a move, believing that the move they have made is the one that will let them win the game.

It is the illusion of opportunity that entices one to make a decision, and the illusion of objectivity that confirms the decision.

If I continue to strangle myself in the constraints of reality – a reality that sees only cold facts and not opportunity – then will people ever see opportunity in me? They will see what I saw in the mirror – the face of a boy anxious about his future, longing but seemingly unable to find some shred of hope to cling onto. But people want to see what they might enjoy with me, what jokes I might laugh to, what advice and experience I might have in store for them, even if I myself do not believe I have anything at all to offer. After all, is the reality that I have nothing to offer, or that I have far more to offer than I have ever given myself credit for?

So screw reality.


Looking back, I think that my thoughts may be mistaken as a foray into nihilism. Far from it. Humanity constantly strives to seek the truth, and if I eliminate that, then I am rejecting essentially all intellectual study.

When I think of reality, I think of all of the facts of the present day. In a distributed system, all nodes are striving to synchronize with each other to achieve a consistent state. However, there are some events that occurred in the past that did not make it to the consistent state; this is an unfortunate side effect of forcing a distributed system into consistency.

When I went to Japan three years ago, I wrote about some events and took pictures of others, but others yet remain solely in my mind. They cannot be reproduced, and there probably is little further evidence that they occurred. At some point, we must make a binary conclusion – that’s how the courts work, that’s how scientific inquiry works. Is it true, or is it false.

We need to take in the intricacies of reality and not allow ourselves to be constrained by mere “true” and “false.” Rather, we should take the time to explore the world and appreciate the things that we may never be able to put a “true” or a “false” on – arts, humanities, film, writing, sightseeing.

The anxiety of life

I haven’t written a public post since August. I apologize for this – ever since the day I decided to move to that dastardly co-op, I haven’t felt like I’ve had enough time to write here.

Though this is not an excellent time to write at the present moment (as the novel coronavirus pandemic has just struck the United States, sparking a major recession), I should focus on a holistic point of view.

Partly due to anxiety, about a third of my time has been consumed by indecision than doing actual work. Should I take the online quiz now, or study more? If I keep on like this, will I make an A in the class? Should I eat dinner now, or in an hour? Will I be able to finish this assignment on time if I postpone it for tomorrow? Should I try to open conversation with this girl? Do I look good?

But most importantly, am I making any progress in life?

In some sense, yes: I am nearing completion of my computer science degree, which I will be able to finish one semester early. My finances are in very good shape, and last November, I was even able to begin investing in stocks. My third internship is slated to occur this summer, with even rent fully paid for by the company.

Yet I am fully consumed by anxiety and cynicism: cynical over humans’ systematic self-centeredness (including how I will inevitably fall victim to it myself) and anxious that I will be unable to find fulfillment in life, I find no easy solutions and find myself like a dog paddling vigorously in the water to stay afloat. The exertion turns out to be counterproductive, exhausting one’s efforts when one can remain afloat simply by lying down on the water.

I have defined my metric for life progress as my most difficult challenge: what is the size and quality of my retinue – how many friends have I gained the privilege of having? Who would actively stand behind me and what I believe in? The logic goes that if I can maximize this – if I can finally feel like I am enjoying the adventure of life together with other humans, instead of feeling like I am fundamentally in conflict with them – then will I consider my life purpose to be at least partly fulfilled.

But in reality, I use this metric as an excuse to compare myself to others. When I see others flourishing in social settings, I degrade myself because it seems they can find connection more easily than me, and therefore they have made better progress in life than me. They even go as far as finding girlfriends and boyfriends, leaving me to try to convince myself that I do not need any of those things because they are unattainable for me.

The frustration is that it is typically at around the end of the academic year when my social life finally begins to gain traction, and so the vine of grapes is lowered to an attractive and reachable level. Perhaps I am able to reach and take a few grapes of consequential friendships and events, but by the time these things occur, summer arrives and the vine is taken away. During those months I become delirious, craving social events that perhaps may lead to the discovery of a great friend or an adventure that will never be repeated.

The opportunities are there, but by the time I see them, they are missed. This is the crux of a social anxiety that has marred me for the majority of my life: in an attempt to recognize opportunities, I become paralyzed in indecision, wondering what will lead to the most consequential outcome. In the end, I take no drastic move, nothing happens, and I sulk around waiting for the next opportunity to come.

It’s perhaps because I am desperate for immediate, radical success that causes me to pursue only the most ambitious opportunities.

In summary, despite my objective, external successes, I am growing more and more discontent with my life, but do not know of a way I can gradually cause change in my life in order to dissipate this discontentment.

Film piracy

The film is a captivating, immersive medium that narrates a story with a synchronized visual and audio track. In its similarity to television in that it can be consumed passively rather than requiring an active effort in imagination, movies have reached far more Americans than books. In the medium’s success, it has become a lucrative business over the past one hundred years.

Today, the majority of Americans know of only one type of movie: the movie that is approved by the Motion Picture Association of America, an industry group that comprises of six media conglomerates with near-exclusive access to what is commonly known as the movie theater.

The American has little access to the independent or international film; only has streaming eased the resistance of these films’ entry into the market, and even then their exposure to Americans is often filtered through contracts managed by the Big Six.

The end result is the offering of a relatively small catalog of extremely popular mainstream movies, whose distribution is tightly controlled from production to presentation. A consumer can watch an American movie only through a handful of means:

  • If still in theaters, an MPAA-approved facility.
  • Blu-ray disc, with an up-to-date Blu-ray player and a high-definition TV with HDCP.
  • DVD, with a player of the correct region, assuming that the movie was distributed by DVD.
  • A constellation of video-on-demand services, assuming the service has an up-to-date contract with the distributor:
    • Netflix
    • Amazon Prime Video
    • iTunes

Ironically, the battle was lost decades ago in the music industry, with purchased music distributed with no DRM.

The problem is that due to the increasing volume of media and the tightening demands by licensors to provide adequate protection for media, the film medium as a whole is becoming increasingly inaccessible. One can no longer go to the video store, find anything to one’s content, and pop it into the player: one must sift through a variety of providers to see who actually distributes the movie, at a variety of price points.

And what happens if the content is not accessible? What if the movie or the TV show is not accessible in one’s country due to contractual limitations? What if technological advances prevent one from enjoying purchased content? What if the content is no longer distributed by anyone?

These are reasons piracy is rationalized – not because it is in people’s willful intention to commit robbery, but because piracy has unfortunately made it far more convenient to acquire content than through a legitimate transaction. Content is easily searchable, and its results are displayed on a minimalistic table that lists every version of the content ever released. A few clicks later, and the content is downloaded as a file to one’s hard drive, and the download manager intelligently seeds the file back to its peers in a gesture of cooperation. The content (which, surprising to some, conforms to high quality standards) has already been decrypted, stripped of DRM, and is ready to be played back on virtually any device.

There is no question why the MPAA seeks to drill anti-piracy campaigns into the minds of Americans: because despite all of its efforts, and despite the illegality and unethical nature of piracy, the members of the MPAA have been unable to compete with the convenience of peer-to-peer downloading and DRM-free video.

For instance, suppose I wish to watch Cowboy Bebop: The Movie. While the movie’s theatrical reception was subpar, it is still original Cowboy Bebop content that is worth watching – like an extended episode. My ideal solution is to look it up on an ad-free, subscription-based streaming service such as Netflix, hit play, and then hit the “cast” button to any television in my house or even a monitor on my computer.

However, Cowboy Bebop: The Movie is not available. At all. Its only availability is through an obscure DVD release with varying prices, indicating that some DVDs are region-locked to Japan, while others can be played in the US.

Ultimately, the easiest way to play this is by searching it in a torrent database, downloading it, and then serving the file to the television.

It is the sad truth that despite having played movies from discs and boxes in my personal possession, purchasing high-quality content and then playing it from servers in my personal possession is frowned upon as piracy. (Ironically, even Apple designed this correctly: movies can be streamed either from other computers that have the downloaded content, or Apple’s own servers.)

Ultimately, piracy is a consequence of attempting to navigate a broken system of film distribution, and those astute enough to recognize this tend to pull away from mainstream media to enjoy more traditional media, such as books, which convey the same messages and experiences in more elegant terms.

A troubled relationship with GitLab

When I discovered GitLab in February, a rebellious passion flared up – a desire to break away from the omnipresent, walled-garden development ecosystem that is GitHub.

After GitHub had supposedly banned one of my developers for Attorney Online, that disdain for GitHub flooded over (although it was only later that I considered that perhaps he had involved himself in something he did not tell me about). I switched to GitLab in two days and was content by its fully-featured nature: it could show icons for repositories, group repositories into projects, mirror in both directions, and it even came with a fully-featured CI! Satisfied that I could escape the grasp of GitHub, I moved the main Attorney Online repos to GitLab to make a pipeline and allow my banned developer to contribute.

But six months on, the cracks of GitLab were beginning to show: odd bugs, thousands of issues on the GitLab main repo, slow page load times, and a seemingly endless amount of switches and dropdowns on every panel. It was like Jira all over again – and things were not improving.

In those same six months, GitHub was making leaps and bounds to compete with GitLab’s bells and whistles. Adding features such as security bulletins, issue transferring, jump-to-definition, and sponsorships, GitHub was also trying to reel its open-source users back into the platform – and they also seemed to cut back on their omnipotent moderation, instead granting repositories the tools to moderate themselves.

The distinction was thus made clear to me: GitLab for enterprise, GitHub for community. Enterprises don’t care about simplicity, but hobby developers like myself do. Both also succeeded in adding features that were orthogonal to each other – only GitHub supports jump-to-definition, but only GitLab supports arbitrary mirroring rules.

After reverting my move to GitLab, I saw that GitLab was flexible enough to allow me to reap the benefits of both ecosystems – GitHub for project management, and GitLab for its advanced CI pipeline and artifact hosting.

In the end, it is inevitable for today’s developer world to spin around an indispensable GitHub: it is the product that tamed a complicated version control system and popularized it in a simple-to-use program for managing open-source projects.

A minor note on the Code Lyoko upscaling project

I’m a big fan of Code Lyoko. I watched the show as a kid back when it aired on Cartoon Network, and it may well be the reason I grew a liking for computers and why I am studying for a computer science degree today.

First and foremost: We should be thankful that Mediatoon has decided to re-release Code Lyoko on YouTube.

Continue reading A minor note on the Code Lyoko upscaling project

Using JS for Qt logic

Sorry, but I’m going to have to take sides on this one: Electron sucks. At their core, they convert a program into an embedded web browser with somewhat looser restrictions on interfacing with the host system, only to make it possible for web developers to develop for the desktop without learning a new language. The benefits of Electron are heavily biased toward developers and not the end-user, which is really the target of the entire user experience.

The problem is that HTML5 makes for an abstract machine that is far too abstract, and the more layers of abstraction that sit between the software and the hardware, the more overhead there will exist from translation and just-in-time compilation. The result is a web browser that uses 120 MB of shared memory and 200 MB of resident memory per tab.

For a web browser, though, abstraction is good. It makes development easy without sacrificing user experience for what is essentially a meta-program. But for any other desktop application with a specific defined functionality, this abstraction is excessive.

This is generally why I like Qt: because it is one of the only libraries left that continues to support native desktop and embedded application development without sacrificing performance. The one problem with it, however, is that performance requires the use of C++, and most people do not know how to work C++. Moreover, it requires double the work if the program is also being targeted for the web.

There does exist QML, which removes most of the C++ and exposes a nice declarative syntax that combines both layout and logic into a single file. However, it has two significant problems: first, it adds even more cruft to the output program, and custom functionality still requires interfacing with C++ code, which can get a little difficult.

Qt’s main Achilles’ heel for a long time has been targeting the web. There are various experimental solutions available, but none of them are stable or fast enough to do the job yet.

I’ve been coming up with an idea. Qt exposes its V4 JavaScript engine (a JIT engine) for use in traditional C++ desktop programs. What I could do is the following:

  • Write JS code that both the browser and desktop clients share in common, and then make calls to some abstract interface.
  • Implement the interface uniquely for each respective platform.

For instance, the wiring for most UI code can be written in C++, which then exposes properties and calls events in JS-land. Heck, Qt already does most of that work for us with meta-objects.

How do I maintain the strong contract of an interface? You need a little strong typing, don’t you? Of course, of course – we can always slap in TypeScript, which, naturally, compiles to standards-compliant JavaScript.

The one problem is supporting promises in the JS code that gets run, which mostly relies on the capabilities of the V4 engine. I think they support promises, but it does not seem well documented. Based on this post about invoking async C++ functions asynchronously, I think that I need to write callback-based functions on the C++ side and then promisify the functions when connecting between the JS interface and the C++ side. That shouldn’t be too hard.

Note that important new features for QtJsEngine, such as ES6, were only added in Qt 5.12. This might complicate distribution for Linux (since Qt continues to lag behind in Debian and Ubuntu), but we’ll get there when we get there – it is like thinking about tripping on a rock at the summit of a mountain when we are still at home base.

Indexing the past and present

With the shutdown of GeoCities Japan, we are reaching an important point in the history of the Internet where important historical information is vanishing while being replaced with new information that is hidden away as small snippets of information in social media systems.

It is becoming increasingly apparent that a vast trove of information is simply missing from Google Search. Aggressively pushing for well-ranked sites, user-made sites with obscure but useful information are not as indexed, and their lack of maintenance leads to their loss forever.

For instance, I was only able to find MIDI versions of Pokemon Ruby and Sapphire music from a site hosted by Comcast. After the shutdown of Comcast personal sites, the information was lost to indexing forever and hidden away in the Internet Archive.

What I propose is the indexing and ranking of content in the Internet Archive and social media networks to make a powerful search engine capable of searching, past, present, and realtime data.

A large fault of the Google Search product over the years has been its dumbing down of information during the aggregation process of the Knowledge Engine that inhibits the usefulness of complex queries. If a query is too complex (i.e. contains keywords that are too far apart from each other), Google Search will attempt to ignore some keywords to fit the data that it has indexed, which only fits into particular categories or keywords. If the whole complex query is forced, though, Google Search will be unable to come up with results because it does not index or rank webpages in a way that is optimized for complex queries – not because the information does not exist.

The corpus of information is also diversifying: there is more information in e-books, chat logs, and Facebook conversations than can be found simply by crawling the hypertext. But the Google search engine has not matched this diversification, opting simply to develop the Knowledge Graph to become a primary and secondary source of information.

I think this would be a great direction a search engine such as DuckDuckGo could take to compete more directly with Google Search in a dimension other than privacy. After all, Google Search is no longer Google’s main product.

One year after Japan

One year since my arrival from Japan, I have learned an academic year’s worth of knowledge and grown a year more mature.

I spent vivid days enjoying lunch with others and lonely nights sulking in my dorm. I spent boring Sundays eating lunch at Kinsolving and busy days going to club meetings with people I never saw again.

As the sun changed inclination, so did my mind, it seems. Perspectives have changed. My mind melds and rearranges itself, disconnecting itself forever from the old memories of the physics lab and the traumatizingly strenuous AP exams.

As the semesters progress, people come and go. I am pulled out of one world and thrust into another, yet Japan still recalls like it happened last week. While I cannot recall all memories, the key memories still feel relatively vivid. I still feel the cotton of the yukata on my body; the refreshing chill of the small shower beside the onsen; the onsen’s disappointingly intolerable warmth; the calm, collected smile of the cashiers and service workers; the bittersweetness of having only been able to visit Akihabara once; the American pride of my Japanese teacher.

It is not certain what I will be doing on June 28, 2019, but it is certain that I will be saving money to return to Japan in 2020 for a study-abroad program.

When I noted in November that the experience will never happen again, I was correct – but this is merely to make way for even greater experiences in the unknown future.

My friend wishes to go to Japan for another week, but after viewing airline price ranges and possible dates, I politely observed that one week was simply not enough time – the insatiable longing of returning to Japan would simply repeat itself. No: I need an entire semester to evaluate the culture of Japan, its people, and what it holds in store for enjoyment. I wish not to merely cherry-pick what I wish to know, but rather to immerse myself completely in the language and culture. This should be enough to satisfy any individual.

However, I recognize that after this point, reminiscing about specific details of the trip is an obsession. I must strive to look forward and continue my studies of Japan from a holistic perspective.

(02/01/2020: June 28, 2019 was a calm, quiet day during my summer internship. I wrote a private blog post on that day, ironically reminiscing about the past.)