Amit Gupta Could Have Marrow Transplant by End of Year - <AUTHOR> http://www.wired.com/epicenter/2011/12/amit-gupta-marrow-transplant/ <comment><USER2> You guys may be interested in Flynn vs. Holder, which is a court case attempting to strike down the federal prohibition on selling bone marrow.

If you could buy and sell bone marrow, all parties agree that that would happen more frequently than bone marrow donation. The side that believes that would be bad won.

(A brief sketch of the concern: if you allow money into the equation, either a) people who won the marrow lottery could extort money from folks who are dying or b) poor people would be hooked up to machines and have their vital juices sucked out so that rich people could live. A brief sketch of the argument for allowing bone marrow sales: the present law guarantees persistent market undersupply of bone marrow, which, with certainty, kills people.)

<comment><USER3> I'll admit I haven't read the case you references, but once you build a financial marketplace around something, it will get controlled, manipulated and exploited. Why stop at bone marrow? Everybody's got a couple kidneys ... why not let people sell one? What about the donors who regularly give blood donations today? Would they stop doing so without being paid? I believe it's an oversimplification to just say that the current system kills people by design and that adding money will make it operate more effectively.

<comment><USER4> > Why stop at bone marrow?

I would draw a very clear line: Renewable tissue and organs can be sold, non renewable ones can't.

Blood, sperm, marrow: All sellable.

Kidneys: Nope, donation only.

Liver, skin: On the fence. (They renew, but only with scarring, and can be taken only a limited number of times.)

<comment><USER5> Liver is renewable, but living donation is extremely risky to the liver donor.

<comment><USER4> I'm not worried about risk, that's for the donor/seller to decide. Higher risk, higher money. It's no different than hazard pay for dangerous jobs.

But my understanding is that someone can only donate a liver once, even though it regenerates. Perhaps that just because doctors are uncomfortable with the risk of a second donation?

<comment><USER5> I don't agree that tissue renewability is the correct sole factor in determining whether said tissue should be for sale. I think that donor risk is much more important. I consider this to be a bioethical issue but I think it's also pretty political so I'll probably refrain from making much of an argument here.

I don't do liver transplant so I'm at the limit of my knowledge re: number of liver donations, but I would guess that it has to do with the fact that the donated segments do not regrow; the liver regains function, but not form.

<comment><USER4> > I think that donor risk is much more important.

It would be important to me certainly, if I was considering donating.

But at the end of the day each person much decide for themself. Just like people decide on a level of risk when accepting a job.

If people are allowed to risk their life on a job to make money, they should be allowed to risk their life to donate tissue to make money.

For donations though, any significant risk is probably not acceptable, which is the current situation.

</comment></comment></comment></comment></comment></comment></comment><comment><USER6> One interesting thing about Amit Gupta's efforts to get people to register their bone marrow is he's actually helping other people much more than he's helping himself. The key point is that everyone who needs bone marrow is more likely to find a match because of the additional registrants.

Serious question: is there a game-theoretic name for this? It's kind of the opposite of tragedy of the commons or free-rider. Amit's actions actually seems structurally similar to contributing to open-source software: he's trying to solve his own problem, but at the same time helping thousands of other people.

In any case, you should sign up - wouldn't it be great to save someone's life in this way?

<comment><USER7> >Serious question: is there a game-theoretic name for this?

From the view of evolutionary game theory he might be called a "neutrally fit cooperator" or "nearly-neutrally fit cooperator".

In public goods games cooperators increase the amount of public goods available to everyone, but if there is some cost to producing the good they can be subject to invasion by defectors. Amit's campaign definitely benefits everyone in the community more or less equally, but the cost to him (determined by the additional opportunities he might have had to find a donor for himself through some other means) are presumably quite low to the point where we can consider them to be zero. Since both cooperators and defectors pay nothing but receive the same benefit, they are equally fit and no relative fraction of strategies employed by the population is preferred (although having more cooperators should contribute to a higher overall payoff).

The interesting little twist to the story, if we are thinking in terms of evolutionary game theory, is that players that reach a certain payoff (e.g., by getting there transplant), leave the game with some probability! This is the opposite of what usually happens in games in evolutionary biology, since higher absolute payoff is typically associated with larger population sizes.

</comment></comment><comment><USER8> "But we're sort of in wait-and-pray mode because historically, only half of South Asians who are tested actually agree to donate."

Not only is the chance of finding South Asians to get a DNA test very low, but that chance is further sliced by half because a matched donor can get cold feet.

I really hope that those people who were identified as a match come through for Amit (or others in need).

<comment><USER9> Look, if you sign up, you sign up to actually give marrow if there's a match. Period. Unless you're not healthy enough, there's no excuse for welching on a deal that involves someone's life.

<comment><USER10> How wrong it is to flake is irrelevant. You can't really force someone to undergo surgery.

<comment><USER11> It's basically a 6 hours long blood donation. Hardly what most people think as surgery.

I agree you can't force them to go through with it, but the effort needed versus the outcome if successful are not even comparable.

<comment><USER12> No it's not like a blood donation. It's misinformation like this that cause people to sign up to donate, and then back out when they find out what they really have to do. Bone marrow donation is a surgery. PBSC donation requires you to get injected with a drug for 5 days, and then have your blood drawn out from one arm, go through a machine, and passed back to you through the other arm. If you have thin veins it'll even require a central line (tube in your neck).

<comment><USER13> Thanks for explaining this!

This is why Flynn vs. Holder is so damn important.

If the goal is to actually save human lives, more people need to _choose_ to let doctors invade their bodies to take the cells they need, take the time off of work, away from their goals, etc. The only way that most people could do this for a stranger is to be compensated. I predict great things to come!

<comment><USER14> I'm trying to think of a dollar amount high enough to let somebody stick a tube into my jugular and extend my circulatory system outside my body for hours. I don't think I can count that high; unless I needed the money for fairly immediate survival.

<comment><USER15> It's not as bad as it sounds, though 6 hours is quite a while. Platelet donation is done this way ([http://www.redcrossblood.org/donating-blood/types- donations/...](http://www.redcrossblood.org/donating-blood/types- donations/platelet-donation)), taking an hour or two each time, and there are donors who make a platelet donation every two weeks. The blood cools while it's being run through the machine so you get chilly, but donors generally just sit under a blanket and read or watch a DVD for the duration.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER16> Mike makes a good comment - The one thing that the article does not explain is that all swabs go into a national database. If you give a sample in a drive to save somebody that you know, you could end up getting a call 10 years later saying that you match somebody else on the other side of the country

</comment><comment><USER17> Why should I care about this person, and how is it relevant to startups, hacking, technology, etc.?

"On-Topic: Anything that good hackers would find interesting. That includes more than hacking and startups. If you had to reduce it to a sentence, the answer might be: anything that gratifies one's intellectual curiosity."

<comment><USER18> Ignoring your horrific lack of tact and sensitivity: From <http://amitgupta.com/>

> In the past... I started Jelly, worked with Seth Godin to start ChangeThis, > brought BarCamp to NYC, started a co-op called House 2.0, contributed to a > WSJ best-seller with Malcolm Gladwell, Guy Kawasaki and others, and started > a venture-backed company called The Daily Jolt while in college. I enjoy > camping.

<comment><USER19> He actually brings a point I've been wondering since the entire thing started: Why is he somehow more "important" than all the other people on the bone marrow transplant list?

Downvote me to oblivion if necessary, but this really is a genuine question which, by the looks of things, has the answer of: His life is more important than everyone else on the transplant list.

<comment><USER20> _"Why is he somehow more "important" than all the other people on the bone marrow transplant list?"_

He is _not_ more important in an _objective_ sense. Most people would agree in an abstract sense that all lives are equally valuable, but would readily save their child rather than another if it came down to it. Why? Because they value the life of their child more than the life of another's child, and there's absolutely nothing wrong with that.

Amit, as a member of the startup community, is our child, as it were. Due to this commonality, we feel closer to him than 'faceless' people on the list. So your last sentence might read: "His life is more important than everyone else on the transplant list _to us._ "

<comment><USER21> Anyone else see the irony of a community fighting to save a person's life, while ignoring all the other "faceless" sufferers, when the life that they're fighting for probably depends on the good will of a "faceless", anonymous person? Serious question.

<comment><USER22> I'm not sure you know what "irony" means.

<comment><USER21> Sad time when HN doesn't downvote your non-contributing comment out of spite for my comment.</comment></comment></comment></comment></comment></comment></comment>


How Mitt Romney made his fortune - <AUTHOR> http://www.alternet.org/election-2012/matt-taibbi-reveals-how-romney-made-his-fortune-it-aint-pretty-and-he-shouldnt-be?paging=off

<comment><USER3> An interesting post on a board the almost solely exists to help people find private equity investments.

Leveraged buyouts <> private equity. It is just one form of it. Sometimes the money is borrowed from investors who expect a return on their money. Listen to the horror stories here about diluted shares on a buy out. Whoever lends the money has the leverage.

</comment><comment><AUTHOR> I posted this because I'm interested in HN's opinion of private equity - <USER2> article takes a very negative view on it (and Romney himself), but there's always a 2nd point of view.</comment>


"You can't learn to write in college" -- Ray Bradbury Interview  - <AUTHOR> http://theparisreview.org/viewinterview.php/prmMID/6012 <comment><USER2> I am a counterexample. I learned how to write in college during my freshman year. My professor capped all essays at 300 words which, at first blush, seems like a cakewalk. I found it much harder to get a point across in 300 words than all of the previous reports I'd written where the objective was to fill pages.

Filling pages is different from _writing_. The most frequent criticism he'd levy was "show, don't tell".

<comment> alan-crowe Did you really mean three hundreds words? I very proud of having boiled <http://www.cawtech.freeserve.co.uk/debt.2.html> down to just 320 words. But in <http://www.cawtech.freeserve.co.uk/wotter-or-berse.2.html> I allow myself 620 words. The mathematical terseness needed to hold the word count below 300 would be self-defeating. Although I'm making a single, simple point, anything under 500 words will fail to prepare the reader to hold still for the pin prick at the end.

Why not 600 words? Doesn't a 300 word cap squeeze so hard that one is forced to respond with gimmicks? Can you link to any successful 300 word essays on- line, I would love to study them and see how the trick is done.

<comment><USER2> Yes. 300 words exactly. No tricks or gimmicks involved.

Sadly, I don't have any examples. It was a loooong time ago.

I think the 300-word cap was to force you to choose every word carefully.</comment></comment></comment>


MtGox price: $160 to $270 to $212 to $290 to $199 to $250 in the last hour - <AUTHOR> http://bitcoinwisdom.com/markets/mtgox/btcusd?

<comment><USER2> This is probably because of a rumor that some small withdrawals have been going through but baring an announcement from the company of a full resumption I wouldn't be jumping on this bandwagon. Problem is no one has any proof what is being seen on the block chain is anything except Gox moving coins around internally. Maybe even to manipulate people. There is another thread of discussion about how it's obvious none of the problems have been fixed.

[http://www.reddit.com/r/Bitcoin/comments/1ymb4r/some_light_o...](http://www.reddit.com/r/Bitcoin/comments/1ymb4r/some_light_on_the_horizon_for_gox/)

[http://www.reddit.com/r/Bitcoin/comments/1ymwzj/mtgox_still_...](http://www.reddit.com/r/Bitcoin/comments/1ymwzj/mtgox_still_authoring_invalid_transactions/)

</comment><comment><AUTHOR> The reason I submitted this is because it's an interesting phenomenon that fortunes can be lost or made so rapidly.

(An MtGox bitcoin can currently be sold for 0.4 bitcoin, so this was quite a lot of money being lost or made over the last hour.)

<comment><USER3> Lost AND made. Every loss is someone's gain. :)

<comment><USER4> Not so with assets. If you value your Bitcoin at $1000 today and tomorrow it is worth $800, you have lost money and no one gained it.

<comment><USER3> You can short on various exchanges, so as the market price drops, lots of people make a lot of money.

Even without shorting, as market price moves downward, it is only a loss for those holding. Those who got out at $950, and bought back back in at $800 have increased their holdings - as price fluctuates in the future, they increase their leverage.

Finally, you are focusing on fiat which is a tunnel-visioned approach. When BTC/USD drops, for those already in fiat it gives them more buying power. This is a gain, as yesterday they only had 1 BTC worth of fiat, and now they have 1.2BTC worth of fiat.

So it all depends on perspective, and you are right in your view. However there are many ways of looking at things, and my view isn't necessarily right either. I would say they are all valid examples though, of different ways of looking at it. Much harder to say which is "right".

<comment><USER4> Well BTC went down 20%, but since 80% of my portfolio is non-BTC, my BTC equivalent went up 20%!

Reality is you just lost quite a bit of money, but it makes it sound positive. Not that you automatically make these mistakes, but it is trivial to do that when letting your other currency float.

</comment></comment></comment></comment></comment><comment><USER5> When Magic The Gathering Online Exchange was at $1200, it meant that bitcoins were at $1200. When they dipped below $100, it didn't count because: ...?

Can someone explain this?

<comment><USER3> When bitcoin was around 1200 on gox, it was around 1150 on bitstamp, and 1100 on BTC-e... Similar with smaller exchanges as well. There was efficiency in the market, and that is important.

It has been months now since Gox separated from all other markets. First their value was hundreds higher than all others, but no one really cared because it was irrelevant - you can't withdraw fiat, and bitcoin was having trouble getting out too.

Then Gox value went below, and it was concerning so price on other exchanges were affected, but Gox was still irrelevant because their problems are unique to them, and not anything inherent with bitcoin. All withdrawals are shut down, and their last update said there's no news since the last update, and it didn't state when or if they would provide the next update on progress.

Also, your statement implies a consensus in market perception. Please don't take that from whatever the media is saying. Or whatever people on the internet are saying. Take it from the data - look at what the market is saying on exchanges, with their money. Most people don't care what the price is no Gox, and other exchanges are actively trading hundreds of dollars higher.</comment></comment>


King of the Ether Throne - <AUTHOR> http://www.kingoftheether.com <comment><USER2> There was a bug in the contract. The developer's post-mortem [1] is interesting if you want to see what Ethereum dev is like.

1 [http://www.kingoftheether.com/postmortem.html](http://www.kingoftheether.com/postmortem.html)</comment>


Ask HN: CodePupil - <AUTHOR>

CodePupil teaches you how to code thru unique visual exercises & games.  We recently launched and would enjoy hearing your feedback!
Right now the learning is on rails but here are links to various exercises..
Intro to HTML/CSS exercise... http://codepupil.com/ex.html
Intro to CSS property Background-Color & how it affects HTML http://codepupil.com/ex2.html
HTML/CSS 101 video & typing exercise... http://codepupil.com/ex4.html
One of our games - Code Stitch.... http://codepupil.com/game7.html <comment><USER2> It doesn't _feel_ like I'm learning, it feels like a typical high school quiz. You present information (without ever ensuring I've _learned_ it) and then check if I've "learned" it with a simple input that requires no thought.

Compare it to the codecademy courses, they introduce you to concepts, explain them and then ask you to perform a task based on what you've learned, whereas with yours it shows a bunch of information and doesn't ever explain what it is or why/how it works.

For example the first 2 exercises (labelled #1 and #2) ask me to modify CSS properties, but then on the 3rd you start teaching how to write HTML and CSS. Surely the 3rd should come first, because without _understanding_ what css is how does changing values help teach me anything?

The interface isn't too bad though, so it's a reasonable start, good luck :)

<comment><AUTHOR> Awesome thank you for the feedback - very helpful!

We are definitely looking to change things up - the flow, focus more on our video/typing exercises and or create more games to see what works best!

</comment></comment><comment><USER3> doesn't support Firefox 12.0

<comment><AUTHOR> Thank you!

Today for Mac users we support Chrome and Safari. We are working on fixing the Firefox MAC (works fine in FF on a PC) issue & then later down the road get it working in IE.</comment></comment>


Why is it better to ask for forgiveness than permission? - <AUTHOR> https://www.quora.com/Why-is-it-better-to-ask-for-forgiveness-than-permission?share=1 <comment><USER2> Like all such quotations which are taken out of their natural context (and even their wording is altered), it all depends on many factors. For instance, whether or not the choice comes down to only these two options, whether there is a prominent hierarchy of power at play, is the cost of being a maverick among the conformists majority a justified one, etc.

But if a person has their ego and individualism in check and trust their instinct to be in benefit of their larger group and their goal, then sure it is justified to proceed now and ask for forgiveness later.

</comment><comment><USER3> this is military headset-

-doing something even if it turns out to be a wrong choice is superior to doing nothing. when you do nothing you froze in the face of demand.

thus for lack of supervision, do something other than stand around wondering if its ok to do something.</comment>


Setting up OS X as a scientific programming environment - <AUTHOR> http://www.atmos.washington.edu/~salathe/osx_unix/

<comment><USER2> <http://www.macresearch.org/>

</comment><comment><USER3> Wow. That's really out of date. Trying to use that guide these days will do more harm than good.

<comment><USER4> > I have not updated for each OS X release, but most things here are generic > to any release since 10.2

When was that released ?

This is a specific instance of a more general problem though, my solution when searching for technical stuff is to append the current year to my query (and until march or so the previous year). That seems to take care of most of it.

Nothing worse than reading a whole 'how-to' only to realize near the end the thing is 4 years old.

<comment><USER5> According to Wikipedia, 10.2 was released in 2002.

[http://en.wikipedia.org/wiki/Mac_os_x#Mac_OS_X_v10.2_.22Jagu...](http://en.wikipedia.org/wiki/Mac_os_x#Mac_OS_X_v10.2_.22Jaguar.22)

</comment></comment></comment><comment><USER6> Try out iPython and the matplotlib python module before shelling out for MATLAB. Both are easily installed by macports.</comment>


Ask HN: What are the potential pitfalls of stock options? - <AUTHOR> About to get some stock options. There are probably things I should look into in the agreement but I'm not sure what they are. Can anyone with experience give me some pointers? I'm aware of the meaning of the basic terms (vesting etc.) but not much else. <comment><USER2> This post covers all the basics in excellent detail. Written by an engineer, for engineers: [https://blog.alexmaccaw.com/an-engineers-guide-to-stock- opti...](https://blog.alexmaccaw.com/an-engineers-guide-to-stock-options)

</comment><comment><USER3> Read - Getting Started in Options. Thomsett, Michael C.

Its what I recommend to everyone...! No shortcuts you need to read, read, read..</comment>


Yup, We're All Pretty Small [Photo] - <AUTHOR> http://img19.imageshack.us/img19/2706/spaceb.jpg <comment><USER2> "We succeeded in taking that picture [from deep space], and, if you look at it, you see a dot. That's here. That's home. That's us. On it, everyone you ever heard of, every human being who ever lived, lived out their lives. The aggregate of all our joys and sufferings, thousands of confident religions, ideologies and economic doctrines, every hunter and forager, every hero and coward, every creator and destroyer of civilizations, every king and peasant, every young couple in love, every hopeful child, every mother and father, every inventor and explorer, every teacher of morals, every corrupt politician, every superstar, every supreme leader, every saint and sinner in the history of our species, lived there on a mote of dust, suspended in a sunbeam.

The earth is a very small stage in a vast cosmic arena. Think of the rivers of blood spilled by all those generals and emperors so that in glory and in triumph they could become the momentary masters of a fraction of a dot. Think of the endless cruelties visited by the inhabitants of one corner of the dot on scarcely distinguishable inhabitants of some other corner of the dot. How frequent their misunderstandings, how eager they are to kill one another, how fervent their hatreds. Our posturings, our imagined self-importance, the delusion that we have some privileged position in the universe, are challenged by this point of pale light.

Our planet is a lonely speck in the great enveloping cosmic dark. In our obscurity -- in all this vastness -- there is no hint that help will come from elsewhere to save us from ourselves. It is up to us. It's been said that astronomy is a humbling, and I might add, a character-building experience. To my mind, there is perhaps no better demonstration of the folly of human conceits than this distant image of our tiny world. To me, it underscores our responsibility to deal more kindly and compassionately with one another and to preserve and cherish that pale blue dot, the only home we've ever known."

\--Carl Sagan

</comment><comment><USER3> When you see things like these you have to think that we are not the only life in the entire existence and it is highly doubtful we are the only 'intelligent' life in existence just by probability alone.

<comment><USER4> It's a shame we'll probably never come across intelligent life, unless some incredible developments are made in traveling space.

The Drake Equation ( <http://en.wikipedia.org/wiki/Drake_equation> ) estimates between 1 and 10 intelligent life forms in our galaxy. The unmanned probe Voyager 1 is the furthest Earth born object that we have radio contact with (probably without, as well) and was launched in late 1977. It has traveled less than 2 thousandths of a light year. The nearest star (other than the sun) is over 4 light years away, and our galaxy is something crazy like 100,000 light years across. The nearest similar galaxy is the Andromeda galaxy which is 25,000,000 light years away.

In other news, I just recently finished an astronomy course.

<comment><USER5> I never understood how exactly one figures out these three:

f_l = the fraction of the above which actually go on to develop life

f_i = the fraction of the above which actually go on to develop intelligent life

f_c = the fraction of the above which are willing and able to communicate

For f_l, we've got a sample size of one. For all we know, life as we know it might be a fluke which has an infinitesimal probability of occurring.

<comment><USER6> Yes, but I guess, either we meet the aliens, or we will make our own. (Assuming we do not go extinct.)

</comment></comment></comment></comment><comment><USER7> perhaps my favorite image of all time is this one:

<http://en.wikipedia.org/wiki/File:UGC_10214HST.jpg>

the tadpole galaxy. just looking at all the other galaxies in the background is mind blowing. for best effect, check out the extra huge original:

[http://upload.wikimedia.org/wikipedia/commons/f/f9/UGC_10214...](http://upload.wikimedia.org/wikipedia/commons/f/f9/UGC_10214HST.jpg)

</comment><comment><USER8> I believe that there are other people living somewhere in the space, very very very far from here...

View the distance, I see like it's impossible to reach them, but if we just create a high precision telescope that can capture photos from these places... I'll create a program that automatically capture them and try to detect an aslike earth photo and we'll may be see those other people

this will be imaginary!!!

<comment><USER9> Don't forget about time. What you'll see in imaginary high-precision telescope is "past."

</comment></comment><comment><USER10> A FASCINATING point that runs contrary to this whole awe-yourself-in-front-of- the-omniverse-bullshit is the curious mathematical abstraction that a single human brain contains more _potential_ structural architecture than there are atoms in the universe. This always felt like a big "fuck you" to that "humbling" sense of insignificance the universe seems intent on drilling into my skull....

</comment><comment><USER11> I recommend: <http://www.hulu.com/watch/23946/cosmic-voyage>

</comment><comment><USER12> Welcome to the Galaxy!</comment>


"Open Sourcing" Paiger's Marketing - <AUTHOR> https://drive.google.com/file/d/13ghHqatyfQGb1kt2Kz0LutIvmkREGowm/view?usp=sharing <comment><USER2> This looks more like a marketing stunt in itself (it's only 5 pages of well- designed copy) than an open source playbook.

<comment><AUTHOR> Certainly not my intention at all! I'm learning marketing as I go and this is a blueprint of the things I want to achieve.

I wanted to share how we get on, what works and what doesn't with everyone. We've been growing the business through LinkedIn / Call outreach so far, and it's probably why despite being a successful business, in my opinion we're underachieving on the potential.

I recently had a choice to either outsource marketing or hire, and I chose to hire but junior. Part of the reason I started the business was to challenge myself and I'm really enjoying exploring marketing.

On another note, I'm very happy that you said it's well-designed! I made it in Canva :).

<comment><USER2> Thanks for replying, and please forgive my pessimistic tone! I'll have to check out Canva!</comment></comment></comment>


GDPR Being Used to Try to Disappear Public US Court Docket - <AUTHOR> https://www.techdirt.com/articles/20180920/17133740682/gdpr-being-used-to-try-to-disappear-public-us-court-docket.shtml <comment><USER2> So it's even worse than I expected. First I thought that, obviously, GDPR can increase government censorship, but this example shows that it can be exploited by simple scammers. It's been since forever that new political regulations come out raw and need to be fixed many times before becoming something solid. Makes one wonder if politics can for once release a product of high quality.</comment>


Driverless Hotel Rooms: The End of Uber, Airbnb and Human Landlords - <AUTHOR> https://hackernoon.com/driverless-hotel-rooms-the-end-of-uber-airbnb-and-human-landlords-e39f92cf16e1 <comment><USER2> I don't follow the economics on this - while you're staying in a stationary "driverless hotel room", you're tying up machinery (the vehicle bit) that represents a lot more capital investment than a static room. How is that supposed to be cheaper?

</comment><comment><USER3> In Europe it's cheaper[xx] to leave car driving around (indefinitely on a roundabout etc) than to (short-term) park in the cities or at airports.

[xx]

1h city driving = 20km

fuel @ €10/100km

driving = €2

parking = €3-€3.50

EVs would be <€1/h</comment>


Why Section 230 Is Better Than the First Amendment - <AUTHOR> https://scholarship.law.nd.edu/cgi/viewcontent.cgi?article=1074&context=ndlr_online <comment><AUTHOR> A nice summary of the subtle mechanics of section 230 by Eric Goldman.

Complemented by this overview of what it costs to resolve spurious takedown requests: [https://www.engine.is/news/primer/section230costs](https://www.engine.is/news/primer/section230costs)</comment>


Python should take a lesson from APL: Walrus operator not needed - <AUTHOR> During a recent HN discussion about the walrus operator I came to realize yet another advantage of notation.  I used APL professionally for about ten years, which made it an obvious source of inspiration for an example that, in my opinion, demonstrates why the Python team missed a very valuable opportunity to take this wonderful language and start exploring the judicious introduction of notation as a valuable tool for thought (borrowing from Ken Iverson's APL paper with that title [0]).
To simplify, I'll define the desire for this walrus operator ":=" as "wanting to be able to make assignments within syntax where it was previously impossible":

    if x = 5    # was impossible

    # and now

    if x := 5  # makes is possible
 A more elaborate example given in the PEP goes like this:

    Current:

    reductor = dispatch_table.get(cls)
    if reductor:
        rv = reductor(x)
    else:
        reductor = getattr(x, "__reduce_ex__", None)
        if reductor:
            rv = reductor(4)
        else:
            reductor = getattr(x, "__reduce__", None)
            if reductor:
                rv = reductor()
            else:
                raise Error(
                    "un(deep)copyable object of type %s" % cls)

    Improved:

    if reductor := dispatch_table.get(cls):
        rv = reductor(x)
    elif reductor := getattr(x, "__reduce_ex__", None):
        rv = reductor(4)
    elif reductor := getattr(x, "__reduce__", None):
        rv = reductor()
    else:
        raise Error("un(deep)copyable object of type %s" % cls)

 At first I thought, well, just extend "=" and be done with it.  The HN thread resulted in many comments against this idea.  The one that made me think was this one [1]:

    These two are syntactically equal and in Python there's no
    way a linter can distinguish between these two:

        if reductor = dispatch_table.get(cls):
        if reductor == dispatch_table.get(cls):

    A human being can only distinguish them through careful inspection.
    The walrus operator not only prevents that problem, but makes
    the intent unambiguous.
 Which is a perfectly valid point.  I get it.
Still, the idea of two assignment operators just didn't sit well with me.  That's when I realized I had seen this kind of a problem nearly thirty years ago, with the introduction of "J".  I won't get into the details unless someone is interested, I'll just say that J turned APL into ASCII soup.  It was and is ugly and it completely misses the point of the very reason APL has specialized notation; the very thing Iverson highlighted in his paper [0].
Back to Python.
This entire mess could have been avoided by making one simple change that would have possibly nudged the language towards a very interesting era, one where a specialized programming notation could be evolved over time for the benefit of all.  That simple change would have been the introduction and adoption of APL's own assignment operator: "←"
In other words, these two things would have been equivalent in Python:

    a ← 23

    a = 23
 What's neat about this is that both human and automated tools (linters, etc.) would have no problem understanding the difference between these:

    if reductor ← dispatch_table.get(cls):
    if reductor == dispatch_table.get(cls):
 And the larger example would become this:

    if reductor ← dispatch_table.get(cls):
        rv ← reductor(x)
    elif reductor ← getattr(x, "__reduce_ex__", None):
        rv ← reductor(4)
    elif reductor ← getattr(x, "__reduce__", None):
        rv ← reductor()
    else:
        raise Error("un(deep)copyable object of type %s" % cls)
 This assignment operator would work everywhere and, for a period of time, the "=" operator would be retained.  The good news is that old code could be updated with a simple search-and-replace.  In fact, code editors could even display "=" as "←" as an option.  The transition to only allowing "←" (and perhaps other symbols) could be planned for Python 4.
Clean, simple and forward-looking.  That, to me, is a good solution.  Today we have "=" and ":=" which, from my opinionated perspective, does not represent progress at all.
[0] http://www.eecg.toronto.edu/~jzhu/csc326/readings/iverson.pd...
[1] https://news.ycombinator.com/item?id=21426338 <comment><USER2> I fell like this is a troll so good I'm even questioning if it's really a troll. But in short: you can't require non-ascii symbols for languages which are supposed to be accessible. And <\- won't work since it's a valid syntax in other contexts.

<comment><USER3> _But in short: you can 't require non-ascii symbols for languages which are supposed to be accessible_

While I agree that everything should be ASCII the Python community believes everything should be Unicode, since Python 3.

<comment><USER4> 1\. ASCII is a subset of Unicode. You can be both.

2\. The change in Python 3 is the introduction of a _distinct_ string type specifically because there are things that are _not_ Unicode, namely bytestrings. Several things that could have been implicitly Unicode in Python 2 have become not-Unicode in Python 3 (e.g., the return value of subprocess.check_output).

3\. You enter bytestring literals in ASCII.

<comment><USER5> Python 3 also allows for non-ASCII identifiers.

<comment><USER3> Indeed it's right here [https://www.python.org/dev/peps/pep-3131/](https://www.python.org/dev/peps/pep-3131/)

Seems a few people on this thread don't know Python as well as they think they do

<comment><USER6> Plenty of mainstream languages allow non-ASCII characters in identifiers. Pretty much none of them (at least not one that I've worked with) have non- ASCII delimiters/operators/keywords/reserved words. Knowing non-ASCII characters is supported in identifiers has nothing to do with objecting to non-ASCII symbols in the language syntax.

(Btw plenty of languages tell you non-ASCII characters are supported in identifier names in the first pages of official tutorials, e.g. golang and Swift off the top of my head, so knowing this kind of stuff doesn't make you a language expert.)

<comment><USER3> _knowing this kind of stuff doesn 't make you a language expert_

Never said it did. But I will say for a fact that those who don't know it are not language experts.

</comment></comment></comment></comment></comment></comment></comment><comment><USER7> As someone who's had to teach programming to novices, I woefully underestimated how confusing (and justifiably so) `x = 1` notation is to students who didn't have the benefit of a CS education (i.e. exposure to C/C++/Java, where you eventually take the syntax for granted). I almost considered switching to teaching R, which has the explicit assignment operator `<-` (in addition to the traditional `=`).

I wouldn't mind seeing `<-` in Python. My biggest issue with `←` is that it's too inconvenient to type, as others have pointed out.

<comment><USER8> But programmers normally don't type things out long hand. They use tools for their language which automatically add indents and autocomplete symbols. If the only alternative parse for <\- in Python is "less than minus", it should be fairly straightforward to program any serious IDE to replace <\- with ← in the right context.

Would programming in a language with first class variables like Haskell help you? In Haskell, x = y means "let x and y be synonyms, which the compiler can freely substitute" whereas to mutate a value you have to say something like `put x y` (x is not a variable, it merely refers to a variable). It's approach is so different from standard that it explodes my head but I wonder if it's more approachable to nubs.

</comment></comment><comment><USER9> Unless I misunderstand what you are proposing, if you are going to deprecate both = and := in favor of ←, why not simply deprecate = in favor of := ?

<comment><USER10> This was my first thought as well. Of course, getting rid of `=` would make the conundrum about moving Python from version 2 to version 3 seem like a quiet evening at home, but there is no practical reason why `:=` wouldn't work in all contexts as `=` (currently, a simple assignment is a syntax error).

<comment><USER11> Actually I reckon it would be an easy technical change - it's almost a find and replace (I think)! Emotionally, I don't think people, in general, would handle it well though. The Python 2 to 3 was mostly because it was not possible to automatically convert from the former to the latter

</comment></comment></comment><comment><USER12> APL's assignment operator is very strange to me; simple array of numbers assigned to 'nums':

        nums←1 2 3 4 5

Then catenate (append) a 6 to the right side end of it:

              nums,←6
              nums
        1 2 3 4 5 6

Now use position-reversed catenate to append a 6 to the left side end of it; how does that work?:

              nums,⍨←6
              nums
        6 1 2 3 4 5 6

Now use addition-assign to add 2 to each item; how:

              nums+←2
              nums
        8 3 4 5 6 7 8

Now assign a single value into non-consecutive locations using array subscript notation on the left side of the assignment; that's unusual:

              nums[2 4]←99
              nums
        8 99 4 99 6 7 8

Now do a max-assignment to replace values which are less than 7 with 7:

              nums⌈←7
              nums
        8 99 7 99 7 7 8

Nums reset to 1 2 3 4 5, laminated with 'hello' to pair each number with a letter:

              nums←1 2 3 4 5
              nums,[0.5]'hello'
        1 2 3 4 5
        h e l l o
              nums
        1 2 3 4 5

Want to do that and update nums? Stick an assignment in there:

              nums←1 2 3 4 5
              nums,[0.5]←'hello'
              nums
        1 2 3 4 5
        h e l l o

It seems so _odd_ that this can pull values out and modify them with the value being assigned and put the result back, assigning to 'nums' and modifying it, while keeping the shape and structure of it.

<comment><USER13> For my amusement mostly, here's the Julia translation:

        nums = [1,2,3,4,5]
        nums ↑ 6              #  const ↑ = push!; const ⤉ = pushfirst!
        nums ⤉ 6
        nums .+= 2            # addition-assign to add 2 to each item
        nums[[2,4]] .= 99
        nums
        nums ⩠ 7              #  ⩠(a,b) = a[a.<b].=b
        nums

        nums = [1,2,3,4,5]
        nums ↔ "hello"        #  ↔(a,b) = hcat(collect(a), collect(b))
        nums = nums ↔ "hello" # re-binding nums

</comment></comment><comment><USER6> = is not an operator. It's part of the assignment statement[1] syntax.

Here's the full list of Python operators[2] as of 3.8:

        +       -       *       **      /       //      %      @
        <<      >>      &       |       ^       ~       :=
        <       >       <=      >=      ==      !=

The post is probably just trolling, but still.

[1] [https://docs.python.org/3/reference/simple_stmts.html#gramma...](https://docs.python.org/3/reference/simple_stmts.html#grammar- token-assignment-stmt)

[2] [https://docs.python.org/3/reference/lexical_analysis.html#op...](https://docs.python.org/3/reference/lexical_analysis.html#operators)

</comment><comment><USER14> In summary, Python needs it to be written := and not ← because the latter is not ASCII and not on standard keyboard layouts. And it cannot be written <\- either because that would redefine what "if x<-5" currently means, ie. "if x < -5".

Interestingly, the PEP considered the close alternatives "if x from -5" and "if -5 -> x": [https://www.python.org/dev/peps/pep-0572/#alternative- spelli...](https://www.python.org/dev/peps/pep-0572/#alternative-spellings)

</comment><comment><USER15> That's not on my keyboard. Assuming you are serious, if you think a mainstream language like Python would ever accept an operator that can't be typed then you're mistaken.

</comment><comment><USER16> I wanted to just drop a comment that I appreciate the time you took into this write up _with_ code examples. It made understanding your POV very easy.

<comment><AUTHOR> Thank you. I appreciate your comment very much.

</comment></comment><comment><USER17> I like the trade-off C/C++ compilers (with a reasonable amount of warnings set) made... warn about constructs like "if (a=b)" unless the user adds an extra pair of parentheses, like "if ((a=b))".

</comment><comment><USER18> It gets even better. := is an abandoned assignment operator in R (derived from ←). It is still in the syntax with no default implementation. A few packages use it (data.table, dplyr, wrapr) for quoted assignment tasks.

</comment><comment><USER19> Python simply should never had = as assignment, and always used := just like pascal does. Using = for assignment and == is part of C's toxic legacy.

</comment><comment><USER20> I like it! Reminds me of one of my favorite Haskell extensions: [https://wiki.haskell.org/Unicode-symbols](https://wiki.haskell.org/Unicode- symbols)

I mean, I've never attempted to actually type that beastly notation during programming, but it does print out quite beautifully!

<comment><USER8> It's not beastly. Just a few :imap's will get you there in vim.

</comment></comment><comment><USER21> Smalltalk (among other languages of the 1960s and 1970s) had a left arrow symbol as the assignment operator. 95 was ← instead of _ in ASCII pre-1967.

Also, anyone pretending to be a competent computer programmer while whining about being unable to use Unicode in your text editor, please find a new hobby.

<comment><USER8> > Also, anyone pretending to be a competent computer programmer while whining > about being unable to use Unicode in your text editor, please find a new > hobby.

Yes. It seems like programmers are people who make the technology of the next generation using the technology of the previous generation.

</comment></comment><comment><USER22> I think historically the "←" was preferred but many keyboards (card punch machines) did not have the "←" so the used the ":=" as a simplified (more commonly accessible) version of "←"

</comment><comment><AUTHOR> What to say, imagine my surprise seeing this on the first page of HN last night. Got my 15 minutes, I guess.

As is often the case, the responses contain a bunch of hateful stuff as well as people who actually try to engage with the ideas presented in a constructive manner. To state the obvious: I am not changing anything, so chill people.

Now to address some of the responses, starting with the best:

> I wanted to just drop a comment that I appreciate the time you took into > this write up with code examples. It made understanding your POV very easy.

Thank you. Some of the comments lead me to believe we might have created a society where everything needs to be done in 140 characters. I am old school, arguments needs to be presented with enough background information for the reader to understand the perspective that led to the proposal or conclusion. Without that we are all just screaming things and waiting to see what sticks.

> APL is an almost perfect textbook example of write-only code.

Sure, just like math and musical notation are write-only. The only people who say stuff like this are those who don't know a thing about APL. There are two major APL compilers still on the market, the licenses for these cost in excess of $2,500 per year. If APL was "write-only" these two companies (IBM and Dyalog) would have shelved these products decades ago. The fact is that, while not mainstream (and for good reasons), APL is still in use and large codebases are being maintained and expanded. Historically this has mostly been in the financial sector.

Point of interest: My last large APL application was for a hardware/software system used during the race to decode the human genome. Among other things, my application interfaced with the hardware and was used to search for genomes in the sequences being produced. It also produced reports, graphs, managed the database, etc. The hardware portion was coded in Forth.

> APL's assignment operator is very strange to me

Thanks for a very detailed comment with code examples. I think I can help clarify the basic ideas.

The first thing to do is realize the assignment operator isn't passive but rather an active component of a statement being evaluated from right to left. That last part is important, APL evaluates from right to left, the only precedence rule being parenthesis are evaluated first. One could say indexing is also an exception but indexing "variable[23]" is a single monolithic expression that isn't separable, so it is evaluated as one item, not two.

So, if A and B are defined as vectors (APL's name for one dimensional arrays), each consisting of a few random values between 1 and 10:

        a ← 5?10
        b ← 5?10
        a
        1 10 3 4 9
        b
        9 5 6 1 4

We can, for example, concatenate them like this:

        a,b
        1 10 3 4 9 9 5 6 1 4

Again, right-to-left evaluation says "take b, set it up to concatenate to something, ah, we are concatenating to a, another vector".

However, we can modify this process by giving the interpreter further instructions within the assignment. The simplest one is where we select, or index, the vectors and only grab specific elements to concatenate. I'll define a pair of new vectors to make this easier to see:

        c ← "ABCDE"
        d ← "abcde"
        c
        ABCDE
        d
        abcde

With this:

        c,d[1]
        ABCDEa

        c,d[2]
        ABCDEb

        c,d[2 5]
        ABCDEbe

        c[2 5],d
        BEabcde

        c[1],d
        Aabcde

        c[2],d
        Babcde

The first few are the obvious cases, where we pull elements out of the right side vector and concatenate them to the left side vector. In the other cases we take the entire right side vector and concatenated to a subset of elements of the left side vector. I'd say this forms the basis for understanding the expressions you presented.

The above statements can be combined with assignment in order to do the work more efficiently, plain concatenation being the simplest case:

        e ← "mnlop"
        f ← "MNLOP"
        e
        mnlop
        f
        MNLOP

        e,←f
        e
        mnlopMNLOP

Again, right-to-left, we have vector "f", it will be concatenated to something, the assignment is a concatenation, it is concatenated and assigned to vector "e".

In other words, one can specify operations as part of the assignment. Because evaluation is from right to left, it stands to reason that the add-on operation has to be specified after you told the interpreter you are going to assign. This might be strange from the context of other paradigms but it makes complete sense once you grok the simple "everything is right-to-left" idea. If I were to propose how to read something like ",←" I would say "assign with concatenation"; "+←" would be "assign with addition".

We can do even more. It's easier to show this with multidimensional arrays:

        g ← 3 4 ⍴ "ABCDEFGHIJKL"
        h ← 2 4 ⍴ "abcdefgh"
        i ← 3 3 ⍴ "123456789"

          g
        ABCD
        EFGH
        IJKL

          h
        abcd
        efgh

          i
        123
        456
        789

The first statement reads something like this: Take the character vector "ABCDEFGHIJKL" we are going to reshape it "⍴" using a two dimensional numeric vector "3 4", thereby creating a 3x4 matrix and assign it to "g".

Note that "i" contains characters, not numbers, so if I try to add 1 to every value I get an error:

        i+1
       DOMAIN ERROR

Now I can do a few things, for example:

Concatenate g and h along the first axis (they both have four columns):

          g,[1]h
        ABCD
        EFGH
        IJKL
        abcd
        efgh

Of course, all I have to do is add the assignment operator to change g:

          g,[1]←h

          g
        ABCD
        EFGH
        IJKL
        abcd
        efgh

As you can see, this is a natural extension of the syntax and the order of evaluation.

We can concatenate along the second axis if we use g and i:

          g,[2]i
        ABCD123
        EFGH456
        IJKL789

Assignment works just as well in this case:

          g,[2]←i

          g
        ABCD123
        EFGH456
        IJKL789

This syntax does have limitations. For example, what if I actually wanted to end-up with this?

        AEIae
        BFJbf
        CGKcg
        DHLdh

Well, we transpose the matrices during the concatenation, this works:

          (⍉g),[2]⍉h
        AEIae
        BFJbf
        CGKcg
        DHLdh

This does not work:

          (⍉g),[2]⍉←h
        SYNTAX ERROR

I don't recall why this is so. I think it has to do with starting to gobble-up piles of memory to keep intermediate results or something like that. You also end-up executing transpose (⍉) twice, which is inefficient. I don't remember.

This is a case where you have to resort to the simpler case:

          ⍉g,[1]h
        AEIae
        BFJbf
        CGKcg
        DHLdh

With assignment:

          g ← ⍉g,[1]h
          g
        AEIae
        BFJbf
        CGKcg
        DHLdh

In other words, concatenate along the first axis, transpose and then assign.

I got a little off track here with respect to the idea of using a different assignment symbol for Python but I thought your comment and implied question was one of the most interesting ones in the thread, which made it fun to address. I hope this helps. Here's a very useful resource:

[https://www.dyalog.com/uploads/documents/MasteringDyalogAPL....](https://www.dyalog.com/uploads/documents/MasteringDyalogAPL.pdf)

Ah, I do have to address one more:

> That's not on my keyboard.

Really people? It's 2019. I was typing APL characters back in the 1980's on DEC and Tektronix terminals and the IBM PC. Imagine the audacity of proposing that one can actually enter things other than ASCII or what's on the keyboard in 2019.

On the free NARS2000 interpreter you enter "←" very simply with "Alt [". In fact most APL characters are entered this way. The reshape operator, rho, "⍴", is entered using "Alt r". Not that complicated. I am sure this is well within the brain capacity of most mortals, it was so over 30 years ago.

Final thought: One of the interesting things about using APL long enough to internalize it (something like what happens when you don't think about reading musical notation any more and just see the music) is that you start thinking and seeing objects and their manipulation in your brain.

The analogy that comes to mind is what I do when I run SolidWorks. I can extrude, cut, scale, rotate, cut holes, create solids from rotated profiles, slice, animate and manipulate complex assemblies of three dimensional objects visually and with ease. The --imperfect-- analogy to conventional programming would be something like AutoCAD, which I have been using since version 1.0 in the dark ages. It's a flat 2D world. Yes, it can do 3D but the cognitive load and lack of tools makes it a terrible tool for working with three dimensional solid objects and assemblies.

Live long and prosper.

</comment><comment><USER23> R have <\- operator and a quick google search Python currently isn't using <-.

So being pragmatic I would choose <\- over ←.

<comment><USER24> Not going to work:

        >>> x = -3
        >>> if x <- 2:
        ...     print 'yes'
        ...
        yes
        >>> x = 5
        >>> if x <- 2:
        ...     print 'yes'
        ...
        >>>

Yes, those are ugly examples of bad use of whitespace, but making '<-' mean assignment would be a backwards-incompatible change.

(In case it isn't clear, that evaluates as "if x is less than negative two".)

<comment><USER25> Didn't C have syntax holes like this?

like c=+1 --> c = +1 or c =+ 1

<comment><USER26> Originally, in version 0. It was quickly changed to c += 1 to fix that.

</comment></comment></comment></comment><comment><USER27> I'm annoyed you buried such a simple suggestion after so many examples and pointless tangents. The reason this isn't done should be obvious to you: your proposed operator isn't ASCII, unlike everything else in the syntax. (I have to call it "your proposed operator" because I don't know or care how to type it on my iPhone — so it's already causing problems.) The nearest ASCII rendering, `<-` as used in R, is syntactically ambiguous. You should have started this post with your actual proposal, instead of prefacing it with pompous language and details.

<comment><USER28> FYI, it's called Bottom Line Up First (BLUF), and comes from military.

<comment><USER29> [https://en.wikipedia.org/wiki/Inverted_pyramid_(journalism)](https://en.wikipedia.org/wiki/Inverted_pyramid_\(journalism\)) probably predates the US military usage.

</comment></comment></comment><comment><USER30> Python and APL are almost opposite extremes of the readability spectrum. APL is an almost perfect textbook example of write-only code.

I would be extremely weary about borrowing syntax from APL or J.

</comment><comment><USER31> Great, but I have no way to type that on my keyboard, is it <\- ?

</comment><comment><USER32> := wasn't needed. = is just fine.

<comment><USER33> Usually you don't want to assign things in IF statements. Most of the time "if (a = b)" is intended to be "if (a == b)", hence the need for the walrus operator.

<comment><USER34> Ate there any good reasons to assign things in an if statement?

<comment><USER35> Scope the assigned variable to the if statement.

<comment><USER36> If so, it might be a code smell to consider defining a separate function.

<comment><USER37> So far, all the suggested usages of := have a code smell about them.

</comment></comment></comment></comment></comment></comment><comment><USER38> How do I type a ←?

<comment><USER39> If you are inside of Emacs you could change the input method to TeX and type \leftarrow, or press C-x 8 ENTER and write LEFT ARROW, or enable the Compose key system-wide and do Compose + < \+ -, or copy-paste it, or buy a new keyboard, or curse whoever thought that building a programming language out of modern hieroglyphs was a good idea and then jump ship to Julia. Or something.

<comment><USER40> Just my 2 cents: I install agda2-mode (official emacs mode of Agda programming language) which supports all sorts of mathematical shortcuts. This way you can type unicode without C-x 8 ing since it's automatic once you type \leftarrow SPACE

<comment><USER39> I just use the builtin `abbrev` for that. I took the idea from [http://home.thep.lu.se/~karlf/emacs.html#sec-7-2](http://home.thep.lu.se/~karlf/emacs.html#sec-7-2) , and defined a bunch of global abbrevs under the `8` "namespace", for greek letters, mathematical symbols, and random unicode characters (a few ASCII ones, too).

One cool thing about `abbrev` is that it can also expand a _function_ instead of a sequence of characters - e.g.,

      ("9ts" "" (lambda () (insert (format-time-string "%Y-%m-%d %H:%M"))))

It's pretty handy when I access emacs from Termux, as I don't have to bother with switching the input method or long pressing (which is an issue even with Hacker's Keyboard, trying to insert `\\`).

</comment></comment></comment></comment><comment><USER41> no</comment>


Even Famous Female Economists Get No Respect - <AUTHOR> http://www.nytimes.com/2015/11/12/upshot/even-famous-female-economists-get-no-respect.html?_r=0 <comment><USER2> To be fair, the last time the worlds leading economists listened intently to a woman, we got Objectivism. There, that should piss off feminists AND libertarians!</comment>


Ask HN: Prefer job matching site to exclude 3rd-party external recruiters? Why? - <AUTHOR> <comment><USER2> Yes. In my experience such recruiters consume job-seekers' time without providing any increased chance at employment, and are of generally poor quality.

<comment><AUTHOR> Thank you @Rekaiden.

</comment></comment><comment><USER3> Recruiters ads are fine _if_ they include the name of the company they are hiring for. I think stack overflow jobs has that policy.

<comment><AUTHOR> Thank you @chrisbennet. The site I'm working on isn't a job posting board approach. Instead, job seekers create anonymous profiles (like LinkedIn, but very different content) and get anonymously pinged 1x when recruiter has a position that fits. Do you prefer only internal recruiters, or would 3rd party recruiters be welcome?

<comment><USER3> I don't use recruiters anymore but when I did, I didn't care as long as they represented the company. I didn't like the ones who would call from 1000 miles away and didn't know about the position they were recruiting for and didn't know or care if I was a match - no I am not interested in moving to another state for less than I make now.

Sounds like your idea is to provide "sales leads" to recruiters. The thing is, when I was a job hunter I wasn't interested in throwing my info out there for every recruiter to spam me. I wanted to talk to them first or at least see the job description and _then_ decide if I wanted to work with them.

Suppose you were looking for a car; would you want to give your information to a 3rd party to sell to car dealers so they could call you and try to sell you a car? You might but you'd also be very leery of how that information would be used (you know it's going to be sold to anyone who will pay for it). "Oh, we would never sell it to people that will call you at 9pm from and Indian call center."

<comment><AUTHOR> Thank you @chrisbennet. Your point distinguishing recruiters representing a company for a specific job is very helpful. Stack Exchange has this (great) requirement.

You're 100% right about concern over how job seekers' information is used. I know that's why so many developers aren't on LinkedIn - to avoid all the inquiries.

That's exactly why every profile is anonymous on Enlightened Jobs, and why profiles are based on exactly what a candidate is good at and interested in doing, what they want to learn, technologies & industries they're drawn to, and what they want to avoid in their next job. No resume.

The idea is that if recruiters sift through anonymous profiles and find a terrific fit, based on these key factors, the recruiter then shares details of the job with the (still anonymous) candidate.

ONLY then, IF the candidate chooses, do we connect them (a "handshake").

Having recruiters pay a healthy amount per handshake discourages spamming. Ratings of the recruiters by candidates should help too (similar to Google's quality score).

Any thoughts or advice?

<comment><USER3> Sorry for the delay, just noticed your replay.

So what you're offering is more like an escrow (not a perfect analogy I know). That sounds much better to me as an applicant than the "sales lead generator" as I previously pictured it.

I see a couple of challenges:

1) As an applicant, at the end of the day, it all comes down to trust. When a company harvests something of value from one party and sells it to another, the tendency is to do what the (paying) customer wants. "We'll pay you big bucks if you give us _all_ your sales leads."

2) Chicken and egg problem: For the service to valuable to either party, there needs to be a certain critical mass. Even with the trust and reach that Stack Overflow Jobs has, it might not be enough. I've had my profile on SOJ for a year or 2 and I've never heard a peep from anyone. [http://stackoverflow.com/story/chrisbennetcv](http://stackoverflow.com/story/chrisbennetcv)

I think people think about fixing the "hiring problem" from the perspective of job seekers. The simple fact is if job seekers aren't paying you, _they aren 't your customers._

<comment><AUTHOR> Thank you (yet) again, @chrisbennet. I feel like I owe you tuition.

I'm getting "page not found" text on your profile at [https://stackoverflow.com/story/chrisbennetcv](https://stackoverflow.com/story/chrisbennetcv). Maybe I need to be logged-in as a hiring person on SO, instead of just as a user (with my unimpressive 84 rep points).

I hadn't thought about this enough, but you're right about trust being critical and very hard to establish. I don't have a good solution yet, but at least you've helped me see this key problem.

While money matters, I don't fully agree that "if job seekers aren't paying, they aren't your customers." Instead of money, they are paying with their time and coveted profile information, without which EJ's is worthless.

IMO, Airbnb has done a good job solving from both sides of their market, even though (I think) the renter is who pays them.

Thank you again. Please let me know if I can ever help you or your friends (user testing, survey, car wax, etc.) - mgav [at] enlightenedjobs.com

<comment><USER3> Good luck!

</comment></comment></comment></comment></comment></comment></comment><comment><AUTHOR> Disclosure: I'm NOT a recruiter, but I have a startup in this space - [https://enlightenedjobs.com](https://enlightenedjobs.com) \- and I'm wrestling with this question. Thanks for your help.</comment>


Ask HN: Anyone Work at PayPal? - <AUTHOR> Background: My dad's business is using the (legacy) Adaptive Payments API. When a payment is made PayPal usually sends two IPN messages, one 'Web accept' and one 'Adaptive Payments' IPN.
Recently this second IPN is not being sent for any payments, causing payments to not be processed and customers to be rightfully annoyed.
He's tried to contact tech support but as usual is receiving scripted replies that fail to understand the issue or its severity and just say the account is fine.
Is there anyone that can get this escalated to the right person?
Thank you!
Edit: The account in question is a Singapore-based account, but there is also a UK-based account that receives fewer payments, so he's not sure if that account has the same problem or not. <comment><USER2> I don't have any context on Adaptive Payments API, but I have forwarded what you posted to our internal support. I sincerely hope you get this resolved, especially since this is directly affects his business.

Edit: Sounds like this issue is identified and a fix is coming.

<comment><AUTHOR> Thank you so much, I'll pass on the message. Really appreciate it!</comment></comment>


Configuring Ansible - <AUTHOR> https://www.redhat.com/sysadmin/configuring-ansible <comment> yjftsjthsd-h It continues to surprise me that the official documentation seems to prefer using global configuration in /etc/ansible; it always seemed vastly preferable to me to put it in a repository under my home directory. This does mean that I have to put in a config file to point at my inventory, but that's a trivial one time change and now I don't have to touch system configuration owned by root every time I want to change my inventory or whatever.

<comment><USER2> Same here. I re-worked our config to be an entirely self contained git repository with it's own ansible.cfg in the root which contains:

[defaults] inventory = ./inventory/hosts

<comment> yjftsjthsd-h In case it's useful to you: You can have that be a directory.

        [defaults]
        inventory=./hosts.d

(This is what I use)

</comment></comment></comment><comment><USER3> I never get guides like this. This is a configuration management tool, and they're telling people to manually bootstrap their systems to use it. Great, you've helped someone do the thing the tool is intended not to do.

First of all, no, don't create an ansible user. Never use generic shared accounts. I mean, you _can_ , but you _can_ also just SSH into root. (You know what the difference between using the _-B_ option and SSHing into root are? There is none.)

Second, either use sssd to enable an SSO system, or bootstrap all your hosts with an SSH CA so you don't have to constantly run jobs to add SSH public keys to all your nodes, which when you eventually start using ephemeral nodes, won't work at all unless it's using a shared account; see above paragraph.

Third, if you're going to use a plaintext inventory, generate it on the fly, and definitely don't write it to a single global root-owned file, because you may want to update it some time, and you may be running ansible more than once on that host at that time.

Fourth, they didn't really go over the anguish of trying to manage system- installed python packages and running Ansible. You need to install and run Ansible in a virtualenv with pinned versions, don't use a system-packaged version.

Five, don't use any complicated logic in your tasks or playbooks, or later you'll be kicking yourself because of how much of a huge pain in the ass it is to debug playbooks and tasks and inventories and filters and the non-standard fake YAML config format and a million other things. Keep it really really simple.

Six, run ansible-pull on a cron job with random jitter every 10-20 minutes, because your system and code _will_ deviate over time, and you won't know it until you try to run Ansible again after 3 months and everything breaks. You'll also want a system to alert you when Ansible fails so you can find out what broke.

Seven, try to make any Ansible you use obsolete by baking Docker images, VM images, system packages, and other versioned immutable infrastructure artifacts. If you start out with that in mind, you may not ever have to touch Ansible once, and may even eventually achieve immutable infrastructure, and what a wonderful world that is. (I'm serious... everyone should be working to remove configuration management from their stack wherever it's feasible)

<comment><USER4> > You'll also want a system to alert you when Ansible fails

Indeed. This is what makes a configuration management tool work in practice.

</comment></comment><comment><USER5> I've tweeted a few Ansible tips and gotchas over the years, covering some of the corner cases and a few neat tricks

[https://twitter.com/search?q=from%3Amoreati%20ansible%20tip&...](https://twitter.com/search?q=from%3Amoreati%20ansible%20tip&f=live)

[https://twitter.com/search?q=from%3Amoreati%20ansible%20gotc...](https://twitter.com/search?q=from%3Amoreati%20ansible%20gotcha&src=typed_query&f=live)

</comment><comment><USER6> We use Ansible to orchestrate our infrastructure and application deployment. Only in one particular stack are we using ansible how it is "supposed" to be used (SSH:ing into a machine and updating/installing Prometheus).

The infrastructure is provisioned using 90% CloudFormation and the other 10% is Ansible commands for when CF is not enough or when AWS CLI commands allows for better flexibility (i.e. generating SSH keys for EC2 machines and storing the private key in a central store). We make heavy use of the `cloudformation` Ansible-module.

<comment><USER7> Are you using Ansible to orchestrate the setup of a particular EC2 instance, or to actually provision AWS resources, or both? If you're doing AWS resources, where is ansible running from?

I have a few deployments using CloudFormation, and in those use CloudFormation::Init [1] to actually setup the EC2 instances (deploy packages, apps, configure local firewall, etc). This kind of grew over time and now involves some (mildly) complex bash and/or powershell scripts which do things that could probably be done with Ansible, but when I started it wasn't obvious how complex that part would eventually get. The split of Ansible vs CloudFormation responsibility also wasn't clear to me, and I favored the simplicity of a single tool, so even though I considered using Ansible, I ended up sticking to CloudFormation::Init.

In retrospect, CloudFormation::Init is pretty much a stand-alone tool, and the only connection it has to AWS and AWS CloudFormation is really just that it reads the metadata from the EC2 API to get its actual configuration (which is just a JSON or YAML blob).

[1] [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGui...](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws- resource-init.html)

<comment><USER8> We just use ansible for the provisioning of EC2 instances, and Terraform for the actual orchestration of the resources. Userdata is used to call ansible- pull. Theoretically we can use Ansible for everything, but Terraform's planning makes the runs a lot safer, and in general it just seems a little nicer for orchestration.

</comment></comment></comment><comment><USER9> I just finished setting up Ansible to manage a bunch of Windows laptops. I basically just followed the example of Dag Wieers here[1][2], except that additionally every laptop is roaming with unstable IP addresses. So I used PageKite[3] to deal with that, although it would have been much easier if ansible-pull worked on Windows.

I know every experienced Windows admin would probably look poorly on my setup, but it feels really good to finally have some level of automation in managing these machines. It took me years to figure out a sane strategy under constraints like: OEM and retail software licenses only, employees retain admin privileges, no corporate network or VPN, unstable IP addresses, and (perhaps most importantly) no budget.

With constraints like that, it would also be a pretty good setup if you provide tech support to family and friends, as long as they trust you to backdoor their laptop.

[1]: [https://www.ansible.com/managing-windows-desktops-with- ansib...](https://www.ansible.com/managing-windows-desktops-with-ansible) [2]: [https://github.com/crombeen/ansible](https://github.com/crombeen/ansible) [3]: [https://pagekite.net/](https://pagekite.net/)

<comment> yjftsjthsd-h > PageKite

Thanks for the pointer. They certainly have the most fun pricing page I've seen to date: [https://pagekite.net/signup/?more=bw](https://pagekite.net/signup/?more=bw)

</comment></comment><comment><USER8> We use ansible-pull to decentralize our Ansible runs as much as possible, but we also use Hashicorp Vault's SSH Key Certificates functionality to make sure our SSH keys are short-lived when we run it from CI. The last thing we want is CI with a bunch of root level keys on it!

<comment><USER10> you seem to be a big proponent of ansible-pull. are any of your use cases/implementations publicly available, I'm really interested to see how people are using ansible-pull in production.

I'd like to do something similar, currently we use a mix of ansible tower (which I don't love) and ansible runs from local machines to manage the infrastructure. I'd rather it all be tied into terraform though, so that we have a single place to manage changes from

<comment><USER8> We don't have anything publicly available unfortunately, but we call ansible- pull the instance userdata to configure the host on startup. IAM Policies and Vault integration are used to grant the host access to certain secrets needed by the ansible run.

</comment></comment></comment><comment><USER11> Is it OK if I plug my (free; use a fake email to sign up if you like) Ansible Crash Course here? Might be useful to some folks.

It'll be getting updated with PDF versions of the material and quizzes soon enough.

</comment><comment><USER12> In my corporate environment, I've played a bit with Puppet. Ansible looks to cover much of the same ground. Are there any compelling reasons to use one over the other?

<comment> core-questions I'm deeply experienced with Chef and have been using Ansible for some newer projects.

Plusses: \- Supported Ansible modules are usually more reliable and more clearly defined in terms of how they'll function than community cookbooks for Chef are \- Upgrades between versions go smoothly \- People can just go read your YAML and figure out what it's going to do

Minuses: \- It's not code, so if you want to do something more programmatic, you're going to end up with something ugly compared to what you can do in Chef/Puppet's Ruby DSL \- It's still a bit immature in terms of comparison to Chef's server offering (Ansible Tower is pretty useless), and the Kitchen/Vagrant/Serverspec stuff is also not as advanced.

Ansible seems to fit well as a replacement for the Chef Zero use case of fire- and-forget provisioning - works well inside Packer or inside of Terraform via a null_resource, but I don't tend to find myself wanting to use it for long- lived machines that in the Chef world benefitted from continually running the cookbooks to help keep config in sync.

<comment><USER13> > It's still a bit immature in terms of comparison to Chef's server offering > (Ansible Tower is pretty useless)

Meh, I really like Tower, but maybe that depends on what you're used to.

> It's not code, so if you want to do something more programmatic, you're > going to end up with something ugly

this is true, ansibles DSL has its limits and the developers are pretty clear that there are some things that are too complicated for its yaml based syntax. 99% of use cases its great for, if you want that extra 1% then you have to write your own ansible modules (which is actually reasonably straightforward). I dont know chef but puppet has become more and more complicated over the years chasing the more advanced use cases and in many ways thats moved it away from a tool for sysadmins towards a being a tool for specialists so I think Ansibles outlook makes more sense. YMMV.

<comment> core-questions > I dont know chef but puppet has become more and more complicated over the > years chasing the more advanced use cases and in many ways thats moved it > away from a tool for sysadmins towards a being a tool for specialists so I > think Ansibles outlook makes more sense. YMMV.

Yeah, I concur. There aren't too many cases where I can't work around the lack of programmability with some creative templates or what-have-you.

(I wonder if I could render an Ansible task file from a template and then include it...)

<comment><USER14> Maybe I'm missing something, but I've got a lot of mileage out of custom Ansible modules and callback plugins. Maybe that's what you're looking for.

<comment> core-questions Learning Python is never going to be something I'm looking for. Too much brainpower invested in Ruby now to switch...

</comment></comment></comment></comment></comment></comment><comment><USER15> How do you test your playbooks targeting bare metals during development? So far I'm using docker but the official base image is very different from the official ISO, that's kinda annoying (no ssh, no python, not even ps). I'm thinking about using Vagrant. I also saw a framework called Molecule but it's based on docker so I guess it'll be the same problem.

<comment><USER16> I just (in the last two weeks or so) started using Molecule. It took a bit to get everything set up and figured out but now that I've got things the way I want them it really is pretty awesome.

I'm using it with Vagrant and VirtualBox at the moment, just because that was the easiest way -- if you aren't already using Docker, that is -- to get started (due to available documentation, examples, etc.) but eventually I'd like to use both Docker and my ESXi lab for testing.

Testing w/ bare-metal was always a pain in the ass as I'd constantly need to "reset" the hosts to a specific "known good" starting point. I have everything set up for automated network installs, though, so it only takes 5 minutes or so to wipe and reinstall a physical host.

Now, I'm doing all my Ansible testing against VMs on VirtualBox, running from an image generated by Packer. Those images use the exact same preseed.cfg file I use on the bare-metal host, making it _sooooo_ much easier. I do all my testing on the VMs, make sure everything is correct, and then run it against the physical host once for "verification".

<comment><USER15> Thanks, you confirmed what I was thinking. That's exactly the setup and workflow I'd like to have. :)

<comment><USER16> Feel free to reach out (my username at Gmail) if (when) you run into issues or have any questions. I'm still learning new things as I go but I'm glad I decided to go down this path (and I'm happy to help if I can). It really is worth the time and effort!

</comment></comment></comment></comment><comment><USER17> I'm using Ansible inside a Docker container at work, which has worked beautifully for me.</comment>