Building TypeScript Projects with Bazel - <AUTHOR> https://blog.mgechev.com/2018/11/19/introduction-bazel-typescript-tutorial/#hn <comment><USER2> I've used bazel pretty extensively and I have to say it's not fully baked unless you're using it the way Google does internally (vendor _all_ dependencies) and you're using a language Google does internally.

Additionally, it wants to take over your _entire_ build process end to end. Get used to prefixing every shell command with `bazel run` or `bazel build` because everything goes into a little sandbox and bazel likes to be in the middle of everything.

These tradeoffs make sense at Google scale (the goal of bazel is to have very repeatable builds), but in my opinion it's a huge drag with not much benefit for smaller shops (to be clear, "Oh you only have 200 developers?" Still a small shop by these standards)

<comment><USER3> I am a minority I feel but everywhere I have ever worked I have always pushed to keep your dependencies close. There was never a way to reproduce a build without doing so.

I know other smart people want badly to trust in outside sources ... but I am old and jaded.

And never skipped a build because npm was down... or before that if I could get a jar from a remote source ... and so on.

<comment><USER2> Vendoring is totally a thing you can do, but keeping them up to date with upstream (and keeping your bazel BUILD files current) is a full time job. You have to hire someone to do that work, it's not completely automatable.

<comment><USER4> Non-security upgrades probably _shouldn't_ be automated.

<comment><USER2> Absolutely agree. But I meant maintaining BUILD files for code you didn't write can be very time consuming. Even a security-only update can include new source files that you now have to tell Bazel about. It's real work

</comment></comment></comment></comment></comment><comment><USER5> Some features that I find elegant in Bazel, but probably don't have that much impact on small projects/teams is the whole concept of "visibility"[1]. For large projects, being able to control who can take a dependency on your code is really nice.

This mixes really well with automatically adding Required reviewers in Pull Requests based on which folder gets modified [2][3].

[1] [https://docs.bazel.build/versions/master/be/common- definitio...](https://docs.bazel.build/versions/master/be/common- definitions.html#common-attributes)

[2] [https://docs.microsoft.com/en- us/azure/devops/repos/git/bran...](https://docs.microsoft.com/en- us/azure/devops/repos/git/branch-policies?view=vsts#automatically-include- code-reviewers)

[3] [https://help.github.com/articles/about- codeowners/](https://help.github.com/articles/about-codeowners/)

<comment><USER6> It's also incredibly nice for having a clean deprecation process.

Make visibility private except to current blaze deps, and then deprecate or delete as normal. You can be certain no one new will depend on the old stuff.

</comment></comment><comment><USER7> As a Googler I am very satisfied with Blaze (the internal version of Bazel) at work. But I just don't want to manage such a complex beast for my own personal projects. Besides the large amount of dependencies to install for a build tool, it demands me to manually rewrite the build script for almost all third party libraries. At Google someone has most likely done that for me, but outside it, I have to do it myself.

<comment><USER2> This is the catch with Bazel. All of its integration with npm, pypi, crates.io, etc are hacks that essentially vendor the source of your dependencies and attempt to generate BUILD files for those deps with some heuristics. For a lot of packages the heuristics work, but not all. Ultimately bazel needs you to vendor and hand-maintain BUILD files to get a seamless experience.

</comment></comment><comment><USER8> Unrelated, but the GitHub logo in the corner covers a significant portion of the content for me on mobile. This isn't too annoying because I can go into reader mode, but I thought I might mention it in the hopes that it gets fixed.

</comment><comment><USER9> I cannot believe how popular TypeScript has become. Is Microsoft running a huge ad campaign?

I've used TypeScript for frontend work (Angular 2) for about 6 months. I did not renew my contract because I did not enjoy constantly fixing TypeScript configuration, versioning and source mapping issues.

My new company switched to TypeScript for backend work and development across all teams has slowed down noticeably. I spend a lot of my time just discussing with colleagues what types should be called and whether or not we should merge two types together into one or whether or not it makes sense to have two different types to represent essentially the same data in order to enforce different constraints on the user of the data depending on the kinds of functionality that we want to expose.

Then, as we build the project (in an agile way), we have to keep renaming and combining types ALL the time because otherwise we end up with too many different types that sound almost the same and have almost all the same properties but are slightly different semantically.

Also, we spend a lot of time just thinking about what the intention of the user should be and all the ways in which we can impose contraints on them instead of correctly acknowledging that the user will always find some way to do whatever the heck they want and that all this strict typing adds no real value once you introduce the human factor.

Ironically, the so called 'stupidity' which TypeScript aims to protect the code from will find even more compex, more creative and less obvious ways to express itself within that code.

<comment><USER10> What are you talking about? Lost productivity compared to what, JS? Merge types? You can just use `&` to combine them if need be? Discussing types? Does it matter _that_ much, and I mean refactoring them isn't a big deal if need be. Two different types represent essentially the same data? You've tried extending interfaces or using generics?

Seems like you lack an experienced TS developer in your team and are contributing your lack of experience as a fault of the language itself. The typing has saved my ass maany times and makes the code in our projects actually maintainable for us and for someone outside of our team's bubble. It might take a while longer to code the app, but it'll take less hours in the long run to keep it safe and working.

<comment><USER11> > Discussing types? Does it matter that much [?]

Well, if you've decided to use TypeScript for some reason other than momentary whim, it must matter a lot...

<comment><USER12> I assume the point is that creating new types is very simple, so if you need a new one, then you can just make one, call it what you like, put whatever you need inside it, and start to use it. You don't need to have interminable discussions about this.

If you need more stuff in the type later, you can add it. If the name turns out to be wrong, you can change it. If you need to remove something, you can do that. If you just decide that it was a bad idea, you can get rid of it entirely. In each case, you can just make the change, and the compiler will show you all the code that has to change because of it.

If this is some public-facing or versioned thing then some discussion would be warranted - but you would have had to do that already, types or no! (But even if the worst happens, and some new type gets added in, and it's kind of wrong, and it gets exposed anyway: at least you know about it.)

<comment><USER10> You gave a better answer than I could have done myself :). Yes, more or less so. Sometimes there can be tricky typing issues but in those cases somebody wiser often comes in and the problem is solved together. At times it's better for individual developers to try to solve say a typing problem on their own instead of somebody else giving them an immediate answer. Maybe it decreases productivity a little bit, but in the long run it's better for developers' individual growth. Though incase the problem is too difficult, I can't emphasize enough the importance of the wisdom of experienced developers.

</comment></comment></comment></comment></comment><comment><USER13> Anyone had any luck embedding Bazel in another build system, like CMake? Tensorflow's C++ API seems to only support building with Bazel[1], which makes it painful to integrate into a standard C++ build pipeline (don't want the person maintaining the build to come after me with an axe). I'm seriously considering just rewriting to Torch for low latency deployment, which is nicely packaged in the standard manner of library + header file rather than trying to force users to incorporate a heavyweight, esoteric build system just to use the library.

1\. [https://www.tensorflow.org/guide/extend/cc](https://www.tensorflow.org/guide/extend/cc) \- "The C++ API is only designed to work with TensorFlow bazel build. If you need a stand-alone option, use the C API" (and the C API page notes that it's "designed for simplicity and uniformity rather than convenience", making it unsuitable as a wholesale replacement for the C++ API).

<comment><USER14> Eventually they'll refactor the C++ and Java hard-codes functionality into Starlark rules but until then, they don't support exporting headers from Bazel C++ yet— [https://github.com/bazelbuild/bazel/issues/5192](https://github.com/bazelbuild/bazel/issues/5192)

</comment></comment><comment><USER15> Unrelated to typescript. I use bazel for about 1 year, and super happy about it. Builds are really fast and reproducible.

<comment><USER16> Same. Bazel is a breath of fresh air after CMake. Makes me actually _want_ to use C++ for daily work.

<comment><USER17> Have you tried Meson? It's also a breath of fresh air after CMake, but while Bazel is a "corporate" build system (wants to take everything over, assumes one consistent environment), Meson is a "very Unix" build system, it aims for portability, configurability and reproducibility.

<comment><USER15> It doesn't take everything over. You can use repository rules to build dependencies in whatever way you want.

Also, it's not corporate and not bloated. If you understand the system well enough, you can create support for a language yourself from scratch without spending huge amount of time on it.

</comment></comment></comment></comment><comment><USER18> I always enjoy reading about build systems. I wish there was a run-down on how internal global build systems work across large companies (eg. Brazil vs. Blaze/Bazel vs. Pants vs. etc etc)

<comment><USER19> You may enjoy this article: [https://ruudvanasseldonk.com/2018/09/03/build- system-insight...](https://ruudvanasseldonk.com/2018/09/03/build-system- insights)

</comment></comment><comment><USER14> For more examples of how to use Bazel with TypeScript or JavaScript, have a look at the code samples I shared in this somewhat unrelated GitHub issue: [https://github.com/bazelbuild/rules_typescript/issues/344](https://github.com/bazelbuild/rules_typescript/issues/344) (near the bottom I post a few more realistic ones as I experimented with getting webpack working, etc.)

It's a possibility that some of this post (the TypeScript-Rollup chaining) might have been inspired by this issue (maybe), but as I note in various places there, it's been tricky to get these three separate projects to work together — rules_nodejs was recently updated to better work with npm with an escape hatch if your node or compiler code cannot be rewritten to allow Bazel to manage your npm modules - but while rules_typescript was rewritten to support rules_nodejs, the otherwise excellent rules_closure is not updated to support such npm modules.

With few dependencies, and with caching of individual modules, your builds can go lightning fast so you don't need the watch mode that webpack promotes so heavily. However, ibazel lets you watch your codebase for changes and rebuilds, it just doesn't inject into your browser and host a web server for you the way webpack does.

I'd say at this point Bazel deserves your experimentation, but until it supports all common JS build tools and scenarios, including linting and IDE integration (there's some but currently it's all maintained by groups at Google and not the IDE companies themselves the way other build tools are integrated),so it'll be a hard sell for most companies to adopt it wholesale, unless, like Dropbox and others, you have a diverse set of programming languages and targets that have shared dependencies that, when changed, you want to trigger partial rebuilds of multiple projects. But the dependencies have to be supported by the rules you're using and right now, there are some limits to what first-party rules support.

The tools are at a state where a couple people on your team will need to learn Starlark, the Python-like language used in lower-level .bzl files (which can define rules and macros that the BUILD.bazel files that can then refer to) and especially the internals of Bazel including reading source code, a lot of it. This is because the debugger tools are there but not fully bug-free yet, they don't provide the rich debugging experience you've grown to expect with other languages. It's kind of like debugging and writing Go code early on — you knew once you found the right syntax that it would be obvious but until then it was a lot of experimentation and copying other examples. It's obvious the teams at Google are pushing Bazel's development hard, but the Angular team right now is most visible in trying to make things easier for third-party, non-Google development workflows using Bazel. And I'm sure the project will be one to watch in 2019.

<comment><USER20> From what I gather, bazel is used to build Angular itself but users of Angular mostly use angular-cli which is a webpack wrapper that does not use Bazel.

Bazel seems to be too resource intensive and complicated for use outside of Google - at least for JS projects.

</comment></comment><comment> n-gatedotcom I am not very familiar with build systems but how difficult would it be to make one that wraps the native ones whenever and provides modern features, unlike make.</comment>


A short and powerful infinite scroll list library for angular5 - <AUTHOR> https://github.com/a-jie/angular-infinite-list <comment><USER2> The title can be add to `Show HN:` as this post seems a perfect fit for that.

Btw, I found and reported a bug (in demo page, not the library itself, I didn't try the library yet) .

[https://github.com/a-jie/angular-infinite- list/issues/8](https://github.com/a-jie/angular-infinite-list/issues/8)</comment>


A computer made from DNA can compute the square root of 900 - <AUTHOR> https://www.newscientist.com/article/2228461-a-computer-made-from-dna-can-compute-the-square-root-of-900/ <comment><USER2> Scott Aaronson's ETH Zurich lectures talk about physical computing (and its limitations, exception being Quantum computing) here: [https://gess.ethz.ch/en/news-and-events/paul-bernays- lecture...](https://gess.ethz.ch/en/news-and-events/paul-bernays- lectures/bernays-2019.html)

He even makes his own "Soap bubble" computer from people who claim that soap bubbles can be used for global parallel optimization problems. Spoiler, it doesn't work well and gets stuck in local optima as the size gets larger.

Before anyone gets too excited about physical computing ideas, I think watching these 3 lectures from prestigious "Paul Barney's lectures" is a must. They're about Quantum computing but Scott spends a full lecture about Turing/Extended-Turing thesis and what types of computers in past have tried to break those conjectures (and failed). That is why Quantum computing is interesting - he also dispells a lot of myths about QC we hear today in popular media. Fascinating stuff and I highly recommend spending 3 hours to watch these videos if you're interested in the future of computing.

<comment><USER3> Sad, I loved the idea of bubble computing.

I wonder if there are similar ideas with complex electric fields to model equation and enjoy "RT" (sampling speed time) evaluation of solutions.

<comment><USER4> Every time I hear about a sad story of "this scientist had spent their whole life trying to discover the better computing in DNA and failed" I feel like the reporters are not mentioning the fact that actually the scientist knew perfectly well that their model of computation was inherently unscalable and they were simply pulling money out of absolutely oblivious investors.

Oh god I love the _idea_ of better computing. But let's be honest, there isn't much of an alternative, is there?

<comment><USER5> At some point it becomes important to ask yourself, "What would I be content spending my life failing to accomplish?"

I mean, it'd be nicer to accomplish it, but if you can find something that you could spend fifty years failing at, that on your deathbed you would simply be happy you tried, that's something really special.

<comment><USER4> Yeah, but it doesn't mean these people deserve any pity. They actually did something they love. And the fact is they almost certainly knew the risks involved - it's not like they were jumping into unknown.

</comment></comment></comment></comment></comment><comment><USER6> We know this is true, because most people can compute that it is 30. The interesting thing is how little dna is required.

<comment><USER7> This is the furthest thing from the truth. That a human has a certain capability does not in the slightest imply that "DNA", at least as commonly understood, encodes that capability, at all.

A bunch of molecular recipes encoded in a few gigs of nucleotides with some crude feedback loops do not a human make.

Quite apart from epigenetics as it's commonly presented (methylation, and all sorts of histone antics), you might recall that DNA itself doesn't magically grow up: you do need a cell.

It's somewhat (and only poorly) analogous to being handed the source code to a C compiler written in C, without knowing C. Does the C code really encode C? Well, not without the compiler it doesn't....

There's then a very interesting discussion around how it's even possible for a mammalian nervous system to bootstrap itself. Figuring out walking seems perhaps emergent: it's a learnable technique based on not falling. But how do dog breeds retain intrinsic high-level behaviours even if they've never observed them? What makes a Shepherd so concerned when his assumed flock becomes dispersed?

We are a tremendously long way from answering these questions, but I would caution anyone who thinks it just "in the DNA".

<comment><USER8> Our lad was making a joke

</comment></comment></comment><comment><USER9> Long ago I once attended a conference whose keynote presentation was by a group which was involved in DNA computing. They were talking about using a beaker of solution to compute a Hamiltonian cycle of length, I dunno, let's say 15. I asked how large a beaker would be needed to compute a cycle of length 25. The answer was: about the size of the Pacific Ocean. :-)

</comment><comment><USER10> Good Golly Miss Molly when the coin miners discover this tech, the Earth will be waist deep in goo.

</comment><comment><USER11> I can't wait for the first artificial neural network written in DNA.

<comment><USER12> I do wonder however whether there exist a deep learning architecture built with real neurons.

<comment><USER13> is that not what you and I are?

<comment><USER5> Nah, everyone knows our brains are just quantum antennas for communicating with our immaterial souls that just coincidentally resemble neural networks.

<comment><USER14> This is the best explanation for why AI is impossible.

</comment></comment></comment></comment></comment><comment><USER15> Man, when we can go one layer up, like say DNA = Verilog, and neurons, cells, etc = FPGA, things will change in profound ways.

Edit: maybe a couple layers?

Anyone knowledgable care to speculate? I would find that interesting to read

<comment><USER16> I don't think this is quite what you meant, but

> DNA = Verilog

reminded me of this paper: [https://science.sciencemag.org/content/352/6281/aac7341](https://science.sciencemag.org/content/352/6281/aac7341)

They made a tool called Cello that uses Verilog to design genetic circuits with simple logic gates and stuff like that.

<comment><USER15> No, but that is cool.

</comment></comment></comment><comment><USER17> The "ten building blocks" in the press article are actually ten bits (probably implemented as short DNA sequences chained together). I'm not sure why they can't calculate the square root of 961.

These kind of DNA computers had a lot of hype a few years ago, but for the real applications they are too low and difficult to retarget.

<comment><USER18> I'm guessing that one reason is that I/O is problematic. But once you can do sufficiently large computations (e.g. factoring large primes), I/O becomes the easy part.

</comment></comment><comment><USER19> I wonder how they are a surprised since Leonard Adleman (the 'A' in RSA) developed the field in 1994 solving the the Hamiltonian path problem with seven points[1].

[1] [https://en.m.wikipedia.org/wiki/DNA_computing](https://en.m.wikipedia.org/wiki/DNA_computing)

</comment><comment><USER20> It even solves many word problems correctly! "If I have $90 and a cookie costs $3, how many cookies can I buy?"

<comment><USER21> None, because now you owe $9997 dollars to cover the costs of the DNA calculation.

</comment></comment><comment><USER22> It's worth to mention Leonard Adleman's (of RSA fame) research from 1994 on using DNA to solve Hamiltonian path problem in graphs.

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

</comment><comment><USER23> It's interesting to consider that humans are computers made from DNA too.

<comment><USER24> No idea why people are downvoting you .... it's not like this is a far out statement. People get offended when I just call us "meat computers".

<comment><USER23> And most of the other top-level comments express the same sentiment as mine but at a later time. It's definitely not worth trying to understand the whims of HN voting.</comment></comment></comment>


Google+ has a Facebook page .... - <AUTHOR> http://www.facebook.com/Googleplushelp

<comment><USER2> It's clearly not official. It seems to be associated with chhahat.com</comment>


Rust playpen - <AUTHOR> http://playtest.rust-lang.org/ <comment><USER2> Neat! I'm hoping this is going to stay (and eventually end up on the home page).</comment>


How I left behind my silicon dream for a saner place to work - <AUTHOR> https://m.signalvnoise.com/how-i-left-behind-my-silicon-dream-for-a-saner-place-to-work-3c58c9bc24ab#.pqu70xkad <comment><USER2> At the end it's essentially a promotion for Basecamp.</comment>


Microsoft sales soar for all its non-Windows products - <AUTHOR> http://money.cnn.com/2015/01/26/technology/microsoft-earnings/index.html?sr=fbmoney012615microsoft0800story

<comment><USER2> Error in article fina three months of 2014 rather than 2015.

Why does share prices drop 4% ? Is it because of announcement that they will have weaker future results ?</comment>


(Less) known methods to improve your Google Analytics accuracy - <AUTHOR> https://blog.innertrends.com/6-less-known-methods-to-improve-your-google-analytics-accuracy/429

<comment><USER2> These are the basics everyone knows about them. I don't think that there is anything impressive in it!!!</comment>


Show HN: SwipeyTunes – Tinder style iTunes cleaner - <AUTHOR> Link: https://freeda.in/Swipeytunes.zip<p>I wrote a small blog post to describe why I built the app. https://medium.com/@Duj/swipeytunes-or-how-i-fell-in-love-with-my-music-all-over-again-b3e686b075b3#.yaziiohu0 <comment><USER2> Possible to share the code? Would like to add few features to it for my personal use.</comment>


Microsoft's Ballmer: Android Isn't Really Free — You Have To Pay Us For Patents - <AUTHOR> http://techcrunch.com/2010/10/03/android-isnt-free/

<comment><USER2> "Where has Microsoft been the past couple of years with these suits? I'll tell you where: waiting to spring this on OEMs when they had their own device out there that they need to gain traction against Android."

The author had me until this. Whenever someone tells me "I'll tell you why..." in that tone, it is usually because they are angry, and anger is usually not the best ingredient for clear thinking.

First off, Microsoft has been floundering around in the mobile space, because:

1 - Windows Mobile was just a disabled version of Windows, just like J2ME was a disabled version of Java. It was a whole new environment. They should have developed Win Mobile from scratch.

2 - Windows Mobile is no iOS. iOS was adopted by users because of the great hardware and software design. Win Mobile- design stuck in the early 2000s.

3 - Android was well adopted because (a) it was Google and (b) it was free. And oh yeah, it is pretty good, even if not as snazzy as iOS all of the time. So far Windows Mobile, not so much.

MS had a number of opportunities to position itself as a "real OS" running on a mobile device and do something with that possibly, but it didn't.

So MS screwed up and has now decided to go on the attack to divert attention from the recent press on Ballmer losing his bonus because of Win Mobile, as well as Win Mobile being a failure in the news.

MS also probably smelt blood with the Oracle suit and Wifi spying and figured Google's lawyers and PR were as weak as they might get anytime soon. Also they don't come off as the bad guys like Oracle, and their suit probably gains more legitimacy when there are other high profile suits.

But seriously, were they waiting on this opportunity like hungry wolves _to gain traction on Android_? No, Win Mobile is nowhere near Android, so it wouldn't make sense to take a slash at them to try to gain on Android. It would just mean Apple would get more sales. They want to take down _Google_.

Despite all of this, MS is still worth watching. Even though they shouldn't try to head to head with Google so much, and they'd do better by focusing efforts on new products and markets and pretending Google and Apple didn't exist, they aren't going away anytime soon.</comment>


Google Launches The Chromecast To Bring Chrome To The Living Room - <AUTHOR> http://techcrunch.com/2013/07/24/google-chromecast/ <comment><USER2> The obvious question: Why would you buy this if you already had an Apple TV (or were considering buying one)?

* Cross-platform support, not just iDevices

* For apps that integrate with the SDK (currently Youtube & Netflix, but I am sure more will be coming soon), the processing of the content can be transferred to the the Chromecast. Hence, once you "flick" your Netflix content to Chromecast, your phone is free and not processing content anymore unlike Airplay, which is a huge win for your phone's battery.

* All your phones/tablets/computers become your remote/controllers.

* The price (at $35, it's a relatively low-risk impulse buy)

* UPDATE: It automatically switches to the HDMI input channel when streamed, atleast on my LG TV. My 3rd gen Apple TV doesn't so I have to find the TV remote to switch HDMI inputs, which can sometimes be annoying.

<comment><USER3> _For apps that integrate with the SDK (currently Youtube & Netflix, but I am sure more will be coming soon), the processing of the content can be transferred to the the Chromekey. Hence, once you "flick" your Netflix content to Chromekey, your phone is free and not processing content anymore unlike Airplay, which is a huge win for your phone's battery._

If that's the case, I wonder why Chromebooks (other than the Pixel) aren't compatible.

<comment><USER4> It's probably because of CPU power. Encoding high resolution video take a lot of CPU power, and the Pixel has more CPU power than other Chromebooks.

<comment><USER5> That is the point of the question. If it requires CPU usage, how does it save battery.

<comment><USER6> It only requires CPU usage when it's streaming the contents of your screen. For Youtube/Netflix, all it does is tell the key the url of the stream and everything is done either on the key or the server.

<comment><USER7> I don't believe that's correct -- from what I can tell, when it's streaming webpages, it is actually only synchronizing two copies of Chrome -- one on the stick, one on your PC. It is not encoding/transmitting a video, as with AirPlay or Miracast.

<comment><USER8> From what do you discern that? Given that everything they showed about the the product was variations of it receiving and decoding a video stream, it would be quite a switch for it to also have a full platform running a web browser in synchronicity. It seems much more likely that it is a direct video send, making it enormously simpler to design.

<comment><USER9> > The receiver device runs a scaled-down Chrome browser with a receiver > application that receives data over Internet Protocol and transmits it to > the television via HDMI.

[https://developers.google.com/cast/](https://developers.google.com/cast/)

<comment><USER8> Very cool, though incredibly surprising (a browser is an intensive, complex thing, so will people have to constantly be patching their Chromestick?), especially given that once you add the cost of synchronizing all interactions, it seems so much easier to simply video grab the tab.

If anyone has this device, what is CPU usage on the source like when tab- casting?

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER10> > Note: You may not publicly distribute or ship your Google Cast application > without written permission from Google, per the terms of service described > below.

[https://developers.google.com/cast/downloads/](https://developers.google.com/cast/downloads/)

> YOU MAY NOT PUBLICLY DISTRIBUTE CODE CONTAINING THIS SDK OR REFERENCING > THESE APIs WITHOUT A WRITTEN AGREEMENT WITH GOOGLE ALLOWING YOU TO DO SO.

> By accessing the download links below, you indicate that you have read and > accept Google's API Terms and further agree not to publicly distribute code > containing the SDK and APIs accessed through the links below unless and > until you enter a written agreement with Google providing such permission.

> If you wish to discuss shipping your apps, please write us at chromecast- > firstname.lastname@example.com

</comment><comment><USER11> Awesome. This will nicely round out my HTPC setup. I have an R-Pi running XBMC along with an MK802ii on which I've built a system which lets me trigger music playback from XBMC using RFID cards.

[http://fuzzysprojects.wordpress.com/rfid-triggered- music/](http://fuzzysprojects.wordpress.com/rfid-triggered-music/)

I had been working on a way to get youtube vids to playback in XBMC by firing a json call at it, but with out spending time hacking together my own chrome extension I was never going to be able to make it easy enough for my wife to do.

I had already made the purchase before I headed here to the comments and noticed that it also came with 3 months of netflix. Nice bonus.

PS: the learn more link isn't working atm: [http://www.google.com/chromecast](http://www.google.com/chromecast)

</comment><comment><USER12> Absolutely blown away by this. This might just lead us one step closer to the grand unification of devices in the living room that has long been dreamed of.

I'm more excited about this than the xbox one announcement that's for sure.

The price is unbelievable ($35)...an impulse buy.

 _edit_ (come to think of it I'd bet we'll start seeing "chromecast ready TVs" by Christmas.

<comment><USER13> I know. I had already typed a tweet about what a killer device it would be at $99 when they said $35. I went from thinking I would probably get one to now I'll get one for each screen.

</comment></comment><comment> brown9-2 It seems like existing Netflix customers have a strong incentive to "buy" the Chromecast since it is essentially free as long as your Netflix plan is $12/month or more:

 _Once your Chromecast ships, you will recieve an email with a promotional code for 3 months of Netflix. Offer valid for previous, new and existing Netflix members, one per Netflix account._

<comment><USER14> From reading the fine print, it appears that it's only the $7.99-per-month plan that's covered, but you can apply that discount against a more expensive plan.

[Edit: note that that still leaves it very cheap.]

<comment><USER15> Yes. If you already have Netflix, it's essentially a $12 device. Stupid easy decision to make.

Disclaimer: I just bought one.

<comment><USER16> > $12 device Not exactly. With shipping plus taxes , total came to ~ $41. So > 41 - 3 x 7.99 = $17 device

<comment><USER17> I don't know, I just bought it on Amazon with free shipping and spent a total of $35, so it's effectively $11 for me factoring in the Netflix savings.

</comment></comment></comment></comment></comment><comment><USER18> I love this. Last year I was super-excited about the Nexus Q (I have my I/O freebie in a box somewhere) but was disappointed by a) the price and b) the lack of an SDK.

A year later, we get ChromeCast. It's a tenth of the size, a tenth of the price, and supports every device in my home. I'm glad Google decided not to run with the Q and had the balls to pull it out of production while they (I assume) worked on ChromeCast.

</comment><comment><USER19> It's not clear to me what this means for Google TV, which, it seems, has long been a bastard stepchild in the Google consumer product family. If I both wanted to play games and take advantage of Chromecast apps on my other devices, I guess I would need both? Or maybe there will be a Chromecast receiver app for Google TV?

More broadly, this seems symptomatic of the continued tension between the Chrome and Android platforms within Google, since this is yet another space where they're stepping on each other's toes without obvious rhyme or reason from a consumer perspective.

<comment><USER12> I wasn't even aware Google TV was still a "thing". I had assumed the product line was long dead.

<comment><USER19> Third-party manufacturers are still making devices (both set-top boxes and TVs) on top of it, and new features were announced for it at this past Google IO. But it's barely alive, I think.

</comment></comment></comment><comment><USER20> I just ordered one. Impulse buy on my part - but with a SDK + support for multiple devices, I have high hopes for it. Looks really awesome, and it'll probably land up being pretty hackable. :D

<comment><USER21> Same here. I hope it won't be long until VLC supports this thing.

<comment><USER22> I hope they can find a way to stream XBMC to it. This solves SO many of my home theater problems if they figure that out.

<comment><USER20> Better yet, just port XMBC to it.

</comment></comment></comment></comment><comment><USER23> Looks like you can order it now (with 3 months free on Netflix): [https://play.google.com/store/devices/details?id=chromecast](https://play.google.com/store/devices/details?id=chromecast)

<comment><USER24> Just tried to buy one and got an out of inventory message :(

UPDATE: Tried again and you can no longer add it to the shopping cart. Just says coming soon.

UPDATE 2: I'm a glutton for punishment so I tried again and it worked!

</comment></comment><comment><USER25> I guess I am the only who is not particularly excited about this. Other than the price it is a "me too" response to AppleTV.

One of the most annoying thing about these devices is that because the lack of storage, they need to be streaming all the time (which is a problem with connections with a cap like in Canada) which is very inconvenient if you want to buy movies on iTunes/Google Play.

AppleTV enables game devs to use the TV as a separate common screen for multi users games but that feature seems to be missing with the Chromecast (or at least I couldn't find any reference to it)

So as an AppleTV owner I just can't help but to think this as a "meh"

<comment><USER26> Going by the hits on Amazon I'm seeing I think Roku beats AppleTV easily.

</comment></comment><comment><USER27> As a longtime AirPlay user, I find this less exciting since AirPlay works with pretty much anything that's on your iDevice. That said, cross platform is interesting.

<comment><USER28> Closed proprietary non-standard solution....

<comment><USER29> And Google Cast, with its lovely "You may not publicly distribute or ship your Google Cast application without written permission from Google" warning, isn't?

</comment></comment></comment><comment><USER30> "Powered by usb" is confusing. Does it have to be plugged into a computer to work? Or just a USB power source like a charger?

EDIT: Engadget article has more info, looks like just USB power. Exciting! [http://www.engadget.com/2013/07/24/google- chromekey/](http://www.engadget.com/2013/07/24/google-chromekey/)

</comment><comment><USER31> Just ordered mine.

I continue to be impressed by the uses Google has found for Chrome. Building new features into Chrome gives Google the capabilities of a full desktop application without the need to convince users to install new software. Google can just issue an update to Chrome to instantly ship new projects to ~20% of web users.

<comment><USER12> What's really interesting is that they seem to be accomplishing it without breaking the web a la Microsoft style.

</comment></comment><comment><USER32> I'm extremely surprised that Google actually added this to Google TV. I figured, at this point, that my 3-year-old Revue box was long-forgotten by Google.

The "play on Google TV" button showed up on both my desktop (in Chrome) and phone (in the YouTube app) some weeks or months ago, I'm not sure. It works just like this Chromecast thing was described -- whatever I was watching on the other device shows up on the TV and playback can be controlled from either side.

<comment><USER33> So you can use the tab casting feature in Chrome to cast to your Revue? I dusted my Revue off, forced it to update, and now I can control it from the Youtube app on my Android phone, but in Chrome it says "No cast devices found"

<comment><USER32> No, there's no tab casting. Just YouTube sharing. I think it's the Chromemote app that added the button to YouTube. In Android, the native YouTube app can cast to Google TV and remotely control the playback on the TV.

<comment><USER33> Ahh, too bad. Tab casting is really the killer feature to me. I thought I had finally found a reason to use the old Revue again :)

</comment></comment></comment></comment><comment><USER34> Hmm... can I only stream from Chrome? What about my local movie collection?

<comment><USER35> Officially, the chromecast API only (so far) supports sender applications built on ios, android, and chrome ([https://developers.google.com/cast/](https://developers.google.com/cast/)).

Unofficially, I'd be surprised if vlc hasn't found a way to be a chromecast sender within 6 months.

<comment><USER36> Does VLC support full DLNA stack yet?

</comment></comment></comment><comment><USER37> I'm pretty excited about this. At Google, we use Hangouts to share our laptop's screen with TVs in the conference rooms (for meetings, presentations, that sort of thing), and I've always wanted a way to do this easily at home. I'm much too lazy to plug my laptop into the TV, after all :)

Sounds like we finally have the answer!

<comment><USER26> Put a real operating system in it and I might consider dumping my excellent Roku.

<comment><USER38> I have one of those Rokus. Notice the lack of a Youtube channel :-)

</comment></comment></comment><comment><USER3> Too bad it doesn't work with Chromebooks (other than the pixel). I understand that we're lucky that the ARM-based models can even handle hi-res video at all, but I'd think the Intel-based Acer could handle this too.

<comment><USER39> I don't think the "remote" device is doing any of the work. Once the Chromecast stick gets the feed, it will be doing all the streaming, or a combination of serverside work.

I think the older Chromebooks might not have the Chrome extensions yet. I can't imagine them not being supported sometime soon.

</comment></comment><comment><USER40> This is only useful to me if it also is supported by a major Windows media player like VLC. What I like about AirPlay is that I can flick something from my phone to the TV, but also from iTunes (blech) to the TV. I would love to have a solution that did not involve iTunes. I love that the price is 1/3 of the Apple TV.

</comment><comment><USER41> The biggest news here is that the dongle is running a version of Chrome, not Android.

<comment><USER26> My Roku runs a real operating system so IMO Google loses out again by trying to push the all Google browser all the time and oh they own all our data.

</comment></comment><comment><USER42> Can I push a chrome tab to this thing and then shut off my laptop and have the tab still displayed on the chrome key? I'm thinking of using this for all of the dashboards in our office, at $35 each, that would be awesome.

</comment><comment><USER43> I wonder what the SoC is on this, and if it runs Android. I assume it has some UI for connecting to WiFi, so conceivably it could be like those cheap Android HDMI dongles inside.

</comment><comment><USER44> Can I use this without creating or logging into a Google account?

</comment><comment><USER45> The easiest way to connect my PC to a HDTV is my HDMI cable.

</comment><comment><USER46> The fine print says "power cord not shown." I'm assuming for this is the device itself? Shouldn't it be able to power through USB?

</comment><comment><USER47> Will it work if I inserted Chromecast into HDMI port of my monitor rather than a TV?

</comment><comment><USER48> I don't see this thing on Amazon.com (US store). Am I missing something?

<comment><USER49> They just added it in the last hour or so.

</comment></comment><comment><USER50> NSA, US government, tyrants everywhere, watch Google carefully for how it's done. For a fickle crowd like Hacker News, you can seize their liberty and human rights _easily_ \- just distract them with shiny new things.

For shiny new toys, some people will rationalize anything ;-)

</comment><comment><USER51> No love for Miracast

</comment><comment><USER52> How does it power itself? Does HDMI provide power?

<comment><USER53> powered by USB connection

<comment><USER13> Funny that the photos don't show that. A lot of TVs have USB ports that could maybe power this.

<comment><USER54> It's an interesting design problem for sure. Do they make it a USB dongle and have an HDMI cable going out? Or an HDMI dongle with a USB cable going out?

<comment><USER52> Function-wise two cables would be the better design. On my TV this dongle would probably interfere with cables in the ports next to it. In this picture you can imagine the problem if there was another HDMI port right above the one it's plugged into, [https://lh6.ggpht.com/jbhD_qpdQkLDEk4Y6PV9E2vBWM7__xjVzE18_J...](https://lh6.ggpht.com/jbhD_qpdQkLDEk4Y6PV9E2vBWM7__xjVzE18_Jb6DHRIWaad_F3oK5z1B-VKxazaarQ9=h900)

</comment></comment></comment></comment></comment><comment><USER55> Can it playback DIVX/XVID?

<comment><USER36> And how about subtitles?

DLNA doesn't support subtitles unless it's inlined in mp4 container.

</comment></comment><comment><USER56> I'm oddly very very excited about this especially considering the price point ($35), the size and the cross-platform support.

<comment><USER57> I wasn't, but for $35, it's easy to give it a try.

<comment><USER56> What makes it inferior to Apple TV? I own an Apple TV and beyond Netflix and Youtube I really have no use for it.

<comment><USER58> I was sold on the price point for one. Secondly, the nice thing about this is that you aren't stuck on the Apple platform. I can push content from my iPhone, my windows machine or my mac directly to the television. If you are just using it for netflix / youtube and you already have an Apple TV, you definitely won't need this.

Forgot to mention that they'll open up their SDK so you can probably expect some cool hacks in the near future.

<comment><USER59> Actually, if you're a heavy YouTube user, the AppleTV interface is terrible and out of date. It's hard to search, hard to access your playlists, etc compared to using the web site or the apps. (I have an AppleTV and it's a constant point of frustration for me.)

Making a remote-based, d-pad interface as convenient as a touch screen is very, very difficult.

</comment></comment></comment></comment></comment><comment><USER56> Why the fuck doesn't Wall Street like this? GOOG's been going down since the presentation started.

<comment> k-mcgrady This happens to Apple too. It's the way the market works. It's based on speculation. Rumours are usually much more exciting than what's actually announced, people buy based on the rumours, and when the actual products are announced (even when they are good) they fail to meet crazy expectations and the market corrects - people sell.

<comment><USER56> But does that Apple analogy apply here? Apple's rumors are at a crazier scale than Google's and Chromecast in particular was barely a whisper on the street, especially with more reports pointing to Nexus 7 in the days leading up to this event.

<comment> k-mcgrady True, I'm sure it still probably applies just to a lesser extent. I just checked and it looks like after the fall it's started to rise again. Edit: Looked again and the fall/rise is pretty much mirroring the Dow and NASDAQ today.

<comment><USER56> So basically no expectation and hence no effect.</comment></comment></comment></comment></comment>


Design Patterns of Reiner Knizia - <AUTHOR> https://bdpatterns.wordpress.com/2015/01/06/ripping-off-reiner/ <comment><USER2> For context, Reiner Knizia is a quite well-known and well-regarded, and certainly the most prolific, board game designer.

His game designs generally rely on simple components (say a deck of cards or tiles and a grid) bound together with simple rules that are mathematically balanced to engender internal and external conflict.

</comment><comment><USER3> Looks like this article was originally posted 11 months ago.

Anyway, regarding the Engineering quote: Patrick Stewart did not do the narration for Civ IV. That distinction most definitely falls to the late Leonard Nimoy. ([http://www.imdb.com/title/tt0488998/?ref_=nm_flmg_act_14](http://www.imdb.com/title/tt0488998/?ref_=nm_flmg_act_14), [http://www.mobygames.com/game/windows/sid-meiers- civilizatio...](http://www.mobygames.com/game/windows/sid-meiers-civilization- iv/credits))

The Engineering quote, meanwhile, is not from a French saint, but a Frenchman named Antoine de Saint-Exupéry: a writer, poet and aviator. ([https://en.wikipedia.org/wiki/Antoine_de_Saint- Exupéry](https://en.wikipedia.org/wiki/Antoine_de_Saint-Exupéry))

<comment><USER4> It's a joke :) I mean, he is revered, is he not?</comment></comment>


10 Biggest Milestones in Web Development - <AUTHOR> http://nettuts.com/articles/web-roundups/10-biggest-milestones-in-web-development/ <comment><USER2> "37 Signals Release the Getting Real Ebook" -- in the top ten? Wow, I'd have put other things there like MySQL, the first open source load balancer, flash- based video, etc.</comment>


Want My Advice? Um, Not Really - <AUTHOR> http://online.wsj.com/article/SB10001424052748704421104575463540853116732.html?mod=WSJ_hps_RIGHTTopCarousel_1

<comment><USER2> While the points made are valid, I think this article misses out on the broader contextual change that has happened. It's not just kids looking through YouTube for how-to videos; my parents and my grandparents use it too. The availability of information has changed many aspects of many types of relationships, and this particular observation is really part of a much broader trend which has by no means ended. As technology is evolving, responding, and spreading; I'm enjoying watching the internet become increasingly more pervasive and predictive about the sort of information all people need. The internet is - without a doubt - the world's largest and greatest experiment.

</comment><comment><USER3> Every generation seems to rehash this topic in some form or another. Every young generation thinks they're different from the previous one, and every older generation shakes their heads and says "kids these days...". My generation was labeled Gen X and described in ways that didn't fit anyone I knew. So when I see these stories my only reaction is, "huh, a writer needed to meet a deadline."

</comment><comment><USER4> One important point here is that it isn't only the differences in the value sets between older and younger generations -- it's also the fact that people when giving advice do it from their own point of view, instead of trying to put themselves in the advisee's shoes. And this goes for any age or culture -- when elder people give an advice to buy a house, they use their own metric and don't take into consideration what might be important to the younger guy.

</comment><comment><USER5> If you want good advice from the previous generation, get it for general direction as opposed to something specific like "I want to hold my wedding at the south pole". Good mentors and teachers know the _inner_ scenery rather well and can help greatly with that. They may not be very familiar with the _outer_ scenery that we encounter daily, so that is what probably makes the specific stuff not so good.

</comment><comment><USER6> I think this misses the broader point that unasked for advice is usually unwelcome anyway, regardless of the age of the adviser.</comment>


ValueObject - <AUTHOR> http://martinfowler.com/bliki/ValueObject.html <comment><USER3> Equality is an often overlooked complexity in denotational semantics. Dijkstra wrote an EWD [1] on the subject, which should give insight into the difficulties of this presumably simple relation.

In most languages, I prefer to think of equality as a property outside of structure or class. Languages such as Java bind equals() strongly with the object, but this is a mistake. First of all, it promotes ordering where there is none. Equality is reflexive and symmetric. Second of all, it does not allow for multiple forms of equality. Lastly, since it is defined in Object, it forces the equality relation to all underlying types, even when there is no equality defined.

[1] [https://www.cs.utexas.edu/users/EWD/transcriptions/EWD10xx/E...](https://www.cs.utexas.edu/users/EWD/transcriptions/EWD10xx/EWD1073.html)

<comment><USER4> Multiple forms of equality: I think there should be just one "equality": the obvious structural one, which can be inferred by a compiler. What examples are there of cases where there is no obvious equality but still the official "equality" tag is needed?

EDIT: got downvoted, why? It's a serious question. I've never had any use for any equality besides the structural one. Honestly want to see if anyone can come up with a valid case.

<comment><USER5> Is the angle -90 equal to 270?

Is the quotient 1/2 equal to 3/6

Is the string "Bébé" equal to "Bebe"?

Is the float 0.555555559 equal to 0.6?

Is the color RGB(1,1,1) equal to Lab(100,0,0)?

Is the equation y=3x+2 equal to y-2=3x?

Is the function x=>2+x equal to y=>2+y?

<comment><USER4> > Is the angle -90 equal to 270?

> Is the quotient 1/2 equal to 3/6?

I think these are good examples that come up in the real world a lot. The representation structures we use are not sufficient for precise specification. So we have to overspecify (making a superfluous choice in representation, -90, 270, 630?).

My opinion still is that data must be normalized with explicit procedure calls. Doing stuff implicitly is neither beneficient to efficiency nor to comprehensibility. Explicit normalization allows to leverage what the compiler _can_ infer.

The other questions I have to return because it's not even clear to me, " _Should_ they be"?

<comment><USER6> > My opinion still is that data must be normalized with explicit procedure > calls. Doing stuff implicitly is neither beneficient to efficiency nor to > comprehensibility.

It can certainly benefit comprehensibility. Needing to explicitly normalize before I can apply standard comparisons leaves more space for things to go wrong. "Having a value of this type means that I have a normalized value" means I have fewer things to keep track of. (I do note that there is significant space between "it can benefit comprehensibility" and "it will always benefit comprehensibility" \- that depends on what I need to be readily able to pull out of the implementation from a quick read of surface syntax)

Also, some things may have an easy equality check while normalizing may be expensive or impossible - although I sadly can't think of any examples off the top of my head.

</comment></comment></comment></comment></comment><comment><USER4> Fairly long post with a simple message: Data is the truth, it is useful to think about the values that live in the program, and about their relations. It is useful to think about what things are "objects" and thus need identities.

This is not obvious to OOP people. In OOP everything (each object) has implied identity: their address in memory. This is brutally wrong for most use cases in most programming domains. What usecase justifies _new Integer(3) != new Integer(3)_? Most languages support overriding an equality method as a partial fix, but that's far from elegant.

On the other hand it should be fairly obvious to people who like relational databases.

<comment><USER7> > This is not obvious to OOP people.

Citation needed!!

> In OOP everything (each object) has implied identity: their address in > memory.

That's not an implied identity at all. That's a default identity. You're meant to override it. What sane default would you propose? Objects are not structs or records.

> This is brutally wrong for most use cases in most programming domains. What > usecase justifies new Integer(3) != new Integer(3)?

What OOP language provides numeric literals that don't have a built in integer class, with an equality method that makes sense!? Complete strawman.

> Most languages support overriding an equality method as a partial fix, but > that's far from elegant.

A partial fix? It is how you solve the problem with objects. I am not sure what other method you would propose.

<comment><USER4> It is an identity you can't get rid of, and which is often misused, or accidentally used, to create a lot of complexity. No, you can't override '==' in Java and other OO languages. You can override .equals() which defaults to ==.

> A partial fix? It is how you solve the problem with objects. I am not sure > what other method you would propose.

You mentioned it yourself: structs or records, a.k.a value semantics. Here is a resource from people with more authority (esp. Guy Steele) [http://cr.openjdk.java.net/~jrose/values/values-0.html](http://cr.openjdk.java.net/~jrose/values/values-0.html)

<comment><USER7> > It is an identity you can't get rid of, and which is often misused, or > accidentally used, to create a lot of complexity. No, you can't override > '==' in Java and other OO languages. You can override .equals() which > defaults to ==.

Using Java as an example to prove something about OO isn't very useful IMO. It'd be like holding up rust as an example for how functional languages do things - yes, it's fairly functional but hardly canonical.

In ruby, for example, you can indeed override ==.

> You mentioned it yourself: structs or records, a.k.a value semantics. Here > is a resource from people with more authority (esp. Guy Steele) > [http://cr.openjdk.java.net/~jrose/values/values-0.html](http://cr.openjdk.java.net/~jrose/values/values-0.html)

I think you're conflating structural equality on the one hand, and reference semantics on the other. The two aren't related in real OO. For example, here's a class that defines equality the same way an ML record might:

      class Value
        def ==(other)
          if other.class != self.class then
            return false
          end

          self.instance_variables.each do |v|
            if instance_variable_get(v) != other.instance_variable_get(v) then
              return false
            end
          end

          return true
        end
      end

Then we can use it to define a simple point class:

      class Point < Value
        def initialize(x, y)
          @x, @y = x, y
        end
      end

And there you go - structural equality, but still passed as references.

      Point.new(0, 0) == Point.new(1, 2) => false
      Point.new(0, 0) == Point.new(0, 0) => true

</comment></comment></comment></comment><comment><USER8> TXR Lisp:

      This is the TXR Lisp interactive listener of TXR 157.
      Use the :quit command or type Ctrl-D on empty line to exit.
      1> (defstruct point nil
           x y
           (:method equal (me) (list me.x me.y)))
      #<struct-type point>
      2> (equal (new point x 0 y 0) (new point x 1 y 1))
      nil
      3> (equal (new point x 0 y 0) (new point x 0 y 0))
      t
      4> (hash-equal (new point x 0 y 0))
      536869888
      5> (hash-equal (new point x 0 y 0))
      536869888
      6> (hash-equal (list 0 0))
      536869888

See what I did there? When designing this object system, I realized that rather than a binary equal method which takes this object and that, what we need is a _unary_ equal method. When an object must be compared _or hashed_ for equality under the equal function, and it has the equal method, then that method is called to retrieve a representative object. That object is then used in place of the original object. The method just has to return something which supports equal directly.

This feature is called _equality substitution_.

Doc link: [http://www.nongnu.org/txr/txr- manpage.html#N-00790C76](http://www.nongnu.org/txr/txr- manpage.html#N-00790C76)

<comment><USER4> That will be terribly inefficient for asserting inequality of large objects.

<comment><USER8> So: don't write huge objects---it's a code smelly anti-pattern anyway; or don't make every single member of a large object participate in equality; or else, cache the equality substitution and re-compute it if the object is modified.

I'm adding a dirty flag to the object system in the next release. If any slot is modified, the object will be marked dirty; an API will be provided for testing and clearing the dirty flag. This will make it a cinch to write the above point class so that it returns the same list if the object is clean. Also, when the object is dirty and the representative list must be recomputed, the cons cells of the old list can be re-used; we don't have to allocate a new list.

Most of the time, you don't want that anyway; objects should be immutable as much as possible. If you have objects in a hash table, you don't want to fiddle with them in ways that affect their equality.

Speaking of which, this is one of the ways in which the equality substitution is used in real code. Certain slots of the objects are treated as immutable and the equality substitution is based on those slots. The objects are put into hash tables based on that equality. Yet they have other slots treated as mutable. Those don't count toward equality. If they did, the hashing would be in trouble, obviously.

<comment><USER4> > So: don't write huge objects---it's a code smelly anti-pattern anyway

I tend to agree. But even for structures of only say, 4, primitives, it's still faster to only compare two primitives in the common case, instead of hashing 8 and comparing two hashes.

In the same way it could also be argued that needing hash functions for testing equality is a code smell. Equality makes only sense for small clean data structures of primitives. Equality for those should be inferred from the compiler by the primitives' equalities.

Also, how can hash collisions be avoided?

</comment></comment></comment></comment><comment><USER9> Please avoid hurting Javas reputation by using outdated code.

1\. Since Java 8 there are LocalDateTime/ZonedDateTime/etc. classes. They are immutable. LocalDateTime even works with Hibernate.

2\. date.setDate(int date) is deprecated for nearly 20 years. The methods Javadoc clearly states that you are changing the object. The method even returns void. Don't use it. Why are you still using it?

3\. If you still want to use the less comfortable Date and Calendar, they work fine if you use them as you are supposed to.

<comment><USER10> He does actually refer to this, but he could be more explicit on point (2) rather than referring to it obliquely.

</comment></comment><comment><USER11> _> In many situations using references rather than values makes sense. If I'm loading and manipulating a bunch of sales orders, it makes sense to load each order into a single place. If I then need to see if the Alice's latest order is in the next delivery, I can take the memory reference, or identity, of Alice's order and see if that reference is in the list of orders in the delivery._

Presumably, an order would consist of much more than a list of items (order #, delivery address, etc.), including a unique one (order #), so comparing by value here would still work?

If you're properly building your hierarchies, I'm not sure I see cases where comparing by reference would logically be desirable (of course, in the real world you probably want to still compare by reference in cases where performance might matter, or you're doing lower level work).

I guess this isn't disagreeing with the author's main point - that Value Objects are desirable - but pushing it further: Value Objects are desirable the vast majority of the time.

The second part, regarding immutability, I'm fully onboard with.

</comment><comment><USER12> I like Rust.

`==` is implemented by types as they desire and as makes sense, via the PartialEq trait (and the type can mark whether it's a partial equality or a total equality by whether Eq is also implemented).

Because of Rust's strong ownership model, the whole referential equality matter actually becomes comparatively irrelevant, though if you actually need it you can cast to raw pointers as compare those (`x as * const _ == y as *const _`).

This strong ownership model also means that the whole aliasing problem becomes irrelevant also: it's obvious from the code where you alias things, and you can only do so in a memory-safe way.

Really, this whole article becomes delightfully irrelevant for Rust.

</comment><comment><USER13> I have always used "value" vs "identity" to distinguish these classes. e.g. "Two men called John" (value, equal, no identity) "That man called John, and that man called John." (with identity, so "non-identical", buy may have the same value is some aspect). Every comparison must first be distinguished by whether you are comparing identity or some value of the object. With that distinction made, the arguments about referential integrity (and when it matters) is easier to digest. Pretty obvious I guess, but coming from C++, it is amazing how many people fumble through without having this distinction clear.

<comment><USER4> I've realized that there's seldom an obvious "identity", because identity is never absolute, but needs context ("semantics"). Mathematically identity is just a function (of some key data to more data) but in practice part of the key is implied (in the program, runtime, database connection, external policies, whatever).

For example, conventional URLs are often frowned upon because they don't "exactly" identify a document. Instead URLs involving hashsums, GUIDs etc. are proposed. I think that's a bad idea because while the hash sum is a quite precise identity, it's actually often _too precise_. I _want_ to be able to edit a web document without having to create a new identity. When someone surfs the URL and gets the latest "version" that's fine. We could consider all versions "identical" for our purposes. Or alternatively we could say that some of the identity was implied in the context, not the URL (the "get the newest" part).

<comment><USER13> Hmm .. I think you might have that the wrong way around. URLs do exactly _identify_ a document in the sense that the document that is returned _is_ the document in question. That you might get a different document each time is a different matter and relates, again, to value, not identity. (Then there's idempotency which is a useful concept that only appears to causes eyeballs to roll. Even the top in in Google is snarky.) And identity and value are both arbitrary -- John today is John tomorrow, but even that will also cause philosophers to twitch. I guess it not that surprising that programming languages and the like encode the same confusion!

<comment><USER4> The confusion only goes to show that there is no one obvious definition. That's the beauty of the relational model. John is John, but what it can identify is context-dependent (a string, a human in a group of humans, a human in a group of humans in time?).

</comment></comment></comment></comment><comment><USER14> Other good examples of value objects are:

\- EmailAddress

\- PhoneNumber

\- FullName

\- Address

Perhaps it's just my domain, but I find myself very often defining equality to various degrees for these concepts.

In fact I create value classes for any value that can have multiple valid encodings (e.g. keys and hashes in crypto, dollar value, etc). It makes it very easy to have all encoding/decoding code in one obvious place (in or near the object code). Encoding and decoding can then happen at the edges, and the core of the logic becomes much more readable ... but this gets into the Domain Object territory.

</comment><comment><USER15> Let me attempt to improve upon Fowler's ValueObject pattern in JS, and tell you the upsides:

        function Point(x, y) {
            const hash = Point.__hash(x, y);
            const cached = Point.__cache.get(hash);
            if (cached) return cached;
            const newPoint = {get x() { return x; }, get y() { return y; } };
            Point.__cache.set(hash, newPoint);
            return newPoint;
        }
        Point.__hash = function(ptx, pty) {
            return `${ptx}|${pty}`;
        }
        Point.__cache = new WeakMap();

This does what you would expect a ValueObject (or an algebraic type or struct depending on the languages you normally use) to do in another non-JS language - it interns all equivalent objects so that simple reference equality is sufficient to determine equality - rendering the nonstandard "equals" method unneeded. This also solves all the issues with ".includes" and so forth, again, because the built in reference equality is sufficient to determine equality. This also has much better memory characteristics in a system where many equivalent objects are created, as only one copy is ever stored in memory. The only drawback is the small overhead of the WeakMap used to cache all the references and the overhead of "hashing" at object creation time - neither of which should be noticeable in most applications, and the memory benefits should outweigh these concerns in most performance applications regardless.

<comment><USER16> Unfortunately your example won't work. You can't use a primitive value as a key in a weak map, which negates many of their possible use cases.

<comment><USER15> You're right, I hadn't realized that the spec forbade primitives as WeakMap keys - so while to approach should actually work in other languages, in JS it would leak memory as you'd be forced to use a normal map (or clean up after yourself - ich).

</comment></comment></comment><comment><USER17> > const p1 = {x: 2, y: 3};

> const p2 = {x: 2, y: 3};

> assert.notEqual(p1,p2); // NOT what I want

> Sadly that test passes. It does so because JavaScript tests equality for js > objects by looking at their references, ignoring the values they contain.

What? Has 'assert' been standardized?

Shouldn't it read: "It does so because my assert function tests equality for js objects by looking at their references, ignoring the values they contain."

<comment><USER18> I think his point would be the same (and maybe clearer) if he said assert.isFalse(p1 == p2).

I.e. he's not concerned about the testing semantics, but JavaScript's equality semantics which we're expected to assume the test function is using.

</comment></comment><comment><USER19> this sounds suspiciously like "labeled products are good", which seems fairly intuitive.

easy-ish to do in statically typed languages, but something like attrs ([https://attrs.readthedocs.io/en/stable/](https://attrs.readthedocs.io/en/stable/) ) or just namedtuples will do this in python.

</comment><comment><USER20> One of the reasons I love Golang is that comparison of structs is among their values, not their references.

To do so, compiler complains if you have circular struct type dependencies, but I think it is OK.

</comment><comment><USER21> Reminds me of Python articles from 2005

</comment><comment><USER22> Does anybody get anything from his writing? I have seen several posts of his here and they all are either trivial and/or give a fancy name to some standard coding construct. I think what he is describing here is the advantages of immutability which anyone who has heard only a little about FP knows already.

<comment><USER23> This isn't about immutability, this is about the power of introducing value objects to a system. (Immutability is just a property of good value objects.)

Most code I read does _not_ use value objects. It's more common for me to see primitive obsession [1], data clumps [2], arbitrary structs, or the "struct + service" antipattern (looking at you, Angular 1). Granted, I'm not working with FP languages.

When you migrate code to use value objects, then follow up by moving associated behavior into the value object, there are significant knock-on benefits to your design.

Value objects may be simple, but they're not obvious. If they were, more code would use them.

[1] [http://www.jamesshore.com/Blog/PrimitiveObsession.html](http://www.jamesshore.com/Blog/PrimitiveObsession.html)

[2] [http://www.martinfowler.com/bliki/DataClump.html](http://www.martinfowler.com/bliki/DataClump.html)

<comment><USER24> > Immutability is just a property of good value objects.

It sounds rather like value objects are strictly superior than immutable data structures, based on this statement. I'd love to hear an expansion of this rationale.

<comment><USER25> It's actually the other way around. If your object is immutable, whether it has identity or not (i.e. whether it's a "value object" or not) doesn't matter! There's nothing useful you could derive from that identity, so it might as well not exist.

So, languages should stop thinking in terms of "this is a reference type" and "this is a value type", and start thinking about "this references something mutable" vs "this references something immutable". For the latter, the implementation can then use by-value semantics for perf reasons, where appropriate.

<comment><USER26> Not sure what you mean. Identity comparisons are more useful for mutable objects, but even an immutable object can use one as an alternative to a unique ID. For example, you might have a queue of input events, where once an event is posted nothing about it needs to change, but multiple events with the same properties are possible (e.g. pressing the same key twice in a row).

On the other hand, mutable objects with value semantics can provide the ergonomic advantage that mutation has in some cases (e.g. 'point.y += 10' rather than 'point = Point(point.x, point.y + 10)' as well as more predictable performance, while avoiding bugs caused by accidental aliasing.

<comment><USER25> > Identity comparisons are more useful for mutable objects, but even an > immutable object can use one as an alternative to a unique ID.

I think that's part of a problem. Object identity should not be used for unique IDs - when you need a unique ID, use a UniqueIdGenerator or something like that.

Java and C# and others have got this so very wrong, when they did things like, "okay, all objects have identity, let's just reuse it for other stuff", and made it possible to e.g. synchronize on arbitrary objects - synchronize(x) in Java, lock(x) in C#. Now they can't get rid of object identity, because it's part of the language semantics - even if you never synchronize on objects of your class, something else might, and making them identity-less will break that.

At the very least, let's make it explicit. When you define a class, it should be stated upfront whether it has identity or not. If it doesn't have identity, it should be immutable. If it does have identity, it still _can_ be immutable if you want (if you need that identity for something, like your event example). But this state of affairs - immutable with identity - <USER2> shouldn't be _normal_. If it's needed, it should be requested explicitly.

I guess the real point here is that object identity has a heavier cost than it would seem from the first glance, and so it should be opt-in rather than opt- out (and it should definitely be possible to opt out).

As for `point.x += 10`, it doesn't preclude point from being immutable. It just means that the language has to desugar it into `point = Point(point.x, point.y + 10)` for you. That way, there's no accidental aliasing (since objects are still immutable - it's the reference that is mutating - so no alias can observe the change). And then the code generator, knowing that there's no aliasing, can replace it with actual in-place field update, when and where it makes sense.</comment></comment></comment></comment></comment></comment>


Chinese space agency to put EmDrive onto satellites 'as soon as possible' - <AUTHOR> http://www.ibtimes.co.uk/emdrive-chinese-space-agency-put-controversial-tech-onto-satellites-soon-possible-1596328 <comment><USER2> Would love to see some actual sharing of data.

" tests to verify that the device can actually fly are already being carried out in low-Earth orbit "

Why are we so far behind on this?

</comment><comment><USER3> Shit site won't work with ad blocker.

<comment><AUTHOR> Mirror: [http://archive.is/8D9qd](http://archive.is/8D9qd)</comment></comment>


Was npmjs.org temporarily compromised? - <AUTHOR> https://github.com/isaacs/node-tar/issues/33

<comment><AUTHOR> tldr;

During an npm install of the tar module I received this:

        npm http 200 https://registry.npmjs.org/tar
        npm ERR! registry error parsing json
        npm ERR! SyntaxError: Unexpected token y
        npm ERR! ny-leone-porn-sex-scene/Sunny-Leones-deleted-sex-scene-from-Ragini-MMS-2/photostory/33010796.cms"})^@9"},"�������

Followed by the rest of the package.json from the module.

Something or someone injected data into the response I got from npmjs.org. The fact that it was Isaac Schlueter's account is particularly worrisome.</comment>


Hey, university computer labs were kind of stale back in the mid-1980s - <AUTHOR> http://technologizer.com/2009/03/27/university-computer-labs-how-retro/

<comment><USER2> i hope it remains at least as easy as it is now for poor people to make it through school without worrying too much about this.

<comment><USER3> Laptops are now down to $250 and probably still dropping a bit more yet before even next fall's term. That's getting down to the same class of cost as books (actually I spent more than that on books most terms, in ~1996 dollars no less), and you can probably use aid money on the laptop. This laptop will do everything a non-engineering major will need, and a great deal of what a non- engineering major might want, barring 3D games.

I understand that even $250 can be a lot, but I want to make the point that if you still conceptualize a laptop as a ~$1000 item, it's not really like that anymore. Since the laptop companies aggressively compete for the college student market, I bet that barring massive inflation, somebody manages to offer a $199 laptop for next fall that will do just as much as the adequate laptops of today.

Interestingly, a laptop is now _cheaper_ than a desktop. I couldn't find a desktop at Dell just now for under $279, and that didn't include a monitor.

<comment><USER4> I don't think solidworks will make it. :)</comment></comment></comment>


Facebook acquires anonymous teen compliment app tbh, will let it run - <AUTHOR> https://techcrunch.com/2017/10/16/facebook-acquires-anonymous-teen-compliment-app-tbh-will-let-it-run/ <comment><USER3> This isn't improving mental health, it's just destroying it in a different way than negativity destroys it.

Sure, we all want social approval, but this sort of thing is about creating a system to depend on. It seems designed just like other social media, aiming to cause people to feel a _need_ for TBH approval and a social _obligation_ to participate in showing your approval of others.

People should drop the entire concept of caring about aspects of their identify as fixed traits such as those TBH focuses on. Having a nice smile (or not) or being viewed as the most talented at whatever skill are traits that are phrased as fixed judgments of a person.

Instead, we need to focus on acknowledging success for particular actions and recognizing the potential for growth in areas where we can improve. See (e.g.) [http://malcolmocean.com/2014/07/growth-mindset- reframing/](http://malcolmocean.com/2014/07/growth-mindset-reframing/)

TBH is more likely to lead to dysfunctional fixed mindsets than to inspire anyone to do anything good or feel good about themselves in a healthy growth- focused way.

<comment><USER4> Should self worth be tied to success at all?

<comment><USER3> Well, a basic sense of dignity as a human being should certainly not be tied to success. But the important point is that the best way to think about failure and success is as simply facts about what happened. You failed. You succeeded.

The problems with fixed mindset relates to treating success as an _indication_ of your self-worth. Doing that means that failure is a rejection of your self- worth. That leads to people fearing failure and thus avoiding taking on risky challenges they may fail at. And yet growth comes from being willing to fail and to persist in the face of failure etc.

If I fail at expressing myself clearly in a comment like this, it's better to acknowledge it and think "that comment failed" and think about how to succeed better next time… (I could go on, but I'm not going to invest more time in this comment right now)

<comment><USER5> As I see it, your options are fear of failure, fear of success, fear regardless of success/failure, or fearlessness regardless of success/failure. Fear of failure seems like a fantastic choice.

<comment><USER6> Why does it seem like a fantastic choice? Significant fear of failure leads to not attempting things in the first place; that doesn't sound fantastic.

<comment><USER5> Sure it does! I could attempt to fly every time I see an open window. It's wonderful to fear failure.

</comment></comment></comment></comment></comment></comment><comment><USER7> Its time to remind everyone that Facebook owns Onavo[1][2] and before any investor realizes, will pick up a product that hits their metrics threshold and buy them out.

[1] [https://www.wsj.com/articles/facebooks-onavo-gives-social- me...](https://www.wsj.com/articles/facebooks-onavo-gives-social-media-firm- inside-peek-at-rivals-users-1502622003)

[2] [https://twitter.com/dhh/status/900893798821134336?lang=en](https://twitter.com/dhh/status/900893798821134336?lang=en)

<comment><USER8> This is a really good point. I don't think this is necessarily a bad acquisition at all. Onavo is basically Facebooks eye of sauron:

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

TBH has been in the top 10 free apps for a few weeks now. FB has a good track record of buying small teams with good engagement numbers and letting them run themselves (Whatsapp/Instagram).

I'm sure Facebook looked at their numbers via Onavo and decided they were on a pretty good trajectory.

Also, it should be noted that TBH doesn't even have an Android app yet.

The question now is will TBH turn out to be more of a draw with friends (flash in the pan game) or have staying power like Bitmoji does.

Bitmoji was purchased by Snap Inc for around 100 million about a year ago. It has managed to consistently stay in the top 10 free apps since then:

[https://techcrunch.com/2016/03/29/snapmoji/](https://techcrunch.com/2016/03/29/snapmoji/)

<comment><USER9> > TBH has been in the top 10 free apps for a few weeks now. FB has a good > track record of buying small teams with good engagement numbers and letting > them run themselves (Whatsapp/Instagram).

I can't comment on Whatsapp but I don't think this is an accurate description of Instagram. It took them a while, sure, but today they are most definitely asserting their control as overlords of Instagram even if they 'run themselves'.

<comment><USER8> Oh so how do you know that? Did they publish some article stating a change in control?

<comment> w-ll Anecdotal: Last Instagram update started giving me notifications from Facebook not related to my Ig posts.

</comment></comment></comment></comment></comment><comment><USER10> I feel like the subtle pseudo-gratification from this app is not going to make teens happier. Rather, they'll subconsciously realize that it's all a facade and it'll make them even less happy.

We're going to keep creating this crap, I am sure, but lets just not label it with, "We're trying to make the world better". You're an app company, not a collective of teen health PHDs seeking to thwart teen's hormonal, depressive tenancies.

<comment><USER11> Less cynically, you might be right, but I hope it actually works. There's nothing wrong with trying to make something positive. There's [http://www.rethinkwords.com/](http://www.rethinkwords.com/) which actually has data backing up that it works.

<comment><USER12> I don't think the point GP is making is cynical. I think what GP is talking about is cynical.

</comment></comment></comment><comment><USER13> My middle school aged daughter wanted this installed on her phone the other day. I said no way. The last thing she needs her electronic devices doing is serving up tinder for kids, leaving her obsessing over popularity contests, or another avenue for anonymous bullying.

<comment><USER14> I'm appalled that everybody carries around a real time yearbook. High school seems to never end. I shudder the effect this app will have on the self esteem of the user.

We didn't know tobacco was harmful back when everybody was doing it. We didn't know cocaine was harmful back when it was the thing. We also don't know about the sort of damage and stress of the human psyche with these engineered digital toxins.

<comment><USER15> I think that for America, and white america in particular life's non plus ultra is senior year of high school. At the very least country music seems to paint this picture.

<comment><USER16> what does non plus ultra mean? i looked it up but couldn't find a clear definition

contextually it seems like it means "peak"?

<comment><USER17> It means "nothing further beyond"; life never moves beyond the senior year of high school.

</comment></comment></comment></comment></comment><comment><USER18> Nice write up on focusing on "postivity focus" and "helping teens' mental health" but seems like just another app training teens to seek social validation via an app...

<comment><USER19> I am trying to figure out why Facebook didn't just clone the features and add anonymous friend polls to their app/website (which I assume is definitely going to happen now in spite of the press release.)

<comment><USER20> If you mean clone the features over to Facebook.... It's because Facebook is unpopular with teens. That's a demographic Facebook has increasingly lost as it pertains to usage (they still sign-up, because of the vague pressure that everyone must have an account). If it weren't for Instagram, they'd be in deep shit with people under ~25 and very susceptible to being replaced or having their monopoly fractured (the 16-25 group would seed competitors, one of which would eventually kill Facebook starting from that base and progressing up).

<comment><USER19> It seems to me that Facebook has the age data and could have just targeted those age groups exclusively with the feature, and hidden it from the _uncool_ age groups. Maybe they tried it and it didn't get any traction and that's why they did the purchase.

</comment></comment></comment></comment><comment><USER21> This could be a data mining wet dream. They have found a way to make filling out surveys addictive. It seems all you had to do was present it in a fun way and make sure the surveys are about other people. I wouldn't be surprised if the questions start shifting towards things that could be used to market to people. Imagine if all of John Smiths friends say he is "Most likely to skip work to play a videogame". It wouldn't matter if John had ever mentioned video games on his profile.

</comment><comment><USER22> Twitter has been justifiably snarky about the news that Facebook bought _another_ short-term viral app for the users: "this smacks of engagement desperation"

[https://twitter.com/mikeisaac/status/920021423703310336](https://twitter.com/mikeisaac/status/920021423703310336)

<comment><USER23> The same people said the same thing about Instagram and WhatsApp.

<comment><USER19> I thought one of the main things about Whatsapp was the huge audience and the demographics of that audience skewed young, and this app while not quite the install base size of Whatsapp/Instagram is ppoular with young folks. The demographics is the one they teach in Psych 101 as the most crucial point at which marketing can influence lifelong brand choices. The tweet snark seems to miss the point altogether.

</comment></comment></comment><comment><USER24> From a capitalistic point-of-view, congrats to Midnight Labs for successfully repeatedly pivoting until something stuck. From a cultural point-of-view, I'm afraid for my (future) kids.

<comment><USER25> Anonymous compliments seem nice to me, am I missing something?

<comment><USER3> You're missing very nearly everything.

Even anonymous compliments are not just nice. They can be awkward or add to self-consciousness or to self-absorbed narcissism. It all depends on the details. A sincere, meaningful compliment about some actual achievement (as opposed to some random trait that is fixed) can be wonderful. TBH has none of that though. But TBH does have a lot of bad things that normal anonymous compliments never have.

When anonymous compliments require signing up for a service just to get anonymous compliments from your peers with the understanding that you do the same, you create an entire social context where all the benefits of an actually natural complement are eliminated and replaced with an addictive, data-mining and actually negative for mental health situation.

<comment><USER25> Can you recommend another way I could leave an anonymous compliment?

<comment><USER26> Leave a note, send a letter, send an email, leave a comment anonymously

</comment></comment></comment></comment></comment><comment><USER27> >> "If we're improving the mental health of millions of teens, that's a success to us."

Amplifying attention bitching is a good deed again.

</comment><comment><USER28> This app reminds me of the Black Mirror episode "Nosedive."

I know I shouldn't be so down on this.

<comment><USER3> Why shouldn't you be down on it? TBH, from the description in the article, is horrible and deserves being seen negatively.

</comment></comment><comment><USER29> Seems like a step towards that Black Mirror episode, _Nosedive_ ;

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

I don't see this as a positive app at all., It's just reinforcing shallow and unhealthy behaviour.

</comment><comment><USER30> This app held the attention of the kids in the middle school and high school near me for about 7 days. Then they got bored of it and all stopped playing.

<comment><USER31> Sounds like founders made a good call on acquisition :-P

</comment></comment><comment><USER32> A hundred million here, a hundred million there: who cares? It's way cheaper for FB to buy up these small social media companies than wait around until they become big competitors. If it fails, so what? It's worth it to ensure their market dominance.

</comment><comment><USER33> When are we going to have a legislative crack down on psychologically abusive software? It's not just this, though it's a particularly egregious example. Facebook itself is a huge online predator.

<comment><USER34> No thanks, people like their abuse systematic and shiny. When everybody becomes more pathological, nobody becomes more pathological.

</comment></comment><comment><USER35> Want to know what will improve teen health, going back to not having to worry what every other teen thinks about you. I remember when my parents attempted to give me a cell-phone at 17. I politely said no thank you, I don't want you being able to contact me at anytime. I want to be in the moment. I didn't take photos or update anything in real-time, I didn't update people after the fact either, we just lived in the moment then moved on. Mind you this was 18 - <USER2> years ago.

</comment><comment><USER36> The SEC regulates anticompetitive moves. Sounds like we need a new body which regulates creepy predator companies like facebook going after kids.

<comment><USER37> > The SEC regulates anticompetitive moves.

Actually, that's the FTC.

The SEC regulates securities trading.

> Sounds like we need a new body which regulates creepy predator companies > like facebook going after kids.

With appropriate statutory authority, that sounds like it would _also_ be a good fit for the FTC. Even if new law is needed, why a new regulatory body?

</comment></comment><comment><USER38> I was working on an app that used a lot of emojis. And searching for similar design app, tbh came to my attention. It was really similar to what I was doing in term of design using strong colors and a big emoji. But the idea was totally different.

Teens and Kids really love this combination. And the app is simple and fast, It is like play a game. You could imagine kids playing and smiling.

</comment><comment><USER39> Yeah, I'm sure it will maintain the same separation as it did with WhatsApp...oh wait, no it didn't. This "anonymous" app won't be anonymous much longer. And it will probably happen at least a year before they actually announce it, just as it did with WhatsApp.

</comment><comment><USER40> Big freaking deal... This is simply PR for all the nastiness they've released into the world and damage to our democracy. The world would be better off without Facebook.

<comment><USER3> I think you miss the point. It's newsworthy, not positive. This is not news about FB doing something good, this is news about FB continuing to harm the world still further. Of course, the world would be better of without FB and also without TBH.

</comment></comment><comment> Margaret-mayu ?

</comment><comment><USER41> Eww.</comment>


Reason – A new interface to OCaml - <AUTHOR> https://facebook.github.io/reason/index.html <comment><USER2> Is OCaml a big thing at Facebook? Its interesting to see a language with less hype get new projects like this.</comment>


Working longer hours has many drawbacks - <AUTHOR> https://www.economist.com/business/2018/11/24/americans-need-to-take-a-break <comment><AUTHOR> [http://archive.is/FHv4u](http://archive.is/FHv4u)</comment>


Smartphone Location Data Is Worth Big Money to Wall Street - <AUTHOR> https://www.wsj.com/articles/your-smartphones-location-data-is-worth-big-money-to-wall-street-1541131260 <comment><USER2> This is such a dark use of tech. Involuntary using people's phones and fta it says data goes mostly to hedge funds. Then the kicker was at the bottom:

"In September, as Hurricane Florence churned toward the Carolina coast Thasos watched evacuation zones and found that in well-to-do census blocks, 65% of the people fled, while only 39% left poor areas. Such information could inform disaster response or infrastructure spending, yet it might also have commercial value. "You might look at that and say, 'Gosh, I could price insurance differently,' " Mr. Pentland said."

So they're not even interested in savings lives so much as pricing insurance. Fantastic.

<comment><USER3> Err isn't there social benefit to having better priced insurance? I don't understand your position here.

<comment><USER4> Assuming that insurance is already priced as accurately as it can be according to the available data, then discovering that wealthy people tend to evacuate disaster areas while the poorer residents remain would suggest that you charge greater premiums for the impoverished and give a price break to the rich. As it stands, the poor are effectively getting subsidized by otherwise similar individuals with more wealth.

Insofar as the utility associated with money is roughly logarithmic, then the net utility from a pricing change will likely decrease. For example, a wealthy person will be pleased with a $500 reduction in premiums (that's a new pair of shoes or some decent concert tickets); a $500 increase might induce a poor person to forgo renewing their life insurance (with disastrous effects for their dependents should they die) or if they pay it, then other worthy expenses might get cut to make up the difference (home repairs, sending your kids to summer camp, retirement savings).

Even assuming that everyone values money equivalently despite their net worth, it still leaves a bad taste in my mouth. Here's one wealthy elite technocrat, already invading people's privacy on an Orwellian scale, and he's using that access to explicitly prey on poor people to make money for other people who are already rich.

<comment><USER5> Or, maybe you can charge both less because now you can replace the flees- disasters-rate conservative guess with less conservative data. And make a more competitive product. And reduce costs to end consumers. Not everything has to be sinister when someone breaks out that different groups of people behave differently.

</comment></comment></comment></comment><comment><USER6> Bypass paywall:

* DDG: [https://duckduckgo.com/?q=Your+Smartphone%E2%80%99s+Location...](https://duckduckgo.com/?q=Your+Smartphone%E2%80%99s+Location+Data+Is+Worth+Big+Money+to+Wall+Street)

* Google: [https://www.google.com/search?q=Your+Smartphone%27s+Location...](https://www.google.com/search?q=Your+Smartphone%27s+Location+Data+Is+Worth+Big+Money+to+Wall+Street)

<comment><USER7> If Google link fails... [https://outline.com/yPWTZR](https://outline.com/yPWTZR)</comment></comment>


Young, talented and smart? Meeting in Israel to hack - <AUTHOR> https://medium.com/p/700a74ad5f4a

<comment><AUTHOR> Would love to get your thoughts about Israel Tech Challenge. Would you apply?</comment>