Ask HN: What are your favorite terminal programs? - <AUTHOR> The title and why?
Recently discovered CMus and am a big fan of Pandoc and youtube-dl.
This has me wondering what else I'm missing out on. <comment><USER5> Written in Rust:

        - fd: A simple, fast and user-friendly alternative to 'find'
        https://github.com/sharkdp/fd

        - ripgrep: ripgrep recursively searches directories for a regex pattern
        https://github.com/BurntSushi/ripgrep

        - exa: Replacement for 'ls' written in Rust
        https://github.com/ogham/exa

        - bat: A 'cat' replacement.  I recommend following the customizations.
        https://github.com/sharkdp/bat

Written in Python:

        - asciinema: Terminal session recorder
        https://github.com/asciinema/asciinema

        - httpie: Modern command line HTTP client
        https://github.com/jakubroztocil/httpie

        - visidata: A terminal spreadsheet multitool for discovering and arranging data
        https://github.com/saulpw/visidata

        - youtube-dl: Command-line program to download videos from YouTube.com and other video sites
        https://github.com/rg3/youtube-dl

        - pgcli:  Postgres cli with autocomplete and syntax highlighting
        https://github.com/dbcli/pgcli

Written in C

        - jq: Command-line JSON processor
        https://github.com/stedolan/jq

        - tmux:  a terminal multiplexer
        https://github.com/tmux/tmux

        - pspg:  postgres pager (you can combine it with pgcli)
        https://github.com/okbob/pspg

<comment><USER6> I wish HN handled long horizontal scrolling lines on mobile better. It's aggravating that we are a site full of programmers and we can't get the basics of usability in 2018.

<comment><USER7> One thing that I think most people don't consider often is that making things more usable isn't always good. Medium and message are interlinked. If everyone in the world switched to mobile, it would change the content of the articles we read and it would change the discussion of those articles. When you make something more usable on a different platform, you're encouraging the biases that the platform compels. In the case of mobile this means encouraging shallower content and briefer discussions, among other things.

<comment><USER8> You can have different rendering for mobile/non-mobile.

We are in the midst of everyone switching to mobile.

<comment><USER7> I know. I'm pointing out why this is a bad thing, because most people who advocate for better mobile support on Hacker News don't see themselves as advocating for a reduction in the quality of discussion and a reduction in the depth and complexity of the articles being shared.

<comment><USER8> Thanks, I see what you mean now. I didn't get it because I use a mobile platform as desktop, but that's not generally true (so far).

</comment></comment></comment></comment></comment></comment><comment><USER9>
      history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n10
         1	167  16.7%  git
         2	130  13%    ll
         3	94   9.4%   clear
         4	90   9%     make
         5	80   8%     cd
         6	57   5.7%   e
         7	52   5.2%   cat
         8	45   4.5%   man
         9	38   3.8%   valgrind
        10	37   3.7%   rm

Where ´e´ is an alias for ´vim´.

<comment><USER10> I can copy/paste your statement and it works..

but when I try to save it as an alias method.. I keep getting error:

awk: cmd. line:1: {CMD[]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;} awk: cmd. line:1: ^ syntax error awk: cmd. line:1: error: invalid subscript expression

I thought I would just escape the double quotes ", and things would work. :/ Any ideas?

<comment><USER11>
      alias mostused='history | awk '\''{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}'\'' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n10'

</comment></comment></comment><comment><USER12> Linux has hundreds of them, in the various bin directories. Many are interesting.

This shell snippet lists all the directories in $PATH, using less, so you can page through them:

      for dir in `echo $PATH | sed 's/:/ /g'`
      do
          echo Listing dir: $dir
          ls -l $dir | nl
      done | less

I came across the watch command recently, which seems useful, and wrote something like it in Python:

A Python version of the Linux watch command:

[https://jugad2.blogspot.in/2018/05/a-python-version-of- linux...](https://jugad2.blogspot.in/2018/05/a-python-version-of-linux-watch- command.html)

I've also been writing Python versions of some other Linux commands, and will post about them here some time later.

Also, for saving (and then viewing) man pages (about commands or other topics), without the formatting characters (such as ^H), on some Linux distros, I find this useful:

m, a Unix shell utility to save cleaned-up man pages as text:

[https://jugad2.blogspot.in/2017/03/m-unix-shell-utility- to-s...](https://jugad2.blogspot.in/2017/03/m-unix-shell-utility-to-save- cleaned-up.html)

<comment><USER13> > _Also, for saving (and then viewing) man pages (about commands or other > topics), without the formatting characters (such as ^H), on some Linux > distros, I find this useful:_

^H is one of the two backspace characters (the other being ^?) depending on which VT standard you're configured to use. So you shouldn't really need a dedicate script to do that as it's just a problem between your pseudo-TTY (Linux console) and your terminal emulator (PuTTY / iTerm / xterm / etc).

Thankfully both are easily configurable. However without knowing which terminal emulator you're using I couldn't walk you throw configuring that. In terms of the TTY; you can change the backspace character via the `stty` command:

        stty erase [hit backspace on your keyboard]

Another thought is it might be a case that the TTY is largely configured correctly already but you're overwriting your environmental variables with non-standard values (eg the $TERM var with a value that differs from the actual terminal you're using) which is causing the pager (`less` / `more` etc. `man` will use this for the paging) to break the standard your terminal is expecting. But either way, this is definitely a configuration problem rather than something that should be fixed with additional parsing scripts.

<comment><USER14> > you shouldn't really need a dedicate script to do that

It isn't because the terminal is mis-configured and/or mis-interpreting those characters, it's because these characters have historically been used in a special way by troff's ascii output driver, as used by the man command.

Bold characters are "emulated" by outputting the character itself, followed by ^H, then by repeating the character, and underline is emulated by outputting _ (the underscore character) followed by ^H, followed by the character to be underlined. This is the same way that bold/underline was achieved on a manual typewriter or by old teletype terminals with paper output.

Pagers like "more" & "less" have in-built behaviour that knows how to interpret these sequences and render bold or underline appropriately, and if you "cat" the file your terminal would probably ignore them, but if you open a file with those sequences in a text editor, you're going to see a bunch of unnecessary ^H characters. The OP's script uses the "col" command to remove the unnecessary ^Bs (and the preceding character) that troff has output.

By default, GNU groff doesn't actually output those sequences anymore and uses ANSI escape codes instead. AFAIK many (most?) distributions actually compile out the ANSI behaviour in favour of the old way though (because "more" and "less" _don 't_ actually behave correctly with the ANSI characters by default), but some don't, which breaks the script (it's broken in Cygwin, for instance).

FWIW, if you need a fool-proof way to convert a man page to plain old ASCII with no escapes at all, it's easiest just to redirect the output of "man" to a file:

        man ls > ls.txt

The long-winded way (with groff) is something like:

        zcat /usr/share/man/man1/ls.1.gz | groff -man -Tascii -P -cbdu > ls.txt

<comment><USER12> You described the issue and cause better than I did :)

I didn't know about the ANSI behavior, interesting.

>FWIW, if you need a fool-proof way to convert a man page to plain old ASCII with no escapes at all, it's easiest just to redirect the output of "man" to a file:

> man ls > ls.txt

IIRC, even with that way, the control chars still appeared in the file (at least on some Unix version), which is why I wrote the script in the first place.

<comment><USER14> > the control chars still appeared in the file (at least on some Unix version)

That's a good point. My whole reply is a bit GNU-centric: the "col -bx" solution should work with everything except groff in ANSI mode (looks like the flag to go back to the standard troff behaviour is GROFF_NO_SGR [1][2], in case anybody is interested).

[1] See: [https://linux.die.net/man/1/grotty](https://linux.die.net/man/1/grotty) [2] SGR is "Select Graphics Rendition", apparently: [https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_G...](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_\(Select_Graphic_Rendition\)_parameters)

</comment></comment></comment></comment></comment><comment><USER15> If by terminal programs you mean command-line interface (CLI) programs, then you'll never regret learning how core Unix commands work, in themselves and in pipelines, and their POSIX-defined interfaces. I use these often: make grep find sed xargs m4 cut tr cat tee sort uniq head tail pg/more/less ps pkill/pgrep. My favourite among them is make, once you learn how it's meant to be used, it's an incredibly useful and flexible tool.

Some other useful CLI programs that I use and are not part of POSIX are: strace, perl, webalizer, rcs. RCS might be a mostly-forgotten VCS tool, but it is very suitable for version-controlling projects that consist of single files. I mostly use it for plain-text or Org-mode documents.

If you meant terminal-UI (TUI) programs, like top/htop, vi, etc., I don't really use them. But I've used these in the past:

\- mutt: a very nice mail client

\- newsbeuter: RSS/ATOM feeds client

\- vi: I do occasionally use vi in some situations

In the past years I've started to use Emacs tools instead of these because Emacs is a very rewarding, composable and comfortable working environment. Still, I use CLI programs through Bash/shell-mode all the time, because it's the most efficient way to do many tasks.

</comment><comment><USER16> The pipe viewer pv: [https://ivarch.com/programs/pv.shtml](https://ivarch.com/programs/pv.shtml)

Great way to give you a progress bar on a long-running process from the command line.

entr is useful for doing stuff on file change:

[http://www.entrproject.org/](http://www.entrproject.org/)

GNU parallel is like xargs, but in parallel:

[https://www.gnu.org/software/parallel/](https://www.gnu.org/software/parallel/)

</comment><comment><USER17> First of all, you might want to check out the subreddit:

/r/commandline [https://www.reddit.com/r/commandline/](https://www.reddit.com/r/commandline/)

general commands

\- awk/grep/sed/wc - text file processing

\- convert (image magick) - image processing tool

\- cpulimit - limit the cpu usage of a process

\- fdupes - check for duplicate files and optionally remove them

\- pdftk - concatenate pdf files and more - [https://www.pdflabs.com/tools/pdftk-the-pdf- toolkit/](https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)

\- rsync - back up tool

\- tmux - terminal multiplexer - almost always my first install

\- tree - view directory contents in a tree format

\- zcat/zmore - display a file that is compressed (e.g. zmore /var/log/syslog.2.gz)

security/reverse engineering:

\- binwalk - search binary images for embedded files

\- gdb + peda - debugger with extensions - [https://github.com/longld/peda](https://github.com/longld/peda)

\- nmap - network scanning tool

\- radare2 - command line dissassembler - [https://github.com/radare/radare2](https://github.com/radare/radare2)

\- scapy - network packet crafting - [https://github.com/secdev/scapy](https://github.com/secdev/scapy)

\- tshark - network traffic analyzer

\- tcpdump - network traffic analyzer

\- xxd - hexdump tool

Bonus:

\- find - find files - I often use this to find files containing a string:

$ cat bin/findstring

#!/bin/sh

find . -type f -exec grep -i -l "$@" {} \;

<comment><USER13> If you're just using find to run grep against all files then you would be better off using the recursive flag in grep instead

<comment><USER18> I like the composition of tools, it lets you extend your usage pretty easily. I personally run this 20 times a day: find -name '*.java' | xargs grep 'pattern'

<comment><USER13> But at least there you're searching for specific files. I was talking only about running a find to launch an instance of grep for every file found. That's more keystrokes to get a slower result.

For what it's worth, my biggest usage of find is similar to your java example (except a different file extension). I also do do '-exec sed...') a lot too.

</comment></comment></comment></comment><comment><USER19> [https://github.com/junegunn/fzf](https://github.com/junegunn/fzf)

Fuzzy Finder for files, history and more. Integrates with Vim (and maybe other editors). It is wicked fast.

<comment><USER20> And if you use the bash/zsh functions the provide in the wiki, it becomes even more useful for git, file opening, etc

</comment></comment><comment><USER21> I basically live in vim and tmux when I'm doing development work. Tmux IMO basically turns a terminal from a handy utility to a fully productive workspace.

I switched to ripgrep for my grepping needs, I find it fast and the syntax and output coloring handy.

Just found fastmod recently, [https://github.com/facebookincubator/fastmod](https://github.com/facebookincubator/fastmod). Very handy for doing bulk substitutions of strings in project directories - <USER2> can prompt with a diff for every change and do full regexes, so you can try out tricky things and make sure it isn't doing anything crazy before you let it make 500 changes throughout your repo.

Also a fan of gitsh, [https://github.com/thoughtbot/gitsh](https://github.com/thoughtbot/gitsh). Helps out with using Git on the command line just the right amount IMO - <USER3> avoiding the git prefix, tab completion, and a little syntax highlighting, instead of trying to redo the whole interface.

I don't use it that much, but jq, [https://stedolan.github.io/jq/](https://stedolan.github.io/jq/) is really handy for slicing and dicing json data without diving into the complexity of writing actual programs.

And on OS X, homebrew is indispensable for actually managing all of your CLI programs.

I also have found this Google Drive cli handy, [https://github.com/odeke- em/drive](https://github.com/odeke-em/drive). If you want to sync some but not all of your Google Drive files, and only push and pull on command instead of continuously, it's great.

</comment><comment><USER22> Since iTunes has been getting buggier and buggier for me (and I'm trying to switch to programs that run on all platforms), I've replaced with...

beets [http://beets.io/](http://beets.io/) for library management

mpd [https://www.musicpd.org/](https://www.musicpd.org/) for serving music &

ncmpcpp [https://rybczak.net/ncmpcpp/](https://rybczak.net/ncmpcpp/) for playing music (which I alias to `music`)

<comment><USER23> Combine with "abcde" for ripping CDs.

</comment></comment><comment><USER24> z and autojump are great, but if you want a full fledged file manager you should try ranger:

[https://ranger.github.io/](https://ranger.github.io/)

For news, newsboat is quite nice:

[https://newsboat.org/](https://newsboat.org/)

For parsing and select actions over url links you can use urlview (it works perfectly with pdftotext, newsboat, mutt, vim, w3m, etc.):

[https://github.com/sigpipe/urlview](https://github.com/sigpipe/urlview)

You can download webpages with httrack:

[http://www.httrack.com/](http://www.httrack.com/)

rsync is a fundamental tool to move files between computers or do backups, forget about scp:

[https://rsync.samba.org/](https://rsync.samba.org/)

You can work with most pdf and ps (those that are not scanned images) using your usual text tools,

[http://www.xpdfreader.com/](http://www.xpdfreader.com/)

There are even ready to go pdf + grep commands:

[https://pdfgrep.org/](https://pdfgrep.org/)

Somewhat meta, when you live in the terminal you need to be sure that you are a bit POSIX compliant. shellcheck is a good tool for that:

[https://www.shellcheck.net/](https://www.shellcheck.net/)

Finally, there are a two packages that should be in any distributions (include commands like vidir, parallel, watch, etc.):

[https://joeyh.name/code/moreutils/](https://joeyh.name/code/moreutils/) [https://gitlab.com/procps-ng/procps/](https://gitlab.com/procps-ng/procps/)

</comment><comment><USER25> Some of them that I can't live without are

        - git-standup http://github.com/kamranahmedse/git-standup

        - z https://github.com/rupa/z

        - ZSH https://github.com/robbyrussell/oh-my-zsh

Apart from that, some that I use time to time

        - curl-size https://github.com/egoist/curl-size

        - ripgrep https://github.com/BurntSushi/ripgrep

        - jq https://github.com/stedolan/jq

        - asciinema https://github.com/asciinema/asciinema

<comment><USER26> Just notice that you linked to Oh My Zsh (which, granted, is essential) but not to ZSH ([http://www.zsh.org/](http://www.zsh.org/))

<comment><USER27> >(which, granted, is essential)

Unless you belong to the Prezto or Antigen sects. :)

</comment></comment></comment><comment><USER28> If you like youtube-dl you should have a look at [https://github.com/mafintosh/peerflix](https://github.com/mafintosh/peerflix) !! (:

</comment><comment><USER29> It is no longer updated, but I recommend [https://inconsolation.wordpress.com/](https://inconsolation.wordpress.com/) as a very good read. From the about page:

>This blog is intended as a quick look at terminal-based applications available in Linux, and in some similar operating systems. Not only are these ideal for modern, low-power and space-saving computers, but they go a long way toward invigorating out-of-date hardware.

</comment><comment><USER30> Ever since I learned that USENET was still a thing for a current area of interest:

slrn [http://slrn.sourceforge.net/](http://slrn.sourceforge.net/) for reading newsgroups

My old fave (which I didn't even remember the name of) was

nn [http://www.nndev.org/](http://www.nndev.org/)

... which had too steep a (re)learning curve for reading just the one newsgroup.

<comment><USER31> Out of curiosity, where'd you sign up?

<comment><USER30> [http://www.eternal-september.org/](http://www.eternal-september.org/)

</comment></comment></comment><comment><USER32> Here are some of my favorites that I use daily:

\- tmux

\- mutt - email client

\- wyrd + remind - <USER4>

\- ledger - double-entry accounting tool

\- weechat + weeslack plugin - fully featured, super fast slack from the CLI

<comment><USER33> +1 for remind and wyrd. Remind is really, really powerful. You can express things like an appointment that fires "every 3 weeks starting May 4th, but if that day falls on a weekend or holiday then {skip it, move it to the following/preceding weekday that isn't a holiday}", and lots more. Wyrd is a really nice console frontend to remind (I just found that there are graphical frontends available too). Finally with rem2ics you can express really complicated things in Remind and then export the results as an iCalendar- compatible format and import that into whatever other calendar you want.

I used screen, remind+wyrd, mutt, and irssi (and even ledger) in school; I got a job at a bigco that pretty much required me to use gmail and gcal, and I stopped using console things as much. Lately I've been toying around with moving my mail flow back into console / console-ish inside emacs.

This brings back all kinds of memories: [https://www.roaringpenguin.com/wiki/index.php/Remind_use_cas...](https://www.roaringpenguin.com/wiki/index.php/Remind_use_case_2)

</comment></comment><comment><USER34> Meanwhile on twitter: [https://twitter.com/b0rk/status/993165679833567233](https://twitter.com/b0rk/status/993165679833567233)

</comment><comment><USER35> [https://www.passwordstore.org/](https://www.passwordstore.org/) for passwords.

<comment><USER36> oO

</comment></comment><comment><USER37> Emacs, tmux, tmuxp, ripgrep, eless[1], ncdu, exa (ls replacement. I often use 'exa --tree'), sed, awk, peco (I use this in aliases to select one or more items from a command outputting multiple values), hugo, dtrx, textract (npm), wget, shellcheck, rsync, htop.

I _heavily_ use git, but via Magit in Emacs.

[1]: My own little utility to use bare bones Emacs as less/pager: [https://eless.scripter.co](https://eless.scripter.co)

<comment><USER38> Wow, peco is so convenient, now I don't have to keep trying to grep every possibilities.

</comment></comment><comment><USER39> I find myself using noti a lot. It's effectively just a message generator that can receive data over stdout or trigger manually. It uses whatever the most appropriate notification method for your system is, so it feels very seemless. I use it for long-running tasks where I don't really know how long it's going to take.

[https://github.com/variadico/noti](https://github.com/variadico/noti)

</comment><comment><USER40> CSVkit - [http://csvkit.readthedocs.io/en/1.0.3/](http://csvkit.readthedocs.io/en/1.0.3/)

A collection of tools for slicing and dicing csv files on the command line.

</comment><comment><USER41> A few I don't see otherwise listed:

        export MARKPATH=$HOME/.marks
        function jump {
            cd -P $MARKPATH/$1 2> /dev/null || (echo "No such mark: $1" && marks)
        }
        function mark {
            mkdir -p $MARKPATH; ln -s $(pwd) $MARKPATH/$1
        }
        function unmark {
            rm -i $MARKPATH/$1
        }
        function marks {
            ls -l $MARKPATH | sed 's/  / /g' | cut -d' ' -f9- && echo
        }
        _jump()
        {
            local cur=${COMP_WORDS[COMP_CWORD]}
            COMPREPLY=( $(compgen -W "$( ls $MARKPATH )" -- $cur) )
        }
        complete -F _jump jump

I used to use this one more; converted to vimwiki instead: [http://todotxt.org/](http://todotxt.org/)

Local documentation:

        wget --recursive --level=5 --convert-links --page-requisites --wait=1 --random-wait --timestamping --no-parent $1

The only other ones which top the charts are jq, aws, curl, and docker.

</comment><comment><USER42>
      - googler: Google from the terminal
      - Buku: Bookmark manager like a text-based mini-web
      - nnn: The missing terminal file browser for X
      - bcal: Storage expression calculator
      - imgp: Multi-core batch image resizer and rotator
      - keysniffer: Linux kernel mode debugfs keylogger
      - ddgr: DuckDuckGo from the terminal
      - pdd: Tiny date, time diff calculator

</comment><comment><USER43> _locate_ may be the most-overlooked timesaver on the GNU distro. For searches of more than ~50000 directories, it's an order of magnitude faster than _find_ :

      $ time locate -0 /{opt,usr}/\*.gitignore |
        xargs -0 stat --format=%s | wc
          387     387    1225

      real	0m0.087s

      $ time find /{opt,usr} -name '.gitignore' -print0 2>/dev/null |
        xargs -0 stat --format=%s | wc
          387     387    1225

      real	0m0.748s

The speedup comes from reading a single database file rather than every directory within the tree to be searched. If the files you want were last touched today, a manually triggered rebuild of the database may be needed:

      $ sudo updatedb

The argument syntax for path specification of _locate_ I find more convenient as well.

</comment><comment><USER44> MPS-Youtube is extremely useful if you don't mind the CLI and want to quickly play a YouTube video. translate-shell if you're a language person. Very complete interface to most popular translation services. atools(aunpack, apack, als, etc) for quick archive manipulation if you're lazy.

<comment><USER45> mpv + youtube-dl plugin are also a nice combination, especially for live streams.

<comment><USER46> I prefer Streamlink[0] for live streams.

[0]: [https://github.com/streamlink](https://github.com/streamlink)

<comment><USER47> Could you please elaborate why you prefer streamlink over youtube-dl?

<comment><USER46> I use them both, it is just youtube-dl is more suited for live streams and youtube-dl is more suited for downloading non-live videos.

</comment></comment></comment></comment></comment><comment><USER48> Since all the good suggestions are taken, I want to mention a couple of diversions:

fortune: prints something silly or thought-provoking. You can get extra fortune cookie files or add your own.

cowsay: prints an ascii-art cow (or other creature) with a speech-bubble filled with the text of your choice. You can pipe fortune into cowsay for extra fun.

        $ fortune | cowsay
         ______________________________________
        / Publishing a volume of verse is like \
        | dropping a rose petal down the Grand |
        \ Canyon and waiting for the echo.     /
         </comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment>--
                \   ^__^
                 \  (oo)\_______
                    (__)\       )\/\
                        ||----w |
                        ||     ||

<comment><USER49> These days, there's also:

[https://github.com/erkin/ponysay](https://github.com/erkin/ponysay)

My latest find is to use a combination of weechat and wee-slack for most of my slack usage (it's note quite there when it comes to editing, or in-line reactions). But works well for the chat part:

[https://weechat.org/](https://weechat.org/)

[https://github.com/wee-slack/wee-slack](https://github.com/wee-slack/wee- slack)

As a former BitchX and sometime irssi user, weechat feel cozy. And it doesn't eat all your ram just for chat.

</comment></comment><comment><USER50> The Fuck - [https://github.com/nvbn/thefuck](https://github.com/nvbn/thefuck)

</comment><comment><USER51> Tetris:

[https://github.com/basic- gongfu/cixl/blob/master/examples/ci...](https://github.com/basic- gongfu/cixl/blob/master/examples/cixtris.cx)

PNG viewer:

[https://github.com/basic- gongfu/cximage/blob/master/examples...](https://github.com/basic- gongfu/cximage/blob/master/examples/pngans.cx)

Linux/64 binaries may be found here:

[https://github.com/basic- gongfu/cxbin/blob/master/linux64](https://github.com/basic- gongfu/cxbin/blob/master/linux64)

</comment><comment><USER52> Emacs.

Just ensure you're running a 256-bit color terminal emulator, and for most uses it doesn't even differ that much from the GUI version. Recently I've been doing a lot of work by SSH-ing to my desktop machine from a small netbook and using the terminal Emacs client. If you run Emacs in server mode, the transition is so smooth that at this point, I don't bother getting out of bed if I need to work on something late in the evening, I just take the netbook and SSH over.

<comment><USER15> If you don't have a reason to use Emacs from the terminal emulator, use the GUI. And for SSH, it's very hard to reject Tramp. One must is to make it less verbose though: (setq tramp-verbose 1). Then it becomes faster (at least in my perception) and way less noisy.

<comment><USER33> I find using emacs in the terminal less bothersome on osx because of osx's inane out of the box window management; I can replace it completely with managing emacs frames in screen and that experience doesn't change when I move between platforms.

</comment></comment></comment><comment><USER53> Piggybacking on OP's suggestion of youtube-dl, i have this alias for quickly grabbing the audio-only version of a youtube video. (I use it when I come across a song on youtube that I can't find for sale or streaming anywhere else)

alias dl-audio='youtube-dl --extract-audio --audio-format mp3'

If you have ffmpeg installed, just drop the video ID after dl-audio, and you'll get an mp3 of the highest quality audio stream available for the video.

<comment><USER49> I wouldn't specify mp3, unless you need to support legacy/device playback - there are often better audio versions available (ogg, aac etc).

</comment></comment><comment><USER54> \- Midnight commander - Best file manager ever

\- htop - a graphical top

\- xonsh: A shell written in Python. You can now write your shell scripts in Python (with access to any Python library)

\- mplayer: Video player

</comment><comment><USER55> There's so many programs and scripts I use it's hard to keep them all straight. So, instead of trying I just exported a list of every command in my history that I've used at least twice:

[https://gist.github.com/jamestomasino/9d912b409e5b6067ac233e...](https://gist.github.com/jamestomasino/9d912b409e5b6067ac233e62e1765c96)

Also of interest, my custom functions:

[https://github.com/jamestomasino/dotfiles/tree/master/bash/....](https://github.com/jamestomasino/dotfiles/tree/master/bash/.functions)

And finally, my OSX & Linux Mint install scripts which include a lot of great app packages:

[https://github.com/jamestomasino/dotfiles/blob/master/osxset...](https://github.com/jamestomasino/dotfiles/blob/master/osxsetup.sh) [https://github.com/jamestomasino/dotfiles/blob/master/mintse...](https://github.com/jamestomasino/dotfiles/blob/master/mintsetup.sh)

</comment><comment><USER56> ncdu to analyze disk space and find huge folders you can clean

And `z` (the zsh plugin) to cd into your most common directories

<comment><USER17> Thanks for sharing - I did not know about ncdu.

I typically do a series of "du -s -h * | sort -h" and this simplifies things.

<comment><USER33> wow, learned about that flag to sort today, thanks. I've been just doing "du -s | sort -n"

</comment></comment></comment><comment><USER57> fpp [http://facebook.github.io/PathPicker/](http://facebook.github.io/PathPicker/)

<comment><USER58> Rad

</comment></comment><comment><USER36> micro, mc, ag silver searcher, stat, find, aria2c, xev, w3m, wmctrl, nohup, xdotool, docker, php, ffmpeg, phantomjs, du, ls [From my history file, all others are homemade scripts and little functions in .bashrc]

<comment><USER59> ncdu is much better than just du.

<comment><USER36> Thanks. Will try it in details. Currently, it is taking like really forever to scan my bunchs of old school hard drives! du options are easy to remember, ergonomy first^ May I suggest a good one to remember `ls -ltrapR` <\- It always kill anyone aside ;)

<comment><USER36> And it was an amazing jump in productivity when i forced myself to learn `stat` shortcuts. Recommended!

</comment></comment></comment></comment><comment><USER60> tmux [https://github.com/tmux/tmux/wiki](https://github.com/tmux/tmux/wiki)

glances [https://nicolargo.github.io/glances/](https://nicolargo.github.io/glances/)

rtv [https://github.com/michael-lazar/rtv](https://github.com/michael- lazar/rtv)

rainbowstream [https://github.com/orakaro/rainbowstream](https://github.com/orakaro/rainbowstream)

discurses [https://github.com/topisani/Discurses](https://github.com/topisani/Discurses)

telegram-cli [https://github.com/vysheng/tg](https://github.com/vysheng/tg)

</comment><comment><USER61> Since a couple people mentioned z and autojump: I recently discovered z and found it so useful I ported it to Windows/Powershell.

[https://github.com/dwwmmn/z.ps1](https://github.com/dwwmmn/z.ps1)

It's a little simplistic for now but I hope it helps someone.

</comment><comment><USER62> For me personally, I guess netcat, socat, tcpdump and SSH (for tunneling) qualify the most. I'm working in a Windows environment where I'm usually not allowed to install new software, and I miss those by far the most.

Often, I need to do a test run of something which involves slightly rerouting network traffic and I'll spend half a day hacking together some horrible "solution" that I could literally have done in 3 lines of bash code on a UNIX- like system. Maybe throw hexdump for looking at binary stuff in there too.

Edit: Oh, and of course GDB! If only I could have the accumulated days of log forensics back that were done just because it's still _faster_ to do that instead of getting the visual studio debugger to work remotely. Whatever happened to KISS? -_-

</comment><comment><USER49> For Windows, I'd like to point to [http://scoop.sh](http://scoop.sh) as mentioned here:

[https://news.ycombinator.com/item?id=17019197](https://news.ycombinator.com/item?id=17019197)

It's a bit like a mix of (x)stow and apt for Windows. Or the good parts of arch aur with binary distribution.

Should probably also mention that I'm experimenting with asdf as a version manager - to avoid a long list of setup in bashrc to adjust paths to various interpreters. It follows a lot of best practices that various dedicated version managers seem to pick up eventually:

[https://github.com/asdf-vm/asdf](https://github.com/asdf-vm/asdf)

</comment><comment><USER63> * exiftool - photo metadata editing tool

* dcraw - RAW photo processing tool

* imagemagick - image processing library

* pandoc - convert one file into another

* diceware - random word generator (useful for creating passwords)

* csvtomd - convert csv files to markdown tables

* newsbeuter - RSS reader

* zathura - pdf viewer

* weechat - irc client

* ncdu - interactive disk usage

* ranger - file manager

* mpd - music player daemon

* vimpc - vim inspired client for mpd

</comment><comment><USER64> bat [https://github.com/sharkdp/bat](https://github.com/sharkdp/bat)

exa [http://the.exa.website](http://the.exa.website)

Both are good additions.

</comment><comment><USER65> Some time ago I wrote just for fun this couple of lines:

> What else I'm missing out on

echo 'Currently there are ' $(ver=(/bin /sbin /usr/bin /usr/sbin) && ls ${ver[*]} | wc -l) 'commands installed and available in the system'

This prints the man page of 3 random commands. One by one. Is a way to discover a few new commands each day. To go to the next command and exit press q. I hope you enjoy it.

commandoftheday=(/bin /sbin /usr/bin /usr/sbin) && ls ${commandoftheday} |sort -R |head -3 |xargs man '{}'

</comment><comment><USER66> GCE (Global Commands Execution), which is a desktop application that provides a single context to manage and run multiple scripts.

[https://github.com/Dewep/GCE](https://github.com/Dewep/GCE)

Why?

As web applications are being split in micro services and independant entities, it becomes harder and harder to setup a local dev environment and you have to handle dozen of shell terminals.

GCE aims to take that pain away by offering you the ability to configure the setup of your projects once and run it in the blink of an eye.

</comment><comment><USER67> A/V: mplayer, aa-xine, surfraw, mpsyt, youtube-dl, cdparanoia, oggenc

Network mgt: ipcalc, mtr, wireshark, nc

Comms & Info: mutt, w3m, irssi, screen (though if you're just starting: tmux), swaks (smtp swiss army knife),

Code & Tasks: make, gawk, sponge (moreutils generally), xclip (pbcopy OSX), at, batch, and cron,

Calculators: units (GNU, not BSD), bc, & dc,

Editing & Docs: pandoc, vim, less ("&" filters!),

Files: curl, wget, scp, rsync, & lftp, mc, column, tree,

Images: mogrify / convert (ImageMagick),

Sysadmin: apt, grep-dpkg, apt-file, auto-apt, pstree,

</comment><comment><USER68> I just started using cmus and it works great. Also loads up the music library pretty fast.

tmux, neovim are great together (after some configuration.)

Mplayer seems better than mpv. They need configuration though.

htop/top are pretty useful for figuring out which applications are taking up cpu resources.

cpufreq-utils are useful to set max/min cpu speeds if you're running low on laptop battery.

meld is an amazing diff tool though not command line. vimdiff is useful too.

</comment><comment><USER69> wuzz: [https://github.com/asciimoo/wuzz](https://github.com/asciimoo/wuzz)

</comment><comment><USER70> I love tig [https://github.com/jonas/tig](https://github.com/jonas/tig)

</comment><comment><USER71> I can't live without `sudo` :p

        - `ffmpeg` one utility for video manipulation to rule them all.

        - `ping` to check whether I am connected to the internet or not.

        - `curl -vvv maktabkhooneh.org` to check where is the connection problem happens.

        - `howdoi` search StackOverflow for snippets to solve your problem from the command line.

</comment><comment><USER72> \- ncdu for disk usage and deleting extra stuff

</comment><comment><USER73> xrandr: _Manege external monitors_

zsh: _Stepping up your terminal game_ \- [https://github.com/robbyrussell/oh- my-zsh](https://github.com/robbyrussell/oh-my-zsh)

tmux: _A terminal multiplexer, aka turns your terminal to a minimalist workspace_ (the only sane way I found to copy terminal output without using a mouse)

howdoi: _Search stachoverflow /stackexchange from the CLI_ \- [https://github.com/gleitz/howdoi/](https://github.com/gleitz/howdoi/)

nmtui: _WIFI /Networking from the terminal_ \- [https://github.com/heftig/NetworkManager](https://github.com/heftig/NetworkManager)

bluetoothctl: _Bluetooth from the terminal_

___________________

Lists for exploration:

\- [https://en.wikipedia.org/wiki/List_of_Unix_commands](https://en.wikipedia.org/wiki/List_of_Unix_commands)

\- [https://wiki.archlinux.org/index.php/List_of_applications](https://wiki.archlinux.org/index.php/List_of_applications)

\- [https://github.com/alebcay/awesome- shell](https://github.com/alebcay/awesome-shell)

\- [https://github.com/agarrharr/awesome-cli- apps](https://github.com/agarrharr/awesome-cli-apps)

\- [https://github.com/herrbischoff/awesome-command-line- apps](https://github.com/herrbischoff/awesome-command-line-apps)

(The github links seems similar, but there are some differences indeed)

<comment><USER73> Apperanlty I can't make a list of urls on HN, WTF

</comment></comment><comment><USER74> jq - amazingly useful for processing JSON

<comment><USER75> Ah, you beat me to it!

</comment></comment><comment><USER8> REQUEST: jq is great for json - but is there a "jq for xml"?

Some webservices are still only available in xml (e.g. uv levels). I currently use XMLStarlet for xml in the terminal. There are extra annoyances in xml that you can't avoid (like namespaces), but it could be a lot closer to jq.

<comment><USER76> I've used [https://github.com/ericchiang/xpup](https://github.com/ericchiang/xpup) for this a few times.

<comment><USER8> Thanks, seems the right idea, but browsing the code, _decode_ just interprets a single xpath expression. While that is useful (and I've used xpath from the CL like before), I found I quickly needed to be able to chain them together etc.

pup ([https://github.com/ericchiang/pup/blob/master/README.md](https://github.com/ericchiang/pup/blob/master/README.md)) which apparently inspired xpup does seem to have this, e.g. chaining, but unfortunately it uses css selectors instead of xpath.

</comment></comment></comment><comment><USER12> The Decorate-Sort-Undecorate idiom (a.k.a Schwartzian Transform) is useful:

[https://www.google.co.in/search?q=decorate+sort+undecorate+i...](https://www.google.co.in/search?q=decorate+sort+undecorate+idiom+in+unix+command+line)

</comment><comment><USER77> pianobar - command line Pandora client

[http://6xq.net/pianobar/](http://6xq.net/pianobar/)

[https://github.com/PromyLOPh/pianobar](https://github.com/PromyLOPh/pianobar)

</comment><comment><USER78> Tmux and ripgrep are two that I use daily. I used to use cloc then switched to tokei, then to my own scc which I use frequently along with lc. Hyperfine is something I have been using a lot and despite having ripgrep I still use grep often with xargs.

</comment><comment><USER79> `makearms`, a random SVG heraldry generator.

I'm biased, though, because I'm the author. [https://github.com/ironarachne/heraldry](https://github.com/ironarachne/heraldry)

</comment><comment><USER80> rg => (ripgrep) alternative to ack and grep.

<comment><USER81> There's also ag (the silver searcher)

<comment><USER78> I must confess based on the strength of the argument buruntsushi had with the Ripgrep comparison I switched from ag to rg and have not looked back. I was a daily ag user but I don't need the advanced regex support and I do like the speed.

</comment></comment></comment><comment><USER82> _Written in Python:_

\- subliminal: Find & Download subtitles [https://github.com/Diaoul/subliminal](https://github.com/Diaoul/subliminal)

</comment><comment><USER83> I was going to say xterm.. But I guess ssh, git, vim, gcc, make, node, tar, docker, elinks, mutt ls, ps, cp, mv, mkdir, timidity, minicom, tmux, diff, jq and some I can't recall right now

</comment><comment><USER84> mdp - A command-line based markdown presentation tool - [https://github.com/visit1985/mdp](https://github.com/visit1985/mdp)

</comment><comment><USER85> gron, a simple tool to make JSON greppable: [https://github.com/tomnomnom/gron](https://github.com/tomnomnom/gron)

</comment><comment><USER86> lastpass-cli ("LastPass command line interface tool") [0], with several aliases:

      $ alias | grep lpass
      lp=lpass
      lpls='lpass ls'
      lppw='lpass show -c -G --password'
      lpsh='lpass show -G'
      lpst='lpass status'

[0]: [https://github.com/lastpass/lastpass- cli](https://github.com/lastpass/lastpass-cli)

</comment><comment><USER87> cd

because I never had to lookup how to use it

EDIT: hm it doesn't even have a man/info page. Where can you learn about "cd" or "cd -", then?!

<comment><USER25> `cd` is not a command; it is built into your shell.

Some systems, like OS X and CentOS, map the cd man page to builtin which lists all the shell builtins and lets you know you should look at your shell's man page.

</comment></comment><comment><USER88> [https://github.com/wting/autojump](https://github.com/wting/autojump)

</comment><comment><USER89> Didn't see anybody mention "miller" yet ... pipe/grep/cut/awk etc for CSV files, really rocks.

</comment><comment><USER90> sponge is great when you want to read and write to the same file:

        cat file.txt | grep -v secret | sponge file.txt

</comment><comment><USER91> youtube-dl, get_iplayer.

I used to enjoy "orpheus", and MP3 player. That's ncurses, which I think counts. [http://thekonst.net/orpheus](http://thekonst.net/orpheus)

</comment><comment><USER92> musikcube: a cross-platform, terminal-based music player [https://github.com/clangen/musikcube](https://github.com/clangen/musikcube)

</comment><comment><USER93> htop and xstarter (disclaimer, I'm the author of the latter)

<comment><USER94> Damn, xstarter looks neat! I'll try how well it plays with the suckless terminal :)

<comment><USER93> Thanks! I think it works well with st!

</comment></comment></comment><comment><USER95> pdftk. If you find yourself needing to extract pages, split or merge pdf documents, this is wonderful.

<comment><USER96> Split PDF files by pages, blank pages, file size, bar codes, bookmarks. [https://www.coolutils.com/download/PDFSplitter.exe](https://www.coolutils.com/download/PDFSplitter.exe)

</comment></comment><comment><USER97> Some less mentioned ones : tig, htop

<comment><USER98> tig is the best underrated git frontend out there.

</comment></comment><comment><USER99> \- emacs

\- mc

\- git

\- ssh

</comment><comment><USER100> emacs

screen

notmuch, isync

powertop

parallel, ag

</comment><comment><USER101> youtube-dl dvdbackup

</comment><comment><USER102> I like ffmpeg

</comment><comment><USER103> vifm

</comment><comment><USER104> byobu

</comment><comment><USER105> ZSH

</comment><comment><USER106> ranger mocp rofi feh urxvt

<comment><USER107> ranger looks awesome... Going to try to integrate that into my workflow. Thanks.

</comment></comment><comment><USER108> rainbowstream

A python cli tool for twitter

</comment><comment><USER109> tldr ([https://github.com/tldr-pages](https://github.com/tldr-pages)) since I always forget the damn parameters for tar & it's more convinient than man

</comment><comment><USER110> like... tmux?

</comment><comment><USER111> q

Parse CSV with SQL

</comment><comment><USER112> nettop

</comment><comment><USER113> youtube-dl

<comment><USER67> Add to your repertoire: mpsyt.

</comment></comment><comment><USER104> pom

</comment><comment><USER114> tig

<comment><AUTHOR> Link? What's if for?

<comment> maze-le Its a CLI interface for git.

[https://github.com/jonas/tig](https://github.com/jonas/tig)

<comment><USER115> I think TUI as in Text User Interface (similar to GUI) would be a more appropriate term than CLI. git is CLI, tig is TUI and gitk is GUI.

</comment></comment></comment></comment><comment><USER116> st

</comment><comment><USER117> That is all.</comment>


Weird HN hack - <AUTHOR> I just see on the front page a weird submission. "Agen Poker Online Uang Asli Terbaik Dan Terpercaya" to http://asiapoker303.asia/
It has been flaggued and remove.
More information on this, there is a lot of these? <comment><USER2> Yes, lots of people spam HN with links promoting various off-topic sites (gambling, escort services, sports videos, etc.).

These usually get killed very quickly, and the users/sites end up getting banned by the moderators.

<comment> newsapp-io Yes, exactly and HN should take few more steps against it.

<comment><USER2> What additional steps would you suggest?

<comment><USER3> To send rotten fruits by mail to their business address.

<comment><USER4> There are also services that ship poop from the animal of your choice (from their catalog)

He was probably refering to automatize the removal, with crawlers or so.</comment></comment></comment></comment></comment>


Airship Ventures raises $8M, brings Zeppelin to California - <AUTHOR> http://venturebeat.com/2008/05/09/look-up-in-the-sky-zeppelin-company-airship-ventures-raises-8m/

<comment><USER2> About 15 years ago there was a similar scheme in London, UK. It was quite surreal to see an airship moving slowly along the horizon from the east end of London to somewhere near the centre (I forget where it was).

It was cool but it just disappeared. Anyone know why?

</comment><comment><USER3> I assume this will be a helium-filled airship.

<comment><USER4> The Extreme version will offer thrill-seekers a hydrogen-filled zeppelin under fire by anti-aircraft flak guns! :)

</comment></comment><comment><USER5> They could make more money if they offered fantasy rides, like a steampunk themed adventure. It's all right there. . . .</comment>


What happens when someone super smart is scientifically wrong? - <AUTHOR> https://www.linkedin.com/pulse/biggest-technological-blunder-all-times-jean-jacques-dubray <comment><USER2> As far as I can tell the author is getting testy that the term 'action' is not rigorously defined to have the meaning he prefers, what I can't tell is why I should care about that.</comment>


Charts & Graphics: 10 excellent books - <AUTHOR> http://www.cbsolution.net/roller/ontarget/entry/charts_graphics_10_excellent_books <comment><USER2> I find Tufte's "Envisioning Information" the most valuable (missing from the list).

</comment><comment><USER3> This is a great list. David McCandless' recent book _The Visual Miscellaneum_ does not quite fit in with these books - it's not instructional and has no "theory". But it's a beautiful book full of great examples of data visualization, enough to get any designer's creative juices flowing. I highly recommend it.

[http://www.informationisbeautiful.net/2009/the-visual- miscel...](http://www.informationisbeautiful.net/2009/the-visual- miscellaneum/)

</comment><comment><USER4> one missing book: beautiful data <http://oreilly.com/catalog/9780596157128>

often to get the right visual it is important to first realize the kind of data available---this book drives that home.

</comment><comment><USER5> I just borrowed "The Visual Display of Quantitative Information" by Tufte.</comment>


Uber drivers "employees" for unemployment purposes, NY labor board says - <AUTHOR> https://arstechnica.com/tech-policy/2018/07/uber-drivers-employees-for-unemployment-purposes-ny-labor-board-says/ <comment><USER2> This is important. We're at risk of the "gig economy" undoing over a century of hard fought gains in workers rights. Minimum wage laws, unemployment, etc, these are good things that should be preserved.

Uber has clearly shown that they're happy to be as exploitative as they're allowed to be. (And that even when they're specifically disallowed they'll do everything they can to ignore it and fight the laws.)

<comment><USER3> > This is important. We're at risk of the "gig economy" undoing over a century > of hard fought gains in workers rights.

There's definitely work to be done to modernize our employment laws with the changes to the economy. It's not a clear cut " _Everybody is an employee_ " though.

If someone drives for Uber for 1-ride per month should Uber pay $1000/mo for that driver's health insurance? How about 1-ride per week? How about if they have the app "on" but never accept a ride? Should they be paid for the time they didn't do any driving?

Clearly the driver isn't an employee in the traditional sense of the word. But they also aren't a totally independent contractor either as their livelihood is so closely tied to the platform of a private entity. My gut says to err on the side of not imposing restrictions or mandates until we figure out the right balance.

> Minimum wage laws, unemployment, etc, these are good things that should be > preserved.

Unemployment insurance, as it's implemented in the USA through effectively a tax collected by a private entity, is a scamola. A better idea would be having the employee get their own private unemployment insurance. That would also lead to lower costs of insurance for workers that are less likely to be discharged.

> Uber has clearly shown that they're happy to be as exploitative as they're > allowed to be. (And that even when they're specifically disallowed they'll > do everything they can to ignore it and fight the laws.)

Nobody is forcing drivers to drive for Uber. An argument may be that they were enticed with higher rates that were subsequently lowered in some markets. There's also the argument that a lot of the drivers don't under the total costs involved (double payroll tax, depreciation, etc) but by itself offering work in the "gig economy" isn't exploitation. Uber (and Lyft, and ...) should be lauded for (net) creating thousands of jobs.

<comment><USER4> "If someone drives for Uber for 1-ride per month should Uber pay $1000/mo for that driver's health insurance? How about 1-ride per week?"

Yes! A thousand times yes! Just because Uber is letting everyone i the door doesn't mean they should get to dictate new terms of what employment means. Imagine your employeer removing your healthcare and defending the decision with the argument "well we've now set it up so anyone can just walk in the door and start working and we'll pay them per hour worked. I know that's not what you are doing but we have to treat everyone the same so we're also cutting your pay".

<comment><USER5> Your policy would not have the impact of getting Uber to pay the $1000/mo in unemployment insurance for everyone that wants to drive for them. Instead it would have the impact of eliminating the offer of jobs to anyone not driving enough to justify the unemployment insurance.

It's essentially a job destroying policy in a time when we see increasing automation and therefore very counterproductive.

<comment><USER6> I flat out do not buy this argument. Business is always going to complain about any kind of worker's rights, claiming they'll "kill jobs". Given the record low unemployment rate, I do not believe them.

<comment><USER7> No, it's Basic Business 101. It's called managing cash flow and a balance sheet, and this sort of arrangement would drain them of all their cash without any benefit to the company. A company with no cash employs 0 people and then nobody wins.

<comment><USER6> I don't buy this argument. Of course a company doesn't want to spend money on their employees, and so they will do whatever they can to avoid it. That doesn't mean they should be able to get away with it. This kind of argument, that regulations "kill jobs" is not supported by reality, and is just them threatening to take their ball and go home if they don't get their way, like the spoiled child on the playground.

<comment><USER7> It's literally financially untenable to have more costs for employees than the revenue they bring in. This is basic math and no amount of "I don't buy this" is going to change that reality.

<comment><USER6> And the part I don't buy is that this is the case. I don't buy that Uber can't afford to treat their employees like people, and if they actually can't, then they need to go out of business so companies that can are able to grow.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER8> Deciding to drive for Uber is a mutually beneficial transaction between consenting adults (or an adult and a company). If the driver wasn't benefiting, they'd do something else.

Well-intentioned (by some people, prob most people on HN) and not so well- intentioned (anti-competitive lobbying by taxis) efforts to make the relationship less "exploitative" are likely doing more harm than good.

What happens when the gov mandates all these extra benefits? "Drivers WILL earn more money!" The answer is some combination of: Uber becomes costlier, people take fewer rides (or growth is slower than it should be), and some people who are perfectly willing and able to drive right now are unable to do so. Or (if demand is more inelastic) a bunch of new drivers decide the new benefits make it worth entering the market, and not everyone who wants to drive can/people sit around idle, etc.

Either way, you're hurting consumers and many existing drivers.

<comment><USER9> Edit: Yeah I'm off the mark, median pay is more like 10-8. I gotta read more closely

I think the "mutually beneficial" is somewhat debatable. If you take in to account the cost of upkeep on the vehicle from increased driving some drivers barely break even or even lose money driving for uber. On median a driver makes something like 3 dollars an hour [https://www.theguardian.com/technology/2018/mar/01/uber- lyft...](https://www.theguardian.com/technology/2018/mar/01/uber-lyft-driver- wages-median-report)

<comment><USER8> It has to be mutually beneficial, otherwise drivers would be doing something else. We don't have slavery in this country anymore.

One of the biggest benefits is working whenever you want. A paper by the NBER found drivers get twice the consumer (or producer in this case I guess) surplus they would from less flexible arraignments:

[http://www.nber.org/papers/w23296](http://www.nber.org/papers/w23296)

<comment><USER9> >It has to be mutually beneficial, otherwise drivers would be doing something else. We don't have slavery in this country anymore.

I want to be clear here, and I'd appreciate it if you did not put words in my mouth. I never claimed rideshare drivers were slaves. I was questioning the degree to which the arrangement was beneficial to both parties.

If everyone was perfectly rational, I would agree with you. But many of these additional costs are hidden. Uber advertises ~$8 an hour, which sounds pretty good. But they don't mention the wear and tear on the car, the increased cost of mechanics, etc. I'm not convinced most drivers are aware of that or look into it.

Clearly it is somewhat beneficial for the drivers. $4 an hour is better than $0 an hour, but I still think it's worth pointing out it's not even minimum wage in the US.

<comment><USER8> No worries, not suggesting you think it's slavery. I think that would be a pretty extreme position to take.

I do agree people aren't always rational, and there are certainly other costs in terms of wear and tear etc. But I think people are (1) relatively more rational when it comes to money, (2) get more rational with experience (i.e. as they observe having to take their cars in more after driving a while).

Uber has > 160k active drivers, I think it's very paternalistic to suggest they aren't rational enough to realize how screwed they're getting and think gov or some other third party needs to step in. I think it should also give us pause that many of the loudest voices saying these things (especially locally) are associated with the taxi industry.

These researchers say it's $8.55. Some people argue it should be more (like $13), but -- like I said in another comment -- a job is a bundle of things including pay but also: flexibility, liking who you work with, feeling like you accomplished something, etc. Uber provides very high flexibility (literally can almost work on demand), which economists have estimated gives drivers twice the surplus over similar paying, less flexible options.

<comment><USER9> I agree with your numbers after doing some more reading, i was definitely off the mark going in.

I would point to the high turnover rate as an indication that people do realize that maybe they aren't making what they thought they would when they started. I think people catch on, but that doesn't stop others from signing up without realizing it. However I'm not convinced the drivers are being exploited to the degree I originally claimed.

You make good points and have given me much to consider

</comment></comment></comment></comment></comment></comment><comment><USER10> And yet Taxis weren't for 100 years? Taxi drivers were even more restricted and were still not employees.

<comment><USER11> A neighbor of mine is a taxi driver. I can call the number on their cab (or their business card) and get them, specifically. I can also hail them if I see them on the street.

That seems like a far more legitimate "independent contractor" relationship than the one Uber sets up between drivers and riders.

<comment><USER10> You can do the same thing with Uber. The driver can just turn off the app and pick you up if you're nearby. Realistically it won't happen often, for the same reason that people didn't keep folders full of yellow cab business cards.

<comment><USER12> Well they probably can't because of the Taxi cartel. In most place, they need to be a licensed Taxi driver in a licensed Taxi car to be able to be hailed.

</comment></comment></comment></comment><comment><USER13> I can understand filing for benefits if you were terminated by Uber (first one was for low ratings) but one of the plaintiffs quit because of low pay. Quitting for non egregious reasons (bad work environment, harassment, etc) is usually a blocker for filing for claims.

<comment><USER11> A significant drop in wages is generally considered "constructive dismissal" for unemployment purposes.

<comment><USER14> > A significant drop in wages is generally considered "constructive dismissal" > for unemployment purposes.

A significant drop in wages _can_ be considered constructive dismissal, but it's generally difficult to prove without explicit evidence of the intention behind it. And in this case, it's pretty hard to make the argument that it constitutes constructive dismissal, since there is zero evidence that Uber acted in a way to target the driver by intentionally cutting their earnings specifically, _whether or not_ those actions were intended to target or retaliate against the driver.

<comment><USER11> My understanding is that wages are a bit of a special case.

You'd have to demonstrate intent/targeting for something like "they made me shovel elephant poop instead of my usual tasks".

A significant wage drop is inherently constructive dismissal as wage/salary tends to be most people's single most important criteria for accepting the job.

<comment><USER14> > A significant wage drop is inherently constructive dismissal as wage/salary > tends to be most people's single most important criteria for accepting the > job.

For a job in which pay directly correlates to job performance (such as tipped labor, or number of passengers driven, as in this case), you would have to demonstrate a number of things, including:

(a) the low pay represented a change (if the pay was consistently and comparably low since the beginning, nothing was constructed)

(b) the change in pay did not stem from a change in performance or the drivers' choice of hours worked

In this case, it's not clear that (a) applies, and it's almost certain that (b) does not, because there's no evidence that Uber made decisions that changed the take-home pay of the driver directly (such as reducing the driver's share, except insofar as any initial signup promotions expired, which would not constitute constructive dismissal).

<comment><USER11> Uber has cut compensation a number of times. [https://www.thedailybeast.com/uber-cuts-pricesand- kneecaps-d...](https://www.thedailybeast.com/uber-cuts-pricesand-kneecaps- drivers)

> A crowd of 600 drivers gathered outside the Uber office in Long Island City, > Queens, to protest a 15 percent reduction in fares last month, which also > means 15 percent lower wages. That pay cut is on top of Uber's 20 percent > slashing of fares in 2014. All things being equal, drivers who began less > than two years ago have seen their pay tumble a whopping 35 percent.

<comment><USER14> None of that constitutes constructive dismissal, because it doesn't constitute discrimination against the complainant (quite the opposite, in fact).

<comment><USER11> I think you're mixing up concepts. Discrimination is not required for constructive dismissal. A 35% wage cut is de-factor "you're fired, but we'll re-hire you at this lower rate" and is likely to make you eligible for unemployment as a result, as it's clearly a substantial modification to the employment contract between the two parties.

<comment><USER14> > A 35% wage cut is de-factor "you're fired, but we'll re-hire you at this > lower rate" and is likely to make you eligible for unemployment as a result, > as it's clearly a substantial modification to the employment contract > between the two parties.

It's not so cut-and-dry, and in fact, there's already case law in New York holding that pay cuts of about one-third are not inherently constructive dismissal, and that it depends on the particulars of the individual's case.

With that on top of everything else, it's a _really_ far stretch to read the one-line description from the article that the driver quit because of "low pay" and infer that constructive dismissal is applicable here.

<comment><USER11> If you're still talking about "I was discriminated against and want my job back and back pay as recompense", sure.

If you want unemployment benefits, the question is "will the state labor department accept it?" There's going to be a lower threshold there.

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER15> How does this work if they drive for both Uber and Lyft?

<comment><USER16> I would presume it would work the same as if you had two other part-time jobs, such as working at both Walmart and Best Buy.

<comment><USER17> It's different though. Part-time retail workers pledge their loyalty to Walmart from 9-13 and to Best Buy from 18-22. They're not instantly choosing which boss is paying better for the next 15 mins. You actually have to get someone to cover your shift if you need a mental health break or something -- otherwise, your relationship with Bestmart is strained and you might be out of work.

For all of the phoniness behind phrases like "ride-sharing" and "gig economy", workers have never had a more horizontal relationship with their bosses -- except, perhaps, in higher pay-grade service sectors where "bosses" are referred to as "clients".

<comment><USER18> > Part-time retail workers pledge their loyalty to Walmart from 9-13 and to > Best Buy from 18-22.

It's extremely common to not have fixed shifts. You ask for hours, and you get what you get. It's really not that different from accepting individual driving jobs.

<comment><USER19> There is also a dynamic where you are assigned shifts and if you don't make it your fired. Gets pretty dicy when you have two of them.

</comment></comment></comment></comment></comment><comment><USER20> This is absolutely ridiculous and just more cronyism on behalf of the taxi companies. Uber and Lyft drivers are definitively independent contractors. There is no legitimate argument otherwise, and pretending like they are is just showing the bias of these bureaucrats.

</comment><comment><USER21> I find it so funny when the state/government requires businesses to compensate people in some minimal way. If you think people need X dollars or Y benefits to live a comfortable life, why don't _you_ give it to them?

/rant

<comment><USER22> They do it precisely because of people who share that idea with you. Minimum wage may increase unemployment a small amount but the positive effects are ensuring that those people who have the lowest paying jobs are able to afford to live. Similarly with unemployment and welfare. For many people losing their jobs or taking a pay cut would mean becoming homeless or being unable to feed themselves.

If you think that there are enough charitable people in the world to voluntarily sustain you through the end of your natural life, I invite you to try it out.

<comment><USER21> Apologies, I must have worded that too vaguely. I meant the state should minimally pay people the amount they believe to be a livable wage.

</comment></comment></comment><comment><USER23> How is this not going to result in even lower take home pay for drivers? Uber does not have the margins to absorb the cost. They will certainly pass it on the drivers. They could increase pricing, but that dampens demand, which given how many drivers are out there, could be really bad for driver utilization and hourly earnings.

</comment><comment><USER24> Score one for Big Taxi!</comment>


How to Short Uber (And Other Private Companies) - <AUTHOR> https://medium.com/@avishbhama/how-to-short-uber-and-other-private-companies-7754b8fb7de1#.n9a7ih6fm <comment><AUTHOR> This article describes an effort to develop "unicorn swaps" to ultimately provide access to shorting private companies. Matt Levine wrote about this article this morning, summarizing the main points:

 _Here is a Medium post from Avish Bhama of Mirror, who is actually trying to make unicorn swaps happen. His team met with 65 potential counterparties, got a sense of the market appetite, drew up an ISDA and "partnered with a valuation firm to help us mark these illiquid swap positions on their books."_

Levine also went on to describe how he would improve this effort:

 _First, I 'd do it at a bank...a tiny startup with a clever idea that meets with 65 investors has barely scratched the surface of potential interest in unicorn swaps. What about the mid-sized mutual fund manager who wants long unicorn exposure but doesn't get invited into late-stage rounds? What about the in-house hedge fund of a giant tech incumbent that wants to double down on its plans to crush a unicorn competitor? What about the thousands of rich private-wealth clients who fancy themselves tech geniuses? The target list is long but the hit rate is low. You need a massive sales force, longstanding relationships, standardized marketing materials, existing ISDAs and account agreements._

Levine has also written about this in the past:

 _You could even imagine starting a Synthetic Unicorn Fund that invests in the long side of a lot of UFSes, giving it exposure to big tech unicorns without actually buying any shares. Register it with the Securities and Exchange Commission -- it is not obviously worse than other exchange-traded products that invest in illiquid derivatives with their sponsoring banks -- and you could even sell it to retail investors as a way to get access to hot tech startups before they go public. Then line up accredited-investor unicorn skeptics to take the other side of the Synthetic Unicorn Fund 's swaps._

For his part, Bhama (the author of this Medium article) concludes that _" most of the interest we received was one-sided interest on the top dozen Unicorn names (e.g. everyone wanted to short Theranos, Dropbox and WeWork, or go long Airbnb and Snap)"_.</comment>


Facebook PHP Source Code from August 2007 - <AUTHOR> https://gist.github.com/nikcub/3833406 <comment><USER2> It wasn't actually stolen as it says in the README. It was a misconfigured Apache server which leaked raw, unprocessed PHP code. I received the code to home.php and profile.php but I didn't save it at the time (I was very very new to learning PHP and didn't realize the significance of what I was looking at).

Still really cool to see.

<comment><USER3> I want to be clear: I don't care, and I doubt Facebook cares.

But legally, I think this code was stolen. Facebook owns the copyright to the source code, so copying and distributing is theft in the same way that copying and distributing database contents is theft.

But again:

<comment><USER4> Your definition of theft is wrong. Legally, this was not stolen.

<comment><USER5> Are you a lawyer?

<comment><USER6> You don't have to be a lawyer to understand that subtraction and multiplication are two completely different operations.

<comment><USER7> If you're a mathematician and not a lawyer you might think those are different operations. But lawyers, judges, and juries have a unique capacity to argue that you're guilty of subtraction even if you only multiplied.

To a lawyer, bits have color: [https://ansuz.sooke.bc.ca/entry/23](https://ansuz.sooke.bc.ca/entry/23).

<comment><USER8> You can totally find a mathematician to convince you that those are the same operation! Probably easier than the lawyer, even.

</comment></comment></comment></comment></comment></comment></comment><comment><USER9> One way to look at this is to say "Hah, how shameful."

The other way to look at this is to say "Hah, clearly business success isn't a function of code quality"

<comment><USER10> >"Hah, clearly business success isn't a function of code quality"

They aren't nearly as strongly correlated as many developers might like to believe.

<comment><USER11> I work as a programmer in the games industry and I've noticed that frequently as well. Commercially successful games aren't always a strong indicator of code quality and often it tends to be that the bad code "luckily didn't matter" in cases of success.

</comment></comment></comment><comment><USER12> > is line 89 of search.php valid?? "$user 0 && ..." ? aren't we missing an > comparison operator?

Good job. And perhaps that's the culprit. Everybody assumed it was a plain syntax error, but I don't think it's possible. Rather, it seems me that:

        if ($user <something else ... ) {
            was written here
            but we'll never know because
            the browser mistook it for an HTML tag,
            and the user probably copied page contents
            instead of saving it.
        };

        if (user_was_working_at_facebook_in_2007())
            possibly_confirm('?');

        /* lots of missing code may follow... until */

        if (who knows what > 0 && ...

<comment><USER13> Maybe. I think that's less likely than syntax error, for two reasons.

#1, if you look in index.php, there's a < on line 228 and a > on line 258, correctly rendered. Granted, the < is part of a <=, which weakens that argument.

#2, if you look at the surrounding code, $user > 0 makes logical sense given what the code is doing (and assuming 0 represents an invalid/nonexistent userid, which I believe it does given that facebook userids increase monotonically).

<comment><USER12> Except that a syntax error isn't likely at all - this was production code.

BTW just running "php -l" would have nailed this error - PHP refuses to run a script that cannot pass the tokenization step, resulting in a blank page (and the error being logged), so such a macroscopic error would probably be short- lived even in their test environment.

</comment></comment></comment><comment><USER14> Amazing that they initially wrote this code and now to join FB you need to answer questions based on backtracking and dynamic programming. :) I wonder if they could do the questions themselves back then.

<comment><USER15> Dynamic programming questions are explicitly not used in current Facebook interviews.

From time to time, Facebook and other companies study the effectiveness of their hiring process by comparing employee performance and interview performance. I believe dynamic programming questions were removed because there was not a strong link between success in this question and future performance.

<comment><USER16> This sounds very counter-intuitive! Did you hear this from someone working at Facebook or did you read it online? If it's the latter it'd be great if you could share a link!

<comment><USER17> What is counterintuitive about this? That best dynamic programmers are the absolute best programmers? I mean come on man..

<comment><USER18> Seems like pretty clearly GP isn't familiar with the definition of dynamic programming in this context: [https://en.wikipedia.org/wiki/Dynamic_programming](https://en.wikipedia.org/wiki/Dynamic_programming)

<comment><USER8> Key takeaway:

> It also has a very interesting property as an adjective, and that is it's > impossible to use the word dynamic in a pejorative sense. Try thinking of > some combination that will possibly give it a pejorative meaning. It's > impossible.

How times have changed!

</comment></comment></comment></comment></comment></comment><comment><USER19> Can someone explain to a newbie why this code is so bad? Reading through it it seemed to generally make sense and not be too complicated.

<comment> munk-a The lack of `chroot`[1] makes me sad off the bat - for some reason that function seems like a secret, everyone actually wants to use it (or wanted to before autoloading became as easy as it is) but nobody did.

Additionally I'd love to see that file split up into smaller chunks simply to lower the scope of thought.

It looks like nearly all of those function calls are modifying variables passed by reference instead of resolving the value out via `return` this isn't bad and is indistinguishable at a technical level in terms of functionality, but it's a kind of horrible approach from expressability.

They're doing things with datetime that are unsafe and wrong (like assuming 24 _60_ 60 is the number of seconds in a day) but people getting datetime logic wrong is as old as... well time.

Oh, and you've got some pretty bizarre looking function signatures - I'm sure there is a reason for this but I'd want to ask some questions about this one...

        $permissions = privacy_get_reduced_network_permissions($user, $user);

It's possible to go through this and nitpick a bunch of stuff, it looks like it's mostly just an older style though. The big problems aren't here though... I'm not seeing any reads into $_POST (and `param_get_slashed` looks like a nice function for sanitizing input) - additionally, I'm not seeing a single line of SQL nor am I seeing any memcached calls, so the data access layer may already be well isolated architecturally.

1\. [https://www.php.net/manual/en/function.chroot.php](https://www.php.net/manual/en/function.chroot.php)

<comment><USER20> `chroot()` has no place in a web application. The system call requires the process to be running as root.

<comment><USER21> Can you call that and then drop permissions?

<comment><USER20> In theory, yes. But that's still bad, because it means that a nontrivial amount of your application code (as well as whatever is launching it, like the PHP-FPM server or the web server) is running as root.

</comment></comment></comment></comment></comment><comment><USER22> Some interesting comments:

> // Holy shit, is this the cleanest fucking frontend file you've ever seen?!

[https://gist.github.com/nikcub/3833406#file-search- php-L72](https://gist.github.com/nikcub/3833406#file-search-php-L72)

</comment><comment><USER23> I always liked Nik's comments and was wondering why he had stopped posting here.

[https://news.ycombinator.com/threads?id=nikcub](https://news.ycombinator.com/threads?id=nikcub)

[https://www.zdnet.com/article/security-consultant-granted- ba...](https://www.zdnet.com/article/security-consultant-granted-bail-after- hacking-goget-systems/)

[https://www.zdnet.com/article/goget-hacker-sentenced- to-400-...](https://www.zdnet.com/article/goget-hacker-sentenced-to-400-hours- of-community-service/)

<comment><USER24> I always find this kind of stuff interesting. Albert Gonzales broke into a bunch of my work's servers (for years) at my first job, after a customer of ours pissed him off. I had some AIM coversations and lurked/logged in one of his advertised IRC hangouts. Most of the transcripts went to the secret service, which was very interested in his Credit Card fraud activities (as advertised on IRC).

[https://usa.kaspersky.com/resource-center/threats/top-ten- gr...](https://usa.kaspersky.com/resource-center/threats/top-ten-greatest- hackers)

</comment></comment><comment><USER25> 2013 HN discussion: [https://news.ycombinator.com/item?id=6538270](https://news.ycombinator.com/item?id=6538270)

</comment><comment><USER26> From index.php, an if statement for one particular user

        // Merman's Admin profile always links to the Merman's home
        if (user_has_obj_attached($user)) {
              redirect('mhome.php', 'www');
        }

<comment><USER27> "Merman" was an internal project codename, not an individual user. I think it was a very early version of the feature that eventually became "Pages".

</comment></comment><comment><USER28> From the article linked in the gist:

> This leak is not good news for Facebook, as it raises the question of how > secure a Facebook users private data really is.

I don't even think I need to comment on how poorly this has aged.

<comment><USER29> Could you elaborate? I thought it was an amazing foreboding of exactly how poor Facebook turned out to be with handling user privacy

<comment><USER28> That's basically what I meant, sorry. It's an insight into what could have been a problem back then, and clearly became a serious problem.

</comment></comment></comment><comment><USER30> > Worth preserving as part of Internet history.

Can't Facebook just issue a takedown request and have these files removed?

<comment><USER31> what for? It's not like it would be particularly dangerous to see code which is 13 year old.

<comment><USER32> It's worth noting that Windows occasionally is inflicted by discovered vulnerabilities that are over twenty years old.

Not sure how applicable that would be to Facebook's codebase over this much time. But worth noting.

<comment><USER33> Just look at Swift and all the Cocoa classes. Many are prefixed with NS, which comes from the NeXTSTEP days.

</comment></comment></comment></comment><comment><USER34> Reminds me that they had the poke feature.

<comment><USER35> they still have the poke feature

</comment></comment><comment><USER36> I know it's just two of the files, but taking into account the rest of the pages for the FB app in 2007, it does not seem like a lot of code. One or two people could have written and maintained a project that size. What were all the new hires doing from 2005-2007?

<comment><USER37> The company wasn't very large at that time. Probably less than 100 engineers in 2007. One person could understand the bulk of the codebase in a a reasonable amount of time.

There was way more code than you're seeing here though, note all the includes at the top.

</comment></comment><comment><USER38> What always strikes me is how sloppy and poorly written commercial code is when it is leaked - esp compared to open source projects. Looks like someone's CS200 project a lot of the time.

</comment><comment><USER39> Looking at this makes me not missing php but somehow it's like back in time.

</comment><comment><USER40> Is this Mark Z's code? Wonder why he didn't use a framework and went with pure PHP.

<comment><USER41> I would assume the answer was speed.

I was also writing some spaghetti PHP code around 2007 and remember making choices that were the benefit of reducing server stress while making my life harder. No framework was a big one.

Remember, Friendster died due to crashing and Facebook, for all its spaghetti code at the time, was remarkably solid and rarely crashed. It is easy to forget how hard the sysadmin side was for a growing startups before we could spin up infinite cloud servers and VC wasn't just an open spigot for anything with growth.

Remember the fail whale on Twitter?

</comment></comment><comment><USER42> I think NipAlert of big head had better code.</comment>


Live Stream of Thinking Digital 2017 Newcastle from Sage Gateshead - <AUTHOR> https://blog.praveen.science/live-thinking-digital-2017-newcastle/ <comment><AUTHOR> How do I delete this? The Live event ended long back.</comment>


How to add a notifier LED to your computer - <AUTHOR> http://www.justblair.co.uk/the-attiny45-usb-led-e-mail-twitter-and-pidgin-notifier.html <comment><USER2> For a long time I've wanted one of these, to serve as an "interruptility" indicator to others: green = "I'm looking at the internet, please interrupt me so I can possibly do something more useful", amber = "I'm working but okay", red = "only interrupt me if it's truly urgent". It could be programmable, so that (for example) it could automatically go to green when Firefox had HN as its frontmost window.

Imagine a lab or office in which everyone used an LED in this way. It might be nice.

<comment><USER3> Sort of an "On Air" sign for hackers.

<comment><USER4> 'Wired in'

<comment><USER5> Maybe 'focused in' or 'zoned in'.

</comment></comment></comment></comment><comment><USER6> The whole area of ambient displays is interesting. So much information is on screens now, but for certain situations an ambient display would be a lot more convenient for conveying information.

See for example the ambient orb which can change colour according to what the Dow is doing, to name one example:

<http://www.ambientdevices.com/cat/orb/orborder.html>

Or the nabaztag, the wifi rabbit, who raises his ears to different triggers, such as, I don't know, a broken link on your website or a customer support email landing in your inbox. Pretty cool.

<http://www.nabaztag.com/en/m-3-nabaztag-what-does-he-do.html>

</comment><comment><USER7> Nifty, but my laptop already has LEDs that I don't use, namely numlock and scroll lock. There are many Linux utilities that can blink these and turn these on.

<comment><USER8> In the case of numlock on a laptop you need to be smarter than just toggling the light; many laptops overlay a numpad over the keys, so with numlock enabled hitting 'I' will send 5 instead.

<comment><USER9> You can toggle the lights without changing the actual state of the keyboard or driver. They're not hardwired together.

<comment><USER8> That's interesting - I tried to do this some years ago on Windows but found no way to toggle the lights independently of the actual state.

Turns out you can, though:

<http://geekhack.org/showwiki.php?title=Island:7031>

<comment><USER9> Back in the day I had some kind of plugin that toggled the caps and scroll lights based on ethernet Rx and Tx traffic. Nifty hack, but got distracting real fast.

</comment></comment></comment></comment></comment><comment><USER10> Although I applaud the engineering effort, I would never make this myself because it will proof a huge distraction.

I would become a slave of my email.

<comment><USER11> The key to notifications is filtering. Don't make it light up for every email, only make it light up when an email that needs immediate action arrives.

I'm going to set one of these up to monitor my work email. If someone sends a message to me (which is a small minority of messages I receive), it will light up. Then when I'm in bed and feel like hitting the snooze button, I can glance at the LED and determine whether or not I need to get up and check my email or not.

laziness++.

</comment></comment><comment><USER12> Do you really need the microcontroller to do that? He doesn't say exactly what the ATtiny does, but if it's just setting one of three LEDs based on two pins, it seems you could accomplish the same thing with a couple of logic gates? (But maybe these days it's easier to get a microcontroller than to wire up a few gates?)

<comment><USER13> Parallel printer port, which was often used for this kind of hacks, disappeared from PC several years ago. A USB device is usually the best for general purpose I/O.

And I don't know how to build a USB device 'with a couple of logic gates'.

<comment><USER12> Is it not possible to simply steer the USB pins high or low just like with a serial port?

<comment><USER14> USB is a complex protocol, encoded using just two wires (the other two are power - +5V and GND). There are no pins you can steer high or low.

See <http://www.beyondlogic.org/usbnutshell/usb1.shtml> for more info.

</comment></comment></comment></comment><comment><USER15> I'd like to have some light that indicates the status of our continuous build. However, I can only find solutions that require too much low-level hacking (like the original article, very cool but it'd take me ages), or are two expensive, or not customizable enough (Ambient Orb).

Do you guys know of other solutions?

</comment><comment><USER16> That was a lot cooler than I expected. I did a software-only one on my mac: <http://dustin.github.com/2009/02/09/caps-lock.html>

</comment><comment><USER17> Very neat. It would be interesting to know if there is a only-software way to use the available lights on every laptop (battery, wifi indicators) as email notifiers. Do you think that this would be possible?

<comment><USER18> Depending on your laptop model, there are a few LEDs that can be controlled, at least under Linux.

IBM and ASUS seem to use stuff in /proc/acpi/asus|ibm ...

The SD-Card interface in my Laptop exports a LED in /sys/class/led... (but it seems not to be connected to anything).

So there is often one or the other thing installed, but how to control them differs.

</comment></comment><comment><USER19> It would also be cute to have the terminal bell hooked up to an actual bell.

</comment><comment><USER20> rather than blinking, use morse code and output the message.

<comment><USER21> Whoever modded you down has no sense of telecommunications history or humor.

The extra experience all those around you will have learning morse code to figure out what it is that you're telling them alone is worth an upvote ;)</comment></comment>


Against the Singularity - <AUTHOR> http://techcrunch.com/2015/10/11/in-which-i-dishonor-the-prophet/ <comment><AUTHOR> >The religion of the Singularity even gives us angels and demons...

I think it's a bit unfair in that you can just view the thing as the point when AI gets much smarter than humans so we have a job figuring what's going on.</comment>


Coronavirus beats common sense: The mystery of viral spread in western nations - <AUTHOR> https://freelancemag.blogspot.com/2020/03/coronavirus-beats-common-sense-mystery.html <comment><USER2> If this is good for thought, we will all surely starve.</comment>


Docker is celebrating its 6th birthday with an easter egg - <AUTHOR> Official Docker Image
https://hub.docker.com/_/surprise
---
Quoting the README of docker/birthday [1]
"March 2019 marks Docker's sixth year, and we thought we'd celebrate it docker-style with a birthday surprise!"
To try it out, run:
"docker run -it --rm surprise"
---
Self-plug but I have noticed this from my side project "Follow GitHub Organisation" [2]
---
[1] https://github.com/docker/birthday
[2] https://github.com/follow-github-organisation/follow-github-organisation/issues/35#issuecomment-475447066 <comment><USER2> Actually seems legit: [https://hub.docker.com/_/surprise](https://hub.docker.com/_/surprise)

</comment><comment><USER3> I can't seem to pull a lot of docker images as of late on my machine. I keep getting unauthorized.

       [0] % docker pull surprise
       Using default tag: latest
       Error response from daemon: pull access denied for surprise, repository does not exist or may require 'docker
       login'

Any ideas?

</comment><comment><USER4> Seems like a bad idea. I don't like surprises, especially those that involve running untrusted code on my computer.

<comment><USER5> Normally I'd get your point, but it's untrusted code sandboxed inside a container...

</comment></comment><comment><USER6> Neat! Looks like it just animates a few ASCII sprites and confetti. The source is right there anyways.

</comment><comment><USER7> I hate this idea..</comment>