Nano ID:  A tiny, secure URL-friendly unique string ID generator for JavaScript - <AUTHOR> https://github.com/ai/nanoid <comment><USER4> For years already I've been using UUID v4 (generated from a good random source) then base64url encoded, resulting in a 22 characters/bytes long identifier.

The nanoid implementation does not really bring anything new to the table except having fewer SLOC (which I personally don't find important). It is also incompatible with [https://tools.ietf.org/html/rfc4648#section-5](https://tools.ietf.org/html/rfc4648#section-5) for no good reason. It is noticable again and again that devs publishing to npm are not up to snuff, I wish I knew why, as this does not happen with other dynamic languages/their code repos.

<comment><USER5> Good points but this comment reeks of arrogance. It absolutely does occur in other languages, why would you assume it doesn't?

<comment><USER6> To be fair, most other high level languages have functions in their stdlib to do common stuff like hashing, generating unique id, getting data from the OS random generator, etc.

JS stdlib has always be lacking in almost every possible aspects, and hence people have to reinvent the wheel again and again.

</comment></comment></comment><comment><USER7> I would still use uuid v4. Databases support this data type and reduce its storage needs. You can also compact it if it is too long for your use case or you like to save traffic.

<comment><USER8> But that goes against the modern principle of reimplement everything.

<comment><USER9> How are we supposed to learn anything if we never try to do it ourselves?

<comment><USER10> If you want to learn how UUIDs work, implement the standard.

<comment><USER9> This isn't about UUIDs. I think the project creator in the OP was just learning lower level things like working with randomness and bytes... I don't see the problem. Experimenting is fun. Leave them alone.

<comment><USER11> A bad a excuse for a bad library. See this time and time again in NodeJS though.

<comment><USER12> This is a good library.

<comment><USER10> However pretty, I wouldn't use something non-standard for generating IDs unless I was doing something embedded which required careful memory management under hardware constraints, where I most definitely wouldn't be using JS.

<comment><USER10> @dchest So you frequently use varchar for your table index?

<comment><USER12> Why do you need VARCHAR? If you use SQL, you can use a fix char type to store fixed-length random strings as IDs. If you use SQL which supports native UUID type, sure, go ahead and use it. But the world is not limited to SQL databases or even any databases.

In three project I'm working on right now, two identify objects by content HMAC (one of them uses an SQL database), the other uses a mix of incrementing integers and a random string for different use cases.

<comment><USER10> > two identify objects by content HMAC (one of them uses an SQL database), the > other uses a mix of incrementing integers and a random string for different > use cases.

If those two are using SHA-1, like git, you are still using a standard. The third one however sounds like a potential mess.

<comment><USER12> _If those two are using SHA-1, like git, you are still using a standard_

Lovely, so I can officially claim I use a _standard_ that is required by many commenters here if I just hash random bytes! Should I use a NIST-approved standard or maybe GOST hash function will work? Can I use the output of ChaCha20? If so, I'll be happy to read 16 bytes from /dev/urandom.

 _The third one however sounds like a potential mess._

Thanks for your analysis!

<comment><USER10> > Lovely, so I can officially claim I use a standard that is required by many > commenters here if I just hash random bytes!

Stop pretending that you don't understand what a cryptological hash function is, or that using a strong crypto function is the same as rolling your own, or that using the hash function on your input is the same as running it on random bytes.

> Thanks for your analysis!

Thanks for the anecdotal evidence.

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER13> > _`random % alphabet` is a popular mistake to make when coding an ID > generator. The spread will not be even; there will be a lower chance for > some symbols to appear compared to others—so it will reduce the number of > tries when brute-forcing._

I don't understand: is the default implementation of random in node.js flawed? Surely it should produce a uniform distribution…

edit nevermind, found the link to [https://gist.github.com/joepie91/7105003c3b26e65efcea63f3db8...](https://gist.github.com/joepie91/7105003c3b26e65efcea63f3db82dfba) just above that paragraph

<comment><USER14> 0,1,2,3,4 % 3

0 => 0

1 => 1

2 => 2

3 => 0

4 => 1

So, a uniform input will produce more 0s and 1s than it will 2s.

<comment><USER15> Only if the alphabet size is not a multiple of two.

<comment><USER14> More generally, only if your input is an integer multiple of your alphabet.

However, there are methods of converting uniform distributions that will preserve uniformity. I'll have to find a good reference.

<comment><USER15> Well, it's obvious for me.

Issue is that the root reply seemed to have taken it as a JS implementation issue (due to math.random) as it's quite obvious why you should not do the modulus (or when you can), if you know the underlying maths.

So did I, as a matter of fact.

You - on the other hand had given the answer to the wrong confusion.

<comment><USER13> > _Issue is that the root reply seemed to have taken it as a JS implementation > issue_

I'm the root reply. jimktrains2's explanation exactly addressed my confusion.

To get a uniform distribution over an alphabet from random, I would do:

        var bucket_size = (random.MAX_VALUE - random.MIN_VALUE) / count(alphabet)
        return alphabet[random/bucket_size]

<comment><USER14> Actually, that doesn't work either

max = 4, min = 0, count = 3

bucket_size = 4 / 3

0,1,2,3,4

0 / (4/3) = 0

1 / (4/3) = 3/4 = 0

2 / (4/3) = 6/3 = 2

3 / (4/3) = 9/4 = 2

4 / (4/3) = 12/4 = 3 = invalid index

but even if you adjust this to count - <USER3>

bucket_size = 4 / 2 = 2

0 = 0/2 = 0

1 = 1/2 = 0

2 = 2/2 = 1

3 = 3/2 = 1

4 = 4/2 = 2

So, 0s and 1s are still more likely than 2 to appear.

One of the easiest, and slowest, ways is just to discard any trial in which your uniform RNG generates a number above the largest index and try again.

For a larger alphabet, you essentially just collect multiple trials, treat them as a single trial, and do similar tactics.

<comment><USER13> > _bucket_size = 4 / 3_

I have an off-by-one error… your random function has a range of 5, so it should be max - min + 1:

        bucket_size = 5 / 3

then

        0 / (5/3) = 0
        1 / (5/3) = 3/5 = 0
        2 / (5/3) = 6/5 = 1
        3 / (5/3) = 9/5 = 1
        4 / (5/3) = 12/5 = 2

> _So, 0s and 1s are still more likely than 2 to appear._

Yeah, I planned for 65535 randoms and 52 alphabet. It would still mildly bias to the first range mod alphabet_size elements.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER16> I really like the ulid library. Does what I want, compact representation, and lexicographically sorting ulids in time order is great. The character subset is URL friendly, so this is my go-to when I'm making nonces if I am not worried about super-double-secure prngs.

[https://github.com/alizain/ulid](https://github.com/alizain/ulid)

</comment><comment><USER17> I like that this generates the ID directly by choosing random symbols.

But I don't like that it's equivalent to UUID v4 but different. The difference doesn't buy anything significant over the standard.

With a pretty small change this could directly generate base64 encoded UUID v4 (without going through a two-step process of generating a UUID and then encoding it: Most characters could be generated randomly from the base64 alphabet. The characters at certain indexes would need to use a restricted set of base64 characters to set certain bits to the values specified by UUID v4.

</comment><comment><USER18> For a toy project, I'm currently using a 64-bit integer of which the first bit is a sign bit (I'm using Postgres' bigint), the next 32-bits make a UNIX epoch timestamp in seconds, and the rest of the 31 bits make a random number. In this way, the ID is very easily sortable by time, although it's a bit of a gimmick.

The scheme allows for 2 billion possible records per second, although if you consider birthday collisions, it comes down to a lot less (but I could re- insert on duplicates). I could later also use some of the random bits to inscribe extra data into the ID.

The bits from the two halves are then interspersed to make sure the first half looks random, and transformed to a 11-character id, for example /^[0-9A-Za-z]{11}$/. I can reject some IDs beforehand if they match a list of bad strings. The result is receiving an id such as "Vxe61yU5Cci" or "WgOUBEO88gb".

<comment><USER19> What happens in 2038? I hope you're never representing those 32 bits of UNIX timestamp as a signed integer anywhere. If you're making sure to always keep it unsigned, what happens in year 2106?

EDIT: I'm not criticizing you, and a valid counter argument would be that you make absolutely sure to always store the timestamp unsigned, that it doesn't need to work until 2106 because it's a toy project, or that an overflow wouldn't really matter because you make sure to keep it unique even after an overflow, but I get scared any time storing a UNIX timestamp in 32 bits is mentioned, and am wondering if you've considered it.

<comment><USER20> > but I get scared any time storing a UNIX timestamp in 32 bits is mentioned

You're scared because an average app hasn't considered a problem that's 21 years off? Seems like a premature worry

<comment><USER21> > You're scared because an average app hasn't considered a problem that's 21 > years off? Seems like a premature worry

'Those who cannot remember the past are condemned to repeat it.'. --George Santayana

<comment><USER20> Yeah? Did people need to prepare for the y2k bug in 1979?

<comment><USER19> Well yeah, weren't a lot of the broken systems big cobol systems from that era?

You never know what software ends up being still used for critical systems 20 years down the road, so it's stupid to knowingly make a new system which is guaranteed to break in 20 years.

That said, it sounds like this guy has thought about it, and is making sure to use all 32 bits to store the timestamp.

</comment></comment></comment></comment></comment></comment><comment><USER22> Wait so `%` is bad but `& 63` is fine? Ain't you doing a mod as well??? It's just that you have power of two (64 in this case) that you are trying to exploit here... anyone who knows basics of computer science can tell you it's same! If it's about reducing code size I can demonstrate smaller code:

module.exports = function (size) {

      return random(size || 22)
               .map(r => url[r & 63])
               .join('');

};

I am always disappointed to see these kind of packages, as mentioned somewhere in comments above

> It is noticable again and again that devs publishing to npm are not up to > snuff, I wish I knew why, as this does not happen with other dynamic > languages/their code repos.

And I totally agree!

<comment><USER12> Check the code below:

          var masks = [15, 31, 63, 127, 255]
          ...
          var mask = masks.find(function (i) {
              return i >= alphabet.length - <USER3>
          })
          ...

          var byte = bytes[i] & mask
          if (alphabet[byte]) {
            id += alphabet[byte]

Masking results in a random uniform number that is a power of two and greater or equal than the alphabet length and then indexes that are greater than alphabet length are rejected, which is a common way of avoiding modulo bias.

 _I am always disappointed to see these kind of packages, as mentioned somewhere in comments above_

Because you didn't understand how it worked and assumed that it's bad?

<comment><USER23> I believe the criticism here is about index.js, which is what all the other claims are about.

      var bytes = random(size)
      for (var i = 0; i < size; i++) {
        id += url[bytes[i] & 63]
      }

This part of the code just uses an alphabet size of 64, which makes the approach actually used in the exported function identical to modding the byte by the alphabet size.

<comment><USER12> Yes, with a power-of-two alphabet length there's no bias. The poster seems to be confused about modulo bias claims, which apply to non-power-of-two alphabets, not a particular way of calculating modulus.

</comment></comment></comment></comment><comment><USER12> My version: [https://gist.github.com/dchest/751fd00ee417c947c252](https://gist.github.com/dchest/751fd00ee417c947c252)

<comment><USER12> (replying to myself as I can no longer edit:) My favorite feature in it is .entropy(n) method: when you want some fixed amount of unpredictable bits, but don't want to calculate how long the random string should be in your encoding to contain that many bits.

</comment></comment><comment><USER24> I designed something similar (in terms of URL-friendliness), but for distributed systems:

[https://github.com/AltusAero/bronze](https://github.com/AltusAero/bronze)

It's designed for use cases where collision-resistance (both time-based [UUID1] and random [UUID4]) is valued more than the size of the id. Can be used as a module (Node.js & browser) and via CLI.

</comment><comment><USER25> Silly question, why js not provide method generate uuid without library? I mean this is 2017. One method without param input, wont hurt anybody

<comment><USER12> UUID is a misguided standard that should have been killed long ago if not for compatibility reasons, so I'm glad it's not in JS.

</comment></comment><comment><USER26> I wrote a Python version of this six years ago, it's been working beautifully and I use it for IDs in all my APIs:

[https://github.com/skorokithakis/shortuuid](https://github.com/skorokithakis/shortuuid)

That way, elements are neither enumerable nor guessable.

</comment><comment><USER27> tilde (~) doesn't looks a wise choice to me as may have special meaning in certain context, fortunately the alphabet are redefinible. i would also prefer if at least some part fo the nanoid would be machine dependent. anyway, it works :)

</comment><comment><USER28> If you need a function that returns integers in some range [0..n) equiprobably, just write that. Why conflate a bunch of concepts and have weird limitations?

Oh, and by the way, fuck HN for deleting comments.

</comment><comment><USER29> You can also check [https://github.com/dylang/shortid](https://github.com/dylang/shortid)

<comment><USER30> This is a perfect example of what _NOT_ to do. They reimplemented a seeded linear congruential generator for their random number generator:

[https://github.com/dylang/shortid/blob/master/lib/random/ran...](https://github.com/dylang/shortid/blob/master/lib/random/random- from-seed.js)

But since LCGs are easy to solve, after seeing a few values you can solve for the seed and generate all past and future values.

But you don't even need to do anything fancy for that. Since their implementation of LCG only has a state size of 233280 different values, you can just brute force it. (also means that their rng could only ever generate 233280 different numbers to begin with)

Why the fuck do they have 2.5k stars!?

EDIT: They already have an open issue for it but project seems unmaintained: [https://github.com/dylang/shortid/issues/70](https://github.com/dylang/shortid/issues/70). Stay far far away.

<comment><USER29> You're absolutely right, and this is huge...

</comment></comment></comment><comment><USER31> How does it compares to hashids ([http://hashids.org/](http://hashids.org/))?

<comment><USER32> Hashids are reversible mappings to/from integers. Nano IDs are random strings.

</comment></comment><comment><USER33> String generated using default parameters has ~0.1% chance of containing four letter english profanity.

<comment><USER34> I'd consider that a feature not a bug :).

</comment></comment><comment><USER35> what about uuid, a well researched and established standard?

<comment><USER36> UUIDs are not secure unless they are version 4 (random) and generated from a secure randomness source.

<comment><USER37> The same applies for any unique ids in general.

<comment><USER12> Yes, but _the holy UUID standard_ specifies multiple ways of generating them from sticks and stones, invented before people knew how to properly generate random bytes.

</comment></comment></comment></comment><comment><USER38> Why wouldn't this be a one-liner?

<comment><USER12> It would be a pretty long line, containing a function wrapping crypto.randomBytes, window.crypto.getRandomValues, window.msCrypto.getRandomValues selected at runtime, and then a few lines to select characters avoiding modulo bias. Try?

<comment><USER19> That sounds like a pretty interesting code golf-ish challenge actually, would attempt if I had more than 3% battery on my laptop atm :(</comment></comment></comment>


How does distance affect acquisitions? - <AUTHOR> http://sansovi.ch/2014/03/27/acquisitions-geographical-locations.html

<comment><USER2> Before making conclusions, this graph needs to be controlled for at least one outside factor: the overall geographic distribution of companies.

If one were to take the complete bipartite graph of [All Startups, All Fortune 500s] and plot the distances between connected vertices, I would not be surprised to find a distribution graph similar to the one shown above. Most companies are in population centers, and most population centers are on the coasts.

I have no reason to doubt that the subset of that graph that contains acquisition relationships is, in fact, more heavily skewed towards proximity. But, that is currently a conjecture, and the data does not support the conclusion (although it does not disprove it, which is something).

<comment><USER3> Exactly. Poor analysis. It basically says "Things happen either on the west or east coast, and they particularly happen in SF". Yeah, we kind of knew.

</comment></comment><comment><USER4> Distance/proximity is, from my experience, one of the largest factors you can control for your startup. Not specifically for acquisitions but also for sales (if you're B2B).

I've done two startups in the same space. The first was located in Cincinnati, OH and my current one in SV. They are frighteningly similar though the space has changed dramatically.

It depends on your market to know where the optimal location is for fostering relationships. Hint: it's not always SV (though it often is).

You hear it time and time again that relationships happen very serendipitously. And by serendipitously I mean you meet someone in a coffee shop that will later introduce you to someone that changes the course of your start-up forever.

The depth of the network in SV is extremely deep. My experience in Cincinnati (albiet 8 years ago) was that it wasn't as serendipitous and it wasn't nearly as deep. Things may have changed and in places like NYC it might actually be similar to SV.

My $.02 is that relationships are critical. Making location equally critical.

</comment><comment><USER5> This is interesting, but I'd love to see an analysis that proves some sort of treatment effect of colocation.

Zynga has acquired 20+ companies on crunchbase. Is Zynga biased towards acquiring companies in the bay area, or are companies that Zynga would be inclined to acquire mostly located in the bay area anyway? Or is it that bay area startups tend to perform better / receive more funding than their non-bay counterparts?

<comment><USER6> If you've ever played a German-style game like Puerto Rico or Catan, you're familiar with the concept of needing a set of resources, all at once, to advance.

The Bay Area has capital, talent, customers, users and (most of all) clueless corporate executives who will acquire anything, rescuing the careers of even the most brazenly failed founders. You're not taking much of a risk because everything is there.

Other regions have some or most of those resources, but the VC is skewed heavily in favor of the Bay Area and that shows no signs of abating. NYC venture capital exists, but there's even more pedigree-whoring in that scene (mostly favoring MBAs and banking flame-outs) than in SV.

I don't like that it's that way, but it is. If you want to do a startup, you're best off to be there.

</comment></comment><comment><USER6> One thing that is really hurting tech (as we see, in the distribution of capital and acquisitions) is _placism_. It's not good for the advantaged places (San Francisco and possibly New York) nor for the 99% of the country that's losing out.

VCs (the only investors in this game, sadly, because bank loans require personal liability, precluding anything that has any real risk) assume that if you're not in the Bay Area, you're not serious because "all the talent" wants to be there. It causes a vicious cycle. You hear a lot of murmuring about second- or third-tier hubs picking up when, in reality, things are probably the _most_ skewed they've ever been.

It's not healthy for all the innovation to be allowed only in one area. The real investors (the people with the money) don't care where their money is spend as long as it makes a profit. But we have a system that forces people to compete for scarce space in what has become a congested and hideously overpriced part of the country... even though rent and living costs exert a gigantic drag on new business formation.

The only people who win under placism are VCs, big-city landlords, and HR departments (because they can look at a resume and evaluate it based on geography).</comment>


Comcast preps gigabit internet that works with regular cable - <AUTHOR> http://Uhttp://www.wired.com/2016/04/comcast-offers-fiber-speeds-coax-thanks-new-modem/ <comment><USER2> Being able to push more bits over existing infrastructure with DOCSIS 3.1 is welcome but I'm skeptical that this will really change broadband networking the U.S. They're only matching Google Fiber's pricing and locations so they're not expanding broadband's accessibility geographically or financially.

Even when they expand it to other locations it will be where they already offer their existing broadband options and in most locations they have no competition offering what FCC defines as "broadband" (25Mbps/3Mbps). In my city, Comcast's "Performance" broadband (about equal to the FCC's definition) alone costs as much as Google Fiber's gigabit + TV, when they roll out gigabit over coax, will it just be a higher than "Blast" tier that's too expensive for most? Comcast already offers symmetrical gigabit in many regions but it's $299/month [0]. I assume it requires running fiber because you have to live within 1/3 mile of their fiber network and they charge "up to $500 for installation and up to $500 for activation."

[0] [http://www.xfinity.com/multi-gig- offers.html](http://www.xfinity.com/multi-gig-offers.html)

</comment><comment><USER3> The submitted link has the "[http://"](http://") replaced with "uhttp//". Here is the correct link:

[http://www.wired.com/2016/04/comcast-offers-fiber-speeds- coa...](http://www.wired.com/2016/04/comcast-offers-fiber-speeds-coax-thanks- new-modem/)</comment>


Is md5() secure or do you also use salts? - <AUTHOR>

Probably a stupid question, but I can't seem to find a definitive answer.  My understanding is that md5() is currently vulnerable to rainbow tables, so you should always salt your passwords? <comment><USER2> Generate a random 256-bit salt, and compute H = HMAC-SHA256(salt, password). Then compute K = 2^H mod P where P is the Diffie-Hellman group #14 modulus 2^2048 - 2^1984 + 2^64 * floor(2^1918 pi + 124476) - 1, and store (H, K).

At least, that's how I do it. A nice, expensive computation -- not only expensive in software, but also expensive for custom silicon, since 2048 bit modular exponentiation needs a lot of gates -- and as an added benefit you can do password verification using DH and thereby separate the password from its verifier.

EDIT: Ok, that's not quite how I do it. I actually compute K = 2^(2^258 + H) mod P, because I can do that using two exponentiations with blind exponents. But that's just me being paranoid about side channel attacks.

<comment><USER3> So, in other words, you do SRP, but you don't want to call it that.

Suggesting that people invent new cryptographic protocols to solve the password storage problem, which has been solved adequately tens of times over now --- whether or not the person you're addressing knows the difference between MD5 and SHA1 --- is just about the worst conceivable advice you could give.

</comment></comment><comment><USER3> "Salted" hashes aren't enough either, and the problem has little to do with the algorithm --- MD5, SHA1, and SHA256 are all problematic. Here's everything you need to know:

[http://www.matasano.com/log/958/enough-with-the-rainbow- tabl...](http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what- you-need-to-know-about-secure-password-schemes/)

</comment><comment><USER4> I can't see anyone justifying not using salts by claiming space savings or processing overhead. Just use decent salts and SHA1 and you will be fine.

<comment><AUTHOR> by "decent" do you mean in length of 9 characters? is that ideal?

</comment></comment><comment><USER5> You have to use salts.</comment>


Impact of wealth and status on opposite sex ratings of attractiveness - <AUTHOR> http://www.ehbonline.org/article/S1090-5138(17)30315-X/fulltext <comment> T-A Goes well together with

[http://www.ehbonline.org/article/S1090-5138(16)30128-3/fullt...](http://www.ehbonline.org/article/S1090-5138\(16\)30128-3/fulltext)</comment>


The Command-Line Office - <AUTHOR> http://ebeab.com/2014/03/04/the-command-line-office/

<comment><USER2> The author of this article uses pass [1] for password management. I'm the author of pass, if anyone here has any questions.

[1] [http://www.zx2c4.com/projects/password- store/](http://www.zx2c4.com/projects/password-store/)

<comment><USER3> I eventually want to make a GUI equivalent as I learn to program, and had some other ideas that you have inspired as I try to get back to programming.

THANK YOU! I love your tool and it is one of my favorite tools. I check your git for other cool stuff as I stumbled upon your stuff many times.

Question: would you want to add a parameter to escape non-aplhanumeric characters? It took me a while of playing to figure out how to get mutt to handle my very complex IMAP passwords.

For anyone who cares, I do it with sed.

set my_pass=`pass firstname.lastname@example.com | sed 's/[[:punct:]]/\\\&/g'`

#

<comment><USER4> how about

        set my_pass="`pass email@example.com`"

[edit] Looks like this is a muttrc line not a sh line. Sadly I don't think muttrc supports the far superior $() expansion..

<comment><USER3> I tried this and it does not work. And yes, mutt does not support $() escaping.

</comment></comment></comment></comment><comment><USER5> I'm a big command line fan, but vi/emac/nano are not word processors. They're text editors.

You might be able to get close if you are using them to edit Markdown and running it through Pandoc (especially if you add in a non-commandline PDF viewer). But still.

WordPerfect 5.1 - now that was a curses/command line word processor :) I don't know of a modern equivalent though.

<comment><USER6> What is your definition of "word processor"? Emacs + auctex? Emacs + orgmode? Words are text.

Do you feel better if section headings are bigger and take up more space than the text you are supposed to be working on:

latex: [https://i.stack.imgur.com/etFst.png](https://i.stack.imgur.com/etFst.png)

org-mode: [http://blog.nozav.org/public/images/tangotango_org.png](http://blog.nozav.org/public/images/tangotango_org.png)

org-mode with pd preview: [http://i1.ytimg.com/vi/lsYdK0C2RvQ/maxresdefault.jpg](http://i1.ytimg.com/vi/lsYdK0C2RvQ/maxresdefault.jpg)

Or is emacs excluded from being a word processor because you can also use it for powerpoint presentations: [http://salomie.ro/tudor/wp- content/uploads/2010/10/orgmode_p...](http://salomie.ro/tudor/wp- content/uploads/2010/10/orgmode_presentation.jpg)

<comment><USER5> Well Emacs can almost but not quite be everything of course.

But this is a pretty common distinction, surely?

Words are text, but word processors have historically been focused on preparing documents for printing (or nowdays viewing a visual representation of a printed document onscreen, eg PDF).

They handle differing visual layout (fonts, page breaks, margins, indenting). They are softwrapped and paragraph based not line based. Often they deal with formatting through styles - headers, bullet points, numbering. They usually handle inclusion of tables, images and other non-text elements.

The most common example of a word processor, Word, also handles collaborative writing with tracked changes and notes, and has inbuilt features such as on the fly word count, spelling and grammar checks.

As I said, for a command line word processor look at WordPerfect for DOS or equivalent.

What you are saying (and it is not entirely wrong) is that you can approximate a word processor by matching a text editor with a bunch of other programs (TeX, Pandoc, aspell etc). But that doesn't make the text editor a word processor.

<comment><USER6> The unstated distinction you are making is between a program a novice can use for word processing and a program that requires some level of experience. I will grant that ed/edlin/nano are not word processors. But excluding emacs from the category is just as absurd as including ed.

Have you used emacs in the past decade? Some of your requirements are laughable. Softwrapping? visual-line-mode has been baked in since 23. Word count? wordcountmode. Tables? I will take orgtbl mode over the libreoffice/ms- word interface any day. Bullet points? Nothing comes close to orgmode for manipulating/moving/adding bullet points.

Apple's Pages did not get "track changes" until 2012. Was it just a text editor prior to that?

Sidebar: It is kind of funny that you like WP 5.1 and are a lawyer. Were you ever a lawyer in the states? The only people I have ever heard gush over WP5.1 were lawyers. I never realized the fetish was global.

<comment><USER7> WordPerfect was great because it was essentially a text editor with a markup language. When formatting wasn't coming out quite right it could be debugged easily with by pressing the key to "reveal codes".

The other thing that made WordPerfect great was their technical support. Free and unlimited over the phone...and they new what they were talking about and if it was a genuine bug, they would have an engineer call you back on their dime. Or at least that's what happened when I found a bug in Summer of 1992.

Microsoft Word buries its formatting. Sometimes it's easier to just nuke a file to text and reformat the whole thing than to try to solve conflicting formats overlapping.

<comment><USER8> You need a ruthless discipline to use Word in anger, do everything through styles and nothing "manually" otherwise it all goes to hell. Unfortunately Word makes it all too easy to do.

<comment><USER9> Which makes it nearly impossible to collaborate with other that don't think like that.

It seems like nobody I work with even knows what styles are.

</comment></comment></comment></comment></comment></comment></comment><comment><USER10> This is convenient timing for me. I was just thinking about dual booting to a stripped down cli only arch install on my netbook for fun. I hadn't even thought about having some basic spreadsheet functionality.

Should be interesting to mess around with.

Not an office app, but I think tmux is probably my favorite all around need- to-have, for when I'm working cli only.

edit: this also makes me think it wouldn't be too hard to write an excel as a service layer on a normal windows machine, then use the cli comp to interface with it. You wouldn't get the fancy formatting, but you could pretty easily get the calculations and such, as well as some basic formatting. Also not tough to make it save itself and send it out via outlook or whatever you want. Without all the nutty formatting, the data transmission could be pretty light weight. Wonder if anyone's done that. Might screw around with it if I have spare time

<comment><USER11> Using a cli for everything is an extreme proposition! You'll probably get tired of it quickly and choose to add some fullscreen text mode programs to the mix, like vim or emacs. For a "full featured" console environment, add some programs that use the frame buffer to display images, you can probably setup your netbook to be pretty serviceable without installing a windowing system at all.

<comment><USER10> Yeah; I use vim as my editor of choice (outside of my job which is actually .net, heh).

I have other computers I use a lot, and I'd never 100% give up on gui's. Mostly I'd be setting up an environment that boots quickly, reduces background processes, and gives me a nice retro place to code in when I'm tooling with haskell or c. I also like having an environment that I've fully optimized for keyboard only.

The excel part would just be an interesting convergence of what I do at work with windows, and what I use mostly at home.

I've never messed with frame buffers in terminal; that'd be really interesting. Maybe I'll see if I can get to something more fully functional after all. I've always gone pretty much easy-mode when it comes to linux. I want to get more hands-on with the distro

<comment><USER12> >Yeah; I use vim as my editor of choice (outside of my job which is actually .net, heh).

In case you haven't seen it: ViEmu is a great addon for Visual Studio.

</comment></comment></comment></comment><comment><USER13> The author seems to be advocating text mode, not strictly command-line. Editing files with sed is command-line; editing them with vi or emacs or nano is not.

<comment><AUTHOR> Maybe terminal is a better phrase I should of used than command-line, or maybe non-X or non-Windowing environment

<comment><USER4> Text-mode is the term I use; I've heard "TUI" used as well. Non-windowing isn't a good name since I think this is clearly windowed: [http://superuser.com/a/323614](http://superuser.com/a/323614)

</comment></comment></comment><comment><USER14> I've finally hit upon an electronic calendar scenario I am happy enough with to try for a few months. I use calcurse, with the main directory for daily, and subdirectories for Weekly, Monthly, Quarterly, and Yearly.

I have aliases defined to reach these subdirectories because I am lazy:

           # calcurse stuff
    	export Week='-D .calcurse/Weekly'
    	export Month='-D .calcurse/Monthly'
    	export Quarter='-D .calcurse/Quarterly'
    	export Year='-D .calcurse/Yearly'

I use tmux and a startup script to open daily, weekly, and monthly

      #!/bin/bash
    	# Start a session named cal, name the window "Day",
    	# pane.  Detach the session for the setup process.
    	tmux new -s cal -n Day -d
    	# Create second window named "Week", split it and      select left pane
    	tmux new-window -t cal:1 -n 'Week'
    	# Create a third window named "Month", split and select left
    	tmux new-window -t cal:2 -n 'Month'
    	# Load the calendars
    	## Note ^M and Enter seem to do the same thing
    	tmux send-keys -t cal:0 'calcurse' ^M
    	tmux send-keys -t cal:1 'calcurse $Week' ^M
    	tmux send-keys -t cal:2 'calcurse $Month' Enter
    	# Select window 0 and re-attach the session so we can reach it.
    	tmux select-window -t cal:0
    	tmux attach -t cal

Now I can set up tasks and priorities, and update according to the work plan. Share via rsyn. And not dependent on the cloud (I can rsync to a stick). Drawback; it is not integrated with Evolution or Thunderbird.

<comment><USER14> Just for future record, the script I actually use has _two_ returns at the end of the send-keys lines

            tmux send-keys -t cal:0 'calcurse' ^M  ^M
    	tmux send-keys -t cal:1 'calcurse $Week' ^M ^M
    	tmux send-keys -t cal:2 'calcurse $Month' Enter Enter

</comment></comment><comment><USER15> This is actually a list of _obscure_ (20 years of Linux use here, and I haven't heard of most of them) command-line utilities. Definitely going to explore calcurse

<comment><USER16> I'd consider aspell and remind to be well known linux tools. Pandoc is more modern, but probably the most widely used markup conversion tool. Gnuplot and matplotlib are both very popular for graphing.

</comment></comment><comment><USER17> Hah. Great article!

Also:

* [https://github.com/sup-heliotrope/sup](https://github.com/sup-heliotrope/sup) for decentralised and lightning fast email. Written in Ruby, very hackable.

* [http://orgmode.org/](http://orgmode.org/) Although I'm a vim user, I use orgmode for: All my todos, clocking hours for clients, spreadsheets for my training, research notes, calendar, anything else that needs organising and planning.

<comment><USER18> How do you use orgmode in vim? I would love to have orgmode in vim.

<comment><USER19> I think timonv uses vim _except_ for orgmode. In any case, there's [https://github.com/hsitz/VimOrganizer](https://github.com/hsitz/VimOrganizer)

</comment></comment></comment><comment><USER20> Roaring Penguin's remind is a great piece of software, it's been a standard for me since around 2000. Don't forget their include files for stuff like holidays and seasons.

<comment><USER4> If you haven't used wyrd, go check it out. You'll thank me later.

[http://pessimization.com/software/wyrd/](http://pessimization.com/software/wyrd/)

</comment></comment><comment><USER21> Also worth looking at: [http://www.ledger-cli.org](http://www.ledger-cli.org)

</comment><comment><USER22> Would be good to add Task Warrior on top of Todo.txt, though.

</comment><comment><USER23> I'm writing a book, in my terminal. Have been for a while now, maybe 6 months, and all done through an amazing application called Wordgrinder. An old version should be in your distros repository (I know it's in Debian anyway). It's awesome to boot up to TTY1 and just start writing, no distractions possible. It's also entirely written in C and Lua so it's quite fun to hack on as well.

</comment><comment><USER24> Shameless plug for more terminal-based slide/presentation software: now with fading, 256 colour transitions and experimental PDF export!

[http://github.com/jclulow/vtmc](http://github.com/jclulow/vtmc)

<comment><USER25> Here's another: deck, a Go package for presentations

[http://github.com/ajstarks/deck](http://github.com/ajstarks/deck) [https://speakerdeck.com/ajstarks/deck-a-go-package-for- prese...](https://speakerdeck.com/ajstarks/deck-a-go-package-for- presentations)

</comment></comment><comment><USER26> I was totally unaware of sc. My spreadsheeting life just got immeasurably better.

<comment><USER27> it was very famous 20 years ago when X configuration required complex frequency calculus.

<comment><USER4> Fun fact: The first time I tried ubuntu, in order to get my monitor working at its highest resolution I had to add a modeline to my xorg.conf

I had been previously using gentoo, where I selected the resolution from a gui. The difference was seems to be ubuntu adopting nouveau a bit earlier than they should have.

</comment></comment></comment><comment><USER28> Or, how to live in UNIX System V, CP/M and MS-DOS days.

<comment><USER8> The good old days, I call 'em!

</comment></comment><comment><USER29> For me, the big one missing would be Skype. There seems to be a command line client called Clisk though, so perhaps that might be worth checking out.

</comment><comment><USER30> shameless plug: if you want terminal calendaring with CalDAV support you might want to try khal [0], it's still in an early stage of development but it already seems to work well enough for quite a bunch of people.

[0] [https://github.com/geier/khal/](https://github.com/geier/khal/)

</comment><comment><USER31> taskwarrior !</comment>


Startup Quote: Jeff Clavier, managing partner, SoftTech VC - <AUTHOR> http://startupquote.com/post/4545661784

<comment><AUTHOR> Making mistakes of all types and consequences is part of an entrepreneur's journey, the only real failure is not trying.

\- Jeff Clavier (@jeff)

<http://startupquote.com/post/4545661784></comment>


People with high IQs really DO see the world differently - <AUTHOR> http://www.dailymail.co.uk/sciencetech/article-2331580/People-high-IQs-really-DO-world-differently-Researchers-process-sensory-information-differently.html

<comment><USER2> This is the Daily Mail re-hashing a BBC article, but the BBC article kind of missed the point. That article hit the front page of HN about a week ago. Daily Mail's article was just amazingly shallow with no new information.

Original paper:

[http://www.cell.com/current- biology/retrieve/pii/S0960982213...](http://www.cell.com/current- biology/retrieve/pii/S0960982213004946)

Some non-paywalled info:

[http://www.bcs.rochester.edu/courses/crsinf/151/13_CenterSur...](http://www.bcs.rochester.edu/courses/crsinf/151/13_CenterSur_2per.pdf)</comment>


Impala: Scalable Distributed Deep Reinforcement Learning - <AUTHOR> https://deepmind.com/blog/impala-scalable-distributed-deeprl-dmlab-30/ <comment><USER3> The name is taken [https://impala.apache.org/](https://impala.apache.org/) . Both are "distributed and scalable".

<comment><USER4> This is typical Google/DeepMind ignorance. The rest of the world is non-exist.

<comment><USER5> I believe it started with Golang, where Go was already an existing language by a hobbyist - granted nobody was using it kinda lame to steal his name.

<comment><USER6> Go was taken by ancient China before that.

<comment><USER7> maybe the game itself but the name is derived from Japanese, fairly recently

</comment></comment></comment></comment></comment><comment><USER8> I love the different yet similar 3D environments for RL agent learning. OpenAI has a similar environment they call OpenAI Gym[1] to train agents, of which RoboSchool is the closest environmental[2] analogy to DMLab-30.

From a cursory glance, DMLab-30 levels are based on id's code, while RoboSchool uses a full-blown physics engine (Bullet[3]).

Pretty exciting times!

[1] [https://gym.openai.com/envs/](https://gym.openai.com/envs/)

[2] [https://blog.openai.com/roboschool/](https://blog.openai.com/roboschool/)

[3] [https://pybullet.org/wordpress/](https://pybullet.org/wordpress/)

<comment><USER6> These game environments are the sandbox where AI agents need to play in order to learn and evolve. Just like human children need to play, RL agents have the same need. There is a fundamental difference between learning statistical patterns from a fixed dataset (supervised learning) and learning by interactivity and exploration (reinforcement learning), where the agent can create and test hypothesis, thus gaining causal inference powers.

A simulator is an unlimited, dynamic dataset, so much more than, say, ImageNET or even Wikipedia. The ability of an agent to create its own predictions about the evolution of the environment is essential in planning and reasoning. That's how we get to be so smart - we have a mental simulator we can apply to any situation to check what the outcome would be. When agents learn to do the same, they too can become smart. AlphaGo for example was doing that - <USER2> ahead (MCTS) and that's how it beat us at Go. A simple neural net without planning wouldn't have beaten the best humans.

I think simulation is going to be the next ingredient we add to AI to make it learn and reason like humans. It's the missing ingredient we need, that combined with RL will lead to the next breakthrough.

</comment></comment><comment><USER9> Reddit discussion with paper authors.

[https://www.reddit.com/r/MachineLearning/comments/7vkvg5/r_i...](https://www.reddit.com/r/MachineLearning/comments/7vkvg5/r_impala_scalable_distributed_deeprl_with/)

Learns a policy. Transfer learning using "v-trace". Improves on A3C.

</comment><comment><USER10> Imagine a swarm of small robots, say drones with sufficient compute power on board.

If I understand the repercussions of this correctly, could this be applied so that the swarm be able to learn from the mistakes of a single individual?

<comment><AUTHOR> Yes, but only if they are dispersed and not in a swarm. Once the agents are interacting with each other in the swarm, the usual RL methods slow down because now the 'environment' looks like it's changing every timestep (because your fellow robots are executing slightly different policies than you and your policy has been learned on the assumption of older policies).

But of course there are various RL algorithms for dealing with having multiple interacting agents, for example, for Starcraft environments (in SC, there's only one player/mouse/keyboard, true, but the idea there is that multiple- agent RL methods have the advantage of, instead of learning one giant master NN to do everything, you can let individual smaller NNs control a few or just one unit and then they can coordinate for attacks).

</comment></comment><comment><USER11> Really like how V-trace reduces to A3C when on-policy. Quite elegant, but it's unfortunate they don't give results on continuous tasks.

</comment><comment><USER12> Would it be feasible for me to run their learning avatar at home? giving it tasks to learn that i assign it?

Or do you really need a server farm for this?

<comment><USER13> If you allow untrusted users to define tasks for shared agents, then you must assume you will have malicous or incompetent users defining 'poison' tasks. These would be tasks that bias agents toward taking unproductive or harmful actions.

Afaik, this problem hasn't been solved.

<comment><USER14> While you make a fair point, who mentioned anything about untrusted users? You seem to be off on a tangent..

<comment><USER13> The question is about running a node in a distributed learning algorithm. The algorithm depends on trusted nodes to function.</comment></comment></comment></comment>


Gary Becker's biggest mistake - <AUTHOR> http://marginalrevolution.com/marginalrevolution/2015/09/what-was-gary-beckers-biggest-mistake.html <comment><USER2> One of the more successful, though still brutal, experiments in handling crime, in my opinion, was the penal colony in New South Wales, Australia:

[https://en.wikipedia.org/wiki/History_of_New_South_Wales](https://en.wikipedia.org/wiki/History_of_New_South_Wales)

From 1788-1792, it started out tough with thousands of professional criminals ill-fitted for the skills required. 1/4 of the 2nd fleet lost their lives. The rest survived near starvation. However, between 1810-1821, it transitioned from a penal colony to a budding free society.

I can't think of many successes like that in our history where so many career criminals were reformed so quickly, the sacrifices of lives not withstanding.

<comment><USER3> A lot of those criminals were people who were transported for trifling offenses like theft. The real driver behind Australian settlement was overpopulation in Britain, not the need to get rid of some hardened criminal class. _The Fatal Shore_ is a good, readable history of this social experiment.

Note also that this "budding free society" was responsible for horrible atrocities against the native population until fairly recent times.

<comment><USER2> > Note also that this "budding free society" was responsible for horrible > atrocities against the native population until fairly recent times.

Doesn't excuse it, but I can't think of a first world country that hasn't committed atrocities to native people or forced people into slavery. In many ways, the world is much better today than it was before.

<comment><USER4> It's interesting how attempting to reconcile a "much better world" with multiple genocides forces you to evaluate what it means for the world to be "better" or "worse". If we can destroy a whole culture and virtually all its people to make room for settlers, what other forms of progress might invoke the same "eminent domain" against us?

The world is certainly a nicer place for us to live in than it was for the pre-colonial Australian aborigines, or the pre-Columbian Iroquois. I like antibiotics, plumbing, and electricity too. But too: there are lots of other niceties that would be much easier to dole out to our friends and fellow citizens if we could simply eliminate pesky rival people. Were constitutional democracy, English common law, and industrialization the key improvements that justified our ancestors perpetration of genocide? Are we done now?

</comment></comment></comment></comment><comment><USER5> tl;dr: His mistake: longer sentences didn't reduce crime as much as expected because criminals aren't good at thinking about the future; criminal types have problems forecasting and they have difficulty regulating their emotions and controlling their impulses.

</comment><comment><USER6> I think the notion that "more police on the street [makes] punishment more quick, clear, and consistent" needs supporting evidence.

</comment><comment><USER7> This is a harder sell in the connected age, because every time someone on early release commits a serious crime it is widely reported and proof in the public's eye that longer sentences make sense.

But when someone is released early and quietly finishes out their life that doesn't make the news.

</comment><comment><USER8> > he argues that an optimal punishment system would combine a low probability > of being punished with a high level of punishment if caught

the Trailer Park Boys series has an episode were small criminals decide to lower their crimes even more so police would ignore them.

</comment><comment><USER9> > "models are to be used but not to be believed."

Data scientists, please take note.</comment>


Students reaching for ADHD drugs to deal with academic stress - <AUTHOR> http://m.theglobeandmail.com/news/national/education/drugs-as-study-aid-a-growing-trend-on-campuses/article14945567/?service=mobile#!/ <comment><USER2> aren't they about 20 years late with this?

</comment><comment><USER3> No, really?</comment>


Data mining: A Correlation for the 21st Century (Science Mag) - <AUTHOR> http://www.sciencemag.org/content/334/6062/1502.full

<comment><USER2> Can't access it, is there anyway for me to access the content?</comment>


Old Man Murray Deleted from Wikipedia - <AUTHOR> http://www.rockpapershotgun.com/2011/03/02/old-man-murray-deleted-from-wikipedia/

<comment><USER2> It seems Wikipedia needs to integrate some crowdsourcing into their curation methodology. Provide some social news-like voting and a commentation window on pages/articles/topics before deleting them, so it's not just a small cadre of insiders making these decisions, even if they do attempt to make them according to some published standard.</comment>


Real-time SFO plane location - <AUTHOR> http://www.airportviewer.com/airport/KSFO <comment><USER2> Pretty cool. For those wondering the source of the data, it is likely ASDE-X/ASSC streaming in from the FAA's STDDS SWIM feed[0]. The terminal and ground data is especially cool and not as common as the usual flight tracking you see of en-route aircraft.

I'm using the STDDS feed to build a rough "go-around detector" in AWS for approaching aircraft by monitoring each approaching aircraft glide slope and dispatching a SNS notification "if currAlt > prevAlt".

If anyone has any questions about this stuff feel free to reach out, my email is in my profile. The easy part (IMHO) is slurping in the data which only requires a couple small EC2's and RDS, ~$125/mo. The hard part is often the presentation and making demos like these fun and shareable.

[0] [https://www.faa.gov/nextgen/programs/swim/stdds/](https://www.faa.gov/nextgen/programs/swim/stdds/)

<comment><USER3> Typically FlightAware shows planes on the ground as well. Can you elaborate on what the difference here is?

<comment><USER2> I don't think I've seen FlightAware showing aircraft tracks on the ground.

They do show taxi times for arriving/departing aircraft and I wonder if they are stitching that data together using the STDDS feed.

To give you an example, for an arriving aircraft you would get an alert of "wheels down", which is as literal as it sounds: a timestamped event when the aircraft made contact with the ground. In addition to ground position events (allowing the tracking you see here), you would also receive an alert when the aircraft left the tracked movement surface, i.e. transitioned to the gate/ramp area and no longer on an active airport surface.

(Pretty sure I have that correct, it's been awhile since I got back to my STDDS-powered projects. If anybody familiar with STDDS wants to chime in, please do!)

For the curious, all these "alerts" are JMS messages with XML payloads. Pretty much non-stop stream of data, incredibly fun if you're a developer+av geek. For FlightAware-style tracking without using any ADS-B you'll want to subscribe to the SFDPS feed. You'll get position updates every 60 sec for all airborne flights in the US, which last week amounted to ~40GB in my Postgres DB. You can request higher resolution reporting which is every 12s.

<comment><USER4> FA doesn't always show ground data (they must do some sort of filtering), but it is available via ADS-B. If you visit sites like www.adsbexchange.com or look at a receiver's raw data, you'll see ground data.

</comment></comment></comment></comment><comment><USER5> One thing to note is the presence of ground vehicles (e.g. "OPS7"). Using my RTL-SDR dongle, I can pick up trucks driving around LAX, 20 miles away, because the airport is creating synthetic ADS-B targets for them and broadcasting packets as though they were any other aircraft--with appropriate flags sent so you can tell 1. it's a ground vehicle, and 2. it's a synthetic target, not a direct response from an ADS-B transponder.

<comment><USER6> If ground vehicles don't have their own ADS-B transmitter, what method do they use to announce their GPS positioning data to whatever is transforming that into ADS-B data?

</comment></comment><comment><USER7> And for the real aviation geeks, bring up the KSFO live tower audio here: [http://d.liveatc.net/ksfo_twr2](http://d.liveatc.net/ksfo_twr2)

(via: [https://www.liveatc.net/search/?icao=ksfo](https://www.liveatc.net/search/?icao=ksfo))

<comment><USER8> That's awesome. Any idea why there are different audio streams in the L/R channels?

<comment><USER9> The linked stream is the Tower/Ground stream. Tower is on the left channel, Ground is on the right.

</comment></comment></comment><comment><USER10> You can pick this stuff up with a cheap RTL-SDR - it's the ADS-B transponder on the planes. I believe services like FlightAware use this to track planes too.

[https://en.m.wikipedia.org/wiki/Automatic_dependent_surveill...](https://en.m.wikipedia.org/wiki/Automatic_dependent_surveillance_%E2%80%93_broadcast)

[https://github.com/antirez/dump1090](https://github.com/antirez/dump1090)

[http://www.satsignal.eu/raspberry- pi/dump1090.html](http://www.satsignal.eu/raspberry-pi/dump1090.html)

[https://flightaware.com/live/map](https://flightaware.com/live/map)

<comment><USER11> At one time, one of the apps (FlightRadar24, maybe?) would send you a free radio receiver, as long as you hooked it up to the internet so they could get the data, too; and you lived in an area that wasn't well covered.

<comment><USER12> You have to supply your own hardware, but Flightaware provides a Raspberry Pi image that does that (you get a free subscription if you send them ADS-B data).

[https://flightaware.com/adsb/piaware/](https://flightaware.com/adsb/piaware/)

</comment></comment></comment><comment><USER13> One of my favorite personal projects was to do this with an ADS-B receiver, Raspberry Pi, Android App, and a laser projector to show overhead flights on my ceiling:

[https://twitter.com/gmurphy/status/891863458005655553](https://twitter.com/gmurphy/status/891863458005655553)

It made practicing forgiveness for loud airplane noises much easier :)

<comment><USER14> really awesome... do u have a blog/writeup for how u did it?

<comment><USER15> [https://www.flightradar24.com/build-your- own](https://www.flightradar24.com/build-your-own) to get the data... the visualization... I'd love to see a write-up as well!

</comment></comment></comment><comment><USER16> This isn't surveillance in the "security camera open to the web", but actually just plane positioning.

<comment><AUTHOR> Thanks, I updated the title.

</comment></comment><comment><USER17> Just for comparison, here's someone that has stitched the ADS-B information with Prepar3D (used to train air traffic controllers) and a bunch of other glueware and turned it into a live YouTube feed of LAX:

[https://www.youtube.com/watch?v=bQQK0iR5iBU](https://www.youtube.com/watch?v=bQQK0iR5iBU)

</comment><comment><USER18> These pages each show data from on-airport surveillance systems Airport Surface detection Equipment, Model X (ASDE-X) or Airport Surface Surveillance Capability (ASSC) which show aircraft and vehicles on the airport surface and within a few miles of the airport. It does include ADS-B but unfortunately not all US carriers are equipped yet.

</comment><comment><USER19> What's the difference with [https://www.flightradar24.com/37.62,-122.38/15](https://www.flightradar24.com/37.62,-122.38/15) ?

<comment><USER18> There are several differences if you watch closely. First you will see a more complete picture of the aircraft movement on the surface. Second you will noticed the flightradar attempts to predict where aircraft are going while the airportviewer only reports where the aircraft says it is.

</comment></comment><comment><AUTHOR> FYI, there are also 36 other airports viewable from this app: [http://www.airportviewer.com/](http://www.airportviewer.com/)

</comment><comment><USER20> [http://webtrak5.bksv.com/](http://webtrak5.bksv.com/) <\- multiple airports with both near realtime and historical data, flight paths, etc.

</comment><comment><USER21> Cool! I wonder whether this could use some sort of extrapolation so the planes move smoothly between updates?

</comment><comment><USER22> Others listed are faster but here is another one. [http://volans.airportnetwork.com/JS3D/VolansPublicSFO.html](http://volans.airportnetwork.com/JS3D/VolansPublicSFO.html)

</comment><comment><USER23> Just looks like ADS-B Data. Neat but hardly new. Lots of sites out there already. For a few bucks you can build your own receiver and collect/visualize the data.

</comment><comment><USER15> FlightRadar24.com is a much better interface and shows all the planes... in the world.

I have an ADS-B receiver and I transmit my data to both FR24 and FlightAware.

</comment><comment><USER24> While the the title suggests something different, it looks pretty cool anyway, but someone should really look into adding some animations ;-)

</comment><comment><USER25> Didn't know Oakland airport is directly across the bay!

<comment><USER26> With Norwegian flying London - Oakland, and the link up with the BART making it potentially even faster to get to Embarcadero, it's a really great option over SFO!

<comment><USER3> Yup; You can get nonstop from Oakland to Reykjavik (KEF) and also Stockholm (ARN) I believe. No doubt Norwegian also flies OAK to somewhere in Norway.

<comment><USER27> They even have a cute little lounge there for the premium passengers nowadays (shared with BA; a couple of flights a week to London Gatwick).</comment></comment></comment></comment>