One thing I really appreciated as an non-practicing observer was the frequent reminders to consider safety concerns, e.g. try a door knob before forcing it, take care with how padlocks may turn into projectiles, taking care that operating a chainsaw doesn't pose a threat to people inside a warehoused window, etc.
Keep in mind that read-string, eval, and load-string are all exploit vectors. Read-string exposes you to the #= eval macro, which can execute arbitrary code at read time, as well as various vulnerabilities with object construction.
Eval executes the data it receives without any sandboxing or sanity checking, any data that has ever had any user influence should be suspect. 9 times out of 10, if you're using eval, you should be using a function reference.
Load-string is likewise vulnerable to the eval macro and constructor attack vectors.
clojure.edn offers safe versions of read and read-string that do not use the eval macro. You can get load-string equivalent behavior by wrapping the string in a StringReader and then clojure.edn/reading it until eof. If you're reading data that's had any influence from an end user, always use the clojure.edn facilities, and never eval it.
Verizon has so much bandwidth to get in and out of their network for broader internet bound and broader internet originating traffic. Netflix has to come in the off ramp that all the torrents, hacker news, and etc. traffic has to come in.
Netflix has offered to build a new offramp for Netflix traffic that goes directly into Verizon's network. Netflix is willing to shoulder ALL of the burden of this infrastructure cost, and to maintain it.
Verizon has refused the offer, and instead wants to charge Netflix a toll so that their traffic gets to use an EZ-Pass lane, instead of going through the normal slow toll booths that everyone else's traffic goes through.
The media industry created a way to sustainably undergo the capital expenditures necessary for high quality studio recording, and the mass production and distribution of physical media communicating those studio recordings. It extracted rents in the forms of usurous recording contracts, hugely divergent pricing from their costs, and avaricious assignment and stewardship of copyrights.
Technology has reduced the cost of transmitting the information in recordings to the trivial level that serving someone a glass of water costs.
A combination of technology and prior capitalization has driven down the cost of studio recording, both lowering the necessary a prior knowledge to record well, and putting excellent mastering tools in the hands of many at low cost.
What precise value are the members of the RIAA providing today? Please demonstrate how these members provide an essential value that cannot be shouldered by individual artists (e.g. Macklemore & Ryan Lewis)
The example cited makes two decisions which are not articulated explicitly but are decisions one can make and which have benefits and costs. They are:
1) The function correctly executes on the class of things for which (.toString thing) has a sensible run time invocation.
2) The function delays examination of the correct class of its argument from compile time to run time.
1 is a benefit, in that in a dynamic system it is possible that something which, at compile time, does not have a sensible .toString invocation, can gain it at run time and then participate in the function.
2 is a cost, in that you have to delay classification to the instant in which you try to invoke .toString
This tradeoff is elemental and there will be systems you can build by embracing it that will never be possible in strongly typed languages. You'll be able to build isomorphs of them, but doing so will involve expressing significantly more ideas to get there.
One of Clojure's fundamental opinions, asserted by the language eagerly, is that vector quantities should be treated as values the way scalar quantities are in most languages. Specifically, this means that when you operate with a list and append to it, instead of modifying the value of the next (cdr) pointer in the last node, you create a new list and return the new list as the result of the append operation. These immutable collections afford certain classes of algorithm that destructively modified ones do not. Rich reviews this concept pretty well here: http://www.infoq.com/presentations/Value-Values
This story doesn't spend much time discussing this particular opinion of Clojure's or why you would choose to circumvent it by making a mutable linked list. Additionally by virtue of skipping the immutability discussion, it fails to discuss how append to the head of a list is crucially different from append to the tail when working with data structurally sharing underlying data.
Additionally it prefers to define an interface over a protocol (using definterface instead of defprotocol), and it uses camelCase naming instead of Clojure's culturally embraced hyphen-cased naming.
In short this describes a way to build a data structure in Clojure, but is not a particularly good as an example to be followed of how you should build data structures in Clojure. johnwalker cited a couple more idiomatic examples, e.g. data.finger-trees: https://github.com/clojure/data.finger-tree/blob/master/src/...
1) Refer to the analysis of Root Mean Square Error always by that name. (RMS is already often used in certain jargon instead of stddev).
2) Stop treating RMS as a default measure of variance. Treat Mean Absolute Deviation as the default measure of variance, because the figure it provides is more consistent with people's psychological interpretation.
It's not really retiring RMS, just retiring the idea that it is a good default statistical analysis.