How many times to hold Ctrl+Tab heavily loop through tabs to find a tab?

Chrome tabs

Believe me, you are not alone. I usually open more than 30 tabs in less30 minutes. Stack Overflow, Github, Twitter, Wiki, Google, YouTube, API doc, etc. And I really want a place to:

  • Visualize all tabs without the damn invisible top icons Chrome gives us
  • Jump to the right tab without hold Ctrl+Tab forever
  • Search by title and url
  • Drag to reorder tabs
  • Group tabs from the same domain together
  • Jump to the last tab I just visited
  • Select bunch of tabs and create a new…

We have an internal project using React, Redux, React Router v4, redux-saga, redux-act.

The requirement includes making the entire page state shareable by URL, which means we should put at least six variables in URL. The requirement also breaks the Redux data flow, because we have to either manually change the URL by Redux action or let URL changes manipulate our store.

Our first design is using a dedicated Redux store for URL only. Let other UI components fire action to modify the URL store, then generate new URL and put it into browser’s address bar. The painful story comes…

Believe me, you are not alone.

I have the same problem for years. First of all, I switched to zsh around 2013. Zsh is not so good (actually bad) without the Oh My Zsh. Oh My Zsh is really awesome and has a store now. But as I use more and more plugins. Zsh startup time becomes unacceptable. So I switched to Sorin Ionescu’s prezto around 2014. It’s faster. Anyone using Oh My Zsh with slow startup time should try this.

But there’re a lot of frameworks/tools/languages that need to preload during shell startup. Node Version Manager is a good…

This is a major release. Because I introduce base.js to provide some (it’s actually one function now, I’ll add more) basic functions.

Those functions can help you inject JavaScript codes more effectively.

For example, in my previous blog: Hide Quip’s sidebar automatically. If you use the extension below version 2.3.0, you need to inject 50 lines codes:

But now you just need three line:

The good part is that you can use the customjsReady to observe any DOM element. For instance, you can remove unwanted ads, adapt position for certain element, automate boring operations, etc.

Special thanks to Ryan Morr! He wrote a great blog about Mutation Observers and gives permission to use his codes in this extension.

Don’t hesitate to comment or shoot me an email if you have any question.

Since Quip has no choice to turn on/off its sidebar. You have to manually click the hide button. It’s tedious if you don’t want to see the sidebar at all.

Tools need: Chrome, Custom JavaScript for Websites 2

After install Custom JavaScript for Websites 2:

  1. Open any quip page
  2. Paste codes below:
customjsReady(‘.icon-hide-conversation’, function(element) {;

You are all set and enjoy!

BTW: don’t forget select the button “enable cjs for this host”!

Below is out of date!

After install Custom JavaScript for Websites 2:

  1. Open any quip page
  2. Open extension, select jQuery 2.1.0
  3. Paste codes below:
$(document).ready(function() {

Then it’s all…

I don’t like Java. One reason is that it made, makes, and will make everything complicated.

That means that more than 25% of our code is dedicated to retrieving/saving data from the Canvas API. That’s just making the API calls and parsing the results. That doesn’t include any AsyncTask code or caching, which we feel should be categorized as networking code as well.

I’m working on a project that need a custom Java compiler. Our compiler is an ordinary Java program, which should use java to start compiler instead of javac.

For gradle support, we decide replace all tasks with type JavaCompile to our custom JavaExec tasks. But we found a conflict between overwrite and dependsOn. The gist below with comments show which style can get expected outputs.

The weird thing is that the dosen’t work codes is not actually doesn’t work. In my previous experiments, it works (overwrite task a appear) sometimes, doesn’t work (task a appear) sometimes. Unfortunately, I can’t recreate this inconsistent issue.

I’ve used Emacs and Vim for years. And I really love them. They make my life easy, despite the nights I wrote their config files. Emacs and Vim are ONLY hackable editors. I can’t image who could enjoy Emacs or Vim without any config file(s). Probably I can use Vim without any config file occasionally. But I cannot use Emacs without evil package.

After 17 months public beta of Atom, I decide to use Atom as my primary editor.

Awesome out of box experience

Unlike Emacs and Vim, almost everyone can use Atom without any tutorial and configuration. The grammar snippets, spell checking, auto complete…

After comparison of Hexo, Jekyll, Octopress, FarBox, Ghost, and Medium. I decide to move parts of my blogs to Medium.

Because the Jekyll is too complicated for me. And other similar tools require I create or use theme. Blog should be a place let I write thought, not html/css/less/sass codes. Medium does a great job for blog. I can’t say the details of Medium are perfect, but it does do a great job!

So this blog will no longer update.

See you at Medium@xcv58!

Originally published at

I have one month vacation, and go back to China. So I need to renew my US F-1 Visa.

In short, you have to fill some documents, pay fees and make appointment.

All the procedure can be found in this website: ustraveldocs

My appointment time is 2015–05–28 8:30am. My good friend come with me, we arrive US Embassy around 8:00am.

There is a very long line. But there’re lots of peopel with appointment time after 9:00am. So they’re not allowed to enter the Embassy. I need to thru the crowd and say “excuse me” hundred times.

After that, the procedure…



Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store