• A Personal Update

    Hello everyone! I haven’t updated this blog for a whole year, and I think it’s about time to give you all an update on what’s happened to me and this blog.

    Long story short, I am not in a day job now - instead I’m in a DIY style technology retreat (sorta like the recurse center) where I focus on myself - to explore technologies and methods I’m curious of, to expand my horizon, to challenge and push my knowledge, capabilities, and limit, and to reflect on my career path, as well as the meaning of technologies and its relation to human progress.

    The road has been rougher than I planned (it always is, isn’t it? :wink:). As a result, I haven’t been able to spare any time for Open Source Work/Blogging, which used to be done on the side.

    That being said, I will be doing what I can to compensate somewhat:


  • How to get into the brave new world of Neural Network and Reinforcement Learning

    (Note: This is a short preparatory post for the real one, where I plan to share my experience dabbling with the rusty but beautiful keras-rl library. I will release that after I finally fulfill my promise and deliver the PPO+A2C integration that has been dragged longer than I am comfortable with :stuck_out_tongue:)

    (Hint: some of the not-explicitly-referenced links are just Wiki, but many others are hidden treasure troves. Thanks for all these authors for their amazing works! :blush:)

    Modern Artificial Intelligence is a paradoxical case of an unstoppable force meeting an unmovable object. On one hand, this field has been so hyped in the last few years that some people worry about a bubble and potential backlash (probably bad memories from the last AI winter ?); on the other hand its progress is undeniable even to hardcore skeptics - even if we assume that there will be no more new breakthrough (which is quite unlikely), fully exploiting/applying the technology available right now to its potential will still take a long long time (if nothing else, because the list of new applications opening up from this round of new methods is huuuge :wink: ). This is an interesting time indeed.

    So, if you’re here, you probably wants to get into the field, but just like any bandwagon, the signal-to-noise ratio isn’t exactly nice. How do I gain a foothold and stay?


  • Getting Started With Clojurescript Development - Setup

    We have seen miraculous progress in frontend development in these few years - the domination/monopoly of javascript, AJAX, node.js, the rise and rapid iteration of javascript libraries/frameworks and Single Page Application (with the current crop being Angular, React, Vue, as well as many others). But we’ve also experienced growing pain - the churn rate of libraries is way too high, javascript as a language (and as part of the toolchain) is too hopelessly ill-equipped to deal with the demand of modern frontend space, with attendant attempts to either patch over (transpiling languages such as Coffeescript and Typescript), reform (ES-whatever), or outright replace (WebAssembly) it.

    Clojurescript is a solution in the “patch-over” category that bring the elegance and pleasure of writing program in Clojure to the web. More importantly, Clojurescript has placed a strong emphasis on Interactive development, and has been leading other technology stack over the years.


  • The Monad Tutorial Fallacy, Part Two: Monad, Kleisli and Eilenberg-Moore Category

    (Go to Part 1 of this series)

    In part 2 of this series we explain the technical core of the theory of Monad. Of central importance is the attempt to provide algebraic interpretation of everything, as well as to convert things into suitably algebraic structures. We will also revisit this issue at an arguably “better” (but more advanced) angle in part 5.

    While the picture for an adjunction is relatively clear, it suffers from needing to work with two categories at the same time. Monad fixes this by composing the left and right adjoint functors into an endofunctor , over a single category. An additional advantage with this construction is that it is more algebraic as it is now composable: we can iterate to get , etc for example.


  • A Quick Note on the Clojure (Backend) Web Space

    (Last Updated on 16 Sep 2017. Thanks nha, gsnewmark and danielcompton for corrections and discussions!)

    (Note to Experts: if you find any factual error in this note, please tell me by leaving a comment in the comment section below. Many thanks!)


    Clojure as a community has emphasized two points (among others):

    1. No complicated, Rube-Goldberg-Machine framework - prefer simple, focused, composable libraries for specific features. Pick your own choice for each feature and combine them in your application.
    2. Data is a first-class-citizen. Instead of coupling it with function, let it stand alone and have functions operating on/transforming them.

    That being said it is tedious and intimidating for a rookie to have to make informed choice on every step. So there is still some “frameworks”:


  • The Monad Tutorial Fallacy, Part One: Introduction/Prequel

    Understanding how monad works is a kind of mandatory rite of passage for any programmer aspiring to truly master the functional paradigm (of the advanced statically typed kind). Unfortunately it is an unforgiving trial: in spite of the large amount of tutorials out there the construction itself just seem to have some kind of irreducible complexity whose reason is mostly opaque to neophytes.

    Interestingly, although I mainly studied math when I was an undergrad, I first came to learn monad through the usual programmer’s way - see some hand-wavy explanation of what it is/does, see introductory examples of monads, read the abstract interface, read (and try to understand) more examples, struggle, then “think” that I understood it, realize (a few months to a year later) that I haven’t - that I have missed some facet of it, rinse and repeat, despair at some point that I am probably never going to truly master it…


  • Micro Web Framework in Python

    Web Framework is arguably the most often used kind of library in real world, as well as being something that keeps being reinvented for every programming language and every generation of programmer. Given such ubiquity, it is strange that it is not included in the canon of the undergrad Computer Science cirriculum alongside Operating System, Database, and Compiler. This post seeks to bridge this gap by presenting a series of short exercise that culiminates in building your own micro web framework. Have fun!

    Important Note: This exercise is inspired by Ruslan’s “Let’s Build A Web Server” series as a kind of follow up. As we will be using online resources to help, please read the reference section at the end first before beginning the exercise.


subscribe via RSS