Here’s a blog post demonstrating how to stream audio from your Mac to multiple Airpods or Bluetooth headphones using the software Loopback (though not required).
#alfred
Note on replacing TextExpander with Keyboard Maestro
A quick macOS tip on how to remove Terminal.app (or any app) from your Alfred & Spotlight search results
#android
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. This understandably infuriated some of us #AndroidDev unleashing the droid rage.
#android-studio
Blog post pointing out the right way to setup your JDK for Android Studio.
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.
#androiddev
Kotlin coroutines testing tip - exploring 3 of the important apis to control virtual time in your tests.
Kotlin coroutines testing tip - using backgroundScope to cancel never ending child coroutines in tests.
My tried and tested tips on testing Kotlin Coroutines
Kotlin coroutines testing tip - The most important concept for testing coroutines is knowing how to pick the right Dispatcher
A few Kotlin constructs have been introduced into the language over time. I wrote this post as a personal/public service advisory to remind us of their significance.
#audio
Here’s a blog post demonstrating how to stream audio from your Mac to multiple Airpods or Bluetooth headphones using the software Loopback (though not required).
#awk
The trick to understanding awk in all its terse glory is to understand its defaults. Most solutions you see in the wild are a clever symphony of awk defaults stacked on top of each other. In this post, I break down one of the most popular one-liners which should hopefully make future awk-ing pretty straight forward.
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.
#blogging
This post talks about using the popular CSS framework Tailwind to style a Hugo theme or blog in 2024.
Quick video demonstrating kscript + github copilot (unlock your scripting powers)
A shell script that will pull new blog posts from your feed and automatically post to Mastodon.
You should have control over where your online content resides. A good first step is having redirect domains.
#bluetooth
Here’s a blog post demonstrating how to stream audio from your Mac to multiple Airpods or Bluetooth headphones using the software Loopback (though not required).
#cast
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.
#computer-science
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.
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.
#copilot
Quick video demonstrating kscript + github copilot (unlock your scripting powers)
#coroutines
Kotlin coroutines testing tip - exploring 3 of the important apis to control virtual time in your tests.
Kotlin coroutines testing tip - using backgroundScope to cancel never ending child coroutines in tests.
My tried and tested tips on testing Kotlin Coroutines
Kotlin coroutines testing tip - The most important concept for testing coroutines is knowing how to pick the right Dispatcher
#cpu
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):
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.
#css
This post talks about using the popular CSS framework Tailwind to style a Hugo theme or blog in 2024.
#design
I’ve been using this font for a while as my primary programming font and referenced it in one of my newsletters. Thought i’ll share this more prominently. This website now uses Commit Mono for code. I customized a few of the characters:
How to freeze some of the font characters in an OTF font to the alternative version. Taking the slashed zero character as an example with the font IBM Plex Mono. This blog post will explain how you can pick alternative characters with OTF fonts and build a version of the font that will permanently turn these alternative character variants on.
How to customize and build the font Recursive - a versatile font for programming
Here’s a good resource for high quality app icons.
Henry - a customizable elegant Hugo theme with a gorgeous reading experience and packed with features
Henry - a customizable elegant Jekyll theme with a gorgeous reading experience and packed with features
How to customize and build the font Iosevka on macOS - a versatile font for programming
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.
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).
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.
#domain
You should have control over where your online content resides. A good first step is having redirect domains.
#email
After trying multiple email apps, I’ve found an approach using Gmail itself that has gotten me the most success with Inbox 0
#engineering-manager
My good friend Mustafa a Director at Shopify, has some good advice for Sonos on the recent rewrite fiasco.
Great companies maintain their insurgent mindset, for fear of becoming complacent and irrelevant over time.
Push decision making down to single-threaded DRIs
Single-threaded is tech jargon that simply means solely focused on a single area. The single threaded DRI is the most senior person whose only job is to run a given product or initiative, this will typically be a product management or engineering leader.
Leverage shared services to minimize duplication
If you want to build a ship, don’t drum up the men to gather wood, divide the work, and give orders. Instead, teach them to yearn for the vast and endless sea.
Antoine de Saint-Exupéry
Lessons for Engineering Managers in Software.
#fish
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:
#font
I’ve been using this font for a while as my primary programming font and referenced it in one of my newsletters. Thought i’ll share this more prominently. This website now uses Commit Mono for code. I customized a few of the characters:
Letter 3
How to freeze some of the font characters in an OTF font to the alternative version. Taking the slashed zero character as an example with the font IBM Plex Mono. This blog post will explain how you can pick alternative characters with OTF fonts and build a version of the font that will permanently turn these alternative character variants on.
How to customize and build the font Recursive - a versatile font for programming
How to customize and build the font Iosevka on macOS - a versatile font for programming
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).
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)
#fragmented
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:
#git
I wrote a blog post about git-number and how useful it was for my command line git usage. In an on-going effort to simplify my lifestyle & setup, I replaced git-number with a few git aliases. I’ll explain how I recreated the functionality in this blog post.
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:
#github
Use Campground PRs to improve your code before you start on your feature.
Quick video demonstrating kscript + github copilot (unlock your scripting powers)
#gmail
After trying multiple email apps, I’ve found an approach using Gmail itself that has gotten me the most success with Inbox 0
#headphones
Here’s a blog post demonstrating how to stream audio from your Mac to multiple Airpods or Bluetooth headphones using the software Loopback (though not required).
#henry
This post talks about using the popular CSS framework Tailwind to style a Hugo theme or blog in 2024.
Henry - a customizable elegant Hugo theme with a gorgeous reading experience and packed with features
Henry - a customizable elegant Jekyll theme with a gorgeous reading experience and packed with features
#hugo
Henry - a customizable elegant Hugo theme with a gorgeous reading experience and packed with features
#icon
Here’s a good resource for high quality app icons.
#inbox
After trying multiple email apps, I’ve found an approach using Gmail itself that has gotten me the most success with Inbox 0
#interviewing
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 ↩︎
… 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…).
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.
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.
#ios
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):
#iphone
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. This understandably infuriated some of us #AndroidDev unleashing the droid rage.
#jekyll
Henry - a customizable elegant Hugo theme with a gorgeous reading experience and packed with features
Henry - a customizable elegant Jekyll theme with a gorgeous reading experience and packed with features
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.
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.
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.
#js
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.
#keyboard
Blog post explaining a reliable way to use the Option key on macOS for keyboard shortcuts instead of special characters.
tl;dr:
brew install yqrashawn/goku/goku mkdir -p ~/.config && cd ~/.config touch karabiner/karabiner.json touch karabiner.edn # update your edn file with a sample from here https://github.com/yqrashawn/GokuRakuJoudo/blob/master/tutorial.md # or mine: https://gist.github.com/kaushikgopal/ff7a92bbc887e59699c804b59074a126 goku 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).
#kotlin
Kotlin coroutines testing tip - exploring 3 of the important apis to control virtual time in your tests.
Kotlin coroutines testing tip - using backgroundScope to cancel never ending child coroutines in tests.
My tried and tested tips on testing Kotlin Coroutines
Kotlin coroutines testing tip - The most important concept for testing coroutines is knowing how to pick the right Dispatcher
Quick video demonstrating kscript + github copilot (unlock your scripting powers)
A shell script that will pull new blog posts from your feed and automatically post to Mastodon.
A few Kotlin constructs have been introduced into the language over time. I wrote this post as a personal/public service advisory to remind us of their significance.
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?
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.
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:
#kscript
Quick video demonstrating kscript + github copilot (unlock your scripting powers)
A shell script that will pull new blog posts from your feed and automatically post to Mastodon.
#language
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). There are two ways to combat this:
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.
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.
#life
How I have my productivity system setup using Things and a monthly logging system
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 said yes right away.
The Japanese can chalk this up to their creative laurels along with:
the Fujifilm X100S the Sony walkmans and one of my favorite Anime.
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.
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”.
#loopback
Here’s a blog post demonstrating how to stream audio from your Mac to multiple Airpods or Bluetooth headphones using the software Loopback (though not required).
#macmini
I’d like to show you how I use Tailscale and a Mac mini in my office to achieve some nifty things.
#macos
Blog post explaining a reliable way to use the Option key on macOS for keyboard shortcuts instead of special characters.
Here’s a blog post demonstrating how to stream audio from your Mac to multiple Airpods or Bluetooth headphones using the software Loopback (though not required).
#maestro
Toggle window resizing, moving or snapping with these Keyboard Maestro macros
Note on replacing TextExpander with Keyboard Maestro
tl;dr:
brew install yqrashawn/goku/goku mkdir -p ~/.config && cd ~/.config touch karabiner/karabiner.json touch karabiner.edn # update your edn file with a sample from here https://github.com/yqrashawn/GokuRakuJoudo/blob/master/tutorial.md # or mine: https://gist.github.com/kaushikgopal/ff7a92bbc887e59699c804b59074a126 goku 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).
#mastodon
Quick video demonstrating kscript + github copilot (unlock your scripting powers)
A shell script that will pull new blog posts from your feed and automatically post to Mastodon.
#memory
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.
#movielens
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.
#music
Letter 3
A short piece about the legendary Tabla maestro Ustad Zakir Hussain and a few video snippets.
#my-new-programming-font
I’ve been using this font for a while as my primary programming font and referenced it in one of my newsletters. Thought i’ll share this more prominently. This website now uses Commit Mono for code. I customized a few of the characters:
How to customize and build the font Recursive - a versatile font for programming
How to customize and build the font Iosevka on macOS - a versatile font for programming
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).
#new-year
It’s my 2023 resolution to simplify the littany of software/hardware tools I’ve accumulated over the years. Use lesser tools without compromising productivity
Looking back at 2022
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.
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.
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.
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.
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.
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.
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.
#online
You should have control over where your online content resides. A good first step is having redirect domains.
#osx
A quick macOS tip on how to remove Terminal.app (or any app) from your Alfred & Spotlight search results
#otf
How to freeze some of the font characters in an OTF font to the alternative version. Taking the slashed zero character as an example with the font IBM Plex Mono. This blog post will explain how you can pick alternative characters with OTF fonts and build a version of the font that will permanently turn these alternative character variants on.
#photography
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
#podcast
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:
#presentation
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.
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 said yes right away.
#productivity
Blog post explaining a reliable way to use the Option key on macOS for keyboard shortcuts instead of special characters.
After trying multiple email apps, I’ve found an approach using Gmail itself that has gotten me the most success with Inbox 0
Toggle window resizing, moving or snapping with these Keyboard Maestro macros
It’s my 2023 resolution to simplify the littany of software/hardware tools I’ve accumulated over the years. Use lesser tools without compromising productivity
How I have my productivity system setup using Things and a monthly logging system
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.
tl;dr:
brew install yqrashawn/goku/goku mkdir -p ~/.config && cd ~/.config touch karabiner/karabiner.json touch karabiner.edn # update your edn file with a sample from here https://github.com/yqrashawn/GokuRakuJoudo/blob/master/tutorial.md # or mine: https://gist.github.com/kaushikgopal/ff7a92bbc887e59699c804b59074a126 goku 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).
#programming
Kotlin coroutines testing tip - exploring 3 of the important apis to control virtual time in your tests.
Kotlin coroutines testing tip - using backgroundScope to cancel never ending child coroutines in tests.
My tried and tested tips on testing Kotlin Coroutines
Kotlin coroutines testing tip - The most important concept for testing coroutines is knowing how to pick the right Dispatcher
Use Campground PRs to improve your code before you start on your feature.
I wrote a blog post about git-number and how useful it was for my command line git usage. In an on-going effort to simplify my lifestyle & setup, I replaced git-number with a few git aliases. I’ll explain how I recreated the functionality in this blog post.
Quick video demonstrating kscript + github copilot (unlock your scripting powers)
A shell script that will pull new blog posts from your feed and automatically post to Mastodon.
A few Kotlin constructs have been introduced into the language over time. I wrote this post as a personal/public service advisory to remind us of their significance.
The trick to understanding awk in all its terse glory is to understand its defaults. Most solutions you see in the wild are a clever symphony of awk defaults stacked on top of each other. In this post, I break down one of the most popular one-liners which should hopefully make future awk-ing pretty straight forward.
A fascinating article from 2017 on how coding or programming as a mechanism of writing software is frought with landmines. If you’re a software engineer, this article is a must-read. It took a lot of restraint not to just pull-quote every paragraph from this article.
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.
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:
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.
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:
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.
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?
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.
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:
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.
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:
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:
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.
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? Let’s talk about two concepts that seem similar: the Observer pattern and the Pub-sub pattern.
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.
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.
… 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.
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.
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.
#quote
If you want to build a ship, don’t drum up the men to gather wood, divide the work, and give orders. Instead, teach them to yearn for the vast and endless sea.
Antoine de Saint-Exupéry
Lessons for Engineering Managers in Software.
For All Our Failings, Despite Our Limitations and Fallibilities, We Humans Are Capable of Greatness…
Carl Sagan
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.
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
#rogueamoeba
Here’s a blog post demonstrating how to stream audio from your Mac to multiple Airpods or Bluetooth headphones using the software Loopback (though not required).
#rx
My tried and tested tips on testing Kotlin Coroutines
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:
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.
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.
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.
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? Let’s talk about two concepts that seem similar: the Observer pattern and the Pub-sub pattern.
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.
#script
How to freeze some of the font characters in an OTF font to the alternative version. Taking the slashed zero character as an example with the font IBM Plex Mono. This blog post will explain how you can pick alternative characters with OTF fonts and build a version of the font that will permanently turn these alternative character variants on.
Toggle window resizing, moving or snapping with these Keyboard Maestro macros
Quick video demonstrating kscript + github copilot (unlock your scripting powers)
A shell script that will pull new blog posts from your feed and automatically post to Mastodon.
The trick to understanding awk in all its terse glory is to understand its defaults. Most solutions you see in the wild are a clever symphony of awk defaults stacked on top of each other. In this post, I break down one of the most popular one-liners which should hopefully make future awk-ing pretty straight forward.
#shell
Quick video demonstrating kscript + github copilot (unlock your scripting powers)
A shell script that will pull new blog posts from your feed and automatically post to Mastodon.
The trick to understanding awk in all its terse glory is to understand its defaults. Most solutions you see in the wild are a clever symphony of awk defaults stacked on top of each other. In this post, I break down one of the most popular one-liners which should hopefully make future awk-ing pretty straight forward.
#simplify
I wrote a blog post about git-number and how useful it was for my command line git usage. In an on-going effort to simplify my lifestyle & setup, I replaced git-number with a few git aliases. I’ll explain how I recreated the functionality in this blog post.
It’s my 2023 resolution to simplify the littany of software/hardware tools I’ve accumulated over the years. Use lesser tools without compromising productivity
#software-engineering
My good friend Mustafa a Director at Shopify, has some good advice for Sonos on the recent rewrite fiasco.
Use Campground PRs to improve your code before you start on your feature.
My second letter.
Great companies maintain their insurgent mindset, for fear of becoming complacent and irrelevant over time.
Push decision making down to single-threaded DRIs
Single-threaded is tech jargon that simply means solely focused on a single area. The single threaded DRI is the most senior person whose only job is to run a given product or initiative, this will typically be a product management or engineering leader.
Leverage shared services to minimize duplication
A fascinating article from 2017 on how coding or programming as a mechanism of writing software is frought with landmines. If you’re a software engineer, this article is a must-read. It took a lot of restraint not to just pull-quote every paragraph from this article.
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 ↩︎
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.
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.
… 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…).
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.
#spotlight
A quick macOS tip on how to remove Terminal.app (or any app) from your Alfred & Spotlight search results
#steve-jobs
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 said yes right away.
February 24, 1955 – October 5, 2011
#tabla
A short piece about the legendary Tabla maestro Ustad Zakir Hussain and a few video snippets.
#tailscale
I’d like to show you how I use Tailscale and a Mac mini in my office to achieve some nifty things.
#tech
Great companies maintain their insurgent mindset, for fear of becoming complacent and irrelevant over time.
Push decision making down to single-threaded DRIs
Single-threaded is tech jargon that simply means solely focused on a single area. The single threaded DRI is the most senior person whose only job is to run a given product or initiative, this will typically be a product management or engineering leader.
Leverage shared services to minimize duplication
I’d like to show you how I use Tailscale and a Mac mini in my office to achieve some nifty things.
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. This understandably infuriated some of us #AndroidDev unleashing the droid rage.
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 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):
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).
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.
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
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…
#terminal
I wrote a blog post about git-number and how useful it was for my command line git usage. In an on-going effort to simplify my lifestyle & setup, I replaced git-number with a few git aliases. I’ll explain how I recreated the functionality in this blog post.
Quick video demonstrating kscript + github copilot (unlock your scripting powers)
A shell script that will pull new blog posts from your feed and automatically post to Mastodon.
A nifty fish shell script that allows you to just hit enter and get useful directory information like git status or directory list.
A bunch of useful cli commands for converting & editing images & PDF files
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:
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.
#testing
Kotlin coroutines testing tip - exploring 3 of the important apis to control virtual time in your tests.
My good friend Mustafa a Director at Shopify, has some good advice for Sonos on the recent rewrite fiasco.
Kotlin coroutines testing tip - using backgroundScope to cancel never ending child coroutines in tests.
My tried and tested tips on testing Kotlin Coroutines
Kotlin coroutines testing tip - The most important concept for testing coroutines is knowing how to pick the right Dispatcher
#things
It’s my 2023 resolution to simplify the littany of software/hardware tools I’ve accumulated over the years. Use lesser tools without compromising productivity
How I have my productivity system setup using Things and a monthly logging system
#threading
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):
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.
#tip
Blog post pointing out the right way to setup your JDK for Android Studio.
Letter 3
Blog post explaining a reliable way to use the Option key on macOS for keyboard shortcuts instead of special characters.
My second letter.
Toggle window resizing, moving or snapping with these Keyboard Maestro macros
Here’s a blog post demonstrating how to stream audio from your Mac to multiple Airpods or Bluetooth headphones using the software Loopback (though not required).
Note on replacing TextExpander with Keyboard Maestro
A nifty fish shell script that allows you to just hit enter and get useful directory information like git status or directory list.
A bunch of useful cli commands for converting & editing images & PDF files
A quick macOS tip on how to remove Terminal.app (or any app) from your Alfred & Spotlight search results
tl;dr:
brew install yqrashawn/goku/goku mkdir -p ~/.config && cd ~/.config touch karabiner/karabiner.json touch karabiner.edn # update your edn file with a sample from here https://github.com/yqrashawn/GokuRakuJoudo/blob/master/tutorial.md # or mine: https://gist.github.com/kaushikgopal/ff7a92bbc887e59699c804b59074a126 goku 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).
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.
I’m a little troubled that I love these kind of lifehack videos.
#todo
It’s my 2023 resolution to simplify the littany of software/hardware tools I’ve accumulated over the years. Use lesser tools without compromising productivity
How I have my productivity system setup using Things and a monthly logging system
#tootbot
Quick video demonstrating kscript + github copilot (unlock your scripting powers)
A shell script that will pull new blog posts from your feed and automatically post to Mastodon.
#tv
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.
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
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.
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)
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)
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
#vim
It’s my 2023 resolution to simplify the littany of software/hardware tools I’ve accumulated over the years. Use lesser tools without compromising productivity
#vpn
I’d like to show you how I use Tailscale and a Mac mini in my office to achieve some nifty things.
#vps
I’d like to show you how I use Tailscale and a Mac mini in my office to achieve some nifty things.
#vscode
Note on replacing TextExpander with Keyboard Maestro
#zakir
A short piece about the legendary Tabla maestro Ustad Zakir Hussain and a few video snippets.
#zsh
I wrote a blog post about git-number and how useful it was for my command line git usage. In an on-going effort to simplify my lifestyle & setup, I replaced git-number with a few git aliases. I’ll explain how I recreated the functionality in this blog post.