Using better CLIs

For people who spend half of their lives in a terminal user experience and functionality is highly important; making you a happier person
10 October

Here are some very good alternatives to some default command line applications.

TLDR

My full setup includes all the stuff discussed in this article and even more

Git

hub

When working with open-source (and Github) projects frequently sometimes git is not enough. So, Github created a tool called hub.

It allows to fetch from remote forks, browse issues, and create pull requests with ease!

# Open the current project's issues page
$ git browse -- issues
  → open https://github.com/github/hub/issues

# Fetch from multiple forks, even if they don't yet exist as remotes:
$ git fetch user1,fork2

# Browse issues:
$ git browse -- issues
  → open https://github.com/github/hub/issues

# Create a pull request:
$ git pull-request -F message-template.md

tig

Let's face it. git log sucks. It allows browsing commits history, but when you want to look inside a specific commit for its changesets or tree structure, well ... You will have to memorize all these commands or use a lot of external plugins.

tig solves it all. Firstly, it allows to browse commits history. Then you can dive inside! Browse changesets, file trees, blames, and even blobs!

tig code example
tig code example

Utils

postgres (and mysql too!)

When working with postgres we have to use psql. And it is quite good. It has history, some basic autocomplete and commands that are easy to remember. But, there is a better tool called pgcli.

pgcli
pgcli example

Features:

  • smart autocomplete
  • syntax highlighting
  • pretty prints of tabular data

It also has a version for mysql called mycli.

By the way, yesterday a new 10th version of postgres was released.

glances

System monitoring is a common task for every developer. Standard tools like top and htop are fine and trusted software. But look at this beauty, glances:

glances example
glances example

glances has a lot of plugins to monitor almost everything.

It also has a web interface and a pre-build docker-container to integrate it easily. My top list of plugins:

  • docker
  • gpu (very useful for miners and coins-folks!)
  • bottle (web-interface)
  • netifaces (IPs)

Create your own if you want to!

httpie

curl and wget are well-known and widely used. But are they user-friendly? I don't think so. httpie is user-friendly and can do everything these tools can

httpie example
httpie example

And even more. I don't regret a single minute using it instead of curl.

jq

jq is like sed for json. It is useful in automation, configuration reading, and making requests.

You can try it online.

doitlive

Sometimes you have to do something live: a screencast, a gif, a talk. But everything can go wrong. You can make a typo, or misspell a word. That's where doitlive comes to the rescue.

Just create a file called session.sh with command that needs to be executed and then run:

doitlive play session.sh

Now you are a command line magician.

Python

I do a lot of python development. So, here are my tools to make it better.

pipsi

pipsi = pip Script Installer. It creates a virtualenv for every script and symlinks it into your /usr/local/bin. So it won't pollute your global environment.

pipenv

pipenv is a tool that aims to bring the best of all packaging worlds (bundler, composer, npm, cargo, yarn, etc.) to the Python world.

pipenv example
pipenv example

The problems that Pipenv seeks to solve are multi-faceted:

  • You no longer need to use pip and virtualenv separately. They work together.
  • Managing a requirements.txt file can be problematic, so Pipenv uses the upcoming Pipfile and Pipfile.lock instead, which is superior for basic use cases.
  • Hashes are used everywhere, always. Security. Automatically expose security vulnerabilities.
  • Give you insight into your dependency graph (e.g. $ pipenv graph).
  • Streamline development workflow by loading .env files.

ipython

ipython = Interactive python.

ipython brings autocomplete, nice history, and multiline editing to the python shell. It integrates into django and flask nicely without any configuration.
It is a must for all of my projects. If you like it, also check out jupyter.

Author - Sobolev Nikita, sobolevn

What is YAPF?

A formatter for Python files, developed by Google team
30 October

What is YAPF?

Most of the current formatters for Python --- e.g., autopep8, and pep8ify --- are made to remove lint errors from code. This has some obvious limitations. For instance, code that conforms to the PEP 8 guidelines may not be reformatted. But it doesn't mean that the code looks good.

YAPF takes a different approach. It's based off of 'clang-format', developed by Daniel Jasper. In essence, the algorithm takes the code and reformats it to the best formatting that conforms to the style guide, even if the original code didn't violate the style guide. The idea is also similar to the 'gofmt' tool for the Go programming language: end all holy wars about formatting - if the whole codebase of a project is simply piped through YAPF whenever modifications are made, the style remains consistent throughout the project and there's no point arguing about style in every code review.

The ultimate goal is that the code YAPF produces is as good as the code that a programmer would write if they were following the style guide. It takes away some of the drudgery of maintaining your code.

Code examples

YAPF takes this code:

x = {  'a':37,'b':42,

'c':927}

y = 'hello ''world'
z = 'hello '+'world'
a = 'hello {}'.format('world')
class foo  (     object  ):
  def f    (self   ):
    return       37*-+2
  def g(self, x,y=42):
      return y
def f  (   a ) :
  return      37+-+a[42-x :  y**3]

and reformat it into:

x = {'a': 37, 'b': 42, 'c': 927}

y = 'hello ' 'world'
z = 'hello ' + 'world'
a = 'hello {}'.format('world')


class foo(object):
    def f(self):
        return 37 * -+2

    def g(self, x, y=42):
        return y


def f(a):
    return 37 + -+a[42 - x:y**3]

See GitHub for more information.