Using GNU Stow to manage your dotfiles - <AUTHOR> http://brandon.invergo.net/news/2012-05-26-using-gnu-stow-to-manage-your-dotfiles.html?round=two <comment><USER2> > but many/most dotfiles reside at the top-level of your home directory, where > it wouldn't be a good idea to initialize a VCS repository.

Right. Which is why I use git with a workspace detached from the git directory. The git directory is in ~/dotfiles/.git, with "git config core.worktree ~", and I set an alias "dgit=git --git-dir ~/dotfiles/.git". The advantage of this method is that there are no symlinks to maintain, however initial clone is a bit painful, since you have to move the files and set the config.

It's not perfectly straightforward, but it's as close to it as I could get it.

<comment><USER3> The one thing I like about stow is that I can choose to only add configurations that make sense for the machine I am using. If don't have a certain application, I don't 'stow' the configuration for that application in my home directory.

<comment><USER4> You could have a separate git branch for each machine :-)

</comment></comment></comment><comment><USER5> I gave GNU Stow a try, but thought it did too much.

Ended up using dotfiles ([https://pypi.python.org/pypi/dotfiles](https://pypi.python.org/pypi/dotfiles)). My dotfiles ([https://github.com/cjoelrun/dotfiles](https://github.com/cjoelrun/dotfiles)). I handle system specific stuff in each config: OS checks in zsh, emacs, tmux configs. Allows me to move between OSX and Arch linux.

<comment><USER6> > I gave GNU Stow a try, but thought it did too much.

Not to argue with your experience, but it's hard to see how it could do _less_ —it literally just creates a bunch of symlinks. (It seems to have grown a bunch of options since I last looked at it, but it seems that they can all be ignored if you want simplicity. (I've only ever used `-d`, `-t`, and `-D`.)

</comment></comment><comment><USER7> I don't know whether it was just unclear to me or unclear in this article but (after checking man stow), here is the relevant section of the man page that cleared up how it worked for me:

The stow directory is assumed to be the value of the "STOW_DIR" environment variable or if unset the current directory, and the target directory is assumed to be the parent of the current directory (so it is typical to execute stow from the directory /usr/local/stow). Each package given on the command line is the name of a package in the stow directory (e.g., perl). By default, they are installed into the target directory (but they can be deleted instead using "-D").

</comment><comment><USER8> What I do is just keep all of the dotfiles in ~/dotfiles and symlink them to the home directory, then I can keep track of them with git. Doesn't have to be any more work than that. Maybe it's not an issue for me because I only use one machine, and when I switch to another, I just pull down my dotfiles from github and symlink them again. I only do this every couple years.

<comment><USER9> This is what I do as well, and I also have a little script that creates all the symlinks in my home directory as well. Dead simple, and it works. I was hoping Stow would somehow be an improvement over that but I don't really see how it does anything more for you.

<comment><USER10> I agree and think don't understand why you'd want your dotfiles to depend on Make, Ruby/rake, etc. let alone something like Stow. Git and a shell are enough; you can eliminate the Git dependency by packaging from a post-receive hook too.

</comment></comment></comment><comment><USER11> Handling dotfiles doesn't have to be a hard problem. Here's a simple script I wrote that copies them to and from a git repository.

[https://github.com/Lambdanaut/dotfiles/blob/master/cp_dotfil...](https://github.com/Lambdanaut/dotfiles/blob/master/cp_dotfiles.sh)

</comment><comment><USER12> Very nice! This is something I've always meant to set up but never bothered with. He mentions installing different subsets of your dotfiles on different machines. To do that easily and have it "written down", I'd put a Makefile into the dotfiles directory with .PHONY targets for each machine, and have those targets run the right `stow` commands for me.

</comment><comment><USER13> This makes no sense. Somehow having a versioned dotfiles directory with either a Makefile or a shell script is "hard" because either you need to have Python (no you don't, shell script is fine) or you forget the name of the install script (type ls), but somehow using this software (which needs to be installed) is "easier".

With this software you also need to remember the magic invocation, a trivial thing in both scenarios, but nevertheless something the author complained about, and you also need to install stow. Previously the author complained about adding dependencies in the form or Python (which made no sense, but still, he complained about dependencies) but now he adds this new dependency (which is more rare than python anyway...).

<comment><AUTHOR> This use case is one of the expressed reasons for stow's existence.

"GNU Stow is a symlink farm manager which takes distinct packages of software and/or data located in separate directories on the filesystem, and makes them appear to be installed in the same place. This is particularly useful [to] facilitate a more controlled approach to management of configuration files in the user's home directory, especially when coupled with version control systems." [1]

Installing a single binary _might_ be easier than installing a scripting environment on a server that may have existing versioning considerations. (brew install stow | sudo apt-get install stow)

You literally type `stow bash` and you're done.

\----

[1]: [http://www.gnu.org/software/stow/](http://www.gnu.org/software/stow/)

<comment><USER13> You literally type make and you're done too.

</comment></comment></comment><comment><USER14> You might also checkout [https://github.com/andsens/homeshick](https://github.com/andsens/homeshick). Similar idea, but tailored for dotfiles.

</comment><comment><USER15> Thank the programming deities for this one. I've been doing a balancing act with VMs lately and I was about to push my dotfiles to github, but it just seemed like a really bad idea

</comment><comment><USER16> This is how I manage my dotfiles since I discovered stow a couple of months ago.

The only thing that bugs me is that I haven't figured out an elegant way to have some configs include machine specific configs. For example a set of bash aliases that I only use at work but don't want at home.

My best idea is to source all files in, say ~/.bashrc.d and put machine specific configs in there... Haven't tried it out yet.

<comment><USER17> Not sure if this would work with Stow, but in my .bashrc I just do this:

      if [ -f ~/config/bashrc_$(hostname -s) ]; then
            source ~/config/bashrc_$(hostname -s)
      fi

this gives me machine specific configs.

<comment><USER16> Great idea! It wouldn't work for me though as I tend to call all my machines 'fuckup' (I know...) ;)

<comment><USER18> In that case, you could have it read or check the existence of something else, like a file in /etc.

</comment></comment></comment></comment><comment><USER19> I've been doing this for a year or two with dropbox. I've tried vcsh and others and stow has been by far the best so far.

</comment><comment><USER6> Note that this was an official use case for Stow for at least a year before the linked post:

        This is particularly useful for keeping track of system-wide and per-user installations of software built from source, but can also facilitate a more controlled approach to management of configuration files in the user's home directory, especially when coupled with version control systems.

(from [https://www.gnu.org/software/stow](https://www.gnu.org/software/stow)), where "especially …" links to [http://lists.gnu.org/archive/html/info- stow/2011-12/msg00000...](http://lists.gnu.org/archive/html/info- stow/2011-12/msg00000.html).

(There's nothing wrong with re-discovering it, of course!)

</comment><comment><USER20> Since I have a setup script I run on any new installation creating symlinks from my git repo isn't a big deal.

[https://github.com/aclough/dotfiles/blob/master/setup.sh](https://github.com/aclough/dotfiles/blob/master/setup.sh)

<comment><USER21> I just move stuff to my home-folder with a very simple Ruby install script. It checks for existence of tools, and if they aren't there they will be installed, and the config files will be overridden.

[https://gist.github.com/kaspergrubbe/99853334b0e91b540a34](https://gist.github.com/kaspergrubbe/99853334b0e91b540a34)

</comment></comment><comment> Evan-Purkhiser A while back I got very interested in cleaning up my configuration files. I wanted to figure out out a way to store all of the configurations I use across multiple machines into a single repository, while at the same time not having to worry about symlinking and installing configurations for things I don't need on a particular machine.

I looked at a lot of different things like Stow and homeshick and the like and really didn't like any of the solutions. So I ended up writing my own tool.

I've wanted to write up something for it for awhile now and post it around, but I just haven't yet. Anyway, here's my tool: [https://github.com/EvanPurkhiser/dots](https://github.com/EvanPurkhiser/dots)

<comment><USER22> Hi, I'm the maintainer of homeshick and would be very interested in knowing which shortcomings of homeshick motivated you to write your own tool. Could you elaborate?

</comment></comment><comment><USER23> The article doesn't explain how stow 'knows' where to place the symlinks.

The answer is (of course) in the help output:

      -d DIR, --dir=DIR       Set stow dir to DIR (default is current dir)
      -t DIR, --target=DIR    Set target to DIR (default is parent of stow dir)

</comment><comment><USER24> Recently spent some time organizing my dotfiles and discovered _fresh_ [1] which I've been using to great success. Both for servers I manage and on my mac.

The fact is that most people are going to be reusing (and probably be better of) a lot of code from other well tested dotfiles. `fresh` lets you pick and choose what you want directly from other's repos in addition to adding whatever you want and produces a single bundle (or multiple if you need it).

As far as I can tell, its a self contained shell script and does not have any dependencies (if that is a concern). Its definitely worth checking out.

[1] [https://github.com/freshshell/fresh](https://github.com/freshshell/fresh)

</comment><comment><USER25> I use a similar construct for managing config files (mostly the stuff that goes to /etc/*): put all the config for a specific program (or problem) into a VCS-handled directory, then add a Makefile with an "install" target that copies everything into its place. Using GNU install (instead of ln or cp) allows for copying files (and creating directories) with fine control about permissions and ownership.

This can also be done recursively: toplevel Makefile for a machine's configuration files calls the sub-makefiles that install apache, asterisk, openvpn configurations etc.

</comment><comment><USER26> I maintain environments on Windows (Cygwin), Linux, OS X and Solaris machines.

Some of these are work, some are home. Not all files overlap.

Additionally, I have scripts that are only relevant when I have a certain program installed, or a certain source tree available.

I ended up spending a weekend writing my own system that composed a PATH, .bashrc, .bash_profile etc. based on machine configuration. A single git clone isn't quite enough, especially if you don't want to smash everything into one repo (I don't have my home stuff installed at work, for example).

<comment><AUTHOR> see jackalope's helpful comment -- [https://news.ycombinator.com/item?id=8488828](https://news.ycombinator.com/item?id=8488828)

</comment></comment><comment><USER27> I've been reasonably happy with my solution to this, which is [https://github.com/staticshock/seashell](https://github.com/staticshock/seashell)

It's a fully contained Makefile that gives my dotfiles repo `make && make install` semantics. `make` initializes whatever needs to initialize locally on that system, and `make install` creates all the necessary symlinks in the $HOME directory.

</comment><comment><USER28> I created something a while ago (that I haven't updated in a while, I shamefully admit) that also handles dot files:

[http://configr.io](http://configr.io)

I also do namespaced dotfile saving (folder by application), but I focused on WGET/CURL-ability (which is unfortunately hard to divine from the current website UI -- the curl command is not obvious, as you have to have content- disposition turned on.

</comment><comment><USER29> Looks useful; I just symlink into a folder on my dropbox, which accomplishes much the same thing with about the same effort.

</comment><comment><USER30> I prefer dedicated repositories (I use mercurial) for each app (vim, mutt, etc.) or context (X11) that include Makefiles for creating the necessary links or handling some environment-specific details. This still allows me to cherry pick what I want on each machine, but keeps the commit history in the appropriate repo.

</comment><comment><USER31> Personally I really like [https://github.com/thoughtbot/rcm](https://github.com/thoughtbot/rcm). It is simple, and to the point. Using it is straightforward, and it has allowed me to change machines and migrate my dotfiles seamlessly.

</comment><comment><USER32> I wrote my own hack to do the same: [https://github.com/aksrikanth/settings/blob/master/bin/setup...](https://github.com/aksrikanth/settings/blob/master/bin/setup.sh)

It works well enough, and I have to set it up once.

</comment><comment><USER33> Stow also goes nicely with managing a directory in Dropbox for syncing game saves, app config data, etc, for apps that don't have any native support for cross-machine syncing but still work well enough when you fake it with symlinks.

</comment><comment><USER34> I have no desire to use this for dotfiles, but GNU Stow sounds like it solves a real problem for me with the programs I install from source. Being able to uninstall without manually tracking down each file would be wonderful.

<comment><USER35> For installation from source I use CheckInstall [1]. It will keep track of all the files created during a make install, and create a standard deb or rpm package that can then be installed and removed by the distribution's package manager.

[1] [http://www.asic- linux.com.mx/~izto/checkinstall/docs/README](http://www.asic- linux.com.mx/~izto/checkinstall/docs/README)

</comment></comment><comment><USER36> For that use case, I normally use unison: [http://www.cis.upenn.edu/~bcpierce/unison/](http://www.cis.upenn.edu/~bcpierce/unison/)

Then I have a script to automatically sync that files.

</comment><comment><USER37> I just have a dotfiles repo on github that I clone to any new computer I'm using. Then make a symbolic link between the dotfiles and the repo (`ln -s ~/dotfiles/.whatever ~/.whatever`).

Super simple.

<comment><USER38> This is almost exactly the same strategy, only stow handles the symlinks for you, so you don't have to go through and `ln -s` all your files/directories. Your dotfiles still go in a git repo.

<comment><USER39> I put the "ln -s" commands in a shell script.

        git clone ... ~/.my-config
        ~/.my-config/setup-links

Done.

Some servers at work don't have Git installed (and certainly not Stow), so I rsync ~/.my-config from my workstation to my home directory. (There's little need for me to edit my .zshrc on a server.)

</comment></comment></comment><comment><USER40> RCS is a good option for dotfiles.

RCS is a version control system that is useful for individual files which must remain in a specific location.

</comment><comment><USER41> Maybe I just don't have enough dotfiles, but I just symlink mine into Dropbox.</comment>


Dealing with the Information Explosion - <AUTHOR> http://ce.seekingalpha.com/article/29486 <comment><USER2> I've this story floating around for a couple of weeks now about how the world is going to run out of storage space. Am I the only one who finds this supposed crisis to be a little hard to believe? When I run out of room on one of my drives, I figure out what to delete. Usually old and unneccessary data gets the boot. Is it so hard to believe that the world at large won't simply do the same? Albeit on a grander scale. Even better, we may become more efficient in what we decide to store in the first place, imagine that.

</comment><comment><AUTHOR> I don't think that we're going to end up destroying ourselves with our excess data but I think it makes a good case for centralized data storage. If you could hold all of your personal data in one place you wouldn't have to copy it to each computer, or email it to yourself every day or so. Just finding ways to not have to copy everything all the time would solve any problem there may be.</comment>


Ownership and Entitlement - <AUTHOR> http://boz.com/articles/ownership-and-entitlement.html <comment><USER2> There's another way things can fall apart and that's mission. are you working toward helping yourself or helping others. The best companies had missions to change the world and help others(their customers).</comment>


Opening Up to "More Open, Smart, and Honest Criticism"   - <AUTHOR> http://andysparks.co/post/37279861266/opening-up-to-more-open-smart-and-honest-criticism

<comment><USER2> At Tealet we are building a "Bashing" page so users can leave their feedback. This is for the passionate users that know exactly why we suck.</comment>


What makes a great entrepreneur? - <AUTHOR> http://venturebeat.com/2011/01/17/what-makes-a-great-entrepreneur/ <comment><USER2> A quote that hit close to home for me is one by Calvin Coolidge (I think I read in a comment here on another thread):

"Nothing in this world can take the place of persistence. Talent will not; nothing is more common than unsuccessful people with talent. Genius will not; unrewarded genius is almost a proverb. Education will not; the world is full of educated derelicts. Persistence and determination alone are omnipotent. The slogan "press on" has solved and always will solve the problems of the human race"

<comment><USER3> Definitely is a profound quote. If only I can script it into my brain and internalize it so much that my thinking doesn't get in the way :)

</comment></comment><comment><USER4> _Guts is selling everything you own to raise money for your new venture, like Tony Hsieh did. He sold everything (including his loft in San Francisco) — everything that was left from his $40 million exit from LinkExchange_

"Guts" make for a great story. However, the smart move would've been to set up a trust as a fall-back with $3 million of the $40 million. (Which may well be what he did, in fact. I don't know either way, and the article is worded to allow for this.)

Better than guts is a clear head. This way, you can see where others have irrational fear and now be swayed. With a clear head, you can take calculated risks. With a clear head, you can see the true value of the transaction.

Muhammad Ali's use of "Rope-a-dope" in his victory against Foreman looks like the stereotypical, stirring, "hero gets beaten up badly, but comes from behind" twist at the end of an action movie. In reality, it was the result of cool calculation and masterful, calm execution.

<http://www.imdb.com/title/tt0118147/>

</comment><comment><USER5> This article comes up repeatedly, and uses a thousand words to describe one: drive.

</comment><comment><USER6> I think "passion" is a better single-word summary of this essay. Having a fervid passion for your start-up is what enables you to make what most consider a difficult decision (quitting school, quitting your job, taking out a home equity loan, maxing out your credit card, etc.) simple. This is evidenced by the author's "pull the trigger" analogy. I guarantee that Mark Zuckerberg and Bill Gates did not spend sleepless nights deciding whether to drop out of Harvard--they just did it.

</comment><comment><USER3> Just my opinion - this article offers nothing new in way of information. Guts, desire and passion are all necessary for the entrepreneurial lifestyle but by no means its sufficient.

Also, while emphasizing the point that entrepreneurs love what they do so much that they dont care about money, the example offered is that Jobs accepts a salary of $1. This is misleading. Would Jobs have stuck with Apple it if his total income from apple was just $1?

</comment><comment><USER7> To head face-first into the storm when everyone is telling you to stay indoors.

</comment><comment><USER8> Will, Wisdom & Resources

</comment><comment><USER9> The man is right. Of course, you also have to have a good idea.

<comment><USER10> Good idea, but not necessarily great idea.

<comment><USER11> You need a good team just as much if not more.

</comment></comment></comment><comment><USER12> guts desire and passion, wow how insightful.

</comment><comment><USER13> N.E.R.D. : Non Employed Rent Driven</comment>


C/C++ Fiddle - <AUTHOR> http://gcc.godbolt.org/ <comment><USER2> GCC Explorer is great and I use it on a semi-regular basis. I often use it to show what kinds of optimizations a modern compiler will do. Just yesterday I was using it to show someone how a piece of code like:

        int launched = 0;
        // ...
        start_thread(...);
        while (!launched) {}

could result in an endless loop since the compiler just rewrote it to 'if(!launched) { while(true){} }'. The person had the thread write to 'launched' and expected the first thread to exit the loop once launched had been set to 1.

Great tool. I hope it doesn't get a HN hug of death.

<comment><USER3> Unless 'launched' was directly or indirectly local to the stack frame, I don't see how this optimisation is legal. In general your compiler has to assume values will change across an opaque function call.

<comment><USER2> To expand on what to3m said. The code was transformed into something like this:

        int launched = 0;
        start_thread(...);
        if (!launched) {
          while (true) {}
        }

That's a perfectly legal optimization. The integer here isn't atomic and if another thread modifies the variable, that would be a data race and those have undefined behavior. Therefore, the compiler can assume that there is no race and move the comparison out of the loop.

Changing it to be "std::atomic<int> launched;" fixes that problem.

<comment><USER4> >That's a perfectly legal optimization. The integer here isn't atomic and if another thread modifies the variable, that would be a data race and those have undefined behavior. Therefore, the compiler can assume that there is no race and move the comparison out of the loop.

In this case, the data race is fairly minimal, since we're talking about a 4 byte integer being used as a boolean flag. Operations like x = 1 for 4 byte ints are pretty much guaranteed to be atomic with x86, and worst case, you go through 1 more iteration of your loop than you would have otherwise(which your code should account for at any rate with locking for critical sections). Any change to the int should cause the while loop to exit.

It should be a volatile(C pre C11) or atomic(C++11/C11) integer if you're passing it between threads, though.

</comment></comment></comment></comment><comment><USER5> Hi! I'm the developer of GCC Explorer and ... sorry for the slow service! This is the second time I've made it on HN - thanks for all your support. GCC Explorer runs on an Amazon EC2 instance and my "secondary" instance that I spin up from time to time is woefully out of date...

<comment><USER5> Better late than never...I've increased the power and number of instances running GCC Explorer, so hopefully it's a lot more usable under load now. Although my HN 5-minute fame seems to be over now :)

</comment></comment><comment><USER6> GCC Explorer is awesome, but I would not call it a "C/C++ Fiddle".

It's really slow (unusable) at the moment due to, I reckon, being on HN. Do revisit it later!

I have had some issues with it in the past when importing just iostream and trying to see the output for a small example. The combined source is too large, and GCC Explorer refuses to compile and show the assembly sometimes for even small examples.

Do play with the settings. Colourise is especially nice.

The code is on GitHub [0], so I suppose you can self host it, although I have not tried to do so yet.

[0] [https://github.com/mattgodbolt/gcc- explorer](https://github.com/mattgodbolt/gcc-explorer)

<comment><USER7> > It's really slow (unusable) at the moment due to, I reckon, being on HN. Do > revisit it later!

Unfortunate. Running this on the client side would avoid that, I wonder if they considered that option.

<comment><USER8> Running this on the client side would require a C++ compiler in javascript, right? I don't know much about web dev.

<comment><USER7> Yes, there are demos of such things. For example, these two:

[http://kripken.github.io/clangor/demo.html](http://kripken.github.io/clangor/demo.html)

[http://kripken.github.io/llvm.js/demo.html](http://kripken.github.io/llvm.js/demo.html)

A bit old by now, but the first compiles C++ into LLVM IR, the second LLVM IR into JS and runs it. All of that happens clientside.

</comment></comment></comment></comment><comment><USER9> "fiddle"? I expected it to run the code. But for running simple C/C++ code I made me these anyway:

[https://gist.github.com/panzi/7010082](https://gist.github.com/panzi/7010082) [https://gist.github.com/panzi/7010082](https://gist.github.com/panzi/7010082)

C example (-i for include, -p for printf, standard flags: -I, -L, -l, -W, -O, -D, -S, -E):

        $ cexpr -imath.h -iunistd.h -p '%f %d' 'pow(2,3)' 'getuid()'
        8.000000 1000

C++ example (-i for include, standard flags: -I, -L, -l, -W, -O, -D, -S, -E):

        $ cppexpr -ilimits 'std::numeric_limits<long>::max()' '"hello world"'
        9223372036854775807 hello world

</comment><comment><USER10> Neat tool. Could do with a "diff" function to quickly see impact of code changes.

<comment><USER5> Agreed! It's on the backlog of TODOs! Patches welcome, of course :)

</comment></comment><comment><USER11> Seems rad, but is this any different than providing `-S` to gcc or the equivalent option to your compiler of choice?

Also, I assume the author has thought of this, but just throwing this out there....

`-ftemplate-depth1024` (1024 should guarantee a stack overflow)

      #include <iostream>
      template<int N>
      struct ZVTemplate{
        static void out(std::ostream& os)
        {
          ZVTemplate<N>::out(os);
          os << "zv was here" << std::endl;
        }
      };
      template<>
      struct ZVTemplate<1>{
        static void out(std::ostream& os)
        {
          os << "deftly evaded :)" << std::endl;
        }
      };
      int main(){
         ZVTemplate<2>::out(std::cout);
      }

<comment><USER5> I'm not quite sure what you were expecting to happen - here the template just recurses, but as a run-time recursion. GCC and the explorer handle it just fine.

Doing the more usual template<N-1> trick lets you hit the -ftemplate-depth limit if you pass, for example ZVTemplate<2048>. It still works ok though :)

Please do let me know if you can find a "poison" input...although at the moment the site is pretty busy just through sheer weight of users, so it's hard to tell I know!

Thanks, Matt

</comment></comment><comment><USER12> Cool! As feature requests are piling up here: I would like to be able to switch the machine/backend. Optimal would be a drop down menu to select

-x86_64 -x86 -arm -mips -or32 -avr

and so on. Yeah, I guess that requires a couple recompiled GCC binaries :D

<comment><USER13> Presumably would require cross compilers for each architecture, but it would be very interesting to see what you could do with it, for example comparing side by side.

</comment></comment><comment><USER14> Also supports D (GDC, the gcc backend to D).

[http://d.godbolt.org/](http://d.godbolt.org/)

</comment><comment><USER15> First thing I tried: fork bomb.

<comment><USER16> It does not execute your code, just compile it and disassemble it.

<comment><USER15> Dammit, I had to try! :)

<comment><USER5> You're not the only one!

I've had to put a variety of "anti-hacker" features into the public instance, even though it runs on a (somewhat) throwaway EC2 instance.

Check out the source, and the LDPRELOAD stuff I do to try and make the compilers vaguely secure...!

<comment><USER9> But did you secure it against endless parser loops? At least older g++ versions have a problem with this:

        template<class T> struct Loop { Loop<T*> operator->(); };
        Loop<int> i, j = i->hooray;

And on older gcc versions this eats a gig RAM and a takes couple of hours:

        struct a{typedef int foo;};struct a1:a{};struct a2:a{};
        #define X(b,a) struct a##1:b##1,b##2{};struct a##2:b##1,b##2{};
        X(a,b)X(b,c)X(c,d)X(d,e)X(e,f)X(f,g)X(g,h)X(h,i)X(i,j)X(j,k)X(k,l)
        X(l,m)X(m,n) n1::foo main(){}

From slide 11 and 12 of this presentation: [http://www.fefe.de/c++/c%2B%2B-talk.pdf](http://www.fefe.de/c++/c%2B%2B-talk.pdf)

<comment><USER5> I've done my best to protect against these too with both babysitting process timeouts and as a last line of defense, ulimit "limits".

Thanks for sharing those utterly evil examples though! :D

</comment></comment></comment></comment></comment></comment><comment><USER17> this is awesome. Am I the only person who thinks C++ is going to win?

<comment><USER18> ..win what?</comment></comment>


Ask HN: Do you need someone to fix bugs / add small features to your webapps? - <AUTHOR>

Hi everyone,
I would love to fix bugs / write smaller features on a part-time basis for your project for $$ (rather than equity). I was wondering, with the recent crunch in finding programmers, if anyone would be interested in what I have to offer. I have experience with:
- Ruby On Rails (built a webapp for a startup, as well as fixed bugs for another start-up).
- PHP (fixed bugs for a handful of websites).
- Perl (worked for two years for a firm that ran the Linux-Apache-PostgreSQL-Perl stack).
- SQL, HTML, JavaScript, CSS.
- Specifying systems, getting requirements, managing projects.
I can communicate with you via:
- Instant Messages (MSN, Google-talk etc..), Skype, E-mail, and Phone
- For personal meetings, I live in the SF Bay Area, so somewhere close would definitely be most convenient. That said, I'd prefer to work from home.
For billing I work based on completed tasks, or by the hour. So, what do you think? Is this a fair deal?
Thanks! - V <comment><USER2> Do you have/can you summarize together a portfolio?

Ps - If you can trade your services for what you want ("$$") at a rate both parties agree to... I would see this as 'a fair deal' ;)

<comment><AUTHOR> Hmm, a portfolio is tricky because most of my work is on the server-side. I have lots of code samples - I could create a page to show them off. And, I suppose there are a couple of websites that could at least show that I know how to write html/css from scratch in a text editor. My personal website can be found at seevishal.com. I also did backend, as well as some of the mobile work for mobilefolk(.com).

</comment></comment><comment><USER3> How can I get in touch with you? no email in your account, I'll like to know about your rates, so far it sounds like an interesting offer.

<comment><AUTHOR> For some reason I thought that was the e-mail field was for in our profiles - I guess it is private. Thank you for bringing this to light. I've sent you an email.

</comment></comment><comment><USER4> I don't see a "deal"? What are your rates?

<comment><AUTHOR> I change mine based on how busy I am. I'm more reasonable than most. It is harder to change something once it has been published. Your profile has no contact information. I'd be happy to send you my current rate. Please feel free to get in touch.</comment></comment>


Joshua Tree national park 'may take 300 years to recover' from shutdown - <AUTHOR> https://www.theguardian.com/environment/2019/jan/28/joshua-tree-national-park-damage-government-shutdown <comment><USER2> How was the shutdown responsible for the damages? Were the politicians visiting the park during their paid vacation? Is it that some people can't behave without supervision?</comment>


DeepMind researchers propose rebuilding AI industry on a base of anticolonialism - <AUTHOR> https://venturebeat.com/2020/07/11/deepmind-researchers-propose-rebuilding-the-ai-industry-on-a-base-of-anticolonialism/ <comment><USER2> "They further argue that inequities like racial capitalism, class inequality, and heteronormative patriarchy have roots in colonialism and that we need to recognize these power dynamics when designing AI systems to avoid perpetuating such harms."

When has building a scientific discipline on politics worked well? Reading the article, I think the researchers should spend more time on their technical work and less on cultural Marxism. If I were Google I would wonder about their productivity.</comment>


Ask HN: how did you learn the command line? - <AUTHOR> Is there a great book or online tutorial for all things command line? <comment><USER2> I came to answer your question and say that when I started computing there was only the command line - there were no windows, effectively no graphics, and the only thing you could do was type commands.

But then you ask if there are tutorials, and that I can't help you with. Having said that, I tried this search:

<http://www.google.co.uk/search?q=command+line+tutorial>

and I got lots of hits, including these:

* <http://www.davidbaumgold.com/tutorials/command-line/>

* [http://stackoverflow.com/questions/8170/best-windows-command...](http://stackoverflow.com/questions/8170/best-windows-command-line-tutorial-for-beginners)

* <http://www.tuxfiles.org/linuxhelp/cli.html>

I'm not a beginner on the command line, so I can't assess how well they meet your needs.

<comment><USER3> Me too, that's all there was. And that may be the answer: only allow yourself the command line for longer and longer periods of time. Force yourself to learn it.

I really like this book, even today: <http://shop.oreilly.com/product/9780596003302.do>

The key to being proficient at the command line (as distinct from writing shell scripts) is to think of it as composition.

For example, run this:

      $ file $(which $(man -k python | cut --delimiter " " --fields 1))

(The first '$' is your command line prompt, yours may differ; you don't type that. The other '$' characters you do type.)

Now run each command from the inside out, starting with the man command. See what each command does. Build it up bit by bit, that's exactly what I did, like this:

\- the man command

\- the man command piped into the cut command

\- the man command piped into the cut command after reading "man cut" to remember about the --delimiter option

\- the output of that pipeline fed to which

\- the output of which fed to file

Note that I didn't use any for loops or variables, the shell did the right thing for me.

Read the man pages for each of those commands.

set -o vi or set -o emacs (or their equivalent in .inputrc) helps a _lot_ when you compose things incrementally. esc-k k k (etc) is your friend if you set -o vi.

Read man bash. It will take you a long time. For today, read the section on READLINE. While in man bash, search for the word READLINE at the front of the line, like this:

/^READLINE

Slash = search

^ = anchor the search to the front of the line

READLINE = what you're searching for in the current man page.

For now, all you need in your ~/.inputrc file is:

set editing-mode vi

This will give you vi command line editing in bash, as well as any other program that uses readline, like the python REPL.

For more info on .inputrc,

      $ man readline

which is documentation for the C interface to readline, but is mostly about how readline is used by a user. For example, in man readline

/VI Mode bindings

gives you all your command line editing commands when you use vi mode.

Get a mostly table of contents of man bash, for your searching pleasure:

      $ man -P cat bash |egrep -v "^ " |egrep -o "^[^ ]+"

Sort it:

      $ man -P cat bash |egrep -v "^ " |egrep -o "^[^ ]+" |sort

<comment><USER3> And ...

I realized/remembered while reading the other comments that knowing what's available is a necessary part of "just use the command line a lot."

So try this, to get a good list of what's available (and for more command line composition)

      $ man -k $(ls -1 /usr/bin |egrep -v "\[") 2>&1 |egrep -v "nothing appropriate"

See if you can figure out what 2>&1 does (it's a very common idiom, probably easy to find), and figure out why it's needed here.

That's a long list of stuff, look at it a page at a time:

      $ man -k $(ls -1 /usr/bin |egrep -v "\[") 2>&1 |egrep -v "nothing appropriate" |less

That's still a lot of stuff, save it off in a file in your home directory for later:

      $ man -k $(ls -1 /usr/bin |egrep -v "\[") 2>&1 |egrep -v "nothing appropriate" > ~/wholelottacommands.txt

</comment></comment></comment><comment><USER4> The best way to learn is by doing and using it often.

Don't read, use it often!

There must be a strong reason to learn, and don't just learn for the sake of learning!

I have been _using_ Linux daily, its around 5+ yrs. I play around with numerous VPS remote boxes and still I'm learning, but everyday getting better at it.

This way, it should only get better and better over time! The more you use in your daily workflows, the more you appreciate and understand the internals too.

And there are no other shortcuts to learn command line tools. Courses or short tutorials won't help much.

You have to involve command line tools in your daily workflow's. Its a long term process, so keep learning, improving and don't ever stop!

</comment><comment><USER5> I started in DOS watching over my brother's shoulder. (There was no GUI back then.) I used to make batch files and such.

Eventually I grew to love bash. I am sure there are plenty of keyboard shortcuts I don't know, but I find using the command line to be quicker than any other form of communicating with the computer.

I use keyboard shortcuts in Firefox, and occasionally dream of an Awesome Bar that works like bash.

I also really like using the 'move-cursor-a-word-left/right' and 'move-cursor- to-end/beginning-of-line' and 'move-cursor-to-top/bottom-of-textarea' functions you can find in almost every GUI.

Finally, I use Spotlight to load all my applications: I hit cmd-space and then it's usually 1 key to load my most commonly used applications, and generally 3-4 in worst case.

My suggestion: use the Terminal for everything: Learn to edit text files in emacs or vi, use a command line SQL browser, do source control from the command line, and learn sed, awk, and cut (plenty of tutorials out there). Use the keyboard in the browser and in GUI textareas as much as possible.

Here is a neat site which has turned up in a few of my Google searches: <http://www.commandlinefu.com/commands/browse>

Finally, shameless self-plug, I have been using this simple piece of code every day for a couple of years, a command-line (tab-completed) notebook for bash: <https://github.com/nchelluri/notes> .

HTH.

Edit: I keep looking at this page every few months, but it never seems to be compatible with my version of Firefox: <http://paulrouget.com/e/jsterm/> :(

<comment><USER6> >I use keyboard shortcuts in Firefox, and occasionally dream of an Awesome Bar that works like bash.

This reminded me to check up on Ubiquity[1]. Mozilla doesn't even host a page for it anymore, but apparently someone adopted it[2]. I'm going to have to play around with this tomorrow; I'll be happy if it's half as useful as I remember.

[1]: <https://en.wikipedia.org/wiki/Ubiquity_%28Firefox%29> [2]: <https://bitbucket.org/satyr/ubiquity/overview>

</comment></comment><comment><USER7> $ man man # best way to start

I could also recommend TUPE[1], it teaches you how to effectively use the command line and write shell scripts.

1\. The Unix Programming Environment by Brian Kernighan and Rob Pike.

</comment><comment><USER8> I dont know about other people, but I learned based upon need. I needed to be able to manage files so I learned cd,mv,cp,ls. Then I needed to write the output to files so I learned about piping and the redirect operator. Then I needed to search through the output so I learned grep, etc.

</comment><comment><USER9> I was on a gigantic Sequent machine with hundreds of users at UIUC.

When I got my account, I given a user agreement paper with rules and regulations that, at the very bottom, had a dozen or so commands on it. There were some very terse and cryptic descriptions. ("cd: change directory; man: read a manual page; ps: print running processes; grep: search for a string")

Eventually I bootstrapped my way up to doing "ps -augx" to see what other people were running. Then I would try whatever they were doing.

</comment><comment><USER10> I can say how I started:

In 1997, a friend of mine came to visit, installed Debian 2.0 on my 486 with a unsupported Intel i740 videocard, showed me how to log in, 'man -k <something>' and 'man man', then said "See ya next week, have fun". And I had.

</comment><comment><USER11> Once upon a time (c. 1990-1997), most programs were written for DOS, and some amount of command line knowledge was required to run them.

Installers were typically batch files (the DOS equivalent of shell scripts), which was really cool: You could see exactly what they were doing [1], and you could improve your command-line-fu by seeing the techniques people used [2].

[1] Usually it was just copying the application files from directory to directory. Nowadays installers generally muck with the Registry, C:\Progra~1 [3], C:\Users\Applic~1 [3], the Desktop (who knows where _that_ is), the Start Menu, and the Windows equivalent of /etc/init.d (I remember there are several of them, and your system will get slower...and...slow...er...if you don't clean them out regularly)

[2] Like environment variables or @ECHO OFF.

[3] Spaces in filenames need to die. Whenever possible I use the 8-character names Windows generates for backwards compatibility with DOS.

</comment><comment><USER12> Know how to get help with specific topics.

(1) At the terminal, via

        man <command>

or

        apropos <command>

and (2) online by googling.

These are useful when you have a specific task you want to get done, not so much otherwise. Therefore,

(3) Try to do things at the command line that you would normally do via mouse. If you have no idea how, google or 'apropos'. If you learn of a tool and have no idea how to use it, google more or 'man'.

(3a) Do the simple stuff via the CLI--removing and moving files, examining directory contents, et cetera. (Be careful with rm! It will not warn you by default.)

(3b) More complex stuff too--try editing text with a terminal editor. Many people swear by emacs and vim. They have learning curves of their own but they are worth it. Pick one.

(4) Pipes and input redirection. Send the output of one command as the input to another, send the output to a file, etc. This is where your standard Unix shell gets really powerful.

<comment><USER5> apropos is a great command. Just learned about that one a few weeks ago.

Turns out it's a synonym for "man -k".

</comment></comment><comment><USER13> Peepcode has a great set of quality, affordable, screencasts. I went through them both and they helped a ton.

<https://peepcode.com/products/meet-the-command-line>

<https://peepcode.com/products/advanced-command-line>

Experimentation is another good option, and goes a long way, but it can be scary. If you're at all worried about doing permanent damage, install a virtual machine (i.e. VirtualBox + the server version of Ubuntu or whatever OS you want). That way you can experiment away without fear of doing permanent damage. If it happens just trash the the VM and start again.

</comment><comment><USER14> I think that in order to learn the command line, you have to immediately develop a different goal that requires proficient use of the command line. That way it'll force you to learn by doing.

Command line is not one of those self-contained "deep" knowledge bases where everything links together. It's broad, shallow, unlinked - the concepts and practices do not always imply themselves. For bodies of knowledge that fit that pattern, you _have_ to learn by doing - you can't simply derive the knowledge through study and thought. And the best way to learn by doing is to immediately apply it to something useful.

</comment><comment><USER15> The greatest obstacle for me was knowing which tools did what. Many things I wanted to do in the shell I did not know were possible, and even Google is of limited value when your query is necessarily vague, though this has gotten a whole lot better in recent years.

Have an IRC connection to Freenode open so you can ask about these sorts of things that are more easily understood by humans (#bash, ##linux, ##workingset are good channels to be in). If you're _really_ lucky, you have some knowledgeable mentor around who doesn't mind you asking them about the best way to perform some task (I was not so blessed).

</comment><comment><USER16> I didn't really learn or rely upon much of the command line until I went through the process of installing Gentoo Linux[1] from a minimal CD.

[1] <http://www.gentoo.org/>

</comment><comment><USER17> My Windows laptop was outta commission for a few weeks in college. I could use the public computer labs to do my homework, but the only way I could do any programming was to SSH into remote UNIX boxes that I had access to and write the code directly on the server. (I was doing mostly PHP development at the time, and had laboriously setup PHP/Apache/MySQL on my Windows box until it died.) When your only window into the world is an SSH terminal, you pick up the command line and vim fairly quickly.

</comment><comment><USER18> My solution isn't the easiest because it requires a lot of discipline but it you force yourself to stick to it you will come to dominate the command line.

Everytime I wanted to do something in the command line as well as everytime I had to do something in it, I would then write down what the command was in a text file as well as my understand of what the command did.

If you program a keyboard shortcut to launch the text file with but one keystroke it's a not as bad as it sounds.

The reason I did this was because I would always enter a command and totally forget it and then need to look it up again and so I forced myself to stop wasting time by compiling my own command line glossary.

If you are new to UNIX, don't go poking around the MAN pages because you'll be lost, discouraged and less likely to acheive your goal of terminal excellency.

It's really not something you can just pickup overnight unless you're very very diligent and proficient with another language and very familiar with all things computers. If you can take a Unix course some where in person, do that. always the best to have a pro help you out while you're starting.

And one last point of particular importance. Respect the Sudo. I can't tell you how much frustration I endured while messing with the sudo--it's not a good thing to be bushwhacking no the command like as the root user which I did at first because I am just a curious kid and didn't know any better.

My advice is to abstain from messing with things like the ACL, file ownership, and the wheel group until you know the hierarchy cold.

</comment><comment><USER19> The first computer my family owned was an IBM PC XT, which was my introduction to the concept of a command line interface being normal. I do wonder what it'll be like for the generation of potential hacker types who won't even remember a world before slick iOS UIs and ubiquitous internet in your pocket. Computers were a kind of source of wonder for me in my childhood, and what I see from young children today is they view them as very mundane, which I suspect hurts their curiosity.

Years detached from those experiences with the XT, I picked up Linux in the late 90s. It was a bit of a learning curve from DOS. But I picked up some very dated book at the local library about Unix and it kind of set me straight.

The real revolution in my thinking came in 2001, when I was unfortunate enough to buy a motherboard with an ALI 1647 chipset (it's sad that I have brain cells devoted to remembering that model number). That chipset, when combined with an NVIDIA video card, would make X crash and lock up after about 30 minutes of use (before you start bashing on Linux, I'd been told the same thing would happen on Windows with this hardware combination). For six months months I was in denial of this problem. I kept thinking the next BIOS update or the next driver would fix the problem. In the meantime I used nothing but console mode, because it was the only thing that was stable.

Six months or so later I sold the old motherboard, paid my quarter to get myself a "real motherboard" (ok, it was more like USD$200), and got X working again. It was good and all to have a GUI again but one thing I did notice was that my command line skills were much improved.

</comment><comment><USER20> In 1995, all we had at university had was a bunch of SunOS & HP-UX workstations. Yes, they had X, mwm and (later) CDE, but you just had to learn the command line to do anything particularly useful. Man pages, a few of the IT service's leaflets (How to use troff/LaTeX), searching the web (Altavista! Dogpile! Webcrawler!) and asking in Usenet groups when I hit a real roadblock. I started building small shell scripts out of need to automate some things, and learned about the shell environment and the overall Unix philosophy doing that.

This was over a period of years rather than weeks or months - I probably can't say that I was proficient on the CLI until around 1999 when I really started getting stuck into Linux and building everything from scratch. I find that young developers today expect to learn everything immediately, expecting a one-true-way to wisdom, rather than accepting that true mastery seeps in over time, largely through doing and getting things wrong. So, experiment, and don't give up when you can't figure out something immediately.

</comment><comment><USER21> > Ask HN: how did you learn the command line?

I had no choice -- for most of my computing career, there wasn't anything else. in fact, when I first got into computing, I would have sold my left arm to gain access to a command line interface.

When I see a typical modern command line (a shell session), it's enclosed in a separate window, and I'm reminded how far we've come in a short time.

Before I had access to a terminal, I was writing programs anyway --

<http://arachnoid.com/programmable_calculators>

\-- and my first terminal's output (while working for NASA in the early 1970s) was a roll of paper.

So that's my answer -- I had no choice.

Oh, p.s., here's my Bash tutorial:

<http://arachnoid.com/linux/shell_programming.html>

</comment><comment><USER22> What is it you want to do? Just learn or do something with it? You won't learn something like that by reading. You have to actually use a terminal to accomplish things. Often.

Start using linux and develop something. You'll use about 3 terminal instances all the time. That's the way to learn.

</comment><comment><USER23> Like others here, I learned simply by doing and fumbling my way around until I was comfortable.

That said, I think the most important thing for you to learn is how to get help. Learn how to find man(ual) pages, and how to interpret the very precise language and syntax that programmer-authors like to use. Then try reading the man pages of the systems that you want to learn - like 'man bash'. Also, some tools have nicer pages accessible via the 'info' command, so try 'info emacs'.

That'll generally be the best way to learn how to use any tool. The only trick past that is to learn which tools exist, and google/stackoverflow will usually suggest appropriate tools when you tell it precisely which problem you want to solve.

</comment><comment><USER24> I cut my Linux teeth on Gentoo stage 1 and 2 installs, which I found enormously frustrating and equally educational.

Today, I'd recommend working through Linux From Scratch. You'll develop a rich understanding of how a UNIX-like OS fits together, including a fair bit of shell functionality: <http://www.linuxfromscratch.org/lfs/>

My favourite dead-tree UNIX book would be UNIX Power Tools, 3rd Edition ([http://www.amazon.com/Power-Tools-Third-Shelley- Powers/dp/05...](http://www.amazon.com/Power-Tools-Third-Shelley- Powers/dp/0596003307)). It may be a while before it's a truly valuable resource, but keep it in mind.

</comment><comment><USER25> Download linux on your computer(Mint or Ubuntu id recommend). Then look up the basic commands and use them (ls, cd ...). Then move on to making your own aliases(search up 'making bash aliases'). By this point you can now start trying some more advanced things like having aliases which start up programs and open your project folders(search up 'dotfiles bash'). Lastly learning some shell script can help you better understand and utilize the terminal(as you can write complex shell scripts for your aliases). As a side note using vim(or emacs) as your default text editor will keep you in the terminal longer helping you get used to using it.

</comment><comment><USER26> I learned Unix on my dad's Tandy Model 16 machine -- one of the first commercially available Unix micros (along with the Sun Workstation).

XENIX (Microsoft's Unix) came with a program called "learn" which was a tutorial. It would show you how to do something, then give you a goal and drop you into a mock shell. Most of the commands had their usual effects inside the mock shell, but you could always quit the lesson and restart if you screwed up.

That's how I picked up the basics. When I discovered Unix machines -- and Linux -- on my university campus some eleven years later, all the old skills translated and I learned some new ones along the way.

</comment><comment><USER27> I learned the command line by using the command line. When I switched to Arch Linux, using bash was inevitable. It took many Google queries and reading many man pages to finally become comfortable in it.

</comment><comment><USER28> When I was 16, I got my first VPS box. The hoster only offered SSH connection, so the shell was the only way to proceed. Spent half a year without knowing about '&' and 'nohup' and 'Ctrl-Z', but learned what patience actually is. Then watched the video course on Vim by Derek Wyatt.

There's a small book about shell by Zed Shaw, recommended: <http://cli.learncodethehardway.org/book/>

</comment><comment><USER29> If you're new, start here: <http://cli.learncodethehardway.org/book/>

</comment><comment><USER30> I think I first got into it when I was trying to get some sort of video to play in QuickTime - since then I've switched to VLC, cause I didn't have much luck.

Then I started doing Learn Python the Hard Way, which taught me the easy stuff like ls, cd, rm, and so on. Then I had a course in Linux Systems Administration, where I had no choice but to master it as fast as possible.

</comment><comment><USER31> I bought a couple of Sam's Teach Yourself books:

-Sam's Teach Yourself Unix in 24 Hours

-Sam's Teach Yourself Shell Programming in 24 Hours

These won't make you a shell genius immediately, but they'll create a good basis for future, specialized learning.

Also, I try not to be a material snob, but buying the book instead of using a website or .pdf file made a world of a difference (especially during a morning commute).

</comment><comment><USER32> I seem to be one of the few people to have learned from a class. Over a semester, I learned all the important commands, and commands I probably have otherwise learned, like uniq -c, dmesg, or cut (although I can't imagine ever actually using awk), as well as the bash scripting language and syntax.

</comment><comment><USER33> How did _I_ learn the command line?

By doing. Some reading, sure, but .. more doing than thinking. Like this;

I was a brand-new programmer (COBOL). The Marines assigned me to a billet in the LAN team at my new command. A corporal wrote down exactly what to type on the computer after the NIC was installed.

After that, I was off and running.

</comment><comment><USER34> I learned mostly thru trial and error with Linux as a teenager, but during my CS degree this course filled in some missing gaps:<http://www.cl.cam.ac.uk/teaching/2005/UnixTools/>

</comment><comment><USER35> must have been 1999/2000. My boss made me, the ultimate noob, the "administrator" of a Solaris Box.

I didn't know SHIT! absolutely NOTHING. I was just a dumb Windows User. There was just this blinking cursor (that motherfucker) and me. i browsed the web and had to look up stuff like "cd" and "ls". Steep learning curve, i guess, but nothing teaches you better than "trial and error".

Funny sidenote: Not only was i totally overwhelmed with all the commands and quirks of the command line, but the web always mentioned vim as THE editor for Unix. So i also started messing around with the most obscure editor on this planet.

These were rough times for me, but i have learned so much, and i am thankful for that.

</comment><comment><USER36> I am not a command line pro either but whatever limited experience i have came from working from mercurial and from college unix lectures. I would suggest you incorporate command line in some of your routine work (source control for example).

</comment><comment><USER37> I learned from commands written on chalk boards in computer labs (during the days when all over campus were rooms of green or amber screened terminals that were open 24 hours).

Then one day I saw and typed 'man man'

'apropos' was also written on the board that day

</comment><comment><USER38> Find a mentor or an irc chatroom. My sophomore roommate knew a ton. I annoyed him to no end w/ questions (many RTFM comments…). A lot of the commands aren't named obviously, though the 'apropos' command may help.

</comment><comment><USER39> This is a good book: [http://www.amazon.com/gp/product/013308504X/ref=oh_details_o...](http://www.amazon.com/gp/product/013308504X/ref=oh_details_o01_s00_i00?ie=UTF8&psc=1)

</comment><comment><USER40> I started with DOS 4.01, and a DOS manual. I went command by command, until I got to format "hey, we have a lot of files, it would be nice to have them formatted..."

That day I learned about OS installation as well.

And then continued.

</comment><comment><USER41> thanks to HN who provide me this[1] link . It is awesome and contain many useful information . [1]:<http://cb.vu/unixtoolbox.xhtml>

</comment><comment><USER42> Ultimately, the best and proper way to be a console master is to install a Unix distribution on your one and only everyday machine and avoid any sorts of X or Window manager at all.

</comment><comment><USER43> Seriously use it or lose it, it's really that simple when you don't know what you need to do just check out the man pages or,google your little heart out.

</comment><comment><USER44> Found this on HN - excellent starting point / read: <http://linuxcommand.org/tlcl.php>

</comment><comment><USER45> The hard slow way over the course of a few years. If I did it over again I'd buy books on bash, grep, sed, etc and learn it in one shot.

</comment><comment><USER46> I remember at age five being taught by my dad how to run DOS games.

      Type 'cd ' and press tab. 'cd' is like clicking on a folder.

<comment><USER47> Exactly the same for me, before I could read, write or speak english. My dad gave me a list of commands.

It was a bit hard to get out of the station in police quest and only years later did I understand why my dad didn't want to help me to get into this game where a "man" is floating from left to right and you need to answer a question to play.

</comment></comment><comment><USER48> This xkcd cartoon on tar might be comforting: <http://xkcd.com/1168/>

</comment><comment><USER49> I learnt by immersing myself in the command line - needing to get stuff done is the perfect catalyst.

</comment><comment><USER50> Trying to get Wi-Fi to work on Ubuntu

</comment><comment><USER51> > how did you learn the command line? I grew up with it

</comment><comment><USER52> Everyone's assuming the poster means Linux, but he didn't actually specify. Lots of things have command line interfaces. What command line are you actually talking about?

<comment><USER12> Much of this advice is applicable to any Unix. For instance 'man man' is good advice on a Mac, too.

</comment></comment><comment><USER53> my way: life without file managers. ls, cp, mv, mkdir, rm, find, grep... and vim, vim, vim =)

</comment><comment><USER54> Like everything else. Google.</comment>


New Material Makes It Easier to Store Lots of Natural Gas - <AUTHOR> http://www.technologyreview.com/news/542976/new-material-makes-it-easier-to-store-lots-of-natural-gas/ <comment><USER2> Same article posted a few hours earlier.

[https://news.ycombinator.com/item?id=10536637](https://news.ycombinator.com/item?id=10536637)</comment>


Rosetta – 3D Model - <AUTHOR> http://cabbi.bo/rosetta/

<comment><USER2> Here is 3D WebGL view of Comet 67P/Churyumov-Gerasimenko with more natural colors :)

[http://www.elmarnieser.nl/demos/rosetta/](http://www.elmarnieser.nl/demos/rosetta/)

And another view, with Philae lander landing site "Agilkia" marked:

[https://sketchfab.com/models/464c6be099f046bc9716a587c06a81b...](https://sketchfab.com/models/464c6be099f046bc9716a587c06a81b6)

<comment><AUTHOR> oh awesome! I had seen the [http://www.elmarnieser.nl/demos/rosetta/](http://www.elmarnieser.nl/demos/rosetta/) but that other one is AWESOME!!!!

</comment></comment><comment><USER3> Good work Cabbibo!

Here is another interactive 3D model showing the Rosetta comet and the Philea landing site that is editable, created in [https://Clara.io](https://Clara.io): [https://clara.io/view/0b4d0e55-c986-45a4-a4f9-05b1be03364f/w...](https://clara.io/view/0b4d0e55-c986-45a4-a4f9-05b1be03364f/webgl)

<comment><AUTHOR> OH YA!!! Clara IO :)

</comment></comment><comment><AUTHOR> Data: [http://blogs.esa.int/rosetta/2014/10/03/measuring- comet-67pc...](http://blogs.esa.int/rosetta/2014/10/03/measuring- comet-67pc-g/)

Nothing too special, but the shape of the comet is so pretty, I wanted to see what it looked like in 3D with weird colors.

Leap Motion Enabled ( paddle to rotate )

</comment><comment><USER4> Very nice. Where did you get the data from? Small gripe, but the default colour map is a little garish, could you change it to something more natural?

<comment><AUTHOR> Natural one is here: [http://www.elmarnieser.nl/demos/rosetta/](http://www.elmarnieser.nl/demos/rosetta/) I didn't have any bump map data, and since I can't compare with how cool that one looks, figured might as well go the totally opposite direction :)

</comment></comment><comment><USER5> Impressive as always!</comment>


Differences between the 1900 and the 1904 date system in Excel - <AUTHOR> https://docs.microsoft.com/en-gb/office/troubleshoot/excel/1900-and-1904-date-system <comment><USER2> The back story about when Joel Spolsky (founder, StackOverflow) had to present this for review by BillG.

[https://www.joelonsoftware.com/2006/06/16/my-first-billg- rev...](https://www.joelonsoftware.com/2006/06/16/my-first-billg-review/)</comment>


Educationism: The subtle bias we often ignore - <AUTHOR> http://www.bbc.com/future/story/20171219-the-hidden-judgements-holding-people-back <comment><USER2> "We are evaluating people – giving them negative attitudes – even though we know that in reality they cannot be blamed for their low education." IT engineer here with 19 years in the industry and no college degree. It's unconscionable that people have negative attitudes against others perceived as having low education. That said, traditional education is only one of many ways to become educated, and people generally can choose to further their education in many subjects without paying tuition to some institution. Doing so isn't necessarily straightforward or easy, but it starts with an individual's desire to simply learn and to pursue knowledge wherever it can be found.

</comment><comment><USER3> Don't forget about reverse educationism. People give me way too much credit for appearing smart.</comment>


Ask HN: My Bio on Ex-Employer's Website - <AUTHOR>

I resigned from my job a few weeks ago but my employer has kept my name and profile on their website. They have also kept my name set up on their voice prompt system. Based on my experiences at the company when other employees had left, I assume that they have kept these two indicators of my presence in place so that incoming requests for myself can be "funneled" to the right person to alert them of my departure and make sure their requests are taken care of.
On one hand, I can understand why they would want to do that. On the other, I don't feel like they should still be "pretending" that I work there and using my name and associated reputation for their own benefit.
What is the "grace period" for this sort of thing, before I request that they do something about it? <comment><USER2> The bridges you will burn by broaching this concern are far more than any good feeling you will gain in yourself. Therefore, keep silent.

The bio will probably be down within a few months, but your name on the directory might stay unless your replacement is very active with your clients. They're servicing the clients that you no longer are the best way they can. Let them.

<comment><AUTHOR> Your answer seems extremely biased.

So from your perspective, an employer should be able to use and/or profit off of it's former employee's identity and reputation indefinitely after that employee leaves?

<comment><USER2> That's not what I said at all.

I said that this can do more harm than good to the asker requests this while the company is still actively trying to redirect client requests.

If you can leave it long enough that you can approach them and they say "Oh, silly us, you're right! You left a while ago!" they will be much more receptive.

Like many things in business, this isn't about moral high-ground, it's about seeking the best outcome for yourself while offending as few people as possible.

</comment></comment></comment><comment><USER3> I would at least give them a couple months, it takes most companies that long (or longer) to update their site. I don't think it would be burning bridges if you email them in a couple months if it's still up. You could always say someone contacted you requesting help since the information was still up, that the last thing they want is their customers coming to you.

</comment><comment><AUTHOR> I guess one issue here is that I don't see how removing my name from their website prevents them from continuing to service their clients or direct their queries to the correct person.</comment>


The Anatomy of a Baseball Trade - <AUTHOR> http://www.businessweek.com/magazine/anatomy-of-a-baseball-trade-10202011.html

<comment><AUTHOR> Not a normal HN piece on first blush, but some fantastic lessons from real life excerpts of conversations. Check out this one for negotiation:

> Braves: 1:30 p.m. Wren text message – We see Bourn valued down a level from > Pence for our club. We like the run production and power of Pence, and Bourn > is a run creator. That doesn't do as much for us. That is too rich for us. > Thanks, Frank.

Interesting reading the negotiating position, language choices, brevity, etc. "Thanks, Frank."</comment>


Judge Says Mathematical Algorithms Can't Be Patented - <AUTHOR> http://techcrunch.com/2013/03/28/judge-says-mathematical-algorithms-cant-be-patented-dismisses-uniloc-claim-against-rackspace/ <comment><USER2> Good thing all source code is just very convenient mathematical notation describing an algorithm... This to me is the most fundamental reason software patents are insane.

<comment><USER3> Good thing algorithms aren't patented and instead it's the application of the algorithm that gets the grant. Most are written as "a method for performing X by doing Y."

IMO, the issue with software patents isn't that businesses patent algorithms or code(which they don't do). Instead, it's that technology moves too fast for the monopoly time that's granted. When it comes to software, what's innovative 5 years ago is common place and often a commodity today.

<comment><USER4> What's the difference between "a method for sorting an array of integers by doing <steps of Quicksort>" and simply patenting Quicksort? Or do you mean something more specific to a particular product, like "a method for sorting a list of restaurant recommendations by doing <steps of some machine learning algorithm>"? Either way, all I'm seeing is algorithms.

<comment><USER5> In the second case, you're not patenting the algorithm, because people remain free to use the algorithm to do things other than sorting lists of restaurant recommendations.

Which is ultimately why "its all just algorithms" is a uselessly reductionist view of things, in the same way "all creative works are just strings of bits" is uselessly reductionist, or even "all physical objects are just globs of atoms" is uselessly reductionist. It's not a useful level of abstraction at which to view the issue.

Ultimately you have to tie it back to the purpose of the property right. Why does someone have a legal right to a particular glob of atoms, or a particular string of bits, or a particular series of steps of some algorithm in some specific context?

<comment><USER6> "In the second case, you're not patenting the algorithm, because people remain free to use the algorithm to do things other than sorting lists of restaurant recommendations."

That doesn't make the situation any better, in my mind. In fact, in many ways that makes it worse.

Step 1) File patent for using algorithm (everyone knows) to do (some obvious application of that algorithm).

Step 2) Wait around for some other poor sucker to do the hard work of actually implementing "your" idea.

Step 3) Profit!

<comment><USER5> 1) In theory you wouldn't be able to file patents without a working prototype --we've unfortunately gotten away from this requirement;

2) That assumes "implementing the algorithm" is the hard part.

<comment><USER6> IMO/IME, implementing is always the hard part.

I agree with your #1 though in that I think you should absolutely be required to have a working prototype to file a successful patent. A lot (though not all) of my objections to software patents would go away if that were enforced.

<comment><USER5> I disagree. If you look at something like the software in your cell phone that handles the power control loop or hand-offs, etc, I guarantee you it's not very many lines of code. But the underlying algorithms (the specification), is the result of months if not years of experimentation and empirical validation.

<comment><USER7> That's the sweat of the brow argument: If somebody worked really hard then they should get a cookie. But that doesn't work. If Bob is a savant and he designs a brilliant hand-off algorithm in five minutes, should that not be patentable because he didn't have to work very hard, but an algorithm that isn't even as good should be because a much worse engineer spent a lot longer to design it? The result would be to reward mediocrity and waste.

Which is why we look at the invention instead of the effort. So even though I'm sure Einstein worked really hard on E=mc^2, laws of nature are still unpatentable, because it's a description rather than an invention.

The problem is that no matter how hard it is to discover it, we can't give you E=mc^2, because it only describes things. You can actually have implementations that predate the discovery, because it's possible to build something without being able to describe how it works. We had X-ray machines before we had E=mc^2 even though it describes their operation. Allowing a patent on anything following the description would allow too wide a scope. You would be claiming too many things you didn't invent.

But algorithms are the same way. They're not _inventions_ , they're _abstractions_. There is a really cool ad hoc routing algorithm where you send packets along random routes but tag the routes, and then the more/faster packets get to a destination using a particular route, the more you prefer that route for future packets. Sounds like something that should be patentable if algorithms are patentable, right?

But it's called the ant algorithm. Guess why.

Algorithms are pure abstractions. Those little buggers crawling around leaving scent tracks everywhere have certainly never heard of your algorithm and have no capacity to produce any sort of a binary, but there they are infringing your would-be algorithm patent.

So you say, a-ha! We'll just make it an invention by applying a context. Then the wildlife will be able to escape liability (and hopefully stop serving as pesky prior art).

The issue is that the context is totally facile. The interesting thing is the algorithm, not the context. It's just taking the unpatentable thing and adding "on a computer" and claiming it as an invention. Sometimes they try to be subtle and instead of saying "computer" they say "ad hoc wireless network" or "anonymizing P2P network" or some other thing the meaning of which is always "computer that could benefit from using this unpatentable algorithm" as if to pretend that the limitation is meant as an actual restriction rather than merely a vague description of the circumstances under which the algorithm is expected to be beneficial.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER8> All algorithms are theorems. All theorems can be represented by unique numbers (Gödel numbers). In the abstract sense they exist at all, all numbers exist prior to their use. Therefore all algorithms are discoveries, not inventions.

Ok, this argument sounds clever at first but is actually trite, being excessively reductionist and ignoring that some intellectual creativity occurs in most discovery. Most obviously it motivates a better proper definition of the term "invention". Patentable inventions should always be applications of technology, not the technology itself.

The whole purpose of patents is to encourage more innovation that benefits economies as a whole, by granting a temporary monopoly to entities to benefit from the process and expense of invention. Standing to sue should be on that basis; transference of rights to another entity should not whitewash that socio-economic responsibility. Everyone with distate for the NPEs understands this.

</comment><comment><USER9> Some very basic background from a famous patent case (Diamond v. Chakrabarty):

"Anything under the sun that is made by man [is patentable] . . . . [T]he laws of nature, physical phenomena, and abstract ideas have been held not patentable . . . a new mineral discovered in the earth or a new plant found in the wild is not patentable subject matter. Likewise, Einstein could not patent his celebrated law that E=mc2; nor could Newton have patented the law of gravity. Such discoveries are manifestations of nature, free to all men and reserved exclusively to none."

<comment><USER10> Are algorithms invented or discovered? It's a curious question regardless of this situation.

<comment><USER11> i would say it is discovered.

</comment></comment></comment><comment><USER12> Math can't be patented and yet you can get a patent for code snippets? This sounds absurd since all code boils down to mathematical manipulation of binary numbers. I guess if you abstract something enough you can get away with patenting it? Can we patent methods of preparing food now? How about ways to put something together (think ikea)? Why hasn't anyone patented something like the smartphone yet people can patent something as arbitrary as memory management techniques? I would say I hate our patent system but I'm just too damn confused by it to form an opinion or explain why I hate it.

<comment><USER13> You can't patent atoms, but you can patent compounds made of those atoms, like a new plastic. Or, if those compounds are already open, you can patent products that combine those compounds into a new shape, like a new blender. You can't patent the human voice or melodies, but you can patent a song. You can't declare that because someone's. product uses raw materials that are patent-free, that their final product isn't really an invention. Every thing is built on some other platform, so that would remove patents entirely.

<comment><USER14> A song isn't an invention so you would have to copyright it not patent it.

<comment><USER13> Yes, quite. Sorry. Point being though, you can own an intellectual property even if you can't own the parts and tools that go into it.

</comment></comment></comment></comment><comment><USER15> I personally think copyright law provides enough protection for software. I think patents would actually _harm_ innovation in the software world.

Algorithms are inherently protected, anyway - they're not like clever mechanical solutions that can be reverse-engineered by anyone with eyes and a brain; they're usually close-sourced when the author wants them to be. Patents may be necessary to protect products with transparent functionality, but software usually doesn't fit that bill unless it's deliberately open-sourced.

Even if you developed a strong AI algorithm that will change the world, there should be competition. It's not like Microsoft will hire a few engineers to rapidly develop something that transcends yours; it would be a reverse engineering challenge to any competition.

What if algorithms behind network protocols were patented? Computers would still be novelties and corporate tools, I think.

<comment><USER5> So patents solve the incentive problem, just like copyright. Copyright solves the incentive problem when "writing masses of software" is the hard part. Patents solve the incentive problem when "figuring out what software to write" is the hard part. Take things like garbage collectors. Even the most complex are only 15,000-20,000 lines of code. Writing those lines of code was the easy part--it was figuring out what that code should do, and doing all the testing to figure out what worked and what didn't that was the hard part.

<comment><USER16> >Copyright solves the incentive problem when "writing masses of software" is the hard part.

That seems backward to me--when you've already figured out what to make, and the hard part is producing mass quantities of it--isn't that what patents are designed to protect?

>Writing those lines of code was the easy part--it was figuring out what that code should do, and doing all the testing to figure out what worked and what didn't that was the hard part.

Similarly, typing the words of a novel is easy; figuring out what to write is hard, which is a good reason for copyright protections, but I'm not sure if it has any bearing on the issue of patents.

<comment><USER5> > That seems backward to me--when you've already figured out what to make, and > the hard part is producing mass quantities of it--isn't that what patents > are designed to protect?

The archetype of what a patent is designed to protect is something like a drug formula. Manufacturing lots of drugs is easy--figuring out what chemical to manufacture is the hard part. That is both hard, expensive, and easy to reverse-engineer.

<comment><USER16> OK. It's probably more common in folklore than in real life, but I was thinking of the situation where mass production was the hard part, for example, where a lone inventor comes up with a process or design, but does not publicly disclose it because of fears that someone else (with better ability to mass produce) would capitalize on it.

So I agree that patents (and the extent of their protection) makes sense for things that are "hard and expensive", in software as in other fields. But it seems like many software patents that get discussed are for things that did not require a lot of work; the 20-year monopoly seems to be a disproportionate reward just for being first, regardless of the work involved.

</comment></comment></comment></comment></comment><comment><USER17> Have I travelled back to 1972?

<http://en.wikipedia.org/wiki/Gottschalk_v._Benson>

<comment><USER18> Well, this is how our system works. There is nothing stopping me from filing suit against you for posting this comment because it hurt my feelings. Then the judge throws it out because there's no basis in the law for my claim.

<comment><USER19> Motion to dismiss for failure to state a claim? Including reading the complaint, researching and drafting an answer, and associated communications, figure 30 hours of attorney time. Wilmer Hale? Figure $400/hr.

$12K to respond to a claim so frivolous that it was dismissed instantly in the friggin' Eastern District of Texas.

Hope RedHat can get some fees back from these fools.

</comment></comment></comment><comment><USER20> Seems like uniloc is willing to file lawsuits without any considerations. see below for an interesting Q&A on uniloc's site:

 _Q. How many additional lawsuits does Uniloc plan to file?

A. Uniloc plans to defend our patents aggressively whenever they are infringed. This protects our business and our shareholder value. In our view, it's the right thing to do._

</comment><comment><USER21> Wait, so are Software patents acceptable but patents on mathematical algorithms not okay? Where is the rational in this? Granted, the patent in question is absurd to a new extreme (trying to patent floating point numbers).

<comment><USER22> Mathematics are reasoned to be "a law of nature," and "abstract ideas," and so they are explicitly excluded as unpatentable subject matter under 35 USC 101.

Algorithms are established to be mathematics under Case Law, particularly _Chakrabarty_ , 447 U.S. at 309, 206 USPQ at 197; and _Flook_ , 437 U.S. at 585, 198 USPQ at 195.

 _Diehr_ , 450 U.S. at 188-178; establishes that if the patent is for a particular application of an abstract idea, but not for the abstract idea itself, it _may_ be patentable.

<comment><USER23> > _Diehr, 450 U.S. at 188-178; establishes that if the patent is for a > particular application of an abstract idea, but not for the abstract idea > itself, it may be patentable._

So what does that mean, _"a^2 + b^2 = c^2"_ cannot be patented, but _"using 'a^2 + b^2 = c^2' to find the length^2 of the hypotenuse of a right triangle"_ in theory could be (were it "invented" today of course)?

<comment><USER22> Actually, I should clarify a little: The more recent _In re Bilski_ establishes that a rote process (like finding the length of the hypotenuse in your example) is not patentable. It requires a machine or a tangible transformation. That is, a machine that does this calculation.

</comment></comment></comment></comment><comment><USER24> So, now we just have to define what exactly a mathematical algorithm is. Good luck with that.

<comment><USER25> Now we just have to rewrite all "patented" algorithms in lambda-calculus. That should be easy...

<comment><USER26> It's not that bad. "All" we have to do is implement everything in Lisp, since Lisp can be reduced trivially to the lambda calculus.

Once again, Lisp saves the day! ;)

 _EDIT_ : I'm totally looking forward to experienced Lisp and Haskell programmers like me being in high demand for their legendary skills... at invalidating patents!

<comment><USER27> Well if you wrote a program in any Turing complete programming language, you would be done; how "trivial" it is doesn't matter. :)

<comment><USER22> Indeed. By the Church-Turing Thesis, any program written for any Turing Machine (including any Turing-complete language) can be translated into the lambda calculus through a rote transformation.

</comment></comment></comment></comment></comment><comment><USER28> This would overturn every video/audio/data compression patent. Every Encryption Patent. It would over turn every Google Search Ranking Patent. It would limit patents to physical things.

Under that system even many physical devices would not be patent-able. The math that goes in to Battery charging optimization. Silicon Chips would not be able to patent XOR, NOR, OR, Gate logic.

This judge doesn't have the authority to make such changes to patent law.

<comment><USER29> Alas. What a relief that would be.

</comment></comment><comment><USER30> Are algorithms invented, or discovered? Did they, like geometry, exist in a platonic state before human thought? See Neal Stephenson's great ANATHEM.

</comment><comment><USER31> The true problem is obviousness. Any machine is reducible to an algorithm is reducible to an integer. They are all the same. It's ridiculous to say that algorithms are "discovered" and not "made by man".

There needs to be a better procedure for throwing out all the stupid obvious or trivial patents - but allow ones that have required the blood, sweat and tears of their inventor to create.

</comment><comment><USER32> Does anyone know which patent is being asserted here? I thought Uniloc only had one patent, and it was related to try-and-buy DRM. But the description in the article says "processing of floating point numbers by the Linux operating system was a patent violation" which doesn't seem to fit. Is there another Uniloc patent?

<comment><USER33> This is the patent at issue:

> Method and apparatus for handling overflow and underflow in processing > floating-point numbers

[http://patft.uspto.gov/netacgi/nph- Parser?Sect1=PTO1&Sec...](http://patft.uspto.gov/netacgi/nph- Parser?Sect1=PTO1&Sect2=HITOFF&d=PALL&p=1&u=%2Fnetahtml%2FPTO%2Fsrchnum.htm&r=1&f=G&l=50&s1=5,892,697.PN.&OS=PN/5,892,697&RS=PN/5,892,697)

<comment><USER32> Thanks.

But this is still perplexing: Surely, Linux just uses IEEE754 floating point, which predates this patent by 15 years?

<comment><USER34> You would be surprised by the sheer number of idiotic patents out in the wild.

<comment><USER35> a good sample - <http://patently-useless.tumblr.com/>

</comment></comment></comment></comment></comment><comment><USER36> You may not be able to patent math, but certain numbers are still illegal!

<http://en.wikipedia.org/wiki/Illegal_prime>

</comment><comment><USER37> Does this invalidate certain crypto patents, like the NTRU patents or the RSA patent (if it were still in effect)?

<comment><USER38> yes until you append "... as a method for encrypting communications" (an application of said mathmatics)

</comment></comment><comment><USER39> I'm waiting for Uniloc's silly patent 5,490,216 to expire in a couple of years. How can they not even have a reference product sold for this?

</comment><comment><USER40> 'mathematical algorithms' is a little broad.

</comment><comment><USER41> So no more software patents? Or at least no more cryptography patents?

</comment><comment><USER42> Can we not express nearly everything in existence as a formal system?

</comment><comment><USER43> If only the loosing party have to pay for all the legal fees.

</comment><comment><USER44> Does this mean I can use Fountain Codes now?

</comment><comment><USER45> i play world of warcraft iwant an hack for reset server for reset bosses in the server in 2.4.3

</comment><comment><USER46> Page Rank?

</comment><comment><USER47> Oh no, now there's really no incentive to find new ones. We're doomed.

</comment><comment><USER48> I guess Mathematicians will never get rich then :(

<comment><USER49> <http://en.wikipedia.org/wiki/James_Harris_Simons>

<comment><USER48> That's a Wall Street guy. What is your point? Everyone go to Wall Street and contribute to society in a positive way? :)

<comment><USER49> Now, actually follow the wikipedia link and read it, to see Simons is a professor of maths with important contributions to the math behind string theory.</comment></comment></comment></comment>


Facial Recognition Software Predicts Criminality, Researchers Say - <AUTHOR> https://cacm.acm.org/careers/244713-facial-recognition-software-predicts-criminality-researchers-say/fulltext <comment><AUTHOR> (The referenced article on ACM's website has since been withdrawn from publication: [https://medium.com/@CoalitionForCriticalTechnology/abolish-t...](https://medium.com/@CoalitionForCriticalTechnology/abolish- the-techtoprisonpipeline-9b5b14366b16))

</comment><comment><USER2> When they say that there is no racial bias, do they mean that one race is no more likely to be tagged criminal than another? Or that the likelihood matches empirical likelihoods?

The fact that that question would come to any reader's mind is probably why (if baylearn is correct) the article has been withdrawn from publication.</comment>