Henry is a theme I first open-sourced for Jekyll. You can read all about it here. I’ve now recreated Henry for Hugo. Why Hugo? Over the last year, I’ve been learning Go and my interest in Hugo piqued. Hugo—much like Jekyll—is a static blog engine written in Go. But it’s got more features, a more active community and is blazingly fast. Features Many of the features I wrote as custom features for Jekyll, come built-in with Hugo.
I’ve used Jekyll as my blog engine here and meticulously tweaked it over the years to support a bunch of features. Many folks have asked me if I would ever put my theme up for sale or distribute it more widely. I’m happy to announce that it’s now available for free and open source. Introducing Henry - a Jekyll theme with a gorgeous reading experience, chock-full of features.
Given how many movies and TV shows we’ve been watching these days, it’s useful to have a personal rating system. I’ve used and tweaked this scale over time and it’s worked pretty well for me. How to use this system The scale ranges from 0-51 but coming up with a specific number off the top of your head is tricky. That’s where the associated descriptions comes in handy. Consider a movie and see if how you feel about the movie, matches with the associated descriptions.
From my 2020 post: 2019 has been the year that’s primed me the most for life changes. I imagine 2020 will the be the one where a lot of these changes materialize. … that’s cute. If you’re reading this in the future and suprised why, I suggest this Netflix mockumentary. Contagion style blazing dumpster fire year aside, it’s been hard to find the motivation to write this post. But reading my previous years’ posts, I’m usually grateful past me took the time to capture my thinking, priorities and general frame of reference.
The Bentwits So Ben Thompson1 recently tweeted: I’ve been using Android for the last couple of weeks, and honestly, the core OS is pretty good! The big problem is that Android apps are garbage relative to iOS apps. If developers actually care about pushing back against Apple they should give a damn. They don’t. He then went on to attribute the garbage quality of Android apps to developer laziness.
If you’re in tech and have been thinking about your work and role in your company, I highly encourage you to watch this talk by Tanya Reilly 1 Setting myself a reminder to rewatch this again 6 months from now. Such a phenomenal speaker and powerful story telling! Follow her @whereistanya ↩︎
I’ve been looking into Tufte CSS recently. Tufte CSS -inspired by the teachings of the legendary Edward Tufte1- provides suggestions and tools to style web articles for improved legibility. I’ve started to incorporate some of those principles here while still trying to keep the authenticity of my original design. Most of these changes have been in the realm of CSS however the sidenotes feature was a slightly trickier beast. I’ve implemented this feature in my blog theme “Henry” for both Hugo & Jekyll.
If you’re a software engineer trying to be snarky, it’s important to get these terms right for maximum effect. What is Yak-Shaving? “Shaving a Yak” means performing a seemingly endless series of small tasks that must be completed before the next step in the project can move forward. Is this a good thing or a bad thing? It depends. Yak Shaving is sometimes very much necessary. It’s “bad” only when done unnecessarily.
If you’re looking to just copy-paste instructions, jump to the section below. For the longest time, I’ve been rocking IBM Plex Mono as my programming font. While it has served me well, I started to experiment with some newer monospaced typefaces to see if I could find one that was even more legible1. That experiment quickly devolved into a rabbit-hole evaluation of a bunch of new programming fonts. Hello Iosevka Eventually, I landed up with the font Iosevka:
Two big announcements: I made my first screen cast 1 I’ve updated the permalink title for all the blog posts here 2 I wanted to make sure that external blogs linking to previous post links wouldn’t break. So in order to do this, I had to edit all of my previous blog posts and add a redirect_from tag. Life is too short to be doing this manually so I whipped up an awk program to do it for me in about 20 minutes.
If you’re a programmer these days, you probably spend a large part of your day in git. If you’re a command line zealot like me, you realize the holy ways of using your Terminal app for everything and aren’t seduced by fancy GUIs that only stand to dissuade you from pure unbridled productivity. With that in mind, one typically finds themselves in a position where they have a few files that have changed liked so:
2019 has been the year that’s primed me the most for life changes. I imagine 2020 will the be the one where a lot of these changes materialize. 2019 Recap Practice Vim for 30 days Not only did I successfully try it for 30 days, I now use vim as my primary text editor of choice and absolutley love it. It deserves a separate post though. Blogging + screencasting? I wrote 12 posts last year so I’m pretty happy with the 1-post-per-month average.
This blog now 1 uses Jekyll - a static blog generator that takes markdown as an input and pumps html as output. I then copy it over to my hosting server - Firebase, which then happily serves it to the interwebs. This setup has worked out swimmingly well thus far and has been rock solid. Even when my last post got high up the ranks of HN, my blog held steady.
tl;dr: brew install --cask karabiner-elements brew install yqrashawn/goku/goku # see my karabiner.edn file: # https://gist.github.com/kaushikgopal/ff7a92bbc887e59699c804b59074a126 Background I’ve been messing with mechanical keyboards recently.1 There was one in particular which is a 60% layout that I fell in love with. The trouble with 60% keyboards though is that they can be pretty constraining for some basic operations (like navigation). Notice there aren’t dedicated keys for the up/left/down/arrows. Courtesy: Wikipedia Given these constraints, you have to get a little creative with how you use a keyboard.
This whole piece is such a biograpy treasure trove and one I’m filing under the “come back and read in a year” category. I’m highlighting some of the snippets in particular that really resonated with me: “This is going to allow people to watch video on our iPods, not just listen to music,” he said. “If we bring this product to market, will you put your television shows on it?
I use a 13" MacBook Pro at work these days. Android Studio frequently sent my machine into a tailspin. Over time, I’ve had to tweak and update my AS settings to make AS work well on the 13". I figured I should post them here for posterity and the benefit of other AndroidDevs battling with deathly slow AS experiences. I’m posting the abridged instructions and linking to the blog posts that led me to these settings, if you care for the details.
The TestObserver is an RxJava staple for testing. It allows you to assert values in a stream, in the specific order they were emitted. Here’s a quick code snippet from the movies-usf repository 1: @Test fun onSearchingForMovieBladeRunner_shouldSeeSearchResult() { viewModel = MSMainVm(mockApp, mockMovieRepo) val viewStateTester = viewModel.viewState.test() viewModel.processInput(SearchMovieEvent("blade runner 2049")) viewStateTester.assertValueAt(1) { assertThat(it.searchedMovieTitle).isEqualTo("Searching Movie...") true } viewStateTester.assertValueAt(2) { assertThat(it.searchedMovieTitle).isEqualTo("Blade Runner 2049") // ... true } } If you look at the source for the base TestObserver, there are a bunch of these useful methods:
I’ve been dipping my toes into some iOS development recently. Nothing too crazy, just pairing with some colleagues and trying to see how we can jointly improve the technical design on both platforms 1. It so happens that Apple just finished it’s annual conference WWDC, so I’ve been following the announcements closer this timer around. In that process, I ran across a tweet (from Jeff Nadeau who’s a developer working at Apple):
This super intesting stack overflow answer explains why -in programming- if you have a sorted array, somehow magically it can seem like it’s easier to process each element vs processing the same array if it were unsorted. tl;dr - branch prediction With a sorted array, the condition data[c] >= 128 is first false for a streak of values, then becomes true for all later values. That’s easy to predict. With an unsorted array, you pay for the branching cost.
Sometime back I ran across a thread where folks talked about this programming style called “Space Shuttle style” that the Kubernetes codebase followed. // ================================================================== // PLEASE DO NOT ATTEMPT TO SIMPLIFY THIS CODE. // KEEP THE SPACE SHUTTLE FLYING. // ================================================================== // // This controller is intentionally written in a very verbose style. You will // notice: // // 1. Every 'if' statement has a matching 'else' (exception: simple error // checks for a client API call) // 2.
This is a fantastic post by Erik where he explains the nuance between IO-bound and CPU-bound operations in programming. … libraries have dedicated APIs for I/O scheduling work, separate from other types of operations …. but why is this the case? Why don’t we use a single thread pool for all background operations? The operating system will handle the scheduling of these threads the same I love how this specific question is framed (a good interview question for advanced mobile developers):
A not so well known api in RxJava is the .hide() operator. When does one use the hide operator in Rx? From the docs: Hides the identity of this Observable and its Disposable. Allows hiding extra features such as Subject’s Observer methods or preventing certain identity-based optimizations (fusion). there are a lot of complex operations that take place internally in RxJava (like internal queue creation, worker instantiation + release, numerous atomic variables being created and modified.
The Japanese can chalk this up to their creative laurels along with: the Fujifilm X100S the Sony walkmans and one of my favorite Anime.
This feature is beneficial for projects defining custom source sets, since the compilation of independent source sets can be parallelized. In the case of multiplatform projects, targets for different platforms can also be built in parallel. For Android, the debug and release build types can be compiled in parallel. This sounds pretty cool, however I paused to think how often would i need the debug and release build types to be compiled in parallel?
So i’ve been doing these kinds of posts for sometime now. Truth is i’ve been inconsistent with the format. Sometimes these are reflection posts (what happened last year) and other times they are resolutions posts (what i’m looking forward to in the next year). Usually it lands up being an amalgam of both, and I kind of like that personally. So i’m going to stick to keeping it a mishmash of thoughts as i begin the new year.
We recently held our semi-annual hackathon at Instacart - the Carrot Wars 2018! In putting this hackathon together, I noticed a pretty blaring gap - there wasn’t a simple (and free) online service that would quickly tabulate the results for a hackathon event. We looked around and found some nifty options, but most of them were a tad bit too expensive for our liking. They also were not setup for a single event use or required a monthly subscription.
This is such a fantastic post on how Apple sweats certain almost unnoticeable design details. I picked up a whole bunch of nuggets reading this article: …iPhone X rounded screen corners don’t use the classic rounding method where you move in a straight line and then arc using a single quadrant of a circle. Instead, the math is a bit more complicated. Commonly called a squircle, the slope starts sooner, but is more gentle.
Checkout this quick blog post I wrote for my company, tweaking the existing Kotlin TODO to work towards our requirements. While I don’t think this solution is a panacea for all your missing code snippets, I have found some luck with this method, in adding accountability for those PR review feedback comments you say you’ll get to, but conveniently forget :) Here’s a bonus if you’re reading this article from here:
I’m obsessed with typefaces and fonts 1. My programming productivity is irrationally dependent on the font I pick for my IDE. I have spent unhealthy amounts of time experimenting and trying different fonts for programming. I usually prefer a monospaced font and I’ve bounced between Inconsolata and Consolas in the past – both truly beautiful typefaces. Recently though, a design director at Instacart shared this link on the laws of UX (a fantastic read btw).
We need more kindness and positivity in our online lives today. There is no side, that cannot benefit from that. Being rational or correct is futile without empathy. You can have opposing (or even incorrect) views but you have to find a kind and positive way to express that. You either learn you’re wrong or convince the other of your point of view. But everyone is more willing to have the conversation, if approached with kindness and positivity.
In case you haven’t heard: RxJava2 was released sometime back. RxJava 2 was a massive rewrite with breaking apis (but for good reasons). Most dependent libraries have upgraded by now though, so you’re safe to pull that migration trigger with your codebases. Folks starting out directly with Rx2 might enjoy this guide but it’s the ones that started with Rx 1 that will probably appreciate it the most. This is a continuation post in a 2 part series:
This is a continuation post in a 2 part series: Understanding the changes Disposing subscriptions Disposing Subscriptions This was the part that I initially found most tricky to grasp but also most important to know as an AndroidDev (memory leak and all). Jedi master Karnok explains this best in the wiki: In RxJava 1.x, the interface rx.Subscription was responsible for stream and resource lifecycle management, namely unsubscribing a sequence and releasing general resources such as scheduled tasks.
One of the advantages of working in the Bay area is you tend to run in to tech celebrities every so often. I was working in Palo Alto (late 2015) on a previous startup (Wedding Party). My colleagues and I decided to get coffee at the nearby cafe. I saw Andy Rubin sitting outside casually talking to two other folks. I was certain it was him and told my buddies, “Hey, I think that’s Andy Rubin”.
I know it’s almost the end of January but I like to take my time with these posts. You can take a look at my previous year-end posts here. In addition to just jotting things I was most proud/happy about this year, I also want to note down some of my learnings. There were many overwhelming moments that led to much introspection. I want to try and document some of those moments here (atleast the less embarrassing ones).
I finished 2014 not having the slightest clue what would be in store. 2015 was a rollercoaster: I started a new podcast Fragmented (with my cohost and now friend Donn Felker), bought my childhood dream car (a Mini Cooper), got a new job (Wedding Party was acquired by Instacart), visited NY for the first time (for a talk I gave at DroidCon NYC) and finally - this one really stumped me - moved to San Francisco.
A common question most android developers have when using RxJava is: how do I cache or persist the work done by my observables over a configuration change? If you start a network call and the user decides to rotate the screen, the work spent in executing that network call would have been in vain (considering the OS would re-create your activity). There are two widely accepted solutions to this problem:
when Billy Joel was on the Jimmy Falon show and they used the iPad app “Looper”, i immediately looked for the android equivalent. there wasn’t one. i’m an android developer and a sound engineer (enthusiast) so obviously the right thing to do, was build one… i spent about two weeks and then gave up on the project cause it demanded far more time than i initially anticipated. the linked article is a fantastic read and summary on the problems with audio latency in android (and why i eventually just gave up on that project).
hear ye, hear ye! the 2nd episode of the Fragmented Podcast is out. Donn and i start by discussing Lamas, blue dresses and IDEs for Android development!
i spent a huge part of my 2014 on “Rx” (or reactive extensions) which is essentially a library that helps with a development pattern called “reactive programming”. i think Rx is going to be huge in the app development world. it’s already picked up a lot of steam, but i think it’s going to become a staple for professional app developers. consider this extremely common scenario: you’re in Burundi surfing facebook.
Originally posted this article on the Wedding Party tech blog Ok, so in my previous post I innocuously introduced the .share() operator. Observable<Object> tapEventEmitter = _rxBus.toObserverable().share(); What is this share operator? The .share() operator is basically just a wrapper to the chained call .publish().refcount(). You’ll find the chained combo .publish().refcount() used in quite a few Rx examples on the web. It allows you to “share” the emission of the stream.
i listen to a tonne of podcasts. i find activities such as doing my laundry, driving back home from work, doing the dishes … all delightful because it gives me a chance to strap on some headphones and listen to a bunch of podcasts. in the time that i run those dreadfully boring chores i’ve found myself learning so much about technology and good software development. as i was driving back home today i was listening to an episode of Ruby Rogues and thought to myself:
Originally posted this article on the Wedding Party tech blog This is a bonus RxJava post that I landed up writing along with my previous post on creating an event bus with RxJava. If you went through the code in the actual repo you would have noticed more than one version of the bottom fragment in the RxBus demo. Originally I envisioned the RxBus example being a tad bit fanicer however as I coded up the example, I realized that too many concepts were getting conflated.
i love the holidays. i especially love the new year’s though cause it’s an acceptable time to hit that big-nice-red reset button. stuff I wanted to get done in 2013/2014 get back in shape (significant progress on this front) get more sleep (been getting atleast 6 hours, which is good, now to bump it to 7) get really good at Rails (switched gears and became an android developer. i like to think i’m a pretty decent one too) get a job after my masters stuff done in 2013/2014: joined wedding party i joined as a full-time rails dev but landed up becoming a full-time android dev for them.
Originally posted this article on the Wedding Party tech blog This post has three parts: quick primer on what an event bus is implementing the event bus with RxJava parting thoughts on this approach “RxBus” is not going to be a library. Implementing an event bus with RxJava is so ridiculously easy that it doesn’t warrant the bloat of an independent library. Part 1: What is an event bus?
Originally posted this article on the Wedding Party tech blog I’ve read and watched a lot on Rx. Most examples either use the J8 lambda notations/Scala/Groovy or some other awesome language that us Android developers are constantly envious of. Unfortunately I could never find real-world simple examples in Android that could show me how to use RxJava. To scratch that itch, I created a github repo with a couple of nifty examples using RxJava.
Originally posted this article on the Wedding Party tech blog Mobile devices are getting pretty fast, but they aren’t infinitely fast yet. If you want your app to be able to do any serious work without affecting the user experience by locking up the interface, you’ll have to resort to running things in parallel. On Android, this is done with “threads”. Grab yourself a cup of coffee and read this post line by line.
The title was just to grab your attention. The tl;dr version of this post is: get good at story telling. It’ll help you with two things: Becoming a better presenter. Improving your memory. I urge you though, to read this post in it’s entirety. You might some of the stories interesting: Presentations are generally looked at with much anxiety and trepidation (within the tech community at least).
For All Our Failings, Despite Our Limitations and Fallibilities, We Humans Are Capable of Greatness… Carl Sagan
This is by far the funniest stuff I’ve read this year. Never fails to crack me up…
There’s something innately comforting about coding. The solution is not known but the variables are fixed. The ambiguities are minimal and the choices are simple. The rule book is adhered to. You mess up and you get bugs, you get it right and a solution is reached. If the solution is good, it becomes poetry. I realize why management have it tough now. The jargon, documentation, definitions, ambiguity and interpretations that they have to deal with are such a mess.
My last post didn’t exactly end in an optimistic note. Let’s correct that: Wishing you all a happy, joyous and peaceful 2013 folks! The Mayans predicted that the world-as we know it-would end but we’re still here standing (cheers to that). The new year is a time to reflect and wipe the slate clean. People advice against making new year resolutions but I do them anyway. I like taking a look back at my previous resolutions.
Apple released a new iPad ad during the Olympics. If you’re curious to know which song they used, it’s the song “Driving” by Stolen Jars. Two other songs i picked from their previous ads: Goldengrove & The Kiss.
i would give my savings away for something like this. Daniel Araya
I’m willing to look foolish, if it means I’ll learn something. This is the best piece of advice I’ve ever received, courtesy a chemistry professor back in my days of IIT. I did miserably in that course but I picked up this piece of advice that’s been a guiding beacon ever since.
Twitter’s got a new logo. It’s clean and simple. But here’s a more astute observation from underconsideration.com : For the most part, all the news sources reporting on the revised bird have focused on its visual update, which I will get to soon, but the real story here is that Twitter has dropped its name from the logo. If you look at the opening image of this post, the change is quite drastic.
Hear this recitation by Stephen Fry ((this man could read the instruction manual of a tape recorder and i would still link to it and love it)), then think about what he says. Hear it again, then meditate on what he says.
for all our failings, despite our limitations and fallibilities , we humans are capable of greatness… from the book Pale Blue Dot: A Vision of the Human Future in Space by astronomer Carl Sagan
Truly inspirational stuff. I see a Tom Hanks movie script already in the making.
I’m a little troubled that I love these kind of lifehack videos.
Frankly, I was surprised that Gruber mentioned Markdown previewing at all. If you’ve been around the Markdown community for any length of time, you know that the first rule of Markdown is: Gruber never talks about Markdown footnote from the awesome drdrang
… You should mention what technologies you are using (because listing WCF or Java will save me the hassle of applying, and you the hassle of rejecting me), but don’t list specific tools, languages and frameworks as requirements. Good developers who know Rails can learn Django or Node. Going between Oracle, SQL Server, MySQL and Postgres is all pretty trivial. … I remember being asked quite eagerly, during a pre-interview, if I knew a specific view engine (like erb, or haml…).
Dr.Neil Degrasse Tyson on the Verge: .. the bulk of the Androids get their time from GPS satellites.. The time keeping bases for the GPS satellites was defined upto 1982 and since 1982, 15 seconds have been added to civil time and that 15s is not included in the Andorid time keeping settings (because their getting their time directly from GPS), whereas the iPhone compensates for this and puts the 15s backs in…
If you’re in the business of hiring programmers, the article linked is a must read. It’s concise and a gold read. No excuse for not reading it. Avoid nano-questions A good engineer thinks abstractly in terms of designing and building systems, they think in terms of algorithms, components, and engineering design. They do not necessarily know all of the details of syntax of a given language, especially if they are used to a good IDE… … it is more important that I be able to tell you when and where I should use inheritance, and when and where I should use polymorphism, than to be able to spit off the definition.
Before you speak, think: Is it necessary? Is it true? Is it kind? Will it hurt anyone? Will it improve on the silence? Sri Sathya Sai Baba
for his professional albums, he uses a combination of 4 mics as explained in this youtube video. the song he plays in the end is Mombasa, easily one of his best compositions. on the move he records with an Apogee ONE as seen in this youtube video. for an on-the-move mic and sound capture device, the Apogee ONE is simply mind blowing.
definitely dated, but interesting yardsticks. via Hacker News
You’d be surprised how valuable the skill of eloquent communication is even in the field of IT. Keeping users apprised with your progress is perhaps the most important thing to do when working with clients. But keeping them apprised is tricky business and the ability to clearly put down in words,what to expect, is a basic necessity today. Even if you have nothing to do with CS or computers, you should read the linked article.
Proof that my TV watching addiction has not been in vain: In the Waiting Line by Zero 7 (House S03e13) Home by Zero 7 Grounds for Divorce by Elbow (House Season 6 premier) I’m not Drowning by Steve Winwood (House s05e18) Company by Philip Glass (House s05e23) High School Composition (House s03e15 : the one with Dave Mathew) possibly originally by Jon Ehrlich Pride by Syntax (Bones s01e16) Babylon by David Carbonora (Mad Men s01e06) Believe by The Bravery (Prison Break s04e07) Perfect Day by The Constellations (Chuck s04e08) Cobrastyle by Teddybears (Chuck s01e01)
What you need to know about RAM, memory, CPU Processing and other important stuff that could tell you why your computer is slow. Physical RAM/Memory RAM chips funcion quite literally like your Computer’s Memory. All the information that needs to be remembered when operating between different tasks (or even the same task) gets stored here. You know how people who have great memories can be awesome, that translates to the computer world as well, more memory = more awesome.
So my brother introduced me to this really awesome BBC TV Series: Sherlock. If you’re a type nerd or design enthusiast, the very first thing you would notice is the brilliant typography used throughout the show. If you’re losing sleep finding out which fonts were used: AF Generation Z (in the text messages) P22 London Underground (when deducing the clues)
February 24, 1955 – October 5, 2011
fantastic video, great stunts and carefully edited. must watch! Tempest Freerunning Academy. i just love the super smooth background score in the video. it’s a remix of the song Lights by Ellie Goulding and has become my favorite running tune. you can download it for free here. via: kottke.org
These stunning shots were taken with an iPhone camera: iPhone Fashion Shoot - Fstoppers iPhone 3g model shoot Amazing pics taken with an iPhone - photoble.com photoble.com - Amazing pics with iPhone
2009 was good. I didn’t do to well in terms of fulfilling my resolutions last year, but I’ve got a great feeling about 2010. Here’s 2010’s resolutions: Get my website/blog back up I’ve been saying this for too long now. 2010 WILL see this task done. Period.. Read one book a month I sought to do something similar in 2009, instead I tweaked my rss feeds and lived like an information junkie.
It’s New Year’s Eve and I’m all set with my resolutions. Until I started seriously blogging (which-if you believe-would be around mid 2008), I never really saw the point in drawing up these lists. It felt lame, pointless and a waste of time. But with the advent of my blogging ways, I realize that maintaining a resolution-list would help keep check and achieve my goals/ambitions much faster. Besides, 365 days from now it will be nice to see how my priorities and views might have changed.