Programming is boring art - <AUTHOR> https://ahsmart.com/pub/programming-is-boring-art/ <comment><USER2> Comments are harsh on what I took merely as a pedagogical example, but maybe it's because y'all have been burned so many times. I agree with you who advise to resist speculative programming. Don't write it till you need it, since all code incurs a burden of maintenance.

But I would like to address a tangent: extracting configuration from code. Let's take the article's example and change it a little. I'll decompose it, since it already has become a function, but often the first step is just a series of statements. (I will also port it to javascriptish pseudocode, since I don't know Julia.) So this might be your first draft:

      response = HTTP.get('https://www.example.com/');

      if (response.status !== 200) {
         email('email@example.com', 'something is wrong');
      }

Instead of abstracting this into more general functions, I might simply move the literals to the top of the file:

      url = 'https://www.example.com/';
      ok  =  200;
      to  = 'email@example.com';
      msg = 'something is wrong';

      response = HTTP.get(url);

      if (response.status !== ok) {
          email(to, msg);
      }

The only reason I know to do this is to maybe make changes easier. Even if you never need to generalize your code to other uses, you may need to update it for reasons outside your control. For example, someone leaves the company, and now you need to email firstname.lastname@example.com. Or marketing changes the URL.

Is there a name for this kind of refactoring?

<comment><AUTHOR> I don't know if there's any name about this specific refactoring change :-)

In general, it is best to create small functions that takes few dependent variables for the intended flexibility. The first judgment here is to decide whether a value should be a constant or variable. Constants would then be declared at the top, and variables come in as function arguments.

You reminded me that another pattern to handle this is to put some of these values as configuration parameters. For example, the email alert may need to be sent to different people for different environments - DEV, QA, and PROD.

<comment><USER3> In the grand-parent comment's example, you just want it to be more readable, because it is a once off block of code, so that whoever maintains it next can easily figure out what it is doing. Moving it into a function doesn't stop it from being a once off block of code, and we need to be careful not to increase complexity for the sake of it. By your last paragraph you had already introduced a configuration store and the concept of environments!

<comment><USER2> In all fairness, I led him that way. I called it "extracting configuration from code", which is reminiscent of #3 of the 12-Factor App ([https://12factor.net/config](https://12factor.net/config)).

You can extract config to various degrees. My example is perhaps the mildest: just group it together, near the beginning. You don't need complex frameworks. In fact this technique first caught my attention when I was reading other people's shell scripts.

The next step would be to move the config to its own file. This is very common in Linux. You have some tight binary, that is compiled and hard to change. But then you have config files, often with dozens of options. It's a nice way to do things.

The next step would be to move the config to a different level, no longer in a simple file. This is often either a relational database or environmental variables. Linux commands use environmental variables along with their config files.

For very large systems, this technique is the same in kind, just different in degree. You get fancy specialized systems, like Hashicorp Vault, to store your configuration, at least your secret ones, like passwords and stuff.

</comment></comment></comment></comment><comment><USER4> > There is nothing wrong with this function. Really. It does exactly what it > should do with the least amount of code. In fact, this is probably what I > want to deploy in production as well. But, it is inflexible.

It does one well-defined thing, and does it well! That's the good kind of 'inflexible'.

> A skillful programmer looks at the problem and says, hey, why don't we build > an abstraction layer to make it more flexible?

In this example, the additional complexity just doesn't seem justified. You ain't gonna need it. [0] Unnecessary abstractions cause bugs, bloat, and baggage. The article then goes on to acknowledge this, but I really question the chosen example.

> Just having these few abstractions opens up a lot of possibilities. Why? > Let's suppose that you have 3 different kinds of fetchers and 3 kinds of > notifiers. Now, you can easily compose 3 x 3 = 9 different kinds of health > checks.

You've just introduced an exponential explosion into your testing burden. The pay-off: additional functionality that _might_ be useful later.

 _edit_ On reflection I suppose it's not a 'exponential explosion', it's merely a 'multiplicative explosion'.

> Enjoy your programming life. It's a fun art!

The article doesn't go into detail on what it means here, but the more serious the software work, the less the artistic mindset applies. [1]

I think the most sensible approach to software engineering is to draw satisfaction from solving a challenging problem well. Things like 'programmer freedom' strike me as false idols.

That said, I'm a sucker for elegance (a famously subjective commodity), so maybe I'm a hypocrite.

[0] [https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it](https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it)

[1] [https://www.fastcompany.com/28121/they-write-right- stuff](https://www.fastcompany.com/28121/they-write-right-stuff)

<comment><USER5> Ding ding ding. I agree one hundred percent. This isn't elegant, this is needlessly over engineered and now much more likely to slow development. The biggest cost isn't lines of code, it's understanding abstractions.

What happens when an "abstractnotifier" blows up? Where does the error happen? what are the possible side effects? What systems might be impacted?

What happens when 'alert's start failing? Is it queued/buffered? Do I need to worry about OOM errors on systems? Will it retry?

I lead a team of developers - This kind of abstraction tends to slow everything down. The only place it fits is during a refactor of software delivering real business value already. Basically - You can do this if you know exactly what your requirements are, and this nicely solves them.

If you do this before you understand EXACTLY what you need, you're going to be wrong. You will abstract the wrong pieces, with the wrong assumptions. I promise you. Then later you have to rip it all apart anyways, except now instead of 4 simple lines with clear consequences, you have a bloated monster of bad assumptions.

<comment><USER6> >If you do this before you understand EXACTLY what you need, you're going to be wrong.

The main problem with this is culture imo. I agree 100%, but it is so hard to fight against the idea that "real engineering" or being a "good developer" means tiers of abstraction.

To me, being a good developer actually means understanding what your operating parameters are, and then writing the smallest amount of code that satisfies the business requirement. Sometimes (a lot of times!) this DOES mean you have to go back and refactor or completely throw away code. By _design_ you chose to only solve the immediate problem. However, culturally, this is seen as a failure rather than a success.

</comment></comment></comment><comment><USER7> These articles reliably confuse art with craft and technique.

Art is about giving other people rich, engaging experiences that distill and/or highlight some element of relatable human emotional, psychological, and/or sensual experience.

The more unusual, original, and insightful the experience, the more interesting the art.

Doing something difficult with elegance is not art. Solving problems is not art. Complex but comprehensible systems that have "beauty" are not art.

If there's no emotional or sensual content, there's no art - just technique.

There's nothing wrong with technique, and art isn't better or worse than technique on its own terms. But they're _different languages_ with different goals.

Calling software abstraction "art" is like watching someone who has discovered a for loop trying to persuade you they're an expert developer.

<comment><USER2> > Art is about giving other people rich, engaging experiences that distill > and/or highlight some element of relatable human emotional, psychological, > and/or sensual experience. The more unusual, original, and insightful the > experience, the more interesting the art.

This is a great definition (and this is coming from someone who has studied it for decades).

I wonder, though, if you're being too hard on the writer. _Art_ originally meant the same as _skill_ or _craft_ ([https://www.etymonline.com/word/art#etymonline_v_17037](https://www.etymonline.com/word/art#etymonline_v_17037)). You can see it also in the word _artisan_ , which would likely be applied to a cobbler or carpenter. I believe you are defining the _fine arts_ , which more specifically refer to art purely for the sake of emotional expression, as opposed to the more practical arts, like cabinetry.

Nowadays the sense of the word _art_ has narrowed more to what you're saying, to what our forebears meant by _fine arts_. But it is not always used that way. Many times I have heard people refer to common, practical activities as requiring some "art". Or they might say that someone who does it with exquisite taste has elevated the activity to art (like, cooking). This is even though it wasn't about, as you say, distilling experience into some other medium.

People loosely use the word _art_ any time that an activity presents some options, any time there is a choice to be made, and a much better result happens when you choose well. By this definition, almost anything could be called an art, or at least could involve art. The only exceptions would be things that are 100% formulaic, like maybe working an assembly line (even then, I wonder if assembly-line workers distinguish some room for art in their duties).

The two meanings continue to intermingle, because all of the arts take craft, and all of the crafts take art. If you want to be a composer, painter, or writer, there are skills to master (the musical scales, paintbrushes, sentence structure). If you want to be a carpenter, chef, or architect, there are always choices to be made, every project is unique in its own little ways.

My point is, your definition is very useful to anyone attempting fine art. But I wouldn't attack people who use the word more broadly (and this is coming from someone who likes writing and who often is irritated by imprecise diction).

<comment><USER8> Boring means that it's predictable, something you'd expect or have seen before.

In design you work towards a desired outcome, usually something that adresses a group of people, and therefore a set of characteristics. The outcome can be repeated, or changed in a predictable manner. That what lies between the outcome and your intent is what design is obsessed with, process, templating, decoupling from environmental factors, including your own personal characteristics. Sounds like functional and good OO programming right?

Art is the opposite, it's obsessed about capturing unique outcomes, originality. This means that what lies between the outcome and your intent is also about the opposite, coupling unique personal and evironmental inputs.

Performing arts, or arts and crafts are more like design, outcome driven, it's only that they can't remove human inputs because those are also expected to be there.

</comment></comment></comment><comment><USER9> I don't consider programming an art in the term of humanities (eg painting/drawing/music etc) but more a craft (eg cabinet making, stonemasonery).

There are assemblers, people that can follow a set of IKEA instructions and end up with a reasonably stable bookshelf. The average starting developer out of college is at this level.

There are journeymen programmers, they have a few years experience, understand some of the nuances, know a bit about what doesn't work, can use the word "strategy" both correctly and ironically.

Then there are master craftsmen, they understand the material they are working with. Know when to use an IKEA wooden dowel and when a custom joint is required. They build cabinetry that can be on display for its own inherent structure and leverage the natural capabilities of the material.

The same applies to programming, both in the small and in the large.

<comment><USER10> Programming can be everything.

I agree that most programming is craftsmanship.

Code like the Obfuscated C Contest is art.

The code that orchestrates your cloud servers is more like engineering.

Prototypes in language research is science.

</comment></comment><comment><USER11> One of the most beautiful pieces of code I've ever read is this:

[https://github.com/solvespace/solvespace/blob/master/src/srf...](https://github.com/solvespace/solvespace/blob/master/src/srf/ratpoly.cpp)

If you have a basic understanding of spline and NURBS surfaces but never knew how you might actually implement that, well there it is. Incredibly readable IMHO.

<comment><USER12> If you want to write truly beautiful geometric code, watch this:

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

Discussed here:

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

<comment><USER11> I kid you not, I just watched that 2 days ago at the suggestion of a friend. It will take more viewings and study to digest. Really amzing!

</comment></comment></comment><comment><USER13> > A skillful programmer looks at the problem and says, hey, why don't we build > an abstraction layer to make it more flexible?

No he doesn't

<comment><USER14> On the other hand looking into my internal glas orb and expecting the next possible or useful use-case amd making my code flexible / abstract, while keeping it readable, enough to also represent that use-case has saved me hours time and time again.

I think there is something to say for not overdoing it, but for not mindlessly implementing only the thing either. Thinking about what is the next abstraction that includes the functionality your want to implement and also is useful to implement anyway, because you already expect the need for flexibility in a certain direction.

It depends probably on what type of software you write. Just a few procedures in a legacy code or a little command line tool, standing on its own for example.

Certainly implementing only "the thing" gets the job done though. Perhaps doing more is doing more than what one is paid for.

<comment><USER13> I write code that lasts decades and I can promise you a glass orb is unnecessary.

</comment></comment></comment><comment><USER5> I don't disagree with your title. I pretty strongly disagree with your content.

You started with a simple solution that nicely handles the current needs.

You then over-engineered a solution so badly that you haven't even noticed the 'url' param isn't used in the last method you've shown.

You went from simple enough a junior dev can make meaningful changes, to bloated enough the original author is fucking it up.

Don't do this. Wait until you actually have a REAL use case for adding complexity.

<comment><AUTHOR> OP here. Thanks for the note.

The intention to illustrate the power of abstraction. Based upon yours and other people's comments below, perhaps it wasn't the best example.

I did correct the typo about 'url'. Best regards.

<comment><USER15> A good rule of thumb is to abstract inherent complexity and not incidental complexity.

Loggers are examples of incidental complexity. There is nothing fundamental about sending the warning by email vs slack vs irc. The way to deal with this is not to keep adding more and more options, because you end up with combinatorial growth in the number of interactions, it's to make it company policy that you only use email and discipline anyone who doesn't.

<comment><USER16> _> There is nothing fundamental about sending the warning by email vs slack vs irc._

I agree with this but I would put it somewhat differently. To me, notifications are a separate service, and whatever options there are for notification should be orthogonal to whatever is doing the notifying. If company A's policy is that notifications only go by email, nothing else, while company B has email, slack, and irc, that's for their respective notification services to worry about, not for each individual application that is using the notification service. To the application, it should be send_notification(content, recipient) and that's it.

</comment></comment></comment></comment><comment><USER17> [https://en.wikipedia.org/wiki/Asemic_writing](https://en.wikipedia.org/wiki/Asemic_writing)

[https://en.wikipedia.org/wiki/Artist%27s_book](https://en.wikipedia.org/wiki/Artist%27s_book)

<comment><AUTHOR> Another way to express semantics is the use of Unicode in source code. For example, I have this Julia package that performs Box-Cox transformation, and I was able to use bold face for vector data and greek letters for the parameters as found in research paper and literatures.

[https://github.com/tk3369/BoxCoxTrans.jl/blob/master/src/Box...](https://github.com/tk3369/BoxCoxTrans.jl/blob/master/src/BoxCoxTrans.jl#L37-L48)

<comment><USER18> I've been conflicted about using verbose names or symbols for mathematical expressions in code, and I don't think there's an easy answer for when to use them. For simple arithmetic expressions, it seems like verbose names are superior because it's easier to derive their meaning and we already understand the operators at play. When translating complex expressions, however, we usually a priori understand the meaning of the expression with our algebraic mental model and it makes sense to use that nomenclature. At the same time though, someone who is unfamiliar with the particular source of the algebra used would find such code quite opaque. For something like the Box-Cox transform I think it makes sense to use the symbols widely employed by the mathematical nomenclature.

This certainly also depends on the language you are using and the ability to define arbitrary in/postfix operations.

It's also rather annoying to type them, but that's also probably because I just haven't developed a workflow for it.

<comment><USER17> >It's also rather annoying to type them

I wonder how mathematicians do this, I suppose they use latex notation most of the time, inputting ASCII which is formatted as the symbol instead of looking up tables

</comment></comment></comment></comment><comment><USER19> This brought me back to the time my SO tried to explain an 84 year old lady she was assisting what is it that I do for a living.

The consensus was that I'm a writer.

Also there's one thing I ask everyone seeking to get into programming: "are you resistant to boredom?"

This appears to be a good predictor of future success.

<comment><USER20> Hmm, interesting. I can't tell, though, if that question means, "do you not bore easily?" or "do you avoid boredom at all costs?"

<comment><USER19> Something must have been lost in translation then. Pardon, I half of my vocabulary was shaped by RPGs.

I was thinking of the former.

</comment></comment></comment><comment><USER21> > A skillful programmer looks at the problem and says, hey, why don't we build > an abstraction layer to make it more flexible?

A skillful programmer doesn't add layers of abstraction unless there's a good reason or need to.

<comment><USER22> The article was presuming a need? Otherwise there's nothing to discuss.

Yes, pedantically this approach is only used in certain circumstances. Then, a skillful programmer has a ready set of skills. And so on.

</comment></comment><comment><USER23> Upvoting this just for the title ... and was disappointed by the article. Rats.

<comment><AUTHOR> Appreciate the upvote anyways LOL

<comment><USER23> You're welcome. It's an attention economy these days

</comment></comment></comment><comment><USER24> > _How boring is it to produce something of the same shape over and over > again._

Same applies to any text written. Yet, few people would argue there aren't any artists among novelists, screenwriters, and poets.

<comment><USER25> Does copywriting count as art? Or is it merely the equivalent of CRUD-style boilerplate?

<comment><USER24> Depends on your definition of art. Good copywriting must be a very skilful trade. Not sure about the whole "must serve no purpose other than itself" aspect.

</comment></comment></comment><comment><USER26> Any skillful programmer will tell you this is horrible. The 3 rules of thumb of programming are:

1\. Paradigm purity is worthless 2\. You ain't gonna need it. 3\. Less complexity is better.

You just broke all of them.

</comment><comment><USER27> Git is art. All programming is a solution to a problem. Some of the problems are very pedestrian and the solution is very boring. There have been many version control systems before Git. I remember using SCCS, RCS, CVS, ClearCase and finally Git came along, and just redefined the whole concept. Sure, the CLI may be clunky at times, but the fundamental problem of version control is solved. I suspect, that historically, Git may be considered as a bigger accomplishment for Linus Torvalds than Linux. After all, Linux is a clean room implementation of Unix, whereas Git is completely original.

<comment><USER28> I thought the origin story of Git was that Linus wanted to recreate the workflow he had with BitKeeper after the Linux project lost access to it. I've never touched BitKeeper so have no idea how similar they actually are.

</comment></comment><comment><USER29> I find these kinds of near-journal-article-for-self fairly useless. If you think our stuff is boring where'd you leave intel/amd etc doing statistical process control in the domain of mother nature that's got the standard model in her favor? More boring? Less? Or dumb question?

Abstraction is a sort of entropy / Shannon / Kormogorov issue. So let's discuss it there not semi-liberal-arts school fogginess.

Folks let's please keep science in science. One day if QC gets commercial all these flowery articles will disappear. QC is math based. We'll need to deal or get left behind, and by then all this handwaving won't matter in the least.

Now, the other bad of software dev is that today's work is generously semi- formal at best in commercial settings. Not because CS is art, but because requirements gathering, human factors, corporate culture are strongly reactive in the software realm, where mother nature is directly absent.

Here we could help each other to understand management and management us to move this whole ediface along. And here less technical articles ala HBR work well.

</comment><comment><USER30> IMHO, alert() should be called at a higher level by something that calls check().

</comment><comment><USER31> A bit tangential, but since OP mentioned abstraction, I'd like to add this: One of the marks of a readable piece of code is that it does not mix different levels of abstractions.

Here's a contrived example:

      if (a < b && c == d)
        createUserProfile();

Instead, do this:

      if (userIsAuthenticated())
        createUserProfile();

</comment><comment> notsag-hn When the developer is inexperient, programming is similar to art. You see hacky stuff and sometimes "innovation" that a senior engineer would just call dirty code. Senior engineers however don't do art unless they are explicitly doing it like with computer graphics or other kinds or computer-based art generation, or through movements like hacktivism that are certainly quite poetic. Otherwise it's so far away from art, regular APIs aren't art, databases aren't art, operating systems aren't art. Many engineers have the need to call themselves artists, you should have taken drawing lessons if you wanted to be artists because regular engineering for business is maintainable just if it's as standard as possible and let me tell you that is the opposite of art.

</comment><comment><USER32> I was a commercial artist for 10 years. The same is true of art. In the visual art world everything boils down to contrast. It may be colour, composition, sequences of shots, silhouettes, animation, or otherwise - but at the end of the day everything boils down to contrast. There is nothing mystical or romantic about art. At the end of the day, it is just a set of rules of manipulation/communication. I would say the same about programming. I find programming more interesting and engaging, but that's just me.

<comment><USER33> Hey! I'm a person who's really serious about transitioning from programming to art. Can I pick your brain?

</comment></comment><comment><USER34> In college a teacher asked us if programming was an art. There is the element of creation, copying and some may say beauty. The artist or programmer in this case use their knowledge, creativity and experience to create something new intangible and subjective appreciation but results can be life changing or solve a really complex problem. In terms of boredom this is subjective sometimes I find it really fun try to solve a problem or fix a bug

</comment><comment><USER35> I think that when you look at things at a microscopic-level, everything looks boring and unoriginal. For example, every phenomenon on Earth (and beyond) is just an interaction between atoms. Looks pretty boring.

As the OP mentioned, beauty is created by abstraction; an ability to look at the bigger picture and make sense of it. So I agree that abstraction is the most interesting thing in writing software.

</comment><comment><USER36> Life itself is boring art. Everything else is just an extension of that.

<comment><USER17> Depends on your Serotonin level

<comment><USER36> Does it? The only people I know who don't lead a boring life if you look at what they do minute by minute, day by day, are fictional characters in books, movies, etc.

That's why we like entertainment - because it cuts out the boring bits :)

The art part is more interesting. Is there art to someone's life? I'd say yes, but that's because I'm artistic.

If you ask most people, they'll probably be confused by the question. Is your life 'boring art'? 'Huh' is the answer I most expect :)

<comment><USER17> I'll quote someone

>I can sympathize with a lot of nihilist outlooks on existence, but just because a lot of these might be true, they're not the only ways you can view your flesh or your place in these patterns, as an animal or as a cog in a machine. There are other elements to existence, like imagination, that is a good example. Emotions are a great vehicle for building your own universe and reality, where your function as an animal or cog in a machine doesn't force you into some rote role that drags you into this stripped down reality of raison d'être being purely utilitarian and unchangeable. You mentioned imagination, but emotions make things real. Does it really matter if your imagined reality isn't concrete or factual? What matters is your happiness, right?

</comment></comment></comment></comment><comment><USER37> Good Clojure and Ruby code, in that order, is the closest to art. Structure and Interpretation of Computer Programs (SICP) also deals with abstraction so elegantly you could consider it art.

</comment><comment><USER38> programming isn't art. it's "life imitating art imitating life"

</comment><comment><USER39> When I hear people talking about programming as an art, I usually assume that the decisions they make about their code tend to be about how elegant and beautiful it is, not efficient and valuable. It's fun and satisfying to write elegant code, but your company hired you to produce value, not art.

<comment><USER40> Elegant and beautiful things are often also efficient and valuable.

<comment><USER2> Paul Graham agrees: [http://www.paulgraham.com/taste.html](http://www.paulgraham.com/taste.html)

<comment><USER4> > what does Hardy mean when he says there is no permanent place for ugly > mathematics? He means the same thing Kelly Johnson did: if something is > ugly, it can't be the best solution. There must be a better one, and > eventually someone will discover it.

I don't think Hardy's take really stands up today. There is at least one mathematical fact which has been proven through exhaustive computerised tests, and which no-one has (yet) been able to prove without using computers.

Ugly? I suppose so. Is there a 'place for it'? I don't see why not.

[https://en.wikipedia.org/wiki/Four_color_theorem#Proof_by_co...](https://en.wikipedia.org/wiki/Four_color_theorem#Proof_by_computer)</comment></comment></comment></comment>


Hustlers Wanted  - <AUTHOR> http://www.metamorphblog.com/2011/01/speakertext-hustlers-wanted.html

<comment><USER2> Hustler is the new 'non-technical ninja/rockstar.'

<comment><USER3> Except far more accurate IMHO. Alright sure you could be a rockstar developer (you could be a rockstar anything I guess), but being a expert programmer has nothing do with being a 'ninja'. They're just geeky terms that stuck.

A hustler, on the other hand, is exactly what business people must be in a startup. Far from having a well defined role, you must do whatever it takes to make it happen (whatever 'it' may be). Further, a hustler must operate outside the status quo whether they're in a startup or on the streets. While most programmers I know hate the ninja and rockstar labels, I find hustler to be quite endearing.

<comment><USER4> I know that languages evolve naturally, and words get repurposed all the time, but _hustler_? _Really?_.

hustler

      n 1: a prostitute who attracts customers by walking the streets
        2: a shrewd or __unscrupulous__ person who knows how to circumvent difficulties

It also happens to be the title of a porn magazine that would make Hugh Hefner blush, while you won't often hear the term 'hustler' used in reference to a female prostitute, you _will_ find it heavily used among gay men to refer to male prostitutes.

Perhaps repurposing 'hustler' without negative connotations will work, but this is a word with a lot of ugly baggage, and the first thing I thought of when I saw it used in reference to startups: dishonest businessmen.

[Addendum] For completeness, a dip into the modern lexicon:

<http://en.wikipedia.org/wiki/Hustler_(disambiguation)>

      Hustler is a monthly pornographic men's magazine
      and general brand of Larry Flynt Publications.

      Hustler or hustlers also commonly refers to:
        - A practitioner of confidence tricks
        - Someone who deceives others by hustling, usually in sports
        - An American hip hop slang word for a pimp,
          drug dealer or male prostitute

<comment><USER5> You're missing one definition:

      an aggressively enterprising person; a go-getter

I think it depends on audience, but I hear this quite often in these circles.

<comment><USER4> I agree that it depends on your dictionary.

If a locally repurposed word like _hustler_ has a very strong meaning _outside_ your circles, chances are good that when you start talking about hustling in relation to business, a fair number of people are going to think _swindler_ or worse.

It seems that a number of people like to use it as a self-description because it _does_ have negative, edgy traits -- in the same sense of 'ninja'. Unlike 'ninja', however, 'hustler' can easily lie a bit too close to the truth.

</comment></comment></comment></comment></comment><comment><USER6> Being lean is about getting maximum leverage, not keeping costs as low as possible. This kind of hire is a great example.

</comment><comment><USER7> When I was running my completely un-funded zero-revenue startup, college kids would daily send me emails _begging_ me to give them a job doing non-technical BS work, often for free.

Fortunately a non-technical rockstar (who is willing to work for dirt cheap) is substantially easier to find a technical rockstar... I imagine now after "The Social Network" social media startups almost have an entertainment industry-like glamor at the moment, like breaking into the music business or movies. Non-technical people often will work for free or dirt cheap for _years_ to 'make it' in these fields.

Milk it.

</comment><comment><USER8> As a senior hustler myself (in the hard working, making deals way) I would suggest that they look at just hiring a part time bookkeeper and an office assistant. It would cost less, not dilute equity, and they wouldn't have a hustler doing bookkeeping. As someone who has had to fix bad bookkeeping, I can assure you it is something you want to avoid. You could think of bad bookkeeping like bad code - it can be 10x the work to fix it as it was to do in the first place. But with bookkeeping you usually can't just pull it off github and rewrite it. You have to fix live systems that change everyday.

</comment><comment><USER9> Haha - it's funny how much startups are the same... We're doing the same thing and had the same (a non-engineer?!?) reservations. I must completely concur.

</comment><comment><USER10> _OMG, if I didn't have to do all this bullshit work, I'd so much more productive_

I am not sure this is a line you want to add in a job post.

<comment><USER11> If I were looking for this kind of person, I'd want them to know that different people see tasks differently. Some people see simple design stuff as "bullshit work" while others see having to parse through server logs as "bullshit work."

This isn't an all-glamorous job. To portray it as such would be deceitful and would attract a different kind of individual, who would ultimately be let down.</comment></comment>


The Fire Box – Rhythmic Fire Waves - <AUTHOR> http://www.youtube.com/watch?v=ixH1Mmdhlkw

<comment><AUTHOR> Skip to to 6:50 to see some cool frequency patterns...

[http://www.youtube.com/watch?v=ixH1Mmdhlkw&t=6m50s](http://www.youtube.com/watch?v=ixH1Mmdhlkw&t=6m50s)</comment>


Codiqa releases web tool to build jQuery Mobile pages - <AUTHOR> http://codiqa.com/tryit

<comment><USER2> Nice job guys. I'll pass this around to some of my clients who are wire framing mobile apps for development with JQM. This could provide a more useful output.

Questions: How to add multiple pages? iPad sized workspace?

<comment><AUTHOR> Wish I could answer. I'm just use the jQuery Mobile framework and noticed the demo on their homepage.</comment></comment>


FancyHands - <AUTHOR> http://www.readwriteweb.com/archives/cheap_virtual_assistants.php

<comment><USER2> Some observations on first glance: Love someone taking another stab at the virtual assistant market. Landing page needs some help. 15 tasks for $30 seems insanely cheap, but it is not clear exactly exactly what the limit on the requested task would be.

<comment><USER3> The nebulousness of it is definitely a dissuading factor. Particularly, I didn't like how they given an example of buying flowers, but don't describe how payment authorization will work.

</comment></comment><comment><USER4> I'm not a believer in assigning small tasks to people you have no previous relationship with. It can very easily take more time to explain what you want, verify that you actually got what you wanted and deal with the risk of getting something you didn't want than just doing it yourself.</comment>


1.4B Clear Text Credentials Discovered in a Single Database - <AUTHOR> https://medium.com/4iqdelvedeep/1-4-billion-clear-text-credentials-discovered-in-a-single-database-3131d0a1ae14 <comment><USER2> How comes that 'homelesspa' ranks 13 on the most used passwords? I mean, I understand why '123456' and 'password' are in the list, but a seemingly random combination of words such as 'homelesspa'?

I did found this: [https://twitter.com/clinton_ngn/status/736247662866006018](https://twitter.com/clinton_ngn/status/736247662866006018) But no real explanation

<comment><USER3> Could be added to detect who is scanning with this list. Akin to mapmakers adding fake streets.

<comment><USER4> Map makers add fake streets to mark their maps?

<comment><USER5> Yes, they're called "trap streets": [https://en.m.wikipedia.org/wiki/Trap_street](https://en.m.wikipedia.org/wiki/Trap_street)

</comment></comment></comment></comment><comment><USER6> Where can I download this dump so I can find out if any of my accounts are in it?

<comment><USER7> [https://www.reddit.com/r/pwned/comments/7hhqfo/combination_o...](https://www.reddit.com/r/pwned/comments/7hhqfo/combination_of_many_breaches/)

<comment><USER8> Thanks a lot for the link! I ended up downloading the database, and going through all of my email contacts to see who was affected to write to them individually.

About 7/10 frequently contacted people were in the database (...!). About half of those let me know that the passwords were not in use anymore. The other half was very, very grateful...!

It was a great time to remind them about password managers, 2fa, etc.

</comment></comment></comment><comment><USER9> Title is exaggerating; this "single database" is actually an aggregate of many previous breach dumps.

<comment><USER10> Which makes the aggregate a single database.

<comment><USER11> Yes, but it is not like a single service has been breached to leak that many accounts, significantly reducing the relevance and impact of this particular database.

Anyone can compile a list such as this from other big dumps without much trouble, you just need some disk space.

<comment><USER12> > _Yes, but it is not like a single service has been breached to leak that > many accounts, significantly reducing the relevance and impact of this > particular database._

Err, it actually increases its relevance and impact. With the same database now a hacker can reach multiple services...

</comment></comment></comment></comment><comment><USER13> A couple of the constant examples of password reuse that can be found:

 _proceeds to list domain names that are aliases of one another_

Also the whole describing the thing as a database and saying it's fast because it's alphabetical...

At least describe what kind of database you're talking about so we can understand why an index isn't possible.

</comment><comment><USER14> This seems odd:

 _This database makes finding passwords faster and easier than ever before. As an example searching for "admin," "administrator" and "root" returned 226,631 passwords of admin users in a few seconds._

Out of 1.4B credentials there are only 226K for admin, administrator and root?

<comment><USER15> We're talking account passwords for web services mostly, right?

I think that would explain why admin, administrator and root are rarely used as usernames.

</comment></comment><comment><USER16> I checked, most are outdated passwords.

Odd thing, I checked with other people, and they don't remember those as old passwords.

I even found passwords I don't remember...

</comment><comment><USER17> This article is such garbage... it was tore apart in a /r/netsec discussion just last night.

[https://www.reddit.com/r/netsec/comments/7ikbzo/14_billion_c...](https://www.reddit.com/r/netsec/comments/7ikbzo/14_billion_clear_text_credentials_discovered_in_a/)</comment>


Nondeterministic regular expressions library for Arc (don't miss the cartoon) - <AUTHOR> http://www.lisperati.com/arc/regex.html

<comment><USER2> How could anyone possibly miss the cartoon?

<comment><USER3> By not clicking the link?

<comment><USER4> Or by using Lynx?

</comment></comment></comment><comment><USER5> A bare-bones nondeterministic regular expression engine for Python in 14 lines <http://paste.lisp.org/display/24849>

<comment><USER6> A bare-bones engine that interprets a regex [http://blog.thoughtfolder.com/2008-02-04-even-more- beautiful...](http://blog.thoughtfolder.com/2008-02-04-even-more-beautiful- code-c-haskell-.html)

<comment><USER5> I don't know much Haskell (it's on my list), but am I right in thinking that code doesn't implement parenthetical grouping or alternation? eg:

      (ab)*
      a|b

I think it's aiming at Perl or command-line style of regex, not mathematical regular expressions (EDIT not saying either is good or bad).

(BTW: I didn't write the 14 line Python one, I'm just studying it).

<comment><USER6> groupings and alternation can't be implemented in such a simplistic regex engine that matches the target while parsing the regex. Here is a more sophisticated toy haskell engine that uses a real parsing library [http://jcreigh.blogspot.com/2006/12/simple-regex-engine- in-h...](http://jcreigh.blogspot.com/2006/12/simple-regex-engine-in- haskell.html)

<comment><USER5> That's very interesting, because I've always felt that it should be possible to parse the regex and match the target at the same time... (though nobody ever does it that way, instead doing it with 2 passes).

Do you know of a proof that grouping and alternation cannot be implemented in this way? (formal or informal).

<comment><USER6> It is possible with the addition of back tracking capabilities (the most crude of which would be to just be able to look backwards in the regex). But at that point the implementation will be complex and the implementers should wonder why they did not implement a compile phase for the regex string. A compile phase also gives a chance for optimizations of the regex.

</comment></comment></comment></comment></comment></comment><comment><USER7> "The only common languages that have this ability are arc and scheme, a close relative to arc."

Arc is common?

<comment><USER8> For that matter, Ruby and C both have continuation support.

<comment><AUTHOR> Ruby has continuations, but with significant limitations. Ruby continuations cannot roll back modified variables, from what I understand- I think my email example would fail in a ruby implementation.

As for C, I haven't seen any real continuation support- Just some partial simulations using longjmp.

</comment></comment></comment><comment><USER9> fantastic work! many thanks</comment>


Clojure Newbie Guide (2015) - <AUTHOR> http://www.clojurenewbieguide.com/ <comment><USER2> I have been a Clojure newbie for over 3 years now and here is why I am still using it:

1\. Clojure code makes sense to me : I could go back to Clojure code someone wrote three years ago and I would have no problem in figuring out what the code was doing. With Java or Javascript, unless the code is documented with extreme diligence, the nuance are hard to decipher.

2\. REPL based coding makes it easy to get code right before making it part of my namespace

3\. lack of strong typing has not been a stopper for me yet. Spec is good enough for my needs

4\. State and concurrency : Its hard to screw up concurrency and state mutation with Clojure

edit: formatting

<comment><USER3> What're you using it for? I really like the language, but it seems geared to replace Java for heavy enterprise enterprise applications. A lot of the benefits I hear people talk about sound like they require a large project to be properly noticed.

I've used Clojurescript for a couple toy projects, but it seems awkward to me.

<comment><USER4> Clojure is good for everything you'd use Java for. So pretty much anything that's going to be long running, like services, or big apps meant to be open for a while. Yes, that fits the enterprise use case perfectly. A backend for any service oriented architecture, ETL jobs, data processing pipelines, backend for websites, rest/rpc/graphql services, client/server applications, big data analysis, machine learning, etc.

Clojure is not good for quick scripts, use bash, python, perl, hy, clojurescript, etc. for that.

Clojure is not good for low level code, like drivers, embedded systems, os, etc. Use rust, c, c++, D, etc. instead.

Clojure isn't good for squeezing every ounce of power out of hardware, such as games, use C++, assembly, etc. for that.

Clojure isn't good for mobile app development, use Java, swift, c#, objective-c, etc. for that.

Clojure isn't good as an embedded scripting language, use LUA, python, javascript, tcl, scheme, etc. instead for that.

Therefore Clojure competes mostly against Java, Scala, C#, F#, GO, NIM, Haskell, etc. Now as an astute reader, you've noticed how none of the competing languages I've listed are dynamic or of the lisp family. This makes Clojure unique in its space and the most controversial.

<comment><USER5> I agreed with most of your comment, but not the end.

I don't think Clojure competes with Go or Nim. And Clojure seems to be the antithesis of Haskell. Clojure competes with Java, Kotlin, Scala, and C# if you're on an MS platform.

I used Clojure for pet projects for a while (it's a gorgeous language) but eventually went back to Python because I wanted something with:

* easier interop with C/native libraries,

* faster startup (though for _scripts_ , [inlein]([http://inlein.org/](http://inlein.org/)) mitigates this issue)

* no requirement of the JVM

* better error messages / more help finding my bugs

* smaller memory and cpu footprint

Looked at some Schemes (Chicken), but couldn't stomach the car/cdr/dotted-pair stuff after having nice data structures like in Clojure, Python, et al. Not interested in ClojureScript, as I don't want JS underneath. Still prefer Clojure-the-language to Python-the-language, but here we are.

<comment><USER4> Why wouldn't Clojure compete with go or nim?

Go and Nim are both mostly used for backend services, long running processes deployed inside docker instances, etc.

I agree it competes a little less then it does against Java, C#, et all. But it still does, in that there's overlap for what projects they'd be good candidate for.

</comment></comment></comment></comment></comment><comment><USER6> Here are the reasons I stopped using clojure (a phenomenal language) a year ago, in order of importance:

1\. No C/C++ FFI.

2\. Lack of a strong type system (clojure.spec almost solves this problem now, but when I quit this didn't exist yet).

3\. Horrific startup times: although clojure itself is fast, its startup time isn't. This makes scripting in clojure unsatisfying. And you don't feel like a ninja when it takes 30 seconds to start a REPL. You can use clojurescript to target node to get around this, but then you cut yourself off to most of the powerhouse clojure libraries.

I now use Haskell (with C/C++ FFI). I do miss the homoiconicity (and slightly more concise syntax) of clojure. In my opinion Haskell and clojure are the two sexiest mainstream languages that you can get stuff done in.

<comment><USER7> If in any case you still feel the same about Clojure, you should try Common Lisp, it has the three things you want:

1\. Easy calls to C with CFFI. No Clojure->Java->JNI->C, just straght CL->C.

2\. Useful, optional, type system (which can also catch mistakes at compile time with SBCL and other compilers)

3\. Very fast startup times.

and _many_ more features like for example an object system that is massively above what Clojure and Java bring to the table, better exception handling, very explícit errors and nice stack traces, it can also compile to JVM if you want, etc.

If you like Lisp, try it. You already learned a Lisp so the jump is easy.

<comment><USER8> Chiming in to give Racket a shout out. Good FFI, good libraries, good tooling, good community, good (soon to get even better) performance, subjectively more modern feel than CL, great type story via Typed Racket.

<comment><USER9> >(soon to get even better) performance

Why? Are the rumours of porting the language to Chez Scheme true?

<comment><USER8> I hope it's not just a rumor! [https://news.ycombinator.com/item?id=13656397](https://news.ycombinator.com/item?id=13656397)

</comment></comment></comment></comment></comment><comment><USER7> Happy to see there are good learning resources for Clojure.

The more Clojure users out there, the better, since it is a Lisp language, and as more people learn and use Lisp, it will be more easy for them to also able to also use Scheme, Racket, Common Lisp, LFE and the other friends in the illustrious Lisp family.

This, in the same way people can easily learn C, Java, C++, Rust, by knowing just one of those four languages. Once you understand the syntax, it gets really easy.

</comment><comment><USER10> Does anyone use Clojurescript as a webapp backend instead of Clojure?

<comment><USER11> Not sure if anyone is using it, but there is this: [https://macchiato- framework.github.io/](https://macchiato-framework.github.io/)</comment></comment>


Generating Art with Code: A Handbook to "Little Planet Procedural" - happy-go-lucky http://alanluo.com/procgen/midterm.html <comment><AUTHOR> The actual software seems to be [https://github.com/alan- luo/planetprocedural](https://github.com/alan-luo/planetprocedural)

On a related note, I'm quietly amazed why there isn't yet a working generator of electronic music. I mean something that I can download, run, and it would stream believable IDM/techno/trance into my earphones. It _sounds_ like it should be so possible, if not outright easy — yet it's still humans who are toiling away at their Abletons weeding through that search space. I wonder what crucial problem I'm not seeing.

<comment><USER2> Maybe it's that music matters and even instrumental music contains a similar level of content and meaning as speech.

The minute we realise music isn't the authentic voice of another human being we reject it.

Even my enjoyment of arguably mechanical music like some of the early minimalist stuff - where to a degree processes determine the structure and unfolding of the work - is mediated through my awareness of the authorial intent of the composer. (I'm talking more about Piano Phase than Pendulum Music here - the latter is slightly too devoid of human intervention to be 'real music' for me)

How would you feel about a novel generator? Why is that so different?

<comment><AUTHOR> Are you familiar with modern electronic dance music? There's definitely no "authentic voice of another human being" in regular trance music, for example. It's hours upon hours of repetitive structural patterns overlaid on similar timbres. Now, I'm not a very big fan of trance music, but it would be something, and I feel like the gap between that and more interesting music like IDM should be quantitative (more code to produce more complex patterns over more varied timbres), not qualitative.

<comment><USER3> Modern "EDM" producers actually receive a lot of criticism for these practices from both critics/academics and laypeople. I think the massive commercial success and general enjoyment of this music actually comes from the spectacle of the "live" events, and so as an extension even just listening to it at home, the spectacle is implicit and can be experienced vicariously to some degree. On top of this, this music as a product is obviously extremely easy to produce in comparison to other genres/processes and is thus lucrative to profiteers.

Another reason why such utterly cheap production habits have been wildly accepted is because of the already established history of house music and techno, which was originally revolutionary, because those sounds and the contexts for which they were experienced ironically represented newfound _human_ feelings of liberation, from a youth movement to escape a bankrupt Detroit to the fallen Berlin wall. Techno was a way for people to grab the rising technocracy by the horns so to speak and make something specifically human out of it.

</comment></comment></comment></comment><comment><USER4> Here's the final 3d project, Big Planet Procedural: [http://alanluo.com/procgen/final.html](http://alanluo.com/procgen/final.html)

</comment><comment> alan-luo Hi guys! Original dev here. I'm you guys enjoyed it! I had no idea this was x-posted to Hackernews, but I noticed a surge in hits on my site and so I investigated. I'm working on an expanded version of this currently. Let me know if you have any other thoughts or questions!

</comment><comment><USER5> A Response: "After Alan Luo" [[http://imgur.com/fmt1Kib](http://imgur.com/fmt1Kib)]

Being an Artist with a background in technology I can't help but appreciate this differently than I believe intended. I've been thinking a lot recently about the boundries of what is and isn't art in regards to technology (up to and including the division of Arts and Sciences at the Academic level) and feel like I need to say something about the use of the word Art here.

To me, the Art is your unique contribution to the Art World, which is always the aspect of the work the Artist puts their heart into the most. Unless someone really picks up this tool as their medium of choice and makes true Art with it, the Art to see here will always be the code Alan Luo has writen. Code is poetry and deserves every bit as much respect as forms of it like concrete poetry, where things like indentation matter. It just kind of irks me to see Art get demeaned by people I would consider Artists if they reframed their work.

<comment> alan-luo Hey! Original creator here. Thank you for your thoughtful reply. I think you bring up some very interesting ideas.

With the rise of the likes of Google's Magenta project, the use of the word 'art' is brought into question, just as you mention. So as the original dev, I'd like to give my two cents.

I do not consider the outputs of this program as 'art.' Whether or not the code is art is an entirely different question that I don't think is really important to address.

The documentation was a little hastily assembled for a deadline, so the following sentiment is not reflected in it, but the purpose of this project was never to create 'art' with code, it was to demonstrate that there exists a bridge between creativity and code. For me, the output of this program is not art in itself. However, I have used the output as a place to draw inspiration for other pieces of work that I would consider art. In this case, I use the program as an infinite source of inspiration rather than as the art itself.

By the way, I may write a blog entry about this topic in the future. You've brought up very interesting ideas. :)

</comment></comment><comment><USER6> The HTML5-powered renderer: [https://alan- luo.github.io/planetprocedural/](https://alan-luo.github.io/planetprocedural/)

</comment><comment><USER7> This is great. It gets across some really useful concepts, without seeming inaccessible, by having some uber finished shiney 3d render in it.</comment>


Is English a "writer-responsible language" and Japanese "reader-responsible"? - <AUTHOR> http://languagelog.ldc.upenn.edu/nll/?p=14467

<comment><USER2> Interesting. I wonder if it stems from the difference between grammar. European languages tend to have a lot of different forms for words based on tense, case, mood, gender, number, etc. Asian grammar is comparatively simpler, so understanding comes from context.

As an Asian person, I still don't understand why European languages needs so much "metadata" to transmit the same message. Likewise, Esperanto is still much more complex than Asian languages, so it fails as a true IAL for me.

<comment><USER3> I have a feeling that, when you say "Asian languages", you're probably not thinking about Japanese. :)

OK, I don't really know Japanese, but (for example) Korean allows thousands of possible forms for every verb. I don't think "Asian/European" is a useful category for languages. There's so much variety inside each continent.

</comment></comment><comment><USER4> This is not a linguistic property of the language. It's a cultural property.

There is nothing in-English about saying McDonalds without adding "is a fast food chain".</comment>


Henry Blodget: Groupon is running low on cash - <AUTHOR> http://www.businessinsider.com/groupon-low-on-cash-2011-8

<comment><USER2> > It is also worth noting that, in the history of the company, Groupon has > raised a total of $1.1 billion of cash--and paid out $942 million of that > cash to its early investors and executives (highly unusual for such a young > company). If Groupon does get into cash trouble, therefore, it will not be > because the company didn't discover an amazing new business opportunity or > raise all the capital it needed. It will be because of, well, greed.

Can this really be correct? Has there ever been another company that raised this much and spent nearly All of it Paying off old investors and insiders before going public?

<comment><USER3> they squandered not only the raised capital, the money that is supposed to be paid to merchants is partially gone too:

"...

Specifically, as of June 30, Groupon owed $392 million to merchants for old Groupons--way more than the $225 million of cash the company had on hand.

And merchant bills aren't the only bills Groupon has to pay.

As of June 30, Groupon had $680 million in current liabilities--bills the company has to pay. Meanwhile, Groupon only had $376 million of current assets with which to pay them (composed mainly of cash and receivables).

Another way of looking at this is that, if Groupon had been liquidated as of June 30, the company would have had a net of $304 million of bills that it would have been unable to pay.

..."</comment></comment>


Kick the data secrecy habit and everyone wins - <AUTHOR> http://www.newscientist.com/article/mg22029435.100-kick-the-data-secrecy-habit-and-everyone-wins.html#.UooA1o1nnUo <comment><USER2> The Open Knowledge Foundation has been around for 10 years already, working in the same field and trying to achieve the same thing.

The trouble with unifying many different data sources like that is that you're trying to solve the problem of too many disparate sources for data by creating _more_ sources for data. The entire field has xkcd.com/927 problems.</comment>


Twitter 'gave Saudi Arabia information about journalist who ended up dead' - <AUTHOR> https://metro.co.uk/2018/11/09/twitter-gave-saudi-arabia-information-about-journalist-who-ended-up-dead-8123873/amp/ <comment><USER2> Platforms like to be inclusive of perspectives. If they have to choose between taking ethical action or embracing unethical perspectives... guess what. They choose to remain inclusive of even the most atrocious perspectives.

It really is up to the people (gov? oh god.) to hold these platforms responsible. They (notably FB and twitter) have demonstrated, over and over again, that they will not hold themselves accountable. Ethics are beyond their purview.

<comment><USER3> What? You demand government(the USA) to punish the victim(Twitter) to solve a problem?

The problem is the government(of Soudi Arabia) asking for the information from Twitter office in Dubai. On refusal Soudi Arabia government can sure to use physical power over Twitter office conveniently located very close to Saudi Arabia.

It's like punishing a bank employee who had to hand over the money to the burglar at gun point. Also the it was the punisher(The USA) who gave a gun to the burglar(Saudi Arabia).

Is that what you want?

<comment><USER2> No one is talking about "punishment" but you. The concept here is building mechanisms of accountability (again, nothing to do with punishment).

Applying your example, the ideal is more like a social system stepping in and providing a means for the bank employee to safely not hand over cash mid- burglary.

</comment></comment></comment><comment><USER4> That's twitter for you. This is the company that brought us trump.</comment>


A preview of Guile-Lua (rebirth), and some opinions - <AUTHOR> https://nalaginrut.com/archives/2016/09/05/a-preview-of-guile-lua-%28rebirth%29%2C-and-some-opinions- <comment><USER2> The link shows a blank page for me (Firefox, Arch Linux). I can read the article on the home page ([https://nalaginrut.com](https://nalaginrut.com)).

It is interesting that you chose to implement Lua 5.2. Why choose 5.2 over 5.3 (the most recent version) or 5.1 (probably still the most used)?

As a Lua developer I really don't like what you did with ISSUE-1. In particular there could be some code that calls `foo()` explicitly on _another_ object: `a.b.c.foo(d)`. This is perfectly well defined in Lua and can be used in some libraries that implement object models. It will not behave as expected with your design.

I am pretty happy to see articles mentioning both Lua and Scheme though. Both communities shared a developer room at FOSDEM last year, and hopefully we will this year too. [1]

[1] [https://archive.fosdem.org/2016/schedule/room/k3201/](https://archive.fosdem.org/2016/schedule/room/k3201/)

<comment><AUTHOR> For the version issue, I have to say when I started to research Lua, there's only 5.2 BNF I can find on the internet. So I decided to try it from 5.2. Of course, I'm willing to catch up with the newer version.

For ISSUE-1. Yes, I know it may break the compatibility of some existing code. The problem is why people reference a variable named 'self' but not expect it to be the current table? People may named a var as 'self' to hold other value. I think that is the problem. 'self' is actually a reserved word in Lua, but Lua permit it to be used for other value. I don't think it's good. For example, some Scheme implementations allow users redefine primitives, you may redefine '+' with '-'. It's interesting, but it's bad when you want to build serious program. Another point is mentioned in the article that people could easier find the error when they encountered an exception related to 'self'.

Anyway, my point is that a good Lua programmer should avoid to use a.b.c.foo() if one wants to get the current table, no matter how the function is defined (colon or point). But people always do wrong thing (include me), so why not provide a mechanism to let them avoid this problem? Fixed ISSUE-1 could let people get rid of this problem, even you make the mistake to use point reference on 'self', you can get correct value if you defined the function with colon.</comment></comment>


ReconnectingWebSocket - <AUTHOR> https://github.com/joewalnes/reconnecting-websocket/

<comment><USER4> Does not even back off. I like the idea of offering libraries that provide some abstraction over standard libraries, but what's the use if it's just the most trivial solution that's unusable for any production situation?

<comment><AUTHOR> Author here: That's a good feature request. I shall implement a truncating exponential backoff algorithm tonight (maybe tomorrow).

I've been using this in production for over 2 years and my load levels have not caused any usability issues (even without backoff). But no doubt for heavier sites, this will be an excellent feature, so thanks for suggesting it. If you have other feature requests, please add them to the issue tracker as I'm more likely to notice them: [https://github.com/joewalnes/reconnecting- websocket/issues](https://github.com/joewalnes/reconnecting-websocket/issues)

In answer to your question - the use of an abstraction is to allow new features (like the one you suggested) to be added in one place so individual users can easily make use of the additions.

<comment><USER4> Fair enough, thanks for publishing :)

</comment></comment></comment><comment><USER5> Always important because our beloved websockets are fragile!

socket.io has it built in, but in various projects I had to hoist my own reconnect functionality on top because reconnects kept failing.

engine.io aims to be more reliable than socket.io, mainly due to connecting via the fallback methods first, then establishing a websocket connection. I have not used e.io yet but intend to soon.

[http://stackoverflow.com/questions/9610951/how-is-engine- io-...](http://stackoverflow.com/questions/9610951/how-is-engine-io-different- from-socket-io)

</comment><comment><USER6> Socket.io is a decent WebSocket wrapper which also reconnects, and of course has lots of other features.

<comment><USER7> Socket.io used to be good, but it is littered with bugs and has been promising 1.0 for nearly 2 years without a single update. We switched to SockJS a few months ago and haven't looked back.

<comment><USER8> Indeed. And Primus is nice if you want fallbacks and additional features (like reconnects with randomized exponential back-off).

[https://github.com/primus/primus](https://github.com/primus/primus)

</comment></comment></comment><comment><USER9> One of the nice things about EventSource (server-sent events) is that it reconnects by default, and error recovery logic is handled by the browser.

</comment><comment><USER10> This seems a bit naive. No ping/pong, no mention of what happens to messages in transit when the connection drops.

<comment><AUTHOR> > No ping/pong

Author here.

Are you referring to the ping/pong message frames in the WebSocket transport protocol, or just a general heartbeating protocol layered on top of WebSockets?

If it's the former, then there's nothing ReconnectingWebSocket can do here as this is not exposed by through the standard JavaScript API. Even if it was exposed, I'm not entirely sure what it would do.

The latter requires a custom protocol built on top of the user's WebSocket messages. This would require additional code on the server to process the messages. Libraries would have to be created for the various server side WebSocket implementations. It's a much messier abstraction, and I'd prefer this library to stick to one thing and do it well.

> no mention of what happens to messages in > transit when the connection > drops

In this regard it behaves exactly like a regular WebSocket connection - <USER3> message is lost. All this library care of is ensuring that a new connection is opened.

<comment><USER10> > Are you referring to the ping/pong message frames in the WebSocket transport > protocol, or just a general heartbeating protocol layered on top of > WebSockets?

I'm talking about a protocol layered on top, for exactly the reason you state.

> In this regard it behaves exactly like a regular WebSocket connection - <USER3> > message is lost.

But it doesn't, with a regular WebSocket connection, you know that if a subsequent message is received and responded to, all previous messages were also received.

> It's a much messier abstraction, and I'd prefer this library to stick to one > thing and do it well.

It doesn't and can't. What you've created is completely trivial. If it was indeed better, it would be the behaviour of WebSockets by default.

</comment></comment></comment><comment><USER11> No tests?

</comment><comment><USER12> That's what I use. Works as advertised. Should be part of the spec I think.</comment>


Nuts and Bolts Business Advice - <AUTHOR> Hi all. I'm currently looking to become self employed. Still figuring out what I want to do, but I know I want to be my own boss.
Trouble is, I lack the basic foundation of knowledge of how the business world works. I've read many business books. They tend to focus on sales/marketing strategies.
Where can I go to learn the basic skills of building a business?
For example:
How do you organize a business? What are the legal restrictions/requirements? What are the admin requirements? How do you write contracts? How does accounting work? How do you hire employees? How does sub-contracting work? How do you write a business plan? How do you get a business loan? How do you go about billing customers? Plus more questions I haven't even thought of?
Cheers Shomberj <comment><USER2> The best way to learn about building a business is to start a business of your own.

Fundamentally, business is an exchange of value - your service/product for money (or something of value to you).

For some of your questions, you could go to a business workshop or take a course at your local business centre or university. There are plenty of great resources on the internet as well. Google it. And there are tons of business books that aren't focused on sales/marketing strategies. For example, the Dummies series probably have some good explanations.

However, business is a constantly changing environment and there is no right or wrong way to do things. What you learn in school/course will give you a rough idea but there are quite possibly many other ways to do things. It's up to you to figure it out on your own.

Another way to learn is to get experience by working for companies and learn from them. You'll be paid to learn while you understand what value you're delivering to your employer. There's no reason why you could eventually be contracting/consulting to your employer in the future.

<comment><AUTHOR> Hey thanks for the answer. Business for dummies book is probably a great start for what I am looking for. Any other book recommendations would be greatly appreciated.

Also a quick search for Business workshops in my area came up with "How to Start a Small Business" for $10.00 next Wednesday. Nothing to lose by going to that.

</comment></comment><comment><USER3> I would like to hear other people's answers to this as well. For me, it took receiving a 4-year business degree just to begin to know the answers to your questions. Furthermore, I intent to spend about 4 more years in school receiving a law degree and MBA as well to help make me a business expert so that I know the answers completely (and I'd get a masters in economics as well if I had the money/time).

I think the most important question is, how do you plan to create value? Perhaps if you are an engineer, you gain enough of a business education to understand the environment, but partner with a business expert to allow you the freedom to unleash your creativity without being bogged down by administrative tasks. I don't think you necessarily want to swap being a value creating engineer with being a business adminstrator, however, obviously the better you understand the theories of business and the administrative tasks that must be had, the better you can create value in the world for others.

</comment><comment><USER4> What do you want to do in exchange for money?</comment>


Google Wants U.S. to Weigh WTO Challenge to China Censorship  - <AUTHOR> http://www.businessweek.com/news/2010-03-02/google-wants-u-s-to-weigh-wto-challenge-to-china-censorship.html <comment><USER2> More a publicity stunt than anything. China can't get pushed around by the us government, forget google or the wto.

<comment><USER3> Publicity stunts shape opinion -- and China specifically seems to get really upset about being forced to defend certain practices in public.</comment></comment>


The best todo list app for any developer - <AUTHOR> https://coderwall.com/p/kpd7ra <comment><USER2> Even better for developers: Todo.txt [http://todotxt.com/](http://todotxt.com/)

Free, open, plain text, with lots of optional tools for the command line and also mobile.

And for more power, emacs org mode is amazing.

<comment><USER3> | Free

Not completely. The associated Android app I just bought is $2. Though it's still not much.

<comment><USER4> we can compile it from the source [https://github.com/ginatrapani/todo.txt- android](https://github.com/ginatrapani/todo.txt-android) ( but I also bought it )

</comment></comment></comment><comment><USER5> What if your todolist is too large? Store it somewhere else (in you homedir, no need for a sudo) and add

      head -n 10 ~/todo.md

to your .bashrc/.zshrc to show 10 most prioritised tasks on each session startup.

<comment><USER6> Nice, store todo.md in a cloud drive and you'll have it show up on all of your computers.

<comment><USER7> So you're storing a file on a public server that is beyond your control and you make your shell read it every time you launch it ?

What could possibly go wrong ?! ;-)

<comment><USER6> head just prints the contents of the file, it doesn't execute anything.

<comment><USER8> and neither does my terminal emulator...

<comment><USER9> Pipe it through something that strips control characters before printing perhaps?

</comment></comment></comment></comment></comment></comment><comment><USER10> Because "any developer" of course uses a system with a motd. Or wants to be reminded of all todos whenever opening a terminal.

What's with this HN hype of turning "Hey, look, I do X" into "if you're a Y, like I am, you _should_ do X"?

<comment><USER11> [http://en.wikipedia.org/wiki/Link_bait](http://en.wikipedia.org/wiki/Link_bait)

<comment><USER12> I'm not clicking that

</comment></comment></comment><comment><USER13> Emacs org mode.

I store it in my repo (TODO.org), and keep track of whatever I'm working on, immensely helpful for keeping track.

the obvious downside to the motd method is length of todo list... It might be good for motivational messages but not for actual todo lists.

</comment><comment><USER14> A todo list that only lives on one machine is a terrible todo list. This is 2014.

</comment><comment><USER15> Paper. just a single piece of 8.5x11 paper. Anything more complex means I'm trying to do more work than I can handle.

<comment><USER16> An old colleague of mine.. and CFO of our company.. used to manage his tasks on a piece of paper. It was always in his folder, and for each task he'd write a note on the paper and then draw a box around it. As he completed each task, he'd scratch out the box.

It was crude and messy and reminded me of high school.

A couple of years ago, I found myself migrating towards something like it. I use large index cards, but.. more or less, do the same thing.

I still have remnants of every to do app on my iPhone. In each app there's abandoned lists of tasks that got recorded and forgotten, or recorded and "re- prioritized", forever.

The nice thing about the card is, if it's mostly scratched out and there are things left on it, you can copy the items to a new, fresh card and then keep going. If the items aren't that important, it's as simple as throwing whole card away. It's satisfying and simple and there's no process-guilt involved.

"Throw card out" is a feature.

<comment><USER17> Re-copying the list to a new sheet of paper is a feature. It forces you to regularly re-prioritize items or choose to drop them altogether.

I kept a digital list for a few years, but eventually it just became a crap heap of undone tasks and abandoned ideas that would get batch re-scheduled forward forever. Paper lists work really well for me.

</comment></comment></comment><comment><USER18> When work life starts to get complicated, I find a pad of lined paper and list things out one per line. As I get stuff done I cross them off the list.

The main advantage of this approach is that having to keep a pad of paper around tells me that my life is getting too complicated and I do whatever I have to to cut it back down to basics, ditching the tools. I would loathe it if I had to institutionalize this complexity in the form of an app.

<comment><USER19> Same here, and not because or when it gets complicated. Pen and paper almost always works better than any one of the gazillions of TODO applications out there. And I've been always wondering why. (Apart from programming TODO items that live in the source code itself, of course).

When you want to say something to a colleague at work, you have a choice of emailing/IMing or just saying it out loud (if you can speak of course) as in, you know, normal human conversation. You don't use a text editor and a speech synthesizer to say something out loud, do you? Because the effort isn't worth it, obviously. Just like you choose an email app that helps you get things done with the least effort, you can as well chose between app vs. non-app.

The thing with the TODO list is that there seems to be this stereotype that you need to keep it in digital form. This has obvious advantages of being copyable, searchable and potentially accessible from anywhere if it's cloud- based. But in return, you compromise simplicity of use. Find the app - click - find the "add" button - click - think of the deadline - launch the calendar - click - click - click ... - type the text - click "OK" \- close the app. Now compare that to: turn your head (or your chair) some 30-45 degrees - grab the pen - find the bottom of your list - think of the deadline - write. Fast, simple and sweet, isn't it?

So sweet in fact, that I can sacrifice searchability (easier to skim through the list on paper if it's not too long) and universal accessibility (rarely need outside of the office).

Or maybe I'm just being old-school?

<comment><USER18> If you need searchability on your to-do list, it's too damn long.

</comment></comment></comment><comment><USER20> FTA:

      alias etodos="sudo vim /etc/motd"

Better:

      alias etodos="sudoedit /etc/motd"

<comment><USER21> How about not using system administrator privilege to edit a TODO list? Good grief. If you want a simple text file, add "cat $HOME/TODO.txt" to your login profile script and then "etodos () { $EDITOR $HOME/TODO.txt; }"

</comment></comment><comment> vezzy-fnord Slackware pipes fortune to your /etc/motd by default. Always amusing, especially when it told me to run `nohup rm -fr /&`. I like to think someone out there followed that advice.

Alternatively, you can make a list and paste a `cat /path/to/list` in your shell rc.

</comment><comment><USER22> My problem with _every_ todo solution I've found is that the workflow is so personal, and often fluid - sometimes my workflow can change from one week to the next. I keep going back to plain text as well for those reasons, though not from /etc/motd...

My "solution" at the moment is a series of text files in a Dropbox folder coupled with a small webapp that lets me edit it with Ace (for when I'm out and about) and that applies a bunch of custom filters (to create highlighted priority indicators etc.) + markdown. So all the workflow is in my head / manual, but I get syncing to my main locations plus some visual cues to improve over just plain text.

<comment><USER23> > sometimes my workflow can change from one week to the next.

It's refreshing to hear that someone else also works this way! :P

</comment></comment><comment><USER24> Self promo here but I made what I think is a pretty nice plain-text-backed CLI todo list:

[https://github.com/hatboysam/shpm](https://github.com/hatboysam/shpm)

I use it and I hope someone else will get something from it. Based on todo.txt but simpler imo.

</comment><comment><USER25> And to make it even better (if you use OSX):

Install GeekTool and use the shell "Geeklet" to affix the todo list permanently on your desktop background. You can adjust the font/size/transparency to make it as obnoxious as needed.

<comment><USER22> I never, ever see my desktop background... It's always covered by maximized applications. Seeing the desktop background to me means I'm wasting screen real-estate.

</comment></comment><comment><USER26> i'm puzzled no taskwarrior mention at all?

[http://taskwarrior.org/projects/show/taskwarrior](http://taskwarrior.org/projects/show/taskwarrior)

alias due='task rc.calendar.details:full cal'

to get a nice representation of tasks. you might wanna combine taskwarrior with remind.

[http://www.roaringpenguin.com/products/remind](http://www.roaringpenguin.com/products/remind)

it allows you to "program" your calendar dates. A little caveat if you're on osx you may need to patch it otherwise it will have a 30 or 10 second startup delay

</comment><comment><USER27> My personal solution is along the same lines, but much less global and annoying. This is in my .bash_profile:

# todo function todo { case "$1" in "-a") echo "$2" >> $HOME/.todo ;; "-d") sed -i "" -e "$2d" $HOME/.todo ;; esac if [ -f "$HOME/.todo" ] ; then cat $HOME/.todo | awk '{ print NR, "-", $0 }' fi } todo

<comment><USER27> Wow, HN horrible formatting. Here's the original: [https://github.com/jamestomasino/bash- scripts/blob/master/.a...](https://github.com/jamestomasino/bash- scripts/blob/master/.alias#L49-L62)

</comment></comment><comment><USER28> Oh man! I've been looking for a great to-do list manager for so long. I've tried many different ways and more recently many mobile apps. I'm afraid at the end of the day it boils down to, in big part, discipline. I'm all ears if you know a great to-do app. Maybe it'll become more natural using wearable tech in the near future.

</comment><comment><USER29> I'm a fan of nvAlt (notational velocity fork) along with todo.txt and Dropbox (or whatever sync system you use).

[http://brettterpstra.com/projects/nvalt/](http://brettterpstra.com/projects/nvalt/)

</comment><comment><USER30> You mean "any developer that uses Unixoid"

It's funny how developers who work under Windows (not even necessarily developing for Windows) are often not even considered real developers by the "pure" devs :)

</comment><comment><USER31> False.

</comment><comment><USER32> I've been using t[0] for a while and it's pretty fantastic.

[0]:[https://github.com/sjl/t](https://github.com/sjl/t)

<comment><USER33> Too bad it conflicts with t [0], the Twitter client.

[0]: [https://github.com/sferik/t](https://github.com/sferik/t)

</comment></comment><comment><USER34> I like the idea. I'll try it! For now, I'm big fan on "tree oriented" todo lists, so I'm big fan of workflowy.com

<comment><USER35> Also a workflowy fan and their dropbox sync is useful for offline editing.

</comment></comment><comment><USER36> This is absolutely "an app", it is "the best" to-do list, for any developer, in any place, any time.

</comment><comment><USER37> No, that's not better than Orgmode.

</comment><comment><USER38> I loved this one. I also found Carl Sednaoui's method for using github gists as task lists ([https://news.ycombinator.com/item?id=7000953](https://news.ycombinator.com/item?id=7000953)) very useful.

</comment><comment><USER39> Ooooh, OK this was genius. Sold.

I hope this helps though.

<comment><USER40> The comments are much more useful and valid.

<comment><AUTHOR> I understand the argument against editing a file in /etc for something only one user is concerned about, but I've been the sole user of every computer I've had, so this doesn't matter to me. I think that's the case for a lot of people.

The other arguments seem to be preference. Some people work better with paper. Some people only want system configuration in /etc. If you're a stickler for the Single Responsibility Principle in the config files in your OS, then I assume you already have your own solution to this problem and you don't need a tutorial from me.

<comment><USER41> I don't follow your reasoning. The comments provide great advice on how to achieve the same and still not messy up your /etc.

You were introduced to the idea of todo's in your terminal, but then only accept the worst solution.

It is as if one guy says "Hey guys, I have found a way to not have to shit in the woods any more, we just have a bucket next to our bed and in the morning we throw it out the windows."

The second guy says "ok, lets not shit in the woods, but what if we create this thing called a sewage with a thing called 'toilet' on top so we don't have shit in the streets."

You say "Ok I see what you mean, what with having the shit in the streets and all, but some people work better with paper." Eh what?

<comment><AUTHOR> Bad analogy. Treating your /etc/motd as a scratch space is a perfectly reasonable thing to do. It's not the difference between shitting in a toilet and a hole in the ground.

<comment><USER41> The analogy is not that of `/etc/motd`, but about you rather accepting a crappy solution for a problem you didn't know about rather than a proposed better solution just because the crappy one came first.

</comment></comment></comment></comment></comment></comment><comment><USER42> any screen users? not sure if this works if you constantly start new screen sessions

</comment><comment><USER43> How did I not know this! Elegant. Thank you. Fantastic having it appear before anything else the shell does.</comment>


Ask HN: Distributed compilation - <AUTHOR>

Is there a simple way to compile C/C++ on a remote server? Is this even possible with libraries etc? <comment><USER2> You could use: (a) distcc (b) Electric Cloud. distcc relies on make -j which works up to a point; Electric Cloud is a commercial solution that overcomes make -j problems.

</comment><comment><USER3> I can't really answer for C/C++ since I have never done it. But I am doing it currently with C#, there might be things that are similar and might help you start your research.

We are building a Backend as a service named iKnode and does exactly that but with C# classes.

The way it works is: 1) Code classes in a browser. 2) Send Code to a Backend Service, which compiles the code and returns any errors. 3) You can execute the code and get the response back from the server.

The idea is to wrap everything in a SandBox and then compile using CodeDom (.Net libraries). But for C/C++, if it is only one class, it is easy, just call a command line compilation. Capture everything the command line returns and pull it back to the Browser.

The first thing I can think of, is create an agent that interacts with the compilation process using system commands. If you are using Windows and Visual C++ there is a CodeDom extension for managed C++ (C++ CLI). [http://msdn.microsoft.com/en- us/library/ms235437(v=vs.80).as...](http://msdn.microsoft.com/en- us/library/ms235437\(v=vs.80\).aspx)

If you find a way to do it that is easy and useful, please share, I would be interested in seeing this work.

</comment><comment><USER4> <http://distcc.org> indeed.

It runs source through the preprocessor locally (this takes care of external/library dependencies) then offloads the actual compilation to participating boxes, gathers object files back and finally links them, again locally.

</comment><comment><USER5> In an office LAN using MSVC, I've had good experiences with <http://www.xoreax.com/>

Apparently, they have a make solution as well <http://www.xoreax.com/make.htm></comment>


Mindfulness May Make Memories Less Accurate - <AUTHOR> https://neurosciencenews.com/false-memory-mindful-meditation-psychology-2605/ <comment><USER2> > undergraduate participants were randomly assigned to undergo a particular > 15-minute guided exercise

Mindfulness studies based on complete beginners measure only what happens when you are trying to meditate the first time. Usually the first thing you discover is that you suck at being mindful.

If you pick undergraduates who have never been juggling and make them juggle for 15-minutes, you don't learn how juggling affects memory. You might learn how picking up the pins affects memory.

</comment><comment><USER3> Boy am I tired of badly done mindfulness studies.

<comment><USER4> Try your best to observe them pass by in your hacker news feed, without reacting.

</comment></comment><comment><AUTHOR> While the criticism here seems earned, in my (non-scientific) experience, it seems plausible that mindfulness might have _some_ effect on memory, in the sense that it seems to have the effect (for me!) of disentangling experience and emotion to some degree, and emotion has well-documented effects on memory.

</comment><comment><USER5> It sounds like they are seeing the same process as sleep consolidation. They should have also compared it to a nap.</comment>


Ask HN: What dataset could I collect while traveling extensively? - <AUTHOR> <comment><USER2> Take a look at the works of Nicholas Felton [http://feltron.com/](http://feltron.com/) especially his reports of his years of personal data like [http://feltron.com/FAR09.html](http://feltron.com/FAR09.html) These might give you ideas.

</comment><comment><USER3> [http://mapillary.com/](http://mapillary.com/) or [http://openstreetview.org/](http://openstreetview.org/), basically GPS tagged photos or video streams. Note in both cases the datasets will be free to use for non-commercial use but for commercial it's bound to a license.

And OpenStreetMap of course. I recommend the free [http://maps.me/](http://maps.me/) app that works offline. Every restaurant, every phone number helps.

</comment><comment><USER4> One set I've been casually collecting is a sample of feral vs. pet dogs visible on city streets worldwide.

<comment><USER5> Do you collect the whole animal or just the tail?

</comment></comment><comment><USER6> Gps location for photos - a lot of tools - online and offline - allow you to map your photos on a map which is always a fun way to go through your albums later</comment>