Two of my pull requests were just merged into OpenClaw : fix(slack): allow channel-id reads for name-allowlisted channels fix(slack): honor configured App Home command The commits that made it to main are here: github.com/openclaw/openclaw/commits/main/?author=jontsai They were reviewed and merged by Pete Steinberger. That still feels surreal to type. I’ve been writing software professionally for…
The Backstory I’m not a “script kiddie” or weekend hobbyist. I’m a UC Berkeley-trained Computer Scientist with over two decades of professional experience in Silicon Valley. I joined Iterable and EasyPost after their Series A rounds — both are now unicorns. At EasyPost, I managed 4 teams totaling ~20 engineers and delivered 8 figures of revenue. I know what production systems look like at scale. A…
In my previous post , I covered the basics of signing Git commits with SSH keys instead of GPG. This post covers the automation and multi-machine setup I built to make SSH signing seamless across 12+ machines. The Challenge Managing SSH commit signing across multiple machines introduces several challenges: Multiple keys - Each machine has its own SSH key Multiple emails - Different projects use…
TIL you can sign Git commits using SSH instead of GPG This tip is 🏆, learned from my really smart colleague . tl;dr; To configure Git to use your key: Configure Git to use SSH for commit signing: git config --global gpg.format ssh Specify which public SSH key to use as the signing key and change the filename ( ~/.ssh/examplekey.pub ) to the location of your key. The filename might differ,…
Too often, while reviewing code, I’ll see examples like: def extract_id_and_env(key: str) -> dict: """Extracts the object ID from `key` `key` is a string like 'namespace_prefix_12345' In some cases, `key` could also look like `namespace_prefix_12345_environment` Returns a dict with the object ID, an integer """ parts = key.split('_') parsed = { 'id': int(parts[2]), 'environment': parts[3] if…
Whenever using the datetime module in Python, a highly recommended practice is to just import datetime at the top of the file, and use the fully-qualified module name in the code, as much as possible: datetime.datetime datetime.timedelta datetime.date If one does from datetime import datetime , it’s hard to figure out at-a-glance what datetime is referring to in the middle of a…
tl;dr; Unless the function you are writing is a getter (which complements a setter ), please avoid naming methods get_ . get_ lacks descriptiveness, precision, and is boring . Rationale Software engineers are supposed to creative, and get is possible the least creative function name possible. Too often, I see codebases cluttered with get_ methods throughout, when the implementations of those…
Back in 2016, I came across this article: https://thecripplegate.com/14-rules-for-being-a-godly-employee/ Recently, I’ve resolved to start my work week by reviewing the 14 rules: Rule #1 – Eagerly start the day’s main work Rule #2 – Do not murmur at your busyness or the shortness of time but buy up the time all around. Rule #3 – Never murmur when correspondence is brought in. Rule #4 – Never…
tl;dr; isort ( PyPI ; GitHub ) is a wonderful tool that will sort imports in Python automagically, so that you no longer have to either a) ignore eye-sores during code reviews , or b) sound like an angry grandparent asking people to sort/organize imports . Quick Setup If you know your away around the *nix environment, these are the abridged instructions: Make the isort binary available somewhere…
In order to learn, there are three kinds of questions to ask: What? , How? , and Why ? Of these, Why? is the best question to ask, and What? is the worst; How? is in the middle but right near the bottom near What? . The reason Why? is the best question for learning is that it conditions you to go to first principles and learn how to learn . What? is the absolute worst type of question to ask,…
All too frequent an occurrence in the development lifecycle is doing some work, closing up your laptop/suspending the machine, and coming back to your work hours or days later. As you try to start up the local webserver or API server, you get cryptic error messages like the following: Address already in use Another process is already listening on port Port xyzw is currently used by another…
Edit: This article also got published on the GoodAudience Blog . I’ve been using println debugging since forever. It’s the best! It’s minimal, is the least surprising form of debugging, and allows you to set-it-and-forget it. I’ve also used interactive debuggers before, but when println debugging techniques are used effectively, I’d argue that step-through interactive debuggers are not necessary…
Netskope is a corporate security tool installed on corporate-owned devices that will introduce and override the default SSL certificate authorities by injecting its own local server. For developers, this often poses an inconvenience especially if they need to develop applications that make API calls and HTTP requests to other web services, if the developers are hitting a web service that has not…
TIL : Discovered a super game changing technique. From command line, you can copy contents of any file to Mac OS clipboard by running this command: cat yourfilename.txt | pbcopy Open your other application, press Command+V to paste as normal Profit. Immensely.
Periodically, web hyperlinks in Slack would stop working. The fix is surprisingly quite simple: Restart Google Chrome. The best way to restart Google Chrome safely and preserve your current open tabs is to type into the address bar: chrome://restart
Yes, there is a huge engineering talent shortage in Silicon Valley. There are more companies trying to build disruptive technology that have greater hiring needs than the available supply of engineering talent. I currently work at Iterable , and we are as of present a Series B company with around $30M raised total. We get hundreds of applicants a week, but few of them are qualified enough. I…
By Jonathan Tsai ( @jontsai | https://linkedin.com/in/jontsai ) Original Permalink (working Quip doc) : Communicating with Engineers: How to File Good JIRA Tickets License: CC BY 3.0 This article was originally written as part of a mini-training for the customer success team at Iterable in July 2017. For the most updated version of this article, view the Quip version at the above permalink. Edit:…
Software engineers frequently have to deal with JSON and inspect or manipulate it. There are two easy ways of pretty-printing JSON from command-line to aid in visual inspection. The first requires no installation, and the second requires a minimal installation but also provides syntax highlighting and manipulation capabilities. Method 1: Using Python - Nothing to Install Optional : Add alias to…
I know of several people who start learning to code in their mid 20’s, and are doing fine now. However, it’s very subjective what a “good living” is. Compared to the rest of society, programmers (anyone who writes code) and software engineers (a subset of programmers, with more emphasis on “engineer”) might make a relatively higher salary. However, just as with any field, there are different grade…
Assorted tips and tricks for IntelliJ Start the IntelliJ JVM process with additional memory Open the application once, normally, after a new install before editing this file . a. Otherwise, the signatures won’t match and the OS will think that the package has been tampered with, and security settings will prevent launching of the application. You will then have to delete the entire application and…
random: my new favorite coding adjective recently is “enriched” val enrichedObj = obj ++ someAdditionalStuffs reminiscent of / inspired by https://en.wikipedia.org/wiki/Enriched_uranium
When writing shell scripts or other types of executables, you often put a directive at the top of the file to indicate which kind of interpreter to use. #!/bin/python Oh wait, that didn’t work? #!/usr/bin/python Okay, that worked on my Mac. But why all the guesswork? There is another command that is better. Introducing env . Use it as a directive like so: #!/usr/bin/env python And if it’s a bash…
Originally posted on Quora: Jonathan Tsai’s answer to What is the most valuable programming language to know for the future and why? I will have to agree with Michael Hanson’s answer as well as some of the other ones that suggest learning multiple programming languages is more beneficial than picking just one . I myself am a multi-linguist of both human and programming languages. If you randomly…
Tonight, I was doing some research and maintenance on a couple of my open-source projects. In particular, I had recently learned about EditorConfig (which BTW, is a great idea! and a standard EVERYONE should adopt), and wanted to add it to most of my projects. That brought me to my GitHub homepage , and I caught a glimpse of my GitHub streak. Only 2 days! I was on a roll for a few days, and then a…
It’s 2015, and from time to time I still see a lot of == peppered throughout codebases that I work with, and just wanted to share a few posts that might change your mind =) tl;dr; === and its complement !== and should be used like 99% of the time because it is faster and more accurate. http://stackoverflow.com/questions/359494/does-it-matter-which-equals-operator-vs-i-use-in-JavaScript-comparisons…
The JetPacks 3.3 upgrade that allows you to manage and administer multiple WordPress sites from one WordPress.com account is a breeze to use! I’m not quite used to it yet and still getting acclimated, but I think it’s a great time-saver and will grow on me more over time. I can see it as a great feature to use once a site for daily workflows in updating content once a site’s major structural and…
tl;dr; When upgarding from Ubuntu 12.04 to 14.04 LTS, the Apache also gets upgraded from 2.2 to 2.4. There are lots of backwards incompatible changes. I just spent the last 3 hours fixing my server after impulsively upgrading to Ubuntu 14.04.1 LTS from Ubuntu 12.04. Well, not exactly that impulsively. I had seen this pestering MOTD-style message upon login for weeks now, and I figured that since…
tl;dr; If this is you: Android developer with an Intel-based computer Sick of dealing with a slow emulator Then: Install Intel HAXM (Intel Hardware Accelerated Execution Manager) I never knew this, and thought that I was doomed to a slow emulator or had to debug and deploy over a constantly plugged-in device, which could at times be inconvenient. Thanks to the guys at CodePath ( @thecodepath ) for…
Got an email today about a new Android training program starting up in SF for engineers. Best of all, it’s free! I’m definitely going to check them out and try to sign up. Update (2013-09-15) : If you’re unable to attend the class, they may have a “course observer option where you will have access to all the materials for the class, but you just won’t participate in the live classes, discussion…
Seriously though, I messed up in my previous blog post . Pinterest wasn’t hacked, and I’m sorry that I jumped to conclusions when I actually stumbled upon a spammer’s C&C. I still feel that the actions I took at the time were correct according to the knowledge that I had, but based on what I know now, I would have approached it different (contacted Pinterest first, now that I actually have their…
Update 2013-05-12: Pinterest wasn’t really hacked. See follow up to this blog post . – Well, almost hacked. This is rather embarassing (for Pinterest, and maybe AWS?), in that I was able to access what seemed to be their admin page. Furthermore, I discovered through this interface that it seems they do not store passwords encrypted or salted. If I’m not mistaken, I saw usernames, emails, and…
I call myself a generalist, but feel that I’m more adept at backend development than web frontend, so I’m always amazed by the simplicity and cleverness of really cool HTML/CSS/JS techniques out there. Responsive Sticky Footer by Timothy Long [ demo ] [ code ] This was very informative. I have yet to use this solution (maybe when I need a dynamically-sized footer), but it seems to be very…
On Sunday, February 3, 2013 (Super Bowl Sunday), Domino’s Pizza disabled ShopRunner free delivery on their site. This screenshot was taken from the Domino’s Order Page on Tuesday, February 5, 2013, when they added it back in. Coincidence? Sneaky Domino’s. I didn’t think to take a screenshot at the time, though. Too bad! Let’s see what sharing to Twitter yields…
Today, I was looking up biking directions to my new office . I wanted to take VTA Express from Fremont to Sunnyvale, and then bike the rest of the way. So, I looked up biking directions on Google Maps, and, to have a better idea of the actual road conditions, looked at street view . That’s when I noticed something interesting–all the cars on the road look the same! Am I seeing multiples? The…
After I switched to Ubuntu as my primary OS (dual-boot alongside Windows XP), I had a problem syncing some Dropbox files to an NTFS mount. While some files synced without much trouble, the Dropbox icon would consistently be spinning and several files and folders would not sync. I got around to searching for the issue today “dropbox ntfs ubuntu” and found this helpful blog post that answered my…
I upgraded to Mountain Lion (10.8.x) from Lion (10.7.x) a few months ago, and only discovered today that Apache wasn’t working–going to http://localhost showed the default “It works!” page. A quick search for “apache mountain lion” found this helpful guide: AMP Guide for Mac OSX 10.8 . tl;dr; for those who know what they are doing: There is no longer a Web Sharing section in System Preferences >…
Here’s a cool video. The song, named Tan Te , is sung by Gong LinNa. It is considered both modern and traditional Chinese music. And in case you’re wondering–no, the words don’t make any sense.
Last night, I made the best decision of my computing life, ever. Old Setup: Two desktop machines under my desk, two 24” LCD monitors, controlled by one keyboard and mouse via Synergy Main computer was Windows XP 32-bit Core2 Quad 8200 4GB RAM (2.8GB usable after OS and video card reserved) Primary uses were general browsing, word processing, gaming (Starcraft 2, WoW, Diablo 3), organizing and…
I’m newer to open-sourcing projects of my own on GitHub, so it’ll take me some time to “wrap” things properly and provide some documentation and examples so that these projects are more useful to others. I think sharing is viral, and I want to thank the open-source community for making it what it is today. I love what Jade Dominguez has done with Jekyll Bootstrap . Through him, I also learned…