"Please take this down and write your own book." - <AUTHOR> https://github.com/martinemde/learn-ruby-the-hard-way/issues/1 <comment><USER3> This is a good illustration of how tone doesn't come across well in writing. Reading the comment by the original author, it sounded like a friendly request to please take the content down.

The guy whose site it was clearly didn't see it that way and responded as though he'd been viscously attacked. He ends up coming across as quite angry, when more likely he was just rattled and feeling defensive.

I guess the takeaway is to always take a step back before responding when you feel attacked. Chances are you're not being attacked nearly as harshly as you think.

<comment><USER4> The problem with Zed's response, IMO, is the end. Where he says to the guy to have some class and use his own words.

While I completely get what Zed is saying about asking permission. I don't think that "porting" a book is lacking class. It may turn out to be a futile effort, but in many ways I saw it as a tribute and maybe learning exercise. It would be a blast to do SICP in Java. For Java programmers the process of writing, and for others reading such a book would be a valuable experience.

I think if Zed would have just said:

"Hi, my book isn't public domain. You can't modify and redist w/o permission. And unfortunately, I don't think Ruby is the type of language you can just drop in as a replacement for Python. You may get the result to work, but it'll be suboptimal for Ruby and may even make my original text look worse as a result.

Ther eare some people working on a clean room version with Ruby. If you're interested, I'd be happy to make an introduction for you. Again, I'll have to ask you to cease using my text for this project, but hopefully you can create a great Ruby book in some other manner." Or something similar, the result would have been a more civil dialog.

<comment><USER5> I doubt that would have helped. Being caught infringing on someone's copyright is embarrassing to say the least. Embarrassment and being given advice, no matter how well-meaning, will often not go down well. In fact, many people get extra annoyed when you're nice about this sort of thing.

I think Zed's initial approach was a close approximation of the best way to handle this. Although I probably would have left it at the original notice and then a mere "thanks for taking it down". (speaking as someone who has no emotional involvement in the situation, anyway. Who knows how I would have reacted to that level of abuse)

<comment><USER4> I disagree. Frankly many people don't understand copyright law. Ask average Joe on the street what is Fair Use and most people don't have a clue. The Ruby guy didn't seem to know he was violating Fair Use, if so he likely wouldn't have called "Learn Ruby the Hard Way", and probably would make it more difficult to find for people that read the Python version, especially the author himself.

And I think if you couple that with the Hacker ethos and the way code licenses in our space usually exist (BSD, Apache, MIT, GPL, etc...) taking copyright material, modifying, and redisting, with attribution is usually fair game. Now such a tradition doesn't exist in the book market, but again, I'm not sure if a lot of people know that.

Note, if the book he was writing was a parody of Zed's book, he may be protected by Fair Use law.

In any case, all this points to the fact that he made an innocent mistake. And what I've discovered is that people who make these types of mistakes, while embarrassed, usually are deferential, unless personally attacked ("only an idiot can do something so stupid").

<comment><USER5> Speculation about interpretation and motives notwithstanding:

Not knowing the ins and outs of copyright law and licensing is neither excuse nor reason to blow up at a takedown request. Innocent mistake or not.

The parody and citation exemptions would presumably not allow verbatim lifting of large sections of prose, though. (presumably hence "may")

Based on the thread following the initial reaction they probably both owe each other an apology.

</comment></comment></comment></comment></comment><comment><USER6> The worst part of this situation is how martinemde is portending himself to be a "translator" like from English to Spanish, ignorant of the fact that you even need permission to do that. <http://twitter.com/martinemde>

Also its pretty crappy how the Ruby Protection Squad came to his rescue with blind hate for Zed throwing comments like "Wow didn't even know who Zed Shaw was, now the first thing I learned about him is that he's a total d-bag" - <http://twitter.com/PeteTheSadPanda/status/598669095084033>

Yes Zed doesn't always say things gently, but what he did say was 100% truth. Regardless of if you like what he says you have to respect 1. the truth and 2. who was really in the wrong here.

Final note: this guy could have buried it by just deleting the whole repo, but left it up to seem like the "martyr" - that is what kills me the most.

<comment> brown9-2 I think your first point here is excellent, but do we really need to care about what some random (as far as I can tell) Twitter user thinks about Zed? On the Internet you can find a negative comment about anyone by someone, somewhere.

</comment></comment><comment><USER7> Interestingly, Martin has now updated the readme <https://github.com/martinemde/learn-ruby-the-hard-way#readme>

He concedes both of Zed's main points:

1\. That he didn't have a legal right to "translate" the book

2\. That "translating" the book from Python to Ruby didn't work all that well anyway

The rest of the message boils down to a complaint that Zed wasn't nice enough in his takedown request. While Zed could have phrased things more nicely, he wasn't especially rude given the context of clear plagiarism and copyright violation.

<comment><USER8> Not nice? He could have sent a settlement offer... pay me X dollars for damaging my reputation as an author and I will promise not to sue you. Some may argue that Zed was not "damaged" by this juvenile act, but a good lawyer would have no problem proving damage if push came to shove.

<comment><USER4> I suppose the bar for Microsoft will now be that they didn't impose the harshest legal remedy against you, and since they didn't they're a charitable company? Unlikely, people are praising them for not fining them $30k per copy of Windows/Office made illegally.

<comment><USER9> If a company's "DRM" policy were simply to contact offenders and tell them to stop being dicks, I think folks would love it.

</comment></comment></comment></comment><comment><USER10> At some level, you have to love zed. He gives and gives to the world, and the world just craps on him.

Of course, I have a feeling that his personal brand isn't going to be helped by this exchange.

<comment><USER11> Zed has principles and follow them. His personal brand (I don't like the term, but I am not a native English speaker and have difficulties to come up with better) is not going to suffer, the opposite. He is just requesting respect for his work and the basic copy rights to be followed.

I like people with principles.

<comment><USER12> I don't like the term either. Reputation is a nice substitute, although it lacks the connotations of treating a person as though they were a corporation- style entity with a marketing department.

... which, come to think of it, is one of the reasons I hate the phrase "personal brand."

</comment></comment></comment><comment><USER13> "I'm a fucking Engine Yard programmer for fuck sake." - what an arrogant statement.

<comment><USER14> I read it not as "I'm an amazing programmer because I work for Engine Yard," but "I work for a company that clearly depends on your work - I respect what you've done."

<comment><USER15> On behalf of everyone who tries to communicate over the internet, I'd like to thank you for assuming the nicer interpretation. It's easy to misinterpret someone's tone, and written communication goes so much more smoothly when people avoid making angry assumptions.

<comment><USER9> I'm not sure "Hey, I write stuff using your software, you should tolerate my mistreatment of you better!" is a nicer interpretation.

<comment><USER16> No, but the "Hey I write stuff using your software, I never meant to mistreat you." is.

</comment></comment></comment></comment></comment><comment><USER17> Love the entitlement evident in his reply, "I'm a fucking Engine Yard programmer for fuck sake. We promote mongrel as a stable deployment stack" - does he think the fact that they promote zed's work means it's okay to ignore zed's rights regarding his own work?

Also, how could anyone take issue with the maintainer of <https://github.com/martinemde/dicks> and <http://dicks.heroku.com> ?

<comment><USER18> I don't think irony is the right word, but I got a good chuckle out of this martimeemde guy.

He is quite literally the embodiment of why zed left ruby. Someone profiting from Zed's work on mongrel yet at the same time giving Zed shit. Zed wrote a Python book and explicitly said it shouldn't be ported to Ruby. Then this ruby guy comes along and misappropriates the book and then whines that Zed isn't giving him enough for free.

<comment><USER19> > Zed wrote a Python book and explicitly said it shouldn't be ported to Ruby.

Just to make it clear, Zed said that his book shouldn't be 'ported' to _anything_. An inspired work based on Ruby already exists, by @krainboltgreene, and Zed is aware and supportive.

</comment></comment></comment><comment><USER20> But honestly Zed, the web is considered "public domain" and you should be happy I just didn't "lift" your whole book and put my name on it!

<comment><USER21> I hope sarcasm is intended here, if so- that's funny.

<comment><USER20> Thought it interesting how absurd the "Monica" situation seems, yet we often engage in essentially the same behavior ourselves.

That just doesn't sound as good on a bumper sticker.

EDIT: clarification

<comment><USER22> Monica was the original author - did you mean to write the name of that lady who is (was?) with the Cooks Source ?

</comment></comment></comment></comment><comment><USER23> Interesting. On the page about the book[1], Zed also links to How To Think Like a Computer Scientist, another popular book for learning Python.

Allen Downey was the first author on that book, but initially he wrote it in Java:

"I released the book under the GNU Free Documentation License, which allows users to copy, modify, and distribute the book.

What happened next is the cool part. Jeff Elkner, a high school teacher in Virginia, adopted my book and translated it into Python. He sent me a copy of his translation, and I had the unusual experience of learning Python by reading my own book."[2]

It's funny that the same thing is happening here, but Zed has a very different reaction than Allen's.

[1]: <http://learnpythonthehardway.org/index> [2]: <http://www.greenteapress.com/thinkpython/html/book001.html>

<comment><USER24> It would only be "the same thing" if Zed chose to release his content under the GNU Free Documentation License, which he did not.

It's his content, and he can do with it what he choses. If he doesn't want folks to "copy, modify, and distribute" his content, that's fine with me (not that it matters, since it's _his_ content).

<comment><USER25> Really? You see no similarities between these 2 cases?

I only see one big difference. One author cares about only himself and his own little world

<comment><USER24> I'm not even sure this is worth replying to, but what the heck...

Zed has absolutely no moral obligation to write stuff for free and release it for anyone to do whatever they want with. Do you express the same moral outrage over every book in the library with a copyright notice printed on it?

I surely hope that every piece of code and content that you ever create is released under a license that allows anyone to do what they please with it, otherwise... you don't have a moral leg to stand on.

<comment><USER25> Thank you for the lesson in morality.

</comment></comment></comment></comment></comment><comment><USER26> Regardless of whether Zed's tone in the first post was too harsh or not, I think everything from "Guys like you are the reason I stopped doing Ruby" onwards was just fanning the flames unnecessarily.

</comment><comment><USER27> This was originally posted by martinemde looking for support and then flagged down here: <http://news.ycombinator.com/item?id=1873881>

<comment><USER28> _"I messaged you on Twitter and contacted you by email to try to give you knowledge of it. I was quite public about doing it as a _why day project. I made a good faith effort to let you know what I was working on. I even knew you were working on having a learn code the hard way thing and I wanted to contribute but there's no clear outline of your goals or how you expect people to contribute. This is my understanding of what you'd expect for contribution."_

I tend to support the martinemde here. It seems he tried contact and was ignored. As much as Zed's coding skills are respected (I never looked into his code myself, but I trust my peers) I have to wonder if they are worth his toxicity.

"have some class", "guys like you are the reason I stopped doing Ruby", "Ruby hippie"... Come on...

<comment><USER29> > It seems he tried contact and was ignored.

I don't think silence is consent in this case. The whole thing seems like an obviously bad idea to me...

<comment><USER28> I suppose most programmers find it better to ask for forgiveness then for permission.

<comment><USER9> Whether or not that's true, programmers who go for that approach need to be good at apologizing.

<comment><USER28> Zed over-reacted. Whatever harm martinemde did to Zed's book is close to nothing. Martinemde took down the derived book as soon as he got the request from Zed, who, while saying "please", also accompanied it with a couple insults.

<comment><USER9> Part of being good at apologizing is sucking it up and accepting anger from the people you piss off.

Don't go the "better to ask forgiveness" route if you're unwilling to accept some grief.

<comment><USER28> An equally important part is to refrain from doing it when you think the other part would be gravely offended. As Martin explained, he was paying homage to Zed. Instead of trying to understand the reasons someone would like to homage him, Zed insulted Martin.

When I ask someone to take down a plagiarized version of something I wrote (it happens) I usually point out I do not license the material on my site. I don't call people names not I insult them - I just point out they shouldn't do it and urge them to take the content down because it's not fine with me they reuse it. Even that is rare - I am usually happy with adequate attribution.

I can't understand why someone talented as Zed feels a need to insult people. But that's me and I am not like him.

<comment><USER9> " _An equally important part is to refrain from doing it_ "

No, that would be closer to the "asking permission" philosophy.

<comment><USER28> It's better to ask for forgiveness, but asking permission, when feasible _and_ practical (Zed ignored the guy, after all) is nice.

<comment><USER9> So the steps you really suggest are:

1) Ask permission.

2) If you don't get permission, do it anyway.

3) Complain and berate the people you crossed if you suffer consequences from doing it anyway.

Gah. I think I've had quite enough of talking with you.

<comment><USER28> Not exactly.

1- ask for permission

2- if you don't get an answer, assume the subject is not that important to the person you asked

3- Do it

4- If person who ignored you denies you permission retroactively, comply

5- Complain when the person who ignored you and then denied you permission to do what you already did, which you promptly removed from public access, also insults you for no reason beyond not getting his attention in the first place.

I think that covers it very thoroughly.

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER30> Drama!

Seriously though, everyone should be aware that "free as in beer" and "free as in speech" are not the same thing. And they should be aware of which case applies.

</comment><comment><USER31> Please see the README on the front page of the project with my update.

<https://github.com/martinemde/learn-ruby-the-hard-way>

I've calmed a bit since the original postings. I can see why he was upset and I know that the right thing to do was to remove the book. I had good intentions and I did this out of homage, not to steal or claim any credit.

I've always been a fan of Zed's work. I will continue to be despite getting defensive about this.

<comment><USER9> This update would be better without the remaining defensiveness, but it is a much less wrong response.

I'm bewildered, though, at your saying that you're surprised at all the attention this has received _when you've tried to publicize this incident_.

<comment><USER31> I found the whole incident rather funny. Zed published a post about the issue, I published the issue since Zed didn't link it. I've never submitted to Hacker News and figured it'd get buried. I didn't expect top story on hacker news.

</comment></comment></comment><comment><USER8> Zed should have sent a DMCA notice to github.

<comment><USER8> <http://help.github.com/dmca/>

For some reason can't edit my original comment. So replied to myself.

<comment><USER9> After a certain period of time, you can't edit a comment you've made. Not sure of the exact period.

</comment></comment></comment><comment><USER32> I think Zed's approach reflects an attitude like 'I shouldn't have to hold your hand re:copyright.'

I'm guessing Zed's rancor isn't _just_ about this incident, but the 'net-wide confusion about copyright vs cc copyright vs gpl vs whatever, particularly among the newer generation of web developers (like me). I am sympathetic to his feeling of "I shouldn't even have to tell you this."

<comment><USER9> Agreed, and I think it's a justified rancor. There are some things you're expected to know as a literate person in this day and time, and some guy can't just expect his ignoring them to be covered with a shrug and a "my bad" when he's called on it.

</comment></comment><comment><USER33> There's faults on both sides. The guy is clearly in the wrong by failing to follow the copyright restrictions, but it was probably an honest mistake. Since he's spending to much time on the book, he's probably a fan of Zed's work. And he may be thinking he's adding value to the book. On the other side, Zed was completely within his rights to ask the guy to take repository down, but didn't need to make any assumptions about the guy's intentions or "class".

</comment><comment><USER34> For me the most interesting part was reading this, pondering about text as medium that lacks a lot of - erm - subtext _and_ I guess it's especially interesting if english is not your native language. That by itself usually leads to "wait a minute, what is the author trying to say here" moments more often.

What I mean: Write german and I tend to interpret a lot more - I assume that I _know_ the language really well and therefor just _know_ what you're trying to say here. Maybe it's an advantage to read most of my internet stuff in english: Less "Someone's wrong on the internet" moments and more "Did I get this right" reflection.

On-Topic: I respect Zed's work, tried the book recently and liked that quite a lot either. I do wonder if the tone was necessary though: Except for the "WTF? I didn't _meant_ to violate copyright" I couldn't read anything insulting in the author's comments, while "lacking class" and "I left ruby because of people like you" is - personal.

Yes, it was wrong. Others commented that he could even hired a lawyer (seriously? For a no-profit, partly done, public github project? Overkill?), but I really think this could've been solved in private, easily, without much hassle.

For me, for the most part, the original author sounds/reads like a real, authentic (ex-?) fan of Zed..

<comment><USER35> I call bullshit. Text can be perfectly expressive, in fact often more expressive than other media. You just need to be able to write well - <USER2> e-mail has exposed us on a daily basis to the fact that most people haven't figured out how to write and communicate very well.

Obligatory plug - I wrote about this recently: [http://blog.tommorris.org/post/1307196373/im-getting- absolut...](http://blog.tommorris.org/post/1307196373/im-getting-absolutely- bored-of-this-tired-and)

<comment><USER34> Nice way to promote your own blog.

Quote: "Do the people who propose these theories not get letters in the post? Do they not send each other Christmas cards?:

See - that's the part that shows that you fail to understand the problem. At all. I can send my mum, my SO or my brother short notices - and they will get what I mean. Because they already know me. They know my style of talking, my sense of humor and my way to argue. I'm not going to send you a christmas card over the internet, without previous encounters.

See - if you present this text of yours here, I'm lost. Are you _serious_ about that "bullshit"? I'm not sure. I don't know you and it doesn't make much sense to me. Either you are serious and we have to disagree a lot and I just don't (so far) get what your problem with my position is, or you just make a joke. Maybe you are chuckling in your chair and just want to spread some HN link love. Maybe you actually DO believe that emotions and intents are clearly visible in text.

If the last point is true I wonder if you had any classes/lessons where you were told to determine the authors intention - and if you have enough confidence to claim that yes, you knew _exactly_ what Mark Twain was trying to tell you in each of his books.

Er - I guess that was a long way to say: I call bullshit on both your argumentation and your motives. Feel free to read this with the image of me being amused, bewildered, confused, angry, annoyed or just neutral. Have fun.

<comment><USER35> I don't believe that emotions and intent are clearly visible in text. You have to put them in there. That's why you have to learn to write.

If we expect to have an economy of so-called 'knowledge workers' who thrive on the basis of knowing stuff and communicating that to people as and when required, decent writing skills seems a pretty damn important thing to have. Instead, we don't teach people to write properly (and people don't seem to aspire to learn writing) then we wonder why they can't write properly and their e-mails don't communicate the message they are trying to convey.

I'm saying that we shouldn't blame e-mail or technology because some people are crap at writing e-mail any more than we should blame Flickr and Facebook for people being crap at photography.

When someone can't communicate online excuses like "e-mail lacks visual cues" are just that - excuses.

<comment><USER34> It is interesting that the highest voted thread at this point in time starts with "This is a good illustration of how tone doesn't come across well in writing." - and yet you don't call bullshit there, you do it here.

What you call for - as far as I can understand it - is a norm, a way to measure quality for texts. I say that this isn't realistically possible.

This works for people you know (easily, they can grok what you wanted to say). It might work for peers (they understand where you coming from, share some experiences and might know what you want to get at). In general, it doesn't work at all.

Things you completely ignore:

\- Language: My first post started with the difference between reading in your native language and a foreign one. Depending on your readers understanding of your language you cannot transport your intentions in a reliable way. A smile, on the other hand, goes a long way to show that you are not actually mocking him/her and are a friendly person. Good luck, trying to make that universal.

\- Feedback You can write a loooong text about a subject and cause me to explode when I read that midway through. If you tell me the same story face to face, you could probably read my expressions (depending again on context, how familiar we are, if you pay attention etc.) and navigate around some hurdles. You really want to tell a nice story about the Iraq war but notice how my mood turned darker? Good chance to ask me about my opinion and to take it slowly. How do you solve that in a text based conversation? Right.

\- Context/Previous knowledge: You can talk about things I have no clue about, rather easily. Depending on your attitude and style of writing I might feel excluded, maybe offended, although it's entirely my fault. Face to face you could be Prince Charming. Without that and any knowledge of your readers schooling/education/knowledge, how are you going to make sure that you don't accidently embarass them?

I don't blame email or technology. The problem isn't new either. As long as we've been able to communicate in writing first, without knowing the other person, this problem existed. It's not about "emails". Neither about "technology sucks". It's about "words, without more context (previous encounters, a similar character, a shared history), don't carry the full information".

For me it's like a blurred image. If I know the thing that is depicted, I can clearly recognize it. If not, it's guesswork. You can try and make it easier, by blowing up your text to explain as much as possible and to try to (and fail) solve any ambiguous meaning, but in the end I'm still lost. On the recipients end, I have to rely on my information alone to understand what information you want to provide.

I have some good friends that are blind. In your world, they wouldn't miss that much even outside of online conversations: The text carries all the meaning, right? Nuances of the voice? Nice, but not necessary if the author is disciplined. Making faces, smiling etc.? Hey, you don't need that.

Are you really, really serious?

And you say "you have to learn how to write", when I say that reading is the part where the problem occurs? Can you really write "for everyone"? I'd argue that so far you cannot write for me, I'm still unsure if you are just trying to contine this discussion in a productive way (hints are some writing related parts of the comment, imo) or if you just want to talk me down (most of the comment, imo).

See 1, 2 and 3 and check if you actually _can_ write clear enough for everybody out there.

(FWIW: I used "me" and "I" in this text as a general replacement for "you" and "one", i.e. just examples. In addition, all examples are completely artifical as well and you cannot guess my feelings/viewpoints from this comment)

</comment></comment></comment></comment></comment><comment><USER36> This is Zeeed Shaaaaw!!!

I have never met the guy, but I surely hope that I get the privilege some day, even if he just picks on me and tells me that my work is worthless piece of junk and that if it implodes in a second it would be a service to the world - because that might be single most insightful and sincere analysis one might receive.

Kudos to anyone with a pair, that is capable of speaking their mind in today's "politically correct" world ridden with hypocrisy.

<comment><USER37> Like it or not Zed is entirely right here. It's his work, the guy had no permission, it has nothing to do with being "politically correct" it has everything to do with no being a dick and respecting a persons ownership and the effort they put into something. Whether or not Zed is the biggest dick in the world is irrelevant.

<comment><USER9> Absolutely. It's one thing to take issue with the tone of someone voicing an opinion or reacting to your opinion, but it's another to whine that someone's not being friendly when he's telling you to _stop stealing his work_.

</comment></comment></comment><comment><USER38> Why are a lot of people missing stuff like this: "have some class and use your own words and write your own book" and this "Guys like you are the reason I stopped doing Ruby"?

I agree with Zed that the idea was borderline useless since both languages have their ways and a direct translation lacks focus anyway. I also agree that it's Zed's work, and he granted use of his work with a license which doesn't allow this type of derivate work. Zed was totally in the right here, and Martin was totally in the wrong.

That being said, that doesn't automagically grant Zed the right to be a douche and insult the guy, specially since not only he complied with Zed's request, but tries to explain that he did so in good faith. There's no 'tone' here, it was obviously an insulting and condescending attack towards Martin. A simple "Hey what you're doing is not permitted by my license, take it down" or "You're infringing my copyright, take this down" would have been more than enough. The reality is that Zed loves to pick a fight and demean people, and in this case Martin made a mistake in good faith and did not deserve such disdain.

<comment><USER9> When you act in a classless way, whether that's making fart noises in a restaurant or plagiarizing someone's work, you risk the pain of being told to act with more class.

<comment><USER38> Two things:

1) It was not plagiarizing, it was copyright infringement, and they are both not mutually inclusive and are completely different. Martin didn't appropriate the content or idea of the book and called it his own, he publish the start of an attempt of a 'book hack' stating the original author and intent.

2) Do you equate fart noises with a person making a mistake in the name of providing something useful to the community? The dude made a mistake, a mistake that in no way reflects on his amount of class, but does reflect on his drive to provide something useful to the Open Source community. Sure he should be corrected, as he did make a mistake, but he should not be degraded in any way as has been done in this case.

PD: Who has more class, the person who farts in a restaurant, or the person that calls him on it publicly without knowing the reasons for him doing it and does so with intent to degrade such person?

<comment><USER9> You're trying to wrap all this up in justifications of what he did this "in the name of".

How someone justifies something like this is irrelevant. The basic rule for material, absent an explicit other license, is copyright. Shaw is generous enough to offer a less restrictive license, but that license is clear on its terms. To ignore the license given on a work, whether it's copyright, some CC non-commercial variant, GPL, or _whatever_ is indeed a classless act.

And if you want to linger on "providing something useful", Zed has pointed out and Martin acknowledged that this approach is _not useful_ for advancing Ruby education. (For that matter, it was a dead project.) Shaw has now provided a guide on how to make a book of this style at <http://sheddingbikes.com/posts/1288945508.html>

Also, it's "make fart noises", not "fart". As in deliberately make a noise considered rude. Copying and pasting a book and putting it in a public repository isn't a semi-voluntary bodily function.

<comment><USER38> For starters, I'm not justifying anything Martin did, as I never said he was right in any way, don't try to put words in mouth. As a matter of fact, I agreed on the following: 1) Zed has every right to complain due to his copyright and the license which his work carries 2) What Martin did was wrong, and as such he should accept that fact that the owner disapproves and take the work down (which he did) 3) Martin violated Zed's copyright. I explicitly said that what he did was copyright infringement, which can certainly be attributed to a mistake, because you wrongly stated it was plagiarism, which is considered morally unacceptable and reprehensible, and is in no way the same thing.

You want to know what IS irrelevant? The fact that Martin and Zed (and both you and me actually) both acknowledged that the approach is not useful, specially since I already stated in the grandparent post - to which you responded - that I agreed on not only Zed's rights as copyright holder, but also on the fact that the approach is rubbish. It doesn't matter whatsoever if the approach works or not, it only matters that Martin did it in good faith because he believed it could be of use when he started, even if later he discovered to be wrong on this count.

I addressed your fart noises on my second point of the parent post, on the last paragraph I was referring to actual farting because it is more representative of what happened here. I referred to them separately and referred to 'farting' and 'farting noises' to make this clear (as they are obviously two different things). The fact that you equate a jerk making farting noises in a restaurant with making a mistake in regards to a free book's licensing is beyond my comprehension, as it implies that you're disagreeing with the intent of the person in question when it was already not only stated by him, but by Zed himself in his messages.

 _Also, it's "make fart noises", not "fart". As in deliberately make a noise considered rude._

You said it yourself, the key word on this example is 'deliberately'. Martin did not make deliberately farting noises (deliberately and knowingly doing copyright infringement on Zed's work), he actually farted by mistake (mistakenly having violated Zed's copyright thinking it was fair use), and because of this he should apologize to the restaurant, but such events in no way grant Zed the right to humiliate, demean, or degrade Martin. I'm not justifying Martin's actions, as I agree that he's wrong and Zed is right, I'm criticizing Zed's responses and the manner in which he expressed himself towards not only towards Martin, but towards the Ruby community itself.

The funny thing is that I actually respect Zed for his contributions, and isn't someone I'll be deleting from my newsreader because of something as non- important as this. That doesn't change his attitude was reprehensible, and that he could have handled it better.

<comment><USER9> This is the last I'm saying to you on this topic:

Sometimes you wrong someone. Sometimes you do something classless. Maybe it's very deliberate, and maybe it's due to your sloppy carelessness, as Edme has copped to in this case.

In that situation, _it's all on you_. It's not on the other person. Everything you do to justify it or minimize it or recast the other person as the bad guy _is wrong_. This goes as well for your friends or random people sympathizing with you.

You may have to suck up some unkind words for what you've done - tough. You've earned them and the anger behind them, and you have to just deal with it.

</comment></comment></comment></comment></comment></comment><comment><USER19> The "good riddance" posts really sadden me. I've generally found the Ruby community to be a great place, and then comments like these come along...

</comment><comment><USER39> This is clearly not plagiarism. At no point did the translator take credit for the original work. There is a definition for plagiarism; it involves taking credit for someone else's original work.

Zed would probably have done better by simply quoting the license and asking him to take it down (because of copywrite infringement) instead of incorrectly accusing him of plagiarism (which implies he was doing the translation in bad faith).

<comment><USER39> Factual correctness warrants down vote? Seriously?

"the wrongful appropriation, close imitation, or purloining and publication, of another author's language, thoughts, ideas, or expressions, and the representation of them as one's own original work." (<http://en.wikipedia.org/wiki/Plagiarism>).

This was not plagiarism.

</comment></comment><comment><USER40> Nobody's going to notice this comment now, but Martin Edme has posted a formal apology.

Zed, it seems, will not apologize, based on recent twitter updates:

Hilarious hypocrisy how I'm called a "dick", "asshole", "d-bag", and "cock" because I said someone should have some "class".

33 minutes ago via web [1]

[1] <http://twitter.com/zedshaw/status/774156132024320>

</comment><comment><USER41> Wow. There are people who will steal* and then have the guts to argue they are right.

I did not read LPTHW before this.

Now I read it and it's indeed hard work.

Wow.

</comment><comment><USER42> Although I understand the author's desire to not have his work copied, I think he stepped across the line when he used a personal attack:

"Guys like you are the reason I stopped doing Ruby."

</comment><comment><USER43> It must suck to have your everyday online activities tracked, and your character traits debated at length by strangers.

Look at the title of this HN post, pure celebrity drama-bait.

</comment><comment><USER44> Why do people take the time to digitally bicker with veteran trolls? We're all professionals, this isn't something you want your name attached to on the "nothing is ever forgotten" internet.

</comment><comment><USER45> Wow. I really want to be on Zed's side here, but while his message is 99% legit, his delivery leaves something to be desired.

<comment><USER46> Original author (martinemde) had good intentions but was stopped by a fact he was dealing with a douchebag.

Lesson #1: don't deal with douchebags.

Zed thinks he's making something of extraordinary quality that's going to suck when crowdsourced. I am 100% sure he's wrong because wikipedia is crowdsourced and wikipedia is awesome.

<comment><USER40> Did you notice that the book has an issue tracker? How many other books have one of those?

Also, Wikipedia may be awesome, but what percentage of Wikipedia clones are awesome?

</comment></comment></comment><comment><USER47> If the guy credited him and Zed's book was free online, then I really think Zed is doing the coding world a disservice here...

<comment><USER47> I'm getting downvoted, so I'll expand:

If you make ethical judgments directly from the license then Zed Shaw is right. But Martin hadn't really done much wrong. The book was free online, and it would be classed as fair use by many people if it had been made using music, film or tv. He also made sure to credit Zed for the text, and only an idiot would think that Zed was able to change his text to fit the code better so I don't think it would reflect back on Zed badly at all...

Then again, in my opinion, what is important is that there are more beginning code examples to read in Ruby. Bullshit over rights or hatred of whole programming communities be damned.

</comment></comment><comment><USER46> I'm probably gonna get downvoted, but now I'm quite sure that web really IS public domain. We just have to state it explicitly. From now on gonna use public domain license on any public work I produce. Who's with me?

<comment><USER48> Well, there's copyright's all over the web, and anything without it is common law'ed into being copyrighted - so no.

Personally, I go by the mantra of "if you post it, anyone can use it how they like".

Sure, Zed is within his legal rights to ask for this, but I'm surprised no one is viewing this from the angle of the Ruby community losing a (possibly) valuable resource because "Zed's brand" has to be maintained... Seems like everyone is so sensitive about the sanctity of their ideas.

<comment><USER9> As linked elsewhere: <http://news.ycombinator.com/item?id=1739890>

Copy & paste probably won't make a useful Ruby book.

 _"Seems like everyone is so sensitive about the sanctity of their ideas."_

That's the pain of dealing with other human beings as if they _are_ human beings and not just web sites or github repositories.

<comment><USER48> My argument isn't that this Ruby version is so compelling it deserves to exist. I think restricting creativity "because I made it" is a stupid reason. Maybe others would have (are?) making useful "X The Hard Way" books stop because of this. I don't see what the benefit of him restricting it is.

</comment></comment></comment></comment><comment><USER49> Disclaimer: I'm commenting on this thread only to help Zed generate more publicity/buzz for his book, which was surely the reason why he was a dick to Martin about it :)

People understand clearly when someone like "The Situation" acts like a dick to gain notoriety, but many programmers seem not to be able to understand when a programmer does it. This is very effective schtick, and Zed has inspired a few others of late.

Bottom line: Zed is a nice guy and Martin is a nice guy.

</comment><comment><USER25> Someone, please tell me where there is a copyright notice anywhere on <http://learnpythonthehardway.org/> or on the PDF [http://learnpythonthehardway.org/static/LearnPythonTheHardWa...](http://learnpythonthehardway.org/static/LearnPythonTheHardWay.pdf)

If he's so fanatical about copyright, why can't he post something about it?

The culture developers are used to on github is forking people's work and tweaking it (while still giving attribution to the author). It's not totally shocking that someone would accidentally apply this philosophy to this book. Telling someone he has "no class" for doing this is just being a dick.

But then again, its Zed D Shaw. He earned that middle name.

<comment><USER50> copyright is implicit in many places isn't it?

<comment><USER51> In the U.S., and AFAIK in much of the rest of the world, copyright arises automatically, without the need for either registration or a copyright notice, once the "original work of authorship" is "fixed" in a "tangible medium of expression" (which can include saving to disk). See generally <http://en.wikipedia.org/wiki/Copyright#Obtaining_copyright>

<comment><USER52> While the copyright itself can arise without registration, the ability to file suit in federal court for infringement of the copyright arises only once registered. Registration can take place after the date of infringement. For more see <http://www.copyright.gov/help/faq/faq-general.html#register></comment></comment></comment></comment>


The Consortium for Python Data API Standards - <AUTHOR> https://data-apis.org/blog/announcing_the_consortium/ <comment><USER2> Just to set some context - this is being driven by Quansight which is led by Travis Oliphant, who united Numeric and Numarray to create NumPy many years ago which lead to the entire python data science ecosystem as we know it. Yes it's ambitious, and they may not succeed, but it's not their first barbecue. Unifying communities and APIs is something they're good at.

<comment><USER2> For some context on why this matters, if you're writing a library (like sklearn) and you want to support multiple array types, you might need to do stuff like

      if isinstance(x, ndarray):
          ...
      elif isinstance(x, other_array):
          ...

In the most ideal case having the standard means that scientific libraries can support all conforming implementations by default. Then sklearn would automatically support cupy/numpy/dask/jax/mxnet/pytorch/tensorflow arrays. Multiply that by all the scientific libraries and the effect is pretty profound.

</comment></comment><comment><USER3> The software they're running as part of this effort is really smart.

[https://github.com/data-apis/array-api-comparison](https://github.com/data- apis/array-api-comparison) is a bunch of tooling to help illustrate the differences between the different APIs.

[https://github.com/data-apis/python-record-api](https://github.com/data- apis/python-record-api) is particularly interesting: it runs a GitHub Actions workflow that uses the Python sys.settrace mechanism to track all calls exercising those libraries and derive their type signatures, then generates type files and commits them BACK to the repository. So [https://github.com/data-apis/python-record- api/tree/2259df2f...](https://github.com/data-apis/python-record- api/tree/2259df2f876625abae7365931f203467906fd4ae/data/typing) has a whole bunch of type information that's maintained by the bot.

</comment><comment><USER4> If arrays are standardized, we may even see a future where they end up being in the stdlib, while libs like numpy, dask, etc. will mostly provide tooling to work with them.

This would be a huge deal, allowing pure Python libs to suddenly exist for a whole lot of things like image/video manipulation, advanced stats, and so on, without requiring compiled extensions.

I love numpy, but having to install the 100Mo beast is overkill for a lot of use cases. Not to mention restricted environments where you can't.

Well, one can dream, no?

Imagine having a numpy-like array as a primitive. Suddenly you can make the case for a K/J-like DSL embedded in it like regexes are for text. Suddenly Python-fast enough perfs are getting an order of magnitude higher. Suddenly you get a powerful shared buffer for multiprocessing.

<comment><AUTHOR> A good first step in that direction would be writing a solid PEP. But I'd say that it would be helpful to have a common standard ready first.

</comment></comment><comment><USER5> I suppose this can be compared to standardising SQL. However that has ended up with a least common denominator of simple operations and dozens of specialised dialects. Better than before the standard but certainly not great and tons of engineering has gone into cross dialect facades.

Granted I haven't thought as long or as hard as the authors but I wonder if there are easier ways to go about this:

a) something akin to slf4j or one of the many unifying facades in java b) standardising the data structures/formats. eg Arrow has done quite a good job positioning itself as a data lingua franca and has compute primitives.

Regardless, I will be watching with interest!

</comment><comment><USER6> I think this might be a bit premature. For the bulk of these tools (pandas/numpy/tensorflow/torch), most of their users have probably been using them for 3-5 years max.

A universal API standard is a nice idea, but I don't know that the ecosystem has been around long enough to justify this effort.

Given the asynchronous nature of consortiums though, maybe this exactly the right time to start talking about this.

Will be watching closely either way.

<comment><USER7> This is about creating a standard for array computing in Python which has been around for more than 20 years. NumPy (which has been a de facto standard) has been around for 14 years and was based on Numeric which was around for 10 years before that. Pandas has been around almost 10 years now. The parts of the standard that are clear and will emerge are the parts that have been around and used by sufficient numbers for at least a decade.

</comment></comment><comment><USER8> This actually strikes me as a huuuge waste of effort. I work with every one of the different technologies they mention every day.

The differences and idiosyncrasies are truly, truly not a big deal and really what you want is to allow different library maintainers to do it all differently and just build your own adapters over top of them.

This allows library developers to worry about narrow use cases and have their own separate processes to introduce breaking changes and features that deal with extreme specifics like GPU or TPU interop, heterogeneous distributed backed arrays, jagged arrays, etc. etc.

Let a thousand flowers blossom and a thousand different Python array and record APIs contend.

End users can write their own adapters to mollify irregularities between them, possibly writing different adapters on a case by case basis.

If any "standard" adapters gain popularity as open source projects, great - but don't try to bake that in from an RFC point of view into the array & data structure libraries themselves. Let them be free / whatever they want to be. That diversity of API approach is super valuable and easily mollified by your own custom adapter logic.

<comment><USER7> Bias warning --- I'm part of the group doing this work. For an end-user, your arguments are fine. A single developer or team can indeed use whatever tool they want and adapt their code without too much difficulty.

The real challenge comes, however, as you try to build an ecosystem of libraries on top of multiple different APIs. You end up reinventing the wheel or struggling to maintain multiple versions of the same library.

Some cooperation is immensely helpful at the lowest level, and we hope ultimately to be helpful to the different tool builders in providing information and guidance about what is already a standard and agreed upon in the space.

This is not about establishing or forcing behavior. It is about documenting and clarifying best practices that have already emerged as well as potentially giving libraries a way to signal to downstream developers of additional libraries that they adhere to the standard.

<comment><USER8> I don't really disagree with most of your points, but what you describe does not sound like it should be a committee with governance rules and member libraries tied to an RFC process.

What you describe sounds like you could just create your own single library like a Swiss army knife that contains adapters to rationalize the semantics if you want, even at the ABI level if truly needed.

Member libraries can do a best effort support for not breaking that adapter library's way of wrapping them, and/or contribute patches that keeps the adapter in sync with new releases of the library.

This makes the adapter layer become totally opt-in and backported rather than required via consortium membership & RFC governance, and even leaves room for competitor adapter tools to coexist that might do things differently.

Ultimately my concern with a governance model is that it creates political power to compel the member libraries to do things that might go against the needs of their users for the sake of the consortium.

I just don't see a reason why that's more valuable than letting all the libraries do their own thing and let users choose or make their own custom adapters.

This example of array APIs is nothing like say overall HTTP protocol or IEEE floating point protocol, which are cases where a governing standard makes sense. This is nothing like that in my opinion.

</comment></comment></comment><comment><USER9> Given the algorithmic focus of the libraries being targeted, I think the main benefit is if I could do X operations with library A and then use the result to do Y operations with library B. It does seem like that is the intent (if I am not mistaken), so this seems like a worthwhile effort.

One problem with generally using libraries is they work fine until they don't, and once you've been working in one library for a while, all of your support functions, and transformed data are all based around that library's api which makes integrating a new one difficult. This could help with that type of difficulty.

</comment><comment><USER10> I am so confused. Maybe it's because I'm a part-time self-taught programmer. Are we _calling_ function signatures 'APIs' just so we can speak about the topic of so much diversity in what on the face of it should all be the same implementation? Because my idea of API is the endpoint for a closed system, usually accessed over the wire.

Is this use of the term 'API' canonical or artistic license?

<comment><USER11> APIs are Application Programming Interfaces, and they have existed long before the web and web services. The article's use of APIs is correct. A really well known example of an API is the C library.

<comment><USER10> How is this discussed in computing textbooks--is there a chapter I can read and catch up?

</comment></comment></comment><comment><USER12> I wonder if this risks ossifying API's at the lowest common denominator. Both the numpy and pamdas API's are far from ideal, see for instance the recent developments towards named tensors.

</comment><comment><USER13> Kind of ironic that none of these data structures are in standard library.

Yes, the standard library contains NumPy-like arrays, but nobody uses them.

</comment><comment><USER14> Sort of relevant [https://xkcd.com/927/](https://xkcd.com/927/) ;)

All joking aside, I applaud the effort and would love for the project to have success. I can never remember that tensorflow calls it reduce_mean..

</comment><comment><USER3> My Datasette project has given me a slightly different perspective on API standards - at least in terms of things like shared definitions of XML, JSON shapes, RDF schemas etc.

Once you've loaded your data into a SQLite database and put Datasette in front of it, your audience can get the data out in any shape that they like.

Consider the museum data in my [https://www.niche- museums.com/](https://www.niche-museums.com/) website.

Using a SQL query, I can get it out as an array of objects with name, url, address, latitude, longitude: [https://www.niche- museums.com/browse.json?sql=select+name%2C...](https://www.niche- museums.com/browse.json?sql=select+name%2C+url%2C+address%2C+latitude%2C+longitude+from+museums+limit+10&_shape=array)

Or maybe I want to get back the name as "title" and the latitude longitude as lat / lng. I can do that with a different SQL query:

        select name as title, latitude as lat, longitude as lng from museums limit 10

Here's that as JSON: [https://www.niche- museums.com/browse.json?sql=select+name+as...](https://www.niche- museums.com/browse.json?sql=select+name+as+title%2C+latitude+as+lat%2C+longitude+as+lng+from+museums+limit+10&_shape=array)

Let's say I want it as an Atom feed. Datasette plugins can add different output renderers, so I can get back an Atom feed like this:

[https://www.niche- museums.com/browse.atom?sql=SELECT%0D%0A++...](https://www.niche- museums.com/browse.atom?sql=SELECT%0D%0A++%27tag%3Aniche- museums.com%2C%27+%7C%7C+substr\(m.created%2C+0%2C+11\)+%7C%7C+%27%3A%27+%7C%7C+m.id+as+atom_id%2C%0D%0A++m.name+as+atom_title%2C%0D%0A++m.created+as+atom_updated%2C%0D%0A++%27https%3A%2F%2Fwww.niche- museums.com%2Fbrowse%2Fmuseums%2F%27+%7C%7C+m.id+as+atom_link%2C%0D%0A++coalesce\(%0D%0A++++%27%3Cimg+src%3D%22%27+%7C%7C+m.photo_url+%7C%7C+%27%3Fw%3D800%26amp%3Bh%3D400%26amp%3Bfit%3Dcrop%26amp%3Bauto%3Dcompress%22%3E%27%2C%0D%0A++++%27%27%0D%0A++\)+%7C%7C+render_markdown\(%0D%0A++++m.description+%7C%7C+%27%0D%0A%0D%0A%27+%7C%7C+coalesce\(%0D%0A++++++\(%0D%0A++++++++select%0D%0A++++++++++group_concat\(%0D%0A++++++++++++%27*+%5B%27+%7C%7C+json_extract\(p.value%2C+%27%24.title%27\)+%7C%7C+%27%5D\(%27+%7C%7C+json_extract\(p.value%2C+%27%24.url%27\)+%7C%7C+%27\)+%27+%7C%7C+json_extract\(p.value%2C+%27%24.author%27\)+%7C%7C+%27%2C+%27+%7C%7C+json_extract\(p.value%2C+%27%24.publication%27\)+%7C%7C+%27%2C+%27+%7C%7C+json_extract\(p.value%2C+%27%24.date%27\)%2C%0D%0A++++++++++++%27%0D%0A%27%0D%0A++++++++++\)%0D%0A++++++++from%0D%0A++++++++++json_each\(coalesce\(m.press%2C+%27%5B%7B%7D%5D%27\)\)+as+p%0D%0A++++++\)%2C%0D%0A++++++%27%27%0D%0A++++\)%0D%0A++\)+%7C%7C+coalesce\(%0D%0A++++\(%0D%0A++++++select%0D%0A++++++++group_concat\(%0D%0A++++++++++%27%3Cp%3E%3Cimg+src%3D%22%27+%7C%7C+json_extract\(ph.value%2C+%27%24.url%27\)+%7C%7C+%27%3Fw%3D400%26auto%3Dcompress%22%3E%3C%2Fp%3E%27%2C%0D%0A++++++++++%27%27%0D%0A++++++++\)%0D%0A++++++from%0D%0A++++++++json_each\(coalesce\(m.photos%2C+%27%5B%7B%7D%5D%27\)\)+as+ph%0D%0A++++\)%2C%0D%0A++++%27%27%0D%0A++\)+as+atom_content_html%2C%0D%0A++%27Simon+Willison%27+as+atom_author_name%2C%0D%0A++%27https%3A%2F%2Fsimonwillison.net%2F%27+as+atom_author_uri%0D%0AFROM%0D%0A++museums+m%0D%0Aorder+by%0D%0A++m.created+desc%0D%0Alimit%0D%0A++15)

That's using a convoluted SQL query to define exactly what I want back in that feed.

The point is: if you have a sufficiently flexible API gateway in front of your data, the people consuming your data can define the "standard" that they want to retrieve it in at runtime.

I think that's a really interesting characteristic. It's made me less excited about boil-the-ocean attempts at defining a single standard and getting everyone to support it at once.

[ This thread may not be the best place to raise this idea, since the Python Data API Standards project isn't really in the same realm as the web API formats I'm talking about here ]

<comment><USER7> I agree that interfaces like Datasette are a fantastic idea. But, it's not the same thing. Think of this more like the SQL standard. What would you do if SQL did not exist and there were no common ways to discuss querying databases?

<comment><USER3> 100% agree, this isn't the right thread for my random thoughts on web APIs!

<comment><USER15> I don't think your ideas are random nor out of place. Durable data accessible by different clients is an important property that bleeds into the data science realm. Apache Arrow seems to partially tackle this problem by moving the data to shared memory that can be accessed by different runtimes like Python and R.

There are a couple of problems I see with SQLite used as a common data format:

1\. SQLite is a state machine that only stores the most recent version of mutable (binary) tables so change control is non-trivial.

2\. Matrices/Tensors are not naturally stored in relational tables.</comment></comment></comment></comment>


Show HN: free, open source, keyboard friendly list app - <AUTHOR> http://openhercules.com/

<comment><AUTHOR> Considering the furor over dcurtis's elitism and closedness, I figured it was a good time to finally get off my ass and open source the list app I've worked on over the last year and a half.

In retrospect, I should have titled this submission, "Codename: Open Hercvles"

</comment><comment><USER2> Congratulations, you've created something far better than what Asana and their huge team took 3+ years to build.

</comment><comment><USER3> <http://checklisthub.com/> was actually the reason my partner and I stopped working on a keyboard friendly todo list. I figured it was basically everything I wanted, and it was already built. Great work, and thanks for open sourcing it now.

<comment><AUTHOR> Wow, crazy. I hope you find some benefit from the source code.

I don't plan on expending much effort to market this. My primary desire is to get contributions. My next desire after that is to finally be able to get this installed behind the firewall at the company where I work. It'll be cool if the public site gets really popular, but honestly I don't know how to go about making that happen. It would be personally gratifying to see web dev checklists created by other folks which I can clone and use myself :)

</comment></comment><comment><USER4> Looks great! Very clean design, nice and simple. I just have a couple of minor nitpicks:

1\. It's billed as keyboard friendly, but there's no obvious keyboard shortcut for opening the list of keyboard commands. I would make a ? shortcut for that, put a hint for it in the page text, and open it as a modal overlay that can be dismissed with Escape.

2\. Indent/Outdent. Since there's no other command for [ and ], why require Ctrl? Additionally, you could use , and . (< and >) since they are closer to the home row.

Best of luck with your app, I look forward to seeing how it develops further.

<comment><AUTHOR> Thanks for the feedback!

1\. Good idea! 2\. Good question. I guess I'm just used to doing that elsewhere. Also, I have a kinesis keyboard which places brackets in a more convenient spot, and I guess I forgot about that. I like command and period.

</comment></comment><comment><USER5> Great one. Also, some critique.

Considering this is a keyboard app, you could try and support all of common keyboard commands. Like Home, End. Indentation could be done via tab and shift+tab.

It also would be great, if you could support multiple selections via shift+arrow up/down. Backspace is good, but del key should delete also.

Also, I am not sure about Esc key as an editing shortcut.

<comment><AUTHOR> Thanks for the feedback. It seems like the key bindings are large source of debate, so I might end up making them editable.

I'm reluctant to use tab and shift+tab to indent/outdent because that interferes with browser behavior. On the other hand, some of the other key bindings probably interfere with browser behavior, too.

</comment></comment><comment><USER6> Very nice. Have you checked out The Hit List?

One of the main reasons I chose it was it keyboard friendly controls.

One suggestion - in edit mode, the a and d keys are much more intuitive for indenting a line. Also, shift + j/k is more intuitive for moving lines than ctrl + arrow keys.

I guess my vim-brain is showing through ;)

<comment><AUTHOR> Thanks for the feedback :) j/k actually move the selection up and down. Will have to add shift+j/k for folks like yourself. I've heard the vim comment many times, heh

I haven't checked out the hit list, but I've heard good things about it

</comment></comment><comment><USER7> > <http://openhercules.com/lists/4f6ccefaa9fcc8000100022d>

> Try hitting 'escape' and editing this text. Hit 'escape' to save.

I tried. No matter what I type, it unfocuses the item (gets out of edit mode)

<comment><AUTHOR> That's not good. What browser are you using?

<comment><USER7> ff10

<comment><USER8> I have the same bug. Other ones : shift+enter just goes up not adding a new entry before Pressing enter adds an entry but after that, the CTRL key adds new entries everytime.

</comment></comment></comment></comment><comment><USER9> I've been looking for something like this, and I like it! I might end up putting it on my server to use privately.

Unfortunately, your GitHub link is wrong (404). (edit: fixed)

<comment><AUTHOR> Whoops! Thanks. I forgot to change it from private to public.

</comment></comment><comment><USER10> Awesome job. Thanks so much for making it open source. One small thing though: escape to edit doesn't work in Safari.

<comment><AUTHOR> Thanks, I'll have to fix that

</comment></comment><comment><USER11> Awesome idea! Trying it out right now. :)

</comment><comment><USER12> Good stuff, but how do I undo a "delete" ?

<comment><AUTHOR> Undo is coming along. It's maybe 25% done.

</comment></comment><comment><USER13> Thanks for the contribution. One suggestion: a link back from your Github page to the demo page...I wanted to send the Github link around.

<comment><AUTHOR> Done! Thanks for the suggestion.</comment></comment>


Personal info of 93.4M Mexicans exposed on Amazon - <AUTHOR> http://www.databreaches.net/personal-info-of-93-4-million-mexicans-exposed-on-amazon/ <comment><USER2> Title is pretty link-baity (not the submitter's fault... it's the actual article title).

It makes it sound like Amazon is at fault, but it seems pretty clear it's a third-party who is merely renting cloud space from Amazon.</comment>


Walkmod: Open-source tool to automatically apply code conventions - <AUTHOR> http://walkmod.com <comment><USER2> I find it frustrating that it's not made clear upfront that Walkmod is only for Java. In fact, it's not really made clear anywhere I can see so I'm not 100% sure that's correct but it seems to be the case.

<comment><USER3> From their GitHub README [1] (I'm not affiliated):

"Walkmod can support with any programing language if a set of interfaces are implemented as a third party plugin. The first (and current) supported language is Java."

[1] [https://github.com/rpau/walkmod-core](https://github.com/rpau/walkmod- core)

<comment><AUTHOR> Exactly, Walkmod acts as a framework for language transformations, but we have started with Java

<comment><USER4> It would be nice to write another plugin for something else like Python or C++. For example in the UML diagram I saw something called "JavadocComment" which immediately puts me off writing a plugin because it looks like I would have to follow this even for a non-Java language.

</comment></comment></comment></comment><comment><USER5> I'm a bit skittish about tools like this.

We started using one for C# a while back, and discovered a couple key problems with it. First and foremost, sometimes its edits were not safe to do in the context - either that commented code really was important to keep around for some specific reason (e.g., it serves an explanatory purpose), or sometimes the changes were not truly behavior-neutral and would therefore introduce subtle bugs.

In light of that, I'm moving away from thinking that using tools like this as a sort of spray-on tan for cleaning up code is wise. I've started leaning toward the following approach: First, let sleeping dogs lie. Old messy code is like asbestos; it's most dangerous when you disturb it. Second, if you're going to have to work on the code anyway then that's an appropriate time to clean it up. Even so, proceed with caution: Make sure you understand the code and it's got good test coverage so you can visually and empirically verify that the cleanup isn't doing any damage.

<comment><AUTHOR> It is a respectable point of view, but I think that automatize some boring tasks to correct inside the code is a good idea because let you work on other more interesting tasks.

In fact, most of us use some automatic ways to correct and enrich code with IDEs. Is it also incorrect? In fact, what we are trying to solve are the following situations:

a) In a context where there are a lot of developers and you have worked hard into improve the code style and someone else pushed code that again violates your "implicit" code style. Do you need to correct these bad practices over and over again?

b) There are some boring tasks that punctually appear like "refactoring" when deprecated methods appear or developers need to upgrade one external library version (eg. one critical bug appears).

Anyway, thank you for your opinion :-)

</comment></comment><comment><USER6> I think we're long overdue a tool like this (maybe it already exists?) that will reformat code. I have been so bored beyond tedium about endless debates over tabs or spaces, 2 spaces or 4 spaces, semi-colons or no semi-colons, etc. etc. ad nauseum.

Let users check out a repo formatted using whatever indentation they like, then commit back in a standardised format. Then we can all stop talking about this utter nonsense and do some real work.

<comment><USER7> Thoughtbot offer a tool called HoundCI that does this for JS, ruby, coffeescript and SASS (SCSS). They charge $12/month for private repos and it's free for open source.

It's designed to check your github pull requests. Haven't used it but looks pretty nice. They provide style guides for each language that your free to customize.

[https://houndci.com](https://houndci.com)

</comment></comment><comment><USER8> Weird name. See also:

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

<comment><AUTHOR> Walkmod also allows (for Java) to work with the syntanctic and semantic information. So, for example it can remove unused elements (e.g variables).

</comment></comment><comment><USER9> For C/C++/ObjC developers, `clang-format` is already a must. I have `git clang-format` as a pre-commit hook.

</comment><comment><USER10> I prefer to use a tool that gives you feedback on your code, rather than to correct your code. When you get feedback, you learn and (hopefully), you'll improve your style while you write your code. When it is automatically corrected for you, you don't necessarily learn anything from it.

</comment><comment><USER11> What happens with the private method and the sysout in your example?

<comment><USER12> Not called so delete I guess. What that has to do with style or conventions I don't know.

<comment><AUTHOR> Yes, what I wanted to show in this example is that those elements that are "dead" can be removed (there is a plugin for it)

<comment><USER13> Ok, so the commented out for loop in the example is also considered "dead". Walkmod detects that it is in fact commented out code and only then removes it. Correct?

<comment><AUTHOR> Yes, but in contrast with removing unused private methods, currently there is no walkmod plugin that do this yet. We are working on adding more plugins.

</comment></comment></comment></comment></comment><comment><USER14> I like tools like this, but why not just write good code in the first place and make people fix code they write poorly?

<comment><USER15> If that actually worked it would already be happening... but honestly it isn't.

</comment></comment><comment><USER16> Every problem in computer science can be solved by another level of indirection. Genius! Genius! Genius!

</comment><comment><USER17> Php-cs-fixer is another example. It does some ridiculous changes though, such as change $i++ to ++$i.

</comment><comment><USER18> umm... but eclipse already do this...

<comment><USER19> Yes, but this could be used as a hook after a push on the git, so that code would always follow a certain convention, whatever editor the developper that pushed used.

<comment><AUTHOR> Exactly :-) Moreover, it is useful for open source projects where developers use different editors</comment></comment></comment>


Citizenshub.org: Presidential Campaign Funding Visualized - <AUTHOR> http://www.citizenshub.org <comment><USER2> Game Changer!

</comment><comment><USER3> freakin amazing!!!

</comment><comment><USER4> siiiiiiiiiiiick.

</comment><comment><USER2> Wow this has so much detail about the presidents.... Where was this earlier!?!?!?</comment>


uLisp – Lisp for the Arduino - <AUTHOR> http://www.ulisp.com/ <comment><USER2> This looks really neat! There was a story about Lisp at JPL that got me dreaming about embedded REPLs:

 _> The Remote Agent software, running on a custom port of Harlequin Common Lisp, flew aboard Deep Space 1 (DS1), the first mission of NASA's New Millennium program. Remote Agent controlled DS1 for two days in May of 1999. During that time we were able to debug and fix a race condition that had not shown up during ground testing. (Debugging a program running on a $100M piece of hardware that is 100 million miles away is an interesting experience. Having a read-eval-print loop running on the spacecraft proved invaluable in finding and fixing the problem.)_ [http://www.flownet.com/gat/jpl- lisp.html](http://www.flownet.com/gat/jpl-lisp.html)

So often in embedded development I resort to things that make printf-style debugging look downright virtuous. ("If you reach some complicated runtime state, blink the LED thrice.") Having a REPL would let you poke around without the compile-flash-test cycle and have an actual conversation with the hardware.

<comment><USER3> I have TinyScheme running on a STM32F415.

[https://sc4.us/hsm/](https://sc4.us/hsm/)

<comment><USER2> I love TinyScheme. I love NaCl. This is wonderful!

<comment><USER3> Thanks. I have a few left from a limited production run that I'm selling for $55. Send me an email if you want one. I'm also going to be doing a kickstarter to raise money for a real production run.

</comment></comment></comment></comment><comment><USER4> Though uLisp has tail-call optimization, if the C compiler doesn't, then the garbage collector needs stack in proportion to list length:

      void markobject (object *obj) {
        if (obj == NULL) return;

        object* arg = car(obj);
        if (marked(obj)) return;

        int type = obj->type;
        mark(obj);

        if (type != SYMBOL && type != NUMBER) { // cons
          markobject(arg);
          markobject(cdr(obj));   // <--- TAIL CALL!
        }
      }

It's simple enough to obj = cdr(obj) and wrap a loop around this.

<comment><USER4> By the way, you can't eliminate the need for a stack when traversing the cell graph (unless you give them parent pointers, thereby hiding the stack in the data).

That's why I wrote "in proportion to list length", not "tree structure depth" in general.

Above, we still have recursion when marking the arg = car(obj) value. However, Lisp lists tend to be greatly unbalanced in favor of growing in the cdr direction; that is why it helps to iterate on the cdr.

</comment></comment><comment><USER5> The AVR cpu at the core of the Arduino uses a (modified) Harvard architecture., which separates code from data memory. A key feature of lisp of that code IS data. How does uLisp bridge the contradiction?

<comment><USER6> > A key feature of lisp of that code IS data.

I think this is an oversimplification. "Code is data" means several things:

1\. Both use the same ASCII representation to humans (homoiconity)

2\. Lisp Macros operate using data traversal functions

3\. You can load and eval code on the fly

Really only #3 is invalidated under Arduino constraints. #1 is the source at rest and #2 is compile-time.

<comment><USER7> 3\. is not invalidated under Arduino in a general sense. The split into "code memory" and "data memory" is only relevant to the meaning of "code" and "data" assigned by uC-level assembly. There's nothing stopping your code to reinterpret data as code. Consider: that's how interpreters and VMs are made :).

Moreover, 1-3 together are more than sum of its parts. The idea that "in Lisp code = data" doesn't mean that elsewhere it doesn't; code = data is a fundamental truth about the nature of information (that many other languages and their ecosystems did quite a lot of work to obscure). Lisp only makes exploiting that truth much easier than other languages.

Also, a nitpick. #2 is not "compile-time". Macros can and are expanded at what you'd call "run-time" as well. Generally, Lisp systems don't have "compile- time" and "run-time" you know from other languages; the split is usually read- / load- / compile- / run-time, with some other "times" sprinkled in (e.g. "macroexpansion-time"), and this split is not necessarily sequential - you can read/load/compile stuff in what would usually be called "runtime", and read/load/compile phases have full access to features of the running Lisp image, including changes you made previously - so, for example, code you're just compiling can, during its read-time, refer to variables you previously created at run-time and run computations on them.

</comment></comment></comment><comment><USER8> > It's also an ideal language for expressing complex ideas, such as [...] > finding the shortest route on a map

So, I googled "Dijkstra's Algorithm in Lisp" and got this: [http://richardsherriff.com/?p=233](http://richardsherriff.com/?p=233)

Now, I'm no lisp expert, so I can't judge whether the author of this code actually knows what they're doing, but I know for sure that in an imperative language the implementation of the algorithm is much more concise and understandable.

I have concluded from my observations that claims of Lisp being "easier", "ideal for learning fundamental programming concepts" and "more expressive" are exaggerated.

<comment><USER9> >in an imperative language

Lisp is capable of imperative programming.

<comment><USER10> I would say multi-paradigm instead.

</comment></comment></comment><comment><USER11> _uLisp includes a mark and sweep garbage collector. Garbage collection takes under 1 msec on an Arduino Uno or under 3 msec on an Arduino Mega 2560._

I wonder how predictable and controllable that is. Adding GC to what is likely to be a real-time device seems like a potential showstopper. But if the numbers can be a bit more firm, or if the application can receive alerts on pause / resume, that might not be such a big deal.

<comment><USER12> As I said in another thread recently, garbage collectors don't have to be of the stop-the-world, non-deterministic kind. It's perfectly possible to have real-time garbage collection [1], and the language I commonly work with supports soft real-time use with the default GC [2]. I'm no expert on garbage collection techniques, but what I have picked up is that most of the challenge lies in timing of the collections (when to run the GC) and how to deal with things like cycles.

[1] [http://michaelrbernste.in/2013/06/03/real-time-garbage- colle...](http://michaelrbernste.in/2013/06/03/real-time-garbage-collection- is-real.html)

[2] [http://nim-lang.org/docs/gc.html](http://nim-lang.org/docs/gc.html)

<comment><USER11> Yes, but the language chosen implied to me that it's using a stop-the-world approach.

I've confirmed this by looking at the (surprisingly readable and small) code: [http://www.ulisp.com/list?1BWZ](http://www.ulisp.com/list?1BWZ)

Also, it looks like the algorithm is mostly deterministic, so that's good from a real-time standpoint. And it only runs if memory is about to be exhausted, so if the application ensured that it stayed within the Arduino's memory budget, it's essentially a no-op.

</comment></comment></comment><comment><USER13> Lisp for Arduino sounds great. The C programming barrier has kept me from tinkering with Arduino. Does this give you access to arduino shields/expansion boards (wifi/gps/screens), or will that be dependent on device drivers?

<comment><USER14> Check out esp8266/nodemcu. They can be programmed in lua or micropython (or arduino ide). Not as much of an ecosystem/community, but growing. Includes wifi on-chip, and dirt cheap.

<comment><USER7> There's also a Lisp for ESP8266 under development :). See:

[https://github.com/yesco/esp-lisp](https://github.com/yesco/esp-lisp)

</comment></comment></comment><comment><USER15> Nice! This reminds me of my tiny Lisp Machine project: [https://aaron- fischer.net/tdn](https://aaron-fischer.net/tdn) [https://translate.google.com/translate?hl=en&sl=de&tl=en&u=h...](https://translate.google.com/translate?hl=en&sl=de&tl=en&u=https%3A%2F%2Faaron- fischer.net%2Ftdn)

</comment><comment><USER16> This reminds me of muLISP [0].

[0]: [https://de.wikipedia.org/wiki/MuLISP](https://de.wikipedia.org/wiki/MuLISP)

<comment><USER17> muLISP is much larger and needs a much more capable system. 16bit muLISP officially requires 512 kbyte RAM.

ulisp runs with 2 kbyte RAM.

</comment></comment><comment><USER18> Clojure is my favorite language, and I'd probably like scheme just as well if it had the easy to use (yet advanced) Data structures of clojure. I just can't seem to get my brain to mesh with Common Lisp yet, but I periodically dip my toes to test the water.

That said, I just don't get statements like:

"It's also an ideal language for expressing complex ideas, such as teaching a robot to solve mazes or finding the shortest route on a map." More ideal than C, sure. But I don't see the huge advantage over other high level languages.</comment>


Photos of the 11ft-diameter Hyperloop test track under construction in Nevada - <AUTHOR> https://arstechnica.com/cars/2017/03/hyperloop-one-shows-photos-of-its-test-track-being-built-in-nevada/ <comment><AUTHOR> At 500m long, this track is a bad joke. It's _much_ too short to demonstrate anything even remotely interesting. Yes, they'll be able to pump it down to a near vacuum, but you need a track orders of magnitude longer to accelerate a capsule fast enough to fly (and to decelerate it again, assuming you want to do more than one test). Real thermal expansion effects, a.k.a. the elephant in the hyperloop living room, also won't show up on such a short track.</comment>


Full support for rclone is now in production at rsync.net - <AUTHOR> https://twitter.com/njcw/status/1144534055817502721 <comment><USER2> I worked for Nick until a few weeks ago; fantastic to see rclone going from strength to strength!</comment>


Review our startup - <AUTHOR> http://infostripe.com/ We posted about infostripe to the overnight/overseas HN crowd last week. After implementing many of the suggestions and comments I thought I would resubmit it to the day crowd to see what you thought of it in it's current form.
Also check out actual examples:
http://infostripe.com/stylemepretty http://infostripe.com/gogeeks http://infostripe.com/twit http://infostripe.com/swordandlaser http://infostripe.com/appslappy
and many more at the site..
Thanks in advance for your time, Harold http://infostripe.com/harold <comment><AUTHOR> We posted about infostripe to the overnight/overseas HN crowd last week. After implementing many of the suggestions and comments I thought I would resubmit it to the day crowd to see what you thought of it in it's current form.

Also check out actual examples:

<http://infostripe.com/stylemepretty> <http://infostripe.com/gogeeks> <http://infostripe.com/twit> <http://infostripe.com/swordandlaser> <http://infostripe.com/appslappy> and many more at the site..

Thanks in advance for your time, Harold <http://infostripe.com/harold></comment>