Not Working for Us (Preparing to Discuss Jacob Applebaum at CCC) - <AUTHOR> https://medium.com/@eqe/not-working-for-us-bff58e96c2ea <comment><USER2> Good article by Isaacson. I would add I think it would be good if the CCCers got some outside consultation, both from people in the sex abuse field, and at least one person who is an expert on sociopaths, since that is what it seems JA is.

I think it would also helpful would be helpful to learn communication skills like active listening and the ones in Marshall Rosenberg's book Nonviolent Communication.

<comment><USER3> But if you read the long Zeit article[1] and esp. the latest taz article[2] it becomes clear that the other party consists also of psychopaths whose actions were even more dangerous.

[1] [http://www.zeit.de/kultur/2016-08/jacob-appelbaum-rape- sexua...](http://www.zeit.de/kultur/2016-08/jacob-appelbaum-rape-sexual-abuse- allegations/komplettansicht)

[2] [https://www.taz.de/!5361578/](https://www.taz.de/!5361578/)

<comment><USER2> The link just reinforces what I am saying. You have a community with some bad social norms, and many people in it are now realizing it and trying to change the whole group.

<comment><USER2> Let me add that there are two competing stories here. One is that JA is a sociopath, and got away with it because of the norms of the group, but now people are changing and rejecting such behavior.

The other is that the females in question all thought for years that JA's behavior was fine, or at least not very bad, and then all of them, for some unaccountable reason, went crazy at the same time and irrationally decided to persecute him and him alone.

I find the first story a whole lot more plausible than the second.

</comment></comment></comment></comment><comment><USER4> Everybody deserves justice. I don't think Medium posts and a lynch mob are the way this is achieved. Get the police involved when a crime is committed. Enough with the hearsay character assassinations. This time, the author even admits that he's conflicted and that his memory isn't completely reliable. So as somebody from the "out-group" it's hard to take it as seriously as it probably should be taken :(

Edit: Instead of spawning a discussion, I should have guessed this would be downvoted immediately for not representing SJW values. Sorry to disappoint.

<comment><USER5> > SJW values

What does this mean?

<comment><USER6> SJW is most commonly used as a pejorative term these days, and it's anyone's guess what it's supposed to represent other than "people who aren't agreeing with me."

<comment><USER4> I didn't just mean "people who aren't agreeing with me", but specifically people who disagree but who try and use some kind of censorship or shaming to silence disagreements, instead of engaging in them. AFAIK, this is a common tactic of the mentioned group. (At the time of the edit, I had no replies but like -5. Not that it really matters.)

Disagreement is constructive at some level, and so it's a good thing in my opinion.

<comment><USER6> What "mentioned group"? - I don't think many/any people think of themselves as SJWs now that it's pejorative and widely applied to people who never thought of themselves that way.

<comment><USER7> It's not so much one group as an ideology spread though media and academia, but some did try to take on the label sincerely in an attempt to reclaim its reputation (Guardian columnist Laurie Penny comes to mind). Regardless, columnists like Jessica Valenti, Amanda Marcotte, industry professionals (see LambdaConf) and cling-ons (Shanley Kane, Adria Richards), activist students (like Emma Sulkowicz) and professors (like AW Peet) have sought their pound of blood from Professors (Jordan Peterson), scientists (Tim Hunt, Matt Taylor) and professionals (Brendan Eich). Accusations of fascism get thrown around, censorship is demanded, careers and families are targeted. Usually under the guise of morality and standing up to bullies, despite the timeline of events and what equal application of policy would say.

They are excellent as seeing themselves on the right side of history, and they were the ones who pioneered the kind of mobbing and shaming techniques online that they consider to be harassment and violence when the shoe is on the other foot.</comment></comment></comment></comment></comment></comment>


Ask HN: What makes a great intern? - <AUTHOR>

I've interned twice before and really tried to learn as much as I could. I am about to do so again this summer. I would love to get some public opinion on what makes the best interns, and how to maximize the opportunities. <comment><USER2> Having the ability to execute without too much handholding on the projects they've been given, based on their skills set.</comment>


Line length in programming - <AUTHOR> http://ck.kennt-wayne.de/2014/feb/line-length-in-programming <comment><USER2> Here is what I've said about 80 char in the past.

"If the argument for expanding to 100 or more is that screen is getting wider, then the benefit of wide screen is the ability to fit multiple terminals in one window. For normal workflow, I'd split my windows into two or terminals, depending on what I am doing, so I don't see any benefit in increasing the limit."

<comment><USER3> Touche. Multiple monitors and more screen real estate has been proven to increase productivity. It's an easy win.

If the lines come out too long too often, it may be a symptom of other problems.

      if ((browser.OS == 'win') && (browser.userAgent == 'IE')) {

is often better written as:

      isIE = (browser.userAgent == 'IE');
      isWindows = (browser.OS == 'win');
      if (isIE && isWindows) {

It's self-documenting and reads like natural english. It also has the good side-effect of making lines shorter, more terse.

<comment><USER4> Its more code, more variables. I sometimes do this with complex conditions, but for your example I find it counterproductive.

<comment><USER2> Well if this is deep deep down in a nested loop, then either you increase char or you wrap that code into multiple statements. It would be counterproductive if this is first or second level.

However, I think I missed one important point. If you are writing for Linux kernel, then 80 chars is definitely not enough since 8 spaces = 1 tab in kernel code. That is, if you have a deep branching, then after 2-3 levels 80 chars wouldn't be enough. But increasing to 100 is only going to help for an extra level.

So the important point missing is the char limit is often project coding style dependent.

</comment></comment></comment></comment><comment><USER5> I'm surprised and, to some degree, annoyed at the superficiality of some of the arguments in this debate. Like this one:

> Readability - You don't have to scroll over horizontally when you want to > see the end of some lines.

It's not having to scroll horizontally that bothers me with long lines. My monitor is wide enough that it can probably hold 250 characters with ease. _It 's having to read long lines_. Something is very bloody, terribly wrong in your code if you consistently find you need to write 150-character lines.

Besides, yes, monitors have gotten that wide that it's not an issue. Is there any serious reason to assume that code is the only thing I want displayed on my monitor at a given time? In a single window? That's as big as the monitor? The only moment when people had a good reason to be enthusiastic about that was the late 70s, when serial terminals appeared and teletypes began going the way of the dodo.

Also, who says the IDE is the only place where I want my code to be output? Maybe I want to grep on it or whatever. On an 80x25 terminal window because the least useful thing on earth is a huge monitor where I constantly alt-tab between a full-screen editor and a full-screen terminal.

<comment><USER6> "Something is very bloody, terribly wrong in your code if you consistently find you need to write 150-character lines."

Not necessarily.

Most lines are below 80 characters, but there are good reasons (for readability!) to use longer lines from time to time: vertical space is more precious than horizontal on modern screens, and the more content I can fit into each vertical page, the faster I'll understand what I'm looking at.

The main reason I like the ability to occasionally have a 150 or 180 character line is akin to code folding, which some editors have as a feature. The feature allows you to hide a function or class by collapsing it into one line, because you want an overview of the code around it or calling it, and for the moment the implementation details aren't relevant. Now, I don't actually use the code folding feature in practice, mainly because I find that the times I would want to use it are times when I nearly _always_ want to fold the code, and in a case like that, it's nice to be able to "pre-fold" it by putting it all on one line.

For example, if not using an ORM, I might want to use SQL to grab some results from a db (in a model, say), and I almost never want to think about my SQL and my surrounding code in the same context. Now, you might say, "Just put that SQL in its own method with a reasonably short name, and call it where you would otherwise have a long SQL string, and in the function that returns it, you can break each line at 70-80 characters," but that seems like a "solution" which improves nothing in my typical reading of the code, and requires me to jump around to find the SQL in the rare case I need to pay attention to it. It breaks up something which is naturally local and specific to this place in the code.

Another example which happens somewhat more frequently for me is when I want to use a literal object in JS. If I want to keep the definition local -- because, perhaps, nothing outside of this function ever needs it -- my choices are to put each key/value pair on its own line (easy to find a given key, but consumes lots of vertical space), to put multiple key/value pairs on each line to fit ~80 characters (both moderately difficult to find a given key, and still eats moderate amounts of vertical space), or to "fold" it all to one line (consumes the minimum vertical space, with the trade-off that it's difficult to find a given key). The most common case of this is where I have the choice between using 4-6 lines, or one line, and it's an easy choice for me to pick one line, though I've never encountered a coding standard that agreed with me.

<comment><USER5> > Now, I don't actually use the code folding feature in practice, mainly > because I find that the times I would want to use it are times when I nearly > always want to fold the code, and in a case like that, it's nice to be able > to "pre-fold" it by putting it all on one line.

IMO that's just compensating for the inadequacy of tools by making code harder to follow. Usefulness of code folding (and what it says about the code it's folding) aside, this is a really poor solution. If you just need that done temporarily, why not _temporarily_ replace all the returns in the region you select, and then add them back when you're done? Any editor with search-and- replace can do that.

> For example, if not using an ORM, I might want to use SQL to grab some > results from a db (in a model, say), and I almost never want to think about > my SQL and my surrounding code in the same context. Now, you might say, > "Just put that SQL in its own method with a reasonably short name, and call > it where you would otherwise have a long SQL string, and in the function > that returns it, you can break each line at 70-80 characters,"

No, what I might say is "just stop thinking about the SQL query and the surrounding code in the same context".

Alternatively, put the SQL query in a separate function that conveys some meaning related to its purpose, so that people who read your code later don't have to decipher a 300-character query line in order to understand what that code is doing. They may not even be debugging that part of it, maybe something several layers of abstraction above borks and they end up in that part of the code debugging it.

> (easy to find a given key, but consumes lots of vertical space)

which can be easily averted with code folding? Or by simply scrolling _down_ to the body of your code. Skipping entire lines is very easy, it's following a hundred-character snake that sucks.

<comment><USER4> > IMO that's just compensating for the inadequacy of tools by making code > harder to follow.

Thats pretty much how I would describe the 80 character rule for old terminals. I find the occasional long lines can make things more readable. It certainly helps in locating the bit of code you are looking for when you can recognise it's shape.

</comment></comment></comment></comment><comment><USER7> 80 is too few. The old reason for it (what if you get stuck doing an emergency bugfix using vi on an 80 char display?!?) no longer holds.

It's not massively too few, and most lines never get close to the limit anyway, but the odd line of 100-120 thrown in really isn't a problem on a modern display.

<comment><USER8> That is a straw man. No one actually thinks 80 character displays are the reason to use 80 characters.

I think 80-100 is fine. More than 100 and you probably need to refactor the line some, because you probably have too much logic on a single line (or you need to choose names that aren't hugely long).

<comment><USER7> >> No one actually thinks 80 character displays are the reason to use 80 characters.

Err, yeah they do, I have been given exactly that reason on a few occasions, generally by older engineers who had experience with old-school machines that had precisely those screen dimensions. I don't disagree with your main point, but it's really not a straw man.

<comment><USER8> Well, for most people it's a straw man. I've worked with some greybeards, and they are smart enough to know that they can resize the terminal on their modern laptop :)

</comment></comment></comment></comment><comment><USER9> 80 chars is a useful rule of thumb, so long as it's tempered by practicality. I've worked on projects where the limit was taken far too literally, which results in code that's harder to read.

This is especially true if you're using something verbose (Java, Objective-C) or whitespace-sensitive (Python).

<comment><USER10> I've never had much issue keeping Python code under 80 columns. Going beyond usually means you've used way too many nested clause and should either rewrite the whole thing or extract part of its to subroutines.

<comment><USER11> Really?

        class Engineer(Person):
            __tablename__ = 'engineers'
            __mapper_args__ = {'polymorphic_identity': 'engineer'}
            engineer_id = Column('id', Integer, ForeignKey('people.id'), primary_key=True)
            primary_language = Column(String(50))

        12345678901234567890123456789012345678901234567890123456789012345678901234567890
        ^^ Line length marker

Woops. 2 characters over. Do we really need a line break there?

Guess perhaps I should rename my columns with more obscure names like engnr_id instead.

Seriously; you see this in python all the time; people not wanting to break the line because its only a character or two off, and then stupidly renaming a variable to some obscure abbreviation instead.

We won't go into the 2-character indents argument, or the push for the 100 character limit that the BDFL veto'd for the PEP8 revision; but... safe to say, I think a fair number of people hit this as an issue.

I don't think 'you can just refactor that to be shorter' is really a solution in all circumstances.

<comment><USER10> > Really?

Yes, really.

> Woops. 2 characters over. Do we really need a line break there?

 _You_ do what you want.

> I don't think 'you can just refactor that to be shorter' is really a > solution in all circumstances.

You don't think the solution I didn't advocate as a cure-all in the first place is a cure-all? Am I supposed to be surprised at this finding?

<comment><USER11> Well, you specifically said that if someone had gone beyond the 80 character limit, its probably because they needed to rewrite / reword / subfunctionize something. If you've never had a problem with it, dare I ask, how are you qualified to make that call, given you've never had to face that challenge?

Anyway, that example is _straight_ from the sqlalchemy examples, which is arguably (other than the extremely wordy Zope) most commonly used python orm around.

Wordy database interaction is really common point this sort of thing, and it's hard to refactor/rewrite your way out of it; that's the only real point I'm making.

I personally think strict adherence to line length limits reduces code quality; you've got to use common sense for it.

<comment><USER10> > Well, you specifically said that if someone had gone beyond the 80 character > limit, its probably because

Yes. The operative word here is "probably". Meaning not always.

> If you've never had a problem with it, dare I ask, how are you qualified to > make that call, given you've never had to face that challenge?

And here we can see an other important word of the original comment: "much" as in "much of an issue". As in, I've faced it, I've never found it very difficult a challenge to go against. Now of course if you pile on additional constraints for personal reasons…

> I personally think strict adherence to line length limits reduces code > quality; you've got to use common sense for it.

I have no issue with that, but common sense being a super-power[0][1] and thus generally uncommon. Thus in my experience erring on the side of respecting line length limits and having to defend an exception to the rule produces significantly better results, and avoids 200+ characters lines because "well it fits in my widescreen 24" display so I don't see what the problem is"

[0] [http://walls4joy.com/walls/people/deadpool-wade-wilson- commo...](http://walls4joy.com/walls/people/deadpool-wade-wilson-common- sense-9639-1280x760.jpg)

[1] and was likely named by people who had none

</comment></comment></comment></comment></comment></comment><comment><USER8> The argument about no one editing in a 80 character terminal anymore is a straw man. That's not the real reason 80 characters is good. The article even says why - we're just not good at reading long lines for whatever reason.

There's two modern reasons for smaller liner lengths (80-100) besides cognitive capacity:

Viewing/editing two files side by side on the same screen.

Side by side diffs.

Now, that's not to say that you should contort the code to make lines short. If it makes the code significantly more difficult to read, don't do it... but still try to keep it reasonable. This is also a good reason to keep your variable names relatively short - so you don't hit this situation all the time.

<comment><USER12> What doesn't help is silly idioms in some environments where most of the lines written START at 2 or 3 indents deep because they're inside a method inside a class inside a namespace that are all indented.

===

If anyone's interested, I wrote a simple command to scan files for configurable line length violations and the presence of a file-terminating line ending.

[https://github.com/frou/pagecop](https://github.com/frou/pagecop)

(yes, I'm aware it could probably be duplicated with some sed/awk wrangling!)

</comment></comment><comment><USER13> I found 72 character wide lines to be optimal (writing CL). Note that I also apply the rule of choosing long descriptive symbol names. E.g. MAKE-RESOURCE- RESPONDER etc...

When I have trouble keeping the lines short I consider: 1) Is there a better way to write this? 2) Is this function too big?

There are cases where lines have to be longer, but not in Lisp. Inability to write short lines is a symptom of bad syntax designs like e.g. C et al.

EDIT: I have been writing JS the last months and keeping lines short is especially hard in JS, because of its abomination of a syntax. UNIX style backslash escaped line breaks don't help either.

</comment><comment><USER14> I'm glad we talk about this. Once we have solved this question we can move on to really important stuff, like tabs vs spaces.

<comment><USER15> Code is read far more than it is written. Therefore code legibility is important. Line length affects code legibility. Therefore line length is important.

<comment><USER16> Code can be read in more ways than one. More often than not you aren't interested in all the minor details in a single statement, but you're interested in the larger structure of some code unit (say, a function), and having dozens of wraps in a function hinders the ability to scan through the code vertically. Therefore, line length is unimportant.

</comment></comment></comment><comment><USER17> In my opinion the 80 character limit is mostly for better presentability. If the code appears in a blog post or a book, it is better to read and typeset if it is less than 80 characters. Though there are several articles[1] which explain other reasons for this legacy limitation.

I would be happy to read code more than 80 characters, if it doesn't have to be artificially cut into multiple lines (the screenshot in the post is a pretty good example). In fact, I find 80 characters too less and often set Emacs to use 100 characters as the limit.

[1]: [http://stackoverflow.com/questions/903754/do-you-still- limit...](http://stackoverflow.com/questions/903754/do-you-still-limit-line- length-in-code)

<comment><USER15> IMO, given that most blog templates include copious margins, many don't allow readers to resize the text, and some don't even allow readers to scroll horizontally, 80 characters is far too long for a line of code in a blog post.

<comment><USER17> Sadly true. In this age of Responsive design, figuring out an optimal line limit for code samples is a tricky task indeed.

</comment></comment></comment><comment><USER18> And obviously practicality can get in the way. 80 character lines will be a nightmare in a java-project with verbose naming schemes (FactoryFactoryObjectThingymybobProducer thingy = new FactoryFactoryObjectThingymybobProducer(..);).

<comment><USER19> Or python if you're already in a function in a function in a class (so 68 chars left). If you also standardised on importing modules, not classes things can get silly. My favourite counter-example to the 80 char limit was a line in openstack which was:

        return some_loaded_module.fairly_descriptive_but_necessarily_long_name(not_very_long_argument)

The way applied to fit it without forced line breaking?

        fdbnln = some_loaded_module.fairly_descriptive_but_necessarily_long_name
        return fdbnln(not_very_long_argument)

(yes, actually using first letters of words) Because yeah... that makes things simpler than just crossing the limit in that place.

<comment><USER20> In perl I'd just write -

        return $some_loaded_thing->fairly_descriptive_but_necessarily_long_name(
          $not_very_long_argument
        );

Surely python has something approximating an equivalent?

<comment><USER4> Come on, you can get rid of the return statement if it is the last line in a subroutine.

</comment></comment></comment></comment><comment><USER21> I disagree with the author that the programmer can't interpret longer than 80 lines. we don't read programs like a 6 year old sounds out words. We read more like a 10 year old (and above) by sighting tokens.

Simply put: the world is different than it was in the 70s and 80s and 90s (all decades I have programmed in).

1) screen width is generally wider 2) screen widths are generally exandable 3) identifiers are generally longer

In today's world I see little reason to hold to the 80 character limit causing line breaks in what would other-wise be odd places.

That all being said, we still have yet to realize an editor that displays source code in a programmers preferred spacing while saving the program in the repository's preferred spacing. THAT is the real issue, here -- that editors are not helping with this issue, wrapping and indenting code as the screen width allows.

Your primary concern, with line-length, should be readability -- if your group decides 72 characters is the limit, well, so be-it, but I would press anyone who believes that is acceptable for JAVA.

And I no longer see a reason why one line length limit should hold for all source files. Why not let the source code decide the best line length -- we no longer have fixed sized screens, these are windows that expand with click and drag.

<comment><USER4> That's a far more sensible response than the OCD like attitudes of some commenter's here.

</comment></comment><comment><USER22> I think this post was upvoted because the tip is easily among the top 10 advice that can be given to aspiring programmers. Forcing yourself to write short lines forces you to decompose code which in turn lets you see the patterns you are working with which you then can refactor. Long lines, deeply nested code blocks and code duplication. Those traits tend to cluster together and are a sign of inexperience imnsho.

</comment><comment><USER23> Most languages allow you to be quite concise. The best argument for 80 characters might be that it keeps you that way.

A similar thing would happen if technical writing and scientific reports kept the average sentence to 12-15 word sentence averages and tried not to go over 25. Reading comprehension goes up:

[http://www.onlinegrammar.com.au/how-many-words-are-too- many-...](http://www.onlinegrammar.com.au/how-many-words-are-too-many-in-a- sentence/)

It's very similar. Breaking one long sentence into two is the same as breaking nested if and loop statement into several lines, the first just assigning a boolean based on the test. Then the if test just tests the boolean. Reading comprehension goes WAY up.

Look at the top response on this question: [https://news.ycombinator.com/item?id=7289087](https://news.ycombinator.com/item?id=7289087) (the one with several short lines.)

100% comprehension.

<comment><USER4> I just had a quick look at that grammar article. I imagine when people are describing something technical / scientific / difficult to comprehend, it will take more words.

<comment><USER23> And what is more technical than code?

It's literally logic that will be followed extremely, anally literally. No scientific language gets close to being that literal - normally, you are always going to keep the author's view/point in mind as you read. If you were to accidentally remove a random "not" from scientific writing (as happens), we can usually realize what the author meant. (With rare exceptions, if we are particularly unfamiliar with the topic.)

With code, on the other hand, code doesn't have a "point of view". It will just do whatever you wrote, completely literally. The shorter the expressions, lines, etc, the better.

<comment><USER4> Code rarely has the ambiguities that spoken languages do.

</comment></comment></comment></comment><comment><USER24> I put two guidelines in my editor. One at 80 chars and one at 100. I treat 80 like a goal and 100 as a hard limit. If I go over 100, I'll put the break around 80.

Not only do I find the code easier to look at, but I find I write better code and I'm less likely to violate the Liskov substitution principle.

<comment><USER8> Wow, I do the exact same thing. Nice to see someone else doing the same.

</comment></comment><comment><USER25> Under what mechanism is it decided that this particular post becomes visible on Hacker News? Does it simply mean that one user with high karma liked the post? The 80 character rule is in programming over and over again and I didn't find anything new in the article...

<comment><USER15> The information on how to configure emacs to highlight lines that are too long was new to me.

I presume it is on the front page because it has got several up votes in its first half hour.

</comment></comment><comment><USER26> Never ending stories \- tab vs spaces \- line length \- republican vs democrats \- favorite colors

<comment><USER25> exactly, however, when you point this out, the "cool" community votes you down quickly :)

<comment><USER4> pedantic OCD community

</comment></comment></comment><comment><USER12> Before we start I'd like to point out that I have a few cans of mauve paint going spare.

</comment><comment><USER27> In Vim:

        set textwidth=80 colorcolumn=+1

Then you get a coloured column 81 (probably red).

For some things I use colorcolumn=+1,+21 for highlighting 81 and 101, for situations where I allow myself 100 in an extremity.

</comment><comment><USER28> To highlight characters after the 80th column in Vim:

        match Error /\%81v.\+/</comment>


iOS 10 update bricking iPhones and iPads for some users - <AUTHOR> https://9to5mac.com/2016/09/13/ios-10-update-bricking-iphones-and-ipads-for-some-users-requires-itunes-to-restore/ <comment><USER2> > To restore, affected users must then plug their devices into iTunes on Mac > or PC to restore the device.

Bricking ain't what it used to be. Am I wrong in thinking that "bricking" means to render a piece of hardware permanently unusable for purposes other than paperweight?

<comment><USER3> No, you're right. But writing an article saying "iOS 10 update bricking iPhones" gets a lot more clicks than "iOS 10 update fails for some people", so pretty much all of the news sites have started calling it "bricking" if it requires restoring with iTunes.

</comment></comment><comment><AUTHOR> This personally happened to me on my iPhone 6S. Assuming you do not have a backup of your phone you're basically screwed when you get it restored with DFU mode.

<comment><USER3> It's so easy to back up nowadays, if you don't have a backup of your iPhone when you install a major OS update, what are you even thinking?

<comment><USER4> Hello, I would like to introduce you to the average user who doesn't understand backups.

<comment><USER3> You don't need to understand backups, you just need to follow the prompts to set up iCloud and turn on backups, at which point it all happens seamlessly without you worrying about it.

<comment><USER5> All I ever saw was "This iPhone cannot be backed up because there is not enough storage".

<comment><USER6> and that's the thing. i just recently had to deal with an iphone owner who had backups enabled. but his 6 gb of photos just don't fit on the standard 5gb free icloud storage. ppl just don't want to pay for backup space. now imagine ppl with 256gb phones. they are supposed to pump even more ridiculous amounts of money into tim's ass just for storage.

don't get me wrong. in general i think apple's prices are justified. but icloud storage with ppl having backup enabled by default ist just one giant rip-off.

<comment><USER5> I think it is less about paying than understanding what it is actually doing with your files. I know a few reasonably intelligent people who could not tell you what their paid iCloud is

Apple did create a nice little automatic revenue generator. It forces you to pay apple, disabled backups (with scary delete messages), or trying to navigate the backup interface to cull things to stay withing the 5 gb limit.

</comment></comment></comment></comment></comment></comment></comment><comment><USER7> seeing enough reliable reports of this to believe it's at least a somewhat widespread issue:

[https://twitter.com/Stammy/status/775748665226895360](https://twitter.com/Stammy/status/775748665226895360) [https://twitter.com/dhh/status/775751273299619841](https://twitter.com/dhh/status/775751273299619841)</comment>


The California State of Mind - VC vs Customer Investment - <AUTHOR> http://techdrawl.com/the-california-state-of-mind/ <comment><USER2> wtf? it's _still_ on the front page - <http://news.ycombinator.com/item?id=664621>

<comment><AUTHOR> This one had a trailig slash in the url and I posted before I checked the front page.

<comment><USER3> Next time please check the front page. But we can also turn to all of us that up-vote before making sure what we vote up is new, authentic, and material of quality.</comment></comment></comment>


The Rise of Rust in Dev/Ops - <AUTHOR> https://mesosphere.com/blog/rust-devops/ <comment><USER2> I'm a Sysadmin and I have started learning Rust this week. I'm not interested in writing network servers or distributed databases or such. I'm hoping to kind of dumb things down and use Rust in place of Python for sysadmin stuff.

I'm very curious into fast Regex, log parsing (string parsing in general) and building easy-to-use command line utilities that are safe(from leaks), crazy fast, and not occupy high level of memory.

Anybody already using Rust in this capacity? have any experiences to share?

<comment><USER3> > I'm very curious into fast Regex, log parsing (string parsing in general) > and building easy-to-use command line utilities that are safe(from leaks), > crazy fast, and not occupy high level of memory.

Ever tried to use Perl?

<comment><USER2> I have not. I admit to not having tried something first hand and falling into the trap of someone else's opinion.

I have heard : Perl is hard to understand after you write the code. Good luck making change to something you wrote last year.

This was not a pleasant thing to hear while choosing a language to learn. I'll give it a shot as well this weekend to see for myself if it matches that opinion..

<comment><USER3> > I have heard : Perl is hard to understand after you write the code.

So is about any other language, it all depends on who was writing the code. This particular opinion stems from all the non-programmers writing hacky Perl scripts in '90s. The fact that regexps are language primitive doesn't help, because they were often abused in those scripts and it takes time and/or proficiency to decipher and analyze them.</comment></comment></comment></comment>


Top 10 Bootstrapping Tips - <AUTHOR> http://www.readwriteweb.com/archives/top_10_bootstrapping_tips.php <comment><USER2> Isn't it interesting how you can take the exact same technology product and take it to market 2 very different ways? The is the opposite of the currently popular "Get Eyeballs & Monetize Later" approach. If you can get people to pay for your web app, there's a lot to be said for bootstrapping. You keep all your equity. Hitting singles and doubles are probably more likely. Homeruns, less likely. Good tips for a viable approach. (My default if funding never materializes)</comment>


Startup Quote: Seth Godin, founder, Squidoo - <AUTHOR> http://startupquote.com/post/5438355974

<comment><AUTHOR> Play a new game, not the older game but faster.

\- Seth Godin

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


Art Project, powered by Google - <AUTHOR> http://www.googleartproject.com/ <comment><USER2> As a painter, I am tremendously excited to be able to take a closer look at some of these paintings than I could in their galleries, and to have so many works from so many collections in one place. I'm itching with anticipation to look at each individual brush-stroke. I'm actually giggling with glee.

I love living in the future.

<comment><USER3> Just what I was thinking! The high-resolution view is great - the texture of the brush strokes really show. Gives a better idea of some of the technique involved.

Hackers, check out the behind-the-scenes video at <http://www.googleartproject.com/c/faq> which shows the variety of tech used, including both bike-pulled and pushcart-style cameras that draw upon the street view technology.

</comment></comment><comment><USER4> I wonder what the copyright situation is with these photos of public domain works. I seem to recall that Wikipedia extracted the images from a similar system used by the National Portrait Gallery in the UK and a legal spat ensued.

Crucially, UK copyright law gives you rights in some stuff just because you put effort into it ("sweat of the brow") while US law has a precedent requiring creativity, so a photo of a statue is copyrighted to the photographer, but photograhps of flat objects don't.

<comment><USER5> Here's Wikipedia's summary of that dispute: [http://en.wikipedia.org/wiki/National_Portrait_Gallery_and_W...](http://en.wikipedia.org/wiki/National_Portrait_Gallery_and_Wikimedia_Foundation_copyright_dispute)

It looks like the NPG asserts that use of the images is illegal, but isn't willing to sue the Wikimedia Foundation over it, so they're at something of a stalemate with Wikimedia de-facto winning (but with no guarantees for other parties who aren't Wikimedia). Wikimedia's official position seems to be more or less an ultimatum of, "these are public domain, sue us if you think we're wrong": [http://commons.wikimedia.org/wiki/Commons:When_to_use_the_PD...](http://commons.wikimedia.org/wiki/Commons:When_to_use_the_PD- Art_tag)

</comment></comment><comment><USER6> If you look at the "behind the scenes" video, you'll see they are also trying to photograph sculptures by panning around them in 3D. You can't see any of them on the site though.

Do you think they will be able to make navigatable models of sculptures too? This would be exciting.

</comment><comment><USER7> Naturally, the first thing I did was search for The Art Institute of Chicago.

Defeated, I found "Evening, Honfleur" in the Museum of Modern Art. It wasn't _quite_ the same, but my inner dork was satisfied. ;)

</comment><comment><USER8> Oh, I thought interface was pretty difficult to navigate until I learned that I could use typical 'game controls' like arrow keys or a,s,w,d to navigate!

<comment><USER9> Just like in Streetview, indeed this is streetview with added detail images but for art galleries.

Quite awesome.

</comment></comment><comment><USER10> This is a tremendous help for art history students who can not easily access some of the most praised works of art in the world. Seeing a work of art in a museum creates a transformational experience that can not be replicated on the page of a text-book.

</comment><comment><USER11> Thank you for posting this. I was busy this weekend sketching out the beginnings of something similar and cataloging which museums where nearby which I could entice with "my" idea. Time to change direction.

</comment><comment><USER12> I don't understand..(?) There is only one piece of art on this website: A black text on white background that says "Error: Server Error"

Is that the "Art of the App Engine"?

<comment><USER13> It's a contemporary, deconstructionist, accessible, self-referential, stark, self-explanatory work, addressing the fleeting nature of digital ephemera across huge, seemingly permanent structures like the Internet and Google.

I like it. :-)

</comment></comment><comment><USER14> I like how you can now go into the gallery using streetview <http://goo.gl/maps/KAVo>

</comment><comment><USER15> I love it. People who never had a chance to visit those museums can now see them

</comment><comment><USER16> Flash only? After google's stance on h.264, this is quite surprising.

</comment><comment><USER17> Powered by Google, limited by Flash</comment>


Ask HN: Make something of the free time at work - <AUTHOR> In my job there are a lot of times where I am not doing much and slacking off. Unfortunately there is a lot of control due to security and I cannot do much on my computer (no install of software, a lot of websites are blocked by the firewall etc.).
For instance, I would like to learn a new technology, or consolidate one (for instance Node.js) that I know, but I can't because I cannot install Node.js, ore reach npm to install packages.
How can I use the time that I have available during work? What would you do?
Books are not a good idea because I don't think it would seems good to bring a book and study it at my desk
EDIT: I work in Banking and I cannot bring anything with me (such as my personal laptop). This means I am constricted to the use of my work PC. Something like repl could work, but for instance, that is not reachable for me <comment><USER2> I think this is asking the wrong question.

Your team lead might not have realised that the workload is becoming sporadic.

Speak to them, explain the situation, and ask if there are other smaller tasks you could use to fill in the gaps.

If it "wouldn't seem good to bring a book to study at my desk", then it's probably not a good idea to do effectively the same thing on the computer either.

<comment><USER3> y, I wouldn't draw attention to your workload, I've seen people ask about mores tasks due to not having anything to do, only to find out the company has a low level of work/revenue available and this person was let go. Maybe see about changing teams or taking on a higher level position, be careful how you frame it. Typically managers are stacking tasks/assignments/deadlines so you're as busy as possible.

<comment><USER4> > I've seen people ask about mores tasks due to not having anything to do, > only to find out the company has a low level of work/revenue available and > this person was let go.

I witnessed a similar scenario with a former colleague.

He would have 2ish hours of dead time each day after submitting his daily/weekly/monthly reports to different departments (he was a data analyst). He wouldn't have anything to do until the different dept. heads replied with more work based on the last report.

He asked our manager what else he could help with (on multiple occasions) and came off as super driven/motivated from my read of the situation.

I had similar dead spots and... well.. STFU. I would browse reddit/hackernews or work on a personal blog post. At the time, I felt like a dick for not doing the same and asking for more work. My rationale was "I get paid to do X, I have done X, it is not my job to load myself up with work if I can do X in 6 hours instead of 8".

Anyway, in January a few years ago, we had a restructuring (I still lol at that word every time) and several jobs were "shifted" from fulltime to partime/casual. My colleague had his position "re-evaluated" to 18 hours per week from 40. He could either accept the new role or take a redundancy package.

He took the redundancy package.

I kept my 40 hour per week job and ended up with a slight COL raise.

I chalk this up to a real life example of "what's good for the whole isn't always good for the individual".

</comment></comment></comment><comment><USER5> I use [https://observablehq.com/](https://observablehq.com/) when in constrained environments

</comment><comment><USER6> Wrong question. You're being paid to work (and earn money for the bank), not work on ad hoc personal projects.

You should go to your supervisor and tell them you either need more work, or would like to establish formal career growth goals.

If your supervisor is not receptive to this, it's time to start looking for another job.

The above assumes you're in a professional role. If you're a teller/clerk and there just aren't customers, I'm not sure - the bank very well may want you sitting idle and available for the next customer. Of course, if that's true, you probably need to look for a new job because they're over-staffed.

<comment><USER7> No, they are being paid to do the work they are given.

It is up to them to look for more work if this is what they want. There is no obligation here, management runs the company as they see fit.

So the question is very reasonable : once work is done and since they apparently have to be physically present, how can they manage this free time.

<comment><USER6> That works if you're happy with the status quo, don't want a promotion, and are happy being bored half the day. The fact that the OP asked makes me believe that's not what he wants.

<comment><USER7> OP asked what to do with his free time at work, not how to manage his career

</comment></comment></comment></comment><comment><USER8> 1\. read ebook. problem solved.

2\. make use of Instapaper. save a bunch of articles to read into Instapaper the previous night, come to work and read them via Instapaper.

</comment><comment><USER9> I'd wholeheartedly recommend Glitch for this situation:

[http://glitch.com/](http://glitch.com/)

It will give you an IDE and a VM to build projects, and a big community to share/get inspired by. It's sort of like MySpace for web apps.

</comment><comment><USER10> Solution: [https://repl.it](https://repl.it)

I learned Clojure at my last job when I had downtime. I was restricted from downloading Clojure dependencies which was a pain, so I either used mobile hotspot, or I used repl.it which has about every relevant language in the last 40 years. Many of them come with a web framework to make a web app (which they also host for you for free)

<comment><USER11> Hah REPL/Colab/Kaggle are great, did a similar thing at my last job when there was downtime. No one cared what we did while the reaction was running.

</comment></comment><comment><USER12> First and foremost, this is your time and you should use it how you see fit.

Here are some random suggestions:

\- Solve algorithmic problems on Codewars or HackerRank

\- Build an app on Python Anywhere (cloud9.io was a more convenient and versatile remote coding sandbox, but its UX has become much worse after they were acquired by AWS)

\- Try to answer some questions on Stack Overflow

\- Take a coding course on Codecademy

\- Take a ML (or any other) course on Coursera

\- Take a language course on Duolingo (you won't be able to do speaking exercises, but you'll still be able to learn)

\- Write for your blog (on any platform that you can access - starting a site on your own domain is a good option because it will most likely not be blocked by your filters)

Some of these sites can be blocked on your machine, so choose what is available.

</comment><comment><USER13> Some man pages are pretty interesting, like the ones for Perl if you use the language.

You could also become really, really good at using a text editor, it becomes a bit of a game and it's going to be useful for as long as you are planning to type.

</comment><comment><USER14> If it would look bad to read a book at your desk, that would seem to suggest there's something else your employer expects you to be doing with your time?

<comment><USER15> Pretty sure you employer expects you to be making them money with your time. At the same time, you should be expecting to do as little as possible for your compensation.

It's funny how culturally, we paint business practices of optimizing profit as picturesque but paint labor optimizing their profit as a sin.

It's really all a matter of perspective and somewhere, most the labor force was convinced to take the capital owners perspective.

<comment><USER16> This is because if everyone does very little the company goes bust and we are all out of work.

Organised labour movements are supposed to be about what is fair.

A fair wage for fair safe work.

<comment><USER15> I agree completely, as with most things in life, there's a healthy balance somewhere in between. One extreme or the other tend to be counterproductive to everyone involved. Theres a reasonable amount of productivity that's respectable with a reasonable compensation that considers everyone's situation.

Unfortunately, the economic system we've adopted tends to work quite well at finding extremes and many of the corrective measures to flatten these out are failing more and more.

<comment><USER17> Maybe we're in the healthy balance.

<comment><USER15> Maybe we're not.

</comment></comment></comment></comment></comment></comment><comment><USER18> Just to add to what others already said : You could also invest in making use of your time to create values in other, more 'social' but techy ways.

I also work in a bank, and started spending some of my idle time preparing to organise meetups, invite external speakers, and find ideas that would contribute to tech for everybody. Things like pushing for the start of a tech blog for example. This usually requires finding the right people, know how to convince, and other things you won't get blocked on, while staying on the tech side. Or even spend time writing one pagers on how your company could become more efficient.

Just another perspective. Not everything you can learn has to do with your computer. you could also spend more time with some of your business pips for example and learn more from their processes.

If you really just want to iterate fast and write code all day, maybe your current environment is not the best for you :).

</comment><comment><USER19> The old saying goes.. "If you have time to lean, you have time to clean".

Define "clean" as you will for your work context.

</comment><comment><USER20> Trying to do things that aren't work while you're paid to do work is an easy way to short circuit your career prospects. Don't do that.

Make good use of the time. Talk to your manager about things you could be doing that would improve the codebase you work on _and_ enable you to learn new things. Better yet, make some suggestions.

<comment><USER21> That's only if you are planning to stick around. If you are thinking of moving on soon it's a good time to learn and practice.

<comment><AUTHOR> and I am not planning to stick around

</comment></comment></comment><comment><USER22> At my work we organized group trainings, where we all learn X technology together that is related to our jobs in that we could do more if we knew how to use it but don't actually need to use it. Maybe there is some approved software that could be installed that is semi-related to your job.

</comment><comment><USER23> It sounds like you are in the wrong job. You are a creative thinker and deserve a better suited place for your type of mind. It sounds like you are in a prison of boredom. I would recommend working remotely and have a work machine dedicated and your own personal machine.

<comment><AUTHOR> i definetly feel in the wrong job and I want to change it, but in the meanwhile

</comment></comment><comment><USER24> I've worked in three different banks and was able to bring my laptop (not connected to the bank network of course), use my headphones to cut the open space noise and listen to anything I want.

As in your bank, proxy was very restrictive, a lot of the web wasn't reachable, but with my laptop when I had free time between projects or issues I could use them for something interesting, and management/security was OK with that.

Seems like hell, just get out of there if you can and have the chance to. In the meantime try to ask for other tasks, or try to refactor some code, there's always room for improvement somewhere, and it's better than looking at the clock for hours a day.

Good luck!

</comment><comment><USER25> Test your SQL fu: [https://mystery.knightlab.com/](https://mystery.knightlab.com/) No installation needed. All online.

Pretty sure there is a codepen like site for nodejs too. Find it, build something.

</comment><comment><USER26> I'd arrange meetings with colleagues in other teams and departments to find out what problems they are working on and how you might help. If they have nothing, you could arrange to shadow them for a few hours or half a day. This way you'll find new things to work on, or have a greater understanding of the business and have a larger internal network. Alternatively, if there are ways the business could be improved, you could work on a proposal, and get buy-in and ideas from your colleagues and finally present it to your management.

</comment><comment><USER27> Use the website PlayOnDocker and run there your experiments with NodeJS, free and out of restrictions. Otherwise, consider buying a VPS or build a VPN at home and doing your experiments on your local server

<comment><USER28> Just don't put any personal credentials on those instances (e.g. github tokens, aws access keys, etc). I don't know if it's still the case but when it was first released I was able to mount other container volumes and snag them. (Reported to Docker security)

<comment><USER27> yeah right, it should be taken only as testing environment

</comment></comment></comment><comment><USER29> Read man pages!

These constitute a rabbit hole of extremely interesting documentation. They will help you improve as a developer, and more importantly broaden your horizons beyond what you ever thought was possible. Enjoy!

</comment><comment><USER30> I used to work at bank too without admin rights. Anaconda has a portable version which can be installed to My Documents folder(if space permits) without need for admin rights. This comes with lots of apps for you to tinker with. Python, numpy, pandas, flask, sqlalchemy and many more.

EDIT: One of my quants did such a great job with Jupiter notebook and anaconda that it is now added to the official list of softwares that we can request for installation.

</comment><comment><USER31> The raspberry pi is a good suggestion, but if you don't want to be seen bringing outside hardware into the building, you could look into Amazon Workspaces or another remote workstation service, or host your own box and remote into it. Workspaces has a web client for accessing your workspace, so unless Amazon cloud services is specifically blocked at work, you should be able to access it. There's a small monthly fee, but I'd think it'd be well worth it.

</comment><comment><USER32> If you can't bring a book, then you probably shouldn't bring your own laptop or much anything else. Do you have your phone? Maybe you could do something on that.

<comment><AUTHOR> I indeed cannot bring my laptop. It's a bank and they are taking security seriously apparently, which is good on one side, but bad on my side because I cannot do anything.

</comment></comment><comment><USER33> You could answer questions on [https://stackoverflow.com](https://stackoverflow.com)

</comment><comment><USER34> If research is something that might be considered work during the day you could hop on Sci-Hub and read some interesting papers.

</comment><comment><USER35> I used to code using a paper and pencil when away from a machine. It was actually more likely to run without error too.

</comment><comment> 52-6F-62 Can you use [https://repl.it](https://repl.it) ?

You could learn some new tech/patterns on there including NodeJS ([https://repl.it/languages/nodejs](https://repl.it/languages/nodejs))

<comment><AUTHOR> good, I didn't know it.

EDIT: Tried, blocked (failed to connect)

<comment> 52-6F-62 Damn, sorry to hear it. Other users listed some good options, like [https://codesandbox.io](https://codesandbox.io) and [https://observablebq.com/](https://observablebq.com/)

</comment></comment></comment><comment><USER36> Don't undermine your company or risk being fired.

That said, you can go to LeetCode (or just email yourself screenshots of the problems) and then work on the solutions in Notepad++. Email those solutions to yourself and then, when you get home, you can submit those solutions for credit.

<comment><USER28> If they have that many controls at the desktop, emailing code to a personal address is not going to go well.

</comment></comment><comment><USER37> Do you have access to codepen, scrimba or jsfiddle or something similar. There is a lot of front end stuff you could learn just with that to keep you busy for days. Bring in a book or use your phone for a tutorial. G'luck

</comment><comment><USER38> I have the same issue I used the site glitch to learn Hopefully it works for you

</comment><comment><USER39> I also work in a bank. We can submit request to install software. Of course we need to get manager's approval. So what kind of software do you use daily?

</comment><comment><USER40> I'm sure many people have headphones on, download courses on your phone and listen to them, or audio books, nobody needs to know where the sound is coming from !

<comment><AUTHOR> Nope. None. I had them in the beginning, until one day my boss asked me if I had headphones on and told me to take them off because we can't

<comment><USER41> And you didn't quit on the spot, because???

<comment><AUTHOR> oh, I will, I just don't want to end up in another shitty job like this. Unfortunately this is not an area for high quality tech companies id like to work for

</comment></comment></comment></comment><comment><USER42> Maybe use this to learn node? [https://aws.amazon.com/cloud9](https://aws.amazon.com/cloud9)

</comment><comment><USER43> It would really help to have more details, like what country you're in and what industry, e.g. Banking, Defense, etc.

<comment><AUTHOR> banking

</comment></comment><comment> jerome-jh Could you bring your own laptop? Of course not connecting it to the LAN.

Alternative: use a RPi with your monitor/mouse/keyboard.

<comment><USER44> RPi = Raspberry Pi ? Not sure that's commonly used enough to use without a parentheses long version :(

<comment><USER45> Pretty sure it is. Fairly ubiquitous, and I know of nothing else that would conflict with it.

RasPi is also used.

</comment></comment></comment><comment><USER46> You could get very good at vanilla js.

<comment><USER47> How so?

</comment></comment><comment><USER48> Bring a laptop to work and use that when you have freetime?

</comment><comment><USER49> are sites like glitch.com and codesandbox.io blocked? they give you a development environment in the browser</comment>


Ask HN: Simple Docker Deployment - <AUTHOR> I have recently started using docker for my side projects and it's great! My question is what do you guys use to deploy it? Ideally I would want something as simple as pointing some deployment service to my repo and have it do everything for me. <comment><USER2> If you want the simplest setup check out dokku: [https://github.com/dokku/dokku](https://github.com/dokku/dokku)

It's literally a bunch of bash scripts so it's as straightforward as it gets to understand how it works. As a simple deploy target for side projects it works great.

</comment><comment><USER3> Flask + React + Docker on AWS -> [http://testdriven.io/part-one-aws- deployment/](http://testdriven.io/part-one-aws-deployment/)

</comment><comment><USER4> I have used [https://deploybot.com](https://deploybot.com) and they are pretty good.</comment>


Monkey Patching & Gorilla Engineering: Protocols In Clojure - <AUTHOR> http://kirindave.tumblr.com/post/658770511/monkey-patching-gorilla-engineering-protocols-in <comment><USER2> I forgot to mention it (and I guess I'll need a part 2 to fully explain some of the subtler points), but it's important to note that ANY class can be extended by these extension methods. Even java.lang.String and its ilk.

That wasn't exactly clear from the post, but it was already getting too long as it is.

<comment><USER3> One of the more legitimate uses I've found for monkeypatching is fixing bugs in libraries you don't control when the maintainer is for whatever reason unresponsive to your pleas. I.e. replacing someone's broken method despite lack of a pre-existing contract. Is that supported?

<comment><USER4> Every function in a protocol is namespaced. There's nothing preventing you from defining a new function with the same name in a different namespace. This doesn't actually replace anything, though, and any references to the old function will have to be changed to point to the new one.

It is also possible to extend a protocol a second time for a given type/record, which will overwrite the previous implementation. This can be occasionally useful (mostly for incremental development), but for the most part runs counter to the philosophy of Clojure. Seeing it used in production Clojure code would raise a lot of alarm bells.

<comment><USER3> So anything that requires changing all the references to the new one is a non- starter. I want something that lets me fix it in-place without going and hacking their source directly.

If you could do something like "monkey patch this, but only for calling code inside my private namespace" that would probably get you 90% of the way there.

</comment></comment></comment></comment><comment><USER5> `defprotocol` and `extend-protocol` remind me of type classes and type class instances in Haskell. The latter provide the same kind of ad-hoc polymorphism - i.e. you can tell the compiler that your custom datatype implements a predefined protocol, and then code that talks to that protocol automatically works with your new datatype, in a statically type-safe and (I believe) efficient way.

For example, this (built-in) type class is similar to Java's `toString()`:

        class Show a where
          show :: a -> String

        -- works with any instance of Show
        showTwice :: (Show a) => a -> String
        showTwice s = show s ++ show s

        data Fruit = Orange | Apple

        instance Show Fruit where
          show Orange = "orange"
          show Apple = "apple"

        x = Orange
        show x       -- => "orangeorange"

Can anyone more familiar with Clojure (or Haskell for that matter) compare and contrast?

<comment><AUTHOR> A popular meme that's going around the Clojure community right now is that Clojure's types and protocols are "dynamic type classes". Clojure's offering does not provide all of the same things that Haskell's type system gives -- like say, return type based method selection.

</comment></comment><comment><USER6> So would you use this like so?

      (make-hash (MyIntHolder. 5))

And the benefit here is that you aren't doing "my_int_instance.make_hash()" so everyone can have their own definition of make-hash, right?

What's the difference between this and defining a function in Python/Ruby (rather than monkeypatching)?

      # Python
      def make_hash(val):
        if not isinstance(val, MyIntHolder): raise TypeError
        return val.data

That's a namespaced function that checks it was passed a MyIntHolder and returns the data[1]. Each library/module can define its own version.

I mean this as an honest (and stupid) question. I'm fascinated with Clojure and am working on learning more, but none of the Protocol examples I've seen have given me that "Ah ha!" moment I've had with so many other parts of Clojure. Can you help me understand?

[1] Side question, I didn't understand "(.x this)" in your example, what is .x?

<comment><USER2> > What's the difference between this and defining a function in Python/Ruby > (rather than monkeypatching)?

Your function can't handle new types in the future that you're not aware of. How, exactly, would I as a BloomFilter writer know about MyIntHolder in order to put it in that conditional? How could a library writer extend it? Your response _might_ be to make a hash table, in which case you have re- implemented an slow, expensive, error prone version of what Clojure is doing under the covers.

> [1] Side question, I didn't understand "(.x this)" in your example, what is > .x?

It's like saying "this.x", which is to say "access the public x field." Clojure is in the camp that enforced visibility on data members is generally a bad idea, and it expresses that opinion with deftype.

<comment><USER6> I understand that Clojure does this under the covers with great speed, but is that the only benefit? I want to reiterate that I'm merely confused here and not trying to argue my silly function with type check is good code. I still feel like something about types/protocols isn't clicking in my brain.

What's the difference between extending a protocol including make-hash and human-readable-hash for MyIntHolder and doing two defmethods that define those and are dispatched on an instance of MyIntHolder? (Sorry if my Clojure lingo is off there, I hope this makes sense)

> How, exactly, would I as a BloomFilter writer know about MyIntHolder in > order to put it in that conditional?

Didn't the person writing this need to know about MyIntHolder?

      (extend-protocol BloomFilterable
        MyIntHolder
        ...

> It's like saying "this.x"

But what is "x" there? I'm probably reading it too literally, but I see that MyIntHolder takes 1 value (of type int). I don't see any name associated with it, is the "x" just an unrelated example?

<comment><USER4> Protocols are just a faster, less general version of multimethods. They dispatch only on the type of the first parameter, and they do it quickly.

This speed is important because it allows the java interfaces that define the core constructs of Clojure (such as clojure.lang.IFn, clojure.lang.Seqable, etc.) to be defined purely in terms of protocols, thus bypassing the need for Java altogether. Using multimethods would have been untenably slow.

Protocols can also be useful in that they recognize that certain behavior is defined by a set of functions, rather than just one. Consider the Cantor library (<http://github.com/ztellman/cantor>), which does simple floating point math. Using only multimethods, it's possible that you could define addition for a type, but not subtraction. With protocols, it's much more difficult to make that mistake.

</comment></comment></comment></comment><comment><USER7> A programming article with no code? I hope this doesn't become a trend.</comment>


Programming Languages for Machine Learning - <AUTHOR> http://hunch.net/?p=230

<comment><USER2> This is a five year old post. These days Python is probably the way to go with NumPy, SciPy, Theano, IPython, matplotlib, Cython, etc. I'm also really looking forward to PyPy's NumPy support -- should allow you to write in pure Python code but still get most of the optimization benefits of writing in a statically typed compiled language like C++.

<comment><USER3> Python and Haskell for development. Weka and R for saving loads of time. Some competency in Java and C helps.

<comment><USER4> Did you ever do number crunching in Haskell [1]? Experiments by the developers of the repa matrix library show that repa (which exploits data parallelism) does not even outperform a single threaded C++ implementation when 8 CPU cores are used:

[http://www.cse.unsw.edu.au/~benl/papers/stencil/stencil- hask...](http://www.cse.unsw.edu.au/~benl/papers/stencil/stencil- haskell2011-sub.pdf)

The most glaring problem is that GHC currently does not support SIMD vector instructions. A problem which is now, fortunately, being addressed:

<http://hackage.haskell.org/trac/ghc/wiki/SIMD>

But currently, Haskell is not really an option if you want to write serious ML software that rely on vector or matrix operations.

[1] I did, for maximum entropy modeling. Believe me, it's not near competitive to C or C++ yet. But one day, it will probably be.

<comment><USER3> "C is faster" is a tired argument. The ability of this compiler or that to produce the most efficient possible code is almost never relevant outside of a few niche cases. Even UHF finance is such that the fractional return in computation time that you may get from using C isn't worth the development overhead. There are any number of great reasons to use C, but speed is rather outdated.

In this case, you're also guilty of putting optimization before the algorithm. Squeezing out the last clock cycle doesn't matter when you have raw data in one hand and some high-level objectives in the other. Effective machine learning is more about finding ways to obtain and reduce data into a useful form, and finding ways to map between your design goals and workable algorithms. Speed is the last step, and often the only one which can be improved by throwing money at it.

Besides which, if you want to have a pissing contest about speed, C is still going to lose to FPGAs. If it's that important, hire someone who knows Verilog.

<comment><USER4> _"C is faster" is a tired argument. The ability of this compiler or that to produce the most efficient possible code is almost never relevant outside of a few niche cases._

What niches? ML is exactly one of the niches where highly optimized code helps tremendously. We use ML, amongst other things, for parse disambiguation and fluency ranking. Making a modification in, say the grammar, often results in training and retraining various components that have a mutual influence (e.g. parse disambiguation, auxiliary distributions for subcategorization frames, the part of speech tagger). Evaluation is also performed using ten-fold cross validation.

Since a modification can also result in regressions, the effect of modifications are usually checked individually. Being able to validate changes in one hour rather than one day, helps the development of such a system tremendously.

We developed some software first in other languages (Java, Scala, Python), usually to make a prototype for getting grip on a problem. But reimplementing it in C or C++ paid of tremendously on each occasion. Even though there is enough CPU time available (we have a 3280 core cluster).

Another thing to note is that most machine learning techniques are fairly generic. So, usually there is already a perfectly fine C/C++ implementation available. Sometimes with bindings and all.

 _In this case, you're also guilty of putting optimization before the algorithm._

How do you know? Most data is actually preprocessed using Prolog or Perl. But the actual machine software is written in C or C++.

 _Speed is the last step, and often the only one which can be improved by throwing money at it._

Again, there are niches where it is worth it. And machine learning is often that niche, because people use huge data sets, complex problems, or both.

 _Besides which, if you want to have a pissing contest about speed, C is still going to lose to FPGAs._

Yes, but FPGAs are not readily available to our users :). But we are very much interested in GPU computing.

\---

Apart from all of this, it's funny that you pointing to the price of implementing in ML software in C. It's not as if there are large amounts of Haskell programmers available. Writing such software in Haskell has about the same economic risk as using COBOL ;).

</comment></comment></comment></comment></comment><comment><USER5> This article doesn't really describe what the title implies. It states issues and concerns for several languages, names several that have large ML libraries written for them already, and even gives his own approach for how to implement new ML algorithms, but it doesn't actually give real options for "Programming Languages for Machine Learning".

I've found that Matlab/Octave is a decent substitute for a "high-level language" to sketch out new approaches with. They're significantly fast, as well as significantly suited to matrix algebra that they can give decent results, even though they have some less-than-beautiful code. Matlab appears to be the language of choice for AI at the University of Toronto.

Personally, I think the best option would be to roll with a functional language (or at least, a language with functions as first-class objects), since a lot of ML algorithms can be reduced to recursion on several matrices, often using very similar functions. For example, ANNs frequently have very similar structures and training strategies, but simply use different learning functions.

Everything can be done in C/C++ though, and while it'd be harder, ML is an area where the gain in speed and efficiency is so significant that extra development time pays boatloads in terms of ROI. Even basic ML examples often involve dealing with 300x236 dimensional data, so you can imagine how much that data would scale up significantly in production environments.

<comment><USER6> _Everything can be done in C/C++ though, and while it'd be harder, ML is an area where the gain in speed_

Don't forget machine learning generally involves a _lot_ of experimentation, and this is easier with higher-level languages. Hand-optmization always makes assumptions about specific data structures and details which can be hard to change later.

You can get very close with code-generating high-level languages though. See Theano (<http://deeplearning.net/software/theano/>), for example. It uses a functional approach to compose the formulas for (c-)ANNs, and has advanced features such as automatic differentiation. Scalable generated GPU code can beat the pants of even the fastest hand-written C loops. Sure, hand-optimized GPU code can perform even faster but in my experience that is usually not worth the trouble.

</comment></comment><comment><USER7> Given that there are many lisp aficionados here at HN, some may find lush <http://lush.sourceforge.net/> quite interesting. Lush has been discussed at HN before but here is a short summary: You get lisp syntax, optimized multi- dimensional arrays, _extremely_ easy integration with C code, common numerical optimization libraries, and the option of translating (and then compiling) lispy code into a C dynamic library.

The language features that the interpreter supports is subtly (and sometimes not so subtly) different from the compiled version though they share the same syntax.

In the context of scaling machine learning code you often hear that one should/could write most of it in matlab/octave and the critical parts in C. But anyone who has done it would know it is such a butt-hurting nuisance. In comparison the C integration is a pleasure in Lush.

</comment><comment><USER8> We're using Matlab/Octave in the Stanford ML course, and it's certainly elegant but not necessarily comfortable for functional programmers. I'm reimplementing our assignments with Clojure/Incanter and am finding my code just as performant and even cleaner. In my opinion, the ML domain maps to Lisp code almost as well as AI as a whole.

<comment><USER9> The instructor emphasized the performance benefit of Octave's optimized matrix operations. Did you use Colt's matrix operations, or were you able to match the performance of vectorized Octave code with non-vectorized Clojure code?

<comment><USER10> I think the real magic comes from _understanding the algorithms as matrix operations_ , and then implementing them by more or less just writing down the algebra.

<comment><USER11> Can you give a source for learning about "algorithms as matrix operations"? I tried searching on that phrase in Google Scholar but didn't get anything useful.

<comment><USER12> If you can express the code using the functions and operators of linear algebra, you can simply write the math and get fast, elegant code. May even run on a GPU.

Fortran is frequently used for physics simulation. We used Mathematica, Maple and Matlab even in non-computing classes.

See <http://www.netlib.org/lapack/>

Also <http://en.wikipedia.org/wiki/Array_programming>

<comment><USER11> Your first phrase captures what I assumed he meant, I was wondering if there is anything available that could help me recognize algorithms that could or should be expressed that way, and how to do it. Your Wikipedia link was helpful.

I am working on a calculus refresher right now (I really need it) and am planning on working through an elementary linear algebra text once that is done, which is why I particularly noticed the comment. I have found that having an idea of applications helps retention, which is one reason I am trying to track down something more concrete.

<comment><USER10> Most of the textbooks on machine learning present things in that way (it's really the only way). For example, check out Elements of Statistical Learning (<http://www-stat.stanford.edu/~tibs/ElemStatLearn/>).

</comment></comment></comment></comment></comment></comment></comment><comment><USER13> I highly recommend to consider probabilistic languages, which constitute a natural framework for probabilistic reasoning and modelling. For example, have a look at this:

[http://research.microsoft.com/en- us/um/cambridge/projects/in...](http://research.microsoft.com/en- us/um/cambridge/projects/infernet/)

or at this:

<http://projects.csail.mit.edu/church/wiki/Church>

Have a great day!

</comment><comment><USER14> Considering what happened to Lisp when machine learning was called AI, I'm not sure I'd want my language to win this contest. ;)

<comment><USER15> but machine learning isn't promising the world. So far ML has a good track record thus I believe we are safe.

</comment></comment><comment><USER16> Scala doesn't have great native libraries for this but otherwise I've found it a very good language for basic ML stuff. You can express the algorithms very succinctly and readably but still get good performance.

<comment><USER17> Check out Mahout: <http://mahout.apache.org/>

<comment><USER16> Of course the great thing about Scala is that you can pretty transparently use all the Java stuff out there. Thanks for reminding me about Mahout.

</comment></comment></comment><comment><USER18> scikits.learn, pyMC, scipy, numpy, milk and more in python make a pretty formidable toolkit, R is also (probably more powerful, albeit awkward) excellent! Who needs to read a huge article...</comment>


Square Sends Millions of Digital Receipts, Sometimes to the Wrong Person - <AUTHOR> https://www.wsj.com/articles/square-sends-millions-of-digital-receipts-sometimes-to-the-wrong-person-11559640601 <comment><USER2> This happened to me, and I contacted Square to see if they intended to send receipts that were not requested to email addresses that were not verified by the purchaser. Square support said yes, that's what we want to do.

I pointed out that there could be domestic abuse consequences from sending these emails (which show not just the transaction amount, like a credit card receipt, but the items purchased). They were unfazed by this possibility.</comment>


The Only Thing, Historically, That's Curbed Inequality: Catastrophe - <AUTHOR> https://www.theatlantic.com/business/archive/2017/02/scheidel-great-leveler-inequality-violence/517164/?single_page=true <comment><USER3> It's nice to see that The Atlantic caught up with Thomas Jefferson [1], "The tree of liberty must be refreshed from time to time with the blood of patriots and tyrants. " The question now before us is can we live with the inequality or destroy it without destroying ourselves?

1 - [http://wiki.monticello.org/mediawiki/index.php/The_tree_of_l...](http://wiki.monticello.org/mediawiki/index.php/The_tree_of_liberty...%28Quotation%29)

\- Edit: grammar

<comment><USER4> There's also the whole question of the state's total monopoly on violence being unchallengable since the mechanization of the military in late WW1 and all of WW2. Even more so with the NSA and the surveillance state we all live in.

That said, that Thomas Jefferson quote is still relevant. Bureaucracies and systems do become stagnant, grow in power to become oppressive, and occasionally need to be rebuilt or evolve to be made better. This is true in industry and is true in government too. The question is how does this change come about?

Considering the modern state of warfare this must now be viewed as "shaking the tree of established ideas and systems", rather than any form of violent revolution or coup.

I'm currently making my way through the Oxford History of the United States and the entire reason the US revolutionary army - a loose collection of poorly armed and trained militias - was even able to win against the biggest imperial army in the world was because:

\- a big ocean separated US/Britian, making reinforcements and most importantly communication challenging.

\- the British army and economy was largely depleted due to their long war with France, they were in no position to win a war, especially a half-hearted war

\- the British crown was totally oblivious to the fact that the support for royalists was insignificant, due to their distance and distraction with France, their intel was simply awful

\- France joined in to support the war at a critical time

Unless America joins another costly deeply unpopular world war or somehow becomes in financial ruin, I doubt there will ever be an internal revolution again. Even then it would be risky and probably a bad idea. Therefore an entirely non-violent peaceful shaking of the tree is the only practical option :).

<comment><USER5> Uhmm... maybe you're not there yet but we had a civil war a hundred years after the revolutionary war :).

<comment><USER4> That wasn't a revolution? And it wasn't post-mechanization of the military?

Not sure which part you are challenging.

</comment></comment></comment></comment><comment><USER6> In a similar vein Dan Carlin has repeatedly brought up in his podcasts the concept of the "historical arsonist" [1] or those great leaders/peoples who, on their rampage of murder and mayhem across their respective continents burned away the old making room for growth.

[1] [https://warisboring.com/dan-carlin-explains-historical- arson...](https://warisboring.com/dan-carlin-explains-historical- arsonists-2199c93ace22#.5fv9dvpo5)

</comment><comment><USER7> I find this entire argument suspect. It all boils down to pointing to instances when catastrophe lowered inequality, ignoring all the instances when catastrophe increases inequality, and then claiming that's the only thing that causes inequality. The entire line of reasoning is specious. You can't prove a negative. It confuses correlation with causation.

<comment><USER8> It would have been nice to have a control group, true, but howya gonna do dat? We have to look at the evidence we have, and there is a fair bit of it, so we might as well take a look. I don't think the author is cherry-picking. There's nothing shocking about stability increasing organization and stratification that's hard to maintain during chaotic times. Power tends to concentrate, I think that was noted before Marx came along. And I've read books highlighting the phenomenon from a couple decades back that focused more on China and the east, as warlords rose and fell in three-century cycles. A better argument against this idea is that the article mentions that reductions in inequality continued a full thirty years after WWII, which doesn't fit the thesis all that well.

<comment><USER7> > It would have been nice to have a control group, true, but howya gonna do > dat? We have to look at the evidence we have, and there is a fair bit of it, > so we might as well take a look.

I totally get that, but that's no excuse for saying you have causation when you have only correlation. It's also no excuse for claiming to have proved a negative.

> I don't think the author is cherry-picking

Calling it cherry picking is generous: this is anecdotal evidence. You need more than a half dozen examples to prove a trend, and I'd prefer examples more precise than the events that occurred across an entire country over the course of decades.

To be clear, I don't question that catastrophe can reduce inequality, but I don't think it is the only thing.

<comment><USER8> Only if you assume the data have been fiddled do you have to worry about correlation not being causation; otherwise the law of large numbers applies thoroughly - if not coincidence, that leaves causation in this case. Why? Because present inequality can't be causing previous peace; and as for both being a downstream cause of something else ... well that just beggars my imagination - Descarte's Evil Genius or Aliens with a sense of humor are the only such upstream causes I can imagine. But if you can do better, I'm open.

Most eras of history consist of anecdotal evidence; ya gotta examine and play the cards you have, not those you'd prefer. You infer that you've done a lot of reading plump with evidence contradicting this without ever offering bibliography or counterexamples; but my reading, which I mentioned, supports the thesis (for example, in the East as well) (and as it happens, supports Marx in this matter.) Please raise, call, or fold.

</comment></comment></comment></comment><comment><USER9> A current counter-example would be the Tunisian revolution[0], started because of economic inequalities, 6 years later, said inequalities are still there if not deepened.

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

<comment><USER10> I don't think a catastrophe is sufficient, only necessary.

</comment></comment><comment><USER11> Inequality != Injustice

Imagine a society where the poorest person had a standard-of-living on par with Warren Buffet, but where the richest person was richer than the poorest by a factor 100-times greater than we find in our world today. Does anyone argue that such a society is worse than the one we find ourselves in? Wouldn't everyone jump at the chance to live in that society, regardless of which strata they found themselves living in?

Another thought experiment: Imagine you could wave a wand today and redistribute everyone's wealth such that everyone had exactly _equal wealth_. Further assume you could find a set of laws which guaranteed nobody would exploit anyone else, and dictate and enforce them perfectly on this utopic society. Would you allow trades in your society? If so, how long would it take before some people had _more wealth_ than others? Would it just never happen? If not, why not?

Inequality is no great evil to be banished. Even if it were, you couldn't do it and maintain the freedom of _different people_ to value _different goods /services_ at _different amounts_ and to make trades based on their values.

Fighting Poverty is a worthy goal.

Fighting Injustice is a worthy goal.

Fighting Racism is a worthy goal.

Fighting Inequality is tilting at windmills.

<comment><USER12> Fighting poverty sometimes implies fighting inequality, such as in a zero sum resource struggle. Poor people aren't warren buffet yet.

</comment></comment><comment><USER13> It's hard to argue against trivial equality, the state of being reduced to zero.

But that's not what modern equality proposes.

The argument against Trump is this case, in my opinion, void.

What he is is proof of systemic weaknesses and corruptions in our beurocracies.

The right sentiment, but the argument is too reductionist.

Sort of like saying If we're all dead, we're all equally alive. Not false perse, but it's an absurdity.

Edit: coming from an active conflict zone, I often comfort my western colleagues by arguing that everything we have that's worth anything is often built on blood sacrifice, and that the west is in need of fewer conflicts, because it learns and ends up prefering peace over conflict, as will my region someday. War a d conflict are natural to us but so is peace and love of kin.

I understand the author, but it's a bit grim. That said, hope for the best, prep for the worst.

<comment><USER14> The great compression and several of the other examples in the article were times of economic growth.

<comment><USER8> Indeed, it's just how you get there that's economically catastrophic.

</comment></comment></comment><comment><USER15> It bugs me when people obsess over equality, and not the standard of living. Today's poor have it better than kings in many ways. Running hot water, air conditioning, much more.

If people would stop coveting what everybody else has, society would be much better off. Instead of saying "he has more than me" say "I have enough for my needs".

There will always be someone with more. Don't be greedy be grateful, or you will never be happy.

The commies obtained "equality" but did standard of living improve? No many people starved, and millions were murdered. They depended on the west for their very food. Now China is becoming less authoritarian and is able to grow.

</comment><comment><USER16> An interesting article and some valid points, though I'm confused as to how they ignored the MASSIVE growth of equality due to the Industrial Revolution, or was that a catastrophe? I'm sure there are some that would think so...

</comment><comment><USER17> The trouble is the next total war will be a nuclear war.

</comment><comment><USER18> In this case, the US decline probably started in the 1970s when they left the gold standard.

<comment><USER19> Something certainly happened around 1970-ish: [https://www.mises.ca/wp- content/uploads/2013/12/graph-1.png](https://www.mises.ca/wp- content/uploads/2013/12/graph-1.png)

Looks like 1st percentile wage growth stagnated right around 1970, but 99th percentile wage growth didn't start accelerating until around 1980 - <USER2> around when bond prices started rising again, after falling through the 70s. And they've been rising ever since.

<comment><USER20> You bet your ass something happened. I'd love to know what. [https://upload.wikimedia.org/wikipedia/commons/4/48/U.S._inc...](https://upload.wikimedia.org/wikipedia/commons/4/48/U.S._incarceration_rates_1925_onwards.png)

<comment><USER21> Nixon and then Reagan's policies.

<comment><USER19> Which policies, exactly, caused the discrepancy we see in pre-tax income growth?

Or are only only referring to incarceration rates?</comment></comment></comment></comment></comment>


Identifying influencers on Twitter - <AUTHOR> http://blog.backtype.com/2010/11/identifying-influencers-on-twitter/

<comment><USER2> Meh. I'm "influenced" by Whet Moser and Liz Ptacek; I happen to be related to them. "Influence" apparently means "have ever RT'd them".

<comment><AUTHOR> How did you expect influence to work?

<comment><USER2> _Something_ works that way, but it's probably not as interesting as "influence".

<comment><AUTHOR> If you read somebodies tweet you are influenced by it. The influence might only be to the extent that you have consumed the content but it is there.

</comment></comment></comment></comment><comment><USER3> Klout.com is another pretty popular one. How Does backtype differentiate itself from all the other services that do the same thing?

<comment><USER4> Identifying influencers is important, but that's not the sole feature of our product. We already differentiate ourselves with other features (which Klout et al. don't offer): visit backtype.com and try it out. Thousands of people use it every day.

</comment></comment><comment><USER5> I influence @zoecello. <3

This is quite cool, but the Login with Twitter piece needs a bit of work, the branded login page looks sketchy right now with missing images and poor UI. I almost didn't sign up due to the sketchiness of it.

<comment><USER6> Wow, that is sketchy. That's on Twitter's end, something must have broke recently (today) because I've never seen that before on any of their auth pages. (mike from backtype)

</comment></comment><comment><USER7> I've followed peerindex.net for a while which does the same thing.

</comment><comment><USER8> Typed in my Twitter ID and was told search was retired and to join beta. FAIL.</comment>


A Steve Jobs email exchange that captures Apple's strategy - <AUTHOR> http://qz.com/118293/the-steve-jobs-email-exchange-that-perfectly-captures-apples-strategy/ <comment><USER2> This hardly captures Apple's strategy. It appears to offer an insight into one step in their strategic thinking for one issue, but the title of the post is quite misleading.

<comment><USER3> This absolutely captures their strategy. They are clearly building a walled garden for their own benefit, while selling it as the user's benefit. I can't imagine users complaining about having the option to switch to android.

<comment><USER4> > while selling it as the user's benefit

I disagree.

Facebook, Google, Microsoft have a walled garden, in-fact every company on earth thinks on how to keep customers from leaving.

The difference between Apple and others is that Apple products are far superior, i can't imagine myself using __any __Microsoft product if Apple provides it.

<comment><USER5> Well, no.

Google releases pretty much all of its products on iPhone. Apple doesn't releases anything on other platforms and when they do because they have no choice (iTunes on Windows), they do it poorly.

<comment><USER6> Well, Google certainly builds walls for its garden. Looking at things like nuking Reader in favor of G+, nerfing its applications on iOS compared to Android (funny how quickly iOS got turn by turn Google Maps once Apple released its own map application), and even initiatives like Free Zone in developing nations that provide free internet only for checking G+, gmail, and sites opened directly from a Google search). Just look at the shenanigans Google is pulling right now with Microsoft and getting Youtube on mobile there.

All of these companies throw walls up for the sake of profits and strategic benefit. Different heights, different locations, some hard walls, some soft, -but they all build them.

The entire free Android operating systems itself is just vendor lock-in for Google, which is an advertising (not search) company.

<comment><USER7> Actually, you're wrong, sometimes the iOS apps have features that Android doesn't have yet, for example, iOS Maps actually had the new Maps interface before Android. Also, Google has Google Takeout, which lets you leave Google and take everything with you.

Android is not vendor lock in, because Google isn't the vendor in this scenario, Samsung, Amazon, Sony, etc are. For example, Amazon doesn't include Google's services, and Samsung is clearly moving in the direction of pushing their own stuff in front of Google's.

<comment><USER6> _> Actually, you're wrong, sometimes the iOS apps have features that Android doesn't have yet..._

I didn't say they didn't, nor did I even imply it. Understand that this doesn't change the fact that Google witheld app features from other OEMs and kept enhanced versions for its own partners for competitive reasons. Just because Apple did it too doesn't mean Google didn't (as I already pointed out).

 _> Android is not vendor lock in, because Google isn't the vendor in this scenario, Samsung, Amazon, Sony, etc are._

I was talking about walled gardens, and wasn't making an arbitrary distinction of "vendor" lock-in.

As I was saying though, from the standpoint of a walled garden, Android as a free operating system has been remarkably successful as a soft wall for Google, getting their advertisements on more handsets more quickly than any other method. Instead of risking consumers switching, they are eliminating competitors before consumers even get the option to switch. OEMs have been keen to adopt an OS that cost them next to nothing and played nice with branding and in house apps.

Clearly Amazon and Samsung modifying the OS is a concern of Google's, and they are combating this with native apps, web apps, and their own competitive offerings (hardware included).

<comment><USER7> What you're basically saying is that Google used open source to create a protective ecosystem that prevents other vendors from taking over with their own moats.

Chrome serves the same function. It ensures Google is not blocked by browser default search engine changing, it prevents other people's walls. But would you claim Chrome is "vendor lock in"?

Android is primarily a defense mechanism. If Apple and Microsoft together had nearly 100% of the market for the mobile web, they could change the default search engine to Bing and sink Google overnight.

Android if anything, preserves choice and prevents lock-in, because unlike iOS, it is an open OS, and vendors can always change the defaults.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER8> If anything, the inability to purchase (easily) from the Kindle app really pushed me to stop using my iPad and start using my Android products.

Haven't looked back.

<comment><USER9> It's a large reason why I won't touch any of Apple's media offerings. If they're not running the Netflix/Amazon model, where they've committed to making it available on all the major platforms, it's a non-starter for me. I really like a lot of Apple's products at the moment. It hasn't always been like that. It seems naive to believe it will stay that way forever either.

</comment></comment><comment><USER10> This touches on one of the big issues with the agency model, Apple's 30% cut of IAP, and the rule requiring all digital goods purchases go Apple IAP made Apple the only bookstore on apple iDevices, outside the browser. IMHO, when the iPhone was the leading smartphone in the US, that wasn't a walled garden, that was a market leader leveraging that power to take another market in an anti-competitive way.

</comment><comment><USER11> I've always believed it's time for Apple to embrace running some of their software on other platforms. Not only would it take the competitive advantage away from other companies providing multi-platform products, but it would also show confidence in their products that users will ultimately use their products for the best experience. Sure, some products may not make sense on other platforms (e.g., Mac OS X), but many others do make sense.

In many ways, history is repeating itself here with Microsoft and Apple 20 years ago.

</comment><comment><USER12> Out of curiosity, why did he think Apple had far superior payment system? I personally think Apple's payment gateways no better than Amazon Checkout or Google Checkout experience.

<comment><USER13> Three reasons.

1) Apple has more active credit cards than Amazon.

2) If someone were to purchase a book on an iOS device it is more likely they have an active credit card on their account than an Amazon account with an active credit card.

3) One payment system is easier for customers to understand and trust.

Steve's wording here may have indicated better technology in his mind, but I doubt that is true, given amazons incredible focus on taking credit card payments accurately and quickly. Reasonably though the reasons outlined above would be good reasons it was better overall, even if it really wasn't consumer friendly in the end because of the lock-in.

<comment><USER14> #1 #2 state the same thing, and although it may be true, I can't think of any way this makes the payment system "far superior". Is Amazon something you only use once and it's a hassle to have to enter in your credit card?

#3 is not something anyone believes, even you.

I'd counter with iTunes hysterically bad receipt notifications. Typically you get a receipt between 3 days to 2 weeks after you buy something. Every time I receive an iTunes receipt I have to strain to remember way back when I bought the thing the receipt is for.

<comment><USER15> iTunes is a horrible store front, so I had to vote you up. Maybe it was acceptable for what was available when it launched but it's coming up on 10 years later and basic features that would aid discovery are still missing.

</comment></comment></comment></comment><comment><USER16> It says a lot about their attitude, but I wouldn't say Apple's strategy is 100% predicated on switching costs. Not even close. They entered the phone market as an underdog, for one thing.

As for attitude though, it does perfectly capture what they consider "superior", i.e. stuff Apple does (platform-mediated payments), not necessarily stuff that benefits users (portability).

</comment><comment><USER17> So the gist is that Apple is all about vendor lock-in.

Well, no surprise there. That's been the case for a long time.

</comment><comment><USER18> How are these emails being leaked? Part of the ebook case they had? Otherwise I would imagine companies would take their email seriously...

Perhaps a good practice for companies to completely delete emails after a few days? (Its impractical, but maybe there is a need?)

</comment><comment><USER19> .epub in a Dropbox folder forever. Screw _all_ these guys.</comment>