The other kind of JavaScript fatigue - <AUTHOR> http://chrismm.com/blog/the-other-kind-of-javascript-fatigue/?123 <comment><USER2> Realized this sometime ago, when I was wondering why the Java ecosystem doesn't have this problem. It boils down to the barrier of entry. On JS it's so low as to be almost nonexistent, which is why you end up with junk like isPositiveInteger. Slap some shit together and ship it.

You can't do that easily in Java. You need to spend some time understanding the language, the ecosystem, how to bundle your code into an artifact, and then how to release and publish it; the barrier of entry is much higher because there is a lot more to learn and understand.

The article mentions Android - I haven't worked much with Android and so I'm not familiar with the libraries there. Is there the same sort of problem in the Android ecosystem that you see in Node? I wonder if he is talking about the fragmentation of Android _implementations_ (flavors from different providers), which is a different thing entirely. Seeing as Android uses Java, I'm thinking the ecosystem is not like Node.

<comment><USER3> I think it's rather that the java and .net framework are pretty good out of the box. So there is only a need for additional framework for certain corner cases. And then some get bought by Microsoft and integrated out of the box, like the datavisualization libraries or xamarin.

JavaScript on the other side is a language that only its conceptor could love. All these frameworks are sort of required to be barely productive. Which is why you end up with these big frameworks to abstract the various browsers, introduce databinding, or add static typing.

<comment><USER4> Javascript has a terrible embarrassment of a standard library. Things that should just be baked into the language are not, which has lead to attempts to rectify that shortcoming, like jQuery, Underscore and LoDash. Because this standard library isn't implemented in the browser itself, where it belongs, people have gotten upset about downloading a few hundred kbs of a general purpose utility library, and instead reimplemented different bits of it in a thousand and one ways, nearly all of them more or less subtly broken. (I don't understand the obsession with JS library size - it's completely irrelevant in 95% of cases, compared to the megabytes of other garbage most sites will pull in for trackers and images).

<comment><USER3> And not just in javascript. HTML is largely the culprit too. A lot is done in javascript that HTML should really handle.

For instance why can't we just add a URL attribute to an input to provide autocomplete and validation. It is such a common scenario there shouldn't be a need for a javascript framework to provide that.

Same thing with responsive design.

But these technologies are stuck in the 90s and barely evolve anymore.

<comment><USER5> >For instance why can't we just add a URL attribute to an input to provide autocomplete and validation.

You can. <input type="url" /> is part of HTML5[0].

Of course, support may not be universal[1], which is why you will probably always have to use javascript if cross-compatibility matters.

[0][https://www.w3.org/TR/html- markup/input.url.html](https://www.w3.org/TR/html-markup/input.url.html)

[1][http://caniuse.com/#feat=input-email-tel- url](http://caniuse.com/#feat=input-email-tel-url)

<comment><USER3> No by URL I meant the URL of the service that would provide the autocomplete or the validation. Like:

      <input type="text" validation="url1" autocomplete="url2" ...

<comment><USER6> I'm not sure how either of these would help:

\- validation: Fundamentally, to be able to trust the input, the server needs to validate it in its final state. The only reason validation should be done on the client is to reduce the latency from the time the user inputs the data to the time the validation result is reported, so the user can fix their input faster if it fails validation. Sending it to a URL before form submit doesn't make sense when the input will have to be validated after form submit anyway.

\- autocomplete: It's unlikely that implementing this in native code will be faster than in Javascript. It's not significantly faster to make an HTTP request in native code -- native code is more advantageous for heavy computation, graphics, and multithreading. And yet, it's easy enough to make HTTP requests from Javascript that an autocomplete attribute wouldn't add much value.

<comment><USER3> Being faster is not the point. Having to rely less on javascript libraries and more on the built in framework in the point.

And client side validation is not a substitute for server side validation, merely a better UX.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER7> "Embrace change, and it will make you a better developer."

I don't agree with this at all. I think a good coder has complete mastery of their code and tools which is only possible by putting significant time to use one thing instead of jumping one thing to the next ever so often.

Imo the best way to become a better developer is not by using what others have created but trying to create libraries and frameworks yourselves to truly understand or at the very least think about the in and outs of the code to think throughly and produce a better architecture. It will open up your eye to differentiate good and bad code rather quickly.

<comment><USER8> And you are wasting huge amounts of time by rewriting stuff that's already out there tested by thousands of people.

Also collaborating with others becomes much more challenging because you invendted everything.

With experience I can minimize self written code and I can skip plugins and libraries, but I feel better if I can rely on something solid.

It does not apply to all field of programming per se, but web developent is a perfect example.

<comment><USER9> "Trying to build a framework to understand frameworks" is not the same as "use you own frameworks on your professional projects"

I have written my own Forth, my own filesystem, my own Mvc etc. etc. and I would say they have improved my skill more than learning a new Algol derived language but I would never advocate their use in production.

<comment><USER8> For learning it's a good idea to make something from scratch, way better than writing todo apps :) It can even be better than the original one. For productivity it's not the case however.

</comment></comment></comment></comment><comment><USER10> This is nothing new, JS just evolved the problem to the next level. Perl and CPAN had notoriously bad modules and each subsequent language has made packaging easier. And now JS is available with easy packaging or just by including a URL to the package. This problem is inevitable. JS just is the current most widely distributed and used language.

I think we have to learn live with crap code and find ways to surface the diamonds. A rating system for packages would be great. Maybe based on developer ratings, amount of contributors/community interaction, and number of unresolved issues?

<comment><USER2> I guess my experience with CPAN has been different. Probably the most frustrating thing is the paucity of documentation from certain perl modules. But the modules I've found and used have been pretty good quality and pretty stable.

Then again, I've never built anything "enterprisey" in Perl (just little tools and scripts here and there), so that could it be it.

<comment><USER10> I think you might have hit something here. Because Perl is definitely hard to read and with bare documentation, the module might have been fine but we just never knew how to use it.

<comment><USER11> Perl can be hard to read, but it has incredible documentation and CPAN set (and apparently still keeps) the diamond standard for language packages and distribution systems.

</comment></comment></comment></comment><comment><USER12> One factor that leads to fragmentation is this "theme" that I seem to see over and over that when a project is popular the creator gets to be the github maintainer and take credit for it's success as a large and popular project, which by itself is a good thing.

The bad part is that when the maintainers make unpopular decisions like disabling all functionality by default and relying on submodules, or not wanting to fix some obviously horrible bug because it's a 'feature', or abandoning the project for months at a time, often there is a cop out mentality that goes along the lines of "well it's my project and I didn't guarantee anything when you decided to use it so why don't you go make your own." There by taking credit for the project's successes but not responsibility for it's failures. So then people do go and write their own implementations and we end up with half a dozen half baked libraries.

An Example: Underscore and lodash are both very good, so are not examples of half-baked, but do we really need both of them? People will just say "well you only have to use one in your app... yada yada yada" but the problem is that if I want to rely on any other npm packages in my app, are they using lodash or underscore? I'll probably just end up with both of them shipping in the bundle because for whatever reason there couldn't just be one popular utility library, there had to be two that do basically the same thing. People will respond to this and say "well why don't you fork those modules that rely on underscore and make them use lodash?" My answer is no. I don't want to fork stuff. I just want to be able to find modules that I can rely on with a reasonable expectation of quality and maintenance. I'll even help maintain if it doesn't seem completely futile.

There may be some advantages of lodash over underscore in comparison to one another but those advantages are minor in comparison to what would be gained by having a single utility library that everyone is on board with.

Don't even get me started with routing libraries for React.

<comment><USER13> Most open source maintainers are developers who work full time - I am a maintainer of a major project, but there are times my activity is light, such as the past two months. In that time, I travelled to Salt Lake City, Reno, Portland, San Diego, Seattle, and now in route to Chicago - I ran a half and full marathon in that time, and about to run another half tomorrow morning. I am currently in crunch time at my current job for the past two weeks, and I am about to leave for a well earned 2 1/2 week vacation to England, France, Switzerland, and Italy. I don't plan on coding much, if at all, while in Europe.

I very much enjoy working on open source, and have implemented some tricky but highly useful features over the past almost 1 1/2 years of my stewardship that users greatly appreciate. However, I also have a rich life outside of development as well, and I believe that each persons' choices with how they choose to use their time should be respected. If you are not paying or contributing your own time feature developing or assisting maintainance, complaining about maintainer absence is really poor. We are not on demand tech support.

<comment><USER14> In the Java world, most major open source projects are sponsored by companies. Someone(s) is getting paid to maintain and evolve that thing as part of their _job_. Companies might do this to drive traffic toward the commercial "enterprise" version, for which they charge money. More commonly though, it's just something that they use internally... and they open it up for marketing/prestige/recruitment purposes.

In most other language ecosystems, most open source projects tend to be driven by individuals as unpaid side projects. That's great in a certain sense, and a large part of the reason why Java is less "cool" among young people who are eager to plant their own flag on an open source thing. But sadly, it's just really difficult to keep a major side project alive and healthy over the long- term without sponsorship. So those ecosystems tend to be chaotic and flaky.

<comment><USER12> Couldn't have said it better. In the webdev world this turns into a problem because I need to rely on these oss projects and while some of them might be high quality, there is a significant overhead involved in determining which ones are worth using and which ones I can rely on. For personal projects it's a not big deal but for work I want to be as efficient and reliable as possible and the chaotic/flaky ecosystem gets in the way.

edit: fixed to *not a big deal

</comment></comment></comment></comment><comment><USER15> > Remember Google's Polymer? Angular 1? Express? Perhaps the organizations and > individuals which cause these abrupt termination events should carry a > stigma.

Why is Polymer on this list?

<comment><USER16> Same question. As far as I know, it's a pretty active project. Did the author mean the jump from v. 0.5 to v. 1.0? That had some breaking changes, but that was expected.

</comment></comment><comment><USER17> I think the convenience of GitHub and NPM are good features, and it's easy to blame ease-of-use as a culprit. I have often pondered about how remarkably poor these tools are at representing repo quality. I think there are some basic questions to ask before accepting any unknown source in as a module. What is the core problem and requirements the source addresses? Does it verify the solution and how? What is the reputation of the core contributors? Is it used by any serious institutions? (Aside: download count and star count are a measure of herd mentality) What are the open issues? What are the closed "won't fix" issues? How often are issues regressed? What is a safe version? How is the versioning managed and how should I pin it? How many dependencies do I assume from this library? How severable are the dependencies?

It would be useful if package management tools facilitated the process of understanding the liability imposed by a package, but the opposite is encouraged. Authors too often put up shiny marketing materials and make bold statements about the utility and vision of their software. It would be refreshing if authors were as open about the flaws, trade-offs, alternatives, etc. but few are.

Perhaps some kind of rating or feedback system that is qualitative in nature would help mitigate the salesmanship? I'd love to know who has been burned by a project and anecdotes about how packages are used by others. Ratings around issue resolutions would also be helpful, how often have we all had major bugs dismissively closed by maintainers?

TL;DR there are ways to develop a comprehensive assessment of a repo, but our tools are lacking and need much improvement in this regard.

<comment><USER18> I would like this idea extended to versioning, where you get a simple release number and a risk number. Even for projects following simver, they all have a differing idea of how big a change is and simver doesn't cover bugfixes that make breaking API changes.

If a new version simply incremented the release number, and estimated the risk of issues from the previous version, it would be easier to tell if you wanted to update. Also after a project has a few releases under its belt, you can normalize the risk to other projects risk level (eg: project x always underestimates).

For open source projects, it enables tooling to look at the functions touched and the functions used by your code, and add risk to the update.

An example:

You are 3 versions behind, updates are versions 15/42 (minor bugfix), 16/500 (new minor feature) and 17/32000(major api change). Risk of updating is 42+500+32000. If you peg the amount of risk for a automatic update to 1000, then you would only get the first two.

The same thing in simver: 1.0.1 1.1.0 2.0.0

While its somewhat easy to gate simver, it doesnt lend itself to automated risk assesment as it would be much harder for a tool to tell the difference between a bug fix and new feature (too many bug trackers out there).

</comment></comment><comment><USER19> <rant>

I blame Github, in particular its "stars" feature. It makes putting out code a popularity contest.

"Why should I make someone else's project more popular? I'd rather spend my free time making myself popular."

</rant>

<comment><USER5> Github seems to want to be a social media site first and a git host second. Which is why I exclusively use Bitbucket now.

<comment><USER8> Why is socializing with other programmers a bad thing? They manage the core repo hosting quite well. They also act like a solid CDN.

<comment><USER5> >Why is socializing with other programmers a bad thing?

It's not - socializing with programmers is why I'm on Hacker News. But, socializing isn't what Github should be about. Github should be about development, first and foremost. Having issues and comments support pointless features like emoji and voting and images (and image memes) dilutes the focus of the site and moves it towards being just another forum.

Also, having Github act as a social network injects trolling, politics and drama into the development environment, and I believe development should be apolitical and acultural. I dread the (extremely unlikely) prospect of publishing a project to Github that actually becomes popular and accepting a PR from someone whose political views I may personally despise, but whose code is acceptable, or the backlash if I don't abide by a particular Code of Conduct. Not everyone wants to deal with the cesspool that is modern "social coding" or to build a "community" or to have the number of stars on their account validate their resume.

I just want a place to host code and maybe take pull requests and not have to pay for the privilege of having a private repo.

</comment></comment></comment></comment><comment><USER20> "JavaScript programmer" term is similar to "vegan" \- nobody cares if they only use one programming language for all tasks, but they constantly tell others about that.

What this article is about? Snippets from SO answers are not as good as battle-tested code? It's obvious and it's same in all languages. You can't find library for any task in tracker you have? Same thing.

<comment><USER2> > What this article is about? Snippets from SO answers are not as good as > battle-tested code? It's obvious and it's same in all languages.

It's much harder to ship SO copypasta in say, Java or C#, than in Node. JavaScript is a much easier language to grasp and it is also a lot more forgiving and loose. Combine that with NPM and can suddenly be immensely "productive". But the ability to write and push a lot of code very fast also means that it makes it very easy to write and push a lot of _bad_ code very fast.

<comment><USER20> It only depends on programmer. Somebody copy-paste from SO to production, somebody write tests and run them before deployment. There is a lot of dynamic ("forgiving") languages, so JS is not unique here.

<comment><USER21> I've seen people change Java code in production to fix a bug and recompile it.

This is hardly a behavior that exists only in dynamic languages.

<comment><USER2> That's a different issue entirely. The article is talking about the quality of frameworks and libraries in JS.

<comment><USER21> Perhaps, but I was replying to the parent comment, which did talk about dynamic languages and copy paste code to production.

</comment></comment></comment></comment></comment></comment><comment><USER22> > Richard Stallman envisioned open source

No, he envisioned Free Software.

[https://www.gnu.org/philosophy/open-source-misses-the- point....](https://www.gnu.org/philosophy/open-source-misses-the- point.en.html)

</comment><comment><USER23> > The fragmented nature of large open source ecosystems has become evident > since the advent of Android.

Is the author talking about the fragmentation of libraries and tools for Android, or the general "Android fragmentation"? If it's the former then I haven't experienced it, certainly not to the extent of the Node ecosystem. Yet...

> [...] because languages with smaller communities such as Go [...] don't yet > suffer from it

... I disagree, take for example the tons of different projects trying to "solve" the web framework problem, or the dependency problem, etc.

</comment><comment><USER24> _Instead of nurturing narcissistic language ambassadors that drop their projects like they change fedora hats every time they get a new idea, let's create more tools to improve code quality and foster a sense of community. Human progress is not going to happen by default. That was not the case with clean energy, or with quality education, and it will not be different with open source fragmentation. These problems require active monitoring and organized effort._

This is why I'm part of KDE. It's a large, diverse and productive community of people that want to bring Free Software forward. KDE exists 20 years this year and it's still growing and evolving. New developments come in, but they reviewed and nurtured in the community before being released under the KDE flag.

JavaScript could use a community like that where there is a common set of tools and values. The JavaScript that I see out there usually has very little quality control. It's easy to make something that looks nice and does not crash. But scaling up to an application that is complex and stable is hard. I learned this when developing the (now resting) library WebODF. Javascript comes with great tools like JSLint and Closure Compiler, and Jasmine but these are rarely used strictly.

Very few JavaScript developers have read 'JavaScript, the good parts' which is essential reading when writing non-trivial JS.

Node.JS promises the ability to reuse code on the server and the browser, but does not provide a module solution that makes that possible and works with the tools mentioned above.

Competition between KDE, GNOME and others on the Linux desktop exists because there is only one desktop on your computer. Javascript lacks such a focal point and JS framework developers can start new projects because it's easy to have a different half-baked framework in each browser tab.

You cannot build a cathedral out of market stalls. (KDE is the Sagrada Familia in this simile)

</comment><comment><USER25> This sounds pretty much the same as the original concept Javascript fatigue. Too many libraries.

That's an interesting example cited by the author considering the behavior he desires isn't standard. There are multiple possible approaches to serializing an object tree to a query string (and reasons why, conceptually, you might not want to do this in the first place). Incidentally, when I searched for this on StackOverflow, the Q&A I found has a top answer that does deal with nested query strings [1].

[1] [http://stackoverflow.com/questions/1714786/querystring- encod...](http://stackoverflow.com/questions/1714786/querystring-encoding-of- a-javascript-object)

</comment><comment><USER26> I see his point and I think another dimension of the tooling is a root cause too...

> Recently I needed a library to build query strings, just a small one so that > I wouldn't have to include jQuery just for that. After a couple of hours of > research...

jQuery clearly is the best library to look to for a mature implementation. So why not just use it? Hours looking for alternatives is actually really expensive.

The justification is that jQuery is too big.

First It's probably not too big. CDNs and browser caching exist to optimize the problem upstream.

Next, the dynamic nature of JavaScript is to blame. You can't easily extract and compile just the functions you need.

Ideally we could all leverage bits of jQuery instead of poorly rewriting parts of it in the name of minimalism.

<comment><USER27> > Next, the dynamic nature of JavaScript is to blame. You can't easily extract > and compile just the functions you need.

Definitely check out rollup, if you haven't heard of it. We (the JavaScript community) are working towards solving this!

<comment><USER26> Thanks for the tip, rollup looks really powerful.

This and related comments remind me that the latest ECMA stuff offers a brighter future. The challenge is getting there...

Can/will jQuery work with rollup and all the other new module work? Or does it have to be effectively rewritten?

<comment><USER27> It needs to be rewritten, unfortunately. However this isn't just rewriting it so it works with one tool, since this is the new module syntax. I imagine that a future version of jQuery, and probably most libraries going forward, will _want_ to take advantage of ES2015 modules, even if it's just to aid in their own internal development. Since we have module bundlers like rollup, it would be easy to still provide an ES5 bundle for environments that do not use ES2015 modules yet.

</comment></comment></comment></comment><comment><USER28> My java script fatigue led me to disable it on my phone.

Seriously. I's been about nine months.

I use the exceptions feature to add in common sites where it is required.

I have been surprised over the course of this experiment by how little it is really needed for casual browsing.

And it has led to a decline in my consumption of garbage Internet by forcing me to take the time to add the exception which leads me to question whether this content is really worth the effort.

I think about building a feature that can do quick, single instance, javascript exceptions.

However, I fear it would undo the good done by the natural filter on my surfing.

And as a bonus, my data usage decreased considerably.

</comment><comment><USER29> Not knocking the guy at all but..

'Recently I needed a library to build query strings, just a small one so that I wouldn't have to include jQuery just for that. After a couple of hours of research, I had found several candidates'

That right there is the problem, learn your language. You don't need to spend 2 hours looking through other peoples code to solve your (string!) problem. Learn the language and write it yourself, it's not 'rolling your own' when it's something so basic.

</comment><comment><USER27> The basis of the complaints raised in this article, is that they didn't want to include jQuery just for the query string parser. I think rollup and ES2015 modules is taking us in the right direction which allows large projects like jQuery and lodash to be kitchen sinks, but to be used piecemeal. I think that will get us a long way toward the less-sensitive-to-filesize ecosystems that were compared in this article.

</comment><comment><USER30> Maybe what we need is a better system for assessing and comparing javascript projects. In the Ruby world, RubyToolbox has a great system that tells you about gem's popularity, update frequency, age and a ton of other stuff.

Is there a similar project for the javascript world?

<comment><USER31> Or just review the code. It's not hard, and if you add a dependency to your code base you should review it. If you lack the ability, time or <insert random excuse here> then you should not add it as a dependency.

DRY only goes so far. If you can do the same thing with a couple of hours of work, it's probably not worth adding an external dependency that you need to track over time.

</comment></comment><comment><USER32> _Remember Google's Polymer? Angular 1? Express? Perhaps the organizations and individuals which cause these abrupt termination events should carry a stigma._

A fantastic idea. There should be some social consequences for these sort of faithless and feckless types.

<comment><USER21> Angular 1 is a shame, and it's absolutely right that it shouldn't have been abruptly replaced (though not terminated).

But polymer was and still is barely an alpha, and was practically not used for any real usage (which isn't basically a showcase).

Express is 7 years old and still running strong, continuously being updated and was not terminated or abandoned. Kue.js is just an extension of Express.js with new ideas to accommodate the changes underwent in these 7 years in the node.js ecosystem.

<comment><USER33> Yeah, I still use Express all the time. I wouldn't put it--or Angular 1--on that list.

</comment></comment></comment><comment><USER34> This doesn't really add much to the discussion. Sure, write better code. We all want to do that.

To the author: I believe that the node standard library has the query string tools you are looking for.

<comment><USER35> My take away was that we need to work towards converging efforts rather than diverging and causing constant fragmentation and lost effort. It being easy to deploy is a good thing, but people need to try to reduce noise and fix existing good enough projects to make them great and robust.

Contrary to my above points, I'm super in redux and react and feel they were large leaps in design over previous ones. I've been happier and happier with react over the last two years. Redux is also consistently making me smile.

<comment><USER36> > My take away was that we need to work towards converging efforts rather than > diverging and causing constant fragmentation and lost effort.

Fragmentation and lost effort are essential for progress. Things that you use today were created because someone decided not to work towards converging efforts.

</comment></comment></comment><comment><USER37> Wait, Angular 1 is dead? That's news to me.

<comment><USER38> It's soon to be no longer developed, because the Angular team saw a React talk and decided to build their own version that nobody seems to want very much.

</comment></comment><comment><USER21> There is another upside to modules being easy to make and publish - they are also easy to change.

The query parser you want isn't able to handle nested objects and arrays easily - fork it, add your small piece of code (to what is hopefully an already small module), use it with a direct reference in your package.json, send a pull request upstream.

The fact that libraries don't handle your specific edge case/ special need is not unique to javascript, atleast you have an easy way out in node's mentality of small modules. Try getting a small change to work in spring or hibernate or any of the other massive frameworks that require days only to get familiar with their api and lifecycle hooks.

Consider this, I can easily go into the most popular framework in node (express.js) and change any part of the code within a few hours to match what I want, including adding tests, and there is non-zero chance that my changes will be pushed upstream. If I ever needed to do this to Spring MVC or even Racket, it will take me weeks, would most likely end up breaking dozen of other edge cases and would never be accepted by the Foundations managing those projects.

<comment><USER2> Not my experience. I recently submitted a bug fix to Qt WebKit and feature to swagger. Neither of them broke anything and both were accepted. The submission processes for both projects were diligent enough to ensure quality contributions yet simple enough that they were not byzantine.</comment></comment>


Ask HN: Want to help me root out some spammers? - <AUTHOR>

Starting at 4AM this morning, I've been getting a lot of email spam from discokenny.com.  One of their email messages has this at the bottom:
"If you do not wish to receive further communications from Escher Internet Services please click here to unsubscribe or call the number below. Escher Internet Services | 2657 Windmill Pkwy #398 | Henderson, NV 89074 | 888-709-9804"
Googling the address led me to find out that SpamHero is at suite #175 of the same building.  So I think that this SpamHero company may be sending out spam in order to boost its anti-spam product (but I don't know that for certain).
What would you do?  Any advice?  I want to fight this. <comment><USER2> There is a word called "joe job" for when spammers impersonate another person so that vigilante action targets them. Occam's razor suggests that this is more likely than a double secret hush hush plan by an anti-spam company to drum up business by firing .0000000001% more email into the global spam delivery network.

<comment><AUTHOR> Thanks. I'd like to have more certain info on the link between SpamHero and this spam.

I don't think it's a "joe job" because I had to do some digging to find the connection to SpamHero. What I suspect is that they are sending out a bunch of spam, then collecting email addresses from those who opt out, then following up sometime later by sending them an email advertising their service. That's my guess.

Also, the SpamHero company site does not display anyone's name, which is a little shady, but they claim to have a team of "real people".

</comment></comment><comment><USER3> Hello, this is Curtis O'Reilly of SpamHero. I got a Google Alert this evening notifying me of this thread mentioning SpamHero. You can rest assured that we are in no way affiliated with discokenny.com nor would we ever send spam to anyone. We are honest people. Feel free to give us a call at the phone number listed on our contact page (toll free) and you can talk to me in person. As for the address listed, it is a PO Box that we are renting from the UPS Store. Apparently the individual or company that is harassing you also rents a box there. Then again, they could be lying about their address. Spammers are pretty devious. Good luck on hunting them down. If we can help in any way, feel free to contact us. :-)

</comment><comment><USER4> This happens to be my specialty. There are some legal recourses that you can take, from the CAN-SPAM act [http://www.ftc.gov/bcp/edu/pubs/business/ecommerce/bus61.sht...](http://www.ftc.gov/bcp/edu/pubs/business/ecommerce/bus61.shtm) it is illegal for companies to not honor opt-out requests. Unfortunately it is not illegal to sell your email address( hasn't been tried in a court of law ). Though if it is true that SpamHero is using deceptive practices they may be held accountable for their practices.

If you really want to take legal action, first prove that the email originated from SpamHero. I would suggest you generate a disposable email address from my spam tracking service <http://whyspam.me> and give it to SpamHero only, if you receive emails at that address from discokenny.com or any other mass mailer, you will know in-fact that it originated from SpamHero.

If you do this, I'll be happy to supply the you with your server-log entries or other documents you may need in a court of law.

Once you've got the info you would need to contact a lawyer because i'm not one, and you need someone who can give you official legal advice.

<comment><AUTHOR> Thank you!

So far I've contacted their domain registrar (moniker.com) and reported them to their service provider (firstname.lastname@example.com). Hopefully that will work. I'm going to try your fake email suggestion now.

<comment><USER4> Good luck, if you have any questions about the service (first watch the videos ^_^ ) let me know. You can also send me a direct message from the link on my contact page if you need any more information from me, though i'll only give you the logs data for your account, and you will need to prove your ownership of the account.

</comment></comment></comment><comment><USER5> Get a spam filter. I know that's not the answer you were looking for, but the effort it would require to figure out who is actually behind this spam would be vastly more than it would be worth. Life is short.

</comment><comment><USER6> Address is UPS Store #1390:

<http://www.theupsstorelocal.com/1390/>

I believe they rent out mail boxes.

<comment><AUTHOR> Actually, there are a lot of businesses with that address:

[http://maps.google.com/maps?f=q&source=s_q&hl=en&...](http://maps.google.com/maps?f=q&source=s_q&hl=en&geocode=&q=2657+Windmill+Pkwy,+henderson,+nv&sll=42.372781,-71.112099&sspn=0.009242,0.019162&ie=UTF8&hq=&hnear=2657+Windmill+Pkwy,+Henderson,+Clark,+Nevada+89074&z=16)

</comment></comment><comment><USER7> report them to the FTC:

<http://www.ftc.gov/spam/>

and to spamhaus:

<http://www.spamhaus.org/>

<comment><AUTHOR> The FTC website is careful to say you should report email that is "deceptive". This is simply unwanted email, so I'm not sure they would do anything. I'm going to look into spamhaus--thanks.

<comment><AUTHOR> It turns out you can't report spam to spamhaus, but they do provide info on where you can:

[http://www.spamhaus.org/faq/answers.lasso?section=Generic%20...](http://www.spamhaus.org/faq/answers.lasso?section=Generic%20Questions#103)

</comment></comment></comment><comment><USER8> I thought Internet vigilantism was Reddit's thing...

<comment><AUTHOR> I'm not looking for an angry mob, just advice and information! :)

</comment></comment><comment><USER9> The only part of an email you can trust are the headers you or your ISP add when it arrives, which is going to be something like :

        Received: from farlep.net (unknown [188.8.131.52])
            by mail.techiferous.net (Postfix) with ESMTP id B1E30EC456E
            for <email@example.com>; Fri, 14 May 2010 10:24:22 +0100 (BST)

_everything else_ \- especially the RCPT TO, MAIL FROM, From: and To: cannot be trusted (unless the message is signed etc.).

I administer the mail for 10k domains, finding 1 spammer and doing something about it is hard work.

Spamassassin, SPF, DKIM are all good tools against SPAM, I can recommend using them all in combination; 90% of all our incoming mail is refused / tagged in this way.

I would review your assumptions too :

        % host discokenny.com
        Host discokenny.com not found: 2(SERVFAIL)

If they tried to send it to me, I'd never even know.

<comment><AUTHOR> Thanks! I did check the mail headers, and it actually came from discokenny.com.

By the way, this is what I get:

      $ host discokenny.com
      discokenny.com has address 18.104.22.168
      discokenny.com mail is handled by 10 namednsservers.com.

<comment><USER9> hmm, maybe it is in your DNS cache or utterly firewalled from the UK

        % whois discokenny.com
        ... snip ...
        NS1.NAMEDNSSERVERS.COM         18.104.22.168
        NS2.NAMEDNSSERVERS.COM         220.127.116.11

        % traceroute 22.214.171.124
        ...snip...
        4  vlan128.10ge.lon3.uk.griffin.com (126.96.36.199)  21.697 ms  19.927 ms  19.757 ms
        5  vl423.mpd01.lon01.atlas.cogentco.com (188.8.131.52)  28.760
        ...snip...
        9  te4-2.mpd01.ewr03.atlas.cogentco.com (184.108.40.206)  219.641 ms
        10  188.8.131.52 (188.8.131.52)  97.547 ms  109.962 ms  96.691 ms
        11  184.108.40.206 (184.108.40.206)  100.634 ms  99.136 ms  99.728 ms

        % host discokenny.com 220.127.116.11
        ;; connection timed out; no servers could be reached
        % host discokenny.com 220.127.116.11
        ;; connection timed out; no servers could be reached

        # nmap -PN  18.104.22.168
        All 1715 scanned ports on 220.127.116.11 are filtered

<comment><USER9> Oh and running mail _and_ DNS on the same box. I hope they know how to administer secure installations. It's not a risk I would be taking.</comment></comment></comment></comment>


Ask HN: What ethical principles do you follow in your work/job? - <AUTHOR> I am also curious on understanding how and why people - specially in IT - are choosing an ethical principle to follow. <comment><USER2> I don't work for businesses that are primarily military contractors or work for the "intelligence community." And there's a bunch of other jobs I won't take because I feel they don't provide enough social value, but that's a more idiosyncratic and less well-defined set of constraints. ([https://codewithoutrules.com/2017/01/29/job-contradict- belie...](https://codewithoutrules.com/2017/01/29/job-contradict-beliefs/) talks a little about where I'm coming from.)</comment>


Ask HN: Name an established product that is begging to be disrupted - <AUTHOR>

I'm asking for a specific product that currently has marketshare, not an industry. Begging for disruption could be any number of reasons like outdated software, high cost, poor customer service, etc. <comment><USER2> I have two based on my own experience:

1\. ROES

Roes is used/offered by many large photo and digital press printing companies. Almost every pro wedding and portrait photographer I know uses it to submit print orders. It is, believe it or not, a _desktop Java app_. It lets labs define their own products/prices and have orders queued into their printing systems. It's a gigantic PITA to use, has no sort of modern API and is part of the reason many of these print companies can't innovate with "Stripe for printing X" type features. [http://www.softworkssystems.com/roes_pro/index.php](http://www.softworkssystems.com/roes_pro/index.php)

2\. Plesk/cPanel

Pick either one. Combined, the 2 have probably 90% of the server/hosting control panel market. Yes, I know on-demand cloud computing is all the rage with us hackers but I don't see the need to manage traditional hosting and email going away anytime soon. Considering a) free google apps going away, b) Wordpress not slowing down, c) static sites/blogs like Jekyll gaining popularity, d) rising popularity of nginx and PostgreSQL, etc, I think there's several angles you could choose from as an initial wedge into this space. We use Pesk on our dedicated servers and its a nightmare. It infects a server, it's bloated, it's slow, and it has a horrible API/command line interface. If you doubt me, ask anyone who's ever worked for Rackspace support how much they love handling Plesk tickets.

If you built a simple rails/Sinatra based panel that did about 6 core features and didn't hijack a system, I'd write you a check right now. [http://www.parallels.com/products/plesk/](http://www.parallels.com/products/plesk/)

<comment><AUTHOR> cPanel is a good one. I cringe anytime I have to use it, but I understand why it's there... It has a ton of features that the hosting company can advertise. That's probably what would make it hard to disrupt because while a new interface could look cleaner, the hosting company could lose some marketing appeal.

I'd be interested to hear you elaboration on how you would create an initial wedge in that market.

<comment><USER3> Honestly I have never had any problem with cPanel. Does exactly what I need it to do. What problems did you run into with cPanel?

<comment><AUTHOR> For one, I think the cPanel interface is very out of date graphic design wise. Secondly, it's your typical last decade software that has a million features. I think it's also probably too technical for the average shared hosting user. Defeating cPanel probably is a lot like defeating craigslist. I think like callmeed is saying, you're not going to do it by creating a cPanel competitor, but rather making replacements for specific features of cPanel that can stand on their own.

</comment></comment></comment></comment><comment><USER4> How about medication management for senior citizens/those with chronic diseases using call centers to remind them to take their medications?

How about disrupting corporate computer training for older office workers with short videos/tips on an advertising supported platform.

How about a furniture leasing agency targeting international workers in the US on a temp visa.

Or disrupt scheduling doctor's appointments. Please.

advertising supported forum with sub forums for different rare disease sufferers, and either automatically generated or curated postings about drug trails, research papers, etc.

</comment><comment><USER5> the Print Shop/Print Master

With today's technology such programs an be almost entirely on the cloud. Printable output being received back in PDF.

<comment><AUTHOR> Interesting. I haven't really used Print Shop in more than 10 years and I see it hasn't changed much. I wonder how big that market is now and how print capabilities on tablets will affect its market size. Thinking of my corporate office: somebody is definitely generating a large number of Print Shop type materials to stick on the cork board for birth announcements, etc.

<comment><USER5> There are times when I want to whip out a quick set of labels, sign or business card... My options are in Linux to work it together with libreoffice or inkscape (a bit more time finding fonts and elements as well as layout/alignment.) or fire up the Mac and use Print Shop there - you know that program still lists for 50-80 bucks (at least the Mac versions)!?!

I figure a lot of the patents have/will soon expire for the technology Print Shop Deluxe which most of what's out there is still based on, came out in 1993.

</comment></comment></comment><comment><AUTHOR> I'll go first on my own question: Microsoft Outlook. While products like Google Apps for your domain have somewhat penetrated, Microsoft Outlook still has a strong corporate foothold while having super clunky software. It's expensive, and it requires infrastructure to use in most cases. Also, a lot of clients still want a native solution which things like Google Apps for domain don't provide.

<comment><USER6> Not to be too wet of a noodle (and I'd certainly like Outlook to go away), but replacing Outlook at places where it is currently entrenched will require an absolutely Herculean effort. Not so much because Outlook the mail client or mail server is so great, but because of everything it ties into: calendaring, sharepoint, lync, custom LOB apps programmed to the Outlook APIs, etc.

When trying to talk people away from Outlook that entire secondary ecosystem has always been a much bigger roadblock than the lack of a native client or even the idea of storing corporate data in "the cloud" in my experience.

<comment><AUTHOR> "When trying to talk people away from Outlook that entire secondary ecosystem has always been a much bigger roadblock than the lack of a native client or even the idea of storing corporate data in "the cloud" in my experience."

Wow, that is surprising to me. I wonder if there's an opportunity to provide a replacement for people who are just getting to the point of needing something like Outlook, but aren't entrenched yet.

<comment><USER6> To be perfectly clear, when I mention trying to talk people away from Outlook and them being resistant, I'm talking about IT people and management, not the common workers, who mostly all hate Outlook.

<comment><USER7> Agreed. Those who would love a replacement really have very little say in the matter. That's what anyone selling enterprise-y software has to deal with. You're usually selling to the people who won't be using it. This changes the conversation quite a bit regarding the benefits you emphasize about your offering. For instance, you may have to show a higher-up that they can save time/money by using your software rather than telling them they're employees will enjoy using it more because that high-up won't rightfully care.

</comment></comment></comment></comment></comment><comment><USER8> All joking aside, the term "disrupted" needs to be disrupted.

<comment><USER4> superseded, ousted, supplanted or usurped?

<comment><USER8> Ousted it is!

</comment></comment></comment><comment><USER9> Western Union

There is no excuse for this company to exist.

</comment><comment><USER10> Gmail :)</comment>


Tax Deductions Freelancers Can Make - <AUTHOR> http://freelanceswitch.com/the-business-of-freelancing/10-deductions-freelancers-can-grab/

<comment><USER2> This is a good list, but freelancers should beware of writing off "home office" expenses. It's a lot more complicated than is presented in this article.</comment>


Found: A Batch of DNA Molecules That Seem To Have Originated in Space - <AUTHOR> http://www.popsci.com/technology/article/2011-08/building-blocks-life-can-originate-space <comment><USER2> Discussed extensively here:

<http://news.ycombinator.com/item?id=2863544></comment>


[Namecoin] How to register .bit domains - <AUTHOR> http://www.freespeechme.org/how-to-register-dot-bit-domains/

<comment><USER2> Looks like we killed it. Coral cache and Google couldn't get it in time it seems.

EDIT: This seems to work: [http://webcache.googleusercontent.com/search?q=cache:http://...](http://webcache.googleusercontent.com/search?q=cache:http://www.freespeechme.org/how- to-register-dot-bit-domains/&strip=1)

</comment><comment><USER3> They recommend that people who domain squat be... shunned? That seems unlikely to work.

</comment><comment><USER4> This is a much needed guide for freeing the Internet</comment>


The GSM buzz - <AUTHOR> http://windytan.blogspot.co.uk/2013/01/the-gsm-buzz.html <comment><USER2> I once sat next to a guy at work whose phone would induce this noise in my speaker about 10 seconds before his phone actually rang. So one day just before his phone rang I said 'Steve, your wife's phoning' and a few seconds later, she was. He was totally freaked out by this; he'd never noticed the buzzing sound. He had no idea how I had worked this out. His wife rang him all the time, statistically it was pretty likely to be her. :-)

</comment><comment><USER3> Should not happen using a modern phone camping on a 3G network. 3G (WCDMA)is not based on TDMA and the uplink has been designed specifically to avoid creating audible interference.

</comment><comment><USER4> But why does the interference stop once you answer? The author gives a couple of hypotheses in the comments, but might there be somebody here who knows for sure?

</comment><comment><USER5> THATs what that is... And I thought I was crazy for hearing sounds before a phone rang (as a kid)

</comment><comment><USER6> My Nexus has a ringtone (called radiation) that emulates this then segues into a little tune.</comment>


Image Kernels explained visually - <AUTHOR> http://setosa.io/ev/image-kernels/ <comment><USER2> This is super cool but it's unfortunate that it clamps negative result values to black.

It's probably worth mentioning that there are a lot of ways to implement convolution with a kernel, and the kernel can be of any size, not just 3×3. The explanation here shows how to implement the output-side algorithm nonrecursively; [http://www.dspguide.com/ch6/3.htm](http://www.dspguide.com/ch6/3.htm) gives this for the one-dimensional case. But you can implement it on the input side instead (iterating over the input samples instead of the output samples), there are kernels that have a much more efficient recursive implementation (including zero-phase kernels using time-reversal), you can implement very large kernels if you can afford to do the convolution in the frequency domain, and there's a whole class of kernels that have efficient sparse filter cascade representations, including large Gaussians.

(To say nothing of convolutions over other rings.)

<comment><USER3> > This is super cool but it's unfortunate that it clamps negative result > values to black.

Curious: What would a negative pixel look like? What use would that have?

<comment><USER4> In fluid dynamic sims for example. Water level can be positive or negative. Grids of data can represent more than colors in images.

<comment><USER3> Well yeah. That has use, but when one mentions claiming negative results to black, I assumed that was for pictures. Obviously negative values mean something in other places, but I assumed we were talking about pictures.

</comment></comment></comment></comment><comment><USER5> How are the kernels derived? Is it just an art where people play with the matrices to see their effects or is there well-understood math behind them?

<comment><USER6> A little art and plenty of science. The kernel matrices can be broken down logically once you know what the numbers are operating on. Considering a 3x3 kernel, the center of the kernel matrix is the origin pixel, and the kernel elements around the origin are the neighboring pixels in their respective directions and distances.

The identity kernel is [0 0 0; 0 1 0; 0 0 0]. For every input pixel, the output is the original pixel value. Don't change the pixel value based on what is around it.

A simple blur kernel would be 1/9 * [1 1 1; 1 1 1; 1 1 1]. The output for each input pixel is the average of the origin's pixel value and all of its neighboring values, with an even weighting. A less dramatic blur can weigh the origin pixel higher than the neighbors, such as a gaussian blur. This will result in the output pixel being more similar to the origin pixel, than to it's neighbors.

Edge detection like [-1 -1 -1; -1 8 -1; -1 -1 -1] can be understood by multiplying the origin pixel value by 8, and subtracting off all of its 8 neighboring values. If the values are all fairly similar, lets say all gray, your output will be black. 8 _A - 8_ A = 0. So it "punishes" pixels that are similar to its neighbors. When a pixel is different than some or all of its neighbors, you will be left with some value > 0 at the output, which detects a change from its neighbors: an edge. Horizontal edge detection: [1 0 -1; 2 0 -2; 1 0 -1]. Ignores the pixels above, below, and center, but accentuates the differences between what is on the left from the right.

[https://en.wikipedia.org/wiki/Kernel_(image_processing)](https://en.wikipedia.org/wiki/Kernel_\(image_processing\))

<comment><USER7> To put it succinctly, convolution just is a fancy term for a weighted average, and a kernel is the name for a set of weights.

<comment><USER8> In general terms, convolution is defined for two functions which both can be continuous and then it's essentially an "weighted integral". In 1D case (sound), when both functions have discrete domain and domain of filter is finite, then it is the same thing as FIR filter. Convolution with continuous domain kernel (eg. sinc()) is useful for example for resampling/scaling.

</comment></comment></comment></comment><comment><USER9> I don't see image kernels compared to cellular automata, but that's what they are. We just don't iterate more than once or twice with a kernel, and the long-term evolution (stability, chaos, or more interesting dynamics) is not the concern here.

That is to say, there is more to cellular automata than the GOL, and one bit per cell.

<comment><USER10> I'd be interested to learn more about this! I'm completely outside image processing/machine learning/whatever this is, but articles about it really fascinate me.

<comment><USER11> Golly is a free game-of-life program you can play with:

[http://golly.sourceforge.net/](http://golly.sourceforge.net/)

There's an active community searching-for/categorizing/discussing patterns in Conway's game-of-life (GOL) (and other cellular automata). Examples:

[http://conwaylife.com/forums/](http://conwaylife.com/forums/) [http://pentadecathlon.com/lifenews/](http://pentadecathlon.com/lifenews/)

<comment><USER10> I know about GOL and other simple automata, I'm mostly curious about applications in image processing.

<comment><USER12> Here's a classic article that blurs the lines between image processing and automata. Very sad that it seems offline today.

[https://web.archive.org/web/20160325174539/http://freespace....](https://web.archive.org/web/20160325174539/http://freespace.virgin.net/hugo.elias/graphics/x_water.htm)

<comment><USER13> Thanks for this. I have been playing with CAs recently[1], and doing a lot of GIF rendering based on the Game of Life rules. This water rendering algorithm seems like a great next step for me to experiment with.

[1] [https://twitter.com/tweetgameoflife](https://twitter.com/tweetgameoflife)

</comment></comment></comment></comment></comment></comment><comment><USER14> The previous discussion has some good comments and links: [https://news.ycombinator.com/item?id=8966785](https://news.ycombinator.com/item?id=8966785)

</comment><comment><USER15> Nice site. This would've been very helpful to me in college when I was trying to get an intuitive grasp of Gaussian blurs and so on via the formulas.

<comment><USER16> In what context did you learn about Gaussian Blurs?

<comment><USER15> In Computer Vision, for image manipulation and so on. Using this book if you're interested: [https://www.amazon.com/Image-Processing-Analysis-Machine- Vis...](https://www.amazon.com/Image-Processing-Analysis-Machine- Vision/dp/049508252X)

<comment><USER16> I was interested. Thank you very much.

</comment></comment></comment></comment><comment><USER17> Man we need more articles like this.

So nice and clear.

I've been working with images for 12 years and I was never sure exactly what 'sharpen' actually did ...

</comment><comment><USER18> This was an interesting article though I am not an image-o-phile. However, what I really like was the base site! I am a part time instructor for business students and I am teaching them about the power of visualization. This is an incredibly illustrative source that explains points well, and I'll be able to use it as a teaching tool! Thanks for the post!

</comment><comment><USER19> Really cool way to see how image kernels work.

</comment><comment><USER20> Wish we had this when I was taking Discrete Math and Numerical Methods back in college. Really neat visualization!

</comment><comment><USER21> Bug: 3x3 blur kernel, e.g. [1 1 1; 1 1 1; 1 1 1], outputs white image.</comment>


Show HN: Brandfountain Curated Startup Domains - <AUTHOR> https://brandfountain.com <comment><USER2> very nice presentation and portfolio, sent you an email</comment>


Idea Sunday – have an idea you want to see executed? - <AUTHOR>

It is Sunday! If you have an idea you would like to see executed but do not have the time to do it yourself then share it here. <comment><USER2> Google Play store publishing service from a credible HN user. Allowing devs from unsupported countries to sell apps.</comment>


Spinnakr calls for the end of the data scientist to democratize analytics - <AUTHOR> http://pandodaily.com/2013/06/10/spinnakr-calls-for-death-of-the-data-scientist-in-push-to-democratize-analytics/

<comment><USER2> Awesome service. Good to see how far it's come since 500

</comment><comment><USER3> looks like a super simple yet powerful product... I can see a bunch of uses for this in future projects.</comment>


Peer-to-peer calling in Google Hangouts - <AUTHOR> https://support.google.com/hangouts/answer/6334301 <comment><USER2> What's the point? This is common for games, video, VoIP, etc.</comment>


Cyberattack on Google Said to Hit Password System - <AUTHOR> http://www.nytimes.com/2010/04/20/technology/20google.html <comment><USER2> tl;dr January 12 attack on Google China _By clicking on a link and connecting to a "poisoned" Web site, the employee inadvertently permitted the intruders to gain access to his (or her) personal computer and then to the computers of a critical group of software developers at Google's headquarters in Mountain View, Calif. Ultimately, the intruders were able to gain control of a software repository used by the development team._

<comment><USER3> Regarding the title of the article, the attackers stole the source to "Gaia", the single-sign-on system used by Google, and could potentially find previously-unknown security holes in it.

</comment></comment><comment><USER4> It's interesting how the world is changing. A whole host of "security" measures protecting all manner of information and services at companies both big and small are often based on a combination of security through obscurity and the assumption that any attack will be limited in scale.

Much like the phase change that occurred in the industry as the internet became popular and software developers could no longer ignore security I think we're headed for another phase change / inflection point as the stakes get raised. 5 years from now the default security assumption will probably be something along the lines of: "assume a hostile 1st world nation already has access to your internal network and is using a significant amount of resources to gain as much information and access to internal services as possible".

</comment><comment><USER5> I would be more surprised if someone did _not_ try to hack the Google login system. I'm assuming they're under constant attack from hackers.</comment>


CLI: Improved - <AUTHOR> https://remysharp.com/2018/08/23/cli-improved <comment><USER2> GNU Parallel is the first thing I usually install on top of a standard Unix userland. It's almost a superset of xargs, with many interesting features. It depends on perl, though.

htop is also pretty much a great replacement for top. And ripgrep a great replacement for the find | xargs grep pattern.

Aside from that, I'm pretty content with the Unix userland. It's remarkable how well tools have aged, thanks to being composable: doing one thing and communicating via plain text.

I'm less happy with the modern CLI-ncurses userland. Tools like e.g. mutt are little silos and don't compose that well. I've migrated to emacs, where the userland is much more composable.

<comment><USER3> I don't feel the plain text portion has aged well at all in regards to composability. It leads to a lot of headache as the complexity of the task grows because of the in-band signaling and lack of universal format. I think it is high time the standard unix tools were replaced with modern equivalents that had a consistent naming scheme and pipelined typed object data instead of plain text.

<comment><USER4> If Unix pipes gained support for exchanging some kind of out-of-band signalling messages, then CLI apps could tag their output as being in a particular format, or even the two ends of a pipe could negotiate about what format to use. If sending/receiving out-of-band messages was by some new API, then it could be done in a backwards compatible way. (e.g. if other end starts reading/writing/selecting/polling/etc without trying to send/receive a control message first, then the send/receive control message API returns some error code "other end doesn't support control messages")

I have suggested this before: [https://news.ycombinator.com/item?id=14675847](https://news.ycombinator.com/item?id=14675847)

(But I don't really care enough about the idea to try to implement it... it would need kernel changes plus enhancements to the user space tools to use it... but, hypothetically, if PTYs got this support as well as pipes, your CLI tool could mark its output as 'text/html', and then your terminal could embed a web browser right in the middle of your terminal window to display it.)

<comment><USER5> >your CLI tool could mark its output as 'text/html', and then your terminal could embed a web browser right in the middle of your terminal window to display it.

Ha ha, I had dreamed up something like this in one of my wilder imaginings, a while ago: A command-line shell at which you can type pipelines, involving some regular CLI commands, but also GUI commands as components, and when the pipeline is run, those GUIs will pop up in the middle of the pipeline, allow you to interact with them, and then any data output from them will go to the next component in the pipeline :) Don't actually know if the idea makes sense or would be useful.

<comment><USER6> Sure it makes sense. Just put `gvim /dev/stdin` in the pipeline you desire and write to stdout when you're done. You can add to your configuration to remap `ZZ` (which usually saves the file and exits) to `:wq! /dev/stdout` when stdout is not a terminal. I'm going to do that when I get back to my computer.

<comment><USER5> That sounds like a cool use of the concept. Will try it out. Thanks.

</comment></comment></comment></comment></comment></comment><comment><USER7> I feel like these tools very much go against the Unix philosophy of "Write programs that do one thing and do it well". They try to do the pretty user interface and the underlying operation in a single tool.

I prefer PowerShell in this respect where the output of each command is not text streams (as in the Unix world) but objects which can be operated on in a more object oriented way. You spend less time thinking about text parsing and more time thinking about the data you're working with.

I think the command line is great as a way of manipulating data streams but it is incredibly lacking as a user interface. There is very little consistency of the interface between commands and new commands and options aren't easily discoverable.

<comment><USER8> ripgrep definitely goes against the Unix philosophy. This is intentional. The Unix philosophy is a means to an end, and not an end unto itself. The key way that ripgrep violates the Unix philosophy is that it couples the filtering of what to search with the act of searching. You hit the nail on the head with styling, because the output of ripgrep is itself the thing that prevents composability.

However, from my own observations (and my own use), folks seem to appreciate having some amount of coupling and integration here. I've often seen folks claim that a legitimate use case (for them) for ripgrep is to "replace crazy 'find ./ ... | xargs' concoctions." The degree to which the aforementioned is "crazy" or not varies based on the individual, but there's a not insubstantial number of people who appreciate the succinctness that coupling brings.

As the maintainer, the coupling is annoying, because it means ripgrep needs to implement more stuff. For example, ripgrep provides a `--sort-files` option, which is something that standard grep doesn't need because you can fairly easy compose its output with 'sort'. You could do the same with ripgrep (ripgrep supports the standard composable grep output format), but then you lose the "pretty styling" that users appreciate. So you have no choice.

In terms of giving more structure to output, I am mostly unconvinced by your argument, but I've been happily using text streams as my user interface for a very long time, and I like its balance.

With that said, the next release of ripgrep will come with a --json flag, which enables structured output. :-)

<comment><USER9> Which I can then pipe to "gron" so that I can make something sensible and greppable out of that json output, right?

;)

<comment><USER10> Well, you could pipe it to "jq" \- [https://stedolan.github.io/jq/](https://stedolan.github.io/jq/)

<comment><USER11> Which is a pretty abominable tool TBH. It breaks on just about every little edge and isn't very useful unless you like to see pretty colors and nested outputs + learn it's terrible output formatting spec. When using json I still use jansson for quick one offs.

</comment></comment></comment></comment></comment><comment><USER12> Is anybody here aware of any TUI/CLI tools that bring UX patterns/ideas from other programs to the terminal?

Examples:

\- bash/zsh/fish bring suggestions/autocompletion

\- fzf brings fuzzily-matching selections to the terminal,

\- [https://github.com/ericfreese/rat](https://github.com/ericfreese/rat) brings the idea of "widgets" or "layouts",

\- [https://github.com/mrnugget/fzz](https://github.com/mrnugget/fzz) brings "preview as you type"

I'm looking for more patterns like that, mainly to explore how to make them work in the terminal and see whether that actually has an impact on everyday actions people perform in the terminal many times per day.

The goal is not to save time, but to reduce mental friction.

<comment><USER13> This is interesting. And I'm wondering if those patterns could be somehow useful also to design the interaction of chatbots.

</comment></comment><comment><USER14> rg > all other grep tools

[https://github.com/BurntSushi/ripgrep](https://github.com/BurntSushi/ripgrep)

<comment><USER15> Also you can get ripgrep and fzf plugins for vim which are fantastic.

I think VSCode uses ripgrep too.

<comment><USER16> VSCode uses ripgrep internally to do the cross project searching.

</comment></comment></comment><comment><USER17> With tools like these or ripgrep it is useful to know whether the authors try to replace the old tool or not. This is usually stated somewhere in their readme or faq.

If they choose to approach some problems with different semantics, I would not recommend to alias the new tool over the old one. Just treat it as a like a separate tool and in most cases their new names are as comfortable to type as the 'legacy' tool's. The one exception that comes to my mind is 'exa' vs. 'ls'. Typing 'ls' is a single action for both hands while 'exa' has to be typed with the left hand alone (on QWERTY/Z layouts).

<comment><USER14> If you like exa, maybe you like my modifications about hiding the time output optionally when using '\--long', too.

[https://github.com/thibran/exa/tree/time_style_hide](https://github.com/thibran/exa/tree/time_style_hide)

Example output of 'exa -l --time-style=hide':

        drwxr-xr-x - foo Desktop
        drwxr-xr-x - foo Documents
        drwxr-xr-x - foo Downloads
        drwxr-xr-x - foo Music
        drwxr-xr-x - foo Pictures
        drwxr-xr-x - foo src
        drwxr-xr-x - foo Videos

<comment><USER18> For just listing without additional info, I'm good with just the file tree. With '-l' it can show bunch of stuff.

      $ l (exa --tree --level 1)

[https://i.imgur.com/RxppCIt.png](https://i.imgur.com/RxppCIt.png)

      $ l2  (exa --tree --level 2)

[https://i.imgur.com/Mba79iz.png](https://i.imgur.com/Mba79iz.png)

<comment><USER19> How did you get the folder/file icons in there?

<comment><USER18> There's exa fork that allows --icons option but you need to patch your font to display them as they're text. (Search for nerdfont. Some are pre-patched.)

[https://github.com/ogham/exa/pull/368](https://github.com/ogham/exa/pull/368)

<comment><USER19> Thanks!

</comment></comment></comment></comment></comment></comment><comment><USER20> Is anyone else impressed with the quality (and speed!) of some of the tools written in Rust? I'm an avid user of fd and bat, the former being ridiculously fast. Often I find something on github, I'm impressed by the quality of the documentation, features, UI etc, then lo and behold it's written in Rust.

Another one potentially for this list is tokei[1] I was trying to count the code in our repos at work and used the venerable 'cloc' utility. It took over 5 minutes. Looking around I found tokei, written in rust. Same-ish results (more accurate actually) took _10 seconds_.

1\. [https://github.com/Aaronepower/tokei](https://github.com/Aaronepower/tokei)

<comment><USER21> IIRC, loc (in rust) might be even faster than tokei at times? I always forget, and I'm sure I saw an old benchmark...

We have a whole working group this year focused on making the experience of writing CLIs awesome, so hopefully we'll see even more great tools in the future!

<comment><USER5> >We have a whole working group this year focused on making the experience of writing CLIs awesome

Can you explain what you mean by this? Something like the people are going to focus on language and library features that help with writing CLIs? Or something else?

Asking because CLIs are one of my interests.

<comment><USER22> We've tried to dig into various problematic areas of writing CLIs in Rust [0], worked to create or improve libraries [1], and are working on writing a "book" for Rust-based CLIs [2].

You can reach out to us on gitter [3].

[0]: [https://github.com/rust-lang-nursery/cli- wg/issues](https://github.com/rust-lang-nursery/cli-wg/issues)

[1]: [https://github.com/rust-clique/](https://github.com/rust-clique/) and [https://github.com/assert-rs/](https://github.com/assert-rs/)

[2]: [https://rust-lang-nursery.github.io/cli-wg/index.html](https://rust- lang-nursery.github.io/cli-wg/index.html)

[3]: [https://gitter.im/rust-lang/WG-CLI](https://gitter.im/rust-lang/WG-CLI)

The areas we're trying to finish up for Rust 2018 Edition:

\- Get clap (arg parsing) to 3.0 [4]

\- Get assert_cmd [5] / assert_fs [6] to 1.0

\- Finish work on man-page generation [7]

\- Make it easier to package binaries [8] and document the CI for it [9]

[4]: [https://github.com/rust-lang-nursery/cli- wg/issues/41](https://github.com/rust-lang-nursery/cli-wg/issues/41)

[5]: [https://github.com/assert-rs/assert_cmd/](https://github.com/assert- rs/assert_cmd/)

[6]: [https://github.com/assert-rs/assert_fs](https://github.com/assert- rs/assert_fs)

[7]: [https://github.com/rust-lang-nursery/cli- wg/issues/38](https://github.com/rust-lang-nursery/cli-wg/issues/38)

[8]: [https://github.com/crate-ci/cargo-tarball](https://github.com/crate- ci/cargo-tarball)

[9]: [https://github.com/crate-ci/crate- ci.github.io](https://github.com/crate-ci/crate-ci.github.io)

<comment><USER5> Thanks for the detailed answer. Will check out some of those links.

</comment></comment></comment></comment></comment><comment><USER23> I like these kinds of articles, but it's rare I need that many CLI tools on my MacBook.

I interact with hundreds of servers on a day-to-day basis, and I don't want to go around installing random tools on my servers. But I guess it's an idea for some tools to add to my Ansible server provisioning script :-)

<comment><USER18> I always update my Ansible script when I find something worthwhile.

Besides, why not just make a $HOME/bin/ and throw your new stuff in there?

<comment><USER24> that's what I do, and a git repo for my dot files

</comment></comment></comment><comment><USER25> "I'm not sure many web developers can get away without visiting the command line."

IIS has significant market share. I'll bet most web developers who deploy on it get away without having to use the command line interface very often if at all.

[https://news.netcraft.com/archives/2018/08/24/august-2018-we...](https://news.netcraft.com/archives/2018/08/24/august-2018-web- server-survey.html)

<comment><USER26> I have co-workers who work on a big intranet web application that runs on IIS, and they never touch it.

They recently finally switched to git for source control, and they want to do everything via GUI. I've tried to show them how some things are just easier/better from the command line, but if something isn't doable via GUI, they won't do it. One of them keeps committing line endings differently than everyone else, and he literally won't run _git config --global core.autocrlf true_ because... I dunno why. He just doesn't want to, because it's the command line.

<comment><USER27> Git has such a terrible command line that most things are easier in (good) GUIs than on the command line.

The only exceptions I can think of are interactive rebase which has a weirdly good command line interface and is really confusing in every GUI I've tried; and continuing/aborting rebase and cherry picks when there is a conflict. And that's only because most GUIs don't bother to actually implement that properly and mislead you into thinking that you should make a new commit.

<comment><USER6> I find git to be one of the best CLI programs I've ever used.

There are a few things I don't like, like how `git blame` requires me to put my terminal in fullscreen to see the output properly. I wish there was an option to make the output group changes of a commit together. It could put the commit details on a line before and add a single character prefix to all lines to differentiate between file lines and commit lines, just like how ag/ack/rg improve grep's output format for human viewing.

There's also a long-standing bug in `git log --graph` that causes the lines of the graph to sometimes move back to the previous line at the end of a commit description.

I love the -p/\--patch option that's available in many subcommands. It's really quick to work with.

What specific things do you not like about git's CLI?

<comment><USER28> The CLI for Git is one of the most confusing CLIs I've ever seen. I can describe all the warts here, but other did that better than me: [http://stevelosh.com/blog/2013/04/git- koans/](http://stevelosh.com/blog/2013/04/git-koans/)

Besides the inconsistencies, there are many gotchas which keep tripping developers. For instance, git pull always tries to merge in the remote branch, but you almost never want that. You can do: git pull --ff-only, but most developers I know don't know that and end up with a mess they have to spend time cleaning up.

The main issue is that git commands mix up so many concepts and the defaults are almost always useless. For instance, git add manages tracking files and staging commits. git rebase both deals with rebasing and history clean-up (rebase -i).

A better CLI would just have consistent clear verbs that expose the git model properly instead of mixing up concepts:

      git track    <file>
      git untrack  <file>
      git stage    <file>
      git unstage  <file>
      git commit

And the syntax for creating/deleting/removing branches, remotes and tags would be unified.

<comment><USER29> Fire and forget as part of team setup guidelines:

        git config --global pull.ff only

</comment></comment></comment></comment></comment></comment><comment><USER30> Another tool I use religiously: `autojump` (aliased to `j`) rather than `cd`. It learns where you go and lets you fuzzy-jump there.

[https://github.com/wting/autojump](https://github.com/wting/autojump)

I also use `loop`, my own Rust-based replacement to bash's native loops:

[https://github.com/Miserlou/Loop](https://github.com/Miserlou/Loop)

<comment><USER31> I've found fasd ([https://github.com/clvv/fasd](https://github.com/clvv/fasd)) to be the most featureful of the directory jumping tools, and it's much faster than autojump as well.

I'd be remiss not to mention pazi however, which is the tool I wrote to replace fasd in my own workflow: [https://github.com/euank/pazi](https://github.com/euank/pazi)

It's similar to autojump, but _much_ faster: [https://github.com/euank/pazi/blob/master/docs/Benchmarks.md...](https://github.com/euank/pazi/blob/master/docs/Benchmarks.md#benchmarks)

Oh, and it's written in rust :)

<comment><USER32> [https://github.com/gsamokovarov/jump](https://github.com/gsamokovarov/jump) You can benchmark this tool to be fastest

</comment></comment></comment><comment><USER33> I'm surprised that no-one has mentioned mtr yet. I like it much better than ping/traceroute and I don't really see anything in prettyping that makes me willing to switch.

<comment><USER34> I use mtr every day, and I haven't seen anything that beats it.

You can even press 'd' twice, and you'll get something similar to prettyping, but you get it for each hop along the path.

</comment></comment><comment><USER35> At the end of the article csvkit is given an honourable mention. I'm a big fan and I've used it a lot in the past, but these days I'd say that xsv > csvkit for working with CSV files on the command-line.

[https://github.com/BurntSushi/xsv](https://github.com/BurntSushi/xsv)

<comment><USER36> I don't know how it compares to xsv, but you might be interested in Miller/mlr ([http://johnkerl.org/miller/doc/index.html](http://johnkerl.org/miller/doc/index.html)), I've used it because csvkit was too slow for what I needed to do and was pleasantly surprised by its features.

</comment></comment><comment><USER37> Re: bat > cat

Cat is just a tool to dump files to stdout and maybe concatenate them. If you want paging, syntax highlighting, etc, you probably want a tool to replace `less`, not `cat`.

<comment><USER38> view is also perfectly good, it's vim's pager.

<comment><USER39> Isn't "view" just an alias to invoke vim on read-only mode (i.e. you can still edit the text, do anything else you can do on vim and then save the contents to another file instead of the original file)?

<comment><USER40> The man page suggests it's equivalent to "vim -R". I usually use that because "view" seems to ignore my .vimrc for some reason.

</comment></comment></comment></comment><comment><USER41> I keep a running list in my dotfiles repo[1] of the Unix replacements that I use. One downside is that I don't know the standard tools as well as I would like because I almost never use them.

[1]: [https://github.com/dguo/dotfiles#replacements-for-unix- comma...](https://github.com/dguo/dotfiles#replacements-for-unix-commands)

</comment><comment><USER42> I'd really love to know why 99% of the well made, polished and fastest of these tools are made using Rust if anyone patient enough cares to explain.

Is Rust a particularly good fit for CLI tools like these ? Why so ?

<comment><USER43> Rust is compiled, is fast and it's a modern language. It's also a demanding language so people who are willing to learn it are more likely to be craftsmen.

</comment></comment><comment><USER44> Noti looks nice, but typically I just do `whatever-long-command && tput bel`. On Macs, the Terminal dock icon bounces and gets a badge whenever the console bell rings and the terminal is in the background.

[https://apple.stackexchange.com/questions/47801/is-there- any...](https://apple.stackexchange.com/questions/47801/is-there-any-way-to- have-a-badge-appear-on-the-terminal-icon-in-the-dock-when-a)

<comment><USER45> This is one of my favorite tricks. The nice thing is that it still works if you're ssh'ed into a remote host. If I'm feeling nostalgic I'll do '... && say "files done"' (which only works locally)

</comment></comment><comment><USER46> There's the convenience of these tools, then there's convenience of having a small number of non-standard tools to carry along with you, however easy that may be.

For example, for any diff'ing or cat-like need, I find it SUPER handy to just pipe stdout to vim like so:

$> thing-with-output-that-needs-navigating | vim -

I'm not an Emacs user, but my impression is that over in that world, the shell integrations are crazy good.

</comment><comment><USER47> The inclusion of Ponysay over cowsay is dubious at best.

Let me be clear: Ponysay has its niche. But with the Ansible stack providing great out of the box integration with Cowsay, it's clear which is the tool of choice for modern workflows.

On a serious note, TL:DR is amazing in some cases. The man page for "tar" compared to the TL:DR is much more unwieldy for 99% of use cases, for example.

I love ripgrep and htop, and I think that a lot of people new to *nix cli's would love tree as well!

</comment><comment><USER48> >The talk reviews reasons for UNIX's popularity and shows, using UCB cat as a primary example, how UNIX has grown fat. cat isn't for printing files with line numbers, it isn't for compressing multiple blank lines, it's not for looking at non-printing ASCII characters, it's for concatenating files.

>We are reminded that ls isn't the place for code to break a single column into multiple ones, and that mailnews shouldn't have its own more processing or joke encryption code.

</comment><comment><USER49> As far as pretty CLI diff tools goes, the prettiest by far is: [https://sw.kovidgoyal.net/kitty/kittens/diff.html](https://sw.kovidgoyal.net/kitty/kittens/diff.html)

The downside being it requires the kitty terminal as it uses features not present in other terminals.

</comment><comment><USER50> Nice list, but I tend to keep my stuff as close to default as possible. The feeling of not being at home on a new box outweighs the benefits of customizations, in most of the cases.

I do have a huge .vimrc and some bash niceties, but I found it better for me to exercise some customization discipline overall.

<comment><USER51> Yes i do exactly the same thing!

</comment></comment><comment><USER52> My htop usage has led me to a point where don't remember how to use top (sort, kill processes, etc.) :D

</comment><comment><USER53> \- ranger (and the ranger-cd script) are pretty useful to explore folders in the terminal. [https://github.com/ranger/ranger](https://github.com/ranger/ranger)

\- percol and ripgrep as alternatives to grep

\- tig as TUI for git

\- kakoune as alternative to vim

<comment><USER18> I like vifm over ranger. Simple dual pane with vi key binding.

<comment><USER53> Nice! this way better

</comment></comment></comment><comment><USER54> I'm so relieved that this blog post isn't about a Bash library. It's definitely a great collection of tools; I'm going to have to add some of these to my recommendations.

</comment><comment><USER55> Thanks for sharing. I'm always looking for ways to improve my CLI experience and there's some gems in here that I've not come across before.

</comment><comment><USER56> Filewatcher does the same as entr. In addition it exports environment variables. It makes it possible to send the name of the updated file as a parameter to commands like this:

      $ filewatcher '**/*.js' 'jshint $FILENAME'

[https://github.com/thomasfl/filewatcher](https://github.com/thomasfl/filewatcher)

</comment><comment><USER57> > _The bat command also allows me to search during output (only if the output > is longer than the screen height) using the / key binding (similarly to less > searching)._

You can do this with `less -F <file>`. It will show the file on the screen like `cat` unless it is longer than one screen, then it will go into paging mode and allow search with `/`.

Side note, how do you make his nice-looking prompt?

<comment><USER58> you don't need the -F do you? unless I'm missing something you're saying about less

<comment> another-cuppa That makes it exit immediately like cat.

<comment><USER58> oh. but why would you want to? even for a 1 page file i still want to / most of the time

</comment></comment></comment></comment><comment><USER59> cat's primary purpose is combining files together. For example:

        cat mysoftware.tar.gz mysoftware.sig > mysoftware.bin

Combines an archive with a digital signature into a single file. Then, on the other end, you just need to pop off the signature with a tail -1

Or alternatively:

        cat a.log b.log c.log > monolith.log

<comment><USER60> Of course, but its primary purpose (combining files) differs from its primary usage (showing a file's content).

<comment><USER61> The primary usage us just a special case of its primary purpose. You're concatenating the file with nothing.

<comment><USER18> I never concatenated a file using cat.

</comment></comment></comment></comment><comment><USER18> Anyone know of a good markdown viewer that is formatted instead of showing the source with colors?

I'm using pandoc to convert it to groff and read it like a formatted man page, which is ok but not great as it loses some formatting.

      pandoc -s -f markdown -t man markdown.md | groff -T utf8 -man | less -R

<comment><USER12> Actually plain less works quite well when using filters:

      #!/bin/bash
      # ~/.lessfilter
      case $1 in
        *.md) view-md $1;;
        *.json) jq -C . $1;;
        *) pygmentize $1;;
      esac

Where view-md is just a thin wrapper around tty-markdown[1]:

      #!/usr/bin/env ruby

      require 'tty-markdown'

      puts TTY::Markdown.parse(ARGF.read, colors: 256)

[1]: [https://github.com/piotrmurach/tty- markdown](https://github.com/piotrmurach/tty-markdown)

</comment></comment><comment><USER33> He mentions using ccat previously, I've been using it for a while (aliased as `cat`) but I've been meaning to switch away from it since it sometimes panics. `bat` looks very nice, just installed it and played around with it a bit.

</comment><comment><USER62> atop as replacement for both top and htop. By default it dispays CPU frequences, disk i/o (read, write bw, average io time), disk io per process, basic network load. And it wastes no space as htop does.

</comment><comment><USER63> I use `sn` instead of `du`. It's closer to `du` than `ncdu`.

[http://github.com/vmchale/tin-summer](http://github.com/vmchale/tin-summer)

</comment><comment><USER64> > There is a weird bug in Mac Sierra that can be overcome by running htop as > root

I don't think this was a bug; I think the issue was that htop uses needed something in task_for_pid that required root.

<comment><USER29> Oh this was definitely a bug already, and a nasty one at that, as it froze the whole computer in a few minutes while the kernel was racing against itself and starving for some resource (which didn't happen while being run as root). It was fixed in macOS 10.13.4 / htop 2.2.0

[https://github.com/hishamhm/htop/commit/b2771218](https://github.com/hishamhm/htop/commit/b2771218)

[https://github.com/hishamhm/htop/issues/682](https://github.com/hishamhm/htop/issues/682)

<comment><USER64> Ah, that bug has now been fixed.

</comment></comment></comment><comment><USER65> [https://github.com/direnv/direnv](https://github.com/direnv/direnv) very Important for me, to load envs

</comment><comment><USER66> With ramda-cli, the jq example would be:

        npm outdated --json | ramda --raw-output 'map (.latest)' to-pairs 'map join "@"'

</comment><comment><USER67> Aliasing "help" is not a great idea, in my opinion. help gives fantastic usage instructions for builtin shell commands.

</comment><comment><USER68> Why not just using vim instead of bat?

<comment><USER69> or view (comes with vim)

</comment></comment><comment><USER70> fzf is awesome, but i don't combine it with a shortcut, i just feed its output to xdg-open

        alias o="fzf --preview 'bat --color=always {}' | xargs -i '{}' xdg-open '{}'"

</comment><comment><USER71> I'm surprised ripgrep isn't on here.

</comment><comment><USER72> atop > htop

[https://www.atoptool.nl/](https://www.atoptool.nl/)

<comment><USER18> I've fallen back to using gotop when all of these alternatives' outputs are too noisy.

</comment></comment><comment><USER73> climproved

</comment><comment> another-cuppa "bat" is not a better version of cat, it's a completely different tool. cat is short for concatenate. If you want to view a file use less, and if you want syntax highlighting etc. then use view (comes with vim).

<comment><USER6> Most tools mentioned are completely different tools from the ones they're suggested to be better versions of. I understand the comparison is for specific use-cases. For example, csvkit is far better than trying and failing to parse CSV with awk, but it's very much useless for any other type of text format. Same thing with jq (a JSON query tool) vs grep (a general text search tool). The only ones I can agree with in the general case are htop > top and ag || ack > grep (though I still prefer grep sometimes).

<comment><USER8> If you don't mind me asking, in roughly what cases do you reach for grep instead of ag || ack? Is it a familiarity thing, or specific features or something else?

<comment><USER74> Not the gp, but I generally use ripgrep when I want to find something manually, and regular grep in a script.

<comment><USER5> Why? Does ripgrep not work as well (or better) than grep in a script? And if so, why not?

Or is because you deploy your scripts to other machines where ripgrep may not be present, but grep will?

<comment><USER6> Scripts tend to be shared, so portability matters. grep alternatives, while great for interactive use, are generally not worth being an extra dependency to install.

</comment></comment></comment></comment></comment></comment><comment><USER75> Can we use the term text user interface (TUI) and not CLI for stuff talked about here. I don't like the confusion and I think TUI I'd appropriate, just because something is launched by command line doesn't make it a CLI. A CLI is good for pipes, these things are interactive post start.

<comment><USER76> bat can pipe just like cat, fzf can pipe and be piped, same ack/ag/rg, same for fd, same for jq.

</comment></comment><comment><USER58> bat is cool but is there a way to get not to dump everything into my terminal and just page just like less? i wonder if there's a `bless` ?

<comment><USER77> You should be able to pass `--paging always`. The default `auto` will only page if the file contents is bigger than your screen.

<comment><USER58> this does paging but still leaves the page in my buffer/terminal/whatever.

</comment></comment></comment><comment><USER78> I was wondering if any of you use alternatives or hacks for the cd command?

I've been testing out a couple of different ones, like xd, fcd, wcd and pushd/popd, but I'm not quite sure which I should commit to or if there are better ways :)

<comment><USER55> Few from my aliases file that may help:

       7   │ alias ..="cd .."
       8   │ alias ...="cd ../.."
       9   │ alias gcd="cd (git rev-parse --show-toplevel)"

The first two should be self explanatory.

The third one will take you to the "git root" of a directory structure, i.e. the top-level folder where the .git directory is (I find this grounds me for when I'm doing git commands.)</comment></comment>


Developing Your Intuition For Math - <AUTHOR> http://betterexplained.com/articles/developing-your-intuition-for-math/

<comment><USER2> Putting math in historical perspective helps a lot. Like most students I was taught the Calculus with the rigorous epsilon delta definition of a limit which was then used to define derivatives. It never really clicked until I read the historical context for Newton. He didn't use limits, but used infinitesimals, which are less rigorous but make a lot more sense to me at least.

<comment><USER3> I totally agree -- epsilons and deltas were invented to deal with issues of rigor that were raised 100 years after Newton. In the meanwhile, he was getting stuff done with his "nonrigorous" Calculus.</comment></comment>


What is a Higgs Boson? Beautifully explained by Dr.John Ellis - <AUTHOR> http://cdsweb.cern.ch/record/1458922

<comment><USER2> Where can I get that t-shirt?

<comment><USER3> "If you look at the basic equations of the standard model, as written on my t-shirt." LOL</comment></comment>


Rwanda braces itself for Broadband Internet - <AUTHOR> http://news.bbc.co.uk/2/hi/technology/8266290.stm

<comment><USER2> In 2004, I spent a summer in Rwanda working for Terracom, the ISP that laid down the fiber mentioned in the end of this video. My friend Sean and I carried the fiber splicer used for the initial rollout as a carry-on.

From my biased and limited perspective, the challenges in bringing internet access to Rwanda are hardly technological, but overwhelmingly political.

I'd rather not go into the details of the political problems here. But here are some things I'm pretty sure are true and partial causes to The Problem of Bringing Internet to Rwanda:

\- Rwanda has a very unreliable power infrastructure. I remember standing on the roof of building that Terracom was in, watching a blackout roll across the city.

\- Last time I checked, there was no IX in Rwanda.

\- Terracom deployed a very extensive fiber network. But, much like the fiber network owned by the City of San Francisco, this network is hardly used. Most of the schools have unplugged equipment racked in a closet.

\- The cell phone network in Rwanda is amazing, I was very upset when I returned to the pathetic offerings in the United States. Shortly after I left, Terracom and MTN both offered high speed links over their cell networks, but ...

\- Because it is a land locked country. Getting high bandwidth, low latency connectivity is capital 'H' Hard. Satellite links are expensive, and have a minimum of 1000 ms latency. Running fiber to the coast and tapping in to a undersea cable is out of the question. See also: o3bnetworks.com

<comment><USER3> Why would you rather not talk about the "overwhelmingly political" problems? As a Kenyan I believe they would apply in my country and I would love to learn more.

<comment><USER2> Because I don't feel comfortable giving my opinion on maters where I have a limited understanding, and I can say with certainty that I don't understand the political climate in Rwanda - I'm just another muzungu as far as this matter is concerned ;)

</comment></comment></comment><comment><USER4> Excellent find, and much more detailed than most BBC articles. The scope of both the challenges and the opportunities is sobering. I think they're on the right track to push for information structure in parallel with other kids, rather than following the sequential path history suggests.

</comment><comment><USER5> I note there's a co-credit on the graphic for the Shuttleworth Foundation. Anyone know their involvement?

<comment><USER6> Possibly related to what's mentioned here: [http://www.shuttleworthfoundation.org/our- work/blogs/rwanda-...](http://www.shuttleworthfoundation.org/our- work/blogs/rwanda-africa%E2%80%99s-high-tech-hub)

Keep in mind that the Shuttleworth Foundation is about improving education and technology in Africa, particularly Mark Shuttleworth's native country of South Africa. I don't think it has anything in particular to do with Ubuntu Linux, though that's what many people associate Shuttleworth with.

</comment></comment><comment><USER7> Great, but first, I believe that Rwandans should be coaxed into fewer children per family (my mom is from Rwanda, so I know my fair share about this). There's just not a large enough surplus of wealth to really sustain this. There are people who live in houses smaller than your bathroom (6ft. x 6ft. x 6ft.), with 1 mother and 2 toddlers. That's not ok. Sure, it'd be great if Kigali would have broadband, but the government should take care of its people, _then_ its computers.

Although, I do agree with it being called the fastest recovering country in Africa. But then, maybe I'm just biased ;)

<comment><USER3> The problem of population growth is complex and multi faceted. From religions that oppose contraceptives(Catholic), lack of basic education, lack of health facilities that offer affordable family planning etc etc. I live in Kenya and I have seen many women who want to plan their families and did not know how or cannot afford it.</comment></comment>


We Cooked a Peacock - <AUTHOR> http://www.npr.org/sections/money/2016/01/01/461504972/episode-674-we-cooked-a-peacock <comment><USER2> The farmer at the beginning hit it head on. Have you ever met a peacock? If so, you don't have any qualms about eating one.

</comment><comment><USER3> Judging by the ingredients and the cooking directions, both the peafowl pie and the claret recipes read more like overdone status signaling by the "spice barons" than anything like tasteful fine dining. This is the culinary equivalent of "how to gold-plate the brand badges on your Mercedes, and then fuse rainbow glitter to them."

</comment><comment><USER4> I listened to this earlier today - and had to head directly to their site to see pictures. A little odd, even for planet money, but a good way to start my day.

</comment><comment><USER5> I wouldn't even eat a bald eagle, probably full of toxic chemicals.

<comment><USER6> They contain less DDT than they used to.</comment></comment>


Chronas – an interactive history map - <AUTHOR> https://chronas.org <comment><USER2> I'm not sure about its historical accuracy. For example it says that the whole of Russia in 18th century was Sweden.

</comment><comment><USER3> Very cool! Buggy, though; I've experienced two crashes ('Something went wrong') in < 5 minutes of usage.

Safari Version 12.0.2

</comment><comment><USER4> Feature request: I need a play button

</comment><comment><USER5> Great idea! wish you guys the best.</comment>


Ed Catmull of Pixar: Keep Your Crises Small - <AUTHOR> http://www.youtube.com/watch?v=k2h2lvhzMDc

<comment><USER2> The Stanford Business videos here are among some of the best entrepreneurship media online. Do check out the rest.</comment>