Ask HN: Review my WoW guild management app - <AUTHOR> http://beta.srsguild.com/

<comment><AUTHOR> If you want to play around without actually creating an account you can log in with: email@example.com / demo.

<comment><USER2> Looks good! I submitted feedback using the demo account but I'm not sure it'd make it to you. What I'd like to see added..

\- Support for other ranking systems such as EPGP. \- Integration with existing guild sites (or Facebook?). \- Links to profiles on the Armory. \- Support for an addon so that events on the calendar sync with the game itself. Ideally, it would link to the in-game calendar, but I'm not sure that is possible. \- Additional options on creating an event. Min/max per class or per group (tank, heal, DPS), minimum rank, private invites, private events, or something similar to (but not quite) GearScore based on their Armory profile.

The two major hurdles for adoption will be the in-game calendar (convincing people to use this over it) and existing guild websites (integration).

<comment><AUTHOR> Yeah, it would be really nice if Blizzard would give the Armory a bit more read/write functionality so that I could push and pull events to the calendar through that. But I think you're right that I would have to do that through an addon.

I do plan to add EPGP support to the balances section, that's actually pretty high on my list.

Thanks for your feedback!

</comment></comment></comment><comment><USER3> The panda seems quite serious.</comment>


Alan Lomax's Massive Archive Goes Online (2012) - <AUTHOR> http://www.npr.org/blogs/therecord/2012/03/28/148915022/alan-lomaxs-massive-archive-goes-online

<comment><USER2> This article is from 2012. It's definitely exciting that the Lomax archive is online — but it could be worth updating the title.

On another note, if you're interested in Lomax you might also be interested in Sublime Frequencies [1], Awesome Tapes from Africa [2] or the Nonesuch Explorer Series. Both are mostly focussed on music outside the US, but they all seem to capture something similar to what Lomax was after.

1 - [http://www.sublimefrequencies.com/](http://www.sublimefrequencies.com/) 2 - [http://www.awesometapes.com/](http://www.awesometapes.com/)

<comment><AUTHOR> Jeez, I can't believe I missed that it's from 2012 - thanks for pointing that out. A friend sent me the link this morning and I just assumed it was recent. As it happens I was just reading an article about this type of time-warp effect (in this case, Nigerian novelist Chinua Achebe's 2013 death getting circulated on social media last week like it had just happened):

[http://thenewinquiry.com/blogs/zunguzungu/chinua-achebe- no-l...](http://thenewinquiry.com/blogs/zunguzungu/chinua-achebe-no-longer-at- ease/)

</comment></comment><comment><USER3> If you never heard of Lomax, you might still have heard some of his recordings, which where extensively sampled in Moby's Play.

<comment><USER4> Yes, Moby integrates his recordings very well with modern music.

</comment></comment><comment><USER5> If you're interested in this, you should check out Jayme Stone's Lomax Project, modern interpretations of some of the music collected by Lomax.

[http://jaymestone.com/projects/lomaxproject](http://jaymestone.com/projects/lomaxproject)

</comment><comment><USER6> Alan and his father, John, recorded and archived some incredibly important music and there's a mountain of it to pour through. If you're just getting into it, the most famous is most likely the "Sourthern Journey" from 59-60 which has all types of field recordings, gospel, blues, bluegrass, folk, hollers, etc. The early Deep River of Song recordings from the 1930s are quite good as well. Lots of international music and lots of great interviews. If you like Muddy Waters, his first recordings were done by Lomax and are starkly different from his later band/electric stuff.

</comment><comment><USER7> There are interesting (aka crazy) copyright issues surrounding these recordings. Lomax had copyrights on songs he only recorded? And modern artists need to license them if they are sampled?

[http://www.ethanhein.com/wp/2011/jay-z-and-alan- lomax/](http://www.ethanhein.com/wp/2011/jay-z-and-alan-lomax/)

</comment><comment><USER8> The BBC broadcast an "Archive on 4" featuring Alan Lomax earlier this year:

[http://www.bbc.co.uk/programmes/b050sbzw](http://www.bbc.co.uk/programmes/b050sbzw)

Well worth a listen.

If the BBC block this for non-UK users I have a local copy I could stick on my YouTube account. Let me know.

</comment><comment><USER9> thought it'd been on what.cd for years?

</comment><comment><USER10> woo hoo! another priceless, unmissable cultural experience to pour my time into!

<comment><USER11> This last weekend I read Sirens of Titan by Kurt Vonnegut. It's been a while since I read for fun. This is at least partly because the list of books that I want to read (e.g. priceless, unmissable cultural experiences) is longer than the time I have to dedicate to reading.

There will always be more I want to experience than I have time for. Not always sure what to do about that. Lomax's collection is amazing and invaluable. I do hope some people mine this and gems that I really shouldn't miss somehow cross into my experience.

<comment><USER10> This collection is awesome. Totally worth the time. Alan Lomax is genius who saw the future. The Global Jukebox lives!

I know what you mean, I haven't read for pleasure in a long time, but listening is more possible, and this archive is totally worth the effort. The interface could use a little work tho.</comment></comment></comment>


Implicit kicks explicit's ass - <AUTHOR> http://breasy.com/blog/2007/07/01/implicit-kicks-explicits-ass/ <comment><USER2> There are two things being said here:

1\. Implicit is better because it avoids people's corrupted "conscious" minds.

2\. Implicit is better because it is harder to game.

The corollary to #2 is: An implicit system can, in fact, be gamed, but it requires cleverness/sleuthing/persistence/money/massive organization/etc/etc...whatever the situation calls for. Google uses 40+ variables to determine what gets on the front page. Digg uses 1 variable.

...if something smells funny on Digg's front page, it's usually pretty clear, and it's pretty obvious _what_ is going on. There's one method to game Digg, and because of the simplicity, the community and the admins _should_ be able to put in counter-measures that are equally simple. With google...eh. Who knows? It's security through obscurity. One thing is certain: The well- pageranked of google are an enduring elite, whose only real enemies are the heuristic wizards deep within google itself.

<comment><USER3> The real hat trick is to combine the two approaches. You can "ask" the users for explicit feedback, but use metadata to decipher their real interest and intention.

</comment></comment><comment><USER4> This is is obviously true. However, the problem has always been in figuring out which implicit vars lead to explicit insights about your ecosystem and how strong that association is. Implicit tracking also opens some privacy questions. Generally a good line of thinking though.

</comment><comment><USER5> the url has barfed (404) try <http://breasy.com/blog/2007/06/30/implicit- kicks-explicits-ass/>

</comment><comment><AUTHOR> link is fixed now</comment>


Show HN: A curated list of the best file transfer tools and services - <AUTHOR> https://fastest.fish/ <comment><AUTHOR> Hey HN,

This project was originally a peer to peer transfer tool but between legal worries and the lack of monetisation options I never had enough time and motivation to put in the work that was needed to make it great. Instead I decided to host a curated list of the best file transfer tools instead to help others.

Let me know if I'm missing any good ones!</comment>


Looking Up Symptoms Online? These Companies Are Tracking You - <AUTHOR> http://motherboard.vice.com/read/looking-up-symptoms-online-these-companies-are-collecting-your-data <comment><USER2> Just a reminder that [https://www.torproject.org](https://www.torproject.org) offers a free and open-source unzip-and-run Firefox to use a anonymizing network run mostly by volunteers.

Using Tor to anonymously and privately educate yourself about embarrassing or potentially ostracized problems with yourself is a great use of it. Just remember that you should not ever enter any identifying information while using it.

Tor is more than fast enough for every day browsing, heck I use it to watch Youtube without major problems. I also use it to read the news, find recipes or lyrics (or similarly shady web circles) etc.

If the other side does not _need_ to know who you are and does not _have to_ synchronize that information into a vast tracking/advertising network, why should you willingly submit it?

<comment><USER3> If I download Tor I'll end up on one of the governments' lists. Is there a way to download it anonymously :-)

<comment><USER4> You're already on the lists.

If you _don 't_ use Tor, you're on the list _and_ they've got ready access to your browsing data and metadata.

If you do use Tor, you're only on the list, and their workfactor for accessing your data and metadata is far higher.

Plus you're providing more cover for those who have strongly urgent needs for similar levels of protection.

</comment></comment></comment><comment> SG- Just a reminder that uBlock now blocks Google Analytics by default as well as Addthis:

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

<comment><USER4> Is uBlock effectively an AdBlock/AdBlock+ replacement?

<comment><USER5> Yes, though it's substantially more memory-efficient.

There's a fairly detailed description of the differences here:

[https://github.com/chrisaljoudi/uBlock/wiki/What-uBlock- can-...](https://github.com/chrisaljoudi/uBlock/wiki/What-uBlock-can-and-can- not-%28currently%29-do)

</comment></comment></comment><comment><USER6> NoScript will prevent most of those evil trackings by default. e.g. cdc.gov displays fine without any JS, and google analytics or addthis on my untrusted list anyway.

Its still possible to browse without JS most of the time. Some pages are crippled by design, so disabling CSS might show the content. Others provide a escaped_fragment variant. But a stupid JS antipattern is sometimes used to display normal content with JS. One big problem are domains like ajax.google. This is often used to enhanced website, but google using it to track users.

When talking about evil Google, one needs to add YT. A friend of mine once claimed: You watch a stripper, if you visit YouPorn. But you strip your privacy, if you visit YouTube.

<comment><USER7> The CDN from which are served popular JavaScript libraries, ajax.googleapis.com, is not tracked. It's a cookie-less domain totally separate from google.com.

<comment><USER8> And they do not store IPs at all? All hops between you and them are NSA-proof?

</comment></comment></comment><comment><USER9> The original source paper is at [http://arxiv.org/pdf/1404.1951.pdf](http://arxiv.org/pdf/1404.1951.pdf)

Much as this sort of thing makes me glad I don't need to purchase private health insurance, the article would be a lot more helpful if it distinguished more clearly between what is and isn't legal use of the data as well as between the Experians and Google Analytics of this world.

That said, the original source paper probably if any thing plays down the potential concerns, contending, for example that a URI like [http://www.ncbi.nlm.nih.gov/pubmed/21722252](http://www.ncbi.nlm.nih.gov/pubmed/21722252) contains no symptom-specific information when any sufficiently motivated actor can write a scraper that links anonymous looking URIs on healthcare domains to conditions and symptoms referenced in the page content.

<comment><USER10> _this sort of thing makes me glad I don 't need to purchase private health insurance_

Are you in the USA? Thanks to Obamacare your medical history doesn't matter anymore. I purchase my own insurance and only three things matter:

       your age

       your gender

       the type of coverage (bronze, silver, gold, etc)

It doesn't even matter whether you're single or married or have kids. My family policy cost is exactly the sum of:

       my policy cost based on age and gender

       my wife's policy cost based on age and gender

       each of my children's policy costs (I don't
       remember if age or gender matter, I don't think
       they do)

I generally don't like the idea of Obamacare, but in this case it did a lot of good. Before Obamacare, insurance companies went out of their way to simply not offer private coverage _at all_ to people with any medical issues, even minor ones. They can't do that anymore.

<comment><USER11> They actually can't charge different premiums based on gender (this rule took effect in 2014).

They _can_ charge tobacco users higher premiums in many states (there is a federal limit of 50% more, but states can impose a lower limit, and some do).

</comment></comment></comment><comment><USER12> I think at this stage we need to consider this a part of how the internet works.

I'm far from an expert, but I do think that the majority of legislative efforts as well as many initiatives from browser makers are approaching this wrong. Privacy, as much transparency as possible and optional setting for anything that comes with a trade-off need to be built into the browser, and not as a request sent to websites.

Transacting, being logged in, and certainly browsing are not inherently hindered by privacy. It's up to users (or their browser really) to demand it, in the economic sense of demand.

For now, there is no cost to this kind of tracking so it happens almost by default. Moral or even legislative pressure will not have the same effect as economic pressure. The decision to protect users privacy or not needs to come with costs.

<comment> mike-cardwell When the major browser developers directly profit from being able to track users across the web, they're not going to make modifications to the way browsers work to prevent tracking. Not in any meaningful way.

It's a shame so many people use Chrome. They're effectively giving an Ad company which specialises in tracking people, power to control how the web develops.

</comment></comment><comment><USER13> And, I've found no solution regarding polluting your history with obfuscated searches.

If I, Mr. Spy Provider, start seeing a single user who has every possible documentable illness, that user's search has been polluted and is worthless.

So, how does one do this? Someone needs to write a search algo that pulls 100 crap medical searches for every good one. All you need to do is query the 1px image on the page. I'm guessing that could be done with 10KB/illness search for privacy pollution.

Should we have to? No. But this is the reality we live in. We can use the tools to keep us from being "found", but we still are querying the server the content is on. Nothing we can do about them selling that log. But we can pollute that log.

<comment><USER4> Sadly I'm increasingly coming to the conclusion that fuzzing _all_ search traffic in this manner is becoming a necessity. My concern is that it's _still_ not sufficient. As Bruce Schneier notes, computers are exceptionally good at finding needles in haystacks, and even highly fuzzed data contains signal.

That said, there are browser extensions which run random/arbitrary background Web queries.

<comment><USER13> I would tentatively agree. Fuzzing does appear that it might work, but given the current corpus of what the spy companies have, this is probably a bad avenue of approach.

Instead, lets use The Pirate Bay. We can build a scrape of WebMD and a few other places. The front page would have every disease WebMD has. And then we upload it to TPB. Highly illegal, but it does solve the problem of tracking our individual illnesses.

Thoughts?

<comment><USER4> Wikipedia is frequently as good, and occasionally a better reference, than WebMD or other sources (I generally prefer Mayo to WebMD which is frankly spammy as fuck).

And Wikipedia's fully syndicable.

Improve Wikipedia medical content, syndicate.

Problem solved, laws unflouted.

</comment></comment></comment></comment><comment><USER14> So i open the page and Disconnect shows 36 tracking items blocked, and uBlock shows 18 more items blocked.

Awesome :)

</comment><comment><USER15> I use Tor browser quite often, and this is a primary reason why. I have several times thought "hmm, I should not be typing this into the search box", especially when at a work or at a public network.

</comment><comment><USER16> > But the chief problem is simply that just about all of the above, under > current laws, is legal

In the US maybe, but I would guess the business practices of most data brokers are already completely illegal in the EU. We have many laws and requirements for keeping and selling data on EU citizens. I would welcome stronger actions against these companies in the EU.

But somehow I fear that enforcing EU laws on US companies is not part of the TTIP trade agreement under negotiation between US and EU.

<comment><USER17> The EU does have the requirement for websites to say they're using third-party cookies (e.g. from Google Analytics). The weakness is the poor wording chosen. "By browsing this website, you agree that a list of pages you visit will be sent to Google and ComScore" would have had a much stronger message. Perhaps follow on with "The visit to this page has already been tracked. To remove this information from Google/ComScore's servers, click here".

<comment><USER18> > _they 're using third-party cookies (e.g. from Google Analytics)_

Google Analytics cookies are first-party (i.e. only available to the domain of the site).

</comment></comment></comment><comment><USER19> I can't understand why any company that cares about privacy would use Google Analytics over Piwik.

<comment><USER20> I suspect that is an easy one. Your company might care about privacy, but not be in a technical industry or expert on these kinds of issues.

Google Analytics can be set up in a few minutes by anyone who could set up their own web site in the first place.

Setting up Piwik means understanding this: [http://piwik.org/docs/installation- maintenance/](http://piwik.org/docs/installation-maintenance/)

If you run web sites for a living, the latter is no big deal. If your company is a florist and you just learned a bit of basic HTML to write your blog about flower arranging, what's a MySQL?

</comment></comment><comment><USER21> Check out Mozilla Lightbeam (aka Collusion) too: [https://www.mozilla.org/en- US/lightbeam/](https://www.mozilla.org/en-US/lightbeam/)

</comment><comment><USER22> EFF PrivacyBadger + uBlock with lots of lists enabled blocks most of the tracking garbage. Sad state of affairs that basically every website is doing some kind of for-profit selling of their users.

<comment><USER23> Ghostery found one tracker (PiwikAnalytics) that PrivacyBadger didn't on the PrivacyBadger page itself.

<comment> mike-cardwell I'm not sure there's much wrong with using Piwik, as long as it is self- hosted. If using Piwik is bad, then so is using Apache access logs.

<comment><USER23> > so is using Apache access logs.

This kind of might be. Ideally, anonymous is supposed to mean collecting no data at all.

<comment><USER24> That's just silly. It's next to impossible to provide good UX without knowing what your customers are doing on your site.

<comment><USER23> My guitar has superb UX. Are you suggesting it's tracking me? (Oh my!)

<comment><USER24> Try making an Internet-connected guitar, that, say, downloads its own effects, and see how easy it remains to use.

</comment></comment></comment></comment></comment></comment></comment><comment><USER25> But, and I may be misunderstanding something, the page that I visit has the responsibility of serving these trackers? They call out to an adbroker, or analytics service, and they are responsible for the content surely? I mean if a newspaper prints a race hate ad for a neoNazi or FOX News runs porn adverts, they are the responsible party.

So it seems we could do with strong adblocking, but more useful (given spam email still exists) more useful will be actual enforced laws.

(I may be getting a bit old...)

<comment><USER26> My government doesn't even begin to know how to deal with internet laws, the only thing I've seen come down the pipe are laws designed to protect square peg business practices in round hole environments.

The only thing that can be done is to make privacy and ad blocking tools universally deployed, and let the fallout happen.

</comment></comment><comment><USER27> Firefox has recently released a tracking protection feature[1] that uses Disconnect's blocklist[2].

[1][https://support.mozilla.org/en-US/kb/tracking-protection- fir...](https://support.mozilla.org/en-US/kb/tracking-protection-firefox)

[2][https://disconnect.me/](https://disconnect.me/)

</comment><comment><USER28> Devil's Advocate: This data is important to public health. Search history for drugs is one of the best ways for companies, the public, and researchers to find out symptoms and the occurrence rate of symptoms. If that data is attached with location data then it gives them more pieces to the puzzle.

</comment><comment><USER29> My default search engine is ixquick.com . The service has a nifty proxy with a convenient proxy link next to each search result. The proxy breaks a lot of sites (JS blocking) but usually lets me see enough to determine if it's worth revisiting via Tor.

</comment><comment><USER30> Ghostery reports the following tracking beacons in the article itself.

===

Alexa Metrics

ChartBeat

Disqus

DoubleClick

eXelate

Facebook Connect

Google Adsense

Google AJAX Search API

Google Analytics

Google+ Platform

Krux Digital

Moat

NetRatings SiteCensus

Neustar AdAdvisor

PubMatic

Quantcast

Sailthru Horizon

ScoreCard Research Beacon

Twitter Button

<comment><USER31> Something about pots and kettles and the colour (or lack thereof) black...

<comment><USER11> Separation between business and editorial operations is usually construed as a positive.

</comment></comment></comment><comment><USER32> That is why I am thinking that private health insurance that covers doctor visits are probably flawed.

</comment><comment><USER33> ... says the news site sending my data to The Nielsen Company.

<comment><USER34> I see vice asking to load shit from 12 other domains. Which one is neilson?

<comment><USER33> imrworldwide.com ... I might have missed the rest because I block JS and 3rd party requests by default, so I only see the initial requests, not those subsequently loaded.

</comment></comment></comment><comment><USER35> Ghostery.. do yourself a favour and install it after reading this.

[https://www.ghostery.com/en/download](https://www.ghostery.com/en/download)

<comment><USER36> uBlock Origin + Privacy Badger covers the bases better I would say.

</comment></comment><comment><USER37> A good use for duckduckgo

<comment><USER38> How does DDG help here? It doesn't matter how you find the site. It's still full of third-party elements that can be used to track you.

<comment><USER37> Yes, but you won't be tracked by the search. (Especially by Google/Bing who know a lot about you already)

<comment><USER39> Yes, one more brick in the wall. You can't have the wall without a lot of bricks.

</comment></comment></comment></comment><comment><USER40> These mostly serve one-pixel GIFs; sometimes I find one-byte javascript "sources".

Put these in your hosts file:

       127.0.0.1 aax.amazon-adsystem.com

       127.0.0.1 ad.crwdcntrl.net

       127.0.0.1 b.scorecardresearch.com

       127.0.0.1 gs.dailymail.co.uk

       127.0.0.1 gum.criteo.com

       127.0.0.1 i.dailymail.co.uk

       127.0.0.1 moat.pxl.ace.advertising.com

       127.0.0.1 pixel.mathtag.com

       127.0.0.1 pq-direct.revsci.net

       127.0.0.1 rta.dailymail.co.uk

       127.0.0.1 sync.go.sonobi.com

       127.0.0.1 t.dailymail.co.uk

       127.0.0.1 ted.dailymail.co.uk

       127.0.0.1 x.bidswitch.net

       127.0.0.1 www.google-analytics.com

       127.0.0.1 ssl.google-analytics.com

       127.0.0.1 www.hosted-pixel.com

Search with [https://www.duckduckgo.com/](https://www.duckduckgo.com/) For extra credit use DuckDuckGo's Tor Hidden Service.

<comment><USER41> You shouldn't use loopback to block hostnames but instead use 0.0.0.0

<comment><USER42> Can you please explain why?

<comment><USER43> 0.0.0.0 is a completely invalid destination IP, and any attempts to establish a connection to it will fail long before any packets are sent. 127.0.0.1 is still valid so you depend on the network stack to either receive a RST sent to itself, or time out.

At least on Windows, the former is _much_ faster to return with an error.

It also avoids potential conflicts if you happen to need to run a server on port 80 for any reason.

<comment><USER40> When I ping 0.0.0.0, I get replies from 184.108.40.206. I don't know but expect that's earthlink's router.

<comment><USER43> That's odd... on Windows, pinging 0.0.0.0 results in "Destination specified is invalid."

On *nix, the behaviour is slightly different and is supposed to ping localhost instead (confirmed on one of my Linux machines):

[http://unix.stackexchange.com/questions/99336/how-does- ping-...](http://unix.stackexchange.com/questions/99336/how-does-ping-zero- works)

<comment><USER40> Do the RFCs have anything to say about 0.0.0.0?

Perhaps it is left up to the implementation, in which case both Windows and *NIX would be, strictly speaking, correct.</comment></comment></comment></comment></comment></comment></comment>


Learning in an Accessible Way - happy-go-lucky https://blog.edx.org/learning-accessible-way-meet-aditi <comment><AUTHOR> Her story in her own words:

[http://webcache.googleusercontent.com/search?q=cache:http://...](http://webcache.googleusercontent.com/search?q=cache:http://aditishah.co/my- story/)</comment>


Ask HN: How to learn more about distributed systems - <AUTHOR>

Hi,
Like most people here, I've been witnessing a fair amount of buzz/hype around technologies like Docker, Kubernetes, etc.. However, while I understand the broad-strokes outline of these technologies, as well as the motivations behind them, I am at a loss as to how they are actually supposed to be used.
With all the distributed systems/containerization/whatever systems out there, how do you figure out which parts to use in which configuration? Are there any good tutorials or books out there that cover the sweet spot between the generally too-specific Docker-related blog post and more academic distributed systems treatises?
In slightly different words, how would you recommend I bring myself up to speed on these technologies? <comment><USER2> Once solution could be to audit a course at your local university, even though it's probably going to be focused on the academic side I believe that a strong understanding of the underlying principles always helps.

I think that MIT has some opencourseware stuff about it as well [http://ocw.mit.edu/courses/electrical-engineering-and- comput...](http://ocw.mit.edu/courses/electrical-engineering-and-computer- science/6-824-distributed-computer-systems-engineering-spring-2006/index.htm)

again that's probably mostly the theory behind the implementations and not how to use them.

</comment><comment><USER3> The best thing you can do is to build a distribuite system.

Even something "trivial" if distribuite over few nodes won't be trivial at all.

After you have build it you will need to ship it, and now you can start to use docker or other container.</comment>


Online Shopping Makes Suckers of Us All - <AUTHOR> https://www.theatlantic.com/magazine/archive/2017/05/how-online-shopping-makes-suckers-of-us-all/521448/ <comment><USER2> Offline shopping works the same way!

The price you pay at Home Depot is influenced by how far away the nearest Lowes is.

And don't get me started on airline fares!

</comment><comment><USER3> Ahh, The Atlantic. Where voluntary commerce between buyers and sellers is somehow a neoliberal plot.

Who cares if shoes cost more after 7pm? Don't buy from a store that gets named and shamed for these shenanigans. It's vastly superior to government bureaucrats creating endless regulations designed to preserve some fictional memory of shopping in a quaint downtown boutique while on an ecommerce website. In Paris a retail shop has to register with the government when they want to conduct a Sale, and are limited to only a couple weeks per year of sales! Complete insanity.

<comment><USER4> I think it is really unfortunate that your ideology limits your ability to see that (1) extreme algorithmic price discrimination can and will lead to all manner of social ills; and (2) there are regulatory regimes capable of limiting the most extreme forms of price discrimination that are neither "endless" nor "bureaucratic".

Just take a look at the stock market. Your broker isn't tweaking your view on the order book based on who you are, nor should it.

<comment><USER3> It's really sad to me that your ideology is about coercion and government intervention into the most minute details of business. I have a great idea - let the free market sort it out!

<comment><USER4> Are efficient markets some kind of Nash equilibrium that naturally emerges from bellum omnium contra omnes?

If true, it is strange that we need government coercion to define and enforce property rights. Stranger still that we need government coercion to grant corporate charters to facilitate capital formation. The free market should just handle that.

<comment><USER3> It's hilarious that I advocate against the government dictating exactly how a business can set prices and when, and you immediately jump to the foundations of private property. I'm not advocating for dissolution of the state - I'm saying we don't need government agents meddling in all aspects of private business. But it is very sad that statists continue to advocate for ever harsher and more extreme intervention and ludicrous policies.</comment></comment></comment></comment></comment>


Show HN: Social Icon Generator – Create vector social icons in seconds - <AUTHOR> http://sig.proudsugar.com

<comment><USER2> There will be a solution for this in the future. Right now you could use [https://cloudconvert.org/svg-to-png](https://cloudconvert.org/svg-to-png) to get the icons in PNG.

</comment><comment><USER3> Looks neat, but how can I transform the SVG I downloaded into PNG files?</comment>


Spending by the UK government on the siege against Julian Assange - <AUTHOR> https://govwaste.co.uk/ <comment><USER3> Wouldn't it set an unwanted precedence if the British Government just let this go?

There is an arrest warrant against Assange and the British Government has a duty to carry it out. If they do not carry it out then theoretically anyone on the run could seek asylum in a foreign embassy knowing that if successful it was just a matter of time before they could make their escape.

I also wonder what would happen when the UK wanted to extradite a person from a foreign country after letting Assange walk. Would their position be weakened?

It is a bad situation but it seems like Assange would rather wither and rot stuck in an embassy rather than deal with the charges against him. The reason he will not come out is because he is locked in a prison of his own paranoia.

It is certainly money wasted but it seems that due to the chain of events it is money which has to be wasted.

<comment><USER4> >There is an arrest warrant against Assange and the British Government has a duty to carry it out.

I wonder why the same law enforcement rigor wasn't applied in these cases, which are undoubtedly so much worse?

[https://en.wikipedia.org/wiki/Rotherham_child_sexual_exploit...](https://en.wikipedia.org/wiki/Rotherham_child_sexual_exploitation_scandal) [https://en.wikipedia.org/wiki/Elm_Guest_House_child_abuse_sc...](https://en.wikipedia.org/wiki/Elm_Guest_House_child_abuse_scandal)

<comment><USER5> Not even remotely the same thing. Those are cases of the police failing to investigate and file charges.

The Assange case is about the enforcement of valid judicial warrants. The police don't have the same discretion.

<comment><USER4> Your thinking is double-plus good, citizen.

While we are on the topic of crimes involving sexuality, "... of the nine undercover police identified by the Guardian over the past two years, eight are believed to have slept with the people they were spying on. In other words, it was the norm."[0]

Now, pick up that can.

[0][http://www.theguardian.com/uk/2013/jan/17/spies-sexual- relat...](http://www.theguardian.com/uk/2013/jan/17/spies-sexual-relations- activists-routine)

</comment></comment></comment></comment><comment><USER6> It's a huge amount of money, sure. However, to claim that Assange is being 'detained without charge' is disingenuous to say the least. He is there completely of his own free will.

I wish Sweden would just guarantee that he won't be extradited and we can get this all over with, but the changes of that happening now are remote - <USER2> like a pretty permanent stalemate to me.

<comment><USER7> As much as I don't want to give in to his bullying tactics; I almost want Sweden to interview him in situ just to shut him up. Are there legal reasons this can't happen?

<comment><USER6> From [1]:

"The next step in the Swedish proceedings is to conduct a second interview with him before making a decision whether to formally charge him. The prosecutor is presently disposed to charge him, unless any new evidence emerges that might change her mind. If a decision is taken to formally charge him, Assange would face trial within two weeks of that decision being made. It is difficult to see how this could happen if the final interview takes place in the Ecuadorian embassy in Knightsbridge. Even if he were interviewed in the embassy, if a decision was then taken to formally charge him, it is somewhat difficult to believe that Assange would suddenly renounce his claim to asylum in Ecuador."

[1] [https://storify.com/anyapalmer/why-doesn-t-sweden- interview-...](https://storify.com/anyapalmer/why-doesn-t-sweden-interview- assange-in-london)

<comment><USER8> Interesting insight, thank you.

I wonder what the _material_ difference is for Sweden between continuing to not question him, and to question him on site at the embassy is, given the end result would seem to be identical (viz. they don't get to formally charge him and force him to face trial within Sweden in either scenario).

</comment></comment></comment></comment><comment><USER9> Just to play devil's advocate here: How are Sweden supposed to promise not to extradite him to the US? Wouldn't that depend on what kind of possible extradition request would arrive, if any?

<comment><USER10> Yes. There is nobody in Sweden with the power to make such an advance promise. It's simply impossible, by law. This is generally a good thing.

<comment><USER11> The real question in all of this is why does Sweden have an extradition treaty with a country infamous the world over for torture of detainees?

<comment><USER10> Well, you could ask roughly half of the world's sovereign states the same question.

[http://en.wikipedia.org/wiki/File:United_States_extradition_...](http://en.wikipedia.org/wiki/File:United_States_extradition_treaties_countries.PNG)

<comment><USER11> I would be happy to. "Because everybody else is doing it", is not exactly the most convincing of arguments.

</comment></comment></comment></comment></comment><comment><USER12> Every time this comes up a lot of people question whether Britain is making a special case out of Assange. But the European arrest warrant system has been around for a while, and been criticised for the burden it places on the police when dealing with minor crimes.

There was a fuss sometime ago about Poles being extradited for chicken theft and the like. [http://www.economist.com/node/15179470](http://www.economist.com/node/15179470)

</comment><comment><USER13> Good to see the linked John Pilger piece repeats the disingenuous "not charged" claim

<comment><USER14> I agree "not charged" makes it sound less serious than it is (he hasn't been charged, but a warrant for his arrest on those charges has been issued).

Interestingly, though, if he sits it out for another 5 years, for another £10m or so in UK police spending, the Swedish statute of limitations (which is dependent on charging, not arrest warrants) will expire, and he can't be charged. As I understand it, anyway.

<comment><USER6> "5 years, for another £30m"

Why is the cost suddenly going to treble?

<comment><USER14> Because my math sucks. Sorry. Edited.

</comment></comment></comment></comment><comment> k-mcgrady Why do they need to waste so many resources on him? Wouldn't it suffice to monitor the embassy with CCTV cameras on the street and have him flagged at the border if they see him leave?

<comment><USER7> I wonder if it would be possible to prevent the staff entering the embassy? We can't enter it legally, but we surly could prevent people entering? I understand it would create a stink, but starving the man out must be something they have thought about.

<comment><USER15> Interfering with diplomatic staff is also illegal. I understand that everybody apparently wants to see Assange burn at the stake for being a sexual predator (not that the evidence is terribly substantive...), but that's not a justification for an act of war.

<comment><USER7> > (not that the evidence is terribly substantive...)

What evidence do you want/expect to see? Genuinely intrigued as so what burden of proof is deemed necessary in this situation.

<comment><USER15> The burden of proof is always on the prosecutor - they have to prove you guilty, not the other way around.

<comment><USER16> For a criminal prosecution to be successful the prosecutor needs to prove beyond reasonable doubt that the accused did it.

But to bring a prosecution the English prosecutors use a "balance of probabilities" test. As a random member of the public I want to know that the evidence they have is at least balance of probabilities before they bring a prosecution. The higher burden of proof is for the people at court to test. It's not for me to test the evidence against that higher burden of proof.

</comment></comment></comment></comment></comment></comment><comment><USER17> He's not being held. He has choosen to not face legal cases against, and is in hiding.

</comment><comment><USER18> Assange is there of his own free will as he chose to go there rather than be extradited to Sweden.

He chose to go through the legal process in the UK while it suited him and then when it didn't suit him he decided to seek asylum.

I hope the UK Gov sends him the bill for wasting my tax money

</comment><comment><USER15> I wonder how many would argue that Assange should "face the music" while simultaneously arguing that Snowden shouldn't.

<comment><USER17> Assange is wanted for crimes that are unconnected with his political activism is. Everyone is human, incl Assange, everyone can make mistakes. Don't think your heros are perfect, they might not be.

<comment><USER15> Oh, I'm in favour of him having a fair trial for the crimes of which he's been accused. I'm not in favour of a wham bam thank you ma'am extradition and media pillory.

<comment><USER14> Personally I'm in favour of him being extradited and charged under normal UK and Swedish law and treaties.

I'm not in favour of the scale of the operation to enforce that, which I think is primarily a function of the accused's political status.

</comment></comment></comment></comment><comment><USER19> They've a typo right smack on the first part of their page: "The Seige of Julian Assange is ...."

Trying to alert the owner of the site by following the 'contact' link, and I get an Undelivered (554) back from their mailservers.

<firstname.lastname@example.com>: host mx1.privateemail.com[18.104.22.168] said: 554 5.7.1 <firstname.lastname@example.com>: Relay access denied (in reply to RCPT TO command)

Very shoddy impression.

</comment><comment><USER7> There must be far greater waste going on that is more irksome/disgraceful than this.

It's almost as if there was some sort of agenda behind it...

</comment><comment><USER20> So how much money do the US+UK spend on propaganda against Assange? Honest question. Are there any estimates on the order of magnitude?

<comment><USER21> My guess would be £0. Why would they need to? A very sizeable part of the population think he's a creepy nerd who's hiding from sexual assault allegations. The later is true, the former subjective.

</comment></comment><comment><USER22> I'd laugh my ass off if Assange came out of the embassy eventually, was extradited to Sweden, and after a short interview they'd let him go.

</comment><comment><USER23> Whenever big numbers are thrown around, there is a need to put them in perspective. However, I don't think "number of meals" or "teachers hired" are good or relevant perspectives.

The UK police budget is about £3.5 billion. So this expense is about 0.3% of that.

The UK budget is about £700 trillion, if I remember correctly. So this expense is about 0.0000014% of that.

<comment><USER24> If the UK population is 64 million [1] and the annual national policing budget is 3.5 billion, that's a per person budget of £54 per year.

So £10,000,000 on one accused person is the equivalent of the annual policing budget of 185,000 people. Spent on one person yet to be trialled.

You'd have to say this is a disproportional response. Why?

[1] [https://www.google.com.au/search?q=uk+population](https://www.google.com.au/search?q=uk+population)

<comment><USER25> That's not a reasonable argument, though. You can't generalise police spending over the population because criminals make up a relatively small proportion.

Is it a disproportionate response then to spend £10m on one guy? The fact that he's not been tried yet is irrelevant – there's a warrant for his arrest, and for a pretty serious crime. I struggle to see what the alternative would be.

<comment><USER24> Relatively small, yes. But I'd guess somewhere between 1 in 100 and 1 in 1000 people are criminal?

1 in 185,000? That's not criminal it's targeted.

<comment><USER25> _1 in 185,000? That 's not criminal it's targeted._

Like I said, it doesn't work like that. We don't decide in advance how to apportion resources on the basis of how many people are likely to commit a crime this year, do we?

No, of course it's targeted. There's a warrant out for Assange; he went into hiding. We know where he is, but for diplomatic reasons we can't arrest him. This is a very unusual situation.

</comment></comment></comment></comment></comment><comment><USER26> Send the bill to Ecuador, or slap a duty on imports. Job done.

<comment><USER27> Assange is well within his rights to apply for asylum, and Ecuador is well within its rights to accept his application. Assange is inside the embassy legally. It's the UK who are choosing to monitor the embassy with police officers (rightly so IMO, mind), not Ecuador.</comment></comment>


Guido van Rossum: The Theory of Type Hinting for Python 3.5 - <AUTHOR> https://quip.com/r69HA9GhGa7J <comment><USER2> Reading this pre-PEP, I'm not sure I understand what I will gain from this as a Python programmer. Can anyone explain what we can expect both short-term (first release, Python 3.5) and long-term (later version, accompanied by tooling and more side work)?

a. Better quality and maybe programmer productivity through static checking?

b. Better performance thanks to enforced type letting the compiler do a better job?

c. Something else?

Thanks!

<comment><USER3> In some code we have the first 5-10 lines are basically in the shape of : assert isinstance(arg1, type) assert isinstance(arg2, SubObjectClass) And so on. Mainly because we deal in code that deals a lot with traditional types (as in signed 8 bit, Strange-Endian 32bit in 16bit words , and so on) which makes code turn nasty in pretty much any language.

Further down these are cast into more native types, and then walk out into public API's.

And there once more you need to do somewhat strict data-validation.

For these cases, typing rules and annotations will be a boon.

And do note, that there is more common a case of human error or refactoring error that causes problem. Someone sending in a default [] array in an object, and somewhere else it's an expected Boolean.

<comment><USER2> Thanks :)

That matches well what I had in mind with my "a." suggestion.

Now, why cannot we expect "b. Better performance thanks to enforced type letting the compiler do a better job"? Are the semantics of what's being discuss insufficient to provide such benefits? I'm asking that question because I read often that dynamic typing is the #1 performance hit of Python (e.g. [1]). Now that this PEP lets developers provide and enforce type, what's still in the way of reaching the level of performance of statically-typed languages?

[1] Alex Gaynor - Fast Python, Slow Python: [https://www.youtube.com/watch?v=7eeEf_rAJds](https://www.youtube.com/watch?v=7eeEf_rAJds)

<comment><USER4> I don't think the Python VM will use these as actual hints, it's mainly to help refactoring tools and people maintaining large codebases as I understand it. No type is "enforced".

</comment></comment></comment></comment><comment><USER5> I may be mistaken, but wasn't GVR fairly opposed to anything beyond simple type annotations? Don't get me wrong, I love that he might be turning around on this, but has anyone followed the transition and can provide some context? What led to this turnaround?

<comment><USER6> 10 years ago GVR discussed optional static typing in Python [1]. He liked the idea but he thought it was really hard to properly implement. With PEP 3107 [2], some basic syntax constructs were added for this purpose, but no convention was suggested for specific type annotations, resulting in the feature not being really used. This year GVR started the discussion again [3][4], this time to propose an specific syntax for type annotations and include them in the standard library. This syntax is based on MyPy [5]. GVR has never been opposed to more than simple type annotations. However, he is opposed to implement static type checking in the core of Python. Instead, he suggests to use external tools such as MyPy or specific IDEs.

[1] [http://www.artima.com/weblogs/viewpost.jsp?thread=85551](http://www.artima.com/weblogs/viewpost.jsp?thread=85551) [2] [https://www.python.org/dev/peps/pep-3107/](https://www.python.org/dev/peps/pep-3107/) [3] [https://mail.python.org/pipermail/python- ideas/2014-August/0...](https://mail.python.org/pipermail/python- ideas/2014-August/028618.html) [4] [https://mail.python.org/pipermail/python- ideas/2014-August/0...](https://mail.python.org/pipermail/python- ideas/2014-August/028742.html) [5] [http://www.mypy- lang.org/](http://www.mypy-lang.org/)

<comment><USER5> Thank you very much for the information! Really cleared it up for me.

</comment></comment></comment><comment><USER7> That post cheered me up for the day. Things seem to finally move to a (IMHO) great direction for this language. I was thinking about rewriting my latest large project from python to go, but now i think i'll wait a bit to see where this thing leads to.

</comment><comment><USER8> Is there any documented information on how the decision to use consistency instead of subclassing was made? Naively it seems very similar to say c# or java with Any instead of Object at the root - except that Any is consistent with all types.

That seems odd and I'm not sure I understand the benefits of it. I get that it only applies to things typed as Any (and presumably like with Object, typing as Any is quite rare to want to do - especially with support for union types) but is there an example where you'd want this and the c#/java subclassing would be limiting?

<comment><USER9> `Any` seems to be more akin to C# `dynamic`

The key is that we're talking about _Gradual_ Typing: it's not that "you never want to type things as Any" (if you always used a dynamically typed language like Python you probably never cared too much), or "subclassing is too limiting" (if anything, imho is not limiting enough).

The point is offering a tool to people who might benefit from some static checks, to avoid stumbling into problems at runtime. Those people have a HUGE codebase with dynamic types (basically, everything is already Any) and you need to _Gradual_ly specify and move over parts of the code to be correctly typed.

as keosak writes, if you want a proper explanation of theory behind it, just read Jsiek's blog posts

<comment><USER10> It reminds me of TypeScript, where everything defaults to type `any`, so it can interoperate with normal JS. This essentially makes static type checking an "opt-in" feature of the language.

</comment></comment></comment><comment><USER11> This very much sounds like a type inference with hinting version of the C type system with a minor extension. It also seems to have many parallels to the Objective C type system with id, but again in a type inference variant.

The three rules to apply to quite directly to standard OO C:

1\. If t1 is a subclass of t2, t1 is also consistent with t2. (But not the other way around.)

Using the standard OO C method of subclassing structs, ie.

struct t2 {...}; struct t1 {struct t2 t2; ...};

This is obviously true and the normal subclass relationship, though the C syntax to use this is a bit awkward:

t2_method(&t1->t2, arg1, arg2);

2\. Any is consistent with every type. (But Any is not a subclass of every type.)

In C the Any type is void _. Using the class definitions above this is entirely valid and produces no warnings:

void _v;

struct _t1 = v;

So if you have an object of void_ type you can use it wherever you might require a stricter type. If you pass in something which is not consistent you'll get a runtime error (usually a segfault in the case of C).

3\. Every type is a subclass of Any. (Which also makes every type consistent with Any, via rule 1.)

This just says that you can do the following without getting any warnings: struct t1 _t1; void_ v = t1;

And this works quite well in C.

The extension to the C type system, beyond the type inference, is to make these rules recursive, especially in function types. For example, this produces a warning under GCC, though it will compile and run fine:

void f(int* func(int _b, int_ c)) {}

void* g(void _b, void_ c) {return b;}

f(g);

That might just be a limitation of GCC's type checking though.

I think this is quite a good direction to take. C's type system has proven sufficiently powerful over the decades to build large systems and at the same time is trivially bypassed when you paint yourself into a typed corner or you want flexibility strict static type checking finds cumbersome to provide.

<comment><USER12> >For example, this produces a warning under GCC, though it will compile and run fine:

All function pointer types are convertible to any other function pointer type, and since 'func' is never called as the wrong type there is nothing wrong with your example. It's not a limitation of GCC, it's the intended behavior according to the standard.

<comment><USER11> Right, the standard allows it, but GCC hasn't yet extended its type checker to give you the help you'd want in this case. The warning effectively says "The standard says this is fine, but in most cases this isn't what you want". Which, in nearly all cases, is correct.

If I pass "void g(int a)" to "f(int _func(struct foo_ f))" the standard says everything is fine, but it's almost certainly going to blow up. GCC helpfully notifies me of this.

The only case where this warning isn't what I want is where some of the pointer types have been replaced with void _. That is, passing "void_ g(void _a) " to "f(int _func(struct foo _f)) " should work just like "struct foo _f = (void *a);" and output no warning.

The proposal from the article supports this case and other similar recursive cases.

</comment></comment></comment><comment><USER13> This is exciting - ever since reading Jeremy Siek's post on Gradual Typing [1], I've been missing this in my python and ruby. This could be the killer feature that would both move larger corporations towards python 3!

Two things in the pragmatic side seem hairy though - type declarations in types and `Undefined`.

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

<comment><USER14> Yes, this is the first feature I've seen that makes me think about what it would take to move my team over from 2.x. We have a moderate codebase (around 70k lines, last I checked) and are getting to the point where we'd probably get some benefit from types and a type-checking IDE or tool.

</comment></comment><comment><AUTHOR> Source: [https://mail.python.org/pipermail/python- ideas/2014-December...](https://mail.python.org/pipermail/python- ideas/2014-December/030430.html)

</comment><comment><USER15> This looks interesting. If such potential features come true in Python 3, I would have better motivation to migrate to it.

However, it does, somehow, with type alias syntax as proposed in this article, make python3 looks even similar to Go.

</comment><comment><USER16> It would also be nice to see some interface-based type assertions. For instance,

        def comma_sep(items):
            return ','.join(map(str, items))

requires two things:

\- items be iterable

\- each item have a __str__ method

</comment><comment><USER17> Ten years ago, this could have accelerated the development of fast CPython replacements. With the incompatible changes in Python 3, all the alternatives to CPython took years to catch up. Or, like Microsoft's Iron Python, were abandoned. Now that PyPy is getting close to the point where it might replace CPython, a major change to the language comes out of nowhere.

<comment><USER18> These are just typing hints, they don't break compatibility. The ability to annotate function parameters and return values has been there for a while, so PyPy can at first just ignore these annotations and any valid python 3.5 program is also a valid PyPy program. Given that PyPy already does type- specialisation for optimisation, I assume its authors will want to make use of the type hints anyway, so we can expect, that support for this feature will land shortly in PyPy.

</comment></comment><comment><USER19> I want to get this page as HTML, instead of a Javascript script that builds the page? I can't (easily) send it to my Kindle this way.

This is a TEXT DOCUMENT, right?

(I don't want a downloadable PDF also.)

<comment><USER20> If you use Amazon's Send To Kindle plugin and highlight the body of the article, it is captured and sent to the kindle beautifully.

</comment></comment><comment><USER21> Can we please just do Hindley-Milner? They knew all this stuff in the 1970s...

<comment><USER22> You are confusing two different things: gradual typing, and type inference.

Type inference infers a static type for every expression in a program. Hindley-Milner is such a type inference algorithm.

Gradual typing allows you to partition your program into typed and untyped parts. The untyped parts need not even be typable under your type system.

Type inference and gradual typing can be combined. See: Siek and Vachharajani: Gradual typing with unification-based inference [http://dl.acm.org/citation.cfm?id=1408688](http://dl.acm.org/citation.cfm?id=1408688)

The idea of that paper is that you want to do type inference for the statically typed part of your program in a gradual type system.

<comment><USER23> Strictly speaking Hindley-Milner is the type system that itself admits tractable inference using the usual unification techniques via the Damas- Milner family of algorithms. Gradual typing itself uses type inference in the Damas-Milner family, although it diverges with it's notion of consistency.

</comment></comment></comment><comment><USER24> Putting the type declaration in comments is a neat idea.

</comment><comment><USER25> why?

<comment><USER26> To allow and encourage optional static typing in Python. To make it a language somewhat more suitable for writing complex systems.

<comment><USER27> And to enable much, much better tool support.

</comment></comment></comment><comment><USER28> ...or you can just use Julia :)

<comment><USER29> Julia doesn't have gradual typing, to my knowledge. As far as I know it doesn't do any static type checking. I wish it did!

<comment><USER28> i still have much to learn about language design, but i believe julia has gradual typing. it uses type annotations for the purposes of multiple dispatch (which is awesome, btw) and optimization.</comment></comment></comment>


Ask HN: Any Good Alternatives to Eventbrite? - <AUTHOR> <comment><USER2> Eventzilla is probably the best alternative. It's free and has similar features to Eventbrite.

</comment><comment><USER3> What do you not like about Eventbrite? My company is considering using them.</comment>


Show HN: A lambda expression visualizer for the web - <AUTHOR> http://brycec.github.com/vizlamb/

<comment><AUTHOR> The source is kinda crude at this point, but I hope to eventually allow named abstractions as well as direct manipulation of the tree (click n drag). Supporting types might be interesting as well.

</comment><comment><USER2> The notation is cumbersome, but I like the visualization. I wish eta-reduction were implemented rather than just beta-reduction.

Unfortunately there appear to be some errors. Try entering the following expression:

#(##2 1)

This, if I've understood the notation correctly, means λx.(λy.λz.y)x. Thus, it should reduce to λx.λz.x, or ##2. However, the program instead reduces it to ##1, or λx.λz.z.

So, something's really wrong here.

<comment><AUTHOR> Agreed, it is unwieldy. However, because of it, eta-reduction is not as important because equivalent terms look the same, and name collisions can't happen. It made it a bit simpler.

And, that is definitely a bug, thanks. I think I could solve it by lazy evaluation (it wouldn't reduce that term) but I think I just need to correctly change vars when they move scope.

<comment><USER2> Not sure what you mean by "equivalent terms look the same". I'm not clear on how e.g. ##(2 1) and #1 look the same. Going by your remark about name collisions, I must ask if you are thinking of alpha-equivalence? (Which certainly is rendered unnecessary by the notational system.)

And thank you for making/hopefully fixing this!

<comment><AUTHOR> Oh I see. Yes I was thinking of alpha-equivalence, sorry.

Now I must ask, do you know any good papers/algos on that reduction? And how would you envision animating? It seems a bit like a lambda/var pair just fall off...

<comment><USER2> I don't know what I might refer you to. Beta reduction requires recognizing subtrees of the form (#T S) (where T and S are any subtrees), eta reduction just requires recognizing subtrees of the form #(T 1) (where T is any subtree).

No idea about animation. It's really not something I'd thought about, I have to say...

<comment><USER2> Oops -- I forgot about the non-freeness requirement. So not just _any_ subtree. That makes it trickier. But still not hard, I think.

</comment></comment></comment></comment></comment></comment><comment><USER3> The text at the bottom says this is simply typed lambda calculus, but surely this is untyped lambda calculus.

<comment><AUTHOR> Right, thanks! Corrected.

</comment></comment><comment><USER4> I think this would be really great with back and forward controls, i.e. rewind.</comment>


Any enterprise coders converting from or to Java? - <AUTHOR>

I'm curious with Java 8 out now, are there enterprise coders reading HN who are considering converting projects in production either to or from Java? <comment><USER2> Most likely not. That's not how decisions in enterprise environments work. Those decisions take a while (i.e. years to even decades) anyway.

That said Java 8 might have some nice improvements productivity-wise but that's one of the least important criteria in enterprise environments.</comment>


Subinterpreters for Python - <AUTHOR> https://lwn.net/SubscriberLink/820424/172e6da006687167/ <comment><USER2> Subinterpreters existed from the very early days in the C API and were key to the implementation of mod_python (which I wrote). So if you used mod_python, you used subinterpeters without realizing it.

[http://modpython.org/live/current/doc- html/pythonapi.html#mu...](http://modpython.org/live/current/doc- html/pythonapi.html#multiple-interpreters)

EDIT: And it looks like I had subinterpreters in the first released version in May 2000, so the initial git (formerly SVN) commit already had them [https://github.com/grisha/mod_python/blob/9b211b7e8a65f1af4b...](https://github.com/grisha/mod_python/blob/9b211b7e8a65f1af4b5facd29797703f8e76d97b/src/mod_python.c#L1874)

EDIT2: Just noticed this comment:

      * Nov 1998 - support for multiple interpreters introduced.

<comment><USER3> How did you deal with C-extensions, since apparently most don't support it at all (which is a shame, apparently we messed up culturally here).

<comment><USER2> I didn't :)

</comment></comment></comment><comment><USER4> From the PEP: [https://www.python.org/dev/peps/pep-0554/](https://www.python.org/dev/peps/pep-0554/)

> _A common misconception is that this PEP also includes a promise that > subinterpreters will no longer share the GIL. When that is clarified, the > next question is "what is the point?". This is already answered at length in > this PEP. Just to be clear, the value lies in:_

        * increase exposure of the existing feature, which helps improve
          the code health of the entire CPython runtime
        * expose the (mostly) isolated execution of subinterpreters
        * preparation for per-interpreter GIL
        * encourage experimentation

I think I'll ask the followup question - what is the point _of those_? Why should we increase exposure of an existing feature we know is not fully baked and we know will cause problems with NumPy/SciPy? How will the exposure improve the code health of CPython and who will do the improvement? What is the advantage in exposing isolated execution of subinterpreters? In what way does exposing this feature help prepare for a per-interpreter GIL? What experiments are being encouraged specifically?

<comment><USER5> I think the Rationale section tries to explain the benefits? [https://www.python.org/dev/peps/pep-0554/#rationale](https://www.python.org/dev/peps/pep-0554/#rationale)

What I don't get is how they expect C extensions to adapt. I don't expect widespread support for this for like... a decade?

<comment><USER4> The Nick Coghlan quote seems a bit out of context - sure, there are all these things it does that multiprocessing doesn't do, but multiprocessing _allows concurrency at all_ and this doesn't. The comparison makes sense if it's talking about no-shared-state concurrency, but this PEP is quite clear that it's only proposing no-shared-state ... single-threaded operation.

The rest of the section is sparse on what you actually do with it. It says that it "has the potential to be a powerful tool" but not what you do with the power. It says it's about "enabling the fundamental capability of multiple isolated interpreters" but it's not clear what the capability brings you. The only thing with some details is the first sentence - "Running code in multiple interpreters provides a useful level of isolation within the same process." But what is the level? It sounds like it gives you isolation for most things but not all, which is about as useful as a face mask with a breathing hole cut out in it.

It'd help to see a concrete answer of something you can build with this that you can't build without it (or perhaps not as easily/performantly/reliably/etc.). The Ceph PR, where they do something similar themselves ([https://github.com/ceph/ceph/pull/14971](https://github.com/ceph/ceph/pull/14971)), gives a good answer: "Notably, with this change, it's possible to have more than one mgr module use cherrypy." (But it's still not clear to me why the mgr can't just use multiple Python interpreters... ceph-mgr is kind of an amalgam of various useful services for your Ceph cluster, and it's never been clear to me why it has to be "the" manager with some modules instead of various independent services you can turn off/on as you need.)

<comment><USER6> _> multiprocessing allows concurrency at all and this doesn't_

I do not think multiprocessing will meet the concurrency needs of many potential applications.

For one thing, I've looked at the multiprocessing source code, and to me it looks like a hairball of bugs just waiting to happen. To run Python code in a separate process with some set of initial data, it basically pickles it in the parent and then unpickles it in the child. That seems awfully kludgey to me.

For another, if you have multiple concurrent tasks that have to share data, doing it within a single process between multiple threads is a lot easier than doing it between multiple processes. Every other major language besides Python allows the former; only Python has the GIL which makes the former basically useless.

<comment><USER7> > To run Python code in a separate process with some set of initial data, it > basically pickles it in the parent and then unpickles it in the child.

FWIW, the subinterpreter threading scheme will also use a similar message passing construct to pass values between interpreters. As the sibling comment mentions, it's just a message passing scheme.

That said,

> I've looked at the multiprocessing source code, and to me it looks like a > hairball of bugs just waiting to happen.

I have as well, and completely agree.

<comment><USER8> Came here just to agree.

</comment></comment></comment></comment></comment></comment><comment><USER9> I feel like Lua would have gotten more traction in the early days, and maybe eclipsed Python, if it wasn't so hyper-focused on being a tiny embed-able language/runtime. It was so well-designed from the very beginning.

Every new release of Python seems like it gets bigger and bigger and more and more incomprehensible. The Python 2 -> 3 transition was a (necessary?) disaster. And now we're trying, in earnest, to figure out how to get rid of the GIL. The async/await syntax is a whole other fiasco. Now we have colored functions all over the place. Python code doesn't even work with Python code. It's just an absolute mess.

<comment><USER10> What's wrong with the async/await syntax?

<comment><USER9> It should have been implemented as functions or attributes instead of language syntax sugar.

Like Lua did. Like Rust did.

Imagine this:

       def foo():
           return "bar"

       async def foo():
           return "bar"

How do you know how to call that function? It's called the same thing. It has the same signature.. It returns the same thing. One is sync, the other is async. This is "colored functions".

You have to call the 2nd one like:

        await foo()

why do you have to care about that? It's either a coroutine or it's not. All functions in Python should just be callable like normal functions. But the Computer Scientists went and messed that up and made colored functions.

It's absurd.

<comment><USER6> I don't mind the "await foo()" so much; as others have noted, it makes explicit that your code is yielding control at that point.

What I mind is having to do "async def", "async for", "async with" all over the place for no good reason. Python didn't do that with generators; you defined an ordinary function, and if it had a "yield" somewhere in its body, it returned a generator. I don't have to do "gen def", "gen with", "gen for", etc. to remind the interpreter that it's a generator.

The obvious way to handle async coroutines is the same: you define an ordinary function, and if it has "await" somewhere in its body, it's a coroutine. I shouldn't have to be reminding the interpreter everywhere that it's a coroutine.

(The reason "await" is a special case is that, with a generator, it's just an ordinary iterable, so it's not yielding control if I just use it like any other iterable, say in a for statement. If I want to do something with the generator that might yield control (as in the "using generators as coroutines" paradigm that came before async/await), I have to call its "send()" method, or otherwise do something special that will stand out. So there's no need to add a keyword for it. But with a coroutine, ordinary call sites that wouldn't yield control with any other kind of function can yield control, so it makes sense to add a keyword to make that explicit.)

<comment><USER3> I have the opposition opinion. I think generators should have had an explicit keyword for defining them, like:

gen def stuff()

Because it doesn't, people are very confused about generators, and think they are functions, which they are not. They are completely different objects.

Plus there is no way to tell if a definition is a generator without reading all of it.

Explicit is better than implicit and all that.

</comment></comment></comment></comment></comment><comment><USER11> > NumPy core developer Sebastian Berg chimed in as well. He suggested that it > could take up to a solid year of work to support subinterpreters in NumPy.

Whoa, that's a shame. I actually found it really easy to patch NumPy to make it PyParallel-compatible -- simply had to tweak the memory allocator stuff: [https://github.com/pyparallel/numpy/commit/046311ac1d66cec78...](https://github.com/pyparallel/numpy/commit/046311ac1d66cec789fa8fd79b1b582a3dea26a8)

Example that loaded a 12GB NumPy array and serviced requests in parallel: [https://github.com/pyparallel/pyparallel/blob/branches/3.3-p...](https://github.com/pyparallel/pyparallel/blob/branches/3.3-px/examples/wiki/wiki.py).

I really wish the PyParallel approach gained more traction. Having the solution Windows-only reaaaaally didn't help with having other core developers experiment with the approach.

[*]: [https://pyparallel.org](https://pyparallel.org)

<comment><USER12> This seems great!!

Obviously, being Windows-only is a big drawback - is there any hope it could be implemented for other platforms some day? (I mean in terms of technical feasibility, rather than effort, money etc)

I know literally nothing about the OS side of things relevant to this topic, but googling for "async io linux" turns up io_uring which seems to date from 2019ish and is maybe addressing some of what's lacking there?

<comment><USER11> If you're looking for a bit more info on the Windows-only aspect, there is a lot of detail here: [https://speakerdeck.com/trent/pyparallel-how-we-removed- the-...](https://speakerdeck.com/trent/pyparallel-how-we-removed-the-gil-and- exploited-all-cores).

I think the TL;DR though is that PyParallel was a successful proof-of-concept (but seems to have failed at moving the bar anywhere) _because_ the threadpool and async I/O primitives on Windows are so much more sophisticated than what's available on any other platform.

On Linux/Mac, I'd have to write _so_ much scaffolding to get the same baseline functionality offered by Windows, and many parts wouldn't even be possible to replicate. It'd be a huge engineering effort that would take a team of people. (Just like all the Vista+ threadpool stuff took a team of kernel engineers working for years at Microsoft.)

That being said, I've been looking at stuff like the Chromium cross-platform threadpool stuff recently and that could potentially be used as a substitute (I believe it maps 1:1 with native threadpool APIs on Windows, and mimics the best it can on Linux/Mac). But that's an unwieldy 3rd party package for Python to suddenly depend on.

I also disagree with the sentiment that the GIL, parallel computing and async I/O are all separate, orthogonal pieces. The reason PyParallel was so performant was the fact that I treated all three as very intertwined concepts that had to be addressed all at once.

</comment></comment></comment><comment><USER13> As usual, when someone makes a move towards the Coveted Feature, people promptly insist that gradual progress is impossible and the only way is with every problem being solved at once in the hundred million modules—each somehow taking a year to undo the use of global variables. I.e. same as it was for the past twenty years when gradual progress could've been made. Deference is again made towards Numpy, the de-facto implementation of Python. No trace of choice is offered to users who would perhaps use a handful of modules from those that happen to be converted at a point in time, or use Python in ways that aren't practical now.

The actual problem, of course, is that multi-threading Python would still be slow, and those who see it as just a shell to run C modules, do have a point.

</comment><comment><USER14> This seems like such a significant problem for the language and has been around since the beginning of time. Considering the amount of value that Python adds to companies and individuals around the world, is there a reason that institutions or someone with the means hasn't funded a project to "solve" the GIL problem?

<comment><USER15> It's far more common to have Python programs be I/O bound, and when they are CPU bound it's often not due to GIL contention (remember that C extensions can drop the GIL before doing something lengthy). It would be nice if the GIL was gone but a fair fraction of Python developers would not notice much difference.

<comment><USER6> _> It's far more common to have Python programs be I/O bound_

But part of the reason for that is that Python programmers know there's no point in trying to run multiple CPU-bound tasks in the same Python process, so they don't try.

 _> C extensions can drop the GIL before doing something lengthy_

Yes, but they're still limited in what they can do--as soon as they call back into a Python bytecode they're GIL-bound again. And if you depend on C extensions any time you need CPU bound concurrent tasks, you're giving up a lot of the advantages of using Python in the first place.

<comment><USER15> It's part of the reason but not all or, I suspect, even most: the number of things which people need to compute with multi threading but without much I/O is not an especially large fraction of what people use pure Python for. If you need raw CPU speed for arbitrary code, it's not the language most people would pick.

The exceptions also tend to have existing high-quality extensions (crypto, compression, image processing, etc.) so while it's technically true that you're giving up Python most people aren't doing that personally - they're just calling Pillow or numpy - or they're using it for a tiny fraction of the total program.

Frequently this ends up being the same speed or even faster than using other languages because most people are either using the same C libraries or learning just how many optimizations their simple implementation lacked.

Again, it's not hard to come up with things where the GIL is inarguably a bottleneck but it comes up a lot more in debates than real-life in my experience.

<comment><USER16> I'm one of those with embarrassingly-parallel cpu-bound workloads. The multiprocessing module works, but the extra bookkeeping and plumbing over an actually-parallel-multithreading implementation is a pain in the butt. That said, the multithreading speedup is both faster and easier than porting to another language.

<comment><USER15> Definitely - I used to support a computational lab and have worked on enough other CPU-bound problems to have plenty of things which I wouldn't recommend Python for. I just think that as a field we're predisposed to focus on that as the kind of work Real Programmers™ do when most groups are limited by their ability to implement and maintain business logic long before they hit the wall on what Python can do.

</comment></comment></comment></comment></comment></comment><comment><USER17> I recall digging into Python subinterpreters a decade ago. Abandoned it because the real killer wasn't shared GIL, it was shared modules. If one subinterpreter imports a module and modifies that module's state, then every other subinterpreter that uses that module is impacted too.

Article says nothing about that, which makes me very cautious. The GIL only impacts performance; module sharing wrecks robustness.

Even if each subinterpreter does now keep its own module cache, there's still the challenge of working safely with common C-level resources such as file handles. (Other than telling users "don't do that"—and GLWT.)

I've used Python now for 17 years and it's been a very productive tool for me. But it definitely has its baked-in limitations and fighting those is an exercise in rapidly diminishing returns.

Something as fundamental as parallelism can't just be slopped on top of a language as an afterthought; it needs to be designed for it from the start. So rather than trying to retrofit bad parallelism to Python, perhaps it'd be sense to bring the positive parts of Python over to something that already does parallelism right, such as Erlang, and build from there.

</comment><comment><USER18> I don't see the benefit of a subinterpreter compared to a subprocess. I wish python didn't have a GIL, but I don't see what problems this would solve for me that multiprocessing doesn't.

<comment><USER19> Perfomance,I suppose? Spawning a process is expensive.

<comment><USER20> I understood that on Linux using a process was similar in speed to a thread, though they're much slower on Windows. Has that changed?

For my python multi core code I like using fork with sending objects over a socket with pickle. It gives more control than multiprocessing.

It works pretty well. One downside of fork with python is that the reference counters are scattered about, leading to big COW memory churn, however. Big numpy arrays should be shared, however.

<comment><USER3> Spwaning the process is not the only problem, communicating between them is also expensive.

</comment></comment></comment></comment><comment><USER21> Tcl has had those for...20 years or so? They're pretty handy for some things.

<comment><USER22> Absolute sandboxing, w the option to engage "safe" interp that also (tuneably) segregates it from OS facilities like the network and filesystem.

/s Will be looking forward to Pythonistas to be extolling the virtues of multiple interps as much as hearing node folk go on about event-oriented programming ;)

Nb: Much love to both node and python. Looking forward to seeing python exercise this.

</comment></comment><comment><USER23> This is pretty common for languages right? TCL and the JVM come to mind. Nice for code running in a sandboxed environment, especially if you have full control. I think python is getting more interesting lately, always found it a bit of a boring language.

</comment><comment><USER24> > _In particular, giving each subinterpreter its own global interpreter lock > (GIL) is not (yet) on the table._

What's the use then?

<comment><USER25> [https://news.ycombinator.com/item?id=23172884](https://news.ycombinator.com/item?id=23172884)

<comment><USER24> So, basically, no real reason besides "preparation for per-interpreter GIL"...

I, for one, wouldn't be encouraged to use it in this state, where it doesn't really bring any benefits yet!

</comment></comment></comment><comment><USER26> I suspect at this point it will require a new interpreter to fully address the deeply-embedded assumptions about memory access and bytecode execution in CPython. This has been tried many times, though, with only PyPy really seeing much traction. CPython being the de-facto interpreter, and the huge ecosystem of widely-used C extensions, makes any change likely to be slow... and the upside would need to be very compelling.

I think what we see instead is people moving to different runtimes altogether -- golang, jvm, v8, whatever.

I would suggest that Python has gone off the rails trying to mimic other languages too much recently. At some point the identity crisis hopefully ends and Python will return to it's strengths -- which are best expressed by the Zen of Python. Until then, get ready for more features.

<comment><USER3> See HPy for another solution to that: [https://speakerdeck.com/antocuni/hpy-a- future-proof-way-of-e...](https://speakerdeck.com/antocuni/hpy-a-future-proof- way-of-extending-python?slide=1)

</comment></comment><comment><USER12> My first thought was, like many others, "if they still share a GIL then why bother?"

But if this is a first step along the road to that, then it's all good and why not.

Another thought is: could this be a "thread-safe alternative to gevent" in some use cases?

I'm thinking particularly of web app hosting situation where you have something like uWSGI+gevent+your WSGI app

In that case, apart from the required gevent.monkeypatch (which presumably would not be needed with subinterpreters) your web app code does not explicitly do any stuff with gevent. But it is running in a gevent thread, so your web app code now has a non-obvious requirement to be thread-safe. This has bitten me with subtle bugs in the past.

I would be interested to explore the characteristics of a uWSGI+subinterpreter+WSGI app set up. It should avoid the thread-safety issue. Like gevent threads, the subinterpreters would share a GIL. I guess it might use more memory?

</comment><comment><USER27> I really enjoy this style of article. Looks like the author based most of this off of mailing-list interactions. There's clearly fascinating information within those threads, despite how difficult they are to follow retroactively.

<comment><USER28> Absolutely. LWN has quite a lot of those; it's one of the main reasons I have a subscription there.

</comment></comment><comment><USER29> My 2 cent would be to make the necessary changes in the standard library such that an external library (on pypi) can enable the feature. That lets us start working with them, but puts no pressure on c extension developers to support it because subintepreters "aren't standandard" but just yet another pypi library which might fail in combination with others. Then in a couple of years if the ecosystem adopt and supports them, it can be moved to standard.

</comment><comment><USER30> Is this like V8 Isolates for Python?

</comment><comment><USER31> Oh how I wish Python had just sucked it up at 3.0 and eaten the performance hit for removing the GIL.

By now, everybody would have optimized it back to normal (or better!).

<comment><USER7> There was no possible way to do that given the things python lets you get away with "atomically". Requiring explicit synchronization to avoid data races would have been an even bigger language break than the other breaking changes in 3. Python is not a language for people who want to do fine-grained explicit concurrency.

And doing it implicitly would require stupidly fine-grained locks on all objects, destroying any performance gains; there's no way to "optimize" that to GIL performance.

<comment><USER32> There's still plenty of programs where you'd want to spawn a thread that basically doesn't touch any of the data of the parent thread. It'd be nice if there was a way around the GIL for those cases.

As an example take the multiprocessing.pool.ThreadPool.map function. _Most_ of the use-cases of that function only read from the parent threads memory once to pass the function arguments. After that the thread may very well spend a lot of time only reading memory it reserved itself. It's rather wasteful to have that thread wait on the GIL.

Of course I haven't got an obvious solution either but it seems to me that for at least a subset of the uses of threading you could work around the GIL without breaking python too badly.

Perhaps split the GIL into a per-thread Thread-interpreter-lock. That way each object can simply be annotated with which lock it belongs to. That way you still get proper atomicity like you're used to in python, but a thread might also _actually_ run concurrently a lot of the time if it only touches objects it created itself.

<comment><USER7> > There's still plenty of programs where you'd want to spawn a thread that > basically doesn't touch any of the data of the parent thread. It'd be nice > if there was a way around the GIL for those cases.

Subinterpreters gets you that (eventually; not in v1 apparently).

> Perhaps split the GIL into a per-thread Thread-interpreter-lock. That way > each object can simply be annotated with which lock it belongs to. That way > you still get proper atomicity like you're used to in python, but a thread > might also actually run concurrently a lot of the time if it only touches > objects it created itself.

I don't think this scheme would work especially well (or not better than subinterpreters). Message passing still requires copying, or some way to quiesce other threads and recursively change lock ownership of an object graph. To avoid deadlocks, at least one thread will need to drop its own lock to acquire the thread lock of objects owned by a 2nd thread. I'm not sure you could do that and preserve the legacy global atomicity behavior, and it would by definition be slower and bloatier on any individual thread than the existing GIL behavior.

</comment></comment></comment></comment><comment><USER33> Why does Python move at such a glacially slow pace? The language itself is unfortunate, the implementation even worse. Why can none of these problems be fixed?

Though, maybe it doesn't matter. Julia is better in every way and supports easy Python interop. It's already a questionable decision to start a new Python project today and it probably will only become more questionable in the future.

The language no longer serves any niche nor has any purpose. Let's just all move on.

<comment><USER3> Read the other comments and people says it moves too fast.

People are never happy.

<comment><USER34> And beazley wouldn't care, right?</comment></comment></comment>


The Case for an 8-Hour Work Week - <AUTHOR> https://www.vice.com/en_us/article/j5wnzb/the-case-for-an-8-hour-work-week <comment><AUTHOR> Every now and them, some article or study regarding the relationship between working hours and quality of life appears. This one is not different on the conclusion that we would be better off working less hours and pursuing other activities outside of work. This particular quote just hit me home and brought me to share this article here:

>Now, all most people really do in their spare time is get ready to go back to work. We wash our clothes, buy groceries, clean our homes.</comment>


Amex cancelled my card. Now what should I do? (2009) - <AUTHOR> https://hasbrouck.org/blog/archives/001638.html <comment><USER2> mainly due to their exorbitant fees, I stopped using, and then cancelled my amex card at least 10 years ago.

best move ever.

I advise all other amex users to do the same.

(Apart from the fact that using amex cards is discouraged by most vendors because of amex's excessive fees to them, and amex's excessive fees to you.)</comment>


The Promise of Prediction Markets [pdf] - <AUTHOR> http://bpp.wharton.upenn.edu/jwolfers/Papers/PromiseofPredictionMarkets.pdf

<comment><AUTHOR> _Consider a contract that pays $1 if Candidate X wins the presidential election in 2008. If the market price of an X contract is currently 53 cents, an interpretation is that the market "believes" X has a 53% chance of winning._

Some how this seems a bit too linear...

<comment><USER2> "linear"? What do you mean?</comment></comment>